strace
실행 권한을 사용할 때 Ubuntu 14.04에서 놀라운 동작을 발견 했는데 읽기 권한이 없습니다. 이것이 버그인지 또는 일부 표준 이이 모호한 동작을 요구하는지 궁금합니다.
먼저 백그라운드에서 일반 실행 파일을 시작하고 첨부하면 어떻게되는지 봅시다. 예상대로 이것은 작동합니다.
$ /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()
(코어 덤프가 허용되는지 여부를 확인하는 데 사용되므로 "덤프 가능") __ptrace_may_access()
에서 ptrace_attach()
온 것 같습니다 kernel/ptrace.c
.
execve
호출시 프로세스가 이미 추적 된 경우 실행 된 파일의 읽기 권한을 다시 확인하지 않는 것 같습니다 . 그의 질문은 이것이 보안 버그인지 또는 필수 기능 인지 여부 입니다 (후자는 여전히 보안 버그, 사양의 보안 버그라고 생각합니다).