Skip to main content

A Python package for running sandboxed code.

Project description

pybubble

A simple wrapper around bubblewrap to create sandboxed environments for executing code. It works without Docker or other daemon-based container runtimes, using shared read-only root filesystems for quick (1-2ms) setup times.

While these environments are sandboxed and provide protection from accidental modification of your host system by overzealous LLMs, pybubble is not sufficient to protect you against actively malicious code. In general, while containerization solutions like pybubble or Docker offer a reasonable degree of protection from accidental damage, when accepting input from the public you should consider using virtualization in place of or in addition to containers.

Feel free to submit bug reports and pull requests via GitHub, but note that Arcee is not committing to long-term support of this software. I wrote this library in my spare time to solve an irritating problem with building code execution environments, so expect a pace of updates consistent with "time I have while waiting for a debug run to finish".

Due to relying on Linux kernel features to operate, pybubble is not compatible with macOS or Windows.

Setup

Install bwrap. On Ubuntu, do:

sudo apt-get install bubblewrap

Optionally, for overlay filesystem support (writable rootfs without modifying the original):

sudo apt-get install fuse-overlayfs

Then, add pybubble to your project.

uv add pybubble

Root filesystem archives

Prebuilt wheels for pybubble come bundled with an x86 Alpine Linux root filesystem archive based on default-rootfs.dockerfile. It comes with:

  • Python
  • uv
  • bash
  • ripgrep
  • cURL & wget
  • numpy
  • pandas
  • httpx & requests
  • pillow
  • ImageMagick

If you need more tools or want to run a leaner environment, follow this guide to build one yourself.

Run sandboxed code

from pybubble import Sandbox
import asyncio

async def main():
    with Sandbox() as sbox:
        process = await sbox.run("ping -c 1 google.com", allow_network=True)
        stdout, stderr = await process.communicate()
        print(stdout.decode())

        process = await sbox.run_script("print('hello, world')", timeout=5.0)
        stdout, stderr = await process.communicate()
        print(stdout.decode())

if __name__ == "__main__":
    asyncio.run(main())

PTY mode

For interactive programs, pass use_pty=True to get a real pseudoterminal. Ctrl+C, colors, job control, and curses apps all work.

async def main():
    with Sandbox() as sbox:
        proc = await sbox.run("bash", use_pty=True)
        await proc.send(b"echo hello\n")

        async for chunk in proc.stream(decode=True):
            print(chunk, end="")

        await proc.wait()
        proc.close_pty()

Overlay filesystem

With fuse-overlayfs installed, you can make the rootfs writable without modifying the cached original:

with Sandbox(rootfs_overlay=True) as sbox:
    proc = await sbox.run("apk add git", allow_network=True)
    await proc.communicate()

Use the CLI

You can also run programs interactively via the CLI.

uv run pybubble run bash
sandbox:~$ echo "Hello, world!"
Hello, world!

With an overlay filesystem:

uv run pybubble run --rootfs-overlay bash
sandbox:~$ apk add nodejs

To learn more about the features available in Sandbox, see this page.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pybubble-0.3.0.tar.gz (75.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pybubble-0.3.0-py3-none-any.whl (75.5 MB view details)

Uploaded Python 3

File details

Details for the file pybubble-0.3.0.tar.gz.

File metadata

  • Download URL: pybubble-0.3.0.tar.gz
  • Upload date:
  • Size: 75.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pybubble-0.3.0.tar.gz
Algorithm Hash digest
SHA256 9f8b64fa70819a698459523e67a2cffaeb795f11ba954e400ffff9a60f15e4d3
MD5 389d98ca70f0b7d1a61ef9e6ffbdefd9
BLAKE2b-256 9a8e4b51b63e3b7b3b9d19fa6e4d6448092269480f597ceec96028778ebf82af

See more details on using hashes here.

File details

Details for the file pybubble-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: pybubble-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 75.5 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pybubble-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cfb8f2877dba0ef5a2c9bd8cac7f35517d53e3ce928322392ce13b9a66d70818
MD5 a3871144fbccfdd4502ea1973c57c535
BLAKE2b-256 f2e3cdf575a7d985e4921c70cfe32a5686fb93153d97b4c86e7ddb16421bc79e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page