Skip to content

Sandbox & Trust Tiers

TapPass supports two sandbox backends for execution isolation:

BackendEngineIsolationPolicy reloadBest for
nono (default)nono-pyKernel (Landlock/Seatbelt)Tighten only (irreversible)Dev machines, lightweight
OpenShellNVIDIA OpenShellContainer (K3s/Docker)Hot-reload network/inferenceCI/CD, enterprise, multi-agent

Both backends enforce the same TapPass policy — the CISO picks the backend.

from tappass import Agent
agent = Agent("http://tappass:9620")
agent.secure() # locks down the process

After secure():

  • Filesystem: only workspace (read/write), cwd (read-only)
  • Credentials: ~/.ssh, ~/.aws, etc. are blocked
  • Commands: rm, dd, chmod, sudo, etc. are blocked
  • Network: only localhost (TapPass). external blocked

Trust tiers provide progressive permissions. New agents start restricted and earn access over time.

agent.secure(tier="worker") # safe commands, workspace only
agent.secure(tier="standard") # most commands, system reads
agent.secure(tier="observer") # read-only, no shell, no network
TierFilesystemCommandsNetworkUse case
observerRead workspace onlyNoneNoneMonitoring, read-only analysis
workerRead/write workspaceSafe list only (ls, cat, git, python3, …)Fetch only (GET)Code generation, file processing
standardWorkspace + system readsMost commandsFullGeneral-purpose agents
fullEverything (audit only)EverythingEverythingTrusted agents with high trust scores

Agents can earn higher tiers based on trust score, clean invocations, and violation history:

from tappass.sandbox import TrustGuardian
guardian = TrustGuardian(tier="worker")
result = guardian.evaluate_auto_escalation(
trust_score=600, # from TrustEngine (0–1000)
clean_invocations=300, # pipeline runs with no violations
violations=1, # recent violations
)
# {'eligible': True, 'recommended_tier': 'standard', ...}
CurrentTargetMin scoreMin cleanMax violations
observerworker300500
workerstandard5002002
standardfull80010000

TapPass ships with 74 protected paths across 7 categories that agents must never access:

CategoryExamplesCount
Credential~/.ssh, ~/.gnupg, ~/.git-credentials, ~/.npmrc21
Cloud~/.aws, ~/.kube, ~/.azure, ~/.config/gcloud14
Crypto~/.bitcoin, ~/.ethereum, ~/.metamask, wallet.dat9
BrowserChrome/Firefox/Safari login data, cookies, history6
Financial~/.stripe, .ofx, .qfx, .ach, .mt94014
System/etc/shadow, /etc/sudoers, SAM database6
Agent~/.claude, ~/.cursor, ~/.windsurf config4

Forbidden zones are checked in:

  • scan_tool_calls: every file operation tool call
  • tappass discover. tool descriptions referencing credential paths
  • tappass assess. host audit of exposed paths
  • TrustGuardian. all read/write operations

Forbidden zone checks sanitize paths against evasion techniques:

  • Null bytes: .ss\x00h.ssh (kernel truncation attack)
  • Zero-width characters: .s\u200Bsh.ssh
  • Cyrillic/Greek confusables: .ѕѕh (Cyrillic ѕ) → .ssh

A background daemon that watches credential paths for unauthorized access:

from tappass.sandbox import CredentialMonitor
monitor = CredentialMonitor(
callback=lambda e: print(f"ALERT: {e.path} ({e.event_type})"),
interval=5.0,
agent_id="agent-1",
)
monitor.start()
# ... agent runs ...
monitor.stop()

Detection methods:

MethodReliabilityDescription
Modification (st_mtime)✅ Always reliableFile content changed
Creation✅ Always reliableNew file appeared in protected directory
Read access (st_atime)⚠️ Filesystem-dependentRequires atime mount option (probed at startup)

60+ known paste services, webhook relays, and tunnel domains:

from tappass.sandbox import get_blocklist
bl = get_blocklist()
bl.is_blocked("pastebin.com") # True
bl.is_blocked("evil.ngrok.io") # True (subdomain match)
bl.add_domain("custom-bad.com") # runtime addition

Runtime additions sync to the KV store: when Redis is configured (TAPPASS_KV_URL=redis:/…), additions propagate across all server workers.

CategoryDomainsExamples
Paste28pastebin.com, gist.github.com, transfer.sh, ix.io
Webhook19webhook.site, ngrok.io, pipedream.com, burpcollaborator.net
Cloud storage11s3.amazonaws.com, dropbox.com, mega.nz
DNS tunnel2(dynamic: extend at runtime)