Severity Daily

IT and AI security incidents, checked against the primary source

Tag: goose

  • goose’s recipe security scan skips the two fields that execute commands, and today’s CVE names no fixed version

    goose’s recipe security scan skips the two fields that execute commands, and today’s CVE names no fixed version

    A public issue filed on July 8 is still open eight releases later, and VulnCheck assigned it CVE-2026-85623 this morning with the affected range running through a build that shipped yesterday.

    What happened

    VulnCheck published CVE-2026-85623 at 10:17 a.m. Central today, September 4, 2026, against goose, the open-source AI agent maintained under the Agentic AI Foundation at the Linux Foundation. The record scores it 8.8 on CVSS v3.1 (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) and 8.7 on v4.0, both from VulnCheck as the scoring source, and classes it CWE-94, code injection. The affected range is 0 through 1.49.0, semver. There is no fixed version in the record, and no solution or workaround entry in the CVE Program copy either. Version 1.49.0 is the current release; it shipped yesterday, September 3, at 7:34 p.m. UTC.

    goose distributes reusable agent configurations called recipes. They travel as files, as deeplinks, and as content in GitHub repositories — the ordinary way one developer hands another a working setup. Two fields inside a recipe cause programs to run. An extensions entry of stdio type carries cmd and args, and the process is spawned before any MCP handshake takes place. A retry entry can carry shell checks, which are executed through sh -c.

    goose ships a recipe inspection routine, Recipe::check_for_security_warnings. Severity Daily read it in the v1.49.0 source that the CVE record itself cites. In full, what it examines is this:

    if [self.instructions.as_deref(), self.prompt.as_deref()]
        .iter()
        .flatten()
        .any(|&field| contains_unicode_tags(field))
    {
        return true;
    }
    
    if let Some(activities) = &self.activities {
        return activities
            .iter()
            .any(|activity| contains_unicode_tags(activity));
    }
    
    false

    Three fields — instructions, prompt, and activities — checked for one thing, hidden Unicode tag characters. The Recipe struct in the same file has extensions and retry fields. The function does not read either of them.

    The finding is not new; the identifier is. A researcher publishing as geo-chen, credited in VulnCheck’s advisory as George Chen, opened issue #10325 on the goose repository on July 8, 2026, titled “A shared recipe silently runs arbitrary commands (stdio extension cmd / retry shell checks), and the recipe security scan does not cover those fields.” The issue includes a proof of concept executing a command on version 1.37.0 with no consent prompt and no warning, and it recommends four mitigations: an explicit consent step naming the commands, extending the scan to flag process-spawning extensions, invoking the scan in the CLI path, and restricting inline stdio commands that arrive from remote sources. As of this writing the issue is open, carries no labels, and has no maintainer reply. The third recommendation rests on a further claim of the researcher’s that Severity Daily has not independently verified: that the scan is not called at all on the CLI path.

    One discrepancy worth noting in the record. The description reads “goose 1.37.0 executes arbitrary commands from recipe stdio extensions and retry.checks without security inspection” — naming the single version the proof of concept ran on — while the CPE configuration covers everything up to and including 1.49.0. The range is the accurate statement of scope, and our own read of the current source supports it.

    CVE-2026-85623 arrived inside a batch. NVD received 60 records from VulnCheck between 3:17:32 and 3:17:48 p.m. UTC, sixteen seconds, and nearly all of them are AI and machine-learning tooling: MCP servers for Excel, Postgres, Git, and shell access; Aim, Xinference, LLaMA-Factory, ms-swift, Chroma, and Marqo; document pipelines including marker, zerox, surya, and MegaParse; and two more AI coding agents, aider and Plandex, at 7.8 each. Severity Daily has covered VulnCheck’s batch-assignment pattern three times before; this story is about one record in the batch, not the batch.

    Why it matters

    goose has already published an advisory for a defect in this exact class. GHSA-r5pp-p5r8-466r, released July 24, 2026 and carrying CVE-2026-72718, covers arbitrary command execution in the goose CLI by way of Git’s core.fsmonitor key: a repository’s own configuration file names a program, and the agent runs it while collecting workspace context. It was scored 7.0 and fixed in 1.44.0, which shipped July 23, the day before the advisory went out. Severity Daily covered that class on September 2, across seven agents.

    Put the two side by side. Both are attacker-controlled configuration data naming a program that the agent executes before asking the user anything. One was triaged, fixed, and advised on. The other, reported publicly fifteen days before that fix shipped, is still open after eight releases — 1.42.0, 1.43.0, 1.44.0, 1.45.0, 1.46.0, 1.47.0, 1.48.0, and 1.49.0 — and the third party that eventually assigned it an identifier scored it 8.8, nearly two points above the one that got fixed.

    The obvious explanation is the honest one, and it is not misconduct. The fsmonitor report came in through GitHub’s private advisory workflow, which is a security intake. The recipe report came in as a public issue on a bug tracker, which is not. Maintainers are entitled to run a private channel and to treat it as the queue that gets security attention, and a project’s own advisory page is a poor place to look for defects nobody reported there. That asymmetry explains the fifty-eight days.

    It does not dispose of them. The issue has been public since July 8 with a working proof of concept in it, which means the disclosure decision was made on day one by the reporter and is not recoverable. Today a CNA read that same public issue, scored it high, and stamped an identifier on it that will appear in every scanner keyed to CVEs. The window in which a private channel would have helped closed in July. What remains is a defect that is public, identified, and unfixed in the current release.

    The narrower point is about what the scan was built to catch. Someone wrote check_for_security_warnings deliberately: the design intent is that a recipe arriving from a stranger should be inspected before it runs. What it inspects — hidden Unicode tag characters in the natural-language fields — is a prompt-injection defense, and a reasonable one. The fields that spawn operating system processes were never in its scope. That is the gap this record actually documents, and it is not confined to one project: agent tooling has spent two years hardening the path where text reaches a model, while the configuration format that ships alongside the text quietly grew a field that runs sh -c.

    What to do

    There is no fixed version to move to. Until there is, treat any goose recipe originating outside your own organization as an executable file, because that is what it is.

    Before running goose run --recipe or opening a recipe deeplink, read the recipe’s extensions and retry keys directly. Any extension with type: stdio carries a cmd and args pair that will be executed under your account, and it runs before the MCP handshake, so an extension that never speaks MCP still gets its process. Any retry check of shell type goes through sh -c. The deeplink path deserves the most caution precisely because it looks least like running a program.

    Do not rely on goose’s own security warning to catch this. Verified against the v1.49.0 source today: it does not read those fields.

    If you distribute recipes internally, keep them in a repository you control and review changes to extensions and retry with the same scrutiny you would apply to a CI workflow file, which is the closest analogue. For monitoring, watch issue #10325 and the project’s published advisories; no GHSA has been issued for this defect as of this writing.

    Sourcing note

    Checked: the NVD record for CVE-2026-85623, the CVE Program record at cveawg.mitre.org (state PUBLISHED, assigner VulnCheck), VulnCheck’s own advisory page for the finding, GitHub issue #10325 in its current state, the goose repository’s published security advisories, the repository’s release list, and the v1.49.0 source of crates/goose/src/recipe/mod.rs — the last of these is how the scan’s field coverage was verified first-hand rather than taken from the reporter’s account. The claim that the scan is not invoked on the CLI path is the reporter’s and is labeled as such above; we did not trace the call sites. Scoring on this record is single-source: VulnCheck supplied both the v3.1 and v4.0 vectors, and no other scorer has weighed in. There is no vendor statement of any kind — no maintainer reply on the issue, no advisory, no fixed release — so nothing here reflects the project’s own assessment, and that absence is part of the story rather than a gap we could close. cisa.gov refuses automated fetching, so KEV status is inferred from the absence of CISA fields in the NVD record rather than read from the catalog; there is no indication of exploitation, and none is claimed. Prior Severity Daily coverage of the related core.fsmonitor class and of VulnCheck’s batch-assignment pattern is linked inline.

  • Seven AI coding agents run attacker code from a repository’s .git/config, and four still have no fix

    Seven AI coding agents run attacker code from a repository’s .git/config, and four still have no fix

    OpenAI published three Codex CVEs on September 1, 2026. A day later, the research behind one of them said Qwen Code, Grok Build, Hermes Agent, and a second path in Claude Code still have no fix.

    What happened

    OpenAI, acting as its own CNA, published three CVE records for its Codex products on September 1, 2026: CVE-2026-19591, CVE-2026-19592, and CVE-2026-19593. On September 2, CISA’s Vulnerability Enrichment program added its own scoring container to CVE-2026-19593, and the same day Manifold Security published the research those records came out of — a writeup it calls GitSpawn, covering eight findings across seven AI coding agents that all turn on the same piece of Git behavior.

    The behavior is not new and is not a bug in Git. An agent opening a workspace wants to know what is in the repository, so it shells out to Git. Any command that refreshes the index — git status, git diff HEAD — runs programs named in that repository’s own .git/config. The key most of these findings turn on is core.fsmonitor, a performance setting that points Git at an external file-watcher binary. A repository shipping a .git/config with fsmonitor set to an attacker’s command gets that command run on the machine of anyone who points an agent at the folder.

    The advisory for the goose agent — GHSA-r5pp-p5r8-466r, carrying CVE-2026-72718, rated 7.0, fixed in goose 1.44.0 — states the consequence plainly: “A malicious repository whose .git/config sets [core] fsmonitor = <command> causes git to execute that command on the host during its index refresh (git diff HEAD). So running goose review inside a malicious repo runs attacker code – no submitted prompt, no model call, no tool approval, no trust prompt. The command executes before goose ever contacts the model.”

    OpenAI’s CVE-2026-19592 is the core.fsmonitor case in Codex: the record says Codex “automatically collected Git repository metadata without disabling the repository-local core.fsmonitor setting,” across Codex CLI 0.102.0 through 0.130.0 and Codex Desktop for macOS and Windows. CVE-2026-19593 is a second route to the same place — a repository config that sets attr.tree together with clean or process filters, which gets Git to run an attacker-controlled program outside the sandbox with the user’s privileges. Its stated workaround is exact about where the trust boundary actually sits: “Until updated, do not open attacker-supplied workspace folders that retain untrusted .git metadata.”

    CVE-2026-19591 is a different flaw in the same batch: Codex’s command-safety parser “interpreted PowerShell’s stop-parsing token (–%) differently than PowerShell itself,” which let file-writing Git operations past the approval prompt. It is credited to Compass Security; CVE-2026-19592 to the System Software and Security Lab at Fudan University and to a researcher working through the Zero Day Initiative. Three sets of reporters, one product, one publication day.

    Two vectors for one delivery path

    OpenAI supplied no CVSS score of its own on CVE-2026-19593. The 9.8 attached to that record comes from CISA’s ADP container, with the vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — network attack vector, no user interaction. CVE-2026-19592, scored 7.3 by both OpenAI and CISA, carries CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H — local, privileges required, user interaction required. Both flaws are reached the same way: a person opens a repository someone else prepared. CISA’s SSVC decisions diverge along the same line: CVE-2026-19593 is marked automatable with exploitation “none,” CVE-2026-19592 not automatable with exploitation at “poc.” Nothing here is wrong enough to dispute. It is worth knowing that two scores four points apart describe the same user action.

    Where the record runs out

    Coverage of the research has mapped Manifold’s Claude Code finding to CVE-2026-55607. That record is something else: Anthropic’s own advisory GHSA-7835-87q9-rgvv, “Sandbox Escape via Git Worktree Path Confusion,” affecting @anthropic-ai/claude-code from 2.1.38 up to 2.1.163, fixed in 2.1.163, scored 7.7 on CVSS v4.0 and credited to the researcher metnew. It does involve fsmonitor execution during worktree operations, which is how the two get conflated — but the versions do not line up. Manifold says it reported its core.fsmonitor finding against Claude Code 2.1.193 on June 26, 2026, and that Anthropic fixed it on June 29 in 2.1.196. Neither version is inside CVE-2026-55607’s range.

    Anthropic’s published advisory list for claude-code carries nothing covering 2.1.193 to 2.1.196, and nothing for the second Claude Code path Manifold describes, which it says it reported on July 15, 2026, and re-confirmed as unfixed on 2.1.252 — a report Manifold says was closed as an internal duplicate. On the public record, the patched issue has no advisory and neither does the unpatched one.

    The Hermes Agent finding is in a third state. Manifold cites CVE-2026-71963, assigned by VulnCheck; queried against the CVE Program API on September 2, 2026, that identifier returns a 404. It has been assigned, and no record has been published. Manifold says six attempts to reach the Hermes maintainers produced no triage.

    Why it matters

    The control being bypassed is the one these tools tell users to rely on. Every agent named here ships a workspace-trust prompt or a command-approval step, and the safety story of a coding agent is that nothing runs until you say so. This class of bug runs before the prompt. In the goose case the command executes before the agent has contacted a model at all — no prompt injection, no clever phrasing, no model in the loop. The agent is doing nothing but starting up.

    What makes this worth reading past the individual CVEs is the convergence. Manifold reports that five of its eight submissions came back as duplicates of findings other researchers had filed independently, one of them on the same day. That is not one vendor being careless. It is what happens when seven teams arrive at the same design — ask Git what is in this directory before doing anything else — and Git’s answer has been configurable by the directory since long before any of them existed. Abusing core.fsmonitor for execution is documented red-team tradecraft, with public writeups predating all of these products. The agents did not invent the trick. They enlarged its reach, from something that fires when a developer runs a Git command to something that fires when a developer opens a folder.

    The second thing to take from this is how thin the durable record is. Where the vendor is its own CNA you get records with version ranges you can check, and OpenAI’s three are exactly that. Where it is not, the finding lands in a GitHub advisory a scanner may or may not see, in a VulnCheck assignment with no published record, or nowhere. A team asking “are our developers running a vulnerable agent” has an authoritative answer for Codex and goose, a partial one for Claude Code, and none for Qwen Code, Grok Build, or Hermes Agent. A fix shipping is not the same as a fix being knowable — most recently on Eclipse Theia’s agent-mode workspace escape, where the release that fixed it filed the change as breaking rather than security.

    One caution on scale. The reach figures are Manifold’s: over 77 million npm downloads a month for Claude Code, close to half a million GitHub stars across the projects it discusses. Those are the researcher’s numbers, not checked here, and downloads are not installs. The patch-status claims for the four unfixed agents are single-source too — Manifold says it re-tested them, and no vendor has confirmed or denied.

    What to do

    Codex. Update Codex CLI to 0.131.0 or later; Codex Desktop for macOS to 26.519.22136 or later; Codex Desktop for Windows to 26.519.21041, Microsoft Store package 26.519.2081.0, or later. OpenAI’s stated interim workaround for CVE-2026-19591: “Until updated, do not open or follow instructions from untrusted repositories. On macOS and Linux, keep filesystem sandboxing enabled.”

    goose. Update to 1.44.0 or later, which closes CVE-2026-72718.

    Claude Code. 2.1.163 clears CVE-2026-55607. Manifold’s account puts the core.fsmonitor fix in 2.1.196; there is no Anthropic advisory naming that version, so treat 2.1.196 as the researcher’s figure rather than a vendor-confirmed floor. Manifold reports a second path still reproducing on 2.1.252.

    Qwen Code, Grok Build, Hermes Agent. No fixed version is published. Do not point them at repositories you did not create.

    For everyone else. Stop trusting repository-local Git config. A fresh clone over HTTPS or SSH does not import a remote .git/config; the risk is in folders handed over as archives, shared drives, or copied directory trees that keep .git intact. Before opening one with an agent, check its .git/config for core.fsmonitor, attr.tree, and any filter.*.clean or filter.*.process entry. A one-line grep across your developers’ checkout directories will tell you today whether anything is already sitting there.

    Sourcing note

    Checked against primary sources: the CVE Program API records for CVE-2026-19591, CVE-2026-19592, CVE-2026-19593, and CVE-2026-55607; the NVD record for CVE-2026-19593, which is still “Awaiting Analysis” and carries no CVSS of its own; CISA’s vulnrichment repository, where the ADP container for CVE-2026-19593 was committed on September 2, 2026; the goose advisory GHSA-r5pp-p5r8-466r; Anthropic’s GHSA-7835-87q9-rgvv and the first two pages of its advisory list; and Manifold Security’s writeup. None of these CVEs is in CISA’s Known Exploited Vulnerabilities catalog, and no federal remediation deadline attaches to any of them.

    Not reached: cisa.gov returns 403 to automated fetching, so CISA’s enrichment was read from the cisagov/vulnrichment repository on GitHub — CISA’s own publication channel for that data — rather than from the agency’s website. Unresolved: whether Anthropic considers the core.fsmonitor issue and the still-open second path covered by an existing advisory; whether VulnCheck’s CVE-2026-71963 will be published; and whether Qwen Code, Grok Build, or Hermes Agent dispute Manifold’s re-test results.