Coldcardが存在する理由は、秘密鍵を絶対にネットに触れさせないためだ。カナダの起業家Jonathan Goodmanは、このルールを徹底的に守っていた。秘密鍵を保管するColdcardは一度もネットに接続せず、銀行の金庫に鍵をかけて保管。復元フレーズはさらに別の金庫に保管し、誰にも見せたことがなかった。それでも7月29日、彼のウォレットは一掃され、18.25ビットコイン、当時のレートで117万ドル超を失った。「一番堪えるのは、私が全て正しくやったということだ」と、彼は8月1日にXで書いた。

Goodmanだけではない。調査機関Galaxy Researchによれば、約7,300のアドレスから連続攻撃によって約1,596ビットコイン、1億ドル超相当が盗まれたと高い確信度で見ている。同機関のリサーチ責任者Alex Thornは8月4日、少なくとも15組の異なる攻撃者が同じ脆弱性を利用したと推定し、いずれのグループもデバイスに物理的に触れる必要はなかったとしている。

問題はハードウェアではなく、シードの生成方法にあった

The Blockの調査によれば、この事件の核心はColdcard本体がハッキングされたことではなく、資金を守るはずの復元フレーズが生成段階でそもそも誤っていたことにある。ビットコインウォレットのエントロピー(乱数性)は、シードがどれだけ推測されにくいかを決定する要素で、ビット数が1つ増えるごとに可能な組み合わせは倍になる。Coldcardは本来、デバイス内蔵のハードウェア乱数生成器から乱数性を取得すべきだったが、設定ミスによりよりシンプルなソフトウェア生成器が使われてしまった。このソフトウェアはデバイス情報とタイムスタンプに依存しており、完全にランダムとは言えず、範囲を絞り込んだり再現したりすることが可能だった。

Coldcard 種子生成漏洞內幕:鎖進保險箱也擋不住的比特幣竊案

影響の程度は機種によって異なる。Mk2とMk3デバイスは、このプロセスで安全な乱数性を全く取得できていなかった。Mk4、Q、Mk5は一部の乱数性を取得していたものの、ソフトウェアがそのうちの一部分しか保持していなかった。Coinkiteの推定では、これら新型デバイスが実際に生成していた乱数性はわずか72ビットで、設計目標の128ビットを大幅に下回り、シードの取り得る組み合わせが本来の2の56乗分の1以下に縮小していたことになる。

4年間隠れていたバグ、その出どころはファームウェア4.0.0

この欠陥は2021年3月17日、ファームウェア4.0.0とともにColdcardに入り込んだ。Coinkiteは当時のリリースノートで「All New Code, Same Great Features」と記し、謝辞リストで「switck」という名のアカウントが新しいソースコードライブラリを提供したことに感謝を述べていた。ビットコイン開発者James O'Beirneは監査の中で、「switck」アカウントから公開された58件のコード変更を照合し、これらの変更にCoinkite共同創業者Peter Grayが本名で公開した際と同一の暗号署名が付されていることを発見。これによりswitckがGray本人であることが特定された。switckが開発したlibnguライブラリはユーザーデバイスのColdcardファームウェアに組み込まれており、その役割の一つがウォレット作成に必要な乱数性の生成を支援することだった。

O'Beirneによれば、今年5月に監査を行った際にこのプロセスに疑問を抱き、欠陥の可能性をCoinkiteに報告したが、返ってきた答えは「本当に問題があるなら、とっくに発見されていたはずだ」というものだった。Coinkiteは事後、自社によるAI支援レビューも事件発生前にこのバグを検出できなかったと説明。脆弱性が公になった後、複数の主要AIモデルでテストしても、同様に問題を見つけられなかったという。

Coinkiteは影響を受けた全モデル・全リリースチャンネル向けに修正ファームウェアを公開済みだが、この修正は「今後」生成されるシードにのみ有効で、既に欠陥のあるソフトウェアで生成された古いシードを救うことはできない。影響を受けたユーザーは修正ファームウェアをインストールし、新しいシードを再生成した上で、ビットコインを新しいアドレスに移動する必要がある。Goodmanのように秘密鍵と復元フレーズを別々の金庫に分けて保管していたユーザーは、物理的な盗難は防げても、シードが生まれた瞬間から十分にランダムでなかったという問題までは防げなかった。