nip/docs/platform-detection.md

12 KiB

Platform Detection and Isolation Strategy Selection

Overview

The platform detection module (src/nip/platform.nim) provides runtime detection of OS capabilities and automatic selection of appropriate isolation strategies for multi-platform support.

Core Philosophy:

  • Detect, don't assume - Query OS capabilities at runtime
  • Graceful degradation - Fall back to simpler strategies when advanced features unavailable
  • Platform-native solutions - Use each OS's native isolation tools
  • No false security - Be honest about what each strategy provides

Supported Platforms

Platform Isolation Strategy Requirements Security Level
Linux User Namespaces Linux 4.19+ with CONFIG_USER_NS
Linux POSIX Fallback Any Linux (Merkle primary)
FreeBSD Jails + nullfs FreeBSD 11.0+
FreeBSD POSIX Fallback Any FreeBSD (Merkle primary)
OpenBSD Unveil + Pledge OpenBSD 6.4+
OpenBSD POSIX Fallback Any OpenBSD (Merkle primary)
macOS POSIX Fallback Any macOS (Merkle primary)
Embedded/IoT POSIX Fallback Any system (Merkle primary)

Isolation Strategies

1. Linux User Namespaces (Preferred on Linux 4.19+)

Mechanism: unshare -r -m with read-only bind mount

What it provides:

  • User-level isolation without root privilege
  • Kernel-enforced read-only CAS mount
  • Process cannot write even if it owns files
  • True architectural isolation

Security Level: (Kernel-enforced)

When to use:

  • Linux systems with user namespace support
  • Default for Linux 4.19+
  • Provides strongest isolation

Example:

# Automatically selected on Linux with namespace support
nip install nginx
# Uses: unshare -r -m with read-only bind mount

2. FreeBSD Jails + nullfs (Elegant BSD Solution)

Mechanism: jail with read-only nullfs mount

What it provides:

  • Lightweight container isolation
  • Read-only nullfs mounts (BSD equivalent of bind mounts)
  • Process confined to jail cannot escape
  • Mature, battle-tested technology

Security Level: (Kernel-enforced, mature)

When to use:

  • FreeBSD systems (requires root)
  • Provides excellent isolation
  • More mature than Linux namespaces

Example:

# Automatically selected on FreeBSD with jail support
nip install nginx
# Uses: jail + nullfs read-only mount

3. OpenBSD Unveil + Pledge (Crypto-Anarchist's Dream)

Mechanism: unveil() for path-based access control + pledge() for capability restrictions

What it provides:

  • Fine-grained path-based access control
  • Capability-based security model
  • Prevents privilege escalation
  • Excellent for build wrappers

Limitations:

  • unveil is reset on exec()
  • Best for wrapper processes, not direct execution
  • Requires explicit pledge() calls

Security Level: (Capability-based, but reset on exec)

When to use:

  • OpenBSD systems
  • Build wrappers and orchestration
  • Not for direct package execution

Example:

# Automatically selected on OpenBSD with unveil support
nip install nginx
# Uses: unveil + pledge for capability restrictions

4. POSIX Fallback (chmod + Merkle Verification)

Mechanism: chmod 555 for read-only + Merkle verification

What it provides:

  • Prevents accidental deletion (UX convenience)
  • Merkle verification detects tampering immediately
  • Works everywhere
  • Simple and reliable

Limitations:

  • NOT security against malicious actors
  • Users own their files and can change permissions
  • Root can always write
  • Relies on user discipline

Security Level: (UX convenience only, Merkle is primary security)

When to use:

  • Embedded/IoT systems without advanced features
  • Fallback when better strategies unavailable
  • Non-root users on systems without namespaces
  • Always paired with Merkle verification

Example:

# Automatically selected on systems without advanced isolation
nip install nginx
# Uses: chmod 555 + Merkle verification
# ⚠️  WARNING: Running in user mode without kernel isolation
#    CAS is protected by chmod 555 (UX convenience only)
#    Real security comes from Merkle verification

Platform Detection

Automatic Detection

The platform detection happens automatically when nip starts:

let caps = detectPlatform()
let strategy = selectStrategy(caps)

This detects:

  • OS Type: Linux, FreeBSD, OpenBSD, NetBSD, macOS, Embedded
  • Kernel Version: For version-specific feature detection
  • Capabilities: User namespaces, jails, unveil support
  • System Resources: Memory, CPU count
  • Embedded Devices: OpenWrt, Raspberry Pi, etc.

Manual Override

You can override automatic detection via configuration:

# nip-config.kdl
nip {
  platform {
    // Auto-detect platform and select strategy
    auto_detect true

    // Override auto-detection if needed
    // force_strategy "posix"  // "linux", "freebsd", "openbsd", "posix"

    // Embedded device settings
    embedded {
      auto_detect true
      max_concurrent_downloads 2
      max_concurrent_builds 1
      max_cache_size "100MB"
    }

    // Isolation settings
    isolation {
      // Prefer user mode on Linux (if available)
      prefer_user_mode true

      // Require root for system mode
      require_root_for_system true

      // Merkle verification (always enabled)
      verify_chunks true
      verify_signatures true
    }
  }
}

Installation Modes

User Mode (Linux with Namespaces Only)

Requirements:

  • Linux 4.19+ with user namespace support
  • No root privilege required

Behavior:

  • Installs to ~/.nexus/envs/<env>/Programs/
  • Creates isolated namespace for each operation
  • Kernel enforces read-only CAS mount
  • Perfect for development and testing

Example:

nip install --user nginx
# Installs to ~/.nexus/envs/home/Programs/Nginx/
# Uses user namespace isolation

System Mode (Root Required)

Requirements:

  • Root privilege
  • Any platform

Behavior:

  • Installs to /Programs/
  • System-wide installation
  • Creates new system generation
  • Requires root access

Example:

sudo nip install nginx
# Installs to /Programs/Nginx/
# Creates new system generation

Embedded Device Support

Automatic Detection

Embedded devices are detected via multiple indicators:

  • OpenWrt release file
  • Device tree (ARM devices)
  • Memory < 512MB
  • CPU count <= 2
  • Raspberry Pi detection

Resource Constraints

When embedded device is detected, nip automatically applies constraints:

📱 Embedded device detected
   Memory: 256MB
   CPUs: 1
   Max concurrent downloads: 1
   Max concurrent builds: 1
   Max cache size: 50MB
   Compression enabled: true
   Deduplication enabled: true
   Parallelization enabled: false

Optimization

For embedded devices:

  • Single-threaded builds
  • Reduced cache size
  • Aggressive compression
  • Disabled parallelization on single-core
  • Optimized for low memory

Security Guarantees

Linux with User Namespaces

⭐⭐⭐⭐⭐ Kernel-enforced read-only mount
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)

