You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。
  • 对应你的测试结果:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:53:17