gpt4 book ai didi

security - system() 与 execve()

转载 作者:行者123 更新时间:2023-12-04 02:41:56 26 4
gpt4 key购买 nike

两者 system() execve() 可用于在程序内执行另一个命令。为什么在 set-UID 程序中,system()是危险的,而 execve()是安全的 ?

最佳答案

system将调用 shell ( sh ) 来执行作为参数发送的命令。 system 的问题因为 shell 行为取决于运行命令的用户。一个小例子:

创建文件 test.c :

#include <stdio.h>

int main(void) {
if (system ("ls") != 0)
printf("Error!");
return 0;
}

然后:
$ gcc test.c -o test

$ sudo chown root:root test

$ sudo chmod +s test

$ ls -l test
-rwsr-sr-x 1 root root 6900 Dec 12 17:53 test

创建一个名为 ls 的脚本在您当前的目录中:
$ cat > ls
#!/bin/sh

/bin/sh

$ chmod +x ls

现在:
$ PATH=. ./test
# /usr/bin/id
uid=1000(cuonglm) gid=1000(cuonglm) euid=0(root) egid=0(root) groups=0(root),
24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),105(scanner),
110(bluetooth),111(netdev),999(docker),1000(cuonglm)
# /usr/bin/whoami
root

糟糕,你得到了一个具有 root 权限的 shell。

execve不调用 shell 。它执行作为第一个参数传递给它的程序。程序必须是二进制可执行文件或以 shebang 开头的脚本线。

关于security - system() 与 execve(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com