ไดเรกทอรีที่สามารถเขียนได้ทั่วโลกคือค่าเริ่มต้นคืออะไร


14

ในระบบไฟล์ Linux มาตรฐานไดเรคทอรีทั่วไปใดบ้างที่สามารถเขียนได้ทั่วโลกโดยค่าเริ่มต้น

 /tmp 
 /etc
 /var 
 /proc 
 /bin 
 /boot
 /....
 ....

ทำไมพวกเขาถึงเขียนได้ทั่วโลก? สิ่งนั้นมีความเสี่ยงด้านความปลอดภัยหรือไม่?

คำตอบ:


16

เพียงFHS อาณัติไดเรกทอรีที่เป็นปกติของโลกที่เขียนซ้ำและ/tmp /var/tmpในทั้งสองกรณีนั่นเป็นเพราะมีไว้สำหรับการจัดเก็บไฟล์ชั่วคราวที่ทุกคนสามารถทำได้

ที่พบบ่อยคือ/dev/shmในฐานะtmpfs (ระบบไฟล์ที่สนับสนุนโดย RAM) สำหรับการเข้าถึงข้อมูลขนาดกลางที่ใช้ร่วมกันระหว่างกระบวนการอย่างรวดเร็วหรือเพียงแค่สร้างไฟล์ที่รับประกันว่าจะถูกทำลายเมื่อรีบูต

อาจมี/var/mailหรือ/var/spool/mail, และบางครั้งไดเร็กทอรีสพูลเลอร์อื่น ๆ ข้อมูลเหล่านี้ใช้สำหรับเก็บอีเมลชั่วคราวก่อนที่จะดำเนินการ ไม่สามารถเขียนได้ทั่วโลกขึ้นอยู่กับเครื่องมือที่ใช้ เมื่อใดก็ตามที่เป็นเพราะไฟล์สามารถสร้างขึ้นได้โดยเครื่องมือผู้ใช้สำหรับการประมวลผลโดย daemons

ไดเรกทอรีทั้งหมดเหล่านี้มักจะมีการตั้งค่าบิตเหนียว ( t) ซึ่งหมายความว่าเฉพาะเจ้าของไฟล์หรือไดเรกทอรีสามารถย้ายหรือลบไฟล์ใน

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

มีการย้ายไปยัง/tmpไดเรกทอรีเฉพาะบริการบางอย่าง สิ่งเหล่านี้หลีกเลี่ยงข้อบกพร่องที่อาจเกิดขึ้นซึ่งอาจเกิดขึ้นดังนั้นจึงไม่สำคัญสำหรับโปรแกรมที่จะไม่ใช้บั๊กในการใช้งานไดเรกทอรี


คุณสามารถค้นหาไดเรกทอรีที่เขียนได้ทั่วโลกในระบบของคุณด้วย:

find / -maxdepth 3 -type d -perm -777

8

/tmp,, /var/tmpและ/var/lockสามารถเขียนได้ทั่วโลกโดยค่าเริ่มต้น อาจมี symlink เช่น/usr/tmp/var/tmpซึ่งจัดทำขึ้นเพื่อความเข้ากันได้กับแอปพลิเคชันรุ่นเก่า

/tmpและ/var/tmpสามารถเขียนทับได้ทั่วโลกเพราะผู้ใช้ทุกคนต้องการใช้พื้นที่เก็บข้อมูลชั่วคราว /var/lockสามารถเขียนได้ทั่วโลกเพื่อให้กระบวนการใด ๆ ที่ทำงานในฐานะผู้ใช้สามารถสร้างไฟล์ล็อคในตำแหน่งศูนย์กลาง

มีความเสี่ยงด้านความปลอดภัยหรือไม่? ไม่ แต่ใช่แล้ว

สิทธิ์ทั้งหมดของไดเรกทอรีเหล่านี้จะ1777มีชั้นนำ1เป็นเหนียวเล็กน้อย นั่นหมายความว่าในขณะที่ทุกคนสามารถสร้างไฟล์ในไดเรกทอรีที่เขียนได้ในโลกเหล่านั้นเจ้าของเท่านั้นที่สามารถลบไฟล์ของตนเองได้ (และแน่นอนว่าผู้ใช้รูทสามารถทำได้เช่นกัน)

ความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นได้จากการสร้างไฟล์ชั่วคราวที่ไม่ปลอดภัย เนื่องจากไดเรกทอรีเหล่านั้นเป็นแบบฟรีสำหรับทุกคนผู้ใช้จำเป็นต้องมีข้อควรระวังเพื่อให้แน่ใจว่าไฟล์ที่พวกเขาสร้างนั้นเป็นไฟล์ใหม่แทนที่จะเปิดไฟล์ที่มีอยู่หรือ symlink ที่อาจมีผู้ใช้ที่เป็นอันตราย หากไฟล์ถูกสร้างขึ้นโดยใช้เทคนิคที่เหมาะสมเช่นopen(…, O_EXCL)หรือmkstemp(3)จากนั้นความเสี่ยงดังกล่าวจะหลีกเลี่ยง


1
ในระบบที่ทันสมัยหนึ่งใน/var/lock/run/lock
สัญลักษณ์

2

/tmp

มีความเสี่ยงเนื่องจากคุณต้องเพิ่มรหัสพิเศษเพื่อใช้งานอย่างปลอดภัย เห็นได้ชัดว่าสิ่งนี้ได้ถูกมองข้ามไป

ตัวอย่างล่าสุดได้รับจาก Steve Kemp http://blog.steve.org.uk/sometimes_reading_code_makes_you_scream_.html

./mgmt/tools/SysAPI.cc:  tmp = fopen("/tmp/shadow", "w");
./mgmt/tools/SysAPI.cc:    system("/bin/mv -f /tmp/shadow /etc/shadow");

หากคุณ (ผู้โจมตี) แทนที่ / tmp / shadow ก่อนบรรทัดที่สองคุณจะต้องเปลี่ยนรหัสผ่านของทุกคน (ฉันเดาว่าการโจมตีต้องการให้คุณสร้างไฟล์ก่อนบรรทัดแรกและทำให้ไฟล์เป็นโลกที่เขียนได้)

Systemd บน linux ช่วยให้สามารถลดช่องโหว่ดังกล่าวได้โดยการแยก / tmp สำหรับบริการระบบจำนวนมาก (ยกเว้นที่ "ใช้ผิด / tmp เป็นตำแหน่งสำหรับซ็อกเก็ต IPC และการสื่อสารพื้นฐานอื่น ๆ ")

ใน Fedora Linux - http://fedoraproject.org/wiki/Features/ServicesPrivateTmp

คำอธิบายSystemd - http://0pointer.de/blog/projects/security.html


"ฉันเดาว่าการโจมตีต้องการให้คุณสร้างไฟล์ก่อนบรรทัดแรก" - แน่นอน หากไฟล์นั้นไม่มีอยู่บรรทัดแรกจะสร้างเป็นผู้ใช้ที่กำลังทำงานอยู่ (น่าจะเป็นรูท) และผู้ใช้ที่ประสงค์ร้ายรายอื่นจะไม่มีสิทธิ์ในการแทนที่ก่อนที่บรรทัดที่สอง หากไฟล์นั้นมีอยู่แล้วให้fopenเขียนทับ แต่ไม่ได้รีเซ็ตการอนุญาตดังนั้นผู้ใช้ที่ประสงค์ร้ายยังคงสามารถทำการเปลี่ยนแปลงได้ นอกจากนี้ผู้ใช้ที่เป็นอันตรายอาจทำอะไรบางอย่างเช่นln -s /bin/bash /tmp/shadowก่อนบรรทัดแรกเพื่อให้ไบนารีระบบที่สำคัญจะถูกเขียนทับ
hvd

2

หากต้องการค้นหาไดเรกทอรีที่เขียนได้ทั่วโลกคุณสามารถใช้

find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print

สำหรับไฟล์ที่เปลี่ยนประเภทเป็น f

สำหรับ symlink พิมพ์ไปที่ l

วิธีตั้งค่าบิตเหนียว:

find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print0| xargs -0 chmod +t
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.