
PHP 8.4.26 - Crítico - Remoto - OOM longjmp - CVE-2026-109618 PHP2Shell. Multipart em chunks não autenticado atinge o memory_limit antes do código da aplicação no Apache mod_php. Laboratório vs 8.4.27. Advisory RCE inferido.
Qualquer pessoa na internet pode se comunicar com seu site PHP da mesma forma que um navegador, sem senha. Nas últimas versões afetadas do PHP, é possível enviar uma requisição de upload de arquivo especialmente construída que faz o motor ficar sem memória enquanto ainda está lendo a requisição, antes de sua aplicação iniciar. O PHP então abandona esse trabalho com a requisição apenas parcialmente construída. O PHP Group demonstrou que a limpeza desse estado parcialmente construído pode se tornar execução remota de código como o worker web. Este laboratório comprova o salto por falta de memória no Apache mod_php 8.4.26 e que a 8.4.27 conclui a mesma requisição de forma limpa.
Classe: OOM longjmp / aborto na inicialização da requisição Alcance: Remoto
PHP 8.4.26 (php:8.4.26-apache) vs corrigido 8.4.27 - php.net
O Apache mod_php sempre executa o encerramento da requisição, mesmo quando a inicialização da requisição falhou. CVE-2026-109618 é um longjmp() em memory_limit durante o parse rfc1867 enquanto um bucket de HashTable já está visível para teardown. O laboratório é um POST multipart/form-data em chunks sem Content-Length utilizável e ~3000 cabeçalhos de parte extras sob memory_limit=8M. A 8.4.26 retorna Fatal error: Allowed memory size ... in Unknown on line 0. A 8.4.27 retorna o marcador de vivo e executa index.php. O GET do worker após o gatilho ainda retorna 200 em ambos os lados. O RCE conforme o advisory, como o worker do Apache, é inferido a partir do GHSA.
| ID | CVE-2026-109618 |
| Advisory | GHSA-w8hw-w9fx-j79w |
| Classe | OOM longjmp / aborto na inicialização da requisição (RCE inferido do advisory) |
| Alcance | Remoto (HTTP não autenticado) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Crítico: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Produto | PHP |
| Afetado | PHP 8.2 antes de 8.2.35, 8.3 antes de 8.3.36, 8.4 antes de 8.4.27, 8.5 antes de 8.5.12 (fixação do laboratório 8.4.26) |
| Corrigido | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 out 2026) |
| Autenticação | nenhuma |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Relacionado: CVE-2026-109619 UAF de worker-global obsoleto (par PHP2Shell).
| Método | Sink | Privilégio |
|---|---|---|
POST multipart/form-data não autenticado com Transfer-Encoding: chunked, muitos cabeçalhos de parte extras, memory_limit finito | parse rfc1867 / longjmp de zend_bailout durante php_request_startup | Disponibilidade (comprovado no laboratório): aborta a inicialização da requisição antes de index.php na 8.4.26 (Unknown on line 0). Integridade (inferido): o encerramento percorre $_POST/$_FILES parcialmente inicializados; o fornecedor demonstrou RCE como o worker do Apache (www-data na imagem oficial). Reconhecimento (inferido): vazamento residual do heap da requisição. |
| Mesmo gatilho na 8.4.27 | OOM suave atrasado | Fechado (comprovado no laboratório): marcador de vivo HTTP 200, files=1, o worker permanece ativo. |
| GET após o gatilho | worker ainda vivo | Comprovado no laboratório: esta fixação não gerou SIGSEGV nem registrou zend_mm_heap corrupted. |
Login, rota da aplicação, .so personalizado, reverse shell | n/a | Fechado. Nenhuma tentativa de controle de RIP. |
Comprovado no laboratório vs inferido: o diferencial de OOM-longjmp entre 8.4.26 e 8.4.27 é comprovado no laboratório. A UAF de morte do worker e o RCE são inferidos a partir de GHSA-w8hw-w9fx-j79w. O FPM normalmente encerra o processo filho em caso de falha na inicialização; um exploit completo de FPM não foi demonstrado pelo fornecedor para este CVE.
Requer: Apache apache2handler. memory_limit finito (não defina -1; essa é a mitigação). Parse multipart habilitado. php:8.4.26-apache oficial vs php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
ou cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) vs 127.0.0.1:18221 (8.4.27). Projeto Compose cve-2026-109618. Testemunha CVE-2026-109618-OOM-WITNESS. Última linha:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
Apenas laboratório autorizado. Ele se comunica com o loopback.
Atualize para PHP 8.4.27 (ou 8.2.35 / 8.3.36 / 8.5.12). O patch substitui o longjmp() de OOM por um soft OOM adiado no próximo ponto seguro da VM e um _exit() rígido acima de um limite mais alto (31c0ea7). Até então: memory_limit=-1 no admin que as aplicações não podem sobrescrever; mantenha post_max_size baixo; limite as partes e cabeçalhos multipart. Não use RLIMIT_AS ou RLIMIT_DATA.
Abraxas Labs [email protected]