ArrayIteratorは、ソート中に自分自身を変更することはできません。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。
ところで何となくJVNを見ていたらJVNDB-2014-003302、CVE-2014-4698というものを発見しました。
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003302.html
https://bugs.php.net/bug.php?id=67539
解放して、もう使わなくなったはずのメモリにアクセスしてしまうバグだそうです。
場合によってはサービス運用妨害に至るそうです。
これはバッファオーバーランなのかな?
2014/06/29に発見され、2014/07/02に修正されています。
当然PHP5.6.0RC2の時点では修正されていません。
エラーは出ませんが、実はC言語レベルでは不正なメモリ読み出しが発生しています。
そのあたりはMemcheckで確認可能です。
あとはArrayIteratorの中身をうまいこと書き換えれば、メモリの不正な読み出し箇所にコードを忍ばせて何か攻撃できるかもしれません。
が、そのあたりは詳しくないので具体的にどのようにすればいいかはよくわかりません。
というか、そもそもソート中に中身を書き換えるようなソースを書く方が悪いだろこれ。
JVNでの深刻度は4.6ですが、本当にこれで影響を受けるシステムが存在するのか疑問に思うレベル。
ちなみに
意味がわからぬ。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。
<?php
$arrayIterator = new ArrayIterator(['A','B']);
$GLOBALS['arrayIterator'][0] = 'C'; // 問題なし
// ソート中に中身を変更
function badsort($a, $b) {
$GLOBALS['arrayIterator'][0] = 'D';
return $a > $b;
}
$arrayIterator->uksort('badsort'); // Warning: Modification of ArrayObject during sorting is prohibited
Warningが発生し、中身の変更は拒否されます。ところで何となくJVNを見ていたらJVNDB-2014-003302、CVE-2014-4698というものを発見しました。
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003302.html
https://bugs.php.net/bug.php?id=67539
解放して、もう使わなくなったはずのメモリにアクセスしてしまうバグだそうです。
場合によってはサービス運用妨害に至るそうです。
これはバッファオーバーランなのかな?
2014/06/29に発見され、2014/07/02に修正されています。
当然PHP5.6.0RC2の時点では修正されていません。
<?php
$arrayIterator = new ArrayIterator(['A','B']);
// ソート中にunserialize
function badsort($a, $b) {
$GLOBALS['it']->unserialize($GLOBALS['it']->serialize());
return $a > $b;
}
$a->uksort('badsort'); // エラーは出ない
unserializeだとエラーが発生せずに中身が書き換えられます。エラーは出ませんが、実はC言語レベルでは不正なメモリ読み出しが発生しています。
そのあたりはMemcheckで確認可能です。
あとはArrayIteratorの中身をうまいこと書き換えれば、メモリの不正な読み出し箇所にコードを忍ばせて何か攻撃できるかもしれません。
が、そのあたりは詳しくないので具体的にどのようにすればいいかはよくわかりません。
というか、そもそもソート中に中身を書き換えるようなソースを書く方が悪いだろこれ。
JVNでの深刻度は4.6ですが、本当にこれで影響を受けるシステムが存在するのか疑問に思うレベル。
ちなみに
<?php
$arrayIterator = new ArrayIterator(['A','B']);
// ソート中にunserializeで中身を入れ替え
function badsort($a, $b) {
$d = new ArrayIterator(['C','D']);
$e = $d->serialize();
$GLOBALS['arrayIterator']->unserialize($e);
return $a > $b;
}
$a->uksort('badsort');
// ソート中に$arrayIteratorを直接変更
function badsort2($a, $b) {
$GLOBALS['arrayIterator'] = new ArrayIterator(['C','D']);
return $a > $b;
}
$arrayIterator->uksort('badsort2');
このように書くと書き換えができるうえに不正なメモリ読み出しも発生しません。意味がわからぬ。
PR