अपडेट पर वापस जाएँ
New releaseAug 21, 2026

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

npm version npm downloads License Last commit GitHub stars

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

यह आपको क्या देता है

तीन परतें, जिन्हें अलग-अलग ऑप्ट-इन किया जा सकता है:

  1. लाइब्रेरी API — ड्रॉप-इन guardExec / guardSpawn, जिन्हें आप अपने स्वयं के MCP सर्वर से कॉल करते हैं। डिफ़ॉल्ट-अस्वीकार अनुमतिसूची, सैंडबॉक्स प्रोफ़ाइल, रीप्ले विंडो।
  2. ऑडिट CLImcp-shellguard-audit scan <path> AST को स्कैन करता है, LOW (no timeout) से CRITICAL (exec(\...${userInput}...`)`) तक 12 एंटी-पैटर्न रिपोर्ट करता है।
  3. रेफरेंस MCP सर्वरmcp-stdio-shellguard-demo 8 टूल उपलब्ध कराता है ताकि 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अधिकतम stderrFD बजटcgroup-v2
strict5 s1 MB256 KB32हाँ (cpu/memory)
standard (डिफ़ॉल्ट)30 s10 MB1 MB256हाँ
permissive5 min100 MB10 MB1024नहीं

कॉल करने वाला प्रति कॉल timeoutMs / fdBudget के माध्यम से सीमाएं कड़ी कर सकता है। कॉल करने वाला प्रोफ़ाइल से आगे सीमाएं बढ़ा नहीं सकता।

ट्रस्ट टियर

टियरशर्त
LOWटूल पंजीकृत नहीं (डिफ़ॉल्ट-अस्वीकार)
MEDIUMपंजीकृत लेकिन argsPatterns खाली (कोई भी args अनुमत)
HIGHargsPatterns सेट लेकिन सैंडबॉक्स या रीप्ले ट्रैकर निष्क्रिय
CRITICALargsPatterns + सैंडबॉक्स + रीप्ले सभी सक्रिय

टूल पंजीकृत करके + 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_inputCRITICALchild_process.exec(\ls ${x}`)`
exec_dynamic_stringCRITICALchild_process.exec(cmd)
exec_sync_dynamic_stringCRITICALchild_process.execSync(cmd)
eval_near_child_processCRITICALeval(...)
function_constructor_near_child_processCRITICALnew Function(...)
spawn_dynamic_file_argsHIGHspawn(bin, userArgs)
exec_file_dynamicHIGHexecFile(bin, ...)
shell_true_optionHIGH{ shell: true }
os_system_equivalentHIGHDeno.run / Bun.spawn
spawn_literal_dynamic_argsMEDIUMspawn('git', userArgs)
unbounded_bufferLOWmaxBuffer के बिना exec
missing_timeoutLOWtimeout के बिना 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 सैंडबॉक्स टियर से प्रेरित।

यह भी देखें

लाइसेंस

MIT — Copyright (c) 2026 Matthias Meyer (StudioMeyer)

श्रेणियाँ