วิเคราะห์ช่องโหว่ EFAIL: เมื่อการเข้ารหัสอีเมลไม่เป็นผล

สรุปย่อ

เมื่อสัปดาห์ที่ผ่านมา ทีมนักวิจัยซึ่งประกอบด้วยนักวิจัยจาก Münster University of Applied Sciences, Ruhr University Bochum และ KU Leuven ได้ร่วมกันเปิดเผยช่องโหว่ใหม่ภายใต้ชื่อช่องโหว่ว่า EFAIL โดยช่องโหว่ดังกล่างนั้นเป็นช่องโหว่ที่อาจทำให้เกิดการรั่วไหลของข้อมูลเมื่ออีเมลถูกเข้ารหัสด้วยเทคโนโลยีอย่าง OpenPGP และ S/MIME ซึ่งจำเป็นต้องอาศัยการดักจับและแก้ไขข้อมูลรวมไปถึงปัญหาในโปรแกรมอ่านอีเมลด้วยได้

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

ช่องโหว่ EFAIL นั้นเกิดขึ้นจากปัญหาด้านความปลอดภัยหลายปัจจัย โดยในบล็อกนี้นั้นทีมตอบสนองการโจมตีและภัยคุกคามจะมาอธิบายปัญหาดังกล่าวซึ่งนำไปสู่การเกิดขึ้นของช่องโหว่ ข้อเท็จจริงของช่องโหว่ พร้อมทั้งวิธีการลดผลกระทบจากช่องโหว่ให้ได้ทำความเข้าใจกันครับ

รายละเอียดช่องโหว่

ช่องโหว่ EFAIL นั้นเกิดขึ้นได้เนื่องจากปัญหาด้านความปลอดภัยหลัก 2 ประการดังต่อไปนี้

  1. ปัญหาจากการทำงานในโปรแกรมรับ-ส่งอีเมล (E-mail Client) ซึ่งทำให้เกิดการประมวลผลข้อมูลที่มาในรูปแบบของ HTML ในลักษณะที่เป็นอันตรายได้
  2. ปัญหาในกระบวนการเข้ารหัสของ OpenPGP และ S/MIME ซึ่งส่งผลให้ผู้โจมตีสามารถควบคุมและกำหนดลักษณะของข้อมูลเมื่อถูกถอดรหัสออกมาแล้วด้วยการแก้ไขข้อมูลที่ถูกเข้ารหัสอยู่ได้ โดยไม่จำเป็นต้องถอดรหัสข้อมูลหรือรู้กุญแจหรือใบรับรองในการเข้ารหัสข้อมูลได้

ปัญหาจากการทำงานโปรแกรมรับ-ส่งอีเมล

สำหรับปัญหาแรกที่ทำให้เกิดช่องโหว่ EFAIL ได้นั้นมีที่มาจากโปรแกรมรับ-ส่งอีเมลที่เราใช้กันอยู่ทุกวันซึ่งแตกต่างกันไปในแต่ละโปรแกรม โดยพฤติกรรมของโปรแกรมที่ทำให้เกิดปัญหานั้นคือวิธีการในแสดงผล HTML ที่มากับอีเมล

ในโปรแกรมรับ-ส่งอีเมลบางโปรแกรมนั้น เมื่อผู้ใช้งานทำการเปิดอีเมลซึ่งมีเนื้อหาประกอบด้วยโค้ดในภาษา HTML โปรแกรมจะพยายามทำการแสดงผลตามโค้ด HTML ที่มีอยู่โดยอัตโนมัติ ซึ่งรวมไปถึงการพยายามดึงรูปจากแหล่งอื่นซึ่งถูกฝังมากับแท็กอย่าง <img>

ผู้โจมตีสามารถอาศัยพฤติกรรมของโปรแกรมในลักษณะนี้นั้นในการขโมยเนื้อหาที่อยู่อีเมล (ที่ยังไม่ถูกเข้ารหัส) ออกมาได้โดยการเพิ่มหรือแก้ไขโค้ด HTML ซึ่งมีอยู่แล้วในอีเมล โดยตัวอย่างหนึ่งในการแก้ไขเพื่อให้ขโมยข้อมูลออกมาได้ถูกแสดงตามรูปภาพด้านล่าง (เนื้อหาของอีเมลจะถูกเน้นเป็นตัวเข้ม)

