ปัญหาด้านความปลอดภัยและสภาพการแข่งขันในการใช้งาน 'find -exec`' มีอะไรบ้าง?


14

จากfindหน้าคน :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

สิ่งนี้หมายความว่า? เหตุใดจึงมีสภาพการแข่งขันที่เรียกใช้จากไดเรกทอรีเริ่มต้น และความเสี่ยงด้านความปลอดภัยเหล่านี้เป็นอย่างไร?


ที่เกี่ยวข้อง: เหตุใดการวนซ้ำของผลลัพธ์ที่ไม่เหมาะสมของ find find ที่ครอบคลุมในคำตอบบางส่วน
Stéphane Chazelas

คำตอบ:


13

พบรายละเอียด ที่นี่ :

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

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

ในตัวอย่างง่ายๆนี้เรากำลังระบุเพียงหนึ่งไฟล์ที่จะถูกลบและเรียกใช้ /bin/rmเพื่อลบมัน มีปัญหาเกิดขึ้นเนื่องจากมีช่องว่างเวลาระหว่างจุดที่การค้นหาตัดสินใจว่าต้องการประมวลผล -execการดำเนินการและจุดที่/bin/rmคำสั่งออกการเรียกใช้ระบบ unlink () เพื่อลบไฟล์ออกจากระบบไฟล์ ภายในช่วงเวลานี้ผู้โจมตีสามารถเปลี่ยนชื่อ/tmp/umsp ไดเรกทอรีแทนที่ด้วยลิงก์สัญลักษณ์/etcไดเรกทอรีแทนที่มันด้วยการเชื่อมโยงสัญลักษณ์ไม่มีวิธีใน/bin/rmการตรวจสอบว่ามันทำงานกับไฟล์เดียวกันที่พบในใจ เมื่อมีการเชื่อมโยงสัญลักษณ์แล้วผู้โจมตีจะชักชวนให้พบการลบ/etc/passwdไฟล์ซึ่งไม่ได้เป็นผลจากคำสั่งที่เรียกใช้จริง

ไม่แน่ใจว่าใครจะใช้ประโยชน์จากสิ่งนี้ได้; แต่ฉันเดาว่ามีคำตอบ!


ในกรณีข้างต้นexecdirจะ chdir /tmp/umspก่อนที่จะเรียกใช้คำสั่งและในทางทฤษฎีผู้โจมตี relinking ไดเรกทอรีจะไม่มีผล .. ถ้า relinking เกิดขึ้นหลังจากพบ "ตัดสินใจ" เพื่อประเมิน-execแต่ก่อนที่rmคำสั่งสามารถทำงานได้ แต่ฉันสงสัยว่าทำไมสิ่งนี้ถึงสร้างความแตกต่าง: ผู้โจมตีสามารถทำการเชื่อมโยงใหม่ได้หลังจากผู้ใช้ตัดสินใจที่จะเขียนfindคำสั่ง
Otheus

1
@RuiFRibeiro ลิงก์ไม่ใช่อาร์กิวเมนต์ที่ส่งผ่านไปยังคำสั่ง แต่เป็นไดเรกทอรีระดับกลาง /tmp/umspเป็นไดเรกทอรีเมื่อfindเห็นมัน แต่เมื่อrmวิ่งโจมตีมีการเปลี่ยนแปลงก็จะเป็น symbolic link /etcไป /tmp/umsp/passwdเป็นไฟล์ปกติตลอด แต่ไม่เหมือนกัน
Gilles 'หยุดความชั่วร้าย'

2

ฉันเชื่อว่าเหตุผลว่าทำไม -execอันตรายคือเพราะหากผู้ใช้ไม่ระบุชื่อเต็มและพา ธ ไปยังโปรแกรมที่จะดำเนินการอาจเป็นโปรแกรมที่ไม่ถูกต้อง

ตัวอย่าง:

find /some/path -exec coolprogram

ใน /some/pathบางคนทำอีกสิ่งหนึ่งcoolprogramและอัปโหลดข้อมูลทั้งหมดของคุณไปยังนักแสดงที่ไม่ดี

แต่เดี๋ยวก่อนคุณพูดคุณไม่ต้องดำเนินการตาม ./coolprogram ? ใช่ แต่บางคนมีPATH=.:/bin:whateverซึ่งจะรันโปรแกรมในไดเรกทอรีปัจจุบัน

อาจจะง่ายกว่านี้ แต่ฉันคิดว่ามันอาจเป็นอันตรายได้ในบางกรณี ฉันต้องแก้ไขปัญหาหนึ่งครั้งที่ศูนย์ไบต์cpioสิ้นสุดลงในไดเรกทอรีที่ไม่ถูกต้อง มันเป็นสาเหตุให้โปรแกรมทำงานขัดข้องเพราะcpioไม่ทำงานเหมือนที่ใช้งานไฟล์ zero-byte ในไดเรกทอรี


3
find -execความเสี่ยงเหล่านี้ไม่ได้แยกไป หากคุณใส่.เส้นทางของคุณแล้วเพียงแค่ดำเนินการcoolprogramใน dir ปัจจุบันของคุณเป็นอันตรายอยู่แล้วไม่ว่าคุณfindจะใช้เพื่อทำมันหรือไม่!
Danny Tuppeny

1
เห็นด้วย แต่ดูเหมือนว่า -execdir คอยดูแลเงื่อนไขที่ฉันพูดถึงเช่นกัน:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug

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

ที่น่าสนใจที่จะรู้เกี่ยวกับการไม่อนุญาต.ในเส้นทางและ{}ในคำสั่ง บางทีในอนาคตลินุกซ์จะห้าม.ในเส้นทางโดยสิ้นเชิงและเครื่องมือไม่จำเป็นต้องดำเนินการตรวจสอบความปลอดภัยของตัวเอง! :)
Danny Tuppeny

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