Amimoto AMI での httpoxy への対応

先日、PHP などの CGI ベースのアプリケーションに影響する脆弱性通称「httpoxy」が公表されました。
参考URL

これは、以下のような脆弱性となります。

 CGIまたはCGIのようなコンテキストで運用されているWebサーバでは、クライアントにリクエストされたHTTP Proxyヘッダが「HTTP_PROXY」として環境変数に割り当てられることがある。

 Webアプリケーションにこの問題が存在している場合、脆弱性を突かれて中間者攻撃を仕掛けられたり、サーバが任意のホストに接続させられたりする恐れがある。
 脆弱性は、PHP、Python、Goを使ったCGIベースのアプリケーションで確認されたほか、まだ未確認のアプリケーションが多数存在するとみられる。
 対策では、各プロジェクトからリリースされているパッチをできるだけ早く適用する必要がある。また、Proxyリクエストヘッダをブロックするなどの回避策も有効とされ、httpoxyの情報サイトで詳しく解説している。
 この問題は、2001年に「libwww-perl」で発見されて修正されたものの、それ以上詳しく調査されないまま現在に至り、PHPなど他の言語やライブラリの多くに影響が及ぶことが今になって判明したという。

「httpoxy」の脆弱性発覚 PHP、Go、PythonなどのCGIアプリに影響 – ITmedia エンタープライズ

要は、PHP アプリケーション内で、getenv('HTTP_PROXY') を使用している場合に、外部から HTTP Proxy ヘッダを送信することによって任意のプロキシサーバを経由させて通信させることができるという脆弱性です。

AWS SDK for PHP でも使用している Guzzle ライブラリが古い場合は、この脆弱性に影響されます。(具体的には 6.2.1より古いバージョン)
Guzzle 6.2.1 では、httpoxy への対策が行われています。

他にも影響するアプリケーションが存在する可能性がありますので、PHP スクリプト内で getenv('HTTP_PROXY') を使用していないかを確認する必要があります。

また PHP アプリケーションを修正せずに対応するには、Nginx 側で CGI に対して HTTP_PROXY 自体を渡さないことが有効になります。
対応方法としては以下のURLが参考になります。

現在、最新の Amimoto AMI では、上記URLにある対応が完了しておりますので、これからローンチされる場合には、この脆弱性への影響は受けません。
また、Amimoto マネージドをご利用になられているお客様については順次適用中ですので、特に対応していただく必要はありません。

最新版の Amimoto AMI に変更することでアップデートされる Nginx 等のバージョンは以下の通りとなります。

  • Nginx 1.11.1
  • PHP 5.6.23 or 7.0.8
  • HHVM 3.12.5 ( HHVM 版 Amimoto AMI をご利用の場合 )
  • MySQL 5.6.31

既存の Amimoto AMI のアップデート手順

インスタンスをアップデートする前に万が一の事態に備えてスナップショットを作成しておくことをお勧めします。
スナップショットの作成と、スナップショットからのリストア

ご利用中の Amimoto AMI で、この脆弱性を回避するには Amimoto AMI を最新バージョンにアップデートしていただく必要があります。
これ以降の作業は Amazon Linux 版の Amimoto AMI のアップデート手順となります。
最初にリリースされた Amimoto AMI は CentOS ベースとなっておりました。
CentOS 版については現在メンテナンスされていないため、CentOS 版をご利用のお客様については新しい Amimoto AMI でインスタンスを作成してデータ移行していただくことをお勧めします。

アップデート手順は以下の通りとなります。

Amimoto AMI のバージョン確認

まず、現在の Amimoto AMI のバージョンをご確認ください。
Amimoto AMI のバージョンを確認するにはインスタンスに SSH ログインしていただき、以下のコマンドを実行します。

$ git -C /opt/local/chef-repo/cookbooks/amimoto/ branch
* 2016.01
  • が表示されている文字列が Amimoto AMI を構成している構成ファイルのバージョンとなります。

2016.01 だった場合

上記コマンドを実行して「2016.01」の前に * が表示された場合は、以下の手順でアップデート可能です。

$ curl -L -s https://raw.githubusercontent.com/amimoto-ami/amimoto-update/master/amimoto_update.2016.01.sh | sudo bash

reboot コマンドでインスタンスを再起動する

$ sudo reboot

2016.01 以外、もしくはエラーとなった場合

以下のコマンドを実行することで、最新版の Amimoto AMI と同様の環境になります。
なお、途中で現在インストールされている PHP や MySQL パッケージの削除が実行されますので、不安な場合は新しい Amimoto AMI でインスタンスを作成してデータ移行していただくようお願い致します。

$ curl -L -s https://raw.githubusercontent.com/amimoto-ami/amimoto-update/master/amimoto_update.sh | sudo bash

reboot コマンドでインスタンスを再起動する

$ sudo reboot