Red Hat Cloud Services全体で悪意のあるnpmパッケージが発見
(github.com/RedHatInsights)- この問題は 未解決 の状態であり、本文時点では担当者・マイルストーン・関連ブランチやPRはない
@redhat-cloud-services/スコープの複数の npmリリース で悪意のあるバージョンが発見されたというセキュリティ問題として登録されている- 参考資料として、StepSecurityの分析記事とOSS Security Feedの検索結果が示されている
- 更新された影響リストには、
@redhat-cloud-services/chrome、frontend-components、rbac-client、types、vulnerabilities-clientなど 32個のパッケージ が含まれる - 表に記載された侵害バージョンは大半が各パッケージあたり3件で、
@redhat-cloud-services/vulnerabilities-clientには2.1.9、2.1.11の2バージョンのみが含まれる - 表全体の基準では侵害されたバージョンは 95件 と集計でき、別途言及された外部PRのタイトルも
95 versionsを指している @redhat-cloud-services/frontend-components-*系列と複数の*-clientパッケージがあわせて含まれており、単一パッケージではなく同一スコープ全体のリリース問題となっている- コメントでは「What are these?」という質問に対し「all that module is pwned」という回答が付き、リスト全体が侵害されたという理解が共有されている
- DanielRuf はこの件を supply-chain-incidents に追加したと記している
- GitHub上の活動には、この問題を参照したコンテンツ要約と検出関連PRが見られるが、本文にはRed Hat側の診断・緩和措置・削除の有無・修正版はまだ示されていない
1件のコメント
Hacker Newsの意見
クールダウン設定の話でスレッドをもう一度借りても大丈夫だとよいのですが。axios、tanstack、@redhat-cloud-services、そして最近のさまざまな npm サプライチェーン攻撃は、クールダウンがあれば防げていたはずです
Artifactory/Nexus を使っていればすでにある可能性が高く、なくても設定は簡単です。npm や PyPI の侵害の大半は数時間以内に取り下げられたので、リリースから N 日未満のパッケージを無視する方式で十分です。1日でも効果があり、3日なら妥当、7日はやややりすぎですが機能します
最新の pnpm はデフォルトで 1 日のクールダウンを入れています: https://pnpm.io/supply-chain-security
ワンクリックで済ませたいなら https://depsguard.com を使えます。npm、pnpm、yarn、bun、uv、dependabot にクールダウンと推奨設定を追加する CLI で、私がメンテナです
クールダウンにより特化した https://cooldowns.dev もあり、ローカル設定を支援するスクリプトもあります。どれもオープンソース/無料です
~/.npmrcなどを自分で編集できるなら必須ではありませんが、身近にワンクリック修正だけ必要な人がいるなら、次の攻撃を避ける助けになるかもしれませんただし、新たな重大 CVE を修正しなければならないときはクールダウンを迂回する必要があり、各ツールにはその方法があります。ここ数か月の正確な数字はありませんが、Mythos 的な脆弱性発見の時代であっても、新しいゼロデイ CVE より 悪意あるバージョンの配布 のようなソフトウェアサプライチェーン攻撃のほうがリスクは大きく見えます
~/.npmrcファイルを開いて 1 行追加できる人であっても、ワンクリック修正が必要な場合はとても小さな集団のように感じます「セキュリティ修正にはセキュリティ修正だけを含め、他の機能を載せてはいけない」と言うのは十分可能です。そうなればセキュリティ研究者もツールも監査しやすくなります
通常のリリースにはクールダウンを適用し、セキュリティ修正にはクールダウンをなくすか、もっと短くできます
Debian のように非常に安定したサーバーを置き、unattended upgrades をセキュリティ修正のみに適用するよう設定できる仕組みは参考になります。このような新しいパッケージリリースは、セキュリティ研究者が監査するのもより容易です
こうしたスレッドでは、この種の攻撃があたかも npm にしか存在しないかのように振る舞ったり、何の対策もなかったかのように皮肉るコメントが多いが、それは公正ではないと思う
delay line や pnpm など、パッケージ利用者を保護するために導入された優れた機能に言及するコメントも多い
あまり語られていないのは、パッケージメンテナ側のツールだ。公開時の MFA: https://docs.npmjs.com/requiring-2fa-for-package-publishing-...、約1年前から提供されている trusted publishers: https://docs.npmjs.com/trusted-publishers
最近では、両機能の利点を組み合わせた staged publishing も登場した: https://docs.npmjs.com/staged-publishing
これにより、静的な認証情報なしで CI から公開し、レジストリで実際に公開される前にメンテナが MFA で承認することを必須にできる。必要なら GitHub Actions Environments の保護によって、CI 側で複数承認や時間遅延も要求できる
コミュニティがこうした公開保護策を採用するよう促すべきであり、そうでなければこの問題は続くだろう
そうなると、悪意あるパッケージにも緑の星が付き、利用者に「出所証明付きでビルド・署名されています」と安心させてしまったはずだ
[1] https://lwn.net/Articles/1075742/
防ぐための取り組みが進んでいるのは素晴らしいが、それでも起こり続ける。「またか」と思う意味で滑稽だ
外から見ると、ウェブ開発には無秩序なフロンティアのようなエネルギーがある。可変性、動的型付け、変わり続ける標準やフレームワーク、継続的デプロイ、CDN、リアルタイム A/B キャンペーン、多数の依存関係、複数のインフラにまたがって散在する機微なユーザーデータがある
この見方が正しいと言いたいわけでも、「だから言っただろう」という態度が正しいとも思わないが、そうした見方がどこから来るのかは理解できる
特に、そのどちらも xz-utils バックドアがパッケージ公開に入り込むのを防げなかったはずだ。xz-utils は巧妙な上流侵害のベンチマークであり続けている
ここでのバグは、すでに信頼している上流をもっと上手く認証すべきだということではなく、上流をセキュリティの唯一の源として信頼できないということだ。上流は、堅牢なリリースエンジニアリングにはあまり関心がなく、また得意でもないハッカーたちの集まりだ
しかし、それを上手くやれる人たちもいる。Linux 世界の解決策であり、xz-utils で私たちを救ったやり方は、ハッカーが作った上流をユーザーのためにレビュー・監査・パッケージ化・カスタマイズする 第二の人間レイヤー があることだ
この人たちは別の視点、別の利用者要件、別の品質基準を持っており、上流が見つける準備のできていないバグや悪意を見つけ出す
NPM、cargo、PyPI などは、この人手の必要性を回避できると考え続けているが、実際にはできない。NPM エコシステムでは特に、非常に速いリリース、緩い互換性要件、極端な再利用に慣れたウェブ開発者が多く、それが Python や Rust よりも node パッケージでこうしたことが頻繁に見られる理由になっている
うちの会社では yarn 4 を使っているが、npm パッケージがリリースされてから最初の数日間はインストールを防ぐオプションがある。こうした攻撃の大半はその期間(1〜3日)内に見つかるようだ
https://gist.github.com/mcollina/b294a6c39ee700d24073c0e5a4e...
axios パッケージは侵害され、作者の認証情報も盗まれたため、修正を試みるたびに再び無効化されていた: https://www.trendmicro.com/en_us/research/26/c/axios-npm-pac...
xz ユーティリティには 2 か月間バックドアが入っていた: https://gigazine.net/gsc_news/en/20240403-timeline-of-xz-ope...
ある学生研究者は Python の ctx と PHPass パッケージのメンテナー権限を引き継いで悪意ある変更を配布し、検知と修正までに 7 日以上かかった: https://infosecwriteups.com/how-i-hacked-ctx-and-phpass-modu...
Kaspersky は 1 年以上悪用されていた複数の PyPI パッケージを発見した: https://www.kaspersky.com/about/press-releases/kaspersky-unc...
「LoftyLife」パッケージは数か月にわたって悪用されていた: https://securelist.com/lofylife-malicious-npm-packages/10701...
攻撃ウィンドウが 7 日に変われば、こうした新しい攻撃はすべて 8 日目まで発動しない 時限爆弾 を入れるようになるだろう
pnpmにも同じ機能があり、v11からデフォルトで有効になっている: https://pnpm.io/settings#minimumreleaseageいくつか提案がある。依存関係クールダウン を 1〜2 日入れるのは、CVE パッチ適用能力を損なわずに非常に効果的なようだ
npm install、npm testのようにコードが実行される場所はすべて、権限のない環境で動かすべきだ。GitHub Actions では、アーティファクトをビルド・テストするジョブと、デプロイや署名などを行うジョブを分離すれば比較的簡単だ。AI を使うなら、このパターンを強制する skill/ガイドを追加すればよいGitHub Actions を使うなら、最新の zizmor を導入するとセキュリティ態勢が大きく改善する
2 つ目の対策は、もはや「ワームのように伝播可能」ではなくしてくれるため、今の問題の大きな部分を減らせる。1 つ目は、企業が攻撃に対応する時間を稼いでくれる。この分野のいくつかのベンダーも評価する価値がある
新しいパッケージは遅延すべきだと言った直後だったので、冗談として面白かった
ローカルで Maven プロキシを動かし、すべてのビルドはコンテナ内で行う。Python、npm、Go は公開リポジトリしか使わないので、これらのビルドもコンテナ内で行うが、リポジトリプロキシは不要
Red Hat と IBM がサプライチェーン脆弱性の検知・修正を支援する Project Lightwell を発表したのと同じ日だね
https://www.redhat.com/en/lightwell
数日前にこの興味深い rant を見た: https://github.com/uNetworking/uWebSockets.js/blob/master/mi...
正しいやり方は、使うすべての依存関係をフォークし、必要に応じてアップストリームをレビュー・マージしながら自分のリポジトリからインストールすることだ、という話には一理ある。ただ、ものすごく面倒そう
サードパーティの依存関係ホスティング事業者への依存を減らしたりなくしたりでき、依存関係を自分たちのコードレビュー手段の中に取り込み、長期的に 再現可能なビルド を保証するのに役立つ
Packj(https://github.com/ossillate-inc/packj) は、挙動分析によって悪意のある PyPI/NPM/Ruby/PHP などの依存関係を検出する。静的・動的コード分析で、シェル実行、SSH キー使用、ネットワーク通信、decode+eval の使用といった侵害の指標をスキャンする。タイポスクワッティングのような悪意ある行為者を見つけるために、複数のメタデータ属性も確認する
1週間ほど前にノートPCから Node を消して、気分が良かった
運悪くエクスプロイトを踏んでも被害範囲を減らせるように、すべての作業を 開発コンテナ や別のサンドボックスでやるようにしている。攻撃者が Claude トークンを盗める可能性はあるが、コンテナを簡単に脱出してホームディレクトリを漁ることはできないはず
クールダウンとインストールスクリプトの許可リストは、特に CI において多層防御のための良い追加策だ。ただ、根本的に変わるべきなのは OS の権限モデルだと思う。サードパーティソフトウェアをユーザー権限まるごとで信頼するというデフォルトは、もはや機能していない
元の発表へのリンクを貼っておくべきだと思う
https://www.stepsecurity.io/blog/multiple-redhat-cloud-servi...
パッケージをインストールするとき、今では
--before=2026-05-30フラグを使う癖がついた。指定した日付より前にリリースされたバージョンを選ばせるもので、たいてい 5 日前くらいを指定するhttps://docs.npmjs.com/cli/v11/using-npm/config#min-release-...
pnpmを使っていて、余裕を持ったminimumReleaseAgeを設定しているhttps://pnpm.io/settings#minimumreleaseage
幸い v11 からはデフォルトで有効になっている
.npmrcに単にmin-release-age=5を追加すればいいNPM は設計段階から壊れていて、コミュニティに蔓延する NIH 症候群のせいで単純な対策すら取れなくなっている
自前で作る代わりに外部パッケージを大量に受け入れるせいで、npm プロジェクトは大きく複雑な依存関係ツリーを持ちがちだ。https://www.npmjs.com/package/is-windows のようなパッケージは、同じコードを自分で書くのがあまりに簡単なのに、潜在的な脆弱性と保守上の頭痛の種を生むという不満が昔からあった
しかし当然ながら、全機能を作り直す必要はなく、必要な機能だけを作ればよい
しかも機能を1つだけコーディングするなら、抽象化や追加の関数インターフェースを作る必要もない。だから安上がりで、おそらく統合もうまくいく
もう1つの誤りは、バグや脆弱性を生むだろうと思い込むこと。下手なプログラマーならそうかもしれないが、互いに正確に噛み合うよう設計されていない2つのライブラリの統合境界で生じる脆弱性の類は避けられる。そういうケースは多い