Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The newuidmap and newgidmap binaries #9

Open
PedroRegisPOAR opened this issue Sep 7, 2021 · 0 comments
Open

The newuidmap and newgidmap binaries #9

PedroRegisPOAR opened this issue Sep 7, 2021 · 0 comments

Comments

@PedroRegisPOAR
Copy link
Contributor

PedroRegisPOAR commented Sep 7, 2021

Abstract

These are some notes that by time to time I came back and add some more stuff about.

After the build, Nix sets the last-modified timestamp on all files in the build result to 1 (00:00:01 1/1/1970 UTC), sets the group to the default group, and sets the mode of the file to 0444 or 0555 (i.e., read-only, with execute permission enabled if the file was originally executable). Note that possible setuid and setgid bits are cleared. Setuid and setgid programs are not currently supported by Nix. This is because the Nix archives used in deployment have no concept of ownership information, and because it makes the build result dependent on the user performing the build.
From: https://nixos.org/manual/nix/unstable/expressions/derivations.html

126 lines of tests of nix code it self to not allow to be possible to create files in /nix/store with "weird permissions"!
The first line of the file:

Verify that Linux builds cannot create setuid or setgid binaries.
https://github.com/NixOS/nix/blob/26c7602c390f8c511f326785b570918b2f468892/tests/setuid.nix

