フォールトインジェクション攻撃について
はじめに
お久しぶりです。
ちょっと世間の流行りから遅れましたが無職転生にハマりました。 アニメ見て、なろう読んで気付いたら2月も中旬……。
ということでリレーブログのお時間です。
今回のテーマはフォールトインジェクション攻撃。
名前は聞いたことがありますが、それだけです。
さらっと調べてまとめていきましょう。
概要
フォールトインジェクション攻撃とは、ハードウェアに対してグリッチを印加させることで不正な動作を引き起こすという攻撃です。
一口にグリッチといっても様々で
- 電圧グリッチ(Voltage Fault Injection)
- クロックグリッチ(Clock Glitch Fault Injection)
- 電磁グリッチ(EMFI: Electromagnetic Fault Injection)
- 光・レーザー(Optical Fault Injection)
などが攻撃に用いられるようです。
ソフトウェアやWEBアプリケーションに対してもフォールトインジェクション攻撃という言葉が使われる事もあるようですが、今回はハードウェアに対象を絞って今挙げた手法をまとめていきたいと思います。
電圧グリッチとクロックグリッチ
特定の処理においてグリッチを印加させることで誤作動を引き起こすことができる場合があります。 例えば下記のようなコードがあったとします。
result = false if(result) unlock() else lock()
本来であればlock()が実行されるはずですが、if(result)が実行されるタイミングでグリッチが印加されるとunlock()が実行されることがあるという話です。
CDIのブログでもうちょっと具体的に解説されているので、気になる方はこちらを読んでみると良いかもしれません。
タイミングがシビアで成功させるのは大変そうですが、↑の記事によるとNintendoコンソールのセキュアブートを回避するためにこの手段が取られた事例*1があるとのことです。
また、クロックパルスにグリッチを印加してクロックタイミングを都合よく変更することで、セキュリティ実装等をバイパスできることがあります。
こちらも成功させるためのハードルが高いですが、条件さえ満たせば理論的には悪用が可能です。
電磁グリッチとレーザー照射
電磁グリッチを印加させることで上記のような動作を引き起こすことも可能です。
内部のチップ回路内に電流を誘導する局所的な高強度電磁パルス(グリッチ)を与えることで、セキュリティ実装を回避し得る事例も見つかっています。
CVE-2020-13629は電磁グリッチを使ってセキュアブートなどを回避できる可能性があるというものらしいです *2。
また、赤外線レーザー(光グリッチ)などを照射してフラッシュメモリなどを攻撃するようなものもフォールトインジェクションに入る場合があるようです。(余りここら辺はよく分かってないです……)
まとめ
なかなか難しかったです。 自分の理解が浅いため、余り実のある内容が書けませんでしたがハードウェアに自信のある方なら下の参考文献あたりを漁ることで結構理解できるのではないかななんて思ってます。
ちなみに命令の複製、電圧の監視、PLLの使用などでフォールトインジェクション攻撃の対策ができるようです。
ちょっと対策に関しては自分の薄い知識では文章書けるほど理解できなかったので割愛しましたが、そこらへんも含めて下の参考文献読んでみて下さい(丸投げ)。
参考文献
IoT Security - Part 20 (101 - Introduction to Fault Injection Attack (FI))
Voltage Fault Injection をやってみた - DARK MATTER
An Introduction to Fault Injection (Part 1/3) – NCC Group Research