Diligence · multikernel/sandlock
Sandlock
Verdict
ADVANCE TO FOUNDER CONVERSATION
The recommendation rests on three things public evidence establishes and one it does not. Established: the technical work is real and unusually well-executed; the threat model is stated more honestly than most funded security companies state theirs; and the construction pattern looks like durable systems engineering rather than a demo. Not established: whether anyone has ever tried to break it, and whether anyone pays. Both unknowns are conversation-resolvable — which is exactly what makes this a founder conversation rather than a pass or a watch.
01
Why it surfaced
Why the system saw it
807 owner commits, pushed the day of review; sandlock.io registered 2026-08-08; an arXiv paper published 2026-05-25; and a company products page that now lists "Multikernel Sandbox (AI agent sandboxing runtime)" as a commercial product.
Why company-first sourcing misses it
358 stars on the sandbox repo; the founder has 72 GitHub followers, no blog field and no X-native presence; the strongest corroborating evidence sits on LKML and arXiv. No institutional financing was identified in the public sources reviewed, so no funding database would surface it.
02
What Sandlock is
A lightweight Linux process sandbox in Rust (Apache-2.0) that confines a command's filesystem, network, syscalls and resources using Landlock, seccomp-bpf and seccomp user notification — no root, no image build, no container runtime, no hypervisor.
Distribution is unusually complete for a project this young: a CLI, an OCI runtime shim for containerd / CRI-O / Kubernetes, a C ABI, and Python and Go SDKs [S2]. The codebase is 3.3 MB of Rust [S15], and the integration-test files are comparable in size to the modules they test [S2] — an unusual and good sign in a security project.
The organising idea
“Static, input-independent policy is compiled into kernel-enforced rules, while a narrow supervisor handles runtime-dependent decisions and virtualized effects.”
That sentence is the whole architecture, and it is the right frame for evaluating it. Anything expressible as a static rule goes to the kernel, where it is fast and TOCTOU-immune. Anything requiring a runtime decision goes to a userspace supervisor, which is slower and more trusted. The design question is where that line sits — and the hard engineering lives on the supervisor side: cow/seccomp.rs alone is 319 KB, the largest file in the repository [S2].
Beyond a conventional sandbox
Filesystem and syscall confinement is table stakes. The differentiated surface [S3] [S4]: an HTTP-level ACL on method + host + path via a transparent proxy; destination-IP and CIDR allowlists with no DNS; credential injection where the secret stays in the supervisor and is attached after the ACL check; a copy-on-write working directory with transactional commit/abort; deterministic execution (frozen time, seeded randomness); and a handler API on any syscall where a custom handler “can extend confinement but never relax it” [S6].
03
The trust boundary
Sandlock publishes its own three-tier trust model: the host kernel is fully trusted, the supervisor partially trusted, the workload assumed hostile. Compare where the boundary actually sits in each architecture.
- Escape requires
- a kernel privilege-escalation bug in any syscall the policy permits
- What this buys
- ~5 ms start (project claim) · no root · no image · HTTP-level policy and supervisor-held credentials
- What it costs
- one shared kernel: the workload and the host meet inside the same kernel
04
The stated threat model
Published at sandlock.io/security.html, and unusually direct — its opening line: “A sandbox is only useful if you know its edges.”
In scope — what it claims to stop [S6]
Filesystem escape
Unapproved network egress
Exfiltration on an approved host
Credential theft by the workload
Privilege escalation via setuid
Reaching sibling processes
Host resource exhaustion
Unintended writes
Explicitly out of scope [S6]
Kernel vulnerabilities
Hardware side channels
A policy that grants too much
A hostile launcher
The workload starving itself
What a hostile workload actually does
| Scenario | Outcome | Mechanism / caveat |
|---|---|---|
| Generated code tries to read ~/.ssh | ● BLOCKED | Landlock, kernel-evaluated |
| Malicious dependency exfiltrates to an attacker host | ● BLOCKED | default-deny egress; on an approved host, the HTTP method/host/path ACL |
| Prompt-injected tool call tries to POST the API key | ● BLOCKED | the key never enters the child's address space — the most agent-specific guarantee in the product |
| Workload attempts setuid escalation | ● BLOCKED | NO_NEW_PRIVS |
| Workload signals a sibling process | ● BLOCKED* | on ABI v6; not blocked on an older kernel unless allow_degraded was chosen deliberately |
| Kernel LPE in a permitted syscall | ✕ NOT DEFENDED | full host compromise — stated by the project |
| Operator writes --net-allow '*' | ✕ NOT DEFENDED | stated: policy correctness is the operator's problem |
| Attacker controls the launching process | ✕ NOT DEFENDED | stated |
05
The question a VM boundary cannot answer
Traditional isolation asks
“Can this process access that resource?”
Agent security also asks
“Should this legitimate agent use this legitimate credential for this legitimate operation, against this destination, right now?”
One request, four elements
- AGENTthe coding agent you deployed✓ legitimate process
- CREDENTIALthe real API key it was given✓ legitimate secret
- OPERATIONPOST /v1/messages✓ legitimate method + path
- DESTINATIONattacker-controlled.example◼ policy stops the request here
Sandlock policy layer: Expressible as policy — destination and credential are separable
The HTTP ACL matches on method, host and path, so a rule that permits POST to one host does not permit the same call to another. Separately, the credential stays in the supervisor and is attached after the ACL check, so a request that fails the check never carries the secret. Both are OBSERVED in the code and the docs; neither is independently verified here, and neither is a claim that prompt injection is solved — a policy that grants too much still grants too much, which the project states plainly.
This is why the interesting layer of Sandlock is not the sandbox. It is the semantic execution policy: an HTTP ACL on method/host/path, a credential the child process can use but never read, and transactional writes that make a failed run leave no trace. The syscall confinement underneath is competent; the policy layer is the part a competitor would have to decide to build, not just port.
06
Against the alternatives, dimension by dimension
No aggregate score, deliberately. Isolation boundary, kernel relationship, startup model, trust assumptions and operational burden are different axes, and collapsing them into one number would hide the trade each architecture makes.
| Alternative | Isolation boundary | Kernel | Startup | Root | Escape requires | Security ceiling | What Sandlock does differently |
|---|---|---|---|---|---|---|---|
| Firecracker microVM | hardware virtualisation, separate guest kernel | separate | ~100 ms | true | VMM or KVM bug after guest compromise | highest | no image, no root, ~20x faster start, plus HTTP-level egress policy a VM cannot express |
| gVisor | userspace kernel (Sentry) services every syscall | reimplemented in userspace | moderate | varies | Sentry bug or a host bug reachable through it | high | host kernel stays in the syscall path; native performance and full compatibility, wider escape surface |
| Containers (namespaces + cgroups) | namespaces | shared | ~200 ms | yes, or user-ns + /etc/subuid | kernel LPE or misconfiguration | comparable or lower | access-control ruleset rather than a constructed namespace; no image; HTTP ACL; CoW rollback |
| bubblewrap / firejail | constructed namespaces | shared | fast | user namespaces | kernel LPE or namespace misconfiguration | comparable | no user-namespace requirement; destination-IP and HTTP rules; credential injection; transactional writes |
| Raw Landlock + seccomp | identical primitives | shared | fast | false | kernel LPE | identical | the supervisor, the CoW engine, the HTTP layer, the protection-posture model and the distribution - i.e. every hard part |
| OpenShell (NVIDIA) | control plane above a sandbox | delegates | n/a | depends on backend | — | inherits backend | OpenShell requires Docker/Podman/microVM/K8s underneath; sandlock is the confinement itself. They compose rather than compete |
07
The trade, stated plainly
The shared kernel is not a footnote. It is the price of everything Sandlock gains, and the project prices it honestly.
Sandlock gains
- ~5 ms claimed startup and no VM image — the isolation layer stops being the dominant cost at agent volumes
- no root, no KVM, no /etc/subuid — it can confine an agent on the developer laptop where the agent actually runs
- full native compatibility: the host kernel stays in the syscall path
- policy expressiveness no competitor matches: HTTP ACL, credential injection, CoW rollback, deterministic execution
- fail-closed by default, with named, auditable, per-protection opt-outs
Sandlock gives up
- a separate guest kernel — a kernel LPE in any permitted syscall defeats it, stated plainly by the project itself
- the VM/hardware boundary and with it the highest attainable isolation ceiling
- a large “partially trusted” supervisor handles attacker-influenced input outside the sandbox
- kernel 6.12 / Landlock ABI v6 for the default posture — which excludes most enterprise LTS fleets today
- hardware side channels are out of scope entirely
08
Code review — construction evidence
Commit count is not the evidence. The shape is: sustained cadence, proportionate tests, a real review process, multi-architecture work, and a monthly release train.
Weekly commits, last 12 weeks [S10]
73 · 58 · 31 · 35 · 46 · 31 · 40 · 89 · 64 · 41 · 19 · 10 — sustained, not bursty
The founder is described on the company site as a Linux kernel developer with 16+ years’ experience, maintainer of the networking traffic-control subsystem since 2017 [S14]. Kernel-subsystem-maintainer expertise applied to a userspace product is rare, verifiable from the public kernel record, and not hireable on a normal timeline. The test files being comparable in size to the modules they test [S2] is what a durable system looks like from outside.
09
Claims ledger — performance, security, commercial
Every material claim, with its evidence state. A project's own benchmark is authoritative that the project claims the number — never that the number is true.
| ID | Claim | State | Source / note |
|---|---|---|---|
| C1 | Startup overhead ~5 ms | Project claim | Project's own benchmark; not reproduced here (needs Linux 6.12; test machine is macOS/M1). S3 README, S5 paper, S7 comparison |
| C2 | Runs Redis at bare-metal throughput, within measurement noise | Project claim | S5 paper abstract |
| C3 | No root, no cgroups, no containers, no hypervisor | Observed | Consistent with the code read: Landlock+seccomp only, no namespace setup path found. S3, S6 |
| C4 | Landlock enforces filesystem, TCP ports and IPC scoping | Observed | S16 landlock.rs uses LANDLOCK_RULE_PATH_BENEATH, LANDLOCK_RULE_NET_PORT, LANDLOCK_SCOPE_SIGNAL, LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET |
| C5 | seccomp user notification handles runtime decisions and virtualised effects | Observed | S2: seccomp/notif.rs 131KB, cow/seccomp.rs 319KB, procfs.rs 50KB |
| C6 | Fail-closed by default; refuses to start when a required protection is unavailable | Observed | S4 protection opt-out section |
| C7 | Credential never enters the child's address space | Project claim | credential.rs (39KB) exists; behaviour not dynamically tested. S6, S3 |
| C8 | Kernel vulnerabilities are out of scope | Observed | Stated by the project itself, in bold. S6 security page, verbatim |
| C9 | Landlock rules are kernel-evaluated and TOCTOU-immune | Project claim | S4 |
| C10 | Requires Linux 6.12+ (Landlock ABI v6) for the default posture | Observed | S3 requirements table |
| C11 | Public institutional financing exists | Not found | No public financing identified in the sources reviewed. This is NOT a claim of bootstrapping.. searches of company site, project site, repo, web |
| C12 | Independent security audit exists | Not found | repo, site, web searches |
| C13 | Named customers or revenue | Unknown | no pricing page, no logos, no case studies found |
The biggest gap in the record: No evidence of any adversarial contact: no audit, no bounty, no published escape attempt. For a security product, survived adversarial contact is the evidence that matters most, and it is absent from public sources. Absence of an audit is not evidence of weakness — it is absence of evidence, in the category where evidence matters most.
10
Commercial status
- Entity: Multikernel Technologies, Inc.; GitHub org created 2025-03-08
- Open-core model, stated: “what is open, what is licensed”
- Two named commercial products beyond the core: Sandbox HTTP API, Sandbox Scheduler
- A “Schedule a Demo” call to action; the checkpoint/restore machinery the scheduler needs exists in the repository
Unknown / not found
- Pricing Unknown
- Customers, revenue Unknown
- Team size Unknown
- Institutional financing Not found
- Independent security audit Not found
11
The Multikernel project graph
Sixteen repositories, one coherent stack, three clusters — this is an infrastructure organisation with a consistent thesis, not a technical studio spraying experiments.
Kernel research & infrastructure
linux (multikernel-enabled kernel) · kernelscript (OCaml eBPF DSL) · kexec-tools · kmorph · tcp_splice · mkbench …
Filesystem & state
daxfs (CXL disaggregated FS) · branchfs (FUSE CoW branching) · branching (CoW for agents)
AI-facing product
sandlock (pushed daily) · sandlock.io · kerf · the company site
Source: org repository listing [S13]
The AgentSight relationship — stated precisely
Established
paper co-authorship on arXiv:2605.26298 (Cong Wang, Yusheng Zheng); 49 code-search references to sandlock inside the eunomia-bpf org including workload reproduction notes [S5] [S17]
Not established — and not inferred
any organisational, employment, equity or corporate relationship - none found and none inferred.
Why this matters to the sourcing system itself: Phase 2 counted Multikernel and AgentSight as two independent leads. They share an author, so they are one intellectual cluster as evidence. v2 must not double-count them.
12
Defensibility — proven, potential, not a moat
Proven
- kernel-subsystem-maintainer expertise applied to a userspace product
- a working seccomp-user-notification policy engine with CoW transactional semantics
Potential
- agent-specific policy layer: HTTP ACL, credential injection, deterministic execution
- accumulated hardening if adversarial contact occurs
- scheduler + checkpoint/restore if density becomes the axis
Not a moat
- Landlock and seccomp are public kernel features
- startup speed alone
- star count
Could a strong security team reproduce it? The architecture, yes — in six to twelve months with two or three engineers who genuinely understand seccomp notification. What stays hard: the CoW correctness surface, the TOCTOU discipline, and the kernel-maintainer judgement about which primitives will exist in two years. That is a real head start and a thin moat, and both statements are true at once.
13
Questions for the founder
Written before any conversation, with what would strengthen and weaken the thesis pre-registered — so a persuasive answer cannot retroactively become the bar. Nobody has been contacted.
- 01
Your security page says a kernel LPE in a permitted syscall defeats the sandbox. Which customers have accepted that trade, which have refused it — and what did the ones who refused choose instead?
- 02
cow/seccomp.rs is your largest file. What is the hardest correctness problem in the copy-on-write path, and what have you got wrong there before?
- 03
Has anyone outside the team attempted an escape? Audit, bug bounty, red team, a customer's security review — what happened, and what did it change?
- 04
Landlock ABI v6 means kernel 6.12. What fraction of inbound interest dies on that requirement, and what does allow_degraded actually get used for in the field?
- 05
Multikernel sells three products. If you had to kill two, which survive — and is Sandlock a wedge into the cloud-OS business, or the business itself?
- 06
branchfs and branching both stopped in Q2 2026 as sandlock accelerated. What did you learn that made you consolidate?
- 07
Sandlock is Apache-2.0 and your site says “what is open, what is licensed.” Where is that line, and what stops a cloud provider from running the open core as a service?
14
What would change this view
Upgrade
An independent audit or a real adversarial engagement with a published outcome; two or more named production users who chose it over a container runtime; evidence that the HTTP-ACL and credential-injection layer is why they chose it; a defensible open/licensed boundary; a second senior systems engineer with material ownership.
Downgrade
An escape that does not require a kernel bug; “nobody has tried to break it”; discovery that adoption is driven by speed alone; a major platform shipping equivalent policy-level egress control; continued three-product spread with no ranking; or evidence of an institutional round already closed at a price that removes the Day-0 window.
Provenance
Source ledger
Every claim above traces to one of these sources. All evidence gathered 2026-08-23 from public material; nobody was contacted.
Source ledger
- S1
github.com/multikernel/sandlock (GitHub API)
- S2
Repository tree (git/trees/main?recursive=1)
- S3
README.md (817 lines)
- S4
docs/sandbox-reference.md (540 lines)
- S5
arXiv:2605.26298 — *Sandlock: Confining AI Agent Code with Unprivileged Linux Primitives*, 2026-05-25, Cong Wang and Yusheng Zheng
- S6
sandlock.io/security.html (site source, multikernel/sandlock.io)
- S7
sandlock.io/comparison.html
- S8
sandlock.io navigation + footer
- S9
GitHub contributors API
- S10
GitHub participation stats
- S11
GitHub releases API
- S12
Recent commit log
- S13
orgs/multikernel/repos
- S14
multikernel.io/about.html
- S15
GitHub languages API
- S16
crates/sandlock-core/src/landlock.rs (881 lines, read)
- S17
search/code?q=sandlock+org:eunomia-bpf
- S18
Phase 2 collection (data/collected/github_repos.json)
- S19
Phase 2 outputs/intro_queue.json