เปิดโปงช่องโหว่ Brotli: ระเบิดเวลาในโลก Node.js ที่ซ่อนอยู่กว่า 8 ปี

เปิดโปงช่องโหว่ Brotli: ระเบิดเวลาในโลก Node.js ที่ซ่อนอยู่กว่า 8 ปี

ในโลกของการพัฒนาเว็บที่ก้าวหน้าอย่างรวดเร็ว มีหลายครั้งที่ความสะดวกสบายและประสิทธิภาพมาพร้อมกับความเสี่ยงที่ไม่คาดคิด หนึ่งในนั้นคือการบีบอัดข้อมูล ซึ่งเป็นเทคนิคสำคัญที่ช่วยให้เว็บไซต์โหลดเร็วขึ้นและประหยัดแบนด์วิดท์ แต่ใครจะคิดว่าการบีบอัดข้อมูลยอดนิยมอย่าง Brotli กลับซ่อนช่องโหว่ร้ายแรงที่อาจทำให้ระบบล่มได้โดยง่าย โดยเฉพาะอย่างยิ่งในแอปพลิเคชันที่สร้างด้วย Node.js และ Express.js

นี่คือเรื่องราวของช่องโหว่ที่เปรียบเสมือนระเบิดเวลาดิจิทัล ซึ่งถูกค้นพบและถูกมองข้ามมานานนับแปดปี

เมื่อการบีบอัดข้อมูลกลายเป็นดาบสองคม

Brotli เป็นอัลกอริทึมการบีบอัดข้อมูลแบบไม่สูญเสียที่ Google พัฒนาขึ้น มีประสิทธิภาพสูงกว่า gzip ทำให้ไฟล์มีขนาดเล็กลงอย่างเห็นได้ชัดและช่วยให้ประสบการณ์การใช้งานของผู้ใช้ดีขึ้น จึงได้รับความนิยมอย่างกว้างขวางในเว็บสมัยใหม่

อย่างไรก็ตาม มีการค้นพบช่องโหว่ร้ายแรงในส่วนของการคลายการบีบอัดข้อมูลของ Brotli (CVE-2023-45143) จุดที่น่ากังวลคือ ตัวการบีบอัดข้อมูลเองไม่ได้มีปัญหา แต่ปัญหาอยู่ที่ กระบวนการคลายการบีบอัด

ลองนึกภาพว่ามีคนส่งกล่องพัสดุขนาดเล็กมาให้ แต่เมื่อเปิดออก กล่องนั้นกลับขยายตัวออกจนใหญ่โตมโหฬาร เต็มห้องไปหมด นี่คือสิ่งที่เกิดขึ้น ช่องโหว่นี้อนุญาตให้ผู้ไม่หวังดีส่งข้อมูลที่บีบอัดมาเพียงเล็กน้อย แต่เมื่อถูกคลายการบีบอัด ข้อมูลเหล่านั้นจะพองตัวเป็นขนาดมหาศาล ซึ่งอาจนำไปสู่ปัญหาใหญ่ได้

Node.js และ Express.js กับช่องโหว่ที่ไม่ควรมองข้าม

ความซับซ้อนของปัญหาไม่ได้หยุดอยู่แค่ที่ตัว Brotli เอง แต่กลับส่งผลกระทบอย่างรุนแรงต่อแอปพลิเคชัน Node.js โดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับเฟรมเวิร์ก Express.js

โดยปกติแล้ว HTTP เซิร์ฟเวอร์ใน Node.js มีความสามารถในการจัดการกับหัวข้อ Content-Encoding ซึ่งหมายความว่าหากมีการส่งข้อมูลที่บีบอัดด้วย Brotli มายังเซิร์ฟเวอร์ Node.js จะพยายามคลายการบีบอัดให้โดยอัตโนมัติ

แต่ปัญหามันอยู่ที่ จังหวะเวลา ใน Express.js มิดเดิลแวร์ยอดนิยมอย่าง express.json() หรือ express.urlencoded() ซึ่งใช้สำหรับวิเคราะห์และแปลงข้อมูลในส่วนของเนื้อหาคำขอ (request body) จะทำงาน หลังจาก ที่ Node.js ได้ทำการคลายการบีบอัดข้อมูล Brotli ไปแล้ว นั่นหมายความว่า หากมีไฟล์ Brotli ที่ถูกประดิษฐ์ขึ้นมาอย่างไม่เหมาะสมและส่งมายังเซิร์ฟเวอร์ ระบบจะคลายการบีบอัดจนขยายตัวเป็นข้อมูลขนาดใหญ่ก่อนที่จะถึงมิดเดิลแวร์เหล่านี้ด้วยซ้ำ

