17 min read
Medium

PHP CVE-2025-14177: getimagesize() blutet Heap-Speicher, iptcembed() bleibt offen

18. Mai 2026. Positive Technologies hat am 17. Mai zwei Memory-Safety-Bugs in PHPs JPEG-Verarbeitung offengelegt: einen gepatchten Heap-Information-Leak in getimagesize() (CVE-2025-14177, CVSS 6.3) und einen ungepatchten Heap-Buffer-Overflow in iptcembed(). Betroffen sind PHP 8.1 vor 8.1.34, 8.2 vor 8.2.30, 8.3 vor 8.3.29, 8.4 vor 8.4.16 und 8.5 vor 8.5.1 — also faktisch jede laufende TYPO3-, Sylius- oder Composer-Anwendung, die Upload-JPEGs anfasst. Wer Bildverarbeitung auf PHP-Ebene macht, sollte diese Woche patchen und parallel klären, wo iptcembed() überhaupt aufgerufen wird.

Ein walnussgriffiger Messschieber aus Messing klemmt um die vordere Kante eines aufgefächerten Stapels cremefarbener fotografischer Testkarten, die sich nach rechts unten weit über die Reichweite des Schiebers hinaus erstrecken. Am Mess-Punkt sitzt ein einzelner oxblutroter Email-Punkt als einziger gesättigter Akzent. Oben rechts eine messingbeschlagene Lupe, Linse zum ungemessenen Teil des Stapels geneigt. Kühles Studio-Schlüssellicht von links oben, warmes Rim-Licht von rechts unten, auf mattem dunklem Schiefer.
AI-generated · gpt-image 2.0

TL;DR — 90 Sekunden

Betroffen?PHP 8.1.* vor 8.1.34, 8.2.* vor 8.2.30, 8.3.* vor 8.3.29, 8.4.* vor 8.4.16, 8.5.* vor 8.5.1 — überall dort, wo getimagesize() oder iptcembed() auf Nutzer-Uploads läuft (Upload-Formulare, Indexer, Asset-Pipelines, Produktbilder, EXIF-Auslese).
Risiko?Heap-Memory-Disclosure (CVSS 6.3, gepatcht) plus paralleler Heap-Buffer-Overflow in iptcembed() (zu Redaktionsschluss nicht gepatcht). Information-Disclosure leakt Fragmente des Prozess-Heaps; der Overflow eskaliert je nach Build-Konfiguration zu DoS oder schlimmer.
Sofortmaßnahme?PHP auf 8.1.34 / 8.2.30 / 8.3.29 / 8.4.16 / 8.5.1 ziehen. Bis dahin getimagesize()-Ergebnisse nicht im HTTP-Response zurückspielen und JPEG-Uploads vor dem PHP-Parser über imagemagick-CLI im Container-Sandbox normalisieren.
Empfehlung?Mittelstand: Hosting-Provider zur Patch-Linie befragen, eigene Composer-Projekte im Wartungsfenster heben. Enterprise / Container-Bauer: Wolfi- oder Distroless-Images automatisiert neu bauen, SBOM-Diff prüfen.
Kritikalität?medium — siehe Hero-Badge. Eskalation auf high möglich, wenn ein iptcembed-PoC vor dem Patch öffentlich wird.

Was ist das Problem?

JPEG-Dateien transportieren ihre Metadaten in „Application Segments“ — kleinen, hintereinander geketteten Blöcken im Dateikopf, in denen Kameras, Bildbearbeitungsprogramme und Content-Management-Systeme Informationen wie Aufnahmedatum, GPS-Koordinaten, IPTC-Stichwörter oder ICC-Farbprofile ablegen. PHPs ext/standard-Extension hat zwei Funktionen, die diese Segmente lesen und schreiben: getimagesize() zieht Dimensionen, MIME-Type und IPTC-Daten heraus, iptcembed() schreibt IPTC-Daten in eine vorhandene JPEG-Datei zurück. Beide Funktionen sind seit über zwei Dekaden im Sprachkern, beide werden in CMS-Upload-Workflows, in E-Commerce-Produktpflege und in Asset-Pipelines aufgerufen, oft ohne dass es im Anwendungs-Code sichtbar ist.

