昨日騒ぎになったTwitterのXSS脆弱性によって実際に受けそうな被害とその対策

何が出来るのか

どんな脆弱性かの詳細はこちらを参照2010 年 9 月 21 日現在のツイッターのバグ(脆弱性)について
外部JavaScriptを読み込むコードを仕込めたので、
どんなJavaScriptでも実行できる状態でした。
以下、JavaScriptの実行によってTwitter上で出来る事。

セッションハイジャック

JavaScriptからcookieを参照できるのでログイン状態のセッションIDも参照できます。
また、任意のJavaScriptが実行できる以上、参照したセッションIDを攻撃者のサーバ等に送信することも出来ます。
攻撃者は奪ったセッションIDをcookieに設定すれば、被害者のアカウントでtweet,direct messageの閲覧・送信が出来ます。
確認してみたところ、ログイン状態のセッションIDはログアウトしても無効にはなりません
設定→パスワードからパスワード変更操作をすれば(変更前後のパスワードが同一でも)以前のセッションIDを無効にできます。

セッションハイジャックで出来る事・出来無い事

本来のユーザがログインしている状態と同じなので大抵のことは出来ますが、以下のことは出来ません。

  • 現在のパスワードを参照する
    • そもそもWebから現在のパスワードを参照する機能がありません
  • ユーザ情報の変更
  • パスワードの変更
    • これらは変更実施時に現在のパスワードを入力する必要があるので、パスワードを知らない状態では出来ません

ブラウザにパスワードを覚えさせている場合のパスワード奪取の可能性

ブラウザにパスワードを覚えさせている場合、JavaScriptで偽のログインフォームを作成し、
usernameに現在ログインしているユーザ名=いつもログインしているユーザ名を入れ、
ブラウザに入力させたパスワードを取得するということができそうです。


ただ、最近のブラウザの場合、最初からHTMLに含まれているformについてのみパスワード入力補完の対象になるようで、
JavaScriptで動的に作成したフォームにはパスワードを入れないようです。
Firefox3.6,Google Chrome6,Safari5については大丈夫なのを確認しました。
また、IE6はダメ(JavaScriptで動的に作成したフォームにはブラウザが覚えているパスワードが入ってしまう)なことも確認しました。


http://twitter.com/ の右上のログインフォームからログインしてパスワードを覚えさせている状態で、
以下をアドレスバーに貼りつけて実行し、一番下に表示されたログインフォームにユーザ名を入れて、
パスワードが自動入力されなければOKです。

javascript:$('<form method="post" action="https://twitter.com/sessions" id="signin"><input name="session[username_or_email]" id="username" type="text"><input name="session[password]" id="password" type="password"><input id="signin_submit" type="submit"></form>').appendTo('body');void(0);

今からやっておくといい対策

セッションハイジャックされてたらログアウトしても無駄なので、
同じパスワードでいい=実際には変更しなくていいのでパスワード変更操作をしておく。
IE6等パスワード奪取の可能性があるブラウザで踏んでしまった場合は、
ちゃんとパスワードを違うものに変更しておく。