"league/commonmark ตารางทำ DoS: GHSA-3q6v-r5mr-hxv8"
"เว็บที่รับ Markdown จากภายนอกและเปิด Table extension ควรเร่งอัปเดต league/commonmark เป็น 2.10.2"
1-minute summary
- Symptom / problem
- การตรวจจุดเริ่มต้นตารางสแกนย่อหน้าเดิมซ้ำ ทำให้ใช้ CPU เพิ่มแบบกำลังสองและอาจทำให้บริการหยุดตอบสนอง
- Who should read
- แอปที่ใช้ league/commonmark รุ่น 2.0.0–2.10.1 พร้อม GithubFlavoredMarkdownConverter หรือเปิด TableExtension กับข้อมูลที่ไม่น่าเชื่อถือ
- Fix in short
- อัปเดตเป็น 2.10.2 ระหว่างรอให้จำกัดขนาด Markdown หรือปิด Table extension สำหรับข้อมูลจากภายนอก
พอดีไล่ฟีด Packagist เจอประกาศของ league/commonmark ไลบรารีแปลง Markdown ใน PHP ที่มีช่องโหว่ในส่วนขยายตาราง GitHub Flavored Markdown ประเด็นคือข้อความที่ส่งมาแปลงอาจกิน CPU มากผิดสัดส่วน จนเว็บไม่พร้อมให้บริการ ประกาศ GHSA-3q6v-r5mr-hxv8 อยู่ในระดับ High คะแนน CVSS 3.1 เท่ากับ 7.5 และยังไม่มีหมายเลข CVE ระบุไว้
เกิดอะไรขึ้น
เมื่อรับบรรทัดใหม่ TableStartParser::tryStart() จะอ่านทั้งย่อหน้าซ้ำเพื่อหาเครื่องหมาย pipe ยิ่งย่อหน้ายาวก็ยิ่งทำงานซ้ำมาก งานรวมเลยโตแบบกำลังสอง หรือ O(n²) แม้ข้อความนั้นจะไม่ใช่ตารางก็ตาม commit แก้ไข อธิบายว่ามีเพียงบรรทัดสุดท้ายของย่อหน้าที่เป็นหัวตารางได้ แพตช์เลยจำกัดการตรวจเบื้องต้นไว้ที่บรรทัดนั้น แทนการค้นหาทั้งย่อหน้า
ผลกระทบตามประกาศคือผู้โจมตีจากเครือข่ายที่ไม่ต้องยืนยันตัวตน สามารถส่ง Markdown ที่จัดรูปแบบมาเฉพาะให้ใช้ CPU จน PHP worker ไม่ว่างรับงานอื่นได้ ความเสียหายอยู่ที่ความพร้อมใช้งาน ประกาศไม่ได้ระบุผลกระทบต่อความลับหรือความถูกต้องของข้อมูล เงื่อนไขสำคัญคือแอปต้องแปลงข้อมูลที่ไม่น่าเชื่อถือและเปิดส่วนขยายตาราง แค่มีแพ็กเกจอยู่ในโครงการยังบอกไม่ได้ว่าเสี่ยง ต้องดูว่าแอปเรียกใช้ส่วนนี้กับข้อมูลจากใคร
ใครโดนและรุ่นที่แก้
กลุ่มที่ต้องตรวจคือเว็บที่ใช้ GithubFlavoredMarkdownConverter ซึ่งเปิดตารางในชุด GFM หรือกำหนด TableExtension เอง แล้วรับข้อความจากผู้ใช้มาประมวลผล ช่วงรุ่นและรุ่นแก้ไขในประกาศต้นทาง เป็นดังนี้
| แพ็กเกจ / การใช้งาน | รุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ |
|---|---|---|
| league/commonmark พร้อม Table extension | ตั้งแต่ 2.0.0 ถึง 2.10.1 | 2.10.2 |
เนื้อหารายงานเดิมในหน้าประกาศยังเขียนว่าไม่มีแพตช์ แต่ช่อง Patched versions ระบุ 2.10.2 และ release 2.10.2 ยืนยันว่าแก้การแปลงย่อหน้ายาวที่ใช้เวลาแบบกำลังสองเมื่อเปิด Table extension แล้ว ให้ยึดข้อมูลแพตช์ที่ยืนยันตรงกันนี้ในการวางแผนอัปเดต
ต้องทำอะไร
เริ่มจากตรวจรุ่นที่ติดตั้งและการตั้งค่า converter ในโครงการ สำรอง composer.json กับ composer.lock แล้วทดลองอัปเดตในสภาพแวดล้อมทดสอบก่อน คำสั่งตัวอย่างนี้กำหนดรุ่นเป้าหมายไว้ที่รุ่นแก้ไขของประกาศ และเปิดให้ Composer ขยับ dependency ที่เกี่ยวข้องได้ตามข้อกำหนดเดิม
composer show league/commonmark
composer update league/commonmark:2.10.2 --with-all-dependencies
composer show league/commonmark
composer audit
ตามคู่มือ Composer การอัปเดตแบบระบุแพ็กเกจและรุ่นชั่วคราวยังต้องอยู่ภายใต้ constraint ใน composer.json ถ้าคำสั่งติดข้อจำกัด ให้ตรวจแพ็กเกจที่บังคับรุ่นก่อนเปลี่ยน dependency และตรวจ diff ของ lock file หลังอัปเดตด้วย เมื่อผ่านการทดสอบแล้วค่อยนำ lock file ชุดที่ตรวจแล้วเข้าสู่ขั้นตอน deploy ของโครงการ
ควรทดสอบทั้งย่อหน้าปกติและตารางที่แอปใช้งานจริง เพราะ release เดียวกันปรับการตรวจตารางให้ตรงกับข้อกำหนด GFM ด้วย เช่น จำนวนเซลล์หัวตารางต้องเท่ากับแถวคั่น การตรวจผลลัพธ์ HTML หลังอัปเดตช่วยให้เห็นความเปลี่ยนแปลงด้านการแสดงผลก่อนเปิดใช้งาน
ประกาศเสนอให้จำกัดขนาด Markdown ที่รับมาแปลง หรือปิด Table extension สำหรับข้อมูลที่ไม่น่าเชื่อถือ เป็นการลดความเสี่ยงชั่วคราวและยังไม่แก้สาเหตุในโค้ด
ส่วนตัวผมแนะนำให้เร่งแพตช์เว็บที่เปิดรับ Markdown จากภายนอกและใช้ตาราง เพราะเป็นเส้นทางที่กระทบความพร้อมให้บริการได้โดยตรง ที่มา: GitHub Security Advisory GHSA-3q6v-r5mr-hxv8 หากมีรายละเอียดจากผู้ดูแลเพิ่มเติม เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
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