Note that rootless podman requires newuidmap which can't come from the shadow Nix package on non-NixOS
From: https://nixos.wiki/wiki/Podman
Well, I did it, it is hack, but it works, not in NixOS :[

TODO: may be use an "wider" path (path = [ "/run/wrappers:/home/someuser/.local/bin" ];) ?

DebConf 14: QA with Linus Torvalds, start=1176, end=1228

This module exploits a vulnerability in Linux kernels 4.15.0 to 4.18.18, and 4.19.0 to 4.19.1, where broken uid/gid mappings between nested user namespaces and kernel uid/gid mappings allow elevation to root (CVE-2018-18955). The target system must have unprivileged user namespaces enabled and the newuidmap and newgidmap helpers installed (from uidmap package). This module has been tested successfully on: Fedora Workstation 28 kernel 4.16.3-301.fc28.x86_64; Kubuntu 18.04 LTS kernel 4.15.0-20-generic (x86_64); Linux Mint 19 kernel 4.15.0-20-generic (x86_64); Ubuntu Linux 18.04.1 LTS kernel 4.15.0-20-generic (x86_64).
From: https://www.infosecmatter.com/metasploit-module-library/?mm=exploit/linux/local/nested_namespace_idmap_limit_priv_esc

TODO: https://t.me/nixosbrasil/70805

TODO:

Personally I prefer Apptainer (Formerly Singularity) instead of Podman. The latest release of Apptainer (1.1.0) is fully rootless with no special suid binary. A bonus is that it also doesn't require the setup of subuid/subgid configurations. You just need unprivileged user namespaces enabled in your kernel or sysctl settings.
https://www.reddit.com/r/NixOS/comments/xwmx6o/comment/irb5bpa/?utm_source=reddit&utm_medium=web2x&context=3

sed -i 's/-m 4755/-m 755/g' builddir/Makefile
Refs.:

Details

users.extraUsers..subUidRanges

https://t.me/nixosbrasil/34929

https://github.com/NixOS/nixpkgs/blob/6ea00bb91225c751e79b83aaed5ee2dbdde0f24d/nixos/modules/programs/noisetorch.nix#L20-L25

https://github.com/NixOS/nixpkgs/blob/8ee160c2d452efc6acff0d4f286970f6f93e35ba/nixos/modules/programs/shadow.nix#L115-L116

Base link https://zenhack.net/2016/01/24/reflections-on-nixos.html,

https://github.com/nix-community/nix-user-chroot#add-a-setuid-version

https://unix.stackexchange.com/a/389903

https://github.com/NixOS/nixpkgs/blob/93ca5ab64f78ce778c0bcecf9458263f0f6289b6/pkgs/applications/virtualization/podman/default.nix#L95

This may be too restrictive for cases in which the real program needs cap_setpcap but it at least leans on the side security paranoid vs. too relaxed.
https://github.com/NixOS/nixpkgs/blob/77c929982cf56e15652e89ad125ee5af5b391324/nixos/modules/security/wrappers/default.nix#L63-L70

TODO: looks like the problem is how compiled shadow is?!
genuinetools/img#144 (comment)

More details

There was a bug in shadows's source code see tailhook/vagga#12 (comment), it was fixed in shadow-maint/shadow#43. We need tests everywhere!

TODO: is it all from "the same" bug?

The WSL: https://unix.stackexchange.com/a/388562

getfattr -d -m -

From: https://unix.stackexchange.com/a/388562

By Red Hat Linux permissions: SUID, SGID, and sticky bit

Source of the newgidmap and newuidmap in the official github repository.

In podman source code: newgidmap and newuidmap

Source of security/wrappers/ that is used in NixOS.

You could refactor nixos/modules/security/setuid-wrappers.nix to get that support outside of NixOS, but the wrappers would have to be stored outside /nix/store
From: NixOS/nixpkgs#6034 (comment)

  postPatch = ''
    V={newgidmap,newgidmap} \
      substituteInPlace ./internal/unshare/unshare.c \
        --replace "/usr/bin/$V" "${wrapperDir}/$V"
  '';

From: https://github.com/NixOS/nixpkgs/blob/a90e1bacf7a938c4247c6bdaef188215ac73c83f/pkgs/development/tools/img/default.nix#L22-L26 and see it in nsjail source code NixOS/nixpkgs#139917 (comment), (pinned source version).

The commit that introduced this binaries:

    security.setuidPrograms = [ "passwd" "chfn" "su" "newgrp"
      "newuidmap" "newgidmap"  # new in shadow 4.2.x
      ];

From: https://github.com/NixOS/nixpkgs/pull/3100/files#diff-e9c7b883f114501b3e493bb2690f3ea51606a925cb91c50da0d7db0ab7992568R103-R105

In the nixpkkgs#shadow derivation:

      newuidmap = mkSetuidRoot "${pkgs.shadow.out}/bin/newuidmap";
      newgidmap = mkSetuidRoot "${pkgs.shadow.out}/bin/newgidmap";

From: https://github.com/NixOS/nixpkgs/blob/0699530f08290f34c532beedd66046825d9756fa/nixos/modules/programs/shadow.nix#L122-L123

In the nixpkkgs#shadow derivation:

#define idtool(type) ((type) == GID ? "/usr/bin/newgidmap" : "/usr/bin/newuidmap")

From: https://github.com/genuinetools/img/blob/16d3b6cad7e72f4cd9c8dad0e159902eeee00898/internal/unshare/unshare.c#L134

About compile X11 with --enable-suid-wrapper: https://discourse.nixos.org/t/xorg-on-non-nixos/13455/4

Declaratively make /nix/store permissions 1771?

Some programs need SUID wrappers, can be configured further or are
started in user sessions.

programs.mtr.enable = true;
  programs.gnupg.agent = {
  enable = true;
  enableSSHSupport = true;
};

TODO:

Minimal relevant bits

podman \
run \
--env="SHELL=/bin/bash" \
--interactive=true \
--tty=true \
--rm=true \
--user=podman \
--workdir=/home/podman \
quay.io/podman/stable \
bash \
-c \
'
echo

getcap /usr/bin/new{u,g}idmap

echo

stat -c %a /usr/bin/new{u,g}idmap
stat -c %A /usr/bin/new{u,g}idmap

echo

cat /etc/sub{u,g}id
'

TODO: export as an .tar.gz and import back to test if the capabilities are preserved.

podman \
run \
--interactive=true \
--tty=true \
--rm=true \
--user=podman \
quay.io/podman/stable \
sh \
-c \
'
echo

getcap /usr/bin/new{u,g}idmap

echo

stat /usr/bin/new{u,g}idmap

echo 

cat /etc/sub{u,g}id
'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant