セキュリティ監査をサボったらNode.jsアプリに7つの重大な脆弱性が潜んでいた
何気なく始めたセキュリティチェックがあって、もうすぐ本番環境にNode.jsのアプリを出そうかなと準備していた時だった。ちょうどその頃、技術リーダーから「ちゃんとセキュリティ監査やった?」みたいな質問が飛んできたんだよね。正直、その時点ではまだやってなかった気がする。
どうも、数えるほどじゃないけど、それなりに重大っぽい脆弱性が見つかることもあるらしい。何回目かのデプロイ作業で「あれ、前回はこんなの出てたっけ?」とか思ったりして。具体的な数値は覚えてないけど、七つ前後の重要問題が指摘されていたような気もした。そのうち半分くらいは修正しないと困る可能性も高い感じだった。
この手の話って、毎回同じ流れになるわけじゃなくて、「まあ大丈夫だろう」と思って進めると、不意打ちみたいに指摘が入ることもある。自分だけじゃなく他の人にも起こりうる場面なので、「次はもう少し早くチェックしようかな」とぼんやり思った記憶が残っている。
どうも、数えるほどじゃないけど、それなりに重大っぽい脆弱性が見つかることもあるらしい。何回目かのデプロイ作業で「あれ、前回はこんなの出てたっけ?」とか思ったりして。具体的な数値は覚えてないけど、七つ前後の重要問題が指摘されていたような気もした。そのうち半分くらいは修正しないと困る可能性も高い感じだった。
この手の話って、毎回同じ流れになるわけじゃなくて、「まあ大丈夫だろう」と思って進めると、不意打ちみたいに指摘が入ることもある。自分だけじゃなく他の人にも起こりうる場面なので、「次はもう少し早くチェックしようかな」とぼんやり思った記憶が残っている。
Express.jsの古い依存関係がDoS攻撃の餌食になる危険性
ほとんどの開発者がそうかもしれないけれど、機能を追加したり納期に間に合わせたりすることばかり意識していた時期があった。セキュリティについては後回しになりがちだったんだよね。で、ある時ふと思い立って監査を始めてみたら、まあ…少なくとも七つくらいかな、深刻そうな脆弱性が見つかった気がする。一つひとつがそれなりに危ういもので、使っている人のデータやシステム全体に影響を与える恐れもあったんじゃないかな、と今さら思い返す。
最初に目についたのは、そのまま放置されていた依存パッケージ。なんとなく昔のままアップデートせず使っていた部分で、有名なExpress.jsとかも含まれていて。このExpressの古いバージョンには何年か前から指摘されてるDoS関連の脆弱性があるという話を聞いたことがあった。でもその時点では「まあ大丈夫だろう」と流してしまってたような…。CVEs(共通脆弱性識別子)が付いているものはいくつか混じってたはずだけど、正確な数はもう忘れてしまった。
こういう話、決して自分だけじゃなくて他にも同じ経験してる人は多そうだし、「気づけば問題だらけだった」みたいなのも珍しくないと思う。実際、本当に全部見落としていたわけでもなく、「いつか直さないと」と頭の片隅にはあったような。でも改めて調べ直すと、意外と危険度高めのものが普通に紛れていることもあるから不思議だ。
最初に目についたのは、そのまま放置されていた依存パッケージ。なんとなく昔のままアップデートせず使っていた部分で、有名なExpress.jsとかも含まれていて。このExpressの古いバージョンには何年か前から指摘されてるDoS関連の脆弱性があるという話を聞いたことがあった。でもその時点では「まあ大丈夫だろう」と流してしまってたような…。CVEs(共通脆弱性識別子)が付いているものはいくつか混じってたはずだけど、正確な数はもう忘れてしまった。
こういう話、決して自分だけじゃなくて他にも同じ経験してる人は多そうだし、「気づけば問題だらけだった」みたいなのも珍しくないと思う。実際、本当に全部見落としていたわけでもなく、「いつか直さないと」と頭の片隅にはあったような。でも改めて調べ直すと、意外と危険度高めのものが普通に紛れていることもあるから不思議だ。
Comparison Table:
セキュリティ対策の影響 | パフォーマンス向上 | メモリー消費量減少 | CPU使用率の改善 | セキュリティと効率性 |
---|---|---|---|---|
データベース問い合わせ削減が主な要因 | リクエスト処理時間が半分に近い短縮報告あり | 約30%のメモリー消費量減少との印象あり | CPU使用率が三分の一程度軽減された事例も存在 | 安全なコードは無駄を減らす可能性 |
自動脆弱性チェックの実施状況 | npm auditやSnykを利用するチームもある | 依存パッケージは週に一度見直しの文化が形成中 | 独自チェックリストによるPR検証も行われている | 形骸化しやすい項目への注意喚起 |
セキュリティ研修を月1回実施している企業あり | 知識吸収には個人差がある印象 | 攻撃防止だけでなく耐える仕組み作りが重要視されるべきかもしれない | ||
Node.jsアプリ点検の推奨 |

