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
Node.jsセキュリティ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hasegawayosuke
March 11, 2019
Programming
14
5.4k
Node.jsセキュリティ
OWASP Night 2019-03-11 / OWASP Japan
hasegawayosuke
March 11, 2019
Tweet
Share
More Decks by hasegawayosuke
See All by hasegawayosuke
これからのフロントエンドセキュリティ
hasegawayosuke
36
14k
SSRF基礎
hasegawayosuke
26
15k
脆弱性診断を通じて見えてくるWebセキュリティ
hasegawayosuke
12
5k
プロキシーツールとかを使うときの小技
hasegawayosuke
11
3.5k
All Your REJECT Are Belong To Us - リジェクトする側から -
hasegawayosuke
4
2.7k
あなたのWebアプリケーション OWASP TOP 10に対応できていますか?
hasegawayosuke
0
520
WebアプリをOWASP TOP 10に対応させよう / #shibuyaxss techtalk #10
hasegawayosuke
8
3.1k
Other Decks in Programming
See All in Programming
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
130
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
280
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
280
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.1k
並行開発のためのコードレビュー
miyukiw
0
150
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
CSC307 Lecture 04
javiergs
PRO
0
660
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
SourceGeneratorのススメ
htkym
0
200
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
180
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
75
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
Design in an AI World
tapps
0
140
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
160
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Navigating Weather and Climate Data
rabernat
0
110
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
350
Transcript
2019-03-11 OWASP Night Node.js セキュリティ OWASP Kansai チャプターリーダー はせがわようすけ
長谷川陽介 (はせがわようすけ) (株)セキュアスカイ・テクノロジー 取締役CTO
[email protected]
http://utf-8/jp/ 千葉大学 非常勤講師 OWASP Kansai
チャプターリーダー OWASP Japan ボードメンバー CODE BLUEカンファレンス レビューボードメンバー
OWASP Night / 2019-03-11 #owaspjapan t OWASP Kansai Chapter 自分たちの直面するWebセキュリティの問題を
自分たちの手で解決したい! 日本で2番目の OWASP Local Chapter 2014年3月から 京都・大阪・神戸・奈良 で Local Chapter Meeting (勉強会) を開催 Webセキュリティの悩み事を気楽に相談し情報共有できる場 スキル、役職、業種、国籍、性別、年齢に関係なし
OWASP Night / 2019-03-11 #owaspjapan t 今日のテーマ 「Node.jsなWebアプリのセキュリティ」
OWASP Night / 2019-03-11 #owaspjapan t Node.jsなWebアプリのセキュリティ 普通のWebアプリと同様の対策 SQLi対策、XSS対策、CSRF対策、SSRF対策…
Node.js特有の問題点への対策 同期処理によるブロック prototype汚染 Node.jsのコーディング、運用上の配慮 eslint使おう npm outdated / npm auditでモジュールの更新管理
OWASP Night / 2019-03-11 #owaspjapan t Node.jsなWebアプリのセキュリティ 普通のWebアプリと同様の対策 SQLi対策、XSS対策、CSRF対策…
Node.js特有の問題点への対策 同期処理によるブロック prototype汚染 Node.jsのコーディング、運用上の配慮 eslint使おう npm outdated / npm auditでモジュールの更新管理 今日はここの話
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック Node.jsは非同期型のイベント駆動 イベントループにてイベントの発生を継
続的に監視 I/Oなどは非同期に実行される イベントループが停止するとアプリ ケーション全体が止まる イベントループを止めないよう各処理は 速やかに処理を終えるか非同期に実行 する必要がある 出力よろしく! 入力きた? コールバック関数 出力終わった? きたよ! libuv / OS まだだよ! Node.js イベントループ まかせろ!
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック イベントループが止まるとアプリケー ション全体が止まる
CPUのみで行う処理などは同期的に実 行され他のイベントが実行されない 膨大な計算処理、時間のかかる正規表 現、巨大な配列の処理、JSON.parseな ど 攻撃者が意図的にそのような状況を 作り出すことができるとDoSを発生さ せられる 出力よろしく! 入力きた? コールバック関数 出力終わった? きたよ! libuv / OS まだだよ! Node.js イベントループ まかせろ!
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック - ReDoS 正規表現によるDoS
(ReDoS) 正規表現のパターンによっては内部的に膨大な照合処理が行われ る 意図的にこの状態を攻撃者が作り出すことでパフォーマンスが低下 する const re = /([a-z]+)+$/; re.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!'); //秒単位で処理時間がかかる https://gist.github.com/watson/7682ee718b9cf4aa2a5a605a3fb4a552 より
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック - ReDoS 対策
量指定子の回数を制限する 「+」や 「*」 ではなく 「{0,20}」 など safe-regexモジュールなどを用いて事前にパターンの検査を行う 正規表現を使わなくていい箇所では使わない String.prototype.includes や String.prototype.startWith などを 使用
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック - JSON.parse JSON.parseは同期的に処理され、パース中は他のイベント処理は
実行されない 巨大な文字列のJSON.parseはアプリケーション全体をブロックさ せる可能性がある const text = req.body.param; const obj = JSON.parse(text); // パースが完了するまで処理がブロック
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック - JSON.parse 対策
JSON.parseの前にテキストのサイズを確認 asyncなJSONパーサーの導入 使ったことがないので何とも言えず… 他のライブラリで内部的にJSON.parseが呼び出されている場合には対応 できない const text = req.body.param; // サイズが4k以下の時だけJSON.parseする if (typeof text === 'string' && text.length < 4096) { const obj = JSON.parse(text); }
OWASP Night / 2019-03-11 #owaspjapan t 同期処理によるブロック - JSON.stringify JSON.stringifyでも同じことはあり得る
巨大な配列を含むJSONをシリアライズするときにブロック等 参考:https://techblog.yahoo.co.jp/advent-calendar-2018/goodbye- mym/#uopoo 配列を含むJSONをstringifyするときは事前に配列の長さを確認 function foo (obj) { let text = {}; // 配列の長さが1k以下の時だけJSON.stringifyする if (obj.items instaneof Array && obj.items.length < 1024) { text = JSON.stringify(obj); } ... }
OWASP Night / 2019-03-11 #owaspjapan t prototype汚染
OWASP Night / 2019-03-11 #owaspjapan t prototype汚染 __proto__経由でObject.prototypeが汚染されてしまう問題 prototype.js時代のprototype汚染とは異なる
あれは意図的にObject.prototypeに便利メソッドを追加しているが迷惑だ という問題 攻撃者が__proto__プロパティを宣言することでグローバルの Object.prototypeeを汚染する 存在しないはずのプロパティが全オブジェクトに存在してしまう
OWASP Night / 2019-03-11 #owaspjapan t prototype汚染 オブジェクトリテラルの__proto__が Object.prototypeを指しているため、 攻撃者が__proto__に書き込みできる
場合、グローバルのObject.prototype が汚染される valueOf()やtoString()などの既存プロパ ティも書き換えられ、最悪の場合は任意 コード実行となる function isObject(obj) { return obj !== null && typeof obj === 'object'; } function merge(a, b) { for (const key in b) { if (isObject(a[key]) && isObject(b[key])) { merge(a[key], b[key]); } else { a[key] = b[key]; } } return a; } function clone(obj) { return merge({}, obj); } app.post('/', (req, res) => { const obj = clone(req.body); const r = {}; const status = r.status ? r.status: 'NG'; res.send(status) }); % curl -H 'Content-Type:application/json' -d '{"__proto__":{"status":"polluted"}}' http://example.jp/ https://jovi0608.hatenablog.com/entry/2018/10/19/083725 より 攻撃者の作成したJSONをそのままコピー しているため __proto__ もコピーされる 攻撃者が送信するJSON。 レスポンスは "polluted" になる Object.prototypeが汚染されているので、無関係なオ ブジェクト r の status プロパティが意図しない値となる
OWASP Night / 2019-03-11 #owaspjapan t prototype汚染 - 対策 外部からのJSONには__proto__のように動作に影響をあたえる
キーが含まれている可能性がある 外部からのJSONのキーを列挙してそのまま使用しない キー名が想定されているものか確認する 最低限、キーを列挙する際には __proto__ を除外する function merge(a, b) { for (const key in b) { if (key === "__proto__") continue; if (isObject(a[key]) && isObject(b[key])) { merge(a[key], b[key]); } else { a[key] = b[key]; } } return a; }
OWASP Night / 2019-03-11 #owaspjapan t prototype汚染 - 他の対策方法
オブジェクトリテラル「{}」ではなくObject.create(null)を使う prototypeがnullのオブジェクトが生成される ただしprototypeチェインがたどれなくなるので、hasOwnPropertyなどが直接は 呼び出せなくなる Object.freezeを用いてObject本体およびObject.prototypeを凍結する 副作用で動かなくなるモジュールが発生する可能性がある JSON Schemaなどを用いて入力をより厳密に検証する 入力されるJSONのキー名や型などを厳密に検証する ObjectではなくMapを使う 外部からのデータはObjectではなくMapに格納して使用する MapからObjectへコピーする際には__proto__をコピーしないよう注意が必要 参考: https://techblog.securesky-tech.com/entry/2018/10/31/
OWASP Night / 2019-03-11 #owaspjapan t 質問?
[email protected]
@hasegawayosuke http://utf-8.jp/