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
快速入門可觀測性
blueswen
0
330
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
120
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
14 Years of iOS: Lessons and Key Points
seyfoyun
1
770
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
260
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
180
Refactor your code - refactor yourself
xosofox
1
260
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
250
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Optimizing for Happiness
mojombo
376
70k
How GitHub (no longer) Works
holman
311
140k
A designer walks into a library…
pauljervisheath
204
24k
Visualization
eitanlees
146
15k
RailsConf 2023
tenderlove
29
940
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
BBQ
matthewcrist
85
9.4k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
4 Signs Your Business is Dying
shpigford
181
21k
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/