PAGES
← all tools
◆ Runtime Security

Bubblewrap

v0.13.1 open-source

Bubblewrap is a tool for constructing sandbox environments that lets unprivileged users run applications with restricted access to the operating system.

Summary

Bubblewrap is an open-source command-line sandboxingsandboxingRunning code inside a restricted environment that limits what it can access or change. The isolation reduces the impact of mistakes or untrusted code, depending on the sandbox's controls. tool for Linux that builds isolated container environments using unprivileged user namespaces, rather than requiring root or setuid binaries. It runs as a single binary invoked with arguments that define mounts, filesystem layout, and process restrictions, so the security model of any given sandbox is entirely determined by whoever constructs the command line — often a larger framework rather than an end user. Its README notes it is used underneath tools like Flatpak and libgnome-desktop, making it most relevant to developers building sandboxing or container frameworks rather than a ready-made sandbox for end users. It sits in the runtime-security and container-isolation space, with recent work adding file-descriptor-based mounts to close TOCTOU races, overlay mount support, and a non-fatal setup mode for cases that don't require a strict security boundary.

Bubblewrap is a tool for constructing sandbox environments that lets unprivileged users run applications with restricted access to the operating system.

How Bubblewrap helps

Can an unprivileged user on this machine run a confined process without a setuid helper?

it builds the sandbox with Linux user namespaces alone, so any logged-in user can construct the container without root or a setuid binary being installed

Does a directory get swapped out from under a sandbox between the time it is checked and the time it is mounted?

mounting by a pre-opened file descriptor instead of a path closes that window, so a caller that verifies a path first can bind exactly what it verified

Should a sandbox setup failure abort the job or continue anyway?

a flag marking the sandbox as not a security boundary makes setup problems like a failed submount remount non-fatal, so filesystem-layout use cases keep running instead of hard-failing

Is a given deployment still relying on the old setuid installation mode?

setuid support has been removed entirely, so any binary built or installed that way will refuse to run, surfacing the dependency immediately rather than silently staying insecure

Can sandbox log messages be correlated with the rest of the system journal during an incident?

log output can be emitted in a form systemd-cat and logger understand, so sandbox events carry proper priority levels alongside other journal entries

all 18 features, with the evidence for each →

Languages

Not documented

Features

18 capabilities · 1 backed by code, an API document or a real run

Built from Bubblewrap's releases, docs, README and our own runs. “Seen” marks the month we first spotted a release the vendor didn't date. Group names and tags are our labels.

Compare with peers →

  • Bubblewrap covers 1 of the 11 endpoint investigation and controls capabilities we track.

What Bubblewrap offers you

  • Command-line interface6
All capabilities 18 capabilities
Process name hiding shipped Set the binary name visible to processes inside the sandbox to a custom value instead of 'bubblewrap'. 6 releases · 1 other source · first seen Jan 2017

release

  • Adds --argv0 argument v0.9.0 · Mar 2024 · source · release history
  • Adds --die-with-parent CLI flag to kill child processes if bwrap's own parent process terminates v0.1.8 · Mar 2017 · source · release history
  • Adds --share-net flag to exclude the network namespace from unsharing when used with --unshare-all v0.1.7 · Jan 2017 · source · release history
  • Adds --new-session flag to conditionally create a new session ID via setsid() v0.1.7 · Jan 2017 · source · release history
  • Adds --unshare-all shorthand that unshares all currently supported namespaces (user, ipc, pid, net, uts, cgroup) v0.1.7 · Jan 2017 · source · release history
  • setsid() is no longer called unconditionally by default; you must explicitly use --new-session if you require a new session ID v0.1.7 · Jan 2017 · source · release history

example

  • Set the binary name visible to processes inside the sandbox to my-app instead of bubblewrap. bwrap --argv0 my-app --run bash v0.9.0 · Mar 2024 · source
Journal logging integration shipped suggested Emit log output parseable by logger and systemd-cat so sandbox messages appear in the journal with proper priority levels. 4 releases · 1 other source · first seen May 2019

Suggested capability: Process telemetry. This is our guess, not confirmed.

release

  • Adds --level-prefix option to emit log output parseable by logger --prio-prefix and systemd-cat --level-prefix=1. v0.11.0 · Oct 2024 · source · release history
  • Adds namespace IDs to the status/json output via the namespace_id field v0.4.0 · Nov 2019 · source · release history
  • Updates JSON API output under --json-status-fd to include the COMMAND exit code separate from bwrap's own exit code v0.3.3 · May 2019 · source · release history
  • Adds --json-status-fd flag to bwrap for reporting the child process exit code in JSON format v0.3.3 · May 2019 · source · release history

