mirror of
https://github.com/NixOS/nix.git
synced 2025-11-13 14:02:42 +01:00
Run the builds in a daemon-controled directory
Instead of running the builds under
`$TMPDIR/{unique-build-directory-owned-by-the-build-user}`, run them
under `$TMPDIR/{unique-build-directory-owned-by-the-daemon}/{subdir-owned-by-the-build-user}`
where the build directory is only readable and traversable by the daemon user.
This achieves two things:
1. It prevents builders from making their build directory world-readable
(or even writeable), which would allow the outside world to interact
with them.
2. It prevents external processes running as the build user (either
because that somehow leaked, maybe as a consequence of 1., or because
`build-users` isn't in use) from gaining access to the build
directory.
This commit is contained in:
parent
cad14405c2
commit
0e4baff868
4 changed files with 28 additions and 13 deletions
|
|
@ -496,10 +496,13 @@ void LocalDerivationGoal::startBuilder()
|
|||
additionalSandboxProfile = parsedDrv->getStringAttr("__sandboxProfile").value_or("");
|
||||
#endif
|
||||
|
||||
/* Create a temporary directory where the build will take
|
||||
place. */
|
||||
tmpDir = createTempDir("", "nix-build-" + std::string(drvPath.name()), false, false, 0700);
|
||||
|
||||
/* Create a temporary directory where the build will take place.
|
||||
* That directory is wrapped into a restricted daemon-owned one to make sure
|
||||
* that the builder can't open its build directory to the world.
|
||||
* */
|
||||
auto parentTmpDir = createTempDir("", "nix-build-" + std::string(drvPath.name()), false, false, 0700);
|
||||
tmpDir = parentTmpDir + "/build";
|
||||
createDir(tmpDir, 0700);
|
||||
chownToBuilder(tmpDir);
|
||||
|
||||
for (auto & [outputName, status] : initialOutputs) {
|
||||
|
|
|
|||
|
|
@ -432,6 +432,11 @@ void deletePath(const Path & path)
|
|||
deletePath(path, dummy);
|
||||
}
|
||||
|
||||
void createDir(const Path &path, mode_t mode)
|
||||
{
|
||||
if (mkdir(path.c_str(), mode) == -1)
|
||||
throw SysError("creating directory '%1%'", path);
|
||||
}
|
||||
|
||||
Paths createDirs(const Path & path)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -165,6 +165,11 @@ inline Paths createDirs(PathView path)
|
|||
return createDirs(Path(path));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a single directory.
|
||||
*/
|
||||
void createDir(const Path & path, mode_t mode = 0755);
|
||||
|
||||
/**
|
||||
* Create a symlink.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue