flawopen.com/Teardowns/cve-2026-102437-deepseek-reasonix-git-filter-command-injection
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]
एक ऐसी छँटाई मेज़ सोचिए जो केवल दो लेबल की तुलना करने का वादा करती है। किसी पैकेट पर ऐसा रास्ता-नोट लगाया जा सकता है जो तुलना से पहले मेज़ को पंजीकृत सहायक चलाने को कहे। 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]
हमले का चरण-दर-चरण प्रवाह
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह 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
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓✓ प्रोजेक्ट के मौजूदा निर्देशों के अनुसार Reasonix npm को 1.39.3 या बाद के संस्करण पर, अथवा Reasonix Studio को 2.21.0 या बाद के संस्करण पर अपडेट करें।[2], [6], [7]
- ✓✓ यदि कोई टूल उपयोगकर्ता-नियंत्रित वर्कस्पेस में Git चलाता है, तो रिपॉज़िटरी की स्थानीय सेटिंग और ट्रैक की गई attributes को अविश्वसनीय इनपुट मानें।[1], [3]
- ✓✓ सामग्री बदलने वाली हर host-Git कॉल में
.gitattributes,.git/info/attributesऔर global/system attribute फ़ाइलों द्वारा चुने गए सभी फ़िल्टर पहचानें; system, global, local और worktree config scopes में उनके driver keys निष्क्रिय करें; खोज अधूरी हो तो सुरक्षित रूप से रुकें。[1], [3], [4], [5] - ✓✓
--no-ext-diffऔर--no-textconvको अलग-अलग नियंत्रण बनाए रखें; इन्हें फ़िल्टर ड्राइवर नियंत्रण का विकल्प न मानें।[1] - ✓✓ वास्तविक Git के साथ regression परीक्षण जोड़ें जो साबित करें कि repository द्वारा कॉन्फ़िगर किया गया hostile फ़िल्टर diff, status, staging, checkout और wrapper द्वारा समर्थित अन्य content-processing paths में नहीं चलता।[4], [5]
- ✓✓ Archive, साझा फ़ोल्डर, cache और devcontainer में स्थानीय रूप से दिया गया
.git/configजाँचें; यह न कहें कि सामान्य clone यह फ़ाइल साथ लाता है।[1], [3]
स्रोत
- GitLab Threat Research — DeepSeek-Reasonix vulnerability details and affected call site
- GitLab Advisory Database — CVE-2026-102437
- DeepSeek-Reasonix maintainer advisory — GHSA-grg2-7gc6-36m6
- DeepSeek-Reasonix Studio host Git hardening PR #11110
- DeepSeek-Reasonix 1.x host Git hardening PR #11114
- DeepSeek-Reasonix 1.39.3 release
- DeepSeek-Reasonix Studio 2.21.0 release
- MITRE CWE-78 — Improper Neutralization of Special Elements used in an OS Command