C 同样的suid+;系统程序,不同系统上的不同输出

C 同样的suid+;系统程序,不同系统上的不同输出,c,linux,suid,C,Linux,Suid,我编写了一个名为suid.c的简单程序: intmain(intargc,char*argv[]){ 系统(argv[1]); } 使用gcc编译它,然后设置suid权限(现在是root用户): 我尝试在不同的虚拟机上使用www数据用户运行/suid,但输出不同 卡利2019年的输出:id=33(www数据)gid=33(www数据)groups=33(www数据) ubuntu trusty(旧linux)中的输出:uid=33(www-data)gid=33(www-data)euid=

我编写了一个名为
suid.c
的简单程序:

intmain(intargc,char*argv[]){
系统(argv[1]);
}
使用gcc编译它,然后设置suid权限(现在是root用户):

我尝试在不同的虚拟机上使用www数据用户运行
/suid
,但输出不同

  • 卡利2019年的输出:
    id=33(www数据)gid=33(www数据)groups=33(www数据)
  • ubuntu trusty(旧linux)中的输出:
    uid=33(www-data)gid=33(www-data)euid=0(root)egid=0(root)groups=0(root),33(www-data)

为什么呢?Linux有什么变化吗?

这取决于
/bin/sh
在您的发行版上是bash还是dash。猛击。Dash在特权方面没有做任何特殊的事情

在Ubuntu上,
system
函数调用
sh
,这是
/bin/sh
,这是dash,它不会删除特权。在Kali上,
system
函数调用
sh
,即
/bin/sh
,即bash,即放弃特权。问题在于发行版安装为
sh
,而不是发行版的最新版本


Bash的行为可以是一种安全对策,但不是一种非常有效的对策。这是第二道防线,可以防止错误的配置或写得不好的程序以不应有的权限运行,并允许对
系统
等功能进行不可信的输入。但是,此类程序通常还有其他漏洞,允许潜在攻击者进行攻击,例如写入文件的能力。

这取决于
/bin/sh
在您的发行版上是bash还是dash。猛击。Dash在特权方面没有做任何特殊的事情

在Ubuntu上,
system
函数调用
sh
,这是
/bin/sh
,这是dash,它不会删除特权。在Kali上,
system
函数调用
sh
,即
/bin/sh
,即bash,即放弃特权。问题在于发行版安装为
sh
,而不是发行版的最新版本


Bash的行为可以是一种安全对策,但不是一种非常有效的对策。这是第二道防线,可以防止错误的配置或写得不好的程序以不应有的权限运行,并允许对
系统
等功能进行不可信的输入。然而,这类程序通常还有其他漏洞,允许潜在的攻击者进行攻击,例如写入文件的能力。

正如上面的评论所述,您可以看到故意删除setuid(通过bash间接删除)的效果

系统的My Amazon Linux实例说明(3)

不要从具有set user ID或set group ID权限的程序中使用system(),因为某些环境变量的奇怪值可能会 用于破坏系统完整性。请改用exec(3)系列函数,但不要使用execlp(3)或execvp(3)。在中,system()不会 事实上,在/bin/sh为bash版本2的系统上,自bash版本2起,可以从具有设置用户ID或设置组ID权限的程序正常工作 在启动时删除特权。(Debian使用一个修改过的bash,当作为sh调用时,它不会这样做。)

从setuid程序运行
system()
是非常危险的,因为它比你想象的更容易颠覆你的意图(劫持
$IFS
将是一个很好的开始)

使用一个
exec
函数至少可以让shell不受影响,但通常还会有另一个shell

如果必须这样做,可以调用
setuid(geteuid())
system()
之前,它基本上抛弃了一个事实,即您处于一个setuid环境中,在这个环境中,真实用户和有效用户是不同的,因为它们都是提升用户。小组也一样。这可能是个糟糕的主意


我可能会建议,如果您必须询问如何使用setuid,那么您可能不是安全使用setuid的最佳位置。

正如上面的评论所述,您看到了故意删除setuid(通过bash间接删除)的效果

系统的My Amazon Linux实例说明(3)

不要从具有set user ID或set group ID权限的程序中使用system(),因为某些环境变量的奇怪值可能会 用于破坏系统完整性。请改用exec(3)系列函数,但不要使用execlp(3)或execvp(3)。在中,system()不会 事实上,在/bin/sh为bash版本2的系统上,自bash版本2起,可以从具有设置用户ID或设置组ID权限的程序正常工作 在启动时删除特权。(Debian使用一个修改过的bash,当作为sh调用时,它不会这样做。)

从setuid程序运行
system()
是非常危险的,因为它比你想象的更容易颠覆你的意图(劫持
$IFS
将是一个很好的开始)

使用一个
exec
函数至少可以让shell不受影响,但通常还会有另一个shell

如果必须这样做,可以调用
setuid(geteuid())
system()
之前,它基本上抛弃了一个事实,即您处于一个setuid环境中,在这个环境中,真实用户和有效用户是不同的,因为它们都是提升用户。小组也一样。这可能是个糟糕的主意


我可能会建议,如果您必须询问如何使用setuid,您可能不是安全地使用setuid的最佳位置。

这可能与不同shell在放弃SUID权限方面的差异有关。
manid
对Kali有何说明?它有没有说它会输出effec
# gcc suid.c -o suid
# chmod +s suid