
MCP stdio सर्वरों के लिए गहन सुरक्षा बंडल: ड्रॉप-इन guardExec/guardSpawn रैपर, AST ऑडिट CLI, संदर्भ MCP सर्वर। Ox-Security 200k-server stdio-RCE श्रेणी (LiteLLM CVE-2025-69256) को समाप्त करता है। MIT, TypeScript, Node >= 20।
StudioMeyer MCP Stack का हिस्सा — Mallorca 🌴 में निर्मित · ⭐ अगर आप इसका उपयोग करते हैं
@modelcontextprotocol/sdk ^1.29.0npm install mcp-stdio-shellguard
या बिना इंस्टॉल किए ऑडिट CLI को सीधे चलाएं:
npx -y -p mcp-stdio-shellguard mcp-shellguard-audit scan ./src
तीन परतें, जिन्हें अलग-अलग ऑप्ट-इन किया जा सकता है:
guardExec / guardSpawn, जिन्हें आप अपने स्वयं के MCP सर्वर से कॉल करते हैं। डिफ़ॉल्ट-अस्वीकार अनुमतिसूची, सैंडबॉक्स प्रोफ़ाइल, रीप्ले विंडो।mcp-shellguard-audit scan <path> AST को स्कैन करता है, LOW (no timeout) से CRITICAL (exec(\...${userInput}...`)`) तक 12 एंटी-पैटर्न रिपोर्ट करता है।mcp-stdio-shellguard-demo 8 टूल उपलब्ध कराता है ताकि MCP Inspector / Claude Desktop बंडल को सीधे चला सकें।कॉल करने वाला प्रति कॉल timeoutMs / fdBudget के माध्यम से सीमाएं कड़ी कर सकता है। कॉल करने वाला प्रोफ़ाइल से आगे सीमाएं बढ़ा नहीं सकता।
| टियर | शर्त |
|---|---|
| LOW | टूल पंजीकृत नहीं (डिफ़ॉल्ट-अस्वीकार) |
| MEDIUM | पंजीकृत लेकिन argsPatterns खाली (कोई भी args अनुमत) |
टूल पंजीकृत करके + argsPatterns सेट करके + guardExec/guardSpawn के माध्यम से चलाकर (जो हमेशा सैंडबॉक्स + रीप्ले सक्रिय करते हैं) LOW → CRITICAL तक उठाएं।
import {
AllowlistRegistry,
ReplayWindow,
guardExec,
} from "mcp-stdio-shellguard";
const registry = new AllowlistRegistry();
const replay = new ReplayWindow();
registry.register({
toolName: "git-log",
executable: "/usr/bin/git",
argsPatterns: ["^log$", "^--oneline$", "^-n$", "^\\d+$"],
sandboxProfile: "strict",
});
const result = await guardExec(
{
toolName: "git-log",
command: "/usr/bin/git",
args: ["log", "--oneline", "-n", "10"],
},
{ registry, replay },
);
console.log(result.stdout); // → commit lines
console.log(result.trustTier); // → "CRITICAL"
console.log(result.canonicalHash); // → 64-char SHA-256
mcp-shellguard-audit scan ./src
mcp-shellguard-audit scan ./src --format sarif --output audit.sarif
mcp-shellguard-audit scan ./src --severity-floor HIGH # CI gate
एग्ज़िट कोड:
0 साफ (फ्लोर के बराबर या उससे ऊपर कोई फाइंडिंग नहीं)1 फाइंडिंग मौजूद2 पार्स / IO त्रुटियांस्कैनर मिलान से पहले नाम-बदले गए child_process बाइंडिंग को हल करता है, इसलिए नीचे दिए गए खतरनाक रूप तब भी पकड़े जाते हैं जब कॉल शाब्दिक child_process.exec के बजाय किसी एलियास के माध्यम से जाती है:
const execAsync = promisify(exec); execAsync(...${x})import cp from "node:child_process"; cp.exec(...${x})const { exec: sh } = require("child_process"); sh(...${x})import { exec as run } from "node:child_process"; run(...)सिंक्रोनस वैरिएंट (spawnSync, execFileSync) अपने async नियम साझा करते हैं, और shell_true_option स्ट्रिंग शेल ({ shell: "/bin/sh" }) या डायनामिक शेल मान पर भी फायर होता है — न कि केवल शाब्दिक { shell: true } पर। किसी गैर-child_process फ़ंक्शन का promisify, किसी अन्य मॉड्यूल से डिस्ट्रक्चर, और { shell: false } साफ रहते हैं (कोई फॉल्स पॉज़िटिव नहीं)।
// shellguard:ignore-next-line — एक फाइंडिंग दबाएं// shellguard:ignore-file — पूरी फ़ाइल दबाएं (दुर्लभ; प्रति-पंक्ति पसंद करें)Ox-Security ने (2026-05) खुलासा किया कि 200k+ MCP stdio सर्वर child_process.exec को टेम्पलेट लिटरल के साथ लपेटते हैं, जो LLM टूल args से सीधे यूज़र इनपुट ले जाते हैं। LiteLLM v1.83.6 प्रमुख उदाहरण था (CVE 1.83.7 में पैच किया गया)। यह बंडल रक्षात्मक-सुरक्षा का समकक्ष है: एक ड्रॉप-इन गार्ड + स्कैनर जो इस वर्ग को बंद करता है। AWS Linux seccomp + Chromium सैंडबॉक्स टियर से प्रेरित।
HOOK_RECIPES.md — Claude Code हुक रेसिपी जो खतरनाक टूल कॉल को स्वतः ब्लॉक करती हैंCHANGELOG.md — रिलीज़ इतिहासMIT — Copyright (c) 2026 Matthias Meyer (StudioMeyer)
| टूल | प्रकार | उद्देश्य |
|---|
guard_exec | विनाशकारी | संरक्षित child_process.exec। args[] वेक्टर को बाध्य करता है, अनुमतिसूची + सैंडबॉक्स + रीप्ले। stdout, stderr, exitCode, canonicalHash, isReplay, trustTier लौटाता है। |
guard_spawn | विनाशकारी | संरक्षित child_process.spawn। पूर्ण बॉडी के बजाय stdout/stderr के SHA-256 हैश लौटाता है। shell:true को कड़ाई से अस्वीकार करता है। |
register_allowlist | परिवर्तनकारी | executable + args रेगेक्स के साथ एक टूल नाम पंजीकृत करें। पंजीकरण के बिना डिफ़ॉल्ट-अस्वीकार लागू होता है। |
audit_source | केवल-पढ़ने-योग्य | शेल-इंजेक्शन एंटी-पैटर्न के लिए TS/JS पथ स्कैन करें। AuditFinding[] + सारांश लौटाता है। |
audit_report | केवल-पढ़ने-योग्य | ऑडिट परिणाम को markdown / json / SARIF 2.1.0 के रूप में प्रारूपित करें। |
replay_check | केवल-पढ़ने-योग्य | किसी इनवोकेशन के लिए कैननिकल SHA-256 हैश की गणना करें और रिपोर्ट करें कि क्या यह पहले से रीप्ले विंडो में है। |
sandbox_status | केवल-पढ़ने-योग्य | सक्रिय सैंडबॉक्स प्रोफ़ाइल + ठोस सीमाएं + cgroup-v2 सक्रिय फ़्लैग रिपोर्ट करें। |
trust_tier | केवल-पढ़ने-योग्य | पंजीकृत टूल के लिए LOW/MEDIUM/HIGH/CRITICAL टियर प्राप्त करें, साथ ही सुधार संकेत। |
| प्रोफ़ाइल | टाइमआउट | अधिकतम stdout | अधिकतम stderr | FD बजट | cgroup-v2 |
|---|
strict | 5 s | 1 MB | 256 KB | 32 | हाँ (cpu/memory) |
standard (डिफ़ॉल्ट) | 30 s | 10 MB | 1 MB | 256 | हाँ |
permissive | 5 min | 100 MB | 10 MB | 1024 | नहीं |
| HIGH | argsPatterns सेट लेकिन सैंडबॉक्स या रीप्ले ट्रैकर निष्क्रिय |
| CRITICAL | argsPatterns + सैंडबॉक्स + रीप्ले सभी सक्रिय |
| ID | गंभीरता | किस पर ट्रिगर होता है |
|---|
exec_template_literal_with_input | CRITICAL | child_process.exec(\ls ${x}`)` |
exec_dynamic_string | CRITICAL | child_process.exec(cmd) |
exec_sync_dynamic_string | CRITICAL | child_process.execSync(cmd) |
eval_near_child_process | CRITICAL | eval(...) |
function_constructor_near_child_process | CRITICAL | new Function(...) |
spawn_dynamic_file_args | HIGH | spawn(bin, userArgs) |
exec_file_dynamic | HIGH | execFile(bin, ...) |
shell_true_option | HIGH | { shell: true } |
os_system_equivalent | HIGH | Deno.run / Bun.spawn |
spawn_literal_dynamic_args | MEDIUM | spawn('git', userArgs) |
unbounded_buffer | LOW | maxBuffer के बिना exec |
missing_timeout | LOW | timeout के बिना exec/spawn |