Summary
The bmad-eval-runner scripts automatically load adapter.json or .bmad-eval-adapter.json from beside the cases/queries file. An adapter controls the executable argv and optional host-environment forwarding, and the runner passes it to subprocess.run.
A developer who runs an untrusted evaluation bundle can therefore execute arbitrary local commands as the evaluator user, with any environment values requested by the bundle's adapter. The same root cause exists independently in both run_evals.py and run_triggers.py.
Affected paths
skills/bmad-eval-runner/scripts/run_evals.py
skills/bmad-eval-runner/scripts/run_triggers.py
skills/bmad-eval-runner/references/platform-adapter.md
skills/bmad-eval-runner/SKILL.md
Proposed fix
- Remove sibling adapter-file auto-discovery.
- Keep only explicit
--adapter and BMAD_EVAL_ADAPTER configuration paths.
- Centralize adapter resolution so both runners share the same trust-boundary behavior.
- Add regression tests for sibling-file rejection and trusted explicit configuration.
Impact
This is untrusted-file-assisted arbitrary command execution. It requires a developer to run the bundle; it is not a network-exposed or zero-click service.
Summary
The bmad-eval-runner scripts automatically load
adapter.jsonor.bmad-eval-adapter.jsonfrom beside the cases/queries file. An adapter controls the executable argv and optional host-environment forwarding, and the runner passes it tosubprocess.run.A developer who runs an untrusted evaluation bundle can therefore execute arbitrary local commands as the evaluator user, with any environment values requested by the bundle's adapter. The same root cause exists independently in both
run_evals.pyandrun_triggers.py.Affected paths
skills/bmad-eval-runner/scripts/run_evals.pyskills/bmad-eval-runner/scripts/run_triggers.pyskills/bmad-eval-runner/references/platform-adapter.mdskills/bmad-eval-runner/SKILL.mdProposed fix
--adapterandBMAD_EVAL_ADAPTERconfiguration paths.Impact
This is untrusted-file-assisted arbitrary command execution. It requires a developer to run the bundle; it is not a network-exposed or zero-click service.