ฉันจะแยกไฟล์ tar ที่ไม่น่าเชื่อถือได้อย่างปลอดภัยได้อย่างไร


30

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

อย่างที่คุณอาจจินตนาการนี่คือเพื่อให้ฉันสามารถแยกไฟล์ tar ที่ไม่น่าเชื่อถือได้อย่างปลอดภัย

ฉันจะทำสิ่งนี้กับ GNU ได้tarอย่างไร

ฉันมากับ:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

แต่ฉันไม่แน่ใจว่านี่เป็นสิ่งที่หวาดระแวงเพียงพอ


2
มันยังไม่หวาดระแวงมากพอ ฉันสร้าง tarballs ที่น่ารังเกียจบางอย่างในอดีตซึ่งเพิ่มขึ้นผ่านลิงก์สัญลักษณ์ที่สร้างขึ้น ฉันลงเอยด้วยการทำน้ำมันดินของตัวเองซึ่งเป็น setuid-root เพื่อให้สามารถรัน chroot (".") และปล่อยสิทธิพิเศษ
Joshua

8
@ โจชัวดังนั้นวิธีการแก้ปัญหาของคุณเพื่อให้ยูทิลิตี้ที่ผ่านการทดสอบอย่างกว้างขวางปลอดภัยมากขึ้นคือการทำให้รุ่นของคุณเองและให้สิทธิ์รูทหรือไม่
หยุดทำร้ายโมนิก้า

