特权分离
在计算机编程和计算机安全中,特权分离(亦可称作权限分离)是一种用于实现最小权限原则的防御式编程方法。在实践特权分离的程序中,程序被按职责分为多个部分,每个部分仅被授予执行特定任务所需的特定特权,以此减轻安全漏洞可能带来的危害。
特权分离的常见实践是将计算机程序分叉为两个进程。主程序放弃特权,而较小的辅助程序保留特权以执行特定任务。然后,这两部分通过一对套接字(或其他安全的方法)进行通信。在此实践下,这对程序可以照常执行特权操作,而即使较大的主程序被攻击者利用,攻击者也无法获得特权。
在传统的 POSIX 系统(如 Linux 或是其他类 UNIX 操作系统)上,权限分离可以通过使用 POSIX 标准中定义的setuid (2) / setgid (2) 及相关系统调用将真实的用户 ID / 组 ID 与有效的用户 ID / 组 ID 区分开来完成。[1]如果这些调用的触发顺序或是位置不正确,则有可能使程序暴露在网络攻击者的威胁之中,让攻击者有机会渗透进其他系统中。
许多面向网络的守护进程都必须执行特定的特权操作,例如在特权端口上建立套接字。而用于系统管理和维护的实用程序在运行期间也可能需要特定的特权。出于安全考量,此类程序经常在特权操作完成后通过完全撤销自身特权并转而以某个低权限用户的身份运行来实践特权分离。
此操作在类 Unix操作系统下常被称为解除 root。程序不需要特权的部分通常在 nobody 用户或等效的单独用户帐户下运行。
此外,特权分离还可以通过将单个程序拆分为多个较小的程序,然后将各个小程序所需的权限以文件系统权限授予来实现。在此实现下,不同的小程序必须通过操作系统相互通信,即使子程序被利用,攻击者也仅能促成拒绝服务,而无法提升权限,由此便可限制漏洞被利用可能导致的后果。
许多操作系统和应用程序在设计时都重点考虑了利用特权分离来提高安全性。在 OpenBSD 中,特权分离是主要安全功能之一。[2]而作为面向网络的邮件服务器软件,Postfix 和 Dovecot 的设计也都体现了权限分离的思想。
外部链接
- Theo de Raadt: Exploit Mitigation Techniques in OpenBSD (页面存档备份,存于) (OpenBSD 中的抗利用技术)
- Niels Provos, Markus Friedl, Peter Honeyman: Preventing Privilege Escalation (页面存档备份,存于) paper
- Niels Provos: Privilege Separated OpenSSH project
- Trusted Solaris Developer's Guide: Bracketing Effective Privileges (页面存档备份,存于)