Platform Comparison Matrix

April 3, 2026 · View on GitHub

macOS ESF+NE is Alpha. The feature matrix below reflects design-target capabilities. The ESF+NE column is functional end-to-end but not yet production-ready.

This document provides a comprehensive comparison of agentsh capabilities across all supported platforms.

Feature Support Matrix

Note on macOS Lima: The "macOS Lima" column applies to both deployment modes. When running agentsh inside the Lima VM, you get 100% Linux-equivalent security. When running agentsh on macOS orchestrating the Lima VM, you get 85% due to VM boundary overhead. See Lima Deployment Modes for details.

FeatureLinuxmacOS ESF+NEmacOS LimaWin NativeWin WSL2
Filesystem Interception
ImplementationFUSE3Endpoint SecurityFUSE3Mini Filter + WinFspFUSE3
File read monitoringBlockBlockBlockBlockBlock
File write monitoringBlockBlockBlockBlockBlock
File create/deleteBlockBlockBlockBlockBlock
File policy enforcementYesYesYesYesYes
File event emissionYesYesYesYesYes
Network Interception
ImplementationiptablesNetwork ExtensionpfiptablesWinDivert
TCP interceptionBlockBlockBlockBlockBlock
UDP interceptionBlockBlockBlockBlockBlock
DNS interceptionBlockBlockBlockBlockBlock
TLS inspectionYesYesYesYesYes
Per-app filteringNoYesNoNoNo
Synchronous Interception
File operations holdYesYesYesYesYes
Network operations holdYesYesYesYesYes
DNS holdYesYesYesYesYes
Env var holdYesSpawnPartialYesPartial
Registry holdN/AN/AN/AN/AYes
File redirectYesYesYesYesYes
Network redirectYesYesYesYesYes
DNS redirectYesYesYesYesYes
Env var redirectYesSpawnPartialYesPartial
Registry redirectN/AN/AN/AN/AYes
Manual approvalYesYesYesYesYes
Environment Variable Protection
Spawn-time filteringYesYesYesYesYes
Runtime interceptionLD_PRELOADNoDYLD*LD_PRELOADDetours
env_read eventsYesSpawnPartialYesPartial
env_list eventsYesSpawnPartialYesPartial
env_write eventsYesSpawnPartialYesPartial
environ blockingYesYesNon-SIPYesPartial
Process Isolation
Mount namespaceYesNoNoYesNo
Network namespaceYesNoNoYesNo
PID namespaceYesNoNoYesNo
User namespaceYesNoNoYesNo
AppContainerN/AN/AN/AN/APartial
sandbox-exec (SBPL)N/AYesYesN/AN/A
Syscall Filtering
seccomp-bpfYesNoNoYesNo
ptrace execve interceptionYesNoNoYesNo
Process exec blockingYesYesNoYesNo
Syscall allowlistYesNoNoYesNo
Signal Interception
ImplementationseccompES auditES auditseccompETW audit
Signal blockingYesAuditAuditYesAudit
Signal redirectYesNoNoYesNo
Signal auditYesYesYesYesYes
Resource Limits
CPU limitYesNoNoYesJob
Memory limitYesNoNoYesJob
Disk I/O limitYesNoNoYesNo
Network BW limitYesNoNoYesNo
Process countYesNoNoYesJob
Process Execution Stats
CPU user timeYesYesYesYesYes
CPU system timeYesYesYesYesYes
Peak memoryYesYesYesYesNo
Platform-Specific
XPC/Mach IPC controlN/AYesYesN/AN/A
Registry monitoringN/AN/AN/AN/AYes
Registry blockingN/AN/AN/AN/AYes
Kernel eventseBPFESFNoeBPFNo
Requirements
Special permissionsrootESF approval + NE entitlementsroot + brewLima VMAdmin
Installation complexityLowMedium (ESF needs Apple approval)LowMediumMedium

Security Score Comparison

PlatformScoreFile BlockNet BlockSignalIsolationSyscall FilterResources
Linux Native100%YesYesBlockFullYesFull
Linux (ptrace mode)95%YesYesRedirectPartialFullFull
Windows WSL2100%YesYesBlockFullYesFull
macOS ESF+NE90%YesYesAuditMinimalExec onlyNone
macOS + Lima (inside VM)100%YesYesBlockFullYesFull
macOS + Lima (orchestrated)85%YesYesBlockFullYesFull
macOS (observation)25%ObservationNoNoNoneNoNone
Windows Native85%YesYesAuditPartialNoPartial

Security Feature Coverage

