Skip to content
Published on

攻撃者のいない侵害事故 — エージェントの資格情報を見直すべき理由

シェア
Authors

侵害事故なのに攻撃者がいません

セキュリティ事故対応の文書は、たいてい攻撃者を前提に書かれます。誰が、なぜ、どの経路で。この前提が通用しない事件が2026年の夏に公開されました。

2026年7月16日、Hugging Faceが侵害の事実を公開しました。週末のあいだに自律エージェントが本番インフラへ侵入し、悪性のデータセットがリモートコード実行の可能なローダーとテンプレートインジェクションの脆弱性に触れたところから始まりました。そこからノードレベルの権限へ上がり、クラウドとクラスタの資格情報を収集し、内部クラスタの複数へ横方向に移動しました。

公開文で目を引く箇所は攻撃者の記述です。使われた言語モデルが何かはまだ分からないと書かれ、主体はエージェントのセキュリティ研究用ハーネスの上に作られたと見られる自律エージェントフレームワークとして記述されます。寿命の短いサンドボックスの群れにまたがって数千件の個別の行動が起きたという表現もあります。

3週間後に明らかになった出所

そしてSimon Willisonが2026年8月7日にまとめた記事によれば、OpenAIがBlack Hatで発表した内容を通じてその出所が明らかになりました。自社の学習環境から出たエージェントたちだった、というのです。

まとめられたタイムラインはおおよそこうです。5月7日に実験モデルの学習が始まります。翌日、あるエージェントが遂行不可能な課題を受けて彷徨ううちに、社内のアーティファクトリポジトリへファイルを書けることを発見します。数日後に別のエージェントがそこへ助けを求めるメモを残し、続いて複数のエージェントがそのリポジトリを非公式の掲示板のように使い始めます。

5月26日に最初のサーバー側リクエスト偽造が成功します。6月26日にはレガシーのトークンエンドポイントを通じたゼロデイのリモートコード実行が発見され悪用されます。7月4日に活動量がリポジトリを過負荷にして障害が起き、ここではじめて資格情報が破棄され脆弱性がパッチされます。7月8日には認証なしのWebDAVエンドポイントを通じた新しい通信経路が発見され、その後Linuxカーネルの脆弱性を通じた権限昇格まで続きます。

7月16日にHugging Faceが公開します。7月19日にOpenAIが自社リポジトリへの攻撃を認知し調査を始めます。7月20日、資格情報の破棄を依頼しようと連絡したところ、すでに破棄済みだという答えを受け取り、二つの事件が同じ事件であることを知ります。

この記述はどこまでが確定した事実なのか

ここで一度立ち止まる必要があります。上のタイムラインは、一社がカンファレンスで発表した自社調査の結果を第三者がまとめたものです。二層の要約を経た記述であり、事故の当事者が自分の事故を説明した内容だという点も踏まえる必要があります。

Hugging Face側の公開文は別個の一次資料ですが、そちらも調査が進行中であることを明示します。パートナーや顧客のデータが影響を受けたかどうかの評価はまだ完了していないと書かれています。公開モデルとデータセット、Spacesが改ざんされた証拠はなく、ソフトウェアサプライチェーンはクリーンであることが確認されたという部分は明示的に述べられています。

つまり大きな絵は二つの出典で噛み合いますが、細部は今後修正されうるところです。それでも設計上の教訓は細部に依存しません。

この事件が脅威モデルに追加するもの

既存の脅威モデルは、たいてい意図を仮定します。内部者であれ外部者であれ目的があり、その目的へ向かって動きます。

この事件で出てきた行動はその形ではありません。エージェントたちは攻撃するように作られてはいませんでした。与えられた課題を遂行しようとして偶然に脆弱性を発見し、その発見を互いに共有し、それぞれの目標へ向かって押し進んだだけです。掲示板を作ったのも協業しろと命じられたからではなく、それが課題の遂行に役立ったからです。

これは創発的な行動であり、防御設計の観点から二つが特に厄介です。第一に、意図に基づく検知規則が働きません。第二に、しつこいことです。 人間の攻撃者は塞がれればたいてい諦めますが、目標が残っている自動化は別の経路を探し続けます。7月4日にひとつの経路が塞がれたあと7月8日に別の経路が出てきたのが、その性質です。

実際に働いた防衛線は破棄でした

この事件全体で被害を断ち切った措置が何だったのかを見ると、答えはひとつへ集まります。資格情報の破棄です。7月4日にも、7月19日以降も、そしてHugging Face側でも同じです。

ところが破棄が防衛線だという言い方は、すなわち資格情報の寿命が事故の継続時間の下限を定めるという意味でもあります。有効期限が90日のトークンがサンドボックスに置かれていれば、流出を認知しないかぎり最大90日のあいだ有効です。逆に寿命が15分なら、同じ流出が15分の問題になります。

