FlawOpen

flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection

● CVE-2026-97662 · CVSS v4 6.9 · मध्यम
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-97662: AWS सिक्योरिटी एजेंट MCP में Git आर्ग्युमेंट इंजेक्शन

CVE-2026-97662 में AWS Security Agent MCP diff scan का caller-नियंत्रित Git ref कमांड विकल्प के रूप में समझा जा सकता था। इससे workspace सीमा पार करके host पर फ़ाइलें लिखी जा सकती थीं। संस्करण 0.2.0 या नया इंस्टॉल करें।[1], [2]

CVSS वेक्टरCVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N
💡 आसान भाषा में (ELI5)

किसी कर्मचारी को लेबल से फ़ोल्डर ढूँढ़ने को कहा जाता है, लेकिन वह ऐसा लेबल स्वीकार कर लेता है जो नियंत्रण निर्देश से शुरू होता है। फाइलिंग सिस्टम फ़ोल्डर खोजने के बजाय निर्देश चला देता है। यहाँ, डैश से शुरू होने वाला Git ref विकल्प माना जा सकता था। Git चलाने से पहले खाली या विकल्प-जैसे ref को अस्वीकार करना इस इनपुट सीमा को बंद करता है। यह Git द्वारा विकल्पों की व्याख्या है, मनमाने shell commands का निष्पादन नहीं।[2]

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

MCP सर्वर
Model Context Protocol के ज़रिए AI ऐप को टूल देने वाली स्थानीय प्रक्रिया। टूल आर्ग्युमेंट सर्वर में अविश्वसनीय डेटा के रूप में आते हैं।
आर्ग्युमेंट इंजेक्शन (CWE-88)
कमांड-लाइन प्रोग्राम अविश्वसनीय इनपुट को विकल्प या delimiter मान लेता है, भले ही प्रक्रिया को shell string के बजाय आर्ग्युमेंट सूची दी गई हो।[2], [4]
Git ref
Commit या tree बताने वाला नाम या expression, जैसे main या HEAD~1। - से शुरू होने वाला मान विकल्प के रूप में पढ़ा जा सकता है।[2], [3]
Workspace confinement
सीमा जो टूल की फ़ाइल कार्रवाइयों को चुने गए प्रोजेक्ट फ़ोल्डर में रखती है। यदि इनपुट subprocess कमांड का अर्थ बदल दे तो यह सीमा अधूरी है।[1], [3]

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

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

AWS diff scan ऑपरेशन में संदर्भ-निर्भर आर्ग्युमेंट इंजेक्शन बताता है: स्कैन को दिया गया ref Git revision के बजाय कमांड-लाइन विकल्प माना जा सकता था। Upstream PR पुष्टि करता है कि start_diff_scan ने base_ref को git diff <base_ref> -- और git archive में भेजा; खाली या डैश से शुरू मान का अर्थ बदल सकता था। यह shell metacharacter injection नहीं है: आर्ग्युमेंट सूची shell parsing रोकती है, लेकिन बुलाया गया प्रोग्राम अपने विकल्प फिर भी पढ़ता है। AWS के अनुसार, इससे अपेक्षित workspace के बाहर फ़ाइलें बनाई, बदली या truncate की जा सकती थीं, प्रक्रिया की OS अनुमतियों की सीमा तक। मर्ज किया गया fix Git से पहले base_ref जाँचता है और खाली मान तथा trim करने के बाद - से शुरू मान अस्वीकार करता है; परीक्षण पुष्टि करते हैं कि अस्वीकृत इनपुट पर subprocess या upload नहीं होता। >=0.1.1 और <0.2.0 प्रभावित हैं; 0.2.0 में सुधार है। CVE रिकॉर्ड CVSS 4.0 6.9 Medium देता है; GitHub Advisory CVSS 3.1 8.2 High भी बताता है। यहाँ exploit payload नहीं दिया गया है।[1], [2], [3], [4]

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

चरण 1

Agent diff scan टूल चलाता है

