PHP
PHP5
PHP5.6

PHP5.6.40がリリースされた

ようやく2018年末にRIPになったPHP5.6なのですが、2019/01/10に5.6.40がリリースされました
なんで?

PHP 5.6.40

Fixed bug #77269 (efree() on uninitialized Heap data in imagescale leads to use-after-free).

imagescale関数にユーザ入力値を突っ込むとUse After Free攻撃される可能性があるという脆弱性。
未初期化のヒープにefreeが走ってinvalid pointerのエラーが出るということらしいです。

$img = imagecreate(pow(2, 27), 0x01);
var_dump(imagescale($img, 0x01, 0x01, 20));
echo "Execution continues!\n";

そもそも外部入力から横幅2^27ピクセルの画像を作成できる時点でプログラムのバグなのではという気がしないでもない。

Fixed bug #77270 (imagecolormatch Out Of Bounds Write on Heap).

imagecolormatch関数が割り当てられたメモリを超えて書き込んでしまうというバグ。

$img1 = imagecreatetruecolor(0xfff, 0xfff);
$img2 = imagecreate(0xfff, 0xfff);
imagecolorallocate($img2, 0, 0, 0);
imagesetpixel($img2, 0, 0, 255);
imagecolormatch($img1, $img2);

2番目の引数の画像のcolorsTotalを外部から操作することができれば、確保すべきメモリ容量の計算を間違ってしまうということのようです。

ハッカーならここから任意コード実行に持って行けるのでしょう。
私にはさっぱりですが。

Fixed bug #77370 (Buffer overflow on mb regex functions - fetch_token).

mb_splitmb_eregに半端なマルチバイト文字列を与えるとバッファオーバーフローするというバグ。
5.6.39、7.0.33、7.1.25で発生し、7.2.13、7.3.0では起こりません。

php -r 'var_dump(mb_split("   \xfd",""));'

えらい単純だな。

Fixed bug #77371 (heap buffer overflow in mb regex functions - compile_string_node).

#77370のパッチを適用したら別のバグが発生したという、よくある話。

php -r 'var_dump(mb_ereg("()0\xfc00000\xfc00000\xfc00000\xfc",""));'

Fixed bug #77381 (heap buffer overflow in multibyte match_at).

#77370、77371と現象、発生条件ともにほとんど同じです。
ひとつ見つかったので周囲を重点的に調査した結果ということでしょう。

php -r 'var_dump(mb_ereg("000||0\xfa","0"));'

Fixed bug #77382 (heap buffer overflow due to incorrect length in expand_case_fold_string).

同上。
(?i)を含む正規表現パターンはメモリ容量の求め方が異なるようです。

php -r 'var_dump(mb_ereg("(?i)000000000000000000000\xf0",""));'

Fixed bug #77385 (buffer overflow in fetch_token).

さらに同上。

php -r 'var_dump(mb_ereg("0000\\"."\xf5","0"));'

Fixed bug #77394 (Buffer overflow in multibyte case folding - unicode).

#77382とほぼ同じ。

php -r 'var_dump(mb_ereg("(?i)FFF00000000000000000\xfd",""));'

Fixed bug #77418 (Heap overflow in utf32be_mbc_to_code).

これはPHP7.2.13や7.3.0でも発生するよ、と書いてあるのですが、手元のWindows版7.3.0では発生しませんでした。

php -r 'mb_regex_encoding("UTF-32");var_dump(mb_split("\x00\x00\x00\x5c\x00\x00\x00B","000000000000000000000000000000"));'

Fixed bug #77247 (heap buffer overflow in phar_detect_phar_fname_ext).

不正なpharファイルを読み込むとバッファオーバーフローするというバグ。
と書いてあるのですが、手元のWindows版7.3.0では発生しませんでした。なぜなのか。

修正内容が+1を-1にしただけと一見誰でもわかりそうなものですが、こんなの絶対気付けませんよね。

Fixed bug #77242 (heap out of bounds read in xmlrpc_decode()).

xmlrpc_decodeがバッファオーバーフローするバグ。

$a=xmlrpc_decode(base64_decode("PD94bWwgdmVyc2lvbmVuY29kaW5nPSJJU084ODU5NyKkpKSkpKSkpKSkpKSkpKSkpKSkpKSk"));

手元のWindows版7.3.0にはXML-RPCが入ってなかったわ。

Fixed bug #77380 (Global out of bounds read in xmlrpc base64 code).

#77242とほぼ同じです。

$a=xmlrpc_decode(base64_decode("PGJhc2U2ND7CkzwvYmFzZTY0Pgo="));

むしろ正直XML-RPC自体Deprecatedでいいんじゃないですかね。
あとSOAPとかYarも要らんじゃろ。
こういった、他言語ではふつう外部ライブラリになってるような拡張がPHPコアに入ってるのが、PHPにバグが多い原因のひとつですよね。

感想

なんとか致命傷で済んだ的なバグだらけですね。
未だにこれだけメモリ関連のバグが出てくるのは驚きです。

私はもちろん全くさっぱり気付いていませんでしたが。
PHP脳はmallocがわからないのだ。

だいたいは7.1とか7.2向けに修正したものが、5.6や7.0にも同じバグがあるから一緒になおしたよ的な感じのようです。
でもPHP7.0.34はリリースされていません。なぜなのか。