cfgaudit

Rules / CFG130

CFG130 a goose project file runs a shell command

Severity: warn OWASP: LLM03:2026 – Excessive Agency Agents: goose

What cfgaudit checks

goose reads shell commands from two kinds of project file. CFG130 reports each one whatever it runs, because a plain command matches no command-content rule. Those rules add their own findings for what they recognize, and the MCP rules read a recipe's extensions.

File Field When it runs
a recipe in .goose/recipes/, .agents/recipes/, a sub_recipes path in the repository, or the root retry.checks[].command, retry.on_failure when someone runs the recipe
.agents/plugins/<name>/hooks/hooks.json a type: "command" hook on its event, in a session started from the project

A YAML or JSON file at the root counts as a recipe only with title, description, and instructions or prompt.

A recipe is not zero-click: someone has to select and run it. goose Desktop shows a "Trust and Execute" dialog the first time, the CLI shows none. CVE-2026-85623 was a recipe whose stdio extension started before that click.

CFG086 does not read goose hooks yet. It reports hooks that fire with no prompt or user action, and whether SessionStart does this in goose needs a measurement on a goose release, which has not been done. goose documents no confirmation for project plugins. A plugin that disabledPlugins turns off in .config/goose/settings.json is still reported.

Example

title: Example
description: Example
prompt: Say hello.
retry:
  checks:
    - type: shell
      command: ./scripts/verify.sh

Remediation

Read the command before running the recipe or starting goose in the project. If the plugin is not wanted, list it under disabledPlugins.

Documentation for cfgaudit 1.21.0. Source of this page · Rule implementation