twitterにクロスサイトスクリプティング(XSS)脆弱性があればパスワードを変更できる

 秋のDK収穫祭などで騒がれている、いわゆるDK祭り。

さすがの私も、今夜半の祭りにはmaitter。
私のtwitterが荒らされていたのだ。

http://blog.livedoor.jp/dankogai/archives/50959103.html

現象から見てセッションハイジャックされたと思われるが、原因となる脆弱性小飼弾氏の主張どおりCSRF(Cross Site Request Forgeries)だったのか、パスワードは窃取されたのか、元々のパスワードが類推しやすいものだったのかなど、議論を呼んでいる。
私は、現象からみて、原因となる脆弱性CSRFではなく、XSSだったと思う*1twitterXSS脆弱性があれば、セッションハイジャックにより、第三者小飼弾氏になりすまして発言するところまでは可能だ。しかし、一般的にはXSSではパスワードまでは窃取できない。id:hasegawayosuke氏の主張のように、twitterのパスワード変更には現在パスワードの入力が要求されるからだ。

twitterではパスワード変更は今のパスワードの再入力が必要なのでCSRF/XSSでは変更はできない。Forgeされる<前>のパスワードも貧弱だったのではないかと想像。

http://b.hatena.ne.jp/hasegawayosuke/20071201#bookmark-6649055

しかし、twitterの仕様を調査した結果、仮にtwitterXSS脆弱性などがあり、セッションハイジャックができたとすると、第三者がパスワードを変更できることを確認したので報告する。
大きな流れとしては、(1)メールアドレスの変更、(2)パスワードリセット、という順序で行う。

セッションハイジャックしたクラッカーは、twitterのユーザプロファイル変更画面に遷移して、メールアドレスを自分が受け取ることの出来るものに変更する。



次に、パスワードリセットの画面に遷移して、先ほど変更したメールアドレスを入力する。



以下のようなメールが来るので、そのURLを実行する。



以下のようなパスワード変更の画面が表示されるので、好きなパスワード(ユーザIDそのものなど)に変更する。



上記の過程で、現在のパスワードは一度も要求されない。また、元のメールアドレスにメール通知は行かない。本来のユーザの知らないところで、メールアドレスとパスワードが変更されてしまう。
上記は脆弱性ではなく、あくまでtwitterの機能仕様だ。しかし、なんらかの脆弱性があってセッションハイジャックされた場合に、被害を増大させてしまう危険性がある。
twitterは、本来どうすればよいか。以下のような対応が考えられる。

  1. ユーザプロファイル変更時にもパスワードを要求する
  2. パスワードリセットの際に、「秘密の質問」に対する答えを求める
  3. プロファイル変更後にメールにて通知する。メールアドレスが変更された場合は、旧メールアドレスにも通知する。

上記は、重複して採用可能だが、1.を含て実装するのが安全だろう。

なお、メールアドレスの変更がCSRF脆弱性により(勝手に)変更される可能性については、対策済みであることを確認した*2
ユーザ側の対策はどうすればよいか。あまり良いものは思いつかない。twitterは汎用のブラウザを使わず、専用クライアントなどでのみ使用するくらいだろうか。

*1:追記:但し、パスワードが脆弱だった可能性も否定できない。

*2:hiddenフィールドでトークンを渡している