Submit Search
Upload
ReDos検出プログラムの作成とOSSへの適用 #seccamp
•
1 like
•
1,986 views
Y
Yujiro Yahata
Follow
SecurityCamp2020 Z-Ⅲゼミ全体発表資料
Read less
Read more
Software
Report
Share
Report
Share
1 of 16
Download now
Download to read offline
Recommended
ReDosトラック内発表資料
ReDosトラック内発表資料
Yujiro Yahata
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
Masahiro Tomita
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
kaminashi
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
Recommended
ReDosトラック内発表資料
ReDosトラック内発表資料
Yujiro Yahata
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
Masahiro Tomita
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
kaminashi
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
日本語テストメソッドについて
日本語テストメソッドについて
kumake
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
DDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについて
BIGLOBE Inc.
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
Hiroshi Tokumaru
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
一希 大田
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
Kiro Harada
はじめての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 2015
Toru Yamaguchi
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
増田 亨
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
GitHub入門 手順編
GitHub入門 手順編
hideaki honda
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素
NISHIHARA Shota
例外設計における大罪
例外設計における大罪
Takuto Wada
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
Y Watanabe
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
Rakuten Group, Inc.
More Related Content
What's hot
日本語テストメソッドについて
日本語テストメソッドについて
kumake
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
DDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについて
BIGLOBE Inc.
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
Hiroshi Tokumaru
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
一希 大田
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
Kiro Harada
はじめての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 2015
Toru Yamaguchi
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
増田 亨
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
GitHub入門 手順編
GitHub入門 手順編
hideaki honda
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素
NISHIHARA Shota
例外設計における大罪
例外設計における大罪
Takuto Wada
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
Y Watanabe
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
Rakuten Group, Inc.
What's hot
(20)
日本語テストメソッドについて
日本語テストメソッドについて
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
DDDを実践できるエンジニアを育成するための取り組みについて
DDDを実践できるエンジニアを育成するための取り組みについて
UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
ぐるぐるDDD/Scrum - モデリングと実装のうずまきをまわそう
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
OAuth 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マッパーによるトラブルを未然に防ぐ
高速にコンテナを起動できるイメージフォーマット
高速にコンテナを起動できるイメージフォーマット
GitHub入門 手順編
GitHub入門 手順編
ITコミュニティと情報発信に共通する成長と貢献の要素
ITコミュニティと情報発信に共通する成長と貢献の要素
例外設計における大罪
例外設計における大罪
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
ReDos検出プログラムの作成とOSSへの適用 #seccamp
1.
[Z-Ⅲ] ReDoSの検出プログラムの 作成とOSSへの適用 受講生:長﨑 舜, 三浦
優也, 根本 昌也, 片岡 歩夢, 八幡 悠二郎 講師: 新屋 良磨, 藤浪 大弥 チューター:芦田 裕飛 1
2.
ReDoSとは? ReDoS (Regular expression
Denial of Service) 脆弱な正規表現が原因で起こるDoS攻撃。 脆弱な正規表現に特定の文字列が渡されることで 実行に大きな負荷がかかることがある。 2
3.
Z3チームの概要 ESLint DLした OSSプロジェクト 脆弱性検出 ダウンロード GitHub 脆弱性報告 オートマトン理論で ReDoSを検出 3
4.
Z3チームの概要 - ReDoS攻撃が起こる仕組みと、 オートマトン理論を用いた検出方法を学ぶ - ReDoS脆弱性検出プログラムを実装し、 JavaScriptの静的解析ツール(ESLint)に組み込む -
実際のOSSから脆弱性のある正規表現を探し出す - 見つけた脆弱性の報告・修正案を出してOSSに貢献する 4
5.
ReDoSの原因となる正規表現の例 脆弱な正規表現 攻撃文字列の例 1. /^(a|a)*$/
aaaaaaa……aab 2. /^a*a*$/ aaaaaaa……aab 文字列の長さに対してバックトラックに 1は指数時間 2は二乗時間かかる! 5文字列の長さ 処 理 時 間
6.
ReDoSの対象となる正規表現の検出 - オートマトンと呼ばれる、正規表現に対応するグラフ的構造を 解析することで、ReDoSの検出を厳密に行うアルゴリズムが 実装できる。 - アルゴリズムは理論的に複雑。 全体を実装するために書くべきコードの分量も多い。 6
7.
検出アルゴリズムはけっこう複雑 正規表現 構文木 ε-NFA NFA リバース DFA 枝刈り
SCC 直積 直積 SCC SCC EDA IDA 攻撃文字列 生成 7
8.
オートマトン ● 正規表現から構成できるグラフ構造のようなもの。 Google RE2
や GNU grep などの正規表現エンジンにも 採用されている。 ○ 右図は(a|a)*をオートマトン化したグラフの例 ○ q0が初期状態、二重丸が受理状態を表す ○ 初期状態から開始してすべての文字を読み込んだ後に受理 状態に遷移していれば良い ○ ‘aa’の場合q0→q3→q3と移動して受理状態に遷移する 8
9.
バックトラックとは バックトラック 前から順に文字列を見ていき後続のパターンがマッチしない場合、 一つ前のパターンに戻り別のマッチを試す方法 例 正規表現: (a|a)*
文字列: ’aaab’ (a|a)はaもしくはaを意味し、*は0個以上を意味する貪欲な量指定子である (a|a)の左のaにマッチしなくなるまで’aaab’を見ていき、bがマッチしないので一つ 戻って(a|a)の右のaでマッチを試す。最終的にbはマッチしないため左のaと右のa の両方の場合を試し2^4回試行してしまう 9
10.
1 … → 失敗 2
… → 失敗 3 … → 失敗 : 2^n … → 失敗、終了 正規表現の例:/^(a|a)*$/ 入力例: aa...aab 正規表現のオートマトンから、 図のような構造を発見する。 ReDoS原因の構造1: EDA 10
11.
正規表現の例:/^a*a*$/ 入力例: aa...aab EDA構造と同様に正規表現のオートマトンから、 図のような構造を発見する。 ReDoS原因の構造2:
IDA 11 1 … → 失敗 2 … → 失敗 3 … → 失敗 : n … → 失敗、終了
12.
枝刈り 絶対に遷移しない状態におけるEDA、IDA構造は脆弱性に入らない そのため、そのような遷移を取り除く必要がある 正規表現例: /^(.*|(a|a)*)*$/s 上の正規表現では.*ですべての文字列を受理してしまい、ReDoSの原因 (a|a)*に遷移することがない 不要な遷移を取り除くことでReDoSの誤検知を防ぐことができる 12
13.
ESLintについて JavaScriptのコードを静的解析して, 問題がある箇所を指摘できる. コマンドラインの他, VS
Codeなどエディタ上でも使用できる. ▽ 実際にReDoS検出を組み込んだESLint 13
14.
脆弱性検出対象を探す GitHubAPI + Pythonで, スター数順で上位のリポジトリをGitHubからダウンロード クエリ条件 JavaScriptリポジトリ star数が多い順 GitHubAPI制限回避が必要 →
OAuth認証済クエリ 14 OSSプロジェクト
15.
デモ動画 15
16.
実際のOSSで見つかった脆弱性の例 /<(.|n)*?>/ -> /^.*?<(.|n)*?>.*$/ 赤字の部分がIDA構造となり多項式時間がかかる場合がある (攻撃文字列の例:
<<<<<<...) /([ns]+|%[^n]*n)*(.)/ 繰り返しがネストしてかつ末尾の . がnを含まないためバックトラックが起こり、 指数時間がかかる場合がある (攻撃文字列の例: nnnnnn...) 16
Download now