ハードウェアウォレットからマスター秘密鍵を抽出してしまう"Dark Skippy"攻撃はどのように対策されているのか
今週話題となったことの1つに、ハードウェアウォレット(HWW)からマスター秘密鍵を抽出してしまう新たな攻撃手法である「Dark Skippy」というものがありました。
Dark Skippyはトランザクション署名時のナンスを用いた隠れチャネル攻撃、と呼ばれる既存のカテゴリに属する攻撃ですが、これまでの攻撃手法と比べて非常に効率的な上に検知が難しいという特徴があります。ハードウェアウォレットに悪意あるファームウェアをインストールしている(されている)ことが前提となりますが、他に何も間違った行動を取っていなくてもある日突然ウォレットの資金が全て盗まれてしまう恐れがあるものです。
今日はDark Skippyについて軽く説明し、このような攻撃に対する対策状況や注意点を解説します。
・ナンスのランダム性が不足すると秘密鍵を復元できてしまう特徴を突く攻撃
・HWWに悪意あるファームウェアが入っていないことが何より大事
・マルチシグやAnti-Exfilと呼ばれる対策も効果的だが、別のリスクを伴う
ナンスのランダム性が不足すると秘密鍵を復元できてしまう特徴を突く攻撃
ビットコイントランザクションの署名は、ECDSA・シュノア署名に関わらず、ナンスというランダム値によって変化しており、このおかげで署名と公開鍵から秘密鍵を逆算できないようになっています。
もしナンスがなかったり、同じナンスを複数回の署名で使いまわしたりしてしまうと、2つの署名を比較することで秘密鍵を逆算してしまうことができるのです。Pieter Wuille氏がBitcoin Stack Exchangeで簡単な式で説明してくれています。
そして厳密に同じナンスを使いまわしていなくても、「特定の法則によって決まるナンスを使っている」というケースや「限られた範囲内のナンスを使っている」というケースにおいてはその知識がある攻撃者によってやはり同様の手法で秘密鍵が逆算されてしまう可能性があります。
このように、ランダム性が低いナンスを通して秘密鍵を抽出する攻撃は"Nonce Covert Channel Attack"と呼ばれる種類であり、これ自体が新しいものではありませんが、Dark Skippyではなんと最短で1回のトランザクションでマスター秘密鍵の抽出まで辿りつく上に、攻撃者の計算力は通常のノートPC程度あればよいという驚異的な破壊力を持っています。(従来型のものだと大量の署名を用意する必要があったり、大きな計算力が必要だったり、マスター秘密鍵までは抽出できないなどの制限がありました)
まず、マスター秘密鍵まで流出させる秘訣は、この攻撃は悪意のあるファームウェアを前提としている点にあります。ナンスを決める以外に、ナンスにマスター秘密鍵の情報を少しずつ埋め込んでしまえるのです。
例えば入力が2つあるビットコイントランザクションを署名する際に、それぞれの入力に対して使用するナンス値を「あらかじめ攻撃者が推測できるものにマスター秘密鍵の半分を加算したもの」にすることで、1トランザクション内の2つのナンス値からマスター秘密鍵をリークさせることができます。攻撃者にしか推測できないような値であれば、被害者や第三者があらかじめ検知することもできません。
「ナンスグラインディング攻撃」と呼ばれる、リークしたい情報の一部に合致するナンスがたまたま出るまでナンスを生成し直す攻撃手法と比べると圧倒的に少ない署名回数で実現できるわけです。そして漏洩するのはマスター秘密鍵なので、署名に用いた入力に対応する秘密鍵ではなくウォレット内の全ての資金の流出につながり得ます。驚異的な攻撃ですね。
手法の細かい説明などは公表サイトにあります。
なお、現時点でこれが野生で使われた例は確認されていません。
HWWに悪意あるファームウェアが入っていないことが何より大事
この攻撃のミソであるマスター秘密鍵を意図的に選択されたナンス経由で流出させるという部分はハードウェアウォレット内の動作を定義づける悪意あるファームウェアのインストールによって可能になります。つまり、一番強い対策は悪意あるファームウェアをインストールしてしまわないことです。
これには簡単な部分と難しい部分があります。まず、普通のユーザーにはファームウェアの監査はできないので、せいぜい発行者の電子署名などで真正性を確認することくらいしかできません。なのでファームウェアアップデートはHWWのベンダから提供されている正式なツールでやること(フィッシングサイトなどに引っかからないこと)と合わせて慎重に進めることが重要でしょう。
そしてフィッシングなどによる誤インストールより対策が難しいリスクとして存在するのがサプライチェーン攻撃です。購入したハードウェアウォレットが手元に届くまでに悪意あるファームウェアに書き換えられているようなケースを考えます。このとき、HWW自体は一見通常通りの動作をするのですが、ある日突然攻撃者によって丸ごと残高を抜かれるリスクがあるわけです。
従来ハードウェアウォレットのサプライチェーン攻撃といったら「攻撃者のシードフレーズでセットアップされている」のようなものが想定されやすかったですが、自分のシードフレーズとウォレットが正しく読み込まれる悪意あるファームウェアはその何倍も悪質と言えるでしょう。
サプライチェーン攻撃に対する完璧な対策は難しいですが、パッケージの様子を確認する、ファームウェアを焼き直せるか試してみるなどのある程度の対策行動以外だと、案外DIYのハードウェアウォレットが光る部分かもしれません。SeedSignerのようなものです。この場合もインストールするファームウェアには注意が必要ですが。
汎用ハードウェアによるHWW自体、ある程度賛否両論が分かれるものではありますが。
マルチシグやAnti-Exfilと呼ばれる対策も効果的だが、別のリスクを伴う
ナンス選択の脆弱性に対する既存の対策として、Anti-ExfilというBlockstream Jadeなどで利用できる特殊な機能と、複数のベンダが提供するHWWを組み合わせてマルチシグで運用するという2つの選択肢がこれまでもありました。
マルチシグの場合、仮にどちらかのベンダのハードウェアウォレットに悪意あるファームウェアをインストールされてしまったとしても、そのHWWに保存されている秘密鍵による署名だけでは資金を動かせないばかりか、Descriptorなしにはマルチシグに含まれるUTXOすらわかりません。ただし、マルチシグで管理している資金が被害に遭わない代わりに、秘密鍵の漏洩にも気づかないので、同じ鍵でシングルシグのウォレットを作ってしまった場合は盗まれてしまうリスクがありますが。
Anti-Exfilとはナンスをそのハードウェアウォレット内だけではなく、別のデバイス(信頼するサーバーやPC)から取得したランダムデータと組み合わせることで外部的にランダム性を高める方法で、Dark Skippyで言えば攻撃者がマスター秘密鍵の内容を含むように指定したいナンスをランダムな数値で上書きしてしまいます。ナンスの生成をハードウェアに頼らないという意味では1つの解決策でしょう。
ただし、どちらも欠点やリスクを伴う対策ではあります。
例えばマルチシグは個人で運用しているユーザーは少なく、デバイスのコストは嵩み、利用やリカバリーに際してある程度の知識が必要になります。確かにNunchukやSparrowなどの一般ユーザーでも使えるレベルのマルチシグウォレットもいくつかありますが、それでも平均以上のビットコイン知識が求められることは確実でしょう。
Anti-Exfilは共通規格として用意されたものではなく、利用にさらに技術的知識が求められます(特にBlockstreamのサーバーを利用せず、サーバーをセルフホストしたい場合)。使えるウォレットも限られますし、結局「別のデバイスに問題を分散させる」という部分でマルチシグと似たプロコンを、よりニッチな内容で選択しているというところがあります。
Dark Skippyの発明者たちはPSBTの規格をアップデートしたり、ナンスにProof of Workを必要にすることでより強固にナンス経由の秘密鍵流出を防げるとしていますが、それらは実現可能性に難がある案という印象が強いです。それ以外だとDeterministic Nonces(決定性ナンス)という、ナンスを毎回ランダムに生成するのではなく(マスター秘密鍵から個別の秘密鍵を生成するように)ある規則に従ってランダム性の高い数値を使用するという提案がありますが、これは実際にそうなっていることを検証するのが難しいという問題があるようです。
提案の一覧はこちらから。
個人的には「悪意あるファームウェアをインストールしないように注意する」が何よりの対策だと感じているので、皆様もファームウェアアップデートの際はアクセスするサイト、ダウンロードするファイル、インストールする手順など細心の注意を払うようにしましょう。保管する金額が特に大きい方はマルチシグについて学ぶのもおすすめです。(NunchukかSparrowで勉強しましょう)
次の記事
読者になる
一緒に新しい世界を探求していきましょう。
ディスカッション