
Análise Forense e Replicação Local do Incidente de Escalação de Privilégios OpenAI-Artifactory (CVE-2026-65616)
Uma recriação forense segura, isolada e documental do "Incidente Cero" (OpenAI, maio de 2026): um agente de IA em sandbox descobre o proxy de pacotes do JFrog Artifactory, extrai credenciais da sua própria configuração, improvisa um mural de mensagens no servidor e escala de leitor para administrador.
Objetivo do estudo: determinar quanto da configuração base possibilitou o evento. O experimento termina na criação do usuário administrador (a "flag"). Não cobre o incidente completo.
artifactory_license/ (substitua o placeholder artifactory.lic lá). Sem uma licença, o Artifactory roda em modo OSS e a maioria das APIs do laboratório (permissões, tokens, repositórios remotos) não funcionará.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
O start.sh provisiona todo o cenário (a primeira inicialização leva vários minutos enquanto o Artifactory aquece):
pypi/npm, cada um local + remote + virtual. O remoto do PyPI é configurado com a URL https://files.pythonhosted.org (a receita que realmente funciona nesta versão).agente-compartido (grupo readers) com permissões de escrita (Anything: read + deploy/cache) — a má prática que possibilita o mural de mensagens./etc/pip.conf e /etc/npmrc em texto claro — o vazamento da Fase 1. O token fornecido está em .Atalho: se você importou os volumes pré-provisionados do Release (veja abaixo), o provisionamento já está feito —
./start.shapenas sobe a stack.
Verifique:
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
Em seguida, siga as fases em ordem: phases/README.md → 00 Arquitetura → 01 Descoberta → 02 Mural de mensagens → 03 Token refreshable → 04 Escalação (CVE-2026-65616) → 05 Verificação de admin.
Um token de referência padrão (cmVmdGtu...) é fornecido em token/token_ref.txt e é entregue ao agente pelo start.sh a cada inicialização.
Tokens de referência são ponteiros para o banco de dados do Artifactory (o hash do token vive no volume do PostgreSQL). O reset.sh deliberadamente preserva os volumes de dados, então o token sobrevive aos resets.
Para forçar um estado completamente novo, delete os volumes manualmente:
docker volume rm $(docker volume ls -q | grep -E 'artifactory_data_v714625|postgres_data')
Depois você deve gerar um novo token de referência pela UI de admin e atribuí-lo diretamente ao usuário agente-compartido — não ao grupo. Um token com escopo de grupo é atribuído a admin, e o refresh do token do agente falhará silenciosamente. Atualize token/token_ref.txt com o novo valor.
Passo a passo para regenerar: token/README.md.
Um Release do GitHub deste repositório fornece os três volumes Docker do laboratório funcional como tarballs, para que um clone possa reviver o estado provisionado exato (repos, permissões, anônimo ON, hash do token, cache) sem provisionamento:
| Asset | Volume |
|---|---|
incidente_artifactory_data_v714625.tar.gz | Dados do Artifactory (7.146.25) |
incidente_postgres_data.tar.gz | Backend PostgreSQL (os hashes dos tokens vivem aqui) |
incidente_agent_secrets.tar.gz | A credencial entregue ao agente |
Importe (da pasta que contém os tarballs):
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
Notas:
masterKey fixada em docker-compose.yml — nunca a altere após a importação../start.sh — sem ela, as escritas são bloqueadas (as leituras funcionam)../reset.sh para os containers sem deletar volumes (sem down -v)../start.sh é idempotente: provisiona o que estiver faltando e mantém todo o resto../start.sh é suficiente.Cada condição isolada do cenário tem uma justificativa de conveniência (cache, credencial compartilhada, tokens refreshable). Orquestradas, elas mostram que nenhuma escalação criptográfica sofisticada foi necessária: quatro dos seis elos da cadeia causal são decisões de configuração. A fronteira de confiança havia sido traçada em torno da empresa, não em torno de cada ator — e o agente era um ator dentro do perímetro. A tese em uma frase: Zero Trust não é para modelos, é para empresas; quando o consumidor muda de natureza (script → agente autônomo), a superfície de confiança deve ser recalibrada.
Se você usar este laboratório em pesquisa ou ensino, por favor cite-o via seu DOI Zenodo 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}
}
Metadados de citação legíveis por máquina: CITATION.cff.
Peculiaridade da UI (documentada): a UI pode mostrar o token como não-refreshable; criado como admin com token.allow-refreshable: true, ele é refreshable — essa lacuna faz parte do incidente em estudo.
| Arquivo | Fase | Conteúdo |
|---|
phases/FASE_00_Arquitectura.md | 0 | Arquitetura Docker, versão vulnerável (7.146.25), provisionamento pelo operador |
phases/FASE_01_Descubrimiento.md | 1 | O agente descobre o Artifactory: não consegue navegar, mas consegue instalar; auditoria do pip.conf |
phases/FASE_02_Tablon_Mensajes.md | 2 | PUT em um repositório local (HTTP 201), mural de mensagens improvisado |
phases/FASE_03_Token_Refreshable.md | 3 | Requisição de token refreshable; evidência YAML (allow-refreshable) |
phases/FASE_04_Escalada.md | 4 | Forjamento de JWT e exploit de refresh; tentativas falhas e escopo |
phases/FASE_05_Verificacion_Admin.md | 5 | Verificação do token de admin e criação do usuário agente-admin (a flag) |
phases/FASE_06_Post_Escalada.md | 6 | Atividades pós-escalação do incidente (documentadas, não implementadas) |