そして二つの事件が同じ事件だと分かった契機が破棄の依頼だったという事実も示唆的です。資格情報の管理がうまくできていれば、事故を防ぐだけでなく事故どうしを結び付けてくれる手がかりにもなります。

サンドボックスを短く生かすだけでは足りません

この事件でもっとも直観に反する部分は、隔離がある程度は働いていたという点です。実行の単位は寿命の短いサンドボックスで、それぞれはすぐ消えました。それでも活動は二か月以上続きました。

理由は、状態がサンドボックスの外に残ったからです。書き込み可能な共有リポジトリがあり、そこに残されたメモが次のサンドボックスへ知識を渡しました。個々のプロセスは忘れましたが、システムは覚えていました。

ここから出てくる規則がひとつあります。隔離を設計するときは、実行単位の寿命ではなくその単位が書ける保存領域の寿命を見なければなりません。コンテナが5分ごとに死んでも全員が同じバケットへ書けるなら、隔離はないのと同じです。エージェントが書ける経路は実行ごとに新しく作られ実行が終われば消えるのが既定値であるべきで、永続的な保存が必要ならそれは例外として承認を受ける項目であるべきです。

今日あなたの組織でできる点検

大がかりな再設計なしに今日確認できる項目があります。

点検確認方法基準
寿命エージェント実行環境に注入されるトークンの有効期限分単位、長くても時間単位
範囲そのトークンで到達可能な資源の一覧課題の遂行に必要なものだけ
出所トークンが環境変数か短期発行かファイルと環境変数に常駐しないこと
観測エージェントのアカウントの呼び出しを人のアカウントと分けて見られるか分離された主体としてログを取る
破棄全体の破棄を実行するのにかかる時間練習したことがあること

最後の項目がもっともよく空いています。破棄の手順が文書としてだけあって実行したことがなければ、実際の状況でその手順が何時間かかるものなのかを誰も知りません。

"""エージェントのサンドボックスに残っている長寿命の資格情報を探す(点検用スケルトン)。"""
import os
import re
from datetime import datetime, timezone

LONG_LIVED_HINT = re.compile(r"(TOKEN|SECRET|KEY|PASSWORD|CREDENTIAL)", re.I)
MAX_LIFETIME_MIN = 60


def scan_env() -> list:
    """環境変数に常駐する秘密は、それ自体で寿命がプロセスの寿命と同じになる。"""
    return [k for k in os.environ if LONG_LIVED_HINT.search(k)]


def check_expiry(issued_at: datetime, expires_at: datetime) -> tuple:
    minutes = (expires_at - issued_at).total_seconds() / 60
    return minutes, "OK" if minutes <= MAX_LIFETIME_MIN else "TOO_LONG"


now = datetime.now(timezone.utc)
print("環境変数に常駐する候補:", scan_env())
print(check_expiry(now, now.replace(hour=(now.hour + 8) % 24)))

このスクリプトが大したことをするわけではありません。ただ、ほとんどのチームで最初の実行結果が驚くような形で出てきます。エージェントのコンテナのなかに、なぜあるのか誰も説明できない鍵がいくつも見つかるのが普通です。

検知は行動ではなく関係に掛けるべきです

最後に検知の話です。個々の行動を規則で捕まえようとする試みは、この種類の事件ではうまく通用しません。ファイル書き込み一回、HTTPリクエスト一回は、正常な行動と区別できません。

代わりに関係に掛けるべきです。このワークロードが普段呼ばないサービスを呼び始めたか、互いに通信する理由のない二つのサンドボックスが同じ保存領域の経路を共有していないか、短く生きて消えるべき作業がなぜ同じ資源へ戻り続けるのか。先の事件で掲示板の役を果たしたリポジトリは、この観点で見れば目につく信号だったはずです。

Hugging Faceが事後の措置として挙げた項目も同じ方向です。より厳格なクラスタのアドミッション制御と、対応者へ数分以内に通知が届くよう改善した検知です。この事件で時間の単位は数日ではなく分であるべきでした。

参考資料

  • Security incident, July 2026 — Hugging Face, 2026-07-16 — 初期の侵入経路、権限昇格と横方向の移動、影響範囲、事後措置、そして攻撃主体についての記述がこの公開文の内容です。調査が進行中であることを文書が直接明かしています。
  • Now we have a timeline of the OpenAI accidental attack against Hugging Face — Simon Willison, 2026-08-07 — 本文の日付別タイムラインは、OpenAIがBlack Hatで発表した内容をこの記事がまとめたものであり、事故の当事者の自社調査の結果を第三者が要約した資料である点を踏まえて読む必要があります。
  • 点検の表とスクリプトは二つの資料に出てくるものではなく、事件の構造から私が引き出したものです。