Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
正規表現のReDoS脆弱性を判定するVSCode拡張機能
Search
Ran350
May 13, 2024
Programming
430
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
正規表現のReDoS脆弱性を判定するVSCode拡張機能
Ran350
May 13, 2024
More Decks by Ran350
See All by Ran350
2038年問題が思ったよりヤバい。検出ツールを作って脅威性評価してみた論文 | Kansai Open Forum 2024
ran350
8
5.8k
UNIXよ2038年を越えてゆけ
ran350
6
130k
2038年問題の原因となりうるソースコードの自動検出手法の提案と実装 | 研究室 全体ゼミ発表
ran350
0
1.3k
Other Decks in Programming
See All in Programming
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
4.4k
AIエージェントで 変わるAndroid開発環境
takahirom
1
450
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
1
110
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
340
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
210
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
170
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
390
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
250
Featured
See All Featured
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Invisible Side of Design
smashingmag
301
52k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
Ethics towards AI in product and experience design
skipperchong
2
320
YesSQL, Process and Tooling at Scale
rocio
174
15k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
310
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Transcript
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 正規表現の
脆弱性を判定する VSCode拡張機能 1
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 自己紹介 @hoshina350 らん Ran350 https://ran350.github.io/ Webフロントエンド勉強中 自己紹介 2
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 3 正規表現とは 正規表現ってなんや!! 正規表現とは
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 4 正規表現とは 様々な文字列を一つの文字列で表現する表記法
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 5 ???どゆこと
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 6 使い道 入力文字列が条件を満たすかを判定するときによく使う
^[a-zA-Z0-9]+$ 入力文字列が全角半角英数字かを判定したいとき 例
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 7 基本3演算 連接,選択,繰り返し
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 8 連接 rというパターンの直後にeというパターンが続く
例 「re」
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 9 選択 rits
または univ というパターンを表す 例 (rits)|(univ) どちらか一方にマッチするかをみる
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 10 繰り返し r
または rr または rrr または rrrr … にマッチする 例 「r+」 直前のパターンが繰り返されていることを表現
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 11 使ってみる JavaScriptでの例
例題 入力文字が”Rits”かを判定する ただし,”t”は何文字でも良い const regex = /Rit+s/; regex.test( “Ritttts” ); true
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 12 めっちゃ便利やん!
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 13 でも実は…
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 14 ReDoS脆弱性 ReDoS脆弱性 使い方を間違うと危険!
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 15 ReDoS脆弱性とは ReDoS
(Regular Expressions DoS) 評価に非常に長い時間が必要になる正規表現の脆弱性
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 16 脆弱な表現例 (a+)+b
(a|.)+ abc.+def.+
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 17 実験してみる すぐに実行完了する
const regex = /(a|.)+b/; regex.test( “a”.repeat(20) ); 20文字の”a”に対するマッチング
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 18 実験してみる const
regex = /(a|.)+b/; regex.test( “a”.repeat(30) ); ……15秒で実行完了した 30文字の”a”に対するマッチング
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 19 実験してみる …………………
実行が終わらん const regex = /(a|.)+b/; regex.test( “a”.repeat(40) ); 40文字の”a”に対するマッチング
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 20 処理時間が指数関数的に増加
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 21 やばいやん
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 22 事例 事例 サービスへの影響は?
#セキュアシステム開発実験 / @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/ など
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 24 原因 原因 なんで起こるん
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 25 原因 バックトラックが指数関数的に増加してしまうこと
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 26 原因 「(a|.)*」の例では,状態遷移の仕方が一通りに定まらない場合がある
→ 分岐が多くなり2^n通りの比較が必要に
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 27 脆弱な正規表現の具体的な特徴は?
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 28 脆弱な表現① 量指定子がネストされている
• (a*)*b • (a+)+b • (a*){9}
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 29 脆弱な表現② 選択の両方にサブマッチし得るパターンが繰り返されている
• (.|¥w)* • (a|aa)*
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 30 脆弱な表現③ 繰り返し表現が連結している
• (a|b)*(a|c)*d • .*.*d • abc.*def.*
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 31 対策 対策 脆弱な表現を生まないためには?
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 32 対策 脆弱な表現①②③を避ける!
以上!
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 33 せやけど
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 34 対策 世の中の正規表現はしばしば複雑
(?:(?:¥"|'|¥]|¥}|¥¥|¥d|(?:nan|infinity|true|false|null|undefined|symbol|math)|¥`|¥-|¥+)+[)]*;?((?:¥s|-|~|!|{}|¥|¥||¥+)*.*(?:.*=.*)))
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 35 対策 人間の目で脆弱性判定するのは困難
プログラムに判定してもらうほうが適切
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 36 開発環境で脆弱性判定できたらええなぁ もっと言うと…
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 37 探してみたけど...ないなぁ
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 38 つくるか
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 目次 … 自己紹介 正規表現とは
ReDoS脆弱性 事例 原因 対策 VSCode拡張機能 × 39 VSCode拡張機能 VSCode拡張機能 つくった!
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 40 概要 正規表現の脆弱性判定ができる
VScode 拡張機能 ソースコード: https://github.com/Ran350/redos-checker-for-vscode 内部で脆弱性判定ライブラリ recheck を呼び出している https://github.com/MakeNowJust-Labo/recheck
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 41 使い方 1.
脆弱性判定したい正規表現をカーソル選択する 2. 右クリックメニュー or コマンドパレットから拡張機能を実行 3. 判定結果が表示される
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 42 デモ 実演
#セキュアシステム開発実験 / @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"); ステータス出力
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 44 展望 •
誰でも利用できるようにパッケージ化したい ◦ 現在はデバッグモードでの利用 • 脆弱性判定を自前実装したい
#セキュアシステム開発実験 / @hoshina350 #セキュアシステム開発実験 / @hoshina350 × 45 まとめ •
正規表現は 文字列処理でめっちゃ便利 • でも,脆弱な表現では 処理が終わらなくなる危険性もある! • 対策方法の1つとして,脆弱性判定ができるエディタ拡張機能をつくった