Package: fakeroot
Version: 1.26-1
Severity: critical
Justification: Breaks unrelated software, possibly affects built packages

Hello,

it seems recent changes in libc6 caused the stat() call in C applications
to be expanded in a different way, a way fakeroot does not properly
handle, resulting in the real user-id, not 0.


Reproducer

Use this small programm that stats the given directory and
prints its uid:

===========================================================

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv) {
    struct stat statbuf;

    if (argc != 2) {
        fprintf(stderr, "usage: %s <dir>\n", argv[0]);
        exit(1);
    }

    if (stat (argv[1], &statbuf)) {
        perror("Cannot stat");
        exit(1);
    }

    printf("uid is %u\n", statbuf.st_uid);
}

===========================================================

Environments

* Debian 11 ("bullseye") or unstable with libc6 still on 2.32
* Debian unstable

Then run "fakeroot ./a.out ."

Expected output:

    uid is 0

Actual output on current unstable:

    uid is 1000

(or whatever your user id is)


This problem is part of the built program, not of the environment
it is executed in.


Additionally, if run without fakeroot, the program calls as follows:

strace, old version

    stat(".", {st_mode=S_IFDIR|0755, st_size=19, ...}) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x504), ...}) = 0

strace, new version

    newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
    newfstatat(1, "", {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x228), 
...}, AT_EMPTY_PATH) = 0

ltrace, old version

    __xstat(1, ".", 0x7ffeb9c0a260)                             = 0

ltrace, new version

    stat(0x7ffc5fef250d, 0x7ffc5fef07b0, 0x7ffc5fef07b0, 0x7f0122b05738) = 0


Impact:

This broke the python-apt autopkgtest after uploading a new version of
gnugp2, and even does when using just the old version but re-built
using a current libc6.

Actual breakage is caused by the fact gpg checks for the permissions of
its home directory and emits a warning to stderr for possibly insecure
settings. The python-apt test runs under fakeroot, and while getuid()
returns 0 as expected, the stat() call now yields the actual user-id
(1000 or whatever) for the directory. And any message to stderr causes
autopkgtest to assume failure.

No further checks where done but I am concerned this might affect
packages that still use fakeroot for building. If Debian starts shipping
packages where file ownership should be root but is not, we have a
problem. Scanning my local package cache, I have no indication this
happened for far.


Additionally:

Adrian Bunk mentioned this has been fixed in Ubuntu, a quick check
confirms that for 22.04.


    Christoph

-- System Information:
Debian Release: bookworm/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.10.84 (SMP w/8 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages fakeroot depends on:
ii  libc6        2.33-1
ii  libfakeroot  1.26-1

fakeroot recommends no packages.

fakeroot suggests no packages.

-- no debconf information

Attachment: signature.asc
Description: PGP signature

Reply via email to