example

  • Capture bubblewrap log output with systemd-cat so sandbox messages appear in the journal with proper priority levels. bwrap --level-prefix --ro-bind / / -- myapp 2>&1 | systemd-cat --level-prefix=1 v0.11.0 · Oct 2024 · source
Process lifecycle management shipped Configure how child processes are terminated and cleaned up, including killing them when the parent process ends. 4 releases · 1 other source · first seen Mar 2017

Also counts toward: Command-line interface

release

  • Adds --perms flag to set specific permissions for a subsequent mount point like --bind-data, --dir, --file, --ro-bind-data, or --tmpfs. v0.5.0 · Aug 2021 · source · release history
  • Adds --clearenv flag to unset every environment variable except PWD during sandbox execution. v0.5.0 · Aug 2021 · source · release history
  • Adds --chmod flag to change permissions of bound files or directories after they are mounted. v0.5.0 · Aug 2021 · source · release history
  • Adds --die-with-parent CLI flag to kill child processes if bwrap's own parent process terminates v0.1.8 · Mar 2017 · source · release history

example

  • Run a build inside a sandbox that automatically cleans up all internal processes if the calling script or CI step is killed or finishes. bwrap --die-with-parent make check v0.1.8 · Mar 2017 · source
File descriptor-based mounts shipped Mount a filesystem represented by a pre-opened file descriptor to eliminate time-of-check/time-of-use (TOCTOU) race conditions. 3 releases · 1 other source · first seen Aug 2024

release

  • On kernels that support it (5.12+), use mount_setattr() to remount filesystems with ro, nodev and/or nosuid. v0.13.0 · Sep 2026 · source · release history
  • Adds --bind-fd and --ro-bind-fd options to mount a filesystem represented by a file descriptor, preventing time-of-check/time-of-use (TOCTOU) attacks. v0.10.0 · Aug 2024 · source · release history
  • Adds --bind-fd and --ro-bind-fd options (backported from 0.10.0) to mount a filesystem represented by a file descriptor, eliminating time-of-check/time-of-use (TOCTOU) race conditions. v0.6.3 · Aug 2024 · source · release history

example

  • Mount a directory into the sandbox via a pre-opened file descriptor to eliminate TOCTOU race conditions — useful when the caller needs to verify the path before passing it to bwrap. bwrap --bind-fd 5 /mnt/sandbox-root ... 5</path/to/trusted/dir v0.10.0 · Aug 2024 · source
Input validation for paths shipped Reject empty string arguments for path options instead of silently treating them as the root directory. 3 releases · 1 other source · first seen Jul 2018

release

  • Path arguments such as --bind and --overlay-src now reject empty strings instead of silently treating them as the root directory. v0.13.0 · Sep 2026 · source · release history
  • Arguments that expect a path argument (--bind, --overlay-src, etc.) now reject empty strings. v0.13.0 · Sep 2026 · source · release history
  • Adds -- pseudo-argument to terminate option parsing on the bwrap CLI v0.3.0 · Jul 2018 · source · release history

example

  • Verify the new argument termination feature is available in your environment. bwrap --version | grep -q '\-\-' && echo "Support present" || echo "Unsupported" v0.3.0 · Jul 2018 · source
Fail-open sandbox mode shipped Enable non-fatal failures for sandbox setup steps, allowing the sandbox to run even if isolation measures partially fail. 2 releases · 2 other sources · first seen Aug 2026

release

  • Adds --not-a-security-boundary flag, which makes failures in sandbox setup steps (such as remounting a submount) non-fatal — enabling fail-open behavior for use cases that do not require a strict security boundary. v0.12.0 · Aug 2026 · source · release history
  • Adds --not-a-security-boundary CLI flag to allow sandbox setup failures (e.g., submount remounting) to be non-fatal v0.12.0 · Aug 2026 · source · release history

example

  • Run a sandbox for a use case where filesystem layout isolation matters but strict security enforcement is not required, so that non-fatal setup failures are tolerated rather than aborting. bwrap --not-a-security-boundary --ro-bind /usr /usr --proc /proc --dev /dev --unshare-pid bash v0.12.0 · Aug 2026 · source
  • Run bubblewrap allowing non-fatal sandbox setup errors like failed submounts for more resilient scripting bwrap --not-a-security-boundary --bind /host/path /container/path v0.12.0 · Aug 2026 · source
