タグアーカイブ npm

npmとGitHub Actionsのサプライチェーン攻撃を遮断する新防御策

npmとGitHub Actionsのサプライチェーン攻撃を遮断する新防御策

npmとGitHub Actionsを舞台にしたサプライチェーン攻撃が、近年組織化された巧妙な手口で猛威を振るっている。2026年前半、GitHubはこの攻撃連鎖を根本から断つため、数多くの防御策を相次いでリリースした。

公式ブログで公開された内容をもとに、初期侵入の防止、認証情報の抜き取り対策、マルウェア拡散の阻止、インシデント対応まで、最新の変更点をまとめて解説する。CI/CDパイプラインやパッケージレジストリを扱う開発者や運用担当にとって、すぐに活用できる情報が揃っている。

サプライチェーン攻撃の実態と攻撃チェーン

サプライチェーン攻撃の実態と攻撃チェーン

オープンソースエコシステムを標的としたサプライチェーン攻撃は、複数の脆弱性を組み合わせて短期間に被害を拡大する。典型的な流れは、メンテナーのアカウント乗っ取りに始まり、CI/CDワークフローの欠陥を突いてプロジェクトへ侵入し、認証情報を窃取したうえで、マルウェアを仕込んだパッケージを一気に配布するというものだ。

GitHubはこうした攻撃チェーンを研究し、最も効果の高い箇所に対策を集中投入している。以下の図は、よく見られる攻撃のステップを簡略化したものだ。

従来の典型的なサプライチェーン攻撃のチェーン
STEP 1 フィッシングメールでメンテナーの認証情報を窃取
STEP 2 GitHub Actionsの脆弱なワークフローを利用してプロジェクトに不正アクセス
STEP 3 CI/CDパイプラインから認証情報を抜き出す
STEP 4 不正なパッケージをnpmに公開し、多くのプロジェクトに拡散
※攻撃者はこれらのステップを極めて短時間で実行し、被害を最大化する。

この連鎖を断ち切るため、GitHubは複数の防御層を設けてきた。次節から順に見ていく。

初期侵入を許さない新たな対策

初期侵入を許さない新たな対策

サプライチェーン攻撃の第一段階は、多くの場合フィッシングによるメンテナーアカウントの侵害だ。また、GitHub Actionsのワークフロー設定ミスを突いた手口も頻発している。これらに対抗するため、2026年6月にいくつかの重要な変更が施された。

高影響度npmアカウントの保護

npmでは、影響度の高いアカウントに対して予防的な保護措置が導入された。メールアドレスの変更や二要素認証のリカバリコードを使用した場合、アカウントは72時間にわたって読み取り専用となる。この猶予期間によって、正当なメンテナーがアカウント回復のための時間を確保し、攻撃者が即座に悪用することを防げる。

GitHub Actionsワークフローの安全強化

GitHub Actionsでは、「pwn request」と呼ばれるフォークからのプルリクエストを通じた不正コード実行が長年の課題だった。これに対処するため、actions/checkout のデフォルト動作が変更され、フォークからの信頼できないコードをチェックアウトしないようになった(明示的にオプトアウトすれば従来どおり利用できる)。

さらに、ワークフローのトリガー(実行条件)に対して、誰がどの種類のトリガーを使えるのかをエンタープライズや組織レベルで制御できるポリシーが追加された。これにより、不要な pull_request_target の使用を禁止したり、信頼できないトリガーの範囲を限定したりできる。

加えて、Actionsのキャッシュ操作にも制限がかかった。信頼度の低いワークフローからは、他のワークフローと共有しているキャッシュを変更できないようにし、キャッシュポイズニングによる権限昇格の道を塞いでいる。

認証情報の抜き取りを防ぐ仕組み

認証情報の抜き取りを防ぐ仕組み

初期侵入に成功した攻撃者は、次にCI/CDパイプラインやリポジトリに残る認証情報を狙う。これらを抜き取られないようにすることが、攻撃拡大を防ぐ要となる。

信頼できる公開で長期クレデンシャルを排除

