世界を動かす技術を、日本語で。

Nxが侵害される:マルウェアがClaudeコードCLIを使用してファイルシステムを探索する

概要

  • nx ビルドシステムの一部バージョンに マルウェア混入 が発覚
  • s1ngularity-repository というリポジトリが GitHubアカウントに自動生成
  • マルウェアは ウォレットやAPIキーなどの機密情報を窃取
  • Claude Code CLIやGemini CLI の存在確認後、LLMプロンプト経由で情報収集
  • 影響範囲、対処法、今後の対応策について 公式アドバイザリ あり

nxビルドシステムにおけるマルウェア混入事件

  • 2025年8月26日nx の一部バージョンに マルウェア が仕込まれた事案が発生
  • s1ngularity-repository という名前で GitHubリポジトリ が自動で作成される現象
  • マルウェアの主な目的 は、 ウォレット情報やAPIキー (.npmrc、環境変数など)の窃取
  • 窃取した情報は results.b64 ファイルとしてリポジトリに格納
  • Claude Code CLIやGemini CLI が検出されると、LLMプロンプトを通じてさらなる情報収集を実施

影響を受けるバージョン

  • nx v21.5.0 ~ v21.8.0
  • nx v20.6.0 ~ v20.12.0
    • これらのバージョンは npmから既に削除済み

具体的な被害と挙動

  • GitHub CLI を用いて s1ngularity-repository を自動作成
  • 環境変数やウォレットファイル を探索・収集し、 base64で2重エンコード してアップロード
  • LLMプロンプト を使い、 Linux/macOS の特定パスを再帰的にスキャンし、 ウォレット関連ファイル を収集
  • .bashrc等のシェルファイルshutdownディレクティブ を追加し、不正な動作を隠蔽

発覚から対応までのタイムライン

  • 2025-08-26 18:00 PDT :不正なnxバージョン公開(v20.9.0 - v20.12.0、v21.5.0 - v21.8.0)
  • 2025-08-26 20:30 PDT :最初の被害報告
  • 2025-08-26 22:45 PDT :npmから該当バージョン削除
  • 2025-08-26 23:45 PDT :nrwlが不正npmアカウント削除
  • 2025-08-27 01:00 PDT :@nx/配下の追加パッケージも影響範囲に追加

影響確認・対処方法

  • GitHub組織s1ngularity-repository が存在しないか確認
  • semgrep による脆弱バージョン検出
    • semgrep --config r/oqUk5lJ/semgrep.ssc-mal-resp-2025-08-nx-build-compromised
    • またはnx --versionやlockfileでバージョン確認
  • 対処手順
    • nxを安全な最新バージョン(21.4.1)へアップデート
    • s1ngularity-repositoryコピー後、削除
    • 漏洩した可能性のある全てのシークレットをローテーション
      • GitHub、npm、SSHキー、環境変数等
    • .bashrc等のshutdownディレクティブを削除

マルウェアの技術的特徴

  • post-installフックtelemetry.js を実行
  • プロセス環境変数ウォレットファイル をダンプ
  • GitHub CLI を利用し、 認証トークン でリポジトリ作成
  • Claude Code CLIやGemini CLI があれば、 LLMプロンプト 経由で情報収集
  • 収集結果を2重base64エンコードし、GitHubリポジトリへアップロード
  • LLM活用 により、 マルウェア本体の検出を困難化

NXとは

  • NXモノレポ に特化した 大規模プロジェクト向けビルドシステム
  • 2.5百万人以上の開発者 が日常的に利用
  • VSCode Cursor拡張等 で自動的に最新版へアップデートされる場合も多い

関連情報・参考リンク

今後の対応と注意点

  • 公式アドバイザリや最新情報を随時確認
  • 組織内リポジトリの監視を継続
  • npm等のサプライチェーン攻撃への警戒強化
  • 秘密情報管理の徹底と定期的なローテーション
  • LLM等の新たな攻撃手法への理解と対策

Hackerたちの意見

正直言って、今はほとんどのコーディングをVMでやってる。これらのセキュリティプロファイルが許容できるとは思えない。マルウェアのベクターとしてのエージェントからの潜在的な脅威レベルは本当に桁外れだよ。今、私たちは、侵入したときに何を探しているのかもわからずに、1,000ドル以上の身代金データや暗号キー、パスワード、脅迫材料、財務記録のチャンスをスキャンできる時代に突入している。

今はほとんどのコーディングをVMでやってる もしかしたらQubes OSに興味があるかも。すべてをVMでやって、使いやすいUXがあるよ。私のメインの環境で、めちゃくちゃおすすめ。

似たような感じだけど、ホストマシンとはソースコードのディレクトリ以外は何も共有しないpodmanコンテナの中で動かすよ。

