Betriebssysteme & Firmware-Images scannen

kunnus sbom os inventarisiert ein Betriebssystem-Dateisystem: die Maschine, vor der Sie stehen, oder ein read-only gemountetes Firmware-Image. Das ist der Modus für Industrie-PCs, IoT-Gateways und jedes Gerät, das mit einem OS ausgeliefert wird.

shell
# Die Maschine, vor der Sie stehen (Standard-Root: / unter Unix, C:\ unter Windows)
kunnus sbom os --output machine.cdx.json

# Ein gemountetes Firmware-Image oder extrahiertes Rootfs
kunnus sbom os /mnt/firmware --target-os linux --output firmware.cdx.json

Was inventarisiert wird

  • Linux: Die Distro-Familie wird per Fingerprint erkannt (Debian/Ubuntu, RHEL, SUSE, Alpine, Arch, Gentoo, Nix, Container-Optimized OS, chiselled Ubuntu) und ihre Paketdatenbank gelesen; Flatpak- und Snap-Pakete werden ebenfalls erfasst.
  • Windows: installierte Programme aus der Registry, plus Chocolatey- und winget-Bestand.
  • macOS: Homebrew, MacPorts und installierte .app-Bundles.
  • Nicht-paketierte Binaries: Ein Klassifikator findet Executables, die kein Paketmanager kennt — ein selbst kompiliertes memcached, ein vendortes python — mit Überlappungsunterdrückung, damit nichts doppelt erscheint, dem SHA-256 der Datei selbst als Komponenten-Hash und der kuratierten CPE, die der Klassifikator-Katalog für dieses Binary führt.
  • Der Linux-Kernel und seine ladbaren Module — auf Firmware-Roots, bei denen keine Distribution erkannt wird (siehe unten).
  • Auf dem Image installierte Sprachpakete (site-packages-Wheels, Gems, JARs, node_modules, Go-Binaries, …).

Chiselled Ubuntu (Distroless-Roots)

Canonicals chiselled-Ubuntu-Roots enthalten keine dpkg-Statusdatei — ihr Paketverzeichnis ist die zstd-komprimierte jsonwall unter var/lib/chisel/manifest.wall. kunnus erkennt diesen Pfad als eigene Distro-Familie, sodass ein chiselled Root seine OS-Pakete liefert statt gar nichts. Lizenzen bleiben offline auflösbar: Jeder _copyright-Slice bringt usr/share/doc/<pkg>/copyright mit, das der Debian-Copyright-Enricher liest. Das Manifest speist außerdem die Datei-Ownership-Auflösung, sodass die Überlappungsunterdrückung des Binary-Klassifikators hier genauso pfadbasiert funktioniert wie auf dpkg-, apk- und rpm-Systemen.

Linux-Kernel und Kernel-Module

Kernel-Images (boot/vmlinuz*) und ladbare Module (*.ko, Version aus dem ELF-Abschnitt .modinfo) haben eigene Extraktoren — mit zwei bewussten Einschränkungen. Sie sind Fallback-only: Sie laufen, wenn am Scan-Root keine Distribution erkannt wird — der Fall der extrahierten Firmware. Auf einer erkannten Distribution ergäbe ein vollständiger Host eine Komponente pro Modul, was nicht dem Charakter einer OS-SBOM entspricht; dort sind sie per --enable zuschaltbar. Und sie sind Host-only: Ein Container hat keinen eigenen Kernel, Container-Scans führen sie deshalb nie aus. Module tragen eine pkg:generic-purl und bewusst keine CPE — ein In-Tree-Modul hat keine NVD-Identität, eine synthetisierte CPE wäre ein erfundener Treffer. Das Kernel-Image selbst wird über seine linux_kernel-CPE identifiziert.

Fremdes Rootfs scannen: --target-os

Wenn das gescannte Dateisystem nicht das OS ist, auf dem Sie arbeiten — etwa ein Linux-Firmware-Image auf Ihrem Mac — sagt --target-os (linux | windows | mac) kunnus, womit es es zu tun hat.

Firmware-Image mounten

kunnus sbom os scannt einen Verzeichnisbaum; eine Image-Datei muss also zuerst gemountet oder extrahiert werden. Alle folgenden Wege sind read-only — kunnus schreibt nie in das Scan-Root.

Raw- oder Einzelpartitions-Image (.img, .ext4)
sudo mount -o ro,loop firmware.img /mnt/firmware
kunnus sbom os /mnt/firmware --target-os linux --output firmware.cdx.json
sudo umount /mnt/firmware
Komplettes Disk-Dump mit Partitionstabelle (eMMC/SD)
sudo losetup -f --show -P firmware.img   # gibt z. B. /dev/loop0 aus
lsblk /dev/loop0                          # Rootfs-Partition finden
sudo mount -o ro /dev/loop0p2 /mnt/firmware
kunnus sbom os /mnt/firmware --target-os linux -o firmware.cdx.json
SquashFS (OpenWrt, Appliance-Images)
unsquashfs -d rootfs rootfs.squashfs
kunnus sbom os ./rootfs --target-os linux

Hersteller-Update-Pakete (.swu, .raucb, zip-/tar-Container) umhüllen meist eines der obigen Formate — erst den Container entpacken, dann das Dateisystem darin mounten oder extrahieren. Bei unbekanntem Format findet und extrahiert binwalk -e eingebettete Dateisysteme. Unter macOS oder Windows gibt es kein Loop-Mount für Linux-Dateisysteme: stattdessen extrahieren (7z, unsquashfs, binwalk) und --target-os linux setzen.

Das Rootfs scannen, nicht die Boot-Partition — die Paketdatenbank (var/lib/dpkg, lib/apk/db, …) treibt die OS-Paket-Erkennung. Verteilt das Gerät das OS über mehrere Partitionen (A/B-Schemata, separates /usr), den vollen Satz mounten oder einzeln scannen und downstream zusammenführen.