
CVE-2026-10053 के लिए पुनरुत्पादन-योग्य लैब (GitLab npm पैकेज-रजिस्ट्री पथ ट्रैवर्सल -> git के रूप में मनमानी फ़ाइल लेखन)। असुरक्षित 19.2.1 बनाम पैच किया गया 19.2.2, निर्धारणात्मक ओरेकल।
स्व-निहित लैब जो GitLab npm पैकेज-रेजिस्ट्री पाथ ट्रैवर्सल (CVE-2026-10053) को सिद्ध करती है और दिखाती है कि यह ठीक हो गया है, एक नियतात्मक ऑन-डिस्क ओरेकल का उपयोग करते हुए — HTTP स्टेटस नहीं।
क्या सिद्ध है और क्या नहीं। यह लैब कमजोर GitLab पर
gitOS उपयोगकर्ता के रूप में प्रमाणित मनमाना फ़ाइल लेखन सिद्ध करती है, और यह कि पैच किया गया रिलीज़ इसे रोकता है। यह नहीं है एक स्टैंडअलोन रिमोट-कोड-एक्सिक्यूशन PoC — देखें दायरा। इसे RCE के रूप में उद्धृत न करें।
| भेद्यता | npm पैकेज रजिस्ट्री में CWE-22 पाथ ट्रैवर्सल (TOCTOU: जाँच before :cache पर चली, before :store पर नहीं) |
| CVSS | 8.5 उच्च — AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H |
| प्रभावित | GitLab CE/EE 18.8 → <19.0.6, 19.1 → <19.1.4, 19.2 → <19.2.2 |
| समाधान | 19.0.6 / 19.1.4 / 19.2.2 — commit 435cf863 "अपलोड पाथ ट्रैवर्सल को स्टोर से पहले पुनः सत्यापित करें" |
python3, git, curl।./run.sh # up + provision + exploit + verify BOTH; exits 0 iff vuln writes AND patched blocks
अपेक्षित परिणाम:
================ CVE-2026-10053 verification ================
INSTANCE EXPECT RESULT STATUS
gitlab-vuln (19.2.1) written written PASS
gitlab-patched (19.2.2) blocked blocked PASS
------------------------------------------------------------
PROVEN: authenticated arbitrary file write as git on 19.2.1.
NOT a standalone RCE — see README.md 'Scope' and ./run.sh rce-gate.
============================================================
अन्य उप-कमांड:
./run.sh up # just start + wait until healthy
./run.sh rce-gate # honest exec-bit-gate demo (below)
./run.sh down # docker compose down -v
कमजोर और पैच किए गए दोनों सर्वर दुर्भावनापूर्ण पब्लिश का जवाब HTTP 200 {"status":"processing"} से देते हैं — फ़ाइल बाद में, फ़ाइनलाइज़ वर्कर में लिखी जाती है। इसलिए HTTP स्टेटस कोई ओरेकल नहीं है। exploit/poc.py --verify-docker <container> इसके बजाय कंटेनर के अंदर ट्रैवर्स किए गए पथ पर नियंत्रित फ़ाइल के लिए पोल करता है और उसके SHA-1 की तुलना करता है:
/var/tmp/CVE_2026_10053_PROOF-1.0.0.tgz दिखाई देता है (मालिक git:git, हमारे बाइट्स) → exit 0.Gitlab::PathTraversal::PathTraversalAttackError: Invalid path → exit 2.एक्सप्लॉइट स्वयं प्रमाणित PUT …/packages/npm/:pkg अनुरोध के अलावा कुछ नहीं है; ट्रैवर्सल पूरी तरह से JSON बॉडी name में रहता है (file_name = "#{name}-#{version}.tgz", केवल खाली होने की जाँच की गई)। docker exec कॉल सत्यापन और सेटअप हैं, कभी भी हमलावर की क्षमता का हिस्सा नहीं।
git-लेखनीय पथ पर हमलावर-नियंत्रित बाइट्स लिखता है। फ़ाइलें 0644 के रूप में बनती हैं।-<semver>.tgz पर समाप्त होने के लिए बाध्य है (NUL कर्नेल द्वारा अस्वीकार कर दिया जाता है, newline ट्रंकेट नहीं करता), इसलिए कोई भी सटीक-नाम लक्ष्य (secrets.yml, authorized_keys, एक .rb, gitaly बाइनरी) अधिलेखित नहीं किया जा सकता। एकमात्र फ़ाइलनाम-अज्ञेय निष्पादक, custom_hooks/<hook>.d/, किसी भी फ़ाइलनाम को चलाता है लेकिन केवल यदि वह executable है — और यह लेखन 0644 है। पहले से मौजूद 0755 फ़ाइल को अधिलेखित करने से कोई मदद नहीं मिलती: स्टोर इनोड को बदल देता है, उसे 0644 पर रीसेट कर देता है। इसलिए RCE के लिए एक अलग executable-bit / निष्पादन प्रिमिटिव चाहिए जो यह PoC प्रदान नहीं करता।./run.sh rce-gate ठीक इसी को ईमानदारी से प्रदर्शित करता है: यह ट्रैवर्सल के माध्यम से एक pre-receive.d हुक स्थापित करता है, पुश करता है, और दिखाता है कि 0644 हुक निष्पादित नहीं होता। ./rce_gate_demo.sh --illustrate-gate इसके अतिरिक्त docker exec chmod के माध्यम से +x सेट करता है (एक आउट-ऑफ-बैंड docker-root क्रिया, नहीं हमलावर क्षमता) केवल यह दिखाने के लिए कि gitaly उसे चलाएगा — इस बात पर ज़ोर देते हुए कि गायब लीवर exec बिट है।
पूर्ण विश्लेषण के लिए ANALYSIS.md देखें। संक्षेप में: app/uploaders/gitlab_uploader.rb ने स्टोरेज पथ को केवल before :cache पर मान्य किया; before :store पर मॉडल-व्युत्पन्न file_name (हमलावर-नियंत्रित, अमान्य) को शब्दशः लिखा गया। सुधार before :store, :protect_from_path_traversal! जोड़ता है।
docker-compose.yml vuln (19.2.1) + patched (19.2.2) GitLab CE
run.sh one-command harness with deterministic file oracle + PASS/FAIL
provision.rb lab setup: mint root PAT + create project (NOT part of the exploit)
exploit/poc.py the PoC sender + --verify-docker oracle
rce_gate_demo.sh honest exec-bit-gate demonstration