Plateforme
Tout part de la tâche.
Vous écrivez votre application en Rust. NoWayOS la construit, avec uniquement les pilotes qu’elle utilise, sur le micronoyau seL4. L’image obtenue contient cela, et rien d’autre.
Sur cette page
De l’application à l’image
Un appareil NoWayOS se construit, il ne se configure pas. Quatre étapes mènent votre code jusqu’à un appareil qui accomplit son unique tâche, et chacune laisse derrière elle quelque chose que vous pouvez vérifier.
Écrire l’application
En Rust, sous la forme d’un ou plusieurs domaines de protection. Construisez ses écrans avec le petit cœur d’interface déclaratif de NoWayOS, ou concevez-les en React et convertissez-les à la compilation avec le Screen Compiler.
Décrire le système
Une description de système Microkit déclare chaque domaine de protection, région mémoire, canal et interruption. À côté, un fichier des droits liste tout ce que le système accorde, et un fichier expect liste ce qu’il doit afficher quand il s’exécute.
systems/hello.system systems/hello.grants systems/hello.expectLe construire
Dans le conteneur de développement. La compilation vérifie les droits par rapport à la description, puis écrit l’image avec sa nomenclature logicielle et un relevé de sa configuration seL4.
make image SYSTEM=helloLe démarrer, et le laisser se vérifier
D’abord dans QEMU : le système démarre sans affichage et doit afficher chaque ligne listée dans son fichier expect, dans l’ordre, et rien de ce que le fichier interdit. Puis sur le Raspberry Pi 5, vérifié avec le même fichier.
make qemu-test SYSTEM=hello
Des compartiments étanches
Chaque partie d’un système NoWayOS (l’écran, les entrées, le réseau, votre application) s’exécute dans un domaine de protection qui lui est propre, sur le micronoyau seL4. Un domaine de protection a sa propre mémoire et ne détient que les capacités que lui accorde la description de son système : une capacité fonctionne comme un badge qui n’ouvre qu’une seule porte. seL4 les fait respecter : une partie n’atteint donc que ce qui lui a été donné, et tout est conçu pour qu’un bug dans une partie reste dans cette partie.
- Un superviseur reçoit les fautes des autres parties, arrête la partie fautive et redémarre le système proprement. Quand les fautes s’enchaînent, l’appareil passe dans un état de repli sûr, et seul un démarrage à froid l’en fait sortir.
- Un domaine de protection watchdog ne réarme le watchdog matériel que tant que toutes les autres parties répondent à son signal de vie.
- Des rôles limitent ce que chaque partie peut recevoir : la compilation refuse un droit que le rôle d’une partie ne doit jamais avoir, comme un périphérique pour une partie qui ne doit que dessiner.
Des messages typés, copiés avant d’être vérifiés
Les domaines de protection communiquent par des enregistrements versionnés de taille fixe, à la disposition explicite, transmis sur des anneaux à producteur unique en mémoire partagée. Chaque enregistrement est copié hors de la mémoire partagée avant d’être vérifié : l’expéditeur ne peut donc pas le modifier entre la vérification et son utilisation.
Chaque parseur d’entrées externes est soumis au fuzzing et construit pour ne jamais paniquer, et chaque décodeur de messages dispose de preuves bornées, établies avec le vérificateur de modèles Kani.
Un écran natif, et pas de navigateur
L’interface utilisateur repose sur un petit cœur déclaratif : mise en page, focus et détection des clics en mémoire bornée, le tout dessiné avec la bibliothèque Rust embedded-graphics, en ne redessinant que ce qui a changé. Le texte provient d’atlas de glyphes dessinés à l’avance, à la compilation, si bien que l’appareil n’analyse jamais de fichier de police. Les applications voient des événements de touche, de pointeur et de toucher, jamais l’USB ni aucun autre protocole de périphérique.
Les designers peuvent continuer à travailler en React. Le Screen Compiler convertit en Rust, à la compilation, les écrans écrits dans le sous-ensemble qu’il prend en charge, et refuse tout ce qui sort de ce sous-ensemble plutôt que de l’approximer.
Ce qu’il contient
| Domaine | Ce que NoWayOS vous apporte |
|---|---|
| Environnement d’exécution | Des modèles de domaines de protection sur Microkit et rust-sel4 ; un superviseur qui arrête une partie fautive et redémarre le système proprement, avec un état de repli sûr après des fautes répétées ; un watchdog |
| Messages | Des enregistrements typés à la disposition binaire explicite, et des anneaux à producteur unique en mémoire partagée |
| Pilotes | Affichage (le ramfb de QEMU, le framebuffer du Raspberry Pi 5) ; entrées (virtio, claviers, souris et tablettes USB) ; réseau (virtio-net, l’Ethernet du Pi 5) ; hôte USB (xHCI) ; UART ; timers ; le ventilateur du Pi 5 |
| Réseau | Une pile IP sur smoltcp avec DHCP et TCP, qui ne se connecte qu’aux destinations autorisées par le système ; un client TLS 1.3 sur rustls et RustCrypto |
| Temps et confiance | Le temps monotone et le temps calendaire, sous forme de types qui ne se mélangent jamais ; la vérification de signatures ECDSA P-256 ; les enregistrements des mises à jour signées ; des graines issues d’une source d’aléa matérielle soumise à des tests de santé |
| Interface utilisateur | Un cœur d’interface déclaratif borné, avec mise en page, focus et détection des clics ; un moteur de rendu sur embedded-graphics ; des atlas de glyphes et des icônes dessinés à l’avance |
| Outillage | Le conteneur de développement ; les fragments make avec lesquels se construisent les dépôts de produits ; les vérifications des droits, de l’unsafe, des licences et des secrets ; des outils pour la SBOM et les éléments de preuve des versions ; des lanceurs QEMU et Raspberry Pi |
Matériel
| Où | Son rôle |
|---|---|
| QEMU (AArch64) | Chaque système y démarre en premier, dans le conteneur de développement, et vérifie sa propre sortie |
| Raspberry Pi 5 | La carte de référence bon marché que tout le monde peut acheter. L’interface utilisateur, les entrées USB, les timers et le watchdog y fonctionnent aujourd’hui |
| NXP i.MX8 | Le matériel de production visé, avec une racine de confiance matérielle. Pas encore pris en charge |
NoWayOS est développé sur des machines Apple silicon (arm64). Sur x86-64, les paquets de l’image de développement sont eux aussi figés et relus, mais l’image n’y a pas encore été construite et testée de bout en bout.
Bâti sur
NoWayOS s’appuie sur le travail d’autres personnes, et le dit : seL4, Microkit, rust-sel4, les files réseau du seL4 Device Driver Framework, smoltcp, rustls, RustCrypto et embedded-graphics.