「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > string-width-cjs npm パッケージのサプライ チェーンの謎の懸念

string-width-cjs npm パッケージのサプライ チェーンの謎の懸念

2024 年 11 月 7 日に公開
ブラウズ:415

この物語は、React ベースのオープンソース ドキュメント プロジェクトである Docusaurus のメンテナである Sébastien Lorber が、パッケージ マニフェストに対するプル リクエストの変更に気づいたところから始まります。人気の cliui npm パッケージに提案されている変更は次のとおりです:

The mysterious supply chain concern of string-width-cjs npm package
具体的には、見慣れない構文

を使用する 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 で悪意のあるモジュールに関する不審な動作を見つける

プル リクエストを調べるために、Sébastien は lockfile-lint を採用しました。このツールは、package-lock.json やyarn.lock などのロックファイルに改ざんの兆候がないかチェックし、元の npm パッケージの代わりに悪意のあるパッケージが挿入されていないことを確認します。

ツールを実行すると次の警告が表示されました:

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 上の人気の類似パッケージ

上記の lockfile-lint の結果を考慮して、Sébastien は npm でこれらのパッケージ名を調べたところ、驚くべきことに、これらがパブリック npm レジストリに存在することがわかりました。

    https://www.npmjs.com/package/string-width-cjs
  • https://www.npmjs.com/package/strip-ansi-cjs
  • https://www.npmjs.com/package/wrap-ansi-cjs
Sébastien は、これらのパッケージ名が npm 上に存在するだけでなく、疑わしい特徴も示していることに気づきました。パッケージは公開ソース コード リポジトリに関連付けられておらず、検査したときに実際のコードは空であり、関連する個人情報なしで匿名で公開されました。

npm パッケージのtrip-ansi-cjs を見ると、README やソースコード リポジトリがありません。ただし、同じ動作を引用する正規の人気パッケージが多数存在します。

実際、この特定のパッケージは人気があり、529 の依存パッケージ (このパッケージに依存する他のパッケージ) と 7,274 の毎週のダウンロードからわかります。

The mysterious supply chain concern of string-width-cjs npm package Strip-ansi-cjs のコードを見ると、このパッケージにはパッケージ マニフェスト package.json ファイルというファイルが 1 つだけあることがわかります。

では、なぜ何もしないパッケージがこれほど多くのダウンロードを獲得し、他の多くのパッケージがそのパッケージに依存するのでしょうか?

The mysterious supply chain concern of string-width-cjs npm package これらの npm パッケージの作成者を調べてみましょう。

3 つのパッケージはすべて hismanshutester002 が所有しており、それらのパッケージはすべてプログラムのバージョン番号とともに昨年公開されました。注目すべき興味深い観察がいくつかあります:

    isaacs-cliui npm パッケージは、cliui プロジェクトの Isaac 自身のフォークと、名前空間 @isaacs/cliui.
  • にある正規の npm パッケージに対するタイポスクワッティングの試みである可能性があります。
  • azure-sdk-for-net npm パッケージは、同じ名前のプライベート パッケージを攻撃する依存関係の混乱キャンペーンの試みである可能性があります。
  • link-deep npm パッケージは、lodash などのユーティリティ パッケージに関連する人気のある機能を占拠しています。

The mysterious supply chain concern of string-width-cjs npm package また、npmjs.
のこのユーザー プロファイル ページには、ユーザー hismanshutester002 を特定できる情報がないことにも注意してください。

私たちは以前、strip-ansi-cjs npm パッケージにはそれを使用する他の 500 以上のパッケージがあるため、人気の肯定的な指標となる可能性があることを指摘しました。見てみましょう:

The mysterious supply chain concern of string-width-cjs npm package リストに含まれているため、これは信憑性があるように思えるかもしれませんが、本当にそうでしょうか?
たとえば、clazz-transformer、react-native-multiply、あるいは gh-monoproject-cli などの名前は正当なもののように見えますが、本当ですか?

ここに、react-native-multiply npm パッケージのページがあります:

The mysterious supply chain concern of string-width-cjs npm package このパッケージには実質的にダウンロードはなく、作成者は匿名の npm ユーザーであり、個人を特定できる情報はありません。このパッケージがリダイレクトするソース URL リポジトリは、存在しない https://github[.]com/hasandader/react-native-multiply です。 GitHub のユーザー プロファイルも非常に疑わしく、実際的な活動が欠けているように見えます。

