คลื่นการโจมตีก่อนหน้านี้ที่ใช้ช่องโหว่เดียวกัน ได้กวาด 594 BTC (~38 ล้านดอลลาร์) จากกระเป๋า Single-Signature ประมาณ 500 ใบ ภายในช่วงเวลาเพียง 25 นาที เมื่อเวลาประมาณ 01:31 UTC การสืบสวนโดยทีมวิเคราะห์อิสระอย่าง Galaxy Research, Chainalysis และทีมวิศวกรรมของ Block ต่างก็สรุปไปในทิศทางเดียวกันว่าการโจรกรรมทั้งหมดเชื่อมโยงกับช่องโหว่ในเฟิร์มแวร์ของ Coldcard
ทีม Bitcoin Engineering และ Security ของ Block ซึ่งนำโดยวิศวกร Clay Garrett ค้นพบว่าแฮกเกอร์ใช้ บัญชีแบบเสียเงินของผู้ให้บริการวิเคราะห์บล็อกเชนชั้นนำแห่งหนึ่ง เพื่อระบุและสอบถามข้อมูลที่อยู่กระเป๋าที่มีช่องโหว่ได้อย่างมีประสิทธิภาพ รูปแบบการทำธุรกรรมบนเชนที่ผิดปกติ — การกวาดเงินจากที่อยู่ที่มีจุดอ่อนเดียวกันอย่างรวดเร็วและเป็นลำดับ — ทำให้ทีมสืบสวนเริ่มสงสัย และ Block ก็ยืนยันหลักฐานที่เชื่อมโยงกิจกรรมของผู้โจมตีไปยังโครงสร้างพื้นฐานของผู้ให้บริการรายดังกล่าวได้
Garrett อธิบายว่าทีมสืบสวนสามารถระบุได้ด้วย "ความเฉพาะเจาะจงอย่างไม่น่าเชื่อ ลงไปจนถึงระดับบัญชี" โดยผู้ให้บริการวิเคราะห์นี้ทำหน้าที่เป็นเครื่องมือสืบราชการลับ (Reconnaissance Tool) ที่ช่วยให้แฮกเกอร์สามารถ.map ว่าที่อยู่ใดบ้างที่ถูกสร้างขึ้นบนเฟิร์มแวร์ที่มีช่องโหว่ และกำหนดเป้าหมายไปที่กระเป๋าที่มีมูลค่าสูงที่สุดก่อน
บั๊กนี้ถูกนำเข้ามาใน การคอมมิตเฟิร์มแวร์เมื่อเดือนมีนาคม 2021 (เริ่มต้นในเวอร์ชัน Mk3 เฟิร์มแวร์ 4.0.1) ระหว่างการย้ายฐานโค้ดไปยังไลบรารี libsecp256k1 ของ Bitcoin Core ข้อผิดพลาดของ Build-Configuration Macro ทำให้เฟิร์มแวร์ข้ามการใช้ เครื่องกำเนิดตัวเลขสุ่มฮาร์ดแวร์ (TRNG) ของชิป STM32 ซึ่งเป็นอุปกรณ์เฉพาะ และหันไปใช้ ซอฟต์แวร์สุ่มเทียม Yasmarang ของ MicroPython ที่คาดเดาได้แทน
การกำหนดค่าบอร์ดผลิตภัณฑ์ (Production Board Configuration) ได้ตั้งค่า MICROPY_HW_ENABLE_RNG เป็นศูนย์ เนื่องจาก Coldcard มี Wrapper สำหรับ Hardware RNG แยกต่างหาก แต่ไลบรารี libngu เรียกใช้ Wrapper นั้นไม่ถูกต้อง: เงื่อนไข Guard Condition (#ifndef MICROPY_HW_ENABLE_RNG) ของมันทดสอบเพียงว่า Macro ถูก กำหนด (Defined) หรือไม่ ไม่ได้ทดสอบว่าค่าของมันเป็น Non-Zero หรือไม่ เนื่องจาก Macro ถูกกำหนดไว้แล้ว (แม้ค่าจะเป็นศูนย์) libngu จึงสรุปอย่างผิดพลาดว่าเส้นทางฮาร์ดแวร์พร้อมใช้งานและเชื่อมต่อไปยังฟังก์ชัน rng_get() ที่เป็นซอฟต์แวร์ของ MicroPython
ข้อผิดพลาดนี้ทำให้ค่าความไม่แน่นอน (Entropy) ที่แท้จริงลดลงเหลือเพียงประมาณ 32–40 บิต (จากที่ตั้งใจไว้ที่ 128+ บิต) หมายความว่า มีค่า Seed ที่เป็นไปได้เพียงประมาณ 4 พันล้านค่า — ซึ่งสามารถถูก Brute-Force ได้อย่างง่ายดายด้วยฮาร์ดแวร์สมัยใหม่ Seed ที่ถูกสร้างขึ้นโดยที่ผู้ใช้ไม่ได้ใส่ Dice Rolls หรือ BIP 39 Passphrase เพิ่มเติม จะถูกเปิดเผยอย่างสมบูรณ์
Rodolfo Novak (NVK) ซีอีโอของ Coinkite ได้ยอมรับข้อผิดพลาดนี้ในภายหลัง: "ผมตั้งค่า MICROPY_HW_ENABLE_RNG เป็นศูนย์อย่างชัดเจน โดยคิดว่าเราไม่ต้องการเวอร์ชันใดเลย แต่มันไม่ใช่สิ่งที่มันทำ"
| ได้รับผลกระทบ | ไม่ได้รับผลกระทบ |
|---|---|
| Coldcard Mk3, เฟิร์มแวร์ 4.0.1 ถึง 5.0.3 | Mk4, Q, Mk5 (จากการวิเคราะห์เบื้องต้นของ Coinkite) |
| Seed ที่สร้างขึ้นโดยไม่มีผู้ใช้โยนลูกเต๋าหรือ BIP 39 Passphrase | Seed ที่สร้างขึ้นโดยผู้ใช้ใส่ Dice Rolls หรือ Passphrase |
ต่อมา Coinkite ได้ขยายคำแนะนำไปยังเฟิร์มแวร์ของ Mk4, Mk5 และ Q บางรุ่นหลังจากการวิเคราะห์เพิ่มเติม และได้ปล่อยอัปเดตเฟิร์มแวร์ฉุกเฉินสำหรับทุกรุ่นที่ได้รับผลกระทบ
การหาประโยชน์จากช่องโหว่นี้ ได้สั่นคลอนหนึ่งในหลักการสำคัญของ Self-Custody — ที่ว่า Secure Element ของฮาร์ดแวร์วอลเล็ตรับประกันความปลอดภัยทางเข้ารหัสลับได้โดยไม่คำนึงถึงบั๊กของซอฟต์แวร์
สำหรับรายละเอียดทางเทคนิคเพิ่มเติม โปรดดู รายงานทางวิศวกรรมของ Block และ ข้อมูลทางเทคนิคของ Coinkite