
#CVE-2022-31630 – Proof of Concept Exploit
Advertencia: Este código fue creado únicamente con fines educativos y de prueba en un entorno de laboratorio aislado. El uso en otros sistemas sin autorización es ilegal e irresponsable.
📌 Descripción
CVE-2022-31630 es una vulnerabilidad de lectura fuera de los límites (Out-of-Bounds Read, OOB) en la extensión GD de PHP, concretamente en la función imageloadfont(). Esta vulnerabilidad permite a un atacante que pueda controlar el archivo de fuente cargado por una aplicación PHP leer datos fuera de los límites del búfer asignado. Los posibles impactos son:
· Denial of Service (caída) – la aplicación deja de responder. · Divulgación de información – se pueden leer datos confidenciales de la memoria (por ejemplo, claves, tokens u otros fragmentos de datos).
Versiones de PHP afectadas
· PHP 7.4.x anteriores a 7.4.33 · PHP 8.0.x anteriores a 8.0.25 · PHP 8.1.x anteriores a 8.1.12
PHP 7.4.33 es la primera versión que recibió el parche para este CVE. Este repositorio proporciona una prueba de concepto (PoC) para mostrar la diferencia de comportamiento entre la versión vulnerable (≤ 7.4.32) y la versión parcheada (≥ 7.4.33).
🔍 Detalles técnicos
La vulnerabilidad radica en la falta de validación de entrada al leer archivos de fuente GD (formato .gdf). El archivo de fuente tiene la siguiente estructura de cabecera:
Desplazamiento (byte) Tamaño (byte) Descripción 0 2 Magic number (0x01BE) 2 2 Número de caracteres (nchars) 4 2 Ancho del carácter (width) (en píxeles) 6 2 Alto del carácter (height) 8 2 Número de bytes por carácter (char_offset)
Si el valor de width se establece muy grande (por ejemplo, 65535), el cálculo del tamaño del búfer para almacenar el mapa de bits del carácter se vuelve incorrecto. En consecuencia, el búfer asignado es demasiado pequeño. Cuando la función imagechar() lee posteriormente un carácter de esa fuente, accede a memoria fuera de los límites del búfer; esto es lo que se denomina lectura fuera de los límites (Out-of-Bounds Read).
🧪 Requisitos de prueba
· Docker (para ejecutar el entorno aislado) · PHP versión 7.4.32 o 7.4.33 (puede usar las imágenes de Docker php:7.4.32-cli / php:7.4.33-cli) · Extensión GD (se instalará dentro del contenedor)
🚀 Cómo usar el PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
Para probar la versión vulnerable (7.4.32):
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
Para probar la versión parcheada (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
📊 Ejemplo de salida
Versión de PHP Resultado esperado 7.4.32 (vulnerable) El programa falla con un error de segmentación (Segmentation Fault) o se produce una fuga de memoria (se observan datos basura de la memoria). 7.4.33 (parcheada) La ejecución finaliza con normalidad, el archivo de imagen output.png se guarda y no hay fallos.
🛡️ Mitigación
· Actualice PHP a la versión más reciente que incluya el parche: · PHP 7.4.33 o posterior · PHP 8.0.25 o posterior · PHP 8.1.12 o posterior · Si no puede actualizar de inmediato, desactive la extensión GD o la función imageloadfont() si no es realmente necesaria. · Aplique el principio de privilegio mínimo (least privilege) en la aplicación para minimizar el impacto en caso de fuga de memoria.
📚 Referencias
· CVE-2022-31630 en NVD · Commit del parche en php-src · PHP Release Announcements
⚠️ Descargo de responsabilidad
Este repositorio se proporciona con fines educativos y de investigación en seguridad. El autor no se hace responsable del mal uso de este código. Asegúrese de probar únicamente en entornos que le pertenezcan o para los que haya obtenido autorización por escrito.
Creado para la comunidad de ciberseguridad de Indonesia.