npm パッケージにはソース コードが含まれているように見えますが、よく見ると、それが「hello world」アプリケーション プロトタイプ用に生成されたコード サンプルであることがわかります。

The mysterious supply chain concern of string-width-cjs npm package また、このパッケージが単なる乗算ライブラリである場合、次のことを行うためになぜ 776 個の依存関係が必要なのかも疑問に思う必要があります:

import { multiply } から 'react-native-multiply'; const result = await multiply(3, 7);

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:

The mysterious supply chain concern of string-width-cjs npm package 前述したように、strip-ansi-cjs 依存関係の 1 つは clazz-transformer という名前でした。見てみましょう:

The mysterious supply chain concern of string-width-cjs npm package ここで何が起こっているのか説明しましょう。 npm パッケージ clazz-transformer は、README ページでタイトル class-transformer と意図的に誤って名前が付けられています。さらに、ソース コード リポジトリ https://github[.]com/typestack/class-transformer はパッケージ名と相関性がなく、その正当性について懸念が生じています。

GitHub 上の関連リポジトリの typstack/class-transformer には、次のような package.json ファイルがあります。

The mysterious supply chain concern of string-width-cjs npm package GitHub の package.json ファイルには依存関係の宣言がありませんが、npmjs で実際のパッケージのソース コードを検査すると、この clazz-transformer がパッケージ化されている 437 個の依存関係がわかります。繰り返しますが、彼らは 3 つの疑わしい *-cjs パッケージを非常に便利にバンドルしています:

The mysterious supply chain concern of string-width-cjs npm package

npm パッケージの不審な発見に関するさらなる考察

さらに結論を出す前に、上で観察した npm パッケージの特徴をいくつか挙げておくことが重要です。

    React Native パッケージは、create-react-native-library scaffold ツールから派生しているようです。このツールには、新しいプロジェクト用に生成されたストック ソース コードの一部として、デフォルトの乗算関数の例も含まれています。
  • パッケージには、npx create-next-app@14 で作成されたものなど、Next.js 14 スターター ボイラープレートから派生できるディレクトリとファイルの構造と依存関係が含まれています。
Sonatype の同僚は、オープンソース レジストリにパッケージが大量に送信される同様のケースを以前に特定しました。このような場合、最終的な目標は、開発者がオープンソース ソフトウェアを収益化するための Web3 プラットフォームである Tea トークンで自分にご褒美を与えることでした。

言及されたパッケージ内でいくつかの tea.yaml ファイルが見つかると、このキャンペーンの目的の一部が Tea の悪用を通じて Tea トークンをマイニングすることであるという説がさらに裏付けられます。

今年初め、2024 年 4 月 14 日に、Tea フォーラムのユーザーが、Tea 乱用の懸念をさらに裏付けるコメントを投稿しました。

The mysterious supply chain concern of string-width-cjs npm package 最終的な考えを述べる前に、慎重なメンテナーの考え方と、潜在的な npm サプライ チェーン攻撃のスレッドを明らかにするのに協力してくれた Sébastien Lorber に心から感謝したいと思います。

string-width-cjs では何が起こっているのでしょうか?

現時点では、真正の正当性を示す非常に疑わしい指標を見つけるために、string-width-cjs に依存していると思われる残りのパッケージに穴をあけ続けることができるという高い自信があります。

これらすべての依存パッケージとダウンロードブーストは、3 つの *-cjs パッケージに偽りの正当性を作成するという唯一の目的につながり、やがて適切な被害者が現れて、これらの偽パッケージががインストールされ、その後に新しい悪意のあるバージョンがインストールされます。

オープンソース ソフトウェアを使用する際に安全を確保するには、セキュリティの実践、特に次のフォローアップ教育リソースを導入することを強くお勧めします。

    npm ロックファイルが悪意のあるモジュールを挿入するセキュリティの盲点になる理由
  • 10 npm セキュリティのベスト プラクティス
  • NPM セキュリティ: サプライ チェーン攻撃の防止
私たちは彼らの不正行為の最中にサプライチェーンのセキュリティキャンペーンを発見したのでしょうか、それともこれはすべて資金追跡に関するものであり、スパムや、Teaトークンを採掘するためのnpmやGitHubなどのパブリックレジストリの悪用に起因する可能性がありますか?

どのような展開であっても、警戒してください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/snyk/the-mysterious-supply-chain-concern-of-string-width-cjs-npm-package-j96?1 侵害がある場合は、study_golang にご連絡ください。 @163.com 削除
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3