มีการค้นพบช่องโหว่ในกระบวนการพื้นหลังของ slaacd ซึ่งเป็นกระบวนการที่รับผิดชอบในการกำหนดค่าที่อยู่ IPv6 โดยอัตโนมัติ (IPv6 Stateless Address Autoconfiguration, RFC 4862) ใน OpenBSD ซึ่งนำไปสู่บัฟเฟอร์ล้นเมื่อได้รับโฆษณาเราเตอร์ IPv6 ที่สร้างขึ้นเป็นพิเศษ (RA)
ในช่วงแรก ฟังก์ชันการกำหนดค่าที่อยู่ IPv6 อัตโนมัติถูกนำมาใช้ในระดับเคอร์เนล แต่เริ่มต้นด้วย OpenBSD 6.2 ฟังก์ชันนี้ถูกย้ายไปยังกระบวนการแยกต่างหากที่ไม่มีสิทธิ์พิเศษที่เรียกว่า slaacd กระบวนการนี้รับผิดชอบการส่งข้อความ RS (Router Solicitation) และการแยกวิเคราะห์การตอบสนอง RA (Router Advertisement) ซึ่งประกอบด้วยข้อมูลเราเตอร์และพารามิเตอร์การเชื่อมต่อเครือข่าย
ในเดือนกุมภาพันธ์ มีการแก้ไขข้อผิดพลาดใน slaacd ซึ่งจะทำให้โปรแกรมหยุดทำงานหากระบุค่าเป็น 7 เซิร์ฟเวอร์ ในรายการ RDNSS (Recursive DNS Servers) ความผิดพลาดนี้ดึงดูดความสนใจของนักวิจัยอิสระ ซึ่งพยายามตรวจสอบโค้ด slaacd เพื่อหาข้อผิดพลาดอื่นๆ ที่เกิดขึ้นเมื่อแยกวิเคราะห์ฟิลด์ในข้อความ RA การวิเคราะห์พบว่าโค้ดมีปัญหาอีกอย่างหนึ่งที่เกิดขึ้นเมื่อประมวลผลฟิลด์ DNSSL (DNS Search List) ซึ่งรวมถึงรายการต่างๆ ชื่อโดเมน และโฮสต์เทมเพลตสำหรับ DNS
แต่ละชื่อในรายการ DNSSL จะถูกเข้ารหัสโดยใช้ตัวคั่นฐานศูนย์และตัวทำเครื่องหมายไบต์เดี่ยวที่แทรกอยู่ ซึ่งกำหนดขนาดของข้อมูลถัดไป ช่องโหว่นี้เกิดขึ้นเนื่องจากโค้ดการแยกวิเคราะห์รายการคัดลอกฟิลด์ขนาดลงในตัวแปรจำนวนเต็มที่มีเครื่องหมาย ("len = data[pos]") ดังนั้น หากฟิลด์มีค่าที่มีบิตลำดับสูง ค่านี้จะถูกตีความว่าเป็นตัวเลขติดลบในคำสั่งเงื่อนไข และการตรวจสอบขนาดสูงสุดที่อนุญาต ("if (len > 63 || len + pos + 1 > datalen) {") จะล้มเหลว ส่งผลให้มีการเรียกใช้ memcpy ด้วยพารามิเตอร์ที่มีขนาดเกินขนาดบัฟเฟอร์


ที่มา: opennet.ru