Nikita Sveshnikov von Positive Technologies (PT SWARM) hat am 17. Mai zwei voneinander unabhängige Memory-Safety-Bugs in dieser Schicht offengelegt. Der erste Bug, CVE-2025-14177, sitzt in der internen Hilfsfunktion php_read_stream_all_chunks, die JPEG-APP-Segmente blockweise in einen Heap-Puffer liest. Die Funktion alloziert den Zielpuffer einmal initial, schreibt aber bei jedem read-Aufruf an den Anfang des Puffers, anstatt den Schreibzeiger fortzuschalten. In der Folge überschreiben spätere Chunks die Daten der vorherigen, und der Schwanz des Puffers bleibt mit unzufälligem Heap-Inhalt aus früherer Allokation gefüllt. Eine speziell präparierte JPEG-Datei, die den Parser in den „read everything until EOF“-Modus zwingt, kann diese unzufälligen Bytes als Teil der Funktionsrückgabe zurück an den Aufrufer geben — und damit Fragmente fremder Prozess-Heap-Inhalte exfiltrieren.

Der zweite Bug ist eine Variante der gleichen Bug-Klasse („measure once, read forever“) in iptcembed(). Diese Funktion fragt einmal per fstat die Größe der Eingabedatei ab und alloziert auf dieser Basis den Output-Puffer — dann liest sie aber in einer Schleife weiter, ohne die Schreibgrenze pro Iteration neu zu prüfen. Eine JPEG-Datei, deren Inhalt im Lese-Verlauf wächst (klassisch: Race auf dem Filesystem, oder ein speziell gebauter Pipe-Stream), führt zu Out-of-Bounds-Schreiben auf den Heap. Der Patch für CVE-2025-14177 ist in den oben genannten Maintenance-Versionen enthalten; für iptcembed() lag zu Redaktionsschluss noch kein offizieller Fix vor.

Bug-Klasse im Klartext

Beide Bugs sind keine Logikfehler, sondern Pflege-Schulden aus der Frühzeit der C-Implementierung. Die Funktionen wurden gebaut, als JPEG-APP-Segmente klein waren und Pufferarithmetik in jedem zweiten C-Programm so geschrieben wurde. Was sie heute angreifbar macht, ist nicht die Bösartigkeit eines Angreifers, sondern die Tatsache, dass CMS- und E-Commerce-Plattformen Dateien aus dem Internet annehmen und durch genau diese Funktionen schleusen. Das ist der eigentliche Kontext: Es geht nicht um einen exotischen Edge-Case, sondern um die Standard-Pipeline für Produktbilder, Pressefotos und Avatar-Uploads.

Wer ist betroffen?

Betroffen ist jeder PHP-Prozess der oben genannten Versionsspanne, der getimagesize() oder iptcembed() auf nicht vertrauenswürdige Eingabedateien aufruft. Das schliesst die meisten CMS-Upload-Pfade, fast alle Sylius-Produktpflege-Pipelines und einen großen Teil der Composer-getriebenen B2B-Plattformen mit ein. Plattformen, die JPEGs ausschließlich aus einem geprüften CDN oder einem internen DAM ziehen, sind nicht betroffen.

SchichtBetroffenNicht betroffenBedingungen
PHP-Core8.1.* < 8.1.34, 8.2.* < 8.2.30, 8.3.* < 8.3.29, 8.4.* < 8.4.16, 8.5.* < 8.5.18.1.34 / 8.2.30 / 8.3.29 / 8.4.16 / 8.5.1 und neuer (für CVE-2025-14177)iptcembed()-Bug noch in allen Versionen offen, bis PHP-Maintainer den Fix mergen
TYPO3 (Indexed Search, FAL, Imagery)Indexed-Search-Indexer auf JPEG-Assets; FAL-Asset-Pflege; Editor-Uploads in tt_contentTYPO3-Installationen mit deaktiviertem JPEG-Upload (selten)Bedingung: ungelinte JPEG-Uploads aus dem Frontend (Kommentare, Formulare) oder Backend-Editor mit nicht-vertrauenswürdigen Redakteuren
Sylius / Shopware / E-CommerceProduktbild-Upload, Avatar-Upload, B2B-Katalog-ImportReine Headless-Stacks ohne PHP-Upload-Endpoint (z. B. komplette Asset-Übergabe via S3-presigned-URL + Lambda-Pipeline)Bedingung: PHP-Layer sieht das Bild
Composer-Bibliothekenintervention/image, phpoffice/phpword, setasign/fpdf, alles was JPEG-Metadaten verarbeitetBibliotheken, die ausschließlich imagick-Bindings nutzen und PHP-Builtin-JPEG-Parsing umgehenComposer-Lockfile auf indirekte JPEG-Touch-Punkte prüfen
Container-Hosts (Wolfi / Distroless / Debian-Bookworm-Slim)Container, die obige PHP-Versionen pinnenWolfi-Images, die nightly über Chainguard-Factory neu gebaut wurden, sobald PHP-Patches dort verfügbar sindBuild-Zeitpunkt entscheidend, nicht die Image-Familie
Kubernetes / Container-PlattformenPods mit PHP-Image, das vor 17.05.2026 gebaut wurde und keine Rolling-Update-Policy hatPods mit imagePullPolicy: Always plus täglichem Rolling-Rebuild des Base-ImagesBedingung: Build-Pipeline pickt Patches automatisch auf

