相关疑难解决方法(0)

允许在 shell 脚本上使用 setuid

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 …

shell security scripting setuid

223
推荐指数
7
解决办法
18万
查看次数

/usr/bin/env 作为shebang - 及其安全含义

我在几个地方看到了使用以下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而不是隐式路径),没有这种“未找到”行为。

security bash environment-variables

14
推荐指数
1
解决办法
3778
查看次数

SetUID 位在 Ubuntu 中不起作用?

我想设置了 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 …

setuid

8
推荐指数
3
解决办法
6675
查看次数

setuid root 不起作用

目标:以 root 身份运行程序(C++ 二进制文件)。同:SetUID 位在 Ubuntu 中不起作用?

并且:为什么 setuid 对可执行文件不起作用?

./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)

linux setuid privileges

3
推荐指数
1
解决办法
2979
查看次数