npmの「Trusted Publishing(信頼できる公開)」は、長期にわたって有効なトークンを使わずにパッケージを公開する機能だ。2026年4月より、CI/CDサービスとしてCircleCIが新たにサポートされたことで、より多くのプロジェクトがこの仕組みを利用できるようになった。CI/CD環境に直接シークレットを置く必要がなくなり、たとえ環境が侵害されてもトークンが漏洩するリスクが大きく下がる。

従来の公開フロー(Before)
CI/CD環境 長期トークンを保持 漏洩時に悪用
Trusted Publishing導入後(After)
CircleCI等 一時クレデンシャルで承認 npm に安全公開
※長期トークン不要のため、仮にCI/CDが侵害されても公開権限は奪われない

Actionsネットワークファイアウォール(技術プレビュー)

Actionsワークフローの実行中に発生するすべての外向き通信をログに記録する機能が、テクニカルプレビューとして提供開始された。これにより、悪意のあるコードのダウンロードや、未知のドメインへの認証情報の送信といった異常を検知できる下地が整う。将来的には、ネットワークの出口制限(egress restriction)やポリシーによる遮断も視野に入っている。

攻撃の拡散を封じるnpmとGitHub Actionsの強化

認証情報を手にした攻撃者は、次にマルウェアを仕込んだパッケージを大量に公開し、できるだけ多くのプロジェクトに感染させようとする。拡散速度を落とし、悪用の連鎖を食い止める対策がいくつか実装された。

段階的パブリッシュ(Staged Publishing)

2026年5月からnpmで利用可能になったStaged Publishing(段階的公開)は、CI/CDパイプラインのクレデンシャルだけではパッケージを直接公開できなくする仕組みだ。パイプラインからステージングされたバージョンは、別途npm CLIやWebサイト上での手動承認と二要素認証を経て初めて本公開される。これにより、CI/CDが侵害されても自動的にマルウェアが配布されるリスクを断ち切る。

従来の公開(Before)
CI/CD 直接npmに公開
※CI/CD環境が侵害されれば即時にマルウェア拡散
Staged Publishing導入後(After)
CI/CD ステージング 手動承認+2FA npmに安全公開
※承認を経なければ公開されないため、不正公開を防止

npm v12でインストールスクリプトをデフォルト無効化

攻撃者はパッケージのインストール時に実行されるスクリプト(install scripts)を悪用し、即座に認証情報を抜き取る手法を多用してきた。2026年6月に発表されたnpm v12では、こうしたインストールスクリプトがデフォルトで無効化される。正当な用途でスクリプトが必要な場合は、利用者が明示的に許可を与えることで再び有効にできる。

Dependabotバージョン更新に3日間のクールダウン

攻撃者は新たに公開した悪意あるバージョンが、Dependabotの自動プルリクエストで一気に下流プロジェクトに取り込まれることを狙う。このスピードを抑制するため、2026年7月からDependabotのバージョン更新にはデフォルトで3日間のクールダウンが設けられた。リリース後少なくとも3日が経過するまでプルリクエストは開かれず、その間にコミュニティや自動検知が悪意あるバージョンを発見する猶予が生まれる。なお、セキュリティアップデートは即時に発行されるため、緊急の修正が遅れることはない。

インシデント対応を迅速化する機能

インシデント対応を迅速化する機能

防御策と並行して、万一の侵害発生時に素早く対処できる機能も強化されている。

セルフサービスでのクレデンシャル無効化

2026年6月、エンタープライズ管理者やメンバーが、自身の全クレデンシャルを即座に無効化できるセルフサービスツールが提供された。2月にリリースされたエンタープライズ全体のクレデンシャル管理機能を拡張したもので、サプライチェーン攻撃で認証情報の漏洩が疑われる場合に、数クリックで影響範囲を封じ込められる。

OAuthトークンとAppトークンの即時失効API

2026年3月には、GitHubのOAuthトークンおよびAppトークンをプログラムから即座に失効させるAPIが拡充された。2025年4月に導入されたPersonal Access Token向けの失効APIに続くもので、公開リポジトリにクレデンシャルが漏れてしまった場合でも、開発者が自身で迅速に無効化できる。漏洩したトークンの悪用可能な期間を大幅に短縮する手段となる。

今後の展望

今後の展望