Guarantee: Process cannot modify CAS even if compromised

FreeBSD with Jails

⭐⭐⭐⭐⭐ Kernel-enforced jail isolation
⭐⭐⭐⭐⭐ Read-only nullfs mount
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)

Guarantee: Process cannot escape jail or modify CAS

OpenBSD with Unveil

⭐⭐⭐⭐ Capability-based security
⭐⭐⭐⭐⭐ Merkle verification (xxh3)
⭐⭐⭐⭐⭐ Signature verification (Ed25519)

Guarantee: Process capabilities restricted, tampering detected

POSIX Fallback

⭐ chmod 555 (UX convenience)
⭐⭐⭐⭐⭐ Merkle verification (xxh3) - PRIMARY SECURITY
⭐⭐⭐⭐⭐ Signature verification (Ed25519)
⭐⭐⭐ Audit logging

Guarantee: Tampering detected immediately via Merkle verification

Troubleshooting

"User mode not available on this platform"

Cause: You requested user mode on a platform that doesn't support it

Solution:

  • Use system mode (requires root): sudo nip install nginx
  • Or use a Linux system with user namespace support (4.19+)

Check namespace support:

cat /proc/sys/user/max_user_namespaces
# Should output a number > 0

"Running in user mode without kernel isolation"

Cause: Running on Linux without user namespace support

Solution:

  • Upgrade kernel to 4.19+
  • Or enable CONFIG_USER_NS in kernel config
  • Or use system mode with root

Check kernel version:

uname -r
# Should be 4.19 or later

"Embedded device detected"

Cause: System detected as embedded/IoT device

Solution:

  • This is automatic and optimizes for low resources
  • No action needed - nip will adjust constraints
  • To override: set embedded.auto_detect false in config

Check detection:

nip doctor
# Shows platform information and detected constraints

API Reference

Main Functions

# Detect platform capabilities
proc detectPlatform*(): PlatformCapabilities

# Select isolation strategy
proc selectStrategy*(caps: PlatformCapabilities): IsolationStrategy

# Select installation mode
proc selectMode*(strategy: IsolationStrategy,
                 userRequest: Option[InstallMode]): InstallMode

# Check if running as root
proc isRoot*(): bool

# Get embedded device constraints
proc getEmbeddedConstraints*(): EmbeddedConstraints

Information Functions

# Get human-readable OS type name
proc getOSTypeString*(osType: OSType): string

# Get strategy description
proc getStrategyDescription*(strategy: IsolationStrategy): string

# Get security level (1-5 stars)
proc getSecurityLevel*(strategy: IsolationStrategy): int

# Get detailed strategy information
proc getStrategyInfo*(strategy: IsolationStrategy): string

# Format bytes as human-readable string
proc formatBytes*(bytes: int64): string

# Print platform information
proc printPlatformInfo*(caps: PlatformCapabilities)

# Print embedded device constraints
proc printEmbeddedConstraints*(constraints: EmbeddedConstraints)

Testing

Run platform detection tests:

nim c -r nip/tests/test_platform.nim

Tests cover:

  • OS type detection
  • Kernel version parsing
  • Capability detection
  • Strategy selection
  • Mode selection
  • Embedded device detection
  • Byte formatting

Future Enhancements

Phase 8A: Linux Namespace Isolation (Post-MVP)

  • Implement kernel-enforced read-only CAS mount
  • Add namespace lifecycle management
  • Integrate with package launchers

Phase 8B: FreeBSD Jail Support (Post-MVP)

  • Implement jail creation and lifecycle
  • Add nullfs mount management
  • Integrate with package launchers

Phase 8C: OpenBSD Unveil Support (Post-MVP)

  • Implement unveil/pledge integration
  • Add build wrapper support
  • Integrate with build system

Phase 8D: Embedded/IoT Support (Post-MVP)

  • Optimize for resource-constrained devices
  • Add OpenWrt-specific support
  • Implement low-memory operation modes

References


Document Version: 1.0 Last Updated: November 20, 2025 Status: Implementation Complete (MVP) Next Steps: Phase 8 - Advanced isolation strategies (post-MVP)