Skip to content

Releases: blox-eng/openblox

v0.8.1

Choose a tag to compare

@Lutherwaves Lutherwaves released this 21 Sep 09:47
df7c60b

0.8.1 (2026-09-21)

Bug Fixes

  • docker: report a stopped sandbox as its own error kind (#49) (df7c60b)

Documentation

v0.8.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 21 Sep 09:26
f36f02c

0.8.0 (2026-09-21)

Feature

  • ci: attach third-party licence text to the daemon releases (#48) (f36f02c)

Documentation

  • state the layer openblox occupies and the rule that bounds it (#35) (d2697d9)
  • image: let the reader verify the digest they are told to pin (#47) (6e5a8fc)

Chores

  • deps: bump mkdocs-material from 9.5.44 to 9.7.7 (#38) (0f12844)

CI

  • stamp the shipped releases in the changelog and guard against drift (#46) (fb262b9)

v0.7.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 20 Sep 22:13
a2099f8

0.7.0 (2026-09-20)

Feature

  • daemon: remote transport with mTLS caller authentication (#34) (a2099f8)

v0.6.2

Choose a tag to compare

@Lutherwaves Lutherwaves released this 20 Sep 21:49
76ffa08

0.6.2 (2026-09-20)

Bug Fixes

  • ci: bound and retry the gVisor install so a stall cannot skip a release (#44) (76ffa08)

Documentation

Chores

  • deps: bump the actions group across 1 directory with 6 updates (#41) (5016160)

v0.6.1

Choose a tag to compare

@Lutherwaves Lutherwaves released this 20 Sep 20:10
cef2c47

0.6.1 (2026-09-20)

Bug Fixes

  • ci: verify the published image on both platforms (#42) (cef2c47)

v0.6.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 20 Sep 19:51
06409cc

0.6.0 (2026-09-20)

Breaking Changes

  • harden sandbox isolation, release pipeline, and docs for public release (#40) (06409cc)

* feat!: harden sandbox isolation, release pipeline, and docs for public release

Fixes five security weaknesses, tightens the release pipeline against
supply-chain tampering, and documents the trust boundary the project
actually enforces.

Security fixes:

- Preview proxy cross-sandbox response leak. preview.Handler pooled
  upstream keep-alive connections under one shared host, so a request
  authorised for one sandbox port could be served over an idle connection
  to a different sandbox port. Every (sandbox, port) now has its own pool
  and the dialler refuses an address outside the authorised route.
- Unbounded Exec output. A sandbox printing until its timeout could
  exhaust the memory of the calling process, or of openbloxd, taking down
  every sandbox it brokers. Output is now capped per stream at 16 MiB.
- Timed-out commands kept running. Exec stopped waiting but the command
  and its children ran on inside the sandbox. The process group is now
  killed with SIGKILL.
- Root was not refused. WithUser documented that root was forbidden but
  did not enforce it.
- Swap doubled the memory bound. Sandboxes are created with MemorySwap
  equal to Memory.

Release pipeline: the vulnerability gate now fails closed, the release
workflow no longer runs an unpinned third-party binary with the release
token, refuses workflow_run events originating from pull requests, and
tags exactly the commit CI verified. Published image versions can no
longer be overwritten. Binaries and the sandbox image carry Sigstore
build provenance and a CycloneDX SBOM.

Also adds an adversarial integration suite (network, filesystem,
privilege, process and timeout, output flooding, cross-sandbox
isolation, crash recovery, daemon restart, client disconnect, leak
check), runs the gVisor suites on arm64, and adds THREAT_MODEL.md and
RELEASING.md.

BREAKING CHANGE: WithUser and the openbloxd profile `user` now accept
only an explicit, numeric, non-zero uid:gid. Root (0:0), group 0, user
names and a bare uid ("1000") are refused: Create returns ErrInvalid and
openbloxd refuses to load such a config. A name is refused because the
untrusted image resolves it and can map it to uid 0; a bare uid because
Docker then takes its groups from that image's /etc/passwd and
/etc/group, which can include group 0. The default, 1000:1000, is
unaffected.

Exec now keeps at most sandbox.MaxOutputBytes (16 MiB) of each of stdout
and stderr; output past that is discarded and Result.Truncated is set.
Read large results with ReadFile, which streams.

Create on a stopped sandbox now replaces it with a fresh one under the
options of that call, rather than returning it still stopped.

Cancelling an Exec context now returns the context's error rather than
ErrTimeout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: close review gaps in containment, the kill path, and the publish guards

From review of the hardening pass. Each was verified against the code
before being fixed.

- Spec.Validate refuses an EgressPolicy that is neither EgressNone nor
  EgressUnrestricted. Backends attach a network interface to anything
  that is not EgressNone, so an unchecked value resolved to the
  permissive answer.
- killGroup waits briefly for the group record instead of giving up when
  it is absent. A command cancelled between the runtime starting it and
  its wrapper's first statement had no record to be killed by and ran on
  — the case a client that disconnects as soon as it has asked is most
  likely to produce. killScript now reports "no record yet" distinctly
  from "nothing to kill", and removes the record only once it has read
  it, so a concurrent write is never unlinked from under the wrapper.
- Backend.halted returns its inspection error rather than reporting a
  container it could not inspect as running. Create returned a stale
  sandbox when the daemon was unreachable, or when the sandbox was
  removed between being opened and being checked; a vanished sandbox is
  now replaced.
- publish-image refuses to overwrite a published version unless the
  registry itself said the version is absent. imagetools inspect fails
  the same way for a missing manifest and for a network, registry or
  auth fault, and reading the latter as "absent" would overwrite exactly
  what the guard protects.
- The post-publish verify job holds attestations: read, which its own
  gh attestation verify needs. Without it the check fails after the
  assets are public.
- The SBOM step clears GOARCH with env -u rather than an assignment
  prefix, which reads as the mistake shellcheck takes it for.
- docs/image.md's example contract assertion checks test, which the
  stated contract requires and ReadFile execs as an external program.

Tests: the kill-path regression is covered by a test that stages a live
exec whose group record appears late; it fails without the fix. Egress
validation is covered by a table test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

Chores

  • deps: bump the actions group with 8 updates (#36) (9041645)

v0.5.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 18 Aug 09:46
b599486

0.5.0 (2026-08-18)

Feature

  • daemon: cap concurrent sandboxes per profile (#31) (b599486)

v0.4.1

Choose a tag to compare

@Lutherwaves Lutherwaves released this 17 Aug 11:49
4718bfd

0.4.1 (2026-08-17)

Bug Fixes

  • deploy: restarting the daemon broke clients that mount its socket dir (#27) (4718bfd)

v0.4.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 17 Aug 09:40
020d8d4

0.4.0 (2026-08-17)

Feature

  • openbloxd: publish the daemon binary, add --version, and genericize the docs (#26) (020d8d4)

v0.3.0

Choose a tag to compare

@Lutherwaves Lutherwaves released this 15 Aug 21:30

0.3.0 (2026-08-15)

Feature

  • openbloxd: broker the Docker API so callers never need socket access (#22) (4ecc1bc)

Documentation

  • a mark, and a README that reads like an OSS project (#19) (31c814f)

Tests

  • docker: prove the resource limits hold under attack (#20) (f89bdc0)

CI

  • run the integration tests against a real gVisor daemon (#21) (d1e7773)