SlideShare a Scribd company logo
1 of 16
Download to read offline
[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

More Related Content

What's hot

初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpnCassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpnhaketa
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Yuki Morishita
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較beyond Co., Ltd.
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦うYugo Shimizu
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろうCROOZ, inc.
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Takuya Iwatsuka
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)NTT DATA Technology & Innovation
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要Google Cloud Platform - Japan
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へ【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へHibino Hisashi
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見zaru sakuraba
 

What's hot (20)

初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpnCassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
WayOfNoTrouble.pptx
WayOfNoTrouble.pptxWayOfNoTrouble.pptx
WayOfNoTrouble.pptx
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へ【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へ
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 

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