aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/dot_local/bin/executable__sandbox-net-parser
blob: 648ad0f6c3f5b5c4b18c21cf15e2f5519ff16c29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env sh
# Sandbox wrapper for tools that parse data from untrusted network
# sources (mpv, yt-dlp, streamlink). The threat model is RCE in a
# subtitle / muxer / extractor that walks the user's home directory
# looking for SSH/GPG keys, password store, cloud tokens, etc.
#
# Compromise: most of the system is still reachable (--bind / /), so
# Wayland, PipeWire, DBus, GPU, hardware accel and config files all
# work transparently; the sandbox only tmpfs-shadows known-sensitive
# directories so a compromised parser cannot read them.
#
# Set SANDBOX=0 to bypass entirely for a single invocation:
#   SANDBOX=0 mpv weird-codec-file.mkv
#
# Usage (called by the per-tool wrappers): _sandbox-net-parser /usr/bin/mpv "$@"

set -eu

if [ "${SANDBOX:-1}" = "0" ]; then
  bin=$1
  shift
  exec "$bin" "$@"
fi

if ! command -v bwrap >/dev/null 2>&1; then
  printf '%s: bwrap not installed; falling back to direct exec\n' "$0" >&2
  bin=$1
  shift
  exec "$bin" "$@"
fi

bin=$1
shift

# Prevent re-entry: any tool spawned inside the sandbox that resolves
# `mpv`/`yt-dlp`/`streamlink` via PATH (e.g. streamlink launching mpv)
# must find the real binary, not another wrapper that would try to
# nest a second bwrap and fail. Strip ~/.local/bin and nix-profile/bin
# from PATH inside the namespace.
inner_path='/usr/local/sbin:/usr/local/bin:/usr/bin'

exec bwrap \
  --bind / / \
  --dev-bind /dev /dev \
  --proc /proc \
  --tmpfs /root \
  --tmpfs "$HOME/.ssh" \
  --tmpfs "$HOME/.gnupg" \
  --tmpfs "$HOME/.password-store" \
  --tmpfs "$HOME/.config/gh" \
  --tmpfs "$HOME/.config/op" \
  --tmpfs "$HOME/.aws" \
  --tmpfs "$HOME/.local/share/keyrings" \
  --tmpfs "$HOME/.local/share/pass" \
  --setenv PATH "$inner_path" \
  --die-with-parent \
  --new-session \
  -- "$bin" "$@"