FlawOpen

flawopen.com/Teardowns/cve-2026-102437-deepseek-reasonix-git-filter-command-injection

● CVE-2026-102437 · CVSS 7.8[2] · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-102437: Reasonix diff में Git कमांड इंजेक्शन

दूषित .gitattributes/.git/config जोड़ी Reasonix में diff दिखाते समय Git clean filter चला सकती है। npm पैकेज 1.39.3 या Studio 2.21.0 पर अपडेट करें।[1], [2], [3], [6], [7]

💡 आसान भाषा में (ELI5)

एक ऐसी छँटाई मेज़ सोचिए जो केवल दो लेबल की तुलना करने का वादा करती है। किसी पैकेट पर ऐसा रास्ता-नोट लगाया जा सकता है जो तुलना से पहले मेज़ को पंजीकृत सहायक चलाने को कहे। Reasonix ने Git के कुछ सहायकों को बंद किया था, लेकिन हर फ़ाइल पर लागू होने वाला clean फ़िल्टर अलग रास्ता था। जब diff स्क्रीन ने Git से फ़ाइल तैयार करने को कहा, तो यह फ़िल्टर डेवलपर के अधिकारों के साथ चल सकता था।[1], [3]

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

Git clean फ़िल्टर
कॉन्फ़िगर किया गया रूपांतरण जिसे Git कार्यशील ट्री की फ़ाइल को रिपॉज़िटरी में संग्रहीत रूप में बदलने के लिए चला सकता है।[1], [3]
.gitattributes
रिपॉज़िटरी में ट्रैक की गई फ़ाइल जो चुने हुए पथों को नामित फ़िल्टर दे सकती है।[1]
.git/config
रिपॉज़िटरी की स्थानीय Git सेटिंग, जो नामित फ़िल्टर द्वारा चलाए जाने वाले कमांड को परिभाषित कर सकती है। सामान्य clone इस स्थानीय फ़ाइल को कॉपी नहीं करता।[1], [3]
Diff दर्शक
वह सुविधा जो Git से फ़ाइल की कार्यशील सामग्री तैयार कराकर committed सामग्री से तुलना करने को कहती है।[1]

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

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-78

मूल कारण विश्लेषण (Root Cause)

Reasonix ने git diff कॉल में --no-ext-diff और --no-textconv जोड़े थे, लेकिन ये बाहरी diff और टेक्स्ट रूपांतरण को नियंत्रित करते हैं; ये Git के clean कंटेंट फ़िल्टर बंद नहीं करते। वर्कस्पेस बदलाव दृश्य चुने हुए पथ के लिए git diff चलाता था। यदि रिपॉज़िटरी की .gitattributes उस पथ को फ़िल्टर देती और स्थानीय Git कॉन्फ़िगरेशन उस ड्राइवर का कमांड परिभाषित करती, तो Git तुलना blob तैयार करते समय उसे चला सकता था। CVE में स्थानीय हमलावर और उपयोगकर्ता द्वारा diff खोलने की आवश्यकता बताई गई है। GitLab के खुलासे के अनुसार सामान्य clone .git/config स्थानांतरित नहीं करता; archive, सिंक की गई डायरेक्टरी, cache या पहले से तैयार devcontainer में यह फ़ाइल हो सकती है। खुलासे में यह भी बताया गया है कि समान स्थानीय अधिकार वाला एजेंट रिपॉज़िटरी कॉन्फ़िगरेशन लिख सकता है। प्रभाव Reasonix उपयोगकर्ता के अधिकारों से स्थानीय कमांड चलना है, न कि GitLab पर होस्टेड रिपॉज़िटरी खोलते ही दूरस्थ कोड चलना।[1], [3]

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

चरण 1

वर्कस्पेस को अविश्वसनीय रिपॉज़िटरी स्थिति मिलती है

