
#CVE-2022-31630 – Proof of Concept Exploit
Warnung: Dieser Code dient ausschließlich zu Bildungs- und Testzwecken in einer isolierten Laborumgebung. Die Verwendung auf anderen Systemen ohne Genehmigung ist illegal und unverantwortlich.
📌 Beschreibung
CVE-2022-31630 ist eine Out-of-Bounds-Read-Schwachstelle (OOB-Read) in der PHP-GD-Erweiterung, genauer gesagt in der Funktion imageloadfont(). Diese Schwachstelle ermöglicht es einem Angreifer, der die von einer PHP-Anwendung geladene Font-Datei kontrollieren kann, Daten außerhalb der Grenzen des zugewiesenen Puffers zu lesen. Mögliche Auswirkungen:
· Denial of Service (Absturz) – die Anwendung reagiert nicht mehr. · Information Disclosure – sensible Daten aus dem Speicher können gelesen werden (z. B. Schlüssel, Tokens oder andere Datenfragmente).
Betroffene PHP-Versionen
· PHP 7.4.x vor 7.4.33 · PHP 8.0.x vor 8.0.25 · PHP 8.1.x vor 8.1.12
PHP 7.4.33 ist die erste Version, die einen Patch für diese CVE erhielt. Dieses Repository stellt einen Proof of Concept (PoC) bereit, um den Unterschied im Verhalten zwischen verwundbaren Versionen (≤ 7.4.32) und gepatchten Versionen (≥ 7.4.33) zu demonstrieren.
🔍 Technische Details
Die Schwachstelle liegt in der fehlenden Eingabevalidierung beim Lesen von GD-Fontdateien (Format .gdf). Fontdateien haben die folgende Header-Struktur:
Byte-Offset Größe (Byte) Beschreibung 0 2 Magic Number (0x01BE) 2 2 Anzahl der Zeichen (nchars) 4 2 Zeichenbreite (width) (in Pixeln) 6 2 Zeichenhöhe (height) 8 2 Anzahl der Bytes pro Zeichen (char_offset)
Wenn der Wert von width sehr groß gesetzt wird (z. B. 65535), wird die Berechnung der Puffergröße zum Speichern der Zeichen-Bitmaps fehlerhaft. Infolgedessen wird der zugewiesene Puffer zu klein. Wenn die Funktion imagechar() anschließend ein Zeichen aus dieser Font liest, greift sie auf Speicher außerhalb der Puffergrenzen zu – dies wird als Out-of-Bounds Read bezeichnet.
🧪 Testanforderungen
· Docker (zum Ausführen einer isolierten Umgebung) · PHP-Version 7.4.32 oder 7.4.33 (verwendbar über die Docker-Images php:7.4.32-cli / php:7.4.33-cli) · GD-Erweiterung (wird im Container installiert)
🚀 Verwendung des PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
Zum Testen der verwundbaren Version (7.4.32):
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
Zum Testen der gepatchten Version (7.4.33):
docker run -it --rm -v $(pwd):/app php:7.4.33-cli bash
cd /app
apt-get update
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype --with-jpeg
docker-php-ext-install gd
php exploit_cve-2022-31630.php
📊 Beispielausgabe
PHP-Version Erwartetes Ergebnis 7.4.32 (verwundbar) Das Programm stürzt mit Segmentation Fault ab oder es kommt zu einem Speicherleck (Dummy-Daten aus dem Speicher werden sichtbar). 7.4.33 (gepatcht) Die Ausführung wird normal abgeschlossen, die Bilddatei output.png wird gespeichert, kein Absturz.
🛡️ Mitigation
· PHP auf die neueste Version mit enthaltenem Patch aktualisieren: · PHP 7.4.33 oder neuer · PHP 8.0.25 oder neuer · PHP 8.1.12 oder neuer · Falls ein Update nicht sofort möglich ist, die GD-Erweiterung oder die Funktion imageloadfont() deaktivieren, wenn sie nicht wirklich benötigt wird. · Das Prinzip der geringsten Privilegien (Least Privilege) in der Anwendung anwenden, um die Auswirkungen eines möglichen Speicherlecks zu minimieren.
📚 Referenzen
· CVE-2022-31630 bei NVD · Patch-Commit in php-src · PHP Release Announcements
⚠️ Haftungsausschluss
Dieses Repository wird zu Bildungs- und Sicherheitsforschungszwecken bereitgestellt. Der Autor übernimmt keine Verantwortung für den Missbrauch dieses Codes. Stellen Sie sicher, dass Sie nur in Umgebungen testen, die Ihnen gehören oder für die Sie eine schriftliche Genehmigung erhalten haben.
Erstellt für die indonesische Cybersicherheits-Community.