
mcp-stdio-shellguard v0.1.2
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 🌴 में निर्मित · ⭐ अगर आप इसका उपयोग करते हैं
mcp-stdio-shellguard
MCP stdio सर्वरों के लिए defense-in-depth बंडल। `child_process.exec/spawn` को अनुमतिसूची + सैंडबॉक्स + रीप्ले-डिटेक्शन के साथ लपेटता है, साथ ही एक AST ऑडिट CLI (`mcp-shellguard-audit`) जो MCP सर्वर स्रोतों को बिना सैनिटाइज़ किए शेल कॉल के लिए स्कैन करता है। यह Ox-Security MCP stdio-RCE वर्ग को बंद करता है (200k भेद्य सर्वर, मई 2026 खुलासा)।- MCP spec: 2025-06-18
- SDK:
@modelcontextprotocol/sdk^1.29.0 - Node: >= 20
- लाइसेंस: MIT
- लेखक: Matthias Meyer (StudioMeyer)
इंस्टॉल
npm install mcp-stdio-shellguard
या बिना इंस्टॉल किए ऑडिट CLI को सीधे चलाएं:
npx -y -p mcp-stdio-shellguard mcp-shellguard-audit scan ./src
यह आपको क्या देता है
तीन परतें, जिन्हें अलग-अलग ऑप्ट-इन किया जा सकता है:
- लाइब्रेरी API — ड्रॉप-इन
guardExec/guardSpawn, जिन्हें आप अपने स्वयं के MCP सर्वर से कॉल करते हैं। डिफ़ॉल्ट-अस्वीकार अनुमतिसूची, सैंडबॉक्स प्रोफ़ाइल, रीप्ले विंडो। - ऑडिट CLI —
mcp-shellguard-audit scan <path>AST को स्कैन करता है, LOW (no timeout) से CRITICAL (exec(\...${userInput}...`)`) तक 12 एंटी-पैटर्न रिपोर्ट करता है। - रेफरेंस MCP सर्वर —
mcp-stdio-shellguard-demo8 टूल उपलब्ध कराता है ताकि MCP Inspector / Claude Desktop बंडल को सीधे चला सकें।
टूल (रेफरेंस सर्वर)
| टूल | प्रकार | उद्देश्य |
|---|---|---|
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 | नहीं |
कॉल करने वाला प्रति कॉल timeoutMs / fdBudget के माध्यम से सीमाएं कड़ी कर सकता है। कॉल करने वाला प्रोफ़ाइल से आगे सीमाएं बढ़ा नहीं सकता।
ट्रस्ट टियर
| टियर | शर्त |
|---|---|
| LOW | टूल पंजीकृत नहीं (डिफ़ॉल्ट-अस्वीकार) |
| MEDIUM | पंजीकृत लेकिन argsPatterns खाली (कोई भी args अनुमत) |
| HIGH | argsPatterns सेट लेकिन सैंडबॉक्स या रीप्ले ट्रैकर निष्क्रिय |
| CRITICAL | argsPatterns + सैंडबॉक्स + रीप्ले सभी सक्रिय |
टूल पंजीकृत करके + 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
ऑडिट CLI
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 त्रुटियां
एंटी-पैटर्न लाइब्रेरी (12 नियम)
| 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 |
स्कैनर मिलान से पहले नाम-बदले गए 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— रिलीज़ इतिहास- Ox-Security MCP ऑडिट: https://venturebeat.com/security/200000-mcp-stdio-servers/
- LiteLLM CVE-2026-XXXX: https://github.com/BerriAI/litellm/security/advisories
लाइसेंस
MIT — Copyright (c) 2026 Matthias Meyer (StudioMeyer)