league/commonmark เสี่ยง DoS ผ่าน Markdown GHSA-j8pm-gj4c-rq4x
ผู้ดูแลแอป PHP ที่ใช้ league/commonmark แปลง Markdown จากผู้ใช้ที่ไม่เชื่อถือควรเร่งอัปเดตเป็น 2.9.1 หรือใหม่กว่า
1-minute summary
- Symptom / problem
- Markdown ที่ออกแบบมาเป็นพิเศษทำให้ parser ใช้ CPU สูงจนคำขอปกติทำงานต่อไม่ได้
- Who should read
- แอปที่ใช้ league/commonmark ตั้งแต่ 0.6.0 ถึงก่อน 2.9.1 และเปิดรับ Markdown จากผู้ใช้ที่ไม่เชื่อถือ
- Fix in short
- อัปเดตเป็น 2.9.1 หรือใหม่กว่า ระหว่างรอให้จำกัดความยาวแต่ละบรรทัดควบคู่กับขนาดคำขอ
พอดีไล่ฟีด security เจอ ประกาศ GHSA-j8pm-gj4c-rq4x ของ league/commonmark ไลบรารีแปลง Markdown สำหรับ PHP ประเด็นนี้เป็น denial of service หรือ DoS จากการประมวลผลข้อความ ไม่ต้องติดตั้งส่วนขยายก็เข้าถึงเส้นทางที่มีปัญหาได้ ระบบที่รับ Markdown จากบุคคลภายนอกควรตรวจ dependency เพราะคำขอขนาดไม่มากอาจใช้ CPU เกินสัดส่วน
เกิดอะไรขึ้น
ประกาศผู้พัฒนาเผยแพร่วันที่ 9 สิงหาคม 2026 ส่วนรายการใน GitHub Advisory Database เข้าฐานวันที่ 1 กันยายน 2026 เวลา UTC ซึ่งตรงกับ 2 กันยายน 2026 ตามเวลาไทย
ปัญหาอยู่ใน parser สามจุด แต่ละจุดทำงานเพิ่มเร็วกว่าขนาดข้อความ จุดแรกคือ regular expression ที่ตรวจ fenced code block แบบ backtick แล้ววนตรวจข้อความเดิมซ้ำ จุดที่สองคือการค้นหาป้ายกำกับ reference link เมื่อมีวงเล็บซ้อนกัน ตัวแปลงจะคัดลอกและจัดรูปข้อความในวงเล็บซ้ำ จุดที่สามคือการจับคู่ตัวคั่นเน้นข้อความ ขีดฆ่า และไฮไลต์ โดย cache แยก key ตามความยาวตัวคั่น เมื่อความยาวเปลี่ยนเลยต้องย้อนค้นหาตัวเปิดใหม่
ผู้โจมตีที่ส่ง Markdown เข้าแปลงได้โดยไม่ต้องยืนยันตัวตน อาจส่งคำขอซ้ำหรือพร้อมกันจน PHP worker ถูกใช้งานหมด แล้วคำขอปกติทำงานต่อไม่ได้ ตัวกระตุ้นแต่ละแบบอยู่ในบรรทัดเดียวได้ ไม่จำเป็นต้องเป็นเอกสารซับซ้อน ประกาศจัดระดับ High ด้วย CVSS 3.1 ที่ 7.5 และยังไม่ระบุ CVE ผลกระทบคือบริการไม่พร้อมใช้งาน ไม่ได้ระบุข้อมูลรั่วหรือการข้ามตัวกรอง ช่องโหว่นี้ยังไม่อยู่ใน KEV ฉบับ 4 พฤศจิกายน 2026
ใครโดนและรุ่นที่แก้
ช่วงรุ่นรวมคือ >=0.6.0, <2.9.1 แต่แต่ละเส้นทางเริ่มมีปัญหาคนละรุ่น ตามตารางของ ประกาศผู้พัฒนา
| เส้นทางใน league/commonmark | รุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ |
|---|---|---|
| Fenced code block | 0.6.0–2.9.0 | 2.9.1 |
| Reference link label | 0.6.0–2.9.0 | 2.9.1 |
| Emphasis / strikethrough | 2.6.0–2.9.0 | 2.9.1 |
| Highlight | 2.9.0 | 2.9.1 |
ตัวคั่น * และ _ ได้รับผลกระทบในค่าเริ่มต้น ส่วน ~ เกี่ยวข้องกับ StrikethroughExtension ซึ่งรวมอยู่ในชุด GitHub Flavored Markdown และ = เกี่ยวข้องกับ HighlightExtension แอปที่แปลงเฉพาะ Markdown ที่เชื่อถือได้ไม่เข้าข่ายถูกโจมตีจากระยะไกลตามประกาศ สาย 0.x และ 1.x หมดการสนับสนุนแล้ว ต้องย้ายไป 2.9.1 หรือใหม่กว่า
ต้องทำอะไร
ตรวจรุ่นที่ติดตั้งในโครงการ แล้วอัปเดตผ่าน Composer โดยสำรอง composer.json และ composer.lock ก่อน แม้ไม่ได้เรียกไลบรารีนี้โดยตรง ก็ควรตรวจว่า framework หรือแพ็กเกจอื่นดึงเข้ามาเป็น dependency หรือไม่ ตัวอย่างนี้ใช้เมื่อข้อกำหนด dependency อนุญาตรุ่นที่แก้แล้ว
composer show league/commonmark
composer update league/commonmark --with-all-dependencies
composer show league/commonmark
ตรวจผลลัพธ์ว่ารุ่นเป็น 2.9.1 หรือใหม่กว่าจริง หากยังติดข้อกำหนดรุ่นเก่า ต้องแก้ constraint ของโครงการหรือแพ็กเกจที่พึ่งพาก่อน แล้วทดสอบความเข้ากันได้ โดยเฉพาะการย้ายข้ามรุ่นหลัก ตรวจ diff ของ lock file และทดสอบการแปลง Markdown ก่อนนำขึ้นใช้งาน
บันทึกรุ่น 2.9.1 ระบุว่าแก้ทั้งการตรวจ code fence การค้นหา reference link และ cache ของตัวคั่น มีพฤติกรรมที่ควรทดสอบเพิ่มคือป้ายกำกับลิงก์ยาวเกิน 999 ตัวอักษร เดิมบางกรณียังจับคู่ได้หลังยุบช่องว่าง รุ่นแก้จะแสดงข้อความตามต้นฉบับแทนลิงก์
หากยังอัปเดตไม่ได้ ผู้พัฒนาแนะนำให้จำกัดความยาวแต่ละบรรทัดก่อนเข้า converter ควบคู่กับขนาดคำขอรวม โดยต้องตั้งขีดจำกัดบรรทัดให้เล็กพอจะควบคุมภาระ CPU การจำกัดเวลาทำงาน อัตราคำขอ จำนวนการแปลงพร้อมกัน และสิทธิ์ผู้ส่งช่วยลดความเสี่ยง แต่ใช้แทนแพตช์ไม่ได้
html_input, allow_unsafe_links และ max_nesting_level ไม่บรรเทาปัญหานี้ ส่วน max_delimiters_per_line ช่วยเฉพาะเส้นทางตัวคั่น และอาจทำให้การเน้นข้อความหายไป ไม่ครอบคลุม code fence หรือ reference link
ส่วนตัวผมแนะนำให้เร่งแพตช์หากเปิดรับ Markdown จากผู้ใช้ภายนอก ที่มา: GitHub Advisory GHSA-j8pm-gj4c-rq4x (https://github.com/advisories/GHSA-j8pm-gj4c-rq4x) เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
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