ฉันพบพฤติกรรมที่น่าประหลาดใจบางอย่างบน 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
สายการอ่านการอนุญาตของไฟล์ที่ดำเนินการจะไม่ถูกตรวจสอบอีกครั้งหากกระบวนการนั้นถูกติดตามอยู่แล้ว คำถามของเขาคือไม่ว่าจะเป็นข้อบกพร่องด้านความปลอดภัยหรือคุณลักษณะที่ได้รับคำสั่ง (ถ้าอย่างหลังฉันจะยังคงคิดว่ามันเป็นจุดบกพร่องด้านความปลอดภัยเพียงข้อผิดพลาดด้านความปลอดภัยของสเปค)