Skip to content

Security: arpitnath/orpheus

Security

SECURITY.md

Security Model

Orpheus is designed for running trusted internal code in isolated containers. This document explains what security features are implemented and what the limitations are.


Current Security Posture (aurora-0.1.2)

What Orpheus Protects Against

Container Escape Prevention

  • Seccomp syscall filtering (blocks 330+ dangerous syscalls including mount, ptrace, kernel modules)
  • All Linux capabilities dropped (no CAP_SYS_ADMIN, CAP_NET_RAW, etc.)
  • Critical paths masked (/proc/sys/kernel/core_pattern, /proc/kallsyms, etc.)

Privilege Escalation Prevention

  • NoNewPrivileges flag blocks setuid/setgid privilege escalation
  • Non-root execution (UID 1000, GID 1000)
  • Mount options: nosuid on all mounts

Code Execution Restriction

  • noexec on /tmp, /proc, /dev (cannot execute binaries from writable mounts)
  • Read-only /proc/sys and /sys (cannot modify kernel parameters)

Resource Exhaustion Protection

  • Memory limits (default: 512MB, configurable)
  • PID limits (256 processes/threads max)
  • Timeout enforcement (default: 60s, configurable)

Process Isolation

  • Separate PID namespace (cannot see host processes)
  • Separate mount namespace (filesystem isolation)
  • Separate IPC namespace (shared memory isolation)
  • Separate UTS namespace (hostname isolation)

What Orpheus Does NOT Protect Against

Network-Level Attacks

  • Containers share host network namespace (design decision for LLM API access)
  • No egress filtering (agents can make arbitrary network requests)
  • No inter-container network isolation
  • Mitigation: Deploy on trusted networks, use firewall rules

User Namespace Remapping

  • Container root (UID 0) maps to host UID 1000 (non-root but not remapped)
  • If container escape occurs, attacker has host UID 1000 permissions
  • Mitigation: Non-root UID + seccomp + NoNewPrivileges provide defense-in-depth

Supply Chain Attacks

  • Orpheus does not scan agent dependencies for vulnerabilities
  • Agent code and dependencies are user-controlled
  • Mitigation: Users should vet their own code and dependencies

Data Exfiltration

  • Agents have full network access
  • No DLP or egress monitoring
  • Mitigation: Trust agent code, monitor network traffic externally

Threat Model

Intended Use Case: Trusted Code

Orpheus is designed for scenarios where:

  • You control the agent code being deployed
  • Agents are internal tools, not user-submitted code
  • Single-tenant deployments (one organization per instance)

Example safe use cases:

  • Internal automation agents
  • Development and testing environments
  • Proof-of-concept and demo applications
  • AI agents you wrote and reviewed

NOT Recommended For (Yet)

⚠️ Multi-tenant SaaS platforms

  • Current security is insufficient for arbitrary user code
  • Network namespace isolation needed
  • See roadmap for v0.2.0 enhancements

⚠️ Processing regulated data (HIPAA/PCI)

  • Additional compliance features required
  • Audit logging and encryption needed
  • See roadmap for v0.3.0 compliance features

⚠️ Executing untrusted user-submitted code

  • Current isolation is good but not maximum
  • Consider gVisor or Firecracker for untrusted code
  • See roadmap for v0.3.0 enhanced isolation

Security Features in Detail

Seccomp Syscall Filtering

Default action: Block (SCMP_ACT_ERRNO)

Allowed syscalls (~211):

  • File I/O: read, write, open, close, stat, etc.
  • Memory: mmap, munmap, mprotect, brk
  • Process: fork, clone, execve, exit, wait4
  • Networking: socket, connect, bind, listen, send, recv
  • Signals: rt_sigaction, rt_sigprocmask, kill

Blocked syscalls (~330+):

  • Administrative: mount, umount2, reboot, sethostname
  • Kernel modules: init_module, delete_module, finit_module
  • Debugging: ptrace, process_vm_readv, process_vm_writev
  • Capabilities: capset, capget
  • Time manipulation: clock_settime, settimeofday
  • Namespace manipulation: unshare, setns
  • ASLR bypass: personality
  • Device creation: mknod

Compatibility: Tested with Python 3.x, Node.js 18+, Go 1.20+, Rust 1.70+


Mount Security

Mount Point Type Options Purpose
/proc proc nosuid, nodev, noexec Process info (execution blocked)
/dev tmpfs nosuid, noexec Device files (execution blocked)
/tmp tmpfs nosuid, nodev, noexec Temporary storage (execution blocked)
/workspace bind nosuid, nodev Persistent storage (execution allowed for agent code)

Note: Agents cannot execute binaries from /tmp or /proc, only from /agent (rootfs).


Masked Paths (Hidden)

These paths appear as empty read-only files:

  • /proc/kcore - Kernel memory dump
  • /proc/kallsyms - Kernel symbols
  • /proc/sys/kernel/core_pattern - Core dump handler (can execute commands)
  • /proc/sys/kernel/modprobe - Module loader path
  • /sys/firmware - BIOS/UEFI information
  • /sys/kernel/debug - Kernel debug interfaces

