ในขณะที่อ่านสิ่งนี้ฉันพบการใช้ประโยชน์ดังต่อไปนี้:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
ตัวอย่างนี้แสดงให้เห็นว่าเราสามารถก้าวเท้าเลี่ยงการดำเนินการของระบบไฟล์ได้ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ ฉันทำสิ่งนี้บน Ubuntu 12.04
ในขณะที่ตัวโหลด Linux เป็นวัตถุที่ใช้ร่วมกันตามไฟล์ (1) แต่ก็มีจุดเข้าใช้งานที่อนุญาตให้เรียกใช้โดยตรง เมื่อดำเนินการในลักษณะนี้ตัวโหลด Linux ทำหน้าที่เป็นล่ามสำหรับ ELF ไบนารี
อย่างไรก็ตามในเครื่อง OpenBSD ของฉันการหาประโยชน์นี้ไม่ได้มีประสิทธิภาพเพราะคุณไม่สามารถเรียกใช้ตัวโหลดเป็นโปรแกรม หน้าคู่มือ OpenBSD พูดว่า: "ld.so เป็นวัตถุที่ใช้ร่วมกันซึ่งเคอร์เนลถูกโหลดครั้งแรก"
ลองสิ่งนี้บน Solaris 9 แล้วคุณจะได้รับ segfault ฉันไม่แน่ใจว่าเกิดอะไรขึ้นที่อื่น
คำถามของฉันคือ:
- ทำไมตัวโหลดลินุกซ์ (เมื่อทำงานโดยตรง) ไม่ตรวจสอบแอตทริบิวต์ของระบบแฟ้มก่อนที่จะตีความไบนารีของ ELF
- เหตุใดจึงต้องใช้กลไกที่ได้รับการออกแบบไม่อนุญาตให้เรียกใช้งานไฟล์หากมันถูกกีดกันไปเล็กน้อย ฉันพลาดอะไรไปหรือเปล่า
libc
(ฉันเคยทำการอัพเกรดกล่อง Arch) คุณจะรู้สึกขอบคุณสำหรับการเล่นโวหารเล็ก ๆ น้อย ๆ นี้