
OpenAI-Artifactory 権限昇格インシデント(CVE-2026-65616)のフォレンジック分析とローカル再現
「Incidente Cero」(OpenAI、2026年5月)の安全で隔離されたフォレンジック再現: サンドボックス化されたAIエージェントがJFrog Artifactoryパッケージプロキシを発見し、自身の設定から認証情報を抽出し、サーバー上に即席のメッセージボードを作成し、readerからadministratorへと権限昇格する。
研究目的: ベースライン設定のうちどれだけがこの事象を可能にしたかを明らかにすること。実験は管理者ユーザー(「flag」)の作成をもって終了する。インシデント全体を網羅するものではない。
artifactory_license/フォルダに配置してください(プレースホルダのartifactory.licを置き換えます)。ライセンスがない場合、ArtifactoryはOSSモードで動作し、ほとんどのラボAPI(パーミッション、トークン、リモートリポジトリ)は機能しません。git clone <this-repo> && cd <dir>
# 1. put your license in artifactory_license/artifactory.lic
# 2. clean start (preserves data volumes; see "Reset semantics" below):
./reset.sh && ./start.sh
start.shはシナリオ全体をプロビジョニングします(初回起動時はArtifactoryのウォームアップのため数分かかります):
pypi/npm、それぞれlocal + remote + virtual。PyPIリモートはURL https://files.pythonhosted.orgで設定されています(このバージョンで実際に機能するレシピ)。agente-compartido(グループreaders)書き込み権限付き(Anything: read + deploy/cache) — メッセージボードを可能にする悪い慣行。/etc/pip.confと/etc/npmrcに平文でレンダリングします — これがフェーズ1の漏洩です。同梱のトークンはtoken/token_ref.txtにあります。ショートカット: Releaseから事前プロビジョニング済みボリュームをインポートした場合(以下参照)、プロビジョニングは既に完了しています —
./start.shはスタックを起動するだけです。
確認:
curl -s http://localhost:8081/artifactory/api/system/ping # -> "true"
docker exec -it incidente-modelo-simulado sh
# inside the agent:
cat /etc/pip.conf # leaked credentials (the Fase 1 leak)
. /opt/venv/bin/activate
pip install six # packages without internet, via the remote
その後、フェーズを順番に進めてください: phases/README.md → 00 アーキテクチャ → 01 発見 → 02 メッセージボード → 03 リフレッシュ可能トークン → 04 権限昇格 (CVE-2026-65616) → 05 管理者検証。
デフォルトの参照トークン(cmVmdGtu...)がtoken/token_ref.txtに同梱されており、起動のたびにstart.shによってエージェントに配信されます。
参照トークンはArtifactoryのデータベースへのポインタです(トークンハッシュはPostgreSQLボリュームに存在します)。reset.shは意図的にデータボリュームを保持するため、トークンはリセット後も存続します。
完全に新しい状態を強制するには、ボリュームを手動で削除してください:
docker volume rm $(docker volume ls -q | grep -E 'artifactory_data_v714625|postgres_data')
その後、管理者UI経由で新しい参照トークンを生成し、それをユーザーagente-compartidoに直接割り当てる必要があります — グループに対してではありません。グループスコープのトークンはadminに帰属され、エージェントのトークンリフレッシュはサイレントに失敗します。token/token_ref.txtを新しい値で更新してください。
再生成の手順: token/README.md。
UIの癖(文書化済み): UIはトークンをリフレッシュ不可として表示する場合がありますが、管理者としてtoken.allow-refreshable: trueで作成された場合、実際にはリフレッシュです — このギャップは研究対象のインシデントの一部です。
このリポジトリのGitHub Releaseには、動作するラボの3つのDockerボリュームがtarballとして同梱されているため、クローンからプロビジョニングなしで正確なプロビジョニング済み状態(リポジトリ、パーミッション、匿名ON、トークンハッシュ、キャッシュ)を復元できます:
| アセット | ボリューム |
|---|---|
incidente_artifactory_data_v714625.tar.gz | Artifactoryデータ (7.146.25) |
incidente_postgres_data.tar.gz | PostgreSQLバックエンド (トークンハッシュはここに存在) |
incidente_agent_secrets.tar.gz | エージェントに配信された認証情報 |
インポート(tarballのあるフォルダから):
for V in incidente_artifactory_data_v714625 incidente_postgres_data incidente_agent_secrets; do
docker volume create $V
docker run --rm -v $V:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/$V.tar.gz"
done
./start.sh
注意:
docker-compose.ymlで固定されたmasterKeyでのみ復号化されます — インポート後に変更しないでください。./start.shの直後にご自身のトライアルライセンスをインストールしてください(要件参照) — これがないと書き込みがブロックされます(読み取りは機能します)。./reset.shはコンテナを停止しますがボリュームは削除しません(down -vなし)。./start.shは冪等です: 不足しているものをプロビジョニングし、それ以外はすべて保持します。./start.shのみで十分です。シナリオの各隔離された条件には、便利さのための正当化(キャッシュ、共有認証情報、リフレッシュ可能トークン)があります。それらが組み合わさると、洗練された暗号学的権限昇格は必要なかったことが示されます: 因果連鎖の6つのリンクのうち4つは設定上の決定です。信頼境界は企業の周りに引かれており、各アクターの周りではありませんでした — そしてエージェントは境界の内側のアクターでした。一文でのテーゼ: Zero Trustはモデルのためのものではなく、企業のためのものです。消費者が性質を変えるとき(スクリプト → 自律エージェント)、信頼の表面は再調整されなければなりません。
研究や教育でこのラボを使用する場合は、Zenodo DOI 10.5281/zenodo.22817059を通じて引用してください:
Colmenero-Fernandez, A. (2026). Forensis Lab: Forensic Recreation of the AI Agent Privilege Escalation (JFrog Artifactory, CVE-2026-65616) (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.22817059
BibTeX:
@software{colmenerofernandez2026forensislab,
author = {Colmenero-Fernandez, Alicia},
title = {{Forensis Lab: Forensic Recreation of the AI Agent Privilege Escalation (JFrog Artifactory, CVE-2026-65616)}},
year = {2026},
version = {1.0.0},
doi = {10.5281/zenodo.22817059},
url = {https://doi.org/10.5281/zenodo.22817059}
}
機械可読な引用メタデータ: CITATION.cff。
| ファイル | フェーズ | 内容 |
|---|
phases/FASE_00_Arquitectura.md | 0 | Dockerアーキテクチャ、脆弱なバージョン (7.146.25)、オペレータによるプロビジョニング |
phases/FASE_01_Descubrimiento.md | 1 | エージェントがArtifactoryを発見: 閲覧はできないがインストールは可能、pip.confの監査 |
phases/FASE_02_Tablon_Mensajes.md | 2 | ローカルリポジトリへのPUT (HTTP 201)、即席のメッセージボード |
phases/FASE_03_Token_Refreshable.md | 3 | リフレッシュ可能トークンのリクエスト、YAMLエビデンス (allow-refreshable) |
phases/FASE_04_Escalada.md | 4 | JWT偽造とリフレッシュエクスプロイト、失敗した試行とスコープ設定 |
phases/FASE_05_Verificacion_Admin.md | 5 | 管理者トークンの検証とユーザーagente-adminの作成 (flag) |
phases/FASE_06_Post_Escalada.md | 6 | インシデントの権限昇格後の活動 (文書化のみ、未実装) |