v2.2.4
·
287 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Features
- Migrate the
runaction's sandbox toruncwith seccomp support (#175)run-isolated.shnow hands the sandboxed command torunc(the OCI reference runtime) instead of hand-rolledunshare/nsenter/setprivnamespace/mount/capability handling. Namespaces, capabilities, mounts, uid/gid, and a seccomp filter derived from Docker's own default profile are all declared in an OCIconfig.jsonand enforced by runc itself — including joining the proxy container's existing network namespace and dropping uid/gid without a user namespace. Resolves the previously-documented "No seccomp profile" Known Limitation.
- Add
known_blocked_rulesto mark expected blocked connections (#181)- In
restrictmode,fail_on_blockedpreviously failed a step on any blocked connection, including ones you already expect and want blocked — a security check confirming a domain stays blocked, or a dependency that phones home to a known-noisy endpoint.known_blocked_rules(same wildcard/~regexsyntax asallowed_*_rules) marks those destinations so they no longer fail the step, while still showing up in the Job Summary's Blocked Hosts table under a new "Expected" column. Available on bothrunandreport.
- In
- Give actionable errors when Docker/sudo is unavailable (e.g.
ubuntu-slim) (#187)setup/run/reportpreviously let rawdocker/sudofailures propagate as a generic "Unexpected error". A newdescribeDockerFailure()classifies Docker failures and names the runner requirement explicitly, calling out container-based hosted runners likeubuntu-slimwhen relevant. A new sudo preflight inrunalso fails fast with its own error instead of misattributing a missing-passwordless-sudo failure to the user's ownrun:command.
Documentation
- Add overview and architecture diagrams for the
runaction (#179)- Matches the diagrams
transparent/explicitalready have in the README anddocs/security.md, illustratingrun's different architecture: arunc-created host process connected to the proxy container by a single dedicated veth pair rather than a shared CNI bridge.
- Matches the diagrams
- Rewrite the README to treat
runas an equal path todocker build(#180)runwas previously an "(Experimental)" bolt-on below thesetup/reportbuild engines; now that it's stable enough to promote, the README presentsdocker buildand a plainrun:step as two equally valid places to apply the same outbound-restriction technology. The fulltransparent/explicitengine breakdown moves out of "How It Works" intodocs/reference.md.
- Use literal block scalars (
|) for multiline rule examples (#182)- Replaces the folded scalar (
>-) previously used inallowed_https_rules/allowed_http_rules/allowed_ip_rulesexamples, matching therun: |style already used elsewhere in the docs. Purely cosmetic — the parser splits rules on any whitespace.
- Replaces the folded scalar (
Refactoring
- Replace the
sandbox0bridge with a direct veth connection to the proxy (#176)- The bridge existed only to give
run-isolated.sha stable, pre-known interface name to attach a veth to —init-iptables's-i sandbox0rule matches on name regardless of when the device appears. Since the sandbox and its proxy are always connected 1:1, the veth's proxy-side end is now renamed directly tosandbox0instead of being attached to a bridge.
- The bridge existed only to give
- Extract a generic markdown table formatter from host-table rendering (#186)
- Splits
core/lib/markdown-table.js's table-building logic (headers, alignment, cell joining) from the host-row-specific rendering added in #181, so the formatter isn't coupled to one fixed Host/Rule/Reason/Count/Expected column set.
- Splits
- Share image provenance verification between
setupandrun(#188)- Both actions independently implemented near-identical
resolveVerifiedImagelogic and their own error class with duplicated provenance codes. A new sharedActionErrorbase class andverifyImageDigestOrThrowconsolidate this into one testable component, giving it unit test coverage for the first time.
- Both actions independently implemented near-identical
- Add a TypeScript build foundation (#189)
- Adds
tsctype-checking (allowJs/checkJs,strict: true) for the existing.jssources acrosscore/lib,setup/src,run/src,report/src, and replaces Rollup with Rolldown for the dist build — laying the groundwork for the migration below without changing any source file's language yet.
- Adds
- Migrate the remaining Node.js sources to TypeScript (#190)
- Converts every
.jsfile undercore/lib,setup/src,run/src,report/srcto.tswith real type annotations, removes all// @ts-nocheckescapes left from #189, and strengthens error codes fromstringto literal unions (ActionError<Code extends string>).
- Converts every
- Migrate the QuickJS-executed scripts to TypeScript (#191)
- Converts the last plain JavaScript in the repo — the scripts run inside containers via QuickJS — completing the migration. Switches the QuickJS runtime from Bellard's original
quickjstoquickjs-ng(what Alpine'squickjspackage actually ships turned out to be the former, not the fork), and bundles each entry point into a single self-contained file with Rolldown instead of shipping raw sources.
- Converts the last plain JavaScript in the repo — the scripts run inside containers via QuickJS — completing the migration. Switches the QuickJS runtime from Bellard's original
CI / Maintenance
- Scope example workflow permissions to job level and make
docker-loginoptional (#183)- The example workflows logged in to GHCR before every run, but
setup's OCI registry client already falls back to anonymous pulls, and the publicdash14/buildcagepackage needs no authentication. Thedocker/login-actionstep and itspackages: readpermission are now commented out (with a note to re-enable for self-hosting under a private package), andpermissionsmoves from workflow level to job level, following least-privilege practice.
- The example workflows logged in to GHCR before every run, but
Dependencies
- Bump
google.golang.org/grpcto v1.82.1, addressing an xDS RBAC authorization bypass and an HTTP/2 Rapid Reset mitigation bypass (GHSA-hrxh-6v49-42gf) (#184) - Bump
golang.org/x/systo v0.45.0 ingen-seccomp-profile, clearing a.trivyignoreentry for a Windows-only CVE that no longer applies (#177) - Bump the
setuptest fixture'sexpressto v5.2.1, clearing qs/path-to-regexp vulnerabilities from itspackage-lock.json(#178) - Bump
pnpmto v11.10.0 (#174) - Bump
golang:1.25-alpineDocker digest to56961d7(#138) - Bump self-referential
dash14/buildcageaction pin to v2.2.3 (#173)
Full Changelog: v2.2.3...v2.2.4