Platform               File    Network  Signal   Isolation  Syscall  Resources  Score
──────────────────────────────────────────────────────────────────────────────────────

Linux Native          ████████████████████████████████████████████████████████  100%
                      File✓   Net✓    Sig✓    Iso✓      Sys✓     Res✓

Linux (ptrace mode)   ██████████████████████████████████████████████████████░░░░   95%
                      File✓   Net✓    Sig✓    Iso⚠      Sys✓     Res✓
                      (Restricted containers: AWS Fargate, Docker with SYS_PTRACE)
                      (Full file/net/signal enforcement via ptrace; no FUSE redirect)

Windows WSL2          ████████████████████████████████████████████████████████  100%
                      File✓   Net✓    Sig✓    Iso✓      Sys✓     Res✓

macOS ESF+NE          ████████████████████████████████████████████░░░░░░░░░░░░   90%
                      File✓   Net✓    Sig⚠    Iso⚠      Sys⚠     Res✗
                      (Alpha — system extension required)

macOS + Lima (in VM)  ████████████████████████████████████████████████████████  100%
                      File✓   Net✓    Sig✓    Iso✓      Sys✓     Res✓
                      (Run agentsh inside Lima VM = native Linux)

macOS + Lima (orch)   ██████████████████████████████████████████░░░░░░░░░░░░░░   85%
                      File✓   Net✓    Sig✓    Iso✓      Sys✓     Res✓
                      (agentsh on macOS orchestrating Lima VM)

macOS (observation)   ██████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   25%
                      File⚠   Net✗    Sig✗    Iso✗      Sys✗     Res✗
                      (FSEvents observation only, no enforcement)

Windows Native        ██████████████████████████████████████████░░░░░░░░░░░░░░   85%
                      File✓   Net✓    Sig⚠    Iso⚠      Sys✗     Res⚠
                      (Mini Filter + WinDivert + Registry blocking + AppContainer sandbox)

Legend: ✓ = Full support (Block+Audit)  ⚠ = Partial support (Audit only)  ✗ = Not supported

Performance Impact

File Operations

MechanismOverheadLatency AddedThroughput ImpactNotes
FUSE3 (Linux)Low5-20µs3-8%Kernel-userspace context switch
ESF (macOS)Very Low1-5µs<2%In-kernel, no context switch for observe
ESF (macOS)Very Low1-5µs<2%In-kernel, no context switch for observe
Mini Filter (Windows)Very Low1-5µs<3%In-kernel, no userspace IPC for cached
WinFsp (Windows)Low10-50µs5-15%Kernel-userspace via FUSE protocol
Lima VMMedium20-100µs15-30%VM boundary + 9p/virtiofs
File I/O Overhead Comparison (relative to native)

Sequential Read (large files):
Native          ████████████████████████████████████████  100% baseline
FUSE3           ████████████████████████████████████░░░░   92%
ESF             ████████████████████████████████████████   98%
MiniFilter      ████████████████████████████████████████   98%
WinFsp          ████████████████████████████████████░░░░   90%
Lima/virtiofs   ████████████████████████████░░░░░░░░░░░░   70%

Random I/O (many small files):
Native          ████████████████████████████████████████  100% baseline
FUSE3           ████████████████████████████████░░░░░░░░   85%
ESF             ████████████████████████████████████████   99%
MiniFilter      ████████████████████████████████████████   97%
WinFsp          ████████████████████████████████░░░░░░░░   85%
Lima/virtiofs   ██████████████████████████░░░░░░░░░░░░░░   65%

Network Operations

MechanismOverheadLatency AddedConnection OverheadNotes
iptables + proxyLow0.1-1msPer-connectionSingle hop through localhost
Network ExtensionVery Low0.05-0.2msPer-packet capableIn-kernel packet processing
pf + proxyLow0.1-1msPer-connectionSimilar to iptables
WinDivertLow0.1-0.5msPer-packetKernel-mode redirection

Environment Variable Operations

MechanismOverheadLatency AddedNotes
Spawn-time filteringNone at runtime1-5ms at spawnOne-time cost per process
LD_PRELOAD syncMedium50-500µsIPC to daemon per getenv()
LD_PRELOAD cachedVery Low1-5µsPolicy cached in shim
Detours (Windows)Low10-50µsIn-process hook

Synchronous Hold Impact

Hold TypeTypical LatencyImpact
Policy lookup (cached)1-10µsNegligible
Policy lookup (IPC)50-200µsLow, acceptable
Redirect (file)Same as normal I/ONone beyond redirect target
Redirect (network)+0.1-1msConnection setup to new target
Manual approval1s - 5minProcess blocked - use timeouts

Performance Recommendations by Workload

WorkloadRecommended ConfigExpected Overhead
CI/CD buildsFUSE3 + iptables, no TLS inspection5-10%
DevelopmentESF+NE (macOS) or FUSE3 (Linux)2-10%
AI agent tasksFull interception, TLS inspection15-25%
Data processingLima with virtiofs batch mode15-30%
Security-criticalESF + NE (macOS) or full Linux2-10%

Platform Selection Guide

                    ┌─────────────────────────────┐
                    │  What's your primary OS?    │
                    └──────────────┬──────────────┘

         ┌─────────────────────────┼─────────────────────────┐
         │                         │                         │
         ▼                         ▼                         ▼
   ┌───────────┐             ┌───────────┐             ┌───────────┐
   │   Linux   │             │   macOS   │             │  Windows  │
   └─────┬─────┘             └─────┬─────┘             └─────┬─────┘
         │                         │                         │
         ▼                         ▼                         ▼
┌─────────────────┐    ┌─────────────────────┐    ┌─────────────────────┐
│  Linux Native   │    │ Need full isolation │    │  Need registry      │
│                 │    │ & resource limits?  │    │  monitoring?        │
│  100% - Best    │    └──────────┬──────────┘    └──────────┬──────────┘
└─────────────────┘          Yes  │  No                 Yes  │  No
                                  │                          │
                                  ▼                          ▼
                    ┌─────────────────────┐    ┌─────────────────────┐
                    │  Lima VM - choose:  │    │   Windows Native    │
                    │                     │    │   75% + Registry    │
                    │  Inside VM: 100%    │    │   + WinDivert       │
                    │  (recommended)      │    └─────────────────────┘
                    │                     │
                    │  Orchestrated: 85%  │    ┌─────────────────────┐
                    │  (macOS-native CLI) │    │   Windows WSL2      │
                    └─────────────────────┘    │   100% - Full       │
                                  │            │   Linux             │
                                  │            └─────────────────────┘
                                  │ If Lima not acceptable

                    ┌─────────────────────┐
                                  │ If Lima not acceptable

                    ┌─────────────────────┐
                    │   macOS ESF+NE      │
                    │   90% - Alpha       │
                    │   brew install      │
                    │   --cask agentsh    │
                    └─────────────────────┘
Use CaseRecommended PlatformSecurityNotes
Production - Maximum SecurityLinux Native100%Full isolation, all features
Production - AWS FargateLinux (ptrace mode)95%Full enforcement with steering via ptrace + E2E tested on Fargate
Production - Windows ServerWindows WSL2100%Full Linux security in VM
Production - macOSmacOS + Lima (inside VM)100%Run agentsh inside Lima = native Linux
Enterprise Security ProductmacOS ESF+NE90%Alpha — install via Homebrew cask
Development - macOSmacOS ESF+NE90%Alpha — brew install --cask agentsh
Development - WindowsWindows Native75%Registry monitoring + WinDivert network
CI/CD PipelineLinux Native100%Containers supported
Air-gapped/OfflineLinux Native100%No external dependencies

Windows-Specific Features

FeatureNativeWSL2Notes
Registry Monitoring
Read monitoringYesN/AVia RegNotifyChangeKeyValue
Write monitoringYesN/AVia RegNotifyChangeKeyValue
Create key monitoringYesN/AVia RegNotifyChangeKeyValue
Delete key monitoringYesN/AVia RegNotifyChangeKeyValue
Registry blockingYesN/AVia CmRegisterCallbackEx in mini filter driver
High-Risk Path Alerts
Run keys (persistence)YesN/AHKLM/HKCU Run, RunOnce
ServicesYesN/AHKLM\SYSTEM\Services
WinlogonYesN/AShell, Userinit hijacking
Image File Exec OptionsYesN/ADebugger hijacking
COM objectsYesN/ACLSID hijacking
Windows DefenderYesN/APolicy modifications
LSA settingsYesN/ACredential access

Windows Sandbox Configuration

ConfigurationSecurityPerformanceUse Case
AppContainer + MinifilterMaximum~5-10ms startupAI agent execution (full output capture)
AppContainer onlyHigh~3-5ms startupIsolated dev environment
Minifilter onlyMedium<1ms startupPolicy enforcement only
NeitherNoneBaselineLegacy/unsandboxed

AppContainer Features:

  • Process execution inside isolated container
  • Full stdout/stderr capture from sandboxed commands
  • Automatic ACL cleanup on sandbox termination
  • Configurable network access (none/outbound/local/full)

