{"id":"CVE-2026-123369","kind":"vulnerability","aliases":["CVE-2026-123369"],"related":[],"title":"compose-lint: CI log output lets pull requests inject workflow commands","description":"compose-lint is a Docker Compose security linter that identifies dangerous misconfigurations before deployment. Prior to 0.31.0, compose-lint prints attacker-controlled service names, environment keys, file lines, and other Compose text without neutralizing GitHub Actions and Azure Pipelines workflow-command openers. When a workflow processes a pull request, legacy ##[ commands or a line-leading double-colon command can create false annotations, hide log regions, mask selected strings, or invoke other commands recognized by the runner. The affected text report paths do not alter the compose-lint exit code or pass or fail result, but they can misrepresent the CI output presented to reviewers. This issue is fixed in version 0.31.0.","summary":"compose-lint prints attacker-controlled Compose text, such as service names and environment keys, without neutralizing GitHub Actions and Azure Pipelines workflow-command syntax. A pull request can make CI annotations, hide log sections, mask strings or trigger runner commands in the text report.","severity":"medium","cvss":5.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["azure-pipelines","ci","compose-lint","docker-compose","github-actions","package"],"not_affected_if":["local-only-use","no-pr-ci-runs","trusted-input-only"],"how_to_check":"- Check the installed compose-lint version with `compose-lint --version` or the package manifest.\n- Look for CI workflows that run compose-lint on pull requests and print its text report to GitHub Actions or Azure Pipelines logs.","fix":"- compose-lint: move to `0.31.0` or later.","status":"open","published_at":"2026-11-09T18:17:25+00:00","first_seen_at":"2026-11-09T18:27:55+00:00","triaged_at":"2026-11-09T18:29:21+00:00","updated_at":"2026-11-09T18:29:21+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-09T18:29:21Z","model":"claude-haiku-5-5","output":{"fix":"- compose-lint: move to `0.31.0` or later.","reach":"internet","title":"compose-lint: CI log output lets pull requests inject workflow commands","impact":"low","summary":"compose-lint prints attacker-controlled Compose text, such as service names and environment keys, without neutralizing GitHub Actions and Azure Pipelines workflow-command syntax. A pull request can make CI annotations, hide log sections, mask strings or trigger runner commands in the text report.","audience":"developers","category":"package","nicknames":[],"who_cares":["compose-lint","docker-compose","github-actions","azure-pipelines","ci"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Misleading CI annotations, hidden log regions and masked strings for reviewers","analyst_note":"","how_to_check":"- Check the installed compose-lint version with `compose-lint --version` or the package manifest.\n- Look for CI workflows that run compose-lint on pull requests and print its text report to GitHub Actions or Azure Pipelines logs.","plain_action":"","product_name":"compose-lint","needs_analyst":false,"not_affected_if":["local-only-use","trusted-input-only","no-pr-ci-runs"],"who_is_affected":"Teams that run compose-lint in CI on pull requests from untrusted contributors and publish its text report to GitHub Actions or Azure Pipelines logs. Local use or runs that only handle trusted input are lower risk. The flaw does not change the linter's exit code or pass/fail result.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000766,"input_tokens":4731,"output_tokens":586,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-123369':15A,18A '-2026':14A,17A '0.31.0':97C,197C 'action':31B,52B,118C 'affect':163C 'alter':169C 'annot':66B,147C 'attack':38B,103C 'attacker-control':37B,102C 'azur':20B,54B,120C 'azure-pipelin':19B 'ci':4A,22B,65B,186C 'code':175C 'colon':142C 'command':12A,58B,75B,124C,134C,143C,157C 'compos':2A,24B,28B,34B,40B,81C,86C,99C,113C,172C 'compose-lint':1A,23B,33B,80C,98C,171C 'control':39B,104C 'creat':145C 'cve':13A,16A 'danger':91C 'deploy':94C 'docker':27B,85C 'docker-compos':26B 'doubl':141C 'double-colon':140C 'environ':47B,107C 'exit':174C 'fail':179C 'fals':146C 'file':109C 'fix':194C 'github':30B,51B,117C 'github-act':29B 'hide':67B,148C 'identifi':90C 'inject':10A 'invok':155C 'issu':192C 'key':48B,108C 'lead':139C 'legaci':133C 'let':7A 'line':110C,138C 'line-lead':137C 'lint':3A,25B,35B,82C,100C,173C 'linter':88C 'log':5A,68B,149C 'make':64B 'mask':70B,151C 'misconfigur':92C 'misrepres':184C 'name':45B,106C 'neutral':50B,116C 'open':125C 'output':6A,187C 'packag':32B 'pass':177C 'path':166C 'pipelin':21B,55B,121C 'present':188C 'print':36B,101C 'prior':95C 'process':129C 'pull':8A,61B,131C 'recogn':158C 'region':150C 'report':79B,165C 'request':9A,62B,132C 'result':180C 'review':190C 'runner':74B,161C 'section':69B 'secur':87C 'select':152C 'servic':44B,105C 'string':71B,153C 'syntax':59B 'text':41B,78B,114C,164C 'trigger':73B 'version':196C 'without':49B,115C 'workflow':11A,57B,123C,128C 'workflow-command':56B,122C","nicknames":[],"mitigations":[],"who_affected":"Teams that run compose-lint in CI on pull requests from untrusted contributors and publish its text report to GitHub Actions or Azure Pipelines logs. Local use or runs that only handle trusted input are lower risk. The flaw does not change the linter's exit code or pass/fail result.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["azurepipelines","ci","composelint","dockercompose","githubactions","medium","package"],"campaign_type":null,"search_a":"'-123369':15A,18A '-2026':14A,17A 'ci':4A 'command':12A 'compos':2A 'compose-lint':1A 'cve':13A,16A 'inject':10A 'let':7A 'lint':3A 'log':5A 'output':6A 'pull':8A 'request':9A 'workflow':11A","search_b":"'action':31B,52B 'annot':66B 'attack':38B 'attacker-control':37B 'azur':20B,54B 'azure-pipelin':19B 'ci':22B,65B 'command':58B,75B 'compos':24B,28B,34B,40B 'compose-lint':23B,33B 'control':39B 'docker':27B 'docker-compos':26B 'environ':47B 'github':30B,51B 'github-act':29B 'hide':67B 'key':48B 'lint':25B,35B 'log':68B 'make':64B 'mask':70B 'name':45B 'neutral':50B 'packag':32B 'pipelin':21B,55B 'print':36B 'pull':61B 'report':79B 'request':62B 'runner':74B 'section':69B 'servic':44B 'string':71B 'syntax':59B 'text':41B,78B 'trigger':73B 'without':49B 'workflow':57B 'workflow-command':56B","search_c":"'0.31.0':97C,197C 'action':118C 'affect':163C 'alter':169C 'annot':147C 'attack':103C 'attacker-control':102C 'azur':120C 'ci':186C 'code':175C 'colon':142C 'command':124C,134C,143C,157C 'compos':81C,86C,99C,113C,172C 'compose-lint':80C,98C,171C 'control':104C 'creat':145C 'danger':91C 'deploy':94C 'docker':85C 'doubl':141C 'double-colon':140C 'environ':107C 'exit':174C 'fail':179C 'fals':146C 'file':109C 'fix':194C 'github':117C 'hide':148C 'identifi':90C 'invok':155C 'issu':192C 'key':108C 'lead':139C 'legaci':133C 'line':110C,138C 'line-lead':137C 'lint':82C,100C,173C 'linter':88C 'log':149C 'mask':151C 'misconfigur':92C 'misrepres':184C 'name':106C 'neutral':116C 'open':125C 'output':187C 'pass':177C 'path':166C 'pipelin':121C 'present':188C 'print':101C 'prior':95C 'process':129C 'pull':131C 'recogn':158C 'region':150C 'report':165C 'request':132C 'result':180C 'review':190C 'runner':161C 'secur':87C 'select':152C 'servic':105C 'string':153C 'text':114C,164C 'version':196C 'without':115C 'workflow':123C,128C 'workflow-command':122C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-09-27T01:36:39+00:00","kev":null,"cvss_vector":"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","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-123369","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123369","severity":null,"published_at":"2026-11-09T18:17:25+00:00","modified_at":"2026-11-09T18:17:25+00:00","first_seen_at":"2026-11-09T18:27:55+00:00","fetched_at":"2026-11-09T18:27:55+00:00","note":null}],"documents":[{"id":108794,"url":"https://github.com/tmatens/compose-lint/commit/672bd11145621f787c295fb11f3a859cdec1b38d","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":108792,"url":"https://github.com/tmatens/compose-lint/releases/tag/v0.31.0","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":108796,"url":"https://github.com/tmatens/compose-lint/security/advisories/GHSA-6f4g-xm8v-pgv6","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-09-27T01:36:39+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}