ช่องโหว่ที่สามารถหาประโยชน์ได้จากระยะไกลในเซิร์ฟเวอร์เมล qmail

นักวิจัยด้านความปลอดภัยจาก Qualys แสดงให้เห็น โอกาส การเอารัดเอาเปรียบ ช่องโหว่ในเซิร์ฟเวอร์เมล qmail มีชื่อเสียง ย้อนกลับไปในปี 2005 (CVE-2005-1513) แต่ยังคงไม่ได้รับการติดตั้งเนื่องจากผู้เขียน qmail แย้งว่าการสร้างช่องโหว่ที่ใช้งานได้ซึ่งสามารถใช้เพื่อโจมตีระบบในการกำหนดค่าเริ่มต้นนั้นไม่สมจริง Qualys สามารถเตรียมช่องโหว่ที่หักล้างสมมติฐานนี้ และอนุญาตให้เริ่มการเรียกใช้โค้ดจากระยะไกลบนเซิร์ฟเวอร์โดยการส่งข้อความที่ออกแบบมาเป็นพิเศษ

ปัญหามีสาเหตุมาจากจำนวนเต็มล้นในฟังก์ชัน stralloc_readyplus() ซึ่งอาจเกิดขึ้นเมื่อประมวลผลข้อความที่มีขนาดใหญ่มาก การดำเนินการต้องใช้ระบบ 64 บิตที่มีหน่วยความจำเสมือนมากกว่า 4GB เมื่อช่องโหว่ได้รับการวิเคราะห์ครั้งแรกในปี 2005 Daniel J. Bernstein แย้งว่าข้อสันนิษฐานในโค้ดที่ว่าขนาดของอาเรย์ที่จัดสรรนั้นอยู่ภายในค่า 32 บิตเสมอนั้นขึ้นอยู่กับข้อเท็จจริงที่ว่าไม่มีใครจัดเตรียมหน่วยความจำกิกะไบต์ให้กับแต่ละกระบวนการ ในช่วง 15 ปีที่ผ่านมา ระบบ 64 บิตบนเซิร์ฟเวอร์ได้เข้ามาแทนที่ระบบ 32 บิต และจำนวนหน่วยความจำที่ให้มาและแบนด์วิธเครือข่ายก็เพิ่มขึ้นอย่างมาก

ผู้ดูแลแพ็คเกจ qmail คำนึงถึงบันทึกของ Bernstein และจำกัดหน่วยความจำที่มีอยู่เมื่อเริ่มกระบวนการ qmail-smtpd (เช่น ใน Debian 10 ขีดจำกัดจะตั้งไว้ที่ 7MB) แต่วิศวกรจาก Qualys พบว่านี่ยังไม่เพียงพอ และนอกเหนือจาก qmail-smtpd แล้ว การโจมตีระยะไกลยังสามารถทำได้บนกระบวนการ qmail-local ซึ่งยังคงไม่จำกัดในแพ็คเกจที่ทดสอบทั้งหมด เพื่อเป็นการพิสูจน์ มีการเตรียมต้นแบบการหาประโยชน์ซึ่งเหมาะสำหรับการโจมตีแพ็คเกจ Debian ด้วย qmail ในการกำหนดค่าเริ่มต้น
ในการจัดระเบียบการเรียกใช้โค้ดจากระยะไกลระหว่างการโจมตี เซิร์ฟเวอร์ต้องการพื้นที่ว่างในดิสก์ 4GB และ RAM 8GB
การใช้ประโยชน์ช่วยให้คุณสามารถรันคำสั่งเชลล์ใด ๆ ที่มีสิทธิ์ของผู้ใช้ใด ๆ ในระบบยกเว้นผู้ใช้รูทและระบบที่ไม่มีไดเร็กทอรีย่อยของตนเองในไดเร็กทอรี "/ home" (กระบวนการ qmail-local จะเปิดตัวพร้อมสิทธิ์ ของผู้ใช้ในพื้นที่ที่ดำเนินการจัดส่งให้)

การโจมตีจะดำเนินการ
ผ่านการส่งข้อความเมลขนาดใหญ่มาก รวมถึงบรรทัดส่วนหัวหลายบรรทัด ขนาดประมาณ 4GB และ 576MB การประมวลผลสตริงดังกล่าวใน qmail-local ส่งผลให้เกิดจำนวนเต็มล้นเมื่อพยายามส่งข้อความไปยังผู้ใช้ภายในเครื่อง จำนวนเต็มล้นจะทำให้บัฟเฟอร์ล้นเมื่อคัดลอกข้อมูล และความเป็นไปได้ที่จะเขียนทับเพจหน่วยความจำด้วยโค้ด libc ด้วยการจัดการเลย์เอาต์ของข้อมูลที่ส่ง ทำให้สามารถเขียนที่อยู่ของฟังก์ชัน "open()" ใหม่ได้ โดยแทนที่ด้วยที่อยู่ของฟังก์ชัน "system()"

