忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/17 14:50 |
ArrayIteratorにバッファオーバーラン?脆弱性?
ArrayIteratorは、ソート中に自分自身を変更することはできません。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。
<?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


2014/07/18 22:41 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2014/07/20 | HOME | 標準関数で素数を求める>>
忍者ブログ[PR]