Repository navigation
Description
What happens
The exec-approval dialog shows the sanitized command, then Allow runs the original command. The sanitizer escapes control, format, and non-ASCII spaces. It does not treat U+2800 BRAILLE PATTERN BLANK as invisible. That character is category Other Symbol, so IsInvisible leaves it in the text.
In the dialog font it looks blank. The operator can approve a command whose visible spacing is not the command that runs. Mixed-script confusables already raise a warning. A braille blank does not.
Where
Checked on 7967d509 by reading the code. An approval dialog was not opened.
- Invisible set: ExecApprovalCommandDisplaySanitizer.cs
- Dialog binds the sanitized text: ExecApprovalV2UiPromptHandler.cs and ExecApprovalDialog.cs
Suggested fix
Escape U+2800 the same way the sanitizer already escapes other invisible code points, so the operator sees the escape instead of a blank.
Environment
Windows 11. OpenClaw Companion source on main at commit 7967d50 (2026-11-04). No packaged installer build was used.
Steps
- Send an exec-approval request whose command contains U+2800 BRAILLE PATTERN BLANK between two tokens.
- Read the approval dialog.
- Allow. The original command, including U+2800, is what runs.
ExecApprovalCommandDisplaySanitizer.IsInvisible escapes control, format, and non-ASCII spaces. U+2800 is category Other Symbol, so it stays in commandStatus.Text. The dialog binds that text. Mixed-script confusables already show a warning. A braille blank does not.
Repair
Escape U+2800 with the same invisible-code-point path. Add a regression that a command containing U+2800 is shown with the escape, not as a blank gap. Stop there.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Projects
- StatusShow more project fieldsBacklog
Activity
clawsweeper commentedon Nov 4, 2026
Codex review: this still needs some work.
Summary
This issue establishes a current approval-display defect: U+2800 survives sanitization and reaches the dialog without a warning, warranting security review.
Reproducibility: Current source establishes that U+2800 survives the sanitizer and reaches the dialog without a confusable warning; no dialog, build or test was run during this read-only review.
Next step
Have the approval-security owners assess U+2800 rendering and shared redaction effects, then establish failing sanitizer and presenter regressions before changing the invisible-character set.
Security
Needs attention: The approval-display gap needs security assessment before an ordinary repair proceeds.
Review details
Best possible solution:
Render U+2800 as a visible code-point escape while preserving execution payloads and legitimate Unicode text.
Do we have a high-confidence way to reproduce the issue?
Current source establishes that U+2800 survives the sanitizer and reaches the dialog without a confusable warning; no dialog, build or test was run during this read-only review.
Is this the best way to solve the issue?
The proposed explicit escape fits the sanitizer's existing purpose, provided regression coverage also checks the shared stripped-view redaction behavior.
AGENTS.md: found and applied where relevant.
Remaining risk / open question:
Codex review notes: model internal, reasoning medium; reviewed against 2c327dc5ac11.
Label changes
Label changes:
No label changes.
Label justifications:
P2: A source-established approval-display gap merits repair, but no demonstrated exploit or urgent regression establishes broader severity.impact:security: Agent-controlled invisible text can undermine the operator's understanding at an execution-authorization boundary.Evidence reviewed
Security concerns:
src/OpenClaw.Shared/ExecApprovals/ExecApprovalCommandDisplaySanitizer.cs:281U+2800 passes unchanged into the approval command display and does not trigger the mixed-script warning; assess misleading rendering and the shared redaction implications without assuming an execution-policy bypass.
Confidence: 0.94
What I checked:
src/OpenClaw.Shared/ExecApprovals/ExecApprovalCommandDisplaySanitizer.cs:266, 2c327dc5ac11)src/OpenClaw.Tray.WinUI/Dialogs/ExecApprovalDialog.cs:138, 2c327dc5ac11)src/OpenClaw.Shared/ExecApprovals/ExecApprovalConfusableDetector.cs:57, 2c327dc5ac11)tests/OpenClaw.Shared.Tests/ExecApprovalCommandDisplaySanitizerTests.cs:13, 2c327dc5ac11)Likely related people:
tests/OpenClaw.Shared.Tests/ExecApprovalCommandDisplaySanitizerTests.cs)How this review workflow works
@clawsweeper re-reviewcomments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.@clawsweeper re-reviewor@clawsweeper re-runon an open PR or issue to request a fresh review only.@clawsweeper reviewto request a fresh review only.@clawsweeper explainto ask for more context, or@clawsweeper stopto stop active automation.Reviewed November 4, 2026, 11:11 AM ET / 16:11 UTC.
SebTardif commentedon Nov 4, 2026
The fix is on fork branch
fix/2010-braille-blankat68f682996f315a705e04866299c8954d6c5d0781.This account cannot open the pull request.
gh pr createreturnsCreatePullRequestforbidden, and RESTPOST /repos/openclaw/openclaw-windows-node/pullsreturns 404. The repository pull request policy readsall.Compare link:
https://github.com/openclaw/openclaw-windows-node/compare/main...SebTardif:fix/2010-braille-blank?expand=1
roboclaw-bot commentedon Nov 10, 2026
I have prepared the narrowly scoped fix from SebTardif’s candidate, with contributor credit: U+2800 is rendered visibly by the existing approval-display sanitizer. The executed command and approval authority are not changed. Added coverage includes split-secret redaction, safe text and unchanged execution arguments; independent source/safety review found no actionable introduced defect.
Native Windows tests, approval-display proof and the required containment proof are still pending. Keeping this issue open, and keeping the planned PR in draft status until the remaining validation is recorded.
roboclaw-bot commentedon Nov 10, 2026
Draft #2104 (fix: exec approval display hides braille blanks in commands) is now open: #2104
The draft is published from the roboclaw-bot fork with maintainer edits enabled and credits @SebTardif’s original fix. This issue remains open pending required native Windows tests, approval-display and MXC proof, review, and merge. Those validation results are not yet verified; the PR remains a draft.