Ubuntu环境下root调用setuid至不存在UID成功是否正常?
现象是否正常?
完全正常,这是Linux系统下setuid系统调用针对root用户的预期行为。
原因分析
- 当进程以root用户(UID=0)运行时,调用
setuid(new_uid)不受目标UID是否存在于/etc/passwd的限制:- 该调用会直接将进程的**真实UID(uid)、有效UID(euid)、保存的设置UID(suid)**全部设置为
new_uid,无论这个UID是否对应系统中存在的用户账户。 - root拥有系统最高权限,系统信任root可以切换到任意UID,包括未在用户数据库中注册的“匿名”UID。
- 该调用会直接将进程的**真实UID(uid)、有效UID(euid)、保存的设置UID(suid)**全部设置为
- 对应你的测试结果:
setuid(3009)返回0(成功)、errno为0,完全符合root调用setuid的成功逻辑。ps命令显示进程的uid和euid均为3009,是因为root调用setuid会一次性修改所有相关UID属性,而非仅修改有效UID。
补充对比
如果是非root用户调用setuid,则只能切换到自身的真实UID或保存的设置UID,且目标UID必须存在(否则会报错EPERM或EINVAL),但root用户不受此限制。
附测试代码:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> int main () { int i; i=setuid(3009); // user id 3009 does not exists printf ("i=%d, err=%d(%s)\n", i, errno, strerror(errno)); exit(0); }
内容的提问来源于stack exchange,提问作者tahzibi.jafar
相关产品推荐
相关产品推荐

