Sicherheits-Audit — Juli 2026 — Runde 10
Code-Security-Review
NetMon Roots v1.1.20
Zehntes automatisiertes Security-Review auf Basis von
Claude Fable 5. Schwerpunkt dieser Runde war die
größte Neuerung seit dem 1.1.19-Release: die neue
Security-Baseline-Apply-Stufe samt
Sysctl-Härtung und dem
Baseline-Transferpaket (Export/Import zwischen
Rechnern), dazu die locale-unabhängige UFW-Auswertung, das neue
Daten-Backup und die native Rechte-Prüfung. Diese Runde brachte
zwei belastbare Schwachstellen hohen Schweregrads
— eine Sysctl-Direktiven-Injektion über ein
importiertes Transferpaket (Weg zu Root-Rechteausweitung) und —
erstmals empirisch statt nur statisch entdeckt — eine
Testsuite, die den Host real neu startete, weil zwei
Tests ein echtes systemctl reboot ausführten.
Beide wurden umgesetzt, mit Regressionstests abgesichert und
verifiziert.
Umfang & Methodik
Geprüft wurde der komplette Code-Diff seit dem
Runde-9-Auditstand — rund 15.300 neue Zeilen,
größtenteils die neue Security-Baseline-/Lynis-Funktionalität
(security_audit_controller.py, +6098 Zeilen), die
locale-unabhängige UFW-Auswertung
(core/command.py, firewall_controller.py),
das neue Daten-Backup und der „Spielmodus“ in
app.py, sowie die neuen, rein lesenden System-Checks
(Home-Verzeichnisrechte, kritische Dateirechte, Secure Boot,
APT-Sicherheitsupdates). Zusätzlich im Fokus: die privilegierten
Senken (sudo -n, pkexec, der
root-netmon_network_service) und die
Test-/Entwicklungsinfrastruktur. Die Runde-9-Härtungen wurden auf
Regressionen gegengeprüft.
Phase 1 — Diff-Recon
Vollständige, datei-weise Sichtung des Branch-Diffs seit dem
Runde-9-Stand. Versionskonsistenz-Abgleich (App = deb =
Changelog = 1.1.20). Suche nach neuen
Datenflüssen von Fremdeingaben zu privilegierten Senken.
Phase 2 — Kandidaten-Analyse
Ein Analyse-Sub-Agent verfolgte importierte/geparste Daten
(Transferpakete, System-Kommando-Output) bis zu
sudo/pkexec-Aufrufen und
Datei-Schreibpfaden. Drei Kandidaten identifiziert — einer
belastbar, zwei als Defense-in-Depth.
Phase 3 — False-Positive-Validierung
Der belastbare Kandidat wurde von einem eigenen Validierungs-Sub-Agenten mit lauffähigem Repro gegengeprüft: Konfidenz 9/10, HIGH. Ein Detail-Überclaim (angreiferkontrollierter Schreibpfad) wurde dabei widerlegt — für die Ausnutzbarkeit irrelevant.
Phase 4 — Härtung & Regressionscheck
Beide HIGH-Findings wurden umgesetzt und mit 15 neuen Regressionstests abgesichert. Gesamtsuite erneut ausgeführt: 2133 bestanden (nur drei bekannte, umgebungsbedingte Fehler ohne Sicherheitsbezug).
Bestätigte Findings (Runde 10)
Zwei Findings hohen Schweregrads wurden bestätigt und direkt behoben. Keine kritischen, keine remote-auslösbaren Befunde — beide setzen entweder eine bewusste Nutzeraktion (Import einer Fremddatei) oder die Entwicklungs-/CI-Umgebung voraus.
F1 — Sysctl-Direktiven-Injektion über importiertes Baseline-Transferpaket
Hoch · 9/10 BehobenDatei:
netmon/features/security_audit_controller.py —
_sanitize_transfer_sysctl_entries(),
_build_sysctl_dropin_content(),
apply_security_baseline_sysctl(),
import_security_baseline_transfer().
Das neue Baseline-Transferpaket (eine JSON-Datei, die zum Austausch
gehärteter Profile zwischen Rechnern gedacht ist und per Dateidialog
importiert wird) durchlief eine Sanitisierung, die nur auf
nicht-leer prüfte — ohne Zeichen- oder
Whitelist-Validierung der Felder id/
key/expected. Die Werte wurden anschließend
als „key = value“ in eine dedizierte Datei
unter /etc/sysctl.d/ geschrieben und per
sudo -n sysctl --system als root geladen.
Anders als die parallele UFW-Validierung (die ungültige Regeln
per ValueError ablehnt) filterte der Sysctl-Pfad nichts.
Bedrohung: Eine präparierte Datei mit
id = sysctl.kernel.core_pattern und
expected = |/tmp/evil.sh erzeugte die Zeile
kernel.core_pattern = |/tmp/evil.sh — der
Kernel führt danach bei jedem Prozess-Crash das angegebene
Programm als root aus (klassische
Rechteausweitung). Zudem überlebten eingebettete Zeilenumbrüche
das .strip(), sodass ein einziges Feld mehrere
Direktiven einschleusen und die Kernel-Härtung still
herabsetzen konnte (etwa kernel.kptr_restrict = 0),
während die UI „Härtung angewendet“ meldete.
Kein Remote-/Zero-Click-Angriff (Import + Bestätigung +
sudo-Session nötig), aber ein realistischer
Social-Engineering-Pfad, da Transferpakete explizit zum Teilen
gedacht sind.
docs/security/KERNEL_SYSCTL.md) plus ein strenges
Schlüssel- und Wertformat geprüft (keine Zeilenumbrüche,
Pipes oder Shell-Metazeichen); ungültige Pakete werden per
ValueError abgelehnt. Die Drop-in-id wird nur
noch aus dem validierten Schlüssel abgeleitet, nie aus dem freien
id-Feld. Eine zweite Verteidigungslinie in
_build_sysctl_dropin_content() verwirft unerlaubte
Einträge auch direkt an der Schreibsenke. Mit acht neuen
Regressionstests abgesichert.
F2 — Testsuite führte echtes systemctl reboot aus (Host-Neustart)
Hoch · empirisch
Behoben
Dateien:
tests/test_netmon_diagnostics.py
(run_system_action_async-Tests),
netmon/app.py
(_system_action_commands / Job-Thread).
Zwei Tests für die neuen Systemaktionen (Reboot/Shutdown/Logout)
prüften die Bestätigungsphrase, stubbten aber den
Kommando-Generator so, dass er das echte
["systemctl", "reboot"] zurückgab — ohne
run_cmd bzw. den ausführenden Job-Thread zu mocken.
Da ein aktiver Desktop-Nutzer über polkit ohne Passwort neu
starten darf, führte jeder Lauf der Testsuite auf einem
Desktop-System zu einem tatsächlichen Neustart des
Rechners. Dieses Finding wurde nicht statisch, sondern
empirisch entdeckt: Der Audit-Host startete beim
Testlauf reproduzierbar neu, die Boot-Zeitstempel deckten sich exakt
mit den Testläufen.
Einordnung: Betrifft die Test-/Entwicklungs- und
CI-Infrastruktur, nicht den ausgelieferten Anwendungscode —
der Release-Pfad selbst ist durch Bestätigungsdialog,
Sicherungsphrase (AUSFUEHREN) und
Strict-Protection abgesichert. Wirkung dennoch hoch: unerwarteter
Neustart mit Risiko für ungespeicherte Arbeit auf jedem
Rechner, der die Suite ausführt (Entwickler-/CI-Maschinen).
tests/conftest.py) destruktive Kommandos
(systemctl reboot/poweroff, shutdown,
loginctl terminate-* …) hart auf
subprocess-Ebene — auch hinter
sudo/pkexec-Wrappern —, sodass kein
Test je wieder ein echtes destruktives Systemkommando durchreichen
kann. Mit sieben neuen Regressionstests abgesichert.
Weitere Beobachtungen & Design-Entscheidungen
Latente Shell-Injektion über das command-Feld — mitbehoben
Der importierte Sysctl-Schlüssel floss auch in ein
„sysctl -n {key}“-Kommando-Template.
Aktuell nicht erreichbar (die Auswertung nutzt die statische
Baseline-Liste), aber ein späteres Refactoring hätte daraus
eine Kommando-Injektion machen können. Durch die neue strenge
Schlüssel-Validierung aus F1 automatisch mitentschärft.
Game-Mode-UFW-Ausnahmen — kein ausnutzbarer Befund
Der Port des „Spielmodus“ wird zwar nicht per Regex
vorgeprüft, geht aber als einzelnes argv-Token
an sudo -n ufw allow … (kein
Shell-Parsing; ufw lehnt Ungültiges ab); der
benutzerdefinierte Pfad validiert bereits streng
(isdigit(), 1–65535, Protokoll-Whitelist). Nur zur
Vollständigkeit notiert.
Kindersicherung — weiterhin bewusste Design-Entscheidung
Die PBKDF2-gestützte Kindersicherung im Secure-Browser bleibt wie in Runde 8 dokumentiert: Alltagshürde gegen Gelegenheitszugriff im selben Konto, keine harte Grenze gegen technisch versierte Nutzer mit Kontozugriff. Keine Codeänderung, unverändert gültig.
postinst-DNS & Nur-Hash-Schnellprüfung — Policy-Hinweise offen
Die beiden Policy-Hinweise aus Runde 9 bleiben bestehen: das
root-postinst biegt aktive NM-DNS bei der Installation
auf 8.8.8.8 (Opt-in empfohlen), und die
„Schnellprüfung“ auf der Downloadseite empfiehlt nur
sha256sum -c statt der
minisign-Vollprüfung. Kein ausnutzbarer Befund — als
Design-Entscheidungen des Projektverantwortlichen offen.
Umgesetzte Härtungsmaßnahmen (Runde 10)
Sysctl-Allowlist + Wert-Validierung für importierte Transferpakete — security_audit_controller.py
Neue Konstante SECURITY_BASELINE_ALLOWED_SYSCTL_KEYS
(zehn dokumentierte Schlüssel) plus Format-Regex für
Schlüssel und Werte. _sanitize_transfer_sysctl_entries()
lehnt jetzt unerlaubte Schlüssel und ungültige Werte per
ValueError ab und leitet die id nur aus dem
validierten Schlüssel ab;
_build_sysctl_dropin_content() filtert als zweite
Verteidigungslinie an der Schreibsenke.
Suiteweiter Guard gegen destruktive Systemkommandos — tests/conftest.py
Ein subprocess.Popen-Wrapper blockiert
systemctl reboot/poweroff/halt,
shutdown, reboot,
loginctl terminate-* u. a. — auch hinter
sudo/pkexec/env-Wrappern und
in Shell-String-Form. Kein Test kann je wieder ein echtes
destruktives Kommando bis zum System durchreichen.
15 neue Regressionstests
Acht Tests in test_netmon_lynis_output.py für die
Sysctl-Allowlist (Ablehnung von core_pattern, Pipe-/
Newline-Werten, id-Ableitung, End-to-End-Import-Refusal)
und sieben in test_destructive_command_guard.py für
den Kommando-Guard. Gesamtsuite: 2133 bestanden.
Geprüfte Sicherheitskategorien
| Kategorie | Geprüft | Ergebnis |
|---|---|---|
Direktiven-Injektion in privilegierte Konfig (/etc/sysctl.d/) |
Ja | F1 → behoben (Allowlist+Wert-Check) |
| Destruktive Kommandos in Test-/CI-Infrastruktur | Ja | F2 → behoben (Guard+entschärfte Tests) |
| Command-/Argument-Injection (ufw/nmcli/wg-quick, subprocess) | Ja | Durchgängig list-form; command-Feld mitbehoben |
| Locale-unabhängige UFW-/Lynis-Auswertung (Output-Parsing) | Ja | Kein Finding (reine Anzeige-Logik) |
| Native Rechte-Checks (Home/kritische Dateien, Symlink/TOCTOU) | Ja | Kein Finding (lstat, kein Follow, read-only) |
Root-Service (netmon_network_service, pkexec) |
Ja | Kein neuer Endpunkt, argv-validiert |
| Daten-Backup (Symlink-Escape, Rekursion, Pfadgrenzen) | Ja | Kein Finding (kein Follow, $HOME-Grenze) |
| Repository-Guard (Keyring-/URI-Parsing, Quick-Actions) | Ja | Kein Finding (shlex.quote, read-only) |
Unsichere Deserialisierung (pickle, yaml.load, eval, shell=True) |
Ja | Kein Finding |
| Autorisierung / Kindersicherung | Ja | Bewusste Design-Entscheidung |
| Regression der Runde-7/8/9-Härtungen | Ja | Alle intakt |
| Versionskonsistenz (App / deb / Changelog) | Ja | Durchgängig 1.1.20 |
Auditor: Claude Fable 5 (Anthropic) —
Analyse-Sub-Agent + dedizierter False-Positive-Validierungs-Sub-Agent (mit Repro)
Projektverantwortlicher: Sven Fröhlich
Datum: 19. Juli 2026
Analysierter Codestand:
Arbeitsstand v1.1.20 (Diff seit dem Runde-9-Stand
ac412cbc), einschließlich der neuen
Security-Baseline-/Sysctl-Apply-Stufe und des
Baseline-Transferpakets — Runde 10
Methode: Statische Code-Analyse + manuelle
Datenfluss-Verifikation des kompletten Branch-Diffs +
Konfidenz-gescorte FP-Validierung mit lauffähigem Repro +
Umsetzung von zwei Härtungen mit 15 Regressionstests +
Regressions-Gegenprüfung der Vorrunden-Härtungen (Gesamtsuite
2133 bestanden, drei bekannte umgebungsbedingte Fehler ohne
Sicherheitsbezug) — kein Laufzeit-Penetrationstest
Haftungsausschluss: Dieses Audit ersetzt keinen professionellen
Penetrationstest durch eine zertifizierte Sicherheitsfirma. Die Analyse
beschränkt sich auf den angegebenen Codestand. Nicht erfasst werden:
Laufzeitverhalten, abhängige Systembibliotheken,
Netzwerkkonfiguration und soziale Angriffsvektoren.