Auswirkungen

CVE-2025-14177 ist eine Information-Disclosure mit CVSS 6.3 (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N) — netzwerkbasierte Auslösung, ohne Privilegien, mit Nutzerinteraktion (Upload-Klick), Auswirkung ausschließlich auf Vertraulichkeit. Was in der Score-Tabelle harmlos aussieht, ist im operativen Befund unangenehmer: Geleakter Heap-Inhalt kann Session-Tokens, OPCache-Inhalte, Datenbank-Verbindungs-Strings oder andere zuvor in dieser PHP-Prozess-Inkarnation verarbeitete Daten enthalten. In Long-Running-FPM-Pools (z. B. statt PHP-FPM-pm=ondemand auf pm=static) sammelt sich über Stunden eine Heap-Geschichte an, die der nächste Upload abgreifen kann. Wer Bilder im Response zurückgibt (Bildvorschau, Thumbnail-Generierung mit Re-Embed der Original-Metadaten), gibt Heap-Inhalt in den Browser-Cache des Anfragers.

Der iptcembed()-Bug ist die ernstere Lage. Ein Heap-Buffer-Overflow in einer C-Funktion, die ohne Hardening (kein PIE, keine FORTIFY_SOURCE im Build) ausgeliefert wird, ist im Worst-Case ein RCE-Pfad. Im realistischen Mittelstands-Kontext heißt das: Wer auf einem produktiven PHP-FPM-Pool eine Race-Condition oder einen Pipe-Stream auf eine iptcembed-Routine fahren kann, kann den Prozess crashen (DoS auf dem Worker) oder, je nach Hardening, eigene Anweisungen auf dem Heap unterbringen. Der Angriffsweg setzt voraus, dass der Angreifer den Schreib-Pfad in iptcembed() reproduzierbar triggert — das ist in CMS-Upload-Workflows nicht der Standardfall, in Asset-Pipelines mit nachgelagerter IPTC-Anreicherung aber durchaus. Solange kein PHP-Patch da ist, ist die operative Mitigation wichtiger als das Score-Niveau.

Business-Auswirkung im Mittelstands-Sinn: Ein Information-Disclosure aus dem PHP-Heap kann personenbezogene Daten freilegen (DSGVO Art. 32 — Sicherheit der Verarbeitung). Ein DoS auf produktive PHP-FPM-Worker trifft Umsatz-tragende Endpunkte (Sylius-Checkout, TYPO3-Login-Seite) direkt. Im NIS-2-Kontext zählt ein bewusst ausgenutzter Information-Disclosure oder DoS als „signifikanter Sicherheitsvorfall“ und muss innerhalb der 24/72-Stunden-Fristen an das BSI gemeldet werden.

Mitigation / Sofortmaßnahmen

Die Reihenfolge ist nicht beliebig. Erst patchen, dann Workarounds, dann strukturell härten.

Pfad 1 — PHP-Patch einspielen (CVE-2025-14177)

Für Debian-/Ubuntu-Repositorien (Sury) und für Wolfi-/Chainguard-Bilder sind die Patches da. Beispielhaft für die meistgenutzten Stränge:

 

# Debian/Ubuntu mit Sury-Repo
apt update
apt install --only-upgrade php8.3 php8.3-cli php8.3-fpm php8.3-common
# Ziel: 8.3.29 oder höher
php -v

# Wolfi-Container (manueller Build)
docker pull chainguard/php:8.3
docker run --rm chainguard/php:8.3 php -r "echo PHP_VERSION, PHP_EOL;"

