POSIX 文件能力:分配根用户的能力
2008-11-12 08:30:08 来源:WEB开发网当插入这个内核模块时,对 cap_capable() 的任何调用都被替换为对 cr_capable() 函数的调用。这个函数输出需要能力的程序的名称和被核查的能力。然后,通过调用 jprobe_return() 继续执行实际的 cap_capable() 调用。
使用清单 4 中的 makefile 编译这个模块:
清单 4. capable_probe 的 makefile
obj-m := capable_probe.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -f *.mod.c *.ko *.o
然后作为根用户执行它:
/sbin/insmod capable_probe.ko
现在在一个窗口中,用以下命令查看系统日志:
tail -f /var/log/messages
在另一个窗口中,作为非根用户执行没有设置 setuid 位的 ping 二进制程序:
/bin/ping google.com
系统日志现在包含关于 ping 的几条记录。这些记录指出这个程序试图使用的能力。这些能力并非都是必需的。ping 请求的能力是 21、13 和 7,可以检查 /usr/include/linux/capability.h,将整数转换为能力名称:
21 是 CAP_SYS_ADMIN。不要把这个能力授予任何 程序。
7 是 CAP_SETUID。ping 应该不需要这个能力。
13 是 CAP_NET_RAW。ping 应该需要这个能力。
我们将这个能力授予 ping,看看它是否能够成功执行。
setfcaps -c cap_net_raw=p -e /bin/ping
(become non root user)
ping google.com
不出所料,ping 成功了。
复杂情况
现有的软件常常编写得尽可能可靠,在许多 UNIX 变体上很少有改动。发行版有时候会在此之上应用它们自己的补丁,所以在某些情况下不可能用文件能力替代 setuid 位。
更多精彩
赞助商链接