小编Ton*_*rge的帖子

通过写入其父脚本进程的标准输入来在提升的 bash 进程中执行命令

我有一个简单的 bash 脚本bash.sh,它使用 启动另一个 bash 实例pkexec

#!/bin/bash
bash -c 'pkexec bash'
Run Code Online (Sandbox Code Playgroud)

执行时,会提示用户输入密码。主脚本bash.sh以普通用户身份运行,但由它启动的 bash 实例以具有提升权限的 root 身份运行。

当我打开终端窗口并尝试向提升的 bash 进程的标准输入写入一些命令时,它会抛出权限错误(如预期)。

echo 'echo hello' > /proc/<child-bash-pid>/fd/0
Run Code Online (Sandbox Code Playgroud)

问题是,当我写入父进程 ( bash.sh) 时,它会传递给子 bash 进程,然后子进程执行该命令。

echo 'echo hello' > /proc/<parent-bash.sh-pid>/fd/0
Run Code Online (Sandbox Code Playgroud)

我不明白这怎么可能?由于父进程以普通用户身份运行,为什么我(普通用户)可以将命令传递给以更高权限运行的子进程?

我知道子进程的标准输入连接到父脚本的标准输入,但如果允许的话,任何普通进程都可以通过写入 root bash 进程的父进程来执行 root 命令。

这似乎不符合逻辑。我缺少什么?

注意:我通过删除只有 root 有权执行的文件来验证子级是否/usr/share正在执行传递给父级的命令。

sudo touch /usr/share/testfile

echo 'rm -f /usr/share/testfile' > /proc/<parent-bash.sh-pid>/fd/0
Run Code Online (Sandbox Code Playgroud)

文件已成功删除。

command-line security bash file-descriptors privileges

4
推荐指数
1
解决办法
2395
查看次数