Topbanner

หน้าเว็บ

วันอาทิตย์ที่ 13 เมษายน พ.ศ. 2557

พบช่องโหว่ OpenSSL Heartbeat Extension (Heart bleed bug)


พบบั๊กร้ายแรงในไลบรารี OpenSSL ตระกูล 1.0.1 ที่ออกมาตั้งแต่ปี 2012 จากบั๊กในส่วนของ Heartbeat ทำให้แฮกเกอร์สามารถอ่านข้อมูลในหน่วยความจำใดๆ ออกมาได้ ตอนนี้แพทซ์ของบั๊กนี้เริ่มปล่อยให้ดาวน์โหลดแล้ว และผู้ดูแลระบบทุกคนควรอัพเกรดทันที OpenSSL 1.0.1 ติดตั้งไปกับ Ubuntu ตั้งแต่รุ่น 12.04.4, Debian Wheezy, CentOS 6.5, Fedora 18, OpenBSD 5.3, FreeBSD 8.4, NetBSD 5.0.2, และ OpenSUSE 12.2 โดยมีผลตั้งแต่ OpenSSL 1.0.1 มาถึง 1.0.1f และเพิ่งได้รับการแก้ไขในรุ่น 1.0.1g เมื่อวานนี้ การที่แฮกเกอร์สามารถอ่านข้อมูลในหน่วยความจำได้ทำให้แฮกเกอร์อาจจะอ่าน Private Key ของการเข้ารหัส รายชื่อผู้ใช้ในระบบสำหรับข้อมูลอื่นๆ และข้อมูลสำคัญอื่นๆ เดเบียนจัดให้บั๊กนี้มีความร้ายแรงระดับ Grave ซึ่งเป็นขั้นรองสุดท้ายถัดจาก Critical บั๊กนี้พบโดยทีมวิศวกรความปลอดภัยของ Codenomicon และฝ่ายความปลอดภัยของกูเกิลหมายเลข CVE-2014-0160 ฉะนั้นเพื่อความปลอดภัยในข้อมูลส่วนบุคคลจึงควรเปลี่ยน Password ของเว็บไซต์ต่างๆ ที่คุณใช้ อาทิ ฟรีอีเมล์ Social Network หรือแม้กระทั่งบริการธุรกรรมออนไลน์ประเภทต่างๆ


การเข้ารหัสการสื่อสารข้อมูลระหว่างเครื่อง Client และเครื่อง Server เริ่มมีการใช้งานกันอย่างแพร่หลาย และ Library ที่ใช้กันอย่างแพร่หลายคือ OpenSSL เพราะเป็น Open Source และสามารถใช้ได้ทั้งใน TLS, SSL Protocol ทำให้มีผู้นำไปพัฒนาใช้กับโปรแกรมประเภทต่างๆมากมาย แต่ในเมื่อวันที่ 7 เมษายน 2557 ที่ผ่านมามีการเปิดเผยช่องโหว่ OpenSSL ในส่วนของ Heartbeat Extension จาก OpenSSL โดยผู้แจ้งคือ Riku, Antti และ Matti, ทีม Security Engineer จาก Codenomicon และ Neel Mehta จาก Google Security Team ช่องโหว่นี้กระทบทั้ง HTTPS, Email, Instant Messaging, VPN บางตัว หรือแม้แต่ Server ต่างๆที่ให้บริการกับ Mobile Application ต่างๆก็อาจมีช่องโหว่ได้เช่นกัน โดยช่องโหว่ดังกล่าวถูกตั้งชื่อว่า “Heartbleed” (CVE-2014-0160) ไม่ทราบเหมือนกันว่าทำไมถึงใช้ชื่อนี้ แต่อาจจะพยายามให้คล้ายกับชื่อเดิมก็เป็นได้


อะไรคือ Heartbeat Extension
และช่องโหว่ของ Heartbeat Extension เกิดขึ้นได้อย่างไร

Heartbeat extension (RFC 6520 Standard) เป็นส่วนเสริมของ OpenSSL โดยใช้เป็น Keep Alive packet มีส่วนประกอบด้วยกัน 2 ส่วนคือ Request และ Response กล่าวคือเป็นการตกลงกับ Server ปลายทางว่าหลังจากจบการเชื่อมต่อที่เข้ารหัสแล้วให้ยังคงเก็บ Session เปิดค้างไว้แม้ว่าจะไม่มีการส่งข้อมูลอะไรให้อีกก็ตาม นอกจากนี้ ยังใช้ในการตกลงระหว่างทั้ง 2 ฝ่ายให้คุยกันได้อย่างราบรื่นอีกด้วย
การส่ง Request ตาม Standard นั้นจะกำหนดขนาดสูงสุดอยู่ที่ 16KByte(214 Byte) แต่โดยปกติ OpenSSL จะสร้าง request ที่สั้นกว่านั้นมาก โดยส่วนประกอบของ Heartbeat Request เป็นดังนี้

