8月1日に更新された Coinkite の告知は、自社のハードウェアウォレット Coldcard で作られた一部の seed が、設計より弱い乱数から生まれていたことを認めるものだった。原因は2021年3月に出た firmware に入り込んだ設定の誤りで、5年以上のあいだ表に出なかった。7月30日、その鍵を狙った引き出しが始まっている。
自分で鍵を持つことは、他人に預けない生き方の中心にある。だがその自立は、手元の機械が正しく乱数を作っているという、使う側からは確かめようのない前提の上に乗っていた。今回はその前提が外れたときに何が起きるかの実例になった。
見ておきたいのは一点だけだ。firmware を更新すれば、この件は自分の手元で終わるのか。
まず、対象を絞る
Coinkite の告知は範囲を明示している。対象は Mk2 と Mk3 の 4.0.1 から 4.1.9、Mk4 と Mk5 は標準版 5.6.0(Edge 版 6.6.0X)より前、Q は 1.5.0Q(Edge 版 6.6.0QX)より前。TAPSIGNER、OPENDIME、SATSCARD は対象外だ。
問われているのは端末ではなく鍵のほうだ、という点も告知に書いてある。危険なのは「対象の firmware が載っていた時期に、その端末で作られた seed」であって、いま手元にある機械そのものではない。
そして例外がある。Coinkite は、50回以上の独立した自分だけのダイスロールを入れて作った seed、あるいは強固で固有の BIP-39 パスフレーズで守られている資金は、この脆弱性の対象から外れると書いている。
弱さの程度も書かれている。Mk4・Q・Mk5 で生成された seed は、設計上の128ビットに対しておよそ72ビットだった。TRM Labs の分析は、より古い機種ではさらに落ちうるとしている。
型番ではなく、鍵を作った日と作り方が問われている。
「直した」と「安全になった」が別である理由
firmware の修正が直すのは、これから作る seed の乱数源だ。すでに存在する seed は、それが作られた瞬間の乱数から決まっている。更新は過去にさかのぼらない。
だから「もう更新したから大丈夫」は、この件では成り立たない。弱い乱数から生まれた鍵は、更新したあとも同じ鍵のままそこにある。
攻撃する側が端末に触れる必要がないことも、この構図を厳しくしている。取りうる鍵の範囲が狭いなら、あとは手元の計算機で候補を潰しながら、残高のあるアドレスを探せばいい。金庫にしまってあったことも、一度もネットに繋がなかったことも、防御にならない。
Coinkite が示した手順も、更新だけで閉じていない。更新する、新しい seed を作る、バックアップを記録して検証する、少額を送って確かめる、そのうえで残りを移す——ここまでが一続きになっている。
そして8月17日、Coin Bureau は Galaxy の調査責任者 Alex Thorn の言葉として、攻撃はまだ続いていると伝えた。最初の引き出しから2週間以上が経っている。
更新は入口であって、出口ではない。
数字のほうは、まだ固まっていない
TRM Labs によれば、7月30日の最初の一斉引き出しは25分ほどで進み、約500のウォレットから約594 BTC——当時の価値でおよそ3,800万ドル——が1つのアドレスへ集められた。同社が掲載した時点の Galaxy Research の集計は、5,200を超えるアドレスから約1,816 BTC、およそ1億1,600万ドル。ただし TRM 自身が暫定値だと断っている。
TechCrunch は8月4日の時点でおよそ1億3,000万ドルと書き、少なくとも十数人の攻撃者が動いていて、複数の集団が関わっているように見えるという Galaxy Research の見立てを伝えている。
数字が記事ごとに違うのは、どのアドレスをこの脆弱性によるものと数えるかが、まだ確定していないからだ。総額を見て安心することも、その逆もできない。
確定しているのは金額ではなく、原因のほうだ。
手元で確かめる順番と、その代償
できることは限られている。それでも順番はある。
最初は、その鍵をいつ作ったかだ。2021年3月以降にその端末で seed を生成したなら、対象の期間に入る。次に、作り方を思い出す。自分で50回以上ダイスを振って入れたか。資金にパスフレーズが掛かっているか。どちらも当てはまらないなら、Coinkite の言う対象に入る可能性がある。
ここから先には代償がある。新しい鍵へ移すには送金の手数料がかかる。バックアップを取り直し、保管する場所と方法をもう一度決める必要がある。移行のあいだは古い鍵と新しい鍵が並んで存在し、どちらのバックアップがどちらなのかを取り違えれば、攻撃者ではなく自分の手で資金を失う。急いだ移行そのものが事故になりうる、というのがこの作業の難しいところだ。
分かっていないことも残る。自分の seed が実際に何ビットで作られたのかを、端末があとから教えてくれるわけではない。判断は「作った条件」からの推定にとどまる。安全だと言い切れるのは Coinkite が書いた例外の範囲までで、その外側を誰かが保証してくれることはない。
自分で鍵を持つというのは、誰にも預けない代わりに、こういう日の判断も自分で引き受けるということだった。預けていれば、補償の話を誰かがしてくれたかもしれない。預けなかったから、確かめるのも移すのも自分になる。どちらがいいかという話ではなく、そういう取引だったという話だ。
あなたの手元にある鍵は、いつ、どんな条件で作られたものだろうか?