この物語は、React ベースのオープンソース ドキュメント プロジェクトである Docusaurus のメンテナである Sébastien Lorber が、パッケージ マニフェストに対するプル リクエストの変更に気づいたところから始まります。人気の cliui npm パッケージに提案されている変更は次のとおりです:
具体的には、見慣れない構文
"dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
ほとんどの開発者は、パッケージの値、またはおそらく Git またはファイルベースの URL に semver バージョンの範囲が含まれることを期待するでしょう。ただし、この場合は、特別な npm: プレフィックス構文があります。それはどういう意味ですか?
npm パッケージのエイリアスとは何ですか?
npm パッケージ マネージャーは、パッケージのカスタム解決ルールの定義を可能にするパッケージ エイリアス機能をサポートしています。そのため、コードまたはロックファイルを通じてパッケージが参照される場合は、エイリアスで指定された名前とバージョンに解決されます。
したがって、このプル リクエストで提案されている変更の場合、パッケージ string-width-cjs はバージョン ^4.2.0 のパッケージ string-width に解決されます。これは、string-width-cjs の node_modules ディレクトリ エントリが存在することを意味しますが、ロックファイル (package-lock.json) には string-width@^4.2.0 の内容と同様の動作が含まれます。
パッケージのエイリアシングは、ESM と CJS のサポートなどの場合に使用できる npm パッケージ マネージャーの機能です。
そうは言っても、パッケージのエイリアスが悪用される可能性があります。 2021 年に遡る記事とセキュリティ開示の中で、Snyk アンバサダーである Nishant Jain は、依存関係の混乱とサプライ チェーンのセキュリティ上の懸念の一環として、公式の npmjs レジストリがどのように騙されてパッケージのエイリアスに基づいて依存関係情報を誤って伝えることができるかを実証しました。
プル リクエストは無害であり、サプライ チェーン攻撃のリスクはありませんでした。しかし、Sébastien がパッケージ名を懸念したことで、潜在的なセキュリティ リスクが発見されました。
npm lockfile で悪意のあるモジュールに関する不審な動作を見つけるツールを実行すると次の警告が表示されました:
npx lockfile-lint --path package-lock.json --allowed-hosts tongue npm --validate-https --validate-package-names 別の名前のパッケージの解決された URL が検出されました: string-width-cjs 期待される: 文字列幅-cjs 実際: 文字列幅 別の名前のパッケージの解決された URL が検出されました:strip-ansi-cjs 期待される: ストリップ-ansi-cjs 実際: ストリップANSI 別の名前のパッケージの解決された URL が検出されました:wrap-ansi-cjs 予期されるもの:wrap-ansi-cjs 実際: ラップ ansi ✖ エラー: セキュリティ上の問題が検出されました。
npx lockfile-lint --path package-lock.json --allowed-hosts yarn npm --validate-https --validate-package-names detected resolved URL for package with a different name: string-width-cjs expected: string-width-cjs actual: string-width detected resolved URL for package with a different name: strip-ansi-cjs expected: strip-ansi-cjs actual: strip-ansi detected resolved URL for package with a different name: wrap-ansi-cjs expected: wrap-ansi-cjs actual: wrap-ansi ✖ Error: security issues detected!
免責事項: lockfile-lint は、ロックファイルのセキュリティ上の懸念を明らかにした私の出版物に続いて 2019 年に開発したツールです: npm ロックファイルが悪意のあるモジュールを挿入するセキュリティの盲点になる理由.
厳重警戒: npm 上の人気の類似パッケージ
npm パッケージのtrip-ansi-cjs を見ると、README やソースコード リポジトリがありません。ただし、同じ動作を引用する正規の人気パッケージが多数存在します。
実際、この特定のパッケージは人気があり、529 の依存パッケージ (このパッケージに依存する他のパッケージ) と 7,274 の毎週のダウンロードからわかります。
Strip-ansi-cjs のコードを見ると、このパッケージにはパッケージ マニフェスト package.json ファイルというファイルが 1 つだけあることがわかります。
これらの npm パッケージの作成者を調べてみましょう。
また、npmjs.
のこのユーザー プロファイル ページには、ユーザー hismanshutester002 を特定できる情報がないことにも注意してください。
リストに含まれているため、これは信憑性があるように思えるかもしれませんが、本当にそうでしょうか?
たとえば、clazz-transformer、react-native-multiply、あるいは gh-monoproject-cli などの名前は正当なもののように見えますが、本当ですか?
このパッケージには実質的にダウンロードはなく、作成者は匿名の npm ユーザーであり、個人を特定できる情報はありません。このパッケージがリダイレクトするソース URL リポジトリは、存在しない https://github[.]com/hasandader/react-native-multiply です。 GitHub のユーザー プロファイルも非常に疑わしく、実際的な活動が欠けているように見えます。
また、このパッケージが単なる乗算ライブラリである場合、次のことを行うためになぜ 776 個の依存関係が必要なのかも疑問に思う必要があります:
npx lockfile-lint --path package-lock.json --allowed-hosts yarn npm --validate-https --validate-package-names detected resolved URL for package with a different name: string-width-cjs expected: string-width-cjs actual: string-width detected resolved URL for package with a different name: strip-ansi-cjs expected: strip-ansi-cjs actual: strip-ansi detected resolved URL for package with a different name: wrap-ansi-cjs expected: wrap-ansi-cjs actual: wrap-ansi ✖ Error: security issues detected!過剰な依存関係の使用によって JavaScript がネストされたパッケージの天文学的なツリーに貢献するという冗談もありますが、776 の直接依存関係を持つプロジェクトは不当に大きくなります。
これらすべての依存関係の中には、私たちの話が始まった 3 つの疑わしい npm パッケージがあります: string-width-cjs、strip-ansi-cjs、wrap-ansi-cjs:
前述したように、strip-ansi-cjs 依存関係の 1 つは clazz-transformer という名前でした。見てみましょう:
ここで何が起こっているのか説明しましょう。 npm パッケージ clazz-transformer は、README ページでタイトル class-transformer と意図的に誤って名前が付けられています。さらに、ソース コード リポジトリ https://github[.]com/typestack/class-transformer はパッケージ名と相関性がなく、その正当性について懸念が生じています。
GitHub の package.json ファイルには依存関係の宣言がありませんが、npmjs で実際のパッケージのソース コードを検査すると、この clazz-transformer がパッケージ化されている 437 個の依存関係がわかります。繰り返しますが、彼らは 3 つの疑わしい *-cjs パッケージを非常に便利にバンドルしています:
言及されたパッケージ内でいくつかの tea.yaml ファイルが見つかると、このキャンペーンの目的の一部が Tea の悪用を通じて Tea トークンをマイニングすることであるという説がさらに裏付けられます。
今年初め、2024 年 4 月 14 日に、Tea フォーラムのユーザーが、Tea 乱用の懸念をさらに裏付けるコメントを投稿しました。
最終的な考えを述べる前に、慎重なメンテナーの考え方と、潜在的な npm サプライ チェーン攻撃のスレッドを明らかにするのに協力してくれた Sébastien Lorber に心から感謝したいと思います。
これらすべての依存パッケージとダウンロードブーストは、3 つの *-cjs パッケージに偽りの正当性を作成するという唯一の目的につながり、やがて適切な被害者が現れて、これらの偽パッケージががインストールされ、その後に新しい悪意のあるバージョンがインストールされます。
オープンソース ソフトウェアを使用する際に安全を確保するには、セキュリティの実践、特に次のフォローアップ教育リソースを導入することを強くお勧めします。
どのような展開であっても、警戒してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3