新しい依存関係を追加する際には、もっと慎重に考えるべきだよ。今年は供給チェーン攻撃が多すぎる。今週、Goプロジェクトに8つの統計カウンター付きのプログレスバーを追加する必要があったんだけど、ライブラリを見たら、どれも3,000行以上のコードだった。LLMにシンプルなプログレスレポートトラッキングUIを作ってもらったら、150行未満で済んだ。期待通りに動くし、依存関係もいらない。すごくシンプルで、誰でもコードが理解できる。ターミナルの出力をクリアして、毎秒再描画するだけ。スレッドセーフでもあるし、統合してコードをレビューするのに25分かかった。複雑な統計カウンターが必要ないなら、シンプルなプログレスバーは30行くらいで書ける。これから新しい依存関係を考えるときは、これが私のやり方になりそう。すべてのパッケージの更新を監査するリソースはないからね。

これらの依存関係がなければ、AIがあなたのコードを書くためのトレーニングデータは存在しない。

外部ライブラリを導入する価値の一部は、彼らが改善したら自動的にその恩恵を受けられるってことだったんだよね。でも今は、彼らが「改善」したら自動的にその影響を受けるっていう脅威がある。left-padの問題は、みんなにとって大きな警鐘だったはずなのに、結局のところ「10行のコードのために依存関係を全部引っ張ってくるなんて、あいつらバカだな。俺は100行のコードのために依存関係を引っ張ってくるから賢いんだ」っていう教訓を得たみたい。

新しい依存関係を追加する時は、みんなもっと考えるべきだよ。今年はサプライチェーン攻撃が本当に多かったからさ。「言語パッケージマネージャー」が流行り始めた時は、すごく不安だった。俺はシステムプログラミングの世界で働いてるから、過去10年間はpipやnpmみたいなものをちょっと疑いの目で見てたんだ。でもRustのプロジェクトをやってみて、Cargoを使って設定ファイルの1行で完全にレビューされてない依存関係を何十個も簡単に引っ張ってこれるのを見た時、これはヤバいことになるって思ったよ。案の定、これは悪い方向だし、今すぐ戻るべきだね。(でも戻らないだろうけど。コンピュータセキュリティなんて存在しないから。)

基本的にgit cloneをするパッケージマネージャーが欲しいし、「依存関係は極力少なくして、ソースコードをリポジトリにコミットして、アップデートの時に変更をレビューする」って文化があればいいなと思ってる。それがあれば、現代のパッケージ管理の混乱が大きく改善されると思う。

正直、あの進捗トラッカーが大嫌い。emacsシェルを壊すから(お前ら、expoとeasを見てるぞ)。シンプルなカウンターを表示すればいいのに、例えば「..10%..20%..30%」とか。「Uploading…」でもいいじゃん。ターミナルコードはTUIかインタラクティブ専用で使うべきだよ。

私のチームではNXをたくさん使ってるけど、全然影響を受けてないよ。大手保険会社で、10以上のスタンドアロンのビジネスアプリと25以上の個別ライブラリを同じモノレポでNXが管理してる。こういう複雑なセットアップのために他のモノレポツール(lerna、rushjs、yarn workspaces)を試したこともあるけど、どれも近づくことすらできなかった。lernaはNXにほぼ引き継がれてるし、rushjsはメンテされてない。もし、日々の開発者が何十人も関わるFEモノレポの複雑さを適切に管理する方法があれば、代替案を投稿してほしいな。最近のセキュリティインシデントもあって、多くの人が探してるから。

正直、Goで機能を実装する時は、パッケージを使うよりも自分で書いた方が簡単でコードも少ないと思う。TypeScriptと比べると、パッケージを使うためのコードが必要になるから、ゴーランでやったことと比べて常に多くの行数になるんだよね。

それはライブラリとカスタム構築の違いだね。ライブラリは定義上、ある程度一般的で適応可能、設定可能であるべきなんだ。それにはたくさんのコードが必要だよ。

それで、LLMがどんなコードで訓練されたか知ってる?そのソースが侵害されてないってどうやってわかるの?

簡単な解決策:進捗バーなんて必要ないよ。

あなたはnxの妥協されたバージョンを使っていますか? > semgrep --config [...] を実行してください。 > あるいは、nx –version [...] を実行することもできます。 まだ学んでいないの?この投稿がすでに得たポイント数がそれを示している。みんな、そんなことをするように言うセキュリティアドバイザーを信じちゃダメだよ。特に、元の指示を完全に削除して、自分のツールを実行するように指示するやつには。元のセキュリティアドバイザリーは https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7... にあって、妥協されたプログラムを実行してそれが妥協されたバージョンかどうかを判断するようには一度も言ってないし、semgrepを実行することも言ってない。

