Restore parent mount namespace before executing a child process
This ensures that they can't write to /nix/store. Fixes #2535.
This commit is contained in:
		
							parent
							
								
									56f6e382be
								
							
						
					
					
						commit
						a0ef21262f
					
				
					 8 changed files with 48 additions and 4 deletions
				
			
		|  | @ -936,6 +936,7 @@ pid_t startProcess(std::function<void()> fun, const ProcessOptions & options) | |||
|                 throw SysError("setting death signal"); | ||||
| #endif | ||||
|             restoreAffinity(); | ||||
|             restoreMountNamespace(); | ||||
|             fun(); | ||||
|         } catch (std::exception & e) { | ||||
|             try { | ||||
|  | @ -1504,4 +1505,26 @@ std::unique_ptr<InterruptCallback> createInterruptCallback(std::function<void()> | |||
|     return std::unique_ptr<InterruptCallback>(res.release()); | ||||
| } | ||||
| 
 | ||||
| static AutoCloseFD fdSavedMountNamespace; | ||||
| 
 | ||||
| void saveMountNamespace() | ||||
| { | ||||
| #if __linux__ | ||||
|     std::once_flag done; | ||||
|     std::call_once(done, []() { | ||||
|         fdSavedMountNamespace = open("/proc/self/ns/mnt", O_RDONLY); | ||||
|         if (!fdSavedMountNamespace) | ||||
|             throw SysError("saving parent mount namespace"); | ||||
|     }); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void restoreMountNamespace() | ||||
| { | ||||
| #if __linux__ | ||||
|     if (fdSavedMountNamespace && setns(fdSavedMountNamespace.get(), CLONE_NEWNS) == -1) | ||||
|         throw SysError("restoring parent mount namespace"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue