กลุ่มสามารถทำลายสิทธิ์ของไฟล์?


8

ฉันใช้ Vim เมื่อวันก่อนตามปกติเมื่อฉันสังเกตเห็นบางสิ่งที่แปลก นี่คือสิ่งที่ฉันทำ:

~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile

:wqแล้วฉันจะทำการเปลี่ยนแปลงและบันทึกไว้และเลิกกับ ค่อนข้างปกติ อย่างไรก็ตามจากนั้น:

~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile

รูทควรมีการเข้าถึง r / w และทุกคนควรอ่านเท่านั้น แก้ไขไฟล์ลองบันทึก - คุณทำไม่ได้ ยอดเยี่ยมทำงานได้ตามที่ตั้งใจ อย่างไรก็ตามหากคุณบันทึกด้วย:w!กลุ่มจะเปลี่ยนความเป็นเจ้าของไฟล์กลับเป็นชื่อผู้ใช้: กลุ่มผู้ใช้และไฟล์จะถูกบันทึก แม้ว่าคุณจะทำสิ่งนี้:

~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile

คุณยังสามารถเขียนทับด้วย:w!! เกิดอะไรขึ้น? เสียงเรียกเข้าจะผิดกฎหมายว่าด้วยการเป็นเจ้าของไฟล์และการอนุญาตเช่นนี้ได้อย่างไร ฉันดูหน้าความช่วยเหลือเป็นกลุ่มโดยพูด:help :wและพบสิ่งนี้:

:w[rite]! [++opt]    Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
                     Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.

ก่อนหน้านี้ฉันไม่สามารถเขียนไฟล์เป็นกลุ่มเมื่อฉันไม่ควรทำดังนั้นฉันเดาว่าหัวใจที่แท้จริงของคำถามของฉันคือฉันจะทำให้ไฟล์ unedit-can โดย vim ได้อย่างไรและทำไมมันไม่ขึ้นกับไฟล์ สิทธิ์ของระบบอย่างที่ฉันคาดไว้และกลไกใดที่ใช้กลุ่มเพื่อแก้ไขไฟล์ที่ผู้แก้ไขรายอื่น (gedit, nano) ใช้ไม่ได้

แก้ไข: คอมพิวเตอร์ที่ฉันลองนี้ใช้ Linux kernel 3.15.5-2-ARCH หมายเลขเวอร์ชันของ Vim คือ 7.4.373-1 และเป็นหมายเลขที่ติดตั้งโดยpacman- ฉันไม่ได้รวบรวมตั้งแต่เริ่มต้นด้วยตัวเลือกพิเศษใด ๆ


ฉันดูเหมือนจะไม่สามารถทำซ้ำปัญหาเว้นแต่ใช้เทคนิคบางอย่างตามที่อธิบายไว้ที่นี่
Davyzhu

ฉันแค่ลองอีกครั้งโดยใช้คำสั่งในคำถามและมันก็เกิดขึ้นในลักษณะเดียวกัน ฉันจะแก้ไขคำถามเพื่อเพิ่มรายละเอียดเกี่ยวกับคอมพิวเตอร์ของฉันเนื่องจากดูเหมือนว่านี่อาจขึ้นอยู่กับแพลตฟอร์ม
zrneely

ลางสังหรณ์แรกของฉันคือคุณได้รับอนุญาตให้เปลี่ยนความเป็นเจ้าของไฟล์ในไดเรกทอรีที่คุณมีสิทธิ์การเขียน แต่ดูเหมือนว่าที่ไม่ได้กรณีที่ เป็นสิ่งจำเป็นที่จะเรียกCAP_CHOWN chown(2)โดยวิธีการที่ฉันสามารถทำซ้ำใน Debian กับกลุ่ม 7.4
Bob

คำตอบ:


10

ฉันเห็นว่าเส้นทางปัจจุบัน~ของคุณคือไดเรกทอรีบ้านของผู้ใช้ คุณควรมีสิทธิ์เขียนไปยังไดเรกทอรีนั้น

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

นี่คือสิ่งที่กลุ่มจะทำ!


หากคุณเรียกใช้กลุ่มภายใต้ strace ตัวอย่างเช่น:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

จากบันทึกนี้ฉันสามารถเดาขั้นตอนต่อไปนี้:

การตรวจสอบการอนุญาตก่อนหน้านี้บางส่วน (และchownความพยายาม ฯลฯ ) จะถูกละเว้นโดยย่อ

  1. open พยายามเปิดไฟล์เพื่อเขียน (ล้มเหลว: ปฏิเสธสิทธิ์)
  2. lstat ตรวจสอบเจ้าของไฟล์
  3. getuuid ตรวจสอบ ID ผู้ใช้ปัจจุบันเพื่อดูว่าตรงกับเจ้าของไฟล์หรือไม่
  4. unlink ลบไฟล์ (ใช้งานได้เนื่องจากได้รับอนุญาตเขียนในไดเรกทอรี)
  5. open สร้างไฟล์ใหม่ด้วยชื่อเดียวกัน
  6. write เนื้อหาของไฟล์ (อ่านก่อนหน้านี้ฉันพิมพ์ในความหมายบางอย่าง)
  7. fsync ล้างไฟล์ไปยังดิสก์ (ไม่สำคัญจริงๆ)
  8. close
  9. chmod เปลี่ยนการอนุญาตของไฟล์ใหม่ให้ดูเหมือนไฟล์เก่ามันเพิ่งเกิดขึ้นกับเจ้าของใหม่ทันที

โอเคขอบคุณ. ฉันดีใจที่ฉันคิดออกนี้ ดังนั้นหากฉันไม่มีสิทธิ์ในการเขียนในไดเรกทอรีฉันจะไม่สามารถใช้งาน:w!ได้ซึ่งเหมาะสมแล้ว
zrneely

นอกจากนี้ข้อมูล strace นั้นมีประโยชน์จริงๆ - ตอนนี้ฉันมีเครื่องมืออื่นสำหรับการตรวจสอบของตัวเองในอนาคต
zrneely

1
@zrneely คำแนะนำสำหรับstrace: ใช้-oตัวเลือกเพื่อเขียนเอาต์พุตไปยังไฟล์; มิฉะนั้นจะขัดแย้งกับvimเอาต์พุตของ สำหรับสิทธิ์ในการเขียนผมไม่เห็นว่ามันตรวจสอบสิทธิ์ directory ด้วยstatแต่ก็ไม่พยายามที่จะสร้างไฟล์ (ชื่อ4913ดูเหมือนว่าสุ่ม) ในไดเรกทอรีปัจจุบันแล้วลบมัน
Bob

ดูเหมือนว่า4913จริง ๆ แล้วเป็นเพียงแค่ชื่อแรกที่ลองใช้และจุดประสงค์ของมันคือการตรวจสอบว่ามีสิทธิ์เพียงพอที่จะทำหรือไม่ ดู: bugzilla.redhat.com/show_bug.cgi?id=427711#c6และgroups.google.com/forum/#!topic/vim_dev/sppdpElxY44
Bob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.