GitHubは製品をデフォルトで安全にする方針を掲げ、npmとGitHub Actionsの両面からサプライチェーン攻撃の遮断に取り組んでいる。今回紹介した変更は数カ月の成果に過ぎず、引き続きchangelogや公式ブログで新たな対策が発表される見込みだ。

オープンソースの持続可能性と企業の安全な利用を支えるこれらの取り組みは、コミュニティ全体にとって大きな前進といえる。

この記事のポイント

  • サプライチェーン攻撃は、アカウント乗っ取りからCI/CD経由でマルウェア配布へと連鎖する。GitHubは各段階に多重の防御を適用している
  • npmの高影響度アカウントに72時間の読み取り専用期間を設定し、乗っ取り後の即時悪用を防止
  • GitHub Actionsの pull_request_target やキャッシュ操作を安全なデフォルトに変更し、初期侵入を抑止
  • 長期クレデンシャルを使わない「Trusted Publishing」と「Staged Publishing」で認証情報漏洩と自動公開を遮断
  • Dependabotのクールダウンとnpm v12のインストールスクリプト無効化で拡散速度を抑制
  • クレデンシャルの即時失効機能により、万が一のインシデント対応を迅速に実施可能
Supabaseプロジェクトをnpmサプライチェーン攻撃から守る7つの防御策

Supabaseプロジェクトをnpmサプライチェーン攻撃から守る7つの防御策

npmエコシステムを狙ったサプライチェーン攻撃が2026年に相次いでいる。5月には、TanStackがGitHub Actionsのワークフローキャッシュを汚染され、正規リリースに悪意あるコードが混入する事件が発生した。Supabaseも同様に、supabase-javascriptというタイポスクワット(入力ミスを狙った偽装パッケージ)がnpm上に現れるなどの標的に遭っている。

同社はこの事態を受け、プロジェクトの保護に向けた社内横断の対応を開始し、誰もが参照できる公式ガイドを公開した。本記事では、そのガイドの中核を抜粋し、攻撃の構造と開発者が今すぐ実施すべき防御策を具体的に解説する。

npmサプライチェーン攻撃の3つの典型的な手口

npmサプライチェーン攻撃の3つの典型的な手口

サプライチェーン攻撃は、直接システムに侵入するのではなく、開発者が信頼しているパッケージに悪意あるコードを忍び込ませる。以下が最も一般的な三つの手口だ。

メンテナの認証情報を奪う「アカウント乗っ取り型」

攻撃者がnpmの公開トークンを盗むか、メンテナをフィッシングして乗っ取り、人気パッケージの新版に悪意あるコードを仕込んで公開する。次にnpm installを実行すると、その悪質なバージョンが導入されてしまう。

入力ミスを誘う「タイポスクワッティング型」

本物のパッケージ名から数文字だけ変えた類似名でパッケージを登録し、開発者やAIコーディングエージェントが誤ってインストールするのを待つ。Supabaseの例では、@supabase/supabase-js ではなく supabase-javascript というスコープなしの名前で公開された。AIエージェントがパッケージ名を幻覚(ハルシネーション)して提案することも多く、この手法は脆弱だ。

ビルドパイプラインを悪用する「CI/CD侵害型」

この手口は、GitHub ActionsなどのCI/CDパイプラインの脆弱なワークフローを突く。攻撃者はフォークしたプルリクエストからワークフローのキャッシュを汚染し、次回の正規リリース実行時にそのキャッシュを拾わせて、正規メンテナの署名で悪意あるコードを公開させる。TanStackを襲った攻撃がまさにこれで、セッションメッセンジャーネットワーク経由で機密情報が流出した。

アカウント乗っ取り型
攻撃者がメンテナ権限を奪い、正規パッケージに悪意あるコードを仕込んで公開
タイポスクワッティング型
類似名の偽パッケージを登録し、開発者の打ち間違いやAIの誤提案を誘う
CI/CD侵害型
ビルドパイプラインのキャッシュを汚染し、正規リリースに紛れて悪質なコードが配布される

いずれの手口も、npm install の完了までに環境変数やAWSメタデータ、SSH秘密鍵といった機密情報を根こそぎ奪われる危険がある。

