การโจมตีระบบด้วยเทคนิค Timing Attacks
โดยปรกติแล้วการจะเข้าสู่ระบบต่าง ๆ นั้นขั้นตอนแรกมักจะต้องผ่านกระบวนการ Authentication(พิสูจน์ตัวตน ว่าเป็นบุคคลนั้นจริง ๆ) จากนั้นจึงจะทำการตรวจสอบ Authorization(พิสูจน์สิทธิ์ ว่าบุคคลนั้นสามารถเข้าถึงส่วนต่าง ๆ ของระบบได้แค่ไหน) โดยทั่วไปแล้วจะใช้ UserName และ Password เป็นขั้นพื้นฐานในการทำ authentication หากมีผู้ไม่หวังดีต้องการ log in บัญชีผู้อื่น วิธีการง่าย ๆ เลย คือ เดา password ที่คิดว่าน่าจะเป็นไปได้ หรือไม่ก็ไล่สุ่ม password ทั้งหมดที่เป็นไปได้ (Brute-force attack) แต่วิธีการนี้จะใช้เวลานานในการไล่ค้นหา
ในบทความนี้จะกล่าวถึงเทคนิคที่ถูกนำไปประยุกต์ใช้ในการ ค้นหา password คือ Timing Attacks เพื่อให้เห็นภาพ ขอยกตัวอย่างสถานการณ์ ดังนี้
สมมุติว่ามีคน 2 คน ขอเรียกว่า นายA และ นายB โดยที่
นายA จะนึกเลขเอาไว้ในใจ เช่น 1234
นายB ต้องการที่จะเดาเลขนั้น
[รอบ 1]
โดยนายB จะเดาและถามนายA ว่าถูกต้องหรือไม่ เช่น นายB เดาว่า 10
สิ่งที่นายA ทำคือ ตรวจสอบ จำนวนหลักของ เลขในใจ และ เลขที่นายB เดา ว่าเท่ากันหรือไม่
จะพบว่า 1234 มี 4 หลัก , 10 มี 2 หลัก
ดังนั้น นายA จะตอบกลับ นายB ได้อย่างรวดเร็วว่า ผิด
[รอบ 2]
จากนั้นนายB จะเดาเลขและถามนายA อีกรอบ เช่น นายB เดาว่า 100
นายA จะทำเหมือนเดิม คือ ตรวจสอบจำนวนหลัก จะได้ว่า 100 มี 3 หลัก
ดังนั้น นายA จะตอบกลับนายB ได้อย่างรวดเร็วว่า ผิด
[รอบ 3]
จากนั้นนายB จะเดาเลขและถามนายA อีกรอบ เช่น นายB เดาว่า 1000
นายA จะทำเหมือนเดิม คือ ตรวจสอบจำนวนหลัก จะได้ว่า 1000 มี 4 หลัก
นายA เห็นว่า จำนวนหลักถูกต้อง จึงจะทำการ ไล่เปรียบเทียบเลข แบบตัวต่อตัว
นายB จะสังเกตว่า นายA ใช้เวลานานกว่า 2 รอบแรก กว่าจะตอบกลับ
ดังนั้น นายB จะรู้ได้ว่า เลขในใจนายA นั้น มี 4 หลัก นั่นเอง
เมื่อนายB รู้จำนวนหลักที่ถูกต้องแล้ว ต่อไปจะทำการไล่เดาทีละหลัก
(เพื่อความกระชับ จะละกรณีที่นายA ตรวจสอบจำนวนหลัก)
เช่น นายB เดาว่า 1200
นายA จะทำการเปรียบเทียบเลขแบบ ตัวต่อตัว สมมุติว่านายA จะใช้เวลาในการเปรียบเทียบหลักละ 1 วินาที
ค่าที่ถูก 1234 , เลขที่เดา 1200
หลักแรก 1=1 ถูก
หลักสอง 2=2 ถูก
หลักสาม 3=0 ผิด
ดังนั้น เมื่อนายA ตรวจสอบถึงหลักที่ 3 แล้วพบว่า ผิด จึงตอบกลับนายB ว่า ผิด
นายB จะจับสังเกตได้ว่า นายA ใช้เวลาในการตอบกลับ 3 วินาที แสดงว่า นายA ตรวจสอบไปถึงหลักที่ 3 หมายความว่า หลักแรกและหลักที่สอง นั้นถูกต้องแล้ว
นายB ก็เปลี่ยนหลักที่ 3 ไปเรื่อย ๆ และจับสังเกต นายA หากเมื่อไรที่ นายA ใช้เวลาตอบกลับเป็น 4 วินาที แสดงว่า หลักที่สามเดาได้ถูกต้องแล้ว
นายB ก็จะใช้วิธีการนี้ไปเรื่อย ๆ ก็จะสามารถ หาเลขในใจนายA ออกมาได้
ดังนั้น หากนายA รู้แล้วว่านายB จับสังเกตจากเวลาที่ ตอบกลับ นายA จะต้องปรับการตอบกลับของตัวเองให้ใช้เวลาคงที่ เพื่อนายB จะได้จับสังเกตไม่ได้
การทำระบบ Authentication โดยตรวจสอบว่า password ที่ผู้ใช้ป้อนเข้ามานั้นว่าถูกต้องหรือไม่ ก็จะใช้หลักการเดียวกับสถานการณ์ที่ได้ยกตัวอย่างไปข้างต้น โดยหากเขียนโปรแกรมตรวจสอบ ข้อความ string ดังนี้
def compare_string(x,y) :
if x == y :
return True
else :
return False
จาก code ด้านบน นั้นให้ผลการทำงานที่ถูกต้อง แต่จะพบว่ามีช่องโหว่ที่สามารถใช้วิธี Timing Attacks ได้ ดังนี้
ผลจาก code ด้านบน สรุปได้ว่า
จากกรณีที่ 1 และ 2 : การเปรียบเทียบ จะตรวจสอบจำนวนหลักก่อน หากพบว่าเท่ากัน แล้วจึงไล่เปรียบเทียบทีละหลักต่อไป
จากกรณีที่ 3 และ 4 : การเปรียบเทียบ จะไล่ตั้งแต่ตัวแรกไป จนถึงตัวที่ไม่เหมือนกัน
ดังนั้น code ของการใช้ operator == คือ ตรวจสอบความยาวก่อน แล้ว ค่อยเช็คทีละตัวไล่ไป
def string_equal(x,y) :
if len(x) != len(y) :
return False
for i in range(len(x)) :
if x[i] != y[i]:
return False
return True
วิธีการป้องกันการโจมตีจาก Timing Attacks ต้องทำให้การเปรียบเทียบนั้นใช้เวลาเป็นค่าคงที่จะทำให้ผู้โจมตีจับสังเกต ไม่ได้ ดังนี้
def string_equal_2(x,y) :
if len(x) != len(y) :
return False
result = True
for i in range(len(x)) :
result = result & (x[i] == y[i])
return result
สามารถเขียนโปรแกรม ได้ ดังนี้
ผลจาก code ด้านบน จะเห็นว่า กรณีที่ 1, 3, 4 นั้นใช้เวลาใกล้เคียงกัน ทำให้ไม่สามารถสังเกตเห็นความแตกต่าง แต่วิธีการนี้ก็ยังไม่สามารถป้องกันเรื่องการ เดาจำนวนหลักได้ดังจะเห็นได้จากกรณีที่ 2 คือ ให้ค่าเวลาออกมาน้อย
ในภาษา Python เอง ก็มี module เพื่อแก้ปัญหาเรื่องนี้แล้ว คือ hmac.compare_digest โดยสามารถเขียนโปรแกรมได้ ดังนี้
จะเห็นว่าเวลาที่ใช้นั้นได้ออกมาใกล้เคียงกันมากในทุกกรณี
ในปัจจุบันการระบบ authentication นั้นได้มีการพัฒนาปรับปรุงไปอย่างมาก เช่น การใช้ CAPTCHA, การใช้ Biometrics, การใช้ 2 Factor Authentication, รวมถึงระบบจัดเก็บ ข้อมูล password ให้จัดเก็บเป็นค่าที่ผ่าน hash function เป็นต้น การใช้วิธีการต่าง ๆ เหล่านี้ ก็จะช่วยเพิ่มความปลอดภัยให้ระบบมากยิ่งขึ้น