flawopen.com/Incidents/gitlab-commits-api-path-traversal-september-2026
CVE-2026-85706: GitLab सर्वर फ़ाइल खुलासा
GitLab का अनधिकृत अपलोड पार्सर सर्वर फ़ाइलें चुन सकता था; अमान्य एस्केप से त्रुटियों में अंश दिखे, पर चयन मात्र से फ़ाइल उजागर नहीं होती थी।[1], [3]
मानिए स्वागत कक्ष के कर्मचारी को ट्रे में रखा दस्तावेज़ लेना था, पर उसने आगंतुक की लिखी अलमारी की जगह मान ली। पहचान पत्र देखे बिना अलमारी खोल दी; एक पंक्ति समझ न आई तो त्रुटि बताते समय उसे ज़ोर से पढ़ दिया। दस्तावेज़ खोलना पहली चूक है और उसकी सामग्री पढ़ना दूसरी।[1]
इस पेज के मुख्य शब्द
Upload metadata- अनुरोध से मिले file.path या metadata.path को विश्वसनीय अपलोड प्रणाली में पंजीकृत बफ़र का स्थान नहीं लेना चाहिए।[1]
Percent decoding- फ़ॉर्म पार्सिंग में % के बाद दो हेक्स अंक हों तो उन्हें डिकोड किया जाता है; अमान्य क्रम की त्रुटि में संबंधित अंश आ सकता है।[1]
CWE-22 / CVSS- CNA ने
CVE-2026-85706को पथ विचलन, CVSS 10.0 गंभीर के रूप में दर्ज किया है। टूटी सीमा है अनुरोधकर्ता द्वारा सर्वर फ़ाइल चुनना।[3]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-22
- CISA KEV — जोड़ा गया 2026-09-11 — CVE-2026-85706
घटना का समयक्रम (Timeline)
GitLab ने 19.1.8, 19.2.6 और 19.3.2 सुधार जारी किए।[2]
सूचना में बाद में 18.11.12 और 19.0.9 के पिछले संस्करणों के सुधार जोड़े गए।[2]
हमले का चरण-दर-चरण प्रवाह
प्रमाणीकरण से पहले चयन
अपलोड मेटाडेटा अपेक्षित अस्थायी बफ़र को प्रमाणीकरण से पहले सर्वर पथ से बदल सकता था।[1]
फ़ाइल का फ़ॉर्म की तरह पार्स होना
application/x-www-form-urlencoded में चुनी फ़ाइल फ़ॉर्म डेटा के रूप में पढ़ी गई, सामान्य कमिट उत्तर के रूप में नहीं लौटाई गई।[1]
त्रुटि में अंश लौटना
अमान्य प्रतिशत क्रम त्रुटि में दोषपूर्ण अंश जोड़ सकता था। & और = उसकी सीमा तय करते हैं; केवल पढ़ना खुलासे का प्रमाण नहीं।[1]
जाँच
correlation_id से Rails API और Workhorse की प्रविष्टियाँ मिलाएँ; api_error और written_bytes की तुलना करके जाँचें कि क्या प्रतिक्रिया में बाइट भेजे गए थे।[1]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह Python का शैक्षिक मॉडल है, GitLab का स्रोत या पैच नहीं। कमज़ोर उदाहरण केवल स्मृति के बफ़र इस्तेमाल करता है और हर % को त्रुटि मानता है; असल प्रतिशत जाँच और अंश चयन नहीं दोहराता। सुरक्षित मॉडल पहले प्रमाणीकरण करता है, पथ मेटाडेटा अस्वीकार करता है, विश्वसनीय अपलोड से पंजीकृत बाइट ही लेता है, आकार सीमित करता है और सामान्य त्रुटि देता है। निर्माता का अपडेट लगाएँ: अगर पहले की परत फ़ाइल पढ़ चुकी हो तो मार्ग के अंदर की जाँच बहुत देर से होगी।[1]
from urllib.parse import unquote_to_bytes
def parse_upload(authenticated, metadata, buffers):
# सुरक्षित in-memory fixtures; filesystem तक कोई पहुँच नहीं।
body = buffers.get(metadata.get("path"), b"")
if b"%" in body:
return 400, body.decode("ascii", errors="replace")
if not authenticated:
return 401, "Unauthorized"
return 200, unquote_to_bytes(body)
from urllib.parse import unquote_to_bytes
MAX_BYTES = 4096
HEX = frozenset(b"0123456789abcdefABCDEF")
def parse_upload(authenticated, metadata, registered_body):
# registered_body भरोसेमंद upload middleware से आता है,
# request parameters से चुने गए path से नहीं।
if not authenticated:
return 401, "Unauthorized"
if metadata or type(registered_body) is not bytes:
return 400, "Invalid upload"
if len(registered_body) > MAX_BYTES:
return 413, "Upload too large"
for i, byte in enumerate(registered_body):
if byte == 37 and (i + 2 >= len(registered_body) or
registered_body[i+1] not in HEX or
registered_body[i+2] not in HEX):
return 400, "Invalid upload"
return 200, unquote_to_bytes(registered_body)
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓समर्थित सुधरे संस्करण पर जाएँ। शाखाओं की न्यूनतम सुधरी रिलीज़ 18.11.12, 19.0.9, 19.1.8, 19.2.6 और 19.3.2 हैं; प्रभावित संस्करण 18.7 से शुरू होते हैं। स्थापित संस्करण को आधिकारिक सूचना से मिलाएँ।[2], [3]
- ✓हानिरहित स्मृति चिह्नों के साथ अनाम अनुरोध जाँचें: प्रमाणीकरण से पहले बफ़र खोज न हो और उत्तर या सामान्य लॉग में चिह्न न आए। पार्सिंग से पहले पथ मेटाडेटा अस्वीकार करें।[1]
- ✓Rails API और Workhorse logs सुरक्षित रखें;
correlation_idसे प्रविष्टियों को मिलाएँ, फिरapi_errorऔरwritten_bytesकी तुलना करें। एक ही पंक्ति में सामान्य अपलोड पथ देखकर उसे हटाने के बजाय डिकोड किए file.path और metadata.path देखें। फ़ाइल पढ़े जाने से उसके खुलासे का प्रमाण नहीं मिलता। GitLab के अनुसार, api_error में दिखा अंश और Workhorse के written_bytes की पुष्टि यह दर्शाती है कि बाइट क्लाइंट को भेजे गए; केवल HTTP स्थिति निर्णायक नहीं है।[1] - ✓रोटेशन को केवल उन क्रेडेंशियल तक सीमित रखें जिनके खुलासे की पुष्टि हुई हो या उचित संदेह हो। यदि
db_key_baseयाotp_key_baseशामिल हो सकते हैं, तो रोटेशन से पहले GitLab सहायता से सलाह लें: GitLab के अनुसारdb_key_baseके लिए अभी कोई समर्थित रोटेशन प्रक्रिया नहीं है और असमर्थित कुंजी रोटेशन से डेटा खो सकता है। लॉग का अभाव खुलासा न होने का प्रमाण नहीं है।[1]