2008年8月26日星期二

理解linux下suid和sgid所造成的危险

linux下,一些程序需要以该程序所从属的用户权限来执行。最有效的例子当然是passwd了。
showrun@showrun-laptop:/$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 29104 2006-12-20 04:35 /usr/bin/passwd

如果普通用户需要更改密码,但是存放密码的文件/etc/passwd和/etc/shadow只有root用户有w权限
showrun@showrun-laptop:/$ ls -l /etc/passwd
-rw-r–r– 1 root root 1438 2007-09-17 17:51 /etc/passwd
showrun@showrun-laptop:/$ ls -l /etc/shadow
-rw-r—– 1 root shadow 875 2007-09-17 17:51 /etc/shadow

那么就需要一/usr/bin/passwd程序所从属的用户——root的权限运行才有效。

SUID权限就是代表:当设置了 SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。
SGID 与上面的内容类似。文件运行时,运行者将具有所属组的特权。

作为一名系统管理员,您可能会对人人可写的目录感兴趣,从而满足所有用户可写的文件系统应该使用 nosuid
属性进行挂载的需求。用户可写的目录包括用户的根目录,以及任何人人可写的目录。之所以有这种要求是为了防止创建其他用户或管理员可能会不经意执行的
suid 可执行程序。然而,如果在一个合法的 suid 可执行程序与一个人人可写的目录在同一个文件系统中,因此使用 nosuid
选项来挂载的,那么 suid 位就会被忽略,这个可执行程序也就无法正确执行。

以下的这个脚本就能够查找到在人人可读的目录下,有setuid位的文件。
find_setuids.pl

另外,再说一下stick-bit也叫粘贴位,/tmp目录是一个人人可写的目录。如果这台机器上有多个用户,都在/tmp目录下创建了文件,如果没有stick-bit。那么任何一个用户都能够将/tmp目录下的文件删除或者改写。当给 /tmp 设置了粘滞位,唯一能够删除或重命名 /tmp 中文件的是该目录的所有者。所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位。

没有评论: