Secure Autonomous
FeedbackGet alertsCheck a deployment
Cases / REG-0024

Claude Code GitHub Action, in agent mode, trusted any GitHub App actor (a name ending in [bot]): a route from a public issue to repository write access, reported January 2026

Caught first by researchersSoftware agents · Enterprise work agentsHuman supervisesDemonstration
REG-0024Updated 2026-10-284 sources, 4 linkedDisclosure corroborated

Disclosure: The Register's research and drafting are done with AI agents built on Claude, Anthropic's model, which the Register pays for as a customer. See Independence.

What happened

A GMO Flatt Security researcher found the Claude Code GitHub Action trusted any GitHub App actor, even one named to end in [bot], so a crafted issue could make the agent leak credentials replayable for repository write access. On the record, trust rested on a naming convention, not an explicit allow-list, and credentials sat where the agent could read them. The researcher says it was fixed four days later.

A plain summary of the typed record below; where they differ, the record governs.

Verification: 6 of 6 checks complete
✓ Structured and checkedevery claim typed and sourced, then checked by the Register's automated checker for missing sources and mistyped claims
✓ Sources linked4 of 4 sources link to the record (1 to a primary record)
✓ Sources checked claim by claimevery claim checked against its source on 2026-10-22
✓ Interpretation checked statement by statementeach statement of the Register's interpretation checked against a source on 2026-10-21
✓ Reviewed by the editorreviewed 2026-10-28
✓ Reply offeredAnthropic: offered; GMO Flatt Security: offered
Corrections · 20, latest 2026-10-21

