这与这个问题有关。
我有一个脚本(fix-permissions.sh
)修复了一些文件权限:
#! /bin/bash
sudo chown -R person:group /path/
sudo chmod -R g+rw /path/
还有一个小的c程序来运行它,setuid
编辑:
#include "sys/types.h"
#include "unistd.h"
int main(){
setuid(geteuid());
return system("/path/fix-permissions.sh");
}
目录:
-rwsr-xr-x 1 root root 7228 Feb 19 17:33 fix-permissions
-rwx--x--x 1 root root 112 Feb 19 13:38 fix-permissions.sh
如果我这样做,一切似乎都很好,权限确实得到了正确修复:
james $ sudo su someone-else
someone-else $ ./fix-permissions
但如果我使用strace,我得到:
someone-else $ strace ./fix-permissions
/bin/bash: /path/fix-permissions.sh: Permission denied
有趣的是,我使用相同的设置(权限,c程序)获得相同的权限被拒绝错误,但是使用不同的脚本,即使不使用strace也是如此。这是我在发现的某种heureustic魔术行为吗?
我该怎么知道发生了什么?
系统是Ubuntu 10.04.2 LTS,Linux 2.6.32.26-kvm-i386-20101122#1 SMP
setuid
有这么多的安全漏洞,我不应该期望它能够工作,并且永远使用它是一个非常糟糕的主意?