Chapter 16 of 16 · Deutschnullos.de

Timeline

How a childhood idea becomes an operating system – commit by commit.

Milestones

long agoAs a little boy, Max has the idea: an operating system of his own.
Oct 28, 2026 19:30Kickoff.
19:41Project folder and Git repo created.
19:45First own tool runs: c (copy), on the Mac.
19:54First boot: nb starts in QEMU, nk shows a prompt – own font, keyboard, serial console.
20:03Catalog complete: 409 tools with short names.
20:26The own C compiler compiles itself.
20:45Kernel built only with our own compiler, assembler and linker – boots.
21:09First download images: USB/disk (.img) and live CD (.iso), boot in QEMU.
21:10The editor e is here.
21:19Kernel can do processes: all 44 system calls, ELF loader, pipes, signals, RAM file system.
21:20Our own libc is in place.
21:22The compiler can do RISC-V 64.
21:23ESP32-C5 becomes the first small device.
21:25Kernel reads SATA disks and FAT.
22:29Shell and tools run on NULLos itself – the kernel starts s at boot.
23:10All of NULLos – kernel, libc, 280 tools – built only with our own compiler, runs.
23:16cc compiles itself on NULLos.
Oct 29 00:05Own Python interpreter py: test suite green (on the Mac).
00:07Shell and 319 tools on NULLos, double-checked in QEMU (picture).
00:42German keyboard with umlauts.
00:51py compiles all 635 files of the Python 3.15 standard library without errors.
00:53Python runs on NULLos.
01:07Sockets in the kernel: IPv4 and IPv6, for now inside the machine.
01:29NULLos is online: virtio-net and e1000, own TCP/IP stack with IPv6 and IPv4.
01:32Two NULLos talk to each other over TCP.
01:54The font gets real lowercase letters and all of Latin-1.
02:19Via SSH onto NULLos: OpenSSH from the Mac logs in to the NULLos SSH server. Plus ip, dns, nc, dl, htp and pi run on NULLos.
07:02Security from the ground up: plan with 40 measures and rules for all sessions, program ID card.
07:10Own TLS 1.3 – dl fetches HTTPS, on NULLos too.
07:28Devices under /dev, disks as block devices, mounting.
07:33Python counts as done: the test suite runs on NULLos the same as with CPython.
07:39Secure randomness in the kernel.
07:43SMEP/SMAP on.
07:44vc clones Git repos over HTTPS – on NULLos.
07:57Stack protection and W^X in the kernel.
08:50All CPUs run (SMP).
08:56Firewall on out of the box.
11:48Max decides the permission model: power of attorney instead of mandatory rules, rights only flow downward.
12:00Permissions in the kernel: users, enforced ID card, einschr, system folders read-only even for the admin.
12:42Hardened malloc in the libc, tools with stack protection by default.
12:48Rights now only flow downward in the kernel too: the ID card of the starter limits everything it starts.
14:35The kernel with all CPUs builds with our own cc.
15:42Naming = allowing: the shell is the broker, what you type, the program may use.
16:51Mac keyboard layouts de-mac and us-mac.
Oct 30 01:51NVMe driver: read and write, in QEMU.
02:10USB: xHCI, hubs, keyboard, mouse, sticks.
02:41virtio 1.x and a launcher for Apple's virtualization; TLS server.
02:56RDP – server and client, soon after with NLA login.
04:20Kernel mounts USB and NVMe – both run in QEMU on main.
04:49ARM64 boots to the shell, shortly after also as a guest in Apple's virtualization.
05:22ACPI with its own AML interpreter – NULLos powers off properly.
06:06RISC-V 64 in QEMU; shortly after, sound via virtio-sound and Intel HDA.
07:16NULLos 0.3 – new release.
07:20Raspberry Pi 4 (in QEMU) up to the prompt.
09:19Protection against cold boot attacks: memory is zeroed, RAM wiped at power-off.
09:28USB devices only with approval – protection against BadUSB.
–First boot on a real PC from a USB stick coming soon
–nullos.de goes online coming soon

Every step