# Composer-Projekt mit PHP-Anforderung im composer.json prüfen
composer why-not php 8.3.29

 

Für Container-Images: Nicht den Tag-Alias updaten, sondern den vollen SHA-Digest pinnen, sobald der nightly Build durch ist. Sonst wandert ein nicht reproduzierbarer Stand in Produktion.

Pfad 2 — Workaround für iptcembed() (kein Patch verfügbar)

Bis der iptcembed()-Fix in PHP-Upstream ist, drei aufeinander aufbauende Schritte:

 

// 1. iptcembed im Anwendungs-Code auskommentieren oder durch eine geprüfte
//    Alternative ersetzen (Imagick::setImageProperty + writeImage), wenn
//    die Bibliothek das hergibt.
$im = new Imagick($jpegPath);
$im->setImageProperty('IPTC:2:120', $caption);
$im->setImageProperty('IPTC:2:25', $keywords);
$im->writeImage($jpegPath);
$im->clear();

// 2. Wenn iptcembed() nicht ersetzbar ist: per disable_functions in der
//    php.ini sperren und im Anwendungs-Code defensive Fallback-Logik
//    einbauen, die ohne IPTC-Re-Embed lebt.
// php.ini:
//   disable_functions = iptcembed

// 3. Für nachgelagerte Asset-Pipelines (Cron, Queue-Worker): JPEG-
//    Metadaten ausschliesslich über externe Tools (exiftool im sandboxed
//    Container) schreiben, nicht über den PHP-Prozess.

 

Pfad 3 — Strukturell: Upload-Härtung

Wer Upload-JPEGs annimmt, sollte die Datei vor dem PHP-Parser durch ein normalisierendes Tool schicken — ImageMagick im rootless Container, oder jpegtran mit --copy=none. Damit verlässt das JPEG den Eingangs-Pfad ohne fremde APP-Segmente, und getimagesize() oder iptcembed() sieht nur sauberes Material.

 

# Beispiel: ImageMagick im rootless Container für JPEG-Normalisierung
docker run --rm -v "$(pwd)/uploads:/in:ro" -v "$(pwd)/clean:/out" \
    --read-only --cap-drop=ALL --user=1000:1000 \
    chainguard/imagemagick:latest \
    convert /in/upload.jpg -strip /out/normalized.jpg

# Anschliessend in PHP nur das normalisierte Bild parsen
$info = getimagesize('/path/to/clean/normalized.jpg');

 

Diese Pipeline ist nicht nur eine Mitigation für CVE-2025-14177, sondern eine generelle Härtungsempfehlung — sie reduziert die Angriffsfläche für die nächste JPEG-Memory-Bug-Variante, die in zwölf Monaten kommen wird.

Detection / Prüfung

Eine direkte Detection für gestohlene Heap-Bytes ist nicht trivial, weil der Exfil-Pfad über reguläre HTTP-Responses läuft. Die operativen Hebel liegen einen Schritt vor und einen Schritt nach dem PHP-Prozess.

Vor dem PHP-Prozess — Upload-Anomalie-Erkennung

 

# JPEGs mit auffällig grossen APP-Segmenten markieren
# (Schwellwert empirisch: gesunde Editorial-JPEGs liegen meist <128 KB
# APP1+APP13; Trigger bei >1 MB lohnen Aufmerksamkeit)
exiftool -j -G uploaded.jpg | jq '.[] | {APP1Length:.["APP1:DirectoryItemLength"], APP13Length:.["APP13:DirectoryItemLength"]}'

# Alternativ: jpeginfo / jpegtran als Sanity-Check
jpeginfo -c uploaded.jpg
jpegtran -copy none -optimize uploaded.jpg > /dev/null && echo "ok" || echo "anomalous"

 

Im PHP-Prozess — OPCache- und FPM-Memory-Inspektion

Wenn der Verdacht besteht, dass eine Disclosure stattgefunden hat, ist die richtige Frage nicht „was wurde geleakt“, sondern „welche Geheimnisse waren im FPM-Pool zum Zeitpunkt der Anfrage präsent“. Das beantwortet kein Memory-Dump, sondern eine Inventur:

 

# Welche Geheimnisse landen prinzipiell im FPM-Heap?
# In php.ini suchen nach:
grep -E "^(session\.save_path|opcache\.|auto_prepend_file)" /etc/php/8.3/fpm/php.ini