डेवलपर ऐसा प्रोजेक्ट खोलता है जिसकी ट्रैक की गई attributes किसी फ़ाइल को फ़िल्टर देती हैं और स्थानीय Git कॉन्फ़िगरेशन उस फ़िल्टर को परिभाषित करती है। मेंटेनर सलाह में दोनों आवश्यक हैं; सामान्य clone अकेले स्थानीय कॉन्फ़िगरेशन नहीं देता।[1], [3]

चरण 2

डेवलपर फ़ाइल का diff माँगता है

Reasonix का बदलाव दृश्य चुनी हुई फ़ाइल के लिए Git diff चलाता है। यही UI क्रिया CVE के लिए आवश्यक उपयोगकर्ता इंटरैक्शन है।[1], [3]

चरण 3

Git clean फ़िल्टर लागू करता है

तुलना के लिए सामग्री तैयार करते समय Git कॉन्फ़िगर किया गया clean फ़िल्टर चला सकता है। --no-ext-diff और --no-textconv अलग तंत्र बंद करते हैं; यह फ़िल्टर उनसे नहीं रुकता।[1], [3]

चरण 4

फ़िल्टर उपयोगकर्ता के अधिकारों से चलता है

फ़िल्टर कमांड Reasonix प्रक्रिया के संदर्भ में चलता है। दस्तावेज़ित प्रभाव उसी उपयोगकर्ता के अधिकारों से स्थानीय कमांड चलना है।[1], [2], [3]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह illustrative argument builder है, सीधे लागू करने योग्य patch नहीं। Caller को .gitattributes, .git/info/attributes और global/system attribute files द्वारा चुने गए सभी drivers की सूची बनानी होगी और केवल सफल, पूर्ण scan के बाद discoveryComplete सेट करना होगा। यह function दिए गए नामों को validate करके command-line config overrides बनाता है; यह driver set को खोजता या सत्यापित नहीं करता। Vulnerable call GitLab disclosure से उद्धृत है; defensive pattern maintainer guidance और merged hardening PRs का मूल synthesis है।[1], [3], [4], [5]

सोर्स अंश: desktop/workspace_changes.go

कमज़ोर कार्यान्वयन
// GitLab Threat Research द्वारा उद्धृत source call; यह call site है, पूरा function नहीं।
args := []string{"-C", base, "diff", "--no-ext-diff", "--no-textconv", "--relative", "HEAD", "--", filepath.FromSlash(rel)}
सुरक्षित और सुदृढ़ फ़िक्स
// Go argument builder का उदाहरण, vendor patch का हूबहू रूप नहीं।
package gitguard

import (
    "errors"
    "fmt"
    "path/filepath"
    "regexp"
)

// caller को effective attributes द्वारा चुने गए हर filter को खोजकर पूरा set देना होगा।
// यह helper केवल सभी Git config scopes में उन driver keys को neutralize करता है।
var filterDriverName = regexp.MustCompile(`^[A-Za-z0-9_-]{1,64}$`)

func hardenedDiffArgs(base, rel string, drivers []string, discoveryComplete bool) ([]string, error) {
    if !discoveryComplete {
        return nil, errors.New("cannot safely diff: filter-driver discovery failed")
    }
    args := []string{"-C", base}
    seen := map[string]struct{}{}
    for _, driver := range drivers {
        if !filterDriverName.MatchString(driver) {
            return nil, fmt.Errorf("cannot safely diff: unsupported Git filter driver name %q", driver)
        }
        // Git config subsection names case-sensitive हैं: driver names का case न बदलें।
        key := driver
        if _, ok := seen[key]; ok {
            continue
        }
        seen[key] = struct{}{}
        for _, setting := range []string{"clean", "smudge", "process", "required"} {
            args = append(args, "-c", "filter."+driver+"."+setting+"=")
        }
    }
    return append(args, "diff", "--no-ext-diff", "--no-textconv", "--relative", "HEAD", "--", filepath.FromSlash(rel)), nil
}

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

स्रोत