Skip to content

Console Harness switching restricts an unrestricted native plugin allowlist #2256

Open

Description

@miguelbranco80

Commit or version

Verified upstream main: b13be62aae45f5b8eac9911c6b2bd7a22cadb57a. The defect remains in the OCE Console's updateModelConfiguration.

Environment

OCE Console, ordinary Create Agent workflow with a valid OpenClaw Preset and model Secret. Reproduced with Chromium through Playwright 1.63.0 on macOS, Node.js 24.3.0, real loopback Fastify routes, Native IAM, and in-memory platform storage. The test uses the filesystem Configuration Driver. No deployed runtime or model turn is needed to observe the Configuration rewrite.

Reproduction

  1. Apply a valid OpenClaw Preset that contains an enabled native plugin entry. For example, its Configuration can contain this synthetic fragment, alongside its existing valid model and gateway settings:

    {
      "plugins": {
        "entries": {
          "knowledge": {
            "enabled": true,
            "config": { "collection": "example-notes" }
          }
        }
      }
    }
  2. Open Advanced settings and inspect Configuration JSON. Leave plugins.allow omitted.

  3. Change Harness from OpenClaw to Codex.

  4. Inspect plugins.allow. Repeat with an explicitly authored empty array, plugins.allow: [].

The knowledge ID is synthetic; the rewrite can be observed without installing that plugin.

Expected behavior

Harness selection preserves the operator's native plugin permissions. Codex's runtime entry is added or removed separately.

Original plugins.allow After selecting Codex After selecting OpenClaw
Omitted Omitted Omitted
[] [] []
["knowledge"] Unchanged; Codex creation reports a conflict Unchanged
["knowledge", "codex"] Unchanged Unchanged
["codex"] Unchanged Unchanged

Missing or empty native allowlists stay unrestricted. Nonempty lists keep their authored restriction. Native deny settings and unrelated entries/configuration are preserved. The operator explicitly edits policy to permit a blocked Harness.

The same requirement applies to REST clients: Kubernetes Codex admission rejects native policy that disables or denies Codex, or a restrictive allowlist excluding it. Configuration can be staged separately. Agent create/update, deployment, and provisioning must reject conflicting policy without rewriting it. No browser click history or new persisted removal marker is required.

Actual behavior

For both omitted and empty allowlists, OCE writes plugins.allow: ["codex"]. This changes an unrestricted policy into a Codex-only allowlist. Other native entries remain in the JSON but are excluded by the new allowlist.

The OCE Console creates this restriction; the native runtime receives the already changed Configuration.

Related work and evidence

Proposed upstream fix: draft PR #2258, targeting main from the existing fork head.

Downstream PR #15 contains the same focused fix, regression, documentation, and native GitHub screenshots/video.

The Console and REST regressions fail against unchanged upstream production modules at the verified commit above. Updated source in the linked PRs preserves policy and rejects conflicts. Browser coverage passes 35 cases without skips; API/Compute coverage passes 357 cases with one existing Linux-only skip on macOS. Functional checks and final Storybook evidence were captured at 97e8f3826f5f9826638e3d4df57780d6b2d66c30; final head 0b4a067fda15d08567546d3c1ed7381477ee309b differs only by documentation cleanup.

The linked PRs contain current native GitHub screenshots/video and detailed verification limits. These checks establish configuration preservation and admission, not deployed plugin installation or model execution.

Activity

  1. added
    P2Normal priority bug or improvement with limited blast radius.
    clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.
    clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.
    clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.
    impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.
    issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.
    on Oct 12, 2026
  2. clawsweeper commented on Oct 12, 2026

    @clawsweeper
    Contributor

    Codex review: this still needs some work.

    Summary
    This issue establishes a current Configuration rewrite on main, and the same author’s open draft repair at #2258 owns the fix.

    Reproducibility: Current main’s handler, Codex template, and pinned native activation code establish the omitted/empty allowlist defect directly; no live reproduction or tests were run in this review.

    Root-cause cluster
    Relationship: canonical
    Canonical: #2256
    Summary: This issue tracks the Console policy mutation, with an open candidate repair; the earlier runtime-preparation repair addresses a different producer.

    Members:

    Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

    Next step
    Review #2258 at its updated head for policy preservation, round-trip coverage, and REST admission before landing the existing repair.

    Security
    Needs attention: Current main can silently broaden an authored native plugin restriction during Harness switching.

    Review details

    Best possible solution:

    Keep authored native plugin policy unchanged across Harness switches and reject incompatible Codex admission with a clear explanation before resource writes.

    Do we have a high-confidence way to reproduce the issue?

    Current main’s handler, Codex template, and pinned native activation code establish the omitted/empty allowlist defect directly; no live reproduction or tests were run in this review.

    Is this the best way to solve the issue?

    The updated candidate addresses both narrowing and round-trip widening by preserving policy rather than conditionally granting Codex permission, with regression coverage through Console creation and REST admission.

    AGENTS.md: found and applied where relevant.

    Remaining risk / open question:

    • The updated candidate’s expanded admission behavior still needs current-head maintainer review; the earlier discussion reviewed a superseded implementation.

    Codex review notes: model internal, reasoning medium; reviewed against 52fb0e35a9f8.

    Label changes

    Label changes:

    • add impact:security: Switching to OpenClaw can turn the authored ["codex"] restriction into an unrestricted empty allowlist.
    • add clawsweeper:needs-security-review: Current issue advisory state selects this label.

    Label justifications:

    • P2: A deterministic policy rewrite affects a specific advanced Agent-creation workflow, with an existing focused repair and no demonstrated widespread outage.
    • impact:ux-friction: Harness selection silently changes configured plugin permissions, forcing operators to inspect and repair advanced Configuration JSON.
    • impact:security: Switching to OpenClaw can turn the authored ["codex"] restriction into an unrestricted empty allowlist.
    Evidence reviewed

    Security concerns:

    • [medium] Codex-only policy becomes unrestricted — apps/controller/src/console/agents/create.mjs:746
      Selecting OpenClaw removes codex from plugins.allow; an authored ["codex"] becomes [], which native activation treats as unrestricted by the allowlist.
      Confidence: 0.99

    What I checked:

    How this review workflow works
    • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
    • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
    • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
    • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
    • Maintainers can also comment @clawsweeper review to request a fresh review only.
    • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge; those execution lanes are retired.
    • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

    Reviewed October 13, 2026, 10:34 AM ET / 14:34 UTC.

  3. added
    clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.
    impact:securityThis issue is about security boundaries, credentials, authz, sandboxing, or sensitive data.
    on Oct 13, 2026
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

    P2Normal priority bug or improvement with limited blast radius.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.impact:securityThis issue is about security boundaries, credentials, authz, sandboxing, or sensitive data.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions