คุณสามารถเรียกใช้โปรแกรมผิด มีคนทำให้คุณรันโปรแกรมได้
การ-execdirดำเนินการรันคำสั่งของคุณจากไดเรกทอรีที่มีไฟล์ที่พบ เมื่อ$PATHมีทางญาติเช่น.หรืออะไรที่ไม่ได้เริ่มต้นด้วย/ , -execdirไม่ปลอดภัยเพราะไดเรกทอรีที่ไฟล์จะพบ (หรือไดเรกทอรีอื่นมีมติเมื่อเทียบกับมัน) นอกจากนี้ยังอาจมีปฏิบัติการที่มีชื่อเดียวกันกับที่คุณกำลังพยายาม วิ่ง. ปฏิบัติการที่ไม่น่าเชื่อถือที่อาจเกิดขึ้นนั้นจะถูกเรียกใช้แทน
นี่อาจเป็นการเอาเปรียบผู้ใช้รายอื่นโดยเจตนาเพื่อให้คุณเรียกใช้โปรแกรมของพวกเขาซึ่งอาจก่อให้เกิดอันตรายหรือละเมิดความปลอดภัยของข้อมูลแทนที่จะเป็นโปรแกรมที่คุณพยายามเรียกใช้ หรือน้อยกว่านั้นอาจส่งผลให้โปรแกรมทำงานผิดพลาดโดยไม่ตั้งใจแม้ว่าจะไม่มีใครพยายามทำให้ปัญหาเกิดขึ้น
หากทุกอย่างของคุณในPATHตัวแปรสภาพแวดล้อมเป็นเส้นทางแน่นอนข้อผิดพลาดนี้ไม่ควรเกิดขึ้นแม้ว่าไดเรกทอรีที่คุณค้นหาและกำลัง-execdirไอเอ็นจีจากจะPATHมีอยู่ใน (ผมได้ตรวจสอบว่าการทำงานนี้.) หากคุณเชื่อว่าคุณไม่ได้มีญาติไดเรกทอรีใด ๆ ในแต่ยังคงได้รับข้อผิดพลาดนี้โปรดอัปเดตคำถามของคุณมีรายละเอียดรวมทั้งการส่งออกของ$PATHecho "$PATH"
ตัวอย่างที่เป็นรูปธรรม
เป็นตัวอย่างของสิ่งที่ผิดพลาดไปสมมติว่า:
- อลิซมี
.ในตัวเธอ$PATHเพราะเธอต้องการที่จะสามารถเรียกใช้โปรแกรมในสิ่งที่ไดเรกทอรีเธอcd'd ./เพื่อโดยไม่ต้องรบกวนต้องเพิ่มชื่อของพวกเขาด้วย
- ความคลั่งไคล้ของอลิซได้แบ่งปัน
/home/eve/sharedกับอลิซแล้ว
- อลิซต้องการสถิติ (เส้นคำไบต์) ใน
.cไฟล์ที่ Eve ได้แบ่งปันกับเธอ
ดังนั้นอลิซจึงวิ่ง:
find ~eve/shared -name \*.c -execdir wc {} \;
แต่น่าเสียดายที่อลิซอีฟได้สร้างสคริปต์ของเธอเองตั้งชื่อมันwcตั้งปฏิบัติการ ( chmod +x) /home/eve/sharedและวางมันลอบในหนึ่งในไดเรกทอรีที่อยู่ภายใต้ สคริปต์ของ Eve มีลักษณะเช่นนี้:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
ดังนั้นเมื่ออลิซใช้findกับ-execdirการทำงานwcกับไฟล์อีฟได้ร่วมกันและจะได้รับไปยังไฟล์ในไดเรกทอรีเดียวกับที่กำหนดเองของอีฟwcสคริปต์อีฟwcวิ่ง - มีทั้งหมดของสิทธิพิเศษของอลิซ!
(การมีเล่ห์เหลี่ยมอีฟได้ทำให้wcบทของเธอเป็นตัวคลุมสำหรับระบบwcดังนั้นอลิซจะไม่รู้ด้วยซ้ำว่ามีบางอย่างผิดปกตินั่นคือมันdo_evilถูกเรียกใช้อย่างไรก็ตามเรียบง่ายและซับซ้อนมากขึ้น )
วิธีfindนี้ป้องกันได้
findป้องกันปัญหาด้านความปลอดภัยนี้ไม่ให้เกิดขึ้นโดยปฏิเสธที่จะ-execdirดำเนินการเมื่อ$PATHมีไดเรกทอรีที่เกี่ยวข้อง
find เสนอข้อความวินิจฉัยสองข้อความขึ้นอยู่กับสถานการณ์ที่เฉพาะเจาะจง
ถ้า.อยู่ใน$PATHนั้น (ตามที่คุณเห็น) มันพูดว่า:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
มันอาจมีข้อความพิเศษสำหรับ.เคสเนื่องจากเป็นเรื่องธรรมดาโดยเฉพาะ
หากเส้นทางสัมพัทธ์อื่นที่ไม่ใช่ - .พูดว่า - fooปรากฏขึ้น$PATHและคุณวิ่งไปfindด้วย-execdirมันบอกว่า:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
มันจะดีกว่าที่จะไม่มีทางญาติใน$PATHเลย
ความเสี่ยงของการมี.หรือเส้นทางญาติอื่น ๆ$PATHมีความคิดริเริ่มโดยเฉพาะอย่างยิ่งเมื่อใช้ยูทิลิตี้ที่เปลี่ยนแปลงไดเรกทอรีโดยอัตโนมัติซึ่งเป็นเหตุผลที่findจะไม่อนุญาตให้คุณใช้-execdirในสถานการณ์นี้
แต่การมีเส้นทางญาติโดยเฉพาะอย่างยิ่ง.ในตัวคุณ$PATHนั้นมีความเสี่ยงและหลีกเลี่ยงได้ดีที่สุด พิจารณาสถานการณ์สมมติในตัวอย่างด้านบน สมมติว่าแทนที่จะวิ่งfind, อลิซก็cdเพื่อและวิ่ง~eve/shared/blah wc *.cหากblahมีwcสคริปต์ของ Eve ให้do_evilเรียกใช้เป็นอลิซ