チェックと貢献
チェックと根拠
make ciが何を実行し、各チェックが何を示すか。すべてのクレートが守る基本ルール。イメージのseL4記録と部品表の読み方。そして、ゲートを速く保つ方法。
NoWayOSの主張は多くありません。そして、そのひとつひとつを、実行できるチェックで裏付けています。このページでは、各チェックが何を示し、何を示さないかを説明します。
すべてをひとつのコマンドで
make ci
make ciはゲート全体で、次の順に実行します。シークレットのスキャン、リント、テスト、ドキュメント、デモ、no_stdビルド、ライセンスとアドバイザリのチェック、グリフアトラス、部品表、ファジングとKaniの証明、そしてシステムのチェックとQEMUでの起動。すべてのステップが通ったときにだけ、変更は合格します。
各チェックが示すもの
| コマンド | 示すもの |
|---|---|
make test |
ユニット、プロパティ、ドキュメント、ゴールデンイメージのテスト。コードがテストのとおりに動き、すべての画面が承認どおりに正確に描かれること |
make lint |
rustfmtとclippy。警告はエラーとして扱います |
make nostd |
すべてのデバイス用クレートが、標準ライブラリなしで、ベアメタル(aarch64-unknown-none)向けにビルドできること |
make deny |
すべてのワークスペースが守るべきベースライン、続いてcargo-deny。ライセンス、ソース、禁止クレート、既知のアドバイザリ |
make secrets |
ツリーとすべてのコミットを、鍵や認証情報がないかオフラインでスキャン |
make fuzz |
すべてのファズターゲットをlibFuzzerでビルドし、生成した入力に対して、それぞれFUZZ_SECONDS(10秒)ずつ実行 |
make kani |
Kaniの有界証明。各レコードデコーダが、最長のレコードまでのあらゆる入力に対して、パニックもオーバーフローも境界外の読み出しも決して起こさないこと。各証明が失敗しうることを示すミューテーションチェック付き |
make unsafe-audit |
unsafeなコードが、承認済みの一覧が許す場所にしか現れないこと |
make pds-miri |
unsafeを許されたクレートのテストをMiriで実行し、未定義動作がないかをチェック |
make sbom |
すべてのワークスペースの、CycloneDX形式の部品表 |
make image-sbom SYSTEM=NAME |
イメージとその部品表。カーネル、ローダー、モニター、すべての保護ドメインと、それぞれに含まれるクレートとそのハッシュ |
make sel4-config-check |
記録されているseL4の検証状況が、固定されたMicrokit SDKに対応するものであること |
make qemu-test-all |
すべてのシステムが、記載された各構成でQEMU上で起動し、期待出力ファイルのとおりに出力すること |
有界証明は、定められたサイズまでの入力についての証明であって、ありうるすべての入力についての証明ではありません。ファジングはクラッシュを見つけますが、クラッシュがないことは示せません。テストが示すのは、テストしたケースだけです。どれも、それが示せることのために、持つ価値があります。
すべてのクレートが守る基本ルール
これらはガイドラインではなく、すべてのワークスペースにあるリントとチェックです。
unsafeは使わない。例外は、ハードウェアやメモリに直接触れる、承認済みの短いクレートとファイルの一覧だけです。一覧への追加には、理由の明記とレビューが必要です。- 外部入力でパニックしない。ライブラリのコードに
unwrap、expect、panic!はなく、チェックなしのインデックスや算術もありません。リントの例外には、すべて理由が書かれています。 - デバイス用クレートは
no_stdで、何も確保しない。リリースビルドでもオーバーフローチェックを残し、パニックしたら、そのまま続けるのではなく、その部分を止めます。 - パーサーは、大きすぎる入力をコピーする前に拒否する。型付きのエラーを返し、プロパティテストとファズターゲットを備えています。
- シークレットは、どこにも置かない。開発用の鍵でさえも。テスト用の鍵はテストの実行時に作り、保存はしません。
イメージの記録を読む
すべてのイメージはbuild/BOARD/SYSTEM/に書き出され、その隣に二つの記録が置かれます。
sel4-config.txt は、イメージの名前、ハッシュ、ボード、Microkit SDK、カーネルを記した後、そのイメージがseL4の証明に対してどこに位置するかを、理由ごとに1行のstatus:で述べます。そして、その判断を左右する各カーネルオプションを、検証済み構成の値と並べて一覧にします。デバッグカーネルは開発ビルドです。マルチコアや混合クリティカリティのカーネル、あるいはseL4の一覧にないボードは、seL4の証明の範囲外です。すべてのオプションが一致するカーネルであっても、決して“検証済み”とは呼びません。記録は事実を示し、そこで終わります。
sbom.cdx.json は、イメージのCycloneDX形式のソフトウェア部品表です。何からできているかを、各保護ドメインの各クレートに至るまで、それぞれsha256付きで記します。
ゲートを速く保つ
証明とファジングをすべて行うと長い時間がかかるので、日常のmake ciは、Kani、ファジング、Miriを、変更が及ぶところだけで実行します。変更を、それに依存するすべてのクレートまでたどり、前回合格してから入力が変わっていないチェックは飛ばします。make ci CI_SCOPE=fullは、キャッシュを使わずにそれらすべてを実行します。make kani、make fuzz、make pds-miriは、常に全体を実行します。
Kaniは、最もメモリを食うステップです。証明ジョブにはそれぞれ約10 GBのメモリが割り当てられ、KANI_JOBSで同時に実行する数を設定します。make kaniでメモリが足りなくなったら、Podmanの仮想マシンにもっとメモリを割り当てるか、KANI_JOBS=1を設定してください。