The Heartbleed Bug

Heartbleed
Heartbleed

ช่วงนี้ถ้าใครติดตามข่าวสารคอมพิวเตอร์อาจจะได้เคยเห็น หรือได้ยินว่ามีข่าวครึกโครมเรื่องระบบรักษาความปลอดภัย เกี่ยวกับบั๊กที่ชื่อว่า “Heartbleed” กันบ้าง

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

ทีนี้ แล้ว Heartbleed คืออะไรกันล่ะ ?

The Heartbleed Bug

เป็นอันรู้กันทั่วไปว่า หนึ่งในมาตรฐานการรับส่งข้อมูลบนโลกไซเบอร์ ที่รับรองว่าปลอดภัยนั้นคือ SSL/TLS ซึ่งหนึ่งในซอฟท์แวร์ที่นิยมใช้กันอย่างแพร่หลายในฐานะซอฟท์แวร์พื้นฐานสำหรับการเข้ารหัส SSL/TLS เพื่อส่งข้อมูลแบบ HTTPS, VPN หรือทราฟฟิกการเข้ารหัสแบบอื่นๆ นั้นก็คือ OpenSSL

แต่จากการเผยแพร่ของ CVE ในเอกสารรหัส CVE-2014-0160 นั้น แจ้งว่าได้พบบั๊กร้ายแรงในไลบรารี OpenSSL ตระกูล 1.0.1 ที่ออกมาตั้งแต่ปี 2012 จากบั๊กในส่วนของ heartbeat ทำให้แฮกเกอร์สามารถอ่านข้อมูลในหน่วยความจำใดๆ ออกมาได้ ทำให้แฮกเกอร์อาจจะอ่าน private key ของการเข้ารหัส รายชื่อผู้ใช้ในระบบสำหรับข้อมูลอื่นๆ และข้อมูลสำคัญอื่นๆ Debian จัดให้บั๊กนี้มีความร้ายแรงระดับ Grave ซึ่งเป็นขั้นรองสุดท้ายถัดจาก Critical

การค้นพบช่องโหว่ Heartbleed ถือเป็นการ “เจาะที่หัวใจ” ทำลายความน่าเชื่อถือของการส่งข้อมูลผ่าน SSL/TLS ลงอย่างมาก (ตามสัดส่วนการใช้ OpenSSL) เพราะการเข้ารหัสที่เรา “เชื่อว่าปลอดภัย” นั้นกลับไม่ปลอดภัยอย่างที่เคยคิดกันไว้

พื้นฐานของการเข้ารหัส (Encryption)

อย่างแรกเลยต้องเข้าใจพื้นฐานของการเข้ารหัสข้อมูลหรือ encryption เสียก่อน การเข้ารหัสในปัจจุบันมักใช้รูปแบบ “กุญแจคู่อสมมาตร” คือสุ่มสร้างกุญแจ (key) ออกมาสองตัวพร้อมกัน (แต่กุญแจไม่เหมือนกัน = อสมมาตร) คือ private key และ public key

กุญแจสาธารณะ (public key) จะถูกส่งออกไปในที่สาธารณะ เช่น อินเทอร์เน็ต (ในมิติของความปลอดภัยคือ untrusted space) ส่วนกุญแจส่วนตัว (private key) จะถูกเก็บไว้ในเครื่องของผู้ใช้งานเท่านั้น (มองว่าเป็น trusted หรือ safe space)

เมื่อ A ต้องการส่งข้อมูลลับให้ B ภายใต้สถาปัตยกรรมการเข้ารหัสแบบนี้ A จะนำ public key ของ B (ที่อยู่บนอินเทอร์เน็ต) มาผสมกับตัว “ข้อมูล” (data) ที่ต้องการส่ง เพื่อไม่ให้ใครคนอื่นอ่านได้ยกเว้นแต่ B ที่มีกุญแจคู่กันคือ private key ที่เก็บอยู่กับตัวของ B เท่านั้น

Public key data encryption and decryption
http://i.msdn.microsoft.com/dynimg/IC155063.gif

ความน่าเชื่อถือของการเข้ารหัสข้อมูลลักษณะนี้จึงอยู่ที่ความน่าเชื่อถือในการเก็บรักษา private key ที่ใช้เป็นเครื่องมือถอดรหัสนั่นเอง (แอดมินระบบจึงต้องรักษา private key ให้ดียิ่งกว่าชีวิตของตัวเอง)

การทำงานของ SSL/TLS

การทำงานของ SSL/TLS อิงอยู่บนแนวคิดของการเข้ารหัสด้วยกุญแจคู่อสมมาตร แต่เพิ่มแนวคิดเรื่อง “ใบรับรอง” (certificate) ขึ้นมาเพื่อยืนยันตัวตนของผู้รับหรือผู้ส่งข้อมูลอีกชั้นหนึ่ง

กระบวนการออกใบรับรองจำเป็นต้องมี “คนกลาง” เพื่อมายืนยันตัวตน ซึ่งคนกลางคนนี้จะถูกเรียกว่า หน่วยงานออกใบรับรอง (Certification Authority หรือ CA) ส่วนกระบวนการทั้งหมดตั้งแต่ต้นน้ำยันปลายน้ำจะเรียกรวมๆ ว่า public-key infrastructure หรือ PKI

เพื่อให้เข้าใจง่ายๆ ลองดูวิดีโอแนะนำการทำงานเบื้องต้นของ SSL กันก่อนครับ

