Ho trovato alcuni comportamenti sorprendenti su Ubuntu 14.04 durante l'utilizzo strace
su un eseguibile, su cui non ho i permessi di lettura. Mi chiedo se si tratti di un bug o se alcuni standard impongano questo oscuro comportamento.
Per prima cosa vediamo cosa succede quando avvio un normale eseguibile in background e vi allego. Come previsto, funziona:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Quindi provo con un eseguibile, sul quale non ho autorizzazioni di lettura su:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Non è consentito collegarsi a questo processo in esecuzione:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Questo è anche quello che mi aspetterei. Concedere l'autorizzazione di esecuzione senza autorizzazione di lettura non farebbe molto bene, se potessi semplicemente collegare un debugger al processo e disporre effettivamente delle autorizzazioni di lettura sull'eseguibile in quel modo.
Ma se avvio l'eseguibile con un processo già tracciato, sono autorizzato a farlo:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Questo è inaspettato per me. Si tratta di un bug di sicurezza o è una funzione obbligatoria di uno standard?
EPERM
sembra provenire da get_dumpable()
(utilizzato anche per controllare se un core dumping è permesso, quindi "dumpable") chiamato da __ptrace_may_access()
chiamata da ptrace_attach()
sopra kernel/ptrace.c
.
execve
chiamate, le autorizzazioni di lettura del file eseguito non vengono ricontrollate se il processo è già tracciato. La sua domanda è se che è un bug di sicurezza o di una funzione di mandato (in quest'ultimo caso, sarei ancora considero un bug di sicurezza, solo un bug di sicurezza della specifica).