低予算でのレーザーフォールトインジェクション:RP2350エディション
Laser Fault Injection on a Budget: RP2350 Edition (courk.cc)
要約
本記事では、Raspberry PiのRP2350マイクロコントローラーのセキュリティ機能を破るための、低予算で構築可能なレーザーフォールトインジェクション(LFI)プラットフォームについて解説しています。RP2350のセキュアブート機能をバイパスするために、カスタムプラットフォームを用いてチップのダイにレーザーを照射し、意図的に誤動作を引き起こす手法が紹介されています。このプラットフォームの設計ファイルも公開されており、同様の攻撃を再現したい研究者や開発者向けに詳細な技術情報が提供されています。
全文翻訳
低予算でのレーザー故障注入:RP2350エディション
はじめに
2024年8月、Raspberry Pi はRP2350マイクロコントローラーを発表しました。このチップはRP2040の改良版であり、セキュアブート実装のようなセキュリティ関連機能を含む多数の新機能が搭載されています。
発表から数日後、DEFCON 2024で開催された興味深いチャレンジで、これらの新機能が標的となりました。それがRP2350ハッキングチャレンジです。
数週間の作業と、完全にカスタムな「レーザー故障注入プラットフォーム」の開発を経て、私はこのチャレンジをクリアし、私の発見をRaspberry Piに提出しました。
この記事では、このカスタムプラットフォームに関する技術的な詳細を、興味のある方が自身のものを作成するための製造ファイルを含めて提供します。さらに、単一のレーザー誘発故障を注入することで、RP2350のセキュアブート機能をどのようにバイパスできるかを説明します。
警告
この記事で紹介する「レーザー故障注入プラットフォーム」は、高出力の赤外線レーザー源を使用します。このような部品は危険を伴う可能性があります。この作業を試みる場合は注意してください。
ハッキングチャレンジとRP2350のセキュリティ機能
チャレンジの目的
このチャレンジの標的はPico 2ボードで、RP2350マイクロコントローラーを搭載しています。このボードは、チャレンジのGitHubリポジトリで提供される指示に従って設定する必要があります。
リポジトリの指示に従うと、以下のようになります。
- RP2350のOTP領域の1つに「秘密の」データを書き込みます。
- セキュアブート機能を設定・有効化し、チップを可能な限りロックします。これには、デバッグインターフェイス(SWD)の無効化や、グリッチ検出器などの各種セキュリティ機能の有効化が含まれます。
- 秘密が保存されているOTP領域へのアクセスをさらに制限する署名付きファームウェアをフラッシュします。
チャレンジの目標は、セキュアブート機能をバイパスする可能性のある方法を見つけて、秘密のデータを復旧することです。
セキュリティ機能
セキュアブート機能は、RP2350のブートROMに含まれるコードによって強制されます。このコードは、ソフトウェア的な手法を超えて、ハードウェア固有の機能を利用して強化されています。
これらの機能は主に、「冗長性コプロセッサ(Redundancy Co-Processor)」と呼ばれる革新的なコンポーネントに関連しています。RP2350データシートからの引用です。
冗長性コプロセッサ(RCP)は、RP2350のブートROMで、フォールトインジェクションおよびリターン指向プログラミング攻撃に対するハードウェア支援による緩和策を提供するために使用されます。これには、以下の命令が含まれます。
- ブートごとのランダムシードに基づいたスタックカナリア値の生成と検証
- プログラムの特定のポイントが、ステップを省略せずに正しい順序で実行されていることの確認
- 32ビットワードに格納された2つの有効なビットパターンのいずれかとして格納されたブーリアン値の検証
- XORパリティマスクを使用して2つのワードに冗長に格納された32ビット整数の検証
- ソフトウェアで検出されたパニック状態に達したときのプロセッサの停止
[...]
各コアのRCPは64ビットシード値(セクション3.6.3.1)を持っています。RCPはこの値を使用してスタックカナリア値を生成し、RCP命令に短い擬似ランダム遅延を追加します。
さらに、RP2350はグリッチ検出器を使用してフォールトインジェクションの試みを検出する能力があります。これらの設定可能な回路は、電圧または電磁フォールトインジェクションの試みに応答してシステムをリセットします。このチャレンジでは、これらの検出器は最大感度レベルに設定されています。
記事の概要
以下は、記事の内容の簡単な概要です。
なぜレーザー故障注入を選択したのか
RP2350のブートROMはチャレンジ開始前に監査されていたため、ロジックバグを見つけようとはせず、すぐにフォールトインジェクション攻撃のようなハードウェア攻撃を検討しました。
しかし、オンラインコメントを見ると、RP2350に実装されたグリッチ検出システムは、単純な電圧フォールトインジェクション攻撃を緩和するのにかなり効率的だったようです。
そのため、グリッチ検出回路から離れた場所にレーザービームを集中させれば、それらをトリガーせずに故障を注入できると仮定し、レーザー故障注入でチャレンジに取り組むことをすぐに決定しました。
ここで問題は、「古典的な」電圧フォールトインジェクション攻撃の経験はあったものの、レーザー故障注入については何も知らなかったことです。
このチャレンジは、完全にカスタムで安価なレーザー故障注入プラットフォームを構築する機会となりました。
伝統的に実装コストが高いことで知られていますが、過去数ヶ月で、レーザーを使用した故障注入を目指すいくつかの「安価な」プラットフォームが登場しています。
- Laser Fault Injection for The Masses は、レーザー彫刻ハードウェアを再利用しています。
- NetSPIの「RayV-Lite」。
ただし、執筆時点では、このプロジェクトに関する公開されている技術的詳細はほとんどありません。
注記
私の間違いです。いくつかの調査の後、Blackhat 2024で発表された「RayV-Lite」のプレゼンテーションを見つけました。彼らのプロジェクトは私の「レーザー故障注入プラットフォーム」と多くの類似点がありますが、興味深い違いもあります。この記事でこれらの違いのいくつかを強調し、彼らの作品もチェックすることをお勧めします。
2025年8月更新: さらに多くの資料が公開されました!これにはNetSPIのウェブサイトの記事が含まれます。
サンプル準備
LFIの考え方は比較的単純です。集束されたレーザービームをターゲットコンポーネントのシリコンダイに向けます。トランジスタは光電効果に敏感であり、放出された光は一時的な故障や誤動作を引き起こすのに十分です。正確なタイミングでこれらの故障を利用して、セキュリティ機能をバイパスすることができます。
電圧またはクロックグリッチングと比較した場合のこのような攻撃の大きな欠点は、ターゲットのシリコンダイを露出させる必要があることです。もちろん、ダイが露出した後でも回路は正常に動作する必要があります。
シリコンへのアクセスは、パッケージ化されたチップの上面から、または下面から試みることができます。
[画像: パッケージ化された集積回路の上面と下面の簡略化されたレンダリング]
パッケージ化された集積回路の上面と下面の簡略化されたレンダリング
私はダイの背面から露出させることを選択しました。この選択には2つの理由があります。
- 背面へのアクセスは、安価な機械工具で達成できます。しかし、ダイの上面を露出させるには、私が扱いたくない濃硝酸のような化学薬品が必要になるでしょう(濃硝酸について)。
- オンラインで入手可能な画像によると、ダイの上面は金属層で完全に覆われているようで、故障注入を複雑にする可能性があります。
シリコンダイの背面を露出させるために開発したプロセスは、この記事の関連セクションで詳しく説明します。
ダイイメージングとレーザー集光
LFIは、ダイの比較的正確な領域を、集束されたレーザービームで標的とする必要があります。この目的のために、カスタムで安価な「レーザー故障注入プラットフォーム」が設計されました。
[画像: レーザー故障注入プラットフォーム]
レーザー故障注入プラットフォーム
このプラットフォームのデザインは非常に予算重視であるため、多くの場所でコスト削減が必要となり、様々な制限が生じました。これらの制限、および様々な技術的な詳細と動作原理は、この記事の対応するセクションで詳しく説明します。
他の人が私の結果を再現できるように、関連する製造ファイルとソースコードも共有します。
故障注入とセキュアブートバイパス
故障を注入できることは、RP2350を攻撃する最初のステップにすぎません。前述のように、グリッチ検出器はRaspberry Piがシステムを保護するために開発した唯一のセキュリティ機能ではありません。
また、セキュアブート機能が実装されているコンポーネントのブートROMに弱点を見つける必要があります。この記事の関連セクションで、私が標的とした特定の命令シーケンスについて議論します。
サンプル準備
このセクションでは、攻撃を実行するために必要な初期ステップについて説明します。ターゲットRP2350のダイの背面を慎重に露出させ、チップの機能が損なわれないようにする必要があります。
ダイ露出
まず、ターゲットのRP2350をPico 2ボードからハンダ付けで取り外す必要があります。これは、シンプルなホットエアリフロー装置で達成できます。
次に、安価な(30ユーロ)ドレメル風のツール、「彫刻ツール」(Amazon部品番号: UKH062_FR)を使用して、グランドパッドの周りの材料を慎重に除去します。
[画像: ダイ露出に使用したツール]
ダイ露出に使用したツール
十分な材料が除去されたら、金属製のグランドパッドを取り外し、銀色(熱伝導性?)のペーストのような層を露出させます。このペーストは簡単に削り取ることができ、ダイの背面を露出させます。
[画像: 機械研削後に露出した背面]
機械研削後に露出した背面
メインキャリアボード
準備されたサンプルは、レーザー故障注入プラットフォームと統合するように設計されたカスタムPCBにハンダ付けできます。
[画像: RP2350背面キャリアボード]
RP2350背面キャリアボード
中央の穴がRP2350ダイの背面を露出させます。
[画像: ボードの背面ビュー、ダイが見える]
ボードの背面ビュー、ダイが見える
ボードには、コアに電力を供給するためだけに使用される小さなLDOを除いて、他に何も含まれていません。電源と制御信号はFFCコネクタにルーティングされます。
flowchart LR
B{{FFC Connector}} <-->|UART| A(RP2350)
A <-->|SWD| B
A <-->|USB| B
A <-->|QSPI| B
A <-->|Control Signals| B
B .->|3V3| A
B .->|3V3| C((LDO))
C .->|1V1|A
メインキャリアボードのアーキテクチャ図
このPCBは手作業で組み立てることができ、少量生産の場合の総BOMコストは10ユーロ未満と推定されます。
[画像: インタラクティブ3Dレンダリングとデザインファイル]
インタラクティブ3Dレンダリングとデザインファイル
I/Oボード
上記で詳細を説明したメインキャリアボードは、FFCケーブルを介してI/Oボードに接続されます。
[画像: I/Oボードとメインキャリアボード、3Dプリントされたホルダーに配置]
I/Oボードとメインキャリアボード、3Dプリントされたホルダーに配置
これらの2つのボードの組み立ては、レーザー故障注入プラットフォームと統合するように設計されています。
[画像: I/Oボードとメインキャリアボード、レーザー故障注入プラットフォームに配置]
I/Oボードとメインキャリアボード、レーザー故障注入プラットフォームに配置
I/Oボードは、様々な制御信号を以下のインターフェイスに展開します。
- USBコネクタ
- 攻撃のロジック実装に使用されるFPGAボードに接続されたピンヘッダー
- SWDデバッグに使用されるいくつかのテストポイント(SWDはこのチャレンジでは無効にする必要があるため、めったに使用されません)
flowchart TB
A((LDO)) .->|3V3| B((Power Switch))
C{{USB Connector}} .->|5V| A
C <-->|USB| D{{FFC Connector}}
B .->|3V3| D
E{{Pin Headers}} -->|Enable| B
D <-->|Control Signals| E
D <-->|QSPI| E
D <-->|UART| E
D <-->|SWD| F(Test Points)
D <-->|QSPI| G(QSPI Flash #0)
D <-->|QSPI| H(QSPI Flash #1)
I/Oボードのアーキテクチャ図
さらに、ボード上には2つのQSPIフラッシュが搭載されています。「アクティブ」なフラッシュ、つまりRP2350の~CSラインに接続されているフラッシュは、FPGAから選択できます。これは、「アクティブ」フラッシュをRP2350から外部メモリへの各要求間で切り替えることができることを意味します。
次の図で詳細を説明するこの機能は、この記事で説明する攻撃に不可欠です。
flowchart LR
A(RP2350) -->|CS| B(FPGA)
B -->|CS#0| C(QSPI Flash #0)
B -->|CS#1| D(QSPI Flash #1)
デュアルフラッシュシステム
ここでも、ボードは手作業で組み立てることができます。少量生産の場合の総BOMコストは15ユーロ未満と推定されます。
[画像: インタラクティブ3Dレンダリングとデザインファイル]
インタラクティブ3Dレンダリングとデザインファイル
グランド接続の修理
ダイにアクセスするためにグランドパッドを除去することの明らかな問題は、集積回路への唯一のグランド接続が破壊されることです。
RP2350には内部DC/DCコンバータに接続されたPGNDピンがありますが、グランドへの低インピーダンスの内部接続はないようです。代わりに、十分なグランド接続を復元する方法が実装されました。
見るのは少し難しいですが、露出した銅(または金?)の斑点や、切断されたボンドワイヤーがおそらく通っていた「穴」が見えます。これらの領域をわずかに削ると、より導電性の高い材料が見つかることがあります。
[画像: 露出したダイの近くに見える金属の斑点]
露出したダイの近くに見える金属の斑点
領域1と2の拡大図を以下に示します。
注記
これらの拡大画像は、レーザー故障注入プラットフォームのイメージング機能のおかげでキャプチャされたことに注意してください。このプラットフォームのカメラセンサーにはIRフィルターがないため、異常な色になっています。
[画像: 領域1の拡大図]
領域1の拡大図
[画像: 領域2の拡大図]
領域2の拡大図
キャリアボード上に意図的に配置された銅パッドと、これらの小さな露出した金属片の間に導電性エポキシを塗布することで、十分なグランド接続を復元するのに十分でした。
[画像: 塗布されたエポキシ接着剤のビュー、硬化後]
塗布されたエポキシ接着剤のビュー、硬化後
私が使用した製品の参照はMG CHEMICALS 9410です。これは1液型で、温度活性化エポキシです。約10分間、150°Cのホットエアステーションを使用して硬化させました。
制限事項
このプロセスは、もちろん、少しリスクが伴います。数回の試行の後、私はこれに慣れましたが、100%の成功率を主張できるとは思えません。
さらに、導電性エポキシのおかげで復元されたグランド接続は、完璧とは程遠いです。例えば、通常、このような改造されたRP2350を高クロックスピードで実行することはできません。なぜなら、より高い電流が引き込まれる結果になるからです。
最後に、一部のI/Oパッドが動作しなくなったり、信号整合性の問題に直面したりすることがあることがわかりました。すべてのグランドボンドワイヤーがダイ上で内部的に接続されているかは定かではありません。それらのすべてに対して十分な接続を復元できていない可能性があります。
しかし、攻撃の標的はブートROMです。このROMによってハードウェアは非常に保守的に設定されています。クロックスピードは低く、などです。この文脈では、「グランド接続修理」方法は十分であるように思われます。
これらの問題を克服するために、グランドパッドの中心部のみをフライス加工してダイを露出させ、ボンドワイヤーをそのまま保持することが可能かもしれません。これには、CNCフライス盤と精密ビットへのアクセスが必要になるでしょうが、私は現在それを持っていません。
レーザー故障注入プラットフォーム
プラットフォーム概要
前述のように、このプロジェクトのためにカスタム故障注入プラットフォームが設計されました。このハードウェアセットアップは、再現性の点でよりプロフェッショナルなシステムには敵わないかもしれませんが、コストは1桁は安いでしょう。
[画像: プラットフォーム、カスタムRP2350エレクトロニクスを装着]
プラットフォーム、カスタムRP2350エレクトロニクスを装着
プラットフォームは2つのサブシステムに分けることができ、それぞれを個別に詳細に説明します。
- 位置決めステージ:ターゲットRP2350のダイを観察とレーザー集光のために精密に移動させるために使用されます。
- 光学サブシステム:ダイを視覚化し、高出力レーザーパルスを集光するために使用されます。
[画像: インタラクティブ3Dレンダリング]
インタラクティブ3Dレンダリング
位置決めステージ
位置決めステージはOpenFlexure Delta Stage(McDermottら、2022年)に基づいています。OpenFlexureプロジェクトは印象的で、それなしではあまり達成できなかったでしょう。高精度の機械的位置決めは、シンプルな3Dプリント部品と安価なステッピングモーターで実現されます。
注記
「RayV-Lite」システムもOpenFlexureプロジェクトに基づいていますが、私がここで選択したDelta Stageではありません。
公式のOpenFlexure Delta Stageにはマイナーな変更が加えられています。
- カスタム光学サブシステムを収容するために、ステージのベースが上げられました。
- 前述のセクションで紹介したカスタムエレクトロニクスをサポートするために、様々な場所にヒートセットねじ込みインサートが追加されました。
[画像: インタラクティブ3Dレンダリングとデザインファイル]
インタラクティブ3Dレンダリングとデザインファイル
光学サブシステム
光学サブシステムは、ダイを視覚化し、高出力レーザーパルスを集光するために使用されます。このサブシステムは、OpenFlexureプロジェクトの反射照明サブシステムに触発されています。ただし、位置決めステージとは異なり、大幅な変更が加えられています。
[画像: インタラクティブ3Dレンダリングとデザインファイル]
インタラクティブ3Dレンダリングとデザインファイル
赤外線光を使用する必要性
ダイを背面から攻撃する際の欠点の1つは、赤外線光を使用する必要があることです。実際、シリコンは可視光に対してほぼ完全に不透明であり、視覚化と故障注入の両方を妨げます。
代わりに、1064nmの波長の赤外線光が使用されます。この波長は、背面故障注入に伝統的に使用されており、Infra-Red, In Situ (IRIS) Inspection of Silicon(bunnie Huang、2023年)で実証されているように、ダイの機能の視覚化にも使用できます。
光学部品
以下で利用可能な3Dレンダリングは、完全なレーザー故障注入プラットフォーム3Dレンダリングから抽出されたものです。イメージングとレーザー集光機能に関連するコンポーネントのみが表示され、注釈が付けられています。
[画像: 光学部品]
光学部品
以下の項目が見えます。正確な部品番号または調達詳細は、光学アセンブリページを参照してください。
- レーザードライバーボード - このカスタムPCBは、短いが強力な光パルスを発するレーザーダイオードを駆動するために使用されます。このハードウェアは、この記事の後半で詳しく説明します。
- 対物レンズ - これは既製の顕微鏡対物レンズです。集光を容易にするために無限遠補正レンズを希望しました。残念ながら、これらは通常、有限補正レンズよりも高価です。約90ユーロでAliExpressから入手しました。
- 斜入射照明システム - これはシンプルな1064nm LEDで、ダイのイメージングに使用されます。テスト中に、サンプルを横から、かなり狭い角度で照明すると、最もコントラストの高い画像が得られることに気づきました。
- イメージングカメラ - これはRaspberry Pi Camera v2 “NoIR”です。IRフィルターがないため、関心のある波長に対してある程度感度があります。
3Dプリント部品を含め、さらにいくつかのオブジェクトを削除すると、以下の新しい光学要素が表示されます。
[画像: 3Dプリント部品なしの光学部品]
3Dプリント部品なしの光学部品
- レーザーダイオード - 1064nmのレーザーダイオード。この小さなコンポーネントは、調達が最も困難でした。Alibabaで5個を約300ユーロで交渉しました。
- 調整可能コリメートレンズ - レーザーダイオードの出力をコリメートするために使用されるねじ込み式レンズ。AliExpressで安価に大量購入できます。
- ビームスプリッター - このガラス片は、入射光の一部を反射し、残りを透過するように特別にコーティングされています。AliExpressで手頃な価格で購入しました。
- チューブレンズ - 再び、AliExpressで手頃な価格で購入しました。
説明したように、これらのコンポーネントのほとんどは既製品であり、Aliexpressから安価に調達されました。しかし、それでもコストはかかります。これらの部品は仕様が不十分であったり、可視光のみを考慮した従来の顕微鏡用途向けに設計されていたりすることがよくあります。その結果、一部の赤外線レーザー光が無駄になっている可能性があり、イメージングは色収差の影響を受けていると推測しています。
光学経路
イメージング
「イメージング」機能を確保するために光がたどる経路を以下に示します。
[画像: 斜入射イメージングLEDから出る光の経路]
斜入射イメージングLEDから出る光の経路
サンプルはまず1064nmの斜入射照明LEDによって照らされます。この波長はシリコンを透過し、ダイの構造で反射します。
注記
レーザーほど強力ではありませんが、このLEDは回路に何らかの影響を与えるようです。
特に、LEDでダイが照らされている場合、システムが起動できないことが時々あることに気づきました。デジタル回路よりも敏感な可能性のあるアナログ回路が影響を受けていると推測しています。
この問題を回避するために、LEDはダイをイメージングしてレーザービームをアライメントするときにのみオンになります。攻撃プロセス中はオフになります。
次に、この光は無限遠補正レンズを通過し、チューブレンズのおかげでカメラセンサーに結像されます。
その間に、光はビームスプリッターを通過します。光の一部は透過し、同じ方向に進みます。反射された光は失われます。
選択されたビームスプリッターの特性は以下の通りです。
- 反射係数:90%
- 透過係数:10%
これは、以下の経路で説明するレーザービームからの光を優先します。
レーザー集光
「レーザー集光」機能を実装するために光がたどる経路を以下に示します。
[画像: レーザーダイオードから出る光の経路]
レーザーダイオードから出る光の経路
レーザーダイオードから光パルスが放出されます。この光は発散しており、調整可能コリメートレンズでコリメートされます。
コリメートされた光の大部分(90%)はビームスプリッターで反射され、対物レンズを通過してターゲットサンプルに集光されます。
イメージング結果
以下は、セットアップから得られたダイのわずかに処理された画像です。
[画像: イメージング結果例1]
イメージング結果例1
[画像: イメージング結果例2]
イメージング結果例2
さらに、ダイ全体のズーム可能なステッチビューがあります。
注記
ステッチングの品質は明らかに非常に悪いです。私が使用した処理ツールは、低コントラストの画像に苦労しています。
完全を期すために、以下のビデオはOpenFlexureのウェブベースインターフェイスを通してリアルタイムで表示されるものをデモンストレーションしています。
これらの画像はプロフェッショナルなセットアップで生成される品質には全く及びませんが、ダイの特定の機能にレーザービームをアライメントするには十分です。
制限要因はCMOSカメラセンサーである可能性があります。これは1064nmに対してわずかにしか感度がありません。残念ながら、これらの波長に感度のあるカメラはかなり高価です。
ダイの裏面のより良いビューについては、@LennertWoが共有したものを参照してください。
レーザー集光結果
集光されたビームの特性はあまり良くなく、結果のスポットはかなり大きく楕円形です。故障を注入するために高出力密度を達成することが目標であるため、これは理想的ではありません。
結果のスポットの例を以下に示します。ここでは、カメラセンサーを眩惑しないようにレーザーは低出力でパルス化されています。
[画像: カメラセンサーから見た集光されたレーザービーム]
カメラセンサーから見た集光されたレーザービーム
この問題は、レーザードライバーボードからレーザーダイオードに供給される電力を増加させることで緩和されました。
レーザーのスポット形状が悪いことには、いくつかの要因が考えられます。
- 使用したレンズは可視光専用です。
- 集光方法は単純で、おそらく少し素朴です。私は光学の専門家ではありません。
- 最も重要なのは、使用したレーザーダイオードは高出力のものであることです。発光素子が大きく、そこから出る光は非常に発散しており、高速軸と低速軸に大きな違いがあります。
レーザードライブ
警告
ここからが危険な部分です。ここで説明するカスタムボードは非常に短いパルスしか生成しませんが、高出力レーザーの取り扱いは危険を伴う可能性があります。特に、放出される光が可視スペクトルの外にある場合はそうです。
この作業を再現しようとする場合は注意してください。
レーザー故障注入には、短く高出力の光パルスを送信する必要があります。この目的のためにカスタムボードが設計されました。
[画像: レーザードライバーボード、上面図]
レーザードライバーボード、上面図
ほとんどの電子部品はボードの上面に配置されており、下面にはレーザーダイオードが取り付けられています。
[画像: レーザードライバーボード、下面図]
レーザードライバーボード、下面図
このようなボードの設計はそれほど複雑ではありませんでしたが、適切なレーザーダイオードを見つけるのはより困難であることが判明しました。
[画像: レーザードライバーボード、故障注入プラットフォームに設置]
レーザードライバーボード、故障注入プラットフォームに設置
注記
ボードの写真に見られるように、回路の一部が再設計されています。これは、後述するレーザーパルスパラメータを調整するために行われました。共有されている回路図は、この再設計を反映するように更新されています。
[画像: インタラクティブ3Dレンダリングとデザインファイル]
インタラクティブ3Dレンダリングとデザインファイル
ボードアーキテクチャ
レーザードライバーボードのアーキテクチャを以下に示します。
flowchart TB
A{{USB Connector}} <--> B(USB to I2C Bridge)
B -->|Configure| C(Digital Potentiometer)
B -->|Trigger| E
C .-> D(High Voltage Power Supply Circuit)
D .-> E(Pulse Generator Circuit)
E .-> F(Laser Diode)
G{{Pin Header}} -->|Trigger| E
F -->|Current Sense| H{{SMA Connector}}
レーザードライバーボードのアーキテクチャ
ボードはUSBポートから電源供給され、設定されます。このポートに接続されたホストコンピューターは、以下に使用できます。
- 高電圧(最大75V)電源の出力レベルを設定します。この高電圧供給は、パルスジェネレータ回路の動作に必要です。
- 手動でレーザーパルスを送信します。
ただし、USBは時間クリティカルな用途には使用できないため、レーザーパルスはシンプルなピンヘッダーコネクタからも生成できます。このコネクタは、攻撃中にFPGAボードとインターフェイスされます。
SMAコネクタを使用して、レーザーダイオードを流れる電流パルスの形状と強度を監視できます。
パルス生成原理
パルス生成回路の簡略化された回路図を以下に示します。
[画像: 簡略化されたパルス生成回路]
簡略化されたパルス生成回路
コンデンサCはまず高電圧電源から充電されます。レーザーダイオードに電流パルスをトリガーするために、スイッチング素子SWが閉じられます。
電流応答は、典型的なRLC回路の応答に近くなります。抵抗値Rは、回路の応答がクリティカルダンピングされるように選択されています。
CとLはパルスの持続時間を変更するために微調整でき、高電圧レベルはピーク電流を設定するために使用できます。
残念ながら、これはパルス持続時間を変更するにはボードに新しいコンポーネントをハンダ付けする必要があることを意味します。私はこの再設計を数回行う必要があり、故障が正常に注入されるまで徐々にピーク電流を増やしました。
RP2350を正常にエクスプロイトするために使用された値は次のとおりです。
- R=1.4Ω
- L=33nH
- C=60nF
選択された抵抗器は高電流パルスを処理できる必要があることに注意してください。いくつかの部品を破壊した後、私はVishayのCMB 0207ファミリーを使用することにしました。
選択されたRLC値は、以下の理論的な電流パルスをもたらします。
実際には、ハードウェアによって生成されるパルスはこれらの理論的な曲線にかなり近いです。
[画像: レーザードライバーボードのSMAコネクタから測定された電圧]
レーザードライバーボードのSMAコネクタから測定された電圧
残念ながら、使用した光学部品(レンズ、ビームスプリッター)が赤外線光用に仕様化されていないことも一部ありますが、これらの電流曲線がダイ表面で受信される実際の光電力にどのように変換されるかは不明です。
最後に、スイッチング素子SWは、派手なGaN FETで実装されていることに注意してください。この選択は、当初は超短パルスを実験するために行われました。しかし、これは特に有用ではないことが判明しました。よりシンプルなMOSFETを選択することでBOMコストを削減できたでしょう。
それにもかかわらず、少量生産の場合のこのBOMの価格は、レーザーダイオードのコストを除いて30ユーロを超えません。
レーザーダイオードの調達
適切なレーザーダイオードを見つけるのは困難でした。高出力の1064nmレーザーダイオードは、見つけるのが難しく高価であることが判明しました!
低出力部品(300mW未満)で数回の試行(つまり、ダイオードを損傷する前に故障を注入するのに十分な電力がない)に失敗した後、Alibabaのメーカーに連絡し、約300ユーロで、3W定格の部品5個を注文することができました。この部品のデータシートはこちらで入手できます。
このデータシートには、最大動作電流が3.8Aであることが明記されています。上記の電流曲線に基づくと、この部品が定格を大幅に超えて使用されていることは明らかです。
破壊的レーザー損傷の問題に遭遇することを予想していましたが、数千パルス後でも、これらのダイオードをまだ傷つけていないと思います!これは、電流パルスの持続時間が短いことによる可能性があります。
この驚くべき結果は、Continuous wave laser diodes enable fast optoacoustic imaging(Stylogiannisら、2018年)の観察と一致しています。
私たちは、可視光および近赤外線領域で入手可能な連続波(CW)レーザーダイオードが、CW絶対最大定格の40倍以上のピーク電流で過負荷駆動された場合に、良好な光音響光源となり得るかどうかを調査しました。
注記
私の作業と「RayV-Lite」システムの背後にあるチームの作業との大きな違いは、彼らが「グリーン」レーザーとしてマーケティングされている広く入手可能なレーザーダイオードを使用したことです。
これは賢い選択です。なぜなら、グリーン光が実際に生成される方法により、そのようなダイオードは通常1064nmでかなりの量の電力を放出するようです。(Galang*ら、2010年)
故障注入結果
感応領域の特定
レーザー故障注入プラットフォームを開発した後、RP2350に実際に故障を注入する試みを行う時が来ました。
まず、Hextree.ioがRP2350セキュリティプレイグラウンドデモで提案したものと同様のダミーファームウェアで、レーザーパルスの影響を研究し始めました。
レーザーパワー、集光、その他のパラメータを変化させながら、ダイの様々な領域をゆっくりとスキャンしました。しかし、以下の理由から、ダイ表面全体にわたるシステムの動作を網羅的に特徴付ける試みはしませんでした。
- これは遅いプロセスです。時間の都合上、グリッチ検出器をトリガーせずにARMコアの実行フローを妨害できるようになった時点で停止しました。
- システムの完全なクラッシュと高消費電力につながる領域がいくつかありました。サンプルの準備は少し手間がかかるため、部品をこのように損傷したくありませんでした。
私が利用した感応領域は、おおよそ以下の領域に位置しています。レーザー故障注入プラットフォームの位置決め再現性は完璧ではないため、チップをエクスプロイトしようとしている間、通常はこれらの場所の周りをビームをゆっくりと動かしていました。
[画像: 故障注入のために通常標的とされる領域のおおよその位置]
故障注入のために通常標的とされる領域のおおよその位置
コードが実行されている場所(SRAM、Flash、またはROM)や、実行されている命令の種類によって、興味深い結果を得るためにわずかに異なる場所を標的とする必要があるように思われることがわかりました。
セキュアブートバイパスのための標的設定
私が達成した最初のセキュアブートバイパスに使用された正確なビーム位置を以下に示します。ここでは、カメラを眩惑しないように、レーザーは低電力でパルス化されています。
[画像: 最初のセキュアブートバイパスにつながったレーザービームの位置]
最初のセキュアブートバイパスにつながったレーザービームの位置
セキュアブート機能バイパス
制約
レーザー故障注入プラットフォームのおかげで、グリッチ検出器をトリガーせずに故障を注入することが可能になりました!しかし、これだけではセキュアブート機能をバイパスするには十分ではありません。実際、前述のように、ブートROMは強化されており、故障に耐えるために様々な機能を使用しています。条件分岐で有効または無効な署名の選択を誤らせるような単純な方法は、直接的には不可能です。
さらに、セキュアブート機能をバイパスする方法を探す際には、以下の制約を考慮する必要があります。
- カスタムハードウェアでは、一度に1つの故障しか注入できないと期待できます。連続した複数のグリッチを持つ複雑なスキームは不可能です。制限要因はレーザードライバーボードです。コンデンサバンクは、各パルスの後に再充電に少し時間がかかります。
- レーザーパルスは、QSPIバスのアクティビティのような、観測可能な外部イベントに続いてトリガーされるべきです。
- 冗長性コプロセッサによって実行される一部の命令によって、ランダムな遅延が導入される可能性があります。理想的には、特定の命令を標的とするには、トリガーイベントと故障注入の間にこれらの特殊命令がほとんど、または全く実行されないことが望ましいです。
ブートROM解析方法
RP2350のブートROMのソースコードは公開されています。これは非常に素晴らしいことで、セキュアブートの高レベル分析をはるかに容易にします!Raspberry Piに感謝します!
しかし、フォールトインジェクションの影響を研究するには、実際のARMアセンブリコードに直接反映させる方がはるかに簡単であることがわかりました。そのため、ソースコードを簡単に読んだ後、Raspberry Piによって共有されているブートROM ELFファイルをGhidraで調べるのにほとんどの時間を費やしました。
そうすることで、前述の制約に対処するセキュアブートバイパス方法を見つけることができました。
- 単一命令の「スキップ」(ただし、「スキップ」は誤称かもしれません。「変異」の方が適切な言葉かもしれません)でうまくいく可能性があります。
- 標的とする命令は、観測可能なQSPI転送に密接に続いています。
- 最悪の場合、トリガーイベントと標的命令の間に、単一のランダム遅延コプロセッサ命令が実行されます。
ハイレベルなアイデア
s_varm_crit_ram_trash_verify_block関数を考えてみましょう。この関数はセキュアブート実装の中核です。その実装の非常に簡略化されたバージョンを以下に示します。
// ハッシュの計算を開始
sb_sha256_init(&sha);
// フラッシュからRAMにデータをロード
s_varm_crit_mem_copy_by_words((uint32_t *)to_storage_addr,
resolve_ram_or_absolute_flash_addr(
from_storage_addr),
(size + 3u) & ~3u);
// RAMから取得したデータでハッシュエンジンに供給
uint32_t *src = resolve_ram_or_absolute_flash_addr(to_storage_addr);
sb_sha256_update_32(&sha, src, size & ~3u);
// ブロックデータ(ソースアドレス、宛先アドレス、サイズを含む)を
// SHA-256ハッシュに含める
sb_sha256_update_32(&sha, block_data, parsed_block->hash_def_block_words_included * 4);
// ハッシュを最終化
sb_sha256_finish(&sha, signature_workspace->hash.bytes);
// 複雑で十分に保護された署名検証を実行
sig_matches_image_keyx = s_arm8_verify_signature_secp256k1(signature_workspace->sig_context_buffer,
&public_key[0],
&signature_workspace->hash,
&signature[0]);
このコードは非常に一般的な署名検証スキームを実装しています。検証されるファームウェアはハッシュに縮小され、それが署名検証アルゴリズムに供給されます。
flowchart TD
A[(フラッシュ内のファームウェアデータ)] --> B("`メモリコピー
_s_varm_crit_mem_copy_by_words_`")
B --> C[(RAM内のファームウェアデータ)]
C --> D("`SHA-256
_sb_sha256_update_32_`")
D --> E("`ECDSA署名検証
_s_arm8_verify_signature_secp256k1_`")
F[[公開鍵]] --> E
E -->|署名有効| R(RAM内のファームウェアデータを実行)
E -->|署名無効| S(失敗)
通常のファームウェア検証プロセス
アイデアは、s_varm_crit_mem_copy_by_wordsの呼び出しの後、sb_sha256_update_32の呼び出しの前で、故障を注入することです。これにより、SHA-256ハッシュが、以前RAMにロードされたデータとは異なるデータに対して計算される可能性があります。
flowchart TD
A[(フラッシュ内のファームウェアデータ)] --> B("`メモリコピー
_s_varm_crit_mem_copy_by_words_`")
B --> C[(RAM内のファームウェアデータ)]
C --x Z@{ shape: bolt }
Z --> D("`SHA-256
_sb_sha256_update_32_`")
D --> E("`ECDSA署名検証
_s_arm8_verify_signature_secp256k1_`")
F[[公開鍵]] --> E
E -->|署名有効| R(RAM内のファームウェアデータを実行)
E -->|署名無効| S(失敗)
X[(予期しないデータ)] --> Z
style X fill:#f9f,stroke:#333
style Z fill:#f9f,stroke:#333
グリッチされたファームウェア検証プロセス
SHA-256ハッシュの計算に使用される「予期しないデータ」が、有効なファームウェアに対応するデータと一致する場合、RAMにロードされたデータに関係なく、署名検証は成功します。
故障注入シナリオ
このセクションでは、s_varm_crit_mem_copy_by_wordsとsb_sha256_update_32の呼び出しの間にある、興味深い可能性のある故障の影響を探ります。
シナリオ#1 - 単一命令「スキップ」
注記
「スキップ」はおそらく誤称です。実際には、標的とする命令は変異する可能性があります。しかし、この特定のシナリオでは、変異の正確な結果はあまり重要ではありません。
上記のCコードは、以下の短いアセンブリコードに変換されます。
まずs_varm_crit_mem_copy_by_wordsが呼び出されます。
00001d5c: 1a 00 movs r2,r3
00001d5e: 20 00 movs r0,r4
00001d60: 0d 93 str r3,[sp,#local_24]
00001d62: 01 f0 82 fb bl varm_to_s_native_crit_mem_copy_by_words_impl
00001d66: 0d 9b ldr r3,[sp,#local_24]
00001d68: 43 ec 70 07 mcrr p7,0x7,r0,r3,cr0
00001d6c: ac e7 b LAB_00001cc8
以下の実装は、ターゲットサイズに達するまでR1をインクリメントします。
0000346c: 19 fe 3a c7 mrc2 p7,0x0,r12,cr9,cr10,0x1
00003470: 10 b5 push {r4,lr}
00003472: 03 46 mov r3,r0
00003474: 22 b1 cbz r2,LAB_00003480
00003476: 1a 44 add r2,r3
LAB_00003478:
00003478: 10 c9 ldmia r1!,{r4}
0000347a: 10 c0 stmia r0!,{r4}
0000347c: 90 42 cmp r0,r2
0000347e: fb d3 bcc LAB_00003478
LAB_00003480:
00003480: c0 1a subs r0,r0,r3
00003482: 09 fe 3a c7 mcr2 p7,0x0,r12,cr9,cr10,0x1
00003486: 10 bd pop {r4,pc}
関数が返された後、sb_sha256_update_32が呼び出されるまでR1は変更されません。
00001d02: 32 00 movs r2,r6 // size
00001d04: 21 00 movs r1,r4 // src
00001d06: 0f a8 add r0,sp,#0x3c // sha context
00001d08: 02 f0 49 fb bl sb_sha256_update_32
もし0x00001d04の命令が「スキップ」できた場合、以下が実質的に実行されます。
r1 = resolve_ram_or_absolute_flash_addr(from_storage_addr) + size;
sb_sha256_update_32(&sha, r1, size);
R1が参照するデータは、フラッシュデータに対応するメモリマップド領域にあります。この特定の領域はキャッシュされない読み取りを実行するため、データは外部QSPIバスから直接取得されます。攻撃者はこのデータを操作できます。
カスタムI/Oボードに組み込まれた「デュアルフラッシュ」機能は、バス経由で任意の値をプッシュするプロセスを簡素化するため、ここで役立ちます。必要であれば、同じアドレスからの2回の読み取りで異なるデータを取得できます。
シナリオ#2 - レジスタ値の破損
テスト中に、s_varm_crit_mem_copy_by_wordsとsb_sha256_update_32の間で故障を注入すると、多くの場合、オフセット0から始まるフラッシュからデータが読み取られるという現象を観察しました。
命令スキップのような単純な説明でこれがなぜ起こるのか、明確な説明はありません。
例えば、以下が実行されるときに、それが意味する可能性があります。
00001d02: 32 00 movs r2,r6 // size
00001d04: 21 00 movs r1,r4 // src
00001d06: 0f a8 add r0,sp,#0x3c // sha context
00001d08: 02 f0 49 fb bl sb_sha256_update_32
R4の値は、フラッシュデータに対応するメモリマップド領域の開始点を指します。
いずれにせよ、これは再び、sb_sha256_update_32の呼び出しが、RAMに既にロードされたデータではなく、攻撃者の制御下にあるデータに対して実行される可能性があることを意味します。
シナリオ#3 - 命令の変異
s_varm_crit_mem_copy_by_wordsに対応する命令を以下に示します。
0000346c: 19 fe 3a c7 mrc2 p7,0x0,r12,cr9,cr10,0x1
00003470: 10 b5 push {r4,lr}
00003472: 03 46 mov r3,r0
00003474: 22 b1 cbz r2,LAB_00003480
00003476: 1a 44 add r2,r3
LAB_00003478:
00003478: 10 c9 ldmia r1!,{r4}
0000347a: 10 c0 stmia r0!,{r4}
0000347c: 90 42 cmp r0,r2
0000347e: fb d3 bcc LAB_00003478
LAB_00003480:
00003480: c0 1a subs r0,r0,r3
00003482: 09 fe 3a c7 mcr2 p7,0x0,r12,cr9,cr10,0x1
00003486: 10 bd pop {r4,pc}
もし0x00003486で故障を注入できた場合、pop {r4,pc}命令が変更され、R4の値が復元されない可能性があります。
pop {r4,pc}の前に、R4はフラッシュメモリからRAMにコピーされた最後のワードに対応しており、攻撃者の制御下にある値です。この値は、例えばメモリマップドフラッシュ領域に含まれるアドレスに設定される可能性があります。
R4は、sb_sha256_update_32を呼び出す際に使用されます。
00001d02: 32 00 movs r2,r6 // size
00001d04: 21 00 movs r1,r4 // src
00001d06: 0f a8 add r0,sp,#0x3c // sha context
00001d08: 02 f0 49 fb bl sb_sha256_update_32
ここでも、sb_sha256_update_32はQSPIバスから読み取られたデータに対して実行されるように強制される可能性があります。
攻撃プロセス
ソフトウェアアーキテクチャ
攻撃のロジックを実装し、電子部品を制御するために様々なソフトウェアコンポーネントが開発されました。
[画像: GitHubでコードを閲覧]
GitHubでコードを閲覧
FPGA
レーザーパルスをブートROMの実行と同期させるために、I/Oボードに接続されたFPGAボードのゲートウェアがQSPIのアクティビティを監視します。
FPGAプラットフォームの選択はそれほど重要ではありません。なぜなら、ブートROM実行中はRP2350は保守的に低いクロック速度で動作しているからです。私はGlasgow Interface Explorerツールを使用することを選択しました。
[画像: Glasgow Interface Explorer]
The Glasgow Interface Explorer
これはiCE40 FPGAを搭載しており、オープンソースツールと互換性があります。最後に、VerilogやVHDLのようなより一般的なHDL言語よりも便利だと感じるAmaranth HDLとよく統合されています。
このプロジェクトのために書かれたゲートウェアは、以下の責任を負います。
- 基本的なI/O制御:
- ターゲットRP2350の電源のオン/オフ。
RUNおよびBOOTSEL信号の制御。
- トリガータイミング:QSPIバスをリアルタイムで監視します。
- 攻撃オーケストレーション:
- アクティブなQSPIフラッシュメモリの動的な選択。
- レーザーのパルス化。
レーザードライバーボード
レーザードライバーボードは、USB-to-I2Cブリッジコンポーネントを介してホストコンピューターと通信します。
ボード上で実行されるファームウェアを書く必要はなく、ホストコンピューターを使用してレーザーダイオードパルサー回路の高電圧電源を直接設定できます。
位置決めステージ制御
位置決めステージは、Raspberry Piシングルボードコンピューター上で実行されるソフトウェアによって制御されます。
移動プラットフォームのX、Y、Z座標は、ウェブベースのAPIを使用してプログラムで設定できます。
この攻撃の文脈では、このAPIを利用して、レーザーをパルス化しながら感応領域をゆっくりとスキャンします。
レーザーパルスの同期
s_varm_crit_mem_copy_by_wordsの呼び出しに対応する最後のQSPI読み取りは、FPGAゲートウェアによってほとんど不確実性なく検出できます。そこから、sb_sha256_update_32を呼び出す前に、以下の命令が実行されます。
00003478: 10 c9 ldmia r1!,{r4}
0000347a: 10 c0 stmia r0!,{r4}
0000347c: 90 42 cmp r0,r2
0000347e: fb d3 bcc LAB_00003478
00003480: c0 1a subs r0,r0,r3
00003482: 09 fe 3a c7 mcr2 p7,0x0,r12,cr9,cr10,0x1
00003486: 10 bd pop {r4,pc}
00001d66: 0d 9b ldr r3,[sp,#local_24]
00001d68: 43 ec 70 07 mcrr p7,0x7,r0,r3,cr0
00001d6c: ac e7 b LAB_00001cc8
00001cc8: 0b 9b ldr r3,[sp,#local_2c]
00001cca: 00 2b cmp r3,#0x0
00001ccc: b3 d0 beq LAB_00001c36
00001cce: 03 9b ldr r3,[sp,#local_4c]
00001cd0: 73 b1 cbz r3,LAB_00001cf0
00001cf0: 23 0e lsrs r3,r4,#0x18
00001cf2: 10 2b cmp r3,#0x10
00001cf4: 02 d8 bhi LAB_00001cfc
00001cfc: 03 23 movs r3,#0x3
00001cfe: 3e 00 movs r6,r7
00001d00: 9e 43 bics r6,r3
00001d02: 32 00 movs r2,r6
00001d04: 21 00 movs r1,r4
00001d06: 0f a8 add r0,sp,#0x3c
00001d08: 02 f0 49 fb bl sb_sha256_update_32
冗長性コプロセッサ命令が0x00001d68で実行され、最大127システムクロックサイクルのランダム遅延が発生します。その結果、0x00001d68の後に続く特定の命令を標的とするレーザーパルスを一貫してタイミングすることは非現実的になります。
しかし、この命令はランダムな遅延を導入する唯一の命令です。攻撃用に設計されたソフトウェアは、1秒あたり約20回の試行を可能にし、これは合理的な時間で興味深い故障を注入するのに十分です。
フラッシュメモリの構成
攻撃を開始する前に、I/Oボードの2つのQSPIフラッシュは次のように構成されます。
最初のフラッシュはRAMにロードされる内容を含み、署名ブロックが次のようにパッチされた有効な署名付きファームウェアのコピーです。
- リセットハンドラオフセットに小さなシェルコードが書き込まれます。このシェルコードは、フラッシュメモリのさらに奥、アドレス
XIP_BASE + 0x10000にある任意のファームウェアにジャンプするように設計されています。XIP_BASEはメモリマップドフラッシュデータの開始点を表し、0x10000は任意オフセットです。 - RAMにロードされたデータの最後のワードは、
XIP_NOCACHE_NOALLOC_NOTRANSLATE_BASE + 0x7000に設定されます。0x7000は後で使用される任意オフセットであり、XIP_NOCACHE_NOALLOC_NOTRANSLATE_BASEもフラッシュデータを返します。
2番目のフラッシュは、故障注入後に読み取られることが期待される内容を含み、変更されていないファームウェアの3つのコピーが含まれています。これらのイメージのいずれかに対してSHA-256ハッシュを計算すると、有効なハッシュが得られます。以前に概説したすべての故障注入シナリオをサポートするために、コピーは以下の場所にあります。
- フラッシュオフセット
0x0、シナリオ#2をサポートするため。 - RAMにコピーされたデータのサイズに対応するオフセット、シナリオ#1をサポートするため。
- フラッシュオフセット
0x7000、シナリオ#3をサポートするため。
最後に、任意ファームウェアがオフセット0x10000にコピーされます。このファームウェアは、RAMにロードされたシェルコードが実行された場合に実行されます。
攻撃ループ
攻撃中、以下のプロセスがループで繰り返されます。
- 最初のフラッシュが選択されます。
RP2350の電源がオンになります。s_varm_crit_mem_copy_by_wordsの呼び出しに対応する最後のバイトが読み取られるまで、QSPIバスの読み取りが監視されます。- 2番目のフラッシュが選択されます。
- 任意の遅延の後、レーザーがパルス化されます。
- 故障注入が成功したかどうかを確認するために、QSPIバスの読み取りが再び監視されます。
- 失敗した場合、
RP2350の電源がオフになり、新しい試行が行われます。
flowchart TD
A[最初のフラッシュを選択] --> B[RP2350の電源オン]
B --> C[QSPI読み取りを監視]
C --> D[2番目のフラッシュを選択]
D --> E[任意の遅延]
E --> F[レーザーパルス化]
F --> G[QSPI読み取りを監視]
G -->|失敗| H[RP2350の電源オフ]
H --> A
G -->|成功| I[任意のファームウェア実行]
攻撃ループ
結果
感応ダイ領域を標的とする場合、sb_sha256_update_32の実行中に期待されるアドレスのいずれかからQSPIバスのデータが読み取られるような故障を注入することは、かなり一般的です。
しかし、大きな問題は、故障がシステムに過度に影響を与え、例えばsb_sha256_update_32のsizeパラメータに対応するレジスタを破損させることがよくあったことです。
もう1つの問題は、位置決めステージに関するものです。ギアシステムの一部にバックラッシュがあることに加えて、位置が時間とともに、そしておそらく温度によってわずかにドリフトするようで、一貫して正確なサンプルスポットをヒットすることが困難になっています。
これにより、攻撃の成功率が大幅に低下しました。レーザーパルスパラメータと位置を調整するのに16時間以上費やした後で、最初のセキュアブートバイパスを確認できただけです。しかし、この微調整の後、新しい成功が現れるまで約20分待つだけで済みました。
[画像: 最初のバイパス成功後、RP2350に隠された秘密の値が表示されている私のモニター]
最初のバイパス成功後、RP2350に隠された秘密の値が表示されている私のモニター
このバイパスにより、任意のファームウェアの実行が可能になり、RP2350のOTP領域に保存された秘密にアクセスできるようになります。これがRaspberry Piのハッキングチャレンジの目標でした。
可能な改善点
攻撃の成功率を向上させるために、いくつかの要素を改善できます。
- レーザーパルスの持続時間を微調整できます。レーザードライバーボードのシンプルな設計のため、パルス持続時間の調整には物理コンポーネントの値の変更が必要です。このプロセスは面倒な場合があるため、パルス持続時間の影響を徹底的に調査していません。
- 光学サブシステムから生じるレーザーのスポットサイズは、同様の攻撃で一般的に使用されるものと比較して比較的大きいです。より小さなスポットサイズは、より制御された、より再現性の高い故障につながる可能性が高いです。
- FPGAゲートウェアを強化できます。2つの物理QSPIフラッシュを使用する代わりに、FPGAで1つをエミュレートし、故障後に要求されたフラッシュアドレスに関係なく、動的に正しいデータを供給できます。しかし、これはおそらく私が使用したFPGAの能力を超えています。
結論
レーザー故障注入は、低予算でも実行可能です!多くの試行錯誤が必要であり、適切なレーザー源の調達は面倒な場合がありますが、機能的なセットアップは確かに達成できます。
大幅な妥協点があるため、このようなシステムのパフォーマンスは最適ではありませんが、興味深い結果を得ることができます。グリッチ検出器をトリガーせずにRP2350に故障を注入することが可能になります。
これだけではRP2350のセキュアブート機能をバイパスするには十分ではありません。しかし、ブートROMの小さくも重要なセクションが、冗長性コプロセッサによってあまり強化されておらず、保護されていないことが判明しました。この時点で故障を注入し、QSPIバス経由で互換性のあるペイロードを供給することで、セキュアブートを事実上無効にできます。
より単純な方法が公開されましたが、この作業はRaspberry PiのRP2350ハッキングチャレンジに依然として対応しています。
さらに、私が標的としたブートROMのセクションは、LFIに頼ることなくエクスプロイトできる可能性もあることに注意してください。慎重に行われたEMFI攻撃でグリッチ検出器をバイパスできたという報告もあります。
グリッチ検出器はEMFIの試みを検出するのに非常に優れていますが、小さなコイルと低電力グリッチで、それをトリガーせずにCPU操作をグリッチさせることが可能でした。
それでも、後悔はありません。レーザーは遊ぶのが楽しいです!
開示
最初のバイパス成功後、すぐにRaspberry Piに連絡しました。透明性のために、彼らに共有したドキュメントはこちらで入手できます。
チームとのコミュニケーションはスムーズで楽しいものでした。彼らは「侵入」が有効であることを認め、次のRP2350のブートROMには、私が標的としたコードの特定領域の周りにさらに強化策が含まれることを確認しました。
参考文献
Andrew 'bunnie' Huang. Infra-red, in-situ (iris) inspection of silicon. 2023. URL: https://arxiv.org/abs/2303.07406, arXiv:2303.07406. ↩
Jemellie Galang, Allesandro Restelli, Edward W. Hagley, and Charles W. Clark. A green laser pointer hazard. 2010. URL: https://arxiv.org/abs/1008.1452, arXiv:1008.1452. ↩
Samuel McDermott, Filip Ayazi, Joel Collins, Joe Knapper, Julian Stirling, Richard Bowman, and Pietro Cicuta. Multi-modal microscopy imaging with the openflexure delta stage. Opt. Express, 30(15):26377–26395, Jul 2022. URL: https://opg.optica.org/oe/abstract.cfm?URI=oe-30-15-26377, doi:10.1364/OE.450211. ↩
Antonios Stylogiannis, Ludwig Prade, Andreas Buehler, Juan Aguirre, George Sergiadis, and Vasilis Ntziachristos. Continuous wave laser diodes enable fast optoacoustic imaging. Photoacoustics, 9:31–38, 2018. URL: https://www.sciencedirect.com/science/article/pii/S2213597917300356, doi:https://doi.org/10.1016/j.pacs.2017.12.002. ↩