mununuを用いたCaliptraのブートFSMバグ検証

#Tech

mununuを用いたCaliptraのブートFSMバグ検証 FSMバグを発見するmunu

オープンソースのSiC Root-of-TrustであるCaliptraのブートFSMには、ステートレジスタの不定な状態遷移を引き起こす設計上のバグ(CWE-1245)が存在します。

このバグは構文的に検出可能ですが、従来のリンターやシミュレーションでは、不正な状態エンコーディングの到達可能性を end-to-endで証明することは困難です。

本記事では、オープンソースの検証フレームワークmununuがこの課題をどのように解決するかを解説します。

mununuは、サイドカーJSONによる宣言的抽象化と3値モーダルμ-calculusを活用することで、不正な全ビットパターンを含む状態空間を効率的にモデル化し、バグの存在を論理的に証明します。

オープンソースのシリコンルート・オブ・トラスト(RoT)であるCaliptraにおいて、ハードウェアの設計上の欠陥(バグ)が発見されました。これは、有限状態機械(FSM)の設計における「デフォルトケースの欠如」が原因です。本記事では、このバグの構造を解説し、最新の検証ツールであるmununuがどのようにしてこの見過ごされがちな問題を検出するのかを深掘りします。

FSM設計における潜在的な脆弱性

Caliptraは、マイクロソフト、AMD、Google、NVIDIAなどが貢献する、データセンター向けSoC(System on Chip)に組み込まれるセキュリティ基盤です。その中のブート時状態機械(FSM)は、チップをリセットから動作状態へ移行させる重要な役割を担っています。このFSMは3ビットのレジスタで状態を管理していますが、設計上、定義された5つの状態以外にも3つの「未定義」なビットパターンが存在します。この未定義状態に遷移した場合、FSMの挙動は不定となり、セキュリティ上の問題を引き起こす可能性があります。

従来の検証手法の限界と課題

この種のバグは、静的解析ツール(リンター)を使えば「デフォルトケースがない」という構文上の警告は出ます。しかし、その警告が「実際に設計の中で到達可能か」「リセット処理によって露呈するか」といった、設計全体の文脈における問題であるかを判断することはできません。従来のシミュレーションや形式検証ツールも、未定義状態を意図的に駆動させるのが難しく、手動でのトリアージ(優先順位付け)が必要となり、見落とされがちでした。

mununuによる高度なバグ検出アプローチ

オープンソースの検証フレームワークであるmununuは、この課題を解決します。従来のSVA(SystemVerilog Assertion)ではなく、3値モーダルμ計算という高度なプロパティ言語を使用します。さらに、RTL(Register Transfer Level)ソースコードを直接変更することなく、JSON形式の「サイドカー」ファイルで抽象化(例:特定のカウンタを全ビット幅で扱うか、非決定的に扱うか)を宣言できます。これにより、未定義のビットパターンを自動的に検出・追跡し、CWE-1245(ハードウェアロジックにおける不適切なFSM)を可視化します。

まとめ

mununuは、単なる構文チェックに留まらず、設計の文脈全体を考慮した高度な形式検証を可能にしています。セキュリティが極めて重要となるハードウェア設計において、この種の「見えないバグ」を自動で発見できる能力は、今後のチップ設計の信頼性向上に大きく貢献すると見られています。

原文の冒頭を表示(英語・3段落のみ)

Caliptra is an open-source silicon root-of-trust developed under the Open Compute Project, contributed to by Microsoft, AMD, Google, and NVIDIA, and intended to be reused as a hardened, auditable RoT block inside larger datacenter SoCs. Among its constituent modules is soc_ifc_boot_fsm.sv, the boot-time state machine in the SoC interface block, which sequences the chip from cold reset through fuse loading and into operation. It has a small, readable footprint — a handful of internal signals, a few reset-domain registers, and one typedef-enum carrying the FSM’s state.The state encoding is declared in soc_ifc_pkg.sv like this:typedef enum logic [2:0] {

BOOT_IDLE = 3'b000,

BOOT_FUSE = 3'b001,

※ 著作権に配慮し、引用は冒頭3段落までです。続きは元記事をご覧ください。

元記事を読む ↗