Skip to content

Windows Desktop WSL workspace: node_repl/Browser/Chrome fail during sandbox ACL setup on \\wsl.localhost UNC path #24101

Open

Description

@eschulma

What version of the Codex App are you using (From “About Codex” dialog)?

26.519.3891.0

What subscription do you have?

Pro $200

What platform is your computer?

Microsoft Windows NT 10.0.22631.0 x64

What issue are you seeing?

In a Codex Desktop thread attached to a WSL UNC workspace, both the bundled Browser plugin and Chrome plugin fail before any browser automation code can run.

The mcp__node_repl__js tool is exposed, but even a minimal call like:

nodeRepl.write("ping")

fails with:

node_repl kernel exited unexpectedly
node_repl diagnostics: {
  "kernel_status": "running",
  "kernel_stderr_tail": "windows sandbox failed: setup refresh failed with status exit code: 1",
  "reason": "stdout_eof"
}

This also prevents:

@browser / in-app browser automation
@chrome / Chrome extension automation

Sandbox log detail

The short error appears to hide a Windows ACL failure on the WSL UNC workspace path:

setup refresh: spawning ... codex-windows-sandbox-setup.exe
(cwd=\\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\webapp)

write mask check failed on \\?\UNC\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\webapp for sandbox_group:
GetSecurityInfo failed ...: 1

write mask check failed on \\?\UNC\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\webapp for workspace_cap:
GetSecurityInfo failed ...: 1

write ACE grant failed on \\?\UNC\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\webapp:
GetSecurityInfo failed ...: 1

deny ACE failed on ...\.git:
GetNamedSecurityInfoW failed: 1

setup refresh completed with errors
setup error: setup refresh had errors

