twitterにクロスサイトスクリプティング(XSS)脆弱性があればパスワードを変更できる
秋のDK収穫祭などで騒がれている、いわゆるDK祭り。
さすがの私も、今夜半の祭りにはmaitter。
http://blog.livedoor.jp/dankogai/archives/50959103.html
私のtwitterが荒らされていたのだ。
現象から見てセッションハイジャックされたと思われるが、原因となる脆弱性が小飼弾氏の主張どおりCSRF(Cross Site Request Forgeries)だったのか、パスワードは窃取されたのか、元々のパスワードが類推しやすいものだったのかなど、議論を呼んでいる。
私は、現象からみて、原因となる脆弱性はCSRFではなく、XSSだったと思う*1。twitterにXSS脆弱性があれば、セッションハイジャックにより、第三者が小飼弾氏になりすまして発言するところまでは可能だ。しかし、一般的にはXSSではパスワードまでは窃取できない。id:hasegawayosuke氏の主張のように、twitterのパスワード変更には現在パスワードの入力が要求されるからだ。
twitterではパスワード変更は今のパスワードの再入力が必要なのでCSRF/XSSでは変更はできない。Forgeされる<前>のパスワードも貧弱だったのではないかと想像。
http://b.hatena.ne.jp/hasegawayosuke/20071201#bookmark-6649055
しかし、twitterの仕様を調査した結果、仮にtwitterにXSS脆弱性などがあり、セッションハイジャックができたとすると、第三者がパスワードを変更できることを確認したので報告する。
大きな流れとしては、(1)メールアドレスの変更、(2)パスワードリセット、という順序で行う。
セッションハイジャックしたクラッカーは、twitterのユーザプロファイル変更画面に遷移して、メールアドレスを自分が受け取ることの出来るものに変更する。
次に、パスワードリセットの画面に遷移して、先ほど変更したメールアドレスを入力する。
以下のようなメールが来るので、そのURLを実行する。
以下のようなパスワード変更の画面が表示されるので、好きなパスワード(ユーザIDそのものなど)に変更する。
上記の過程で、現在のパスワードは一度も要求されない。また、元のメールアドレスにメール通知は行かない。本来のユーザの知らないところで、メールアドレスとパスワードが変更されてしまう。
上記は脆弱性ではなく、あくまでtwitterの機能仕様だ。しかし、なんらかの脆弱性があってセッションハイジャックされた場合に、被害を増大させてしまう危険性がある。
twitterは、本来どうすればよいか。以下のような対応が考えられる。
- ユーザプロファイル変更時にもパスワードを要求する
- パスワードリセットの際に、「秘密の質問」に対する答えを求める
- プロファイル変更後にメールにて通知する。メールアドレスが変更された場合は、旧メールアドレスにも通知する。
上記は、重複して採用可能だが、1.を含て実装するのが安全だろう。
なお、メールアドレスの変更がCSRF脆弱性により(勝手に)変更される可能性については、対策済みであることを確認した*2。
ユーザ側の対策はどうすればよいか。あまり良いものは思いつかない。twitterは汎用のブラウザを使わず、専用クライアントなどでのみ使用するくらいだろうか。