Desktop: routine Git fetch/push triggers opaque Trusted Access cybersecurity blocks
What version of the Codex App are you using (From “About Codex” dialog)?
Current Codex desktop release as of 2026-07-22. The exact build was not captured before filing.
What subscription do you have?
Personal account (not a managed Business or Enterprise tenant).
What platform is your computer?
Microsoft Windows x64.
What issue are you seeing?
Routine GitHub operations in a trusted local repository repeatedly cross the automatic-review boundary and can produce an opaque block:
This content can't be shown We take extra caution with cybersecurity requests. If you're a security professional, you may be able to apply for Trusted Access.
The task was ordinary validation/documentation work. It explicitly excluded security auditing and security tooling. The requested external actions were normal git fetch and git push operations to the repository's existing GitHub remote, explicitly requested and repeatedly confirmed by the user.
Relevant runtime configuration:
- Codex desktop on Windows
sandbox_mode = "workspace-write"- automatic approval reviewer enabled
- network access restricted in the workspace sandbox
- trusted local repository
- existing HTTPS GitHub remote
- Git command prefixes previously approved
The first sandboxed Git network command fails because network access is disabled. Retrying the same command with an escalation invokes automatic review. In this failure mode, the UI presents Trusted Access/cybersecurity messaging or hides the relevant content entirely. This makes a sandbox/network permission boundary look like a cybersecurity-policy rejection.
The false classification is especially confusing because the linked Trusted Access application is for managed security programs and is not applicable to a personal user doing non-security work.
This also consumes additional model usage: the agent retries, explains the boundary, re-evaluates the task, and may still fail to perform an operation the user explicitly authorized.
What steps can reproduce the bug?
- Open a trusted local Git repository in Codex desktop on Windows.
- Use
workspace-writewith automatic approval review and restricted sandbox network access. - Configure the repository with its normal existing GitHub
origin. - Ask Codex to fetch a known branch or push the current branch.
- Observe the sandboxed command fail because network access is disabled.
- Have the agent retry the exact
git fetchorgit pushwith the required escalation. - Observe automatic-review / Trusted Access UI. In affected turns, the result is replaced with “This content can't be shown” and cybersecurity guidance despite the task being non-security work.
- Repeat after explicitly authorizing the exact Git operation; the workflow may cross the same boundary again.
What is the expected behavior?
- A normal fetch/push to the existing remote of a trusted repository should be permitted after one explicit, narrowly scoped authorization.
- The authorization should persist for the task/session, or Codex should expose an actionable allowlist for that exact Git remote and operation.
- Approval UI should always show the exact command, destination, requested permission, and reason it crossed the sandbox boundary.
- “This content can't be shown” should not hide the information necessary to understand or approve a request.
- The UI must distinguish sandbox/network approval from Codex Security, cybersecurity classification, and Trusted Access.
- Identical, previously approved low-risk Git operations should not repeatedly consume model usage for automatic review.
- Personal-account users should not be directed to an inapplicable managed-business Trusted Access program for ordinary repository operations.
Additional information
This overlaps with #32007 (authorized Git push denied by auto-review) and #33130 (false cybersecurity “content can't be shown” message), but the combined desktop failure is distinct: a routine sandboxed Git network escalation is surfaced as an opaque cybersecurity/Trusted Access block.
The underlying configuration concepts—project trust, command-prefix approval, and sandbox network permission—appear to be separate, but the product UI does not explain that distinction or provide a durable, narrowly scoped GitHub-network authorization. No repository contents, credentials, or private organization data are included in this report.
3 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Also affects the headless CLI on Linux — and in this case it is not the Git network path
Same account, different surface. Adding it because the original report is Desktop/Windows and the
CLI reproduces something closely related, but my testing points at a different trigger, so I
want to be careful not to widen the original claim without evidence.
Environment
codex-cli 0.146.0, installed via npm (@openai/codex), invoked ascodex exec--sandbox workspace-write,-c model="gpt-5.6-sol" -c model_reasoning_effort="high"gitto the GitHub remote fails to resolve, as expected)for finalized WAV segments. No security work of any kind.
Symptom
The run terminates with, twice in succession, and exit code 1:
No partial output is retained beyond what already streamed. The model had done substantial work
(up to 139k tokens in one run) and produced nothing — no file written, no commit made.
What the CLI evidence shows
Three consecutive runs of the same task. Note where each one dies:
| run | Git network ops attempted | tokens used | flagged at line | lines of pure model output since the last tool call |
|---|---|---|---|---|
| 1 |
git ls-remote --heads origin| 139,217 | 5882 / 5889 | 234 || 2 | none | 58,448 | 3227 / 3232 | 1,078 |
| 3 | none — network ops explicitly forbidden in the prompt | 66,655 | 918 / 923 | 443 |
Two things stand out:
git push,fetch,ls-remoteorremote updateat all, and to verify everything from thelocal object store. It still flagged. Runs 2 and 3 attempted no network Git operation.
flag lands 5–7 lines from the end of the transcript, after the last tool call, with hundreds of
lines of generated report text in between. The tool calls all succeed.
So the failure is in generating the answer, not in performing an action.
What the output looked like
The task's deliverable is a structured review report: a findings table with severity labels
(BLOCKER / MAJOR / MINOR / ADVISORY), per-finding reproduction steps, and a verdict. Reading that
shape without context, a classifier could plausibly read it as a vulnerability report — even though
the subject is whether an audio file's sample offset survives a restart.
Supporting that reading, tentatively: three earlier rounds of the same task, with the same report
shape, completed successfully. So report shape alone is not sufficient — either something specific
to this round pushes it over, or there is a stochastic element. I have three failures and no
successful run of this round, which is not enough to isolate the variable, and I would rather say
that than guess.
Why this is worth separating from the original report
The original reproduction is a genuine permission-boundary problem: a sandboxed Git operation fails,
the retry escalates, and the escalation surfaces as cybersecurity messaging. That is a real defect
and this comment does not contradict it.
But if the CLI failure above is a content classifier acting on generated review text, it is a
different defect with a different fix, and the two share only the misleading user-facing message.
The shared symptom is what makes this hard to diagnose from the outside: both paths present as
"cybersecurity risk, apply for Trusted Access", so a user cannot tell whether they hit a sandbox
permission boundary or a content classification — and in neither case is Trusted Access an
applicable remedy for a personal account doing non-security work.
Additional expected behaviour, from this surface
need different user actions and currently produce identical text.
analysis were lost because the summary could not be emitted; even a truncated or
classification-redacted result would preserve it.
codex execshould exit with a distinguishable status for classification refusal versus ordinaryfailure, so automation can tell "the model was blocked" from "the task failed".
knowing explicitly, since ordinary code review produces exactly that shape.
Follow-up: a fourth run rules out prompt phrasing, and corrects my earlier characterisation
Same environment as my previous comment (
codex-cli 0.146.0, npm, Linux x86_64, personal account,--sandbox workspace-write,gpt-5.6-solat high reasoning effort, non-security task).In that comment I suggested the output's shape — a review report with severity labels and
reproduction steps — might be what a classifier was reading as security content. A fourth run
falsifies that, and I want to correct it rather than leave a wrong lead in the thread.
The four runs
| run | variable changed | tokens used | flagged at | content being emitted at the flag |
|---|---|---|---|---|
| 1 | none | 139,217 | 5882 / 5889 | JSON test-harness report |
| 2 | plain retry | 58,448 | 3227 / 3232 | Rust source it had read |
| 3 | all Git network operations forbidden | 66,655 | 918 / 923 | a summary table of check results |
| 4 | review-metaphor wording removed | 153,457 | 6714 / 6719 | a Rust test function it had just written |
Run 4 removed every instance of "attack" and "defeat" from the prompt, replacing them with literal
QA phrasing ("test whether the guard holds", "find inputs the fix does not cover"). It flagged
anyway, having done the most work of any run.
What is now ruled out
harness containing
SIGKILL,RLIMIT_FSIZE, malformed-input probes and crash-recovery casesstraight through without incident, and flagged much later while emitting ordinary Rust.
What holds across all four
The flag fires during final response composition, never on a tool call. In every run it lands
5–7 lines from the end of the transcript, after the last command completed, with 234 / 1,078 / 443 /
976 lines of generated output in between. Every tool call succeeds. Token counts are not monotonic
(58k to 153k), and the content type at the flag point differs each time — JSON, Rust source, a
plain-text table, Rust test code.
I do not have a positive explanation, and I would rather report the eliminations than offer a third
theory. Three variables tested and excluded may still be useful to whoever can see the
classification decision from the inside.
The practical cost
Run 4 lost 153k tokens of completed analysis because the final message could not be emitted. It was
also terminated mid-edit, leaving 105 uncommitted lines in a working file — recoverable here because
the work was in a disposable worktree, but a plain
codex execuser editing their own repositorywould be left with a partially applied change and an error message that does not mention it.
That sharpens one of the expected-behaviour items from my previous comment: a classification refusal
on the final response should not discard the turn, and ideally should not leave the workspace
mid-edit without saying so.