CentOS7 に yum で PHP5.6 を入れた話


現在稼働しているサーバの PHP が 5.4 だったのだけど、どうしても password_hash, password_verify を使いたかったので、入れ替えた時のお話。
password_verifyタイミング攻撃に対応していてパスワードクラック対策になるので、ぜひ使って見たかった (同じく hash_equals もある)。

yum リポジトリを追加

epel (もしなければ)

yum install epel-release

rpm で remi を追加

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

古い php を削除

yum -y remove php-*

php5.6 をインストール

yum -y --enablerepo=remi,remi-php56 install php php-mysql php-mbstring php-gd php-pear php-mcrypt mod_ssl
プラグインはお好みで。
password_hash 以外での暗号化することも考えて、 mod_sslphp-mcrypt も入れておいた。

バージョンを確認

php --version を発行し、

PHP 5.6.30 (cli) (built: Jan 19 2017 07:57:06) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

こんな感じで帰って来れば OK.

apache 再起動

systemctl restart httpd
fast-cgi や Nginx はまた別の機会に。

phpinfo() を実行する


こんな感じでヘッダに 5.6.xx となれば OK.
(黒塗りのところは host 名)

蛇足

本当は 7.0 とか使いたかったんだけど

大人の事情(笑)により頓挫。
宇宙船演算子とか使ってみたい。
Null 合体演算子は切実に使いたい。

タイミング攻撃とは

ザクっというとパスワードの検証にかかる時間を調べることにより、処理内容を推測してパスワードをクラックする(パスワード検証に限らないが)。
我々はコードを書くときに「ネストを深くしない」「可能な限り早く return する」ことを心がけるけれど、そうすると処理する時間に僅かだが差が出るので、それを何度もやりその有意差から、「ああ、この辺りで処理を抜けてるな」みたいなことがわかってしまう。
よく文字列比較で使う ===strcmp なども内部的には、文字数を比較していたり、効率化のために「可能な限り早く return し」ているので、自分で記述した処理以外の部分でも攻撃対象となってしまう。
password_verifyhash_equals はどんな値が入力されても同じ時間で答えを返すように設計されているので、こういった攻撃の対策に役立つ。