Repository navigation
MXC SDK v0.9.0
Pre-releaseMXC v0.9.0 expands the stable sandbox surface with IsolationSession and WSL Container support, telemetry consent APIs, and new Windows ProcessContainer policy capabilities.
NPM release: https://www.npmjs.com/package/@microsoft/mxc-sdk/v/0.9.0
See the Assets section for mxc-release-binaries.zip, which contains the signed production binaries and PDBs for the MXC project.
What's New in v0.9.0
Schema 0.9 is now stable
0.9.0-alpha is the current stable policy schema and the recommended version for new policies. Existing policies using schema 0.6, 0.7, or 0.8 remain supported. Schema 0.10.0-alpha is available for features that are still under development.
Schema 0.9 completes the directional networking transition. New 0.9 policies use network.egress, network.ingress, and, where applicable, runtimeConfig.networkProxy. Policies using earlier schema versions continue to use their existing network fields.
ProcessContainer is available on serviced Windows 11 builds
Windows 11 version 24H2 and 25H2 added Process Isolation for Microsoft Execution Containers in the August 2026 update KB5120998.
The September 2026 update KB5124010 adds the OS support MXC uses for:
- Container-to-host loopback networking, represented by
network.ingress.hostLoopback. - Enumerate-only filesystem access, represented by
processContainer.filesystem.enumeratePaths. This permits directory queries and listing under the caller's existing access without granting file-content reads.
Install KB5124010 or a later cumulative update on Windows 11 24H2 and 25H2 to use these capabilities. On Windows 11 26H1, install the September 2026 update KB5124006 or a later cumulative update.
IsolationSession and WSL Container join the stable surface
Schema 0.9 is the first stable schema release to include IsolationSession and WSL Container (wslc). Their one-shot and state-aware lifecycle APIs are included in the stable 0.9.0-alpha schema and no longer require experimental opt-in.
IsolationSession requires Windows build 26340.9212 or later with the IsolationSession OS feature enabled.
Both backends support provision, start, exec, stop, and deprovision through the shared lifecycle model.
Windows Sandbox, MicroVM, and Hyperlight remain experimental and use the development 0.10.0-alpha contract.
Explicit environment inheritance
Schema 0.9 adds process.inheritDefaultEnv. Callers can now choose whether a supplied environment replaces the backend default or is layered over it.
Telemetry consent APIs
The Node.js SDK adds APIs to query, request, and withdraw MXC telemetry consent. Applications provide the consent presentation experience; MXC stores its own user decision and applies administrative policy only as an additional restriction.
Telemetry remains Windows-only, requires explicit user consent, and fails
closed.
Cross-platform enforcement and reliability
- LXC directional networking now handles CIDR carve-outs more safely, waits for container addressing before execution, and fails closed when network initialization is incomplete.
- Bubblewrap strengthens proxy and firewall enforcement, IPv6 handling, descendant cleanup, and network-provider failure detection.
- Seatbelt enforces host-loopback policy, improves IPv6 loopback behavior, and fixes working-directory and listener behavior.
- Learning Mode and denial capture add more actionable diagnostics and more robust stale-session recovery.
- ProcessContainer selection and capability probing now avoid selecting an OS path that cannot enforce the complete requested policy.
Breaking Changes and Migration Notes
Node.js SDK
- The minimum supported Node.js version is now 24.
- Windows requires Node.js 24.21.0 or later within the Node.js 24 release line, or 26.8.0 or later. Node.js 26.8.0 or later is recommended.
Change log
- Build the C# SDK in CI and load the native unit its bindings came from by adpa-ms in #1026
- Make the state-aware sandbox lifecycle usable from the C# SDK by adpa-ms in #1035
- Add ProcessContainer authoring to Rust SDK by Branden Bonaby (@bbonaby) in #1031
- [Bubblewrap] Fix the flaky pipeline test by Soham Das (@SohamDas2021) in #1036
- Keep non-actionable capture denials in verbose output by Richie Gomez (@richiemsft) in #1028
- Upgrade the C# test suite to xUnit v3 and report skips as skips by adpa-ms in #1037
- Add exact v0.8 contract and advance development to v0.9 by Gudge (@MGudgin) in #1027
- Run the C# test suite in CI by adpa-ms in #1040
- [Bubblewrap] Define
anyas a protocol floor, not "all protocols" by Soham Das (@SohamDas2021) in #1038 - [WSLC] Tell users to update MXC when their WSL outruns the pinned SDK by Soham Das (@SohamDas2021) in #1046
- [WSLC] Encapsulate backend errors in a typed enum for the Rust SDK by Soham Das (@SohamDas2021) in #1045
- Update the WSLC SDK to 2.9.9 by Elliot (@theelliotm) in #1048
- [LXC] Stop blaming host loopback for a LAN inbound refusal by Darren Hoehna (@dhoehna) in #1044
- Exit the isolation-session operator drivers with the workload's exit code by adpa-ms in #1055
- [Bubblewrap] Stop descendants outliving teardown and close the backend's test coverage gaps by Soham Das (@SohamDas2021) in #1057
- [Bubblewrap] Add streaming (spawn_sandbox) test coverage on Linux by Soham Das (@SohamDas2021) in #1056
- fix: fail closed when LXC container network doesn't initialize by Huzaifa Danish (@huzaifa-d) in #1062
- Bring C# SDK up to parity with Rust SDK. by shschaefer in #1050
- [Bubblewrap] Reuse the validated egress plan and pin IPv6/ICMP rendering by Soham Das (@SohamDas2021) in #1051
- Carry
remediationon the error rather than insideApiFailureby adpa-ms in #1067 - [Seatbelt] Enforce hostLoopback, fix ip6 loopback bug, and consolidate network validation by Elliot (@theelliotm) in #1033
- Harden Bubblewrap version probing by Gudge (@MGudgin) in #723
- [LXC] Point the LXC network tests at CI-controlled peers by Darren Hoehna (@dhoehna) in #1054
- fix: delay-load winhvplatform.dll to prevent loader crash on WHP-less hosts by Huzaifa Danish (@huzaifa-d) in #1059
- Add telemetry consent and policy foundation by RamonArjona4 in #819
- fix(dotnet): map Hyperlight discovery backend by Huzaifa Danish (@huzaifa-d) in #1072
- [Bubblewrap] Reject proxy with firewall enforcement, warn on unreachable IPv6 allows, and assert the v6 ingress chain by Soham Das (@SohamDas2021) in #1052
- [SDK] Add Linux and macOS Node SDK coverage for schema 0.8 networking by Elliot (@theelliotm) in #1075
- [SDK] Gate the C# isolation-session tests on the capability probe by adpa-ms in #1086
- [CI] Migrate Validation to ScaleSet API by Elliot (@theelliotm) in #1093
- Rename
ExecConsumertoExecStdiofor the topology it selects by adpa-ms in #1095 - chore(deps): bump the github-actions group across 1 directory with 4 updates by Dependabot (@dependabot)[bot] in #1084
- chore(deps-dev): bump @xmldom/xmldom from 0.8.13 to 0.8.15 in /tests/playground by Dependabot (@dependabot)[bot] in #1087
- chore(deps-dev): bump fast-uri from 3.1.5 to 3.1.7 in /tests/playground by Dependabot (@dependabot)[bot] in #1088
- [WSLC] Reject remaining policy fields the backend cannot honor by Soham Das (@SohamDas2021) in #1058
- Add Process Security Environment ingress contract by Branden Bonaby (@bbonaby) in #1076
- Fix scoped ETW telemetry validation by RamonArjona4 in #791
- Complete stable telemetry runtime and lifecycle integration by RamonArjona4 in #820
- [CI] Support pre-provisioned images, migrate CI scripts, add macOS host prep, support T3-Workloads by Elliot (@theelliotm) in #1089
- Pin GitHub Actions to full-length commit SHAs by Dan Fiedler (@danfiedler-msft) in #1121
- chore(deps-dev): bump js-yaml from 4.3.1 to 4.3.2 in /tests/playground by Dependabot (@dependabot)[bot] in #1127
- fix(seatbelt): Apply the cwd to the spawn_open (in-terminal) launch path. by Elliot (@theelliotm) in #1079
- Add verbose Learning Mode diagnostics by Richie Gomez (@richiemsft) in #1083
- Expose telemetry through Rust SDK, C ABI, and .NET binding by RamonArjona4 in #821
- Add Node.js and .NET telemetry SDKs by RamonArjona4 in #822
- Resolve the command before the request is parsed by Gudge (@MGudgin) in #969
- Enforce ProcessContainer ingress policy by Branden Bonaby (@bbonaby) in #1080
- docs: explain Learning Mode denial capture by Richie Gomez (@richiemsft) in #1131
- Fix Windows telemetry consent lock contention by Gudge (@MGudgin) in #1107
- Serve one-shot isolation sessions on the Rust SDK's streaming surface by adpa-ms in #1132
- Extract shared state-aware normalization by Gudge (@MGudgin) in #1091
- Add default environment behavior across SDKs by shschaefer in #1120
- [Seatbelt] Grant the active developer directory in the baseline profile by Elliot (@theelliotm) in #1128
- [Seatbelt] Add technical validation tests, wire them into CI, and fix what they found by Elliot (@theelliotm) in #1125
- Add private exact contract parsing by Gudge (@MGudgin) in #1096
- Add rolling-versus-exact parser equivalence tests by Gudge (@MGudgin) in #1097
- Migrate development requests to version-specific parsers by Gudge (@MGudgin) in #1099
- fix(CI): Seatbelt tests no longer assume CI runners have SIP enabled by Elliot (@theelliotm) in #1144
- Let a C# caller select isolation sessions on the one-shot surface by adpa-ms in #1148
- Fix legacy LXC SDK enforcement mode by Branden Bonaby (@bbonaby) in #1146
- Enable authoritative exact contract dispatch by Gudge (@MGudgin) in #1104
- Simple (per-Issue) Regression test harness (ready for vm!) by Jeff Whiteside (@jsidewhite) in #1141
- Use typed payloads for state-aware dispatch by Gudge (@MGudgin) in #1123
- [Bubblewrap] Report proxy-enforcement host support from getPlatformSupport by Soham Das (@SohamDas2021) in #1029
- Add explicit IsolationSession network acknowledgment by Gudge (@MGudgin) in #1133
- Expose ProcessContainer probe capabilities by Huzaifa Danish (@huzaifa-d) in #1151
- [CI] Fix stale pre-0.8 directional rejection assertions by Elliot (@theelliotm) in #1159
- Fix captureDenials probe parity by Huzaifa Danish (@huzaifa-d) in #1070
- Regression tests [process containment]: Verify Issue 473 - Packaged Launch verification by Jeff Whiteside (@jsidewhite) in #1149
- Regression tests [process containment]: Issue 1130 - Environment block needs SystemRoot + LOCALAPPDATA by Jeff Whiteside (@jsidewhite) in #1158
- Regression tests [process containment]: Issue 1102 - Environment block specifications by Jeff Whiteside (@jsidewhite) in #1154
- [CI] Run BaseContainer validation tests on the 25H2 and 24H2 images by Elliot (@theelliotm) in #1164
- Regression tests [process containment]: Issue 785 - Probe 'SUCCESS' but Run 'FAIL' (captureDenials) by Jeff Whiteside (@jsidewhite) in #1161
- Complete the v0.9 directional networking cutover by Gudge (@MGudgin) in #1145
- Add version flags to wxc-exec by wellorbetter (@wellorbetter) in #1126
- User/dalegg/package sdk integration tests in vpack by Dan Legg (@danlegg) in #1134
- [Seatbelt] Remove launchMethod from the 0.9 schema by Elliot (@theelliotm) in #1136
- Rename backends/appcontainer -> backends/process_container by Jeff Whiteside (@jsidewhite) in #1143
- Stage Node native runtime foundation by Branden Bonaby (@bbonaby) in #1170
- [Seatbelt] Tests now can use binaries output from build-mac.sh by Elliot (@theelliotm) in #1173
- Load the native runtime in the Node SDK by Branden Bonaby (@bbonaby) in #1175
- Fix PSEC proxy loopback peer serialization by Carlos Alexandro Becker (@caarlos0) in #1177
- fix(seatbelt): let a sandbox listen without surrendering proxy confinement by Carlos Alexandro Becker (@caarlos0) in #1166
- chore(deps): bump the github-actions group with 3 updates by Dependabot (@dependabot)[bot] in #1176
- Address npm package vulnerabilities by Gudge (@MGudgin) in #1171
- [refactor] Move 'security environment' code into 'process_container' backend by Jeff Whiteside (@jsidewhite) in #1178
- Feature [process containment]: Enumerate FS config (Issue 1162) by Jeff Whiteside (@jsidewhite) in #1163
- Fix various bugs CoPilot put into LXC. by Darren Hoehna (@dhoehna) in #1041
- [Bubblewrap] Drop stale --experimental claims from docs for the Bubblewrap backend by Soham Das (@SohamDas2021) in #1179
- fix(process-container): restore unprivileged host proxy connectivity by Carlos Alexandro Becker (@caarlos0) in #1180
- [IsolationSession] Fix E2E assertions that expect unreachable errors by adpa-ms in #1183
- Regenerate the IsolationSession Preview bindings by adpa-ms in #1194
- [CI] Run state aware tests for isolation session by Elliot (@theelliotm) in #1201
- [LXC] Reject runtimeConfig.networkProxy with a backend-specific error and document it by Soham Das (@SohamDas2021) in #1203
- [WSLC] Document how an unsupported Windows version surfaces by Soham Das (@SohamDas2021) in #1206
- BaseContainer: Remove legacy experimental CreateProcessInSandbox (SBOX) by Jeff Whiteside (@jsidewhite) in #1182
- [refac] Move LearningMode out of 'backends' folder by Jeff Whiteside (@jsidewhite) in #1209
- Add missing containment configs to Rust and .NET SDKs by Branden Bonaby (@bbonaby) in #1197
- [docs] Clean up copilot instructions & add architecture.md by Jeff Whiteside (@jsidewhite) in #1208
- Move buffered API in Node SDK to in process by Branden Bonaby (@bbonaby) in #1198
- [LXC] [Test/docs] State the network chains' limits, and test that inbound default-deny drops packets by Soham Das (@SohamDas2021) in #1211
- [LXC] [Tests] Pin the directional egress default against an unresolvable deny by Soham Das (@SohamDas2021) in #1215
- Expose native sandbox stdio endpoints through FFI by Branden Bonaby (@bbonaby) in #1222
- Publish v0.9 with stable WSLC support by Gudge (@MGudgin) in #1187
- [LXC] [Tests] Cover ICMP, port ranges, and protocol any in the live GA egress suite by Soham Das (@SohamDas2021) in #1225
- Add native stdio process support to the Node SDK by Branden Bonaby (@bbonaby) in #1224
- [WSLC] Remove the rolling configuration architecture by Gudge (@MGudgin) in #1188
- WSLC scripts and tests now check for ARM targets on ARM systems by Elliot (@theelliotm) in #1221
- [WSLC] Harden exact contract infrastructure by Gudge (@MGudgin) in #1189
- [refac] Fix missed renames from 'appcontainer' to 'process_container' by Jeff Whiteside (@jsidewhite) in #1226
- Make PLM stale recovery actionable by Richie Gomez (@richiemsft) in #1232
- test(process-container): split the Windows suite into per-area scripts and add schema 0.8 network coverage by Elliot (@theelliotm) in #1217
- Stabilize bwrap worker ordering test by Gudge (@MGudgin) in #1235
- Consolidate versioning gates and CI ownership by Gudge (@MGudgin) in #1228
- Share exact-schema invariant tests by Gudge (@MGudgin) in #1229
- [LXC] Subtract an egress 'except' from its own rule so a carve-out cannot shadow a later deny by Soham Das (@SohamDas2021) in #1216
- Share exact-contract integration test support by Gudge (@MGudgin) in #1230
- [LXC] Refactor the CIDR block subtraction LXC uses to lower an egress policy by Soham Das (@SohamDas2021) in #1237
- [LXC] Wait for an IPv4 address before running the workload by Soham Das (@SohamDas2021) in #1238
- [WSLC] Preserve backend failure classification across the state-aware daemon protocol by Soham Das (@SohamDas2021) in #1240
- Use mxc_ffi for Node state-aware lifecycle by Branden Bonaby (@bbonaby) in #1236
- Fail closed when MXC test bundles are stale by Dan Legg (@danlegg) in #1239
- 0.9: Honor inheritDefaultEnv on LXC, Bubblewrap, and Seatbelt by Elliot (@theelliotm) in #1195
- Test the telemetry consent path in release builds, and enable the telemetry smoke tests on arm64 by Elliot (@theelliotm) in #1249
- [Bubblewrap] Fail the run when the sandbox loses its network provider by Soham Das (@SohamDas2021) in #1250
- Move Node telemetry consent to mxc_ffi by Branden Bonaby (@bbonaby) in #1251
- hyperlight: move to hyperlight-unikraft 0.14.1 and add selectable guest runtimes by Dan Chiarlone (@danbugs) in #1259
- Clarify v1 versioning direction by Gudge (@MGudgin) in #1227
- [WSLC] Document the native runtime files for Rust SDK consumers by Soham Das (@SohamDas2021) in #1244
- Separate stable backends from experimental modules by Gudge (@MGudgin) in #1264
- [CI] Add nightly ARM64 tests for Process Containers and Isolation Session by Elliot (@theelliotm) in #1241
- [IsolationSession] Make every API call from a thread of its own by adpa-ms in #1266
- [CI] Add MacOS 27 to nightly testing by Elliot (@theelliotm) in #1267
- [IsolationSession] Admit callers in a single-threaded apartment by adpa-ms in #1275
- Add native WSLC state-aware streaming exec by Branden Bonaby (@bbonaby) in #1252
- Update seatbelt-backend.md to reflect 0.9 being cut by Elliot (@theelliotm) in #1272
- Update package versions to 0.9.0 by Branden Bonaby (@bbonaby) in #1284
- [refac & fix] Simplify ProcessContainer selection & stop creating extra sandbox by Jeff Whiteside (@jsidewhite) in #1285
- NanVix: Preserve block-default networking with blockedHosts by Huzaifa Danish (@huzaifa-d) in #1071
- Add .NET SDK build and release ADO pipelines by Branden Bonaby (@bbonaby) in #1287
- [CI] Add 26H1 to scheduled validation testing by Elliot (@theelliotm) in #1288
- Update Bubblewrap tests to schema 0.9 by Elliot (@theelliotm) in #1283
- Add direct typed Rust state-aware transport by Gudge (@MGudgin) in #1254
- [IsolationSession] Run every isolation-session suite in scheduled validation by adpa-ms in #1294
- [WSLC] Honor inheritDefaultEnv on 0.9 by Soham Das (@SohamDas2021) in #1268
- Stabilize PLM inherited-output regression test by Richie Gomez (@richiemsft) in #1289
- Refine typed Rust lifecycle API by Gudge (@MGudgin) in #1255
- Move lifecycle routing to executor arguments by Gudge (@MGudgin) in #1256
- Add canonical SDK major targets by Gudge (@MGudgin) in #1269
New Contributors
- Dan Fiedler (@danfiedler-msft) made their first contribution in #1121
- wellorbetter (@wellorbetter) made their first contribution in #1126
- Dan Legg (@danlegg) made their first contribution in #1134
Full Changelog: v0.8.0...v0.9.0