Skip to main content
Back to articles

OpenResty lua-resty-dns 0.24 แก้ CVE-2026-116013 คำตอบ DNS ผิดรูปแบบทำให้ request ล้ม

lua-resty-dns ก่อน 0.24 ตรวจขอบเขต DNS resource record ไม่ครบ คำตอบที่ถูกตัดสั้นอาจทำให้ resolver โยน Lua exception และคำขอล้ม

OpenResty lua-resty-dns 0.24 แก้ CVE-2026-116013 คำตอบ DNS ผิดรูปแบบทำให้ request ล้ม

ผู้ดูแลระบบที่ใช้ lua-resty-dns กับ OpenResty ควรตรวจเวอร์ชันหลังมีการเผยแพร่ CVE-2026-116013 ช่องโหว่การแปลผล DNS response ที่สั้นหรือผิดรูปแบบ ในรุ่นก่อน 0.24 ตัว parser ตรวจความยาวของข้อมูลบางส่วนไม่ครบ ทำให้การเรียก resolver ล้มด้วย Lua exception และคำขอที่พึ่งผล DNS นั้นหยุดทำงานได้ จุดสำคัญคือผู้โจมตีต้องควบคุมหรือปลอมคำตอบจาก nameserver ที่ระบบกำลังถาม ไม่ใช่เพียงส่ง HTTP request ธรรมดาเข้าหน้าเว็บก็ทำให้ทุก instance ล่มได้

ข้อบกพร่องถูกเปิดเผยผ่าน pull request ของโครงการ วันที่ 23 ตุลาคม 2026 เวลา 08:26 UTC โค้ดแก้ไขถูก merge และบันทึกเป็น commit b68eaec เวลา 09:06 UTC วันเดียวกัน tag v0.24 ชี้ไปยัง commit แก้นี้ ระเบียน CVE-2026-116013 เผยแพร่วันที่ 24 ตุลาคม 2026 เวลา 11:40 UTC การระบุเวลาแยกกันสำคัญ เพราะหมายเลข CVE ปรากฏหลังจากโครงการเปิดการแก้ไขแล้ว

parser พลาดตรงไหน

คำตอบ DNS ไม่ได้มีเพียงชื่อโดเมนกับ IP แต่ประกอบด้วย header, คำถาม และ resource record หลายส่วน แต่ละ record ระบุความยาวของข้อมูลตนเอง ตัว parser ต้องตรวจว่าจำนวน byte ที่ประกาศไว้มีอยู่จริงภายใน packet ก่อนอ่านต่อ มิฉะนั้น packet ที่ถูกตัดสั้นหรือมีความยาวขัดกันอาจพาโค้ดอ่านผิดตำแหน่งหรือหยุดด้วยข้อผิดพลาด

ตามคำอธิบายใน PR ตัว parser เดิมอาจรับ record header ที่ไม่ครบหรือข้อมูล RDATA ที่สั้นเกินไป สำหรับ A record อาจได้ address ที่ไม่ถูกต้อง ส่วน AAAA record อาจทำให้เกิด Lua exception ยังมีกรณี TXT, SOA, ส่วน authority และ additional รวมถึงชื่อโดเมนที่ใช้ compression pointer ซึ่งต้องจัดการความผิดพลาดและ loop อย่างรัดกุมขึ้น แพตช์เพิ่มการตรวจขอบเขตของ record และข้อมูลจริง ส่งต่อความผิดพลาดจากการถอดรหัสชื่อ และปฏิเสธ pointer loop

ระเบียน CVE อธิบายผลกระทบหลักว่าเมื่อ resolver:query() ได้คำตอบที่สร้างมาเป็นพิเศษ มันอาจโยน exception ที่ไม่ถูกจัดการ ทำให้คำขอที่กำลังพึ่งการ resolve นั้นยุติหรือแปลชื่อไม่ได้ จัดเป็น denial of service ของเส้นทางที่ใช้ DNS นี้ ไม่ควรเขียนว่ามีการรันโค้ดจากระยะไกลหรือทำให้เครื่อง OpenResty ทุกเครื่องหยุดทำงานทั้งระบบ เพราะแหล่งต้นทางไม่ได้ยืนยันผลเช่นนั้น

