Snykの調査チーム、lodashの全バージョンに影響する深刻なプロトタイプ汚染の脆弱性を発見
2019年7月5日
0 分で読めます2019年7月2日、Snykのセキュリティリサーチチームによる継続的な分析の結果、lodashのすべてのバージョンに影響する重大度の高いプロトタイプ汚染の脆弱性をSnykが公表しました(CVE-2019-10744)。
更新:7月9日にlodashのバージョン4.17.12が公開され、Snykによる修正が含まれ、この脆弱性が解消されました。lodashを最新バージョンに更新することを強くおすすめします。
この記事の執筆時点では、この脆弱性に対する公式の修正は公開されていません。Snykユーザーには、脆弱な約50,000のプロジェクトで利用可能なセキュリティパッチを適用することで、lodashの最新の脆弱バージョン4.7.11における問題を解消できます。

この人気のnpmライブラリは、GitHubだけでも435万のプロジェクトで使用されています。GitHubでのスター数は4万件に迫り、毎月8,000万回以上ダウンロードされています。言うまでもなく、lodashのように広く使われているライブラリに重大度の高い脆弱性があると、多数のnpmユーザーに影響します。
Snykはユーザーに対し、この脆弱性を解消するための自動修正プルリクエストを数千件送信しました。脆弱性の詳細と、次に取るべき対応について以下で説明します。
今回のlodashのセキュリティ脆弱性が明らかになったのは、人気のJavaScriptフロントエンドライブラリjQueryで類似のプロトタイプ汚染の脆弱性を報告してからわずか3か月後のことです。
他のプロトタイプ汚染の脆弱性([1]、[2]、[3]、[4]、[5])と同様に、安全でない再帰的なJSONマージの実装により、JavaScriptのObjectを改ざんできる可能性があります。これにより、プロトタイプチェーンを通じて他のデータ型にも影響が及びます。こうした脆弱性の影響は、対象のユースケースや悪用可能性によって、プロパティの注入からコードの注入、サービス拒否までさまざまです。
この脆弱性はすでにSnykデータベースに追加されています。Snykでプロジェクトを監視しており、脆弱なパッケージが含まれていることが確認された場合は、通常のアラートですでに通知されています。まだ通知を受け取っていない場合は、アプリケーションのコードリポジトリをテストして、脆弱なバージョンのlodashの影響を受けるかどうか確認してください。
lodashのセキュリティ脆弱性について
defaultsDeep関数は、constructorペイロードを使うことで、Object.prototypeのプロパティを追加または変更するよう仕向けられる可能性があります。この脆弱性がJavaScriptアプリケーションに及ぼす影響の例を以下に示します。
プロトタイプ汚染の基本を確認したところで、SnykのエンジニアKirillがGitHub上のlodash JavaScriptライブラリのリポジトリに送った、実際のセキュリティ修正を見てみましょう。https://github.com/lodash/lodash/pull/4336/files:

この修正では、constructorに設定されたキーによってグローバルオブジェクトが汚染されないよう、安全性を確認するチェックを追加しています。また、今後同じ問題が再発しないよう、テストケースも追加されています。
プロトタイプ汚染の脆弱性とその仕組みについて詳しく知りたい方は、lodashの脆弱性の説明をご覧ください。
必要な対応
すでにSnykを使ってアプリケーションを監視している場合は、影響を受けるプロジェクトにPRとして送信された前述のセキュリティパッチを適用することで、自動的に保護されています。
Snykを利用していない場合は、無料アカウントを作成し、コードリポジトリからプロジェクトをSnykダッシュボードにインポートして追加できます。Snykのテストスキャン結果を確認したら、Snykにプルリクエストを作成させ、Snykパッチを適用して脆弱なlodashライブラリを修正できます。
修正を含む新しいバージョンのlodashがリリースされるまでは、簡単な手動修正方法はありません。新しいバージョンが公開されたら、アップグレードしてください。
Snykは、Node.jsやJavaScriptのエコシステムで数百万のプロジェクトに影響するlodashのケースのように、影響度の高い脆弱性に対するパッチを作成します。影響を受けるライブラリのサポート対象バージョンに適切に適用できるよう、すべてのパッチを厳格なプロセスでテストしています。
Snykのパッチ適用プロセスの詳細は、ドキュメントページ「脆弱性の修正」と、セキュリティ責任者Danny Granderによるブログ記事「セキュリティ脆弱性はどこから来るのか?」をご覧ください。
注:この脆弱性の修正を含むlodashの公式バージョンがリリースされると、Snykで監視しているプロジェクトには、現在パッチが適用されているかどうかにかかわらず、公式ライブラリへのアップグレードを含むPRが自動的に送信されます。
責任ある情報開示
2019年4月にSnykチームが実施したセキュリティリサーチを通じて、この脆弱性とlodashに影響するその他の脆弱性を、lodashのメンテナーであるJohn Daltonに責任を持って開示しました。
このプロセスでは、非公開リポジトリでJohnと協力し、調査結果と、脆弱性を修正するためにSnykが提案した修正内容を確認しました。Snykのソフトウェアエンジニアの一人であるKirillがこのプロセスに参加し、修正を含むプルリクエスト([1]、[2])をlodashに送信しました。どちらも6月24日にマージされました。
このセキュリティ問題の解決にあたり、迅速に対応し、終始協力を歓迎してくれたJohnに心から感謝します。
Lodashにセキュリティ脆弱性の可能性を見つけた場合は、脆弱性開示プログラムを通じてご相談ください。詳細はこちらをご覧ください。https://snyk.io/vulnerability-disclosure/
数字で見るlodash npmパッケージ
初回バージョン公開:7年前最新バージョン:4.7.11(2018年9月に公開、10か月前)これまでに発見された脆弱性の総数:4件(重大度:高2件、中2件)

CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。