EST. 2026 — Notes from real server work SYSADMIN · SECURITY · AI · DIRECTADMIN Issue 01
THE SYSADMIN ALMANAC
Home / Security Notice / 'league/commonmark เสี่ยง DoS ผ่าน XML ซ้อนลึก GHSA-mj63-m3rc-8ppr'
Security Notice

'league/commonmark เสี่ยง DoS ผ่าน XML ซ้อนลึก GHSA-mj63-m3rc-8ppr'

by Ton-Or ·3 Aug 2026·3 min read
'league/commonmark เสี่ยง DoS ผ่าน XML ซ้อนลึก GHSA-mj63-m3rc-8ppr'

'นักพัฒนาและผู้ดูแลระบบที่เปิดรับ Markdown มาแปลงเป็น XML ควรเร่งอัปเดต league/commonmark เป็นรุ่นที่แก้แล้ว'

1-minute summary

Symptom / problem
XML ที่ซ้อนลึกทำให้ช่องว่างสำหรับเยื้องบรรทัดขยายจนกินหน่วยความจำและกระทบการให้บริการ
Who should read
นักพัฒนาและผู้ดูแลระบบของแอปที่ใช้ league/commonmark แปลง Markdown ที่ไม่น่าเชื่อถือเป็น XML
Fix in short
อัปเดตเป็น 2.9.0 และระหว่างรอให้จำกัดความลึก ขนาดข้อมูลเข้า และทรัพยากรของงาน XML
Jump to steps

พอดีไล่ฟีดความปลอดภัยเจอประกาศของ league/commonmark ไลบรารี PHP สำหรับประมวลผล Markdown ผู้พัฒนาเผยแพร่ GHSA-mj63-m3rc-8ppr เมื่อ 3 สิงหาคม 2026 ปัญหานี้ทำให้การสร้าง XML ใช้ทรัพยากรมากจนกระทบบริการได้ ให้ตรวจว่าแอปรับ Markdown จากคนนอกมาแปลงเป็น XML หรือไม่ เพราะต้องเลือกใช้ตัวแปลงนี้เอง

5.3CVSS 3.1 ระดับปานกลาง
2.9.0รุ่นที่แก้แล้ว
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 เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ

Want us to set this up?

Get help with server setup, configuration, migration, or troubleshooting. Save time for the work that matters.

Get a quote

Hit something like this? Stuck somewhere?

Come trade notes on the LinuxThai board

→ Continue on the board

Comments 0

No comments yet — be the first