読者です 読者をやめる 読者になる 読者になる

Flash LSO XSS のお話

3行で頼む

swfobject.js 附属の ExpressInstall.swf を 適当な引数で呼び出して すったもんだの末に www.macromedia.com で alert でたよ.

はじめに

swfobject.js がアレな話 の延長戦的な方向で ExpressInstall に絡んでこういう事例がありましたというお話です.

アレな話の時には,主として 「swfobject.js を使って swf を設置しているページで,不適切な使い方をしてしまうとそのドメインで問題が起きます」という話でしたが,今回は,「不適切な expressInstall.swf ( autoUpdator.swf ) の呼び出しによって flash Plugin のインストール後に www.macromedia.com 上で任意のスクリプトが実行される」というお話です.

これまでの話

ExpressInstall についてはアレな話にも書いてあるわけですが,復習を兼ねてもう少し詳しく,その流れを書くと以下のようになります.

  1. 表示させたいページが swfobject.js で最低限必要な Flash Player Plugin のバージョンを指定する
  2. 指定されたバージョンより新しいのがインストール済みなら目的の swf を貼り付けてお終い.
  3. 指定されたバージョンより古いのしか無かったら目的の swf の代わりに ExpressInstall.swf を呼び出すコードを貼り付ける.このとき,どこの URL から呼び出されたのかが MMredirectURL という変数(flashVars)を介して ExpressInstall.swf に渡される
  4. ExpressInstall.swf は ftpdownload.macromedia.com にある autoUpdater.swf を読み込む
  5. autoUpdater.swf がプラットフォームごとに最適なインストーラをダウンロードして起動
  6. インストールウィザードなりでインストール.
  7. インストーラの最後で覚えておいた URL にリダイレクト.
  8. Player が必要なバージョン以上になっている(はずな)ので目的の swf が表示されるはず

アレな話のときは,3番に問題があったので表示させたいページで XSS となっていましたが,今回はの問題の舞台は7番にあります.

今回の話

簡単に「インストーラの最後で覚えておいた URL にリダイレクト.」と書きましたが,これはだいたい以下の様な流れで実現されています.

  1. 任意のドメイン上で ExpressInstall.swf (以下,ei.swf)が MMredirectURL として flashVars から戻り先 URL を受け取る.
  2. ei.swf が http://fpdownload.macromedia.com/pub/flashplayer/update/current/swf/autoUpdater.swf (以下,au.swf)を読み込む
  3. au.swf に redirectURL として ei.swf から渡す.
  4. au.swf が渡された redirectURL を macromedia.com ドメインの LSO (Local Shared Object) に redirectSO.data.url として保存
  5. (au.swf からインストーラをダウンロード.)
  6. インストール終了後,ブラウザでリダイレクトページ http://www.macromedia.com/software/flash/about/installerRedirect.html を開く
  7. リダイレクトページで http://www.macromedia.com/software/flash/about/so_redirect.swf (以下,so.swf)が読み込まれる
  8. so.swf は au.swf が LSO に保存した redirectSO.data.url を読み出す
  9. so.swf は fscommand を使って LSO から読みだした URL を引数にリダイレクトページのスクリプトの SOredirect_DoFsCommand をコール.
  10. SOredirect_DoFsCommand が window.location.reload( url ) して戻り先 URL にリダイレクト

構成要素はいろいろ有りますが,戻り先 URL の流れに着目して単純にすると

  1. 任意ドメインでの ei.swf
  2. macromedia.com の au.swf
  3. macromedia.com の LSO
  4. → www.macromedia.com の so.swf
  5. → www.macromedia.com のリダイレクトページの window.location

という流れで URL が渡っていきます.

ところが,どこにも URL を検証する処理がないので,こんなかんじで ei.swf を呼び出すときに flashVars を細工してしまうと最終的に www.macromedia.com 上で任意のスクリプトが実行されるということになります.

gist6511895

よくわかりません

映像にするとこういうことです.


20130418002229 - YouTube

影響とか

よくわかりません.

どこか怪しげなサイトで言われるがままに Flash Player のインストールをしてた場合,www.macromedia.com 上で任意のスクリプトが実行されてぬとねの区別がつかない事になってたかもしれません.

あるいは macromedia.com 上のリソースのほとんどが adobe.com へのリダイレクトになっていることと,一部のブラウザが XHR 時のクロスドメインのリダイレクトに対して同一ドメインへの XHR として扱ってたことから,adobe.com 上のリソースにアクセスされてたかもしれませn.

まとめ

flash の LSO も使いようによっては XSS に使えるので開発者の方々は御留意頂ければ幸いです.