Kernel version requirement enforcement shipped Disable fallback implementations for older kernels and hard-fail at runtime if the kernel version is below a specified minimum. 3 releases · 1 other source · first seen Aug 2026

release

  • Adds the assume_kernel build option to disable backward compatibility for kernels older than a specified version (e.g., 5.6.0) v0.12.0 · Aug 2026 · source · release history
  • Kernels older than the version specified by assume_kernel (if used) will result in hard failures at runtime due to the removal of the fallback implementation of openat2(RESOLVE_IN_ROOT) v0.12.0 · Aug 2026 · source · release history
  • Adds assume_kernel meson build option; specifying 5.6.0 or later disables the fallback implementation of openat2(RESOLVE_IN_ROOT) and removes backward compatibility code for older kernels, resulting in hard failures at runtime on unsupported kernels. v0.12.0 · Aug 2026 · source · release history

example

  • Compile bubblewrap assuming a kernel version >= 5.6.0 to disable older kernel fallback code meson setup build -Dassume_kernel=5.6.0 && ninja -C build install v0.12.0 · Aug 2026 · source
User namespace validation shipped Check that an existing user namespace was created with the expected configuration, such as `--disable-userns`. 3 releases · 1 other source · first seen Nov 2019

release

  • --assert-userns-disabled: checks that an existing userns was created with --disable-userns. v0.8.0 · Feb 2023 · source · release history
  • Adds --userns2 flag for additional user namespace support in unshare operations v0.4.0 · Nov 2019 · source · release history
  • Adds --userns flag to join an existing user namespace instead of creating a new one v0.4.0 · Nov 2019 · source · release history

example

  • Re-use an existing user namespace by ID for container isolation without creating a new one bwrap --userns <namespace_id> --die-with-parent /bin/sh v0.4.0 · Nov 2019 · source
Custom tmpfs configuration shipped Create a sandboxed environment with a custom-sized tmpfs mount instead of the default. 3 releases · 1 other source · first seen Sep 2018

release

  • --size option controls the size of a subsequent --tmpfs v0.7.0 · Nov 2022 · source · release history
  • Changes default root tmpfs mount type from empty string to explicit tmpfs v0.3.1 · Sep 2018 · source · release history
  • Adds --bind-try, --dev-bind-try, and --ro-bind-try CLI flags that act like regular binds if source exists, or do nothing if it does not v0.3.1 · Sep 2018 · source · release history

example

  • Create a sandboxed environment with a custom-sized tmpfs mount instead of the default. bwrap --size 512m --tmpfs /tmp v0.7.0 · Nov 2022 · source
PID 1 execution support shipped Allow the sandboxed process to run as PID 1, enabling full init systems like systemd. 3 releases · 1 other source · first seen Oct 2017

Also counts toward: Command-line interface

release

  • Adds --pidns flag to join an existing PID namespace v0.4.0 · Nov 2019 · source · release history
  • Enables recursive invocation of bwrap inside other container runtimes (Docker, Podman, runc) when user namespaces are permitted v0.3.0 · Jul 2018 · source · release history
  • Adds --as-pid1 argument to enable running a full init system like systemd inside bubblewrap v0.2.0 · Oct 2017 · source · release history

example

  • Join an existing PID namespace to share process visibility with another container or host process bwrap --pidns <pid_namespace_id> --unshare-cgroup /bin/sh v0.4.0 · Nov 2019 · source
Debug logging capability shipped Enable verbose debug logging for mount operations, gated at runtime by an environment variable. 2 releases · 1 other source · first seen Sep 2026

release

  • Adds -Ddebug_logging=true build option to enable verbose debug logging, gated at runtime by the DEBUG_INVOCATION environment variable.⁠︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄⁠ v0.13.0 · Sep 2026 · source · release history
  • A new build option -Ddebug_logging=true can be used to enable verbose debug logging (not recommended for distro builds). These debug messages don't appear unless environment variable DEBUG_INVOCATION is set at runtime. v0.13.0 · Sep 2026 · source · release history