Supabaseが実施するプロジェクト防御策

Supabaseが実施するプロジェクト防御策

Supabaseはこの問題に対し、全社的な対応を開始した。以下が現在進行中の主な取り組みである。

公式セキュリティガイドの公開

同社は、npmセキュリティに関する推奨事項をまとめた単一の正規ガイドページを公開した。エージェントが読み取り可能な形式で、具体的なアクションを指示している。

GitHub Actionsの安全性強化

組織全体で pull_request_target の使用を精査し、アクションのバージョン参照をコミットSHAに固定する強制ルールの適用が最終段階に入っている。

クレデンシャル関連APIへの警告注釈

createClient などの関数にTSDoc(TypeScript向けドキュメントコメント)を追加し、エディタ上でホバー時に機密情報を扱う旨の警告が表示されるようにした。

全チャネルでの啓蒙活動

顧客かどうかを問わず、できるだけ多くの開発者に防御策を届けるため、ブログやコミュニティを通じた情報発信を強化している。

依存関係管理の厳格化

依存関係管理の厳格化

以下に挙げる設定変更は、いずれも数分で完了する。どれか一つでは完全な防御にはならないが、複数積み重ねることで攻撃者が諦めるほどの障壁を築ける。

パッケージマネージャを最新にして公開遅延を設定する

pnpm 11(またはnpm v11相当)にアップグレードし、minimumReleaseAge をデフォルトの24時間より長く設定する。多くの悪意あるパッケージはリリース後24〜48時間以内に検出され削除されるため、3〜7日の遅延を設けると、被害を受ける確率を大幅に下げられる。

# pnpm-workspace.yaml または .npmrc
minimumReleaseAge: 4320  # 分単位、3日

依存バージョンを固定する

^~ による範囲指定は、npmに対して「次のマイナーやパッチを自動的に取り入れて問題ない」と伝えているに等しい。認証情報やネットワーク通信を扱うパッケージでは、必ず正確なバージョン番号を指定しよう。

従来のバージョン指定(Before)
"dependencies": {
  "@supabase/supabase-js": "^2.39.0",
  "axios": "~1.6.0"
}
防御策適用後(After)
"dependencies": {
  "@supabase/supabase-js": "2.39.0",
  "axios": "1.6.2"
}

ロックファイルをコミットし差分を精査する

pnpm-lock.yamlpackage-lock.json は、インストールされた正確なバージョンとハッシュを記録する。攻撃者が同じバージョン番号で悪意あるtarballを差し替えても、ハッシュが一致せずインストールが失敗する。ロックファイルをリポジトリにコミットし、プルリクエストの差分では目的不明な依存関係の変更がないか必ず確認する。

不用なインストールスクリプトを無効化する

サプライチェーン攻撃のペイロードの多くは、preinstall install postinstall といったライフサイクルスクリプトを通じて実行される。ネイティブコードを含むパッケージを必要としないプロジェクトでは、これらをグローバルに無効化する。npmでは npm config set ignore-scripts true または .npmrcignore-scripts=true を記述する。pnpmではAllow Buildsモデルを使って、実際に必要なパッケージだけを許可リストに登録する。

安全なパッケージ導入のための実践

安全なパッケージ導入のための実践

パッケージ名を毎回検証する

タイポスクワッティング対策として、以下の点をインストール前に必ず確認する。

  • スコープが正しいか。Supabase公式パッケージはすべて @supabase/ 配下にある。
  • メンテナの一覧が期待通りか。長年維持されてきたパッケージに新しいメンテナが突然加わっていれば警戒信号だ。
  • ダウンロード数とリンク先のGitHubリポジトリが、本物のパッケージとして妥当であること。

CI/CDワークフローを狙った攻撃への対策

CI/CDワークフローを狙った攻撃への対策

ActionsをコミットSHAで固定する

ワークフローで参照するサードパーティアクションは、タグではなくコミットの完全なSHAハッシュ(40文字)で固定する。タグは攻撃者が新しいコードで置き換えられるため安全でない。

- uses: actions/checkout@1f9a0c22da41e6ebfa534300ef656b67ce0c5b94 # v6.0.2

pull_request_target の危険な使い方を回避する

