不只是读写:解密 Linux 文件权限与特权提升
在 Linux 中,“一切皆文件”。文件权限不仅定义了数据的可访问性,更是系统安全与特权管理的核心。
权限模型回顾
除了标准的 UGO(User/Group/Others)读、写、执行权限外,Linux 还引入了特殊权限位,它们往往是系统安全防护的边界,也是攻击者眼中的“金矿”。
关键特殊位:SUID/SGID/Sticky Bit
- SUID (Set User ID):赋予执行文件,进程运行时将以该文件的所有者(通常是 root)身份运行。这是系统程序(如
passwd)实现非特权用户修改密码的关键。 - SGID (Set Group ID):赋予文件时效果类似 SUID;赋予目录时,在该目录下创建的新文件会自动继承父目录的所属组。
- Sticky Bit (粘滞位):通常用于共享目录(如
/tmp),确保用户只能删除属于自己的文件。
提权:为何 SUID 是危险的?
如果一个配置不当的程序拥有 SUID 位(且所有者为 root),它就可能成为提权的跳板。
场景分析:利用 SUID 执行任意命令
攻击者可以寻找具备 SUID 权限的、允许执行系统命令的程序。
例如,若程序调用了未定义完整路径的 system() 函数,攻击者可通过修改 PATH 环境变量,让该程序执行恶意的同名可执行文件,从而获得 root 权限。
# 检查系统中所有具备 SUID 权限的文件
find / -perm -4000 -type f 2>/dev/null
生产环境的防御建议
对于构建 Agent 系统的工程师,如何通过权限设计防范此类风险?
- 最小权限原则 (PoLP):
- 限制 SUID:定期扫描系统中不必要的 SUID 文件。
- 容器化隔离:将 Agent 运行在受限的 Docker 容器中,利用 Namespace 和 cgroups 进行内核级隔离,即便 Agent 被攻破,其权限也仅限于容器内部。
- 可观测性增强:
- 在敏感目录(如
/etc,/usr/bin)部署auditd监控,一旦出现异常的chmod或chown操作立即触发告警。
- 在敏感目录(如
- 防范脚本注入:
- 在代码层面,永远不要直接执行不可信的 shell 字符串,使用结构化的 API 调用。
总结
权限控制是 Linux 内核安全的第一道防线。作为部署工程师,理解这些特权位的生效机制,不仅能帮助我们更优雅地进行系统运维,更能建立起防御漏洞利用的体系化思维。
本文是 Linux 原理系列第四篇。下篇我们将深入探索“网络命名空间与隔离技术”。