PHP5.6.13/5.5.29/5.4.45対応 PHPセキュリティ保守サービス パッチ配布開始

PHPセキュリティ保守サービスPHPセキュリティ保守サービスとは、メンテナンスが終了したPHPを安全に利用するパッチを提供するサービスです。PHP 5.3/5.2/5.1/4.4/4.3に対応しています。

以下はPHPセキュリティ保守サービスのリリースノートからの抜粋です。

◆ 2015/09/25
PHPプロジェクトのPHP 5.4.45リリースに対応したリリースです。
これらのRelease Noteでは以下のセキュリティ/バグフィックスが報告されています。

今回のリリースではserialize/unserializeに関連する脆弱性は修正されていません。回避策についてはリリースノート後半の解説をご覧ください。

Version 5.4.45
03 Sep 2015

    Core:
        Fixed bug #70172 (Use After Free Vulnerability in unserialize()). (CVE-2015-6834)
        Fixed bug #70219 (Use after free vulnerability in session deserializer). (CVE-2015-6835)

対象:全てのPHP
パッチは提供されません。リリースノートの終わりに記載されている対策を参照してください。

    EXIF:
        Fixed bug #70385 (Buffer over-read in exif_read_data with TIFF IFD tag byte value of 32 bytes).
PHP 5.3/5.2/4.4/4.3
php-X.X.X-5.4.45-bug70385.patch
細工されたExifタグによりバッファーオーバーリードが発生する。

    hash:
        Fixed bug #70312 (HAVAL gives wrong hashes in specific cases).
PHP 5.3/5.2
php-X.X.X-5.4.45-bug70312.patch
特定の場合に誤ったハッシュ値を生成する。

    PCRE:
        Fixed bug #70345 (Multiple vulnerabilities related to PCRE functions).
PHP 5.3/5.2
php-X.X.X-5.4.45-bug70345.patch
新しいバージョンのPCREライブラリのオプションをサポートしていない為、preg関数を実行すると予期しない動作をする。

    SOAP:
        Fixed bug #70388 (SOAP serialize_function_call() type confusion / RCE). (CVE-2015-6836)

対象:SOAPをサポートするPHP
パッチは提供されません。リリースノートの終わりに記載されている対策を参照してください。


    SPL:
        Fixed bug #70365 (Use-after-free vulnerability in unserialize() with SplObjectStorage). (CVE-2015-6834)
        Fixed bug #70366 (Use-after-free vulnerability in unserialize() with SplDoublyLinkedList). (CVE-2015-6834)

対象:SPLをサポートするPHP
パッチは提供されません。リリースノートの終わりに記載されている対策を参照してください。


    XSLT:
        Fixed bug #69782 (NULL pointer dereference). (CVE-2015-6837, CVE-2015-6838)

PHP 5.3/5.2
php-X.X.X-5.4.45-bug69782.patch
PHPスクリプトハンドラを利用した場合にNULLポインタ参照が発生する。

    ZIP:
        Fixed bug #70350 (ZipArchive::extractTo allows for directory traversal when creating directories).

PHP 5.3/5.2
php-X.X.X-5.4.45-bug70350.patch
ZipArchiveオブジェクトのextractToメソッドがディレクトリ作成の際にトラバーサルを許す。


■ serialize/unserializeの脆弱性について
serialize/unserialize脆弱性は全てのPHPバージョンに存在します。この問題を根本的に修正するにはデータ構造と処理の見直しが必要です。データ構造の見直しにはABI互換性が損なわれる修正が必要です。処理の見直しにも互換性が損なわれます。この為、serialize/unserialize処理脆弱性パッチは提供されません。

serialize/unserialize処理を安全に行うには
 - 信頼できないデータソースからのデータをunserializeしない
 - 外部にserializeしたデータを渡し受け取る場合(クッキーやURLなどに保存し受け取るなど)は、ハッシュを用いて入力データをバリデーションします。

■ 信頼できないデータソースからのserializeデータをバリデーションする方法

信頼できないデータソースからのserializeデータを受け取り、処理する場合は以下のようなコードを利用します。
※ ハッシュ関数にsha1を利用していますが、sha256以上の関数が利用できる場合はこれらを利用します。

送信するデータの準備
----
$serialized_data = serialize($data);
$searialize_data_hash = sha1($secret . $serialize_data);
----

$secretはサーバー側に保存された予測不可能なランダム文字列を設定します。データを送る場合に$serialized_dataと$serialized_data_hashを送信します。

データを受信した際には、$serialized_dataと$serialized_data_hashが一致するかバリデーションします。クエリ文字列としてserialized_dataが保存されている場合は以下のようにします。

受信したデータのバリデーション
----
if ($_GET['serialized_data_hash'] !== sha1($secret . $_GET['serialize_data']) {
  // ハッシュが一致しない場合、攻撃者によりデータが改竄されている
  trigger_error('Invalid serialized data detected', E_USER_ERROR);
  exit;
}
$data = unserialize($_GET['serialized
----

この方法を利用した場合、攻撃者によってserializeされたデータでるか検証できます。しかし、再生攻撃の対策にはならない点に注意してください。再生攻撃を緩和するにはタイムスタンプを利用した対策があります。この場合、設定した有効期限以内のリクエストでないかぎり再生攻撃は行えません。


送信するデータの準備
----
$serialized_data = serialize($data);
$serialized_data_timestamp = time();
$searialize_data_hash = sha1($secret . $serialized_data_timestamp . $serialize_data);
----

受信したデータのバリデーション
----
if ($_GET['serialized_data_timestamp'] < time() - $expire_seconds
    || $_GET['serialized_data_hash'] !== sha1($secret . $_GET['serialized_data_timestamp . $_GET['serialize_data']) {
  // タイムスタンプで有効期限を確認し無効な場合は処理しない
  // ハッシュが一致しない場合、攻撃者によりデータが改竄されている
  trigger_error('Invalid serialized data detected', E_USER_ERROR);
  exit;
}
$data = unserialize($_GET['serialized
----

より確実に再生攻撃を防止する必要がある場合は、タイムスタンプではなくサーバー側に一時的なランダム文字列(nonce文字列)を保存します。nonce文字列をサーバー側(例えば、memcachedなど)に保存し、クライアントから送信された際にnonce文字列が有効かバリデーションを行い、使用した後にnonce文字列を削除/無効化すると確実に再生攻撃を防げます。

 

詳しい情報はパッチのドキュメントを参照してください。