190 likes | 313 Views
アスペクト指向プログラミングにおける データフローポイントカット. 河内 一了 増原 英彦 東京大学総合文化研究科 {kazu,masuhara}@graco.c.u-tokyo.ac.jp. 研究の概要. データフローに基づくポイントカットの実現 target: AspectJ[Kiczales+01] のようなAOP言語 = Pointcut-and-Advice 機構 applications: セキュリティ分野での応用 Integrity. WebアプリケーションでHTMLを出力する際に
E N D
アスペクト指向プログラミングにおけるデータフローポイントカットアスペクト指向プログラミングにおけるデータフローポイントカット 河内 一了 増原 英彦東京大学総合文化研究科 {kazu,masuhara}@graco.c.u-tokyo.ac.jp
研究の概要 • データフローに基づくポイントカットの実現 • target: AspectJ[Kiczales+01]のようなAOP言語 =Pointcut-and-Advice機構 • applications: セキュリティ分野での応用 • Integrity WebアプリケーションでHTMLを出力する際に ユーザ入力文字列に由来している出力文字列からメタキャラクタを取り除く SPA-SUMMER 2004 : AOP Workshop
問題意識とアプローチ • セキュリティ分野での応用 (e.g. XSS) ⇒既存のAOP技術では直接的な記述が困難 • 注目すべき要素: データ・情報のフロー≠制御構造 • データフローに注目する機構を言語に追加 • AspectJに対して新たなポイントカットを追加 SPA-SUMMER 2004 : AOP Workshop
Browser 例:XSS対策 • クロスサイトスクリプティング (XSS): • Webアプリケーションがユーザ入力をそのままHTMLとして返す ことで発生する問題 web-application cracker HTML script 個人情報など XSS対策(サニタイジング):HTMLに含まれるメタキャラクタのクォート・削除 SPA-SUMMER 2004 : AOP Workshop
public class DefaultView implements View { GreetingCardApplication application; static BufferedReader bufread = new BufferedReader(new InputStream public DefaultView (GreetingCardApplication{ this.application = app; } String input(){ String in = null; try { in = bufread.readLine(); public class MessageInputView ext public void makeView(){ System.out.println(); System.out.println( "=====MessageInputView= System.out.println( "Welcome to Mr./Mrs. " + us template = templates.getTem System.out.println(template); for(int i = 0; i < template.get public class MessageConfirmView e public void makeView(){ System.out.println(); System.out.println( "=====MessageConfirmVie System.out.println("Your messa System.out.println(page); System.out.println( "Comfirm your message. Th do { public class En extends Defau public EndVi (GreetingCard app){ super(app); XSS対策は横断的である • 出力を生成し、 • その出力される文字列がユーザ入力に由来する場合 out.print(s) ⇒ out.print(quote(s)) に変更する • 多くの出力クラスが存在⇒XSSは横断的 サニタイジング public class EndView exte public EndView (Greetin super(app); } public void makeView(){ System.out.println(); System.out.println( "=====EndVie クォートされるべき 出力箇所 public class MessageC extends DefaultView public void makeVie System.out.println System.out.println( "=====Mess public class MessageC extends DefaultView public void makeVie System.out.println System.out.println( "=====Mess SPA-SUMMER 2004 : AOP Workshop public class MessageC extends DefaultView public void makeVie System.out.println System.out.println( "=====Mess
aspect Sanitizing { void around(String s) : call(* PrintWriter.print*(String)) && within(Servlet+) && args(s){ proceed(quote(s)); } … } AspectJでの実装の問題点(1) • 出力箇所をポイントカットとして指定できるが不必要なサニタイジングを行ってしまう SPA-SUMMER 2004 : AOP Workshop
AspectJでの実装の問題点(2) • 出力とユーザ入力の突合せを行っても「ユーザ入力を加工した値」を対象とできない aspect Sanitizing { Set reqStrs = …; after() returning (String s) : call(* Request.get(String)) { reqStrs.add(s); } void around(String s) : call(* PrintWriter.print*(String)) && within(Servlet+) && args(s) && if(reqStrs.contains(s)) { proceed(quote(s)); } … } ユーザ入力を格納しておき、 それが出力であるか判定 SPA-SUMMER 2004 : AOP Workshop
データフローポイントカット:dflow • 設計 • 別のポイントカットとの組み合わせ • 実用に向けての記述:条件の詳細化 • 実装 • ”フラグ”によるデータ依存関係の表現 • コンパイル時の”フラグ付け”アドバイス・”フラグ確認”アドバイスの追加 • バイトコード変換によるプリミティブ値に関するデータ依存関係追跡バイトコードの追加 SPA-SUMMER 2004 : AOP Workshop
aspect Sanitizing { void around (String s) : call(void print(String)) && args(s) && dflow[ s, userinput ] ( call(String Request.get()) && returns(userinput) ) { proceed(quote(s)); } … } dflow[ s, String userinput ] ( call(String Request.get()) && returns(userinput) ) dflowによるXSS対策のコード例 sanitizing • 出力を生成し、 • out.print(s) ⇒ out.print(quote(s)) に変更する その出力文字列がユーザ入力に由来する場合 • 宣言的な記述 • 他のポイントカットと組合せて記述 SPA-SUMMER 2004 : AOP Workshop
aspect Sanitizing { void around (String s) : call(void print(String)) && args(s) && dflow[ s, userinput ] ( call(String Request.get()) && returns(userinput) ) { proceed(quote(s)); } … } dflow[ s, String userinput ] ( call(String Request.get()) && returns(userinput) ) dflowの動作 (1) web app.’s activity サブポイントカットで束縛される値かどうかを判定する Req get “<script…” 返り値 … 定数 “<a href=…” 引数 print quote 引数 print SPA-SUMMER 2004 : AOP Workshop
aspect Sanitizing { void around (String s) : call(void print(String)) && args(s) && dflow[ s, userinput ] ( call(String Request.get()) && returns(userinput) ) { proceed(quote(s)); } … } dflow[ s, String userinput ] ( call(String Request.get()) && returns(userinput) ) dflowの動作 (2) web app.’s activity 依存関係を追跡する- 計算された値- その他のモジュール Req get “<script…” “Dear ” + “Dear <script…” print quote SPA-SUMMER 2004 : AOP Workshop
native code 補助記述 • bypassing:あるデータの依存関係の追跡をやめる • サニタイジングの重複を避ける • propagate:明示的な依存関係を定義する • ネイティブコードへの対応 SPA-SUMMER 2004 : AOP Workshop
実装のアイデア dflowを含むソースコード フラグ用フィールド フラグ付加・確認アドバイス プリミティブ値の依存関係追跡バイトコード 仮想バイトコード 仮想命令⇒JVMバイトコードへの変換 JVMバイトコード SPA-SUMMER 2004 : AOP Workshop
実装のアイデア • フラグによる依存関係の表現 • dflow記述ごとにIDを割り振り、フラグ用フィールドのIDビット目の値で依存関係を表現 • 各オブジェクトに対してinter-type declarationを用いてフラグ用フィールドを追加 • 各プリミティブに対して • フィールドであればプリミティブが定義されたクラスにフラグ用フィールドを追加 • ローカル変数であればフラグ用の仮想スタックで管理 SPA-SUMMER 2004 : AOP Workshop
実装のアイデア • フラグ付加・フラグ確認アドバイスの追加 • AspectJコンパイラを改造 SPA-SUMMER 2004 : AOP Workshop
実装のアイデア • プリミティブ値のデータ依存関係追跡用バイトコードの追加 • フラグの値を計算するための仮想バイトコード • 仮想スタックを用意:ローカル変数で実現 • バイトコード⇒仮想バイトコード⇒バイトコード • iadd ⇒ iadd; flmerge; ⇒ iadd; iload N; iload M; ior; istore M; SPA-SUMMER 2004 : AOP Workshop
実装のアイデア dflowを含むソースコード フラグ用フィールド フラグ付加・確認アドバイス プリミティブ値の依存関係追跡バイトコード 仮想バイトコード 仮想命令⇒JVMバイトコードへの変換 JVMバイトコード SPA-SUMMER 2004 : AOP Workshop
まとめ • データフローに基づくポイントカット dflow • dflow [ destination, T source ] ( sourceを束縛するポイントカット記述 ) • destination の値が source で束縛される値に依存していればマッチする • 現在 言語の設計と実装を進めている • 非常にナイーブな実装なので今後の高速化が課題 SPA-SUMMER 2004 : AOP Workshop