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
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
190
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.4k
みんなでプロポーザルを書いてみた
yuriko1211
0
260
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
1.8k
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
230
CSC509 Lecture 12
javiergs
PRO
0
160
Jakarta EE meets AI
ivargrimstad
0
120
Better Code Design in PHP
afilina
PRO
0
120
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
910
Contemporary Test Cases
maaretp
0
130
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
43
13k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
What's new in Ruby 2.0
geeforr
343
31k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
Making Projects Easy
brettharned
115
5.9k
Music & Morning Musume
bryan
46
6.2k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
How to Ace a Technical Interview
jacobian
276
23k
Scaling GitHub
holman
458
140k
Visualization
eitanlees
145
15k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
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/