Tuesday, August 30, 2011

แจ้งเตือน! ช่องโหว่ใหม่ของ Apache (ยังไม่มี patch)

#ขอขอบคุณ Neutron Soutmun ที่แจ้งว่าเดเบี่ยนมีอัพเตดแล้วนะครับ http://security-tracker.debian.org/tracker/CVE-2011-3192


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

Apache เป็นซอฟต์แวร์สำหรับเครื่องเซิร์ฟเวอร์ที่ให้บริการเว็บที่ได้รับความนิยมอย่างมาก ไม่ว่าเซิร์ฟเวอร์นี้จะถูกติตตั้งด้วยระบบปฏิบัติการลีนุกซ์ ยูนิกซ์ หรือแม้กระทั่งวินโดวส์เองก็ตาม ก็ล้วนแต่นิยมติดตั้ง Apache เพื่อให้บริการเว็บ โดยเฉพาะอย่างยิ่งระบบปฏิบัติการลีนุกซ์และยูนิกซ์จะมี Apache เป็นซอฟต์แวร์พื้นฐานสำหรับการเปิดให้บริการเว็บเซิร์ฟเวอร์ด้วย ซึ่งจากข้อมูลจาก Netcraft รายงานว่าเดือนสิงหาคม 2554 มีเซิร์ฟเวอร์ที่ใช้งาน Apache สูงถึง 65% [1]

รายละเอียดช่องโหว่
ชื่อ Range header DoS vulnerability Apache HTTPD 1.3/2.x
หมายเลขอ้างอิง CVE-2011-3192
ระบบที่มีผลกระทบ Apache เวอร์ชั่น 1.3 และ 2 (ทุกเวอร์ชั่นย่อย)

ช่องโหว่ใหม่ที่ถูกค้นพบนี้อาจส่งผลให้เว็บเซิร์ฟเวอร์ถูกโจมตีด้วยวิธีปฏิเสธการให้บริการ (Denial of Service)จากระยะไกล ซึ่งเว็บเซิร์ฟเวอร์ที่ติดตั้ง Apache HTTPD และไม่ได้ปรับแต่งเพิ่มเติม (ดีฟอลต์ - default)ก็อาจจะถูกโจมตีผ่านทางช่องโหว่นี้ ซึ่งโปรแกรมสำหรับโจมตีหรือที่เรียกว่า Exploit นั้นถูกประกาศกันอย่างแพร่หลายในอินเทอร์เน็ต (และผู้เขียนไม่ได้มีเจตนาที่จะเผยแพร่เครื่องมือโจมตีนี้ ดังนั้นจะขอปิดแหล่งข้อมูลเครื่องมือดังกล่าว) เครื่องมือโจมตีนี้จะส่งคำร้องการขอเข้าเว็บไซต์โดยส่งเป็นเฮดเดอร์ที่เป็นร้องขอดาวน์โหลดข้อมูลเว็บไซต์โดยการแบ่งเป็นข้อมูลย่อยที่มีส่วนทับซ้อนกันเป็นจำนวนมหาศาล (Range header Overlapping) ส่งผลให้หน่วยความจำและซีพียูถูกใช้หมดอย่างรวดเร็ว และแน่นอนว่าไม่สามารถให้บริการเว็บไซต์ต่อไปได้ หากศึกษาจากเครื่องมือโจมตีพบว่าเครื่องมือนี้จะทำการดาวน์โหลดข้อมูลเว็บไซต์ขนาด 1,300 ไบต์ โดยการแบ่งข้อมูลเป็นข้อมูลย่อยขนาด 5 ไบต์ และทำการร้องขอในลักษณะดังรูปที่ 1

รูปที่ 1 แสดงลักษณะของเฮดเดอร์ในการร้องขอข้อมูล โดยแบ่งย่อยๆทีละ 5 ไบต์

และอีกความน่ากลัวก็คือว่า ณ ขณะเวลานี้ ทางผู้พัฒนายังไม่สามารถส่งโปรแกรมที่อุดช่องโหว่นี้ให้ผู้ใช้งานได้อัพเดต

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

รูปที่ 2 แสดงล็อกของระบบปฏิบัติการลีนุกซ์ที่บอกว่า
หน่วยความจำถูกใช้หมดโดย Apache หลังจากถูกโจมตี


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

ใช้ SetEnvIf หรือ mod_rewrite เพื่อตรวจจับหา range ที่มีปริมาณมาก หากพบก็จะสามารถเลือกให้ยกเลิก Range: header หรือยกเลิกการร้องขอเลยก็ได้

ทางเลือกที่ 1: (สำหรับ Apache เวอร์ชั่น 2.0 และ 2.2)

# ยกเลิก Range header ถ้ามีมากกว่า 5 range (การร้องขอที่แบ่งเป็นข้อมูลย่อย)
# CVE-2011-3192
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range

# เพื่อเก็บล็อก
CustomLog logs/range-CVE-2011-3192.log common env=bad-range

ทางเลือกที่ 2: (สำหรับ Apache เวอร์ชั่น 1.3)

# ยกเลิกการร้องขอ เมื่อมีการร้องขอเกิน 5 range ใน Range: header.
# CVE-2011-3192

RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* - [F]

นอกจากนี้ยังมีวิธีการแก้ด้วยวิธีอื่นอีก สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ ข้อมูลอ้างอิง [2-4]

ข้อมูลอ้างอิง
  1. http://news.netcraft.com/archives/2011/08/05/august-2011-web-server-survey-3.html
  2. http://mail-archives.apache.org/mod_mbox/httpd-announce/201108.mbox/%3C20110824161640.122D387DD@minotaur.apache.org%3E
  3. https://www.hkcert.org/my_url/en/alert/11082901
  4. http://www.kb.cert.org/vuls/id/405811
  5. http://nakedsecurity.sophos.com/2011/08/26/apache-exploit-leaves-up-to-65-of-all-websites-vulnerable/

2 comments:

Yo said...

วิธีแก้ที่ 1 ตรง SetEnvIf และ RequestHeader ต้องใส่ที่ไหนครับ ใช่ที่ไฟล์ httpd.conf รึเปล่าครับ

Foh9 said...

ใช่ครับ แก้ที่นั่นครับ