レガシーPHPのセキュリティ対策,大丈夫ですか?
第7回 未修正の脆弱性(4)
今回も引き続き未修正の脆弱性とパッチを適用しない場合の対処を順次紹介していきます。繰り返しになりますが,脆弱性の危険度の順ではなくパッチファイル名の順番に紹介します。紹介する脆弱性情報はSRA OSS Inc日本支社にてPHP4セキュリティ保守サービスとして提供しているものです。パッチ類は筆者の会社であるエレクトロニック・サービス・イニシアチブが,現状サポートされているPHPからレガシーPHPにバックポートしています。パッチの説明文を引用して脆弱性を解説します。パッチそのものの紹介は含みませんのでご了承ください。
PHP 4.3.9の評価は,PHPプロジェクトが配布しているソースコードではなくRedHat Enterprise Linux 4で提供されているPHPのSRPM(ソースRPM)のソースコードがベースになっています。PHP 5.1.6についてはPHPプロジェクトが配布しているソースコードがベースとなっています。このため,RedHat Enterprise Linux 5で修正されている問題も含まれていることがあります。
CVE/NVDについては第2回目の「CVEの読み方」で紹介しました。CVE/NVDの解説が必要な方はそちらをご覧ください。
escapeshellcmd関数の問題
- 適用
- 必須
- 対象
- PHPコア
- バージョン:5.1.6/4.4.9/4.3.11/4.3.9
- CVE情報
CVE-2008-2051 Impact CVSS Severity (version 2.0): CVSS v2 Base Score:10.0 (HIGH) (AV:N/AC:L/Au:N/C:C/I:C/A:C) (legend) Impact Subscore: 10.0 Exploitability Subscore: 10.0 CVSS Version 2 Metrics: Access Vector: Network exploitable Access Complexity: Low **NOTE: Access Complexity scored Low due to insufficient information Authentication: Not required to exploit Impact Type:Provides administrator access, Allows complete confidentiality, integrity, and availability violation; Allows unauthorized disclosure of information; Allows disruption of service- 種別
- セキュリティ
- 解説
escapeshellcmd()/escapeshellarg()は文字エンコーディングを考慮したエスケープ処理を行っていません。このパッチはシステムが標準的に提供しているmblen()関数を利用して文字エンコーディングを考慮したエスケープ処理を行うようにします。
システムにmblen()関数が無い場合,文字エンコーディングを考慮したエスケープ処理は行われないので注意してください。
またmblen()の挙動は環境変数によって制御されます。UNIX系システムの場合,LC_CTYPEが正しく設定されている必要があります。
- 互換性
- 互換性問題はありません。
- 攻撃手法
- escapeshellcmg()/escpaeshellargs()に渡すパラメータに不正な文字エンコーディングや攻撃用の文字列を設定し,システム上で任意のコマンドを実行します。
- 攻撃が成功した場合影響
- 任意コマンドが実行できるため,Webサーバ権限によりコマンドの実行,ファイルの読み取り,書き込みが可能になります。
CVEではescapeshellcmd関数のみ記載されていますが,実際にはescapeshellargs関数にも影響があります。
回避策
入力バリデーションで不正な文字エンコーディングを拒否します。
リスク
攻撃が成功するかどうかはシステムやシステム設定によって異なりますが,日本のサーバーでのリスクは高いと考えられます。
EXIFモジュールのバッファオーバーフロー
- 適用
- オプション
- 対象
- exif
- バージョン:5.1.6/4.4.9/4.3.11/4.3.9
- CVE情報
CVE-2009-3292 Impact CVSS Severity (version 2.0): CVSS v2 Base Score:7.5 (HIGH) (AV:N/AC:L/Au:N/C:P/I:P/A:P) (legend) Impact Subscore: 6.4 Exploitability Subscore: 10.0 CVSS Version 2 Metrics: Access Vector: Network exploitable Access Complexity: Low **NOTE: Access Complexity scored Low due to insufficient information Authentication: Not required to exploit Impact Type:Allows unauthorized disclosure of information; Allows unauthorized modification; Allows disruption of service- 種別
- セキュリティ
- 解説
- exif_read_file関数で不正なJPEGファイルを読み込んだ場合,パラメータが正しく初期化されずメモリ内容を不正に参照される可能性がありあす。
- 互換性
- 互換性問題はありません。
- 攻撃が成功した場合の影響
- メモリ内の機密情報を盗まれたり,任意コード実行を許す可能性があります。
- 変更履歴
- 2008/8/31 バリデーションコードを追加(CVE-2009-3292)
ExifとはJPEGファイルなどに含まれているメタデータです。画像のアップロードを許可しているアプリケーションなどではよく利用されている機能です。
回避策
PHPスクリプトでイメージファイルのヘッダを読み込み不正なデータが含まれていないか解析することもできないことはないですが,あまり現実的とは言えません。問題を回避するにはExifモジュールを利用しないようにします。
リスク
メモリ内容の漏洩とバッファーオーバーフローが発生するため,攻撃されるリスクは高いと考えられます。
explode関数の不正メモリ参照
- 適用
- 必須
- 対象
- PHPコア
- バージョン:5.1.6/4.4.9/4.3.11/4.3.9
- CVE情報
CVE-2008-3659 Impact CVSS Severity (version 2.0): CVSS v2 Base Score:6.4 (MEDIUM) (AV:N/AC:L/Au:N/C:N/I:P/A:P) (legend) Impact Subscore: 4.9 Exploitability Subscore: 10.0 CVSS Version 2 Metrics: Access Vector: Network exploitable Access Complexity: Low Authentication: Not required to exploit Impact Type:Allows unauthorized modification; Allows disruption of service- 種別
- セキュリティ
- 解説
- explode関数が,文字列が空の場合に指定された負のlimit値をチェックしていないため,本来アクセスできないはずのメモリ領域の内容を参照可能になっていた不具合を修正します。
- 互換性
- 互換性問題はありません。
- 攻撃手法
- 空の文字列と負のlimit値を設定して,メモリレイアウトやメモリ内のカナリア値を取得します。この脆弱性単体で任意コードの実行はできませんが,任意コード実行に必要な情報の取得に利用される可能性があります。攻撃専用のスクリプトが必要です。
- 攻撃が成功した場合影響
- システム上で任意コードを実行されます。
このexplode関数の不具合を利用した具体的な攻撃コードが存在します。複数のユーザがシステムを共有する環境での影響は大きいです。
回避策
リモートからの攻撃では有効な攻撃は難しいと考えられます。
リスク
共有環境でユーザが実行できる機能を制限していても,その機能を回避されます。WebサーバがSSL対応の場合,メモリ上に保存された秘密鍵を盗まれる可能性があります。
まとめ
レガシーPHPには確実にリスクが潜んでいます。アップグレードが最良ですが,さまざまな理由でできない場合もあるでしょう。少なくとも既知の脆弱性の影響を受けないようこの情報を活用してください。

