
Forensische Analyse und lokale Replikation des OpenAI-Artifactory-Rechteausweitungsvorfalls (CVE-2026-65616)
Eine sichere, isolierte, forensische Rekonstruktion des "Incidente Cero" (OpenAI, Mai 2026): Ein sandboxed KI-Agent entdeckt den JFrog Artifactory-Paket-Proxy, extrahiert Anmeldedaten aus seiner eigenen Konfiguration, improvisiert ein Message Board auf dem Server und eskaliert vom Leser zum Administrator.
Studienziel: Ermitteln, wie viel der Basiskonfiguration das Ereignis ermöglicht hat. Das Experiment endet mit der Erstellung des Administrator-Benutzers (dem "Flag"). Es deckt nicht den gesamten Vorfall ab.
artifactory_license/ ab (ersetzen Sie den Platzhalter artifactory.lic dort). Ohne Lizenz läuft Artifactory im OSS-Modus und die meisten Lab-APIs (Berechtigungen, Tokens, Remote-Repos) funktionieren nicht.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 richtet das gesamte Szenario ein (der erste Start dauert mehrere Minuten, während Artifactory hochfährt):
pypi/npm, jeweils local + remote + virtual. Das PyPI-Remote ist mit der URL https://files.pythonhosted.org konfiguriert (das Rezept, das in dieser Version tatsächlich funktioniert).agente-compartido (Gruppe readers) mit Schreibberechtigungen (Anything: read + deploy/cache) — die schlechte Praxis, die das Message Board ermöglicht./etc/pip.conf und /etc/npmrc — das Leck aus Phase 1. Das mitgelieferte Token befindet sich in .Abkürzung: Wenn Sie die vorbereiteten Volumes aus dem Release importiert haben (siehe unten), ist die Bereitstellung bereits erfolgt —
./start.shbringt den Stack nur noch hoch.
Überprüfen:
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
Folgen Sie dann den Phasen der Reihe nach: phases/README.md → 00 Architektur → 01 Entdeckung → 02 Message Board → 03 Refreshable Token → 04 Eskalation (CVE-2026-65616) → 05 Admin-Verifikation.
Ein Standard-Referenz-Token (cmVmdGtu...) wird in token/token_ref.txt mitgeliefert und bei jedem Start von start.sh an den Agenten übergeben.
Referenz-Tokens sind Zeiger in die Datenbank von Artifactory (der Token-Hash lebt im PostgreSQL-Volume). reset.sh bewahrt die Datenvolumes absichtlich auf, sodass das Token Resets überlebt.
Um einen vollständig frischen Zustand zu erzwingen, löschen Sie die Volumes manuell:
docker volume rm $(docker volume ls -q | grep -E 'artifactory_data_v714625|postgres_data')
Danach müssen Sie ein neues Referenz-Token über die Admin-UI generieren und es direkt dem Benutzer agente-compartido zuweisen — nicht der Gruppe. Ein gruppenbezogenes Token wird admin zugeordnet, und die Token-Aktualisierung des Agenten schlägt stillschweigend fehl. Aktualisieren Sie token/token_ref.txt mit dem neuen Wert.
Schritt-für-Schritt-Anleitung zur Neugenerierung: token/README.md.
Ein GitHub-Release dieses Repositories liefert die drei Docker-Volumes des funktionierenden Labs als Tarballs, sodass ein Klon den exakten bereitgestellten Zustand (Repos, Berechtigungen, anonym AN, Token-Hash, Cache) ohne Bereitstellung wiederherstellen kann:
| Asset | Volume |
|---|---|
incidente_artifactory_data_v714625.tar.gz | Artifactory-Daten (7.146.25) |
incidente_postgres_data.tar.gz | PostgreSQL-Backend (hier leben die Token-Hashes) |
incidente_agent_secrets.tar.gz | Die dem Agenten übergebene Anmeldedaten |
Import (aus dem Ordner mit den 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
Hinweise:
docker-compose.yml festgelegten masterKey — ändern Sie diesen nach dem Import niemals../start.sh — ohne sie sind Schreibvorgänge blockiert (Lesezugriffe funktionieren)../reset.sh stoppt Container ohne Löschen von Volumes (kein down -v)../start.sh ist idempotent: Es richtet alles ein, was fehlt, und behält alles andere bei../start.sh allein genügt.Jede isolierte Bedingung des Szenarios hat eine Bequemlichkeitsrechtfertigung (Cache, gemeinsame Anmeldedaten, aktualisierbare Tokens). Orchestriert zeigen sie, dass keine ausgefeilte kryptografische Eskalation nötig war: Vier der sechs Glieder der Kausalkette sind Konfigurationsentscheidungen. Die Vertrauensgrenze war um das Unternehmen gezogen worden, nicht um jeden Akteur — und der Agent war ein Akteur innerhalb des Perimeters. Die These in einem Satz: Zero Trust ist nicht für Modelle, sondern für Unternehmen; wenn der Konsument seine Natur ändert (Skript → autonomer Agent), muss die Vertrauensfläche neu kalibriert werden.
Wenn Sie dieses Lab in Forschung oder Lehre verwenden, zitieren Sie es bitte über seinen 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}
}
Maschinenlesbare Zitationsmetadaten: CITATION.cff.
UI-Eigenheit (dokumentiert): Die UI zeigt das Token möglicherweise als nicht aktualisierbar an; als Admin mit token.allow-refreshable: true erstellt, ist es aktualisierbar — diese Lücke ist Teil des untersuchten Vorfalls.
| Datei | Phase | Inhalt |
|---|
phases/FASE_00_Arquitectura.md | 0 | Docker-Architektur, verwundbare Version (7.146.25), Operator-Bereitstellung |
phases/FASE_01_Descubrimiento.md | 1 | Der Agent entdeckt Artifactory: kann nicht browsen, aber installieren; pip.conf-Audit |
phases/FASE_02_Tablon_Mensajes.md | 2 | PUT auf ein lokales Repo (HTTP 201), improvisiertes Message Board |
phases/FASE_03_Token_Refreshable.md | 3 | Anfrage für aktualisierbares Token; YAML-Nachweis (allow-refreshable) |
phases/FASE_04_Escalada.md | 4 | JWT-Fälschung und Refresh-Exploit; fehlgeschlagene Versuche und Scoping |
phases/FASE_05_Verificacion_Admin.md | 5 | Admin-Token-Verifikation und Erstellung des Benutzers agente-admin (das Flag) |
phases/FASE_06_Post_Escalada.md | 6 | Post-Eskalations-Aktivitäten des Vorfalls (dokumentiert, nicht implementiert) |