首页 > 代码库 > Shell编程 之 对setuid的误解

Shell编程 之 对setuid的误解

1.setuid的作用
我们知道当给一个命令赋予了setuid权限之后,那么用户在执行这个命令时便暂时拥有了该
命令所有者的权限,也就是说,不管是谁执行的此命令,都是以该命令所有者的身份执行的。
在Linux系统中,最明显的一个例子就是passwd这个命令。

我们查看/etc/shadow这个文件的权限如下:
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1186 2012-03-09 11:35 /etc/shadow
我们可以看出/etc/shadow这个文件只有root用户可以写,shadow组的用户只能读,其他用
户没有任何权限。

但是每一个用户都可以通过passwd这个命令修改自已的密码,这又是为什么呢?

我们看一下passwd这个命令的属性:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 42856 2011-02-15 06:11 /usr/bin/passwd
我们注意到passwd这个命令的属性中有一个s位,这就是普通用户能够修改自已的密码
的原因。
passwd这个命令具有setuid权限且其属主是root,所以其他用户在用此命令修改密码时,实
际上是以root的身份修改的密码。

我们可以做个实验验证一下。把passwd命令的s位去掉,看普通用户还能否修改自已的密码。
$ sudo chmod u-s /usr/bin/passwd
$ ls -l /usr/bin/passwd
-rwxr-xr-x 1 root root 42856 2011-02-15 06:11 /usr/bin/passwd
$ passwd wlxxsj
更改 wlxxsj 的密码。
(当前)UNIX 密码:
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:认证令牌操作错误
passwd: password unchanged
从上面的实验可以看出,当把passwd这个命令的s位去掉后,普通用户便无法修改自已的密码了。

2. 对setuid的误用

下面说一下我对setuid的一个误用。还是通过一个实验来说明。

先建立一个文件夹和两个文件,它们的关系及属性如下图所示:

其中rmtest.sh是一个shell脚本,作用是删除同目录下的rmtest.txt这个文件。

文件夹setuid,文件rmtest.sh和rmtest.txt的属主和属组都是root。

rmtest.sh具有setuid权限。

我期望的是,当用普通用户执行rmtest.sh这个脚本的时候,能够删除rmtest.txt这个文件。但是删除失败。


再来做个实验。

把rmtest.sh的s位去掉,给rm这个命令添加s位,然后用普通用户执行rmtest.sh这个脚本,rmtest.txt这个文件被成功删除。

3. 总结

我对setuid的误解:

         当给一个脚本赋予了setuid权限后,脚本中的命令就会以脚本的身份执行。这是错误的。

应该这么理解:

        setuid只对命令有效,对脚本无效。或者说只对原子操作(系统命令)有效,对组合操作(用户脚本)无效,除非脚本中

        所用到的命令都具有setuid权限且与脚本同属主。



来自为知笔记(Wiz)