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

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
DDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについてDDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについてBIGLOBE Inc.
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性Hiroshi Tokumaru
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ一希 大田
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそうぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそうKiro Harada
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタSatoyuki Tsukano
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015Toru Yamaguchi
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則増田 亨
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマットAkihiro Suda
 
GitHub入門 手順編
GitHub入門 手順編GitHub入門 手順編
GitHub入門 手順編hideaki honda
 
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素NISHIHARA Shota
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-RetryフレームワークY Watanabe
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングRakuten Group, Inc.
 

What's hot (20)

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
DDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについてDDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについて
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそうぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット
 
GitHub入門 手順編
GitHub入門 手順編GitHub入門 手順編
GitHub入門 手順編
 
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
 

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