Yum だと PHP のバージョンが古い

CentOS において yum の標準リポジトリで PHP をインストールすると、CentOS 6.x だと PHP 5.3.3 が、CentOS 7.x だと PHP 5.4.16 がインストールされてしまうが、公式のセキュリティサポートはいずれのバージョンも終了している。1
標準インストールとはリリース番号がかなり離れているが、脆弱性の対応などセキュリティは果たして大丈夫なのか。

最終リリース日と公式サポート期限

OS PHP(yum) PHP(最終リリース) PHP公式サポート期限
5.x 5.1.6 (2006/08/24) 5.1.6 (2006/08/24) 2006/08/24
6.x 5.3.3 (2010/07/22) 5.3.29 (2014/08/29) 2014/08/14
7.x 5.4.16 (2013/06/06) 5.4.45 (2015/09/03) 2015/09/14

※ 括弧内の日付はいずれもリリース日。

結論

基本的には問題ない。

CentOS の公式 Wiki の FAQ には「CentOS は企業向けであり、最先端よりも安定性と長期的なサポートが優先される。主なパッケージのバージョンは製品のライフサイクル全体を通じて保持される。」「最新バージョンのパッケージがないのは欠陥ではなく特徴である。」2 (意訳) とあり、バージョンが古いままなのは意図的である。

また、「セキュリティパッチやバグ修正が出荷バージョンにバックポートされている。」「単にバージョン番号を見るだけでは、脆弱性があるとは言えない。」3 (意訳)とあり、脆弱性の対応も行われていることが分かる。

ただし、CentOS 5.xphp53 パッケージはメンテナンスされていないので直ちに使用を中止した方がよい。「サポート期限」を参照のこと。

バックポート

PHP 本体のセキュリティサポートは、例えば PHP 5.4 だと 2015/09/14 で終了4しているが、ディストリビューション側が脆弱性の対応を独自に行っている。5

