NoWayOS
FR
GitHub
MenuFermer

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.

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.

  1. É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.

  2. 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.expect
  3. Le 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=hello
  4. Le 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.