guix: backport build user takeover commits (#351655)

This commit is contained in:
Weijia Wang
2024-10-28 15:32:00 +01:00
committed by GitHub
2 changed files with 85 additions and 36 deletions
@@ -0,0 +1,42 @@
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index c5383bc..50d1abc 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -2312,15 +2312,6 @@ void DerivationGoal::registerOutputs()
Path actualPath = path;
if (useChroot) {
actualPath = chrootRootDir + path;
- if (pathExists(actualPath)) {
- /* Move output paths from the chroot to the store. */
- if (buildMode == bmRepair)
- replaceValidPath(path, actualPath);
- else
- if (buildMode != bmCheck && rename(actualPath.c_str(), path.c_str()) == -1)
- throw SysError(format("moving build output `%1%' from the chroot to the store") % path);
- }
- if (buildMode != bmCheck) actualPath = path;
} else {
Path redirected = redirectedOutputs[path];
if (buildMode == bmRepair
@@ -2360,6 +2351,21 @@ void DerivationGoal::registerOutputs()
something like that. */
canonicalisePathMetaData(actualPath, buildUser.enabled() ? buildUser.getUID() : -1, inodesSeen);
+ if (useChroot) {
+ if (pathExists(actualPath)) {
+ /* Now that output paths have been canonicalized (in particular
+ there are no setuid files left), move them outside of the
+ chroot and to the store. */
+ if (buildMode == bmRepair)
+ replaceValidPath(path, actualPath);
+ else
+ if (buildMode != bmCheck && rename(actualPath.c_str(), path.c_str()) == -1)
+ throw SysError(format("moving build output `%1%' from the chroot to the store") % path);
+ }
+ if (buildMode != bmCheck) actualPath = path;
+ }
+
+
/* FIXME: this is in-memory. */
StringSink sink;
dumpPath(actualPath, sink);
+43 -36
View File
@@ -1,39 +1,40 @@
{ lib
, stdenv
, fetchurl
, fetchpatch
, autoreconfHook
, disarchive
, git
, glibcLocales
, guile
, guile-avahi
, guile-gcrypt
, guile-git
, guile-gnutls
, guile-json
, guile-lib
, guile-lzlib
, guile-lzma
, guile-semver
, guile-ssh
, guile-sqlite3
, guile-zlib
, guile-zstd
, help2man
, makeWrapper
, pkg-config
, po4a
, scheme-bytestructures
, texinfo
, bzip2
, libgcrypt
, sqlite
, nixosTests
{
lib,
stdenv,
fetchurl,
fetchpatch,
autoreconfHook,
disarchive,
git,
glibcLocales,
guile,
guile-avahi,
guile-gcrypt,
guile-git,
guile-gnutls,
guile-json,
guile-lib,
guile-lzlib,
guile-lzma,
guile-semver,
guile-ssh,
guile-sqlite3,
guile-zlib,
guile-zstd,
help2man,
makeWrapper,
pkg-config,
po4a,
scheme-bytestructures,
texinfo,
bzip2,
libgcrypt,
sqlite,
nixosTests,
, stateDir ? "/var"
, storeDir ? "/gnu/store"
, confDir ? "/etc"
stateDir ? "/var",
storeDir ? "/gnu/store",
confDir ? "/etc",
}:
stdenv.mkDerivation rec {
@@ -56,6 +57,9 @@ stdenv.mkDerivation rec {
url = "https://git.savannah.gnu.org/cgit/guix.git/patch/?id=ff1251de0bc327ec478fc66a562430fbf35aef42";
hash = "sha256-f4KWDVrvO/oI+4SCUHU5GandkGtHrlaM1BWygM/Qlao=";
})
# manual port of build user takeover remediation commit
# see https://guix.gnu.org/en/blog/2024/build-user-takeover-vulnerability
./guix-build-user-takeover-fix.patch
];
postPatch = ''
@@ -157,7 +161,10 @@ stdenv.mkDerivation rec {
changelog = "https://git.savannah.gnu.org/cgit/guix.git/plain/NEWS?h=v${version}";
license = licenses.gpl3Plus;
mainProgram = "guix";
maintainers = with maintainers; [ cafkafk foo-dogsquared ];
maintainers = with maintainers; [
cafkafk
foo-dogsquared
];
platforms = platforms.linux;
};
}