PHP5.6.40がリリースされた

ようやく2018年末に[RIPになった](https://qiita.com/bezeklik/items/72d1ff8393f66673e2bc)PHP5.6なのですが、2019/01/10に[5.6.40がリリースされました](http://php.net/archive/2019.php#id2019-01-10-4)。
なんで？

# PHP 5.6.40

## Fixed bug [#77269](https://bugs.php.net/bug.php?id=77269) (efree() on uninitialized Heap data in imagescale leads to use-after-free).

[imagescale](http://php.net/manual/ja/function.imagescale.php)関数にユーザ入力値を突っ込むと[Use After Free](http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html)攻撃される可能性があるという脆弱性。
未初期化のヒープに[efree](http://php.net/manual/ja/internals2.memory.management.php#internals2.memory.management.apis)が走ってinvalid pointerのエラーが出るということらしいです。

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

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


## Fixed bug [#77270](https://bugs.php.net/bug.php?id=77270) (imagecolormatch Out Of Bounds Write on Heap).

[imagecolormatch](http://php.net/manual/ja/function.imagecolormatch.php)関数が割り当てられたメモリを超えて書き込んでしまうというバグ。

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

2番目の引数の画像の[colorsTotal](http://www2s.biglobe.ne.jp/~Nori/ruby/ja/gd-eg/pen.html#colorsTotal)を外部から操作することができれば、確保すべきメモリ容量の計算を間違ってしまうということのようです。

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

## Fixed bug [#77370](https://bugs.php.net/bug.php?id=77370) (Buffer overflow on mb regex functions - fetch_token).

[mb_split](http://php.net/manual/ja/function.mb-split.php)と[mb_ereg](http://php.net/manual/ja/function.mb-ereg.php)に半端なマルチバイト文字列を与えるとバッファオーバーフローするというバグ。
5.6.39、7.0.33、7.1.25で発生し、7.2.13、7.3.0では起こりません。

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

えらい単純だな。

## Fixed bug [#77371](https://bugs.php.net/bug.php?id=77371) (heap buffer overflow in mb regex functions - compile_string_node).

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

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

## Fixed bug [#77381](https://bugs.php.net/bug.php?id=77381) (heap buffer overflow in multibyte match_at).

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

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

## Fixed bug [#77382](https://bugs.php.net/bug.php?id=77382) (heap buffer overflow due to incorrect length in expand_case_fold_string).

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

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

## Fixed bug [#77385](https://bugs.php.net/bug.php?id=77385) (buffer overflow in fetch_token).

さらに同上。

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

## Fixed bug [#77394](https://bugs.php.net/bug.php?id=77394) (Buffer overflow in multibyte case folding - unicode).

 #77382とほぼ同じ。

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

## Fixed bug [#77418](https://bugs.php.net/bug.php?id=77418) (Heap overflow in utf32be_mbc_to_code).

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

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

## Fixed bug [#77247](https://bugs.php.net/bug.php?id=77247) (heap buffer overflow in phar_detect_phar_fname_ext).

[不正なpharファイル](https://github.com/whiteHat001/FUZZ_POC/blob/master/poc.phar)を読み込むとバッファオーバーフローするというバグ。
と書いてあるのですが、手元のWindows版7.3.0では発生しませんでした。なぜなのか。

修正内容が[+1を-1にした](https://bugs.php.net/patch-display.php?bug_id=77247&patch=77247&revision=latest)だけと一見誰でもわかりそうなものですが、こんなの絶対気付けませんよね。

## Fixed bug [#77242](https://bugs.php.net/bug.php?id=77242) (heap out of bounds read in xmlrpc_decode()).

[xmlrpc_decode](http://php.net/manual/ja/function.xmlrpc-decode.php)がバッファオーバーフローするバグ。

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

手元のWindows版7.3.0には[XML-RPC](http://php.net/manual/ja/book.xmlrpc.php)が入ってなかったわ。

## Fixed bug [#77380](https://bugs.php.net/bug.php?id=77380) (Global out of bounds read in xmlrpc base64 code).

 #77242とほぼ同じです。

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

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


# 感想

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

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

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