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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
500
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
2
1.5k
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
520
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
500
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
230
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
470
act1-costs.pdf
sumedhbala
0
230
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
霧の中の代数的エフェクト
funnyycat
1
390
Featured
See All Featured
Leo the Paperboy
mayatellez
8
1.9k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
350
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
420
Deep Space Network (abreviated)
tonyrice
0
230
Docker and Python
trallard
47
4k
Practical Orchestrator
shlominoach
191
11k
Building the Perfect Custom Keyboard
takai
2
810
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つとして,脆弱性判定ができるエディタ拡張機能をつくった