strace
在可执行文件上使用时,我在Ubuntu 14.04上发现了一些令人惊讶的行为,但我没有读取权限。我想知道这是否是错误,还是某些标准规定了这种晦涩的行为。
首先,让我们看看当我在后台启动普通可执行文件并将其附加时会发生什么。正如预期的那样:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
接下来,我尝试一个可执行文件,该文件没有读取权限:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
不允许附加到此运行进程:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
这也是我所期望的。如果我可以简单地将调试器附加到进程中并以这种方式有效地拥有对可执行文件的读取权限,那么在没有读取权限的情况下授予执行权限不会有什么好处。
但是,如果我在已经跟踪的进程下启动可执行文件,则可以这样做:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
这对我来说是意外的。这是安全漏洞,还是标准规定的功能?
EPERM
似乎是来自get_dumpable()
(也用于检查核是否倾销是允许的,因此“dumpable”)从所谓__ptrace_may_access()
的叫ptrace_attach()
上kernel/ptrace.c
。
execve
调用过程中,如果已经跟踪了该过程,则不会再次检查执行文件的读取权限。他的问题是这是安全性漏洞还是强制性功能(如果是后者,我仍将其视为安全性漏洞,只是规范的安全性漏洞)。