RHEL/CentOS 7のPHP5.4.16 は安全か？

**RHEL7/CentOS7 のサポート期限は、2024年6月30日までです。早めに OS リプレイスの計画を立てましょう**

*この記事は [RHEL/CentOS 6のPHP5.3.3 は安全か？](http://qiita.com/nanasess/items/4248b2dc63a035c2933e) の RHEL/CentOS 7 版です。*

よく、 CentOS7.x にバンドルされている PHP5.4.16 を使用していると、

**「まだ PHP5.4 なんて使ってるの？？ セキュリティに対する意識あんの？？」**

って言われます。

確かに、PHP5.4.16 は[2013年にリリースされた](http://php.net/ChangeLog-5.php#5.4.16)とても古いバージョンですし、5.4 系は[2015年9月3日にリリースされた 5.4.45](http://php.net/releases/5_4_45.php)を最後に公式のサポートを終了しています。

でも、 CentOS7.x の PHP は、リリース当初の2014年から、 5.4.16 のままです。2017年12月現在でも、 5.4.16 のままです。これには理由があります。

CentOS は Linux の商用ディストリビューションである Redhat Enterprise Linux(RHEL) の、公開されたソースを元にしたディストリビューションであり PHP などのプログラム言語やアプリケーションも、 RHEL のパッケージを元に作成されています。
RHEL は、これら PHP などのパッケージを、独自に保守(ベンダーサポート)しており、何らかの脆弱性が見つかると、適宜アップデートされます。
CentOS も、基本的に RHEL のアップデートポリシーに準拠しており、 7.x は2024年6月30日まではサポートされます。

つまり、 CentOS7.x にバンドルしている PHP5.4.16 は、**適切にアップデート**していれば、2024年6月30日まで安心して使うことができます。

では、本当に安心して使えるのか調べてみましょう。

2016年12月14日現在、 CentOS7.x での PHP の最新パッケージは **php-5.4.16-42.el7** です。
ちなみに、 CentOS では、パッケージがアップデートされると、メーリングリストに[このような](https://lists.centos.org/pipermail/centos-announce/2016-August/022036.html) メールが流れます。

*RHEL でリリースされたものを CentOS でクレジット等を修正してリリースするため、リリースにタイムラグが発生するようです。*

まず、 PHP の SRPM ファイルを取得します。
RHEL7 より、 SRPM のリポジトリは [https://git.centos.org/project/rpms に統合された](http://ftp.redhat.com/redhat/linux/enterprise/7Server/en/os/README)ようです。

php-5.4.16-42.el7 のソースは、以下にあります。
https://git.centos.org/commit/rpms!php/8d87dc7113e1c756c4ddb82ef393ae85c2eeb6bb

差分に含まれるファイル、以下のような内容になっています。

```php-5.4.16-42.el7.patch
From 8d87dc7113e1c756c4ddb82ef393ae85c2eeb6bb Mon Sep 17 00:00:00 2001
From: CentOS Sources <bugs@centos.org>
Date: Thu, 03 Nov 2016 06:07:09 +0000
Subject: [PATCH] import php-5.4.16-42.el7

---
 SOURCES/php-5.4.16-CVE-2016-5766.patch |   94 +++++
 SOURCES/php-5.4.6-bug65641.patch       |  118 +++++++
 SOURCES/php-5.4.16-bug71089.patch      |   31 +
 SOURCES/php-5.4.16-curltls.patch       |   38 ++
 SOURCES/php-5.4.16-CVE-2016-5767.patch |   30 +
 SPECS/php.spec                         |   58 +++
 SOURCES/php-5.4.16-CVE-2016-5399.patch |   47 ++
 SOURCES/php-5.4.16-bug66833.patch      |   40 ++
 SOURCES/php-5.4.16-CVE-2016-5768.patch |  284 +++++++++++++++++
 SOURCES/php-5.4.16-bug66762.patch      |  137 ++++++++
 SOURCES/php-5.4.16-wddx.patch          |   41 ++
 11 files changed, 912 insertions(+), 6 deletions(-)                                                                                                                                                             
```

さまざまなパッチが含まれていることがわかります。
**CVE** とついているのが、セキュリティパッチです。
この中の [CVE-2016-5399](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5399) を見てみると、 [PHP 7.0.8, 5.6.23, 5.5.37 で修正された不具合がバックポート](https://bugs.php.net/bug.php?id=72613)されているのがわかります。

```php-5.4.16-CVE-2016-5399.patch
From f3feddb5b45b5abd93abb1a95044b7e099d51c84 Mon Sep 17 00:00:00 2001
From: Stanislav Malyshev <stas@php.net>
Date: Mon, 18 Jul 2016 22:20:45 -0700
Subject: [PATCH] Partial fix for bug #72613 - do not treat negative returns
 from bz2 as size_t

---
 ext/bz2/bz2.c               |  80 +++++++++++++++++++++++---------------------
 ext/bz2/tests/72613.bz2     | Bin 0 -> 351 bytes
 ext/bz2/tests/bug72613.phpt |  23 +++++++++++++
 3 files changed, 65 insertions(+), 38 deletions(-)
 create mode 100644 ext/bz2/tests/72613.bz2
 create mode 100644 ext/bz2/tests/bug72613.phpt

diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c
index de3250e..7cfcaa8 100644
--- a/ext/bz2/bz2.c
+++ b/ext/bz2/bz2.c
@@ -137,16 +137,20 @@ struct php_bz2_stream_data_t {
 static size_t php_bz2iop_read(php_stream *stream, char *buf, size_t count TSRMLS_DC)
 {
 	struct php_bz2_stream_data_t *self = (struct php_bz2_stream_data_t *) stream->abstract;
-	size_t ret;
-	
-	ret = BZ2_bzread(self->bz_file, buf, count);
+	int bz2_ret;
+
+	bz2_ret = BZ2_bzread(self->bz_file, buf, count);
 
-	if (ret == 0) {
+	if (bz2_ret < 0) {
+		stream->eof = 1;
+		return -1;
+	}
+	if (bz2_ret == 0) {
 		stream->eof = 1;
 	}
 
-	return ret;
+	return (size_t)bz2_ret;
 }
 
 static size_t php_bz2iop_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC)
 {
```

このように、**適切にアップデートされた CentOS7.x の PHP5.4.16 は安全**です。

プログラマーの立場からすると、最新のプログラム構文が使えないのは、ストレスに感じるかもしれません。
常に新しいバージョンにアップデートできれば良いのですが、コストやリソースの問題もあり、すべての環境でアップデートできるとは限りません。

**特に、 PHPの主要なフレームワークのサポート期間は4年程度である場合が多く、長期的に保守されるプロダクトの場合は注意が必要です。**
枯れているから、、という理由で採用すると、案件をリリースして間もなくサポート切れになってしまうことになりかねません。

Linux ディストリビューションの長期サポートとも上手くおつきあいするのも、プログラマーの大切なスキルの一つだと思います。