# Welche Composer-Pakete machen Heap-Allokationen für sensible Daten?
composer show --installed | grep -iE "(jwt|oauth|encryption|sodium|paseto)"

 

Nach dem PHP-Prozess — Falco-Rule und eBPF-Trace

Wer eine Container-Sicherheits-Schicht hat (Falco, Tetragon), kann den Aufruf-Pfad getimagesize/iptcembed mit auffälligen Argument-Mustern markieren. Beispiel für Falco:

 

- rule: php_jpeg_upload_with_large_app_segment
  desc: PHP process reads a JPEG file with unusually large APP segment (heuristic for CVE-2025-14177 exploit attempt)
  condition: >
    spawned_process and
    proc.name in (php, php-fpm, php-fpm8.3) and
    fd.name endswith ".jpg" and
    fd.size > 10485760
  output: >
    Large JPEG read by PHP process (proc=%proc.name file=%fd.name size=%fd.size pid=%proc.pid)
  priority: WARNING
  tags: [cve-2025-14177, php, jpeg]

 

Eine analoge Tetragon-TracingPolicy auf den read-Syscall mit Dateinamen-Pattern *.jpg und Lese-Größe oberhalb eines Schwellwerts ist äquivalent und sitzt auf Kernel-Ebene.

Betreiberempfehlung

Operational Decision Block

Mittelstand

Für den DACH-Mittelstand sitzen drei Hebel auf einer Linie: erstens das Gespräch mit dem Hosting-Anbieter (Mittwald, Hetzner-Managed, Plesk-Hoster, hostNET, alle haben unterschiedliche Patch-Linien), zweitens das eigene Composer-Projekt (composer why-not php 8.3.29 ist der schnellste Sanity-Check, ob die Anforderung im Lockfile passt), drittens die Frage, ob in den letzten 30 Tagen verdächtig große JPEG-Uploads angenommen wurden. Die Frage „haben wir reingeguckt?“ ist wichtiger als die Frage „haben wir gepatcht?“, weil ein Information-Disclosure-Score von 6.3 in der NIS-2-Welt schnell zu einer Meldepflicht wird, sobald ein Hinweis auf Ausnutzung vorliegt.

Enterprise / Container-Plattformen

Auf Container-Plattformen ist der Patch-Hebel die Build-Pipeline, nicht der Pod. Wer das Base-Image nachts neu zieht, hat den Patch am 18. Mai bereits im Roll-out. Wer das Base-Image quartalsweise pinnt, hat das Problem bis August. Dazwischen liegt die Mehrzahl der mittelständischen Container-Stacks. Die Entscheidungsfrage lautet hier nicht „patchen oder nicht“, sondern „Build-Pipeline auf Daily-Rolling umstellen oder weiter Quartal-Pins fahren“. Wir empfehlen Daily-Rolling für alle Container, die einen öffentlichen Eingangs-Endpoint anfassen, und Quartal-Pins nur für rein interne Worker.

Kubernetes / OpenShift

In Kubernetes sind die operativen Schritte: imagePullPolicy: Always setzen, das Deployment mit einem Annotation-Trigger versehen, der nachts ein Rolling-Update ausführt, und im PodSecurityContextreadOnlyRootFilesystem: true plus allowPrivilegeEscalation: false setzen, damit ein Heap-Overflow nicht in einen Container-Escape übergeht. Wer Karpenter oder Cluster-Autoscaler nutzt, sollte die Container-Image-Caches der Worker-Nodes auf TTL=24h setzen, sonst zieht der Scheduler veraltete Images.

Deklarative Stacks (NixOS / Talos / Flatcar)

In deklarativen Stacks ist der Patch eine Pin-Erhöhung im Nix-Flake oder im Talos-Patch-File und ein vollständiger Rebuild. Der Vorteil: der Stand ist reproduzierbar und auditfähig. Der Nachteil: Wer das Pin nicht erhöht, fährt ohne Patch weiter, ohne dass eine apt-update-Routine die Korrektur einspielt. Beim nächsten Flake-Update den php-Pin auf 8.3.29 / 8.4.16 / 8.5.1 setzen und den Build verifizieren.

Was wir konkret getan haben

