Skip to content

[V0.8.2.5] WP-S3: Hygiene-Bundle — runInShell-Flip, Disk-Analyzer-Launches, Depth-Klemme (#42/#50/#46) #56

Closed

Description

@Toqsick

Issues: #42 + #50 + #46 · Verdicts: #42 rejected (Prämisse empirisch widerlegt), #50 contested/entkräftet, #46 partial (Typ-Cast blockiert Injection) · Severity: Low (Härtung + Korrektheit + Fragilität) · Fix-Plan: security-fixplan-42-50.md → WP-S3, Release V0.8.2.5. Empfohlen nach WP-B2 (beide fassen runInShell-Stellen an — Merge-Konflikt vermeiden).

Befunde:

Fix:

  1. runInShell: false an den drei Disk-Analyzer-Launches (:2752/:2755/:2770) nach dem etablierten Muster (:59/:62/:1478/:1501); Nebenbefund: :2752 feuert unconditionally vor dem Install-Check — mit reparieren.
  2. Default-Flip runInShell = false in runCommandWithCustomArguments (:106) und runProcess (:128) — vorher alle String-Form-Call-Sites prüfen (Multi-Word-Konstanten wie cinnamon-settings user funktionieren, da runCommand bereits Dart-seitig splittet); Kommentar :1496-1499 korrigieren.
  3. Depth-Klemme: int.tryParse(getValueUnsafe(...).toString()).clamp(1, 10) an linux.dart:936 + Unit-Test mit malicious Config-Wert ("'; touch /tmp/pwned).
  4. Tests: Icon-/Analyzer-Lookups mit Apostroph-/Space-Pfaden bleiben funktional (hermetisch).

Gates: globales CI-Gate-Set; manuell: Browser-Launch, Disk-Analyzer, Bookmark-Scan verhalten sich wie vorher (kein Verhaltenstrend nach dem Flip).

Commits: „refactor(shell): default runInShell off in the command layer", „fix(hygiene): clamp folder_recursion_depth and pin analyzer launches".

Activity

  1. Toqsick commented on Oct 29, 2026

    @Toqsick
    OwnerAuthor

    Behoben — WP-S3 ist vollstaendig in main

    Stand: main @ d9321ef (PR #159, „WP-S3 + V0.8.6 Welle 1 (Q1, Q2, Q3, Q5, Q6) — zusammengefuehrt")
    Ursprungsbranch: feature/56-wp-s3-hygiene
    Nachweis: docs/handoff/v0.8.2-wp-s3-security-hygiene.md

    Alle vier Fix-Punkte aus dem Plan sind umgesetzt und in main.

    1) Default-Flip der Kommandoebene

    Datei Änderung
    lib/services/linux.dart:114 runCommandWithCustomArguments: Default runInShell von true auf false
    lib/services/linux.dart:140 runProcess: Default runInShell von true auf false

    Der Flip betrifft jeden Prozessstart der App. Vorher geprueft und protokolliert: kein Aufruf uebergibt ein Mehrwort-Kommando als exec-String (runCommand(String) splittet bereits Dart-seitig und reicht eine Liste weiter), und alle Aufrufstellen mit variablem exec fuehren Einzelwoerter (action_handler.dart:63, linux.dart:87, linux.dart:2674/2677, linux.dart:3030). Keine Stelle musste auf runInShell: true festgenagelt werden.

    2) Der falsche Kommentar ist korrigiert

    lib/services/linux.dart:98-107 und lib/services/linux.dart:1524-1536.

    Der alte Kommentar behauptete, mit runInShell werde „argv space-joined unquoted", ein HOME wie /home/john doe werde abgeschnitten, und ein Shell-Metazeichen wuerde laufen. Das ist falsch. Dart quotet jedes argv-Element einzeln, wenn es den sh -c-String baut (_getShellArguments() in sdk/lib/_internal/vm/bin/process_patch.dart). Empirisch gemessen am 2026-10-23 mit einer Sonde, die die Argumentanzahl zaehlt:

    Payload argv-Elemente Ergebnis
    a b c 1 bleibt ein Argument
    x'; echo INJECTED > /tmp/pwned42; #' 1 inert, kein Artefakt erzeugt
    $(id) / `id` / * / a|b 1 inert

    Der neue Kommentar sagt genau das — und ein Test („Dart haelt das Argument auch dann zusammen, wenn es eine Shell baut") sichert die Aussage im Code ab, damit sie nicht wieder zur Behauptung wird.

    3) Depth-Klemme (#46)

    lib/services/folder_recursion_depth.dart (neu) + lib/services/linux.dart:940-943, Aufrufstelle lib/services/linux.dart:964. Klemmung auf 1..10, Fallback 3, ueber BigInt (kein Ueberlauf). Details im Kommentar zu #46.

    4) Disk-Analyzer (#50)

    lib/services/linux.dart:2791-2810 — Installationspruefung zuerst (awaited), Start genau einmal, runInShell: false, context.mounted-Check nach dem Await. lib/layouts/disk_cleaner/clean_disk.dart:61 in unawaited(...) gewrappt. Details im Kommentar zu #50.

    Tests

    test/wp_s3_hygiene_test.dart — 15 Tests in vier Gruppen:

    Gruppe Testfaelle
    Der Default der Kommandoebene ist: keine Shell runCommandWithCustomArguments ohne Shell · runProcess reicht false durch · runCommand (String-Form) ohne Shell
    Ein Pfad mit Leerzeichen bleibt ein Argument Pfad kommt als ein argv-Element an · Dart haelt das Argument auch mit Shell zusammen · Shell-Metazeichen bleiben inert
    Die Rekursionstiefe ist geklemmt zu klein → 1 · zu gross → 10 · plausibel → unverändert · Textwert → Fallback · fehlender Config-Wert → Default · Textzahl wird angenommen · Nicht-Zahlen werden verworfen
    Der Disk-Analyzer startet nach der Installationspruefung Start erfolgt erst nach der Pruefung · kein Start, wenn das Programm fehlt

    Gates auf main

    Alle elf CI-Gates gruen: tool/check-versions.sh OK · dart format 133 Dateien, 0 geaendert · flutter analyze 0 Findings · flutter test 297 Tests · Python-Root-Runner 62 Tests · GTK-Token-Gate 96 Tests · packages/la_core 0 Findings, 25 Dateien, 68 Tests.

    Unveraendert geblieben

    Die polkit-Trinitaet ist in diesem Commit nicht angefasst: org.linux-assistant.operations.policy, die _privilegedEntryPoints-Liste in lib/services/linux.dart und der build-deb.sh-chmod sind unveraendert. Kein Versions-Bump, kein Tag, kein Release.

    Offen (bewusst, nicht Teil dieses Fixes)

    Der manuelle Abnahmeschritt — die GUI-basierten Nachweise — braucht ein echtes Desktop-System und ist in #51 als eigener Vorgang gefuehrt.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions