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
hasegawayosuke
March 11, 2019
Programming
14
5.2k
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
25
14k
脆弱性診断を通じて見えてくるWebセキュリティ
hasegawayosuke
12
4.7k
プロキシーツールとかを使うときの小技
hasegawayosuke
11
3.2k
All Your REJECT Are Belong To Us - リジェクトする側から -
hasegawayosuke
4
2.6k
あなたのWebアプリケーション OWASP TOP 10に対応できていますか?
hasegawayosuke
0
380
WebアプリをOWASP TOP 10に対応させよう / #shibuyaxss techtalk #10
hasegawayosuke
8
2.8k
Other Decks in Programming
See All in Programming
Spatial Rendering for Apple Vision Pro
warrenm
0
110
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
390
testcontainers のススメ
sgash708
1
120
선언형 UI에서의 상태관리
l2hyunwoo
0
170
Go の GC の不得意な部分を克服したい
taiyow
3
790
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
280
たのしいparse.y
ydah
3
120
return文におけるstd::moveについて
onihusube
1
1.1k
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
7
1.3k
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
Zoneless Testing
rainerhahnekamp
0
120
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Optimising Largest Contentful Paint
csswizardry
33
3k
Six Lessons from altMBA
skipperchong
27
3.5k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Practical Orchestrator
shlominoach
186
10k
Docker and Python
trallard
42
3.1k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
How to Ace a Technical Interview
jacobian
276
23k
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/