Clear
Lead Graphic Papers

ช่องโหว่ของ Apache HTTPD 1.3/2.X Range Header (CVE-2011-3192)

วันที่ประกาศ: 1 ก.ย. 2554
ปรับปรุงล่าสุด:
1 ก.ย. 2554
เรื่อง:
ช่องโหว่ของ Apache HTTPD 1.3/2.X Range Header (CVE-2011-3192)

ประเภทภัยคุกคาม: DoS (Denial-of-Service)

Share on Facebook Share on Twitter Share on Google+

ข้อมูลทั่วไป

พบช่องโหว่ของซอฟต์แวร์เครื่องแม่ข่ายเว็บ Apache ในเวอร์ชั่น 1.3 และ 2.X ซึ่งข่องโหว่นี้สามารถถูกโจมตีจากผู้อื่นใดๆที่สามารถเรียกใช้บริการเว็บใน ลักษณะ HTTP-based Range [1] ซึ่งจะทำให้เครื่องแม่ข่ายเกิดการใช้งาน CPU และ Memory ที่สูงผิดปกติจนกระทั่งเครื่องแม่ข่ายเว็บไม่สามารถให้บริการต่อไปได้ และเกิดสภาวะหยุดการทำงาน (Denial-of-Service) จากการวิเคราะห์ช่องโหว่ พบว่าสาเหตุของปัญหาน่าจะเกิด 2 สาเหตุ คือ ความบกพร่องในการบริหารจัดการการใช้ทรัพยากรของเครื่องแม่ข่ายของซอฟต์แวร์ Apache เอง และความบกพร่องในส่วนของการออกแบบโปรโตคอล HTTP ที่ยอมรับการ Request ในลักษณะ Byte serving ได้พร้อมๆกันหลายๆช่วงของข้อมูล [2] โดยไม่ได้กำหนดข้อห้ามในการเรียกใช้ช่วงข้อมูลที่มัลักษณะซ้อนทับ (Overlap) กัน ซึ่งเป็นช่องทางให้ผู้ใช้เรียกใช้ซอต์ฟแวร์ Apache เพื่ออ่านข้อมูลพร้อมๆกันหลายครั้งๆได้โดยง่าย จนกระทั่งทรัพยากรในเครื่องแม่ข่ายถูก Process Apache ใช้งานจนหมด

ผลกระทบ

ทำให้เครื่องแม่ข่ายเกิดการใช้งาน CPU และ Memory สูงจนกระทั่งเกิดสภาวะหยุดการทำงาน (Denial-of-Service)

วิธีการแก้ไข

ผู้ดูแลระบบเครื่องแม่ข่ายเว็บ Apache ที่ได้รับผลกระทบจากช่องโหว่นี้ สามารถเลือกวิธีในการแก้ไข/บรรเทาปัญหาได้ตามข้อเสนอต่างๆ [3] ดังนี้

1. ดำเนินการปรับปรุงซอฟต์แวร์ Apache ให้เป็นเวอร์ชั่น 2.2.20 หรือใหม่กว่า

2. หากไม่สามารถปรับปรุงซอฟต์แวร์ให้เป็นเวอร์ชั่นที่ปรับปรุงแก้ไขช่องโหว่นี้ได้แล้ว ให้พิจารณาวิธีการดังต่อไปนี้

2.1. สำหรับ Apache 2.0 และ 2.2 ให้จำกัด Request Range Header ให้มีความยาวไม่เกิน 5 ช่วง โดยสามารถกำหนดค่า Configuration ของซอฟต์แวร์ Apache ดังต่อไปนี้

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range

# optional logging.
CustomLog logs/range-CVE-2011-3192.log common env=bad-range


Configuration นี้ จะปฏิเสธ Request Range Header ที่มีจำนวนมากกว่า 5 ช่วงขึ้นไป โดยระบบจะดำเนินการบันทึก Log ของการ Request นี้ ลงใน [Apache Log Path]/logs/range-CVE-2011-3192.log เพื่อนำข้อมูลไปตรวจสอบดูภายหลังได้ (สามารถแก้ไข path ได้ตามความเหมาะสม)

2.2 สำหรับ Apache 1.3 จำเป็นต้องอาศัยวิธีการจำกัด Request Range Header ให้มีจำนวนไม่เกิน 5 ช่วง ด้วย mod_rewrite โดยใช้ configuration ดังต่อไปนี้

# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* - [F]


ซึ่งวิธีการทำงานจะคล้ายกับ 2.1 แต่ระบบจะไม่สามารถบันทึก Log ของ Request Range ที่เกิน 5 ช่วงข้อมูลเอาไว้ได้

หมายเหตุ วิธีการจำกัดจำนวน Request Range ที่กำหนดไว้เป็น 5 ช่วง ใน configuration ข้างต้น อาจเปลี่ยนแปลงได้ตามความเหมาะสม เพราะ application บางชนิด เช่น e-book reader หรือ video streaming player อาจมีการใช้งาน http range request ที่ซับซ้อน ซึ่งต้องการการกำหนดค่า range มากกว่า 5 ช่วง หากกำหนดค่า range ไว้ต่ำเกินไป อาจทำให้ application ดังกล่าว มีปัญหาในการใช้งานได้

3. สำหรับวิธีการทางเลือกอื่น นอกเหนือการจำกัดจำนวน Request Range คือการจำกัดความยาวของ HTTP Request Header ให้มีขนาดเหมาะสม เช่น

LimitRequestFieldSize 200

เป็น การจำกัดความยาวของ header ให้ไม่เกิน 200 bytes แต่อาจมีผลกระทบกับ Header อื่นๆ ที่มีขนาดใหญ่ เช่น cookie ได้ หรือยกเลิก Byte Range Request ด้วย mod_headers โดยตั้ง configuration ดังนี้

RequestHeader unset Range

แหล่งข้อมูลอื่นๆที่เกี่ยวข้อง

เอกสารอ้างอิง

  1. http://en.wikipedia.org/wiki/Byte_serving
  2. http://tools.ietf.org/html/rfc2616#section-14.35
  3. https://mail-archives.apache.org/mod_mbox/httpd-announce/201108.mbox/%3C20110824161640.122D387DD@minotaur.apache.org%3E

Clear