'league/commonmark เสี่ยง DoS ผ่าน XML ซ้อนลึก GHSA-mj63-m3rc-8ppr'
'นักพัฒนาและผู้ดูแลระบบที่เปิดรับ Markdown มาแปลงเป็น XML ควรเร่งอัปเดต league/commonmark เป็นรุ่นที่แก้แล้ว'
สรุปใน 1 นาที
- อาการ/ปัญหา
- XML ที่ซ้อนลึกทำให้ช่องว่างสำหรับเยื้องบรรทัดขยายจนกินหน่วยความจำและกระทบการให้บริการ
- ใครควรอ่าน
- นักพัฒนาและผู้ดูแลระบบของแอปที่ใช้ league/commonmark แปลง Markdown ที่ไม่น่าเชื่อถือเป็น XML
- ทางแก้แบบสั้น
- อัปเดตเป็น 2.9.0 และระหว่างรอให้จำกัดความลึก ขนาดข้อมูลเข้า และทรัพยากรของงาน XML
พอดีไล่ฟีดความปลอดภัยเจอประกาศของ league/commonmark ไลบรารี PHP สำหรับประมวลผล Markdown ผู้พัฒนาเผยแพร่ GHSA-mj63-m3rc-8ppr เมื่อ 3 สิงหาคม 2026 ปัญหานี้ทำให้การสร้าง XML ใช้ทรัพยากรมากจนกระทบบริการได้ ให้ตรวจว่าแอปรับ Markdown จากคนนอกมาแปลงเป็น XML หรือไม่ เพราะต้องเลือกใช้ตัวแปลงนี้เอง
ใครต้องทำอะไร
- นักพัฒนา: ตรวจจุดแปลง Markdown เป็น XML และรีบอัปเดตแพ็กเกจเป็น 2.9.0 หากรับเนื้อหาจากแหล่งที่ไม่น่าเชื่อถือ
- ผู้ดูแลระบบ: ประสานทีมแอปให้นำรุ่นที่แก้ขึ้นใช้งานโดยเร็วหากบริการรับ Markdown มาแปลงเป็น XML พร้อมจำกัดทรัพยากรระหว่างรอ
เกิดอะไรขึ้น
XmlRenderer เติมช่องว่างหน้าแท็กเปิดและแท็กปิดเพื่อให้ XML อ่านง่าย ยิ่งเอกสารซ้อนกันลึก ก็ยิ่งเติมช่องว่างมาก ปริมาณช่องว่างรวมโตแบบกำลังสอง หรือ O(n²) ทำให้ผลลัพธ์ใหญ่และกินหน่วยความจำมาก บริการอาจรับงานอื่นได้น้อยลง
ปัญหาเกิดได้เมื่อใช้ MarkdownToXmlConverter แปลงข้อความ blockquote ที่ซ้อนหลายชั้น อีกกรณีคือแอปสร้างโครงสร้างเอกสาร AST จากข้อมูลที่ผู้โจมตีควบคุม แล้วส่งเข้า XmlRenderer::renderDocument() โดยตรง ผลกระทบคือใช้ทรัพยากรมากขึ้น ไม่ได้ทำให้โปรแกรมหยุดทันที และไม่มีผลต่อความลับหรือความถูกต้องของข้อมูลตามประกาศ
ค่า max_nesting_level จำกัดความลึกที่ parser สร้างได้ แต่ค่าเริ่มต้นยังสูงพอให้เกิดผลเสีย และไม่ครอบคลุม AST ที่แอปสร้างเองแล้วส่งตรงเข้า renderer ประกาศให้ระดับปานกลาง คะแนน CVSS 3.1 เท่ากับ 5.3 และยังไม่ระบุ CVE
ใครโดนและรุ่นที่แก้
ข้อมูลช่วงรุ่นไม่ตรงกัน: ช่อง Affected versions ใน ประกาศผู้พัฒนา ระบุ >=2.0.0, <2.8.4 แต่คำอธิบายบอกว่ากระทบถึงสาย 2.8.x ส่วน GitHub Advisory Database ระบุ >=2.0.0, <2.9.0 ตารางนี้ใช้ช่วงหลัง ทั้งสองหน้าระบุรุ่นแก้เป็น 2.9.0 ตรงกัน
| แพ็กเกจ / รุ่น | ผลกระทบและรุ่นแก้ |
|---|---|
| league/commonmark ตั้งแต่ 2.0.0 แต่ต่ำกว่า 2.9.0 | กระทบเส้นทาง XML ให้อัปเดตเป็น 2.9.0 |
| league/commonmark 1.x | ไม่มี XML renderer เลยไม่กระทบช่องโหว่นี้ |
บันทึกรุ่น 2.9.0 ยืนยันการแก้การเยื้อง XML โดยเพิ่ม xml/max_indentation_level ค่าเริ่มต้น 16 และตั้งเป็น 0 ได้หากไม่ต้องการเยื้องบรรทัด ตัวเลือกนี้เพิ่มมาในรุ่นแก้แล้ว ไม่ใช่ค่าที่นำไปใช้ป้องกันรุ่นเก่าได้ทันที
ต้องทำอะไร
เริ่มจากตรวจเวอร์ชันจริงในโปรเจกต์และค้นหาว่าใช้ตัวแปลง XML หรือไม่ จากนั้นสำรองไฟล์ dependency และปรับข้อกำหนดใน composer.json หากยังล็อกรุ่นต่ำกว่า 2.9.0 แล้วรันในสภาพแวดล้อมพัฒนาหรือทดสอบ
composer show league/commonmark
composer update league/commonmark --with-all-dependencies
composer show league/commonmark
คำสั่งอัปเดตยังต้องทำตามข้อกำหนดเวอร์ชันของโปรเจกต์ ให้ยืนยันว่ารุ่นที่ได้เป็น 2.9.0 หรือใหม่กว่า ตรวจการเปลี่ยนแปลงใน composer.lock และทดสอบงานแปลงเอกสารก่อนนำขึ้นใช้งานจริง
ระหว่างรอแพตช์ ให้ลด max_nesting_level และจำกัดขนาดข้อความก่อนแปลงตามคำแนะนำผู้พัฒนา จำกัดหน่วยความจำและขนาดผลลัพธ์ของงาน XML รวมถึงระบบที่อ่านหรือเก็บผลลัพธ์ด้วย ถ้าไม่จำเป็นต้องใช้ XML ให้ใช้ HTML renderer ซึ่งไม่มีปัญหาช่องว่างแบบนี้ การลดความลึกฝั่ง parser ยังไม่ครอบคลุม AST ที่แอปสร้างเอง
ส่วนตัวผมแนะนำให้เร่งแพตช์ถ้าเปิดรับ Markdown จากภายนอกมาแปลงเป็น XML เพราะเป็นจุดที่ข้อมูลขนาดเล็กทำให้ระบบใช้ทรัพยากรเกินควรได้ ที่มา: league/commonmark: Denial of service via deeply nested XML output เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
อยากให้เราทำให้ไหม?
ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า
เคยเจองานแบบนี้ไหม? ติดตรงไหน?
มาแลกวิธีกันต่อในบอร์ด LinuxThai



ความคิดเห็น 0
ยังไม่มีความคิดเห็น — เป็นคนแรกเลย