Automatically from the Git log (without the factories' “belegt” commits).

30.10.2026

  1. nullos 0.3
  2. Stand nach 0.3 (30.10.2026)
  3. check-boot: Client in wartet bis 850 s auf „hört auf 7010“ (Fund H1: zeitweise „accept von außen (-11)“)
  4. H9: RISC-V 64 in QEMU virt – (S-Mode, Sv39, Traps, PLIC, Zeitgeber über SBI, SMP über SBI HSM/IPI, 16550, PCI ECAM), nb als BOOTRISCV64.EFI über, libc-Start und ecall-ABI; W^X und Wachseiten wie auf x86/ARM64 (S21, S24)
  5. H9: Stand – make ARCH=riscv64 check 73 ok, 0 FEHL (4 CPUs, Netz, GPT/FAT32); x86 80 ok, ARM64 73 ok
  6. Hardware-Plan: H9 RISC-V in QEMU fertig
  7. Doku: neu erzeugt nach Neuanlage des Repos (Chronik-Log ab 0.3)
  8. S5: – Regel Historie: alte Wurzel b595fffb nie wieder hochladen, Prüfung mit merge-base --is-ancestor
  9. abgleich: listet Worktrees auf alter Historie (b595fffb) mit Commits nach d59f65f3
  10. H9: alle 405 Werkzeuge bauen für RISC-V; make ARCH=riscv64 check mit Werkzeugen, Shell und libc-Tests 88 ok, 0 FEHL
  11. Desktop-Entwurf: Stand H12 (bei H2) und offene Wünsche
  12. Hardware-Plan: H13 IOMMU, H14 CPU-Fehler und Regler, Regeln aus der Recherche zu physischen Angriffen
  13. Desktop-Entwurf: §7.1 physische Angriffe (Abstrahlung, EDID/CEC, Sperre, Geräte-Freigabe)
  14. H1: ARM64 mit ramfb (Bildschirm für Desktop K5, run und check); ARM64 als __nullos_sc_roh wie x86/RISC-V (Hinweis H9)
  15. Desktop-Entwurf: K5 erledigt (ramfb auf main c19d4aa5)
  16. Abgleich Runde 16: 301 fertig (Mac), 102 teilweise, 0 fehlerhaft, 1 ausgelassen, 5 offen; make check ok; RE 401 sauber, 1 auffällig (krb); kx teilweise, mck fertig
  17. F49 Kaltstart: (QEMU+QMP, LUKS2 mit bekanntem Schlüssel) – Schlüssel, Rundenschlüssel und Passwort bleiben nach cry, off und Warmstart im RAM
  18. libc: Seitengröße aus AT_PAGESZ (Wunsch H1, ARM64 mit 16-KB-Seiten) – sysconf(_SC_PAGESIZE), _SC_PHYS_PAGES und die malloc-Wachseite nehmen sie, Rückfall 4096. Test seite_test in eigen
  19. Physische Angriffe: (104 Einträge, Security-Durchsicht), Funde F50–F65 mit Zuständigen und Priorität, F64 = nicht durch Software lösbar
  20. Werkzeug ac: -m Stummmarke (Stille bei Passworteingabe, F62), Test, README
  21. Werkzeug swp: Wunsch verschlüsselte Auslagerung (F52) in README
  22. S28: sen, pwr, tp, cpu – Vermerk F54 (Seitenkanäle Energie/Temperatur/Lüfter): Nicht-Admins nur vergröberte Werte vom Kern, Setzen nur Admin über den Kern, nie MSR
  23. cc: Plan für Spectre-v2-Schutz (Retpoline, Return-Thunk, SLS) in der README (F54, Auftrag Security)
  24. Durchsicht auf TLS-Zeitangriffe (Lucky13, Bleichenbacher/ROBOT, Raccoon, Hertzbleed); tl_ct_eq mit volatile und ohne Vergleich; lehnt Server mit nur CBC, RSA-Transport oder DHE ab; Regeln für Bluetooth, WLAN und DMA in
  25. bt: Sicherheitsregeln F60 in README, key-size (KNOB) abfragen und prüfen, Tests gegen Koppeln/Firmware
  26. S5: – .S-Namen erst ab 3 Zeichen (in krb war Zufall), Ausgabe nur druckbares ASCII (Abgleich Runde 16); F59/F61: Desktop-Plan 6f86005b eingetragen
  27. Anwenderdoku: Physische Sicherheit – was Software nicht kann (Aus statt Bereitschaft, fremde USB-Geräte/Ladekabel, Abstrahlung/Air-Gap, Evil Maid, TPM nur mit PIN, Passphrase, Thunderbolt/FireWire; NULLos-Stand je Punkt; Verweis auf und F64) – F63
  28. Desktop-Entwurf: Schutzklassen beim Sperren (Empfehlung Security), Ausweis-Wort bildschirm aufnehmen
  29. F54: Spectre-v2-Plan von cc (505a3595) eingetragen
  30. F60: Netz (344eaaae) und bt (e3aeed56) eingetragen, teilweise
  31. F63 abgenommen (99043e36), Nacharbeit: keine Repo-Pfade in der öffentlichen Anwenderdoku
  32. Anwenderdoku: keine Repo-Dateinamen in den öffentlichen Seiten (RE-Schutz, Entscheidung 30.10.): Verweise auf …, und ersetzt – Nacharbeit F63
  33. bt: L2CAP-, ATT- und SDP-Zerleger mit Längenprüfung, gemeinsames Fuzz-Ziel (11 Mio. Läufe ohne Fund)
  34. F63 erledigt (4eebf967: keine Repo-Pfade in)
  35. ssd: Härtung gegen Seitenkanäle – sc_reduce ohne Sprung nach Geheimnis, Masken über ct_opaque, ct_eq-Ergebnis ohne Sprung, Base64 ohne Tabelle (privater Schlüssel), SHA/ChaCha/Poly1305-Zustand und Hostschlüssel-Puffer auf jedem Weg gelöscht, burn_stack nach dem Schlüsseltausch, ARM64-DIT auf dem Mac
  36. F60: bt-Zerleger L2CAP/ATT/SDP (8d2b7045) nachgeprüft, 8,35 Mio. Fuzz-Läufe ohne Fund
  37. Ed25519 verdeckt (F60, Hertzbleed): zufällige Z-Koordinate am Basispunkt, Skalar s + m·L mit 64-Bit-Zufall über feste 320 Bit; pruef vergleicht 64 Zufallsskalare verdeckt gegen unverdeckt; Kommentar zu nach F39 berichtigt
  38. Fuzz-Ziel bt_pakete (bindet ein), läuft mit
  39. cry: Schutz gegen Kaltstart-Angriffe – Geheimnisse sicher löschen, Passwort ohne stdio und Echo (S7, S10)
  40. F60: ssd-Härtung gegen Seitenkanäle (fee60338) abgenommen
  41. H8: nullos auf Raspberry Pi 4 (QEMU raspi4b) bis zum Prompt – Pi-Lader pb, Plattform aus dem Gerätebaum, GICv2
  42. H11: Regel für Mikrofon-Aufnahme (nur mit Freigabe je Programm, Buchsen-Umwidmung nur im Kern)
  43. Hardware-Plan: H8 Raspberry Pi 4 in QEMU bis zum Prompt
  44. F60: Ed25519 verdeckt (d364f00d) nachgerechnet, bt_pakete dauerhaft im Fuzz-Lauf; F60 bis auf künftige Treiber erledigt
  45. H12: HID-Report-Protokoll, Maus mit Rad und Knöpfen 4/5, usb-tablet absolut, Touchpad als Digitizer (Slot-Modell), /dev/eingabe (Vorschlag K2)
  46. H12/K2: Vertrag /dev/eingabe in und („Eingabe (Fassung 12)“), Kern-Schnittstelle in, poll für /dev/eingabe, Satz EIN_GERAET beim Ein-/Ausstecken
  47. Hardware-Plan: H12 Eingabe in QEMU (Maus, Tablet, Touchpad eingespielt)
  48. Desktop-Entwurf: /dev/eingabe auf main (H12), offene Punkte
  49. Hardware-Plan: H15 USB-Geräte-Freigabe (F59), F50/F54 bei H13/H14
  50. Anwenderdoku: QEMU/SSH mit dem fertigen Abbild nullos-0.3-x86_64.img statt Bau aus dem Quellcode (Entscheidung Max 30.10.): Prüfsumme mit SHA256SUMS, Schlüssel per diskutil ins Abbild, QEMU-Befehl wie auf nullos.de; Bau aus dem Quellcode aus der öffentlichen Doku genommen; alle Schritte wörtlich am 0.3-Abbild in QEMU geprüft
  51. abgleich: Hinweise „Physische Angriffe“ in – memset auf Geheimnisse ohne Sperre, S-Box-Tabellen, Passwort von stdin ohne Echo-Abschaltung, Geräteparser ohne Ziel in; keine Sperre
  52. Desktop: Sperre löscht Fensterpuffer und meldet an die Plattform, abgewiesene Geräte nach dem Entsperren, Super-Antippen gesperrt behoben (Security F59/F61)
  53. Regel „Physische Angriffe beachten“ für Werkzeuge mit Schlüsseln/Geräten (Auftrag Max 30.10.)
  54. Passwort wie ein Mensch an der Abfrage tippen (statt echo | cry), 1 s nach der Abfrage
  55. F49 Zwischenstand (Schlüssel weg, Passwort 2× im Kern), F57 libc erledigt, F61 ds-Teil, neu F66 Passwort-Echo-Wettlauf, F67 Abgleich-Hinweise
  56. Werkzeug ph (C): Passwort ohne Echo und ohne stdio-Puffer lesen, Geheimnisse mit wipe löschen (F66/F67)
  57. efs: Geheimnisse mit explicit_bzero löschen (Mac: volatile-Schleife), Passwort unter nullos ohne Echo per read() ohne stdio-Puffer
  58. F67: efs b46bfbac geprüft (explicit_bzero ok; Echo noch nach der Abfrage = F66, offen)
  59. sgn: Geheimnisse mit explicit_bzero löschen, auch auf Fehlerwegen (Security F67) – Kennwort, Seed, Schlüssel, Ed25519-Skalar/Nonce, SHA-512- und Blowfish-Zustand; Kennwort von stdin und Schlüsseldateien ohne stdio-Puffer; ok, QEMU 23 Fälle gleich
  60. F67: sgn 19ff2230 geprüft (wipe überall, TCSAFLUSH; offen ed_scalarmult-Zwischenwerte)
  61. F66/F67: su lgn psw krb fragen erst nach Echo-Aus; Geheimnisse mit nicht wegoptimierbarem Wipe gelöscht (su lgn psw vl krb)
  62. libc: F66 – TCSAFLUSH verwirft auf nullos die ungelesene Eingabe; readpassphrase/getpass (Echo aus und Vorlauf weg vor der Abfrage, byteweise ohne stdio, /dev/tty); Test pass_test (Rohrleitung) und Kind 'pass'; am Mac im Pseudo-Terminal: Vorlauf verworfen
  63. efs: Passwort per readpassphrase (Echo aus vor der Abfrage), Passwort/Schlüssel/HMAC-Zwischenwerte auf allen Rückwegen gelöscht
  64. ppp: Passwörter mit wipe (volatile) statt memset löschen, auch PAP-Puffer und beim Ende; Empfangsseite als deframe/enframe herausgelöst und gefuzzt (neues Ziel) – Security F67
  65. F66: libc-Teil abgenommen (QEMU-Beleg Vorlauf verworfen); offen cry/su/efs Abfrage vor Echo-Abschalten
  66. F66: su lgn psw krb auf nullos: Echo abschalten mit TCSAFLUSH (Vorgetipptes wird verworfen), Frage erst danach
  67. F67: efs f3017030 und ppp 6d5cc14a abgenommen, ma Fehlalarm
  68. scp: F67 – Geheimnisse mit wipe() (volatile) löschen statt memset, Passwort per readpassphrase ohne Echo; Test ok
  69. F67: scp 29de4748 teilweise (key_load-Fehlerwege und stdio-Puffer offen)
  70. scp: F67 – key_load mit einem Ausgang, der txt und bin auf jedem Weg löscht; Schlüsseldatei per open/read statt stdio
  71. F67: scp adfbf53f abgenommen (key_load wischt auf allen Wegen, ohne stdio)
  72. rdp: Passwort per readpassphrase (Echo aus, Tipp-Vorlauf verworfen) statt fgets; plat_echo entfällt (F67)
  73. F67: rdp ccef23ed abgenommen
  74. cry: AES ohne S-Box-Tabelle (F58), Geheimnisse bei SIGTERM nullen, Grenzen zu TPM/SSD (F57)
  75. F49 cry-Teil grün, F57 P1 und F58 abgenommen (cry e0b54ab7, Kaltstart-Nachlauf, S-Box selbst geprüft)
  76. H9: RISC-V liest die Plattform aus dem Gerätebaum, wenn es kein ACPI gibt (mit dem Leser von H8); nb holt den DTB aus der UEFI-Konfigurationstabelle; check-boot prüft RISC-V mit acpi=off (92 ok, 0 FEHL)
  77. Hardware-Plan: H9 liest Gerätebaum, alle Werkzeuge für RISC-V
  78. nullos auf Android-Telefonen, Phase 1 (Recherche, Stufen, Risiken, was nur Max darf); Gerät noch offen
  79. Hardware-Plan: H10 ist das Telefon-Paket
  80. Desktop-Entwurf: Vorgaben der Telefon-Session für das Profil android (§8)
  81. Antwort Hardware-Koordination (H10 bei Telefon), EL1-Weg gelesen
  82. Kapitel 8 Telefon (ORANGE, EDL, MediaTek BROM, UART, USB-C-Debug-Zubehör, fastboot, ChoiceJacking) + Session-Regel
  83. Desktop-Entwurf: Antwort des Kernels zu §7.1 (EIN_SPERRE bei H2, Schutzklassen erst mit Plattenverschlüsselung)
  84. Absprache Desktop (Profil android, Tastencodes an H2)
  85. F61: Stand Desktop/Kernel – EIN_SPERRE + USB-Abweisen über H2, Sperre verwirft noch keine Schlüssel
  86. Desktop-Entwurf: Telefon-Nachtrag (Tasten, Auflösungen, gebrochener Maßstab offen)
  87. USB-Konsole auch ohne Root ohne Passwort, Test-Abbild nie im Release (Security)
  88. Desktop-Entwurf: Geräte-Freigabe über /dev/usb (H2), offene Punkte
  89. F59: Regeln für USB-Freigabe durch ds (Bestätigung, Code, nur HID-Schnittstellen, nie in der Sperre)
  90. Desktop-Entwurf: Bedingungen von Security für die Geräte-Freigabe durch ds (F59)
  91. cry: Passwort über readpassphrase (F66), Passwortstärke (F63); libFuzzer-Ziele für part, lbl, lvm, ck, cry (F67)
  92. cry-README: Kern-Antwort zum Kaltstart-Schutz und ihre Grenzen eingetragen (F49, F51, F53)
  93. F66 cry, F57 Passphrase-Stärke, F67 Fuzz-Ziele Plattenwerkzeuge abgenommen (2de703ec)
  94. Telefontasten mit H2 festgelegt
  95. Desktop-Entwurf: Telefontasten (Power, Stumm, Lauter, Leiser) festgelegt
  96. Fuzz (F67, zweite Runde): libFuzzer-Ziele für bl, dbf, rcv, dfr, rsz; Fuzz-Tests für dfr und rsz
  97. max_len je Ziel („fuzz: max_len=N“ im Ziel, für btr); F67 Runde 2 Plattenwerkzeuge abgenommen
  98. F67: bo und ej ohne libFuzzer-Ziel begründet (lesen keine Datenträger-Strukturen selbst: bo nur Dateien über den Kern, ej nur /Volumes und diskutil, auf nullos Platzhalter)
  99. Werkzeug dd (C): Größenangaben ohne Überlauf und Vorzeichen (F67), Test; kein Fuzz-Ziel nötig (zerlegt keine Gerätedaten)
  100. F67: bo und ej als Fehlalarm abgenommen (4380e114)
  101. Werkzeug lop: libFuzzer-Ziel lop_kopf (F67), Saat MBR/GPT
  102. F67: libFuzzer-Ziele dsk_abbild und brn_iso (Saat, je ~190000 Läufe ohne Fund)
  103. F67: lop d737e035 abgenommen
  104. Fuzz (F67): libFuzzer-Ziel btr_baum (btrfs bis 1,5 MiB, Saat = Testabbild), 120 s ohne Fund
  105. F67: btr 28ab3453 abgenommen (max_len je Ziel greift)
  106. Abgleich Runde 17: 301 fertig (Mac), 102 teilweise, 0 fehlerhaft, 1 ausgelassen, 5 offen; make check ok; RE 402 sauber; Physisch 48 Hinweise (38 Geräteparser ohne Fuzz-Ziel, 8 stdin ohne Echo, 2 memset)
  107. Cold Boot und S25: Speicher nullen beim Freigeben, RAM löschen bei Aus/Neustart/Panik, tty nullt Eingabe (F49/F51/F66)
  108. cry-README: Kern-Teil (Seiten nullen, RAM beim Aus/Neustart, tty-Puffer) auf main seit f66bbb18 vermerkt
  109. tty: Hilfsfunktion heißt term_eingabe_weg – Namenskonflikt mit eingabe_weg (K2) brach den Kernbau nach f66bbb18
  110. libc: TCSAFLUSH und tcflush über TTY_FLUSH (Kernel f66bbb18, F66); Rückfall für ältere Kerne bleibt; tcflush am Mac über TIOCFLUSH
  111. F49: mit Kern f66bbb18 alle Abbilder ohne Schlüssel/Passwort; Abnahme nach Baufix (eingabe_weg-Konflikt)
  112. F49 abgenommen (rc 0 auf 388f58de), F51/F53 Kern-Teil; Berichtigung zu 927d3d1c
  113. USB-Freigabe gegen BadUSB/Rubber Ducky/ChoiceJacking: neue Geräte nach dem Start ohne Treiber bis zur Freigabe, /dev/usb (Liste, freigeben, ablehnen, Sperre, Regel), usbfrei mit Zufallszahl, EIN_GERAET_WARTET
  114. H15/F59: USB-Geräte-Freigabe im Kern – beim Start nur die erste reine Tastatur frei, alles andere wartet ohne Treiber; eine Sperre für USB_SPERRE und EIN_SPERRE (lösen nur Vermittler); ds gibt bei Verbundgeräten nur HID frei; Gerätebaum in der Startmeldung; aufgestaute Tasten verworfen; /dev/usb 180,0
  115. Desktop-Entwurf: USB-Freigabe und Sperre auf main (H2), Berichtigung EIN_SPERRE
  116. F59: USB-Freigabe im Kern abgenommen (usb-test 43/43, Fuzz usb_geraet), ds-Teil offen
  117. F61: Kern-Teil der Sperre (USB abweisen) abgenommen, Rest offen
  118. Hardware-Plan: H15 USB-Geräte-Freigabe fertig (F59 abgenommen)
  119. Desktop: Freigabe-Dialog für wartende USB-Eingabegeräte (Security F59): echte Eingabe, nicht in der Sperre, Code auf dem neuen Gerät, nur HID
  120. F68–F72: Schlüssel in CPU-Registern/On-Chip-Speicher (TRESOR-HUNT, Zenbleed, LazyFP, Volt Boot, SRAM-Remanenz) + Kapitel 9
  121. Volt Boot (F71) in die Risiken
  122. Doku: Hardware-Stand 30.10. (ARM64, RISC-V, Pi 4, Ton, Eingabe, Netzkarten, ACPI, USB-Freigabe), Sicherheit (Kaltstart-Schutz, S25, physische Angriffe), Chronik
  123. Doku: neu erzeugt
  124. hw: Grund vermerkt, warum hw usb unter nullos nicht /dev/usb nimmt (Recht geräte usb erlaubt Freigeben, F59); Wunsch an den Kernel
  125. F59: ds-Freigabedialog 51916e6e geprüft, zwei Lücken (Versuchsgrenze, Klick-Verzögerung)
  126. Desktop-Freigabe: nach 3 falschen Codes ablehnen, 1-s-Sperre auch für den Klick (Security F59)
  127. F59: ds-Lücken (a)/(b) behoben fc0437a2
  128. Release: check-release meldet FEHL, wenn nb beim Start „NICHT das gebaute“ warnt (Sollwerte nach dem Umpacken)
  129. AES-GCM 2,5× schneller in fester Zeit – S-Box in Bitscheiben über 64 Byte (tl_aes_sub64, vier Zählerblöcke je Durchgang mit tl_aes_encrypt4), 26 statt 11 MB/s; pruef vergleicht vier Blöcke mit dem Einzelblock (Apple clang 21 -O2 rechnete eine frühere Schleifenform falsch)
  130. F40: Bitscheiben-AES-GCM 9d2f98c1 geprüft (Code, 3000 Fälle gegen OpenSSL, 0 Abweichungen)
  131. Release: nb je Abbild mit eigenen Sollwerten (make nb-soll, sobald es das Ziel gibt), check-release wertet jede Abweichung der Startprüfung als FEHL
  132. H10: mkboot – Android-Boot-Abbild Fassung 0–4 und vendor_boot 3–4 bauen und prüfen, mit Mac-Test (99 Prüfungen, Fuzz mit ASan/UBSan)
  133. mkboot Byte für Byte gleich mit AOSP-mkbootimg (Fassung 0–4, vendor_boot 3–4)
  134. Testgerät Huawei Mate 10 Lite (Kirin 659); Huawei vergibt keine Entsperr-Codes mehr
  135. H12: Desktop-Wünsche 2–5 – Auflösung je Achse und Klickpad in der Geräteliste (96 Byte, EIN_GERAETE neu 0x4505), EIN_WIEDERHOLUNG, EIN_LEDS (nur Vermittler/Admin), Gerätezahl als Rückgabe; USB-Geräte in SYS_DEVICES; Tastenstau robuster
  136. H13/F50: IOMMU mit Intel VT-d – jedes Busmaster-Gerät sieht nur seine DMA-Seiten
  137. Desktop-Entwurf: H12-Wünsche 2–5 auf main (H2 b7c945cd)
  138. hw: USB-Baum auch unter nullos – aus der Geräteliste (SYS_DEVICES), ohne Geräterecht; kennt „qemu:“
  139. Abgleich Runde 18: 301 fertig (Mac), 102 teilweise, 0 fehlerhaft, 1 ausgelassen, 5 offen; RE 402 sauber; Physisch 34 Hinweise; alte Historie nur noch 1 Worktree
  140. Telefon-Teil pausiert (Max), Stand und nächster Schritt
  141. H14: CPU-Fehler erkennen, melden, abschwächen – F54/S28
  142. Hardware-Plan: H13 VT-d und H14 CPU-Schutz teilweise
  143. libc: nullos_cpuschutz (SYS_CPUSCHUTZ 88, H14) in; Test in eigen (Länge, Kürzen mit Null; Mac ENOSYS)
  144. Desktop bootet: /dev/bild0 (K1), ds auf nullos, Autostart nach dem Booten
  145. F50 VT-d teilweise abgenommen (make check 114/0), F54 x86 abgenommen, F69 Modelllücke, neu F73 PMU unter hvf
  146. Desktop: Mauszeiger sprang (absolute Lage wurde je Paket auf 0 gesetzt, Treiber meldet nur geänderte Achsen); mit Sperre beim Übernehmen
  147. §12: Tasten und Bildschirm beim Desktop (Konsole blind, Strg+Alt+F1)
  148. Version 0.3.1: NK_VERSION auf 0.3.1 (Release „bootet in den Desktop“)
  149. Release: Werkzeuge aus gegen den Entwicklerbau prüfen (ds aus desktop/ kommt aus dem Entwicklerbau, gestrippt), Test-Abbild ohne Desktop-Merkdatei (Tests an der Konsole)
  150. Release: mkrelease brach still ab (set -e: Schleife in $(…) endete mit falschem Test) – || true
  151. Desktop: keine Quelldateinamen im Abbild (Funde re-check für 0.3.1), RELEASE=1 setzt NULLOS_RELEASE
  152. Release: nur Testprogramme aus dem Release-Abbild nehmen (*test, hello, hello-pie, fnv, merk), usbfrei aus bleibt (Freigabe an der Konsole)
  153. Anwenderdoku: neues Kapitel Virtualisierung (Zwischenstand) – Anforderungen, Umwandeln mit qemu-img (vmdk/vdi/vhdx), in QEMU nachgestellte Hardware (AHCI, NVMe, CD, e1000/e1000e/virtio-net gehen, vmxnet3/pcnet/rtl8139 nicht, PS/2 und USB-Tastatur), alles mit dem 0.3-Abbild geprüft
  154. Anwenderdoku Virtualisierung: UTM 5.0.8 (Emulate, x86_64) getestet – ISO als CD, .img an IDE/AHCI und NVMe, e1000 und virtio-net mit DHCP und Ping; VirtualBox, VMware, Hyper-V, Parallels nur laut Herstellerdoku mit Quellen; x86_64 auf Apple-Chip
  155. Anwenderdoku Virtualisierung: Marke „getestet in UTM“ in der Legende
  156. Startprüfung gegen physische Angriffe (F50/F56/F71), nb misst Kernel und init.img, Makefile mit Header-Abhängigkeiten
  157. F74: Sperre mit Strg+Alt+F1 umgehbar (Root-Konsole ohne Anmeldung) – Blocker für 0.3.1
  158. F74: bei gesperrtem Bildschirm keine Tasten an die Konsole und kein Strg+Alt+F1 (sonst Root-Shell ohne Anmeldung)
  159. Release: signiert Release-Ordner (SHA256 im BSD-Format, SHA256.sig mit sgn/Ed25519, nullos-release.pub), check-release prüft die Signatur
  160. öffentlicher Schlüssel für die Release-Signatur (signify-Format, Ed25519; ab 0.3.1,)
  161. H11: Formatwechsel über geraet geprüft, HDA-Datenende berichtigt
  162. F74 nachgezogen: bild_zurueck wirkt bei Sperre nicht, Bildschirm zeichnet bei Sperre nichts (auch wenn ds stirbt; Panik ausgenommen)
  163. F56 Startwarnungen/Messung abgenommen, F50/F71 Teile, check-boot Cold-Boot-Wächter wackelt (kaltstart rc 0)
  164. Abgleich Runde 19: 301 fertig (Mac), 102 teilweise, 0 fehlerhaft, 1 ausgelassen, 5 offen; make check ok (115 ok, sauberer Kernbau nach ab4fa9bb); RE 402 sauber; Physisch 34 Hinweise
  165. H14: Zenbleed-Schutz auch für Zen-2-Modelle 0x40–0x4f und 0x90–0x91 (F54, Wunsch Security aa462aa7)
  166. si (nullos): Laufwerke über mounts/statfs, in QEMU geprüft
  167. F74 abgenommen (eigene QEMU-Probe), Klick-Entsperren als ehrlicher Hinweis
  168. H8: weitere CPUs auf dem Pi über die spin-table (raspi4b: 4 CPUs, ptest ok)
  169. Hardware-Plan: H8 mit 4 CPUs, H16 Vorstufe ESP32-C5 (RV32 ohne MMU)
  170. pwp: Passwortprüfer für Programme ohne shadow-Zugriff (stdin, Sperrzeit im Zähler je Benutzer, eigener Ausweis)
  171. nur die eigene QEMU beenden, nie pkill per Muster (traf make check anderer Sessions)
  172. RE-Endabnahme 0.3.1 sauber (Prüfsummen, Signatur, re-check, Handprüfung); F69 Modelllücke zu
  173. Desktop: Sperrbild mit Passwortfeld (Punkte, Rück, Esc, Meldung), Prüfung über Plattform-Haken passwort_pruefen
  174. RE 0.3.1: veröffentlichte GitHub-Dateien gleich den abgenommenen
  175. pwp -p: fragt nur, ob der Benutzer ein brauchbares Passwort hat (für das Sperrbild des Desktops)
  176. Wünsche von fz (PSK-Wiederaufnahme, ALPN-Abfrage) im README
  177. F75: pwp prüft Passwörter für jeden Aufrufer (Orakel), Zähler umgehbar
  178. Cold-Boot-Test ohne Wettlauf (QMP, „off“ erst nach dem Vorher-Abbild), BIOS-Schreibschutz wie chipsec
  179. Desktop: weitere Programme als eigene Dateien (struct app_art,), Haken zeit/sperre/ende, Zwischenablage mit Frist
  180. F75: auch psw -c/-S ohne Berechtigungsprüfung; F66 su/lgn/krb gelesen
  181. pwp F75: nur eigenes Konto (Verwalter alle), Sperrdatei gegen parallele Aufrufe, Fehlversuch vor der Prüfung gezählt, read() statt stdio, ub_check löscht Salz und Hashes (alle)
  182. psw F75: -S und -c nur fuer das eigene Konto (Verwalter alle), Passwort per read(); Test mit STRICT
  183. Desktop: Passwort am Sperrbild über pwp (Schalter PWP=1, an nach F75), Merkmal kein Passwort, /var/lib/pwp im Abbild
  184. pwp: Ausweis darf auch /var/lib/pwp lesen (Zaehler, Sperrdatei)
  185. Desktop: Passwort am Sperrbild im Standardbau an (F75 in pwp behoben); PWP=0 baut ohne
  186. cpu: Schutz-Zeilen aus cpuschutz (88, Fassung 12, H14) – Ergebnis der CPU-Prüfung je Teil eine Zeile wie lscpu „Vulnerabilities“; Mac ohne (macOS nennt das nicht). In QEMU geprüft, make check grün
  187. Anwenderdoku auf Englisch: (9 Seiten, Quellen), Sprachlink Deutsch ↔ English im Kopf jeder Seite; Steuerzeilen @sprache/@css/@andere in seiten.txt, {coming soon}, Test dafür
  188. Anwenderdoku englisch: QEMU/SSH-Kasten „Status:“ statt doppeltem Datum
  189. F49 Wächter, F56 BIOS-WP wie chipsec abgenommen (30d223bc, make check 134/0)
  190. F75 abgenommen (pwp/psw), neu F76 Tresor-Helfer kr -F glaubt Flitz die URL
  191. Doku auf Englisch: mit allen 17 Seiten (Texte in, Liste seiten-en.txt), Sprachlink Deutsch ↔ English im Kopf jeder Seite; Werkzeugkarten vorerst deutsch. Dazu: Satz in mitmachen berichtigt, Chronik-Reihenfolge 00:07