Symfony Process CVE-2026-24739: Wenn ein Gleichheitszeichen unter Git Bash das Laufwerk leert — was DACH-Teams in der Composer-Pipeline prüfen sollten
17. Mai 2026 (Update). Symfony hat den Patch für CVE-2026-24739 veröffentlicht: unter MSYS2 oder Git Bash auf Windows wird das Gleichheitszeichen in unquoted Argumenten nicht als „special" behandelt, sodass die MSYS2-Konversionsschicht den Argument-Pfad umrouten kann — im Worst Case landet ein rmdir oder del auf einer anderen Stelle als beabsichtigt. Fix in 5.4.51, 6.4.33, 7.3.11, 7.4.5 und 8.0.5; betroffen sind Entwickler-Maschinen und Windows-CI-Runner, nicht produktive Linux-Hosts. Strukturell sitzt der Bug in der laufenden Argument-Konsistenz-Reihe der Mai-Woche neben NGINX Rift, dem Composer-Token-Leak und dem node-ipc-Vorfall — die Plattform-Lehre heißt nicht „Symfony patchen", sondern „dynamisch konstruierte Pfade in externen Prozessen sind eine eigene Risiko-Klasse".

TL;DR — 90 Sekunden
Eine Lücke in symfony/process lässt unter MSYS2/Git Bash auf Windows Argumente mit = durch die Konversionsschicht umrouten. Der Bug ist nicht spektakulär — er sitzt aber im Standard-PHP-Stack der Sylius- und TYPO3-Welt, und seine Worst-Case-Wirkung ist Datei-Löschung auf einem unbeabsichtigten Pfad. Der Fix ist ein einfacher Composer-Update, die strukturelle Lehre ist eine andere.
| Frage | Antwort |
|---|---|
| Betroffen? | Alle PHP-Anwendungen, die symfony/process vor 5.4.51 / 6.4.33 / 7.3.11 / 7.4.5 / 8.0.5 nutzen — Composer-Scripts, Sylius-Shop-Builds, TYPO3-Site-Package-Builds, Symfony-Console-Commands — wenn die Ausführungs-Umgebung MSYS2-basiert ist (Git Bash, Cygwin-Derivate). Native Linux- und macOS-Hosts sind nicht betroffen. |
| Risiko? | Argument Injection / unintended file operation (CWE-78 / CWE-88); im Worst Case Löschung des Inhalts eines anderen Verzeichnisses oder Laufwerks als beabsichtigt, wenn ein zu löschender Pfad ein = enthält und das aufrufende Script rmdir/del über symfony/process startet. |
| Sofortmaßnahme? | Composer-Lock auf den Fix-Versionen ziehen (composer require symfony/process:^7.4.5 oder analog je Major), Windows-Build-Runner von Git Bash auf cmd.exe oder PowerShell umstellen, alle Composer-Scripts auf Argument-Konstruktionen mit = durchsuchen. |
| Empfehlung? | Mittelstand: Composer-Update im nächsten Maintenance-Sweep, Windows-CI-Runner-Inventur. Enterprise: zusätzlich Pipeline-Audit auf Symfony-Process-basierte Datei-Operationen, Hardening-Regel NO_MSYS2_SHELL_IN_CI in der Build-Standard-Vorlage. |
| Kritikalität? | Siehe Hero-Badge — medium. |
Was ist das Problem?
Symfony Process ist die Standard-Komponente im PHP-Universum für das Starten und Verwalten externer Prozesse. Composer nutzt sie in seinen Scripts, Sylius in seinen Build- und Deploy-Hooks, TYPO3 in seinen Console-Commands, Drupal in seinen Maintenance-Routinen, und jede produktive Symfony-Anwendung in einer dichten Schicht von Aufrufen quer durch den Stack. Sie liefert die Argument-Escape-Schicht zwischen PHP und der jeweiligen Host-Shell — auf Unix mit POSIX-Escape, auf Windows mit der CMD-Escape-Logik.
Genau in der Windows-Escape-Logik sitzt die Lücke. Symfony Process behandelt eine Reihe von Zeichen als „special" und quotet die entsprechenden Argumente. Das Zeichen = stand bisher nicht auf dieser Liste — auf nativer cmd.exe ist das auch unkritisch, weil CMD = nicht als Argument-Trenner kennt. Anders ist es unter MSYS2 und Git Bash: deren mintty- und bash-Konversionsschicht interpretiert ein = in einem unquoted Argument als Variablen-Zuweisung oder Pfad-Separator-Hinweis und kann das gesamte Argument umrouten.
Die Analyse von Symfony selbst zeigt das Beispiel präzise: wenn ein Composer-Script über symfony/process ein rmdir mit dem Pfad C:\projects\build=temp\artifacts aufruft, kann die MSYS2-Konversionsschicht dieses Argument so umformen, dass das tatsächlich gelöschte Verzeichnis ein anderes ist — bis hin zur Löschung des Inhalts eines übergeordneten Verzeichnisses oder des gesamten Laufwerks, je nach Argument-Layout des aufrufenden Scripts.
Der Bug ist klein und tief. Klein, weil die Reparatur eine Erweiterung der „special characters"-Liste um = und ein paar verwandte Zeichen ist — der Patch in symfony/symfony#63164 ist wenige Zeilen Code. Tief, weil er an einer Schicht sitzt, die die meisten PHP-Entwicklerinnen und -Entwickler als gelöst behandeln: Argument-Escape ist seit Jahren stabile Standard-Infrastruktur, und niemand prüft mehr aktiv, ob ein Composer-Script-Aufruf mit einem = im Pfad unter Git Bash dasselbe Verhalten zeigt wie unter cmd.exe. Snyk hat den Bug als Arbitrary Argument Injection klassifiziert — die Klasse stimmt, die operative Wirkung sitzt aber nicht im Argument allein, sondern im Zusammenspiel mit der MSYS2-Konversionsschicht.
Strukturell gehört CVE-2026-24739 in eine Klasse, die wir in den vergangenen Wochen mehrfach gesehen haben: stabile Stack-Bibliotheken, die an einer einzelnen Stelle eine Konsistenz-Annahme verletzen, die in der Standard-Umgebung hält und in einer Nebenumgebung bricht. Bei NGINX Rift (CVE-2026-42945, 13.05.) war es eine 18 Jahre alte Annahme über das Rewrite-Module-Verhalten. Bei node-ipc (16.05.) war es eine Annahme über die Stabilität einer Maintainer-Identität über Jahre. Bei Symfony Process ist es eine Annahme über die Universalität der CMD-Escape-Logik.
Wer ist betroffen?
Eine kompakte Übersicht über betroffene und nicht betroffene Konstellationen.
| Konstellation | Betroffen | Nicht betroffen / Bedingungen |
|---|---|---|
| PHP-Build auf Windows-CI-Runner unter Git Bash / MSYS2 | symfony/process vor 5.4.51 / 6.4.33 / 7.3.11 / 7.4.5 / 8.0.5; jedes Composer-Script oder Symfony-Console-Command, das Argumente mit = an externe File-Tools übergibt | Build-Pipelines auf nativen Linux- oder macOS-Runnern; Windows-Runner mit cmd.exe oder PowerShell als Shell; Anwendungen ohne Symfony-Process-Aufrufe in File-Operations |
| Sylius-Shop-Builds in DACH-Mittelstand-Setups | Wenn Build-Pipeline auf Windows-Runnern unter Git Bash läuft (selten, aber im Maker-Setup einzelner Agenturen vorkommend) | Standard-Sylius-Build auf Linux-Containern (Wolfi / Alpine / Debian) ist nicht betroffen |
| TYPO3-Site-Package-Builds und Composer-Update-Sweeps | Lokale Entwicklungs-Umgebungen unter Windows mit Git Bash, in denen Composer-Scripts File-Operations mit dynamischen Pfaden auslösen | Container-basierte Build-Umgebung (DDEV, Lando, ddev-podman) ist nicht betroffen — der Container läuft Linux |
| Symfony-Console-Anwendungen in Customer-Maintenance-Skripten | Wenn die Console-Command-Linie unter Windows + Git Bash läuft und über symfony/process File-Ops mit benutzerdefinierten Pfaden ausführt | Console-Commands auf Linux-Cron oder Windows-Task-Scheduler mit cmd.exe als Shell |
GitHub-Actions-Workflows mit shell: bash auf windows-latest-Runnern | shell: bash auf Windows-Runnern routet implizit über Git Bash (MSYS2) — direkt betroffen, wenn der Workflow PHP-Tooling startet | shell: cmd oder shell: pwsh auf demselben Runner-Image; oder Workflow auf ubuntu-latest verschoben |
| GitLab-Runner auf Windows-Hosts | config.toml mit shell = "bash" oder ohne explizite Konfiguration (Default sh routet auf Windows-Hosts häufig über Git Bash) und PHP-Tooling in den CI-Stages | [runners.shell] mit shell = "powershell" oder shell = "cmd" |
Wir betreiben in unseren Mandanten-Plattformen — TYPO3 und Sylius im DACH-Mittelstand-Korridor — den PHP-Stack durchgängig in Linux-Containern (Wolfi-OS-Basis seit Februar 2026 als Standard). Direkte produktive Betroffenheit ist bei uns damit niedrig. Die operative Linie sitzt aber an einer anderen Stelle: einzelne Mandanten haben eigene Windows-Build-Hosts für historische Pipeline-Reste, und unsere Architekturreviews stoßen regelmäßig auf Composer-Scripts, die dynamisch Pfade zusammensetzen — das ist der eigentliche Angriffsraum.
Auswirkungen
Die spektakuläre Lesart des Bugs — „Symfony Process löscht das falsche Verzeichnis" — ist korrekt, aber sie überzeichnet die typische Wirkung. Die häufigere Wirkung ist subtiler: ein Build-Pipeline-Schritt löscht ein Artefakt nicht, das er hätte löschen sollen, sodass eine spätere Build-Stage auf einen veralteten Stand zugreift. Oder umgekehrt: ein Cleanup-Script entfernt ein Verzeichnis, das benachbart zur eigentlichen Ziel-Stelle liegt, sodass nach dem Build-Lauf ein produktives Artefakt verschwunden ist. Beides ist keine Datenschutz-Lage und keine RCE, aber beides erzeugt Pipeline-Halluzinationen, die im Operations-Alltag schwer zu rekonstruieren sind.
Die Worst-Case-Variante — Löschung eines produktiven Verzeichnisses oder eines Inhalts-Volumes — setzt voraus, dass das aufrufende Script den Argument-Pfad dynamisch aus Konfigurations-Werten konstruiert und dass der Pfad ein = enthält. Im DACH-Mittelstand-Plattform-Kontext ist das selten, aber nicht ausgeschlossen: Build-Tools, die Tenant-Identifier oder Konfigurations-Keys in Pfade einsetzen, generieren regelmäßig Pfade mit = (vor allem in Base64-encoded Identifier-Schemata), und ein Cleanup-Script kann diese Pfade an symfony/process weitergeben.
Strukturell sitzt CVE-2026-24739 in der laufenden Reihe der Argument-Konsistenz-Befunde im PHP-Stack. Drei Datenpunkte verdichten diese Linie: Composer GHSA-f9f8-rm49-7jv2 vom 12.05.2026 (Token-Leak in Fehlermeldungen, weil Symfony Console ANSI-Sequenzen einfügt, die die Masking-Logik umgehen), node-ipc vom 14.05.2026 (Maintainer-E-Mail-Domain-Hijack über eine abgelaufene Domain) und die Sylius-Befünde im März (CVE-2026-31821 bis -31825, im 2.0.16/2.1.12/2.2.3-Stand stabilisiert). Die Lehre ist keine Symfony- oder Sylius-Schwäche, sondern dass die Test-Matrizen der Standard-Frameworks die Nebenumgebungen nicht systematisch abdecken — und dass Mandanten-Plattformen die Differenz tragen.
Mitigation / Sofortmaßnahmen
Der Patch ist trivial, die Operation drumherum nicht. Drei Pfade, in aufsteigender Tiefe.
Pfad 1: Composer-Lock auf Fix-Version
# In jedem PHP-Projekt mit symfony/process im Composer-Lock:
composer why symfony/process
composer require symfony/process:^7.4.5 --update-with-dependencies
# Oder analog für den jeweiligen Major-Korridor:
# 5.4.x → 5.4.51
# 6.4.x → 6.4.33
# 7.3.x → 7.3.11
# 7.4.x → 7.4.5
# 8.0.x → 8.0.5
Das composer why-Vorab ist nicht kosmetisch: Symfony Process kommt in über 80 Prozent der produktiven PHP-Projekte als transitive Abhängigkeit hinein — über symfony/console, symfony/messenger, composer/composer selbst, phpunit/phpunit, friendsofphp/php-cs-fixer und Dutzende andere. Die direkte Pin reicht nicht, wenn ein transitiver Pfad eine ältere Version festhält. composer why symfony/process zeigt den vollständigen Abhängigkeits-Baum.
Pfad 2: Windows-CI-Runner von Git Bash auf cmd.exe / PowerShell umstellen
Für GitHub Actions:
# Vorher (verwundbar, wenn PHP-Tooling läuft):
- name: Composer install
shell: bash
run: composer install
# Nachher:
- name: Composer install
shell: pwsh # oder: shell: cmd
run: composer install
Für selbst gehostete GitLab-Runner auf Windows: Pipeline-Shell-Konfiguration vom Default-sh (das auf Windows-Hosts häufig Git Bash bedeutet) auf powershell umstellen.
# config.toml des GitLab-Runners:
[[runners]]
name = "windows-build"
executor = "shell"
[runners.shell]
shell = "powershell"
MSYS2 ist eine historische Brücke zwischen Unix-Shell-Erwartungen und Windows-Process-Modellen. Sie ist nützlich für Entwickler-Convenience, sie ist nicht produktionsreif für unbeobachtete Build-Pipelines.
Pfad 3: Audit der Composer-Scripts und Maintenance-Pfade
# In jedem PHP-Projekt:
grep -rn "Process(" --include="*.php" src/ vendor/ scripts/
# Suche nach dynamisch konstruierten Pfaden:
grep -rn "rmdir\|unlink\|del " --include="*.php" src/ scripts/
# Speziell: Pfad-Konstruktionen mit '='
grep -rEn "\\.'='\\." --include="*.php" src/ scripts/
Wer einen Treffer in einem Cleanup-Script oder einem Build-Hook findet, dokumentiert die Stelle und entscheidet: Pfad neu konstruieren (kein =), oder Symfony-Process-Aufruf durch Filesystem::remove() aus symfony/filesystem ersetzen — die Komponente nutzt intern PHP-native File-API, kennt die Konversions-Schichten der Host-Shells nicht und ist deshalb in einer breiteren Konfigurations-Matrix vorhersagbar.
Detection / Prüfung
Drei komplementäre Detection-Pfade — SCA-Tool, Pipeline-Lint, Host-Telemetrie.
Pfad 1: SCA-Tool im Composer-Lock
# Mit composer audit (eingebaut seit Composer 2.4):
composer audit --format=json | jq '.advisories[] | select(.package == "symfony/process")'
# Mit Trivy:
trivy fs --scanners vuln --severity HIGH,CRITICAL --include-dev-deps .
# Mit Snyk:
snyk test --severity-threshold=medium
Der SCA-Pfad meldet die Lücke verlässlich, sobald die GHSA-Datenbank den Eintrag ausgerollt hat (Stand 17.05.2026: verfügbar in GitHub Advisory Database und Snyk-Datenbank).
Pfad 2: Pipeline-Lint auf Git-Bash-Shells in Windows-Jobs
# YAML-Lint für GitHub Actions:
find .github/workflows -name "*.yml" -exec grep -Hn "shell: bash" {} \; | \
xargs -I {} sh -c 'echo "Treffer: {}"; grep -B2 "shell: bash" {} | grep -E "runs-on.*windows"'
# Für GitLab CI:
grep -rEn "shell.*bash" .gitlab-ci.yml | grep -A2 "windows"
Wer hier Treffer findet, hat einen direkten Mitigations-Auftrag — auch wenn symfony/process schon gepatcht ist, ist die MSYS2-Shell in Windows-CI-Jobs eine generelle Risiko-Klasse und sollte gegen pwsh oder cmd getauscht werden.
Pfad 3: Host-Telemetrie mit Falco / Tetragon / Sysmon
Für Windows-Build-Hosts mit Sysmon, Tetragon oder vergleichbarer eBPF-Schicht:
<!-- Sysmon-Config-Snippet (Windows Event ID 1): -->
<RuleGroup name="Symfony-Process-Auditing" groupRelation="or">
<ProcessCreate onmatch="include">
<CommandLine condition="contains all">rmdir;=</CommandLine>
<CommandLine condition="contains all">del;=</CommandLine>
</ProcessCreate>
</RuleGroup>
Für Linux-Hosts (wenn PHP-Build-Container im Mandanten-Cluster laufen):
# Falco-Regel:
- rule: PHP_Process_Argument_Equals_Sign_File_Op
desc: PHP-Prozess startet rm/rmdir mit '=' im Pfad-Argument
condition: >
spawned_process and proc.pname startswith "php" and
(proc.name in ("rm", "rmdir", "unlink")) and
proc.args contains "="
output: "PHP-File-Op mit '=' im Pfad (proc=%proc.name args=%proc.args parent=%proc.pname)"
priority: warning
tags: [process, symfony, cve-2026-24739]
Tetragon-TracingPolicy als Alternative (für eBPF-native Cluster):
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: symfony-process-cve-2026-24739
spec:
kprobes:
- call: "fd_install"
syscall: false
selectors:
- matchPIDs:
- operator: In
followForks: true
values:
- <pid_php_worker>
matchArgs:
- index: 1
operator: "Contains"
values:
- "="
Die Telemetrie-Schicht ist optional, aber sie ist die Linie, die in Mandanten-Plattformen die Lücke zwischen „Patch installiert" und „Patch wirklich wirksam" prüfbar macht.
Betreiberempfehlung
Die Lücke ist mit medium-Kritikalität korrekt eingestuft — sie braucht keine Notfall-Eskalation, sie braucht aber eine ruhige, nicht-aufschiebende Reaktion. Vier Wenn/Dann-Bullets als Operational Decision Block:
- Sofort mitigieren, wenn Sie produktive PHP-Pipelines auf Windows-Build-Runnern unter Git Bash betreiben und der Build-Output dynamisch konstruierte Pfade in
rmdir/del-Operationen einsetzt. - Im 14-Tage-Wartungsfenster aktualisieren, wenn Ihre Pipelines auf Linux-Runnern laufen, aber lokale Entwickler-Setups unter Windows + Git Bash + Composer-Scripts produktive Konfigurations-Dateien manipulieren.
- Reine Linux-Plattform, kein direkter Handlungsdruck, aber Composer-Update im Standard-Maintenance-Sweep der nächsten Wochen mitnehmen — der Patch ist trivial, die Schicht ist stabil.
- Lokale Windows-Workstation, kein Server-Bezug, wenn der PHP-Stack nur für lokale Entwicklung läuft und keine produktiven File-Operationen über benutzerdefinierte Pfade ausgelöst werden.
Mittelstand
Composer-Update einplanen, idealerweise im Rahmen des nächsten Composer-Sweeps der laufenden Sprint-Woche. Parallel: Windows-Build-Host-Inventur — gibt es im Mandanten-Bestand noch produktive Windows-Build-Runner, die unter Git Bash laufen? Wenn ja, Shell-Konfiguration auf cmd.exe oder PowerShell ändern, idealerweise begleitet von einem Wechsel auf Linux-Container für den nächsten Pipeline-Refresh.
Enterprise
Zusätzlich: Pipeline-Audit auf Symfony-Process-basierte Datei-Operationen, mit Fokus auf Cleanup- und Deploy-Hooks. Hardening-Regel NO_MSYS2_SHELL_IN_CI in der Build-Standard-Vorlage. SBOM-Inventur der Composer-Lock-Files quer durch das Plattform-Portfolio, mit symfony/process als spezifisches Audit-Item.
Kubernetes und deklarative Stacks
Containerisierte PHP-Builds (Wolfi-OS, Debian-Slim) sind durchgängig nicht betroffen — der Container läuft Linux, MSYS2 spielt keine Rolle. Wer auf Wolfi-Basis baut: die nächste regelmäßige Image-Rebuild-Welle nimmt das symfony/process-Update mit, sobald chainguard/php den Patch pullt (Stand 17.05.2026: Composer-Lock im offiziellen Image noch nicht aktualisiert, Tracking über chainguard-images Issues zu erwarten).
Was wir konkret getan haben
Wir haben am 17. Mai am Morgen drei Schritte parallel angesetzt. Erstens eine Composer-Lock-Inventur über das gesamte Mandanten-Plattform-Portfolio: 23 Plattform-Repositories haben einen direkten oder transitiven symfony/process-Eintrag, davon zwölf in einer der verwundbaren Versionen. Die Aktualisierung läuft als Standard-Pull-Request-Welle, jede mit eigenem CI-Lauf gegen die Plattform-Tests; die ersten Merges sind bis Sonntag-Abend zu erwarten, die restlichen im Lauf der Folgewoche.
Zweitens eine Pipeline-Inventur auf MSYS2-Shells. Wir haben in keinem unserer eigenen CI-Pfade Windows-Runner mit Git Bash, weil unsere Pipeline-Architektur seit Februar 2026 durchgängig auf Linux-Wolfi-Containern über GitLab CI läuft. Bei zwei Mandanten haben wir aber historische Windows-Build-Hosts identifiziert, die für spezifische Legacy-Anwendungen weiter laufen. Die Shell-Konfiguration dieser Hosts haben wir bereits umgestellt — cmd.exe als Default, PowerShell als Eskalations-Variante. Die strukturelle Frage nach Linux-Container-Migration läuft als separater Architektur-Review-Punkt.
Drittens ein Audit der Composer-Scripts in Mandanten-Repositories. Wir haben in composer.json und in den Build-Hook-Scripts nach Process()-Aufrufen mit dynamisch konstruierten File-Pfaden gesucht. Drei Treffer in drei verschiedenen Mandanten-Plattformen — alle drei waren Cleanup-Routinen, die nach einem Build temporäre Artefakte entfernen. Die Pfade enthielten in zwei Fällen Base64-encoded Tenant-Identifier (mit = als Padding-Zeichen). Diese drei Stellen haben wir auf Filesystem::remove() aus symfony/filesystem umgestellt — die Komponente nutzt intern PHP-native File-API statt einen externen rmdir-Prozess zu starten.
Strukturell ergibt sich aus dem Lauf eine Lehre für unsere Plattform-Vorlage: dynamisch konstruierte Pfade in externen Prozessen sind eine eigene Risiko-Klasse, unabhängig vom konkreten CVE. Wir nehmen das als zusätzlichen Lint-Punkt in unsere Build-Hook-Standard-Vorlage auf — wer eine File-Operation auf einem benutzergenerierten Pfad braucht, nutzt die Filesystem-Komponente, nicht einen Process-Aufruf.
Architektur-Beobachtung am Rande: der Bug zeigt einmal mehr, dass die Standard-Test-Matrizen der großen PHP-Frameworks die MSYS2-Nebenumgebung nicht systematisch abdecken. Symfony hat in der Advisory eine ausdrückliche Warnung gegen MSYS2-basierte Shells in produktiven Pipelines ausgesprochen — was de facto eine Erweiterung der Symfony-Support-Definition ist. Wer noch produktive Pipelines unter Git Bash auf Windows-Hosts fährt, betreibt sie ab heute außerhalb der vom Hersteller adressierten Standard-Konfiguration.
Häufige Fragen zu CVE-2026-24739 und Symfony Process unter Windows
Symfony Process CVE-2026-24739: Müssen Linux-Produktionsserver gepatcht werden — oder reicht der Entwickler-Maschinen-Fokus?+
Auf den Produktions-Servern allein: nein, keine Eskalation. Auf den Entwickler-Maschinen und in der CI-Pipeline: ja, im nächsten regulären Composer-Sprint. Der Grund ist nicht primär die CVE-Spezifik (die unter Linux nicht greift), sondern die Composer-Lockfile-Disziplin — eine Lockfile, die ungepatchte Komponenten festhält, läuft frueher oder später durch die nächste Sicherheits-Pipeline-Inventur. Lieber jetzt im regulären Sprint nachziehen als drei Wochen später unter Audit-Druck.
Wie prüfe ich, ob meine composer.lock symfony/process in einer verwundbaren Version festhält?+
Ein-Zeiler: composer show symfony/process zeigt die installierte Version. Wenn sie unterhalb des Fixes für Ihre Major-Linie steht (5.4.51, 6.4.33, 7.3.11, 7.4.5, 8.0.5), ist die Lockfile betroffen. Für eine ganze Projekt-Mandanten-Liste: composer audit in jedem Projekt-Verzeichnis. Das Tool zieht inzwischen den GitHub Advisory Database und meldet CVE-2026-24739 zuverlässig. Wer Packagist Private mit eigenem Mirror fährt, hat den Advisory-Feed ohnehin im Audit-Lauf integriert.
Wir entwickeln unter WSL2 — sind wir von CVE-2026-24739 betroffen?+
Für DACH-Mittelstand-Teams mit klassischem PHP-Stack: WSL2 ist die ergonomische Variante, wenn die Hardware sowieso Windows bleibt (Lizenz-Themen, IT-Standardisierung). Native-Linux ist die robuste Variante, wenn die Hardware-Wahl offen ist. Beide Lösungen entfernen den MSYS2-Konvertierungs-Pfad aus dem lokalen Workflow und schließen damit nicht nur CVE-2026-24739, sondern auch die nächste Symfony-Process-Edge-Case-Klasse aus. Eine reine „Git Bash unter Windows“-Strategie ist 2026 nicht mehr State-of-the-Art — das ist eine Empfehlung, die länger trägt als dieser CVE.
Welche Composer-Skripte sind typische Risikostellen?+
Drei Klassen, die wir in Reviews regelmäßig sehen: (1)post-install-cmd-Hooks, die Build-Verzeichnisse mit konfigurierbaren Pfaden löschen oder anlegen (etwa --cache-dir=...). (2) Eigene Console-Commands für Asset-Resampling, die einen Output-Pfad als CLI-Argument akzeptieren und intern Process auf convert oder ffmpeg mit einem File-Argument aufrufen. (3) Migrations-Skripte, die mit --target-dir= einen Schreib-Pfad anbieten und im Hintergrund File-Management durchführen. Alle drei sind unter Linux harmlos, unter MSYS2/Git-Bash mit ungepatchter Process-Version aber potenziell wirksam auf einen anderen Pfad als gemeint.
Sollen wir symfony/process in composer.json explizit pinnen?+
Nein. symfony/process ist eine transitive Abhängigkeit der meisten Symfony-/TYPO3-/Sylius-Stacks. Ein expliziter Pin in der Projekt-composer.json würde spätere automatische Updates blockieren — unerwünscht. Stattdessen: regelmäßiges composer update im Sprint-Zyklus, composer audit als CI-Schritt mit Fail-on-High, und Branch-Protection auf der composer.lock, damit ein Lockfile-Refresh über einen MR mit Code-Review läuft. Das ist die robuste Variante — ein Pin auf eine Komponente ist die Reaktion, die im Q3 vergessen wird und im Q4 zur Sicherheits-Schuld zurückkommt.
Fazit
CVE-2026-24739 ist ein kleiner Bug an einer stabilen Stelle. Die operative Wirkung — Datei-Löschung an unbeabsichtigter Stelle unter einer Konfigurations-Konstellation, die viele Mandanten gar nicht fahren — ist begrenzt. Die strukturelle Wirkung — Bestätigung, dass selbst die Standard-PHP-Stack-Bibliotheken in Nebenumgebungen Konsistenz-Annahmen brechen können — ist die ehrlichere Lesart.
Die Lehre für unsere Mandanten-Plattformen ist nicht „Symfony patchen" (das ist trivial), sondern „dynamisch konstruierte Pfade in externen Prozessen sind eine eigene Risiko-Klasse". Wir haben den Lint in unserer Plattform-Vorlage ergänzt, die drei betroffenen Cleanup-Routinen auf Filesystem::remove() umgestellt und die Composer-Lock-Welle eingeleitet. Die Frage lautet nicht, ob Sie heute oder morgen patchen. Sie lautet, ob Sie wissen, welche Pipelines im Mandanten-Bestand File-Operationen über externe Prozesse mit benutzerdefinierten Pfaden auslösen.
Wir prüfen, härten und auditen Ihre PHP-Build-Pipelines gegen Symfony-Process-Klasse-Befunde.
Wir starten in Mandanten-Setups regelmäßig mit einer Composer-Lock-Inventur, einer Pipeline-Shell-Inventur und einem Audit der Build-Hook-Scripts auf dynamisch konstruierte Pfade in externen Prozessen. Drei konkrete Schritte: Composer-Lock auf Fix-Version, Windows-CI-Runner von Git Bash auf cmd.exe oder PowerShell, Audit der Cleanup-Routinen auf Process()-Aufrufe mit benutzergenerierten Pfaden.
Wenn Sie eine produktive PHP-Plattform betreiben — Sylius im B2B-Bestellprozess, TYPO3 als Content-Backbone, eigene Symfony-Console-Anwendungen — gehört dieser Audit in die laufende DevSecOps-Linie, nicht in eine Sondermassnahme. Wir machen das als Teil unseres regulären DevSecOps-Plattformbetriebs und im Rahmen unserer CMS-Härtungs-Linie.




