Description
Description
I don't remember where I reported this, but I haven't heard anything about it since November of 2022, so here it is again: https://bugs.gentoo.org/839894
Several filesystem tests check for root privileges with,
$ cat ext/standard/tests/skipif_root.inc
<?php
// Skip if being run by root (files are always readable, writeable and executable)
$filename = @tempnam(__DIR__, 'root_check_');
if (!file_exists($filename)) {
die('WARN Unable to create the "root check" file');
}
$isRoot = fileowner($filename) == 0;
unlink($filename);
if ($isRoot) {
die('SKIP Cannot be run as root');
}
and proceed to modify the live filesystem if the user is not root. Those modifications are expected to fail. For example,
$ cat ext/standard/tests/file/006_error.phpt
--TEST--
Test fileperms(), chmod() functions: error conditions
--SKIPIF--
<?php
if (substr(PHP_OS, 0, 3) == 'WIN') {
die('skip Not on Windows');
}
require __DIR__ . '/../skipif_root.inc';
?>
--FILE--
<?php
echo "*** Testing error conditions for fileperms(), chmod() ***\n";
/* With standard files and dirs */
var_dump( chmod("/etc/passwd", 0777) );
printf("%o", fileperms("/etc/passwd") );
echo "\n";
clearstatcache();
...
This test tries to make /etc/passwd
world-writable, but it will be skipped if you are uid 0. Well, not only uid 0 can modify /etc/passwd
. if there's an admins
group, for example, its members may have uid 1000+ and still be able to add new users by modifying /etc/passwd
. The user reporting the Gentoo bug is also able to write those files, and is not root (for some other reason). In cases like those, this test creates a security issue: the test will be run because the user is not root, and /etc/passwd
will be made world-writable; afterwards, anyone can edit it.
There are two problems here:
- The "skip if root" test is flawed, since there are other reasons (than being root) why the test could fail to fail.
- If we're going to break the system in the event that the test is somehow not skipped, we should break it to be overly secure, and not less secure.
PHP Version
git HEAD
Operating System
No response