あなたは影響を受けていますか?影響を受けたプログラムを実行してください。はい、これであなたは確実に影響を受けています。

うん、ブログ記事は告白みたいだね。すごく変な感じ。

こういうマルウェアは自分のモデルを持っていて、自分で推論するものだと思ってた。マルウェアが新しい技術を取り入れるとき、作者がどれだけ「怠けてる」か「大胆」なのかにいつも驚かされる。

このSemgrepの投稿は、Nxが自分たちで報告した内容とは全く異なるプロンプトを説明していて、攻撃者が複数のリリースにわたってペイロードを「ライブ編集」していたことを示唆している。さらに進むつもりだったのかもしれない。それでも、なぜペイロードはファイルのパスだけをアップロードして、実際の内容は含まれていないの?公開する前に完全な攻撃を準備していなかったのはなぜ?本当にデータ収集のための操作、概念実証としての意味だったのか、それともちょっと頭が悪いだけなのか? https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7...

なんか、誰かがただハチの巣をつつきたかっただけって感じだね。特に、AIを使って議論を盛り上げるために、話題をそこに集中させようとしてる。特に、.bashrcを編集してシャットダウンさせるっていうのがね。これ、明らかにできるだけ目立とうとしてるけど、あまり破壊的にはならないようにしてる感じ。

Claudeのコードは、コンピュータで有用な作業をするための革命的なツールだって言われてるよね。でもそれは、 - NodeJSアプリ - シェルスクリプトをcurlで取得してbashにパイプしてインストール - ファイルシステムをいじったり、コマンドを実行したりする自由があるLLM ってことなんだよね。これって、システムに対する攻撃ベクトルが3つもあるってことじゃない?俺は絶対にサンドボックス(VMやコンテナ、専用の開発ボックスなど)以外でこれを動かす気にはなれないよ。

エージェントをサンドボックスで動かすのは間違いなく正しいと思う。ただ、Claudeのコードは最初からコマンドを自由に実行できるわけじゃないんだよね。

これらのことは特に心配する部分じゃないよ。問題なのは、実行中に自動でアップデートされること。つまり、Anthropicのためにあなたのマシン上でRCEが設計されてるってこと。

だから何?自動で動くわけじゃないし、自分で動かさなきゃいけないんだよね。許可がたくさん必要なアプリなんて山ほどあるし。ターミナルもファイルシステムをいじったりコマンドを実行したりできるけど、自動で開いてコマンドを実行するわけじゃない。実際にclaudeのコードを実行して、何かさせる必要があるんだ。仕事中に自分のコンピュータを壊す生きた悪魔みたいなもんじゃないよ。Claude Codeは、30年前に初めてコンピュータを使った時以来、私が使った中で最も素晴らしくて画期的なツールだよ。「攻撃ベクトル」とか全然気にしないし、誰も私のコンピュータに無許可でアクセスできなければ、そんなの関係ない。もしアクセスされたとしても、Claude Codeは私の問題の中で一番下の方だね。

誰かがNxやAnthropicに責任を押し付ける前に、実際にこの脆弱性を引き起こした原因を思い出してほしい。脆弱性は、盗まれた「トークン」(プログラミング言語のパッケージマネージャーリポジトリにアクセスするための「ユーザー名+パスワード」のような文字列)を使ってアップロードされたパッケージに含まれていたものなんだ。でもそれは攻撃の配信メカニズムに過ぎない。攻撃が成功した理由は、1. パッケージマネージャーのリポジトリが、アーティファクトが認可された開発者によって生成されたことを確認するための署名を要求しなかったこと。2. コードが認可された開発者によって署名されたことを確認するためのコード署名を要求しなかったこと。3.(おそらく)パッケージマネージャーのリポジトリが、新しいソースIPや国からのアップロードなどの異常な活動を検出・防止するためのヒューリスティックを実装していなかったこと。4.(おそらく)侵害されたトークンの使用にMFAを要求しなかったこと。5.(おそらく)トークンが一時的なものでなかったこと。6.(おそらく)トークンを盗まれた開発者が、トークンの新しい要求アプリケーションとセッションによる解除を手動で承認する必要があるパスワードマネージャーにトークンを保存していなかったこと。これらの失敗の後、もし影響を受けてGitHubリポジトリがあなたのアカウントに作成されたなら、それはあなたの責任だよ。GitHubのトークンや認証を、トークンの新しい要求アプリケーションとセッションによる解除を手動で承認する必要があるパスワードマネージャーに保管していなかったから。つまり、この脆弱性を引き起こしたのは、すべて防げたセキュリティメカニズムで、数年前にどんな有能なプログラマーでも簡単に追加できたものなんだ。それが整備されていなかったのは、ソフトウェア業界全体の根本的な失敗だよ。だって、1) これは新しい攻撃じゃないし、何年も続いているし、2) 我々はソフトウェア開発者だから、修正することを妨げるものは何もない。だからこそ、ソフトウェアには建築基準が必要だと主張し続けてるんだ。遵守しない場合は検査や罰金があるべきだと思う。この攻撃は、金融、電力、通信、病院、軍など、何万もの機関に対して使われる可能性があった。攻撃の範囲と影響は、AIとともに増大する一方だよ。明らかに、我々は安全にソフトウェアを書く責任を持っていない。だから、安全にかつ確実に行うことを強制する建築基準が必要なんだ。

