EST. 2026 — Notes from real server work SYSADMIN · SECURITY · AI · DIRECTADMIN Issue 01
THE SYSADMIN ALMANAC
Home / Security Notice / league/commonmark หลุดกรอง HTML GHSA-97jj-33gv-5xf9
Security Notice

league/commonmark หลุดกรอง HTML GHSA-97jj-33gv-5xf9

by Ton-Or ·30 Sep 2026·3 min read
league/commonmark หลุดกรอง HTML GHSA-97jj-33gv-5xf9

เว็บที่รับ Markdown จากผู้ใช้ที่ไม่เชื่อถือและเปิด raw HTML พร้อม DisallowedRawHtml ควรเร่งอัปเดตเป็น 2.10.2 หรือปิดการรับ HTML ระหว่างรอแพตช์

1-minute summary

Symptom / problem
ชื่อแท็กต้องห้ามที่อยู่ท้าย raw HTML อาจผ่านตัวกรองและนำไปสู่ stored XSS
Who should read
แอป PHP ที่ใช้ league/commonmark รุ่น 1.3.0 ถึง 2.10.1 และเข้าเงื่อนไขการรับ Markdown กับ raw HTML ตามประกาศ
Fix in short
อัปเดตเป็น 2.10.2 หรือใช้ html_input แบบ escape หรือ strip เพื่อปิดช่องทางนี้ระหว่างรออัปเดต
Jump to steps

พอดีไล่ฟีดความปลอดภัยเจอประกาศของ league/commonmark ไลบรารีแปลง Markdown เป็น HTML สำหรับ PHP เรื่องตัวกรอง DisallowedRawHtml ที่ยังปล่อยแท็กต้องห้ามบางรูปแบบผ่านได้ GitHub Advisory Database เพิ่มรายการ GHSA-97jj-33gv-5xf9 เมื่อ 30 กันยายน 2026 ระดับ Moderate หรือปานกลาง คะแนน CVSS 3.1 เท่ากับ 6.1/10 หน้าประกาศยังไม่ระบุ CVE ผู้ดูแลต้องตรวจทั้งการตั้งค่าตัวแปลงและแหล่งที่มาของ Markdown (ประกาศต้นทาง)

30/09/2026วันที่ลงฐานประกาศ
6.1/10CVSS 3.1 ปานกลาง
XSSสคริปต์แฝงในเนื้อหา
2.10.2รุ่นที่แก้แล้ว

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

ตัวกรองใช้ regular expression ตรวจชื่อแท็กต้องห้าม โดยต้องมีอักขระตามหลังชื่อแท็กอีกหนึ่งตัว แต่ตัวแยกบล็อก HTML ยอมรับกรณีชื่อแท็กจบตรงท้ายบรรทัดได้ ถ้า raw HTML จบตรงชื่อแท็กพอดี ตัวกรองจะหาไม่เจอและปล่อยเครื่องหมายเปิดแท็กผ่านไป เบราว์เซอร์อาจอ่านเนื้อหาบล็อกถัดไปเป็น attributes ของแท็กเดิมได้

ผลตามประกาศคือ stored XSS: ผู้ที่โพสต์ Markdown ได้อาจฝากเนื้อหาที่ทำให้สคริปต์ทำงานเมื่อคนอื่นเปิดอ่านหน้าเว็บ เงื่อนไขต้องมาพร้อมกันคือ html_input เป็น allow ซึ่งเป็นค่าเริ่มต้น เปิดส่วนขยาย DisallowedRawHtml และรับ Markdown จากผู้ใช้ที่ไม่เชื่อถือ โดยส่วนขยาย GitHub-Flavored Markdown เปิดตัวกรองนี้ให้อัตโนมัติ (รายละเอียดจากผู้พัฒนา)

ใครโดนและรุ่นที่แก้

ประกาศระบุช่วงรุ่นที่ได้รับผลกระทบตั้งแต่ 1.3.0 ถึง 2.10.1 รวมปลายช่วงทั้งสองด้าน และระบุรุ่นแพตช์ไว้ดังนี้

แพ็กเกจและช่วงรุ่นที่มีปัญหา รุ่นที่แก้ตามประกาศ
league/commonmark ตั้งแต่ 1.3.0 ถึง 2.10.1 2.10.2

สำหรับโปรเจกต์ที่ยังอยู่สาย 1.x ตารางนี้ไม่ได้หมายความว่าเปลี่ยนเลขรุ่นแล้วใช้งานต่อได้ทันที ควรตรวจความเข้ากันได้ก่อนย้ายสาย ส่วน บันทึกรุ่น 2.10.2 ยืนยันว่าแก้กรณี raw HTML จบด้วยชื่อแท็กต้องห้ามแล้ว

ต้องทำอะไร

เริ่มตรวจรุ่นที่ติดตั้งจริงจากโฟลเดอร์โปรเจกต์ สำรอง composer.json กับ composer.lock แล้วทดสอบอัปเดตในสภาพแวดล้อมทดสอบ ตัวอย่างนี้ใช้กับโปรเจกต์สาย 2.x ที่ข้อกำหนด dependency อนุญาตรุ่น 2.10.2 ขึ้นไป โดยจำกัดการเลือกรุ่นให้อยู่สาย 2.x และเปิดให้ Composer ขยับ dependency ที่เกี่ยวข้องได้

composer show league/commonmark
composer update "league/commonmark:^2.10.2" --with-all-dependencies
composer show league/commonmark
composer audit

หาก Composer แจ้งว่าข้อกำหนดรุ่นขัดกัน ให้ตรวจ dependency และข้อกำหนดใน composer.json ก่อน เพราะ constraint ชั่วคราวในคำสั่ง update ต้องอยู่ภายใน constraint เดิม หลังอัปเดตให้ตรวจรุ่นซ้ำ ทดสอบเส้นทางรับและแสดง Markdown รวมถึงเนื้อหาปกติที่ต้องใช้ HTML แล้วนำ composer.lock ที่ทดสอบผ่านไปใช้ในขั้นตอน deploy (คู่มือคำสั่ง Composer)

ทางแก้ชั่วคราวจากประกาศ

ตั้ง html_input เป็น escape หรือ strip เพื่อปิดช่องทางนี้ระหว่างรออัปเดต โดยตรวจผลกับเนื้อหาที่ต้องใช้ HTML ก่อนนำไปใช้จริง

escape ทำให้ HTML ที่รับมาแสดงเป็นข้อความ ส่วน strip ตัด HTML ออกจากอินพุต คู่มือผู้พัฒนาแนะนำตัวเลือกเหล่านี้เมื่อรับ Markdown จากแหล่งที่ไม่เชื่อถือ เลือกว่าจะให้เห็น HTML เป็นข้อความ หรือตัด HTML ทิ้ง (คู่มือความปลอดภัย CommonMark)

ส่วนตัวผมให้เร่งแพตช์เว็บที่เข้าเงื่อนไขรับ Markdown จากผู้ใช้ที่ไม่เชื่อถือ เพราะเนื้อหาที่บันทึกไว้ถูกเปิดอ่านซ้ำได้ ที่มา: GitHub Advisory Database — GHSA-97jj-33gv-5xf9 (https://github.com/advisories/GHSA-97jj-33gv-5xf9) หากมีรายละเอียดเพิ่มเติมจากผู้พัฒนา เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ

Want us to set this up?

Get help with server setup, configuration, migration, or troubleshooting. Save time for the work that matters.

Get a quote

Hit something like this? Stuck somewhere?

Come trade notes on the LinuxThai board

→ Continue on the board

Comments 0

No comments yet — be the first