【緊急リリース】すべてのバージョンの OpenPNE に存在する、クライアント側キャッシュを経由した非公開情報漏洩の問題への対応のお知らせ (OPSA-2011-004)
09 / 15 木曜日 2011
OpenPNE 2 および OpenPNE 3 には、認証後のページをクライアントに送出する際に、キャッシュ制御に関する指示をおこなっていなかったため、ユーザの利用する環境によっては、非公開情報を含むページの情報がキャッシュ経由で他人に表示されてしまう問題が存在します。
本日 9 月 15 日 (木)、この問題の対策版リリースをおこないましたので、内容を確認のうえ、バージョンアップまたはパッチの適用をお願いいたします。
なお、 OpenPNE 2 については、設定によりこの問題を回避することが可能ですので、本エントリで併せて回避方法を解説していきます。
本問題について
影響を受けるシステム
以下のいずれかの条件に当てはまる場合、本問題の影響を受けます。
- OpenPNE 3.0.8.4 以下、 3.2.7.5 以下、 3.4.15 以下、 3.6beta13 以下を利用しているサイト
- OpenPNE 2 を利用しているサイトで、 OPENPNE_SEND_NO_CACHE_HEADER の設定値が false (デフォルト値)に設定されているサイト
概要
Web ブラウザやプロキシサーバといったクライアントは、パフォーマンス等の観点からレスポンスをキャッシュすることがあります。しかし、サーバから提供されるコンテンツのなかにはキャッシュするべきでない、またはキャッシュに際して留意が必要なものも存在しています。 HTTP では、そのような性質を持ったコンテンツを特定のヘッダを含めてレスポンスすることで、キャッシュの可否や有効期限などといった指示をクライアントに伝えることができます。
ところが、 OpenPNE では、非公開情報が含まれるであろうページであっても、このキャッシュに関する指示をレスポンスに含んでいなかったため、クライアント環境によっては、たとえば以下のような問題が生じていました。
- Internet Explorer などのブラウザで、ログアウトしてもしばらくキャッシュからコンテンツが表示されてしまっていた
- キャッシュ機能を持つプロキシを複数ユーザ間で利用している場合に、プロキシ側にキャッシュされた他のユーザのコンテンツが表示されてしまっていた
なお、 RFC 2616 Hypertext Transfer Protocol — HTTP/1.1 の “13.4 Response Cacheability” によると、今回のようなケースでは、クライアントは(特定の条件を除き)キャッシュの保存や表示をおこなうことができる(MAY)とされています。したがって、ログインユーザや特定の権限を持ったユーザにしか公開しない種類のコンテンツを多く有する OpenPNE でキャッシュ制御の指示がおこなわれていなかったのは、明らかな誤りでした。
想定される影響
クライアント側でのキャッシュを閲覧されてしまうことで、正当な権限を持たない者に非公開情報の取得がおこなわれてしまう恐れがあります。
キャッシュがおこなわれていない、またはキャッシュが削除されたコンテンツに関しては、この問題を利用して正当な権限を持たない者に閲覧されてしまうことはありません。また、プロキシサーバ等によりキャッシュが共有されるケースで、特定のユーザの非公開情報に絞って取得しようとすることは困難であると考えられます。
対策方法・回避方法
対応方法については、本エントリの「本問題への対応方法」をご覧ください。
サーバ側での回避方法
OpenPNE が動作する Web サーバ等において、レスポンスに以下のようなヘッダを強制的に付加するよう設定することで、この問題を回避することができます。
- Expires: Fri, 22 Apr 1988 17:00:00 GMT
- Cache-Control: no-store, no-cache, private, max-age=0, must-revalidate, post-check=0, pre-check=0
- Pragma: no-cache
これらのヘッダを付加する Apache の設定の例は以下の通りです。
<IfModule mod_headers.c> Header set Expires "Fri, 22 Apr 1988 17:00:00 GMT" Header set Cache-Control "no-store, no-cache, private, max-age=0, must-revalidate, post-check=0, pre-check=0" Header set Pragma "no-cache" </IfModule>
ただし、すべてのユーザ間で共通のコンテンツを利用する(たとえば、 JavaScript や CSS などの静的ファイル)場合、常にこの設定値が適用されてしまうことでパフォーマンスが低下する恐れがあります。そのため、このような回避方法が採れる場合でも、「本問題への対応方法」を参考に、抜本的な対策をおこなうことを強く推奨します。
クライアント側での回避方法
キャッシュ機能を持つプロキシサーバを経由して OpenPNE を使用しており、プロキシサーバ側の設定でそのキャッシュ機能を無効にできる場合、ドキュメント等の案内に従ってキャッシュ機能を無効にすることで、この問題の影響を受けなくすることができます。
キャッシュ機能を持つプロキシサーバを経由していないか、キャッシュ機能を無効にしても OpenPNE のコンテンツがキャッシュされる場合、ブラウザ側でキャッシュをおこなっている可能性があります。このような場合は、ブラウザ側でキャッシュの更新確認に関する設定を変更することで、この問題の影響を受けなくすることができます。たとえば、 Internet Explorer を使用している場合は、 Microsoft 社のサポートページ内、「Internet Explorer のキャッシュ設定が Web の参照に与える影響」を参考に、「保存しているページの新しいバージョンの確認」を「ページを表示するごとに確認する」に設定してください。
本問題への対応方法
「影響を受けるシステム」で示した条件を満たすすべてのサイトは、以下の対応を実施してください。
OpenPNE 3
対策版へのマイナーバージョンアップもしくは修正パッチの適用を実施してください。
- OpenPNE 3.6beta14
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.4.15.1
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.2.7.6
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.0.8.5
- [.zip 版ダウンロード] [修正パッチ]
マイナーバージョンアップ手順
パッケージに同梱されているバージョンアップ手順書に記載されている通りに作業を実施してください。
各バージョンのマイナーバージョンアップ手順書は以下からも確認することができます。
- OpenPNE 3.6beta14 バージョンアップ手順書 (バージョンが 3.4 と表記されていますが、この手順は 3.6.x でも有効なものです)
- OpenPNE 3.4.15.1 バージョンアップ手順書
- OpenPNE 3.2.7.6 バージョンアップ手順書
- OpenPNE 3.0.8.5 バージョンアップ手順書
パッチ適用手順
1. OpenPNEを設置しているディレクトリにパッチファイルをアップロードします
2. SSHでログインし、1 のディレクトリに移動します
3. 以下のコマンドを実行します
$ patch -p1 < パッチファイル名
OpenPNE 2
config.php で、以下の設定値を false から true に変更してください。
// ページのキャッシュをさせないヘッダを送信するかどうか // ただしau端末の場合はこの設定にかかわらず、常に「ページのキャッシュをさせないヘッダ」が送信されます define('OPENPNE_SEND_NO_CACHE_HEADER', false);
ただし、この設定項目は OpenPNE 2.8 以下のバージョンには存在しません。 OpenPNE 2.8 以下のバージョンをお使いの方は、前述の各種回避方法を参考に、この問題を回避するようにしてください。
セキュリティ上の問題の報告手順について
OpenPNE プロジェクトでは、以下に案内している通り、セキュリティ上の問題の報告を受け付ける窓口 (security@openpne.jp) を用意しています。
もしセキュリティ上の問題を発見した場合は、通常の公開されたバグ報告の手順を踏むのではなく、 security@openpne.jp に連絡してください。 security@openpne.jp はクローズドなメーリングリストであり、このメーリングリストでおこなわれた脆弱性の詳細情報などのやり取りがそのまま公開されることはありません。