2021年12月22日 3 min read

ハードウェアウォレットの脆弱性を突く

ハードウェアウォレットの脆弱性を突く
Photo by Jozsef Hocza / Unsplash

こんにちは。AndGoのハードウェア担当の片山です。毎週水曜日はAndGoのエンジニアが交代で技術に関するマニアックな記事を皆様にお送りしています。

2020年の記事ですが,KrakenがTrezorにPINと秘密鍵を取り出すことに成功したと発表しました*1。以前の記事でもご紹介しているように,オープンソースのハードウェアウォレットではマイクロコントローラーのフラッシュメモリに暗号化された秘密鍵やPINのハッシュなどの情報を保存しています。Trezorに使用されているマイクロコントローラーであるSTM32F2シリーズは,セキュリティ設定により普通のやり方ではフラッシュメモリの内容を取り出すことはできないのですが,「電圧グリッチ」を与える手法により設定を不正に変更してフラッシュメモリの内容を読み出し,PINと秘密鍵を取り出すことに成功しています。今回はこの攻撃についての解説とマイクロコントローラーのセキュリティについて述べていきたいと思います。

(現在のTrezorで設定できるパスフレーズを用いることで,今回ご紹介する攻撃だけでは簡単に資産が盗まれないようになっています。[https://blog.trezor.io/.../passphrase-the-ultimate... もご参照ください。)

電圧グリッチにより秘密鍵を盗み出す

STM32F2シリーズはデフォルトの状態ではデバッグポートに$20程度で購入できる装置*2を介してPCと接続するだけで内部のフラッシュメモリ(電源を落としても内容が消えないメモリ)やSRAM(電源を落とすと内容消える一時的なメモリ)の状態を読み出すことができます。これは開発時のファームウェア書き込みやデバッグのためのものです。

STM32F2シリーズでは,ユーザーにデバッグポートを介したアクセスをさせないために,ReaD Protection (RDP)という設定を行うことができます。RDPのレベルには3種類あり,レベル0(フラッシュメモリとSRAMにフルアクセス可能),レベル1(フラッシュメモリにはアクセスできないが,SRAMにはフルアクセスできる),レベル2(フラッシュメモリにもSRAMにもアクセスできない)があります。RDPの設定はオプションバイトと呼ばれるフラッシュメモリの領域に格納されています。一度,レベル1もしくはレベル2に設定してしまうと,通常はこの設定は変更することはできなくなり,レベルを下げることができなくなります。Trezorでは最も厳しいレベル2が設定されていて,秘密鍵が入っているフラッシュメモリーや,一時的なデータが格納されるSRAMには外部からのアクセスはできなくなっています。

ところが,マイクロコントローラーに供給している電源電圧を故意に一瞬下げることによって,誤動作を引き起こしてRDPの設定を変更することができる場合があります。これを「電圧グリッチ」といいます。通常は電源電圧は外付けのコンデンサ(電力を蓄える電子部品)などで安定化されており,ユーザーが普通に使っている場合は電圧グリッチが起きることはありません。しかし,コンデンサを取り外し,然るべきタイミングで電源電圧を変化できる回路を使うことで,意図的にマイクロコントローラーを誤動作させることができます。昔のゲーム機(古い話ですがファミコンやスーパーファミコンあたり・・・?)は衝撃を与えると誤動作して画面が乱れたり,変な動作をしたりしたことを覚えていらっしゃる方もいると思いますが,その現象と全く同じものです。

Krakenの記事では電圧グリッチの発生に,Digilent Arty A7 FPGA開発ボード*3というものを使い,マイクロコントローラーの状態を監視しつつ,電圧グリッチのタイミングを制御します。実際にはレベル2からレベル0へ一発で変更するのが難しい*4ので,まずRDPをレベル2からレベル1に変更します。その次に,レベル1で禁止されているフラッシュメモリの読み出しに必要な命令を送るタイミングでもう一度電圧グリッチを行うことでRDPのチェックを通り抜けることで,フラッシュメモリの内容を読み出します。

秘密鍵はPINとフラッシュメモリの中に入っているソルト(ランダムデータ)によって暗号化されています。PINを検証するコードもフラッシュメモリに入っているので,総当りでPINを見つけることもできてしまいます。シングルコアのCPUでも4桁のPINで2分以内でできてしまうのでフラッシュメモリの中身さえ取り出せてしまえばその後は非常に簡単です。

マイクロコントローラーへの攻撃タイプとセキュリティ対策

マイクロコントローラーへの攻撃方法についてはSTMicroelectronicsが公開しているアプリケーションノート*5が参考になります。攻撃の種類としては3つのタイプあります。

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.