我有一个程序拒绝以root身份运行,他希望“真正的用户”运行它,但他希望在执行过程中进行权限升级以修改一些受保护的路径
只要strace
我不调用参数就可以了-f
,但是当我需要它时,polkit 窗口不会出现,程序会抱怨没有权限,然后就结束了
我真的不知道什么是 setUID 但命令是$ strace -f script.bash
答案1
斯特雷斯使用跟踪跟踪进程的系统调用。
出于安全原因,特权程序(例如 pkexec)使用设置用户标识机制,如果跟踪它的进程不是 root (或者,在 Linux 上,没有SYS_PTRACE
或SYS_ADMIN
能力.)
当您运行时strace script.bash
,strace 将成功跟踪运行该脚本的 shell(它没有任何额外的权限),并且不会跟踪该 shell 脚本运行的任何程序。因此,当脚本运行时pkexec
,pkexec 以所有权限运行。
但strace -f script.bash
会跟踪运行脚本的 shell以及脚本运行的每个程序。当脚本运行时pkexec
,pkexec将没有setuid权限,并且它会抱怨并退出。
跟踪 pkexec 及其运行的所有内容的一种方法是以 root 身份运行 strace。
但您不想运行sudo strace -f script.bash
,因为这将以 root 身份运行脚本(和 pkexec)。
相反,在以普通用户身份启动脚本后,将 strace 附加到脚本。像这样修改脚本:
#!/bin/bash
echo please run sudo strace -f -p $$ while this script is doing its read
read -n 1 -r -s reply
if [[ $reply == [Yy] ]]; then
pkexec "$NAME_INST" "$@"
fi