2021年7月28日 2 min read

ハードウェアウォレットのマイコンのセキュリティ

ハードウェアウォレットのマイコンのセキュリティ
Photo by FLY:D / Unsplash

こんにちは。AndGoのハードウェア担当の片山です。

今回はハードウェアウォレットのセキュリティについてさらに迫ってみたいと思います。ハードウェアウォレットをセットアップすると秘密鍵が生成されます。暗号資産を送金するときには秘密鍵を使ってトランザクションとよばれる「○○宛に●●BTCを送金します」という情報に署名したあと,ブロックチェーンに書き込まれるのを待つことになります(鍵で署名をするという不思議な表現ですが・・・)。

そこで,もしこの秘密鍵が他人に渡ってしまうと「X宛へ●●BTC送金」というトランザクションに本人でなくても署名できてしまうため,皆様の大切な財産が脅かされることになります。さらに匿名性が高いビットコインの場合には,送金先アドレスまでは分かるものの,犯人「X」を特定することは事実上不可能です。

ハードウェアウォレットから秘密鍵を盗み出す経路

ハードウェアウォレットは秘密鍵をオフラインで保管する署名装置です。もし,秘密鍵が盗まれるとしたら2つの経路があります。1つ目はインターネット経由,2つ目は物理的な盗難,です。

「インターネット経由」というのは,ハードウェアウォレットから送金するときに,ハードウェアウォレットをPC等とUSBやBluetoothなどで接続するときです。ハードウェアウォレットにはトランザクションがダウンロードされ,ハードウェアウォレットが持っている秘密鍵で署名して,署名済みのトランザクションがPCに再びアップロードされ,ネットワークに流されます。この瞬間に何かしらの攻撃することができるかもしれません。

「物理的な盗難」の場合には,犯人は何らかの方法でハードウェアウォレットから秘密鍵を盗もうとします。通常の動作ではハードウェアウォレット側からはセットアップ時以外には秘密鍵を教えてくれることはありません。犯人はハードウェアウォレットそのものに細工をして鍵を盗み出すことができるかどうかがポイントになります。

この2つの方法の可能性について考えていきます。先日紹介した,Trezor Oneに搭載されているSTMicroelectronics社のSTM32F205RET6というマイコンを例に見ていきます。

インターネット経由で秘密鍵を盗み出す

ハードウェアウォレットをPCに接続した時にPCができることは何でしょうか。まず考えられそうな手段としてはマイコンに何らかのコマンドを送信して秘密鍵を盗むことができそうです。これは実際には不可能です。というのも,ファームウェアにそのようなコードが用意されていないからです。開発者が意図的にそのようなコードをいれていれば別ですが,Trezorについてはファームウェアそのもののソースコードも公開されていますので,もしそのようなコードが入っていればすぐに分かってしまいます。

他の手段としてはファームウェアそのものを書き換えてしまう方法です。しかし,Trezorの中にはファームウェアそのものをチェックする仕組みがあり,Trezorの製造元の署名がある正当なファームウェアでないと書き込むことができません。ファームウェアのソースコード([https://github.com/.../legacy/bootloader/signatures.c))を見るとファームウェアの署名にはビットコインの公開鍵暗号と同じECDSA (secp256k1)を使っているようですので,犯人が不正なファームウェアを作れるということは,ビットコインの公開鍵から秘密鍵を作れるということなので,そもそもTrezorのファームウェアに手を出さなくても直接ビットコインを盗めばよい!?・・・ということになります。結果的にハードウェアウォレットが守られるという素晴らしい設計ですね。

他にはPC側のソフトウェアを不正なものに入れ替えて,トランザクションそのものを書き換えるという手口もあります。トランザクションの送金アドレスを犯人の公開鍵にすり替えて,気づかなかったユーザーの署名させるというものです。しかし,この場合はハードウェアウォレットに異なる公開鍵が表示されますので,しっかりと確認することが重要です。

Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to ビットコイン研究所.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.