Repository navigation
Closed
Labels
audit:security/injectiongate:testGate: automatisierte Tests müssen grün seinGate: automatisierte Tests müssen grün sein
Description
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:
- [MEDIUM] Linux command layer runs every command through a shell (runInShell defaults to true) — argument injection via file names and search keywords #42: runInShell-Defaults sind true (
linux.dart:106/:128), aber die Mechanik-Prämisse („argv space-joined unquoted → Metazeichen werden Shell-Code") ist empirisch widerlegt — kein Security-Bug. Real: String-Form-Call-Sites splitten Dart-seitig bei Leerzeichen (openWebbrowserWithSitelinux.dart:917-921,openWebbrowserSeach:911-914,cat $bookmarksLocation:957-975) — Korrektheits-Bug; Kommentar :1496-1499 ist selbst falsch. - [MEDIUM] Disk analyzer (k4dirstat/baobab) runs the df-derived mount point through a shell on 'Analyse Diskspace' #50: drei Disk-Analyzer-Launches (
linux.dart:2752/2755/2770, zweiter Einstiegdisk_space.dart:55) ohnerunInShell: false; Datenfluss df →linux_filesystem.dart:68group(6) → Mountpoint. Entkräftet als Injection, Fix bleibt Hygiene. - [LOW] folder_recursion_depth config value is interpolated unvalidated into a bash -c find script #46:
folder_recursion_depth(linux.dart:936) durchfinal int-Cast vor Injection blockiert (TypeError bei String-Werten → leere Ordnerliste), bleibt stille Fragilität.
Fix:
runInShell: falsean 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 = falseinrunCommandWithCustomArguments(:106) undrunProcess(:128) — vorher alle String-Form-Call-Sites prüfen (Multi-Word-Konstanten wiecinnamon-settings userfunktionieren, darunCommandbereits Dart-seitig splittet); Kommentar :1496-1499 korrigieren. - Depth-Klemme:
int.tryParse(getValueUnsafe(...).toString()).clamp(1, 10)anlinux.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".
Metadata
Metadata
Assignees
Labels
audit:security/injectiongate:testGate: automatisierte Tests müssen grün seinGate: automatisierte Tests müssen grün sein
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.