レガシーPHPのセキュリティ対策,大丈夫ですか?

第6回 未修正の脆弱性(3)

この記事を読むのに必要な時間:およそ 3 分

引き続き未修正の脆弱性とパッチを適用しない場合の対処を順次紹介していきます。繰り返しになりますが,脆弱性の危険度の順ではなくパッチファイル名の順番に紹介します。紹介する脆弱性情報は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の解説が必要な方はそちらをご覧ください。

allow_url_includeの追加

解説

PHP5にはallow_url_includeオプションが追加され,php.iniからinclude/require文がURLで指定されたスクリプトファイルにアクセス可能か設定できるようになりました。この仕様追加はセキュリティ上非常に大きな意味を持ちますが,PHP 4にはバックポートされていません。このパッチはPHP 5のallow_url_include php.iniオプションを追加します。ただし,このパッチでは完全にリモートコードの実行を防止できません。POSTメソッドによりデータを送信し,実行するスクリプトを標準入力から読み込むことによりリモートからのコード実行が可能です。

php.ini設定のallow_url_fopen設定はスクリプトからも変更可能な設定でしたが,システムレベルでのphp.iniのみにより変更可能な設定に改変されています。このため,リモートファイルにアクセスしたい場合,必要な箇所のみリモートファイルアクセスを許可するコーディングが行えません。

古いPHPはこの設定をスクリプト中からも変更可能でした。このパッチが無い場合,古い仕様に頼っていたスクリプトはより低い安全性で動作していることになります。

互換性
デフォルトでURL形式のスクリプトファイルは実行されなくなります。
パッチ無しのシステムでallow_url_fopen設定を変更を試みた場合,無視されます。
攻撃手法

典型的な脆弱なコード

<?php
$file = $_GET['file'];
include "module/$file.php";
?>

このパッチを摘要することにより,上記のような脆弱なコードでも任意のPHPスクリプトを実行できなくなります。

攻撃が成功した場合影響
リモートスクリプトの実行は「システムを完全に乗っ取られた状態」といって構いません。Webシステム内へのアクセスのみならず,外部サイトへの攻撃に利用されるなどの危険性があります。

このパッチにはCVE番号はありません。PHPがWebサーバやFTPサーバ上の外部スクリプトを呼び出せる機能は脆弱性ではなく「仕様」だからです。

回避策

include/require文にユーザ入力を含むパラメータを利用する場合,確実にバリデーションを行う。

リスク

パッチ適用済みのPHPの場合,リモートスクリプトの実行は防げます。しかし,ローカルスクリプトの実行は防げません。パッチ適用済みのPHPであってもユーザー入力を含むパラメータをinclude/require文に利用する場合,バリデーションを行わなければなりません。

ZTSモードでのcrypt関数の脆弱性

適用
オプション
対象
PHPコア
バージョン:5.1.6/4.4.9/4.3.11/4.3.9
CVE情報
CVE-2007-2844
Impact
CVSS Severity (version 2.0):
CVSS v2 Base Score:9.3 (HIGH) (AV:N/AC:M/Au:N/C:C/I:C/A:C) (legend)
Impact Subscore: 10.0
Exploitability Subscore: 8.6
CVSS Version 2 Metrics:
Access Vector: Network exploitable
Access Complexity: Medium
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
種別
セキュリティ
解説

ZTS(Zend Thread Safty)モードで動作している場合,crtypt関数が適切なロックを使用しないことによりレースコンディションが発生します。

このパッチはZTSモードを利用している場合にのみ発生します。通常のPHPはZTSモードでコンパイルされていません。

また,この問題を利用して攻撃する有用な方法は今のところ考案されていませんが,認証に関連する問題です。

互換性
互換性問題はありません。
攻撃手法
この脆弱性を利用し,攻撃するには任意のスクリプトを実行できなければなりません。
攻撃が成功した場合影響
crypt関数が意図しない戻り値を返し,クレデンシャルが正しく登録されない可能性があり,パスワードが漏洩します。

回避策

独自にロックを行いレースコンディションを避けるようにします。

リスク

CVSSのスコアからはリスクが高い脆弱性にみえますが,実際のWebアプリケーションを外部から攻撃する場合,有効な攻撃は難しいです。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

コメント

コメントの記入