การติดตามการปฏิบัติการที่ไม่มีสิทธิ์อ่าน


17

ฉันพบพฤติกรรมที่น่าประหลาดใจบางอย่างบน 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

นี่เป็นสิ่งที่ฉันคาดไม่ถึง นี่เป็นข้อบกพร่องด้านความปลอดภัยหรือเป็นคุณลักษณะที่ได้รับคำสั่งจากมาตรฐานหรือไม่


3
@ StéphaneChazelas: ประเด็นก็คือว่าเขาสามารถเจาะมันโดยใช้มันเป็นอาร์กิวเมนต์เพื่อ strace สาเหตุหลักน่าจะเป็นว่าเมื่อมีexecveสายการอ่านการอนุญาตของไฟล์ที่ดำเนินการจะไม่ถูกตรวจสอบอีกครั้งหากกระบวนการนั้นถูกติดตามอยู่แล้ว คำถามของเขาคือไม่ว่าจะเป็นข้อบกพร่องด้านความปลอดภัยหรือคุณลักษณะที่ได้รับคำสั่ง (ถ้าอย่างหลังฉันจะยังคงคิดว่ามันเป็นจุดบกพร่องด้านความปลอดภัยเพียงข้อผิดพลาดด้านความปลอดภัยของสเปค)
celtschk

@celtschk ขอโทษฉันอ่านคำถามเร็วเกินไป
Stéphane Chazelas

1
EPERMดูเหมือนว่าจะมาจากget_dumpable()(ใช้ไปยังเพื่อตรวจสอบว่าแกนทุ่มตลาดที่ได้รับอนุญาตจึง "dumpable") เรียกจาก__ptrace_may_access()เรียกจากในptrace_attach() kernel/ptrace.c
ninjalj

เมื่อโปรแกรมทำงานอยู่จะมีข้อมูลเพียงพอให้ดีบักเกอร์เพื่อสร้างไฟล์เรียกทำงานที่รันได้ที่มีรหัสหรือโปรแกรมโหลดเดอร์จะทิ้งสิ่งต่าง ๆ เช่นโปรแกรมแก้ไขปัญหาการย้ายตำแหน่งซึ่งจำเป็นต้องใช้เพื่อให้โปรแกรมทำงานจริงหรือไม่
supercat

@supercat เท่าที่ฉันรู้ดีบักเกอร์มีการเข้าถึงขั้นตอนเดียวผ่านรหัสโหมดผู้ใช้ทั้งหมดที่กำลังดำเนินการรวมถึงรหัสการย้าย ด้วยระดับการเข้าถึงที่ไม่ควรยากเกินกว่าจะสร้างโปรแกรมที่ทำงานได้
kasperd

คำตอบ:


7

นี่ไม่ใช่คำตอบ แต่เป็นการรวบรวมลิงค์และความคิดในกรณีที่คนอื่นต้องการศึกษาเช่นกัน เพราะนี่เป็นสิ่งที่น่าสนใจทีเดียว

คำตอบที่เกี่ยวข้องกับ Unix & Linuxกล่าวถึงว่าเป็นไปได้ (หรือไม่สามารถทดสอบกับวานิลลาเคอร์เนลได้ในขณะนี้) เป็นไปได้ที่จะถ่ายโอนข้อมูลแบบอ่านอย่างเดียวไบนารีด้วยวิธีนี้

Grsecurity พยายามแก้ไขตัวเลือกการกำหนดค่านี้และตัวแก้ไขเอง (ซึ่งอาจมีการเปลี่ยนแปลงนับตั้งแต่)

ความมุ่งมั่นนี้ทำให้ดูเหมือนว่านักพัฒนาเคอร์เนลใส่ใจเฉพาะกับการทุ่มตลาดไบนารี

แต่จริงๆแล้วจากบรรทัดนี้ฉันคิดว่าเคอร์เนลต้องการป้องกันการทุ่มตลาดที่ไม่สามารถอ่านได้พิจารณาสถานะของ SUID และบรรทัดนี้แสดงว่าไบนารีที่ไม่สามารถทิ้งได้ไม่ควรตรวจสอบย้อนกลับได้

ดังนั้นเมื่อแรกพบว่าคุณพบข้อบกพร่องในเคอร์เนลที่มีผลกระทบด้านความปลอดภัย แต่ฉันไม่ใช่นักพัฒนาเคอร์เนลดังนั้นฉันไม่สามารถพูดได้อย่างแน่นอน ฉันจะถาม LKML

แก้ไข: หนึ่งในการค้นพบเพิ่มเติมเกี่ยวกับการดีบักเกอร์กล่าวว่าในความคิดเห็นที่โพสต์ต้นฉบับ - จาก stracing รวดเร็ว (อีกครั้ง) มันดูเหมือนว่าฉัน gdb /proc/<pid>/memที่ใช้ไบนารีตรวจสอบและ เมื่อไบนารีทำงานไม่สามารถอ่านได้ผลตอบแทนcat /proc/<pid>/mem หากไบนารีสามารถอ่านได้ก็จะส่งกลับEPERM EIO(ทดสอบบน Ubuntu 14.10 ซึ่งใช้งานแพตช์รักษาความปลอดภัยหลายตัวดังนั้นนี่อาจแตกต่างจากเคอร์เนลวานิลลาอีกครั้งฉันไม่มีเคอร์เนลวานิลลาที่ทำงานได้ทุกที่ที่มีประโยชน์ :()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.