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

第1回レガシーPHPのセキュリティ状態

レガシー版PHPのセキュリティ状態

PHP 4.4のサポートが終了し、PHP 4.4のセキュリティパッチリリースが停止したのは2008年8月でした。筆者の記憶ではPHP 5.1は正式にはサポート終了日・セキュリティパッチ提供終了日はアナウンスされませんでしたが、サポートは終了しています。PHP 5.2のサポートは2010年8月に終了し、セキュリティパッチのリリース停止日はアナウンスされていませんが近い将来セキュリティパッチの提供も停止されます。サポートが終了したリリースのセキュリティパッチはタイムリーにリリースされません。セキュリティパッチの提供も終了しているリリースは致命的なセキュリティホールが見つかっても、PHPプロジェクトからはパッチはリリースされないことになっています。

現在サポートされているPHPは5.3のみですが、PHP 4.3/4.4/5.1/5.2のレガシー版を利用されている方も多いと思われます。レガシー版PHPのセキュリティ状態は良いとは言えません。筆者の会社であるエレクトロニック・サービス・イニシアチブではSRA OSS Inc.との協業としてPHP4セキュリティ保守サービスを提供しています。エレクトロニック・サービス・イニシアチブがパッチを作成し、SRA OSS Inc.がサービスと販売・提供しています。このサービスではRHEL4およびRHEL5互換環境におけるPHP 4用の追加セキュリティパッチを提供しています。RedHat社もセキュリティパッチがリリースされた場合にアップデートを提供しているから必要ないのでは?と思った方もいるでしょう。しかし、必要なセキュリティパッチすべてが提供されている訳ではありません。このパッチサービスではPHP 4向けに必要な追加セキュリティパッチを最新版PHPからバックポートして提供しています。

必要なセキュリティアップデートが提供されない原因は、セキュリティアップデート提供の仕組みとPHPプロジェクトのセキュリティ対応にあります。多くのディストリビューターと同様にRedHat社ではCVE登録された脆弱性に対してセキュリティリリースを提供しています。しかし、PHPプロジェクトで現在サポートされているPHPバージョンのみしかセキュリティ脆弱性の影響評価をしません。またPHPプロジェクトはCVEに対応したセキュリティリリースも行っていません。最近は随分改善されましたが、CVE自体が登録されない脆弱性もあります。このようなサポート状況は特定のディストリビューターに限らず、ほとんどのLinuxディストリビューターが同じような体制でセキュリティフィックス版のリリースを行っています。

CVE番号とは、特定の脆弱性に一意なIDを付け、その番号により脆弱性を管理できるようにする仕組みです。ウイルス名のように同じ脆弱性であってもベンダーごとに違う呼び名やIDであると、特定の脆弱性に対応しているのか分からなくなるため、一意なIDとしてCVE番号を割り振っています。

PHPプロジェクトがCVEを認識していることはセキュリティフィックスリリースのリリースノートを見れば分かります。例えば、執筆時点での最新版リリースであるPHP 5.3.6のリリースノートには6つのセキュリティフィックスが紹介されています。

Security Enhancements and Fixes in PHP 5.3.6:
  • Enforce security in the fastcgi protocol parsing with fpm SAPI.
  • Fixed bug #54247 (format-string vulnerability on Phar). (CVE-2011-1153)
  • Fixed bug #54193 (Integer overflow in shmop_read()). (CVE-2011-1092)
  • Fixed bug #54055 (buffer overrun with high values for precision ini setting).
  • Fixed bug #54002 (crash on crafted tag in exif). (CVE-2011-0708)
  • Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive). (CVE-2011-0421)

最初のエントリは脆弱性対策ではなく、FastCGIプロトコルの処理にバリデーション処理を追加したことを示すエントリです。2つ目以降が本当のセキュリティフィックスになります。4つ目の

  • Fixed bug #54055 (buffer overrun with high values for precision ini setting).

にはCVE(Common Vulnerably and Exposure)番号がありません。 これはPHPプロジェクトのセキュリティチームは自らはCVE登録行ったり、CVEに対応したプロジェクト運営をしていないのでこうなっています。CVEに対応しているプロジェクトの場合、すべてのセキュリティフィックスにはCVE番号を付けてセキュリティフィックス情報を公開します。例えば、CVEに対応しているMicrosoft社やApple社のセキュリティフィックス情報には必ずCVE番号が付いています。

このようにディストリビューターのセキュリティパッチ体制とPHPプロジェクトのセキュリティリリース方針に互換性が無いため、ディストリビューターが有償で提供しているPHPであっても必要なセキュリティパッチが適用されたPHPが提供されていない状態が続いています。改めて説明するまでもなく、このような状態になっているのでは?と感じていた方も多いとは思います。

この連載では、現時点で利用されていることが多いレガシー版PHPである4.3/4.4/5.1/5.2のセキュリティ状態について、SRA OSS Inc社のPHP4セキュリティパッチサービスで提供しているパッチとレガシー版PHPのセキュリティについて解説します。

セキュリティパッチ一覧