Wir haben am 17. Mai gegen 22:00 Uhr die Disclosure des PT-SWARM-Teams gelesen und am 18. Mai morgens die gepatchte PHP-Version automatisiert über unsere Build-Pipeline ausgerollt — sowohl auf der Moselwal-Hauptseite (TYPO3-getrieben, JPEG-Uploads aus dem Editor-Backend) als auch auf den drei Kunden-Plattformen, die wir aktiv betreiben.

Der Rollout lief über die normale Update-Kette unserer Base-Images: Sobald die gepatchten PHP-Maintenance-Versionen in Wolfi verfügbar waren, hat die CI-Pipeline die Base-Images neu gebaut und in derselben Sequenz alle abhängigen Application-Images automatisch nachgezogen. Die aktualisierten SHA-Digests landeten in den Kubernetes-Deployments, ein Rolling-Update auf den Worker-Pools setzte den Patch produktiv. Manuelles Eingreifen pro Projekt war nicht nötig; die Pipeline ist genau für diesen Fall gebaut.

Was wir bewusst nicht getan haben: iptcembed() per disable_functions global sperren. In zwei Projekten wird die Funktion in einem Worker-Job aufgerufen, der von einer redaktionellen IPTC-Anreicherung lebt. Stattdessen läuft dieser Worker jetzt in einem rootless Container mit eigenem PHP-Build, der auf einem Sury-Patch-Snapshot von heute Vormittag basiert, und wir warten die offizielle Upstream-Korrektur ab. Diese Trennung von produktiven Web-Workloads ohne iptcembed und isolierten Asset-Workern mit kontrollierter Nutzung war der pragmatische Kompromiss zwischen Brand-Disziplin und Funktionserhalt.

Architektonisch sitzt unter dieser Episode eine größere Frage: PHP ist ein hervorragender Glue-Layer für CMS- und E-Commerce-Workloads, aber Bildverarbeitung auf C-Funktions-Ebene gehört nicht in den gleichen Prozess wie der Request-Handler. Wir verschieben sie schrittweise in nachgelagerte Worker mit minimalen Capabilities und sauberer Container-Sandbox. Das ist nicht die Antwort auf einen einzelnen CVE, sondern die Antwort auf eine Bug-Klasse, die wir alle paar Jahre erneut sehen werden.

Häufige Fragen zu CVE-2025-14177

Wie prüfe ich, ob meine TYPO3-Installation noch eine angreifbare PHP-Version fährt?+

Im TYPO3-Backend unter „System → Reports → Environment“ zeigt sich die laufende PHP-Version. Alternativ per CLI im Webroot: php -v. Wenn die ausgegebene Version unter 8.1.34 / 8.2.30 / 8.3.29 / 8.4.16 / 8.5.1 liegt, ist CVE-2025-14177 nicht gepatcht. Bei Shared-Hosting-Stacks zusätzlich beim Hosting-Provider nachfragen, welche PHP-Patchlinie aktuell ausgeliefert wird — der php -v-Output kann bei manchen Anbietern hinter einem Backport-Schild stehen.

Müssen Wolfi-basierte PHP-Container wegen CVE-2025-14177 neu gebaut werden?+

Wolfi-Images werden über die Chainguard-Factory automatisiert nachts gegen die aktuellen Patch-Stände gebaut. Wer den Container im CI mit melange build oder mit apko publish selbst zusammensetzt, muss den Build nach dem 18. Mai erneut anstoßen und den neuen SHA-Digest in den Deployments aktualisieren. Wer chainguard/php:8.3-latest als Tag-Alias ohne Pin nutzt, zieht den Patch beim nächsten Pull automatisch — sollte aber für reproduzierbare Builds dennoch auf SHA-Digest umschwenken.

Ist imagick als Composer-Alternative gegen die JPEG-Memory-Bugs immun?+

Die imagick-PHP-Extension ruft die ImageMagick-Bibliothek auf, nicht die PHP-internen getimagesize/iptcembed-Codepfade. Für die zwei konkreten Bugs aus dieser Disclosure ist imagick damit nicht betroffen. ImageMagick selbst hat eine eigene CVE-Geschichte mit JPEG- und PDF-Parsern, die getrennt zu bewerten ist — die Aussage „immun gegen CVE-2025-14177“ stimmt, „immun gegen JPEG-Memory-Bugs allgemein“ nicht.

Wann ist der iptcembed()-Patch verfügbar?+

