POSIX 文件能力:分配根用户的能力
2008-11-12 08:30:08 来源:WEB开发网为了测试这个函数,将代码复制到一个文件中并保存为 execwithcaps.c,编译并作为根用户运行它:
gcc -o execwithcaps execwithcaps.c -lcap
./execwithcaps cap_sys_admin=eip
文件能力
文件能力特性当前是在 -mm 内核树中实现的,有望在 2.6.24 版中被包含在主线内核中。可以利用文件能力特性将能力分配给程序。例如,ping 程序需要 CAP_NET_RAW。因此,它一直是一个 setuid root 程序。有了文件能力特性之后,就可以减少这个程序的特权数量:
chmod u-s /bin/ping
setfcaps -c cap_net_admin=p -e /bin/ping
这需要从 GoogleCode 获得 libcap 库和相关程序的最新版本(参见 参考资料 中的链接)。以上命令首先从二进制文件上删除 setuid 位,然后给它分配所需的 CAP_NET_RAW 特权。现在,任何用户都可以用 CAP_NET_RAW 特权运行 ping,但是如果 ping 程序被突破了,攻击者也无法掌握其他特权。
问题在于,如何判断一个非特权用户在运行某个程序时需要的最小能力集。如果只考虑一个程序的话,那么可以研究应用程序本身、它的动态链接库和内核源代码。但是,需要对所有 setuid root 程序都重复这个过程。当然,在允许非特权用户作为根用户运行一个应用程序之前,采用这种方法进行检查并不是个坏主意,但是这种方法不切实际。
如果一个程序提供详细的错误输出而且表现正常,那么不使用任何特权来运行这个程序,然后检查错误消息,看看它缺少哪些特权。我们来对 ping 试试这种方法。
chmod u-s /bin/ping
setfcaps -r /bin/ping
su - myuser
ping google.com
ping: icmp open socket: Operation not permitted
更多精彩
赞助商链接