ユーザー入力の検証なしでNoSQLインジェクションの穴が開いていた
Expressのバージョンが古くて、ちょっと前まで脆弱性が指摘されていたみたい。まあ、npm auditで依存関係をざっくりチェックする仕組みを入れておいたし、更新もときどきやるようにしている。package.jsonのスクリプトにも何か追加した記憶があるけど、細かいところはうろ覚え。
MongoDBに関して言えば、ユーザーから送られたデータをそのままクエリに使ってしまっていて、思ったより危ない状況だったことに後で気づいた人もいるだろう。例えば「?username[$ne]=nothing」みたいなリクエストで、本来見せなくてもいい情報まで取れてしまう場合も無いとは言えない。それでJoiというライブラリを使って入力値をざっくり検査するように変えてみたり、クエリの書き方ももう少し工夫したとかしないとか。
それからJWT認証なんだけど、自作した時はアルゴリズムが強いものではなかったし、秘密鍵もソースコード内に直書きしてしまっていたケースがあった気がする。このあたり、本格的な運用には向かない方法だと言われても仕方ない。でも実際は、それほど多くのプロジェクトですぐ修正されたわけでもなくて、一部ではそのままだった話もちらほら聞こえてくる。
MongoDBに関して言えば、ユーザーから送られたデータをそのままクエリに使ってしまっていて、思ったより危ない状況だったことに後で気づいた人もいるだろう。例えば「?username[$ne]=nothing」みたいなリクエストで、本来見せなくてもいい情報まで取れてしまう場合も無いとは言えない。それでJoiというライブラリを使って入力値をざっくり検査するように変えてみたり、クエリの書き方ももう少し工夫したとかしないとか。
それからJWT認証なんだけど、自作した時はアルゴリズムが強いものではなかったし、秘密鍵もソースコード内に直書きしてしまっていたケースがあった気がする。このあたり、本格的な運用には向かない方法だと言われても仕方ない。でも実際は、それほど多くのプロジェクトですぐ修正されたわけでもなくて、一部ではそのままだった話もちらほら聞こえてくる。
弱いJWT実装が認証システムを簡単に突破される原因に
JWTの実装について、以前はかなり緩い感じでやっていたようで、秘密鍵も環境変数じゃなくて直接書かれていた時期があったとか。今ではRS256方式に切り替わっていて、秘密もきちんと外から管理されてるらしい。トークンの有効期限も付けるようになったみたいだけど、それまでは何となく永遠に使えてしまうこともあったのかもしれない。
APIのレスポンスでユーザー情報を返す時、必要以上に多く渡してしまうケースが少なくなかったという話を聞く。例えば内部IDやパスワードっぽいものまで含まれてたことがあるとか。その後、DTOとかフィルタリング処理を入れることで大体整理された様子。全部隠せてるかというと、まだ多少抜け道が残っている可能性もある。
またレートリミットについては、しばらくの間何も設定されていなかったため、不正アクセスやDoS攻撃に対してけっこう脆弱だった頃があるようだ。express-rate-limitなどを導入したことで、一応制限は掛けられる形にはなった。ただ状況次第ではまだ調整余地がありそう。
エラーハンドリング周辺にも課題はあったみたいで、ごく最近までエラー詳細やスタックトレースがそのまま出力されることも珍しくなかったらしい。それによって内部構造や設計意図まで分かってしまう危険性が指摘されている。でも現在は表面的なエラーメッセージしか見えない作りになっていて、この点では以前よりは安全寄りだと言われている。それでも油断できない部分はいくらか残る気配もする。
APIのレスポンスでユーザー情報を返す時、必要以上に多く渡してしまうケースが少なくなかったという話を聞く。例えば内部IDやパスワードっぽいものまで含まれてたことがあるとか。その後、DTOとかフィルタリング処理を入れることで大体整理された様子。全部隠せてるかというと、まだ多少抜け道が残っている可能性もある。
またレートリミットについては、しばらくの間何も設定されていなかったため、不正アクセスやDoS攻撃に対してけっこう脆弱だった頃があるようだ。express-rate-limitなどを導入したことで、一応制限は掛けられる形にはなった。ただ状況次第ではまだ調整余地がありそう。
エラーハンドリング周辺にも課題はあったみたいで、ごく最近までエラー詳細やスタックトレースがそのまま出力されることも珍しくなかったらしい。それによって内部構造や設計意図まで分かってしまう危険性が指摘されている。でも現在は表面的なエラーメッセージしか見えない作りになっていて、この点では以前よりは安全寄りだと言われている。それでも油断できない部分はいくらか残る気配もする。

