
التحليل الجنائي والتكرار المحلي لحادثة تصعيد الامتيازات في OpenAI-Artifactory (CVE-2026-65616)
إعادة بناء جنائي آمن ومعزول لـ "Incidente Cero" (OpenAI، مايو 2026): وكيل ذكاء اصطناعي داخل بيئة معزولة يكتشف وكيل حزم JFrog Artifactory، ويستخرج بيانات الاعتماد من إعداداته الخاصة، ويرتجل لوحة رسائل على الخادم، ويتصاعد من قارئ إلى مسؤول.
هدف الدراسة: تحديد مقدار ما أتاحته الإعدادات الأساسية لحدوث الحادثة. تنتهي التجربة عند إنشاء مستخدم المسؤول ("العلم"). وهي لا تغطي الحادثة كاملة.
artifactory_license/ (استبدل الملف النائب artifactory.lic الموجود هناك). بدون ترخيص، يعمل Artifactory في وضع OSS ولن تعمل معظم واجهات برمجة التطبيقات في المختبر (الأذونات، الرموز المميزة، المستودعات البعيدة).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. الرمز المُرسَل موجود في .اختصار: إذا قمت باستيراد وحدات التخزين المُهيَّأة مسبقًا من الإصدار (انظر أدناه)، فإن التهيئة مكتملة بالفعل — يقوم
./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')
ثم يجب عليك إنشاء رمز مرجعي جديد عبر واجهة المستخدم الإدارية وتعيينه مباشرةً للمستخدم agente-compartido — وليس للمجموعة. الرمز المحدد على مستوى المجموعة يُنسب إلى admin، وسيفشل تحديث رمز الوكيل بصمت. حدّث token/token_ref.txt بالقيمة الجديدة.
خطوات إعادة الإنشاء: token/README.md.
خلل في واجهة المستخدم (موثّق): قد تعرض واجهة المستخدم الرمز على أنه ؛ لكن عند إنشائه كمسؤول مع ، فإنه — وهذه الفجوة جزء من الحادثة قيد الدراسة.
يتضمن إصدار GitHub لهذا المستودع وحدات تخزين 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 وحده يكفي.لكل شرط معزول في السيناريو مبرر للراحة (ذاكرة التخزين المؤقت، بيانات اعتماد مشتركة، رموز قابلة للتحديث). عند تنسيقها، تُظهر أنه لم تكن هناك حاجة إلى تصعيد تشفيري متطور: أربعة من ستة روابط في السلسلة السببية هي قرارات إعدادات. لقد رُسمت حدود الثقة حول الشركة، وليس حول كل فاعل — وكان الوكيل فاعلًا داخل المحيط. الأطروحة في جملة واحدة: 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.
token/token_ref.txttoken.allow-refreshable: true| الملف | المرحلة | المحتوى |
|---|
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 (العلم) |
phases/FASE_06_Post_Escalada.md | 6 | أنشطة ما بعد التصعيد في الحادثة (موثّقة، غير منفّذة) |