Node.jsのMySQLパッケージにおけるエスケープ処理だけでは防げない「隠れた」SQLインジェクション - Flatt Security Blog
2022/02/16 11:24
gfx
おーなるほど、これはひどい。ライブラリが「賢い」振る舞いをサポートすることによって余計な穴ができるパターンか。
2022/02/16 11:28
koba789
嫌すぎる罠だ……
2022/02/16 11:28
sotarok
おーなるほど
2022/02/16 11:57
teppeis
クエリのプレイスホルダにオブジェクト型が渡ると特殊な解釈をする仕様を突いたSQLi脆弱性。こういう変に便利機能あると危険なやつ、log4jで見た
2022/02/16 11:58
yoshikidz
たしかにstringifyObjects(Default: false)だけど、さすがに疑問だったから見たら、issueがあってこれは大丈夫なのかなー。nodeあんま使わんからわからんけど。github.com
2022/02/16 12:04
fai_fx
軽い気持ちでnode.jsを使ってはいけない…
2022/02/16 12:05
clubman023
うおお
2022/02/16 12:06
d6rkaiz
なるほど、これは怖いな
2022/02/16 12:45
takahashim
“現在、私はある0dayに関する技術ブログ記事の公開を予定しています。しかし、ベンダーは何ヶ月もその脆弱性に関する勧告を発表しておらず、記事の公開ができません。”
2022/02/16 13:00
hasiduki
こわーい!高速な開発体験とか言ってらんない!
2022/02/16 13:11
toritori0318
怖い
2022/02/16 13:17
ikkitang1211
なるほど、学びであった。
2022/02/16 13:20
kkeisuke
“ユーザーが渡す値の型をチェックすることは、多くの言語で常に非常に重要”
2022/02/16 13:40
GOD_tomato
たしかに
2022/02/16 14:11
yasu-log
便利な機能は仇となる好例
2022/02/16 14:14
ockeghem
一般的なプレースホルダ実装とは挙動が異なるので、「プレースホルダなら安全」とは言えない件。「JSON SQLインジェクション」と呼ばれた挙動に近い。
2022/02/16 14:22
buzztaiki
それ以前にバインド変数を使ったSQLをクライアント側で展開してサーバに送っていることに驚いた。
2022/02/16 14:40
paulownia
postgresの場合はこのSQLがinvalidでなのでJSライブラリの挙動が同じだったとしてもデータは取れない(エラー情報も渡したくないけどそれは置いておく)。他のRDBではどうなのだろう?
2022/02/16 14:41
t_motooka
これPreparedStatementとして処理してくれてないのか…
2022/02/16 15:00
t_f_m
あとで
2022/02/16 15:01
n314
プリペアドステートメントじゃなくて言葉通りエスケープなのね。PHPerなので15年ぐらい前に(有名ライブラリを使ったとしても)自前でエスケープするなって散々言われてた気がするが。
2022/02/16 15:09
rryu
配列はIN句の時に使うから分かるが、オブジェクトは一体どう使う想定なのだろうか。無駄に頑張ってしまった感が強いが…
2022/02/16 15:09
mohno
これだから型が緩い言語は……にはならないの?
2022/02/16 15:19
rti7743
余計な機能が無能な働き者になってしまったか。 無能な働き者は銃殺もといオプションで無効にするしかないね。その後テストしてと余計な手間かかるね
2022/02/16 15:39
causeless
"@wtnbgo これはそもそも prepared statement 機構以外は絶対使うなと教えるべきなのでは。なんちゃってプレースメントホルダなライブラリは存在自体が悪だし廃止すべき。" from twitter.com
2022/02/16 16:02
satomi_hanten
(ちゃんと読んでない)一時期流行ったクエリ/データ内のXML記述も怪しかったけど、そもそもjson記述の脆弱性みたいなもんだな。
2022/02/16 16:16
daira4000
ライブラリ見にいったらprepared statements未実装だった。そんなライブラリを使わないのが安全。
2022/02/16 16:54
xlc
プレースホルダの実装がエスケープとはたまげる。
2022/02/16 16:58
natu3kan
その道の業界人には知られてて、脆弱性のテストに普通に組み込んでたけど、広く知られるようになったのは近年みたいなのって、まだまだあるんだろうなあ。対策しないと融通を利かせちゃう機能のを逆手に取る訳か。
2022/02/16 17:18
remonoil
mysql2を使おう。ほぼ互換だけどPrepared statementsサポートしてて、自動でPrepared statementsになる
2022/02/16 17:33
lizy
プレースホルダをライブラリ側で展開している?
2022/02/16 17:37
send
まあ prepared statements 以外はそもそも使わんようにする方がいいよな
2022/02/16 17:53
razokulover
ヒェ...
2022/02/16 18:32
prograti
ライブラリの内部ではMySQL Connector/Node.jsを使用しているのかと思ったらデータベースドライバみたいなのを自作してるんですね。
2022/02/16 18:34
hurafula
三、四年くらい前から変わってないサービスとかめっちゃ使ってそうだな にしてもプリペアドステートメント使ってないのか
2022/02/16 19:10
wkwkhautbois
クライアント側でのエスケープは危険、DB側でのバインド機構(PreparedStatement)を使え が基本だと思ってるけど、MySQLは歴史的な何かがあるんだろうか。
2022/02/16 19:47
ghostbass
普通は「プレースホルダ使え」でなく「パラメータクエリー(prepared statement)使え」なのでちょとイケてない感ある
2022/02/16 20:05
tettekete37564
最低限のバリデーションすら無しで&&判定するって普通に手抜きコードじゃ無いの?しかもユーザ名+パスワードが対象でそのif文じゃ嫌な予感しかしない
2022/02/16 20:08
suisuin
最近の漏洩事件、これが原因ってオチじゃないよね?なにもせずに放置してるの大量にありそう。
2022/02/16 20:52
yhoriz
やはりなるべく型による表明を使いたいと思わされる
2022/02/16 21:38
kazokmr
nodeそれほど詳しくはないんだけど、prisma使ってる場合はどうなんだろ?
2022/02/16 21:41
rgfx
そんなまた昔のPHP界隈みたいなことがマジであんのかjsって
2022/02/16 22:45
flont
なぜprepared statementではなくオレオレエスケープをライブラリが実装してしまうのか / 取りうる回避策はこのライブラリの使用をやめることしかない
2022/02/16 23:17
Keisuke69
プレースホルダ使えば安全ってわけじゃないパターンらしい。オブジェクト渡したらダメらしいがオブジェクト渡す時ってどんな時かな
2022/02/16 23:27
utsuidai
これは…
2022/02/17 00:23
internetkun
2022/02/17 00:24
mattn
こわっ
2022/02/17 05:31
kibitaki
Object型突っ込むとかはしないし、ストアドの中で型決めて受けてればセーフ、ってことでいいのかな?
2022/02/17 06:05
akulog
Oh...
2022/02/17 09:35
ducktoon
“バッククォートで囲まれた識別子 password はカラムとみなされるので、最終的には password = password となり”
2022/02/17 11:17
deep_one
基本として「エスケープ処理はするな、プリペア使え」だと聞いている。/コメントを見て。プレースホルダ使うけどプリペアではない謎実装?その構文だとプリペアなんだと思いそうだな。