当 strace 附加 bash 的 PID 时,sudo 命令不起作用

当 strace 附加 bash 的 PID 时,sudo 命令不起作用

我通过将 BASH 的 PID 附加到strace.

$ strace -q -f -e execve -p $$ -o <outputFile>

它工作正常,我在输出文件中获取所有命令列表。

但我面临另一个问题。当附加 BASH PID时,我无法运行sudo命令。strace

我收到以下错误:

sudo: effective uid is not 0, is sudo installed setuid root?

我检查setuid是否设置为sudo二进制

---s--x--x. 1 root root 123832 Mar 22 11:35 /usr/bin/sudo

sudo当我停下来时工作正常strace

这是一个错误还是有任何技术原因?请帮我解决这个问题。

答案1

手册用于strace提到:

错误
使用 setuid 位的程序在被跟踪时不具有有效的用户 ID 权限。

尽管我确实怀疑它更多地与调试 setuid 进程的安全隐患有关,而不是一个错误。如果我没记错的话,strace使用与 相同的跟踪接口,gdb并且它允许修改正在运行的进程的内存。能够对以比您应有的权限更多的权限运行的进程执行此操作将是一个坏主意。

答案2

还有其他方法可以记录用户执行的所有命令。安装后sysdig可能会运行类似的东西

# sysdig "user.name = jdoe and evt.type = execve"

记录所有execve(2)通话jdoe-p可以sysdig自定义输出格式的选项等。

另一种方法是使用SystemTap它,其优点是受 RedHat 支持;这里我们假设jdoe有一个 UID 1000

probe begin {
    printf("begin trace...\n\n")
}

probe syscall.execve.return {
    if (uid() != 1000) next;
    printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str());
}

然后可以通过类似的方式运行

# stap-prep
...
# stap whatyousavedtheaboveas.stp

这两种方法可能都需要进行调整才能准确捕获您需要的内容,处理execve失败的错误条件等。从好的方面来说,sysdig并且比(运行并观察运行时如何推动上下文切换)SystemTap更有效。stracevmstat 1strace

相关内容