ถัดไป ในกระบวนการเรียก qmesearch() ใน qmail-local ไฟล์ “.qmail-extension” จะถูกเปิดผ่านฟังก์ชัน open() ซึ่งนำไปสู่การเรียกใช้ฟังก์ชันจริง
ระบบ (".qmail-extension") แต่เนื่องจากส่วน “ส่วนขยาย” ของไฟล์ถูกสร้างขึ้นตามที่อยู่ของผู้รับ (เช่น “localuser-extension@localdomain”) ผู้โจมตีจึงสามารถจัดเตรียมคำสั่งให้ส่งไปทำงานโดยการระบุผู้ใช้ “localuser-;command ;@localdomain” ในฐานะผู้รับข้อความ

ในระหว่างการวิเคราะห์โค้ด มีการระบุช่องโหว่สองรายการในแพตช์ยืนยัน qmail เพิ่มเติม ซึ่งเป็นส่วนหนึ่งของแพ็คเกจสำหรับ Debian ช่องโหว่แรก (CVE-2020-3811) ช่วยให้คุณสามารถข้ามการยืนยันที่อยู่อีเมลได้ และวิธีที่สอง (CVE-2020-3812) นำไปสู่การรั่วไหลของข้อมูลท้องถิ่น โดยเฉพาะอย่างยิ่ง ช่องโหว่แรกช่วยให้คุณสามารถข้ามการตรวจสอบความถูกต้องของที่อยู่ที่ใช้ในการหาประโยชน์เพื่อส่งคำสั่ง (การตรวจสอบใช้ไม่ได้กับที่อยู่ที่ไม่มีโดเมน เช่น “localuser-;command;”) ช่องโหว่ที่สองสามารถใช้เพื่อตรวจสอบการมีอยู่ของไฟล์และไดเร็กทอรีในระบบ รวมถึงไฟล์และไดเร็กทอรีที่เข้าถึงได้เฉพาะรูทเท่านั้น (ตรวจสอบ qmail ทำงานด้วยสิทธิ์รูท) ผ่านการเรียกโดยตรงไปยังตัวจัดการในเครื่อง

เพื่อแก้ไขปัญหา Bernstein แนะนำให้เรียกใช้กระบวนการ qmail โดยมีขีดจำกัดรวมของหน่วยความจำที่มีอยู่ (“softlimit -m12345678”) ซึ่งในกรณีนี้ปัญหาจะถูกบล็อก เพื่อเป็นอีกทางเลือกหนึ่งในการป้องกัน มีการกล่าวถึงการจำกัดขนาดสูงสุดของข้อความที่ประมวลผลผ่านไฟล์ “ควบคุม/ดาต้าไบต์” (โดยค่าเริ่มต้น จะไม่ได้สร้างไว้ด้วยการตั้งค่าเริ่มต้น qmail ยังคงมีความเสี่ยงอยู่) นอกจากนี้ "การควบคุม/ดาต้าไบต์" ไม่ได้ป้องกันการโจมตีในเครื่องจากผู้ใช้ระบบ เนื่องจากขีดจำกัดจะถูกพิจารณาโดย qmail-smtpd เท่านั้น

ปัญหาส่งผลกระทบต่อแพ็คเกจ เน็ตคิวเมลรวมอยู่ในที่เก็บ Debian ชุดแพตช์ได้ถูกจัดเตรียมไว้สำหรับแพ็คเกจนี้ โดยกำจัดทั้งช่องโหว่เก่าจากปี 2005 (โดยการเพิ่มขีดจำกัดหน่วยความจำฮาร์ดให้กับโค้ดฟังก์ชัน alloc()) และปัญหาใหม่ใน qmail-verify แยกกัน เตรียมไว้ เวอร์ชันอัปเดตของแพตช์ยืนยัน qmail นักพัฒนา สาขา ไม่ใช่คิวเมล ได้เตรียมแพตช์ของตัวเองเพื่อป้องกันปัญหาเก่า ๆ และเริ่มทำงานเพื่อกำจัดจำนวนเต็มล้นที่เป็นไปได้ทั้งหมดในโค้ด

ที่มา: opennet.ru

เพิ่มความคิดเห็น