Update Sandbox SDK to 0.12.14 Now: Fixing Trust After the eMudhra Compromise
Hi everyone, it's Shii-chan! Today's news is a serious security notice. If you use Sandbox SDK, please check this one!
Cloudflare ChangelogWhat was announced?
The Cloudflare Changelog says Sandbox SDK 0.12.14 updates its trusted certificates after the eMudhra compromise.
The private keys of eight eMudhra intermediate certificate authorities can be recovered, so anyone can forge a certificate for any hostname that chains to them.
Why it matters
Sandbox SDK images before 0.12.14 trust these certificates. That means an HTTPS connection that leaves the container directly could be intercepted with a forged certificate.
Examples of affected connections:
mountBucket()- Backups
gitCheckout()- Tunnels
- Code that runs in the sandbox
What changes
After updating, the images reject the compromised certificates. The steps differ by version: on 0.x, update immediately. On 1.x, the SDK itself doesn't need an update, but you need to rebuild your image.
Dive Deep
Sandbox SDK 0.x
- Install
@cloudflare/sandbox@0.12.14 - Change the
FROMline in your Dockerfile to the matching image, keeping any-python,-opencode, or-muslsuffix - Redeploy. The rollout replaces running sandboxes with ones that use the new image
- If you use the next prerelease, update to 0.13.0-next.825.1 or later
FROM docker.io/cloudflare/sandbox:0.12.14
If you can't update yet (0.8.7 or later)
Send all HTTPS through your Worker, so Cloudflare checks every certificate on port 443 whatever your image trusts.
import { Sandbox, ContainerProxy } from "@cloudflare/sandbox";
export { ContainerProxy };
export class MySandbox extends Sandbox {
interceptHttps = true;
}
MySandbox.outbound = (request) => fetch(request);
Deploy, then stop running sandboxes so they restart with the interception certificate. This doesn't cover TLS on other ports, such as cloudflared tunnels, and clients that ignore the injected certificate will fail to connect.
Sandbox SDK 1.x
The SDK makes no TLS connections itself, so no update is needed. Rebuild your image instead:
- Pull each base image in your Dockerfile and run
docker builder prune --all. Without this,wrangler deploymay ship old CA certificates and runtimes. If you reference an image by digest, build and push a new image and update the digest - Deploy your Worker
- Stop running sandboxes, for example with
this.ctx.container.destroy(), because a running sandbox keeps its original image - If you use snapshots, create new ones from sandboxes running the updated image, because a snapshot restores its original image and certificates
Verifying
From inside a sandbox, connect to the test hosts listed at emudhra.we-have-a-problem.com with each TLS client you use, such as curl, node, or bun. Every request should fail.
What changed in 0.12.13 and 0.12.14
- 0.12.13: The system CA bundle, Node.js, cloudflared, and pip reject the compromised certificates. Images include updated Ubuntu and Alpine CA certificates, Node.js 22.23.4, cloudflared 2026.10.2, and pip 26.2.2 (in the
-pythonimage) - 0.12.14: Updates Bun to 1.4.4, so the
buncommand andcreateBackup()uploads of archives 10 MiB or larger also reject these certificates. The-opencodeimage ships OpenCode 1.19.4 or later, which runs on Bun 1.4.4
Wrap-up
- The private keys of eight eMudhra intermediate CAs can be recovered, so forged certificates are possible
- Images before 0.12.14 are affected
- On 0.x, update to
@cloudflare/sandbox@0.12.14now and redeploy - On 1.x, rebuild your image and recreate sandboxes and snapshots
- If you can't update,
interceptHttpsoffers a stopgap through your Worker
This is for anyone running agents or code execution on Sandbox SDK. Please check it today!