lodash は、4.17.5以下のバージョンのいわゆるプロトタイプ汚染攻撃に対して脆弱であると報告されています https://nvd.nist.gov/vuln/detail/を参照) CVE-2018-3721
現在、lodashはtheほとんどパッケージに依存しています JavaScript ecoシステムです。影響としては、少なくとも中規模のプロジェクトのほぼすべてに、さまざまなバージョンのlodash依存関係とサブ依存関係が含まれています(お好みのJSプロジェクトでnpm ls | grep lodash
を実行して確認してください)。バージョン4.17.5未満のlodashを使用するすべてのオープンソースプロジェクトに貢献するには、多大な労力と時間がかかります。
攻撃者がこの脆弱性をどのように使用できるか、およびA LOTを持つ大規模なフロントエンドでこの問題に対処する正しい方法は何かを説明してくださいlodashを使用した実稼働依存関係の。
これらは1つにまとめられたいくつかの質問なので、それぞれに個別に回答してみましょう。
JavaScriptに関する知識がどれほどあるかわからないので、できる限り一般的なものにしようと思います。 JavaScriptはプロトタイプを広範囲に使用してオブジェクトの継承を実装します。基本的に、プロトタイプに書き込んだものはすべてオブジェクトインスタンスになります。 Mozillaのドキュメント は、これよりもはるかによく説明します。
HackerOneのレポート によると、攻撃者が独自のデータをlodashに挿入できる場合、攻撃者は独自のコードをオブジェクトに追加できます。次のPoCはこれを示しています。
_var _= require('lodash');
var malicious_payload = '{"__proto__":{"oops":"It works !"}}';
var a = {};
console.log("Before : " + a.oops);
_.merge({}, JSON.parse(malicious_payload));
console.log("After : " + a.oops);
_
このコードを実行すると、直接書き込まれることがなくても、a
が変更されていることがわかります。
それでは、これはアプリケーションにどのように影響しますか?まあ、これはあなたのコードに依存します。 「キャッチオール」な答えはありません。場合によっては、サービス拒否攻撃になることもあれば、リモートでコードが実行されることもあります。
たとえば、関数toString()
をリテラル文字列に置き換えることができます。文字列を呼び出そうとするとエラーが発生し、サービス拒否につながります。
Lodashバージョンをできるだけ早く更新するか、手動のバックポートパッチを自分で適用してください。簡単ではないかもしれませんが、絶対に必要です。
アプリケーションがユーザー入力を処理するnever場合、更新をできるだけ遅らせることができますが、優先度リストではかなり高いはずです。