pull_request_target イベントは、プルリクエストのコードをチェックアウトして実行するコンテキストで使うと、攻撃者がリポジトリのシークレットやキャッシュにアクセスできてしまう。TanStackを襲った攻撃はまさにこのパターンだった。PRのコードに触れる処理は必ず pull_request を使用し、pull_request_target はラベリングやコメント投稿など、コードを実行しない信頼済み操作に限定する。

危険なワークフロー(Bad)
on:
  pull_request_target:
    types: [opened, synchronize]
jobs:
  build:
    - uses: actions/checkout@v4
      with:
        ref: ${{ github.event.pull_request.head.sha }}
安全なワークフロー(Good)
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  build:
    - uses: actions/checkout@v4

インシデント発生時の即応策

インシデント発生時の即応策

クレデンシャルのローテーションと監査

もし疑わしいパッケージを含む環境で npm install を実行してしまったら、そのマシンを危殆化したと見なし、到達可能なすべての認証情報(AWS、GCP、Kubernetes、Vault、GitHub、npm、SSH、Supabaseのサービスロールキー)を直ちにローテーションする。Supabaseのダッシュボードでサービスロールキーの使用状況を監査し、不審なアクセスパターンがないかも確認する。半日はかかる作業だが、顧客への被害を防ぐ価値は十分にある。

スキャナの導入で第二の防御線を

Socket.devやnpq、Snykといったツールは、npmレジストリのパッケージをリアルタイムで監視し、怪しい挙動をフラグ付けしてくれる。これらは万能ではないが、基本的な対策をすでに実施しているチームにとって有効な第二の防御線となる。

AIコーディングエージェントに渡すセキュリティチェックリスト

AIコーディングエージェントに渡すセキュリティチェックリスト

以下は、Supabaseが推奨するリポジトリ監査プロンプトだ。Claude CodeやCursorなどに貼り付け、変更内容を必ず確認しながら適用する。プッシュやPR作成、依存関係の自動追加、クレデンシャルのローテーションは自動化せず、必ず人間が承認する。


このリポジトリのnpmサプライチェーン衛生状態を監査してください。以下の変更を適用し、何を行ったかを報告してください。明示的な承認なしにプッシュ、PR作成、新しい依存関係のインストール、クレデンシャルのローテーションは行わないでください。

パッケージマネージャ:
- 古いバージョンならpnpm 11+(または最新のyarn/npm/bun)にアップグレード
- 新バージョンに7日間の公開遅延を設定
  - pnpm: `minimumReleaseAge: 10080` を pnpm-workspace.yamlに
  - npm: `min-release-age=7` を .npmrcに
  - yarn (berry): `npmMinimalAgeGate: '7d'` を .yarnrc.ymlに
  - bun: `minimumReleaseAge = 604800` を bunfig.tomlの[install]セクションに
- ライフサイクルスクリプトをデフォルトで無効化。pnpmではallowBuildsで明示的に許可するパッケージをリスト。
- 非レジストリの透過的依存参照をブロック。pnpmでは`blockExoticSubdeps: true`等を設定。
- パッケージマネージャ自体を正確なバージョンとsha512ハッシュで固定

ロックファイルと依存関係:
- ロックファイルがコミットされていることを確認(gitignoreされていない)
- 認証、シークレット、通信、暗号、ユーザデータを扱う依存関係では^/~を正確なバージョンに置き換え
- Supabase関連のインポートがすべて`@supabase/`スコープか検証。スコープなしの類似名はタイポスクワットとしてフラグ

GitHub Actions(存在する場合):
- すべてのサードパーティアクションのusesを40文字のコミットSHAに固定し、元タグをコメントで残す
- pull_request_targetを使いPRコードをチェックアウトしているワークフローを抽出し、pull_requestへの書き換えを提案
- インストールワークフローに`npm audit signatures`の非ブロッキングステップを追加

人の確認が必要な項目:
- Dependabotアラートとシークレットスキャンが無効なら有効化を提案

レポート:
- ファイル変更ごとに1行の理由付きリスト
- 自動変更せずに人の判断が必要な項目の一覧

