{"id":"CVE-2026-123796","kind":"vulnerability","aliases":["CVE-2026-123796"],"related":[],"title":"compose-lint: large pull requests leak .env secrets in linter output","description":"compose-lint is a Docker Compose security linter that identifies dangerous misconfigurations before deployment. From 0.32.0 until 0.33.0, compose-lint's incomplete remediation for .env secret disclosure checks the 20,000-finding limit before replacing resolved values with their variable references. A pull request can combine a secret-referencing image field with aliased content that produces more than 20,000 findings, causing the early-stop path to emit already graded findings with the resolved secret value in text, JSON, SARIF, and Code Scanning output. Exploitation requires a workflow that writes secrets into the sibling .env and lints untrusted changes, and the run exits 2 unless --allow-partial-coverage is used. This issue is fixed in version 0.33.0.","summary":"compose-lint, a Docker Compose security linter, prints resolved .env secret values in its findings when a scan exceeds 20,000 findings. An attacker who can submit a pull request can get a CI run to expose the secret in text, JSON, SARIF, and Code Scanning output.","severity":"low","cvss":2.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["ci","code-scanning","docker-compose","github-actions","package"],"not_affected_if":["fixed-0.33.0","no-secrets-in-env-file","trusted-code-only"],"how_to_check":"- Check the installed compose-lint version with `compose-lint --version` or the lockfile entry; versions from `0.32.0` up to but not including `0.33.0` are affected.\n- Look for CI workflows that write secrets into a `.env` file next to the Compose file and then lint pull requests from untrusted forks or branches.\n- Check whether those lint runs use `--allow-partial-coverage`, since the sources say the exit code is 2 without it.","fix":"- compose-lint: upgrade to `0.33.0`","status":"open","published_at":"2026-11-09T18:17:26+00:00","first_seen_at":"2026-11-09T18:27:56+00:00","triaged_at":"2026-11-09T18:29:24+00:00","updated_at":"2026-11-09T18:29:24+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-09T18:29:24Z","model":"claude-haiku-5-5","output":{"fix":"- compose-lint: upgrade to `0.33.0`","reach":"internet","title":"compose-lint: large pull requests leak .env secrets in linter output","impact":"medium","summary":"compose-lint, a Docker Compose security linter, prints resolved .env secret values in its findings when a scan exceeds 20,000 findings. An attacker who can submit a pull request can get a CI run to expose the secret in text, JSON, SARIF, and Code Scanning output.","audience":"developers","category":"package","nicknames":[],"who_cares":["docker-compose","ci","github-actions","code-scanning"],"confidence":0.6,"fix_status":"available","needs_auth":"no","worst_case":"resolved secret values leak into CI logs and Code Scanning results","analyst_note":"","how_to_check":"- Check the installed compose-lint version with `compose-lint --version` or the lockfile entry; versions from `0.32.0` up to but not including `0.33.0` are affected.\n- Look for CI workflows that write secrets into a `.env` file next to the Compose file and then lint pull requests from untrusted forks or branches.\n- Check whether those lint runs use `--allow-partial-coverage`, since the sources say the exit code is 2 without it.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["no-secrets-in-env-file","trusted-code-only","fixed-0.33.0"],"who_is_affected":"Teams that run compose-lint in CI on pull requests while a .env file containing real secrets sits beside the linted Compose files. The sources say exploitation needs a workflow that writes secrets into that .env and lints untrusted changes, so projects that never put secrets in a sibling .env, or only lint trusted code, are less exposed. Local use on your own files is unlikely to be affected.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"low"},"cost_usd":0.000801,"input_tokens":4742,"output_tokens":654,"severity_before":"low"},"analyst_status":null,"analyst_note":null,"search":"'-123796':15A,18A '-2026':14A,17A '0.32.0':94C '0.33.0':96C,199C '000':51B,110C,140C '2':185C '20':50B,109C,139C 'action':28B 'alias':133C 'allow':188C 'allow-partial-coverag':187C 'alreadi':150C 'attack':54B 'caus':142C 'chang':180C 'check':107C 'ci':19B,64B 'code':21B,75B,163C 'code-scan':20B 'combin':125C 'compos':2A,25B,31B,35B,79C,84C,98C 'compose-lint':1A,30B,78C,97C 'content':134C 'coverag':190C 'cve':13A,16A 'danger':89C 'deploy':92C 'disclosur':106C 'docker':24B,34B,83C 'docker-compos':23B 'earli':145C 'early-stop':144C 'emit':149C 'env':8A,40B,104C,176C 'exceed':49B 'exit':184C 'exploit':166C 'expos':67B 'field':131C 'find':45B,52B,111C,141C,152C 'fix':196C 'get':62B 'github':27B 'github-act':26B 'grade':151C 'identifi':88C 'imag':130C 'incomplet':101C 'issu':194C 'json':72B,160C 'larg':4A 'leak':7A 'limit':112C 'lint':3A,32B,80C,99C,178C 'linter':11A,37B,86C 'misconfigur':90C 'output':12A,77B,165C 'packag':29B 'partial':189C 'path':147C 'print':38B 'produc':136C 'pull':5A,59B,122C 'refer':120C 'referenc':129C 'remedi':102C 'replac':114C 'request':6A,60B,123C 'requir':167C 'resolv':39B,115C,155C 'run':65B,183C 'sarif':73B,161C 'scan':22B,48B,76B,164C 'secret':9A,41B,69B,105C,128C,156C,172C 'secret-referenc':127C 'secur':36B,85C 'sibl':175C 'stop':146C 'submit':57B 'text':71B,159C 'unless':186C 'untrust':179C 'use':192C 'valu':42B,116C,157C 'variabl':119C 'version':198C 'workflow':169C 'write':171C","nicknames":[],"mitigations":[],"who_affected":"Teams that run compose-lint in CI on pull requests while a .env file containing real secrets sits beside the linted Compose files. The sources say exploitation needs a workflow that writes secrets into that .env and lints untrusted changes, so projects that never put secrets in a sibling .env, or only lint trusted code, are less exposed. Local use on your own files is unlikely to be affected.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["ci","codescanning","dockercompose","githubactions","low","package"],"campaign_type":null,"search_a":"'-123796':15A,18A '-2026':14A,17A 'compos':2A 'compose-lint':1A 'cve':13A,16A 'env':8A 'larg':4A 'leak':7A 'lint':3A 'linter':11A 'output':12A 'pull':5A 'request':6A 'secret':9A","search_b":"'000':51B '20':50B 'action':28B 'attack':54B 'ci':19B,64B 'code':21B,75B 'code-scan':20B 'compos':25B,31B,35B 'compose-lint':30B 'docker':24B,34B 'docker-compos':23B 'env':40B 'exceed':49B 'expos':67B 'find':45B,52B 'get':62B 'github':27B 'github-act':26B 'json':72B 'lint':32B 'linter':37B 'output':77B 'packag':29B 'print':38B 'pull':59B 'request':60B 'resolv':39B 'run':65B 'sarif':73B 'scan':22B,48B,76B 'secret':41B,69B 'secur':36B 'submit':57B 'text':71B 'valu':42B","search_c":"'0.32.0':94C '0.33.0':96C,199C '000':110C,140C '2':185C '20':109C,139C 'alias':133C 'allow':188C 'allow-partial-coverag':187C 'alreadi':150C 'caus':142C 'chang':180C 'check':107C 'code':163C 'combin':125C 'compos':79C,84C,98C 'compose-lint':78C,97C 'content':134C 'coverag':190C 'danger':89C 'deploy':92C 'disclosur':106C 'docker':83C 'earli':145C 'early-stop':144C 'emit':149C 'env':104C,176C 'exit':184C 'exploit':166C 'field':131C 'find':111C,141C,152C 'fix':196C 'grade':151C 'identifi':88C 'imag':130C 'incomplet':101C 'issu':194C 'json':160C 'limit':112C 'lint':80C,99C,178C 'linter':86C 'misconfigur':90C 'output':165C 'partial':189C 'path':147C 'produc':136C 'pull':122C 'refer':120C 'referenc':129C 'remedi':102C 'replac':114C 'request':123C 'requir':167C 'resolv':115C,155C 'run':183C 'sarif':161C 'scan':164C 'secret':105C,128C,156C,172C 'secret-referenc':127C 'secur':85C 'sibl':175C 'stop':146C 'text':159C 'unless':186C 'untrust':179C 'use':192C 'valu':116C,157C 'variabl':119C 'version':198C 'workflow':169C 'write':171C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-10-05T01:42:04+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/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-123796","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123796","severity":null,"published_at":"2026-11-09T18:17:26+00:00","modified_at":"2026-11-09T18:17:26+00:00","first_seen_at":"2026-11-09T18:27:56+00:00","fetched_at":"2026-11-09T18:27:56+00:00","note":null}],"documents":[{"id":108810,"url":"https://github.com/tmatens/compose-lint/commit/31ec460399e06e98aa0d1cc578368a1960a8a0b3","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":108811,"url":"https://github.com/tmatens/compose-lint/releases/tag/v0.33.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":108812,"url":"https://github.com/tmatens/compose-lint/security/advisories/GHSA-rm8w-w798-g545","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-05T01:42:04+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"}