Skip to content

Native Windows: 默认状态目录因继承来的 CodexSandboxUsers 修改权限被 ACL 守卫拒绝,报错未指明主体也无补救指引 #778

Closed

Description

@chenriien-ai

摘要

原生 Windows 上用 /pr-gate(--executor codex)时,pmctl gate run 在默认状态目录直接失败:

state-writer: unsafe state root rejected: /c/Users/<user>/.local/share/pm-dispatch/state (ACL grants write to a non-owner principal)
pmctl gate run: failed to create parent operation record

与 #612(只读授权被误判为写入)不同:这次状态目录上的非所有者授权确实是修改(Modify)权限,所以 #592 的守卫判断本身是对的;问题是这个授权不是使用者设的,而是继承来的,使用者无从自行判断该不该动它。

现场数据(icacls 只读查看,已去识别)

~/.local/share/pm-dispatch/state
  <host>\CodexSandboxUsers : (I)(OI)(CI)(M)     # 继承来的 Modify
  S-1-5-21-…-4242059880    : (I)(OI)(CI)(M)     # 无法解析名称的 SID,同样继承的 Modify
  NT AUTHORITY\SYSTEM      : (I)(OI)(CI)(F)
  BUILTIN\Administrators   : (I)(OI)(CI)(F)
  <host>\<user>            : (I)(OI)(CI)(F)

(I) 表示全部继承自上层目录(用户目录下的 .local)。CodexSandboxUsers 从名称看是 Codex 沙箱使用的本机组(来源是推测,未验证);该授权为何出现在这个目录、由谁加的,本次没有追查。

问题

  1. 报错没有说是哪个主体:只写 a non-owner principal,使用者看不出是 CodexSandboxUsers 还是别的,也看不出授权是继承的。
  2. 没有补救指引:错误信息与 docs/platform-support.md 都没有说可以用 PM_DISPATCH_STATE_ROOT 指到另一个只有当前使用者可写的目录。
  3. 失败只留下 failed to create parent operation record,没有指回 ACL 原因(原因在上一行,但容易被当成两个独立错误)。
  4. 使用者若直接去改默认目录的 ACL,可能破坏 Codex 沙箱本身需要的授权;守卫应明确这是个取舍。

本次绕开的做法(未改动任何既有 ACL)

另建 C:\Users\<user>\.pm-gate-state,icacls <dir> /inheritance:r /grant:r "<user>:(OI)(CI)F",仅对该次运行设 PM_DISPATCH_STATE_ROOT。之后启动成功。

建议

  • 报错时列出触发判定的主体名称与 ACE(含是否继承)。
  • 错误信息附上 PM_DISPATCH_STATE_ROOT 的用法,并在 docs/platform-support.md 的原生 Windows 一节记录这个情况。
  • 评估是否把「继承来的、已知的 Codex 沙箱组」列为可配置的允许名单(需有明确的安全说明)。

环境

Windows 11(10.0.26200)、Git Bash(MINGW64)、pmctl 来自本仓库 main、/pr-gate --executor codex --policy generic --lifecycle detached。首次发现 2026-11-04。

相关:#592、#612。

🤖 Generated with Claude Code

Activity

  1. screenleon commented on Nov 5, 2026

    @screenleon
    Owner

    已在 #786(main e91e969)處理訊息與文件;允許名單那項沒做,本單依你的要求關閉,剩下的需要另外決定。

    做了:

    • 守衛不放寬。拒絕訊息現在指名第一個違規主體,並說明是繼承或明確授權,例如 ... non-owner principal: BUILTIN\Users, inherited(用真實繼承授權重現)。pmctl state status 顯示同一段原因。
    • 守衛另印一行補救:PM_DISPATCH_STATE_ROOT 指到只有自己能寫的目錄;繼承的授權可能屬於別的工具(例如 Codex 沙箱),不要未經確認就改父目錄。
    • docs/platform-support.md 的 Windows 一節補一條,含用 icacls 建立目錄的做法。
    • 本單第 1、2、4 點因此處理。第 3 點(失敗只留下 failed to create parent operation record)我沒有改:原因在上一行,我沒有把兩行合併。

    沒做:

    • 建議 3,把已知的 Codex 沙箱組列為可配置的允許名單。這會讓守衛接受另一個主體寫 run state,需要安全上的明確決定與說明,我沒有自行加入。
    • 守衛仍只指名第一個違規主體。
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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions