Web::Simple 0.035 แก้ CVE-2026-114629 ป้องกัน Content-Length ใช้หน่วยความจำเกิน
Web::Simple ก่อน 0.035 อาจจัดสรรหน่วยความจำตาม Content-Length ของแบบฟอร์มโดยไม่จำกัด ผู้ส่งคำขอที่ไม่ต้องล็อกอินอาจทำให้บริการล้มได้
Web::Simple 0.035 จำกัดขนาด body ป้องกัน Content-Length ทำให้หน่วยความจำหมด
ผู้ดูแลแอปพลิเคชัน Perl ที่ใช้ Web::Simple ควรตรวจเวอร์ชันของโมดูล หลังมีการเปิดเผย CVE-2026-114629 ซึ่งกระทบ Web::Simple ก่อน 0.035 ปัญหาเกิดในการอ่าน application/x-www-form-urlencoded request body: โค้ดเดิมใช้ค่า Content-Length ที่ผู้ส่งคำขอประกาศเพื่อกำหนดขนาดการอ่านในครั้งเดียว โดยไม่มีเพดานขนาดและไม่ได้ตรวจผลลัพธ์ของการอ่านให้เพียงพอ ผู้ส่งคำขอที่ไม่ต้องล็อกอินอาจระบุความยาวสูงมาก แม้ส่ง body จริงเพียงสั้น ๆ ทำให้ process ใช้หน่วยความจำเกินควรหรือบริการไม่พร้อมใช้งาน
วันเปิดเผยและรุ่นที่แก้
แพตช์ในคลังซอร์สของ Web::Simple เผยแพร่เมื่อวันที่ 23 ตุลาคม 2026 เวลา 19:37 UTC และมีข้อความ commit ระบุ CVE-2026-114629 โดยตรง Web-Simple 0.035 บน MetaCPAN เผยแพร่เมื่อวันที่ 23 ตุลาคม 2026 เวลา 19:49 UTC บันทึกการเปลี่ยนแปลงระบุว่าอ่าน body แบบแบ่งช่วงและเพิ่มขนาดสูงสุดเริ่มต้น 8 MiB ส่วนระเบียน CVE เผยแพร่ครั้งแรกวันที่ 24 ตุลาคม 2026 เวลา 13:50 UTC เวลาที่ระบุเป็น UTC เพื่อให้เทียบข้อมูลต้นทางได้
จุดที่เกิดปัญหา
คำอธิบาย CVE ระบุเมธอด Web::Dispatch::ParamParser::get_unpacked_body_from เป็นจุดรับ body สำหรับข้อมูลแบบฟอร์ม โค้ดเดิมเรียก read หนึ่งครั้งด้วยความยาวที่ได้จาก Content-Length และไม่มีเพดานบังคับ ฝั่ง Perl อาจขยายบัฟเฟอร์ตามขนาดที่ขออ่านก่อนจะได้รับข้อมูลครบจริง ผลคือคำขอที่มี body สั้นแต่ประกาศความยาวสูงมากยังสร้างภาระหน่วยความจำได้ การเชื่อมโยงระหว่างค่าที่ลูกค้าควบคุมกับขนาดบัฟเฟอร์นี้เป็นหัวใจของช่องโหว่ ไม่จำเป็นต้องมีไฟล์แนบขนาดใหญ่หรืออัตราการส่งข้อมูลสูงเสมอไป
เส้นทางที่เกี่ยวข้องคือ route ซึ่ง dispatch specification ใช้ตัวจับคู่พารามิเตอร์ body แบบ % เช่นรูปแบบ POST + %name= ตามระเบียน CVE ดังนั้นการใช้ Web::Simple ทุก route ไม่ได้แปลว่าโจมตีได้เหมือนกันทั้งหมด ผู้ดูแลควรตรวจว่าบริการจริงรับ application/x-www-form-urlencoded ด้วยการจับคู่ดังกล่าวหรือไม่ และ process ที่รับคำขอมีขีดจำกัดหน่วยความจำเท่าใด ผลกระทบที่ยืนยันได้คือภาระหน่วยความจำหรือการปฏิเสธการให้บริการ ไม่ใช่การอ่านไฟล์ การข้ามสิทธิ์ หรือการรันคำสั่ง
แพตช์เปลี่ยนอะไร
บันทึกการออกรุ่น 0.035 กล่าวถึงการอ่าน body แบบแบ่งช่วง แทนการขออ่านตาม Content-Length ทั้งก้อน และเพิ่มตัวแปร MAX_BODY_SIZE ซึ่งมีค่าเริ่มต้น 8 MiB การตรวจเพดานก่อนจัดสรรและการอ่านเป็นช่วงทำให้ header ที่ประกาศตัวเลขสูงผิดปกติไม่สามารถสั่งให้แอปจองบัฟเฟอร์ขนาดนั้นได้ง่ายเหมือนเดิม ผู้ดูแลที่มีแบบฟอร์มใหญ่กว่าค่าเริ่มต้นต้องทดสอบและปรับขีดจำกัดตามรูปแบบการใช้งานจริง โดยรักษาเพดานที่เหมาะสม ไม่ควรปิดการจำกัดขนาดโดยไม่มีเหตุจำเป็น
การกำหนดขนาดสูงสุดที่ reverse proxy หรือ web server เป็นชั้นช่วยลดความเสี่ยงอีกชั้นหนึ่ง แต่ต้องตรวจว่าคำขอทุกเส้นทางผ่านชั้นนั้นจริงและค่ากำหนดถูกใช้กับชนิด body ที่เกี่ยวข้อง การตั้งเพดานในแอปพลิเคชันเองยังจำเป็น เพราะ deployment บางแห่งอาจเข้าถึงแอปโดยตรงผ่านเครือข่ายภายในหรือมี proxy มากกว่าหนึ่งชุด การทดสอบควรครอบคลุมทั้งคำขอปกติ คำขอเกินขนาด และคำขอที่ header ไม่สอดคล้องกับ body โดยใช้สภาพแวดล้อมทดสอบที่ควบคุมได้
แนวทางปฏิบัติสำหรับทีมดูแลระบบ
เริ่มด้วยการตรวจ dependency lockfile และเวอร์ชันที่ process ใช้จริง เพราะเวอร์ชันที่ระบุในไฟล์ตั้งค่าอาจไม่ตรงกับแพ็กเกจที่ติดตั้งใน image หรือเครื่อง production หาก Web::Simple ต่ำกว่า 0.035 ให้ปรับเป็น 0.035 หรือใหม่กว่า จากนั้นสร้าง image ใหม่หรือรีสตาร์ต process ตามวิธี deployment เพื่อให้โค้ดที่แก้แล้วถูกโหลดจริง ตรวจการทำงานของแบบฟอร์ม POST ที่สำคัญและดูอัตราการใช้หน่วยความจำหลังอัปเดต
ในช่วงก่อนอัปเดต ให้ตรวจ limit ของ request body ใน proxy และจำกัดจำนวนคำขอพร้อมกันที่แต่ละ worker รับได้ตามสถาปัตยกรรมของระบบ หากมี log ของคำขอที่ประกาศ Content-Length ผิดปกติ ควรเก็บข้อมูลเวลา เส้นทาง และผลการตอบกลับไว้ประกอบการวิเคราะห์ แต่ไม่ควรถือว่าเหตุการณ์ใดเป็นการโจมตีเพียงเพราะมีเลข CVE ออกมา การยืนยันเหตุการณ์ต้องดูหลักฐานจากระบบของตน เช่น worker ถูกฆ่าเพราะหน่วยความจำ หรือช่วงเวลาที่เกิดคำขอสอดคล้องกับบริการล้มจริง
ผู้พัฒนาแอปควรพิจารณาเพิ่มเติมว่ามีโค้ดอื่นที่ใช้ Content-Length จากลูกค้าไปกำหนดขนาดการจัดสรรโดยตรงหรือไม่ ปัญหาประเภทเดียวกันอาจเกิดใน middleware หรือ parser อื่น แม้ Web::Simple จะอัปเดตแล้ว การบันทึกเวอร์ชันที่แก้ ผลทดสอบ และการตั้งค่า body limit ช่วยให้ทีมตอบคำถามได้ชัดเจนเมื่อมีการตรวจความปลอดภัยภายหลัง
แหล่งข้อมูลต้นทาง: ระเบียน CVE-2026-114629, commit แก้ไขของ Web::Simple, Web-Simple 0.035 และ Changes