EST. 2026 — บันทึกงานเซิร์ฟเวอร์จริง SYSADMIN · SECURITY · AI · DIRECTADMIN เล่มที่ 01
THE SYSADMIN ALMANAC
หน้าหลัก / Security Notice / league/commonmark เสี่ยง DoS ผ่าน Markdown GHSA-j8pm-gj4c-rq4x
Security Notice

league/commonmark เสี่ยง DoS ผ่าน Markdown GHSA-j8pm-gj4c-rq4x

โดย Ton-Or ·2 ก.ย. 2026·อ่าน 4 นาที
league/commonmark เสี่ยง DoS ผ่าน Markdown GHSA-j8pm-gj4c-rq4x

ผู้ดูแลแอป PHP ที่ใช้ league/commonmark แปลง Markdown จากผู้ใช้ที่ไม่เชื่อถือควรเร่งอัปเดตเป็น 2.9.1 หรือใหม่กว่า

สรุปใน 1 นาที

อาการ/ปัญหา
Markdown ที่ออกแบบมาเป็นพิเศษทำให้ parser ใช้ CPU สูงจนคำขอปกติทำงานต่อไม่ได้
ใครควรอ่าน
แอปที่ใช้ league/commonmark ตั้งแต่ 0.6.0 ถึงก่อน 2.9.1 และเปิดรับ Markdown จากผู้ใช้ที่ไม่เชื่อถือ
ทางแก้แบบสั้น
อัปเดตเป็น 2.9.1 หรือใหม่กว่า ระหว่างรอให้จำกัดความยาวแต่ละบรรทัดควบคู่กับขนาดคำขอ
ข้ามไปขั้นตอน

พอดีไล่ฟีด security เจอ ประกาศ GHSA-j8pm-gj4c-rq4x ของ league/commonmark ไลบรารีแปลง Markdown สำหรับ PHP ประเด็นนี้เป็น denial of service หรือ DoS จากการประมวลผลข้อความ ไม่ต้องติดตั้งส่วนขยายก็เข้าถึงเส้นทางที่มีปัญหาได้ ระบบที่รับ Markdown จากบุคคลภายนอกควรตรวจ dependency เพราะคำขอขนาดไม่มากอาจใช้ CPU เกินสัดส่วน

Highระดับความรุนแรง
7.5CVSS 3.1
2.9.1รุ่นที่แก้แล้ว

เกิดอะไรขึ้น

ประกาศผู้พัฒนาเผยแพร่วันที่ 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) เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ

อยากให้เราทำให้ไหม?

ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า

คุยเรื่องงานกับเรา

เคยเจองานแบบนี้ไหม? ติดตรงไหน?

มาแลกวิธีกันต่อในบอร์ด LinuxThai

→ คุยต่อในบอร์ด

ความคิดเห็น 0

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