Ich habe unter Ubuntu 14.04 strace
ein überraschendes Verhalten bei der Verwendung einer ausführbaren Datei festgestellt , für die ich keine Leseberechtigung habe. Ich frage mich, ob dies ein Fehler ist oder ob ein Standard dieses undurchsichtige Verhalten vorschreibt.
Lassen Sie uns zuerst sehen, was passiert, wenn ich eine gewöhnliche ausführbare Datei im Hintergrund starte und an sie anhänge. Wie erwartet funktioniert dies:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Als nächstes versuche ich es mit einer ausführbaren Datei, für die ich keine Leseberechtigung habe:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Das Anhängen an diesen laufenden Prozess ist nicht zulässig:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Das würde ich auch erwarten. Das Gewähren von Ausführungsberechtigungen ohne Leseberechtigung würde nicht viel nützen, wenn ich einfach einen Debugger an den Prozess anhängen und auf diese Weise effektiv Leseberechtigungen für die ausführbare Datei haben könnte.
Wenn ich die ausführbare Datei jedoch unter einem bereits verfolgten Prozess starte, darf ich dies tun:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Das ist für mich unerwartet. Handelt es sich um eine Sicherheitslücke, oder handelt es sich um eine von einem Standard vorgeschriebene Funktion?
EPERM
scheint von get_dumpable()
(wird auch verwendet, um zu prüfen, ob Core-Dumping erlaubt ist, also "dumpable") aufgerufen von __ptrace_may_access()
aufgerufen von ptrace_attach()
an kernel/ptrace.c
.
execve
Aufrufen die Leseberechtigungen der ausgeführten Datei nicht erneut überprüft werden, wenn der Prozess bereits verfolgt wird. Seine Frage ist , ob das ist ein Sicherheitsfehler oder eine ermächtigte Funktion (wenn dieser, würde ich es immer noch ein Sicherheitsproblem betrachten, nur eine Sicherheitslücke der Spezifikation).