ในระบบไฟล์ Linux มาตรฐานไดเรคทอรีทั่วไปใดบ้างที่สามารถเขียนได้ทั่วโลกโดยค่าเริ่มต้น
/tmp
/etc
/var
/proc
/bin
/boot
/....
....
ทำไมพวกเขาถึงเขียนได้ทั่วโลก? สิ่งนั้นมีความเสี่ยงด้านความปลอดภัยหรือไม่?
ในระบบไฟล์ Linux มาตรฐานไดเรคทอรีทั่วไปใดบ้างที่สามารถเขียนได้ทั่วโลกโดยค่าเริ่มต้น
/tmp
/etc
/var
/proc
/bin
/boot
/....
....
ทำไมพวกเขาถึงเขียนได้ทั่วโลก? สิ่งนั้นมีความเสี่ยงด้านความปลอดภัยหรือไม่?
คำตอบ:
เพียงFHS อาณัติไดเรกทอรีที่เป็นปกติของโลกที่เขียนซ้ำและ/tmp
/var/tmp
ในทั้งสองกรณีนั่นเป็นเพราะมีไว้สำหรับการจัดเก็บไฟล์ชั่วคราวที่ทุกคนสามารถทำได้
ที่พบบ่อยคือ/dev/shm
ในฐานะtmpfs (ระบบไฟล์ที่สนับสนุนโดย RAM) สำหรับการเข้าถึงข้อมูลขนาดกลางที่ใช้ร่วมกันระหว่างกระบวนการอย่างรวดเร็วหรือเพียงแค่สร้างไฟล์ที่รับประกันว่าจะถูกทำลายเมื่อรีบูต
อาจมี/var/mail
หรือ/var/spool/mail
, และบางครั้งไดเร็กทอรีสพูลเลอร์อื่น ๆ ข้อมูลเหล่านี้ใช้สำหรับเก็บอีเมลชั่วคราวก่อนที่จะดำเนินการ ไม่สามารถเขียนได้ทั่วโลกขึ้นอยู่กับเครื่องมือที่ใช้ เมื่อใดก็ตามที่เป็นเพราะไฟล์สามารถสร้างขึ้นได้โดยเครื่องมือผู้ใช้สำหรับการประมวลผลโดย daemons
ไดเรกทอรีทั้งหมดเหล่านี้มักจะมีการตั้งค่าบิตเหนียว ( t
) ซึ่งหมายความว่าเฉพาะเจ้าของไฟล์หรือไดเรกทอรีสามารถย้ายหรือลบไฟล์ใน
โปรแกรมใด ๆ ที่ทำงานในฐานะผู้ใช้สามารถสร้างไฟล์ในไดเรกทอรีเหล่านี้ได้และมันก็ขึ้นอยู่กับโปรแกรมที่สร้างขึ้นเพื่อทำสิ่งที่ถูกต้องในด้านความปลอดภัยสำหรับข้อมูลเฉพาะ ไม่มีปัญหาด้านความปลอดภัยทั่วไปโดยเฉพาะอย่างยิ่งนอกจากใครบางคนอาจเติมระบบไฟล์ แต่มีขอบเขตสำหรับโปรแกรมที่จะทำให้มันผิด
มีการย้ายไปยัง/tmp
ไดเรกทอรีเฉพาะบริการบางอย่าง สิ่งเหล่านี้หลีกเลี่ยงข้อบกพร่องที่อาจเกิดขึ้นซึ่งอาจเกิดขึ้นดังนั้นจึงไม่สำคัญสำหรับโปรแกรมที่จะไม่ใช้บั๊กในการใช้งานไดเรกทอรี
คุณสามารถค้นหาไดเรกทอรีที่เขียนได้ทั่วโลกในระบบของคุณด้วย:
find / -maxdepth 3 -type d -perm -777
/tmp
,, /var/tmp
และ/var/lock
สามารถเขียนได้ทั่วโลกโดยค่าเริ่มต้น อาจมี symlink เช่น/usr/tmp
→ /var/tmp
ซึ่งจัดทำขึ้นเพื่อความเข้ากันได้กับแอปพลิเคชันรุ่นเก่า
/tmp
และ/var/tmp
สามารถเขียนทับได้ทั่วโลกเพราะผู้ใช้ทุกคนต้องการใช้พื้นที่เก็บข้อมูลชั่วคราว /var/lock
สามารถเขียนได้ทั่วโลกเพื่อให้กระบวนการใด ๆ ที่ทำงานในฐานะผู้ใช้สามารถสร้างไฟล์ล็อคในตำแหน่งศูนย์กลาง
มีความเสี่ยงด้านความปลอดภัยหรือไม่? ไม่ แต่ใช่แล้ว
สิทธิ์ทั้งหมดของไดเรกทอรีเหล่านี้จะ1777
มีชั้นนำ1
เป็นเหนียวเล็กน้อย นั่นหมายความว่าในขณะที่ทุกคนสามารถสร้างไฟล์ในไดเรกทอรีที่เขียนได้ในโลกเหล่านั้นเจ้าของเท่านั้นที่สามารถลบไฟล์ของตนเองได้ (และแน่นอนว่าผู้ใช้รูทสามารถทำได้เช่นกัน)
ความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นได้จากการสร้างไฟล์ชั่วคราวที่ไม่ปลอดภัย เนื่องจากไดเรกทอรีเหล่านั้นเป็นแบบฟรีสำหรับทุกคนผู้ใช้จำเป็นต้องมีข้อควรระวังเพื่อให้แน่ใจว่าไฟล์ที่พวกเขาสร้างนั้นเป็นไฟล์ใหม่แทนที่จะเปิดไฟล์ที่มีอยู่หรือ symlink ที่อาจมีผู้ใช้ที่เป็นอันตราย หากไฟล์ถูกสร้างขึ้นโดยใช้เทคนิคที่เหมาะสมเช่นopen(…, O_EXCL)
หรือmkstemp(3)
จากนั้นความเสี่ยงดังกล่าวจะหลีกเลี่ยง
/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
ก่อนบรรทัดแรกเพื่อให้ไบนารีระบบที่สำคัญจะถูกเขียนทับ
หากต้องการค้นหาไดเรกทอรีที่เขียนได้ทั่วโลกคุณสามารถใช้
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
/var/lock
/run/lock