mirror of
https://github.com/NixOS/nix.git
synced 2025-11-09 20:16:03 +01:00
Add a test for CVE-2022-24765
NixOS VM test since handling different users without that is bound to be tricky
This commit is contained in:
parent
e5a211d77e
commit
d4c6722332
2 changed files with 66 additions and 0 deletions
|
|
@ -598,6 +598,8 @@
|
||||||
["i686-linux" "x86_64-linux"]
|
["i686-linux" "x86_64-linux"]
|
||||||
(system: runNixOSTestFor system ./tests/nixos/setuid.nix);
|
(system: runNixOSTestFor system ./tests/nixos/setuid.nix);
|
||||||
|
|
||||||
|
tests.cve-2022-24765 = runNixOSTestFor "x86_64-linux" ./tests/nixos/cve-2022-24765.nix;
|
||||||
|
|
||||||
|
|
||||||
# Make sure that nix-env still produces the exact same result
|
# Make sure that nix-env still produces the exact same result
|
||||||
# on a particular version of Nixpkgs.
|
# on a particular version of Nixpkgs.
|
||||||
|
|
|
||||||
64
tests/nixos/cve-2022-24765.nix
Normal file
64
tests/nixos/cve-2022-24765.nix
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
{ lib, config, nixpkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
pkgs = config.nodes.machine.nixpkgs.pkgs;
|
||||||
|
|
||||||
|
flakeDotNix = pkgs.writeTextFile {
|
||||||
|
name = "flake.nix";
|
||||||
|
destination = "/flake.nix";
|
||||||
|
text = ''
|
||||||
|
{
|
||||||
|
outputs = { self }: { foo = 1; };
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "cve-2022-24765";
|
||||||
|
|
||||||
|
nodes.machine =
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
virtualisation.writableStore = true;
|
||||||
|
virtualisation.additionalPaths = [ flakeDotNix ];
|
||||||
|
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
users.users.user1.isNormalUser = true;
|
||||||
|
users.users.user2.isNormalUser = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = { nodes }: ''
|
||||||
|
# fmt: off
|
||||||
|
start_all()
|
||||||
|
|
||||||
|
# Evaluating a flake in the store. Should just work
|
||||||
|
machine.succeed('nix eval ${flakeDotNix}#foo')
|
||||||
|
|
||||||
|
# Create the following hierarchy:
|
||||||
|
#
|
||||||
|
# /flakeRoot (owned by `user1`)
|
||||||
|
# /flake.nix (owned by `user1`)
|
||||||
|
# /subdir (owned by `user2`)
|
||||||
|
#
|
||||||
|
machine.execute(r"""
|
||||||
|
mkdir -p /flakeRoot/subdir
|
||||||
|
chown -R user1 /flakeRoot
|
||||||
|
cp -r ${flakeDotNix}/flake.nix /flakeRoot
|
||||||
|
chown -R user2 /flakeRoot/subdir
|
||||||
|
""".strip())
|
||||||
|
|
||||||
|
# Evaluating `/flakeRoot#foo` should work even if we're not `user1` since
|
||||||
|
# we've specified the exact path
|
||||||
|
machine.succeed("su user1 -c 'nix eval /flakeRoot\#foo'")
|
||||||
|
machine.succeed("su user2 -c 'nix eval /flakeRoot\#foo'")
|
||||||
|
# But when we have to resort to searching upwards in the tree, then Nix
|
||||||
|
# should error out if we're not `user1` since the `flake.nix` isn't owned
|
||||||
|
# by us
|
||||||
|
machine.succeed("su user1 -c 'nix eval /flakeRoot/subdir\#foo'")
|
||||||
|
inSubdirStdout = machine.fail(
|
||||||
|
"su user2 -c 'nix eval /flakeRoot/subdir\#foo' 2>&1"
|
||||||
|
)
|
||||||
|
print(inSubdirStdout)
|
||||||
|
assert "owned by us" in inSubdirStdout
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue