"league/commonmark เชิงอรรถซ้ำทำ DoS: GHSA-jfm3-95jq-q3rf"
"นักพัฒนาและผู้ดูแลระบบที่รับ Markdown จากภายนอกผ่าน FootnoteExtension ควรเร่งอัปเดตเป็น 2.9.0 หรือปิดส่วนขยายนี้ชั่วคราว"
1-minute summary
- Symptom / problem
- การอ้างอิงและกำหนดเชิงอรรถชื่อเดิมซ้ำทำให้การประมวลผลและการใช้หน่วยความจำโตแบบกำลังสองจนบริการล่มได้
- Who should read
- นักพัฒนาและผู้ดูแลระบบที่ใช้ league/commonmark รุ่นตั้งแต่ 1.5.0 ถึงก่อน 2.9.0 พร้อมเปิด FootnoteExtension รับข้อมูลที่ไม่น่าเชื่อถือ
- Fix in short
- อัปเดตเป็น 2.9.0 หรือใหม่กว่า หากยังทำไม่ได้ให้ปิด FootnoteExtension สำหรับข้อมูลที่ไม่น่าเชื่อถือ
พอดีไล่ฟีด Packagist เจอประกาศของ league/commonmark ไลบรารี PHP สำหรับแปลง Markdown เป็น HTML ผู้พัฒนาเผยแพร่ GHSA-jfm3-95jq-q3rf เมื่อ 3 สิงหาคม 2026 ปัญหาคือเชิงอรรถที่เขียนซ้ำอาจทำให้บริการล่มได้ ให้ตรวจว่าแอปเปิด FootnoteExtension และรับ Markdown จากคนนอกหรือไม่
ใครต้องทำอะไร
- นักพัฒนา: ตรวจรุ่นและการเปิดใช้ FootnoteExtension แล้วเร่งอัปเดตหากแอปรับ Markdown จากผู้ใช้ภายนอก
- ผู้ดูแลระบบ: ประสานทีมแอปให้ติดตั้งรุ่นที่แก้โดยเร็วหากบริการเปิดรับ Markdown ที่ไม่น่าเชื่อถือผ่านส่วนขยายนี้
เกิดอะไรขึ้น
เชิงอรรถมีทั้งจุดอ้างอิงในเนื้อหาและคำอธิบายท้ายเอกสาร ส่วนขยายจะสร้างลิงก์จากคำอธิบายกลับไปยังจุดอ้างอิงแต่ละแห่ง แต่ถ้าเขียนคำอธิบายชื่อเดิมซ้ำ ไลบรารีจะใส่ลิงก์ทั้งชุดให้ทุกจุด โดยไม่ตัดรายการซ้ำออก
ถ้าอ้างอิงชื่อเดียว N ครั้ง และเขียนคำอธิบายชื่อนั้น N ครั้ง จะเกิด FootnoteBackref จำนวน N × N รายการ ขนาดผลลัพธ์ เวลาประมวลผล และหน่วยความจำเลยโตแบบกำลังสอง หรือ O(N²) ข้อความสั้น ๆ ก็ทำให้เครื่องทำงานหนักได้
ประกาศยกตัวอย่างคำขอประมาณ 10 KB ที่ขยายเป็น HTML ประมาณ 62 MB ใช้ CPU ราว 3 วินาที และหน่วยความจำสูงสุดประมาณ 440 MB มากพอให้ PHP worker ที่จำกัดหน่วยความจำ 128 MB ถูกหยุดเพราะหน่วยความจำไม่พอ ตัวเลขนี้เป็นตัวอย่างในประกาศ ไม่ใช่ค่าตายตัวของทุกระบบ ผลกระทบที่ระบุคือความพร้อมใช้งาน ไม่มีผลต่อความลับหรือความถูกต้องของข้อมูล และผู้โจมตีไม่ต้องยืนยันตัวตน
ช่องโหว่นี้ได้ระดับ High คะแนน CVSS 3.1 เท่ากับ 7.5 โดยหน้า GitHub Advisory Database ยังไม่ระบุหมายเลข CVE ส่วนขยายเชิงอรรถต้องถูกลงทะเบียนใน Environment ก่อน เส้นทางที่มีปัญหาถึงจะทำงานได้
ใครโดนและรุ่นที่แก้
| แพ็กเกจ / ช่วงรุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ |
|---|---|
| league/commonmark ตั้งแต่ 1.5.0 ถึงก่อน 2.9.0 | 2.9.0 |
ข้อมูลช่วงรุ่นไม่ตรงกัน: ช่อง Affected versions ใน ประกาศผู้พัฒนา ระบุ >=1.5.0, <2.8.4 แต่คำอธิบายในหน้าเดียวกันบอกว่ากระทบถึงสาย 2.8.x ส่วน GitHub Advisory Database ระบุ >=1.5.0, <2.9.0 ตารางนี้ใช้ช่วงหลัง ทั้งสองหน้าระบุรุ่นแก้เป็น 2.9.0 ตรงกัน
Release notes ของ 2.9.0 ระบุว่าให้ใช้คำอธิบายแรกของเชิงอรรถแต่ละชื่อ และตัดคำอธิบายที่ซ้ำออก
ต้องทำอะไร
ตรวจรุ่นในโครงการและโค้ดที่ตั้งค่า Markdown converter ก่อน ถ้าโครงการใช้แพ็กเกจนี้เป็น dependency โดยตรง ให้ทดสอบอัปเดตด้วยคำสั่งต่อไปนี้ตามเอกสาร Composer
composer show league/commonmark
composer require "league/commonmark:^2.9" -W
composer show league/commonmark
composer audit
หากแพ็กเกจถูกดึงมาผ่านเฟรมเวิร์กหรือ dependency อื่น ให้ตรวจข้อกำหนดของแพ็กเกจแม่และอัปเดตตามช่องทางที่รองรับ การย้ายจาก 1.x ไป 2.x ควรตรวจความเข้ากันได้ด้วย หลังอัปเดตให้ยืนยันรุ่นที่ติดตั้งจริง ทดสอบการแปลง Markdown และการแสดงเชิงอรรถตามปกติ รวมถึงตรวจการเปลี่ยนแปลงของ composer.json และ composer.lock ก่อนนำไป deploy
ผู้พัฒนาแนะนำให้ปิด FootnoteExtension เมื่อรับข้อมูลที่ไม่น่าเชื่อถือ อีกทางคือจำกัดขนาดข้อความก่อนแปลงให้เล็กมาก แต่การจำกัดขนาดอย่างเดียวอาจไม่พอ เพราะข้อความประมาณ 10 KB ก็ทำให้ใช้ทรัพยากรสูงได้ ไลบรารีไม่มีตัวเลือกจำกัดจำนวนเชิงอรรถ จุดอ้างอิง หรือคำอธิบาย
ส่วนตัวผมมองว่าถ้าเปิดรับ Markdown จากภายนอกพร้อมเชิงอรรถ ควรเร่งแพตช์หรือปิดส่วนขยายระหว่างรออัปเดต ที่มา: GitHub Security Advisory GHSA-jfm3-95jq-q3rf เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
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