What steps can reproduce the bug?

  1. On Windows with WSL2 Ubuntu, open Codex Desktop.

  2. Add/open a project whose workspace root is a WSL UNC path, for example:

    \\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\<repo>
    
  3. Start a new Codex Desktop thread in that WSL workspace.

  4. Confirm the bundled Browser and/or Chrome plugin is enabled.

  5. Ask Codex to use Browser or Chrome, for example:

    Open example.com using [@Browser](plugin://browser@openai-bundled)
    

    or:

    Does [@chrome](plugin://chrome@openai-bundled) work?
    
  6. The browser skill loads and the mcp__node_repl__js tool is available, but the Node REPL kernel exits before any browser code can run.

Minimal reproduction without Browser/Chrome-specific code:

nodeRepl.write("ping")

Observed result:

node_repl kernel exited unexpectedly

node_repl diagnostics: {
  "kernel_status": "running",
  "kernel_stderr_tail": "windows sandbox failed: setup refresh failed with status exit code: 1",
  "reason": "stdout_eof"
}

Browser-specific reproduction attempted:

if (!globalThis.agent) {
  const { setupBrowserRuntime } = await import("file:///C:/Users/<user>/.codex/plugins/cache/openai-bundled/browser/<version>/scripts/browser-client.mjs");
  await setupBrowserRuntime({ globals: globalThis });
}
if (!globalThis.browser) {
  globalThis.browser = await agent.browsers.get("iab");
}
await browser.nameSession("Example.com");
const tab = await browser.tabs.new();
await tab.goto("https://example.com");

Chrome-specific reproduction attempted:

if (!globalThis.agent) {
  const { setupBrowserRuntime } = await import("file:///C:/Users/<user>/.codex/plugins/cache/openai-bundled/chrome/<version>/scripts/browser-client.mjs");
  await setupBrowserRuntime({ globals: globalThis });
}
if (!globalThis.chromeBrowser) {
  globalThis.chromeBrowser = await agent.browsers.get("extension");
}
await chromeBrowser.nameSession("Chrome smoke test");
const openTabs = await chromeBrowser.user.openTabs();

Both Browser and Chrome fail before the imports or browser-client setup can complete, with the same node_repl sandbox setup error.

Relevant sandbox log excerpt:

setup refresh: spawning ... codex-windows-sandbox-setup.exe
(cwd=\\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\<repo>)

write mask check failed on \\?\UNC\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\<repo> for sandbox_group:
GetSecurityInfo failed ...: 1

write ACE grant failed on \\?\UNC\wsl.localhost\Ubuntu\home\<user>\src\github.com\<org>\<repo>:
GetSecurityInfo failed ...: 1

deny ACE failed on ...\.git:
GetNamedSecurityInfoW failed: 1

setup refresh completed with errors
setup error: setup refresh had errors

Session id from the failing thread:

0230a6c7bc844e1d83c2ddae4dd5d9f1

Context/token usage does not appear to be relevant. The failure happens at tool startup before user JavaScript runs, including for the one-line nodeRepl.write("ping") check.

What is the expected behavior?

Browser/Chrome automation should work from a WSL workspace, or node_repl should avoid using the WSL UNC workspace as the Windows process cwd / sandbox ACL target.

At minimum, the error should surface the underlying GetSecurityInfo failed / UNC ACL failure instead of only reporting:

windows sandbox failed: setup refresh failed with status exit code: 1

Additional information

WSL bridge CLI: codex-cli 0.133.0-alpha.1
WSL kernel:
Linux THINKPADP16 5.15.153.1-microsoft-standard-WSL2 x86_64 GNU/Linux

Activity

  1. added
    appIssues related to the Codex desktop app
    on May 22, 2026
  2. added
    bugSomething isn't working
    windows-osIssues related to Codex on Windows systems
    sandboxIssues related to permissions or sandboxing
    on May 22, 2026
  3. jshaofa-ui commented on May 23, 2026

    @jshaofa-ui

    openai/codex #24101: Windows Desktop WSL Workspace Sandbox ACL Failures

    Issue Summary

    Root Cause Analysis

    1. WSL File System ACL Translation

    Windows Desktop running in WSL workspaces encounters ACL failures because:

    • NTFS vs ext4 ACL mismatch: WSL2 uses a 9P filesystem bridge (WSLdrv) that translates between Windows NTFS ACLs and Linux POSIX ACLs. The sandbox layer may apply ACLs that are valid on native Linux but fail when translated through WSLdrv.
    • Windows Security Descriptor translation: When Codex Desktop applies sandbox ACLs to WSL workspace files, the ACL translation layer may reject certain security descriptors that contain Windows-specific SIDs or inheritance flags.
    • Symbolic link / junction handling: WSL has specific rules about symlinks across the Windows/Linux boundary that may conflict with sandbox isolation requirements.

    2. Specific Failure Points

    Codex Desktop (Windows)
    ├── Sandbox Layer
    │   ├── applyACL(path, rules)     ← fails on WSL paths
    │   │   ├── translateToWindowsACL()  ← NTFS translation may fail
    │   │   └── setSecurityDescriptor()  ← Windows API rejection
    │   ├── validateWorkspaceAccess()
    │   │   └── checkFilePermissions()   ← WSLdrv 9P protocol limitations
    │   └── isolateProcess()
    │       └── mountNamespaces()        ← WSL2 doesn't support all Linux namespaces
    ├── Tools
    │   ├── node_repl    ← fails when sandbox ACL blocks access
    │   ├── Browser      ← fails when sandbox ACL blocks temp files
    │   └── Chrome       ← fails when sandbox ACL blocks profile directory
    └── WSL Bridge
        └── wsl.exe --exec  ← filesystem operations go through 9P
    

    3. WSL-Specific Factors

    • WSLdrv 9P limitations: The 9P protocol used by WSL2 has limited ACL support compared to native Linux
    • Metadata preservation: WSL stores extended attributes in alternate data streams (EAs in ADS), which may not be properly handled by the sandbox layer
    • Drive mounting: /mnt/c/ paths vs native WSL paths (\\wsl$\) have different ACL behaviors
    • Process isolation: WSL2 uses a lightweight VM with Hyper-V isolation, limiting Linux namespace support

    Fix Approach

    Component 1: WSL-Aware ACL Translation

    // BEFORE (fails on WSL):
    function applySandboxACL(workspacePath: string, rules: ACLRule[]): void {
      // Direct POSIX ACL application fails on WSLdrv-mounted paths
      rules.forEach(rule => {
        fs.setPosixACL(workspacePath, rule);  // ← throws on WSL
      });
    }
    
    // AFTER (WSL-aware):
    function applySandboxACL(workspacePath: string, rules: ACLRule[]): void {
      const wslInfo = detectWSLEnvironment();
      
      if (wslInfo.isWSL) {
        // Use WSL-compatible ACL approach
        applyWSLCompatibleACL(workspacePath, rules, wslInfo);
      } else {
        // Native Linux: use standard POSIX ACLs
        rules.forEach(rule => fs.setPosixACL(workspacePath, rule));
      }
    }
    
    function detectWSLEnvironment(): WSLInfo {
      const release = execSync('uname -r').toString().toLowerCase();
      const isWSL = release.includes('microsoft') || release.includes('wsland');
      
      return {
        isWSL,
        version: release.includes('microsoft') ? 2 : 1,
        isNativePath: !workspacePath.startsWith('/mnt/'),
        wslDist: execSync('wsl.exe -l -q').toString().trim(),
      };
  4. walter-seethaler commented on Sep 1, 2026

    @walter-seethaler

    Cross-linking #35380 as the broader reproduction of the same Windows-native WSL-UNC sandbox failure. This issue provides the earlier Browser/Chrome/node_repl ACL evidence; #35380 shows that the registered \\wsl.localhost root also blocks ordinary shell commands, including commands explicitly started from a local C:\ directory. Direct Win32 testing there further confirms GetNamedSecurityInfoW returning error 1 for multiple WSL providers.

    This is therefore not only a Browser-plugin failure. It is a global Windows sandbox initialization failure triggered by a WSL UNC workspace root.

  5. rlh8177 commented on Sep 6, 2026

    @rlh8177

    Reproduced on 2026-09-06 with Codex Desktop 26.901.6511.0 (codex-command-runner 0.153.4), Windows x64 build 26200, and a WSL UNC workspace (\wsl$\Ubuntu\home<user>\src<repo>). Both exec_command and Computer Use failed before user code ran with helper_unknown_error: setup refresh had errors. The sandbox log shows write ACE check/grant failures on the workspace with GetSecurityInfo error 1, plus deny ACE failures on .git and .codex with GetNamedSecurityInfoW error 1. An escalated read-only command succeeds, confirming the requested shell/WSL command is not the failing layer. This remains reproducible in the current 26.901 app build.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbrowserbugSomething isn't workingsandboxIssues related to permissions or sandboxingwindows-osIssues related to Codex on Windows systems

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions