FlawOpen

flawopen.com/Incidents/gitlab-commits-api-path-traversal-september-2026

● GitLab · CVE-2026-85706 · September 2026 · CVSS 10.0 · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-85706: GitLab सर्वर फ़ाइल खुलासा

GitLab का अनधिकृत अपलोड पार्सर सर्वर फ़ाइलें चुन सकता था; अमान्य एस्केप से त्रुटियों में अंश दिखे, पर चयन मात्र से फ़ाइल उजागर नहीं होती थी।[1], [3]

CVSS वेक्टरCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N[3]
💡 आसान भाषा में (ELI5)

मानिए स्वागत कक्ष के कर्मचारी को ट्रे में रखा दस्तावेज़ लेना था, पर उसने आगंतुक की लिखी अलमारी की जगह मान ली। पहचान पत्र देखे बिना अलमारी खोल दी; एक पंक्ति समझ न आई तो त्रुटि बताते समय उसे ज़ोर से पढ़ दिया। दस्तावेज़ खोलना पहली चूक है और उसकी सामग्री पढ़ना दूसरी।[1]

इस पेज के मुख्य शब्द

Upload metadata
अनुरोध से मिले file.path या metadata.path को विश्वसनीय अपलोड प्रणाली में पंजीकृत बफ़र का स्थान नहीं लेना चाहिए।[1]
Percent decoding
फ़ॉर्म पार्सिंग में % के बाद दो हेक्स अंक हों तो उन्हें डिकोड किया जाता है; अमान्य क्रम की त्रुटि में संबंधित अंश आ सकता है।[1]
CWE-22 / CVSS
CNA ने CVE-2026-85706 को पथ विचलन, CVSS 10.0 गंभीर के रूप में दर्ज किया है। टूटी सीमा है अनुरोधकर्ता द्वारा सर्वर फ़ाइल चुनना।[3]

फ्रेमवर्क मैपिंग

घटना का समयक्रम (Timeline)

2026-09-10

GitLab ने 19.1.8, 19.2.6 और 19.3.2 सुधार जारी किए।[2]

2026-09-23

सूचना में बाद में 18.11.12 और 19.0.9 के पिछले संस्करणों के सुधार जोड़े गए।[2]

हमले का चरण-दर-चरण प्रवाह

चरण 1

प्रमाणीकरण से पहले चयन

अपलोड मेटाडेटा अपेक्षित अस्थायी बफ़र को प्रमाणीकरण से पहले सर्वर पथ से बदल सकता था।[1]

चरण 2

फ़ाइल का फ़ॉर्म की तरह पार्स होना

application/x-www-form-urlencoded में चुनी फ़ाइल फ़ॉर्म डेटा के रूप में पढ़ी गई, सामान्य कमिट उत्तर के रूप में नहीं लौटाई गई।[1]

चरण 3

त्रुटि में अंश लौटना

अमान्य प्रतिशत क्रम त्रुटि में दोषपूर्ण अंश जोड़ सकता था। & और = उसकी सीमा तय करते हैं; केवल पढ़ना खुलासे का प्रमाण नहीं।[1]

चरण 4

जाँच

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)

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत