From 41629720392930a7c784a67f1818df7e341da230 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Sat, 5 Sep 2026 14:41:35 -0400 Subject: [PATCH] Harden Mediascholar sandbox on Ubuntu --- papers/mediascholar/apparmor/mediascholar-bwrap | 10 ++++++++++ papers/mediascholar/install-jasellite.sh | 14 ++++++++++++-- papers/mediascholar/run-sandboxed.sh | 8 +++++++- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 papers/mediascholar/apparmor/mediascholar-bwrap diff --git a/papers/mediascholar/apparmor/mediascholar-bwrap b/papers/mediascholar/apparmor/mediascholar-bwrap new file mode 100644 index 0000000000..d6cf9f7aae --- /dev/null +++ b/papers/mediascholar/apparmor/mediascholar-bwrap @@ -0,0 +1,10 @@ +# Permit Bubblewrap to create the user namespace used by Mediascholar without +# relaxing Ubuntu's global restriction on unprivileged user namespaces. +abi , +include + +profile mediascholar-bwrap flags=(unconfined) { + userns, + + include if exists +} diff --git a/papers/mediascholar/install-jasellite.sh b/papers/mediascholar/install-jasellite.sh index 42b3393fec..38017e4c64 100644 --- a/papers/mediascholar/install-jasellite.sh +++ b/papers/mediascholar/install-jasellite.sh @@ -20,7 +20,8 @@ RUNNER="$SOURCE_RUNNER" stage_runtime() { [[ -d "$REPO/node_modules" ]] || { echo "$REPO/node_modules is required" >&2; exit 1; } install -d -m 0755 \ - "$RUNTIME/papers/bin" "$RUNTIME/papers/mediascholar/systemd" \ + "$RUNTIME/papers/bin" "$RUNTIME/papers/mediascholar/apparmor" \ + "$RUNTIME/papers/mediascholar/systemd" \ "$RUNTIME/slab/bin" "$RUNTIME/toolchain/mcp" install -m 0755 "$SOURCE_ROOT/papers/bin/mediascholar.mjs" "$RUNTIME/papers/bin/mediascholar.mjs" install -m 0755 "$SOURCE_ROOT/papers/mediascholar/run-sandboxed.sh" "$RUNTIME/papers/mediascholar/run-sandboxed.sh" @@ -37,6 +38,8 @@ stage_runtime() { "$SOURCE_ROOT/papers/mediascholar/topic-prompt.md" \ "$SOURCE_ROOT/papers/mediascholar/paper-prompt.md" \ "$RUNTIME/papers/mediascholar/" + install -m 0644 "$SOURCE_ROOT/papers/mediascholar/apparmor/mediascholar-bwrap" \ + "$RUNTIME/papers/mediascholar/apparmor/mediascholar-bwrap" install -m 0755 "$SOURCE_ROOT/papers/mediascholar/install-jasellite.sh" \ "$RUNTIME/papers/mediascholar/install-jasellite.sh" install -m 0644 "$SOURCE"/*.service "$SOURCE"/*.timer "$RUNTIME/papers/mediascholar/systemd/" @@ -89,7 +92,14 @@ install_dependencies() { sudo -n ionice -c 3 nice -n 19 apt-get update sudo -n ionice -c 3 nice -n 19 apt-get install -y --no-install-recommends \ texlive-xetex texlive-latex-extra texlive-fonts-recommended texlive-bibtex-extra \ - poppler-utils imagemagick zip bubblewrap + poppler-utils imagemagick zip bubblewrap apparmor-utils + if command -v aa-exec >/dev/null 2>&1 && \ + [[ -w /sys/kernel/security/apparmor/.load || -e /sys/module/apparmor ]]; then + sudo -n install -m 0644 \ + "$RUNTIME/papers/mediascholar/apparmor/mediascholar-bwrap" \ + /etc/apparmor.d/mediascholar-bwrap + sudo -n apparmor_parser -r /etc/apparmor.d/mediascholar-bwrap + fi } install_codex() { diff --git a/papers/mediascholar/run-sandboxed.sh b/papers/mediascholar/run-sandboxed.sh index f9bc5b0507..f47ed88132 100644 --- a/papers/mediascholar/run-sandboxed.sh +++ b/papers/mediascholar/run-sandboxed.sh @@ -19,6 +19,12 @@ fi mkdir -p "$STATE" "$ADVERTISE_DIR" +declare -a bwrap_command=(bwrap) +if command -v aa-exec >/dev/null 2>&1 && \ + aa-exec -p mediascholar-bwrap -- /bin/true >/dev/null 2>&1; then + bwrap_command=(aa-exec -p mediascholar-bwrap -- bwrap) +fi + declare -a root_paths=() for source_path in /bin /sbin /lib /lib64; do if [[ -L "$source_path" ]]; then @@ -28,7 +34,7 @@ for source_path in /bin /sbin /lib /lib64; do fi done -exec bwrap \ +exec "${bwrap_command[@]}" \ --die-with-parent \ --new-session \ --unshare-pid \ -- 2.51.2