SlideShare une entreprise Scribd logo
1  sur  16
Télécharger pour lire hors ligne
[Z-Ⅲ]
ReDoSの検出プログラムの
作成とOSSへの適用
受講生:長﨑 舜, 三浦 優也, 根本 昌也, 片岡 歩夢, 八幡 悠二郎
講師: 新屋 良磨, 藤浪 大弥 チューター:芦田 裕飛
1
ReDoSとは?
ReDoS (Regular expression Denial of Service)
脆弱な正規表現が原因で起こるDoS攻撃。
脆弱な正規表現に特定の文字列が渡されることで
実行に大きな負荷がかかることがある。
2
Z3チームの概要
ESLint
DLした
OSSプロジェクト
脆弱性検出
ダウンロード
GitHub
脆弱性報告
オートマトン理論で
ReDoSを検出
3
Z3チームの概要
- ReDoS攻撃が起こる仕組みと、
オートマトン理論を用いた検出方法を学ぶ
- ReDoS脆弱性検出プログラムを実装し、
JavaScriptの静的解析ツール(ESLint)に組み込む
- 実際のOSSから脆弱性のある正規表現を探し出す
- 見つけた脆弱性の報告・修正案を出してOSSに貢献する
4
ReDoSの原因となる正規表現の例
脆弱な正規表現 攻撃文字列の例
1. /^(a|a)*$/  aaaaaaa……aab
2. /^a*a*$/  aaaaaaa……aab
 文字列の長さに対してバックトラックに
1は指数時間
2は二乗時間かかる!
5文字列の長さ
処
理
時
間
ReDoSの対象となる正規表現の検出
- オートマトンと呼ばれる、正規表現に対応するグラフ的構造を
解析することで、ReDoSの検出を厳密に行うアルゴリズムが
実装できる。
- アルゴリズムは理論的に複雑。
全体を実装するために書くべきコードの分量も多い。
6
検出アルゴリズムはけっこう複雑
正規表現
構文木
ε-NFA NFA
リバース DFA
枝刈り SCC
直積
直積 SCC
SCC
EDA
IDA
攻撃文字列
生成
7
オートマトン
● 正規表現から構成できるグラフ構造のようなもの。
Google RE2 や GNU grep などの正規表現エンジンにも
採用されている。
○ 右図は(a|a)*をオートマトン化したグラフの例
○ q0が初期状態、二重丸が受理状態を表す
○ 初期状態から開始してすべての文字を読み込んだ後に受理
状態に遷移していれば良い
○ ‘aa’の場合q0→q3→q3と移動して受理状態に遷移する
8
バックトラックとは
バックトラック
前から順に文字列を見ていき後続のパターンがマッチしない場合、
一つ前のパターンに戻り別のマッチを試す方法
例 正規表現: (a|a)* 文字列: ’aaab’
(a|a)はaもしくはaを意味し、*は0個以上を意味する貪欲な量指定子である
(a|a)の左のaにマッチしなくなるまで’aaab’を見ていき、bがマッチしないので一つ
戻って(a|a)の右のaでマッチを試す。最終的にbはマッチしないため左のaと右のa
の両方の場合を試し2^4回試行してしまう
9
1    …    → 失敗
2    …    → 失敗
3    …    → 失敗
:
2^n    …    → 失敗、終了
正規表現の例:/^(a|a)*$/ 入力例: aa...aab
正規表現のオートマトンから、
図のような構造を発見する。
ReDoS原因の構造1: EDA
10
正規表現の例:/^a*a*$/  入力例: aa...aab
EDA構造と同様に正規表現のオートマトンから、
図のような構造を発見する。
ReDoS原因の構造2: IDA
11
1    …    → 失敗
2    …    → 失敗
3    …    → 失敗
:
n    …    → 失敗、終了
枝刈り
絶対に遷移しない状態におけるEDA、IDA構造は脆弱性に入らない
そのため、そのような遷移を取り除く必要がある
正規表現例: /^(.*|(a|a)*)*$/s
上の正規表現では.*ですべての文字列を受理してしまい、ReDoSの原因
(a|a)*に遷移することがない
不要な遷移を取り除くことでReDoSの誤検知を防ぐことができる
12
ESLintについて
JavaScriptのコードを静的解析して, 問題がある箇所を指摘できる.
コマンドラインの他, VS Codeなどエディタ上でも使用できる.
▽ 実際にReDoS検出を組み込んだESLint
13
脆弱性検出対象を探す
GitHubAPI + Pythonで,
スター数順で上位のリポジトリをGitHubからダウンロード
クエリ条件
JavaScriptリポジトリ
star数が多い順
GitHubAPI制限回避が必要
→ OAuth認証済クエリ
14
OSSプロジェクト
デモ動画
15
実際のOSSで見つかった脆弱性の例
/<(.|n)*?>/ -> /^.*?<(.|n)*?>.*$/
赤字の部分がIDA構造となり多項式時間がかかる場合がある
(攻撃文字列の例: <<<<<<...)
/([ns]+|%[^n]*n)*(.)/
繰り返しがネストしてかつ末尾の . がnを含まないためバックトラックが起こり、
指数時間がかかる場合がある
(攻撃文字列の例: nnnnnn...)
16

Contenu connexe

Tendances

MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?Masahito Zembutsu
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...NTT DATA Technology & Innovation
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能Tadahiro Ishisaka
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
 
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについてCentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについてNobuyuki Sasaki
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group CommitTakanori Sejima
 
その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?Narimichi Takamura
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策 文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策 Hiroshi Tokumaru
 

Tendances (20)

MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについてCentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 
その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
PostgreSQL失敗談
PostgreSQL失敗談PostgreSQL失敗談
PostgreSQL失敗談
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策 文字コードに起因する脆弱性とその対策
文字コードに起因する脆弱性とその対策
 

ReDos検出プログラムの作成とOSSへの適用 #seccamp