为何指向PTY设备的符号链接所有者会影响root用户的访问权限?
这个问题的核心是**/tmp目录的sticky位权限结合Linux内核对PTY设备的特殊访问控制逻辑**共同导致的,下面逐步拆解原因:
1. /tmp的sticky位是触发异常的前提
/tmp目录默认权限是1777(即rwxrwxrwt),其中最后的t就是sticky位。它的核心作用是限制只有文件所有者、目录所有者或root才能删除/重命名目录内的文件,但除此之外,内核还会对sticky目录下的符号链接访问触发额外的安全检查——这正是问题的关键。
2. PTY设备的双重访问控制
/dev/pts下的PTY slave设备(比如/dev/pts/0)的访问权限不仅依赖文件系统权限(通常是crw--w----,所有者为创建终端的普通用户,组为tty),还受内核的终端会话检查:
- 普通用户作为PTY的会话领导者(即打开该终端的用户),自然拥有访问权限;
- root用户本应能直接访问任何文件,但在通过sticky目录下的符号链接访问时,内核会启动额外验证。
3. 内核对sticky目录下符号链接的特殊检查
当root尝试访问/tmp下普通用户创建的PTY符号链接时,内核会执行以下安全验证:
为了防止恶意用户通过在公共sticky目录(如/tmp)创建符号链接来绕过权限控制,内核会检查符号链接的所有者是否有权访问目标设备。如果符号链接所有者是普通用户,即使调用者是root,内核会模拟以符号链接所有者的身份去检查目标PTY的访问权限——这就导致root的权限被临时"降级",最终触发
permission denied错误。
当你执行sudo chown -h root /tmp/link将符号链接所有者改为root后,内核验证符号链接所有者与调用者(root)身份一致,因此跳过了上述降级检查,允许root正常访问目标PTY设备。
4. 用户主目录无此问题的原因
用户主目录的权限通常是755或700,没有设置sticky位,因此内核不会触发针对符号链接的额外安全检查。此时root访问符号链接时,直接遵循标准的符号链接访问规则:仅检查目标PTY设备的权限,root自然有权访问。
内容的提问来源于stack exchange,提问作者Andrej Levkovitch

