Kritische Integer-Überlauf-Schwachstellen in Perl-JSON-Parsern
Überblick Eine Reihe kritischer Schwachstellen (CVE-2025-40928, CVE-2025-40929, CVE-2025-40930) wurde in drei hochleistungsfähigen JSON-Parsern für die Programmiersprache Perl entdeckt. Schwachstellen handelt es sich um Integer-Pufferüberläufe, die durch das Parsen eines speziell manipulierten JSON-Strings ausgelöst werden können. Dies führt zu einem Segmentierungsfehler (Segfault) und einem Absturz des Perl-Interpreters. Dadurch werden Denial-of-Service-Angriffe (DoS) ermöglicht. Der Hinweis auf "nicht näher spezifizierte andere Auswirkungen" lässt auf das Potenzial für schwerwiegendere Konsequenzen schließen, wie z.B. die Ausführung von beliebigem Code, was jedoch unter spezifischen Speicherlayouts und Compiler-Bedingungen schwieriger zu erreichen ist.
Alle Schwachstellen wurden von CPANSec, dem Perl-Äquivalent zum CVE-Programm von MITRE, am 8. September 2025 veröffentlicht.
Artikel 1: CVE-2025-40928 - JSON::XS
Betroffenes Produkt: JSON::XS Anfällige Versionen: Vor 4.04 Gepatchte Version: 4.04 und höher Perl-Modul-Link: JSON::XS auf MetaCPAN
Technisches Detail:
JSON::XS ist ein beliebter, leistungsstarker JSON-Serialisierer/Deserialisierer für Perl, basierend auf der C-Bibliothek "libxsmm". Die Schwachstelle befindet sich im C-Code, der das Parsen von JSON-Strings handhabt, insbesondere bei der Berechnung der erforderlichen Puffergröße für einen String, der eine große Anzahl von Unicode-Escape-Sequenzen (z.B. \u0055
) enthält.
Der Fehler ist ein Integer-Überlauf während dieser Größenberechnung. Wenn ein JSON-String eine enorme Anzahl dieser Sequenzen enthält, kann die Berechnung (Anzahl_der_Escapes * etwas + ursprüngliche_Länge
) den Maximalwert eines 32-Bit-Integer (2.147.483.647) überschreiten. Dies führt dazu, dass der Wert "umläuft" und zu einer sehr kleinen, negativen Zahl wird.
Der Code weist dann einen Speicherpuffer basierend auf dieser nun winzigen, falschen Größe zu. Wenn der Parser anschließend versucht, den vollständig unescapten String in diesen viel zu kleinen Puffer zu schreiben, schreibt er über das Ende des zugewiesenen Speichers hinaus. Dadurch werden benachbarte Speicherstrukturen beschädigt, was, wenn es vom System erkannt wird, zu einem sofortigen Segmentierungsfehler führt und den gesamten Perl-Prozess abstürzen lässt.
Beispielszenario: Stellen Sie sich eine Webanwendung mit einem Perl-Backend vor, das JSON::XS verwendet, um vom Benutzer bereitgestellte Daten, wie ein Formularfeld für eine "Benutzerbiografie", zu verarbeiten.
Normalbetrieb: Ein Benutzer sendet eine Biografie:
{"bio": "Hallo Welt!"}
. Der Server parst diese schnell und ohne Probleme.Böswilliger Angriff: Ein Angreifer sendet eine manipulierte JSON-Nutzlast. Die Nutzlast enthält keinen normalen String, sondern einen, der mit hunderten Millionen von Unicode-Escape-Sequenzen gefüllt ist:
{ "bio": "\u0055\u0055\u0055\u0055\u0055\u0055...(milliardenfach wiederholt)..." }
Auslösen der Schwachstelle: Die Webanwendung empfängt diese Nutzlast und übergibt sie an die
decode_json()
-Funktion von JSON::XS.Der Absturz: Der Integer-Überlauf tritt während der Puffergrößenberechnung auf. Der Parser versucht, Daten in einen viel zu kleinen Puffer zu schreiben, was einen Segfault verursacht. Der Perl-Worker-Prozess (z.B. ein CGI-Skript, ein mod_perl-Worker oder ein Starman-Webserver-Child) wird abrupt beendet.
Denial-of-Service: Wenn es sich um einen pre-forking-Webserver handelt, tötet der Absturz einen Worker-Prozess. Der Angreifer kann diese Anfrage wiederholt senden. Jede Anfrage tötet einen weiteren Worker, was schließlich alle verfügbaren Worker erschöpft und die Website für legitimen Verkehr unerreichbar macht.
Maßnahmen: Aktualisieren Sie umgehend das JSON::XS-Modul auf Version 4.04 oder höher.
cpanm JSON::XS
# oder
cpan JSON::XS
Falls eine sofortige Aktualisierung nicht möglich ist, implementieren Sie eine strikte Eingabevalidierung und Größenbeschränkungen für eingehende JSON-Daten auf dem Webserver (z.B. client_max_body_size
in Nginx) oder auf Anwendungsebene, bevor die Daten den JSON-Parser erreichen.
Artikel 2: CVE-2025-40929 - Cpanel::JSON::XS
Betroffenes Produkt: Cpanel::JSON::XS Anfällige Versionen: Vor 4.40 Gepatchte Version: 4.40 und höher Perl-Modul-Link: Cpanel::JSON::XS auf MetaCPAN
Technisches Detail: Cpanel::JSON::XS ist ein Fork von JSON::XS, der ursprünglich für cPanel erstellt wurde. Er legt einen Schwerpunkt auf Sicherheit und Zuverlässigkeit und enthält oft Fehlerbehebungen früher als das originale JSON::XS. Dennoch wurde unabhängig davon dieselbe Art von Integer-Pufferüberlauf-Schwachstelle gefunden.
Die Grundursache ist identisch: eine falsche Berechnung der erforderlichen Puffergröße bei der Verarbeitung eines JSON-Strings, der mit Escape-Sequenzen gefüllt ist, was zu einem Integer-Umlauf, einer zu geringen Pufferzuweisung und anschließender Speicherbeschädigung und einem Segfault führt.
Beispielszenario: Stellen Sie sich eine Multi-Tenant-SaaS-Plattform vor, in der die Benutzerkonfiguration als JSON in einer Datenbank gespeichert wird. Die Plattform verwendet Cpanel::JSON::XS, um diese Konfiguration zu lesen und zu schreiben.
- Normalbetrieb: Ein Benutzer speichert seine Profileinstellungen. Die Anwendung serialisiert den Perl-Hashref in JSON und speichert ihn ohne Probleme.
- Böswilliger Angriff: Ein Angreifer schafft es, einen manipulierten JSON-String über einen anderen API-Endpunkt (z.B. durch Setzen seines Anzeigenamens auf den manipulierten String, falls die Eingabevalidierung mangelhaft ist) in seine Konfiguration einzuschleusen.
- Auslösen der Schwachstelle: Später, wenn der Angreifer sein Profil aufruft oder wenn ein Hintergrundjob alle Benutzerdaten verarbeitet, ruft die Anwendung das manipulierte JSON aus der Datenbank ab und übergibt es an
Cpanel::JSON::XS::decode_json
. - Der Absturz: Der Integer-Überlauf wird ausgelöst. Der Prozess, der die Daten parsed – sei es ein Web-Worker, ein Cron-Job oder ein Admin-Tool – stürzt mit einem Segfault ab.
- Auswirkung: Dies könnte Hintergrundverarbeitungsjobs unterbrechen oder Administrationsoberflächen lahmlegen, die versuchen, den beschädigten Benutzerdatensatz zu verarbeiten. Dies ist ein persistenter DoS, da die schädliche Nutzlast so lange in der Datenbank verbleibt, bis sie manuell entfernt wird.
Maßnahmen: Aktualisieren Sie umgehend das Cpanel::JSON::XS-Modul auf Version 4.40 oder höher.
cpanm Cpanel::JSON::XS
Validieren und bereinigen Sie außerdem Daten immer, bevor Sie sie in einer Datenbank speichern, auch wenn Sie dem Serialisierungsprozess Ihrer eigenen Anwendung vertrauen. Ein Angreifer könnte einen anderen Weg finden, Daten direkt zu schreiben.
Artikel 3: CVE-2025-40930 - JSON::SIMD
Betroffenes Produkt: JSON::SIMD Anfällige Versionen: Vor 1.07 Gepatchte Version: 1.07 und höher Perl-Modul-Link: JSON::SIMD auf MetaCPAN
Technisches Detail: JSON::SIMD ist ein weiterer leistungsstarker JSON-Parser für Perl. Sein wichtigstes Unterscheidungsmerkmal ist die Verwendung von SIMD (Single Instruction, Multiple Data) CPU-Befehlen (wie SSE4.2 und AVX2), um noch höhere Parsing-Geschwindigkeiten zu erreichen. Die Schwachstelle ist erneut ein homogener Integer-Pufferüberlauf in der zugrundeliegenden C-Bibliothek, die die String-Unescaping-Logik handhabt.
Trotz seiner fortschrittlichen Parsing-Techniken war derselbe fundamentale Fehler in der arithmetischen Sicherheitsüberprüfung vorhanden. Das Fehlen von Grenzwertprüfungen bei der Puffergrößenberechnung machte ihn anfällig für denselben Angriffsvektor wie seine Gegenstücke.
Beispielszenario: Stellen Sie sich einen Hochdurchsatz-Datenverarbeitungspipeline in Perl vor, z.B. zum Parsen von Logdateien oder Nachrichten von einer Message Queue (z.B. RabbitMQ, Kafka), wobei jede Nachricht im JSON-Format vorliegt. JSON::SIMD wurde specifically für seine Geschwindigkeitsvorteile ausgewählt.
- Normalbetrieb: Die Pipeline konsumiert Tausende von gültigen JSON-Nachrichten pro Sekunde aus einer Warteschlange, parst sie und fügt die Daten in ein Data Warehouse ein.
- Böswilliger Angriff: Ein Angreifer erhält die Möglichkeit, eine Nachricht an die Warteschlange zu senden (z.B. due to einer Fehlkonfiguration oder einer separate Schwachstelle). Er veröffentlicht eine einzelne Nachricht, die einen Wert mit dem manipulierten langen String aus Escape-Sequenzen enthält.
- Auslösen der Schwachstelle: Ein Worker in der Pipeline nimmt diese Nachricht auf und versucht, sie mit JSON::SIMD zu parsen.
- Der Absturz: Der Parser stürzt sofort beim encounter des manipulierten Strings ab. Der gesamte Worker-Prozess stirbt.
- Auswirkung: In einem modernen verteilten System könnte ein Prozessabsturz einen automatischen Neustart auslösen. Die problematische Nachricht wird jedoch oft wieder in die Warteschlange zurückgelegt (z.B. weil sie nicht bestätigt wurde). Der neu gestartete Worker nimmt dieselbe schädliche Nachricht auf und stürzt erneut ab. Dies erzeugt eine Absturzschleife (Crash Loop), die die gesamte Datenpipeline anhält, bis die schädliche Nachricht identifiziert und manuell aus der Warteschlange entfernt wird.
Maßnahmen: Aktualisieren Sie umgehend das JSON::SIMD-Modul auf Version 1.07 oder höher.
cpanm JSON::SIMD
Implementieren Sie für Nachrichtenverarbeitungssysteme eine "Dead Letter Queue", um Nachrichten zu erfassen, die wiederholt zu Verarbeitungsfehlern führen. Dies verhindert Absturzschleifen und ermöglicht die Analyse der schädlichen Nutzlast.
Allgemeines Fazit und Best Practices
Diese drei CVEs heben eine gemeinsame Schwäche in leistungssensitiven C-Erweiterungen für Perl hervor: das Fehlen eines robusten Schutzes gegen Integer-Überläufe. Die Tatsache, dass drei unabhängige Module gleichzeitig betroffen waren, deutet auf einen weit verbreiteten Bedarf an sichereren Codierungspraktiken in den XS (C-Erweiterungs) Bibliotheken des Perl-Ökosystems hin.
Zusammenfassung der Maßnahmen:
- Sofort aktualisieren: Identifizieren Sie, welche dieser JSON-Parser Ihre Perl-Anwendungen verwenden, und aktualisieren Sie sie auf die gepatchten Versionen.
- Abhängigkeiten scannen: Verwenden Sie Tools wie
cpan-audit
(oder Dienste wie Dependabot für GitHub), um Ihre Codebasen und Anwendungen automatisch auf anfällige Abhängigkeiten zu scannen. - Defense in Depth:
- Eingabevalidierung: Legen Sie immer angemessene Größenbeschränkungen für eingehende Benutzerdaten fest.
- Sandboxing: Führen Sie netzwerkorientierte Perl-Prozesse (Web-Worker, Queue-Consumer) unter Aufsicht aus (z.B. mit
systemd
oder Kubernetes), damit sie nach einem Absturz automatisch neu gestartet werden können. - Monitoring: Überwachen Sie Ihre Anwendungen auf eine erhöhte Rate von Prozessabstürzen oder Segmentierungsfehlern, was ein früher Indikator für einen Ausnutzungsversuch sein kann.