Skip to content
Olly the OwlNestr

Security

Last updated: 25 October 2026

Nestr is designed so that an adversary who fully compromises a package maintainer cannot run code on your machine when you install. This page lists what our specification requires and, just as plainly, what we do not meet yet.

The claim, and its current status

The design goal: an adversary who fully compromises a Pellets namespace maintainer cannot run code on a downstream installer's machine. Known sandbox gaps remain open (see known limitations). Until they are closed, we do not present this claim as proven.

Threat model

The specification (Pellets security overview, section 2) defends against:

Out of scope for now: hardware supply-chain attacks, compromise of a publisher's signing root, theft of code-signing certificates by nation states, and side-channel attacks on the sandbox kernel.

What the specification requires

These are normative requirements from the Pellets security specification. Requirement IDs are listed so every statement can be checked. A requirement listed here is a design commitment; it is not a statement that the requirement is met today. Where we know a requirement is not met, it is listed under known limitations.

PrincipleRequirement IDs
No code runs at install time
Fetching, verifying, extracting, resolving, locking and materialising a pellet never executes code from it. No flag or environment variable relaxes this.
PEL-EXEC-001PEL-EXEC-002PEL-ART-030PEL-ART-032
Content-addressed, immutable artifacts
A pellet is identified by the BLAKE3 hash of its contents. A published name and version always resolves to the same artifact; a mismatched hash is rejected.
PEL-ART-010PEL-ART-011PEL-ART-020
Safe archive contents
Payloads must not contain symlinks escaping the archive, hard links, device files, setuid/setgid bits, absolute or “..” paths, or non-UTF-8 paths.
PEL-ART-003
Signed and transparency-logged
Every pellet is signed by an OIDC-proven or HSM-backed identity and recorded in an append-only transparency log. Signatures are verified before anything else happens; there is no unsigned-but-trusted mode.
PEL-SIG-001PEL-SIG-020PEL-SIG-021PEL-SIG-030PEL-LOG-001PEL-LOG-005
Independent witnesses
Two or more independent witnesses must co-sign each log tree head before the registry serves pellets at that head.
PEL-LOG-003PEL-SIG-033
No long-lived publish credentials
Publishing needs a fresh proof of identity. There is no stored publish token, and the engine does not read ambient credentials.
PEL-PUB-001PEL-PUB-002PEL-CRED-001
Policy at every install
Each candidate is evaluated independently (no transitive trust) and the result is accept, quarantine or deny. Resolution fails closed and never relaxes policy on its own.
PEL-POL-020PEL-POL-031PEL-RES-002PEL-RES-004
Lockfile pins content, re-verified on install
The lockfile pins artifact hashes, and every install re-verifies hash, signature, log inclusion and policy, so a tampered lockfile is caught.
PEL-LOCK-002PEL-LOCK-010PEL-RES-010PEL-RES-012
Hooks are explicit and sandboxed
Hooks run only when explicitly invoked, after consent, inside a sandbox. Capability limits are enforced by the sandbox, not by trusting the hook.
PEL-EXEC-021PEL-EXEC-022PEL-EXEC-024PEL-SBX-001PEL-SBX-012
Structural diff and quarantine
Each new version is structurally diffed against the previous one. High-risk changes are quarantined for review, for direct and transitive dependencies alike.
PEL-DIFF-001PEL-REP-002PEL-REP-003
Namespaces bound to verified identity
Names are scoped to namespaces owned by a verified identity. Unclaimed namespaces do not accept publishes.
PEL-NS-001PEL-NS-002PEL-NS-003PEL-NS-020

Known limitations

Disclosure is part of the Early Access offer. We describe each limitation plainly and cite the requirement it affects.

Sandbox and install isolation

Related: the hook syscall filter is currently a deny-list, not the default-deny filter that PEL-SBX-002 requires.

General-availability pricing is deferred until the adversary vectors pass.

Namespace authority is not production-grade

The full namespace identity model (PEL-NS-*) is not yet running at production strength. The registry checks a namespace's ownership record first but still falls back to a stub allowlist for unclaimed namespaces. Of the ownership-proof methods in PEL-NS-003, DNS TXT works. Email proof is not delivered, the passkey check is a stub that does not verify the attestation, and OIDC proof is not configured, so an operator countersigns every namespace claim by hand.

Transparency-log witnesses

registry.nestr.tools does not yet run a real transparency log: entries carry no witness co-signatures and PEL-LOG-003 is not met.

Dashboard

The quarantine, structural-diff and provenance screens show labelled sample data, and quarantine actions are not sent to the registry. Other screens fall back to sample data when the backend is empty or unreachable.

Not running yet

Paying never changes verification

A lapsed, refunded or cancelled subscription removes paid features only (team invites, extra seats, security-record history, support). It never makes verification weaker or stronger. A paying organisation gets no extra trust, and a non-paying one gets no less.

Other

Reporting a vulnerability

Email security@nestr.tools with the subject “Security report”; we do not offer an encryption key yet. Please do not open a public issue. We will acknowledge your report within 3 business days.

Start free