Configuration Example

sandbox:
  windows:
    use_app_container: true   # Default: true
    use_minifilter: true      # Default: true
    network_access: none      # none, outbound, local, full
    fail_on_error: true       # Default: true

macOS Configuration Options

ConfigurationFile InterceptionNetworkIsolationEase of SetupSecurity
ESF + NEEndpoint SecurityNetwork ExtensionMinimal (sandbox-exec)Easy (brew install --cask)90%
Lima VM (inside)FUSE3 in VMiptables in VMFullMedium100%
Lima VM (orchestrated)FUSE3 in VMiptables in VMFullMedium85%
ObservationFSEvents (observe)pcap (observe)NoneNone required25%

When to use each:

  • ESF + NE (Alpha): Development and production on macOS — install via brew install --cask agentsh
  • Lima VM (inside): Production on macOS - run agentsh inside VM for full Linux security
  • Lima VM (orchestrated): When you need macOS-native CLI experience with Lima backend
  • Observation: Quick testing, observation-only use cases

Lima Deployment Modes

Lima provides two deployment modes for macOS users who need full Linux isolation:

ModeSecurityDescription
Inside VM100%Run agentsh + AI agent inside Lima VM. Identical to native Linux.
Orchestrated85%Run agentsh on macOS, use Lima as execution sandbox via limactl shell.

Recommendation: Use Inside-VM mode for production. It's simpler (no special platform code needed) and provides full Linux-equivalent security.

See Known Limitations - macOS + Lima for detailed comparison.

Known Limitations by Platform

Linux Native

  • No significant limitations
  • Requires root or CAP_SYS_ADMIN for namespaces
  • eBPF requires kernel 5.x+ for full features
  • Signal interception: Full blocking and redirect via seccomp user-notify
  • ptrace mode: Available in restricted containers (e.g. AWS Fargate) with SYS_PTRACE capability; provides full syscall enforcement with steering (exec/file/network redirect, DNS redirect, SNI rewrite, TracerPid masking). E2E tested on Fargate with CI integration.

macOS ESF+NE (Alpha)

  • Alpha status - functional end-to-end but expect rough edges and breaking changes
  • No process isolation - macOS has no namespace equivalent
  • No resource limits - no cgroups equivalent (cannot enforce limits)
  • Resource monitoring available - native Mach API monitoring for memory, CPU, and thread count
  • No syscall filtering - except exec blocking via ESF
  • Signal interception: Audit only via Endpoint Security; cannot block or redirect signals
  • Install via brew tap canyonroad/tap && brew install --cask agentsh

macOS + Lima

Lima provides two deployment modes with different trade-offs:

Run agentsh and the AI agent harness entirely inside the Lima VM:

┌─────────────────────────────────────┐
│         macOS Host                  │
│  ┌─────────────────────────────┐   │
│  │      Lima VM (Linux)        │   │
│  │  ┌───────────────────────┐  │   │
│  │  │   agentsh (Linux)     │  │   │
│  │  │   + AI Agent harness  │  │   │
│  │  └───────────────────────┘  │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

This is identical to native Linux - you get:

  • Full FUSE3 filesystem interception
  • Full iptables network interception
  • Full Linux namespace isolation
  • Full seccomp-bpf syscall filtering
  • Full cgroups v2 resource limits

Trade-offs:

  • File I/O to macOS filesystem goes through virtiofs (15-30% overhead)
  • VM uses ~200-500MB RAM
  • Must SSH/shell into VM to interact

This is the simplest approach - no special Lima platform code needed, just use the standard Linux platform implementation.

Orchestrated Mode (85% Security Score)

Run agentsh on macOS, using Lima as a remote execution sandbox:

┌─────────────────────────────────────┐
│         macOS Host                  │
│  ┌─────────────────────────────┐   │
│  │   agentsh (macOS binary)   │   │
│  └───────────┬─────────────────┘   │
│              │ limactl shell       │
│  ┌───────────▼─────────────────┐   │
│  │      Lima VM (Linux)        │   │
│  │   (execution sandbox)       │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

This mode uses internal/platform/lima/ to orchestrate commands inside the VM.

Trade-offs:

  • Additional latency from limactl shell IPC
  • Path translation between macOS and Lima
  • More complex architecture
  • Useful when you need macOS-native agentsh CLI experience

Lima Implementation Details (Both Modes)