ใครมีความเสี่ยง

ระเบียนระบุ lua-resty-dns ก่อน 0.24 เป็นช่วงที่ได้รับผลกระทบ ต้องมีการใช้งานไลบรารีนี้จริงใน Lua/OpenResty และเรียก resolver กับ nameserver ที่ผู้โจมตีสามารถควบคุมหรือปลอมคำตอบได้ หากแอปไม่ได้ใช้ไลบรารีนี้ การมี OpenResty อยู่บนเครื่องอย่างเดียวไม่พอจะสรุปว่าได้รับผลกระทบ การเสี่ยงในระบบจริงยังขึ้นกับเส้นทาง DNS, การตั้งค่า resolver, ความสามารถในการ spoof packet และการจัดการ exception ของแอปที่เรียกใช้

ผู้ดูแลควรตรวจ dependency ที่ติดตั้งจริงใน container หรือแพ็กเกจของ OpenResty รวมถึงไฟล์ lib/resty/dns/resolver.lua หากมีการคัดลอกไลบรารีไว้ในโปรเจกต์หรือ pin commit เก่า ให้ดูโค้ดที่ deploy จริงมากกว่าชื่อเวอร์ชันในเอกสาร การอัปเดต image หลักเพียงอย่างเดียวอาจไม่เปลี่ยนสำเนาไลบรารีที่แอปแนบไว้เอง

อัปเดตและตรวจผล

แนวทางหลักคือเปลี่ยนไปใช้ lua-resty-dns 0.24 หรือ commit แก้ที่โครงการระบุ แล้วทดสอบ workflow ที่ต้อง resolve ชื่อ เช่น upstream discovery หรือบริการที่เปลี่ยนปลายทางตาม DNS ก่อนย้ายไป production PR ระบุว่าชุดทดสอบ record-bounds.t และ mock.t ผ่าน 376 assertions โดยเพิ่มกรณีถดถอย 18 กรณีที่ครอบคลุม packet ผิดรูปแบบหลายชนิด นี่เป็นหลักฐานการตรวจเฉพาะส่วน parser; ผู้ใช้ยังต้องทดสอบการตั้งค่าเครือข่ายและ fallback ของระบบตนเอง

ระหว่างรออัปเดต ควรจำกัด nameserver ที่แอปเชื่อถือและเฝ้าดู error log สำหรับ Lua exception ที่เกิดขณะ resolve ชื่อ หากระบบใช้ DNS ภายนอกผ่านเครือข่ายที่ไม่ควบคุม ให้ทบทวนเส้นทางและการป้องกันการปลอมคำตอบด้วย การตรวจ log ของคำขอที่ล้มและ DNS resolver ควบคู่กันช่วยแยกความผิดพลาดจาก packet ไม่สมบูรณ์ออกจากปัญหา DNS ทั่วไป เช่น timeout หรือ nameserver ไม่ตอบ

หลังอัปเดต อย่าพิสูจน์ผลด้วยการส่ง packet ผิดรูปแบบไปยัง production โดยตรง ให้ใช้ชุดทดสอบของโครงการหรือ staging ที่แยกจากงานจริง และตรวจว่าคำตอบ DNS ถูกปฏิเสธอย่างควบคุมได้โดยไม่ทิ้งคำขอค้าง จุดที่ควรได้จากข่าวนี้คือการตรวจขอบเขตข้อมูลเครือข่ายต้องทำครบทุกชนิด record และทุกทางเดินของ parser ไม่ใช่เฉพาะ A/AAAA ที่พบบ่อย

แหล่งข้อมูลต้นทาง: OpenResty PR #83, commit ที่แก้ปัญหา, tag v0.24, ระเบียน CVE-2026-116013