release: sandy 1.4.0 — HF-incident hardening + sandbox-escape follow-ups - #95
Merged
Conversation
Bumps SANDY_VERSION 1.3.1-dev -> 1.4.0. Additive minor per the CLAUDE.md semver rule: new passive-safe keys (SANDY_EGRESS_LOG, SANDY_TOOL_AUDIT) and flags (--reset-sandbox, --stop-all), all annotated since:1.4.0. Introspection schema_version stays 1; SANDY_SANDBOX_MIN_COMPAT unchanged (0.7.10). Rolls up the 11 findings from the 'Week of Sandbox Escapes' review and the Hugging Face CISO incident post-mortem (PRs #84-#94, plus #83 in 1.3.x). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
sandy 1.4.0 — Hugging Face incident hardening + sandbox-escape follow-ups
This release works through the surviving findings from two security evaluations —
the "Week of Sandbox Escapes" review and the Hugging Face CISO incident
post-mortem — mapped onto sandy. Every item was implemented, reviewed, and
CI-gated as its own PR.
Egress proxy — the incident's exact target, hardened
The HF incident broke containment via a zero-day in the sandbox's egress proxy.
Sandy's proxy is in the same structural position, so this release treats it as an
in-scope attack surface, not just a control:
no-new-privileges,--pids-limit,--memory, andan in-proxy connection semaphore that bounds a connection storm with backpressure
rather than the OOM-killer.
--pull) so its golang base + Go stdlib get security fixes between sandyreleases;
--print-statefull mode now reportsproxy_image_created.wire parsers (invariant: never panic); THREAT_MODEL documents the proxy as a
tier-3 target. (CI wiring for the fuzz gate +
govulncheckis a follow-uppending a workflow-scoped push.)
Observability — instrument what happens inside containment
The incident's central operational failure was three quiet days. Two new,
passive-safe, opt-in signals answer "what did this session actually do":
SANDY_EGRESS_LOG(feat(proxy): log which hosts the agent's egress reached (SANDY_EGRESS_LOG, HF Issue 4) #91) — the proxy logs each distinct allowedhost:portonce (deduped); session end prints an egress summary (hosts reached, denials).
SANDY_TOOL_AUDIT(feat(claude): agent-layer tool-use audit hook (SANDY_TOOL_AUDIT, HF Issue 6) #92) — seeds a Claude CodePreToolUsehook writing a{ts,tool,args}JSONL trail (only-if-absent; Claude-only; not tamper-proofagainst a determined agent — telemetry for the primary adversary).
Recovery — rebuild from known-good, one command
sandy --reset-sandbox(feat: sandy --reset-sandbox — rebuild one project's sandbox from known-good (HF Issue 5) #93) — rebuild one project's sandbox from aknown-good skeleton (destroy persistent package/agent state, preserve
WORKSPACE.jsonlineage), refusing while a live session holds it.sandy --stop-all(feat: sandy --stop-all — fleet emergency stop (HF Issue 8) #94) — fleet emergency stop: stop every daemon sessionvia the hardened per-session teardown.
Trust-handoff / workspace supply-chain follow-ups
.sandy/Dockerfilebuild approval gate (1.3.x, Security: approval-gate the .sandy/Dockerfile build + protect .sandy/ (HF-incident Issue 7) #83) — the one live,exploitable finding; gated behind per-workspace approval, fail-closed non-interactive.
.venvwarning (feat(security): warn when a host-reachable .venv isn't shadowed (sandbox-escape Issue C) #85);session-end detection for a created-in-session
core.hooksPathdir (feat(security): detect a created-in-session core.hooksPath dir (sandbox-escape Issue F) #86);wrapped-agent CVE-watch posture (docs(security): wrapped-agent CVE-watch posture (sandbox-escape Issue E) #87).
Notes
SANDY_EGRESS_LOG,SANDY_TOOL_AUDIT(passive-safe)and flags
--reset-sandbox,--stop-all. Introspectionschema_versionstays 1.SANDY_SANDBOX_MIN_COMPATstays0.7.10).Bumps
SANDY_VERSION1.3.1-dev → 1.4.0 (additive minor per the CLAUDE.md semver rule).schema_versionstays 1;SANDY_SANDBOX_MIN_COMPATunchanged. Tag + GitHub release follow once this merges.