署名のないledのblinkyコードを使ってHAB監査API(報告状況と報告イベント情報)を実装しました。EVKボードは開いており、ヒューズも焼けていません
署名なしイメージ(CSF=0) - HABが4イベント情報で失敗
署名画像 - HAB パス0イベント情報
なので、ボードでもオープンHAB認証が実行されているのでイベント情報が見られると仮定しました。
しかし今回は同じIVT(CSF=0)でプロジェクトファームウェアを使い、同じHAB監査を実施しました
署名なし画像 - 0 イベント情報 のHABパス
リードされた点滅ログ(署名なし):
RVTヘッダー 0x 2002c0: tag=0xdd len=0x 038 par=0x43
HAB:RVTバージョン=0x 40305
居住区:report_status() = 0x33(HAB_FAILURE)
HAB: config = 0xf0(HAB_CFG_OPEN)
HAB: state = 0x66(HAB_STATE_NONSECURE)
HAB: event[0], 8バイト HAB: hdr: tag=0xdb len=0x 0 8 par=0x43 HAB: status=0x33(HAB_FAILURE) reason=0x22(HAB_INV_ADDRESS) context=0x a(HAB_CTX_AUTHENTICATE) engine=0x 0(HAB_ENG_ANY) HAB: raw: db 0 8 43 33 22 a 0
HAB: event[1], 20バイト HAB: hdr: tag=0xdb len=0x 014 par=0x43
HAB: status=0x33(HAB_FAILURE) reason=0x c(HAB_INV_ASSERTION) コンテキスト=0xa0(HAB_CTX_ASSERT) engine=0x 0(HAB_ENG_ANY) HAB: raw: db 0 14 43 33 c a0 0 0 0 0 0 0 60 0 10 0 0 0 0 20
HAB: event[2], 20バイト HAB: hdr: tag=0xdb len=0x 014 par=0x43 HAB: status=0x33(HAB_FAILURE) reason=0x c(HAB_INV_ASSERTION) context=0xa0(HAB_CTX_ASSERT) engine=0x 0(HAB_ENG_ANY) HAB: raw: db 0 14 43 33 c a0 0 0 0 0 0 60 0 10
20 0 0 0 1 HAB: event[3], 20バイト HAB: hdr: tag=0xdb len=0x 014 par=0x43 HAB: status=0x33(HAB_FAILURE) reason=0x c(HAB_INV_ASSERTION) コンテキスト=0xa0(HAB_CTX_ASSERT) engine=0x 0(HAB_ENG_ANY) HAB: raw: db 0 14 43 33 c a0
0 0 0
0 0 0 60 0 20 0 0
0 4 HAB: VERDICT =
4 イベント情報 記録済み -- 上記のデコード済みフィールドを参照
私のプロジェクトファームウェア(署名なし)
HAB: RVTヘッダー 0x002002c0 HAB:
tag=0xdd len=0x0038 par=0x43 HAB:RVTが確認され有効 居住区:RVTバージョン=0x00040305 居住区:report_status() =
0xf0 HAB: config = 0xf0 HAB: state
= 0x66 HAB: 監査イベント情報やクエリなし... HAB: report_event(idx=0) 0x33返されました(イベント情報やクエリなし)
HAB: VERDICT = PASS(監査イベント情報なし) なぜ違いがあるのか
こんにちは、 @Abhay2080 さん。
ご連絡ありがとうございます!LED点滅コードが入っているSDK版と、画像作成に使われているSPT版の両方をいただけますか?
ご辛抱いただきありがとうございます!
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------
こんにちは、 @Abhay2080 さん。
情報と詳細なログをありがとうございます。これは素晴らしい観察結果で、違いはIVT内のCSFポインタがゼロかゼロでないかという一点に集約されます。
HABv4が認証を決定する方法
i.MX RT10xxでは、ブートROMは認証を試みるかどうかを判断する前にIVTのCSFフィールドを確認します。
CSF = 0x00000000(null)の場合、HABは認証を完全にスキップし、イベント情報は記録されずreport_status()0xf0(HAB_SUCCESS)を返します。これはセキュリティ上の「合格」ではありません。認証は一度も試みられていません。
CSF = non-zero(CSF領域を指す場合):HABは認証を試みます。署名が欠落または無効の場合、失敗イベント情報が記録され、report_status()は0x33(HAB_FAILURE)を返します。オープンボードの場合、これはブートを停止させません。
なぜLED点滅(署名なし)が4つの故障イベント情報を示したのか
あなたのLED点滅バイナリはMCUXpresso IDEによって構築され、その後SPT(Secure Provisioning Tool)で処理されてブート可能なイメージが作成されました。「署名なし」ビルドタイプの場合でも、SPTのブートイメージパイプラインは、ゼロ以外のCSFポインタをIVTに書き込み、イメージ内にCSF領域を予約します。Boot ROMは非ゼロポインタを発見し、認証を試みましたが有効な署名データは見つからず、4つのイベントを記録しました。
イベント情報0(HAB_INV_ADDRESS / HAB_CTX_AUTHENTICATE
イベント情報1–3(HAB_INV_ASSERTION / HAB_CTX_ASSERT
なぜプロジェクトのファームウェア(署名なし)にイベント情報が0と表示されたのか
あなたのプロジェクトファームウェアは、SPTの起動可能なイメージ生成ステップ を経ずに 、MCUXpresso IDEを通じて直接コンパイルされました。結果として得られるバイナリには、IVT内に真のヌルCSFポインタが含まれています。Boot ROMは CSF = 0を認識し、認証を完全にスキップし、HABはクリーンな報告をします。ログのreport_event(idx=0)からの0x33リターンは「このインデックスにイベント情報なし」(つまり、クエリ自体が何も保存されていないため返HAB_FAILURE)を意味しており、HABが故障を検出したわけではありません。
確認の簡単な方法
バイトオフセット+0x18(CSFフィールド)で、両方のバイナリのIVTを調べます。
SPT製LED点滅:ゼロ以外の値(例:0x60006xxxまたは類似のフラッシュアドレス)
プロジェクトファームウェア: 0x00000000
プロジェクトのファームウェアで HAB 監査を適切にテストするには
起動可能なイメージはSPT(またはelftosb/nxpimage)でビルドし、CSF領域をイメージに埋め込む必要があります。署名なしビルドでも同様です。これにより、Boot ROMが認証を試み、HABイベント情報が生成されます。そうして初めて、HAB監査コードはテスト目的のための有意義なデータを収集できるようになります。
まとめると、HAB認証はオープンボード上で動作するというあなたの最初の仮定は正しいですが、それはIVTに非ゼロのCSFポインタが存在する場合に限られます。プロジェクトのファームウェアで観察された動作は想定どおりであり、正しいものです。
これで少しでも分かりやすくなれば幸いです!他に質問があればお知らせください。
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------
はい、Kan_Liあなたが言った説明は正しいですが、正しいシナリオは私たちにとってです。
LED点滅(署名なし)-> このバイナリiはMCU Xpresso IDEのみで生成(SPT経由は処理していません)。サイズ - 30KB
そして、LED点滅(符号なし)と私のプロジェクト(符号なし)の両方のIVTを比較しても、両方ともまったく同じIVT(CSF=0)でした。サイズ 64KB
16進数比較を参照
左側はLED点滅、右側は私のプロジェクトのファームウェアです
また、ヒューズを焼損させずにHABを正しくテストする方法についても教えてください。
Abhay2080_0-1788931301704.pngAbhay2080_0-1788931301704.pngAbhay2080_0-1788931301704.pngAbhay2080_0-1788931301704.png
こんにちは、 @Abhay2080 さん。
16進数での比較をありがとうございます。おかげで状況がずっと分かりやすくなりました。おっしゃる通り、両方のバイナリはCSF=0の同一のIVT(初期値変換)を持っています。実際の根本原因は、CSFポインタではなく、ブートデータsizeフィールドにあります。
16進ダンプの内容
ファイルオフセット0x1020(IVTのboot_dataが指す位置)にあるブートデータ構造を見てみましょう。
| フィールド | LED点滅 | プロジェクトファームウェア |
|---|---|---|
start (0x1020) |
0x60000000 |
0x60000000 |
size (0x1024) |
0x00004000 = 16 KB |
0x00000400 = 1 KB |
plugin (0x1028) |
0x00000000 |
0x00000000 |
IVT内の両方のCSFフィールドは0x00000000であり、同一であることが確認されました。
HABの挙動が異なる理由
HABライブラリの authenticate_image() は、認証を試みる前に画像スコープを決定するために、Boot Data領域(start から start + size)を使用します。重要なことに、 IVT自体はフラッシュオフセット0x1000 (ベースから4096バイト)に配置されています。HABは、IVTが宣言されたブートデータ領域内に含まれるかどうかを確認します。
LED点滅— ブートデータは16KB( 0x4000 )を宣言します。オフセット0x1000 (4096)のIVTは[0x60000000, 0x60004000)の中にあります。HAB は IVT を見つけ、authenticate_image() を試行し、CSF=0 に遭遇します → ログには HAB_INV_ADDRESS + 3 つのアサーション失敗が記録されます → report_status() = HAB_FAILURE。
プロジェクトファームウェア- ブートデータは 1 KB ( 0x400 ) のみを宣言しています。オフセット0x1000 (4096)のIVTは[0x60000000, 0x60000400)外側です。HABは宣言された領域内で有効なIVTを検出できず→認証は→ report_status() = HAB_SUCCESS, 0イベント情報で完全にスキップされます。
まとめると、プロジェクトファームウェアの1KBブートデータサイズは誤って小さすぎます。IVTはその境界を超えているため、HABはそれに手を出しません。
ブートデータのサイズはどちらも、実際のバイナリファイルのサイズ(それぞれ30KBと64KB)とは一致しないことに注意してください。両方のイメージは、適切なブート可能なイメージビルダーではなく、IDEが直接生成したブートデータを持っています。サイズのずれの程度によって、HABが発生するかどうかが決まります。
根本的な原因
SPTやelftosbを経ずにMCUXpresso IDEから直接コンパイルすると、結果として得られるバイナリはHAB評価のための適切なブートデータ構造を持ちません。size フィールドは、IVT を包含する場合と包含しない場合がある値に設定され、予測不可能な HAB 監査結果をもたらします。
ヒューズを焼損させずにHABを正しくテストする方法
オープンボードにおける信頼できる手法は以下のとおりです。
SPTまたはelftosbを使用してビルドします。これにより、ブートデータ(ベースからCSF/コードの終わりまでイメージ全体をカバーするstart 、 size )、FCB、IVT、およびオプションでCSFブロックが正しく設定されます。生のIDEコンパイル .bin でHABをテストするのは絶対に避けてください。ブートデータは信頼性が低くなります。
署名のないイメージ(CSF=0、正しいブートデータ)でテスト してください — HABは認証を試みますがCSFは検出できず、 HAB_INV_ADDRESS +アサーション失敗を記録します。report_status() = HAB_FAILURE。これにより、HABが正しく動作しており、監査コードが正常に機能していることが確認できます。これはまさに、あなたのLED点滅+SPTの結果が示していたことと同じです。
署名付きイメージ(CSFが有効で、ブートデータが正しいもの)を使用してテストします。SPTまたはCST 4.0を使用して、キーで適切に署名されたイメージを作成します。オープンボードでは、HABは埋め込まれたSRK/CSFを使用してイメージを認証します。署名が有効であれば、→ report_status() = HAB_SUCCESS、0のイベント情報となります。署名が間違っていたり欠如している場合、→失敗のイベント情報。どちらの場合もオープンボード上でブートが続きます。
ヒューズを書き込む前に信頼性を確認してください。署名済みのイメージがオープンボードに表示され、HAB_SUCCESS が表示された後でのみ、SRK ハッシュヒューズを書き込んでください。これにより認証チェーン全体が安全に検証されます。
推奨されるテスト手順(すべてオープンボードで実施):
Step 1: SPT -> Build unsigned image -> Flash -> Run HAB audit
Expected: HAB_FAILURE, 4 events (HAB is running, audit code is correct)
Step 2: SPT/CST -> Build signed image -> Flash -> Run HAB audit
Expected: HAB_SUCCESS, 0 events (signing + authentication working end-to-end)
Step 3: Corrupt the signed image or swap keys -> Flash -> Run HAB audit
Expected: HAB_FAILURE, events logged (confirms rejection logic)
Step 4: Burn fuses (SRK hash) -> confirm Step 2 still passes on Closed board
これで違いが十分に説明できたでしょうか。重要なポイントは、HABをテストする際は必ずSPT/elftosbを使って起動可能なイメージを構築することです。生のIDEバイナリは使わないでください。
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------
こんにちは、 @Abhay2080 さん。
おっしゃる通りです。バイト順序の誤りについてお詫び申し上げます。両方のブートデータサイズ(4MBと256KB)にはIVTが含まれているため、以前の説明は誤りでした。
根本原因:スタートアップコードによってHABイベントログが消去された
ブートROMは両方のイメージに対して同じ4つの失敗イベント情報(CSF=0、認証試行)を生成します。違いは、プロジェクトファームウェアのCランタイム起動時が、HABライブラリがイベントログやステータスを保存する領域を含む大きなOCRAM領域をゼロにし、HAB監査コードが実行される 前に ゼロ化することです。そのため、 report_status() は 0xF0 返却し、イベント情報は0でした。HAB状態自体が消去されたのです。
修正方法: HAB監査コールをBSSのゼロイニットループの前に Reset_Handlerに移動すると、イベント情報が見えます。
他に何かご質問がありましたら、お気軽にお知らせください。
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------