这与这个问题。
我有一个脚本(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,脚本也不同。这是我发现的 setuid 中的某种启发式魔法行为吗?
我该怎么知道发生了什么事?
系统是 Ubuntu 10.04.2 LTS,Linux 2.6.32.26-kvm-i386-20101122 #1 SMP
答案1
Linux 忽略设置用户标识strace
在或类似程序下运行进程时位。
Linux 内核邮件列表,回复:2.4.16 + strace 4.4 + setuid 程序:
发件人:Manfred Spraul
日期:2001 年 12 月 6 日星期四 - 12:25:53 EST如果您想要 strace setuid 事物并让 setuid 位得到尊重,您必须以 root 身份运行 strace 并使用 -u 选项。
不,那也不再可能了。如果一个进程被 ptrace,setuid 现在总是被忽略,即使 root 正在 ptrace - 这是最新的 ptrace root 漏洞(2.4.1x)的修复。
可能是在说: