You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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.
Depth-Klemme: int.tryParse(getValueUnsafe(...).toString()).clamp(1, 10) an linux.dart:936 + Unit-Test mit malicious Config-Wert ("'; touch /tmp/pwned).
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".
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.
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.
Activity
Toqsick commentedon Oct 29, 2026
Behoben — WP-S3 ist vollstaendig in
mainStand:
main@d9321ef(PR #159, „WP-S3 + V0.8.6 Welle 1 (Q1, Q2, Q3, Q5, Q6) — zusammengefuehrt")Ursprungsbranch:
feature/56-wp-s3-hygieneNachweis:
docs/handoff/v0.8.2-wp-s3-security-hygiene.mdAlle vier Fix-Punkte aus dem Plan sind umgesetzt und in
main.1) Default-Flip der Kommandoebene
lib/services/linux.dart:114runCommandWithCustomArguments: DefaultrunInShellvontrueauffalselib/services/linux.dart:140runProcess: DefaultrunInShellvontrueauffalseDer 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 aufrunInShell: truefestgenagelt werden.2) Der falsche Kommentar ist korrigiert
lib/services/linux.dart:98-107undlib/services/linux.dart:1524-1536.Der alte Kommentar behauptete, mit
runInShellwerde „argv space-joined unquoted", ein HOME wie/home/john doewerde abgeschnitten, und ein Shell-Metazeichen wuerde laufen. Das ist falsch. Dart quotet jedes argv-Element einzeln, wenn es densh -c-String baut (_getShellArguments()insdk/lib/_internal/vm/bin/process_patch.dart). Empirisch gemessen am 2026-10-23 mit einer Sonde, die die Argumentanzahl zaehlt:a b cx'; echo INJECTED > /tmp/pwned42; #'$(id)/`id`/*/a|bDer 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, Aufrufstellelib/services/linux.dart:964. Klemmung auf 1..10, Fallback 3, ueberBigInt(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:61inunawaited(...)gewrappt. Details im Kommentar zu #50.Tests
test/wp_s3_hygiene_test.dart— 15 Tests in vier Gruppen:runCommandWithCustomArgumentsohne Shell ·runProcessreichtfalsedurch ·runCommand(String-Form) ohne ShellGates auf
mainAlle elf CI-Gates gruen:
tool/check-versions.shOK ·dart format133 Dateien, 0 geaendert ·flutter analyze0 Findings ·flutter test297 Tests · Python-Root-Runner 62 Tests · GTK-Token-Gate 96 Tests ·packages/la_core0 Findings, 25 Dateien, 68 Tests.Unveraendert geblieben
Die polkit-Trinitaet ist in diesem Commit nicht angefasst:
org.linux-assistant.operations.policy, die_privilegedEntryPoints-Liste inlib/services/linux.dartund derbuild-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.