2007年11月29日 07:15 [Edit]
Immortal Session の恐怖
さすがの私も、今夜半の祭りにはmaitter。
私のtwitterが荒らされていたのだ。
荒らし発言は消してしまったが、にぽたんがlogを残してくれている。
一部で言われているように、本当にパスワードが抜かれたかどうかまでは解らない。が、状況としてはnowaがベータテスト段階で持っていたCSRF脆弱性をついた荒らしにそっくりだった。
この時も、私のnowaのメッセージに荒らしが入った。パスワードを変更しても暫く荒らしが続いていた点も似ている。
ここでの問題は、
bulkneets@twitter曰く(直接リンクは避けます)問題は本人が気付いてもパスワード変えてもセッション残ってる限りは不正利用者が操作できるってこと。
ということ。twitterにおけるsessionの実装は、どうやらcookie中のsession IDのみのようなのである。しかも複数session idがある状態(例えば複数のブラウザーで同時にsign inするなど)でも、twitter側はすべて認証してしまう。その上パスワードをリセットしても、古いsession IDを消してくれないようなのだ。
これが例えばニコニコ動画だと、違う。それが同一 session と見なされるには、cookie中のsession IDが一致するだけではなく、User Agent(ブラウザー)も一致しなければならないのだ。試しにブラウザーを二つ立ち上げて(例えばFirefoxとIE、FirefoxとSafariなど)、片方でログインしてからもう片方でもログインして、もう片方に戻ってページをリロードしてみるとそれがわかる。おそらくIP Addressの一致も見ていると思うのだが、こちらの方は未確認。
重要なのは、cookieを使ってsession(厳密には疑似セッション)を実装するにあたっては、cookieのみを同一セッションか否かの判断材料としてはいけないということ。さもなければsession IDをコピーするだけでセッションそのものをコピーできてしまう。そしてcookieを奪うのがどれほど簡単かというのは、CSRFの事例が後をたたないことからも伺い知ることができる。
もちろん、パスワードなど、session開始の合図となる情報が変わった場合、過去のsession IDは全て破棄せねばならないことは言うまでもない。これはより優先度が高いと思われる。sessionのしくみを知らない人であればパニックになりかねないからだ。
やれやれ。
今回の荒らしの対処の過程で、removeしたfollowersに対して他意がないことを表明すると同時に、「祭り」を知らせてくれた人々に感謝します。
Dan the Forged Man
P.S
2007-11-29 - odz bufferんー、ニコニコのは UserAgent やら IP を見ているとかじゃなくて、ログインされたときにそのユーザの既存 session を invalidate しているだけじゃないかなぁ。
うーむ、そうかも。いずれにせよ、1 session、1 browserの原則はこれでも確保できる。が、これもcookieのみですかい!?
この記事へのトラックバックURL
表示されるページごとにそのsessionが正当なものかどうかを評価するだけでいいのに。
その度にユーザーのレコードを参照しにいくことになりますけど。
例えば、ユーザーごとにユニークなkey(内部的なID)を持たせておいて
ハッシュ(key + クライアントIP)をsession cookieに入れる。
ページごとにkeyの照合とクライアントIPの照合をする。
これだけでもかなり違うと思いますけどね。
>片方でログインしてからもう片方でもログインして、
>もう片方に戻ってページをリロードしてみるとそれがわかる
ちょっと疑問なのですが、
ユーザーエージェント間でクッキーを共有していない限り、
これでは確認できないんじゃないでしょうか。
クッキーそのものをコピーしないと。
# ニコニコ動画のセッション管理は、
# 1ユーザ1セッション限定なだけだと思っていました。
ちなみにIPでセッションチェックするのは大反対です。
ブラウザ開きっぱなしでもある日つながらなくなるわけです。
>ブラウザ開きっぱなしでもある日つながらなくなるわけです。
何か勘違いしてるみたいですけど、普通はセッション毎のIPをチェックするのである日繋がらなくなるってことは無いですよ。
つまりこういうことです。
ログイン認証
ユーザーの内部idを取り出してIPと合わせてハッシュ後にcookieへ
これで何ができるかというと
セッションをハイジャック(cokkieを盗まれる)されても犯人のIPとユーザーのIPは違うから、このcookieはユーザー本人にしか有効ではない。
ということです。
私の話はそもそもユーザのIPアドレスが可変であることを前提にしています。わかりにくいのはごめんなさい。
たとえば、地下鉄で通信した後にノートPCをたたんで、
マクドナルドでつなげなおす場合ですね。
あるいはプロバイダの都合でIPアドレスが変わる場合でもいいです。
疑問なのですが、この方法で、社内LAN(or 公衆環境)で盗聴された場合に効果がありますか?
みんな同じ外部IPになると思いますが。
それでも、ある種の攻撃者には効果はあるでしょうね。
今回の外の攻撃者の場合だと、効果はあるでしょう。
完全に安全かというと違うと思います。
>マクドナルドでつなげなおす場合ですね。
>あるいはプロバイダの都合でIPアドレスが変わる場合でもいいです。
いずれの場合もIPが変わるということは新しいセッションになるという
ことになるかと。
>疑問なのですが、この方法で、社内LAN(or 公衆環境)で盗聴された場合に効果がありますか?
>みんな同じ外部IPになると思いますが。
それはおっしゃる通りです。
上のコメントで書いたように
>これだけでもかなり違うと思いますけどね。
というレベルのものですよ。
>ことになるかと。
IPアドレスが違うのでそこでウェブアプリがセッションを切ってしまうのでは?
「新しいセッションになる」方法があるなら知りたいです。

