Bug 205727
Summary: | creat() fails (EACCES) on non-root owned file when sticky bit set on dir | ||
---|---|---|---|
Product: | IO/Storage | Reporter: | Trevor Cordes (kernelbugs) |
Component: | DIO | Assignee: | Andrew Morton (akpm) |
Status: | RESOLVED DOCUMENTED | ||
Severity: | normal | ||
Priority: | P1 | ||
Hardware: | All | ||
OS: | Linux | ||
Kernel Version: | 5.3.12 | Subsystem: | |
Regression: | No | Bisected commit-id: |
Description
Trevor Cordes
2019-12-01 08:52:37 UTC
I've simplified the problem somewhat with a sample c program. #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { int result; result=creat("t",0666); printf("result=%d\n",result); } Then these very simple tests show the difference in behaviour of the one system call (creat). Run as root, replace the chown user with a non-root user that exists on your system. /tmp must have stickybit. #cd /tmp/ ; rm -f t ; touch t ; ./a.out ; chown trevor: t ; ./a.out F29 / 5.2.11 (good) result=3 result=3 F30 / 5.3.14 (broken) result=3 result=-1 Not sure, but in my opinion the semantics of how creat() works should not change between 5.2 and 5.3. Again, this only occurs on stickybit dirs like /tmp. In normal dirs the results are always 3 no matter the kernel version. Unless there's some weird cap thing that's been added in. (Again, I have selinux disabled.) Al Viro figured it out; per Al: It is Fedora, all right, but not the kernel. The idiocy in question is controlled by /proc/sys/fs/protected_regular (gotta love the approach to naming, BTW). Write 0 to it and you'll get the normal behaviour back. Setting sits in /usr/lib/sysctl.d/50-default.conf and AFAICS that comes from systemd 241 and later. After checking their git tree the following shows up: commit 2732587540035227fe59e4b64b60127352611b35 Author: Lucas Werkmeister <mail@lucaswerkmeister.de> Date: Wed Jan 16 00:16:10 2019 +0100 Enable regular file and FIFO protection These sysctls were added in Linux 4.19 (torvalds/linux@30aba6656f), and we should enable them just like we enable the older hardlink/symlink protection since v199. Implements #11414. diff --git a/NEWS b/NEWS index ee926a1203..c64ef5871b 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,19 @@ CHANGES WITH 241 in spe: -Db_pie=true option to meson to build position-independent executables. Note that the meson option is supported since meson-0.49. + * The fs.protected_regular and fs.protected_fifos sysctls, which were + added in Linux 4.19 to make some data spoofing attacks harder, are + now enabled by default. While this will hopefully improve the + security of most installations, it is technically a backwards + incompatible change; to disable these sysctls again, place the + following lines in /etc/sysctl.d/60-protected.conf or a similar file: + + fs.protected_regular = 0 + fs.protected_fifos = 0 + + Note that the similar hardlink and symlink protection has been + enabled since v199, and may be disabled likewise. + CHANGES WITH 240: * NoNewPrivileges=yes has been set for all long-running services diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf index b0645f33e7..27084f6242 100644 --- a/sysctl.d/50-default.conf +++ b/sysctl.d/50-default.conf @@ -36,3 +36,7 @@ net.core.default_qdisc = fq_codel # Enable hard and soft link protection fs.protected_hardlinks = 1 fs.protected_symlinks = 1 + +# Enable regular file and FIFO protection +fs.protected_regular = 1 +fs.protected_fifos = 1 |