Я знайшов деяку дивовижну поведінку на Ubuntu 14.04 під час користування strace
виконуваним файлом, на який я не мав дозволу на читання. Цікаво, чи це помилка, чи чи якийсь стандарт наказує на цю незрозумілу поведінку.
Спочатку давайте подивимося, що станеться, коли я запускаю звичайний виконуваний файл у фоновому режимі і приєднаюсь до нього. Як очікувалося, це працює:
$ /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
викликах дозволи на читання виконаного файлу не перевіряються знову, якщо процес уже простежено. Його питання полягає в тому , чи це помилка безпеки чи функція, на яку покладено обов'язок (якщо останній я все-таки вважав би це помилкою безпеки, просто помилкою безпеки специфікації).