ここに至るまで
始まりは、 つまずきが許されない場所でした。
オペレーティングシステムを作ろうとしていたわけではありません。とても重要ないくつかのデバイスを守ろうとして、その足元に同じ問題を何度も見つけたのです。
- 課題
- 国を支えるシステムを守ること。電力を送り続け、水を清潔に保つ制御装置。病院が頼るネットワーク。そのデータを外へ運ぶゲートウェイ。制御室の端末。そしてその周りにあるあらゆるデバイス、公共の場で見知らぬ人が歩み寄って触れる画面に至るまで。どれも仕事はひとつでした。そしてどれもが、何千もの仕事をこなすために作られたオペレーティングシステムで動いていました。
- 落とし穴
- 汎用システムには、いつか必要になるかもしれないものが一式そろっています。ブラウザ、デスクトップ、シェル、ログイン、バックグラウンドサービス。ひとつのアプリに絞ってロックダウンしても、それらはすべて下に残り、誰かがそこへ戻る道を見つけるのを待っています。余分なコードは一行残らず、パッチを当てる対象であり、攻撃される対象でもあります。
- 転機
- そこで、逆の問いを立てました。デバイスが、そのひとつの仕事だけを持っていたらどうだろう? seL4から始め、その上にある自分たちのコードはすべてRustで書き、各部分をそれぞれ専用の区画に封じ込め、それ以外はすべて外しました。そして根拠を書き残しました。誰も私たちの言葉をうのみにしなくて済むように。
- 意外な発見
- それから周りを見渡しました。変電所のゲートウェイ、制御室の端末、ポンプの側面のパネル、二つのネットワークの間に置かれた箱、駅の壁のディスプレイ。専用デバイスのほとんどは、仕事がひとつです。重要インフラを守る鎧として始まったものは、そのすべてをよりよく作る方法でもあったのです。私たちはそれを、Single Purpose OSと呼んでいます。
攻撃されるものは、少なく。パッチは、はるかに少なく。ほかにすることは、何もない。
私たちの定義
目的は、組み込む。 それ以外は、入れない。
Single Purpose OSは、あるデバイスのひとつの仕事のために作られます。何でも動かせるように作ってから、ひとつのことに絞ってロックダウンするのではありません。そう呼べる条件は三つです。
ひとつの仕事のために作る
デバイスイメージに入っているのは、アプリケーションと、そのアプリケーションが使うドライバと、カーネルだけ。ほかの仕事が必要とするかもしれないものは、何も入っていません。ブラウザも、デスクトップも、シェルも、パッケージマネージャも、ユーザーアカウントもありません。
内側を区画で封じる
各部分(画面、入力、ネットワーク、アプリケーション)は、それぞれ専用の区画で動き、許可されたものにしか届きません。ある部分の障害は、その部分にとどまるよう設計されています。
根拠を示す
中に何が入っていて、各部分に何が許されているか、その根拠が付いてきます。すべての付与を書き出し、すべての構成要素を一覧にし、誰でも実行できるチェックを用意しています。
キオスクモードとは違います。それは汎用システムをひとつのアプリに固定し、ほかのものはすべてそのまま残す方式です。シングルユーザーOSとも違います。そちらが制限するのはコンピューターを使う人であって、中に何があるかではありません。
入っていないもの
ソフトウェアは、少なく。 それが設計です。
専用デバイスの多くは、汎用システムの上にアプリケーションをひとつ載せて動いていて、その下にはほかのものがすべて残っています。NoWayOSは仕事から出発し、必要なものだけを加え、残りは入れません。その違いをご覧ください。
| 一般的なロックダウン済みデバイス | NoWayOSのデバイス | |
|---|---|---|
| WebブラウザとJavaScriptエンジン | 含まれる | 組み込まれていない |
| デスクトップとウィンドウシステム | 含まれる | 組み込まれていない |
| シェルとコマンドライン | 含まれる | 組み込まれていない |
| パッケージマネージャ | 含まれる | 組み込まれていない |
| ユーザーアカウントとログイン | 含まれる | 組み込まれていない |
| バックグラウンドサービス | 含まれる | 組み込まれていない |
| すべてをロックダウンするための設定 | 含まれる | 組み込まれていない |
| カーネル | 汎用:数千万行 | seL4:約10,000行 |
| ドライバ | 出会うかもしれないハードウェアの分まで | 使うハードウェアの分だけ |
| あなたのアプリケーション | 含まれる | 含まれる |
Screen Compiler
Reactが好き? 私たちもです。
リッチでモダンなインターフェースを、使い慣れたワークフローで作りたい? それなら画面はReactで書いてください。Screen Compilerがそれを、NoWayOS上で直接動くネイティブなRustコンポーネントに変換します。ブラウザも、JavaScriptも、攻撃されるWebページもありません。
- 道具はそのまま。コンポーネント、props、デザイントークン、そしていつものエディタ。
- 本物の部品。レイアウト、テキスト、ボタン、テキスト入力、チェックボックス、ラジオグループ、カード、通知、プログレスバー、アイコン。
- 正確か、何もしないか。対応するサブセットは正確に変換し、それ以外はファイル・行・列を示して拒否します。推測は決してしません。
- ピクセル単位で確認。変換された画面はすべてNoWayOSが描画し、承認済みの画像と照合します。
<Column gap={SPACE_SM} padding={SPACE_LG}>
<Text id="title">Welcome</Text>
<Text>Touch Start to begin.</Text>
<Button id="start" onPress={onStart}>
Start
</Button>
</Column>let n1 = b.text("Welcome")?; // welcome.tsx:17:9
let n2 = b.text("Touch Start to begin.")?;
let n5 = b.button("Start", actions::START)?;
let n0 = b.column(
ui::Layout::new()
.gap(super::tokens::SPACE_SM)
.padding(super::tokens::SPACE_LG),
&[n1, n2, n5],
)?;Screen Compilerのテスト画面のひとつと、そこから生成されるRustを短くしたものです。
なぜ重要か
仕事はひとつ。それで十分。
ひとつのことのためだけにコンピューターを作るなら、作り方をまるで変えられます。それで手に入るものがこちらです。
より安全に
組み込まれていないものは、悪用しようがない。
- ブラウザエンジンなし、ウィンドウシステムなし、シェルなし、パッケージマネージャなし、ユーザーアカウントなし。イメージに入っていないものは、攻撃に使われようがありません。
- 画面、入力、ネットワーク、そしてアプリケーションは、それぞれ専用の封じられた区画に収まり、許可されたものにしか届きません。ある部分の障害が、その部分にとどまるように作られています。
- 中心にあるのはseL4。seL4 Foundationはこれを「世界で最も高い保証水準を持ち、かつ最速のオペレーティングシステムカーネル」と呼んでいます。
- 隅々までRust。unsafeなコードはレビュー済みのごく少数のクレートにしかなく、その一覧はビルドが強制します。
より効率的に
遊んでいるものはない。邪魔するものもない。
- バックグラウンドサービスはなく、使わないソフトウェアのためのアップデーターもありません。電源を入れれば、すぐにひとつの仕事に取りかかります。
- すべてのバイトはビルド時に決まります。各部分には固定量のメモリが割り当てられ、それ以上を取ることはできません。デバイスのコードの大半はメモリをまったく確保せず、TLSクライアントでさえ固定の予算で動きます。予算を使い切ったら、膨らむのではなく、きれいに停止します。
- 変わったところだけを描き直す、くっきりとしたネイティブインターフェース。Raspberry Pi 5のような低価格なハードウェアにもよくなじみます。
より扱いやすく
言語はひとつ。コンテナもひとつ。まずはエミュレーターで。
- ドライバからユーザーインターフェースまで、Rust。
- 画面はReactでデザイン。Screen Compilerがビルド時にネイティブなRustへ変換します。デバイス上にブラウザエンジンもJavaScriptもない、モダンなインターフェースです。Rustで直接書くこともできます。
- ツールチェーン、seL4 Microkit SDK、QEMUは、バージョンを固定してひとつの開発コンテナに収めてあります。手元のマシンに必要なのはPodmanとmakeだけ。Raspberry Piを操作するなら、それにPythonを。
より証明しやすく
付与は、すべて書き出す。イメージは、すべて明細にする。
- システムが付与するケイパビリティはすべてファイルに一覧化され、両者が食い違えばビルドは失敗します。
- すべてのイメージに、ソフトウェア部品表と、seL4構成の記録が付いてきます。
- すべてのメッセージデコーダが、パニックもオーバーフローも境界外の読み出しも決して起こさないことの有界証明。さらにファジング、ライセンスとアドバイザリのチェック。どれも、ご自身で実行できるコマンドです。
すべてを託すなら、仕事はひとつに。
ほかのことに気を取られている余裕のない、重要な仕事を担うデバイスがあります。電力網の制御装置、水道施設から外へつながるゲートウェイ、制御室の端末、二つのネットワークの境界。NoWayOSは、各デバイスが果たすべき役割を中心に設計されており、中に何が入っているかを理解する助けとなる根拠を備えています。
形容詞より、根拠を
余計なことはしない。確かめられます。
セキュリティの主張は、裏付けとなる根拠があってこそです。NoWayOSは根拠を書き残します。そのひとつひとつが、誰でも実行できるコマンドから生まれます。
付与は、すべて書き出す
各システムの付与ファイルには、そのシステムが付与する優先度、メモリ領域、デバイス、割り込み、チャネルがすべて載っています。システムと一覧が食い違えば、ビルドは失敗します。
隔離は、失敗させて確かめる
隔離テストは与えられていないものに手を伸ばし、seL4はそれを止めなければなりません。わざと付与を広げた変種は失敗しなければならず、それがテストに失敗する力があることを示します。
イメージは、すべて明細に
すべてのイメージにCycloneDX形式のソフトウェア部品表。カーネル、ローダー、各保護ドメインとそこに含まれるクレートを、それぞれハッシュ付きで記載します。
ゲートは、手の届かない場所に
すべてのコントリビューションが通過しなければならないチェックは、独立した公開リポジトリDefence Agentに置かれています。ゲートに触れるプルリクエストには、メンテナー向けのフラグが立ちます。
オープンな場で
四つのプロジェクト。仕事はそれぞれひとつ。
四つすべてがオープンソースで、GitHub上のNoWayOS組織でオープンに開発しています。クローンし、ビルドし、すべての行をご自身で確かめてください。
NoWayOS
Single Purpose OS。
seL4とMicrokitの上で保護ドメインを組むためのパターン、型付きメッセージ、ドライバ、ネットワーク、ネイティブなユーザーインターフェース。そして、すべてのNoWayOSリポジトリがビルドに使う開発コンテナとチェック。
- ステータス
- 開発中
- ライセンス
- MIT OR Apache-2.0
Screen Compiler
Reactでデザイン。ネイティブなRustで出荷。デバイスにブラウザはなし。
宣言されたサブセットに沿ってTSXで書かれたReactの画面を、NoWayOSのユーザーインターフェース用のRustに変換します。ビルド時に手元のマシンかCIで動き、デバイスに載ることはありません。
- ステータス
- 開発中:サブセットv0と、v1の最初の部分
- ライセンス
- MIT
Showcase
Raspberry Piで動かせる、セキュアなアプリケーション。
セキュアなセルフサービス画面のためのキット、その上に組み立てるためのリファレンスアプリケーション、そしてRaspberry Pi 5が起動時に立ち上げる、架空のブランドによるサンプルのランチャー。
- ステータス
- 初期段階で、実運用には使えません
- ライセンス
- MIT OR Apache-2.0
Defence Agent
すべてのコントリビューションが通過すべきゲートを、プルリクエストの手の届かない場所に。
NoWayOSのオープンなプロジェクトへの変更が通過しなければならないすべてのセキュリティゲートを、それぞれが対処する脅威と、誰が変更してよいかとともに書き出したもの。そして、それらを実行するエージェント。プルリクエストが、自らを判定するものを変えたり用意したりすることは決してありません。
- ステータス
- 公開済み:ゲートを書き出した段階。エージェントとツールはこれから
- ライセンス
- MIT OR Apache-2.0
商用パートナー
NoWayOSの上に築く、 商用製品。
NoWayOSのスポンサーであるAdappt.aiは、その最初の商用パートナーです。NoWayOSの上で二つの商用製品を開発しており、どちらも開発中です。
商用パートナーにご関心はありますか? partners@nowayos.com へメールする
- Remote Desktop
- 強化ガラス越しの眺め。リモートのWindowsデスクトップのためのセキュアなステーションです。接続をそれ専用の区画に封じ込め、認証情報をその手の届かないところに置くよう設計されています。
- Data Diode
- 戻る道は、ない。保護されたネットワークからデータを外へ出すための、一方通行の境界です。光を一方向にしか運ばないリンクを中心に設計されています。
現在地
いま、動いています。 まだ完成ではありません。
NoWayOSは開発中で、まだ本番運用に使える段階にはなく、APIも今後変わります。いま動いているもの、そして次に来るものはこちらです。
- QEMUで
- 50を超えるシステムが起動し、自らの出力をチェックします。最初の保護ドメインから、DHCPリースを取得するネットワークスタック、スーパーバイザーのフェイルセーフ状態、クリックして操作できるユーザーインターフェースまで。
- Raspberry Pi 5で
- HDMI画面上のユーザーインターフェース、USBキーボードとマウス、タイマー、ウォッチドッグ、スーパーバイザーによるリセットが、すべてボード上で動いています。ほかのハードウェアへの対応も進めています。
- これから
- セキュアブート、デバイス上で適用する署名付きアップデート、そして産業用ハードウェア(NXP i.MX8)。
- seL4の証明
- どのシステムもseL4の上で動きますが、seL4の完了済みの証明が対象とする構成を使っているNoWayOSイメージは、まだありません。各イメージは、自らが使う構成を記録しています。
開発を追う
目的はひとつ。見どころはたくさん。
設計から読むもよし、根拠を調べるもよし、開発者ガイドで最初のシステムを組み立てるもよし。ちなみにこのサイトも同じルールを守っています。スクリプトなし、Cookieなし、ほかにすることは何もありません。