
Exploit de preuve de concept pour CVE-2022-31630, une vulnérabilité de lecture hors limites dans l'extension GD de PHP. Montre un crash et une divulgation de mémoire dans les versions de PHP affectées. Inclut un laboratoire basé sur Docker pour des tests sécurisés.
#CVE-2022-31630 – Preuve de Concept Exploit
Avertissement : Ce code est créé uniquement à des fins éducatives et de test dans un environnement de laboratoire isolé. L'utiliser sur d'autres systèmes sans autorisation est illégal et irresponsable.
📌 Description
CVE-2022-31630 est une vulnérabilité de lecture hors limites (Out-of-Bounds Read) dans l'extension GD de PHP, plus précisément dans la fonction imageloadfont(). Cette vulnérabilité permet à un attaquant qui contrôle le fichier de police chargé par une application PHP de lire des données en dehors des limites du tampon alloué. Les impacts possibles sont :
· Denial of Service (crash) – l'application cesse de répondre. · Information Disclosure – des données sensibles de la mémoire peuvent être lues (par exemple clés, jetons ou fragments de données).
Versions PHP concernées
· PHP 7.4.x avant 7.4.33 · PHP 8.0.x avant 8.0.25 · PHP 8.1.x avant 8.1.12
PHP 7.4.33 est la première version à recevoir un correctif pour cette CVE. Ce dépôt fournit une Preuve de Concept (PoC) pour montrer la différence de comportement entre une version vulnérable (≤ 7.4.32) et une version corrigée (≥ 7.4.33).
🔍 Détails techniques
La vulnérabilité provient d'un manque de validation des entrées lors de la lecture d'un fichier de police GD (format .gdf). Le fichier de police a la structure d'en-tête suivante :
| Décalage (octet) | Taille (octets) | Description |
|---|---|---|
| 0 | 2 | Magic number (0x01BE) |
| 2 | 2 | Nombre de caractères (nchars) |
| 4 | 2 | Largeur du caractère (width) (en pixels) |
| 6 | 2 | Hauteur du caractère (height) |
| 8 | 2 | Nombre d'octets par caractère (char_offset) |
Si la valeur de width est rendue très grande (par exemple 65535), le calcul de la taille du tampon pour stocker le bitmap du caractère devient erroné. En conséquence, le tampon alloué est trop petit. Lorsque la fonction imagechar() lit ensuite un caractère de cette police, elle accède à la mémoire hors des limites du tampon – c'est ce qu'on appelle une lecture hors limites (Out-of-Bounds Read).
🧪 Prérequis de test
· Docker (pour exécuter un environnement isolé) · PHP version 7.4.32 ou 7.4.33 (utiliser les images Docker php:7.4.32-cli / php:7.4.33-cli) · Extension GD (sera installée à l'intérieur du conteneur)
🚀 Comment utiliser la PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
Pour tester la version vulnérable (7.4.32) :
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
Pour tester la version corrigée (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
📊 Exemple de sortie
| Version PHP | Résultat attendu |
|---|---|
| 7.4.32 (vulnérable) | Le programme plante avec une erreur de segmentation (Segmentation Fault) ou une fuite mémoire (données fictives visibles depuis la mémoire). |
| 7.4.33 (corrigée) | Exécution terminée normalement, le fichier image output.png est sauvegardé, pas de plantage. |
🛡️ Atténuation
· Mettez à jour PHP vers la version la plus récente contenant le correctif : · PHP 7.4.33 ou ultérieur · PHP 8.0.25 ou ultérieur · PHP 8.1.12 ou ultérieur · Si vous ne pouvez pas mettre à jour immédiatement, désactivez l'extension GD ou la fonction imageloadfont() si elle n'est pas vraiment nécessaire. · Appliquez le principe du moindre privilège sur l'application pour minimiser l'impact en cas de fuite mémoire.
📚 Références
· CVE-2022-31630 sur NVD · Commit du correctif dans php-src · Annonces de version PHP
⚠️ Avertissement
Ce dépôt est fourni à des fins éducatives et de recherche en sécurité. L'auteur décline toute responsabilité en cas d'utilisation abusive de ce code. Assurez-vous de ne tester que dans un environnement que vous possédez ou pour lequel vous avez obtenu une autorisation écrite.
Créé pour la communauté de cybersécurité indonésienne.