Znalazłem zaskakujące zachowanie na Ubuntu 14.04 podczas korzystania strace
z pliku wykonywalnego, na którym nie mam uprawnień do odczytu. Zastanawiam się, czy to jest błąd, czy też jakiś standard nakazuje to niejasne zachowanie.
Najpierw zobaczmy, co się stanie, gdy uruchomię zwykły plik wykonywalny w tle i dołączę do niego. Zgodnie z oczekiwaniami to działa:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Następnie próbuję z plikiem wykonywalnym, do którego nie mam uprawnień do odczytu:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Dołączanie do tego uruchomionego procesu jest niedozwolone:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Tego też bym się spodziewał. Udzielenie pozwolenia na wykonanie bez uprawnienia do odczytu nie przyniosłoby wiele dobrego, gdybym mógł po prostu dołączyć do procesu debugera i skutecznie mieć w ten sposób uprawnienia do odczytu pliku wykonywalnego.
Ale jeśli uruchomię plik wykonywalny w ramach już prześledzonego procesu, wolno mi to zrobić:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
To jest dla mnie nieoczekiwane. Czy to błąd bezpieczeństwa, czy jest to funkcja wymagana przez standard?
EPERM
Wydaje się pochodzić z get_dumpable()
(stosowane również w celu sprawdzenia, czy rdzeń dumping jest dozwolone, a tym samym „dumpable”) o nazwie z __ptrace_may_access()
wywoływana z ptrace_attach()
na kernel/ptrace.c
.
execve
połączeń uprawnienia do odczytu wykonanego pliku nie są sprawdzane ponownie, jeśli proces jest już śledzony. Jego pytanie dotyczy tego , czy jest to błąd bezpieczeństwa, czy też wymagana funkcja (jeśli to drugie, nadal uważałbym to za błąd bezpieczeństwa, po prostu błąd bezpieczeństwa specyfikacji).