Package: release.debian.org Severity: normal X-Debbugs-Cc: a...@packages.debian.org Control: affects -1 + src:acct User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package acct Please reduce the required age for acct from 20 days to 18 or fewer days. [ Reason ] acct may be about a day too new to migrate to testing before the full freeze. The reason for this version is to import a fix present in Ubuntu for a buffer overflow in the dump-acct tool. The change also includes an autopkgtest designed to avoid needing release team intervention but unfortunately we timed this wrong and now need a bump! acct (6.6.4-8) unstable; urgency=medium acct (6.6.4-7) experimental; urgency=medium * Import sprintf buffer overflow fix from Ubuntu. (Closes: #1108428) * Add autopkgtest for process accounting [ Impact ] Trixie users run code with a known buffer overflow. There is no known user impact from this in Debian as the bug has only been observed to cause problems with -D_FORTIFY_SOURCE=3, which is enabled for Ubuntu builds, where the dump-acct command will always crash but not Debian ones. [ Tests ] I and the sponsor of the package both verified that the crash can be triggered when built with -D_FORTIFY_SOURCE=3 without the fix and that with the fix this does not happen. The affected tool works fine *from the user-visible perspective* in the *Debian-built* package as expected either way due to the lack of the hardening build option. [ Risks ] The bugfix is trivial and has been in Ubuntu since February. With the new autopkgtest this has been road-tested through Debian experimental and unstable 13 days so far. I see no risk in accepting this package into testing. Realistically, it's probably ready to migrate now. [ Checklist ] [X] all changes are documented in the d/changelog [X] I reviewed all changes and I approve them [X] attach debdiff against the package in testing [ Other info ] https://bugs.debian.org/1108428 I also directly attach the patch that is applied to the upstream code for your convenience - this is the only non-autopkgtest change present. $ git diff --stat debian/6.6.4-6 debian/6.6.4-8 debian/changelog | 19 ++++++++++ debian/patches/07_sprintf-buffer-overflow.patch | 21 +++++++++++ debian/patches/series | 1 + debian/tests/control | 3 ++ debian/tests/pacct | 59 +++++++++++++++++++++++++++++ debian/tests/src/Makefile | 16 ++++++++ debian/tests/src/fake-acct.c | 44 ++++++++++++++++++++++ debian/tests/src/gen-acct.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 319 insertions(+) Thanks! unblock acct/6.6.4-8
diff -Nru acct-6.6.4/debian/changelog acct-6.6.4/debian/changelog --- acct-6.6.4/debian/changelog 2025-06-07 07:57:39.000000000 +0100 +++ acct-6.6.4/debian/changelog 2025-07-07 16:09:45.000000000 +0100 @@ -1,3 +1,22 @@ +acct (6.6.4-8) unstable; urgency=medium + + * Team upload. + * Upload to unstable. Thanks to Andrew Bower for all the work. + + -- Carlos Henrique Lima Melara <charlesmel...@riseup.net> Mon, 07 Jul 2025 12:09:45 -0300 + +acct (6.6.4-7) experimental; urgency=medium + + * Team upload. + + [ Matthew L. Dailey ] + * Import sprintf buffer overflow fix from Ubuntu. (Closes: #1108428) + + [ Andrew Bower ] + * Add autopkgtest for process accounting + + -- Andrew Bower <and...@bower.uk> Sun, 06 Jul 2025 16:58:06 +0100 + acct (6.6.4-6) unstable; urgency=medium * Team upload. diff -Nru acct-6.6.4/debian/patches/07_sprintf-buffer-overflow.patch acct-6.6.4/debian/patches/07_sprintf-buffer-overflow.patch --- acct-6.6.4/debian/patches/07_sprintf-buffer-overflow.patch 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/patches/07_sprintf-buffer-overflow.patch 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,21 @@ +Description: Fix buffer overflow in dev_hash.c +Author: Jan Rybar +Bug-Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=2190057 +Bug-Ubuntu: https://bugs.launchpad.net/bugs/2095035 +Bug-Debian: https://bugs.debian.org/1108428 +Bug: http://savannah.gnu.org/bugs/?67028 +Last-Update: 2025-07-06 + +Index: acct-6.6.4/dev_hash.c +=================================================================== +--- acct-6.6.4.orig/dev_hash.c ++++ acct-6.6.4/dev_hash.c +@@ -147,7 +147,7 @@ static void setup_devices(char *dirname) + { + char *fullname = (char *) alloca ((strlen (dirname) + + NAMLEN (dp) +- + 1) * sizeof (char)); ++ + 2) * sizeof (char)); /* slash + null; Fedora BZ#2190057 */ + + (void)sprintf (fullname, "%s/%s", dirname, dp->d_name); + if (stat (fullname, &sp)) diff -Nru acct-6.6.4/debian/patches/series acct-6.6.4/debian/patches/series --- acct-6.6.4/debian/patches/series 2025-06-07 07:57:39.000000000 +0100 +++ acct-6.6.4/debian/patches/series 2025-07-06 18:39:49.000000000 +0100 @@ -4,3 +4,4 @@ 04_Fix-spelling-errors.patch 05_Adapt_dump.acct.8-manpage.patch 06_adapt_dump-utmp.8-manpage.patch +07_sprintf-buffer-overflow.patch diff -Nru acct-6.6.4/debian/tests/control acct-6.6.4/debian/tests/control --- acct-6.6.4/debian/tests/control 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/tests/control 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,3 @@ +Tests: pacct +Depends: @, gcc, make, libc6-dev +Restrictions: needs-root, breaks-testbed, allow-stderr diff -Nru acct-6.6.4/debian/tests/pacct acct-6.6.4/debian/tests/pacct --- acct-6.6.4/debian/tests/pacct 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/tests/pacct 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Generate fake process accounting data via the package's installed +# service defitions and sanity check the output from lastcomm. + +#set -x +set -e + +FILE=/var/log/account/pacct + +fail () { echo $1 >&2; exit 1; } + +# Stop process accounting if it has already started +service acct stop >/dev/null 2>/dev/null || true +[ ! -s "$FILE" ] || truncate --size 0 "$FILE" + +# Install test library +cp -a debian/tests/src $AUTOPKGTEST_TMP +cd $AUTOPKGTEST_TMP +make -C src +install -t /usr/local/bin src/gen-acct +install -t /usr/local/lib src/fake-acct.so +echo "/usr/local/lib/fake-acct.so" >> /etc/ld.so.preload + +# Start fake process accounting +[ ! -s "$FILE" ] || fail "pacct already populated" +service acct start 2>&1 +sleep 5 +[ -f "$FILE" ] || fail "pacct did not get created" +sleep 20 +service acct stop 2>&1 +[ -s "$FILE" ] || fail "pacct did not grow" +sleep 5 +sz=$(stat -c %b "$FILE") +sleep 10 +[ "$sz" = $(stat -c %b "$FILE") ] || fail "psacct did not stop growing" + +lastcomm > lastcomm.out 2> lastcomm.err +echo "First 5 lines of $(wc -l < lastcomm.out) from lastcomm:" +head -n5 lastcomm.out | cat -n +[ $(wc -l < lastcomm.out) -gt 10 ] || fail "lastcomm output too short" +if [ -s lastcomm.err ] +then + echo "Error output from lastcomm:" + cat lastcomm.err | cat -n + exit 1 +fi + +cat lastcomm.out | cut -d\ -f1 > lastprocs +cat lastprocs | sort | uniq > a +ls /usr/bin > b1 +ls /usr/sbin > b2 +cat b1 b2 | cut -c1-16 | sort | uniq > b + +echo "Some system binaries included in lastcomm output:" +comm -1 -2 a b | head -n5 | cat -n +common=$(comm -1 -2 -3 --total a b | cut -f3) + +[ $common -gt 5 ] || fail "too few system binaries feature in lastcomm output" diff -Nru acct-6.6.4/debian/tests/src/fake-acct.c acct-6.6.4/debian/tests/src/fake-acct.c --- acct-6.6.4/debian/tests/src/fake-acct.c 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/tests/src/fake-acct.c 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,44 @@ +/* fake-acct + * An ld preload library to fake the libc wrapper for the acct(2) syscall + * and enable fake process accounting generation using gen-acct. + * -- Andrew Bower <and...@bower.uk> Thu, 19 Jun 2025 07:27:24 +0100 + */ + +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +static const char *tool = "/usr/local/bin/gen-acct"; +static const char *lock = "/run/gen-acct.pid"; + +int acct(const char *filename) { + char *cmd; + int rc; + + if (filename) { + if ((rc = asprintf(&cmd, "%s %s %s", tool, lock, filename)) != -1) { + rc = system(cmd); + free(cmd); + } + } else { + if ((rc = access(lock, R_OK | W_OK)) != -1) { + FILE *pidf = fopen(lock, "r"); + pid_t pid; + if (pidf == NULL) + return -1; + if (fscanf(pidf, "%d", &pid) == 1) { + if (pid > 0) { + rc = kill(pid, SIGTERM); + } else { + rc = -1; + errno = ESRCH; + } + } + fclose(pidf); + unlink(lock); + } + } + return rc; +} diff -Nru acct-6.6.4/debian/tests/src/gen-acct.c acct-6.6.4/debian/tests/src/gen-acct.c --- acct-6.6.4/debian/tests/src/gen-acct.c 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/tests/src/gen-acct.c 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,156 @@ +/* gen-acct + * Generate fake acct(5) data that looks vaguely plausible to the + * running system by using the system's binary names. This application + * daemonises, writes its pid into a lock file and populates the log file + * in the background. + * -- Andrew Bower <and...@bower.uk> Thu, 19 Jun 2025 07:27:24 +0100 + */ + +#include <dirent.h> +#include <errno.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> +#include <sys/acct.h> + +struct evt_src { + char comm[ACCT_COMM]; + double cumulative_probability; +}; + +const uid_t uids[] = { 0, 1000, 1001 }; +constexpr int num_uids = sizeof uids / sizeof *uids; + +struct evt_src *sources = NULL; +int num_sources = 0; + +static int file_filter(const struct dirent *d) { + return d->d_type == DT_REG || d->d_type == DT_UNKNOWN; +} + +int populate_sources(void) { + struct dirent **files; + int i; + double p = 0.1; + double pp = 0.0; + int rc = 0; + + num_sources = scandir("/usr/bin", &files, file_filter, alphasort); + if (num_sources == -1) { + num_sources = 0; + rc = errno; + goto fail; + } + + sources = malloc(num_sources * sizeof *sources); + if (sources == NULL) { + rc = errno; + goto fail1; + } + + for (i = 0; i < num_sources; i++) { + struct evt_src *s = sources + i; + + strncpy(s->comm, files[i]->d_name, sizeof s->comm); + s->cumulative_probability = pp += (1 - pp) * p; + } + +fail1: + free(files); +fail: + return rc; +} + +void free_sources(void) { + sources = NULL; + num_sources = 0; +} + +int main(int argc, char *argv[]) { + const char *lockpath; + const char *fnam; + FILE *file; + size_t sz; + pid_t pid = -1; + + if (argc != 3) { + fprintf(stderr, "usage: %s <lock-file> <acct-file>\n", argv[0]); + return EXIT_FAILURE; + } + lockpath = argv[1]; + fnam = argv[2]; + + if (populate_sources() != 0) { + perror("populating sources"); + goto finish; + } + + /* Check access first because we want to fail on missing file */ + if (access(fnam, W_OK) != 0) { + perror("access"); + goto finish; + } + + /* Spawn daemon */ + pid = fork(); + if (pid == -1) { + perror("fork"); + goto finish; + } + + /* Parent actions - write PID to lock file */ + if (pid != 0) { + FILE *lock = fopen(lockpath, "w"); + if (lock == NULL) { + perror("fopen(lock)"); + goto finish; + } + fprintf(lock, "%d\n", pid); + fflush(lock); + goto finish; + } + + /* Child actions - open log file */ + file = fopen(fnam, "a"); + if (file == NULL) { + perror("fopen(log)"); + goto child_fail; + } + + srand48(time(nullptr)); + + while (true) { + struct acct_v3 r; + struct evt_src *s; + double p = drand48(); + time_t t = time(nullptr); + + for (s = sources; s - sources < num_sources && p > s->cumulative_probability; s++); + if (s - sources < num_sources) { + memset(&r, '\0', sizeof r); + r.ac_version = 3; + r.ac_etime = sqrt(3600.0 * drand48()); + r.ac_btime = t - ceil(r.ac_etime); + r.ac_uid = uids[(int) (num_uids * drand48())]; + r.ac_gid = r.ac_uid; + memcpy(&r.ac_comm, s->comm, sizeof r.ac_comm); + sz = fwrite(&r, sizeof r, 1, file); + if (sz != 1) { + perror("fwrite"); + fclose(file); + goto child_fail; + } + } + usleep(20000); + } + +child_fail: + unlink(lockpath); + +finish: + free(sources); + return pid > 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} diff -Nru acct-6.6.4/debian/tests/src/Makefile acct-6.6.4/debian/tests/src/Makefile --- acct-6.6.4/debian/tests/src/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ acct-6.6.4/debian/tests/src/Makefile 2025-07-06 18:39:49.000000000 +0100 @@ -0,0 +1,16 @@ +CFLAGS+=-std=gnu23 -g -Wall -Wextra -Werror -fPIC +LDLIBS+=-lm + +TARGETS=gen-acct fake-acct.so + +all: $(TARGETS) +.PHONY: all + +.PHONY: clean +clean: + $(RM) $(TARGETS) gen-acct.o fake-acct.o + +gen-acct: gen-acct.o + +fake-acct.so: fake-acct.o + $(LINK.o) $^ -fPIC -shared -ldl -o $@
Description: Fix buffer overflow in dev_hash.c Author: Jan Rybar Bug-Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=2190057 Bug-Ubuntu: https://bugs.launchpad.net/bugs/2095035 Bug-Debian: https://bugs.debian.org/1108428 Bug: http://savannah.gnu.org/bugs/?67028 Last-Update: 2025-07-06 Index: acct-6.6.4/dev_hash.c =================================================================== --- acct-6.6.4.orig/dev_hash.c +++ acct-6.6.4/dev_hash.c @@ -147,7 +147,7 @@ static void setup_devices(char *dirname) { char *fullname = (char *) alloca ((strlen (dirname) + NAMLEN (dp) - + 1) * sizeof (char)); + + 2) * sizeof (char)); /* slash + null; Fedora BZ#2190057 */ (void)sprintf (fullname, "%s/%s", dirname, dp->d_name); if (stat (fullname, &sp))