Linux判断进程权限依据的是Effective UID(EUID),而非真实用户ID(RUID);EUID决定文件读写、端口绑定等操作能否执行,内核权限检查仅比对EUID与资源属主权限,SUID程序执行时EUID自动设为文件所有者UID,程序可通过seteuid()临时切换EUID但受限于RUID或Saved UID。

Linux 判断一个进程能不能读文件、删目录、改配置,看的不是“谁启动了它”,而是它的 Effective UID(EUID)。它才是内核做权限检查时真正用到的身份标识。
Effective UID 决定“你现在能做什么”
EUID 是内核验证访问权限时唯一参考的用户 ID。比如打开 /etc/shadow、绑定 80 端口、写入 /proc/sys/net/ipv4/ip_forward,系统只比对进程的 EUID 和目标资源的属主、属组及其他权限位。
- 普通命令(如
ls、cat)运行时,EUID 默认等于启动它的用户 UID - 设置了 SUID 位的程序(如
/usr/bin/passwd),执行时 EUID 自动变成该文件所有者的 UID(通常是 root) - 程序可通过
seteuid()临时切换 EUID,但必须满足约束:只能设为 Real UID 或 Saved UID - EUID 为 0(root)时,绕过大部分传统权限检查(除 SELinux、capabilities 等额外机制外)
Real UID 标记“你本来是谁”
Real UID(RUID)在进程创建那一刻就固定下来,代表真正的操作发起者。它不参与权限判定,但用于审计、日志记录和策略识别(例如 sudo 日志里记录的就是 RUID)。
- 登录 shell 的 RUID 就是你的账号 UID,所有子进程继承该值
- RUID 不会因 SUID 或 seteuid() 改变,普通进程也无法修改它
- 只有 EUID 为 0 时,才能调用
setuid()同时修改 RUID、EUID 和 Saved UID
Saved UID 是权限切换的安全锚点
当程序以 SUID 方式启动(如普通用户执行 passwd),内核会把文件所有者的 UID 同时存入 Saved UID。这个值不直接参与权限检查,但它是 seteuid() 能否成功的关键依据。
- 普通用户执行
passwd:RUID=1001,EUID=0,Saved UID=0 - 完成密码修改后,程序可安全调用
seteuid(1001)降权;需要再次提权时,再seteuid(0)——前提是 Saved UID 仍为 0 - 没有 Saved UID,进程就无法在普通权限下可靠地“先提权、再降权”,容易引发安全风险
怎么快速确认当前进程的 EUID 状态
不用猜,直接查:
- 查看指定进程:运行
ps -o pid,ruid,euid,suid,comm -p $PID(需有权限) - 列出所有进程的 UID 状态:
ps -eo pid,ruid,euid,suid,comm(root 用户可用) - 检查文件是否带 SUID:
ls -l /usr/bin/passwd,看到rwsr-xr-x中的s即表示生效 - 代码中获取:调用
geteuid()得 EUID,getuid()得 RUID(无直接 API 获取 Saved UID)


