4
@OrangeDog: int หลัก (int argc, ถ่าน ** argv) {chroot (".") || ทางออก (1); setuid (getuid ()); ง่ายต่อการตรวจสอบ
Joshua

2
คุณอาจต้องการตรวจสอบสิ่งที่อยู่ในไฟล์ tar โดยใช้-tตัวเลือก
โทมัส

คำตอบ:


40

คุณไม่ต้องการความหวาดระแวงเลย GNU tar- และในความเป็นจริงแล้วโปรแกรมใด ๆ ที่เป็นลายลักษณ์อักษรที่tarผลิตในช่วง 30 ปีที่ผ่านมา - จะปฏิเสธที่จะแตกไฟล์ใน tarball ที่เริ่มต้นด้วยเครื่องหมายทับหรือที่มี..องค์ประกอบตามค่าเริ่มต้น

คุณต้องออกจากทางของคุณเพื่อบังคับให้tarโปรแกรมที่ทันสมัยเพื่อแยก tarballs ที่อาจเป็นอันตราย: ทั้ง GNU และ BSD tarต้องการ-Pตัวเลือกเพื่อให้ปิดการป้องกันนี้ ดูที่ส่วนชื่อไฟล์แบบเต็มในคู่มือ GNU tar

การ-Pตั้งค่าสถานะไม่ได้ถูกระบุโดย POSIX แม้ว่าtarprograms ดังนั้นโปรแกรมอื่นอาจมีวิธีการจัดการกับสิ่งนี้ต่างกัน ยกตัวอย่างเช่น Schily เครื่องมือstarโปรแกรมการใช้งาน-/และ-..ปิดการใช้งานคุ้มครองเหล่านี้

สิ่งเดียวที่คุณอาจพิจารณาเพิ่มในtarคำสั่งnaïve คือการ-Cตั้งค่าสถานะเพื่อบังคับให้แยกสิ่งต่าง ๆ ในไดเรกทอรีชั่วคราวที่ปลอดภัยดังนั้นคุณไม่จำเป็นต้องไปที่cdนั่นก่อน


ช่วยเหลือ :

  1. ในทางเทคนิคแล้วtarPOSIX ไม่ได้ระบุอีกต่อไป พวกเขาพยายามบอกโลกของ Unix ว่าเราควรจะใช้paxตอนนี้แทนtarและcpioแต่โลกของคอมพิวเตอร์นั้นไม่สนใจพวกมัน

    มีความเกี่ยวข้องที่นี่เพื่อทราบว่าข้อกำหนด POSIX สำหรับpaxไม่ได้บอกว่าควรจัดการกับเครื่องหมายทับหรือ..องค์ประกอบที่ฝังตัว มีการ--insecureตั้งค่าสถานะที่ไม่เป็นมาตรฐานสำหรับBSDpaxเพื่อระงับการป้องกัน..องค์ประกอบของเส้นทางที่ฝังตัวแต่ดูเหมือนจะไม่มีการป้องกันเริ่มต้นจากเครื่องหมายทับชั้นนำ หน้าคู่มือ BSD paxทางอ้อมแนะนำให้เขียน-sกฎการทดแทนเพื่อจัดการกับความเสี่ยงของเส้นทางที่แน่นอน

    นั่นคือสิ่งที่เกิดขึ้นเมื่อมาตรฐาน de พฤตินัยยังคงใช้งานในขณะที่มาตรฐานทางนิตินัยจะถูกละเว้นส่วนใหญ่


7
pax - portable archive interchangeAwww น่ารัก POSIX คิดว่ามันจะเข้ามาแทนที่รูปแบบไฟล์เก็บถาวรที่ใช้กันอย่างแพร่หลายที่สุด: P
cat

1
@cat รูปแบบการเก็บถาวรเริ่มต้นเป็นตัวแปร tar ที่ได้รับการสนับสนุนอย่างกว้างขวาง (AIUI และควรสนับสนุนรูปแบบ cpio ด้วย) สันติภาพเป็นความพยายามที่จะแทนที่ส่วนต่อประสานคำสั่งสำหรับจัดการกับไฟล์เก็บถาวรดังกล่าวเนื่องจากการจัดการอาร์กิวเมนต์คำสั่งของ tar คือ ... แปลก
Random832

หมายเหตุด้านสุ่ม: ฉันค่อนข้างแน่ใจว่ามันคือ "de jour" คือคำภาษาฝรั่งเศสตรงข้ามกับ "de jure"
คดีฟ้องร้องกองทุนโมนิก้า

7
@QPaysTaxes มันไม่ใช่ ทางนิตินัยนั้นเป็นภาษาละตินและขัดแย้งกับสถานการณ์ปัจจุบันนั่นคือสิ่งที่เป็นจริง คุณควรเป็นผู้ที่เชื่อฟังกฎไวยากรณ์ภาษาฝรั่งเศส
Prime

1
นี่เป็นกรณีของสายเลือดเท็จที่โชคร้าย ภาษาฝรั่งเศส "du jour" ("ของวัน") มีลักษณะ / เสียงเหมือนภาษาละติน "de jure" ("กฎหมาย") ที่นี่ตรงกันข้ามกับ "de พฤตินัย" ("ของจริง") ใคร ๆ ก็อาจแย้งว่าสันติภาพคือ "มาตรฐานของเดือน" หรือ "มาตรฐานดู่ jour" เพื่อให้สนุกกับการเสนอมาตรฐานใหม่บ่อย ๆ ในขณะที่ร่างใหญ่ของผู้ใช้อยู่กับสิ่งที่ใช้งานได้จริง (มาตรฐานพฤตินัย) รู้ว่า (เปรียบเทียบ) จะมีมาตรฐานใหม่ในวันพรุ่งนี้สำหรับพวกเขาที่จะไม่สนใจ
Monty Harder

19

ด้วย tar ของ GNU มันเป็นเรื่องง่าย

tar -xvf untrusted_file.tar

ในไดเรกทอรีว่าง GNU tar โดยอัตโนมัติแถบชั้นนำ/ชื่อสมาชิกเมื่อแยกเว้นแต่อย่างชัดเจนไม่ได้บอกอย่างอื่นที่มีตัวเลือก--absolute-names GNU tar ยังตรวจพบเมื่อการใช้งาน../จะทำให้ไฟล์ถูกแตกออกจากไดเรกทอรีระดับบนสุดและวางไฟล์เหล่านั้นในไดเรกทอรีระดับบนสุดแทนเช่นส่วนประกอบfoo/../../bar/quxจะถูกแยกเช่นเดียวกับbar/quxในไดเรกทอรีระดับบนสุดแทนที่จะbar/quxเป็นหลักของไดเรกทอรีระดับบนสุด . GNU tar ยังดูแลการเชื่อมโยงสัญลักษณ์ที่ชี้อยู่นอกไดเรกทอรีระดับบนสุดเช่นfoo -> ../..และfoo/barจะไม่barถูกแยกออกนอกไดเรกทอรีระดับบนสุด

โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะกับ (GNU tar รุ่นล่าสุดอย่างเพียงพอ) (เช่นเดียวกับการใช้งานอื่น ๆ เช่น * BSD tar และ BusyBox tar) การใช้งานอื่น ๆ บางอย่างไม่มีการป้องกันดังกล่าว

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

โปรดทราบว่าหากคุณกำลังแยกไปยังไดเรกทอรีที่มีลิงก์สัญลักษณ์อยู่แล้วการรับประกันอาจไม่ถูกระงับอีกต่อไป


6

เพื่อให้ครอบคลุมบางประเด็นคำตอบอื่น ๆ ยังไม่ได้:

  1. ก่อนอื่นให้ดูสิ่งที่อยู่ในไฟล์ก่อนที่จะแตกไฟล์:

    tar -tvf untrusted_tar_file.tar
    

    หากมีสิ่งใดในนั้นที่คุณไม่เชื่อถือหรือต้องการแยกออกอย่าดึง tarball ออก

  2. ขั้นที่สองแยก tarball ในฐานะผู้ใช้ที่ไม่ใช่รูทซึ่งมีสิทธิ์การเขียนในไดเรกทอรีเดียวที่คุณกำลังดึง tarball เข้าไป ตัวอย่างเช่นแตก tarball จากภายในโฮมไดเร็กทอรีของผู้ใช้ที่ไม่ใช่รูท

4
1. ไม่เป็นประโยชน์สำหรับการดำเนินการแบทช์ 2. หากคุณไม่ได้ใช้การตั้งค่าแบบกำหนดเองผู้ใช้ทุกคนสามารถเขียนตำแหน่งได้โดยเฉพาะอย่างยิ่ง / tmp /
ไปป์

@pipe one สามารถสร้างไดเรกทอรีและผู้ใช้ใหม่และผู้ใช้รายนั้นเท่านั้นที่สามารถเข้าถึงเฉพาะไดเรกทอรีนั้นจากนั้นเรียกใช้คำสั่ง ฉันค่อนข้างชอบไดเรกทอรีบ้านของฉันขอบคุณ
แมว

2
@pipe ทำไมในโลกที่ดีของพระเจ้าคุณจะเคยส่งผ่านข้อมูลที่ไม่น่าเชื่อถือผ่านการดำเนินการแบบกลุ่มหรือไม่? หากคุณไม่เชื่อใจคุณไม่ต้องเปิดใช้งานโดยไม่ตั้งใจ
Andrew Henle

6
@AndrewHenle Uhm โอเค คุณคิดว่าทุกเซิร์ฟเวอร์บนอินเทอร์เน็ตทำงานอย่างไร คุณคิดว่าผู้ชายที่ stackexchange เรียกใช้ความคิดเห็นนี้ผ่านฐานข้อมูลและระบบมาร์กอัปในขณะที่ตรวจสอบการดำเนินการด้วยตนเองหรือไม่? เนื่องจากอินพุตนี้เป็นข้อมูลที่ไม่น่าเชื่อถือผ่านการดำเนินการแบทช์
ท่อ

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