暗号通貨のハードウェアウォレットLedgerの脆弱性
Ledgerのセキュリティモデルを破る
耐タンパ性を謳う暗号通貨ウォレット、15歳のハッカーにより裏口を開けられる
PCに接続して暗号通貨を安全に保管する、と謳うLedgerのハードウェアウォレットの脆弱性についての記事です。冒頭は、発見者本人が書いた記事です。
Ledgerデバイスに関する注意点
基本的には、デバイスが悪意ある者に直接触れられなければ安全ですので、管理が大事です。
経緯
発見者はLedger社に2017年11月に脆弱性について連絡し、攻略用ソースコードも提供しました。
これを受けてLedger社は、先日Nano S製品向けファームウェア1.4.1を公開しました。
しかし、その後Ledger社のCEOがReddit上で行った説明が不正確として、脆弱性の発見者が自ら脆弱性について説明したのが現在です。
Ledger Nano S の構成
Nano Sは、ST社のST31H320「セキュア・エレメント」を基盤としています。しかし、ST31H320はディスプレイもUSBもサポートしません。代わりにNano Sは同じST社の32bitマイコンSTM32F042K6を搭載しています。これが全体のコントローラとなっている、というわけです。
冒頭記事の上から3分の1程度に簡単なブロック図が載っていますが、ここで着目すべきは、(ST31H320の能力から当然ですが)USBもボタンもディスプレイも、あくまでマイコンにつながっており、セキュア・エレメントは、そのマイコンにだけつながっているという点です。
マイコンは特にセキュアなわけではない汎用型で、しかもJTAGピンが背面に見える状況です。
実は、セキュア・エレメントの役割は、マイコン側のプログラムが真正のものかどうか判定することだけなのだそうです。これは「利用者がPCにNano Sを挿した時、マイコンが起動時シーケンスとして書き換え可能領域のバイナリをセキュア・エレメントに送り、真正性を確認する」というプロセスで行われます(詳細は冒頭記事の中央付近にある図を参照)。
脆弱性
さて、セキュア・エレメントで判定する際は、マイコン側からデータを送るわけです。
だから、マイコンのファームウェアを書き換えて、元のファームウェアと同じデータだけ送れば、見破ることは(セキュア・エレメントにも利用者にも)不可能です。
Ledgerは(発見者の推測では)これに対して、マイコンのフラッシュ容量が限られていることから、本来のファームウェアと悪意あるコードの両方は搭載できないだろう、とみなしたようです。ちなみに、このためにフラッシュの空き領域にはランダムデータが書き込まれているそうです。
しかし、この発見者は見事に裏をかきました。
- このマイコンのソフトウェアは、ブートローダーとファームウェアから構成されます。前者が最初に起動し、本来のアプリケーションは後者に書かれています。
- 製品開発時に双方をビルドする時、コンパイラは「初期化」や「大きな数の演算」のような共通する関数をバイナリに組み込んでしまいます(ちなみに、実際はmemcpyとmemsetと除算関数だった模様)。
- つまり、ファームウェア側の被る関数の領域を悪意あるコードに置き換えることができます。
- セキュア・エレメントに対しては、ファームウェアの改造した箇所は、ブートローダーのコードを送れば真正のものと騙せます。
- もちろんファームウェアが改造箇所の関数を必要とした場合は、ファームウェアの該当する関数を呼び出します。
- ブートローダーを温存しているので、専用のハードウェアが必要なJTAGではなく、USB経由で、しかもLedger自身が公開しているファームウェア書き換えツールで簡単かつ安全に書き換えが可能です。
ファームウェア更新版と、発見者の考える対策
※対策は実施されていません。
- 重複する関数を除去し、必要ならブートローダー側の関数を呼ぶように変更した。
- 重複する関数以外にも、コードを埋め込む手段はある。
- セキュア・エレメントでのチェック時に、時間制限を追加した(既存コードを圧縮した場合の展開や、USBからのデータ供給に対応する模様)。
- セキュア・エレメントよりもマイコンの方が高速に動作するので、小規模な処理なら挟めるはず。
発見者は15歳らしい
自称15歳、という情報しかありませんが。
解析やコードの埋め込みに加えて、冒頭の記事の文章も、ちょっと普通の15歳ではありえない水準です。両方というのは、本当なら実にすごいですね。