เป็นกลุ่มจะขโมยไฟล์ที่เป็นเจ้าของรูทได้อย่างไร?


39

เป็นพยานต่อไปนี้:

sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 root  staff    0 19 Dec 12:38 temp

sh-3.2$ echo nope > temp
sh: temp: Permission denied

sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits

sh-3.2$ ls -al
total 8
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 glen  staff    7 19 Dec 12:38 temp

อย่างใดเป็นกลุ่มได้นำไฟล์ที่เป็นเจ้าของรูทนี้และเปลี่ยนเป็นไฟล์ที่ผู้ใช้เป็นเจ้าของ!

ดูเหมือนว่าจะใช้งานได้ก็ต่อเมื่อผู้ใช้เป็นเจ้าของไดเรกทอรี แต่ก็ยังรู้สึกว่าไม่ควรทำเช่นนั้น มีใครอธิบายได้บ้างไหมว่าทำสิ่งนี้ได้อย่างไร

คำตอบ:


51

คุณglenเป็นเจ้าของไดเรกทอรี (ดู.ไฟล์ในรายชื่อของคุณ) ไดเรกทอรีเป็นเพียงรายการไฟล์และคุณได้รับอนุญาตให้แก้ไขรายการนี้ (เช่นเพิ่มไฟล์ลบไฟล์เปลี่ยนความเป็นเจ้าของเพื่อให้เป็นของคุณอีกครั้งเป็นต้น) คุณอาจไม่สามารถแก้ไขเนื้อหาของไฟล์ได้โดยตรง แต่คุณสามารถอ่านและยกเลิกการเชื่อมโยง (ลบ) ไฟล์โดยรวมและเพิ่มไฟล์ใหม่ได้ในภายหลัง 1 เป็นพยานเฉพาะก่อนและหลังสิ่งนี้อาจมีลักษณะเหมือนไฟล์ที่มีการเปลี่ยนแปลง

เสียงเรียกใช้ไฟล์แลกเปลี่ยนและไฟล์ย้ายไปรอบ ๆ ใต้น้ำเพื่อที่จะอธิบายว่าทำไมมันดูเหมือนว่าจะเขียนถึงไฟล์เดียวกันกับที่คุณทำในเปลือกของคุณ แต่มันไม่ได้เป็นสิ่งเดียวกัน 2

ดังนั้นสิ่งที่ Vim ทำลงมาถึงสิ่งนี้:

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

1 นี่เป็นข้อแตกต่างที่สำคัญในการจัดการสิทธิ์การใช้ไฟล์ระหว่าง Windows และ Unices ใน Windows มักจะไม่สามารถลบไฟล์ที่คุณไม่ได้รับอนุญาตให้เขียนได้

2 update: ดังที่ระบุไว้ในความคิดเห็น, Vim ไม่ได้ทำเช่นนี้ในการเปลี่ยนความเป็นเจ้าของเนื่องจากหมายเลข inode บนtempไฟล์จะไม่เปลี่ยนแปลง ( ls -liมาก่อนและหลัง) การใช้งานstraceเราสามารถเห็นสิ่งที่vimทำ ส่วนที่น่าสนใจอยู่ที่นี่:

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

นี้แสดงให้เห็นว่ามันเป็นการยกเลิกการลิงก์แต่ไม่ได้ใกล้tempอธิบายไฟล์ไป มันค่อนข้างจะเขียนทับเนื้อหาทั้งหมด ( more text bla\nในกรณีของฉัน) ฉันเดาว่านี่จะอธิบายว่าทำไมหมายเลขไอโหนดไม่เปลี่ยนแปลง


3
FWIW คุณสามารถตรวจสอบสิ่งนี้ได้โดยการเรียกใช้ls -ilก่อนและหลัง ... ถ้าtempหมายเลขไอโหนดเปลี่ยนไปคุณรู้ว่ามันเป็นไฟล์อื่นที่มีชื่อเดียวกัน
ไร้ประโยชน์