この記事のポイント

  • npmサプライチェーン攻撃は、アカウント乗っ取り、タイポスクワッティング、CI/CD侵害の3パターンに大別される
  • Supabaseは公式ガイド公開、GitHub Actions強化、API警告追加などで対策を推進中
  • 即効性のある防御策として、パッケージマネージャの更新と公開遅延設定、バージョン固定、ロックファイル精査、インストールスクリプト無効化、パッケージ名検証、ActionsのSHA固定、pull_request_targetの回避がある
  • 万が一侵害が疑われる場合はクレデンシャル全ローテーションとスキャナ導入で二次被害を防ぐ
  • AIエージェントには安全な監査プロンプトを組み込み、自動変更を人の目でレビューする体制を整える
OpenAIがTanStack npm攻撃に対応、Macユーザーは6月12日までにアプリ更新を

OpenAIがTanStack npm攻撃に対応、Macユーザーは6月12日までにアプリ更新を

広く利用されるオープンソースライブラリ「TanStack」のnpmパッケージが悪意ある第三者によって改ざんされた「Mini Shai-Hulud」と呼ばれるサプライチェーン攻撃。この影響はOpenAIにも及び、同社は2026年5月13日に公式な対応報告を公開した。

OpenAIの調査によると、ユーザーデータや本番システム、知的財産への不正アクセスは確認されていない。しかし、同社のコード署名証明書が一時的に影響下にあったことから、予防的な措置としてMacユーザーを対象に全アプリケーションの更新を2026年6月12日までに完了するよう呼びかけている。

今回の記事では、攻撃の具体的な影響範囲、OpenAIが講じたセキュリティ対策、なぜMacだけが更新対象なのか、そして実務者が理解すべきサプライチェーンリスクの本質を解説する。

TanStackを狙ったサプライチェーン攻撃とは

TanStackを狙ったサプライチェーン攻撃とは

2026年5月11日(UTC)、フロントエンド開発で広く使われるJavaScriptライブラリ群「TanStack」のnpmパッケージが、攻撃グループによって改ざんされた。この攻撃は「Mini Shai-Hulud」と名付けられ、ソフトウェアサプライチェーンの弱点を突く大規模なキャンペーンの一環だ。

サプライチェーン攻撃とは、正規のソフトウェアやライブラリを踏み台にし、その利用者にマルウェアを拡散する手法を指す。開発者が信頼して導入するパッケージマネージャー(npm、PyPI、RubyGemsなど)を通じて感染が広がるため、一企業だけでなく、エコシステム全体に被害が連鎖する点が最大の脅威だ。

攻撃の流れ(従来想定)
開発者正規npmレジストリパッケージインストールアプリケーションへ組み込み
攻撃の流れ(Mini Shai-Hulud)
攻撃者改ざんされたnpmパッケージ開発者端末に感染認証情報を窃取
攻撃者が関与する経路  通常の経路

今回の攻撃では、改ざんされたパッケージをインストールした開発者の端末から認証情報が引き出される挙動が確認されている。OpenAIの事例でも、このメカニズムにより2台の社内端末が侵害を受けた。

攻撃の構造とマルウェアの挙動

Socket.devの分析によれば、Mini Shai-Huludは主に認証情報(トークン、APIキー、セッション情報など)の窃取を目的としている。感染後の典型的な挙動は、開発者端末に保存されたGit認証情報や環境変数への不正アクセス、そして一部の内部コードリポジトリへの侵入だ。

OpenAIが委託した第三者デジタルフォレンジック企業の調査では、影響を受けた2名の社員がアクセス可能だった一部の内部ソースコードリポジトリで、認証情報の引き出しが成功した形跡が確認された。ただし、コードそのものや他の情報が流出した証拠はない。

OpenAIの初動対応と封じ込め

OpenAIは悪意ある活動を検知した直後、以下の封じ込め措置を即座に実行した。

  • 影響を受けた端末とIDの隔離
  • 全ユーザーセッションの強制無効化
  • 影響リポジトリに関連する全認証情報のローテーション(再発行)
  • コードデプロイワークフローの一時的制限
  • ユーザーおよび認証情報の挙動調査の徹底

