本文へスキップ

Zod 4.6.6のマルウェア騒動、不正なコミットはnpmに届かず

10月11日に公開されたZod 4.6.6の履歴には、9月21日に仕込まれたマルウェア入りの悪意あるコミットが残っていました。それらは同日に取り消され、どれもnpmには届いていません。

著者 Tech AI Wire Team

4 分で読めます

黒い背景に表示されたZodのドキュメントのホームページ。青いZodのロゴ、Zodという名前、New Zod 4.6のバッジが見えます。

人気のTypeScript検証ライブラリの最新リリースであるZod 4.6.6が、2026年10月11日に公開されました。そのリリースページにはマルウェア攻撃によるコミットが並んでおり、開発者たちがGitHubとHacker Newsで警鐘を鳴らしました。これらのコミットは9月21日にプッシュされ、同じ日に取り消されています。GitHubのセキュリティアドバイザリによると、Zodへの悪意ある変更は、JavaScriptパッケージが公開されるレジストリであるnpmには届きませんでした。

Zodは、フォームやAPIレスポンスなどのデータが、プログラムの想定する形をしているかを確認します。多くのTypeScriptプロジェクトがZodに依存しています。

Zod 4.6.6が感染したように見えた理由

4.6.6のリリースページには、前回のリリースである4.6.5以降のすべてのコミットが並んでいます。その一覧には、"Fix bugs and improve performance"という題の2つのコミットと、"4.6.7"と"4.6.8"という名前のバージョン更新が含まれています。公開の設定に対する2つの変更も含まれています。"ci: publish to npm with NPM_TOKEN"と"ci: drop the npm environment approval gate from publish"です。

"Suspicious preinstall script in v4.6.6 commit history"という題のGitHubのイシューが、それらのうち最初のコミットを指摘しました。Hacker Newsのスレッドは"Zod 4.6.6 compromised by malware?"と問いかけました。イシューの投稿者は、次のような注意を添えています。

「この変更は最終リリースの前に取り消されたようで、npmで公開された4.6.6には不審なファイルは含まれていないようです。」

同じ一覧には、それらを取り除いた変更である"Cleanup bad commits (#6620)"も含まれています。

9月21日の攻撃は何をしたのか

GitHubのアドバイザリは、その経緯を時系列で示しています。同じローダーが、1時間以内に3つのプロジェクトに入り込みました。

時刻(UTC)リポジトリ起きたこと
11:56colinhacks/zodコミットd821685、"Fix bugs and improve performance"
12:37standard-schema/standard-schema同じ題名とローダーを持つコミット
12:54nubjs/nub同じ題名とローダーを持つコミット
13:00nubjs/nub続くコミット、"chore: update npm/nub package"
13:09npm@nubjs/nub@0.9.4のスキャンを記録。そのバージョンはブロックされた

Zodへのコミットは、meta.test.mjsという名前の4行のファイルを2つ追加しました。1つはメインのパッケージに、もう1つはZod Miniにあります。名前に反して、これらはテストではありません。このコミットは、それらを実行するためのpreinstallエントリも追加しました。これはインストールフック、つまりパッケージのインストール時に実行されるコードです。さらにバージョンを4.6.6に上げ、メインブランチへのプッシュで公開が始まるようにリリースのワークフローを変更しました。

ローダーは、Ethereumブロックチェーン上に保存された小さなプログラムであるスマートコントラクトに、Webアドレスを問い合わせます。続いて、そのアドレスからJavaScriptをダウンロードし、インストールしたユーザーの権限で実行して、一時ファイルを削除します。アドレスはブロックチェーンから取得されるため、リポジトリ内のコードを見ても、ペイロードの置き場所はわかりません。今月報じられたMALFEXのnpmマルウェアも、Solanaを使って似た手口を用いています。

npmに何も届かなかった理由

メンテナーであるGitHubのcolinhacksは、アドバイザリのスレッドに「npmやGitHubのトークンではなく、何らかのgit pushの認証情報が侵害されたようです」と書きました。メンテナーはさらに「攻撃は、悪意あるコミットと、mainへのタグ付きプッシュで構成されていました」とも書いています。

その日のほかのコミットは、リリースを強行しようとしました。承認ステップを削除し、NPM_TOKENシークレットを使う公開経路を追加し、バージョンを2回上げています。メンテナーによると、npmが昨年12月にトークンによる公開を廃止して以来、Zodのリリースの流れはこの種の攻撃にさらされていませんでした。アドバイザリは、Zodとstandard-schemaへの変更は「npmでの公開には至らなかった」と述べています。