Inside the VM, both modes use standard Linux primitives:

  • Resource limits: cgroups v2 at /sys/fs/cgroup/agentsh/<name>
    • CPU: cpu.max (quota/period in microseconds)
    • Memory: memory.max (bytes)
    • Processes: pids.max
    • Disk I/O: io.max (rbps/wbps per device)
  • Network interception: iptables DNAT via AGENTSH chain
    • TCP redirect to proxy (excludes localhost)
    • UDP port 53 redirect to DNS proxy
  • Filesystem mounting: bindfs passthrough mount inside VM
    • Source directory bound to mount point via bindfs
    • Automatic bindfs installation if not present
    • Unmount via fusermount -u with umount fallback
  • Process isolation: Linux namespaces via unshare
    • Full: user, mount, UTS, IPC, network, PID namespaces
    • Partial: mount, UTS, IPC, PID (when user namespace unavailable)
    • Flags: --fork, --mount-proc, --map-root-user
  • Syscall filtering: seccomp-bpf available in VM
  • Signal interception: Full blocking and redirect via seccomp

Windows Native

  • Partial isolation - AppContainer provides file/registry isolation but not full namespace isolation
  • No syscall filtering - no seccomp equivalent
  • No disk I/O limits - Job Objects don't support this
  • No network bandwidth limits - Job Objects don't support this
  • Resource monitoring available - memory, CPU, disk I/O, process count, and thread count via Job Objects and Toolhelp32
  • No peak memory in exec results - Windows Rusage doesn't include Maxrss; would require GetProcessMemoryInfo before process exits
  • WinDivert requires admin - Administrator privileges needed for network interception
  • Driver requires signing - Mini filter driver requires test signing (dev) or EV signing (production)
  • Signal interception: Audit only via ETW; cannot block or redirect signals
  • Uses kernel-mode mini filter driver for filesystem and registry interception
  • Configurable fail modes (fail-open/fail-closed) for production reliability
  • See Windows Driver Deployment Guide for details

Windows WSL2

  • Slight overhead from VM layer
  • Network goes through Windows NAT
  • File I/O to Windows drives slower than native
  • Some Windows integration edge cases
  • No registry monitoring - WSL2 runs Linux, Windows registry not accessible
  • Signal interception: Full blocking and redirect via seccomp in Linux VM

WSL2 Implementation Details:

  • Resource limits: cgroups v2 at /sys/fs/cgroup/agentsh/<name>
    • CPU: cpu.max (quota/period in microseconds)
    • Memory: memory.max (bytes)
    • Processes: pids.max
    • Disk I/O: io.max (rbps/wbps per device)
  • Network interception: iptables DNAT via AGENTSH chain
    • TCP redirect to proxy (excludes localhost)
    • UDP port 53 redirect to DNS proxy
  • Filesystem mounting: bindfs passthrough mount inside VM
    • Windows paths translated to WSL paths (C:\.../mnt/c/...)
    • Source directory bound to mount point via bindfs
    • Automatic bindfs installation if not present
    • Unmount via fusermount -u with umount fallback
  • Process isolation: Linux namespaces via unshare
    • Full: user, mount, UTS, IPC, network, PID namespaces
    • Partial: mount, UTS, IPC, PID (when user namespace unavailable)
    • Flags: --fork, --mount-proc, --map-root-user
  • Syscall filtering: seccomp-bpf available in VM

Installation Quick Reference

PlatformCommandRequirements
Linuxcurl -fsSL https://get.agentsh.dev | bashroot for full features
macOS ESF+NEbrew tap canyonroad/tap && brew install --cask agentshApprove sysext in System Settings
macOS Limabrew install lima && limactl start agentshLima VM
Windows Nativesc create agentsh type=filesysAdmin, test signing (dev) or EV cert (prod)
Windows WSL2wsl --install -d Ubuntu && ...WSL2 enabled

See macOS Build Guide for detailed macOS build instructions.

Optimization Configuration

# agentsh.yaml - Performance-optimized configuration

performance:
  # Cache policy decisions
  policy_cache:
    enabled: true
    ttl_seconds: 300
    max_entries: 10000

  # Batch event emission
  event_batching:
    enabled: true
    batch_size: 100
    flush_interval_ms: 100

  # Async logging (don't block operations)
  async_logging:
    enabled: true
    buffer_size: 10000

  # Skip interception for known-safe paths
  bypass_paths:
    - "/usr/lib/*"
    - "/lib/*"
    - "*.so"
    - "*.pyc"

  # Skip interception for known-safe hosts
  bypass_hosts:
    - "127.0.0.1"
    - "localhost"
    - "*.internal.company.com"

  # Reduce syscall overhead
  fuse:
    kernel_cache: true
    batch_forget: true
    max_readahead_kb: 1024