SSL/TLS เป็น “มาตรฐาน” ที่อยู่บนกระดาษ (เวอร์ชันล่าสุดคือ TLS 1.2) ในทางปฏิบัติจำเป็นต้องมี “ซอฟต์แวร์” ขึ้นมาทำงานเข้ารหัสตามมาตรฐานดังกล่าว ซึ่งในโลกเราก็มีซอฟต์แวร์ SSL หลายตัว อย่างไรก็ตาม ซอฟต์แวร์ที่ได้รับความนิยมสูงสุดคือ OpenSSL ซึ่งเป็นซอฟต์แวร์โอเพนซอร์สที่ถูกใช้งานในวงกว้างมาก (ไมโครซอฟท์มีซอฟต์แวร์ SSL ของตัวเองที่ไม่มีบั๊กดังกล่าวเลยรอดหมดในกรณีนี้)

ปัญหา Heartbleed

ตามมาตรฐาน SSL/TLS จะมีตัวเลือกหนึ่งที่ชื่อว่า heartbeat (แปลตรงตัวคือ “หัวใจเต้น”) เพื่อให้คอมพิวเตอร์ฝั่งใดฝั่งหนึ่งส่งข้อความสั้นๆ ไปยังอีกคอมพิวเตอร์ฝั่งหนึ่งเพื่อเช็คว่าอีกฝั่งยังออนไลน์อยู่

ปัญหาของ OpenSSL ที่เราเรียกกันว่า Heartbleed (ล้อตามชื่อ heartbeat) คือ OpenSSL ดัน “พลาด” เปิดโอกาสให้คอมพิวเตอร์ฝั่งหนึ่งสามารถส่งข้อความในฟอร์แมตพิเศษ เมื่ออีกฝั่งหนึ่งได้รับข้อความนี้ก็จะส่งข้อมูล (ที่อยู่ในหน่วยความจำ) แถมกลับไปให้ด้วย

ข้อมูลแถมที่ว่านี้จึง “มีความเป็นไปได้” ที่จะเป็น private key ที่อยู่ในเครื่องปลายทางครับ

เพื่อให้เข้าใจง่ายลองดูการ์ตูนของ xkcd ที่อธิบายเรื่องนี้ได้ดีมาก

Heartbleed Explanation
http://imgs.xkcd.com/comics/heartbleed_explanation.png

ผลกระทบของ Heartbleed

บั๊ก Heartbleed ถูกแก้ไขใน OpenSSL เวอร์ชันล่าสุดเรียบร้อยแล้ว แก้ง่ายมากแค่อัพเวอร์ชันหรือลงแพตช์ก็หาย

แต่ประเด็นคือไม่มีใครทราบว่า private key ที่ถูกส่งผ่าน OpenSSL มาตั้งแต่ปี 2012 ถูกเจาะผ่านบั๊ก Heartbleed นั้นมีจำนวนเท่าไร และมีเว็บไซต์ไหนที่โดนเจาะบ้าง

ในทางทฤษฎี ผลสะเทือนของ Heartbleed กว้างมาก แต่ในทางปฏิบัติไม่มีใครทราบว่าเคยมีใครใช้ช่องโหว่ Heartbleed มาเจาะข้อมูลแบบนี้ไปก่อนหรือไม่ (แต่ทุกคนมโนกันว่า NSA เคยทำแน่ๆ)

เมื่อ private key หลุดออกไปจึงทำให้ข้อมูลที่ถูกเข้ารหัสด้วย key อันนั้น (เช่น รหัสผ่านที่เราใช้เข้าเว็บไซต์ เลขบัตรเครดิต) ไม่ปลอดภัยตามไปด้วยนั่นเองครับ

ตอนนี้คงเป็นหน้าที่ของเว็บไซต์และบริการออนไลน์ต่างๆ ที่จะสอบสวนดูว่าตัวเองได้รับผลกระทบจาก Heartbleed มากน้อยแค่ไหน

ผู้ใช้ควรทำตัวอย่างไรให้ปลอดภัยจาก Heartbleed

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

นอกจากนี้เราอาจใช้มาตรการด้านความปลอดภัยอื่นๆ นอกเหนือจากรหัสผ่านในการปกป้องข้อมูลของเรา (เพราะรหัสผ่านอย่างเดียวอาจไม่ปลอดภัยจาก Heartbleed) เช่น เปิดใช้งาน Two-step Verification บนเว็บไซต์หรือบริการออนไลน์ต่างๆ

สรุปใน 5 บรรทัด

  1. เราส่งข้อมูลสำคัญที่เป็นความลับ เช่น รหัสผ่าน โดยเข้ารหัสผ่านมาตรฐาน SSL/TLS
  2. ซอฟต์แวร์เข้ารหัสตามมาตรฐาน SSL/TLS ที่ได้รับความนิยมสูงที่สุดในโลกคือ OpenSSL
  3. OpenSSL มีบั๊ก (ชื่อ Heartbleed) ที่ทำให้กุญแจการเข้ารหัส “อาจ” รั่วได้
  4. ข้อมูลที่เคยส่งผ่าน SSL/TLS ไปยังเว็บไซต์ต่างๆ จึง “อาจ” รั่วได้
  5. ไม่มีใครรู้ว่าคำว่า “อาจ” มันมีโอกาสโดนจริงๆ มากน้อยแค่ไหน ดังนั้นควรป้องกันตัวไว้ก่อน (โดยการเปลี่ยนรหัสผ่าน)

ข้อมูลเพิ่มเติม

บทความนี้ไม่ได้อธิบายรายละเอียดเชิงเทคนิคของ Heartbleed แบบลงลึก ใครที่สนใจสามารถดูได้จากวิดีโอข้างล่างครับ (ทำโดย Zulfikar Ramzan ผู้เชี่ยวชาญด้านความปลอดภัยจากบริษัท Elastica)

 อ้างอิงข้อมูลจาก

Leave a Reply