เหตุใดจึงใช้การกระทำที่ไม่ปลอดภัย '-execdir' สำหรับไดเรกทอรีที่อยู่ใน PATH


19

ทำไมจึงไม่ปลอดภัยที่จะใช้การผสมผสานระหว่าง-execdirการกระทำของการค้นหาขณะใช้งาน-execอยู่

เมื่อฉันใช้คำสั่งด้านล่างฉันได้รับข้อความแจ้งต่อไปนี้:

/path/to/currentDir/$ find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

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)

สิ่งใดที่ทำให้พรอมต์นี้ปรากฏขึ้น

คำตอบ:


22

คุณสามารถเรียกใช้โปรแกรมผิด มีคนทำให้คุณรันโปรแกรมได้

การ-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เรียกใช้เป็นอลิซ


2
ผมไม่ทราบว่าคุณเคยได้ยินเรื่องนี้มาก่อนที่คุณจะทำให้ครูที่ดีมาก :)
heemayl

5
@heemayl ทุกคนที่เขียนสิ่งที่มีประโยชน์ในสุทธิอยู่แล้วครู :-)
Ciro Santilli新疆改造中心法轮功六四事件

5

มีข้อมูลรายละเอียดมากที่นี่ อีกประการหนึ่งการอ้างอิงที่ดีเยี่ยมที่นี่ อ้างจากการอ้างอิงครั้งแรก:

ตัวเลือก -execdir เป็นตัวเลือกที่ทันสมัยกว่าใน GNU find คือความพยายามในการสร้าง -exec รุ่นที่ปลอดภัยยิ่งขึ้น มันมีความหมายเช่นเดียวกับ -exec ที่มีการปรับปรุงที่สำคัญสองประการ:

มันให้เส้นทางที่แน่นอนไปยังไฟล์ (การใช้เส้นทางสัมพัทธ์กับไฟล์นั้นเป็นอันตรายจริงๆในกรณีของ -exec)

นอกเหนือจากการให้เส้นทางที่แน่นอนแล้วยังตรวจสอบตัวแปร PATH เพื่อความปลอดภัย (หากมีจุดอยู่ในตัวแปร PATH env คุณสามารถรับไฟล์ที่เรียกใช้งานได้จากไดเรกทอรีที่ไม่ถูกต้อง)

จากการอ้างอิงที่สอง:

การกระทำ '-execdir' ปฏิเสธที่จะทำอะไรถ้าไดเรกทอรีปัจจุบันรวมอยู่ในตัวแปรสภาพแวดล้อม $ PATH นี่เป็นสิ่งจำเป็นเนื่องจาก '-execdir' จะเรียกใช้โปรแกรมในไดเรกทอรีเดียวกันซึ่งพบไฟล์โดยทั่วไปไดเรกทอรีดังกล่าวอาจเขียนได้โดยผู้ใช้ที่ไม่น่าเชื่อถือ ด้วยเหตุผลที่คล้ายกัน '-execdir' ไม่อนุญาตให้ '{}' ปรากฏในชื่อของคำสั่งที่จะเรียกใช้


คุณช่วยกรุณาขยายคำตอบของคุณว่าทำไม"ถ้ามีจุดอยู่ในตัวแปร PATH env คุณสามารถรับไฟล์ที่เรียกใช้จากไดเรกทอรีผิด" ได้หรือไม่? ซึ่งไดเรกทอรีที่ไม่ถูกต้อง ? และทำไมเราต้องทำเช่นนี้เพื่อทำให้มันมีความปลอดภัย ? ขอบคุณ
αғsнιη

ฉันหวังว่าลิงก์ที่สองในโพสต์ที่อัปเดตของฉันจะตอบคำถามของคุณ
Ron

3

ปัญหาหลักคือกับค่าของตัวแปรระบบPATHซึ่งมีโฟลเดอร์ที่เกี่ยวข้องในมันดังนั้นสำหรับfindคำสั่งเหตุผลด้านความปลอดภัยจะไม่อนุญาตให้คุณรันไบนารีเนื่องจากมันอาจจะสามารถรันโปรแกรมที่ไม่ถูกต้อง


ตัวอย่างเช่นหากคุณมี dir ปัจจุบันของคุณใน PATH ตามคำเตือนที่คุณได้รับ:

ไดเรกทอรีปัจจุบันรวมอยู่ในตัวแปรสภาพแวดล้อม PATH

และคุณจะเรียกใช้คำสั่งของคุณ:

find . -type f -name 'partOfFileNames*' -execdir rm -- {} +

ในกรณีที่คุณมีสคริปต์ในตัวเครื่อง (ที่rmมีธงที่สามารถเรียกทำงานได้) ซึ่งมีrm -fr /อยู่ในนั้นมันสามารถลบไฟล์ทั้งหมดของคุณได้เพราะแทนที่จะทำการประมวลผลที่คาดไว้/bin/rmคุณจะดำเนินการrmจาก dir ปัจจุบันดังนั้นอาจไม่ใช่สิ่งที่คุณต้องการ


ในฐานะที่เป็นหมายเหตุด้านนี้เป็นปัญหาที่ทราบกันแล้วใน Travis CI ( GH # 2811 ) เมื่อมันล้มเหลวด้วยข้อผิดพลาด:

find: พา ธ สัมพัทธ์ `./node_modules/.bin 'รวมอยู่ในตัวแปรสภาพแวดล้อม PATH ซึ่งไม่ปลอดภัยเมื่อใช้ร่วมกับการดำเนินการ -execdir ของการค้นหา โปรดลบรายการนั้นออกจาก $ PATH

ดังนั้นทางออกคือการลบรายการที่ได้รับผลกระทบจากตัวแปร PATH เช่น

PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'`

ที่เสนอโดยdrogus ความคืบหน้าของข้อผิดพลาดนี้สามารถตามที่GH #


นี่เป็นวิธีแก้ปัญหาเวอร์ชัน Bash:

PATH=${PATH//:\.\/node_modules\/\.bin/}

ตัวอย่างการใช้งาน (ผ่านการกรองPATHไปยังคำสั่งเฉพาะ):

env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f

นี่คือสิ่งsedที่ดูเหมือนว่าจะลบทุกสิ่งที่findไม่ชอบ: askubuntu.com/questions/621132/ …
Ciro Santilli 新疆改造中心中心法轮功事件事件

3

xargs และ bash -c cdวิธีแก้ปัญหา

ตกลงฉันยอมแพ้:

find . -type f |
  xargs -I '{}' bash -c 'cd "$(dirname "{}")" && pwd && echo "$(basename "{}")"'

sed วิธีแก้ปัญหา

ค่อนข้างดีกว่าวิธีแก้ปัญหาก่อนหน้าเล็กน้อย:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" find . -execdir echo '{}' \;

A testcase:

[ "$(printf '/a/b::c/d:/e/f\n' | sed -E 's/(^|:)[^\/][^:]*//g')" = '/a/b:/e/f' ] || echo fail

สำหรับrenameเฉพาะคุณยังสามารถหลีกเลี่ยงกับ Perl regex-fu บางส่วน: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

RTFS หวังอย่างยิ่งยวด

สำหรับผู้ที่หวังว่าจะมีวิธีที่จะเพิกเฉยfindต่อความเห็นของฉันขอให้ฉันบดขยี้สิ่งนั้นด้วยแหล่งข้อมูลบางแหล่ง:

จากที่เราเห็นว่าไม่มีทางที่จะปิดการตรวจสอบเส้นทาง

กฎที่แน่นอนมันจะตรวจสอบคือล้มเหลวถ้าจะว่างหรือไม่ได้เริ่มต้นด้วยPATH/

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