我通过将 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
更有效。strace
vmstat 1
strace