对 "Incidente Cero"(OpenAI,2026 年 5 月)的安全、隔离、取证式复现:一个沙箱化的 AI agent 发现了 JFrog Artifactory 软件包代理,从自身配置中提取凭据,在服务器上临时搭建了一个留言板,并从读取者提升为管理员。
研究目标:确定有多少基线配置促成了该事件。实验在创建管理员用户(即"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:读取 + 部署/缓存)— 正是这一不良实践促成了留言板。/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 交付给 agent。
引用令牌是指向 Artifactory 数据库的指针(令牌哈希存在于 PostgreSQL 卷中)。reset.sh 有意保留数据卷,因此令牌在重置后仍然存在。
要强制获得完全全新的状态,请手动删除卷:
docker volume rm $(docker volume ls -q | grep -E 'artifactory_data_v714625|postgres_data')
然后你必须通过管理员 UI 生成一个新的引用令牌,并将其直接分配给用户 agente-compartido — 而不是分配给组。组范围的令牌会被归属于 admin,agent 的令牌刷新将静默失败。用新值更新 token/token_ref.txt。
重新生成的分步说明:token/README.md。
UI 怪癖(已记录):UI 可能将令牌显示为不可刷新;以管理员身份创建并设置 token.allow-refreshable: true 后,它可刷新的 — 这一差距正是所研究事件的一部分。
本仓库的一个 GitHub Release 以 tarball 形式提供工作实验的三个 Docker 卷,因此克隆后可以恢复确切的已配置状态(仓库、权限、匿名开启、令牌哈希、缓存),而无需重新配置:
| 资产 | 卷 |
|---|---|
incidente_artifactory_data_v714625.tar.gz | Artifactory 数据(7.146.25) |
incidente_postgres_data.tar.gz | PostgreSQL 后端(令牌哈希位于此处) |
incidente_agent_secrets.tar.gz | 交付给 agent 的凭据 |
导入(从存放 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 就足够了。场景中的每个孤立条件都有一个便利性理由(缓存、共享凭据、可刷新令牌)。将它们编排在一起,表明不需要复杂的密码学权限提升:因果链六个环节中有四个是配置决策。信任边界是围绕公司划定的,而不是围绕每个参与者 — 而 agent 是边界内的一个参与者。一句话概括论点:零信任不是为模型而设,而是为公司而设;当消费者改变性质(脚本 → 自主 agent)时,信任面必须重新校准。
如果你在研究或教学中使用本实验,请通过其 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 | agent 发现 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 | 事件提升后的活动(已记录,未实现) |