Я обнаружил удивительное поведение в 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
вызовах права на чтение исполняемого файла не проверяются снова, если процесс уже отслежен. Его вопрос заключается в том , является ли это ошибкой безопасности или обязательной функцией (если последняя, я бы все еще считал это ошибкой безопасности, просто ошибкой безопасности спецификации).