Nubは事情が異なりました。そのリリースはタグを作るだけで始められたため、@nubjs/nub@0.9.4はnpmの公開パイプラインまで到達しました。レジストリはこのバージョンを検査のために保留し、悪意あるコードを見つけて、誰もインストールできないうちにブロックしました。

プルリクエスト#6620、"Cleanup bad commits"は、6つのコミットを取り消し、9月21日にマージされました。これにより、攻撃者が新たに作った公開ワークフローとローダーのファイルが削除され、preinstallエントリが取り除かれ、バージョンは4.6.5に戻されました。

Zod 4.6.6はどのように公開されたか

npmレジストリの登録情報によると、4.6.6はtrusted publishing(信頼された公開)を通じてGitHub Actionsが公開し、colinhacksが承認しました。trusted publishingでは、npmは指定されたGitHubワークフローからのリリースしか受け付けないため、盗まれるような長期間有効なトークンが存在しません。今月初めには、npmがtrusted publishingでlatestなどのdist-tagを動かせるようにしました。このパッケージには、どこでビルドされたかを示す署名付きの記録である、provenance attestation(来歴証明)が付いています。マニフェストには、preinstall、install、postinstallのいずれのスクリプトも記載されていません。

このリリースでは、手順も厳しくなりました。含まれる変更のうち#6622と#6638の2つは、新しいnpmバージョンを公開せずにステージングし、それらが承認されるまで各実行を保留します。9月24日、メンテナーは、自身のすべてのnpmパッケージが、手動でしか開始できないステージング公開を使うようになったと書きました。

プッシュ用の認証情報がどのように盗まれたかは、GitHubとともに引き続き調査中だと、メンテナーは述べています。

開発者にとっての意味

  • npmのZod 4.6.6にマルウェアの兆候はありません。 マニフェストにインストールフックはなく、provenanceも付いています。npm view zod@4.6.6 scriptsを使えば、何もインストールせずにスクリプトを確認できます。
  • 配信用ドメインをログで検索すること。 アドバイザリは、指標としてdsakldjklsaj33112[.]comを挙げています。9月21日にZod、standard-schema、nubをGitのソースからビルドしたマシンを確認してください。検索するときは角かっこを外してください。
  • 可能な場合はインストールスクリプトを無効にすること。 この攻撃はpreinstallフックに依存していました。npmのignore-scripts設定を使うと、こうしたフックは実行されません。一部のパッケージは自身のスクリプトを必要とするため、プロジェクトが引き続きビルドできるかテストしてください。
  • メンテナーはZodの構成をまねできます。 攻撃者はmainにプッシュしてワークフローを編集できたにもかかわらず、Zodを公開することはできませんでした。trusted publishingと手動の承認ステップの組み合わせが持ちこたえたのです。nubのようにタグで始まるリリースは、より弱い設計です。

出典

  1. Security advisory: malicious npm package changes affecting zod, nub, and standard-schema - GitHub Community
  2. Fix bugs and improve performance (commit d821685) - GitHub (colinhacks/zod)
  3. Cleanup bad commits (#6620) - GitHub (colinhacks/zod)
  4. Release v4.6.6 - GitHub (colinhacks/zod)
  5. Suspicious preinstall script in v4.6.6 commit history - GitHub (colinhacks/zod)
  6. zod 4.6.6 package manifest - npm registry

関連記事

CloudSEKのブログ記事「MALFEX - A malicious npm postinstall no advisory has caught for fourteen months」のスクリーンショット。レポートのヘッダー画像の上に表示されている。
開発ツール

npmマルウェア「MALFEX」、14か月間検知されず稼働

1人の攻撃者によるnpmのサプライチェーン攻撃「MALFEX」は、2023年以降に12個のパッケージを公開し、ダウンロード数は40,767回に達した。一部は今もアドバイザリーなしで公開されている。

GitHub Changelogの記事「Opt-in dist-tag permissions for npm trusted publishing」のスクリーンショット。下にGitHubの青いOctocatのアートワークがある。
開発ツール

npmのtrusted publishing、OIDCでdist-tagの移動に対応

npmのtrusted publishingで、短期間だけ有効なOIDCトークンを使い、latestなどのdist-tag(ディストタグ)を追加、移動、削除できるようになりました。初期設定ではオフで、npm 11.21.0が必要です。

Node.js 22.23.3のリリースノートにあるNotable Changesの一覧。OpenSSL 3.5.8への更新と2つのNode-APIの変更が含まれている。
開発ツール

Node.js 22.23.3 LTS、HTTP/2のuse-after-freeバグを修正

9月23日公開のNode.js 22.23.3 LTSは、HTTP/2のuse-after-free(ユースアフターフリー)バグを修正し、Node-APIにSharedArrayBufferのサポートを追加し、OpenSSL 3.5.8に移行しました。