konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


Tips

概要

PHPの定義済のグローバル変数である「$GLOBALS」を「スクリプト外部から上書きできる」 というセキュリティ情報が公開されました。

この変数 $GLOBALS は、 PHP スーパーグローバル をすべて含んでいます。

現在、PHPを利用したアプリケーションではこれらの「スーパーグローバル変数」は、 ほとんどが利用していると思います。 また、$GLOBALS は、

$GLOBALS['xxx'] = 'yyy';

のようにして「スクリプトのすべてのスコープで有効」な変数をユーザが作成することも可能ですので、 使い方によっては非常に便利です。 しかし、この変数を、外部から上書きできることが今回の問題です。

注意するスクリプト(設定)の記述例*1

1. register_global=on の場合」
グローバル変数の登録機能の使用法
http://www.php.net/manual/ja/security.registerglobals.php
2. ファイルアップロード系関数を使用している場合」
POST メソッドによるアップロード
3.「import_request_variables() 関数を使用している場合」
4.「parse_str()、mb_parse_str() 関数を使用している場合」
5.「QUERYSTRINGなどから、explode,split等で、独自パース→変数登録を行う場合」
6.「foreach を利用した可変変数による変数登録」
7.「extract() 関数による変数の登録」
extract() 関数 - 中段「警告」参照
http://jp.php.net/manual/ja/function.extract.php
8.「PEAR.phpを使用している場合」

などの場合に、注意が必要と考えられます。

要は、 PHPの外部からくる変数 をスクリプト内部で登録する部分の記述が重要になります。 パラメータの値をサニタイズを行うときに、パラメータ名も確認するべきです。 『「スクリプト内で受け取らない(使用しない)パラメータ」は変数として登録 (上書き)しない。』 というスクリプト記述をしていれば、この脆弱性に影響される事は無いという事になります。

参考サイトURL


*1 対象:PHP <= 4.4.0, PHP 5.*.*

最終更新のRSS