NETMON ROOTS MONITOR. CONTROL. UNDERSTAND. BACK TO THE ROOTS.
DE

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.

← Runde 9 (2 mittlere Findings — Update-URL & Killswitch)
PDF herunterladen Findings Härtungen Kategorien
✓

0 kritische — 2 hohe — 0 mittlere Findings (beide umgesetzt & verifiziert)

Das Review des 1.1.20-Stands identifizierte zwei belastbare Schwachstellen hohen Schweregrads. F1: Das neue Baseline-Transferpaket reichte importierte id-/expected-Felder ohne Zeichen- oder Whitelist-Prüfung bis in eine /etc/sysctl.d/-Datei durch, die als root per sysctl --system geladen wird — eine präparierte Datei konnte so z. B. kernel.core_pattern = |/pfad/skript setzen (Root-Code-Execution beim nächsten Crash) oder Kernel-Härtung still zurückdrehen. Ein dedizierter Validierungs-Sub-Agent bestätigte das mit Konfidenz 9/10 samt lauffähigem Repro. F2: Zwei Tests ließen einen Kommando-Generator das echte systemctl reboot zurückgeben, ohne den Ausführungspfad zu mocken — da ein aktiver Desktop-Nutzer über polkit ohne Passwort neu starten darf, startete jeder Testlauf den Host tatsächlich neu. Beide wurden behoben (strikte Sysctl-Allowlist + Wert-Validierung; entschärfte Tests + ein suiteweiter Guard gegen destruktive Kommandos), mit neuen Regressionstests abgesichert und verifiziert. Alle Runde-7/8/9-Härtungen sind intakt; die Kindersicherung bleibt als bewusste Design-Entscheidung dokumentiert.

Datum
19. Juli 2026
Analysierte Version
v1.1.20
Kritische Findings
0
Hohe Findings
2 (beide behoben)
Mittlere Findings
0
Härtungen umgesetzt
2 + 15 Regressionstests
Testsuite
2133 bestanden
Analysewerkzeug
Claude Fable 5

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 Behoben

Datei: 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.

Härtung umgesetzt & verifiziert: Importierte Sysctl-Einträge werden jetzt gegen eine Allowlist der zehn dokumentierten Baseline-Schlüssel (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).

Härtung umgesetzt & verifiziert: Beide Tests brechen jetzt vor dem Job-Thread ab und verwenden nur inerte Stub-Kommandos. Zusätzlich blockiert ein suiteweiter Guard (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.

Zur Downloadseite   •   Aktuelles   •   Dokumentation   •   Runde 9