MOPB-17-2007:PHP ext/filter FDF Post Bypass Vulnerability

(Last Updated On: 2018年8月16日)

Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。

■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser

■PoCまたは攻撃コード
MOPB-17-2007.php
http://www.php-security.org/MOPB/code/MOPB-17-2007.php

■リファレンス
なし

■サマリ
PHP 5.2.0から新しくFilter拡張モジュールが追加されました。このモジュールはアプリケーションからユーザ入力をフィルタしたり、サイト全体に対する入力フィルタ機能を実装するために利用されます。

しかし、このモジュールの設計は重大な問題があるため、PHPがFDFモジュールと一緒にコンパイルされているとサイト全体の制限をくぐり抜けてPOSTデータを送信可能となる脆弱性があります。

■影響するバージョン
PHP 5.2.0以下

■詳細情報
PHP5には様々なフィルタ用のフックが追加されました。Hardened-PHPプロジェクトが幾つかの機能追加と明白なバグを修正するまで、Yahooだけで利用されていました。Hardned-PHPプロジェクトが問題を修正して以降、Hardended-PHPパッチはこれらのフックを利用しユーザ入力の変数の数、サイズ、形状に基づいてフィルタリングを行うvarfilter拡張モジュールが付属しています。

その後、PHP開発者はPHPにバンドルされるFilterモジュールを開発し、入力フィルタシステムを壊してしまいました。Filterモジュールは入力フィルタシステムをオーバーライドし、以前に定義された入力フィルタに制御を返しません。この為に以前に導入された入力フィルタリングシステムは利用できなくなりました。PHP開発者はHardened-PHPがこれらのフックを利用していた事を知りながら、意図的に入力システムを壊す事を止めようとしませんでした。

新しく定義された入力フィルタリングフックは全ての個所でユーザ入力をパース、変数として登録し変数に対して何をすべきか定義する入力フィルタ呼べるように設計されています。これにより、特殊なPOST Content-Typeをサポートする全てのモジュールが入力フィルタのフックを実装しなければ、データがフィルタされずに処理される問題が発生するようになりました。

FDFモジュールはFDF POSTデータフォーマット(訳注:Content-Type: application/nvd.dfd)を追加していますが、入力フィルタのフックを実装してません。これにより、サイト全体に適用されるべきフィルタのバイパスが可能になります。

■PoC、攻撃コードまたは再現手順
添付の攻撃コードはapplication/nvd.dfdフォーマットのFDF POSTデータを$_POST配列に変換し、URLにPOSTして、Filterモジュールによってサイト全体に適用されるべきフィルタをバイパスします。

■備考
新しく導入されたフィルタリングモジュールは、新たなPHPの設計ミスを含む機能となり、多くの開発者、特にシステム管理者にとって頭痛の種となるでしょう。

最初に、フィルタリングフックが間違った場所で行われている事が問題です。フィルタリングは(3rdパーティ製を含む)全てのモジュールがロードされる時点でのみフィルタリングフックの追加が行えます。

次に、Filterモジュールは他のフィルタ拡張モジュールと一緒に動作できくなるようにコーディングされています。Filterモジュールはフィルタリングフックを取得したままにして、ディジーチェイン(訳注:処理を数珠繋ぎに続けること)を行いません。一部のPHP開発者達は、この動作がHardened-PHPプロジェクトのvarfilterを壊す事を知りつつ、意図的にこの変更を行いました。 いずれにせよ、Hardedned-PHPパッチよりFilterモジュールと一緒に動作できるSuhosinモジュール利用すべきです。

最後に、Filterモジュールはオプションのモジュールなのでシステム管理者によって無効に設定できます。インプットFilterに頼っているPHPアプリケーションはインプットFilterモジュールがインストールされている場合にしか安全に動作しません。
(訳注:フックしたインプットの制御を戻さない、すべての特殊なPOSTリクエストを処理するモジュールにフックの実装が必要な仕様にしているにも関わらず、デフォルトモジュールでない事が問題であると考えていると思われます。何れにせよPHPはモジュール間の依存性を解決する仕組みを持たないので、不必要にモジュール間に依存性が発生するようなモジュールを追加する事だけでも問題があるといえます)

投稿者: yohgaki