Baseten GitHub PAT Exposure via Public Harbor Image – How Strix Found Admin Access in 25 Minutes

TL;DR

2026年7月、自律型ハッキングエージェント Strix は、BasetenのHarborレジストリから公開されているDockerイメージに埋め込まれたGitHub個人用アクセストークン(PAT)を発見した。このトークンは2023年3月に作成され、Basetenの主要製品リポジトリ、GitOpsリポジトリ、Homebrewタップ、および複数のプライベートカスタマーリポジトリへの 管理者権限とプッシュアクセス を付与していた。発見後、報告され、トークンは即座にローテーションされ、公開レジストリプロジェクトは24時間以内にプライベート化された。


漏洩の発見経緯

Strixは *.baseten.co ドメインに対してブラックボックス調査を実施し、公開されたHarborレジストリ(gcp-us-east4-zlw.registry.baseten.co)を特定。匿名で baseten/baseten-app イメージをプルした。イメージマニフェストとレイヤーを抽出した後、Strixは以下の手順を実施した:

  1. イメージのファイルシステムおよび構成に対して TruffleHog を実行。
  2. Dockerビルド履歴(history[].created_by)に保存されたGitHub PATを検出。
  3. GET /user リクエストを発行してトークンの有効性を検証。返されたアカウントは basetenbot であった。

"Dockerビルド履歴に記録されたトークン、その後GitHubがそれを basetenbot と識別。資格情報は非表示にされています。" – Strixブログ投稿

漏洩したトークンの影響範囲

GitHubはトークンのOAuthスコープを repo と報告しており、リポジトリ全体へのアクセス権限を意味する。Strixはこのトークンでアクセス可能なリポジトリを列挙し、以下の結果を得た:

リポジトリ(オブスカレート) 権限
basetenlabs/b***(製品) admin: true, push: true
basetenlabs/f***(GitOps) admin: true, push: true
basetenlabs/h***(CLI) admin: true, push: true
その他のプライベートリポジトリ 読み取り/書き込み

これらの権限により攻撃者は以下の行動が可能になる:

  • 推論プラットフォームのソースコードを変更。
  • 本番クラスタを制御するGitOpsマニフェストを改ざん。
  • CLI配布チャネルに悪意あるバイナリを注入。
  • 業務上機密性の高いデータを含むカスタマーリポジトリにアクセス。

根本原因:ビルド資格情報の漏洩

このトークンは2023年3月3日に Dockerビルドステップ で生成され、ビルド引数を通じてGitHubトークンを注入していた:

ARG GITHUB_TOKEN
RUN GITHUB_TOKEN=${GITHUB_TOKEN} bash -c '\
  if [[ "${GITHUB_TOKEN}" != "" ]]; then \
    git config --global --add \
      url."https://${GITHUB_TOKEN}@github.com/".insteadOf "git@github.com:"; \
  fi'

Dockerはイメージのビルド履歴に正確なコマンドラインを記録しており、意図せずトークンの原文が永続化された。根本的な問題は以下の通り:

  • シークレットをビルド引数として使用 – Dockerは値をメタデータに保存する。
  • Git設定にトークンを永続化 – たとえ引数が後から削除されても、資格情報はイメージに残り続ける。

推奨される修復手順

  1. シークレットをビルド引数として渡さない。Docker BuildKitのシークレットマウント(--secret id=github,src=...)を使用して、イメージメタデータに表示されない一時的な資格情報を提供する。
  2. docker history --no-trunc を使用するか、コンフィグブロブをダウンロードして history[].created_by を確認し、漏洩した値を検査する。
  3. 漏洩したトークンを即座にローテーションし、すべてのリポジトリで不正な変更がないか監査する。
  4. 最小権限の原則 を適用:ビルドトークンには、必要な特定のプライベート依存関係への読み取り専用アクセスのみを付与し、有効期限を短くする。
  5. 内部イメージをホストするコンテナレジストリを プライベート化 する。意図的に公開する場合を除き、公開しないようにする。

报告のタイムラインと対応

日時 行動
2026年7月13日 23:10 Strixによる報告 – 有効な basetenbot トークン、公開Harborプロジェクト、リポジトリ権限
2026年7月14日 午前 BasetenがHarborプロジェクトをプライベート化
2026年7月14日 16:34 Basetenセキュリティチームが深刻度を確認、トークンをローテーション、イメージ削除を要請
2026年7月14日 17:05 レポーターが削除を確認し、低深刻度の追加発見を報告
2026年7月17日 残りの発見をクローズ
2026年9月 公開報告を準備・承認

Basetenのセキュリティチームは迅速に対応し、数時間以内にトークンをローテーションし、レジストリをプライベート化。さらに、感謝のギフトも送付した。

"Strixの責任ある報告に感謝します。漏洩した鍵を即座に無効化し、公開コンテナイメージを削除しました。ログの確認により、脆弱性は利用されておらず、顧客データも漏洩していません。" – Basetenセキュリティ担当者(HNコメント)

コミュニティの反応

  • 肯定的評価 – 複数のコメント者が迅速な修復と自律型テストの価値を称賛。
  • 倫理的懸念 – セキュリティベンダーが明示的な事前合意なしに、将来のベンダーに対して自律型エージェントを実行することの適切性に疑問を呈する声も。法的曖昧さを指摘する者もいた。
  • 技術的考察 – 伝統的なペネトレーションテストツールでも同様の問題は発見可能だが、AI駆動エージェントのスピードと自動化の利点を強調する声もあった。

オペレーターへの教訓

  • コンテナイメージを長期間の攻撃表面とみなす – 古いイメージにも有効なシークレットが含まれる可能性がある。
  • ファイルシステムレイヤーとビルドメタデータの両方でシークレットスキャンを自動化する
  • CI/CDパイプラインおよびコンテナビルド用に、短期間有効で範囲限定のトークンを導入する
  • 自律型セキュリティエージェント(Strixなど)を定期的に自社ドメインに対して実行し、攻撃者が発見する前に隠れた漏洩を発見する。

GitHubベースのビルドや公開コンテナレジストリに依存している場合、今日中に既存のイメージを監査してください。漏洩したトークンのコストは、予防に必要な努力と比べて桁違いに高くなる可能性があります。

Sources

関連

  • Dispatch
  • Dispatch
  • プロジェクト
  • Dispatch
  • Dispatch