ผลกระทบโดยตรงที่ตามมาคือ การโจมตีแบบปฏิเสธการให้บริการ (Denial of Service – DoS) ระบบจะถูกบังคับให้ใช้หน่วยความจำและ CPU อย่างมหาศาลเพื่อประมวลผลข้อมูลที่พองตัวเหล่านั้นจนหมดสิ้น ทำให้แอปพลิเคชันหรือเซิร์ฟเวอร์ล่มและไม่สามารถให้บริการได้

ในกรณีที่ร้ายแรงกว่านั้น หากข้อมูลที่ขยายตัวอย่างมหาศาลนั้นถูกส่งต่อไปยังส่วนประกอบอื่นของระบบที่มีช่องโหว่ เช่น ไลบรารีสำหรับประมวลผลรูปภาพ หรือ XML parser ที่มีข้อบกพร่อง มันอาจนำไปสู่ การรันโค้ดจากระยะไกล (Remote Code Execution – RCE) ซึ่งผู้ไม่หวังดีสามารถควบคุมเซิร์ฟเวอร์ได้เลยทีเดียว เหตุการณ์นี้คล้ายคลึงกับช่องโหว่ PHP2Shell ที่เคยเกิดขึ้นกับ PHP ในอดีต ซึ่งเป็นการหลีกเลี่ยงการตรวจสอบความปลอดภัยโดยการใช้การบีบอัดข้อมูล

แนวทางป้องกันและลดความเสี่ยง

การรับมือกับช่องโหว่นี้จำเป็นต้องมีแนวทางที่รัดกุม เพื่อให้แอปพลิเคชันและเซิร์ฟเวอร์มีความปลอดภัย ผู้พัฒนาควรพิจารณาดำเนินการดังต่อไปนี้:

สิ่งแรกที่สำคัญคือการ อัปเดตไลบรารี ที่เกี่ยวข้องกับการคลายการบีบอัด Brotli ให้เป็นเวอร์ชันล่าสุด เพราะโดยส่วนใหญ่ช่องโหว่จะได้รับการแก้ไขแล้ว

ควรใช้ Web Application Firewall (WAF) หรือ Content Delivery Network (CDN) ที่สามารถบล็อกคำขอที่มี Content-Encoding แบบ Brotli หรือจำกัดขนาดของเนื้อหาคำขอ ก่อน ที่จะถึงตัวแอปพลิเคชันโดยตรง ซึ่งเป็นด่านหน้าในการป้องกันที่ดี

หากมีความจำเป็นต้องใช้ Brotli จริง ๆ ควรหลีกเลี่ยงการพึ่งพาการคลายการบีบอัดอัตโนมัติของเซิร์ฟเวอร์ Node.js แต่ให้ จัดการการคลายการบีบอัดด้วยตัวเอง ในระดับแอปพลิเคชัน โดยมีการตรวจสอบขนาดหรือความถูกต้องของข้อมูล ก่อน ที่จะทำการคลายการบีบอัดเสมอ

นอกจากนี้ การใช้มิดเดิลแวร์ที่ช่วยให้สามารถอ่าน เนื้อหาคำขอแบบดิบ (raw body) ได้ก่อนที่จะมีการวิเคราะห์หรือคลายการบีบอัด ก็เป็นอีกวิธีที่ช่วยให้สามารถตรวจสอบขนาดของข้อมูลได้ตั้งแต่ต้น ทำให้มีโอกาสปฏิเสธคำขอที่เป็นอันตรายก่อนที่จะก่อให้เกิดปัญหาได้

การเพิ่ม การตั้งค่าขีดจำกัด ของหน่วยความจำหรือขนาดคำขอในระดับเซิร์ฟเวอร์หรือในส่วนของการกำหนดค่าของ Node.js (สำหรับเวอร์ชันที่รองรับ) ก็เป็นสิ่งที่ไม่ควรมองข้าม เพื่อป้องกันไม่ให้ข้อมูลที่พองตัวนั้นใช้ทรัพยากรมากเกินไป

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