執筆時点でPHP4セキュリティ保守サービスにて提供中のパッチ一覧です。

  • CVE-2007-0909-printf.patch
  • CVE-2007-4782.patch
  • CVE-2007-5899.patch
  • CVE-2008-210x.patch
  • CVE-2008-3660.patch
  • CVE-2010-4645.patch
  • CVE-2011-0708.patch
  • CVE-2011-1092.patch
  • allow_url_include.patch
  • crypt_zts.patch
  • dbareplace-CVE-2008-7068.patch
  • escape_shell_cmd-CVE-2008-2051.patch
  • exif-CVE-2009-3292.patch
  • explode-5.2.9.patch
  • fcgi_url_crash_CVE-2008-3660.patch
  • fix_tests.patch
  • fnmatch.patch
  • gd-CVE-2008-5498-CVE-2009-3293-etc.patch
  • html_escape.patch
  • imap-CVE-2010-4150.patch
  • imap_overflow-CVE-2008-2829.patch
  • lcg.patch
  • max-file-uploads-CVE-2009-4017.patch
  • mb_check_encoding.patch
  • mbstring-5.2.9-CVE-2008-5557.patch
  • mysql_set_charset.patch
  • open_basedir-CVE-2010-3436.batch
  • openssl-CVE-2009-3291.patch
  • page_uid.patch
  • pcre-CVE-2008-2371.patch
  • pg_escape_string.patch
  • php_value_order.patch
  • precision-overflow.patch
  • refcount_overflow.patch
  • session-CVE-2009-4143.patch
  • session-prefix.patch
  • strict_session.patch
  • string.c.patch
  • xml-char-overflow.patch
  • xmlrpc.patch

PHP4セキュリティパッチサービスが対応するPHP 4はPHP 4.3.9/4.3.11/4.4.9であるため、バージョンによって不必要なパッチもありますが、2011年4月時点で総数で40のセキュリティパッチを提供しています。

PHP 5.2の状態

PHP 5.2は昨年8までサポートされていたPHPリリースであったので、現在でも多くの方が利用していると思われます。PHP 5.2は一応セキュリティフィックスはリリースされることになっています。サポート状態は悪くないと考えられますが、十分とは言えない状態です。

PHP 5.2と5.3の両方がサポートされていた頃は、PHP 5.2のほうにセキュリティフィックスがリリースされてしばらく経ってから同じ脆弱性に対応した5.3がリリースされる状態が続いていました。この状態はPHP 5.2のサポートが終了するまで続いていたので、PHP 5.3より5.2を利用していたほうがより安全と考えていた方も多いでしょう。先にセキュリティフィックスがリリースされるリリースを使ったほうがより安全であることは説明するまでもないでしょう。筆者も5.2のほうがより安全だと考えていた一人です。

5.2のサポートが終了してすぐにこの状況は逆転しました。PHP 5.3.6で対応した5つの脆弱性

  • Fixed bug #54247 (format-string vulnerability on Phar). (CVE-2011-1153)
  • Fixed bug #54193 (Integer overflow in shmop_read()). (CVE-2011-1092)
  • Fixed bug #54055 (buffer overrun with high values for precision ini setting).
  • Fixed bug #54002 (crash on crafted tag in exif). (CVE-2011-0708)
  • Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive). (CVE-2011-0421)

のうち、

  • Fixed bug #54247 (format-string vulnerability on Phar). (CVE-2011-1153)

はpharモジュールが無いためPHP 5.2には影響ありません。しかし、以下の4つの脆弱性

  • Fixed bug #54193 (Integer overflow in shmop_read()). (CVE-2011-1092)
  • Fixed bug #54055 (buffer overrun with high values for precision ini setting).
  • Fixed bug #54002 (crash on crafted tag in exif). (CVE-2011-0708)
  • Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive). (CVE-2011-0421)

はPHP 5.2.17に影響があるセキュリティフィックスです。これら4つともメモリエラーのバグであり、不正なメモリ参照(不正なメモリ参照は場合によってはSSLの秘密鍵も盗まれる)バッファオーバーフロー(場合によっては不正なコードを実行される)問題です。PHP 5.3.6は2011年3月17日にリリースされ、執筆時点で1か月を過ぎましたがこれらの脆弱性に対応したPHP 5.2.18はリリースされていません。

PHP 5.2のSVNリポジトリ(リリースされる場合、PHP 5.2.18となるHEAD)を確認すると

対応済み
  • Fixed bug #54193 (Integer overflow in shmop_read()). (CVE-2011-1092)
未対応
  • Fixed bug #54055 (buffer overrun with high values for precision ini setting).
  • Fixed bug #54002 (crash on crafted tag in exif). (CVE-2011-0708)
  • Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive). (CVE-2011-0421)

という状況になっています。この現状からPHPプロジェクトとしてはPHP 5.2系の脆弱性には余程のことがない限り対応するつもりが無いと言えるでしょう。

レガシー版であるPHP 5.2を提供しているディストリビューターが対応するかどうかはCVEの説明文を見れば分かります。

Fixed bug #54193 (Integer overflow in shmop_read()). (CVE-2011-1092)
← PHP 5.3.5以下に影響と記載
Fixed bug #54055 (buffer overrun with high values for precision ini setting).
← CVE-2011-1464、PHP 5.3.5以下に影響と記載
Fixed bug #54002 (crash on crafted tag in exif). (CVE-2011-0708)
← PHP 5.3.5以下に影響と記載
Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive). (CVE-2011-0421)
← PHP 5.3.5以下に影響と記載

すべてPHP 5.3.5以下に影響と記載されています。このため、多くのディストリビューターはPHP 5.2以下のPHPの修正版をリリースすることはないでしょう。

まとめ

既にPHP 5.2でも十分なセキュリティパッチが提供されることを期待することは難しいことがお分かり頂けたと思います。PHPプロジェクトとしては今後PHP 5.2用にセキュリティパッチをリリースする予定はありません。PHP 5.3未満をご利用中の方はできるだけ早くPHP 5.3に移行する必要があります。

セキュリティ確保にはまず正しい情報を知ることが必要です。本連載では少しでも安全にPHPを利用したWebサイトを運用できるよう、レガシー版のPHPのセキュリティ状態の概要をセキュリティパッチの解説を取り上げて紹介します。

おすすめ記事

記事・ニュース一覧