Changes to what this case says, with the reason. Every earlier version is kept.

  • 2026-10-21: Inference: signed by. The interpretation's wording changed after the editor signed it (second, independent check of 21 october 2026); the signature is cleared so the editor signs the corrected wording.
    Show the change
    Before: Saurabh Bhatnagar
    After:
  • 2026-10-21: Inference: value. Found in the editor's second, independent check of the interpretations, 21 october 2026: the paragraph dropped the 'agent mode' limit kept by the title, the decision field and control c-a1; tag mode had a check that blocked github apps (flatt: 'agent mode lacked this check at the time of discovery'; the action's code at tag v1.0.29).
    Show the change
    Before: Kia's dealer portal let anyone register as a dealer and then granted dealer authority; this action let any GitHub App, which anyone can create, pass its write-permission check. In both, membership in a class anyone could join was treated as authorization, and nothing checked the actor's actual standing: a real dealership, or write permission on the repository
    After: Kia's dealer portal let anyone register as a dealer and then granted dealer authority; this action, in agent mode, let any GitHub App, which anyone can create, pass its write-permission check. In both, membership in a class anyone could join was treated as authorization, and nothing checked the actor's actual standing: a real dealership, or write permission on the repository
  • 2026-10-21: Outcome: regime consequence. Editor's classification call of 21 october 2026 (call 6, accepted from pull request #74): keep the score, qualified as field f7 already states it: anthropic's bug-bounty rating of the reported issues as a set, cvss version 4.0, per the researcher; no public advisory or cve exists.
    Show the change
    Before: CVSS 7.8; patch v1.0.30 (16 January 2026); all reported issues fixed in v1.0.94
    After: CVSS 7.8 (Anthropic's bug-bounty rating of the reported issues as a set, per the researcher; no public advisory or CVE); patch v1.0.30 (16 January 2026); all reported issues fixed in v1.0.94
  • 2026-10-20: Provenance tier text. Found in the editor's source re-check of 19-20 october 2026: the 7.8 score is the researcher's report of anthropic's rating of the reported issues as a set under cvss version 4.0; no advisory or cve publishes it.
    Show the change
    Before: Researcher disclosure; vendor fix; CVSS 7.8
    After: Researcher disclosure; vendor fix; CVSS 7.8 (Anthropic's bug-bounty rating, as reported by the researcher)
  • 2026-10-20: Inference: value. Found in the editor's source re-check of 19-20 october 2026: the flatt post shows the actor really was a github app, correctly detected; the failure was that any github app passed 'regardless of its actual permissions', an authorization failure, not a failed identity check on a naming convention. the interpretation was signed by the editor on 2026-10-19; signed_by and signed_on are set to null and the editor must sign the new wording.
    Show the change
    Before: Kia's dealer portal trusted a role; this action trusted a naming convention (a name ending in [bot]). In both, the authority was real and the identity check was not
    After: Kia's dealer portal let anyone register as a dealer and then granted dealer authority; this action let any GitHub App, which anyone can create, pass its write-permission check. In both, membership in a class anyone could join was treated as authorization, and nothing checked the actor's actual standing: a real dealership, or write permission on the repository
  • 2026-10-20: Outcome: regime consequence. Found in the editor's source re-check of 19-20 october 2026: the four-day fix shipped in v1.0.30 (vendor repository tag of 16 january 2026); v1.0.94 is the version as of which all reported issues were fixed (flatt post). the score itself is left pending an editor classification call.
    Show the change
    Before: CVSS 7.8; patch v1.0.94
    After: CVSS 7.8; patch v1.0.30 (16 January 2026); all reported issues fixed in v1.0.94
  • 2026-10-20: Controls: c-a1. Found in the editor's source re-check of 19-20 october 2026: 'explicit allow-list of permitted bots (absent)' is contradicted by the vendor's repository: allowed_bots was added in august 2025 (commit fec554f) and the fix commit 1bbc9e7 extended the existing checkhumanactor/allowed_bots check to agent mode; the flatt post says tag mode already had the check.
    Show the change
    Before: Actor trust by naming convention; Explicit allow-list of permitted bots (absent)
    After: In agent mode any GitHub App passed the write-permission check regardless of its actual permissions; the allowed_bots allow-list (in the action since August 2025) and the actor-type check were enforced in tag mode but not in agent mode until the 16 January 2026 fix
  • 2026-10-20: Fields: recovery technical. Found in the editor's source re-check of 19-20 october 2026: the four-day fix shipped in v1.0.30, not v1.0.94 (vendor repository); the flatt post does not recommend 'explicit allow-lists over broad trust in bots', it recommends auditing allowed_non_write_users and restricting permissions and secrets; the fix commit message says bots are rejected 'unless explicitly allowed via allowed_bots'.
    Show the change
    Before: Patch in v1.0.94; the researcher recommends explicit allow-lists over broad trust in bots
    After: Fix on 16 January 2026 (v1.0.30): agent mode now checks the actor's type and rejects non-human actors unless listed in the action's existing allowed_bots allow-list. Later remediation, complete as of v1.0.94: the workflow run summary disabled by default, a wrapper that blocks exfiltration through the gh command, environment variables scrubbed from child processes, and issues or comments edited after a run is triggered ignored. The researcher recommends auditing workflows for allowed_non_write_users and restricting their permissions and secrets
  • 2026-10-20: Fields: evidence event: source ids. Found in the editor's source re-check of 19-20 october 2026: 'later press coverage' is the hacker news (now source thn) and 'fix in a released version' is the vendor's repository (cca_fix); both now cited.
    Show the change
    Before: ["THN"] (the id since renamed FLATT)
    After: ["CCA_FIX", "FLATT", "THN"]
  • 2026-10-20: Fields: outcome. Found in the editor's source re-check of 19-20 october 2026: the flatt timeline dates the fix to 16 january 2026 and links commit 1bbc9e7, which the vendor's repository first released in tag v1.0.30; v1.0.94 (tag dated 13 april 2026) is the version 'as of' which all reported issues were fixed. the cvss 7.8 rating is the researcher's report of anthropic's bug-bounty rating of the issues as a set; no advisory or cve was found. sources cca_fix and thn added to the citation.
    Show the change
    Before: State: averted by disclosure. Reported by GMO Flatt Security on 12 January 2026; fixed four days later, in v1.0.94; further hardening through spring 2026 (researcher's timeline). Separately, in February 2026 a researcher showed that a prompt-injected issue title against a Cline triage workflow built on the same action could expose publish credentials; an unrevoked package-publishing token was later used to push an unauthorized Cline release, presumably by someone reusing the technique
    After: State: averted by disclosure. Reported by GMO Flatt Security on 12 January 2026; the permission bypass was fixed four days later, on 16 January 2026, in v1.0.30 (commit 1bbc9e7); all reported issues were fixed as of v1.0.94 (13 April 2026), after several rounds of remediation and follow-up bypasses through spring 2026 (researcher's timeline). Anthropic rated the reported issues, as a set, 7.8 under CVSS version 4.0, a severity score, per the researcher; no public advisory or CVE exists. Separately, in February 2026 a researcher showed that a prompt-injected issue title against a Cline triage workflow built on the same action could expose publish credentials; an unrevoked package-publishing token was later used to push an unauthorized Cline release, presumably by someone reusing the technique
  • 2026-10-20: Fields: decision. Found in the editor's source re-check of 19-20 october 2026: the flatt post presents the permissive allowed_non_write_users setting as a separate route 'without needing the github app bypass at all'; the github app route alone reached write access. the earlier sentence merged the two routes.
    Show the change
    Before: The permission check treated any GitHub App actor, including names ending in [bot], as trusted; the agent then followed the issue's instructions to read its own process environment. The researcher's full route to write access also relied on a permissive triage-workflow configuration
    After: In agent mode the permission check passed any GitHub App actor (a name ending in [bot]) regardless of its actual permissions; tag mode had a further check of the actor's type that agent mode lacked. The agent then followed the issue's instructions to read its own process environment. The researcher separately described a second route, needing no GitHub App at all, through a permissive triage-workflow setting (allowed_non_write_users: "*") that lets any user trigger the workflow
  • 2026-10-20: Fields: inputs. Found in the editor's source re-check of 19-20 october 2026: the flatt post does not say the attacker chose a name ending in [bot]; it says any github app can file issues on a public repository and the check tested for the [bot] suffix that github app actors carry.
    Show the change
    Before: A GitHub issue written to resemble an error message, filed by a GitHub App the attacker registered so its name ended in [bot]
    After: A GitHub issue written to resemble an error message, filed through a GitHub App the attacker created (GitHub App actors carry names ending in [bot])
  • 2026-10-20: Fields: actor status. Found in the editor's source re-check of 19-20 october 2026: the flatt post says the trigger came from an attacker-created github app's installation token, not from the researcher's user account.
    Show the change
    Before: The action, acting on a trigger from an actor it mis-trusted (the researcher's account)
    After: The action, acting on a trigger from an actor it mis-trusted (a GitHub App the researcher created)
  • 2026-10-20: Context: actors: text. Found in the editor's source re-check of 19-20 october 2026: the flatt post describes a real github app ('create a github app ... install it on the attacker's own repository'), correctly detected as an app, not a false bot.
    Show the change
    Before: 1 action; attacker as a false bot
    After: 1 action; attacker acting through a GitHub App of their own
  • 2026-10-20: Title. Found in the editor's source re-check of 19-20 october 2026: the flatt post says the check 'unconditionally allows any github app to pass, regardless of its actual permissions' and that 'agent mode lacked this check at the time of discovery'; the flaw is past, fixed on 16 january 2026, and tag mode had the check.
    Show the change
    Before: Claude Code GitHub Action trusts any actor whose name ends in [bot]: a route from a public issue to repository write access, reported January 2026
    After: Claude Code GitHub Action, in agent mode, trusted any GitHub App actor (a name ending in [bot]): a route from a public issue to repository write access, reported January 2026
  • 2026-10-20: Sources: thn. Found in the editor's source re-check of 19-20 october 2026: the source filed as thn is the gmo flatt security research post, not the hacker news; its id now names what it is (flatt) and every field, control and the interpretation that cited thn now cites flatt.
    Show the change
    Before: {"title": "GMO Flatt Security (RyotaK), 'Poisoning Claude Code: One GitHub Issue to Break the Supply Chain' (researcher disclosure; The Hacker News covered it 4 Jun 2026: https://thehackernews.com/2026/06/claude-code-github-action-flaw-let-one.html)", "type": "researcher", "url": "https://flatt.tech/research/posts/poisoning-claude-code-one-github-issue-to-break-the-supply-chain/", "via_press": false, "date": "2026-06-01", "tier": "disclosure_corroborated", "interest": null, "primary": true, "checked": "2026-10-13"}
    After: renamed to sources.FLATT; title set to the post's exact headline
  • 2026-10-16: Controls. Found in an outside review of the published record on 16 october 2026: repeated entries showed the same control twice on the page.
    Show the change
    Before: the same control listed more than once in one state
    After: one entry per control, notes combined
  • 2026-10-13: Fields and sources. Source typing corrected on review; no vendor or regulator record was found to support fact typing.
    Show the change
    Before: facts cited The Hacker News typed as regulator; Cline incident stated as established
    After: claims cite the researcher's own disclosure, typed as researcher assertions in the absence of a vendor advisory; the Cline incident described as the researcher and Cline's advisory record it
  • 2026-10-13: Context: jurisdiction. Jurisdiction text was split at a comma inside parentheses.
    Show the change
    Before: Global (vendor in the United States | researcher in Japan)
    After: Global (vendor in the United States, researcher in Japan)
  • 2026-10-13: Controls: c-a1. A control has one state per case; entries in two states merged into the state the record supports.
    Show the change
    Before: failed: Actor trust by naming convention; absent: Explicit allow-list of permitted bots
    After: failed: Actor trust by naming convention; Explicit allow-list of permitted bots (absent)
Record history · 8 entries
  • 2026-10-28: No statement from Anthropic within 14 days of the offer.
  • 2026-10-22: Follow-up note sent to Anthropic on claims added in a correction round (the permissive triage-workflow setting is now a separate second route to write access (Decision); the fixes took several rounds of remediation and follow-up bypasses, with all reported issues fixed only by 13 April 2026, and no public advisory or CVE exists (Outcome, consequence line)); 14 days to reply on those points.
  • 2026-10-20: Source added: anthropics/claude-code-action on GitHub: commit 1bbc9e7, 'fix: add checkHumanActor to agent mode (#826)', 15 January 2026; first released in tag v1.0.30 (16 January 2026); tag v1.0.94 dated 13 April 2026.
  • 2026-10-20: Source added: Claude Code GitHub Action Flaw Let One Malicious Issue Hijack Repositories (The Hacker News, Swati Khandelwal).
  • 2026-10-19: Right of reply offered to GMO Flatt Security.
  • 2026-10-16: Interpretation reworded for readers before sign-off; its meaning is unchanged.
  • 2026-10-14: Right of reply offered to Anthropic.
  • 2026-10-14: Checked by the editor against the linked records.

Controls that address what went wrong

3 controls missing or failed; 1 in place and worked. The line under each is the concrete form it would have taken in this case.

Actor identity verification
Failed: In agent mode any GitHub App passed the write-permission check regardless of its actual permissions. the allowed_bots allow-list (in the action since August 2025) and the actor-type check were enforced in tag mode but not in agent mode until the 16 January 2026 fix.
Failed · Actor layer
Retrieved content as data
Issue text resembling an error message treated as instruction
Absent · Inputs layer
Least-privilege credential scoped to task
Process-environment exposure to the agent
Failed · Envelope layer
Coordinated disclosure program
Worked: Coordinated disclosure. Four-day patch.
Worked · External layer

New cases like this, once a week. A short email when a case, signal or rule touches software agents. Free; unsubscribe in one click.

Get the weekly email

How it unfolded, layer by layer

MandateWhat it was told to do
Who deployed it: A repository maintainer running the action on issues and pull requests.
ActorWhat acted
Status: The action, acting on a trigger from an actor it mis-trusted (a GitHub App the researcher created).
InputsWhat it could see
A GitHub issue written to resemble an error message, filed through a GitHub App the attacker created (GitHub App actors carry names ending in [bot])
DecisionHow it chose
In agent mode the permission check passed any GitHub App actor (a name ending in [bot]) regardless of its actual permissions; tag mode had a further check of the actor's type that agent mode lacked. The agent then followed the issue's instructions to read its own process environment. The researcher separately described a second route, needing no GitHub App at all, through a permissive triage-workflow setting (allowed_non_write_users: "*") that lets any user trigger the workflow
EnvelopeWhat it was allowed to do
Authority it held: The action's environment held credentials that could be exchanged for a write-capable token.
ActionWhat it did
Extraction of environment variables and an identity token; replay for write access to code, issues, and workflows
OutcomeWhat happened
Caught first by researchers. Severity: none (demonstration); separate February 2026 token theft at another project.
EvidenceWhat can be proven
Record of the event: Researcher disclosure with a dated timeline; fix in a released version; later press coverage.
RecoveryWhat could be stopped, undone, answered for
Technical recovery: Fix on 16 January 2026 (v1.0.30): agent mode now checks the actor's type and rejects non-human actors unless listed in the action's existing allowed_bots allow-list. Later remediation, complete as of v1.0.94: the workflow run summary disabled by default, a wrapper that blocks exfiltration through the gh command, environment variables scrubbed from child processes, and issues or comments edited after a run is triggered ignored. The researcher recommends auditing workflows for allowed_non_write_users and restricting their permissions and secrets. Accountability: Coordinated disclosure.

The same gap in other cases

Cases where the same control was missing or failed. Those in another world are the cross-domain comparisons the Register exists to make.

ControlSame worldOther worlds
Actor identity verificationAgent-run intrusion campaign 2025, Pydantic AI: a web page can make a…Kia dealer portal 2024 (machines)
Retrieved content as dataGitHub MCP leak 2025, EchoLeak 2025, Perplexity Comet 2025Gemini calendar invite 2025 (software acting on machines)
Least-privilege credential scoped to taskGitHub MCP leak 2025, PocketOS 2026, Perplexity Comet 2025, Pydantic AI: a web page can make a…·

Cost and accountability

Severitynone (demonstration); separate February 2026 token theft at another project
AffectedNot recorded
Costnone
Regulatory or legal consequenceCVSS 7.8 (Anthropic's bug-bounty rating of the reported issues as a set, per the researcher; no public advisory or CVE); patch v1.0.30 (16 January 2026); all reported issues fixed in v1.0.94
Technical recoveryTechnical recovery: Fix on 16 January 2026 (v1.0.30): agent mode now checks the actor's type and rejects non-human actors unless listed in the action's existing allowed_bots allow-list. Later remediation, complete as of v1.0.94: the workflow run summary disabled by default, a wrapper that blocks exfiltration through the gh command, environment variables scrubbed from child processes, and issues or comments edited after a run is triggered ignored. The researcher recommends auditing workflows for allowed_non_write_users and restricting their permissions and secrets.
AccountabilityCoordinated disclosure
InterpretationWhy it matters beyond its domain. Kia's dealer portal let anyone register as a dealer and then granted dealer authority; this action, in agent mode, let any GitHub App, which anyone can create, pass its write-permission check. In both, membership in a class anyone could join was treated as authorization, and nothing checked the actor's actual standing: a real dealership, or write permission on the repository. Signed by Saurabh Bhatnagar on 2026-10-21.

Right of reply

Named partyStatus
AnthropicOffered 2026-10-14; no statement as of 2026-10-28Respond for Anthropic
GMO Flatt SecurityOffered 2026-10-19; awaiting responseRespond for GMO Flatt Security

Help shape the Register

A person reads every answer; changes it leads to are logged in the methodology. To dispute a claim or reply for a named company, use Respond, dispute, or submit.

Did this page help with what you came to do?