[GIT-PULLS] [php-src] PR #23380: Fix GH-23377: Buffer overflow in hash_pbkdf2() with a large output length

[email protected] (lazerg)
Newsgroups php.git-pulls
Message-ID <[email protected]>
Pull Request: https://github.com/php/php-src/pull/23380
Author: lazerg

`hash_pbkdf2()` sizes the digest buffer with `ceil((float) length / 2.0)` and the block count with `ceil((float) digest_length / (float) ops->digest_size)`. A `float` carries 24 bits of mantissa, so past 2^24 the conversion rounds and both counts come out wrong: rounding up makes `zend_bin2hex()` write past the end of the return string, rounding down leaves the tail of the string uninitialized. `hash_pbkdf2('md5', 'password', 'salt', 1, 268435473)` writes 8 bytes out of bounds under ASAN.

Both counts are exact in integer arithmetic, so this replaces them with round-up divisions. `<math.h>` had no other user in the file.

The odd `length` case from the report is in bounds on its own: `zend_string_alloc(length)` reserves `length + 1` bytes and `2 * ceil(length / 2) == length + 1`, so the last hexit lands on the terminator byte that gets overwritten on the next line.

Fixes #23377
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.