example

  • Build bubblewrap with debug logging enabled, then trigger verbose output for a sandboxed invocation to trace mount_setattr calls. meson setup _builddir -Ddebug_logging=true meson compile -C _builddir DEBUG_INVOCATION=1 _builddir/bwrap --ro-bind /usr /usr --proc /proc --dev /dev --unshare-pid bash v0.13.0 · Sep 2026 · source
Process synchronization shipped Coordinate with parent processes or readiness checks using synchronization file descriptors. 1 release · 1 other source · first seen Oct 2026

Also counts toward: Command-line interface

release

  • Supports multiple --sync-fd arguments in a single bwrap invocation, with all provided file descriptors handled.⁠︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄⁠ v0.13.1 · Oct 2026 · source · release history

example

  • Pass multiple synchronization file descriptors to coordinate with several parent processes or readiness checks simultaneously. bwrap --ro-bind /usr /usr --proc /proc --dev /dev --unshare-pid --sync-fd 5 --sync-fd 6 bash v0.13.1 · Oct 2026 · source
Container image scanning verified Analyses container image tarballs for relevant matches, reporting when none are found and exiting with a distinct status code. 2 other sources · first seen Aug 2026

we ran it

  • The tool returned nothing appropriate for the target file and exited with status 16, indicating it found no relevant matches or applicable information for the given container image tarball. Aug 2026 · the full run

example

  • Run sandboxed shell reusing host /usr bwrap \
Idempotent symlink management shipped Create a symlink in the sandbox that remains valid and idempotent even if it already points to the correct target. 1 release · 1 other source · first seen Mar 2024

Also counts toward: Command-line interface

release

example

  • Create a symlink in the sandbox that remains valid and idempotent even if it already points to the correct target. bwrap --symlink /host/lib:/usr/lib --run bash v0.9.0 · Mar 2024 · source
Seccomp profile management shipped Apply base security policies and add custom restrictions for specific system calls via seccomp program files. 1 release · 1 other source · first seen Feb 2022

Shared capability: Security baseline enforcement

Also counts toward: Command-line interface

release

  • Adds --add-seccomp option to allow specifying multiple seccomp program files v0.6.0 · Feb 2022 · source · release history

example

  • Apply a base security policy and then add custom restrictions for specific system calls. bwrap --seccomp base.json --add-seccomp custom-restrictions.json /bin/sh v0.6.0 · Feb 2022 · source
Overlay filesystem support shipped Create overlay mounts inside sandboxes to provide read-write layers over read-only base directories. 1 release · first seen Oct 2024

Also counts toward: Command-line interface

release

  • Adds --overlay, --tmp-overlay, --ro-overlay, and --overlay-src options to create overlay mounts inside sandboxes (unavailable in setuid installations). v0.11.0 · Oct 2024 · source · release history
Conditional bind mount support shipped Mount host paths or device bindings only if the source exists, preventing sandbox failures due to missing files. 1 other source · first seen Sep 2018

example

  • Mount a host config file only if it exists, preventing bwrap failure when the file is missing. bwrap --bind-try /etc/myapp.conf /etc/myapp.conf v0.3.1 · Sep 2018 · source
Linux capability control shipped suggested Selectively retain or drop specific Linux capabilities within the sandbox environment. 1 release · first seen Oct 2017

Suggested capability: Security baseline enforcement. This is our guess, not confirmed.

release

  • Adds --cap-add and --cap-drop CLI arguments to retain or drop specific Linux capabilities within the sandbox v0.2.0 · Oct 2017 · source · release history
Setuid build configuration shipped retired Control whether the tool is built with setuid support, allowing deployments to disable this feature for security hardening. 2 releases · 1 other source · first seen Apr 2026

Shared capability: Security baseline enforcement

release

  • Support for building a setuid bubblewrap is removed v0.12.0 · Aug 2026 · source · release history
  • New build option -Dsupport_setuid=false (now the default) disables setuid support at compile time, causing binaries to refuse to run if made setuid. v0.11.2 · Apr 2026 · source · release history

example

  • Build bubblewrap without setuid support so any accidental setuid installation is rejected at runtime, eliminating exposure to setuid-only CVEs. meson setup builddir -Dsupport_setuid=false && ninja -C builddir v0.11.2 · Apr 2026 · source

Lines in monospace are the tool's own words: help text parsed from its source, or an endpoint from its API document. Under release, a line is our summary of a dated release. Under docs, it is quoted from the tool's own documentation or website. Each links back to the source it came from.

