Early-stage software. Shurli is experimental and built with AI assistance. It will have bugs. Not recommended for production or safety-critical use. Read the disclaimer.
Trust & Security

Trust & Security

Security Program

Shurli is infrastructure software that people depend on for remote access to their machines. A security compromise doesn’t just leak data - it could give an attacker SSH access to your home server. We take this seriously.

This page documents our security posture, threat model, vulnerability reporting process, and response commitments. We believe transparency is the strongest security signal we can provide.

Current Security Controls

Shurli ships with these security defaults:

ControlDescription
ConnectionGaterPeer ID allowlist (authorized_keys). Unauthorized peers are rejected at the network layer before any protocol runs.
Ed25519 identitiesCryptographic peer identity. Keys generated locally, never transmitted.
Key file permissionsIdentity keys require 0600 - loader refuses keys with wider permissions.
Config file permissionsConfig files written with 0600.
Input validationService names: DNS-label format enforced. Relay addresses: parsed as multiaddr before writing. Comments: newline injection sanitized.
Stream read limitsInvite/join streams capped at 512 bytes to prevent OOM.
Relay resource limitsCircuit relay v2 with configurable WithResources() - session duration, data caps, per-peer limits.
Private DHTKademlia DHT uses /shurli/kad/1.0.0 protocol prefix - isolated from public IPFS routing.
Cookie authDaemon API uses 32-byte random hex cookie, 0600 permissions, rotated every restart.
Config rollbackCommit-confirmed pattern auto-reverts bad configs on remote nodes.

Threat Model

Shurli’s threat surface includes:

Relay Server (Public-Facing VPS)

The relay is the most exposed component - it’s a public-facing server that accepts connections from the internet.

ThreatMitigationStatus
Resource exhaustionCircuit relay v2 resource limits (session duration, data caps)Implemented
Log injectionStructured logging via log/slog - no string interpolation in log messagesImplemented
YAML injectionPeer names sanitized before writing to configImplemented
Path traversalConfig paths resolved and validated, no user-controlled path componentsImplemented
Peer ID spoofingConnectionGater validates against authorized_keys at network layerImplemented
DDoS amplificationQUIC source address verification (planned)Planned
OS-level flood protectioniptables/nftables rate limiting in setup.sh (planned)Planned
Per-service access controlPer-service authorized_keys override (planned)Planned

Invite/Join Flow

ThreatMitigationStatus
Invite code interceptionCodes are short-lived (default 10 minutes) and single-useImplemented
Malformed invite codesStrict multihash length validation, base32 re-encode comparisonImplemented
Stream floodingRead limit of 512 bytes on invite/join streamsImplemented
Man-in-the-middleRelay mediates handshake but never sees private keys; mutual authorizationImplemented

Daemon API

ThreatMitigationStatus
Unauthorized API accessCookie-based auth, Unix socket (local-only), 0600 permissionsImplemented
Stale socket hijackingDial-test detection, no PID filesImplemented
Auth bypassEvery endpoint validates cookie before processingImplemented

Supply Chain

ThreatMitigationStatus
Dependency vulnerabilitiesCVE monitoring, go mod tidy, CI pinned to commit SHAsActive
CI compromiseGitHub Actions pinned to SHAs (not tags)Implemented
Binary tamperingEd25519-signed checksums in release manifest (planned)Planned
Cosign / Sigstore signingSLSA provenance for Go binaries (planned)Planned

Vulnerability Reporting

If you find a security vulnerability in Shurli, please report it responsibly:

Email: [email protected] (not yet active - use GitHub Security Advisories until domain is configured)

GitHub Security Advisories: Report a vulnerability

What to Include

  • Title: Brief description of the vulnerability
  • Severity: Your assessment (Critical / High / Medium / Low)
  • Affected component: Which part of Shurli is affected
  • Reproduction steps: How to trigger the vulnerability
  • Impact: What an attacker could achieve
  • Environment: OS, Go version, Shurli version

Response Commitments

SeverityFirst ResponseTriageFix Target
Critical (RCE, auth bypass, relay takeover)48 hours5 days14 days
High (significant single-user impact)5 days14 days30 days
Medium (limited impact, defense-in-depth)14 days30 days90 days
Low (hardening, best practice)30 days60 daysBest effort

These are targets, not guarantees. Shurli is maintained by a small team. But we take every report seriously and will communicate transparently about our progress.

Security Audit History

DateScopeFindingsResolution
2026-02-19Full post-phase audit (Phase 4C)CVE-2026-26014 (pion/dtls), CI action tags, 10 hardening itemsAll resolved (commit 83d02d3)

Contributing to Security

We welcome security contributions. The threat model above is a living document - if you see a gap, please:

  1. Open a GitHub issue for non-sensitive improvements
  2. Use Security Advisories for actual vulnerabilities
  3. Submit PRs for hardening improvements

The Engineering Journal documents the reasoning behind every security design decision (28 ADRs and counting).

Trust Model Philosophy

Shurli’s security model is deliberately simple:

An authorized_keys file decides who connects. You control the file. That’s it.

No accounts. No tokens. No OAuth. No SAML. No OIDC. No JWTs. No API keys. No central authority.

This is the same model that has secured SSH for 30 years. It’s not perfect, but it’s well-understood, auditable, and entirely under your control. When something goes wrong, there’s exactly one place to look: the authorized_keys file on your machine.

Future phases will add optional layers (per-service ACLs, pluggable auth backends), but the base model will always be this simple.