APIレスポンスから敏感なユーザーデータが漏れていた事実
## **脆弱性その七:直接参照がちょっと危ういIDORってやつ**
APIの話なんだけど、どうも利用者が思ったより広くリソースにアクセスできちゃう時期があったらしい。数年前だったか、何人かから「本来見れないもの覗けた」と言われてギクッとした記憶がぼんやり残ってる。よくあるパターンらしく、他でも聞いたことはある。
その頃はまだ十分な認可処理を入れてなくて、権限チェックというのかな、それをサボってた感じ。結果として、本来触れない情報まで知らぬ間に手が届いてしまう利用者がちらほら出てきたみたいで……まあ、それほど多かった印象はないけど。
後から「やっぱり直さなきゃね」と思い立ち、専門の人にも意見聞きながら順次対策を進めたはず。今はたぶん認可ロジック(確認手順とか)が組み込まれてるおかげで、不用意なアクセスはだいぶ抑え込めているように見える。ただ、完璧かどうか自信持てるわけじゃなくて、「ほぼ大丈夫そう」ぐらいの感覚しかない。
日々変わる仕様だから定期的に確認した方がいい気もするし、この種の問題って油断するとまた出てくることもあるっぽい。だから、今後もちょっと注意しながら運用していこうと思ったりしてる。
APIの話なんだけど、どうも利用者が思ったより広くリソースにアクセスできちゃう時期があったらしい。数年前だったか、何人かから「本来見れないもの覗けた」と言われてギクッとした記憶がぼんやり残ってる。よくあるパターンらしく、他でも聞いたことはある。
その頃はまだ十分な認可処理を入れてなくて、権限チェックというのかな、それをサボってた感じ。結果として、本来触れない情報まで知らぬ間に手が届いてしまう利用者がちらほら出てきたみたいで……まあ、それほど多かった印象はないけど。
後から「やっぱり直さなきゃね」と思い立ち、専門の人にも意見聞きながら順次対策を進めたはず。今はたぶん認可ロジック(確認手順とか)が組み込まれてるおかげで、不用意なアクセスはだいぶ抑え込めているように見える。ただ、完璧かどうか自信持てるわけじゃなくて、「ほぼ大丈夫そう」ぐらいの感覚しかない。
日々変わる仕様だから定期的に確認した方がいい気もするし、この種の問題って油断するとまた出てくることもあるっぽい。だから、今後もちょっと注意しながら運用していこうと思ったりしてる。
レート制限なしではAPIがブルートフォース攻撃に無防備だった
セキュリティ修正による影響って、実際のところ思ったより面白い結果になったみたい。パフォーマンスが多少上がった気がする――いや、数字で言えば「ほぼ半分に近い」くらいまでリクエスト処理時間が短くなったという報告もあったとか。メモリー消費量も、おそらく三割以上減ったような印象を受けた人がいたらしい。CPUの使われ方も以前と比べてかなり落ち着いてきて、三分の一程度軽くなったのでは、と語る人も。
どこかで聞いた話だけど、その改善は主にデータベースへの問い合わせ回数を無駄なく削減したことにあるそうだ。他にもレスポンス内容を余計な部分省いて小さくまとめたり、エラー処理手順をもう少し簡潔にしたり――まあ、一つひとつは目立たない調整だったらしい。でも全部合わせると意外と大きかったような。厳密には全部数字通りじゃないかもしれないけど、この辺は現場によって感じ方違うみたい。
誰でも経験あると思うけれど、セキュリティ対応って時々パフォーマンス下げるんじゃないか?なんて不安になることも。でも今回の場合、不思議と逆に動作が軽快になった例として挙げても良さそう。もちろん環境や条件次第なので絶対とは言えないし、他でも同じ効果が出るかは…それぞれ確かめてみる必要ありそうだけどね。
どこかで聞いた話だけど、その改善は主にデータベースへの問い合わせ回数を無駄なく削減したことにあるそうだ。他にもレスポンス内容を余計な部分省いて小さくまとめたり、エラー処理手順をもう少し簡潔にしたり――まあ、一つひとつは目立たない調整だったらしい。でも全部合わせると意外と大きかったような。厳密には全部数字通りじゃないかもしれないけど、この辺は現場によって感じ方違うみたい。
誰でも経験あると思うけれど、セキュリティ対応って時々パフォーマンス下げるんじゃないか?なんて不安になることも。でも今回の場合、不思議と逆に動作が軽快になった例として挙げても良さそう。もちろん環境や条件次第なので絶対とは言えないし、他でも同じ効果が出るかは…それぞれ確かめてみる必要ありそうだけどね。

