安全なPHPを使っていますか? – PHPバージョンアップとの付き合い方を考える
こんにちは。宇都宮です。
昨年末、著名なPHP開発者・Anthony Ferrara(ircmaxell)氏のブログに、PHP Install Statisticsという記事が掲載されました。この記事では、W3Techsの統計を元に、現在Web上に公開されているPHP製サイトのバージョン情報を調べ、いかに多くのPHP製サイトが、脆弱でサポートの切れたバージョンを使用しているか、解説しています。
この記事によると、PHP製サイトのおよそ7割強は、脆弱性があるか、又は既にサポートが切れているバージョンのPHPを使用している、としています。記事の冒頭には、他の処理系やアプリケーションとの比較がありますが、PerlとPythonでは安全なバージョンの使用率が8割前後なのに対して、PHPの安全なバージョンの使用率は25%と、非常に悪い数字になっています。
どのバージョンが安全か
では、安全なバージョンのPHPとは、どういったバージョンのことを指すのでしょう?
1つは、「PHP開発チームによるサポートが続いているバージョンの、最新安定版」です。2015年1月8現在、5.4.36、5.5.20、5.6.4が、これに該当します。
もう1つは、「LInuxディストリビューション等が独自にサポートしているバージョン」です。これについても、PHP Install Statisticsの中に表が掲載されています。注目すべきは、PHP 5.3.3や5.1.6等、5.4未満のバージョンの中にも、安全なバージョンがあることです。これらはすでにPHP開発チームによるサポートが終了したバージョンですが、Linuxディストリビューションの開発チームによる独自サポートが続いています。
(したがって、「5.3.3なら安全」というわけではなく、「CentOS 6で適切にアップデートしている5.3.3なら安全」です)
サポートとは、具体的には、セキュリティパッチのバックポート等です。PHPで脆弱性が見つかり、その脆弱性がCentOSの公式リポジトリのPHPにも影響すると判明した場合は、その脆弱性を修正するパッチの当たったバージョンのPHPが、パッケージマネージャでインストールできるようになります。
CentOSはサポート期間の長さ(リリースから10年間)で有名で、たとえばCentOS 6は2020年11月末までサポートが続きます。このサポート対象には、CentOSのパッケージマネージャ(yum)でインストール可能なパッケージも含まれます。
CentOSを別格としても、UbuntuのLTS(10.04、12.04、14.04等。サポート期間5年)など長期に渡ってサポートを提供しているOSでは、PHP開発チームによるサポートが終了したバージョンのPHPのサポートを提供していることがあります。
安全なPHPを使うには
このような事情を踏まえると、安全なバージョンのPHPを使うための方法は、以下のとおりです。
(1) OSの公式リポジトリを使用する場合は、パッケージマネージャでアップデートを行う
(2) remi等の外部リポジトリを使用する場合は、そのリポジトリの最新版を保つ
(3) ソースからビルドを行った場合は、適切にパッチを当てる
上記選択肢のうち、メジャーバージョンアップの回数が最小になるのは、「サポート期間の長いOS」+「OS公式リポジトリ」の組み合わせです。CentOSなら、メジャーバージョンアップは10年に1回で済みます(ただし、10年越しのバージョンアップは容易な作業ではないでしょう)。
最新安定版の導入の容易さでは外部リポジトリが優れています。ただし、PHPのメジャーバージョンのサポート期間は3年程度です。外部 リポジトリのサポートポリシー次第ですが、3年に1度はメジャーバージョンアップが必要になる、と考えておいたほうがいいでしょう。
ソースからビルドを行う場合というのは、OSの公式リポジトリや外部リポジトリではインストールできないバージョン(公式リポジトリよりも古いバージョン)を使用する場合や、PHP本体のソースコードに手を入れている場合などであると推測されます。このような場合でも、独自にセキュリティパッチを当てていくことで安全性を保つことは可能です。
いずれの方法においても重要なのは、マイナーバージョンアップに追従していくことです。PHPのリリース情報は、php.netなどで入手できます。
「壊れていないものを直すな」
ここまで読まれてきて、本番稼働しているPHPのバージョンアップをするのはいかがなものか、とお考えの方もいらっしゃるかもしれません。「バージョンアップして動かなくなったらどうするんだ」と。
しかし、PHPのマイナーバージョンアップは原則として下方互換性を崩さない形で実施されるため、バグや脆弱性に依存したコードを書いていない限り、PHPのマイナーバージョンアップによってアプリケーションに不具合が生じることは通常ありません(※)。
※5.2.7と5.3.7で、重大なバグを抱えたバージョンがリリースされた経緯が過去にあるため、絶対安全とは言い切れないのが辛いところです。
PHPのマイナーバージョンアップを行うかは、最終的には保守工数やセキュリティ要件との相談になります。
むすび
昨年末の徳丸浩氏の記事:『例えば、PHPを避ける』以降PHPはどれだけ安全になったかには、PHPのセキュリティ改善の歩みがまとめられています。PHPの処理系としての安全性は向上し、安全なプログラムの書き方も確立されてきました。
しかし、上記記事の末尾で徳丸氏も指摘しているように、安全なバージョンを使用する、という点では、PHPには大きな課題があります。