これらの対応により、攻撃者による追跡アクセスや窃取された認証情報の悪用は確認されていない。また、顧客データやOpenAIの知的財産への影響は一切なかったと報告されている。

Macユーザーに更新が必要な理由

Macユーザーに更新が必要な理由

一見すると「社内端末2台の侵害だけなら、なぜエンドユーザーが対応するのか」と疑問に思うかもしれない。この背景には、コードサイニング証明書(コード署名証明書)の重要性がある。

コードサイニング証明書とは、ソフトウェアの開発元を電子的に証明する仕組みだ。macOSやWindows、iOSといったプラットフォームは、この証明書を確認することで「正規の開発者がリリースしたアプリかどうか」を判定している。

OpenAIの内部リポジトリには、iOS、macOS、Windows、Android向けのコードサイニング証明書が保管されていた。この証明書自体が直接流出したわけではないが、アクセス可能な状態にあったことから、OpenAIは予防的措置としてすべての証明書を新しいものに置き換える判断を下した。

証明書失効のタイムラインと影響

2026年6月12日をもって、旧証明書は完全に失効する。これ以降、旧証明書で署名されたmacOSアプリは、Appleのセキュリティ保護機能(Gatekeeper)によって新規ダウンロードや初回起動がブロックされる。

WindowsやiOS、Androidのアプリについても新しい証明書で再署名されるため、将来的なアップデートは必要になる。ただ、これらのプラットフォームでは即時のユーザー操作は不要とされている。

Macだけが個別アクションを求められる理由は、Appleのセキュリティモデルが証明書の有効性を厳格に検証する設計になっているためだ。更新を怠ると、以下のアプリが正常に動作しなくなる可能性がある。

  • ChatGPT Desktop(バージョン 1.2026.125 以前)
  • Codex App(バージョン 26.506.31421 以前)
  • Codex CLI(バージョン 0.130.0 以前)
  • Atlas(バージョン 1.2026.119.1 以前)

なぜ即時の証明書失効ではないのか

OpenAIはすでにプラットフォーム事業者と連携し、旧証明書を用いた新規の公証(ノータリゼーション)を全面的にブロックしている。公証とは、Appleがアプリをスキャンして悪意あるコードが含まれていないことを確認するプロセスだ。

仮に攻撃者が旧証明書を使って偽のOpenAIアプリを作成したとしても、公証を受けられないため、デフォルトのmacOSセキュリティ設定では実行が阻止される。この防御策が機能している間に、ユーザーがスムーズに公式アプリへ移行できるよう約1か月の猶予期間が設けられた。

旧証明書で署名されたアプリ(6月12日まで)
配布旧証明書macOSで起動可(猶予期間)
新証明書で署名されたアプリ(6月12日以降)
配布新証明書macOSで正常起動
旧証明書(失効予定)  新証明書(有効)

この猶予期間中に、アプリ内アップデートまたは公式サイトからの再インストールを通じて、最新バージョンへの切り替えを済ませておくことが推奨される。

攻撃が浮き彫りにした開発エコシステムの脆弱性

攻撃が浮き彫りにした開発エコシステムの脆弱性

今回の事案は、特定企業を標的とした攻撃というよりも、オープンソースエコシステム全体の構造的な弱点を突いたものと言える。攻撃者は個別の企業ではなく、広く使われる共有ライブラリを侵害することで、一度に多数の組織へ侵入できる。

現代のソフトウェア開発は、npm、PyPI、Maven Centralといったパッケージレジストリに大きく依存している。1つのパッケージが侵害されれば、依存関係の連鎖によって数百、数千のプロジェクトが影響を受ける。実際、TanStackのパッケージを依存関係に持つプロジェクトは膨大だ。

OpenAIが進めるサプライチェーン防御

OpenAIは2025年末に発生したAxios開発者ツールの侵害を受け、すでにサプライチェーン攻撃への防御を段階的に強化していた。具体的には以下の対策が進められていた。

  • CI/CDパイプラインで扱う機密度の高い認証情報の追加保護
  • minimumReleaseAge などの設定を用いたパッケージマネージャーの制御導入
  • 新規パッケージの信頼性を検証する追加セキュリティソフトウェアの展開

