Hack Trezor Hardware Wallet ด้วย Fault Injection

Datafarm
4 min readJul 17, 2024

สวัสดีครับ ในวันนี้ผมจะพูดถึงเรื่องที่น่าสนใจอย่าง การโจมตี Hardware ด้วยเทคนิค Fault Injection ซึ่ง Hardware ที่ว่าก็คือตัว Trezor Hardware Wallet นั่นเอง โดยผมได้แรงบรรดาลใจมาจาก Hacker ท่านหนึ่งคือ คุณ Joe Grand ที่ได้นำเสนอเรื่องราวในการโจมตี Fault Injection บนอุปกรณ์ Trezor (Cryptocurrency Hardware Wallet) ในการช่วยเหลือคนที่ไม่สามารถเข้าถึง Trezor ของตัวเองจากการลืมรหัส PIN ให้สามารถ Recover Cryptocurrency มูลค่า 2 ล้านเหรียญดอลล่าสหรัฐได้ (สามารถตามไปดูกันได้ที่ : https://www.youtube.com/watch?v=dT9y-KQbqi4 ครับ) สำหรับเนื้อหาของบทความนี้จะเป็นวิธีการโจมตี Trezor ด้วย Fault Injection ในอีกรูปแบบหนึ่ง ซึ่งเป็นการ dump ข้อมูล recovery seed จากตัว Trezor One นั่นเองครับ

ปูพื้นฐานกันสักนิด

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

แต่ในบทความนี้ผู้เขียนจะขอโฟกัสไปที่การโจมตี Software บนอุปกรณ์ Hardware เป็นหลัก การทดสอบ Fault Injection เป็นการทดสอบที่มีโอกาสสร้างความเสียหายให้กับอุปกรณ์ Hardware ด้วย ดังนั้นการทดลองจึงไม่ควรใช้ทดลองกับอุปกรณ์ที่มีความสำคัญมาก ๆ

การสร้าง Fault รูปแบบต่าง ๆ

1. Clock Fault Injection

Clock Fault Injection เป็นเทคนิคที่ใช้สัญญาณ Clock ที่ผิดปกติทำให้เกิดข้อผิดพลาดเกิดขึ้นในการทำงานของ software บนอุปกรณ์ hardware การทำ Clock Fault Injection สามารถทำได้หลายวิธี เช่น Clock Glitching เป็นการแทรกสัญญาณ Clock ความถี่สูงหรือต่ำกว่าปกติ เข้าไปในสัญญาณ Clock ปกติ

ตัวอย่างสัญญาณ Clock Glitching
Reference: Figure 4–2 The Hardware Hacking Handbook

จากตัวอย่างสัญญาณ Clock Glitching เป็นการใช้เทคนิค Clock Fault Injection ในการ Over Clock CPU สังเกตว่าสัญญาณ Clock ปกติจะมีคาบความยาวคลื่นอยู่ที่ 70 ns และมีสัญญาณ Clock ที่ความยาวคลื่น 30ns แทรกเข้ามา เมื่อความถี่ f = 1/T เมื่อคาบความยาวคลื่นสั้นลงจะส่งผลให้ความถี่ f มีค่าเพิ่มขึ้น เมื่อความถี่ Clock สูงขึ้นก็จะส่งผลให้ ความเร็วในการประมวลผลของ CPU สูงขึ้นเช่นกัน กล่าวคือ วิธีการ Over Clock CPU เป็นหนึ่งในตัวอย่างของการใช้ Clock Fault Injection

2. Voltage Fault Injection

Voltage Fault Injection เป็นเทคนิคในการสร้างข้อผิดพลาดในการทำงานของระบบโดยการใช้ Voltage ที่ผิดปกติเป็น Voltage Power Supply ให้กับอุปกรณ์ hardware

ตัวอย่างลูกคลื่น Voltage Fault
Reference: Figure 5–11 The Hardware Hacking Handbook

โดยทั่วไปการใช้เทคนิค Voltage Fault Injection นั้น จำเป็นต้องรู้ค่าแรงดัน Voltage ปกติในการทำงานของอุปกรณ์นั้น ๆ (Operating Voltage) ก่อนที่จะทำการสร้างสัญญาณ Voltage Fault โดยส่วนใหญ่ Voltage Fault Injection นั้น จะต้องทำการบัดกรีตัวอุปกรณ์ Capacitor ออก เนื่องจาก Capacitor จะเป็นตัวกรองคลื่นสัญญาณ Voltage ให้มีความ smooth ขึ้นซึ่งจะส่งผลต่อ Fault Signal ที่เราจงใจสร้างขึ้นมาได้

3. Electromagnetic Fault Injection (EMFI)

Electromagnetic Fault Injection เป็นวิธีสร้างข้อผิดพลาดในการทำงานของระบบโดยใช้สนามแม่เหล็กไฟฟ้าในการรบกวนการทำงานปกติของระบบอุปกรณ์ โดยการสร้างสนามแม่เหล็กไฟฟ้าโดยพื้นฐาน แล้วจะสร้างโดยให้กระแสไฟฟ้าไหลผ่านขดลวดตามกฎมือขวา ก็จะได้ทิศทางของสนามแม่เหล็กไฟฟ้าตามรูปด้านล่าง

Reference: Figure 5–21 The Hardware Hacking Handbook

ซึ่งจะมีการใช้สัญญาณกระแสไฟฟ้า (Drive pulse) ป้อนเข้าไปในขดขวดเพื่อทำการสร้างสนามแม่เหล็กไฟฟ้า

โดยสำหรับการทำ EMFI ในทางปฎิบัติจะมีเครื่องมือสำหรับสร้างสนามแม่เหล็กไฟฟ้า เช่น ChipSHOUTER เป็นต้น

Reference: https://www.mouser.ca/images/newaetechnologyinc/lrg/NAE-CW520-KIT_t.jpg

ตัวอย่างอุปกรณ์ ChipSHOUTER ที่จะทำการสร้างสนามแม่เหล็กไฟฟ้าที่บริเวณหัว probe สีทองด้านซ้ายมือ (วิดีโอตัวอย่างการใช้งาน : https://www.youtube.com/watch?v=Ap1n6aE13y0)

การโจมตี Trezor เพื่ออ่านค่า Recovery Seed

Trezor Hardware Wallet เป็น Cryptocurrency Hardware Wallet ยี่ห้อหนึ่ง ที่มีหน้าที่ในการเก็บค่า Recovery Seed ซึ่งตัว Recovery Seed นี้ จะเป็นค่าที่ประกอบไปด้วยคำศัพท์จำนวน 12, 24 คำตามมาตราฐาน BIP39 (สามารถดูชุดคำศัพท์ตามมาตราฐาน BIP39 ได้ที่ : https://github.com/bitcoin/bips/blob/master/bip-0039/) โดยคำศัพท์ชุดนี้จะถูกนำมาคำนวณหา Private Key ซึ่งใช้ในการพิสูจน์ความเป็นเจ้าของ Cryptocurrency ซึ่งการทำงานปกติของ Cryptocurrency Hardware Wallet จะไม่มีการส่งข้อมูล Private Key หรือ Recovery Seed ออกสู่ภายนอกโดยเด็ดขาด แต่จะใช้การพิสูจน์โดย Digital Signature ที่สร้างโดย Private Key แทน

การโจมตีนี้เราจะใช้เทคนิค Fault Injection รูปแบบ Electromagnetic Fault Injection (EMFI) ในการ Bypass security ของ Trezor software ในการ Dump ข้อมูล Memory จาก Ram ของตัวอุปกรณ์ ด้วยรูปแบบ Fault Injection ด้วยสนามแม่เหล็กไฟฟ้านี้จะทำให้ไม่จำเป็นต้องแงะตัวอุปกรณ์ให้เกิดรอยขีดข่วนหรือเสียหาย สำหรับ Trezor Firmware ที่ใช้ในการโจมตีจะเป็น Firmware Version เก่า คือ Version 1.7.3 (https://github.com/trezor/trezor-mcu/tree/v1.7.3/) ซึ่งปัจจุบันได้รับการ Patch ไปเรียบร้อยแล้ว และอุปกรณ์ Hardware ที่ใช้เป็นเป้าหมายในการโจมตีคือ Trezor Model One ซึ่งด้านในหากแกะเคสออกมาจะพบกับแผงวงจร ดังรูป (การโจมตีจริง ๆ ไม่จำเป็นต้องแกะ)

Reference: Figure 7–1 The Hardware Hacking Handbook

จะพบว่าแผงวงจรมีส่วนที่เป็น Chip ประมวลผลอยู่ที่ตำแหน่งด้านล่างปุ่มตรงกลางตัวเครื่อง โดยเมื่อมีการเปิดใช้งาน (หลังจาก bootloader) ข้อมูล Recovery Seed จะถูกนำมาเก็บไว้ในส่วนของ flash memory ในส่วนที่เรียกว่า metadata

Reference: Listing 7–1 The Hardware Hacking Handbook

จากภาพจะเห็นว่า address FLASH_META_START จะอยู่หลังจากจบส่วนที่เป็น bootloader

ที่ source code ของ Trezor Firmware จะมีไฟล์ winusb.c ที่มี function winusb_control_vendor_request ดังนี้

Reference: https://github.com/trezor/trezor-mcu/blob/v1.7.3/winusb.c

ที่ function นี้จะมีการตรวจสอบข้อมูล request จาก USB เช่น bRequest, bmRequestType, wIndex ที่เป็น attribute ของ USB request ซึ่งโดยปกติแล้ว USB request จะประกอบไปด้วยค่า wLength ที่เป็น field ที่บ่งบอกว่า computer มีการขอให้ส่งข้อมูลกลับไปขนาดเท่าไหร่ โดย field นี้จะถูกใส่เป็น argument ค่า *len ใน function และจะสังเกตว่ามีตัวแปร dwLength ซึ่งเป็นค่าที่บ่งบอกขนาดของข้อมูลที่จะส่งกลับไปยัง computer โดยจำกัดขนาดตาม descriptor ของอุปกรณ์ Trezor แต่สังเกตที่บรรทัด 122 มีการเรียกใช้ method MIN() ในการจำกัดขนาดของข้อมูลที่จะทำการส่งกลับไปยัง computer โดยการทำงานปกติขนาดของข้อมูลจะถูกส่งกลับไปตาม ขนาดที่น้อยที่สุดระหว่าง ขนาดข้อมูลที่จำกัดโดยอุปกรณ์ และขนาดข้อมูลที่ส่ง

ดังนั้น ข้อมูลที่ส่งออกจากตัว Trezor จะมีขนาดสูงสุดตามค่า dwLength เท่านั้น ดังนั้นเมื่อ method MIN() มีการ return ค่าผิดพลาดจะทำให้ Trezor สามารถส่งข้อมูลจาก memory ในส่วนที่ไม่ควรเข้าถึงได้กลับไปยัง computer ได้ ซึ่งนั่นรวมถึงข้อมูล Recovery Seed ที่อยู่ในส่วน metadata

Setting สำหรับการโจมตีเราจะใช้อุปกรณ์ทั้งหมด คือ

  1. Trezor Model One
  2. ChipSHOUTER
  3. PhyWhisperer-USB (อุปกรณ์สำหรับ ดักจับเพื่ออ่านข้อมูลระหว่างการสื่อสารด้วย USB และยังสามารถควบคุมพลังงานไฟฟ้าที่จ่ายผ่าน USB ได้อีกด้วย)

โดยเราจะทำการ Setting อุปกรณ์ดังนี้

Reference: Figure 7–6 The Hardware Hacking Handbook

นำตัวหัว Probe ของ ChipSHOUTER มาจ่อที่บริเวณ Chip processor ของ Trezor One เพื่อทำการ Inject สนามแม่เหล็กไฟฟ้า (EMFI) จากนั้นใช้น๊อตยึดที่ปุ่มทั้ง 2 ปุ่มบน Trezor One เพื่อให้กดเข้าสู่ bootloader mode ขณะเริ่มทำงาน และเสียบสาย micro USB บน Trezor One กับ PhyWhisperer-USB โดยตัว PhyWhisperer-USB จะทำการควบคุมการจ่ายพลังงานไฟฟ้าผ่าน micro USB ไปที่ Trezor One เพื่อให้อุปกรณ์ทำงาน

จากนั้นจะทำการส่งสัญญาณ trigger ไปที่ ChipSHOUTER ให้ทำการยิงสนามแม่เหล็กไฟฟ้า (EMFI) ไปยัง Trezor One ให้เกิด fault หากสามารถทำให้เกิด fault ในขณะที่ Trezor ทำการประมวลผล software ในจุดที่มีการตรวจสอบขนาดของ USB request (ที่รูป source code ไฟล์ winusb.c บรรทัดที่ 122) พอดี (การทดสอบจริง ๆ จะต้องมีการ Trial and Error เพื่อปรับค่า Parameter ของ EMFI drive pulse ซึ่งใช้เวลาจำนวนมากจึงจะสามารถทำให้เกิด Fault ที่จุดที่ต้องการพอดีจริง ๆ) จะทำให้ตัว Trezor One ส่งข้อมูลเกินขอบเขตการทำงานปกติจาก SRAM ซึ่งในส่วนของ metadata มีข้อมูล recovery seed อยู่ โดยที่ตัว PhyWhisperer-USB สามารถทำการ print debug ข้อมูลที่ส่งผ่าน USB ได้ผ่าน function method read_capture_data()

Reference: Listing 7–13 The Hardware Hacking Handbook

ตัวอย่าง ข้อมูลปกติที่ได้จากการ print debug (146 bytes เป็นขนาดการส่งข้อมูลกลับปกติ) ซึ่งหากพบขนาดของข้อมูลที่ใหญ่กว่า 146 bytes นั่นหมายความว่า Fault Injection อาจจะสามารถนำข้อมูล Recovery Seed ออกมาจาก memory ได้สำเร็จ ซึ่งสามารถนำ binary ที่ได้แปลงกลับเป็น string ด้วยคำสั่ง strings -a จากนั้นใช้ regular expression ในการแยกคำศัพท์ออกมาแสดง เช่น

Reference: Listing 7–15 The Hardware Hacking Handbook

เป็นการใช้ regular expression แยกตัวอักษรหรือช่องว่างความยาวตั้งแต่ 4 ขึ้นไป

Reference: Listing 7–16 The Hardware Hacking Handbook

จากผลลัพธ์คือค่า recovery seed ทั้งหมด 24 คำที่แสดงผลออกมาเป็นการพิสูจว่าการโจมตี Fault Injection สำเร็จ ซึ่งจะเห็นว่าเมื่อสามารถเข้าถึง recovery seed ได้แล้วก็จะสามารถเข้าถึงความเป็นเจ้าของของ crypto currency ได้ทันที

บทส่งท้าย

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

Reference

The Hardware Hacking Handbook by Jasper van Woudenberg and Colin O’Flynn

--

--

No responses yet