2019年6月8日から9日にかけて、アムステルダムでBreaking Bitcoinというカンファレンスが行われました。

本コラムは、公開された動画や書きおこしをもとに、その発表内容を追いかけ、ビットコインのセキュリティに関する取り組みの最先端を知ろうという試みです。発表内容を日本語で、かつ実際の事例などを交えて解説することで、少しでも皆様がビットコインの仕組みや最新の研究について詳しくなるための一助になれることを願います。

今回は、ハードウェアウォレットからシードが取り出せるか、というお話について後半部分をお届けします。

関連記事はこちら
前回の記事では、ハードウェアウォレットからのシード抽出の可能性について、前編という形で見解を紹介しています。本コラムの前提として、別の事例を掲載しておりますので、ぜひこちらからご覧になっていただくと幸いです。

ハードウェアウォレットからシードは取り出せるのか -前編-

サイドチャネル攻撃

サイドチャネル攻撃とは、外部から電波や電力などを観察し分析することで処理されている内容や情報を推測するという攻撃です。ここではPINとシードについて述べていきます。理論的には、計算中のデバイスの消費電力を測定し、データと電力消費量との相関関係を精密に分析することでどのようなデータが処理されているのかを推測することが可能になるという行為です。

まずTrezorについて、さまざまなランダムのPINを送信し、相関関係について調べました。相関がみられるなら、PINの推測が可能になります。

現在、手元にデバイスが1つあり、電力を完璧に測定済みでPINコードによってどのような消費電力が計測されるか、分かっています。そこで、現実的かどうかはさておき、画面は見られないですが電力消費だけが分かるとします。この状態でサイドチャンネル攻撃を行います。

ここでのアプローチは機械学習です。アルゴリズムに対し、PINと電力消費に関するラベル付きデータセットを大量に用意して学習させます。

Trezorでは何度かPINを入力することができますが、この方法では平均5回で攻撃が成功しました。入力回数は15回なので、十分に攻撃は成立しています。この結果は脆弱性として2018年11月20日に開示されました。現在もサイドチャネル攻撃は可能だと思われますが、恐らく15回以上かかるため、デバイスはワイプされてしまうでしょう。

シードの抽出

Trezor One、Keepkey、BwalletやTrezor Tから、シードを抽出することは可能でしょうか。試したところ可能であり、仕様上、修正できない類の問題であるため、将来もシードの抽出を不可能にすることはできないと思われます。

ユーザー保護のため、詳細は開示されません。以下のように概要のみ示されています。

まず、シードの抽出には物理的なアクセスが必要です。コンピュータ1台あたり100ドルほどの初期コストがかかります。また、処理に必要な時間は、準備に3分、抽出に2分。さらに、抽出器と呼ばれている魔法の箱があり、それがデバイスからシードを抽出するために2分かかります。

また、物理的な脅威は防ぎようのない部分もあるため、盗難には十分注意してください。

なお、この脆弱性は2018年12月20日に開示され、Trezorは報奨金を提供し、プレスリリースも出してくれました。

シャミールの秘密送信

HTC Exodusスマートフォンは「ネイティブウェブ3.0 ブロックチェーン対応の電話機」であり、ハードウェアウォレットや信頼性の高いディスプレイ、そしてソーシャルキーの回復機能を備えています。このスマートフォンには、Qualcomm SnapDragon 845 SoCが使用されており、性能面でも優秀です。論理的な保護としては、Zionアプリがあり、シードはセキュアなOS内部に保存されています。また、ソーシャルキーの回復機能もあります。

ソーシャルキーの回復機能は興味深く、これに着目して研究しました。

シードをバックアップしたいときの話ですが、シードを生成するときにユーザーが連絡先リストで「信頼できる連絡先」を選択し、HTCが提供するZionアプリをインストールするように依頼します。

このアプリは3-of-5共有となっており、シードを構築するためには3つの情報が必要となります。これにより、仮に悪意のある人間(友達の一人かもしれませんが)が攻撃を行おうとしても、さらには誰かと結託したとしても、1つもしくは2つの情報では攻撃が難しくなるはずです。

3-of-5共有には、シャミールの秘密共有が用いられています。詳細はこうです。

まずは秘密情報を生成するときに次数2の多項式を生成します。この多項式を5つの異なる点で評価し、これらを信頼できる連絡先と共有します。ラグランジュの定理のため多項式の値を取得して評価する、つまり秘密を解読するためには3つの点の情報が必要になるというわけです。これは素晴らしい仕組みであり、完全に機能しているといえます。

一方、HTCのAndroidアプリケーションはどうでしょうか。そこで、このアプリを分析するためにリバースエンジニアリングを行いました。32の異なる多項式で256ビットシード(32バイト)を共有し、シャミールの秘密共有を実装していました。係数は疑似乱数でランダムに生成され、この値は秘密にしておく必要があります。

しかし残念ながら実装自体に問題があり、疑似乱数の更新操作が線形になっていて、適切に更新されていませんでした。つまり完全にランダムな係数を持つような、期待される精度の多項式が得られず、係数に一定の法則を持ってしまう脆弱性が発生しています。

秘密を解読しようと考えたときラグランジュの定理によれば3つの情報が必要となり、768個の方程式を解かねばならないところですが、このアプリではその数が実際は512以下となっています。一言で説明すれば、2つの情報だけで秘密が解読できてしまうということです。

さらに悪いことに、ファームウェアv1.54.2401.6では、疑似乱数の生成が固定値から行われます。つまり、アプリケーションをリバースエンジニアリングすると値が計算できてしまうので、多項式がより簡単になってしまいます。このような状況での解読であれば、1つの情報で十分でしょう。このアプリではシャミールの秘密共有が正しく実装されていないので、シャミールの秘密送信とでも呼ぶべき脆弱性を生んでいます。

そこでこの情報をHTCセキュリティチームに開示したところ、彼らは迅速にパッチを適用しました。しかしその後ユーザーにシードを再生成するようなアナウンスはなされていません。もし「信頼できる連絡先」とした相手が古いZionアプリを使っている場合、シードが簡単に取り出せる状態になっている可能性があるので注意が必要でしょう。

これを受け、Zionアプリについてもバウンティプログラムが立ち上がったというプレスリリースが発表されていました。ご利用されている方は、最新かどうかやリリースノートなどをご確認いただくと良いでしょう。

おわりに

ここでは、Trezorなどのハードウェアウォレットで報告された脆弱性、そして手法について解説を行いました。いずれも基本的には物理的なアクセスであったり、古いバージョンでは修正済みのものが開示されています。

こういった研究がセキュリティ研究者によって常に行われていること、技術も日進月歩であることから、ユーザとしては、最新バージョンを利用すること、物理的なデバイスを紛失しないようにすることが望ましいセキュリティ対策となります。当たり前ではありますが、今一度バージョンなどを確認することをお勧めします。

記事中の表現については講演資料を筆者なりに読み解きつつ、前後で独自の解説を加えておりますが、なにぶん新しい技術に関する内容ですので、もしも間違いなどございましたらお気軽にご指摘くださいませ。(特に技術的な指摘は大歓迎です)

【寄稿者情報】

坪 和樹

クラウド業界で働くエンジニア、アイルランド在住。 MtGox や The DAO では被害を受けたが、ブロックチェーンのセキュリティに興味を持ち続けている。セキュリティカンファレンスでの講演、OWASP Japan の運営協力や Mini Hardening といったイベント立ち上げなど、コミュニティ活動も実績あり。
おすすめの記事