การสอดแทรกโค้ด HTML เพื่อขโมยข้อมูลในอีเมล (รูปภาพจาก https://efail.de)

หากสังเกตตามโค้ดซึ่งปรากฎตามรูปภาพด้านบน อาจจะสังเกตได้ว่าแท็ก <img> ไม่ได้ถูกใช้งานในการแสดงผลรูปภาพอย่างถูกต้อง เพราะในการใช้งานโดยทั่วไปนั้นพารามิเตอร์ src จะถูกชี้ไปยังไฟล์รูปภาพที่อยู่ในแหล่งอื่นๆ คำถามสำคัญก็คือหากผู้ใช้งานมีการเปิดอีเมลที่มีเนื้อหาตามรูปภาพด้านบนแล้วจะเกิดอะไรขึ้น?

ในกรณีที่อีเมลนี้ถูกเปิดด้วยโปรแกรมรับ-ส่งอีเมลซึ่งพยายามแสดงผลเนื้อหาที่อยู่ในรูปแบบของโค้ด HTML โดยอัตโนมัติ สิ่งที่จะเกิดขึ้นคือโปรแกรมรับ-ส่งอีเมลจะพยายามเรียกหารูปตามที่ระบุอยู่ในแท็ก HTML แต่จะระบุข้อมูลปลายทางตามรูปภาพด้านล่าง

ผลลัพธ์จากการทำ Direct Exfiltration (รูปภาพจาก https://efail.de)

จะสังเกตเห็นว่าเนื้อหาที่ถูกระบุอยู่ในอีเมลซึ่งก็คือส่วนที่เป็น Secret Meeting... นั้นจะถูกนำไปต่อท้าย URL ที่ระบุไว้คือ http://efail.de โดยเมื่อต่อท้ายข้อมูลเสร็จเรียบร้อยแล้ว โปรแกรมจะทำการเรียกหา URL นี้โดยอัตโนมัติ ผลลัพธ์ก็คือผู้ที่ควบคุมเว็บไซต์ปลายทางคือ http://efail.de จะสามารถรู้ได้ทันทีถึงเนื้อหาของอีเมลเมื่อตรวจสอบจากบันทึกการเรียกหาทรัพยากรต่างๆ บนเว็บไซต์ ส่งผลให้เกิดการรั่วไหลของข้อมูลได้

ปัญหาในลักษณะนี้ถูกตั้งชื่อว่า Direct Exfiltration ซึ่งถูกค้นพบและเป็นปัญหาที่กระทบความเป็นส่วนตัวของผู้ใช้งานมาเป็นเวลานานแล้ว อีกทั้งยังมีการใช้งานเพื่อคอยตรวจสอบข้อมูลของผู้เปิดอ่านอีเมลอีกด้วย

ปัญหาในกระบวนการเข้ารหัสของ OpenPGP และ S/MIME

ปัญหาต่อมาซึ่งส่งผลให้ผู้โจมตีสามารถใช้ Direct Exfiltration เพื่อเข้าถึงเนื้อหาของอีเมลแม้จะผ่านการเข้ารหัสมาแล้วนั้นคือปัญหาที่เกิดจากวิธีการเข้ารหัสจากเทคโนโลยีการเข้ารหัสอีเมลซึ่งเป็นที่นิยม 2 เทคโนโลยีด้วยกัน คือ S/MIME และ OpenPGP

ในกระบวนการเข้ารหัสอีเมลของทั้ง 2 เทคโนโลยีนั้น เทคโนโลยีทั้งสองมีการเข้ารหัสด้วยอัลกอริธึมการเข้ารหัสแบบสมมาตรโดยเข้ารหัสทีละ "บล็อค" ของข้อมูลไปเรื่อยๆ จนกว่าบล็อคแต่ละบล็อคที่ถูกแบ่งออกมาจากก้อนข้อมูลจะถูกเข้ารหัสจนหมด รูปแบบการดำเนินการระหว่างบล็อคข้อมูลปัจจุบัน บล็อคข้อมูลก่อนหน้าและบล็อคข้อมูลที่จะถูกเข้ารหัสต่อไปนั้นยังถูกกำหนดด้วยโหมดการเข้ารหัสอีกด้วย

สำหรับในกรณีของ S/MIME โหมดการเข้ารหัสที่ถูกระบุไว้ตามมาตรฐานนั้นจะเป็นโหมด CBC (Cipher Block Chaining) ส่วน OpenPGP จะมีโหมดการเข้ารหัสคือ CFB (Cipher Feedback) ซึ่งสามารถอธิบายกระบวนการถอดรหัสในแต่ละบล็อคได้ตามรูปภาพด้านล่าง

CBC decryption.svg

กระบวนการถอดรหัสข้อมูลในโหมดการถอดรหัสแบบ CBC (ภาพจาก Wikipedia)

CFB decryption.svg

กระบวนการถอดรหัสข้อมูลในโหมดการถอดรหัสแบบ CFB (ภาพจาก Wikipedia)

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

ในอัลกอริธึมการสำหรับเข้ารหัสนั้นมีการพูดถึงคุณสมบัติหนึ่งซึ่งเรียกว่า Malleability โดยคุณสมบัตินี้จะใช้ในการอธิบายว่าอัลกอริธึมสำหรับเข้ารหัสนั้น "Malleable" หรือไม่ก็ต่อเมื่อมีความเป็นไปได้ที่เราสามารถที่จะเปลี่ยนข้อมูลที่ถูกเข้ารหัสแล้ว (Cipher text) ให้เป็นข้อมูลที่ถูกเข้ารหัสอีกชุดหนึ่ง ซึ่งเมื่อถูกถอดรหัสแล้วอาจส่งผลให้เกิดการแก้ไขอย่างพอดิบพอดีกับข้อมูลดั้งเดิมก่อนถูกเข้ารหัสไว้ได้ โดยมีข้อแม้อยู่ว่าถ้าต้องการที่จะทำให้สำเร็จอย่างพอดิบพอดี ผู้ที่โจมตีจะต้องพอรู้รูปแบบของข้อมูลก่อนถูกเข้ารหัสอยู่บางส่วนแล้ว เพื่อให้สามารถเลือกตำแหน่งของบล็อคข้อมูลให้สามารถแก้ไขได้อย่างถูกต้อง

ตัวอย่างการใช้คุณสมบัติ Malleability ในการแก้ไข Cipher Text เพื่อให้ Plain Text ซึ่งเมื่อถูกถอดรหัสออกมาแล้วเป็นไปตามรูปแบบที่ต้องการ (ภาพจาก http://efail.de)

ตัวอย่างในกรณีของโหมดการเข้ารหัสแบบ CBC นั้น เมื่อผู้โจมตีพอจะทราบตำแหน่งของบล็อคของข้อมูลที่ถูกเข้ารหัสแล้วว่าเป็นตำแหน่งสมมติที่ N ผู้โจมตีจะต้อง "ยอมเสียสละ" บล็อคข้อมูลก่อนหน้าในตำแหน่งที่ N-1 ไปโดยแก้ไขบล็อคก่อนหน้าเพื่อให้ผลลัพธ์ที่ถอดรหัสนั้นส่งผลไปยังบล็อคในตำแหน่งที่ N ได้ โดยการแก้ไขบล็อคในตำแหน่งที่ N-1 ซึ่งส่งผลกระทบไปถึง N นั้นจะยังส่งผลกระทบไปถึงบล็อคในตำแหน่งที่ N+1 ด้วย

ดังนั้นในกรณีที่ผู้โจมตีต้องการให้ข้อมูลที่ถูกเข้ารหัสในโหมด CBC ในตำแหน่งของบล็อค N เปลี่ยนเป็นข้อความใหม่ ผู้โจมตีสามารถแก้ไขข้อมูลที่ถูกเข้ารหัสในบล็อคตำแหน่งที่ N-1 ให้เป็น "IV (หรือข้อความที่ถูกเข้ารหัสของบล็อคก่อนหน้าในกรณีที่ N ไม่ได้เป็น 0) ⊕ ข้อความที่ถูกถอดรหัสแล้วจากบล็อคก่อนหน้า ⊕ ข้อความใหม่ที่ต้องการให้แสดง" เพื่อเปลี่ยนแปลงข้อมูลในบล็อคตำแหน่งที่ N ได้พอดี

การโจมตีโดยใช้ช่องโหว่ EFAIL

เมื่อรวมเอาปัญหาที่ส่งผลกระทบด้านความปลอดภัยทั้งสองปัญหามาเป็นช่องโหว่ EFAIL การที่จะโจมตีช่องโหว่นี้ผู้โจมตีจะต้องดำเนินการดังต่อไปนี้

  1. ดำเนินการเพื่อให้สามารถดักจับและแก้ไขข้อมูลของอีเมลก่อนที่จะถูกส่งถึงผู้รับได้
  2. ทราบรูปแบบของข้อมูลก่อนถูกเข้ารหัสเพื่อให้สามารถหาตำแหน่งบล็อคของข้อมูลที่จะทำการแก้ไขได้
  3. ในกรณีที่ผู้รับอีเมลใช้เทคโนโลยี S/MIME ในการเข้ารหัส ผู้โจมตีสามารถ "ถอด" ส่วนของลายเซ็นต์ดิจิตอลออกจากอีเมลให้กลายเป็นอีเมลเข้ารหัสทั่วไปได้ จากนั้นจึงดำเนินการแก้ไขบล็อคของข้อมูลในตำแหน่งที่เหมาะสมเพื่อสอดแทรกโค้ด HTML ให้สามารถทำการโจมตี Direct Exfiltration ได้ลงไป
  4. ในกรณีที่ผู้รับอีเมลใช้เทคโนโลยี OpenPGP ในการเข้ารหัส ผู้โจมตีจะต้องคำนวณตำแหน่งของบล็อคที่จะแก้ไขให้ละเอียดยิ่งขึ้นโดยต้องคำนึงถึงกระบวนการบีบอัดข้อมูลอย่าง deflate ด้วย จากนั้นผู้โจมตีจะต้องเปลี่ยนรูปแบบของข้อมูลจาก Symmetrically Encrypted and Integrity Protected (SEIP) ซึ่งมีการใช้ Modification Detection Code (MDC) เพื่อตรวจสอบความสมบูรณ์เป็น Symmetrically Encrypted (SE) เพื่อให้ไม่มีการป้องกันทางด้านความสมบูรณ์ ก่อนจะดำเนินการแก้ไขข้อมูลที่ถูกเข้ารหัส
  5. รอรับข้อมูลที่ถูกถอดรหัสออกมาแล้วจากเซิร์ฟเวอร์ของผู้โจมตี

การป้องกันและลดผลกระทบจากช่องโหว่ EFAIL

การป้องกันและลดผลกระทบจากช่องโหว่ EFAIL สำหรับผู้ใช้งานทั่วไปสามารถดำเนินการได้ตามขั้นตอนดังต่อไปนี้

  1. ปิดการใช้งานการแสดงผลอีเมลที่มีเนื้อหาเป็น HTML อัตโนมัติ
  2. แยกกุญแจหรือใบรับรองสำหรับถอดรหัสอีเมลออกและให้แยกไปถอดรหัสอีเมลเฉพาะในสภาพแวดล้อมแยกที่ปลอดภัย
  3. ดำเนินการตรวจสอบและอัปเดตแพตช์ของโปรแกรมตามรูปภาพด้านล่าง โดยสีแดงและสีส้มคือโปรแกรมที่ได้รับผลกระทบ ให้ทำการตรวจสอบแพตช์จากผู้ผลิตโปรแกรมและทำการปิดการแสดงผลเนื้อหาที่เป็น HTML โดยอัตโนมัติ

รายการโปรแกรมรับ-ส่งอีเมลที่ได้รับผลกระทบจากช่องโหว่ EFAIL เมื่อใช้เทคโนโลยี S/MIME (ภาพจาก http://efail.de)

รายการโปรแกรมรับ-ส่งอีเมลที่ได้รับผลกระทบจากช่องโหว่ EFAIL เมื่อใช้เทคโนโลยี OpenPGP (ภาพจาก http://efail.de)

รายการโปรแกรมรับ-ส่งอีเมลที่ได้รับผลกระทบจากช่องโหว่ Direct Exfiltration (ภาพจาก http://efail.de)