PHP脆弱性とバージョンアップ 日本PostgreSQLユーザ会 四国支部/日本PHPユーザ会/Momonga Project 大垣 靖男 [email protected] / [email protected] / [email protected] / [email protected] 2005/12/2 1 目次 $GLOBALS 問題 $GLOBALS問題の危険性を理解する前提 $GLOBALS問題の危険性 $GLOBALS問題の影響を受ける環境 $GLOBALS問題の影響 もしregister_globasl=on(相当)が必要な場合 register_globals=onのサーバ対策 PHPプロジェクトの対応 バージョンアップの薦め 2005/12/2 2 $GLOBALS 問題 セッションの値、サーバが設定する値が信頼できない事態 PHP 4.2以前は正に最悪な状態であった register_globals=onの場合に大きな影響 PHP脆弱性の中では「最悪」レベル 2005/12/2 3 $GLOBALS問題の危険性を理解する前提 危険なコード その1 include $_GET[‘file’]; 危険なコード その2 include $_GET[‘file’].’.php’; 2005/12/2 4 $GLOBALS問題の危険性 危険なコード その1 include dirname($_SERVER[‘SCRIPT_FILENAME’) .’/lib/mylib.php’; 危険なコード その2 header(dirname($_SERVER[‘REQUEST_URI’).’other_file.php’); 2005/12/2 5 $GLOBALS問題の影響を受ける環境 基本的には register_globals=on しかし、安直なregister_globals=off対策アプリの方が問題が大きい 場合も… 2005/12/2 import_request_variables関数 foreachループ 6 $GLOBALS問題の影響 意外に多い影響…. osCommerce (ECアプリ)は2005年11月時点でも register_globals=onで無ければ動作しない… register_globals=Offであれば安全?! 「ではない」 Wiki! (wiki.sorceforge.net) の様にimport_request_variables関数を 使用を薦めるアプリも Manbo(CMS)の様にforeachでresiger_globals=onをエミュレートする アプリも 2005/12/2 7 さらに PEAR.phpもスクリプトによっては攻撃の対象に! echo $_SERVER[‘REMOTE_ADDR’]などがXSS攻撃の対象に! header関数が関連するとHTTP Response Splitting攻撃の対象に! select * from hoge where ipaddress = ‘$_SERVER[‘REMOTE_ADDR’]’; などがSQLインジェクションの攻撃対象に! $_SESSIONにより認証制御行っていても成り済まし放題に! 2005/12/2 8 もしregister_globasl=on(相当)が必要な場合 1. 2. 3. php.iniでregister_globals=off 値にGLOBALS等のスーパーグローバル配列が含まれていないか確認 import_request_variables関数でインポート サンプルコード if (!empty($_REQUEST['GLOBALS']) || !empty($_REQUEST['_SERVER']) || !empty($_REQUEST['_ENV'] || !empty($_REQUEST['_FILES'])) { error_log('Crack attempt from '.$_SERVER['REMOTE_ADDR'].' - '.$_SERVER['SCRIPT_FILENAME']); exit; } import_request_variables('gpc'); 2005/12/2 9 register_globals=onのサーバ対策 register_globals=onでサーバを運用すること自体が間違い register_globals=onでは実行させない PHP6ではregister_globals設定は無くなる if (ini_get(“register_globals”)) die(‘Should be register_globals=Off for security reasons’); 2005/12/2 10 PHPプロジェクトの対応 $GLOBALS問題に対する対応は適切とは言いがたい対応 PHPプロジェクトでは他のセキュリティ問題への対応に不備がある場 合も… 2005/12/2 無用のパッチが掲載されていたり… セキュリティレベルを下げる変更が… 11 PHP脆弱性リスト http://wiki.ohgaki.net/index.php?PHP%2F%C0%C8%BC%E5%C0 %AD%A5%EA%A5%B9%A5%C8 ChangeLogを見ないと分からない修正も… 中にはChangeLogには載っていない修正も… 2005/12/2 12 バージョンアップの薦め 基本的にPHPはメンテナンスされている最新リリースバージョンを使用 PHP 4.4.x PHP 5.1.x クリティカルなシステムの場合、CVS変更レベルでの注意も必要 バージョンアップ以外ではHardened PHPもオプションの一つ 2005/12/2 http://www.hardened-php.net/ 13 最近のmbstring関数の問題 廣川さんがmbstring関連の問題に関連するパッチをコミット mb_send_mail関数 mb_encode_mimeheader関数 mbfilterが誤変換する問題 PHP 4.4.2(未リリース)、PHP 5.1.1で修正済み 2005/12/2 14 とは言っても PHP 5.1.xはPHP 5.1.2くらいまで待ってもよいかも PHP5.0.xには$GLOBALS問題がある。パッチ無しでは絶対に registger_globals=onで運用してはならない バージョン間で微妙な不整合が… 2005/12/2 15 QA期間でのテスト QAは以前のバージョンとの整合性確認も目的の一つ 互換性問題を発見すれば対応される可能性が高い RC段階に入った時点で自分のコードでの問題を確認 その為にはUnit Test等の活用が必要 2005/12/2 16 まとめ オープンソースは参加してこそ使いこなせる RC期間にQA参加するだけでも不意のセキュリティホール情報でもス ムーズにバージョンアップが可能に 2005/12/2 17 余談:よくある間違い safe_modeはセキュリティの為の設定である しっかり作ったコードならユーザが直接参照しないファイルを DocuemntRootに配置しても構わない 入力間違いは十分チェック(サニタイズ)しているので安全なコードで ある エラーが発生した場合、エラーメッセージを出さなければクラッカーに スクリプトの脆弱性を知られずにすむ ソースを公開していなければSQLインジェクション等の攻撃を受ける可 能性は少ない 2005/12/2 18 余談:フレームワーク万能論 2005/12/2 19
© Copyright 2024 ExpyDoc