该setuid权限位告诉Linux与业主,而不是执行者的有效用户ID运行程序:
> cat setuid-test.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
printf("%d", geteuid());
return 0;
}
> gcc -o setuid-test setuid-test.c
> ./setuid-test
1000
> sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
> ./setuid-test
65534
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于可执行文件;shell 脚本忽略 setuid 位:
> cat setuid-test2
#!/bin/bash
id -u
> ./setuid-test2
1000
> sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2
> ./setuid-test2
1000
Run Code Online (Sandbox Code Playgroud)
维基百科说:
由于安全漏洞的可能性增加,许多操作系统在应用于可执行 shell 脚本时会忽略 setuid 属性。
假设我愿意接受这些风险,有没有办法告诉 Linux 将 shell 脚本上的 setuid …
我在几个地方看到了使用以下shebang行的建议
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)
代替
#!/usr/bin/bash
Run Code Online (Sandbox Code Playgroud)
我的下意识反应是,“如果有人用这个可执行文件代替他们自己的 ~/.local/bin怎么办?” 该目录通常设置在系统范围路径之前的用户路径中。我认为这是作为一个安全问题提出的,通常是作为旁注而不是任何值得认真对待的事情,但我想测试这个理论。
为了尝试这个,我做了这样的事情:
echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/bash
chmod 755 $HOME/.local/bin/bash
PATH=$HOME/.local/bin env bash
Run Code Online (Sandbox Code Playgroud)
这产生
/usr/bin/env: ‘bash’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
为了检查它是否捡到任何东西,我也做了
echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/perl
chmod 755 $HOME/.local/bin/perl
PATH=$HOME/.local/bin env perl
Run Code Online (Sandbox Code Playgroud)
打印出来,正如我所料,
Hacked!
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么bash找不到替代品,但找到了替代品perl吗?这是某种“安全”措施(从我的角度来看)没有抓住要点吗?
编辑:因为我被提示:我不是问/usr/bin/env bash与使用/bin/bash. 我在问上面提到的问题。
EDIT2:一定是我做错了什么。今天再次尝试(使用显式路径env而不是隐式路径),没有这种“未找到”行为。
我想设置了 SetUID 位的可执行文件应该以其所有者身份运行,但我无法真正重现它。我尝试了以下方法。
$ cat prepare.sh cp /bin/bash 。 chown root.root bash chmod 4770 bash # 已验证 $ sudo sh prepare.sh $ ./bash $ id -u 1000 $退出 $
$ cat test.c
#include<stdio.h>
#include<unistd.h>
int main(){
printf("%d,%d\n", getuid(), geteuid());
返回0;
}
$ gcc -o test test.c
$ chmod 4770 测试 # 验证
$ sudo chown root.root 测试
$ ./测试
1000,1000
$# 为什么???
然而
$苏 # ./bash # id -u 0 # 。/测试 0,0 # 出口 # 出口 $
注意:挂载点没有nosuid …
目标:以 root 身份运行程序(C++ 二进制文件)。同:SetUID 位在 Ubuntu 中不起作用?
./a.out 输出:
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
psurana //output for "whoami" Look below for the code.
ls -l 输出:
-rwsrwxr-x 1 root root 46136 Jun 7 20:13 a.out
编码 :
#include <string>
#include <stdlib.h>
int main(int argc, char *argv[]){
std::string input = "apt-get install " + std::string(argv[1]);
system(input.c_str());
system("whoami"); …Run Code Online (Sandbox Code Playgroud)