Submit Search
Upload
ReDosトラック内発表資料
•
0 likes
•
969 views
Y
Yujiro Yahata
Follow
SecurityCamp2020 Z-ⅢのZトラック内発表資料です。
Read less
Read more
Software
Report
Share
Report
Share
1 of 17
Download now
Download to read offline
Recommended
ReDos検出プログラムの作成とOSSへの適用 #seccamp
ReDos検出プログラムの作成とOSSへの適用 #seccamp
Yujiro Yahata
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」
Masato Kinugawa
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策
Hiroshi Tokumaru
Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試す
monochrojazz
CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!
kazkiti
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Recommended
ReDos検出プログラムの作成とOSSへの適用 #seccamp
ReDos検出プログラムの作成とOSSへの適用 #seccamp
Yujiro Yahata
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」
Masato Kinugawa
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策
Hiroshi Tokumaru
Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試す
monochrojazz
CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!
kazkiti
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
Hiroshi Tokumaru
最近のやられアプリを試してみた
最近のやられアプリを試してみた
zaki4649
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
CODE BLUE
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
Hiroshi Tokumaru
SQLインジェクション総”習”編
SQLインジェクション総”習”編
Yasuo Ohgaki
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
uchan_nos
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策
Yurika Kakiuchi
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
trmr
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
UnityTechnologiesJapan002
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
RDBでのツリー表現入門
RDBでのツリー表現入門
Kent Ohashi
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
Hiroshi Tokumaru
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
sonickun
XSS再入門
XSS再入門
Hiroshi Tokumaru
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李
More Related Content
What's hot
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
Hiroshi Tokumaru
最近のやられアプリを試してみた
最近のやられアプリを試してみた
zaki4649
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
CODE BLUE
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
Hiroshi Tokumaru
SQLインジェクション総”習”編
SQLインジェクション総”習”編
Yasuo Ohgaki
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
uchan_nos
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策
Yurika Kakiuchi
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
trmr
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
UnityTechnologiesJapan002
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
RDBでのツリー表現入門
RDBでのツリー表現入門
Kent Ohashi
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
Hiroshi Tokumaru
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
sonickun
XSS再入門
XSS再入門
Hiroshi Tokumaru
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李
What's hot
(20)
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
最近のやられアプリを試してみた
最近のやられアプリを試してみた
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
SQLインジェクション総”習”編
SQLインジェクション総”習”編
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
RDBでのツリー表現入門
RDBでのツリー表現入門
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
XSS再入門
XSS再入門
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
ReDosトラック内発表資料
1.
[Z-Ⅲ] ReDoSの検出プログラムの 作成とOSSへの適用 受講生:長崎 舜, 三浦
優也, 根本 昌也, 片岡 歩夢, 八幡 悠二郎 講師: 新屋 良磨, 藤浪 大弥 チューター:芦田 裕飛
2.
Z3チームの概要:ReDoSとは? ReDoSとは正規表現が原因で起こる DoS攻撃のことです。正規表現のパターンが脆弱で、マッチングの際に 大 量のバックトラックが行われ、実行に負荷がかかることが原因で起こります。 この講義ではまず、バックトラックベースの正規表現エンジンのマッチングの仕組みから始め、なぜ
ReDoSのよ うな攻撃が起こりうるのかを学びます。 ReDoSを検出する技法はいくつかありますが、そのうちのいくつかを実 際にプログラムとして実装し、 JavaScriptのllinter(ESLint)に組み込みます(llinterとはソースコードを静的に解 析して、問題のある箇所を指摘する「プログラムを扱うプログラム」のことです )。 そして、実装したllinterをOSSのアプリケーションやライブラリのソースコードに適用して、 ReDoSを引き起こす可 能性のある正規表現 (脆弱性)を探してもらいます。見つけた脆弱性に対してどのように対処するか検討し、最終 的にはその修正の提案という形で OSSに貢献できたら良いと考えています。
3.
ReDoSの原因となる正規表現の例 (参考ブログ: その正規表現の書き⽅で⽅丈夫? ReDoS
攻撃の怖さと対策⽅法 | yamory Blog) 1. /^(([a-zA-Z0-9])+)+$/ (参考ブログ:正規表現を使ったDoS – ReDoS – yohgaki's blog) 2. /^(a+)+$/ 3. /^([a-zA-Z]+)*$/ 1,2,3のどの例も、マッチング対象の文字列の長さに対してマッチングに指数時間かかる 場合がある!
4.
ReDoSの対象となる正規表現の検出 ● オートマトンと呼ばれる、正規表現に対応するグラフ的構造を解析することで、 ReDoSの検出を厳密に行うアルゴリズムが実装できる. ● アルゴリズムは理論的に結構複雑.アルゴリズム全体を実装するために書くべき コードの分量もそれなりに多い. ○
単に「繰り返しの*がネストしている」などを判定するだけでは不十分 ! (*がネストしているからといって必ずしも ReDoSの対象となるわけではない ) ○ アルゴリズムの全体像:正規表現からオートマトンへの変換 (Thompson構成法)、 オートマトンの決定化 (部分集合構成法)、オートマトンの直積構造の作成、不要な遷移規則の枝刈 り、強連結成分分解、特定のグラフ構造 (後述するIDA/EDA構造)の検出、などなど....
5.
オートマトン ● 正規表現から構成できるグラフ構造のようなもの.Google RE2
や GNU grep などの正規表現エン ジンにも採用されている. ● 初期状態と呼ばれる状態(上の例だと状態0)から、受理状態と呼ばれる状態(上の例だと状態3)に 遷移する文字列が、対応する正規表現にマッチする文字列になっている. 例: 0 -b-> 0 -a-> 1 -b-> 2 -a-> 3 と0から3に遷移できるため、文字列babaは[ab]*a[ab][ab]にマッチ
6.
7.
正規表現からε-NFAを構築 Thompson構築を用いて再帰的に組み立てる a (文字) st (連接) s|t (選択) s* (繰り返し)
8.
ε-遷移の除去 のような遷移を のように縮約する
9.
NFAからDFAを作る(決定化) 状態の集合を新たにひとつの状態と見る その文字で遷移できる状態をすべてまとめる
10.
バックトラックとは 例としてd+fooという正規表現に’123boo’という文字列をマッチさせる dは[0-9]を意味し、+は強欲な量指定子であるので[0-9]にマッチしなくなるまで文字を食 いつぶす。そして[0-9]にマッチしなくなった文字の位置からfooと等しいかマッチを続け る。マッチが失敗した場合、バックトラックをして数字を読み取る文字位置を一つ前にし ていく。すべてのバックトラックを終えても正規表現にマッチしなかった場合、全体のマッ チングが失敗する。
11.
ReDos原因の構造1: EDA O(2^N)などの指数計算時間かかる正規表現パターンがある 正規表現例: /^(a|a)*$/
入力例: aaaaab 前ページのバックトラックという機能が原因 このパターンを見つけるために正規表現からオートマトンというグラフ を構築 + グラフからEDA構造を見つける必要がある EDA構造を簡単に検出するために強連結成分分解というアルゴリズ ムをオートマトンに適用して図のような構造を見つける ここでグラフの直積を取ると構造が見つけやすい
12.
枝刈り 絶対に遷移しない状態におけるEDA、IDA構造は脆弱性に入らない そのため、絶対に遷移しない遷移を取り除く必要がある 正規表現例: /^(.*|(a|a)*)*$/s 上の正規表現では’.*’ですべての文字列を受理してしまい、ReDosの原因’(a|a)*’に遷移 することがない 不要な遷移を取り除くことでReDosの誤検知を防ぐことができる
13.
IDA検出 正規表現の例: /^a*a*$/, /^(.*)=”(.*)”$/ 同じ表現を2つ以上の場所で試すため、O(n^2)など多項式計算時間となる攻撃文字列 が存在する (1つ目の例:aa...aab) EDA構造と同様に正規表現のオートマトンから強連結成分分解を行い、 図のような構造を発見する。 (同じ文字について自己ループのある状態間に遷移がある) 3状態の直積グラフを作り、 この構造特有の状態があるかどうかで判定する ReDoS原因の構造2つ目:
14.
ESlint •JavaScriptのソースコードを静的に解析して問題がある 箇所を指摘する
15.
OSSコントリビュートに向けて •GitHubからJavaScriptで書かれたプロジェクトを探し、 ダウンロードしてくる ↑GitHub APIとPythonを用いてスクレイピング とりあえず50個のレポジトリをダウンロードしてみた結果
16.
実際のOSSで見つかった脆弱性 /(?:http(?:s)?://)?[w.-]+(?:.[w.-]+)+[w-._~:/?#[]@!$&‘()*+,;=.]+/ [w.-]+と([w.-]+)+で多項式時間がかかる /(?:#|//)(?:[^?]|?[^>])*/ /<?([^?]|?[^>])+?>/ ↑ | の前と後ろで共通してマッチする文字があり指数時間がかかる
17.
ReDoS脆弱性検出までの流れ ● ReDoS脆弱性を検出する関数を作成 ● 関数を用いてESLintで脆弱性のあるコードを検出できるように ●
人気の高いJavaScriptが使用されたリポジトリを取得 ○ GitHubのAPIを用いて、スター数順にソート上位から持ってくる ● ESLintでリポジトリにLintをかけて検出 現在150リポジトリほどを対象に検出中
Download now