Read-Only Paths

These paths are visible but cannot be modified:

  • /proc/sys - Kernel parameters
  • /sys - System interfaces

Roadmap

aurora-0.1.2 (Current)

✅ Seccomp profile (Docker default) ✅ NoNewPrivileges flag ✅ Mount hardening (nosuid, nodev, noexec) ✅ /proc and /sys masking ✅ Timeout enforcement (60s default) ✅ Crash recovery

v0.2.0 (Next Quarter)

  • Network namespace isolation
  • Egress filtering (allowlist for LLM APIs)
  • User namespace remapping
  • Enhanced audit logging

v0.3.0 (Future)

  • gVisor integration (optional, for untrusted code)
  • Compliance certifications (SOC 2, HIPAA)
  • Multi-tenant isolation hardening

Verifying Security

Check Seccomp is Active

# Inspect OCI config
cat /tmp/orpheus-bundles/*/config.json | jq '.linux.seccomp'

# Should show: DefaultAction: "SCMP_ACT_ERRNO"

Check NoNewPrivileges

cat /tmp/orpheus-bundles/*/config.json | jq '.process.noNewPrivileges'

# Should show: true

Test Syscall Blocking

# Try to mount (should fail with EPERM)
orpheus exec my-agent --cmd "python3 -c 'import os; os.mount(\"/dev/sda\", \"/mnt\", \"ext4\")'"

# Expected: OSError: [Errno 1] Operation not permitted

Known Container Escape CVEs

CVE Description Status
CVE-2024-21626 runc leaky file descriptors ✅ Fixed (runc 1.1.12+)
CVE-2022-0847 Dirty Pipe (kernel vulnerability) ✅ Mitigated (seccomp blocks pipe_splice)
CVE-2019-5736 runc container escape ✅ Fixed (runc 1.0.0-rc9+)

Recommendation: Keep runc and kernel updated to latest stable versions.


Reporting Security Vulnerabilities

We take security seriously. If you discover a vulnerability:

Email: security@orpheus.run

Response SLA: 48 hours

PGP Key: Available at https://orpheus.run/security.asc

What to include:

  • Description of the vulnerability
  • Steps to reproduce
  • Impact assessment
  • Suggested fix (if any)

Disclosure policy: We follow coordinated disclosure. We will:

  1. Acknowledge receipt within 48 hours
  2. Validate and investigate (1-7 days)
  3. Develop and test fix (1-14 days)
  4. Release patch and security advisory
  5. Credit reporter (if desired)

Best Practices for Secure Deployment

1. Keep Software Updated

# Update Orpheus
git pull origin main
make build
sudo systemctl restart orpheusd

# Update runc
runc --version  # Should be 1.1.12 or newer

2. Limit Network Access

# Use firewall to restrict outbound traffic
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT  # HTTPS only
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT   # HTTP
iptables -A OUTPUT -j DROP  # Block everything else

3. Monitor for Anomalies

# Check for failed tasks (potential exploit attempts)
orpheus execlog list my-agent --state FAILED | grep -i "permission\|syscall"

# Monitor metrics for unusual patterns
curl http://localhost:7777/metrics | grep orpheus_task_

4. Run on Dedicated Infrastructure

  • Use separate machines for Orpheus (not shared with critical services)
  • Isolate agent workloads from production databases
  • Use separate API keys for agents (not production keys)

FAQ

Is Orpheus safe for production?

For trusted code: Yes. The security posture is comparable to Docker default and suitable for internal tools.

For untrusted code: Not yet. Wait for v0.2.0 with network namespace isolation.

What happens if an agent escapes the container?

The attacker would have:

  • Host UID 1000 permissions (non-root)
  • No Linux capabilities
  • Limited syscall access (seccomp blocks most)
  • Access to host network

Blast radius: Limited to files owned by UID 1000 and network access.

Can I disable security features for performance?

No. Security features are always enabled and cannot be disabled. The performance overhead is minimal (<2% CPU).

How do I know if my agent code is blocked by seccomp?

Check logs for "permission denied" or "operation not permitted" errors:

orpheus logs my-agent | grep -i "permission\|permitted"

If a syscall you need is blocked, file an issue at https://github.com/orpheus-ai/orpheus/issues


Security Scorecard

Category Score Notes
Container Isolation 78/100 Seccomp + capabilities + namespaces
Privilege Escalation 90/100 NoNewPrivileges + nosuid + non-root
Resource Protection 85/100 Memory/PID limits + timeout
Network Isolation 40/100 Shared network (by design)
Overall 78/100 Good for trusted code, enhance for multi-tenant

Comparison:

  • Docker default: 75/100
  • Kubernetes default: 72/100
  • gVisor: 95/100
  • Firecracker: 98/100

Last Updated: 2026-01-27 Version: aurora-0.1.2

There aren’t any published security advisories