Sejumlah seed Coldcard dibuat dengan bilangan acak yang lebih mudah diprediksi, sementara perangkat tetap menampilkan proses pembuatan dompet seperti biasa. Block mengaitkan kejadian itu dengan kesalahan integrasi random number generator (RNG), yakni pembangkit bilangan acak. Jalur yang seharusnya memakai RNG perangkat keras justru berakhir pada generator perangkat lunak Yasmarang. Karena seed menentukan kunci privat, ruang kemungkinan yang menyusut membuka jalan bagi perhitungan kunci secara luring.
Coinkite menyatakan seed dari firmware terdampak tetap berisiko meski perangkat kemudian diperbarui. Pembaruan hanya memperbaiki pembuatan seed baru dan tidak menambah entropi pada seed lama. Produsen juga membedakan cacat ini dari kompromi fisik perangkat atau pencurian frasa pemulihan. Fokus insiden berada pada mutu bahan acak saat rahasia pertama kali dibuat.
Nilai nol lolos sebagai fitur yang dianggap tersedia
Coldcard menetapkan makro kompilasi MICROPY_HW_ENABLE_RNG ke nilai nol. Konfigurasi itu dimaksudkan agar firmware memakai pembungkus RNG perangkat keras milik Coldcard, bukan jalur bawaan MicroPython. Masalah muncul ketika libngu memeriksa makro tersebut dengan #ifndef. Pemeriksaan itu hanya menanyakan apakah nama makro sudah didefinisikan, bukan apakah nilainya aktif.
Analisis Block menunjukkan pemeriksaan tersebut membuat proses kompilasi berhasil dan mengikat libngu ke fungsi rng_get() milik MicroPython. Karena nilai makro nol, fungsi itu menjalankan Yasmarang sebagai jalur cadangan perangkat lunak. Yasmarang diinisialisasi dari identitas cip dan pencatat waktu, bukan sumber entropi kriptografis. Keluaran tetap berbentuk bilangan acak sehingga kesalahan tidak tampak pada antarmuka pengguna.
Generator deterministik akan menghasilkan aliran yang sama bila keadaan awal dan urutan pemanggilannya dapat direkonstruksi. Pemeriksaan nilai berulang tidak otomatis menemukan kelemahan semacam ini. Yasmarang biasanya menghasilkan nilai berurutan yang berbeda, sehingga pemeriksaan kesehatan sederhana tetap lolos. Proses hash setelah pembangkitan juga meratakan tampilan keluaran tanpa menciptakan informasi acak baru.
Dampak berbeda menurut generasi perangkat
Peringatan Coinkite mencakup Mk2 dan Mk3 versi 4.0.1 sampai 4.1.9. Versi perbaikan untuk kedua model itu adalah 4.2.0 atau lebih baru. Mk4 dan Mk5 memerlukan versi standar 5.6.0 atau Edge 6.6.0X. Coldcard Q memerlukan versi standar 1.5.0Q atau Edge 6.6.0QX.
Menurut Coinkite, seed pada Mk4, Mk5, dan Q sebelum versi perbaikan memiliki sekitar 72 bit entropi, bukan 128 bit yang diharapkan. Block memberi batas teknis yang lebih hati-hati karena keadaan pencatat waktu saling berkorelasi. Tim itu juga menyatakan biaya serangan bergantung pada identitas cip, waktu boot, riwayat pemanggilan RNG, dan biaya derivasi. Angka entropi bukan jaminan bahwa setiap seed bisa dipulihkan dengan biaya yang sama.
Perbedaan lain terletak pada proses reseed, yaitu memasukkan bahan acak baru ke keadaan generator. Mk4, Mk5, dan Q mengambil data dari elemen aman, lalu hanya meneruskan empat bita hasil hash ke fungsi reseed. Block menilai proses ini membedakan paling banyak 232 aliran saat keadaan cadangan dan riwayat pemanggilan sudah diketahui. Penilaian tersebut belum didukung pengujian empiris menyeluruh pada semua perangkat.
Keluaran yang tampak acak belum membuktikan entropi
National Institute of Standards and Technology (NIST) menetapkan prinsip desain, validasi, dan uji kesehatan sumber entropi dalam SP 800-90B. Dokumen itu menempatkan sumber entropi sebagai komponen tersendiri dari generator bit acak deterministik dalam SP 800-90A. Pemisahan ini menjelaskan mengapa uji statistik pada keluaran tidak cukup. Sistem juga perlu memastikan sumber yang dimaksud benar-benar dipanggil dan menyumbang ketidakpastian.
Cacat Coldcard berada di perbatasan kode aplikasi, pustaka kriptografi, dan konfigurasi kompilasi. Setiap bagian dapat terlihat masuk akal ketika diperiksa secara terpisah. Kegagalan baru terlihat setelah simbol makro, fungsi yang ditautkan, dan jalur pada berkas biner diperiksa bersama. Uji unit pada algoritme saja tidak menjawab fungsi RNG mana yang benar-benar masuk ke firmware produksi.
Jejak sumber terbuka membantu Block mengikuti perubahan dari konfigurasi papan ke fungsi yang akhirnya dipanggil. Namun, ketersediaan kode tidak menjamin integrasi sudah diperiksa. Reproducible build (proses menghasilkan berkas biner yang sama dari sumber dan lingkungan yang ditetapkan) juga menjawab soal kesesuaian hasil kompilasi. Mekanisme itu tidak membuktikan bahwa konfigurasi keamanan di dalam sumber sudah benar.
Tiga pemeriksaan untuk jalur keamanan penting
Pemeriksaan pertama adalah menggagalkan operasi ketika sumber entropi yang diwajibkan tidak tersedia. Jalur cadangan yang lebih lemah tidak boleh menghasilkan seed seolah proses berhasil. Kesalahan harus muncul sebelum rahasia dibuat. Keputusan tersebut mengubah penurunan keamanan diam-diam menjadi kegagalan yang terlihat dan tercatat.
Pemeriksaan kedua memastikan identitas sumber RNG saat perangkat menyala. Uji kesehatan perlu memeriksa jalur yang benar-benar dipanggil, bukan sekadar pola keluaran. Hasilnya dapat dicatat sebagai bagian dari bukti operasi perangkat. Pengembang juga perlu menguji kondisi ketika RNG perangkat keras sengaja dibuat gagal.
Pemeriksaan ketiga memasukkan konfigurasi kompilasi dan simbol hasil penautan ke tinjauan keamanan. Pipeline dapat menolak nilai yang tidak sesuai, memeriksa simbol pada berkas biner, dan menguji citra firmware produksi. Pemeriksaan ini harus memakai konfigurasi yang sama dengan rilis pengguna. Perbedaan antara kode uji dan hasil produksi dapat meniadakan jaminan dari pengujian sebelumnya.
Versi baru tidak memperbaiki rahasia lama
Coinkite meminta pemilik seed terdampak memasang firmware perbaikan sebelum membuat seed pengganti. Produsen kemudian meminta pengguna memverifikasi cadangan dan alamat penerima, mengirim transaksi uji kecil, lalu memindahkan sisa dana. Cadangan lama dipertahankan sampai seluruh perpindahan terkonfirmasi. Prosedur itu berasal dari produsen dan memerlukan ketelitian karena kesalahan migrasi juga berisiko menghilangkan akses.
Pengecualian dalam advisori berlaku bagi seed yang sejak awal ditambah sedikitnya 50 lemparan dadu independen, adil, privat, dan tidak direkam. Coinkite juga menyebut frasa sandi BIP-39 yang kuat dan unik sebagai penghalang terpisah. Frasa sandi tidak memperbaiki seed terdampak sehingga produsen tetap menyarankan migrasi. PIN Coldcard bukan frasa sandi BIP-39 dan tidak memberi perlindungan yang sama.
TAPSIGNER, OPENDIME, dan SATSCARD tidak termasuk dalam cacat ini karena memakai basis kode berbeda. Kesimpulan juga tidak berlaku bagi seluruh dompet perangkat keras. Insiden menunjukkan kegagalan satu integrasi pada lini dan versi tertentu. Sampai artikel ini disusun, kami belum menemukan dokumen resmi Indonesia yang secara khusus mengatur kegagalan RNG pada dompet perangkat keras.
Sumber dan rujukan
- Coldcard Security Advisory(Coinkite)
- Predictable RNG Fallback and 32-Bit Reseed in COLDCARD Firmware(Block Engineering)
- NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation(National Institute of Standards and Technology)