AnthropicとGoogleはこの問題に真剣に取り組むべきだよね。

影響を受けたユーザーの50%はVS Codeが原因で、LinuxとmacOSでしか動かなかったんだ。 https://www.wiz.io/blog/s1ngularity-supply-chain-attack 「インストール後のマルウェアスクリプトが含まれていて、暗号通貨のウォレットやGitHub、npmトークン、SSHキーなどの機密開発資産を収集するように設計されていた。マルウェアはAIコマンドラインツール(Claude、Gemini、Qなど)を利用して偵察を行い、盗まれたデータを被害者のGitHubアカウント内の公開アクセス可能な攻撃者が作成したリポジトリに流出させた。 「マルウェアは、~/.bashrcや~/.zshrcにsudo shutdown -h 0を追加してロックアウトを試み、新しいターミナルセッションでシステムをシャットダウンさせた。 「流出したデータは二重または三重にbase64エンコードされ、攻撃者が管理する被害者のGitHubリポジトリ(s1ngularity-repository、s1ngularity-repository-0、s1ngularity-repository-1など)にアップロードされ、数千件が公開されているのが観察された。 「ここで流出したデータの中には、1000以上の有効なGitHubトークン、数十の有効なクラウド認証情報やNPMトークン、約2万のファイルが含まれている。多くの場合、マルウェアは開発者のマシンで実行され、NX VSCode拡張を介して行われていることが多い。また、GitHub Actionsなどのビルドパイプラインで実行されるケースも観察されている。 「2025年8月27日9時(UTC)にGitHubは、データが公開されるのを防ぐために攻撃者が作成したすべてのリポジトリを無効にしたが、流出のウィンドウ(約8時間続いた)は、元の攻撃者や他の悪意のある行為者によってこれらのリポジトリがダウンロードされるのに十分だった。さらに、base64エンコードは簡単にデコードできるため、このデータは実質的に公開情報として扱うべきだ。」

この会社はちょっと変わってるね。https://semgrep.dev/solutions/secure-vibe-coding/ もしソフトウェア開発が彼らのデモみたいになったら: - 自分が書いたコードに脆弱性はあるのか? - そのコードは何をするのか? そしたら、キャリアを変えて自給自足の農業を始めて、崩壊を待つことにするよ。

今日は「Stardew Valley」をプレイするか、自分で「ハーベストムーン」のクローンをプログラミングして練習できるよ。

https://news.ycombinator.com/item?id=45039442

Anthropicの安全対策には本当に感謝してる。ほとんどのケースで、Claudeが他のモデルプロバイダーと拒否のやり取りをする時、Claudeはちゃんと対応するけど、他のモデルはそうじゃないことが多い。TikTokでバイラルになった、メンタルヘルスの問題を抱えた女性がChatGPTに「オラクル」と呼ばれて支援されていたけど、Claudeに切り替えたら最終的に拒否して専門家に相談するように言ったんだ。 「それは絶対に正しい!」って言うのがしばらくするとうざくなることもあるけど、Anthropicが他のラボよりも安全性や拒否にもっと注意を払っていることを評価しないと、みんなにとって損になると思う。

npm installスクリプトを無効にすることを定期的に思い出してね。 npm config set ignore-scripts true [--global] プロジェクトレベルでもグローバルでも簡単にできるし、最近はそれなしでは動かない正当なパッケージも結構あるよ。動かないパッケージのために、別のインストールスクリプトを作って、そのフォルダに移動してインストールスクリプトを実行することもできる。これがサプライチェーン攻撃に対する完全な解決策ではないのは分かってるけど、今のところnpmを通じて多くの攻撃に対して効果的だったよ。 https://docs.npmjs.com/cli/v8/commands/npm-config

それかpnpmを使ってみて。最新のバージョンでは、すべての依存関係ライフサイクルスクリプトがデフォルトで無視されるよ。各パッケージをホワイトリストに入れないといけないけど。