
Exploit para CVE-2026-17544: escrita OOB (fora dos limites) do bcmath do PHP convertida em RCE somente em memória, contornando disable_functions e open_basedir com um resolvedor sem offsets em tempo de execução.
Uma prova de conceito armada para CVE-2026-17544, uma escrita fora dos limites na extensão bcmath reescrita do PHP (bc_str2num). Isso transforma a falha publicamente conhecida de somente DoS em uma primitiva completa e universal de execução remota de código somente em memória que contorna disable_functions e open_basedir ao mesmo tempo.
Somente uso autorizado para pesquisa / educação. Execute isto apenas contra sistemas seus ou nos quais você tenha autorização explícita para testar.
![]()
bc_str2num trunca uma parte fracionária ao usar um scale manual, remove novamente os zeros à direita, mas não atualiza fractional_end. O buffer é dimensionado para o comprimento após o novo corte, enquanto a cópia usa o comprimento anterior ao corte → escrita zero controlada fora dos limites no heap Zend MM.zend_string vizinho (comprimento preservado) → use-after-free por dessincronização de refcount → leitura/escrita relativa com string gigante → leitura arbitrária absoluta à prova de falhas → resolução de símbolos em tempo de execução → uma chamada de função nativa totalmente somente com dados.zend_class_entry falso + function_table inline + zend_function{ handler = zif_shell_exec } falsa e então a chama como um método. A saída do comando é retornada como uma string e entregue na resposta/stdout..data e o símbolo alvo são todos resolvidos em tempo de execução por varredura de memória — portanto, um único arquivo funciona em diferentes builds e distribuições.Esta é uma primitiva de escape de sandbox / pós-exploração, não um RCE apenas com entrada remota.
| Cenário | Resultado |
|---|---|
O atacante já consegue executar PHP (webshell, desserialização, sink de eval), mas está limitado por disable_functions + open_basedir | ✅ RCE nativo (este PoC) |
Uma única chamada bcmath com entrada do atacante fornece uma escrita zero OOB cega, sem retorno. O RCE completo exige execução arbitrária de PHP para preparar o heap, construir as primitivas de leitura/escrita e executar o resolvedor — nada disso pode ser expresso como um argumento de função. Portanto, o teto realista para exposição apenas com entrada é um ataque remoto de negação de serviço; a execução de código exige um contexto existente de execução de PHP, do qual este PoC então libera o sandbox.
O bug existe somente no bcmath reescrito (linha PHP 8.4 / 8.5):
Verificado de ponta a ponta (uid=0, saída capturada) em PHP 8.4.23 e PHP 8.5.8, amd64, com o mesmo arquivo não modificado — o layout das structs Zend é idêntico entre 8.4 / 8.5.
bcmath habilitado..text até o cabeçalho ELF; isso é seguro em qualquer binário com mapeamento contíguo. Apenas builds artificiais -z separate-code com lacunas não mapeadas de 2 MB não podem ser resolvidos automaticamente por uma varredura cega (não vistos em produção).exit() por requisição não derrube o servidor: php-fpm, Apache mod_php ou o servidor embutido com PHP_CLI_SERVER_WORKERS>0.php exploit.php "id; uname -a"
Implante como, ex.: shell.php, depois:
GET /shell.php?cmd=id
POST cmd=id
A saída do comando é capturada via zif_shell_exec e gravada no corpo da resposta.
bccomp() vulnerável para que a escrita zero OOB atinja apenas o refcount de um zend_string vizinho (comprimento preservado).zend_reference falso (via indireção) fornece uma leitura arbitrária absoluta à prova de falhas que nunca toca o cabeçalho com refcount do alvo..text vazado: desça em passos de página até a magic ELF (base), analise os cabeçalhos de programa para encontrar .data e então varra .data em busca do zend_function_entry de shell_exec cujo handler aponte para .text.zend_class_entry falso, uma inline com um único bucket (hash correto, cadeia de colisão terminada) e uma falsa cujo handler seja ; corrompa o ponteiro de classe do objeto de sondagem e invoque o método. A saída é retornada e exibida.exploit.php — o exploit universal somente em memória (CLI + web).Fornecido para pesquisa e educação em segurança. O autor não é responsável pelo uso indevido. Não implante contra sistemas nos quais você não está autorizado a testar.
A aplicação apenas chama uma função bcmath com entrada bruta do usuário, ex.: bccomp($_POST['v']) | ❌ Apenas DoS / crash |
| Ramo do PHP | Vulnerável |
|---|
| 7.x, 8.0 – 8.3 | Não (libbcmath antigo, bc_str2num diferente) |
| 8.4.0 – 8.4.23 | Sim |
| 8.5.0 – 8.5.8 | Sim |
| ≥ 8.4.24 / ≥ 8.5.9 | Corrigido |
function_tablezend_stringzend_internal_functionzif_shell_exec