minimumReleaseAge とは、パッケージがレジストリに公開されてから一定時間(例:3日間)経過しないとインストールを許可しない設定だ。これにより、公開直後の悪意あるパッケージを誤って取り込むリスクを低減できる。

しかし、これらの対策が全社的に展開される途中の段階で、今回のインシデントは発生した。侵害を受けた2台の端末には、新たな制御設定がまだ適用されていなかったのである。

実務者が今すぐ取るべき対策

OpenAIの事例から学べる教訓は、単一の企業だけに留まらない。自社の開発環境においても、以下の対策を早急に検討すべきだ。

  • パッケージマネージャーのロックファイル(package-lock.jsonなど)を定期的に監査する。 意図しないバージョン変更や新規依存関係が混入していないか、CI環境で自動チェックする仕組みを作る。
  • サプライチェーンセキュリティツールの導入。 Socket.dev、Snyk、GitHub Dependabotなどを使い、脆弱性や悪意あるパッケージを早期に検出する。
  • コードサイニング証明書の厳格な管理。 CI/CD環境とは完全に切り離し、必要最小限の担当者のみがアクセスできる保管場所を確保する。
  • 依存パッケージの更新を自動化しすぎない。 パッチバージョンであっても、公開直後の即時適用は避け、一定の猶予を設ける。
リスクの高い運用(Before)
新パッケージ公開 → 即時自動更新 → 開発者端末に適用
悪意あるパッケージが即座に拡散
推奨される運用(After)
新パッケージ公開 → 3日間の待機(minimumReleaseAge) → 監査後、手動承認で適用
公開直後の悪意あるパッケージをブロック

このような防御策は、自社の開発文化や速度とバランスを取りながら段階的に導入していくのが現実的だ。しかし、攻撃の連鎖速度は日に日に速まっている。放置するリスクの方がはるかに大きいことは、今回の事例が明確に示している。

ユーザーが取るべき具体的なアクション

ユーザーが取るべき具体的なアクション

OpenAIのアプリをMacで利用している個人および企業は、以下の手順を確実に実施してほしい。

  1. 公式の更新経路のみを使用する。 アプリ内のアップデート通知、またはOpenAI公式ウェブサイト(openai.com)からダウンロードする。メール、メッセージ、広告、ファイル共有リンク経由の「ChatGPT」「Codex」インストーラーには絶対に手を出さない。
  2. 6月12日までに更新を完了する。 期限を過ぎると、旧証明書で署名されたアプリはmacOSによってブロックされる。業務で利用している企業は、社内のIT管理者が一括アップデートを計画すべきだ。
  3. パスワード変更は不要。 OpenAIは公式に、顧客のパスワードやAPIキーが影響を受けていないと明言している。無用なパスワード変更はフィッシングのリスクを高めるだけだ。

企業のIT管理者向け追加ガイダンス

組織内でOpenAIアプリを管理している場合、6月12日の証明書失効までにMDM(モバイルデバイス管理)やソフトウェア配布ツールを通じて、全Mac端末のアプリを最新バージョンに更新する計画を立てる必要がある。

更新対象となるアプリと、失効する旧バージョンの一覧は以下の通りだ。

  • ChatGPT Desktop(旧バージョン 1.2026.125)
  • Codex App(旧バージョン 26.506.31421)
  • Codex CLI(旧バージョン 0.130.0)
  • Atlas(旧バージョン 1.2026.119.1)

これらのバージョンが社内で稼働している場合、速やかに更新手続きを進めることが求められる。

この記事のポイント

  • OpenAIはTanStack npmパッケージへのサプライチェーン攻撃により社内端末2台が侵害されたが、ユーザーデータや本番システムへの影響はなかった。
  • 予防措置としてコードサイニング証明書を全面的にローテーション。Macユーザーは6月12日までにアプリを更新する必要がある。
  • 旧証明書を用いた新規の公証はすでにブロック済みのため、偽アプリがmacOSで実行されるリスクは低い。
  • 攻撃の本質はオープンソースエコシステムの脆弱性を突いたものであり、全開発組織がパッケージ管理の防御策強化を求められている。
  • パッケージの即時自動更新を避け、minimumReleaseAgeの設定や監査プロセスの導入が有効な対策となる。