Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ハイブリッド型ReDoS検出プログラムの実装 / PROSYM62 - A Hybrid Approach to Detect ReDoS

ハイブリッド型ReDoS検出プログラムの実装 / PROSYM62 - A Hybrid Approach to Detect ReDoS

第62回プログラミング・シンポジウムで発表した「ハイブリッド型ReDoS検出プログラムの実装」の発表スライドです。

実装したプログラムのURL: https://makenowjust-labo.github.io/recheck/
(スライドから変更されています)

TSUYUSATO Kitsune

January 08, 2021
Tweet

More Decks by TSUYUSATO Kitsune

Other Decks in Research

Transcript

  1. 2 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    オートマトンを解析する手法・ファジングを用いる手法・ハイブリッド型 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  2. 3 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    オートマトンを解析する手法・ファジングを用いる手法・ハイブリッド型 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  3. 4 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 time node

    re.js null node re.js 25.16s user 0.15s system 88% cpu 28.463 total $ /^(a|a)*$/ 28 console re = ; .log(re.exec( .repeat( ) + )); 'a' 'b' const 正規表現のマッチをバックトラックを用いて実装した場合に,正規表現によっては, 入力文字列の長さに対して指数時間もしくは2次以上の多項式時間かかる場合がある. ReDoS (Regular Expression Denial of Service) とは,これを利用したDoS 攻撃の一種である. ReDoS とは何か?
  4. 5 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ・2016年 StackOverflow:

    先頭と末尾の空白を取り除く正規表現が原因で 34分間サービスがダウン ・2019年 Cloudflare: WAF のルール中の正規表現が原因で27分間サービスがダウン [Davis2020]によると,現実に利用されている正規表現の10%はReDoSを引き起こしうる. ReDoS とは何か? /(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|u ndefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\ ||\+)*.*(?:.*=.*)))/ /^[\s\u200c]+|[\s\u200c]+$/
  5. 6 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 攻撃文字列 与えられた正規表現が

    ReDoS を引き起こしうるかを判断したい. つまり,マッチ時間が指数的・多項式的となるような を発見したい. 既存の手法: ・オートマトンを解析する手法 ・ファジングを用いる手法 先行研究: ・RegexStaticAnalysis [Weideman2016] (オートマトンを解析する手法) ・regex-matching-analyzer [高橋2020] (オートマトンを解析する手法) ・ReScue [Shen2018] (ファジングを用いる手法) ReDoS とは何か?
  6. 7 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    オートマトンを解析する手法・ファジングを用いる手法・ハイブリッド型 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  7. 8 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 https://makenowjust-labo.github.io/redos 実装した検出プログラムについて

    ・JavaScript (ECMA-262) の正規表現を対象としている.  無制限の後読み,Unicode 文字クラスなどをサポートしている. ・実装言語は Scala.現在12000行程度 (実装6000行,テスト6000行). ・Scala および JavaScript からライブラリとして利用可能. ・ハイブリッド型の ReDoS 検出プログラムである.
  8. 9 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実装した検出プログラムについて ・オートマトンを解析する手法

     Pros: 理論に基づいており,正確な解析が可能である.  Cons: 一部の正規表現の解析をするのに時間がかかる.
   また,一部の構文(後方参照など)は対応が難しい. ・ファジングを用いる手法  Pros: 実際に正規表現マッチエンジンを利用するので,どのような構文でも対応できる.   パラメータの調整によって実行時間の制御がしやすい.  Cons: 乱数を用いるため,false-negative の可能性を排除できない. これらの手法を正規表現に応じて使い分ける (ハイブリッド型) ことによって, これまでよりも多くの正規表現の ReDoS 脆弱性を,現実的な時間で検出できる.
  9. 10 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    ・ファジングを用いる手法・ハイブリッド型 オートマトンを解析する手法 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  10. 11 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 オートマトンを解析する手法 正規表現に対応する

    NFA を構築 バックトラックを 模倣するよう NFA を変更 遷移関数の中に ReDoS の原因となる 部分があるかを判定 オートマトンを解析する手法については [高橋2020] の手法をなぞっただけなので,解説は簡潔にする.
  11. 12 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 オートマトンを解析する手法 正規表現から

    NFA (非決定性有限状態オートマトン) の構築: 通常の Thompson 構成と同様の方法を取る. ただし,行頭 ^,行末 $,単語境界 \b のアサーションを NFA で実現するために, 前の文字列が「改行文字か?」「単語を構築する文字か?」を状態にエンコードする. また,文字を範囲で扱うようにした. /^(a|a)*$/
  12. 13 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 オートマトンを解析する手法 バックトラックの模倣:

    バックトラックの挙動を正しく模倣しないと,誤検出 (false-positive) が起こる. (例: /^(.*|(a|a)*)$/s) これを防ぐために,リバースした NFA から部分集合構成法によって得た DFA を用いて, バックトラックによって通り得ない遷移を取り除き, また可能性のある遷移をすべて含むように NFA を修正する.
  13. 14 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 オートマトンを解析する手法 攻撃文字列は

    ReDoS の原因となる部分の探索: EDA 構造が指数的な場合の原因に,IDA 構造が多項式的な場合の原因になる. これらの構造が遷移関数に含まれているかを検出する (強連結成分分解を用いて可能). このとき のようになる(途中で文字列を繰り返す). EDA 構造 IDA 構造
  14. 15 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    ファジングを用いる手法 オートマトンを解析する手法・ ・ハイブリッド型 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  15. 16 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 失敗した

    脆弱と判断 攻撃に成功した 安全と判断 見つからなかった 実際の攻撃文字列を 生成し,攻撃を 試みる 見つかった 遺伝的アルゴリズムを 実行し,攻撃文字列の 候補を探す 正規表現から
 シード集合を生成 /^a*a*$/ (17ステップ) (100,351ステップ) (2,008,007ステップ) 脆弱と判断
  16. 17 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 ファジングでは,入力文字列を大量に生成し,実際の正規表現マッチエンジンに入力して,

    実行ステップ数が一定の値を越えるものが存在するかを判定する. JavaScript 処理系はいくつか存在するが,今回は QuickJS の正規表現 VM を参考に, ファジング用の正規表現マッチエンジンを実装した. /^abc$/ #000: cap_begin 0 #001: input_begin #002: char 'a' #003: char 'b' #004: char 'c' #005: cap_end 0 #006: done
  17. 18 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 シード集合の決定:

    遺伝的アルゴリズムが上手く動作するように,正規表現からシード集合を生成する. シード集合に含まれる文字列で,VM のコードをなるべく網羅的に実行することが望ましい. VM の実行をトレースし,バックトラックの起こった位置でその原因を記録して, それを回避するような文字列を追加していく. /^abc$/ #000: cap_begin 0 #001: input_begin #002: char 'a' #003: char 'b' #004: char 'c' #005: cap_end 0 #006: done ‘a’ を入力 → #003 で失敗 → ‘b’ を追加すればバックトラックを回避できる?
  18. 19 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 繰り返し構造をもつ文字列

    遺伝的アルゴリズムの実行: ・問題: 実行ステップ数が を越えるような,長さ 以下の文字列を発見する ・適応度: 1文字辺りの実行ステップ数 ・染色体: 繰り返し構造をもつ文字列の例 ≒ 次の 2 文字を n+1 回繰り返す,という記号
  19. 20 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 遺伝的アルゴリズムの実行:

    ある世代 (繰り返し構造をもつ文字列の集合) に対して交叉と突然変異を適用し,次の世代を得る. 次の世代に生き残れるのは適応度順で上から一定数のみ. 世代の中に一定の実行ステップ数を越えるものがあれば,それを元に攻撃文字列の生成を試みる. 一定の世代数を越えても攻撃文字列が生成できなければ,その正規表現は安全とする. 交叉: 2つの繰り返し構造をもつ文字列から,2つの新しい繰り返し構造をもつ文字列を得る. 現在の世代: 新しい世代:
  20. 21 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 突然変異:

    1つの繰り返し構造をもつ文字列を変化させて,新しい繰り返し構造をもつ文字列を得る. 現在の世代: 新しい世代: 文字の更新 文字の挿入 繰り返し指定子の挿入 正規表現中の部分文字列の挿入 部分文字列の複製 部分文字列の削除 繰り返し回数の増減
  21. 22 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ファジングを用いる手法 攻撃文字列の生成:

    繰り返し回数のパラメータを指数的,多項式的と仮定して変化させて,攻撃文字列を生成する. 生成した攻撃文字列でのマッチの実行ステップ数が設定された上限値を越えたなら, 正規表現を脆弱な可能性があると判断する. /^a*a*$/ ( 実行ステップの上限値 は1,000,000とする) 攻撃成功 を越えたので (881ステップ) (2,177ステップ) (20,401ステップ) (2,008,007ステップ) 指数的: 4次の多項式的: 3次の多項式的: 2次の多項式的:
  22. 23 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    ハイブリッド型 オートマトンを解析する手法・ファジングを用いる手法・ 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  23. 24 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ハイブリッド型 前述の通り,オートマトンを解析する手法とファジングを用いる手法には

    得意とする正規表現と苦手な正規表現がある. そこで正規表現に応じて適切に手法を切り替えたい. 戦略: 可能ならばオートマトンを解析する手法を,    無理ならばファジングを用いる手法に切り替える. オートマトンを解析する手法を優先する理由: ・正規表現が小さな場合はファジングを用いるよりも高速 ・正確な検出が可能
  24. 25 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 ハイブリッド型 回数指定の繰り返し回数の

    合計値が一定以上か? 繰り返しを展開した 正規表現の大きさが 一定以上か? オートマトンへと変換が できる正規表現か? 構築したオートマトンの 遷移関数の大きさは 一定以上か? 一定未満 一定以上 /^(a|a){20}$/ /com|org|net|int|edu|gov|.../ /(?<=ba*)(a*)(?=a*b)\1/ /^(a|a)*$/ /^a*a*$/ /aa|bb|cc/ 一定以上 変換できない 一定以上 一定未満 一定未満 変換可能 オートマトンの解析を する手法を採用 ファジングを用いる 手法を採用 ・大きな回数指定の繰り返しが ある 場合 ,  オートマトンの解析で は検出できな い
  脆弱な パターンが 存在するた め. ・オートマトンの大きさ は回数指定 の
  繰り返しを展開した正規表現の大きさ に  ( 原則とし て) 比例するた め. ・ 後方参照や先読み・ 後読みな どは  今回の実装で はオートマトンへの変換を  サポートし ていない .  ( 後方参照はそもそも不可能) ・ 途中でD FAを構築するので ,  正規表現の大きさ以上 にオートマトンが  大き くなる 場合が ある 。
  25. 26 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験および考察 4

    オートマトンを解析する手法・ファジングを用いる手法・ハイブリッド型 各手法の説明 3 実装した検出プログラムについて 2 ReDoS とは何か? 1 アジェンダ
  26. 27 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 実験手法 過去に

    ReDoS 脆弱性があったと報告された JavaScript のパッケージ158個に 含まれる10476個の正規表現からなるデータセットを用意した. これらの正規表現を,10秒をタイムアウトとして,各 ReDoS 検出プログラムに入力し, 結果 (脆弱・安全と判断した,もしくは未サポート,タイムアウト)と実行時間を記録した. 実験をした ReDoS 検出プログラム: ・redos (本研究での実装) ・redos-automaton (本研究でのオートマトンを解析する手法のみを用いたもの) ・redos-fuzzing (本研究でのファジングのみを用いたもの) ・RegexStaticAnalysis [Weideman2016] ・regex-matching-analyzer [高橋2020] ・ReScue [Shen2018]
  27. 30 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 考察 オートマトンを解析する手法が

    脆弱とする正規表現の範囲 ファジングを用いる手法が 脆弱とする正規表現の範囲 ハイブリッド型の検出エンジンが最も多く脆弱な正規表現を発見できたのは, オートマトンを解析する手法が脆弱とする正規表現の範囲と, ファジングを用いる手法が脆弱とする正規表現の範囲が異なるためだと思われる. ハイブリッド型検出エンジンが脆弱とする正規表現の範囲 /^(a{20})*(a{20})*$/ /^(a|a){50}$/
  28. 31 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 結論 ・ファジングを用いる

    ReDoS 検出手法を,繰り返し構造をもつ文字列を利用することで  大きく改善した. ・正規表現によって適切な手法を選択するハイブリッド型 ReDoS 検出プログラムを実装し,  その有効性を確認した. ・ファジングについては,各種パラメータの調整などでさらに結果を改善できる余地がある
  と考えている. ・現在ファジングでしか検出できないような脆弱性を,オートマトンの解析で  検出することはできないだろうか?
  29. 32 第62回 プログラミング・シンポジウム 2021年1月8日(金) 「ハイブリッド型 ReDoS 検出プログラムの実装」藤浪 大弥 参考文献 [Davis2020]

    Davis, J.: On the Impact and Defeat of Regular Expression Denial of Service Virginia Tech (2020) [Shen2018] Shen, Y., Jiang, Y., Xu, C., Yu, P., Ma,X. and Lu, J.:
 ReScue: Crafting regular ex-pression DoS attacks Proceedings of the 33rdACM/IEEE international conference on automated software engineering, ASE 2018, pp.225–235 (2018) [Weideman2016] Weideman, N., van der Merwe, B., Berglund,M. and Watson, B.: Analyzing matching timebehavior of backtracking regular expressionmatchers by using ambiguity of NFA Implementation and application of automata, pp.322–334 (2016) [高橋2020] 高橋和也,南出靖彦:正規表現マッチングの計算量解析ツールの拡張と高速化 第22回プログラミングおよびプログラミング言語ワークショップ(PPL) (2020)