エラーハンドリングの不備がスタックトレースを晒す危険性
JWTの処理をもう少し考えてみたんだ。ふとした監査のあと、どうも色々気付いたことがあってね。セキュリティ対策について語る人は多いけど、本当に現場で徹底するのは案外難しい気がする。
例えば、自動で脆弱性チェックを走らせているチームもあるらしい。一部ではnpm auditやSnykなんかをCI/CDに組み込むようにしているとか。ただ、それだけで全てカバーできてるかというと、ちょっと自信ないかも。依存パッケージのアップデートに関しては、週一くらいでこまめに見直す文化が根付きつつある印象。でも急な変更には慎重になるから、非互換じゃないもの中心に手を入れる感じかな。
PR時の独自チェックリストを作った開発者もいて、それを見ると「こんな項目まで見るの?」と思う項目も混じってたりする。けど実際、一部項目は形骸化しやすかったり、「何となく」で済ませちゃう場合もなくはない。
コードレビューでは、ときおり認証処理やデータ取り扱い周辺について重点的に見るルールになった話も聞く。ただ、すべてのレビュワーが同じ温度感というわけでもないので、見逃しゼロとは言えない感じだったかな。
あと、セキュリティ研修っぽいものを月イチくらいで実施してる会社があるようだ。それでも全員が毎回新鮮な知識を持ち帰れるかというと、人によって吸収具合は違うっぽい。結局、“守る”っていうより“耐える”ための仕組み作りなんだろうね。攻撃防止だけじゃなくて、不測の事態にも多少なりとも備える――そういう空気感が大事なのかもしれないよ。
例えば、自動で脆弱性チェックを走らせているチームもあるらしい。一部ではnpm auditやSnykなんかをCI/CDに組み込むようにしているとか。ただ、それだけで全てカバーできてるかというと、ちょっと自信ないかも。依存パッケージのアップデートに関しては、週一くらいでこまめに見直す文化が根付きつつある印象。でも急な変更には慎重になるから、非互換じゃないもの中心に手を入れる感じかな。
PR時の独自チェックリストを作った開発者もいて、それを見ると「こんな項目まで見るの?」と思う項目も混じってたりする。けど実際、一部項目は形骸化しやすかったり、「何となく」で済ませちゃう場合もなくはない。
コードレビューでは、ときおり認証処理やデータ取り扱い周辺について重点的に見るルールになった話も聞く。ただ、すべてのレビュワーが同じ温度感というわけでもないので、見逃しゼロとは言えない感じだったかな。
あと、セキュリティ研修っぽいものを月イチくらいで実施してる会社があるようだ。それでも全員が毎回新鮮な知識を持ち帰れるかというと、人によって吸収具合は違うっぽい。結局、“守る”っていうより“耐える”ための仕組み作りなんだろうね。攻撃防止だけじゃなくて、不測の事態にも多少なりとも備える――そういう空気感が大事なのかもしれないよ。
IDOR脆弱性で誰でも他人のデータにアクセス可能だった驚き
見つけた脆弱性って、ちょっと変わったケースとかじゃなかったんですよね。どちらかというと、割とよくある話で、ちゃんとやれば防げるものばかりだった気がします。まあ、それにしても面白かったのは、セキュリティ対策を施したらシステムの動きまで良くなったところです。こういうのって時々耳にしますが、自分で体験すると印象違いますね。どうも安全なコードは、無駄が減るせいなのか効率面でも得になることがあるみたいです。
Node.js使ってる方なら、一度自分たちのアプリを軽くでも点検してみてもいいかもしれません。思ったより多い数の人が、普段は全然意識してない問題点を隠し持ってたりするようなので…。私自身も最初はそんなに期待してなかったけど、意外と色々出てきましたし、本当に今すぐ全部直そう!という話ではなくても、「あれ?」と思う箇所くらいは見つかる可能性ありますよ。何となくですが、そういう発見から次につながることもあるようですし…。
Node.js使ってる方なら、一度自分たちのアプリを軽くでも点検してみてもいいかもしれません。思ったより多い数の人が、普段は全然意識してない問題点を隠し持ってたりするようなので…。私自身も最初はそんなに期待してなかったけど、意外と色々出てきましたし、本当に今すぐ全部直そう!という話ではなくても、「あれ?」と思う箇所くらいは見つかる可能性ありますよ。何となくですが、そういう発見から次につながることもあるようですし…。

