Commit Graph

31 Commits

Author SHA1 Message Date
mrtoth 6e81866226 Default to whitelist mode and parallelize tests
Flips the default sandbox mode from blacklist to whitelist and
replaces the global RUST_TEST_THREADS=1 with a targeted RwLock
that only serializes blacklist sandboxes against tests mutating
glob-matching host paths. A new Sandbox newtype acquires the
guard automatically when --blacklist is in args.
2026-04-27 08:18:41 +02:00
mrtoth c77dbc10c3 Implement profile inheritance 2026-04-26 23:58:21 +02:00
mrtoth 7f9b21ef4f Organize test code better 2026-04-25 15:10:42 +02:00
mrtoth 7c9375cd94 Canonicalize blacklist overlay paths to skirt /var/run symlink 2026-04-23 18:47:27 +02:00
mrtoth 305ac9d927 Accept SRC:DST remap syntax in --ro/--rw 2026-04-22 21:51:00 +02:00
mrtoth 494da52fc6 Replace setenv with env list supporting host passthrough 2026-04-22 20:47:01 +02:00
mrtoth 0d0682b04e Replace --new-session with seccomp TIOCSTI/TIOCLINUX filter 2026-04-12 15:58:50 +02:00
mrtoth 8f30d28965 Let --rw override --ro on a child path by emitting ro binds first 2026-04-12 14:36:07 +02:00
mrtoth 25f0037aab Filter environment variables in both sandbox modes
Whitelist mode now clears the parent env and re-adds a small allowlist
(identity, terminal, locale, proxy, non-GUI XDG, vendor prefixes).
Blacklist mode strips cloud credentials, backup passphrases, dangling
socket pointers, and anything matching *_TOKEN, *_SECRET, *_PASSWORD,
*_PASSPHRASE, *_API_KEY, *_PRIVATE_KEY, *_CLIENT_SECRET; vendor prefix
carve-outs keep ANTHROPIC_API_KEY and friends.

Users can override via --setenv KEY=VALUE and --unsetenv KEY (and the
corresponding TOML keys), or opt out of the built-in policy entirely
with --no-env-filter.
2026-04-08 09:22:11 +02:00
mrtoth 12644ae31e Apply a seccomp-BPF syscall allowlist by default
Derived from Podman's default profile, stripped of capability-conditional
rules (we never grant capabilities), argument filters, and the explicit
EPERM block. Dangerous syscalls (mount, unshare, ptrace, bpf,
perf_event_open, io_uring_*, keyctl, kexec_*, ...) fall through to the
default ENOSYS action, which also keeps glibc's clone3 -> clone fallback
working. x86_64 and aarch64 are supported; other archs error out.

Toggle with --seccomp / --no-seccomp or seccomp = <bool> in config.
2026-04-08 08:34:34 +02:00
mrtoth 5f3b139457 Drop redundant trim() before split_whitespace()
split_whitespace already skips leading and trailing whitespace, so the
trim() call is redundant and trips clippy::trim_split_whitespace.
2026-04-08 00:23:15 +02:00
mrtoth 8010e9102e Allow disabling boolean flags from the CLI
Pair --hardened, --dry-run, and --unshare-net (renamed from --no-net)
with negation counterparts so a CLI invocation can override a truthy
config-file or profile value.
2026-04-08 00:22:50 +02:00
mrtoth 17f0e84005 Allow setting entrypoint from CLI 2026-04-07 18:02:03 +02:00
mrtoth 83bd4305c7 Bind symlinked rw/ro paths at the user-written destination
Canonicalizing rw/ro paths in the config layer resolved symlinks before
the sandbox was built, so a symlinked entry only appeared at its
target's location -- never at the path the user wrote. Stop
canonicalizing rw/ro at the config layer and instead resolve only the
source side of the bind in sandbox.rs.
2026-04-07 17:45:38 +02:00
mrtoth 062ddab5f8 Add entrypoint option 2026-04-04 10:16:57 +02:00
mrtoth 8ecba5d6dc Add option to pass through arguments to brwap, use shlex for dry-run 2026-04-04 08:51:08 +02:00
mrtoth 8958f79ece Document and expand test coverage of config file feature 2026-04-04 08:51:08 +02:00
mrtoth db60fb9ddb Reject unknown config keys 2026-04-01 23:51:47 +02:00
mrtoth c7c4c673cb Add mask option to hide paths/files from sandbox 2026-04-01 23:19:08 +02:00
mrtoth 0119834d5a Implement config file parsing and precedence with CLI 2026-03-31 01:22:08 +02:00
mrtoth f1d7a14b8d Ensure root filesystem is always read-only inside sandbox
Whitelist mode's implicit bwrap root was a writable tmpfs, letting the
sandboxed process create files and directories anywhere not covered by
an explicit ro mount. This was not an issue in blacklist mode due to
--ro-bind / / covering that case.

This patch adds --remount-ro / before any other mount to make the base
layer read-only in both modes.
2026-03-29 16:50:59 +02:00
mrtoth 99f9395c10 Move require_run_user to lib.rs and make blacklist module private 2026-03-25 23:54:35 +01:00
mrtoth d79563d948 Add integration test for /dev/input/ being hidden in blacklist mode 2026-03-25 23:02:24 +01:00
mrtoth 82f84247f1 Rework handling of /run and ${RUNUSER} in blacklist mode 2026-03-25 22:48:39 +01:00
mrtoth 0bd91ffad2 Add /sys to whitelist mode 2026-03-25 22:22:35 +01:00
mrtoth dccf2309a5 Add --new-session to bwrap invocation 2026-03-25 22:15:21 +01:00
mrtoth ada9da7ae7 Reject empty HOME envvar 2026-03-20 21:43:08 +01:00
mrtoth 4112288a30 Ensure passing relative paths to CLI works 2026-03-20 21:36:55 +01:00
mrtoth 94535b20d3 Fix blacklist bind mount order 2026-03-20 21:02:48 +01:00
mrtoth ba885b7dd6 Ensure test file is cleaned up in cwd_is_writable test case 2026-03-20 18:52:03 +01:00
mrtoth bf53d92d49 Initial commit 2026-03-20 18:40:08 +01:00