Zu Redaktionsschluss (18.05.2026) lag noch kein offizieller PHP-Upstream-Fix vor. Der PT-SWARM-Disclosure-Thread auf der PHP-Bug-Tracker-Seite ist offen, ein Pull-Request gegen php/php-src ist angekündigt. Wir aktualisieren diesen Post mit einer Update-Notice, sobald der Patch in einer Maintenance-Release veröffentlicht ist. Bis dahin gilt der Workaround aus der Mitigation-Sektion, Pfad 2.

Müssen wir den Vorfall melden, wenn jemand einen verdächtigen Upload bei uns gemacht hat?+

Eine NIS-2-Meldepflicht entsteht erst bei einem „signifikanten Sicherheitsvorfall“ mit Hinweis auf Ausnutzung. Ein verdächtig grosser JPEG-Upload allein erfüllt diese Schwelle nicht. Wenn aber im Falco-Log oder in einem Heap-Dump Hinweise auf abgeflossene personenbezogene Daten oder Session-Tokens entstehen, gilt die DSGVO-Meldepflicht (72 Stunden gegenüber der Aufsichtsbehörde) und im NIS-2-pflichtigen Unternehmen zusätzlich die 24/72-Stunden-Frist gegenüber dem BSI. Wir empfehlen, parallel zu jeder Mitigation einen kurzen Incident-Vermerk anzulegen, damit Sie eine saubere Spur haben — auch wenn keine Meldung notwendig wird.

Fazit

CVE-2025-14177 ist kein Notbruch, aber der Begleit-Bug in iptcembed() macht aus „nächste Wartung“ ein „diese Woche“. Wer auf TYPO3, Sylius oder einer Composer-getriebenen PHP-Plattform sitzt, hat heute drei Aufgaben (Patch ziehen, Upload-Pfad inventarisieren, iptcembed-Aufrufe identifizieren) und einen Beobachtungs-TODO für den ausstehenden zweiten Patch. Mehr ist es nicht. Aber weniger sollte es auch nicht sein, weil Information-Disclosure-Bugs im PHP-Heap die unangenehme Eigenschaft haben, in der NIS-2-Welt schnell zur Meldepflicht zu werden, sobald jemand sich die Frage stellt, was im FPM-Pool zum Zeitpunkt der Anfrage präsent war.

Die Frage lautet nicht, ob die getimagesize()-Codepfade je wieder einen Bug haben werden. Sie lautet, ob Ihre Upload-Pipeline so gebaut ist, dass der nächste Bug Sie nicht erneut auf dem falschen Fuß erwischt.

Dieser Beitrag spiegelt unsere technische Einschätzung. Er ersetzt keine Datenschutz-Folgenabschätzung und keine Rechtsberatung zu konkreten NIS-2-Meldepflichten.

Bevor der nächste JPEG-Memory-Bug kommt — sprechen wir über Ihre Upload-Härtung.

Wir prüfen, mitigieren und validieren Ihre PHP-Plattformen gegen CVE-2025-14177.

Wir prüfen Ihre PHP-Stack-Inventur (Composer-Lockfiles, Container-Base-Images, Hosting-Provider-Patch-Linie), identifizieren die getimagesize/iptcembed-Aufruf-Punkte in Ihrem Codebase, fahren den Patch durch die Pipeline und validieren mit einem reproduzierbaren PoC, dass der Fix sitzt. Stopgap-Workaround für den iptcembed-Bug, Wolfi-Image-Rebuild im CI, Falco-Detection in der zentralen Regelbibliothek — die Bausteine, die in „Was wir konkret getan haben“ oben beschrieben sind, sind das, was wir konkret tun.

Plattformbetrieb statt Beratung-on-paper. Wir kennen die Ecken in TYPO3-FAL, Sylius-Bilder-Pipeline und Composer-Lockfile-Pflege, weil wir sie täglich anfassen. Mehr zur Servicelinie auf DevSecOps und AI-Ready CMS.

Termin direkt vereinbaren

Über den Autor

Foto von Kai Ole Hartwig.

Kai Ole Hartwig

Founder · Moselwal Digitalagentur · OnlyOle

Programmiert seit 2002 – autodidaktisch gelernt, 2012 mit KO-Web selbständig gemacht, heute Moselwal. Über 100 Projekte, Fokus auf Security, Performance, Automatisierung und Qualität.