'league/commonmark แก้ DoS จาก slug ชนกัน GHSA-mh25-x5hq-wrqp'
'นักพัฒนาและผู้ดูแลระบบที่รับ Markdown จากภายนอกผ่านส่วนขยายที่ได้รับผลกระทบควรเร่งอัปเดต league/commonmark เป็น 2.9.0'
1-minute summary
- Symptom / problem
- slug ที่ซ้ำกันทำให้การประมวลผลใช้ CPU มากจนบริการไม่พร้อมใช้งาน
- Who should read
- นักพัฒนาและผู้ดูแลระบบที่ใช้ league/commonmark รุ่น 2.0.0 ถึงก่อน 2.9.0 กับ Markdown ภายนอกและส่วนขยายที่เกี่ยวข้อง
- Fix in short
- อัปเดตเป็น 2.9.0 ทดสอบการแสดงผล แล้วนำแพ็กเกจและ composer.lock ที่แก้แล้วขึ้นใช้งาน
พอดีไล่ฟีด Packagist เจอประกาศของไลบรารี PHP league/commonmark เรื่อง slug ของหัวข้อซ้ำกัน รหัส GHSA-mh25-x5hq-wrqp ผู้พัฒนาเผยแพร่เมื่อ 3 สิงหาคม 2026 ปัญหานี้ทำให้การแปลง Markdown ใช้ CPU มากจนบริการล่มได้ แอปที่รับข้อความจากคนนอกควรตรวจส่วนขยายที่สร้าง slug
ใครต้องทำอะไร
- นักพัฒนา: ตรวจ dependency และส่วนขยายที่แอปใช้ แล้วเร่งอัปเดตเป็น 2.9.0 หากรับ Markdown จากผู้ใช้ภายนอกผ่านเส้นทางที่ได้รับผลกระทบ
- ผู้ดูแลระบบ: ประสานทีมแอปให้นำแพตช์ขึ้นใช้งานโดยเร็วเมื่อบริการรับ Markdown ที่ไม่น่าเชื่อถือผ่านส่วนขยายที่เกี่ยวข้อง
เกิดอะไรขึ้น
slug คือชื่อที่ใช้ทำจุดอ้างอิงภายในเอกสาร เช่น ลิงก์กระโดดไปยังหัวข้อ เมื่อชื่อซ้ำ UniqueSlugNormalizer::normalize() จะหาเลขต่อท้ายที่ยังไม่ถูกใช้ แต่โค้ดเดิมเริ่มค้นใหม่จากเลข 1 ทุกครั้ง งานเลยเพิ่มแบบกำลังสอง หรือ O(K²) ตามจำนวน slug ที่ชนกัน เอกสารขนาดเล็กก็ทำให้เสียเวลา CPU หลายวินาทีได้
ปัญหาเกิดเมื่อข้อความที่ผู้โจมตีควบคุมถูกส่งให้ตัวสร้าง slug นี้ แอปอาจเรียกผ่าน HeadingPermalinkExtension หรือเชิงอรรถแบบ inline ของ FootnoteExtension ส่วน TableOfContentsExtension ก็เข้าข่าย เพราะต้องเปิดส่วนขยาย heading permalink ร่วมด้วย ค่าเริ่มต้นจะตรวจชื่อซ้ำทั้งเอกสาร ยิ่งมีชื่อซ้ำมากก็ยิ่งทำงานหนัก
ประกาศจัดเป็น High คะแนน CVSS 3.1 เท่ากับ 7.5 ผู้โจมตีไม่ต้องยืนยันตัวตน และผลกระทบที่ระบุจำกัดอยู่ที่ความพร้อมใช้งานของบริการ ประกาศไม่ได้ระบุผลกระทบต่อความลับหรือความถูกต้องของข้อมูล และยังไม่มีหมายเลข CVE ให้ใช้อ้างอิง ควรใช้ GHSA-mh25-x5hq-wrqp ในรายการติดตามแพตช์แทน
ใครโดนและรุ่นที่แก้
| แพ็กเกจ / สายรุ่น | รุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ |
|---|---|---|
| league/commonmark 2.x | ตั้งแต่ 2.0.0 แต่ต่ำกว่า 2.9.0 | 2.9.0 |
| league/commonmark 1.x | ไม่ได้รับผลกระทบจากปัญหานี้ | ไม่เกี่ยวข้อง |
ข้อมูลช่วงรุ่นไม่ตรงกัน: ช่อง Affected versions ใน ประกาศผู้พัฒนา ระบุ >=2.0.0, <2.8.4 แต่คำอธิบายบอกว่ากระทบถึงสาย 2.8.x ส่วน GitHub Advisory Database ระบุ >=2.0.0, <2.9.0 ตารางนี้ใช้ช่วงหลัง ทั้งสองหน้าระบุรุ่นแก้เป็น 2.9.0 ตรงกัน
Release notes ของ 2.9.0 ยืนยันการแก้ตัวค้นเลขต่อท้าย slug ที่ทำงานซ้ำแบบกำลังสอง ให้ตรวจทั้งรุ่นแพ็กเกจและส่วนขยายที่แอปเปิดใช้
ต้องทำอะไร
ตรวจรุ่นที่ติดตั้งในโฟลเดอร์โปรเจกต์ สำรองไฟล์ dependency แล้วอัปเดตในสภาพแวดล้อมทดสอบก่อน ตัวอย่างนี้อ้างอิง คำสั่ง Composer และกำหนดรุ่นเป้าหมายไว้ชัดเจน:
composer show league/commonmark
composer update league/commonmark:2.9.0 --with-dependencies
composer show league/commonmark
ถ้า constraint ใน composer.json หรือแพ็กเกจแม่ไม่ยอมรับ 2.9.0 ต้องแก้ข้อจำกัดหรืออัปเดตแพ็กเกจที่เกี่ยวข้องก่อน คำสั่งนี้ไม่ได้เปลี่ยน constraint ให้เอง หลังอัปเดตให้ตรวจผลลัพธ์ว่าติดตั้ง 2.9.0 แล้ว ทดสอบลิงก์หัวข้อ สารบัญ และเชิงอรรถ จากนั้นนำ composer.lock และชุด dependency ที่ผ่านการทดสอบขึ้นใช้งาน ตรวจรุ่นบนระบบปลายทางอีกครั้งด้วย
ตั้ง slug_normalizer/unique เป็น false เพื่อหยุดตรวจชื่อซ้ำ แต่หัวข้ออาจใช้ anchor เดียวกัน อีกทางคือปิดส่วนขยายที่เกี่ยวข้องเมื่อรับ Markdown จากภายนอก และจำกัดขนาดเอกสารกับจำนวนหัวข้อ วิธีเหล่านี้อาจทำให้บางฟีเจอร์ใช้ไม่ได้หรือผลลัพธ์เปลี่ยนไป ผู้พัฒนาแนะนำให้อัปเกรดเป็นหลัก
ส่วนตัวผมให้เร่งแพตช์หากเปิดรับ Markdown จากภายนอกและใช้ส่วนขยายที่เข้าข่าย เพราะจุดรับข้อความอาจกลายเป็นภาระ CPU ของบริการได้ ที่มา: GitHub Security Advisory GHSA-mh25-x5hq-wrqp เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
Want us to set this up?
Get help with server setup, configuration, migration, or troubleshooting. Save time for the work that matters.
Hit something like this? Stuck somewhere?
Come trade notes on the LinuxThai board



Comments 0
No comments yet — be the first