shell_exec() 子进程应该继承 euid 吗?

is shell_exec() sub-process supposed to inherit euid?

我是 运行 php-cli 7.3.19 root(在 Debian 10 Buster 上,linux 内核 4.19.0-8-amd64),使用后posix_seteuid() 来改变我的 euid,子进程应该继承我的 euid 吗?

我认为答案是肯定的,但正在测试,

root@devdb:/srv/http/easyad_branches# whoami
root
root@devdb:/srv/http/easyad_branches# id
uid=0(root) gid=0(root) groups=0(root)
root@devdb:/srv/http/easyad_branches# php -r ' \
var_dump(posix_seteuid(posix_getpwnam("www-data")["uid"])); \
var_dump(shell_exec("whoami;id")); \ 
posix_seteuid(0); \
var_dump(posix_setuid(posix_getpwnam("www-data")["uid"])); \ 
var_dump(shell_exec("whoami;id"));'
bool(true)
string(44) "root
uid=0(root) gid=0(root) groups=0(root)
"
bool(true)
string(53) "www-data
uid=33(www-data) gid=0(root) groups=0(root)
"

whoami 似乎继承了我的 uid,因为它是 euid,而不是继承了我的 euid因为它是 euid,这是预期的行为吗?

换句话说,我得到了 bool(true) root bool(true) www-data ,但我期望 bool(true) www-data bool(true) www-data ,我的期望是错误的,还是有其他事情发生?

it seems whoami inherits my uid as it's euid, rather than inheriting my euid as it's euid, is that intended behavior?

我不是 100% 确定 PHP,但在编程语言中直接调用 Linux 系统调用(例如 C 或 C++)这种行为是正常的。

此行为的一个众所周知的副作用是将 set-euid 位设置为 shell 脚本没有任何意义(只要“正常”shell -例如 bash - 被使用):

shell(例如 /bin/sh)将以 euid 设置为不同的 UID 启动,但由 shell 启动的程序将同时具有 euiduid 设置为 shell 的 uid 值,这是启动脚本的用户的 UID...