Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
mcp-stdio-shellguard — Defense-in-depth bundle for MCP stdio servers: drop-in guardExec/guardSpawn wrappers, AST audit CLI, reference MCP server. Closes the Ox-Security 200k-server stdio-RCE class (LiteLLM CVE-2025-69256). MIT, TypeScript, Node >= 20. | Kitploit
Tools/GitHubGitHub/studiomeyer-io/mcp-stdio-shellguard
Static AnalysisVulnerability ScannersCode AnalysisScripting & AutomationDevSecOpsUtilities & FrameworksSupply Chain SecurityAPI Security
GitHub
studiomeyer-io/mcp-stdio-shellguard

mcp-stdio-shellguard

Defense-in-depth bundle for MCP stdio servers: drop-in guardExec/guardSpawn wrappers, AST audit CLI, reference MCP server. Closes the Ox-Security 200k-server stdio-RCE class (LiteLLM CVE-2025-69256). MIT, TypeScript, Node >= 20.

View Repository
519h 23m agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Part of the StudioMeyer MCP Stack — Built in Mallorca 🌴 · ⭐ if you use it

mcp-stdio-shellguard

npm version npm downloads License Last commit GitHub stars

Defense-in-depth bundle for MCP stdio servers. Wraps `child_process.exec/spawn`

with allowlist + sandbox + replay-detection, plus an AST audit CLI (mcp-shellguard-audit) that scans MCP server sources for unsanitized shell calls. Closes the Ox-Security MCP stdio-RCE class (200k vulnerable servers, May 2026 disclosure).

  • MCP spec: 2025-06-18
  • SDK: ^1.29.0
@modelcontextprotocol/sdk
  • Node: >= 20
  • License: MIT
  • Author: Matthias Meyer (StudioMeyer)
  • Install

    root@kitploit:~
    npm install mcp-stdio-shellguard
    

    Or run the audit CLI directly without installing:

    root@kitploit:~
    npx -y -p mcp-stdio-shellguard mcp-shellguard-audit scan ./src
    

    What it gives you

    Three layers, opt-in piecewise:

    1. Library API — drop-in guardExec / guardSpawn you call from your own MCP server. Default-deny allowlist, sandbox profiles, replay window.
    2. Audit CLI — mcp-shellguard-audit scan <path> walks the AST, reports 12 anti-patterns from LOW (no timeout) to CRITICAL (exec(\...${userInput}...`)`).
    3. Reference MCP server — mcp-stdio-shellguard-demo exposes 8 tools so the MCP Inspector / Claude Desktop can drive the bundle directly.

    Tools (reference server)

    ToolTypePurpose
    guard_execdestructiveDefended child_process.exec. Forces args[] vector, allowlist + sandbox + replay. Returns stdout, stderr, exitCode, canonicalHash, isReplay, trustTier.
    guard_spawndestructiveDefended child_process.spawn. Returns SHA-256 hashes of stdout/stderr instead of full bodies. Hard-rejects shell:true.
    register_allowlistmutatingRegister a tool name with executable + args regex. Without registration the default-deny applies.
    audit_sourceread-onlyScan a TS/JS path for shell-injection anti-patterns. Returns AuditFinding[] + summary.
    audit_reportread-onlyFormat an audit result as markdown / json / SARIF 2.1.0.
    replay_checkread-onlyCompute canonical SHA-256 hash for an invocation and report whether it's already in the replay window.
    sandbox_statusread-onlyReport active sandbox profile + concrete limits + cgroup-v2 active flag.
    trust_tierread-onlyDerive LOW/MEDIUM/HIGH/CRITICAL tier for a registered tool plus improvement hints.

    Sandbox profiles

    ProfileTimeoutMax stdoutMax stderrFD budgetcgroup-v2
    strict5 s1 MB256 KB32yes (cpu/memory)
    standard (default)30 s10 MB1 MB256yes
    permissive5 min100 MB10 MB1024no

    Caller can tighten via timeoutMs / fdBudget per call. Caller cannot widen beyond the profile.

    Trust tiers

    TierCondition
    LOWtool not registered (default-deny)
    MEDIUMregistered but argsPatterns empty (any args allowed)
    HIGHargsPatterns set but sandbox or replay tracker inactive
    CRITICALargsPatterns + sandbox + replay all active

    Lift LOW → CRITICAL by registering the tool + setting argsPatterns + running through guardExec/guardSpawn (which always activate sandbox + replay).

    Library quickstart

    root@kitploit:~
    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
    

    Audit CLI

    root@kitploit:~
    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
    

    Exit codes:

    • 0 clean (no findings at-or-above floor)
    • 1 findings present
    • 2 parse / IO errors

    Anti-pattern library (12 rules)

    IDSeverityTriggers on
    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_bufferLOWexec without maxBuffer
    missing_timeoutLOWexec/spawn without timeout

    The scanner resolves renamed child_process bindings before matching, so the dangerous shapes below are caught even when the call goes through an alias rather than a literal 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(...)

    Synchronous variants (spawnSync, execFileSync) share their async rules, and shell_true_option also fires on a string shell ({ shell: "/bin/sh" }) or a dynamic shell value — not just the literal { shell: true }. A promisify of a non-child_process function, a destructure off another module, and { shell: false } stay clean (no false positives).

    Pragmas

    • // shellguard:ignore-next-line — suppress one finding
    • // shellguard:ignore-file — suppress whole file (rare; prefer per-line)

    Why this exists

    Ox-Security disclosed (2026-05) that 200k+ MCP stdio servers wrap child_process.exec with template literals carrying user input straight from LLM tool args. LiteLLM v1.83.6 was the canonical example (CVE patched in 1.83.7). This bundle is the defensive-security counterpart: a drop-in guard + scanner that closes the class. Inspired by AWS Linux seccomp + Chromium sandbox tiers.

    See also

    • HOOK_RECIPES.md — Claude Code hook recipes that auto-block dangerous tool calls
    • CHANGELOG.md — release history
    • Ox-Security MCP audit: https://venturebeat.com/security/200000-mcp-stdio-servers/
    • LiteLLM CVE-2026-XXXX: https://github.com/BerriAI/litellm/security/advisories

    License

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

    Download Tool