![如何用文件系统功能替换 setuid](https://linux22.com/image/27059/%E5%A6%82%E4%BD%95%E7%94%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%8A%9F%E8%83%BD%E6%9B%BF%E6%8D%A2%20setuid.png)
灵感来自这个问题这是后续内容:
你们中的一些人可能知道 setuid 二进制文件很危险,因为一些漏洞利用这些文件将其权限升级到 root。
现在似乎出现了一个有趣的想法,用不同的、更安全的方式来替代 setuid。
如何?
答案1
添加了 Linux 中的文件系统功能,以实现比单独 setuid 更细粒度的控制。使用 setuid 可以将有效权限完全升级到用户(通常是 root)。 features(7) 联机帮助页提供了以下描述:
为了执行权限检查,传统的 Unix 实现区分两类进程:特权进程(其有效用户 ID 为 0,称为超级用户或 root)和非特权进程(其有效 UID 不为零)。特权进程绕过所有内核权限检查,而非特权进程则受到基于进程凭据(通常:有效 UID、有效 GID 和补充组列表)的完全权限检查。
从内核 2.2 开始,Linux 将传统上与超级用户相关的权限划分为不同的单元,称为功能,可以独立启用和禁用。能力是每个线程的属性。
如果应用程序需要能够调用 chroot()(通常只允许 root 用户使用),则CAP_SYS_CHROOT
可以在二进制文件上设置,而不是在 setuid 上设置。这可以使用 setcap 命令来完成:
setcap CAP_SYS_CHROOT /bin/mybin
作为RPM 版本 4.7.0,可以使用 来在打包文件上设置功能%caps
。
Fedora 15 有一个发布目标删除在此跟踪的所有 setuid 二进制文件错误报告。根据错误报告,这个目标已经实现。
维基百科上的文章基于能力的安全对于任何有兴趣的人来说都是很好的读物。