{"id":"GHSA-6f4g-xm8v-pgv6","summary":"compose-lint: Compose file text can issue GitHub Actions workflow commands through the compose-lint Action","details":"### Impact\n\nThe GitHub Actions runner treats certain text in a step's output as commands. The legacy form, `##[command]`, is recognized anywhere in a line. compose-lint's text report prints service names, environment keys and lines of the Compose file, and it does not neutralize `##[`. Inside the compose-lint Action, a Compose file from a pull request can therefore:\n\n- create fake error or warning annotations on the pull request (`##[error]`, `##[warning]`)\n- fold the rest of the log, including the real verdict, out of sight (`##[group]`)\n- blank out chosen strings for the rest of the log (`##[add-mask]`)\n\nGitHub has postponed removing the deprecated `set-output` log command, so the runner still honors it. A test run of the Action on a GitHub-hosted runner confirmed that a `::set-output` line from a Compose file is processed. Whether it can override the Action's own `sarif-written` output, which decides whether the SARIF upload step runs, has not been tested.\n\nThe exit code and the pass/fail result are not affected. Azure Pipelines parses the same `##[` syntax, so the pip package is listed for anyone printing the text report in other CI systems.\n\nFound during an internal pre-1.0 security review.\n\n### Patches\n\nFixed in 0.31.0. The Action stops the runner from processing workflow commands while compose-lint's output is printed, using a random `stop-commands` token. The text report also escapes `##[`, and `::` at the start of a line, in anything taken from the Compose file.\n\n### Workarounds\n\n- In your own workflow, wrap the compose-lint step in `::stop-commands::\u003crandom token\u003e` and `::\u003crandom token\u003e::`.\n- Use `--format json` or `--format sarif` rather than the text report when linting untrusted pull requests.\n\n### Reproduction\n\n```yaml\nservices:\n  web:\n    image: \"nginx:1.25\"\n    environment:\n      \"##[error]DB_PASSWORD\": placeholder\n  \"##[group]svc\":\n    image: \"nginx:1.25\"\n    privileged: true\n```\n\nRun through the Action, this produces a fake error annotation and folds the remaining log lines, including the FAIL verdict, into a collapsed group.","aliases":["CVE-2026-123369"],"modified":"2026-11-10T16:15:05.047506371Z","published":"2026-11-10T15:56:59Z","database_specific":{"severity":"MODERATE","github_reviewed":true,"github_reviewed_at":"2026-11-10T15:56:59Z","nvd_published_at":"2026-11-09T18:17:25Z","cwe_ids":["CWE-117","CWE-150"]},"references":[{"type":"WEB","url":"https://github.com/tmatens/compose-lint/security/advisories/GHSA-6f4g-xm8v-pgv6"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123369"},{"type":"WEB","url":"https://github.com/tmatens/compose-lint/pull/918"},{"type":"WEB","url":"https://github.com/tmatens/compose-lint/commit/672bd11145621f787c295fb11f3a859cdec1b38d"},{"type":"PACKAGE","url":"https://github.com/tmatens/compose-lint"},{"type":"WEB","url":"https://github.com/tmatens/compose-lint/releases/tag/v0.31.0"}],"affected":[{"package":{"name":"tmatens/compose-lint","ecosystem":"GitHub Actions"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.2.0"},{"fixed":"0.31.0"}]},{"type":"GIT","repo":"https://github.com/tmatens/compose-lint","events":[{"introduced":"60c091c7cc8f86c6b0c5954031097364fea0a201"},{"fixed":"a6a7a76736de1c72abfa96c41ff8af556ffdc55f"}]}],"versions":["v0.30.0","v0.29.0","v0.28.0","v0.27.0","v0.26.0","v0.25.0","v0.24.0","v0.23.0","v0.22.0","v0.21.0","v0.20.0","v0.19.0","v0.18.0","v0.17.0","v0.16.0","v0.15.2","v0.15.1","v0.15.0","v0.14.1","v0.14.0","v0.13.0","v0.12.2","v0.12.1","v0.12.0","v0.11.0","v0.10.0","v0.9.0","v0.8.0","v0.7.1","v0.7.0","v0.6.0","v0.5.2","v0.5.1","v0.5.0","v0.4.1","v0.4.0","v0.3.7","v0.3.6","v0.3.4","v0.3.3","v0.3.2","v0.3.1","v0.3.0","v0.2.0"],"database_specific":{"last_known_affected_version_range":"\u003c= 0.30.0","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/11/GHSA-6f4g-xm8v-pgv6/GHSA-6f4g-xm8v-pgv6.json"}},{"package":{"name":"compose-lint","ecosystem":"PyPI","purl":"pkg:pypi/compose-lint"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.31.0"}]}],"versions":["0.10.0","0.11.0","0.12.0","0.12.1","0.12.2","0.13.0","0.14.0","0.14.1","0.15.0","0.15.1","0.15.2","0.16.0","0.17.0","0.18.0","0.19.0","0.2.0","0.20.0","0.21.0","0.22.0","0.23.0","0.24.0","0.25.0","0.26.0","0.27.0","0.28.0","0.29.0","0.3.0","0.3.2","0.3.3","0.3.4","0.3.5","0.3.6","0.3.7","0.30.0","0.4.0","0.4.1","0.5.0","0.5.1","0.5.2","0.6.0","0.7.0","0.7.1","0.8.0","0.9.0"],"database_specific":{"last_known_affected_version_range":"\u003c= 0.30.0","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/11/GHSA-6f4g-xm8v-pgv6/GHSA-6f4g-xm8v-pgv6.json"}}],"schema_version":"1.9.2","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N"},{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X"}]}