2026.05.18 Release v0.2.2
🛡️ Security Fixes
hypervisor:vmm-sys-utilbumped 0.11.x → 0.12.1 (CVE-2023-50711, GHSA-875g-mfp6-g7f9):FamStructWrapper::deserializepreviously failed to verify that the header length matched the flexible-array length, allowing out-of-bounds memory access from safe Rust code. Pinned to the workspace version already used by every other hypervisor crate.agent/hypervisor:bytesandenv_loggersecurity bumps — additional dependency refreshes from the same CVE-fix pass (#267).- Reverted
timecrate bump (CVE-2026-25727 / GHSA-r6v5-fh4h-64xc) (#286): Analysis confirmed that CubeSandbox only usestime::format_description::well_known::Rfc3339for outbound timestamp formatting and never invokesRfc2822parsing on untrusted input — the affected attack vector is not reachable. The upgrade was rolled back because it requires an MSRV bump and will be addressed separately when the project is ready.
🚀 Critical Fixes
- Fixed duplicate template-image job creation (
CubeMaster) (#227): A newrequest_idcolumn with a unique index on(request_id, operation)makes job submissions idempotent. Migration logic handles existing records with legacy IDs. Eliminates the race where concurrent or retried API calls could enqueue the same build twice. - Fixed
cubecli execnil-deref panic on stdin EOF (#188):StdinCloser.Readpreviously triggered a nil-pointer dereference when stdin reached EOF, silently aborting the exec lifecycle. The fix correctly handles EOF and switches toerrors.Is(err, io.EOF)for proper error-wrapping compatibility. Shim logs now emit the expected pairedexec req/wait container … exit codeentries. - Fixed ext4 artifact runtime file materialization for PVM templates (#282):
RefreshArtifactRuntimeFiles,validateArtifactRuntimeFilesPresent, andensureArtifactRuntimeFilesare simplified to handle only kernel files;copyKernelFileAtomicallyis renamed toCopyFileAtomicallyfor reuse outside the package. Unit tests are updated and pruned accordingly.
✨ Enhancements
- E2B-compatible default exposed port (#207): The default sandbox exposed port is changed from 8080/32000 to 49983 to match the E2B sandbox protocol.
CubeMasteris now the single authoritative source of default exposed ports — hardcoded defaults and port-seeding logic are removed fromCubeletandnetwork-agent, preventing silent divergence. cubelet:cmdTimeoutconfigurable via storage plugin config (#236): A new optionalcmd_timeoutfield in the storage plugin TOML config replaces the hardcoded 3 s default. Multi-GiB ext4 operations on the live-create slow path under concurrent load can exceed 3 s; operators can now raise the limit without recompiling. Default behavior is unchanged when the field is absent.cubelet: richer diagnostics onnewExt4RawByReflinkCopyfailures (#237): Error messages now include elapsed time, target/base file stats, and free space in the format[step=N/4 cmd="…" elapsed=…ms target=size=… base=size=… free=…B]. Stat/statfs errors are reported inline. Unit tests are added fordescribeStorageFailure/describeFile/describeFreeBytes.- Deploy: sync CubeMaster custom ports with
.envconfig (#210):cubemaster.yamlnow uses__CUBE_SANDBOX_MYSQL_PORT__and__CUBE_SANDBOX_REDIS_PORT__placeholders;install.shsubstitutes them from the.envfile, enabling non-default MySQL/Redis ports without manual YAML edits.
⚙️ Engineering Improvements
cubecli: removed deadlistmdcommand (#181): The unreachablelistmdsubcommand and its 128-line implementation (metadata.go) are deleted, reducing dead-code surface.
🤖 CI / DevOps
- Claude-powered code review and issue triage automation (#255): Five AI reviewer agents are introduced under
.agents/agents/(code quality, performance, security, test coverage, documentation accuracy). Automated workflows handle PR code review, duplicate issue detection, and issue label triage. A secure GitHub App token flow is wired up for CI actions, and helper scriptsgh.shandedit-issue-labels.share added underscripts/. gh.sh: issue comment support (#262):gh.shgainscomment-issueto post comments via stdin heredoc, and workflow tool paths are restricted to the new scripts directory for consistency.- CI model configuration update (#259): Model name and
show_full_outputoption updated for the AI review workflow.
📚 Documentation
- Chinese translation of
CONTRIBUTING.md(#276):CONTRIBUTING_zh.mdadded as a full Chinese translation of the contribution guide. - Community doc PR requirements relaxed (#279, #280): Both
CONTRIBUTING.mdandCONTRIBUTING_zh.mdnow allow single-language submissions; bilingual docs are encouraged but optional, with clear nested requirements. - Network port allocation ranges documented (#205):
docs/architecture/network.md(EN & ZH) now explicitly documents the three port-range buckets on compute nodes:10000–19999(network-agentip_local_port_range),20000–29999(CubeProxy sandbox access),30000–65535(CubeVS SNAT). - Community docs: troubleshooting / use-cases / integrations sections (#238): New bilingual doc sections added to VitePress with template files and index pages; a GitHub Actions workflow enforces bilingual parity for community docs.
CONTRIBUTING.mdand READMEs updated with contribution links. - Domain update: CNAME switched from
docs.cubesandbox.aitocubesandbox.com(#271). - Fixed
browser-sandboxexample: Added missingload_dotenv()call andpython-dotenvdependency so.envvariables are loaded before the script runs. - WeChat group QR code refreshed (#208): Updated to a valid group code.
- v0.2.1 changelog entries (#281): EN and ZH changelog pages updated with the v0.2.1 release notes.
🙏 Contributors
Thanks to everyone who contributed to v0.2.2: @fslongjin, @foxywang, @cocovs, @WaylandYang, @chenggui53, @luzhixing12345, @turtlemoji, @QingqLin, @chenhengqi, @Dafeigy.
Full Changelog: v0.2.1...v0.2.2