Score card

  1. Shipping velocity releases a month, last 12 months
  2. Documentation quality release-notes rubric, 0–100
  3. Breaking-change discipline how rarely a release breaks users, and notice given
  4. Maintenance risk quiet time against its own cadence, maintainers
  5. Innovation & surface new capabilities, API and MCP surface
  6. Community health
  7. Contributor trend distinct committers, this year against last
  8. Maintainer concentration bus factor now against a year ago
  9. Issue backlog trend issues closed per issue opened, 12 months
  10. Responsiveness median time to a maintainer’s first reply

Nine scores for Bubblewrap, each built from the releases, notes and API history this site tracks — and, on Researcher and Business, where it stands among every measured tool in its category and how that has moved.

Score cards are part of every paid plan.

See plans →

Each score is 0–100 on a published rubric, derived from data this site already shows. A dimension we cannot measure says so — it is never scored 0 and never enters a rank.

How this is scored
  • Shipping velocity — releases a month over the last 12 months, on a log scale where 16 a month scores 100. Needs 3 releases in the window.
  • Documentation quality — the release-notes rubric published on the analytics page, unchanged.
  • Breaking-change discipline — the share of releases carrying a breaking change (none scores 100, half or more scores 0). Only projects that label breaking changes are measured: a clean record cannot be told from an unlabelled one.
  • Maintenance risk — quiet time measured against the tool's own release cadence (quiet longer than 90 days and three typical gaps scores 0), plus the number of active maintainers and whether contributors are growing, where known. Higher is lower risk.
  • Innovation & surface — new capabilities in the feature ledger this year, API and MCP operations added, and the share of commits that are features: the mean of whichever we hold.
  • Community health (open-source tools only) — each is a direction, not a size: contributors this year against last, the bus factor now against a year ago, and issues closed per issue opened, where steady scores 50, doubled 100 and halved 0; plus the median time to a maintainer's first reply (an hour scores about 100, a month or more 0). A commercial card has no repository and carries none of the four.
  • Documented delivery (commercial tools) — when a vendor's documented new capabilities have slowed against its own baseline, that counts against the overall standing as heavily as two low dimensions. Steady delivery, or too little history to judge, leaves the standing alone; it is never a sixth score.
  • Open-source tools are scored on repository signals; commercial tools on their published changelog. Ranks compare tools within one category and one profile and need at least five measured peers; the overall standing needs three ranked dimensions. Best-in-breed or consolidator is a shape, not a quality, and is never scored.

Release-note detail over time

See how much detail Bubblewrap puts in its release notes, quarter by quarter, and compare it with tracked tools in the same category. This history uses up to ten retained, reviewed notes per tool; sparse or blank older quarters may reflect that limit.

Checking release-note history…

Explore the full chart →

Releases

Show

22 entries

  1. October 20261
  2. September 20261
  3. August 20262
  4. April 20262
  5. October 20241
  6. August 20242
  7. March 20241
  8. February 20231
  9. November 20221
  10. May 20221
  11. February 20221
  12. August 20211
  13. November 20191
  14. May 20191
  15. September 20181
  16. July 20181
  17. October 20171
  18. March 20171
  19. January 20171
    Show

    22 entries

    Project health

    Issue, contributor and maintainer activity in containers/bubblewrap, 2023-10 – 2026-09, as of 2026-09-25. Twelve-month figures first; the trend lines run the whole window.

    1. Contributors 11 +8 vs prior 12 months
    2. Maintainers 3 +3 joined · −1 left, last 12 months
    3. Bus factor 2 committers behind half the commits
    4. Community-filed 91% of issues opened, last 12 months
    5. Median time to close 2.2 days first maintainer reply 3.4 hours
    6. Open backlog 153 of 393 issues ever filed
    1. Issues opened / month 2 · 0 communitymaintainers
    2. Open backlog 153
    3. Contributors / month 3
    4. Commits / month 22
    5. Stars 8,768
    Issue themes, last 12 months
    • features 4%
    • other 96%

    Counts from the project's public repository and git history; no individuals are identified. Maintainers are the committers covering 80% of the last year's commits. how we measure this

    Libraries its release ships

    What its latest release locks, checked against known advisories.

    None of its release's images build from a lockfile we can read.

    Add the badge to your README

    Maintain this project? The badge links readers straight to this page, so they can follow every release here.

    Tracked by Cyber Toolchain Choose a badge style and copy the code →
    browse all tools → score card for your toolchain →