- TLS1_HB_REQUEST ขนาด 1 Byte เป็นตัวกาหนดประเภทของ Message
- Payload Length ขนาด 2 Byte เป็นตัวกาหนดขนาดของ Payload + Padding(ส่วนเติมเต็ม packet)
- Sequence Number ของ Payload ขนาด 2 Byte
- Payload ขนาด 18 Byte
- Padding ขนาด 16 Byte






รูปที่ 1 : ตัวอย่าง Source Code ที่มีช่องโหว่ของ Heartbeat extension

แต่ประเด็นคือตอนรับข้อมูลไม่ได้ตรวจสอบดีนัก เนื่องด้วย Heartbeat Extension จะตอบกลับด้วย Copy ของ Payload Data ที่ได้รับตอน Request ซึ่งเป็นตัวบ่งบอกว่าวงจรการเข้ารหัส (Encrypted Circuit) ยังคงทำได้ปกติทั้ง 2 ฝั่ง ซึ่งหากผู้ส่ง Request มีการใส่ค่า Payload ขนาดเล็กแต่กำหนด Payload Size เป็น 0xFFFF(65535 byte) ทาง OpenSSL จะไป Copy 65535 byte จาก Payload ที่ส่งไปและ Memory ที่ใช้กับ Connection ของผู้อื่นที่จบ Connection พอดีมาให้แทน นั่นหมายความว่า หาก Heartbeat


Request ที่ส่งไปยังเว็บไซด์ที่เป็น HTTPS โดยไม่ได้ใส่ Payload ใดๆ ลงไปแต่กลับกำหนดขนาดของ Payload Length เป็น 0xFFFF แทน จะทำให้ OpenSSL จะนำข้อมูล HTTP ของผู้อื่นทั้ง HTTP Request และ HTTP Response จะถูก Copy จนครบ 65535 และส่งกลับมาให้เราแทน โดยข้อมูลเหล่านั้นอาจจะเป็นได้ทั้ง Username, Password, Cookies, x.509 Certificates เป็นต้น




รูปที่ 2 : ตัวอย่างโครงสร้าง Heartbeat Request และ Response ที่เป็นปัญหา

มีเว็บไซด์ชื่อดังมากมายที่ได้รับผลกระทบจากช่องโหว่นี้ไม่ว่าจะเป็น www.yahoo.com, www.settrade.com, www.lastpass.com เป็นต้น





รูปที่ 3 : ตัวอย่างผลลัพธ์จากการโจมตีช่องโหว่ Heartbleed ที่เว็บไซต์ www.yahoo.com

สามารถดู List เว็บไซด์ที่มีช่องโหว่เพิ่มเติมได้ที่ https://zmap.io/heartbleed/

ระบบที่ได้รับผลกระทบ
ช่องโหว่ดังกล่าวมีผลกับ OpenSSL ตั้งแต่ Version 1.0.1 – 1.0.1f, 1.0.2-beta ไม่ส่งผลกระทบกับ OpenSSL ที่เวอร์ชั่นต่ากว่า 1.0.1 และ 1.0.1g เป็นต้นไป ส่วนระบบปฎิบัติการที่มีผลกระทบมีดังนี้
- Debian Wheezy (stable), OpenSSL 1.0.1e-2+deb7u4
- Ubuntu 12.04.4 LTS, OpenSSL 1.0.1-4ubuntu5.11
- CentOS 6.5, OpenSSL 1.0.1e-15
- Fedora 18, OpenSSL 1.0.1e-4
- OpenBSD 5.3 (OpenSSL 1.0.1c 10 May 2012) and 5.4 (OpenSSL 1.0.1c 10 May 2012)
- FreeBSD 10.0 - OpenSSL 1.0.1e 11 Feb 2013
- NetBSD 5.0.2 (OpenSSL 1.0.1e)
- OpenSUSE 12.2 (OpenSSL 1.0.1c)
- Windows ทุกเวอร์ชั่นที่ใช้งาน Apache + OpenSSL version ที่มีช่องโหว่

