league/commonmark ข้ามตัวกรองลิงก์เสี่ยง CVE-2026-71478
นักพัฒนาและผู้ดูแลระบบที่เปิด AttributesExtension รับ Markdown จากผู้ใช้ควรเร่งอัปเดต league/commonmark เป็นรุ่นที่แก้ไขแล้ว
1-minute summary
- Symptom / problem
- ไบต์ควบคุมใน URL ช่วยให้ลิงก์อันตรายผ่านตัวกรองและนำไปสู่ XSS ได้
- Who should read
- นักพัฒนาและผู้ดูแลระบบที่ใช้ league/commonmark รุ่น 1.5.0–2.8.3 พร้อม AttributesExtension กับข้อมูลที่ไม่เชื่อถือ
- Fix in short
- อัปเดตเป็น 2.9.0 ซึ่งเป็นรุ่นแก้ไขตามประกาศ แล้วทดสอบการแสดง Markdown และตรวจรุ่นที่นำขึ้นใช้งานจริง
พอดีไล่ฟีดความปลอดภัยเจอประกาศ league/commonmark วันที่ 3 สิงหาคม 2026 เป็นไลบรารี PHP ที่แปลง Markdown เป็น HTML ช่องโหว่ CVE-2026-71478 หรือ GHSA-29pj-957v-52mc ทำให้ข้ามตัวกรองลิงก์ของ AttributesExtension ได้ แอปที่รับข้อความจากผู้ใช้ภายนอกยังเสี่ยง แม้ตั้ง allow_unsafe_links => false แล้ว
ใครต้องทำอะไร
- นักพัฒนา: ถ้าเปิด AttributesExtension เพื่อรับ Markdown จากผู้ใช้ ให้เร่งอัปเดตไลบรารีเป็นรุ่นที่แก้แล้วและทดสอบก่อนนำขึ้นใช้งาน
- ผู้ดูแลระบบ: ถ้าดูแลแอปที่ใช้ไลบรารีในเงื่อนไขนี้ ให้ประสานทีมพัฒนาเร่งนำรุ่นแก้ไขขึ้นระบบและตรวจรุ่นที่ติดตั้งจริง
เกิดอะไรขึ้น
ส่วนขยายนี้ให้ผู้เขียน Markdown กำหนดแอตทริบิวต์ HTML ได้ ปัญหาคือตัวกรอง href และ src ตรวจต้น URL โดยยังไม่ได้จัดการอักขระควบคุมแบบที่เบราว์เซอร์ทำ ลิงก์อันตรายบางรูปแบบเลยผ่านตัวกรอง
แท็บและอักขระขึ้นบรรทัดใหม่ที่แทรกในชื่อโพรโทคอล รวมถึงอักขระควบคุม C0 บางตัวที่อยู่ด้านหน้า ถูกเบราว์เซอร์ตัดทิ้งก่อนอ่านโพรโทคอล ลิงก์ที่ผ่านตัวกรองมาแล้วเลยกลับถูกอ่านเป็น javascript: และอาจรันสคริปต์ในบริบทของเว็บเมื่อเหยื่อคลิกลิงก์ นี่คือความเสี่ยง XSS ซึ่งอาจกระทบข้อมูลหรือบัญชีผู้ใช้ ไม่ใช่การรันคำสั่งบนเซิร์ฟเวอร์โดยตรง
ประกาศให้ระดับ Moderate และ CVSS 3.1 เท่ากับ 6.1 ผู้ใช้ต้องเปิดหรือคลิกลิงก์ด้วย ช่องโหว่นี้มีข้อจำกัด: การใส่ href ให้ส่วนที่ไม่ใช่ลิงก์ไม่ได้ทำให้เกิด XSS เอง ส่วน <img src> ไม่ได้รับผลในกรณีนี้ เพราะตัวแสดงภาพเขียนค่า src ทับจาก URL หลัก อ่านได้ใน ประกาศช่องโหว่
ใครโดนและรุ่นที่แก้
| แพ็กเกจ | รุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ตามประกาศ |
|---|---|---|
league/commonmark ผ่าน Composer |
ตั้งแต่ 1.5.0 ถึง 2.8.3 รวมปลายช่วง | 2.9.0 |
ตารางยึดช่อง Affected versions ใน advisory แต่คำอธิบายของระเบียน CVE ใช้ช่วงตั้งแต่ 1.5.0 ถึงก่อน 2.9.0 ซึ่งระบุขอบบนต่างกัน รุ่นแก้ที่ทั้งสองแหล่งยืนยันคือ 2.9.0
ต้องตรวจด้วยว่าเปิด AttributesExtension รับข้อความจากผู้ใช้ภายนอกหรือไม่ ประกาศไม่ได้ให้แพตช์แยกสำหรับสาย 1.x ส่วน บันทึกรุ่น 2.9.0 ยืนยันการแก้ตัวกรองนี้แล้ว
แพตช์แก้ด้วยการลบแท็บและอักขระขึ้นบรรทัดใหม่ พร้อมตัดอักขระควบคุมด้านหน้า ก่อนตรวจความอันตรายของโพรโทคอล โดยทำในฟังก์ชันตรวจ URL ส่วนกลาง เพื่อให้จุดเรียกใช้อื่นได้รับการป้องกันด้วย ดูได้จาก การเปลี่ยนแปลงต้นทาง
ต้องทำอะไร
เริ่มจากตรวจรุ่นในโครงการ สำรองไฟล์ dependency และทดสอบการอัปเดตในสภาพแวดล้อมทดสอบก่อน สำหรับโครงการที่ข้อกำหนดรุ่นอนุญาตให้ไป 2.9.0 ได้ ใช้คำสั่งต่อไปนี้จากโฟลเดอร์โครงการ แล้วตรวจว่ารุ่นหลังอัปเดตพ้นช่วงที่ได้รับผลกระทบจริง
composer show league/commonmark
composer update league/commonmark --with-all-dependencies
composer show league/commonmark
composer audit
Composer ยังเลือกรุ่นตามข้อกำหนดใน composer.json ถ้าตรึงไว้ที่ 1.x หรือแพ็กเกจอื่นบังคับรุ่นเก่า ต้องแก้ข้อกำหนดหรืออัปเดตแพ็กเกจนั้นก่อน คำสั่งทำงานจบไม่ได้แปลว่าได้รุ่นแก้แล้ว ให้ตรวจเลขรุ่นและรายการ dependency ที่เปลี่ยนด้วย เพราะตัวเลือกนี้อัปเดต dependency ที่เกี่ยวข้องได้ ตาม คู่มือ Composer
หลังทดสอบให้เก็บ composer.lock ที่อัปเดตแล้วและนำชุด dependency เดียวกันขึ้นใช้งาน ตรวจหน้าแสดง Markdown โดยเฉพาะลิงก์และแอตทริบิวต์ที่แอปอนุญาต ประกาศไม่ได้ให้ workaround แยกไว้ และการตั้ง allow_unsafe_links => false เพียงอย่างเดียวใช้แทนแพตช์นี้ไม่ได้
ส่วนตัวผมให้เร่งแพตช์ถ้าเว็บเปิดรับ Markdown จากผู้ใช้พร้อมส่วนขยายนี้ เพราะการตั้งค่าปิดลิงก์อันตรายเดิมยังกันช่องโหว่นี้ไม่ครบ ที่มา: GitHub Security Advisory (GHSA-29pj-957v-52mc) หากมีรายละเอียดเพิ่มเติม เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
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