Security Policy¶
Reporting a vulnerability¶
Please report security issues privately, not as a public GitHub issue.
Use GitHub's private vulnerability reporting (Security → Advisories → Report a vulnerability). That creates a private thread visible only to the maintainers.
Include what you have: affected version or commit, platform and kernel version, a reproduction, and what an attacker gains. A partial report is better than none — if you are unsure whether something counts, report it.
Expect an acknowledgement within a week. Please give us a chance to ship a fix before disclosing publicly; we will credit you in the advisory unless you'd rather stay anonymous.
Supported versions¶
Fixes land on main and go out in the next release. Only the latest release is
supported — there are no long-term-support branches.
Scope¶
Most of rlox is a training library: it runs code you wrote, so the usual trust boundary is your own. The exception is the part deliberately built to run code you do not trust.
rlox-sandbox — in scope, and the part we most want reports about¶
rlox-sandbox executes untrusted code (typically LLM-generated) under Linux
user + PID + network + mount namespaces, a seccomp-BPF allowlist, and cgroup v2
limits. Anything that defeats that containment is a vulnerability. Concretely:
- Escape — reading or writing host files outside the sandbox, obtaining a
network socket, escaping the PID or mount namespace, or nesting a user
namespace (
CLONE_NEWUSER) to gain capabilities. - Resource escape — a fork bomb, memory bomb, or FD exhaustion whose effects
outlive
run_sandboxedor reach the parent process. Contagion to the host is the specific failure this design exists to prevent. - Reward forgery — making the verifier report success for code that did not
pass, e.g. by defeating the nonce-authenticated trusted-runner protocol with
sys.exit(0),os._exit(), or monkeypatching. - Silent loss of containment — any path where
run_sandboxedexecutes code without the cgroup, seccomp filter, or namespaces actually applied. Failing closed matters as much as the guarantees themselves: a sandbox that silently degrades is worse than one that errors.
Known limitation, already documented and not a new finding: filesystem and
/proc information isolation is best-effort under AppArmor's
unprivileged_userns restriction. It is enforced at the Python-runtime level, so
a raw-syscall adversary can bypass it. A kernel-level guarantee requires relaxing
the AppArmor profile. Reports that deepen or work around this are still welcome —
we would rather hear it twice than not at all.
Out of scope¶
- Running untrusted code through the training APIs. Only
rlox-sandboxis a security boundary;Trainer, the buffers, and the env wrappers are not. - Loading a malicious checkpoint or config.
torch.loadand friends execute arbitrary code by design — treat checkpoints as you would any executable. - Denial of service against your own training run through hyperparameters.
- Vulnerabilities in dependencies, unless rlox's usage is what makes them exploitable. Report those upstream; tell us if we should pin or patch.
Verifying containment yourself¶
The containment guarantees are covered by 61 tests in crates/rlox-sandbox/.
Note that most of them skip without cgroup v2 delegation, and a skipped test
is counted by cargo as passed — so a green run on a machine without a delegated
cgroup scope proves nothing about containment. See
the crate README
for the two capability gates
(RLOX_SANDBOX_CGROUP_TESTS, RLOX_SANDBOX_ADVERSARIAL_TESTS) and how to run
the suite for real.