こんにちは。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つのタイプあります。
ソフトウェア攻撃・・・ファームウェアのバグやプロトコルの弱点をついた攻撃です。マイクロコントローラーのファームウェアは一般的なコンピューター向けのソフトウェアと比較すると小規模ですので,バグが入る余地は比較的少ない。
ハードウェア非侵襲攻撃・・・今回紹介した電圧グリッチを利用した攻撃が代表例です。他にも温度やクロックの変化によって攻撃できる可能性があります。ハードウェアに対する攻撃ですので,攻撃可能かどうかはマイクロコントローラーの製品ごとに変わってきますが,ファームウェアアップデートで対応されにくい弱点となります。
ハードウェア侵襲攻撃・・・マイクロコントローラーの集積回路に直接アクセスします。顕微鏡やプロー簿を用いて解析をします。原理上はどのようなマイクロコントローラーに対しても有効ですが,非常に高価な設備と集積回路に関する高度な専門知識が必要になります。コストも10万ドル〜数百万ドルかかるので,それに見合ったリターンが必要です。
これらを踏まえてセキュリティ対策を考えていきたいと思います。まずは基本的なことですが,物理的にハードウェアウォレットを盗まれないようなところに保管しておくことが一番です。そしてPINは桁数が多く推測されないものにし,冒頭で述べたパスフレーズを設定することで,時間稼ぎをすることができます。それよりもニモニックをどこにどうやって保管しておくかのほうが重要かもしれません。
もし巨額の資産を持っているのであれば,耐タンパー性が高いハードウェアウォレットを選ぶことで,ハードウェア非侵襲攻撃・ハードウェア侵襲攻撃に対して有効となるでしょう。
ソフトウェア攻撃に関しては多くの人にレビューされているオープンソースのファームウェアを使い,可能であれば自分でも検証を行うと安心です。信頼のおける企業が製造・販売しているハードウェアウォレットを購入することが有効です。(もちろん多くの人が使っているハードウェアウォレットが攻撃の対象になりやすいことも事実ですが・・・)
*1 https://blog.kraken.com/.../kraken-identifies.../...
*2 https://www.st.com/ja/development-tools/st-link-v2.html
*3 FPGA (Field Programmable Gate Array)というのはマイニングをされている方でしたら耳にしたことがあると思いますが,書き換え可能な論理回路のことで,CPUやマイクロコントローラーと比べると特定の用途に特化された処理を高速に行うことができるものです。
*4 STM32F205ではレベル0では2進数で10101010,レベル2では11001100というビット,レベル0ではそれ以外のビット列をオプションバイトに書き込みます。電圧グリッチによるビット列の変化は偶発的なものなので,オプションバイトのRDPに該当する部分が,レベル2の11001100からレベル0の10101010へ変更される確率が非常に低いためです。レベル1であれば8ビットのうち1ビットでも変化すればよいので,可能性が高くなります。
*5 https://www.st.com/.../dm00493651-introduction-to-stm32...