セキュリティ修正が逆に44%のパフォーマンス向上をもたらした意外な結果
参考資料はちょっと多いかもしれませんが、Node.jsとかExpress.jsについて気になる人なら、OWASPのセキュリティ項目やら、npmの監査ツールの話とかは見ておいて損はなさそうです。Snykってサービスもあるみたいで、JavaScript界隈だとそこそこ使われている印象もありますし、JWTやMongoDB関連のチェックリストなんかも最近よく目にしますね。全部読んだからといってすぐに劇的な変化があるとは言い切れないですが、時間をかけてつまみ食いするくらいがちょうど良さそう。
「面白かった?」って聞かれても、自分だったらまあまあかなぁと思いつつ、とりあえず拍手(👏)してシェアしたり、気になればフォローでもしてみる流れでしょうか。たしか、このコミュニティでは誰かに拍手を送ることで応援になる風習が根付いてきたような記憶があります。
それから、一応SNS系統もざっくり並んでます。「X」と呼ばれるもの(前はTwitterでしたっけ?)、LinkedIn、それにYouTubeとかポッドキャスト…あとニュースレターやTwitchまであったような。全部追うとなると大変ですが、どこかひとつでもつながっておけば、新しい情報がふわっと入ってきたりしますよね。
CoFeedという新しい技術情報まとめサービスにも触れられていた気がしますし、「Differ」ではAIブログを無料で始められる仕組みまで用意されているみたいです。Discord上にもクリエイター同士のコミュニティができているとのことで、何割かの人には居心地良さそうかなと感じました。
plainenglish. というWebサイトへの案内もちょろっと書いてありましたね。全部ひとまとめにすると、多分七十個近くリンク先が並ぶことはないと思いますけど、人によって興味ある部分だけ拾えば充分じゃないでしょうか。
最後になりますけど、「行く前に拍手とかフォロー忘れずに」と繰り返していたような…。まあ、そのへんはお好みでいいんじゃないかな、とぼんやり思いました。
二度と脆弱性を生まないための5つの予防策とチームプラクティス
なんとなく[io]**と、それから**[stackademic . com]**という言葉がちらっと頭に浮かぶけど、どちらも最近になって聞いた気がする。何年か前まではあまり話題に上らなかったような、そんな感じもしなくはない。そういえば、これらのサービスや仕組みについて語る人たちの中には、「七十を少し超えるくらいの機能があるんじゃないか」なんて曖昧に話す人もいる。でも、本当にその数なのかどうかは詳しく調べてみないとはっきりしない。
そもそも、こうしたプラットフォームが世間でどれぐらい使われているのか、よく分からない部分がある。多くても全体の約三割とか、その辺りなのかなと推測する声もあったりして。ただ、その数字自体も誰かの印象だったり、一部の調査結果だったりすることが多いようだ。
時々、それぞれ役割や特徴について説明される場面も目にするけれど、一度読んだだけでは全貌を把握しづらい。場合によっては似ているところと違う点が混ざっていて、ひとことで言い切るのは難しい印象。実際には「大体こんな感じ」としか言えないケースがほとんど。
なんだか情報源によって解釈が変わることもあるので、自分で確かめたり他の意見を参考にした方が無難かな、と感じた日もあった気がする。
そもそも、こうしたプラットフォームが世間でどれぐらい使われているのか、よく分からない部分がある。多くても全体の約三割とか、その辺りなのかなと推測する声もあったりして。ただ、その数字自体も誰かの印象だったり、一部の調査結果だったりすることが多いようだ。
時々、それぞれ役割や特徴について説明される場面も目にするけれど、一度読んだだけでは全貌を把握しづらい。場合によっては似ているところと違う点が混ざっていて、ひとことで言い切るのは難しい印象。実際には「大体こんな感じ」としか言えないケースがほとんど。
なんだか情報源によって解釈が変わることもあるので、自分で確かめたり他の意見を参考にした方が無難かな、と感じた日もあった気がする。