ตัวโหลดแบบไดนามิก
สาระสำคัญของปัญหา: ในระหว่างการดำเนินการ ld.so จะแยกค่าของตัวแปร LD_LIBRARY_PATH ออกจากสภาพแวดล้อมก่อน และใช้ฟังก์ชัน _dl_split_path() เพื่อแปลงเป็นอาร์เรย์ของสตริง - เส้นทางไปยังไดเร็กทอรี หากปรากฏในภายหลังว่ากระบวนการปัจจุบันเริ่มต้นโดยแอปพลิเคชัน SUID/SGID อาร์เรย์ที่สร้างขึ้นและในความเป็นจริง ตัวแปร LD_LIBRARY_PATH จะถูกล้าง ในเวลาเดียวกัน หาก _dl_split_path() หน่วยความจำไม่เพียงพอ (ซึ่งเป็นเรื่องยากเนื่องจากการจำกัดขนาดของตัวแปรสภาพแวดล้อมอย่างชัดเจนที่ 256 kB แต่เป็นไปได้ในทางทฤษฎี) ตัวแปร _dl_libpath จะได้รับค่า NULL และการตรวจสอบในภายหลัง ค่าของตัวแปรนี้จะบังคับให้ข้ามการเรียกไปที่ _dl_unsetenv("LD_LIBRARY_PATH")
ช่องโหว่ที่พบโดยผู้เชี่ยวชาญ
นอกจากนี้: ปัญหาได้รับการกำหนดหมายเลขแล้ว
amd64 และ i386 (การใช้ประโยชน์สามารถนำไปใช้กับสถาปัตยกรรมอื่น ๆ ได้)
ปัญหานี้หาประโยชน์ได้ในการติดตั้งเริ่มต้น และอนุญาตให้ผู้ใช้ภายในเครื่องที่ไม่มีสิทธิ์เรียกใช้โค้ดในฐานะรูทผ่านการแทนที่ไลบรารีเมื่อรันยูทิลิตี้ chpass หรือ passwd suid หากต้องการสร้างเงื่อนไขหน่วยความจำเหลือน้อยที่จำเป็นสำหรับการดำเนินการ ให้ตั้งค่าขีดจำกัด RLIMIT_DATA ผ่าน setrlimit
ที่มา: opennet.ru