RHEL/CentOS では例えば以下の様な対応が行われている。(参考:CentOSのPHPセキュリティパッチ履歴
ここ最近の対応は 2012 年から Red Hat 社に在籍しているフランス人開発者 Remi Collet によるもののようだ。彼は Package monkey を自称し、 PHP などの最新パッケージを提供する外部リポジトリの Remi's RPM repository を公開しているナイスガイだ。

RHEL/CentOS 7 (PHP 5.4.16)

リリース日 リリース チェンジログ
2016/04/04 36.1 - session: fix segfault in session with rfc1867 #1323643
2015/06/10 36 - fix more functions accept paths with NUL character #1213407
2015/06/05 35 - core: fix multipart/form-data request can use excessive amount of CPU usage CVE-2015-4024
- fix various functions accept paths with NUL character CVE-2015-4025, CVE-2015-4026, #1213407
- fileinfo: fix denial of service when processing a crafted file #1213442
- ftp: fix integer overflow leading to heap overflow when reading FTP file listing CVE-2015-4022
- phar: fix buffer over-read in metadata parsing CVE-2015-2783
- phar: invalid pointer free() in phar_tar_process_metadata() CVE-2015-3307
- phar: fix buffer overflow in phar_set_inode() CVE-2015-3329
- phar: fix memory corruption in phar_parse_tarfile caused by empty entry file name CVE-2015-4021
- soap: fix type confusion through unserialize #1222538
- apache2handler: fix pipelined request executed in deinitialized interpreter under httpd 2.4 CVE-2015-3330

RHEL/CentOS 6 (PHP 5.3.3)

リリース日 リリース チェンジログ
2015/12/09 47 - fix wrong warning in openssl_encrypt() for missing IV when IV is not required #1260315
- fix segfault's when you try and allocate an SplFixedArray with size >= 9999 #1071344
- segfault in php_pgsql_meta_data CVE-2015-4644 #1234434
- add options to enable TLS in curl #1255920
- fix segfault in gc_collect_cycles #1122681
2015/07/03 46 - fix gzfile accept paths with NUL character #1213407
- fix patch for CVE-2015-4024
2015/06/10 45 - fix more functions accept paths with NUL character #1213407

サポート期限

RHEL / CentOS

RHEL/CentOS の各バージョンごとのサポート期限は以下の通り。
サポート期限内であれば、PHP のバックポートはおそらく行われるはずである。

OSバージョン リポジトリ PHPバージョン 最新バックポート OSサポート終了日
4 update 4.3.9-3.36 2012/02/03 2012/02/29 (終了)
5 updates 5.1.6-45 2014/10/29 2017/03/31 (終了)
5 updates php53-5.3.3-26 2014/10/26 2017/03/31 (?)
6 updates 5.3.3-48 2016/07/25 2020/11/30
7 updates 5.4.16-36.3 2016/07/22 2024/06/30

php53

CentOS 5.x の標準リポジトリにおける php53 パッケージは、2014/10/26 のリリース 26 を最後に更新されておらず、CentOS 6 の php-5.3.3-41 以降に相当する 26 件の対応がまったくバックポートされていない。

Red Hat Software Collections (RHSCL) 6

RHSCL はリリースから原則3年間サポートされる。CentOS では SCLo としてクローンされている。

リリース リポジトリー パッケージ PHPバージョン 最新バックポート サポート終了日
RHSCL 1.0 php54 PHP 5.4.14 7 2016/10 (終了) 6
RHSCL 1.1 scl (~CentOS 6.7) php54 PHP 5.4.16 8 2014/10/23
RHSCL 1.1 php55 PHP 5.5.6 8 2016/10 (終了) 6
RHSCL 2.0 centos-sclo-rh php54 PHP 5.4.40 9 2016/07/22
RHSCL 2.0 centos-sclo-rh php55 PHP 5.5.21 9 2016/07/22
RHSCL 2.0 centos-sclo-rh rh-php56 PHP 5.6.5 9 2016/07/25 2018/04 6
RHSCL 2.3 centos-sclo-rh-testing rh-php56 PHP 5.6.25 10 2016/09/06
RHSCL 2.3 centos-sclo-rh-testing rh-php70 PHP 7.0.10 10 2016/11/02 2019/11 6

対応スピード

ディストリビューション側のバックポートは実際どれくらいのスピードで対応されるのか調べてみた。
例えば CVE-2015-4024 11 への対応は以下の流れをたどっている。

日付 経過日数 状況
2015/05/14 0日 PHP 5.4.41 リリース 12
2015/05/18 4日後 CVE-2015-4024 エントリー作成 11
2015/06/05 22日後 RedHat社での対応(ChangeLog記載の日付) 13
2015/06/23 40日後 RHEL 7 の php (PHP 5.4.16) のパッチ公開 14 15
2015/07/09 56日後 RHEL 6 の php (PHP 5.3.3) のパッチ公開 14 15

見ての通りあまり迅速な対応ではないようだ。PHP 5.3.3 に至っては56日を経過しており、約2ヶ月遅れということになる。
上記はあくまで問題の一つに対する例に過ぎないので、すぐに対応される場合もあるだろうし、もう2〜3例は調査したいところ。

結局本当に安全なのか

前述の通り、下手すると2ヶ月放置なので、問題ないとは言いがたい。
ソースからビルドする方が脆弱性に対してより堅牢になるのは間違いないが、あとはコストパフォーマンスの問題だろう。
ちなみに CentOS の場合、 yum-plugin-security による --security オプションでのアップデートは意味がないらしいので注意。16

なぜ中途半端に古いリリースを維持するのか

PHP 5.3.3 / 5.4.16 と中途半端なリリースバージョンを維持する理由がよくわからない。
今のところ調べても明確な記述が見つけられていないので、誰か教えろください。
他のライブラリとの整合性などメンテナンス上の理由と考えていたが、単に決め打ちなだけなのだろうか。

古いバージョンでお困りの方へ

最近のPHPフレームワークは比較的新しいバージョンのPHPを要求するのでRHEL/CentOSで提供されるものでは厳しいことがよくある。 17

利用するアプリケーションやライブラリで新しいバージョンの PHP を要求されることは多い。
そのような場合は「Yum で任意のバージョンの PHP をインストールする」で紹介している外部リポジトリを利用すると良いだろう。

がたがた抜かす奴はこんな記事など読まずにソースからコンパイルしろ。

PHP 関連記事

参考リンク