3
สามารถเพิ่มได้ว่า rm ไม่ได้ลบไฟล์จริงๆ แต่เพียงแค่ลบลิงก์ไปยังไฟล์และไฟล์จะไม่ถูกลบออกก่อนที่จำนวนลิงก์จะลดลงเหลือ 0 rm เพียงแค่ลบรายการไปยังไฟล์ในไดเรกทอรี หากรูทมีลิงก์อื่น (ฮาร์ดลิงก์) ไปยังไฟล์ในไดเร็กทอรีอื่นผู้ใช้จะไม่สามารถลบไฟล์ได้
gerrit

1
@ ฉันไม่ได้ลองและหมายเลขก็ไม่เปลี่ยนแม้ว่าเจ้าของและเวลาจะเปลี่ยนไป!
amyassin

1
@amyassin คุณพูดถูก! ฉันได้อัปเดตคำตอบของฉันพร้อมข้อความที่ตัดตอนมาอธิบาย
gertvdijk

1
นอกเหนือจากบันทึกย่อของคุณเกี่ยวกับการอนุญาต Windows vs. Unix หากคุณต้องการพฤติกรรมคล้าย Windows ใน Unix คุณสามารถสร้างไดเรกทอรีที่เป็นเจ้าของโดย root (หรือผู้ใช้อื่นที่ควรมีสิทธิ์ลบ / เปลี่ยนชื่อ / etc ทั่วไป) และตั้งค่าความเหนียว บิตในไดเรกทอรี จากนั้นผู้ใช้จะสามารถลบไฟล์ของตนเองได้เท่านั้น
Matthew Crumley

16

ก่อน:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

หลังจาก:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

เสียงเรียกเข้าไม่ได้เจาะทะลุสิ่งกีดขวางการอนุญาต เพียงดูข้อมูลไฟล์ที่แสดงรายการอย่างระมัดระวังจากนั้นคุณจะพบว่าเสียงเรียกจริงลบไฟล์ต้นฉบับ (เพราะคุณได้รับอนุญาตให้ลบไฟล์แม้ว่าคุณจะไม่สามารถเปลี่ยนเนื้อหาได้) จากนั้นสร้างไฟล์ใหม่ของคุณเอง ( เห็นว่าเจ้าของไม่ใช่ 'รูต' อีกต่อไป)

และในขณะที่คุณกำลังแก้ไขไฟล์ต้นฉบับเป็นกลุ่มมันจะเตือนว่าคุณกำลังเปลี่ยนไฟล์แบบอ่านอย่างเดียว ดังนั้นเมื่อคุณพิมพ์คำสั่ง:wq!(บังคับการดำเนินการ) สิ่งที่กลุ่มสามารถทำได้คือการลบไฟล์ที่มีอยู่และสร้างไฟล์ใหม่ที่มีชื่อเหมือนกัน

หวังว่าจะช่วย


1

ใช้-iตัวเลือกlsเพื่อดูหมายเลข inode ซึ่งเป็นตัวระบุที่ไม่ซ้ำกัน (ภายในระบบไฟล์) ของไฟล์หรือวัตถุอื่น ๆ

คุณจะเห็นว่าไฟล์ถูกแทนที่ด้วยวัตถุที่แตกต่างกัน: หมายเลขไอโหนดจะมีการเปลี่ยนแปลง

การดูหมายเลขไอโหนดเดียวกันไม่ได้เป็นการพิสูจน์อะไรเลย: หมายเลขไอโหนดสามารถนำกลับมาใช้ใหม่ได้ หากเราลบลิงค์สุดท้ายไปยังไฟล์จากนั้นสร้างไฟล์ใหม่เราอาจได้รับหนึ่งที่มีหมายเลขไอโหนดเดียวกัน แต่จะไม่สามารถเกิดขึ้นได้หากไฟล์เก่าถูกลบหลังจากสร้างไฟล์ใหม่แล้ว mv file file.tmp; touch file; rm file.tmpเช่น echo new_content > tmpfile; mv tmpfile fileฉันเป็นกลุ่มผู้ต้องสงสัยไม่จริงบางสิ่งบางอย่างที่คล้ายคลึงกันนี้ การmvดำเนินการจะแปลเป็นการrenameเรียกระบบดังนั้นการกำหนดหมายเลขไอโหนดจะขึ้นอยู่กับวิธีที่ระบบไฟล์ใช้การเปลี่ยนชื่อซึ่งยกเลิกการเชื่อมโยงปลายทาง

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