วิธีการตรวจสอบช่องโหว่ Heartbeat
โดยหลังจากการเปิดเผยช่องโหว่ดังกล่าวออกมาก็ได้มีคนคิดเครื่องมือมากมายในการตรวจสอบและทดสอบการโจมตีช่องโหว่ดังกล่าว โดยเราสามารถตรวจสอบช่องโหว่นี้ได้โดยใช้เว็บไซด์ดังนี้
- https://www.ssllabs.com/ssltest/
- https://lastpass.com/heartbleed/
- http://filippo.io/Heartbleed/
หรือเราสามารถใช้ Firefox addon ที่ชื่อว่า FoxBleed (https://addons.mozilla.org/en-US/firefox/addon/foxbleed/) และ Chrome Extension ที่ชื่อว่า Chromebleed (https://chrome.google.com/webstore/detail/chromebleed/eeoekjnjgppnaegdjbcafdggilajhpic) ตรวจสอบได้เช่นกัน



รูปที่ 4 :ตัวอย่าง Firefox Addon ชื่อ FoxBleed สำหรับตรวจสอบเว็บไซด์ต่างๆ


วิธีการแก้ไข 
เราสามารถแก้ไขได้หลายทางดังนี้
1. แก้ไข Source Code ของ Heartbeat extension สามารถแก้ไขเป็นดังนี้



รูปที่ 5 : ตัวอย่าง Source Code ที่ถูกแก้ไขของ Heartbeat extension

เป็นการตรวจสอบก่อนว่า Payload + Padding ที่เข้ามามีค่าเท่ากับขนาดของ Field Payload   Length (rrec.length) หรือไม่

2. กำหนด Make Option ในการ Compile OpenSSL เวอร์ชั่นที่มีช่องโหว่ใช้เป็น -DOPENSSL_NO_HEARTBEATS จากนั้นจึง Compile อีกที

3. ใน Linux Distro ต่างๆสามารถ Update เพื่อทาการ patch OpenSSL ได้เลย
- Ubuntu/Debian

ให้ใช้คำสั่งเป็น sudo apt-get update && sudo apt-get upgrade -y
- Redhat/CentOS/Fedora

ให้ใช้คำสั่งเป็น yum update
จากนั้นตรวจสอบ Log ของ OpenSSL ว่า Patch สำเร็จหรือไม่
# tail /var/log/yum.log |grep ssl Apr 08 03:49:26 Updated: openssl-1.0.1e-16.el6_5.7.x86_64 Apr 08 03:49:27 Updated: openssl-devel-1.0.1e-16.el6_5.7.x86_64
จากนั้นจึง Restart Service ต่างๆ(เช่น http, openvpn เป็นต้น)ที่ใช้งาน OpenSSL อีกที

4. เราสามารถคอยสอดส่อง(Monitor) ได้ว่ามีการใช้งานที่เป็น Heartbeat เข้ามาหรือไม่โดยใช้ tshark(wireshark console version) ใช้คำสั่งเป็น
$ tshark -i interface port 443 -R 'frame[68:1] == 18' $ tshark -i interface port 443 -R 'ssl.record.content_type == 24'


5. เราสามารถ block การโจมตี Hearbleed ได้ด้วย IPTABLES โดยใช้คำสั่งเป็น
# Log rules iptables -t filter -A INPUT -p tcp --dport 443 -m u32 --u32 "52=0x18030000:0x1803FFFF" -j LOG --log-prefix "BLOCKED: HEARTBEAT" # Block rules iptables -t filter -A INPUT -p tcp --dport 443 -m u32 --u32 "52=0x18030000:0x1803FFFF" -j DROP
6. เราสามารถสร้าง Honeypot สำหรับการโจมตีช่องโหว่ Heartbeat โดยใช้ Script ของ glitchwrks.com ซึ่งสามารถ download ได้จาก http://packetstormsecurity.com/files/126068 โดยเมื่อมีการโจมตีเข้ามาจะได้รับผลลัพธ์กลับไปดังรูปที่ 6



รูปที่ 6 : ตัวอย่าง Honeypot ของช่องโหว่ Heartbeat

คำแนะนำ
ผู้ใช้ทั่วไปควรเปลี่ยนรหัสผ่านในเว็บไซต์หรือระบบใดๆ ที่มีช่องโหว่เพื่อป้องกันข้อมูลรหัสผ่านของเรารั่วไหล แต่สำหรับผู้ดูแลควรสร้าง Certificate ใหม่ไปเลย และตรวจสอบ Application ทุกตัวที่มีการใช้งาน OpenSSL ที่มีช่องโหว่


ที่มา : ขอบคุณข้อมูลจากบริษัท ไอ-ซีเคียว จำกัด พันธมิตรด้าน Information Technology Security ของ UIH

ไม่มีความคิดเห็น:

แสดงความคิดเห็น