Coldcardハードウェアウォレットの脆弱性でビットコイン流出、被害は8,800万ドル超に
AI マーケットサマリー
開示されたColdcardハードウェアウォレットの鍵生成の欠陥により、攻撃者がBTCで8,800万ドル超を盗み得たと報じられており、このエクスプロイトは進行中で、資金がオンチェーンで集約されていると説明されている。プロトコルレベルのビットコインの問題ではないものの、この事案は保管および運用リスクを高めることで短期的なセンチメントに圧力をかけ得て、自己保管への移行の加速、ハードウェアウォレットのサプライチェーンに対する監視強化、ならびに取引所およびコンプライアンスチームによる関連アドレスの監視増加を促す可能性がある。
影響度
● 高い
影響を受ける資産
BTC/USDT+0.90%
AI インサイト · BTC/USDTAI インサイト
▼ 弱気
今すぐ取引
⚠️ AI によって生成されたインサイトはニュースコンテンツに基づくものであり、情報提供のみを目的としています。投資助言を構成するものではなく、BingX の見解を示すものでもありません。投資にはリスクが伴います。責任ある取引を心がけてください。
Coldcardハードウェアウォレットを巡る脆弱性が悪用され、ビットコインの不正流出が拡大している。7月31日には約500台のColdcardが侵害され、594BTC(約3,800万ドル相当)が盗難被害に遭った。その後、Coldcardを製造するCoinkiteは、鍵生成プロセスに起因するセキュリティ上の欠陥が複数世代の製品に影響すると認め、対象としてColdcard Mk2、Mk3、Mk4、Q、Mk5を挙げた。脆弱性悪用による累計被害額はすでに8,800万ドルを超え、攻撃は継続中とされる。利用者には、資金を速やかに別アドレスへ移す対応が求められる。
以下はBeosinによる脆弱性分析と、盗難資金の追跡状況。
I. 脆弱性の概要(Beosin分析)
Coldcardファームウェアのコミット履歴を精査すると、コミット「37e4af5451c260c1e7d429fe8972c4cb5e68ee59」以前の段階で、MK4関連の設定を含む複数のコードが更新されていた。mpconfigboard.hには次の定義がある。
// We have our own version of this code.
#define MICROPY_HW_ENABLE_RNG (0)
MicroPythonのSTM32側では、このマクロがデフォルトのハードウェア乱数生成器(RNG)バインディングと汎用乱数実装のコンパイル経路を制御する。値を0にすると、汎用のrng_get()がデフォルトのハードウェアRNGをバックエンドとして利用できなくなる。コメント上は開発側が独自にRNGを実装する前提だが、カスタムのrng.hで宣言されているMicroPythonオブジェクトは次の2つにとどまる。
MP_DECLARE_CONST_FUN_OBJ_0(pyb_rng_get_obj);
MP_DECLARE_CONST_FUN_OBJ_1(pyb_rng_get_bytes_obj);
実装は概ね以下の通りで、pyb_rng_get()はrng_get_or_fault()を呼び出して乱数を返し、pyb_rng_get_bytes()はRNGレジスタを参照してバッファに埋める。
この構成から、ColdcardのカスタムコードはハードウェアRNGの利用を意図しているものの、実際にハードウェア機能の利用が保証されるのはpyb_rng_get*や内部のrandom_buffer()が呼ばれる場合に限られる。
一方、ウォレット生成時に呼ばれるshared/seed.pyの処理は次の通り。
async def make_new_wallet(nwords):
# Select a new random seed.
await ux_dramatic_pause('Generating...', 3)
seed = generate_seed()
words = await approve_word_list(seed, nwords)
if words:
await commit_new_words(words)
このフローはColdcardのshared/random.pyへ入り、従来バージョンではngu.randomに依存し、ウォレット初期化ではpyb.rng()ではなくrandom.bytes(= ngu.random.bytes)を使用していた。つまり、独自のpyb_rng_get_objはrandom.bytesを自動的に置き換えない。
MICROPY_HW_ENABLE_RNGが0に設定されていた結果、ウォレットのシード生成ではハードウェアRNGではなく、micropython/ports/stm32/rng.cにあるフォールバックのPRNG「pyb_rng_yasmarang」がrng_get()として呼ばれる経路に入っていた。
pyb_rng_yasmarangは疑似乱数生成器であり、ハードウェアウォレットのシード生成用途としては安全性が極めて低い。攻撃者が総当たりで鍵を推定できるリスクが高まる。
Coinkiteは現在、Makefile上でstm32/rng.cのフォールバックPRNGを明示的に除外する対応を進めているとされ、次の記述が示されている。
Do not compile MicroPython's fallback PRNG.
The board-specific rng.c provides rng_get(), and this empty object satisfies the upstream object list.
$(BUILD)/rng.o: CFLAGS += Dpyb_rng_yasmarang=errordonotwantthis
$(BUILD)/rng.o:
$(ECHO) "SKIP stm32/rng.c"
$(Q)$(CC) $(CFLAGS) -x c -c /dev/null -o $@
II. 盗難資金の追跡(オンチェーン)
複数の被害ウォレットから流出した資金は、現時点で大規模なミキシング等の追加的なロンダリングが見られないまま、複数アドレスに集約されているという。Beosin Traceは脅威インテリジェンスとオンチェーン行動分析により、以下の集約先アドレスを特定した。
・bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r(562 BTC)
・bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3(398.47 BTC)
また、同様の資金フローを示し、その後の追加移転が確認されていない集約先として、次のアドレスも挙げられている。
・bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q(89.62 BTC)
・bc1q0rvn88w08j75k4h48lf9fvhan7unjp7vjf5q6m(64.9 BTC)
・bc1qtfrwa4j6rmj9rsgspv6a0yjumkg39js2numu75(45.9 BTC)
・bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp6(30.18 BTC)
Beosinは、Coldcardを標的とした攻撃が続いているとして、新たな集約先アドレスの監視と資金移動の分析を継続している。
III. まとめ
今回のColdcardに関する大規模インシデントは、ウォレットのシード生成という最重要工程で疑似乱数生成器が使われ得る実装となっていた点が原因とされる。開発チームには継続的かつ包括的なテストとコード監査が求められ、利用者は資産の移転を急ぐとともに、Coinkiteの今後のセキュリティ告知を注視する必要がある。
Beosinは、ローンチ前のスマートコントラクト監査、リアルタイムのリスク監視・ブロック、資産回復、暗号資産AML、調査・追跡などを手掛けるブロックチェーンセキュリティおよび規制コンプライアンス技術企業。20以上の国・地域の規制当局・法執行機関、200社超の暗号資産サービス事業者、4,500以上のWeb3プロジェクトに対し、ワンストップのコンプライアンス製品とセキュリティサービスを提供している。