'league/commonmark แก้ DoS จาก slug ชนกัน GHSA-mh25-x5hq-wrqp'
'นักพัฒนาและผู้ดูแลระบบที่รับ Markdown จากภายนอกผ่านส่วนขยายที่ได้รับผลกระทบควรเร่งอัปเดต league/commonmark เป็น 2.9.0'
สรุปใน 1 นาที
- อาการ/ปัญหา
- slug ที่ซ้ำกันทำให้การประมวลผลใช้ CPU มากจนบริการไม่พร้อมใช้งาน
- ใครควรอ่าน
- นักพัฒนาและผู้ดูแลระบบที่ใช้ league/commonmark รุ่น 2.0.0 ถึงก่อน 2.9.0 กับ Markdown ภายนอกและส่วนขยายที่เกี่ยวข้อง
- ทางแก้แบบสั้น
- อัปเดตเป็น 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 เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
อยากให้เราทำให้ไหม?
ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า
เคยเจองานแบบนี้ไหม? ติดตรงไหน?
มาแลกวิธีกันต่อในบอร์ด LinuxThai



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