Slide 1

Slide 1 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 正規表現の 脆弱性を判定する VSCode拡張機能 1

Slide 2

Slide 2 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 自己紹介 @hoshina350 らん Ran350 https://ran350.github.io/ Webフロントエンド勉強中 自己紹介 2

Slide 3

Slide 3 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 3 正規表現とは 正規表現ってなんや!! 正規表現とは

Slide 4

Slide 4 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 4 正規表現とは 様々な文字列を一つの文字列で表現する表記法

Slide 5

Slide 5 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 5 ???どゆこと

Slide 6

Slide 6 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 6 使い道 入力文字列が条件を満たすかを判定するときによく使う ^[a-zA-Z0-9]+$ 入力文字列が全角半角英数字かを判定したいとき 例

Slide 7

Slide 7 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 7 基本3演算 連接,選択,繰り返し

Slide 8

Slide 8 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 8 連接 rというパターンの直後にeというパターンが続く 例 「re」

Slide 9

Slide 9 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 9 選択 rits または univ というパターンを表す 例 (rits)|(univ) どちらか一方にマッチするかをみる

Slide 10

Slide 10 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 10 繰り返し r または rr または rrr または rrrr … にマッチする 例 「r+」 直前のパターンが繰り返されていることを表現

Slide 11

Slide 11 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 11 使ってみる JavaScriptでの例 例題 入力文字が”Rits”かを判定する ただし,”t”は何文字でも良い const regex = /Rit+s/; regex.test( “Ritttts” ); true

Slide 12

Slide 12 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 12 めっちゃ便利やん!

Slide 13

Slide 13 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 13 でも実は…

Slide 14

Slide 14 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 14 ReDoS脆弱性 ReDoS脆弱性 使い方を間違うと危険!

Slide 15

Slide 15 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 15 ReDoS脆弱性とは ReDoS (Regular Expressions DoS) 評価に非常に長い時間が必要になる正規表現の脆弱性

Slide 16

Slide 16 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 16 脆弱な表現例 (a+)+b (a|.)+ abc.+def.+

Slide 17

Slide 17 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 17 実験してみる すぐに実行完了する const regex = /(a|.)+b/; regex.test( “a”.repeat(20) ); 20文字の”a”に対するマッチング

Slide 18

Slide 18 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 18 実験してみる const regex = /(a|.)+b/; regex.test( “a”.repeat(30) ); ……15秒で実行完了した 30文字の”a”に対するマッチング

Slide 19

Slide 19 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 19 実験してみる ………………… 実行が終わらん const regex = /(a|.)+b/; regex.test( “a”.repeat(40) ); 40文字の”a”に対するマッチング

Slide 20

Slide 20 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 20 処理時間が指数関数的に増加

Slide 21

Slide 21 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 21 やばいやん

Slide 22

Slide 22 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 22 事例 事例 サービスへの影響は?

Slide 23

Slide 23 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 23 事例 ● 2016年,Stack Overflowのサーバが ReDoS脆弱性が原因でダウン https://stackstatus.net/post/147710624694/outage-postmortem-july-20-2016 ● 2019年,Cloudflareが提供する全世界のCDNが, ReDoS脆弱性が原因でダウン https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/ など

Slide 24

Slide 24 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 24 原因 原因 なんで起こるん

Slide 25

Slide 25 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 25 原因 バックトラックが指数関数的に増加してしまうこと

Slide 26

Slide 26 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 26 原因 「(a|.)*」の例では,状態遷移の仕方が一通りに定まらない場合がある → 分岐が多くなり2^n通りの比較が必要に

Slide 27

Slide 27 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 27 脆弱な正規表現の具体的な特徴は?

Slide 28

Slide 28 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 28 脆弱な表現① 量指定子がネストされている ● (a*)*b ● (a+)+b ● (a*){9}

Slide 29

Slide 29 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 29 脆弱な表現② 選択の両方にサブマッチし得るパターンが繰り返されている ● (.|¥w)* ● (a|aa)*

Slide 30

Slide 30 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 30 脆弱な表現③ 繰り返し表現が連結している ● (a|b)*(a|c)*d ● .*.*d ● abc.*def.*

Slide 31

Slide 31 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 31 対策 対策 脆弱な表現を生まないためには?

Slide 32

Slide 32 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 32 対策 脆弱な表現①②③を避ける! 以上!

Slide 33

Slide 33 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 33 せやけど

Slide 34

Slide 34 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 34 対策 世の中の正規表現はしばしば複雑 (?:(?:¥"|'|¥]|¥}|¥¥|¥d|(?:nan|infinity|true|false|null|undefined|symbol|math)|¥`|¥-|¥+)+[)]*;?((?:¥s|-|~|!|{}|¥|¥||¥+)*.*(?:.*=.*)))

Slide 35

Slide 35 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 35 対策 人間の目で脆弱性判定するのは困難 プログラムに判定してもらうほうが適切

Slide 36

Slide 36 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 36 開発環境で脆弱性判定できたらええなぁ もっと言うと…

Slide 37

Slide 37 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 37 探してみたけど...ないなぁ

Slide 38

Slide 38 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 38 つくるか

Slide 39

Slide 39 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 39 VSCode拡張機能 VSCode拡張機能 つくった!

Slide 40

Slide 40 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 40 概要 正規表現の脆弱性判定ができる VScode 拡張機能 ソースコード: https://github.com/Ran350/redos-checker-for-vscode 内部で脆弱性判定ライブラリ recheck を呼び出している https://github.com/MakeNowJust-Labo/recheck

Slide 41

Slide 41 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 41 使い方 1. 脆弱性判定したい正規表現をカーソル選択する 2. 右クリックメニュー or コマンドパレットから拡張機能を実行 3. 判定結果が表示される

Slide 42

Slide 42 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 42 デモ 実演

Slide 43

Slide 43 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 43 機能構成 選択範囲を取得 const editor = vscode.window.activeTextEditor; const document = editor.document; const selectedArea = editor.selection; const regex = document.getText(selectedArea); 脆弱性判定 const result = check(regex, ""); vscode.window.showWarningMessage("vulnerable.", "More"); ステータス出力

Slide 44

Slide 44 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 44 展望 ● 誰でも利用できるようにパッケージ化したい ○ 現在はデバッグモードでの利用 ● 脆弱性判定を自前実装したい

Slide 45

Slide 45 text

#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 45 まとめ ● 正規表現は 文字列処理でめっちゃ便利 ● でも,脆弱な表現では 処理が終わらなくなる危険性もある! ● 対策方法の1つとして,脆弱性判定ができるエディタ拡張機能をつくった