普通用户能修改自己密码靠的是suid权限机制:/usr/bin/passwd以root身份临时运行,从而安全修改仅root可写的/etc/shadow文件,权限在进程结束后立即恢复,体现最小必要权限原则。

普通用户能修改自己密码,靠的不是直接碰 /etc/shadow,而是系统巧妙地用 SUID 权限把权限“借”出去——只借给特定程序,且只在运行那几秒钟生效。
passwd 命令是关键载体
Linux 把密码存放在 /etc/shadow,这个文件默认权限是 -rw-r-----,只有 root 可读写。普通用户连看一眼都不行,更别说改了。但 /usr/bin/passwd 这个命令本身属于 root,且设置了 SUID 位:
→ 查看权限:ls -l /usr/bin/passwd
输出类似:-rwsr-xr-x 1 root root ...
其中所有者执行位上的 s 就是 SUID 标志。
SUID 的实际提权过程
当普通用户执行 passwd 时,系统按以下逻辑工作:
本文档主要讲述的是Android linux内核介绍;Android内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 用户对
passwd有执行权限(x),满足触发条件 - 因为设置了 SUID,进程启动后立即以文件所有者(root)身份运行
- 此时进程拥有 root 的全部权限,可以打开、读取、更新
/etc/shadow - 密码修改完成后,进程退出,用户权限立刻恢复为原来的身份,不残留、不延续
为什么不能直接改 shadow 权限?
有人可能想:既然 shadow 写不了,干脆放开权限?这会严重破坏安全机制:
- 设成
rw-r--r--→ 所有人都能读密码哈希,等于裸奔 - 设成
rw-rw-rw-→ 任何人都能随意篡改任意用户密码 - SUID 的设计核心是「最小必要权限」:只让一个受控程序临时升权,其他路径一律封死
如何验证和管理 SUID 程序
日常可做这几件事来确认或审计:
- 查所有带 SUID 的程序:
find /usr/bin /bin -perm -4000 -type f 2>/dev/null - 给自定义脚本加 SUID(不推荐,仅作理解):
chmod u+s mytool - 移除 SUID:
chmod u-s mytool或chmod 755 mytool - 注意:SUID 对 shell 脚本基本无效(多数系统忽略),必须作用于编译后的二进制文件