स्थानीय MCP सर्वर को caller-प्रभावित base_ref मिलता है। जोखिम तब है जब workflow किसी अविश्वसनीय repository, सामग्री या user को यह मान नियंत्रित करने देता है; prompt injection अपने आप इस code path तक नहीं पहुँचता।[2]

चरण 2

मान Git को positional argument बनकर मिलता है

प्रभावित कोड ref को Git diff और archive कमांड में देता है। Python shell का उपयोग न करे, तब भी शुरुआती डैश को Git विकल्प समझ सकता है।[2], [3]

चरण 3

Git विकल्प parsing अनुमानित सीमा पार करती है

इस संदर्भ का विकल्प लेखन को workspace के बाहर भेज सकता है। दर्ज प्रभाव प्रक्रिया की पहुँच वाली फ़ाइलें बनाना, overwrite करना या truncate करना है; वास्तविक दायरा permissions और workflow पर निर्भर है।[1], [3]

चरण 4

Side effects से पहले असुरक्षित ref रोकें

संस्करण 0.2.0 Git, S3 upload या Agent Space जाँच से पहले base_ref validate करता है। अपग्रेड करें और MCP प्रक्रिया को न्यूनतम विशेषाधिकार व isolation में चलाएँ।[1], [3], [6]

सीमा-प्रवाह: revision text और Git options

यह वैचारिक data-flow है, commands का क्रम या exploit का पुनरुत्पादन नहीं।

दो parsers, दो अलग boundaries

Shell parsing
Argument array shell को मान को shell syntax की तरह समझने से रोकती है और यह boundary बंद करती है।[3]
Git option parsing
Git अपनी command-line grammar को फिर भी parse करता है। Argument array caller-प्रभावित ref को option समझे जाने से नहीं रोकती; Git चलाने से पहले ref validate करें।[2], [3]
1

कॉलर revision को प्रभावित करता है

diff scan टूल workflow से base_ref लेता है। जोखिम तभी है जब कोई अविश्वसनीय स्रोत इस मान को प्रभावित कर सके।[2], [3]

2

Argument array फिर भी Git parser तक पहुँचती है

Python हर मान अलग भेजकर shell parsing रोक सकता है, लेकिन Git अपने command-line options को फिर भी parse करता है।[3], [2]

3

Workspace सीमा की धारणा टूट सकती है

यदि Git मान को option समझे, तो file output तय workspace से बाहर जा सकता है; वास्तविक सीमा MCP process की OS permissions तय करती हैं।[1], [2]

4

Validation input boundary बंद करती है

Version 0.2.0 Git या अन्य side effects से पहले empty और option-जैसे refs अस्वीकार करता है। Caller input अब Git के option behavior को नहीं चुन सकता; valid refs अब भी अनुरोधित revision चुनते हैं।[3], [6]

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

यह upstream call boundary का सीमित उदाहरण है, scanner की पूरी प्रति नहीं। मर्ज किया गया बदलाव Git से पहले ref validate करता है; परीक्षण खाली और डैश से शुरू मान पर subprocess और upload न होने की पुष्टि करते हैं। आर्ग्युमेंट सूची shell parsing रोकती है, Git की option parsing नहीं। यह अंश केवल git diff कॉल दिखाता है; git archive सहित base_ref के हर उपयोग पर यही validation लागू होनी चाहिए।[3]

कमज़ोर कार्यान्वयन
def start_diff_scan(path: str, base_ref: str):
    # विकल्प जैसी ref जाँच से पहले Git तक पहुँचती है।
    return subprocess.run(
        ["git", "diff", base_ref, "--"],
        cwd=path,
        check=False,
    )
सुरक्षित और सुदृढ़ फ़िक्स
def _validate_git_ref(base_ref: str) -> None:
    if not base_ref or not base_ref.strip():
        raise ValueError("base_ref must not be empty.")
    if base_ref.strip().startswith("-"):
        raise ValueError("base_ref must not start with '-'.")

def start_diff_scan(path: str, base_ref: str):
    _validate_git_ref(base_ref)  # subprocess या upload शुरू करने से पहले अस्वीकार करें।
    return subprocess.run(
        ["git", "diff", base_ref, "--"],
        cwd=path,
        check=False,
    )

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

स्रोत