Tôi đã tìm thấy một số hành vi đáng ngạc nhiên trên Ubuntu 14.04 khi sử dụng strace
trên một tệp thực thi mà tôi không có quyền đọc. Tôi tự hỏi nếu đây là một lỗi, hoặc nếu một số tiêu chuẩn bắt buộc hành vi tối nghĩa này.
Trước tiên hãy xem điều gì xảy ra khi tôi bắt đầu thực thi thông thường trong nền và đính kèm với nó. Như mong đợi điều này hoạt động:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Tiếp theo tôi thử với một tệp thực thi mà tôi không có quyền đọc trên:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
Đính kèm với quy trình chạy này không được phép:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Đây cũng là những gì tôi mong đợi. Cấp quyền thực thi mà không có quyền đọc sẽ không có tác dụng gì nhiều, nếu tôi có thể chỉ cần đính kèm trình gỡ lỗi vào quy trình và thực sự có quyền đọc trên tệp thực thi theo cách đó.
Nhưng nếu tôi bắt đầu thực thi theo một quy trình đã được theo dõi, tôi được phép làm như vậy:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Điều này là bất ngờ đối với tôi. Đây có phải là một lỗi bảo mật, hay nó là một tính năng được ủy quyền bởi một tiêu chuẩn?
EPERM
dường như đến từ get_dumpable()
(dùng cũng để kiểm tra xem lõi bán phá giá được cho phép, do đó "dumpable") được gọi là từ __ptrace_may_access()
gọi từ ptrace_attach()
trên kernel/ptrace.c
.
execve
các cuộc gọi, quyền đọc của tệp được thực thi sẽ không được kiểm tra lại nếu quá trình đã được theo dõi. Câu hỏi của anh là liệu đó là lỗi bảo mật hay là một tính năng bắt buộc (nếu sau này, tôi vẫn coi đó là lỗi bảo mật, chỉ là lỗi bảo mật của thông số kỹ thuật).