SlideShare a Scribd company logo
1 of 17
Download to read offline
[Z-Ⅲ]
ReDoSの検出プログラムの
作成とOSSへの適用
受講生:長崎 舜, 三浦 優也, 根本 昌也, 片岡 歩夢, 八幡 悠二郎
講師: 新屋 良磨, 藤浪 大弥 チューター:芦田 裕飛
Z3チームの概要:ReDoSとは?
ReDoSとは正規表現が原因で起こる DoS攻撃のことです。正規表現のパターンが脆弱で、マッチングの際に 大
量のバックトラックが行われ、実行に負荷がかかることが原因で起こります。
この講義ではまず、バックトラックベースの正規表現エンジンのマッチングの仕組みから始め、なぜ ReDoSのよ
うな攻撃が起こりうるのかを学びます。 ReDoSを検出する技法はいくつかありますが、そのうちのいくつかを実
際にプログラムとして実装し、 JavaScriptのllinter(ESLint)に組み込みます(llinterとはソースコードを静的に解
析して、問題のある箇所を指摘する「プログラムを扱うプログラム」のことです )。
そして、実装したllinterをOSSのアプリケーションやライブラリのソースコードに適用して、 ReDoSを引き起こす可
能性のある正規表現 (脆弱性)を探してもらいます。見つけた脆弱性に対してどのように対処するか検討し、最終
的にはその修正の提案という形で OSSに貢献できたら良いと考えています。
ReDoSの原因となる正規表現の例
(参考ブログ: その正規表現の書き⽅で⽅丈夫? ReDoS 攻撃の怖さと対策⽅法 | yamory Blog)
1. /^(([a-zA-Z0-9])+)+$/
(参考ブログ:正規表現を使ったDoS – ReDoS – yohgaki's blog)
2. /^(a+)+$/
3. /^([a-zA-Z]+)*$/
1,2,3のどの例も、マッチング対象の文字列の長さに対してマッチングに指数時間かかる
場合がある!
ReDoSの対象となる正規表現の検出
● オートマトンと呼ばれる、正規表現に対応するグラフ的構造を解析することで、
ReDoSの検出を厳密に行うアルゴリズムが実装できる.
● アルゴリズムは理論的に結構複雑.アルゴリズム全体を実装するために書くべき
コードの分量もそれなりに多い.
○ 単に「繰り返しの*がネストしている」などを判定するだけでは不十分 !
(*がネストしているからといって必ずしも ReDoSの対象となるわけではない )
○ アルゴリズムの全体像:正規表現からオートマトンへの変換 (Thompson構成法)、
オートマトンの決定化 (部分集合構成法)、オートマトンの直積構造の作成、不要な遷移規則の枝刈
り、強連結成分分解、特定のグラフ構造 (後述するIDA/EDA構造)の検出、などなど....
オートマトン
● 正規表現から構成できるグラフ構造のようなもの.Google RE2 や GNU grep などの正規表現エン
ジンにも採用されている.
● 初期状態と呼ばれる状態(上の例だと状態0)から、受理状態と呼ばれる状態(上の例だと状態3)に
遷移する文字列が、対応する正規表現にマッチする文字列になっている.
例: 0 -b-> 0 -a-> 1 -b-> 2 -a-> 3 と0から3に遷移できるため、文字列babaは[ab]*a[ab][ab]にマッチ
正規表現からε-NFAを構築
Thompson構築を用いて再帰的に組み立てる
a
(文字)
st
(連接)
s|t
(選択)
s*
(繰り返し)
ε-遷移の除去
のような遷移を のように縮約する
NFAからDFAを作る(決定化)
状態の集合を新たにひとつの状態と見る
その文字で遷移できる状態をすべてまとめる
バックトラックとは
例としてd+fooという正規表現に’123boo’という文字列をマッチさせる
dは[0-9]を意味し、+は強欲な量指定子であるので[0-9]にマッチしなくなるまで文字を食
いつぶす。そして[0-9]にマッチしなくなった文字の位置からfooと等しいかマッチを続け
る。マッチが失敗した場合、バックトラックをして数字を読み取る文字位置を一つ前にし
ていく。すべてのバックトラックを終えても正規表現にマッチしなかった場合、全体のマッ
チングが失敗する。
ReDos原因の構造1: EDA
O(2^N)などの指数計算時間かかる正規表現パターンがある
正規表現例: /^(a|a)*$/ 入力例: aaaaab
前ページのバックトラックという機能が原因
このパターンを見つけるために正規表現からオートマトンというグラフ
を構築 + グラフからEDA構造を見つける必要がある
EDA構造を簡単に検出するために強連結成分分解というアルゴリズ
ムをオートマトンに適用して図のような構造を見つける
ここでグラフの直積を取ると構造が見つけやすい
枝刈り
絶対に遷移しない状態におけるEDA、IDA構造は脆弱性に入らない
そのため、絶対に遷移しない遷移を取り除く必要がある
正規表現例: /^(.*|(a|a)*)*$/s
上の正規表現では’.*’ですべての文字列を受理してしまい、ReDosの原因’(a|a)*’に遷移
することがない
不要な遷移を取り除くことでReDosの誤検知を防ぐことができる
IDA検出
正規表現の例: /^a*a*$/, /^(.*)=”(.*)”$/
同じ表現を2つ以上の場所で試すため、O(n^2)など多項式計算時間となる攻撃文字列
が存在する (1つ目の例:aa...aab)
EDA構造と同様に正規表現のオートマトンから強連結成分分解を行い、
図のような構造を発見する。
(同じ文字について自己ループのある状態間に遷移がある)
3状態の直積グラフを作り、
この構造特有の状態があるかどうかで判定する
 
ReDoS原因の構造2つ目:
ESlint
•JavaScriptのソースコードを静的に解析して問題がある
箇所を指摘する
OSSコントリビュートに向けて
•GitHubからJavaScriptで書かれたプロジェクトを探し、
ダウンロードしてくる
↑GitHub APIとPythonを用いてスクレイピング
とりあえず50個のレポジトリをダウンロードしてみた結果
実際のOSSで見つかった脆弱性
/(?:http(?:s)?://)?[w.-]+(?:.[w.-]+)+[w-._~:/?#[]@!$&‘()*+,;=.]+/
[w.-]+と([w.-]+)+で多項式時間がかかる
/(?:#|//)(?:[^?]|?[^>])*/
/<?([^?]|?[^>])+?>/
↑ | の前と後ろで共通してマッチする文字があり指数時間がかかる
ReDoS脆弱性検出までの流れ
● ReDoS脆弱性を検出する関数を作成
● 関数を用いてESLintで脆弱性のあるコードを検出できるように
● 人気の高いJavaScriptが使用されたリポジトリを取得
○ GitHubのAPIを用いて、スター数順にソート上位から持ってくる
● ESLintでリポジトリにLintをかけて検出
現在150リポジトリほどを対象に検出中

More Related Content

What's hot

UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性Hiroshi Tokumaru
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみたzaki4649
 
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功CODE BLUE
 
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門Hiroshi Tokumaru
 
SQLインジェクション総”習”編
SQLインジェクション総”習”編SQLインジェクション総”習”編
SQLインジェクション総”習”編Yasuo Ohgaki
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装uchan_nos
 
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Yurika Kakiuchi
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptotrmr
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎ken_kitahara
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜UnityTechnologiesJapan002
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)Yuki Tamura
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門Kent Ohashi
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門Hiroshi Tokumaru
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpsonickun
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j昌桓 李
 

What's hot (20)

UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
 
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
 
SQLインジェクション総”習”編
SQLインジェクション総”習”編SQLインジェクション総”習”編
SQLインジェクション総”習”編
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
 
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
 
XSS再入門
XSS再入門XSS再入門
XSS再入門
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
 

ReDosトラック内発表資料