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.3k
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.8k
プロキシーツールとかを使うときの小技
hasegawayosuke
11
3.3k
All Your REJECT Are Belong To Us - リジェクトする側から -
hasegawayosuke
4
2.7k
あなたのWebアプリケーション OWASP TOP 10に対応できていますか?
hasegawayosuke
0
400
WebアプリをOWASP TOP 10に対応させよう / #shibuyaxss techtalk #10
hasegawayosuke
8
2.8k
Other Decks in Programming
See All in Programming
自分ひとりから始められる生産性向上の取り組み #でぃーぷらすオオサカ
irof
8
2.7k
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
5
730
2024年のWebフロントエンドのふりかえりと2025年
sakito
1
240
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
1
530
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
670
Immutable ActiveRecord
megane42
0
140
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
250
時計仕掛けのCompose
mkeeda
1
290
Pulsar2 を雰囲気で使ってみよう
anoken
0
230
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
320
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Rails Girls Zürich Keynote
gr2m
94
13k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
How STYLIGHT went responsive
nonsquared
98
5.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Building Adaptive Systems
keathley
40
2.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Embracing the Ebb and Flow
colly
84
4.6k
Designing Experiences People Love
moore
139
23k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Producing Creativity
orderedlist
PRO
343
39k
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/