Skip to content

Latest commit

 

History

History
204 lines (154 loc) · 6.31 KB

File metadata and controls

204 lines (154 loc) · 6.31 KB

Pyodide Implementation Status

Issues: #50 (Python executor has NO sandbox), #59 (Pyodide WebAssembly sandbox solution) Status: Phase 1 & 2 Complete, Phase 3 Partially Complete Date: 2025-11-17


✅ COMPLETED WORK

Phase 1: Security Gate (COMPLETE)

Commit: f36cc9a - fix(security): add Python executor security gate

  • ✅ Added PYTHON_SANDBOX_READY environment variable check
  • ✅ Security warning stub registered when Python enabled but sandbox not ready
  • ✅ Clear error messages explain vulnerability and solution
  • ✅ Tool registration conditional on security flag
  • ✅ Verified with test script - warnings display correctly

Impact: Python executor now explicitly warns users of critical vulnerability

Phase 2: Pyodide Implementation (COMPLETE)

Commit: 01bb251 - feat(security): implement Pyodide WebAssembly sandbox

  • ✅ Created src/pyodide-executor.ts with full WebAssembly isolation
  • ✅ Global Pyodide cache (~10s first load, <100ms cached)
  • ✅ Two-phase execution pattern (inject tools → execute code)
  • ✅ MCP tool access: call_mcp_tool(), discover_mcp_tools(), get_tool_schema(), search_tools()
  • ✅ Timeout enforcement via Promise.race()
  • ✅ Proper error handling and cleanup
  • ✅ Updated src/index.ts to use Pyodide when PYTHON_SANDBOX_READY=true
  • ✅ TypeScript compilation passes
  • ✅ Build succeeds

Dependencies:

  • pyodide@0.26.4 installed
  • ~5MB download on first initialization

Security Boundaries:

  1. WebAssembly VM - no native syscalls
  2. Virtual FS - host filesystem completely isolated
  3. Network - only localhost MCP proxy with bearer auth
  4. MCP proxy - tool allowlist enforced
  5. Timeout - SIGKILL equivalent via promise rejection

Phase 3: Testing (PARTIAL)

Files Created:

  • tests/pyodide-security.test.ts - Comprehensive test suite (13 tests)

Test Coverage:

  • ✅ Basic execution tests
  • ✅ Timeout enforcement
  • ✅ Filesystem isolation (/etc/passwd, home directory, virtual FS)
  • ✅ Network isolation
  • ✅ Async/await support
  • ✅ Memory safety
  • ✅ Execution metadata

Known Limitation:Pyodide has incomplete Node.js support - Tests fail with "Cannot find module" errors

  • Pyodide is designed primarily for browsers
  • Node.js support requires additional polyfills (node-fetch, node-stdlib, etc.)
  • This is a known Pyodide limitation, not a bug in our implementation

⚠️ REMAINING WORK

Phase 3: Testing (Complete)

Priority: P1 - Required before production use

Option 1: Browser-Based Testing (Recommended)

  • Use Playwright or Puppeteer for browser-based tests
  • Pyodide works natively in browsers without polyfills
  • Most accurate representation of real-world usage

Option 2: Node.js Polyfills

  • Install Node.js polyfills for Pyodide
  • Requires: node-fetch, WHATWG URL, TextEncoder/TextDecoder
  • May have subtle differences from browser environment

Option 3: Integration Tests Only

  • Skip unit tests for Pyodide executor
  • Rely on manual testing + integration tests
  • Document manual test procedures

Phase 4: Documentation Updates

Priority: P2 - Important for user adoption

Files to Update:

  1. SECURITY.md

    • Add Pyodide security model section
    • Document WebAssembly isolation guarantees
    • Update vulnerability status (Python executor now safe with Pyodide)
  2. README.md

    • Add Pyodide usage instructions
    • Document PYTHON_SANDBOX_READY flag
    • Add Python execution examples
    • Note performance characteristics (~10s first load, <100ms cached)
  3. docs/architecture.md

    • Add Pyodide architecture section
    • Document two-phase execution pattern
    • Update component diagram
  4. CHANGELOG.md

    • Document breaking change (native Python → Pyodide)
    • Migration guide for users

Phase 5: Issue Closure

Priority: P1 - Communicate progress

Actions:

  1. Update issue #50 with resolution status
  2. Update issue #59 with implementation details
  3. Close both issues once testing is complete

🎯 PRODUCTION READINESS CHECKLIST

Before enabling PYTHON_SANDBOX_READY=true in production:

  • Testing completed (browser-based or Node.js polyfills)
  • Security review - Pyodide isolation verified
  • Performance benchmarks - First load time acceptable
  • Documentation updated - SECURITY.md, README.md, architecture.md
  • Migration guide - Users understand breaking changes
  • Error handling - Graceful fallback if Pyodide fails to load
  • Monitoring - Track Pyodide initialization failures
  • Issues closed - #50 and #59 marked resolved

📝 USAGE INSTRUCTIONS (Draft)

Enable Pyodide Sandbox

# Set environment variable
export PYTHON_SANDBOX_READY=true

# Enable Python in config
# .code-executor.json
{
  "executors": {
    "python": {
      "enabled": true
    }
  }
}

# Start server
npm run server

Example Python Code with MCP Tools

import asyncio

async def main():
    # Discover available tools
    tools = await discover_mcp_tools()
    print(f'Found {len(tools)} tools')

    # Call MCP tool
    result = await call_mcp_tool('mcp__filesystem__read_file', {
        'path': '/tmp/test.txt'
    })
    print(f'File content: {result}')

asyncio.run(main())

Security Guarantees

  • Filesystem isolation - Virtual FS only, no access to host files
  • Network isolation - Only localhost MCP proxy access (authenticated)
  • Process isolation - No subprocess spawning
  • Memory limits - Enforced by V8 heap (--max-old-space-size)
  • Timeout enforcement - SIGKILL after timeoutMs

Limitations

  • Pure Python only - No native C extensions (unless WASM-compiled)
  • 10-30% performance overhead vs native Python
  • No multiprocessing/threading - Use async/await instead
  • 4GB memory limit - WASM 32-bit addressing
  • First load delay - ~10s to download and initialize Pyodide (~5MB)

🔗 REFERENCES


Next Steps: Choose testing strategy (browser-based recommended), complete test suite, update documentation, close issues.