
Судебно-криминалистический анализ и локальная репликация инцидента с повышением привилегий OpenAI-Artifactory (CVE-2026-65616)
Безопасное, изолированное, криминалистическое воспроизведение "Incidente Cero" (OpenAI, май 2026): изолированный AI-агент обнаруживает прокси-сервер пакетов JFrog Artifactory, извлекает учётные данные из собственной конфигурации, импровизирует доску сообщений на сервере и повышает свои привилегии с читателя до администратора.
Цель исследования: определить, какая часть базовой конфигурации способствовала этому событию. Эксперимент заканчивается на создании пользователя-администратора (the "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 remote настроен с URL https://files.pythonhosted.org (рецепт, который действительно работает в этой версии).agente-compartido (группа readers) с правами на запись (Anything: read + deploy/cache) — плохая практика, которая делает возможной доску сообщений./etc/pip.conf и /etc/npmrc в открытом виде — утечка Фазы 1. Поставляемый токен находится в .Сокращение: если вы импортировали предварительно подготовленные тома из 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 Refreshable-токен → 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.
GitHub Release этого репозитория поставляет три Docker-тома работающей лаборатории в виде tarball-архивов, так что клон может восстановить точное подготовленное состояние (репозитории, разрешения, анонимный доступ ВКЛ, хеш токена, кэш) без подготовки:
| Ресурс | Том |
|---|---|
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
Примечания:
masterKey, зафиксированным в docker-compose.yml — никогда не меняйте его после импорта../start.sh — без неё запись блокируется (чтение работает)../reset.sh останавливает контейнеры без удаления томов (без down -v)../start.sh идемпотентен: он подготавливает всё, чего не хватает, и сохраняет всё остальное../start.sh.У каждого изолированного условия сценария есть удобное обоснование (кэш, общие учётные данные, refreshable-токены). В совокупности они показывают, что не потребовалось никакого изощрённого криптографического повышения привилегий: четыре из шести звеньев причинно-следственной цепочки — это конфигурационные решения. Граница доверия была проведена вокруг компании, а не вокруг каждого действующего лица — и агент был действующим лицом внутри периметра. Тезис в одном предложении: 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.
Особенность UI (задокументировано): UI может показывать токен как non-refreshable; созданный администратором с token.allow-refreshable: true, он является refreshable — этот разрыв является частью изучаемого инцидента.
| Файл | Фаза | Содержание |
|---|
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 | Запрос refreshable-токена; доказательства в YAML (allow-refreshable) |
phases/FASE_04_Escalada.md | 4 | Подделка JWT и эксплойт refresh; неудачные попытки и scoping |
phases/FASE_05_Verificacion_Admin.md | 5 | Проверка админского токена и создание пользователя agente-admin (the flag) |
phases/FASE_06_Post_Escalada.md | 6 | Пост-эскалационные действия инцидента (задокументировано, не реализовано) |