Repository navigation
fix(review): rate a security finding HIGH or CRITICAL only on a demonstrated exploitable path - #10484
Conversation
…strated exploitable path
The security-review lane held four pull requests for a person on
CRITICAL ratings that came from path rules ("this touches a broker-loaded
file", "a marketplace entry was added", "a merge hold narrowed") or from
a misread config value, with no exploitable path. CRITICAL now needs who
reaches the change, what security impact they get, and no existing
control that stops it, each cited. A widening of a trust control still
meets the bar by itself unless a cited control blocks it; a finding
resting on config quotes the line it read; every CRITICAL candidate gets
a refute pass; an unsettled finding stays CRITICAL.
Adds six eval cases: three negatives rewritten from the held pull
requests' shapes and three positives that must still rate CRITICAL.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4755000361
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
claude-security-review needs no new review of Incremental security review of the change since a2d5165. I found no security issues.
No plugin manifests changed in this increment, so there are no critical-findings: 0 |
|
claude-review needs no new review of Incremental review of the three files changed since a2d5165. I found nothing to report.
The edited sentence in SKILL.md runs past the wrap width of its neighbours. MD013 is disabled in I only read the files. I did not run the eval, and I did not check how it scores a CRITICAL rating. No hold: the change has no cost or critical-security effect. |
… with positives A weakened merge hold now has to show a security impact like any other finding, and a bypassed gate counts only when it guards one, so a narrowed cost hold (the #10451 shape) is no longer CRITICAL. Code a manifest change starts running for users with no opt-in still meets the bar by itself, which resolves a conflict the default-on case exposed. Adds a #10451-shape negative and four positives for the rewritten rules: a broker effect widened to write, a dropped CHANGES_REQUESTED veto, a default-on marketplace entry, and pull_request_target running fork code with a write token. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pt-in plugins Review findings on 4755000: - the broker bullet names a skill added to an activity's allowlist, judged by the tools it grants, and code in the signer's load path that can read or send the key, a token or the environment; - the opt-in downgrade applies only to an added or renamed entry; a key added to an existing plugin stays CRITICAL for its installed users; - the defaultEnabled sentence is repository policy with a pointer, as-of date and recheck trigger instead of restated upstream behavior. Adds two positives: an allowlisted skill granting Bash to the issue-driven session, and a hook added to an existing opt-in plugin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fail-closed paragraph now says a finding shown to carry no security impact is never CRITICAL, while an impact the review cannot settle stays CRITICAL. The merge-veto-dropped fixture now shows the security impact: CHANGES_REQUESTED is how the security lane blocks a merge to a branch published to users. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
49d5d16 to
1666b66
Compare
No related issue: owner rule 2026-10-27 (a person only for real HIGH/CRITICAL security)
Summary
The
claude-security-reviewlane holds a pull request for a person (criteria=critical-security) on any CRITICAL finding. The reusable workflow leaves the definition to this skill: its prompt sayscritical-security: as the review command defines it(pr-review-cli.yml L1108 at v0.65.15). The skill rated by path and by key:It held four pull requests, and none of the holds was a real HIGH or CRITICAL:
resolve.mjsandpr-pipeline.yaml. The lane wrote "I found no token-scope widening, but the lane rule treats this as CRITICAL".effect: readis unchanged. Skills are regex-checked and must exist in base.coreplugin entry""defaultEnabled": false(marketplace.json:780 at 97302a5).human_veto_logins, the CHANGES_REQUESTED refusal and the ruleset's required thread resolution are untouched and still block.babysit_risk.py, "a merge-hold control"Fix
All changes are in
plugins/review/skills/security-review/SKILL.md:Severity bar (new, under Criteria). A finding is CRITICAL only when the review shows all three, each with file and line:
Touching a trust control, gate file or hold path is not a severity, because the hold paths already route those files to a person. A finding that rests on a configuration value quotes the line it read.
Fail closed. If the review has read the code and still cannot tell whether a path is reachable or blocked, the finding is unsettled and stays CRITICAL. A finding with no security impact is never CRITICAL.
Trust controls. These widenings meet "who" and "what" by themselves, so they stay CRITICAL unless a cited control blocks them:
A weakened merge hold has to show "who" and "what" like any other finding, and part 3 checks the gates that still run after it. The broker bullet now asks whether the change widens what the signer grants. Before, it asked whether the change touches what the signer loads. It also covers two cases the old wording did not name:
Manifests. Code that starts running for existing users on update with no step of theirs is CRITICAL whatever it does today, unless an opt-in or another cited control stops it:
defaultEnabled;sourcemoved off the repository.For an added entry, the review quotes
defaultEnabled. Only"defaultEnabled": falsemakes it opt-in, and an opt-in entry rates IMPORTANT. An entry without the line is treated as on (fail closed). The behavior ofdefaultEnabledis a pointer with an as-of date, not restated.Refute pass. Every CRITICAL candidate, fanned out or not, goes to a
review:lane-verifier. The verifier looks for a blocking control, a missing part of the bar, or a misread config value. A confirmed or unsettled result keeps the finding CRITICAL. A verifier may lower a manifest flag's severity but never remove its line.Vocabulary is unchanged (CRITICAL / IMPORTANT / SUGGESTION). The brief's "HIGH or CRITICAL" maps to CRITICAL, the only severity that holds.
Verification
There are 13 new
claude plugin evalcases underplugins/review/evals/security-review-*:They use
acme/names, contain no transcript, and grade with regex graders only. Every case ran on Claude Code 2.1.311 with--scaffold --ablation none --runs 3 --judge-model opus, against a copy ofplugins/reviewat base (main's SKILL.md) and at head. Scores are per run, 1.00 = pass.defaultEnabledis quoted)defaultEnabled, adds a hook)defaultEnabled: falseplugin)pull_request_targetruns fork code with a write token)verdict: VALIDon every pass. Head's broker and manifest rows come from the final text. Every other head row comes from the text before the last review fixes, which changed only the broker bullet and the manifest paragraph.defaultEnabledrestatement, now a pointer.check-skill.sh: PASS, 0 errors. The body grew from 284 lines (a WARN); the growth is the new criteria.Related
fix/holdpath-clears-on-security-pass: lets the hold-path rule clear on a clean head-bound security pass. That is why a trust-control widening must stay CRITICAL here.🤖 Generated with Claude Code