用C语言设置SUID是不够的

用C语言设置SUID是不够的,c,security,debian,code-injection,C,Security,Debian,Code Injection,出于教学目的,我想在C中设置一个基本命令注入。我有以下代码: #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { char cat[] = "cat "; char *command; size_t commandLength; commandLength = strlen(cat) + strlen(argv[1]) +

出于教学目的,我想在C中设置一个基本命令注入。我有以下代码:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char cat[] = "cat ";
    char *command;
    size_t commandLength;

    commandLength = strlen(cat) + strlen(argv[1]) + 1;
    command = (char *) malloc(commandLength);

    strncpy(command, cat, commandLength);
    strncat(command, argv[1], (commandLength - strlen(cat)) );

    system(command);
    return (0);
}
我得到以下结果:

ls -la
total 40
drwxr-xr-x 2 olive olive  4096 Jan  6 13:17 .
drwxr-xr-x 3 olive olive  4096 Jan  6 12:15 ..
-rwsr-sr-x 1 root  root  16824 Jan  6 13:17 injectionos
-rw-r--r-- 1 olive olive   415 Jan  6 13:17 injectionos.c
-rwx------ 1 root  root      9 Jan  6 12:43 titi.txt
-rw-r--r-- 1 olive olive     9 Jan  6 12:16 toto.txt`
因此,基本上,当SUID设置为1时,我应该能够通过执行以下注入来打开toto.txt和titi.txt文件:

./injectionos "toto.txt;cat titi.txt"
但是执行这个命令时,我在访问titi.txt时获得了一个被拒绝的
权限。最后,当我添加一个
setuid(geteuid())时在我的代码中,注入正在工作,我可以访问titi.txt文件


考虑到injectionos是以root运行的,titi.txt属于root,我认为这已经足够了,但显然不是。我这里缺少什么?

特权被
/bin/sh
删除,作为
系统()
调用的一部分执行。请参阅bash的手册页和
-p
选项

如果外壳启动时有效用户(组)id不相等 对于实际用户(组)id,并且未提供-p选项,则否 启动文件是读取的,shell函数不是从 环境、SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE 变量(如果它们出现在环境中)将被忽略,并且 有效用户id设置为实际用户id。如果-p选项为 在调用时提供,启动行为是相同的,但是 未重置有效用户id

从技术上讲,debian默认使用
dash
,但它也做同样的事情


因此,shell的默认行为已被调整,以至少在某种程度上减轻这种注入。

特权正在被
/bin/sh
作为
system()
调用的一部分执行。请参阅bash的手册页和
-p
选项

如果外壳启动时有效用户(组)id不相等 对于实际用户(组)id,并且未提供-p选项,则否 启动文件是读取的,shell函数不是从 环境、SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE 变量(如果它们出现在环境中)将被忽略,并且 有效用户id设置为实际用户id。如果-p选项为 在调用时提供,启动行为是相同的,但是 未重置有效用户id

从技术上讲,debian默认使用
dash
,但它也做同样的事情


因此,shell的默认行为已经进行了调整,以至少在某种程度上减轻这种注入。

注意:您可以自己看到,它是shell通过在strace下运行整个过程来完成的(以root开始,
strace-f su-olive
…)注意:您可以通过在strace下运行整个过程(以root开始,
strace-f su-olive
..)自己看到这是shell在做的
./injectionos "toto.txt;cat titi.txt"