@redhat-cloud-services/ 配下の多数の npm package で悪意あるリリースが見つかったと報告されています。frontend-components や insights-client、rbac-client など、かなり広い範囲です。GitHub の issue #492 では、@redhat-cloud-services/ スコープに属する複数の npm package で、malicious npm releases(悪意ある npm リリース)が検出されたと報告されています。
npm package というのは、JavaScript の世界でよく使う「再利用可能な部品」です。たとえば、UI のコンポーネント、API クライアント、設定関連のユーティリティなどを個別の package として配布できます。便利な反面、ひとつでも汚染されると、その package を使っているプロジェクト全体に影響が出ることがあります。
今回の件で印象的なのは、単発の package ではなく、かなり広い範囲で複数の package が並んで挙がっていることです。これは「1つの依存関係がやられた」ではなく、サプライチェーン全体に触れるタイプの事故として見るべきだと思います。
issue に掲載されていた対象は、たとえば次のようなものです。
@redhat-cloud-services/chrome@redhat-cloud-services/compliance-client@redhat-cloud-services/config-manager-client@redhat-cloud-services/entitlements-client@redhat-cloud-services/frontend-components@redhat-cloud-services/frontend-components-notifications@redhat-cloud-services/frontend-components-utilities@redhat-cloud-services/host-inventory-client@redhat-cloud-services/insights-client@redhat-cloud-services/integrations-client@redhat-cloud-services/notifications-client@redhat-cloud-services/patch-client@redhat-cloud-services/rbac-client@redhat-cloud-services/remediations-client@redhat-cloud-services/sources-client@redhat-cloud-services/topological-inventory-client@redhat-cloud-services/vulnerabilities-clientほかにも、eslint-config-redhat-cloud-services や types、tsc-transform-imports など、開発支援系の package まで含まれています。
こういう一覧を見ると、正直ちょっとゾッとします。アプリの見た目を作る package もあれば、API と通信する client package もあり、開発時に使うツール系まである。つまり、本番コードだけでなく、開発環境にも入り込みうるわけです。これはかなり嫌なパターンです。
悪意ある npm release が怖いのは、単に「壊れた package が出た」では済まないところです。
たとえば、次のようなリスクが考えられます。
もちろん、今回の issue 本文だけから「実際に何が実行されたか」まで断定はできません。ですが、StepSecurity の告知リンクが参照されていることから、少なくともセキュリティ上の重大な懸念として扱うべき事案なのは間違いないです。
個人的には、こういう話は「自分は Red Hat 系 package を使っていないから関係ない」で終わらせないほうがいいと思います。npm の世界では、似た構造の事故がどの scope でも起こりうるからです。今日は Red Hat 系、明日は別の maintainer、というのは十分ありえます。
技術に詳しくない人向けに、ざっくり言うとこうです。
もし依存 package が汚染されると、自分で書いたコードが安全でも、部品の中に入った悪意ある処理によって危険が生じます。
だから「コードレビュー」だけでなく、「使っている部品そのものの安全性」も見ないといけません。
この点で、npm のサプライチェーン攻撃は本当に厄介です。コードの品質問題というより、信頼していた流通経路が壊れる問題だからです。しかも、見た目は普通にアップデートできてしまう。便利さと危険が表裏一体なんですよね。
今回のような件を受けて、現場では次のような対応が大事だと思います。
依存 package の version を確認する
lockfile を見直す
package-lock.json や yarn.lock に、問題のある version が固定されていないか確認します。セキュリティ情報を追う
不要な dependency を減らす
CI/CD の権限を絞る
このへんは地味ですが、かなり現実的です。サプライチェーンの話は派手な対策より、普段の運用をどれだけ堅くしているかが勝負だと思います。
この issue 自体は、Red Hat Insights の javascript-clients リポジトリで立てられたセキュリティ報告です。つまり、単なる雑談ではなく、コミュニティや利用者に対して「注意してね」と伝える場になっています。
また、本文で StepSecurity のブログと OSS security feed が参照されているのも重要です。こうした外部情報を起点に、影響範囲を広く確認しているわけですね。実際、こういう一次情報だけでは全体像が見えにくいので、外部のセキュリティ観測データをつなげるのはかなり有効だと思います。
今回の件は、npm エコシステムの便利さと危うさを同時に見せる、かなり典型的で、しかも嫌なタイプのセキュリティ事件です。
「自分のコードは安全」でも、依存 package がやられれば話は別。
しかも今回は対象範囲が広く、開発用・実行用の両方にまたがっている可能性があるため、影響の見積もりも簡単ではありません。
個人的には、こういうニュースを見るたびに、依存関係は“借り物”ではなく“預かり物”として扱うべきだと感じます。便利だからこそ、疑う目が必要なんですよね。