何时在setreuid中更新saved-set-uid以实现SUID?

摘要:setreuid(-1,foo) 为何有时更新 saved set-user-id 有时不更新?man setreuid 中关于 SUID 变更的说明是否正确?如此设计有何考虑?本文通过阅读 linux 源码为你揭秘
前言 在写《[apue] 进程控制那些事儿》/"进程创建"/"更改进程用户 ID 和组 ID"一节时,发现 setreuid 更新实际用户 ID (RUID) 或有效用户 ID (EUID) 时,保存的设置用户 ID (saved set-user-id SUID) 只会随 EUID 变更,并不像 man 上说的会随 RUID 变更 (man setreuid): If the real user ID is set (i.e., ruid is not -1) or the effective user ID is set to a value not equal to the previous real user ID, the saved set-user-ID will be set to the new effective user ID. 下面是实测结果: 调用参数 (root 身份) RUID EUID SUID setreuid (bar, foo) bar foo foo setreuid (foo, bar) foo bar bar setreuid (-1, foo) root foo foo setreuid (bar, -1) bar root root setreuid (bar, bar) bar bar bar setreuid (foo, foo) foo foo foo 特别是第 5 行 setreuid(bar, -1),RUID 变更为了 bar,SUID 仍保持 root 不变。 为了解答这个问题,找来系统对应版本的 linux 源码查看: > uname -a Linux goodcitizen.bcc-gzhxy.baidu.com 3.10.0-1160.80.1.el7.x86_64 #1 SMP Tue Nov 8 15:48:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux 这里是 3.10。
阅读全文