【緊急リリース】OpenPNE 3 に存在するセッション管理の不備に関する複数の脆弱性のお知らせ
12 / 08 水曜日 2010
OpenPNE 3 には、セッション管理の不備に関する複数の脆弱性が存在します。
本日(12/8)、この問題の対策版として OpenPNE 3.0.8.2, 3.2.7.3, 3.4.9.1, 3.6beta7 のリリースをおこないましたので、内容を確認のうえバージョンアップまたはパッチの適用をお願いいたします。
本問題について
影響を受けるシステム
3.0.8.1 以下、 3.2.7.2 以下、 3.4.9 以下、 3.6beta6 以下の OpenPNE を使用しており、以下のどちらかまたはすべての条件を満たしているサイト。
1. セッションストレージにデータベースを設定している
2. 他の OpenPNE 3 とセッション保存先を共有している
※OpenPNE 2 を使用しているサイトは影響を受けません。
概要
OpenPNE のセッション管理が以下に説明するように不適切であったために、ログイン状態の継続などが正しくおこなえない状態にありました。
・(3.0.x を除く) セッションストレージとしてデータベースを使用していた場合に、セッションの継続に用いられるセッション ID を誤った形で保存していました。セッション ID で使われる文字種は、 PHP の設定により異なりますが、少ない場合でも 0-9, a-f となります。しかし、データベース内のセッション保存用のテーブルを誤った設定で構築していたため、本来のセッション ID の数値部分しか保存しない状態にありました。このような状態ではセッション ID が頻繁に衝突するようになるため、自分のセッション ID が他のユーザが使っているセッション ID とみなされてしまうことがあります。また、セッション ID が容易に推測可能であるため、なりすましの危険も高くなります。
・他の OpenPNE 3 とセッション保存先を共有していた際に、他方の SNS 向けのセッション ID をそのまま受け入れてしまう問題がありました。セッションを共有している A と B の SNS があったとして、 A のセッション ID を使って B にアクセスすることで、 A ではメンバー ID が 1 のメンバーが B でもメンバー ID が 1 であるとみなされてしまいます。複数の OpenPNE 間でセッション保存先を共有するのは OpenPNE では想定された使用方法であるはずでした。
想定される影響
条件を満たす SNS において、意図せずに、または故意に別のメンバーとしてアクセスできてしまうことで、非公開情報の漏洩などを許してしまう可能性があります。
対策方法・回避方法
対策方法については、本エントリの「本問題への対応方法」をご覧ください。
回避方法
一時的にこの問題を回避する場合、以下のすべての対策を採ってください。
セッションストレージとしてデータベースを使用しない
ファイルストレージもしくは memcached を使用する
他の OpenPNE 3 とセッション保存先を共有しない
ファイルストレージの場合は ProjectConfiguration.class.php でセッションの保存先パスを他の OpenPNE 3 と別のものに設定する
memcached を使用している場合は、 OpenPNE.yml でセッションの保存先が他の OpenPNE 3 と別のものになるよう設定してください。
本問題への対応方法
「影響をうけるシステム」で示した条件を満たした OpenPNE を利用しているすべての SNS は、対策版へのマイナーバージョンアップもしくは修正パッチの適用を実施してください。
なお、マイナーバージョンアップや修正パッチの適用をおこない、 OpenPNE.yml の check_session_site_identifier の値が true のままであると、既存のすべてのセッションが無効になります。この件についての詳細は、「既存のセッションが無効になることについて」をご覧ください。
- OpenPNE 3.6beta7
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.4.9.1
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.2.7.3
- [.zip 版ダウンロード] [修正パッチ]
- OpenPNE 3.0.8.2
- [.zip 版ダウンロード] [修正パッチ]
マイナーバージョンアップ手順
パッケージに同梱されているバージョンアップ手順書に記載されている通りに作業を実施した後、セッションを DB に正しく保存できるようにするためのコマンドを実行します。
各バージョンのマイナーバージョンアップ手順書は以下から確認することができます。
- OpenPNE 3.6beta7 バージョンアップ手順書 (バージョンが 3.4 と表記されていますが、この手順は 3.6.x でも有効なものです)
- OpenPNE 3.4.9.1 バージョンアップ手順書
- OpenPNE 3.2.7.3 バージョンアップ手順書
- OpenPNE 3.0.8.2 バージョンアップ手順書
通常のマイナーバージョンアップが完了した後、以下のコマンドを実行してください。
$ ./symfony openpne:fix-session-db
パッチ適用手順
1. OpenPNEを設置しているディレクトリにパッチファイルをアップロードします
2. SSHでログインし、1 のディレクトリに移動します
3. 以下のコマンドを実行します
$ patch -p1 < パッチファイル名
4. 以下のコマンドを実行します
$ ./symfony openpne:migrate
$ ./symfony openpne:fix-session-db
既存のセッションが無効になることについて
これは、他の OpenPNE とセッション保存先を共有しても問題にならないよう、セッションデータの形式を変更したために発生する現象です。
セッションが無効になると、ログイン中のメンバーが一斉にログアウトすることになるため、編集中の日記などの情報が失われたり、多くのメンバーが一斉にログインを試みようとすることから一時的に負荷が高くなるといったことが起こりえます。そのため、事前に予告をしたうえで本脆弱性への対応を実施することをお勧めします。
セッションをデータベースに保存しておらず、他の OpenPNE とセッション保存先を共有していないサイト (つまり本脆弱性の影響を受けないサイト) で、既存のすべてのセッションが無効になってしまっては都合が悪い場合、 OpenPNE.yml にて check_session_site_identifier を false に変更することで、セッションデータの形式がバージョンアップ前と同様のものになるため、既存のすべてのセッションが無効になるのを防ぐことができます。
check_session_site_identifier: false
セッションをデータベースに保存している場合
セッションをデータベースに保存している場合は、 check_session_site_identifier を false に変更したとしても、既存のセッションがすべて無効になります。この場合、既存のセッションが無効になることについての回避策は存在しません。
本脆弱性への対策をおこなっていない OpenPNE 3 でセッションをデータベースに保存していた場合、そのセッションの ID は安全なものではなく、この状態で運営を続けることは極めて危険です。早急に「対策方法・回避方法」で示している対応を実施してください。
コメント:1
- 市野川 12-01-16 (月) 22:59
-
いつもOpenPNEを活用させていただいております。
自宅のサーバにあるOpenPNEが3.4.9なのでパッチを適用してみようとした所、マイグレートコマンド実行時に以下のメッセージが出てマイグレートに失敗します。
————
# ./symfony openpne:migrate
PHP Warning: require(/var/www/xxxsns2/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Manager.php): failed to open stream: No such file or directory in /var/www/xxxsns/lib/vendor/symfony/lib/autoload/sfSimpleAutoload.class.php on line 123
PHP Fatal error: require(): Failed opening required ‘/var/www/xxxsns2/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Manager.php’ (include_path=’/var/www/xxxsns/lib/config/../vendor/PEAR/:/var/www/xxxsns/lib/config/../vendor/OAuth/:/var/www/xxxsns/lib/config/../vendor/simplepie/:.:/usr/share/pear:/usr/share/php’) in /var/www/xxxsns/lib/vendor/symfony/lib/autoload/sfSimpleAutoload.class.php on line 123
————
※パスの一部をxxxと伏字にしています。
※コマンドを実行したディレクトリは/var/www/xxxsnsです。/var/www/xxxsns2と言う存在しないディレクトリのファイルを読み込めず失敗しているようにも見えますが、エラーの原因に関して情報をお持ちでしたら、提供いただけると大変助かります。
トラックバック:1
- ピンバック from Tweets that mention 【緊急リリース】OpenPNE 3 に存在するセッション管理の不備に関する複数の脆弱性のお知らせ|OpenPNE -- Topsy.com 10-12-08 (水) 14:44
-
[…] This post was mentioned on Twitter by Kousuke Ebihara, リッチテキストエディタまとめサイト岩崎, リッチテキストエディタまとめサイト岩崎, pnetan, Rimpei Ogawa and others. Rimpei Ogawa said: RT @openpne: 【緊急 […]