NoWayOS
JA
GitHub
メニュー閉じる

2026年11月13日

証明が約束できること

テストは、誰かが思いついた場合を試します。証明は、すべての場合を対象にします。seL4の数学的な証明が何を述べ、何を前提とし、NoWayOSがその横のどこに立っているのか。

ソフトウェアが信頼されるのは、たいていテストされたからです。誰かがうまくいかなくなりそうな場面を考え、試し、切り抜けるのを確かめました。この方法はよく機能します。誰も思いつかなかった場合に行き当たるまでは。

証明は反対側から始めます。場合を試すのではありません。ある命題がすべての場合に成り立つことを、数学によって示します。

試した場合ではなく、すべての場合

小さな約束を例にとりましょう。「このコードは、バッファの終わりを越えて読むことがない」。テストは千個の入力、あるいは十億個の入力を与えて、どれもコードを壊さなかったと報告できます。証明が述べるのは、種類の違うことです。コードを壊す入力は存在しない。見つからなかったのではなく、ないのです。

その代償は厳密さです。証明には、コードが何をすべきかを正確に述べたもの、つまり仕様と、コードの一行一行を仕様に結びつける論証が必要です。現実のソフトウェアでは、その論証は人が目で確かめるには長すぎます。そこで、コンピュータが検査します。

テストか、証明か

テスト誰かが試そうと考えた場合を示します。

証明誰も思いつかなかった場合も含め、すべての場合を対象にします。

考え方を描いた図です。証明は、その命題について、その前提のもとで成り立ちます。

機械による検査

「機械検査された」とは、そういう意味です。証明は、証明支援系と呼ばれるプログラムが読める言語で、省略なしに書き下されます。そしてそのプログラムが、一つひとつのステップを論理の規則に照らして検査します。九百ページ目で疲れることはなく、誰の言葉も鵜呑みにしません。

seL4の証明は、Isabelle/HOLという証明支援系で、このように検査されています。証明は公開されており、誰でももう一度実行できます。

seL4の証明が述べていること

seL4は、すべてのNoWayOSシステムがその上で動くカーネルです。約10,000行のコードであり、デバイスを完全に制御できる唯一のコードです。要点はその小ささにあります。一万行についての論証は、最後までやり遂げられます。数千万行についての論証は、まだできません。

seL4 Foundationは、これらの証明を層に分けて説明しています。

  • コードは仕様のとおりに動作し、それ以上のことはしません。 そこから、カーネルにはできないことの一覧が導かれます。バッファをあふれさせること、ヌルポインタをたどること、メモリをリークすること、ゼロで割ること。
  • 実際に動くプログラムは、証明されたコードと一致します。 両者の間にはコンパイラがあるので、その出力を別の証明が検査します。
  • カーネルは、システムの各部分を分離しておけます。 ある部分は、権利を付与されていないかぎり、別の部分のデータを変更することも、読むことも、必要とする資源を奪うこともできません。
  • システムは、設計されたとおりの状態で起動できます。 その記述に挙げられた付与と、ちょうど同じ付与を持って。

すべての層が、すべてのプロセッサ、すべての構成について完了しているわけではありません。これは重要な点で、後でもう一度触れます。

証明が前提とするもの

証明の広さは、その命題の広さとちょうど同じで、証明は前提の上に立っています。seL4は自らの前提を書き出しています。ハードウェアがそのモデルのとおりに振る舞うこと、最も低いレベルの数百行のコードが正しいこと、カーネルの起動前に動くコードが役目を果たしていること。機密性の証明は、タイミングを対象としていません。

証明は、仕様が正しいことを求めているかどうかについては何も述べず、カーネルより上のソフトウェアについても何も述べません。証明されたカーネルは、バグのあるプログラムも忠実に隔離します。バグはそこに残っています。ただ、ほかの何にも届かないだけです。

これは証明の弱点ではありません。証明に価値がある理由です。何を対象とするかを正確に述べるので、何が残っているかを正確に知ることができます。

NoWayOSの立ち位置

率直に申し上げます。NoWayOSはseL4の上で動きますが、現時点で、seL4の完了済みの証明の範囲に入るNoWayOSイメージはありません。NoWayOSが使うのはseL4の混合クリティカリティ構成で、私たちのプロセッサ向けの証明は進行中です。そして、seL4の証明がNoWayOS自身のコードを対象としたことは、一度もありません。ですから、私たちはNoWayOSを“形式検証済み”とは呼びませんし、これからも呼びません。

どのイメージも、自分の立ち位置を示します。イメージの横に置かれるファイルが、カーネルの構成を、seL4が証明した構成と並べて、オプションごとに記載します。セキュリティのページに、実物があります。

私たち自身の、小さな証明

NoWayOSのコードは、別の方法で保証を得ています。Rust、隔離、レビュー、テスト、そしてもっと控えめな種類の証明です。

システムの部分どうしがやり取りするメッセージのデコーダには、すべて有界証明があります。Kaniというモデル検査器で作ったものです。有界証明は、定められた大きさまでのすべての入力を対象とします。ここでは、デコーダが受け付ける最長のレコードまでです。その範囲の中では、本物の証明です。どんな入力も、デコーダをパニックさせず、オーバーフローさせず、境界外を読ませません。範囲の外については何も述べません。だからこそ、範囲を、ありうる最長の入力に合わせてあります。

そのうえで、私たちはデコーダをわざと壊し、証明がそれに気づくことを確かめます。失敗できない証明は、失敗できないテストより優れているわけではありません。

等身大の姿

証明は、何かを“ハッキング不可能”にするものではありません。証明は、一つの命題を、すべての場合に、読むことのできる前提のもとで、真にします。命題と前提を知れば、自分が何を手にしているかがわかります。

だからNoWayOSは、その証明を持つカーネルの上に作られています。そして、証明がどこまで届いているかを、イメージごとにお伝えします。