
Prova de conceito de exploit para CVE-2022-31630, uma vulnerabilidade de leitura fora dos limites na extensão GD do PHP. Demonstra falha e divulgação de memória em versões afetadas do PHP. Inclui laboratório baseado em Docker para testes seguros.
#CVE-2022-31630 – Exploit de Prova de Conceito
Aviso: Este código foi criado apenas para fins educacionais e testes em ambiente de laboratório isolado. O uso em outros sistemas sem autorização é ilegal e irresponsável.
📌 Descrição
CVE-2022-31630 é uma vulnerabilidade de leitura fora dos limites (Out-of-Bounds – OOB) na extensão GD do PHP, especificamente na função imageloadfont(). Essa vulnerabilidade permite que um atacante que consiga controlar o arquivo de fonte carregado por uma aplicação PHP leia dados fora dos limites do buffer alocado. Possíveis impactos:
· Denial of Service (crash) – a aplicação para de responder. · Information Disclosure – dados sensíveis da memória podem ser lidos (por exemplo, chaves, tokens ou outros fragmentos de dados).
Versões do PHP Afetadas
· 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 é a primeira versão que recebeu o patch para este CVE. Este repositório fornece uma Prova de Conceito (PoC) para demonstrar a diferença de comportamento entre a versão vulnerável (≤ 7.4.32) e a versão corrigida (≥ 7.4.33).
🔍 Detalhes Técnicos
A vulnerabilidade tem origem na falta de validação de entrada ao ler arquivos de fonte GD (formato .gdf). O arquivo de fonte possui a seguinte estrutura de cabeçalho:
| Offset de bytes | Tamanho (bytes) | Descrição |
|---|
| 0 | 2 | Magic number (0x01BE) |
| 2 | 2 | Número de caracteres (nchars) |
| 4 | 2 | Largura do caractere (width) (em pixels) |
| 6 | 2 | Altura do caractere (height) |
| 8 | 2 | Número de bytes por caractere (char_offset) |
Se o valor de width for definido como muito grande (por exemplo, 65535), o cálculo do tamanho do buffer para armazenar o bitmap do caractere fica incorreto. Como resultado, o buffer alocado é pequeno demais. Quando a função imagechar() lê caracteres dessa fonte, ela acessa memória fora dos limites do buffer – é isso que é chamado de Out-of-Bounds Read.
🧪 Requisitos de Teste
· Docker (para executar o ambiente isolado) · PHP versão 7.4.32 ou 7.4.33 (você pode usar as imagens Docker php:7.4.32-cli / php:7.4.33-cli) · Extensão GD (será instalada dentro do container)
🚀 Como Usar a PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
Para testar a versão vulnerável (7.4.32):
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
Para testar a versão corrigida (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
📊 Exemplo de Saída
| Versão do PHP | Resultado Esperado |
|---|---|
| 7.4.32 (vulnerável) | O programa trava com Segmentation Fault ou ocorre vazamento de memória (dados fictícios da memória são visíveis). |
| 7.4.33 (corrigida) | Execução termina normalmente, o arquivo de imagem output.png é salvo, sem crash. |
🛡️ Mitigação
· Atualize o PHP para a versão mais recente que contenha o patch: · PHP 7.4.33 ou mais recente · PHP 8.0.25 ou mais recente · PHP 8.1.12 ou mais recente · Se não for possível atualizar imediatamente, desative a extensão GD ou a função imageloadfont() se não for realmente necessária. · Aplique o princípio do menor privilégio (least privilege) na aplicação para minimizar o impacto caso ocorra vazamento de memória.
📚 Referências
· CVE-2022-31630 no NVD · Commit do patch no php-src · Anúncios de lançamento do PHP
⚠️ Aviso Legal
Este repositório é fornecido para fins educacionais e de pesquisa em segurança. O autor não se responsabiliza pelo uso indevido deste código. Certifique-se de testar apenas em ambientes que você possui ou para os quais tenha obtido autorização por escrito.
Feito para a comunidade de segurança cibernética da Indonésia.