{"id":"CVE-2026-102289","kind":"vulnerability","aliases":["CVE-2026-102289","GHSA-f42p-wjw5-97qh"],"related":[],"title":"zizmor: Debug logging prints available GitHub credentials in cleartext","description":"### Summary\n\nzizmor 1.27.0 exposes GitHub access tokens in cleartext when debug-level logging is enabled. Tokens supplied via environment variables (`GH_TOKEN`, `GITHUB_TOKEN`, `ZIZMOR_GITHUB_TOKEN`), or the corresponding command-line options (`--gh-token`, `--github-token`, `--zizmor-github-token`) are included in the debug representation of the parsed application configuration and written to stderr.\n\nThe affected logging is enabled by a single `-v`/`--verbose` or an applicable `RUST_LOG` directive. \n\n### Details\n\nThe issue was introduced in commit [919bea46](https://github.com/zizmorcore/zizmor/commit/919bea4635bae204d5186e5743cb263c70b518b4), merged through [PR #2180](https://github.com/zizmorcore/zizmor/pull/2180). Version `1.26.1` and earlier are unaffected. Version `1.27.0` is the first and only affected release.\n\nzizmor accepts GitHub credentials to perform authenticated GitHub API requests for the purposes of retrieving remote GitHub repositories and performing online audits that may require resolving information such as action references, commits, or repository metadata. A GitHub credential is used to avoid unauthenticated API limits and, when applicable, provide access to private repositories.\n\nPR #2180 was intended to improve the experience around zizmor’s implicit offline mode. It also moved the CLI types into a dedicated module and added a debug log of the fully parsed `App` value:\n\n```rust\ntracing::debug!(\"app: {app:?}\");\n```\n\n This diagnostic is useful for understanding the effective CLI state, including whether offline operation was explicit or inferred. However, the same commit added derived `Debug` implementations to `App`, `NetworkArgs`, and `GitHubToken(String)`.\nBefore the debug event is emitted, the compatibility token aliases are merged into `app.network.gh_token`.\n\nThe resulting stderr contains the token verbatim. Explicit `--offline` clears the token before the debug event, but normal online operation and `--no-online-audits` retain it.\n\n### PoC\n\nUsing `zizmor` at `v1.27.0`:\n\n`GH_TOKEN=gho_ZIZMOR_MRE zizmor --verbose example.yml`\n\nwill emit\n\n```text\nDEBUG zizmor: app: App { input: InputArgs { inputs: [\"example.yml\"], collect: [Default], strict_collection: false }, audit: AuditArgs { fix: None, pedantic: false, persona: Regular, min_severity: None, min_confidence: None, no_ignores: false }, output: OutputArgs { verbose: Verbosity { verbose: 1, quiet: 0, phantom: PhantomData<clap_verbosity_flag::InfoLevel> }, format: Plain, no_progress: false, color: None, render_links: Auto, show_audit_urls: Auto, no_exit_codes: false, naches: false }, network: NetworkArgs { offline: false, gh_token: Some(GitHubToken(\"gho_ZIZMOR_MRE\")), github_token: None, zizmor_github_token: None, gh_hostname: Standard(\"github.com\"), no_online_audits: false, cache_dir: \"/Users/shaan/.cache/zizmor\" }, args: GlobalArgs { lsp: LspArgs { lsp: false, stdio: false }, config: None, no_config: false, completions: None, thanks: false, help: (), version: () } }\n```\n\n### Impact\n\nIn practice, the impact of this vulnerability should be mediated by GitHub's own layered defenses, including secret redaction in Actions logs and automatic credential revocation in issue/PR/etc. comments. However, zizmor itself should never log sensitive materials, and so the behavior is still considered vulnerable even if compensating controls exist in downstream systems.\n\nAn affected user must enable debug logging while supplying a GitHub credential, and the resulting stderr must be available to another party. Plausible disclosure channels include a public bug report, CI log or artifact, or terminal capture. A potential attacker only needs permission to read the disclosed logs.\n\nThe resulting impact depends on the token's scopes, repository access, and lifetime. A minimally scoped token may only expose public read-only data, while a broader OAuth token or personal access token may permit private-repository or modification of repositories, packages, workflows, or organization resources. The default informational logging level is unaffected. Exploitation requires debug logging and subsequent log exposure, which limits likelihood.\n\nNotably, because `zizmor`’s bug-report template asks users to rerun commands with `--verbose` and paste the complete logs, this can result in credentials being copied into public issues or other support channels.","summary":"zizmor 1.27.0 prints the GitHub token from GH_TOKEN, GITHUB_TOKEN, ZIZMOR_GITHUB_TOKEN or the matching flags into its debug log when verbose logging is on. Anyone who can read those logs, such as a public bug report or CI log, can take the token and act with its GitHub permissions.","severity":"high","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"zizmor","fixed":["1.28.0"],"affected":"= 1.27.0","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["ci","cwe-532","github-actions","package","python","zizmor"],"not_affected_if":["default-logging","no-github-token","offline-mode","version-1.26.1-or-earlier"],"how_to_check":"- Run `pip show zizmor` and confirm the version is `1.27.0`.\n- Check whether verbose or debug logging (`-v`, `--verbose`, or a `RUST_LOG` directive) is used in CI jobs or scripts that run zizmor and keep their stderr.","fix":"- `zizmor` `1.28.0` (fixed version per the product data; upgrading from `1.27.0` is the fix stated by the sources).","status":"open","published_at":"2026-11-09T21:56:25+00:00","first_seen_at":"2026-11-09T22:00:47+00:00","triaged_at":"2026-11-09T22:02:25+00:00","updated_at":"2026-11-09T22:02:25+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-11-09T22:02:25Z","model":"claude-haiku-5-5","output":{"fix":"- `zizmor` `1.28.0` (fixed version per the product data; upgrading from `1.27.0` is the fix stated by the sources).","reach":"local","title":"zizmor: debug logging writes GitHub tokens to stderr in cleartext","impact":"high","summary":"zizmor 1.27.0 prints the GitHub token from GH_TOKEN, GITHUB_TOKEN, ZIZMOR_GITHUB_TOKEN or the matching flags into its debug log when verbose logging is on. Anyone who can read those logs, such as a public bug report or CI log, can take the token and act with its GitHub permissions.","audience":"developers","category":"package","nicknames":[],"who_cares":["python","zizmor","github-actions","ci"],"confidence":0.85,"fix_status":"available","needs_auth":"yes","worst_case":"GitHub tokens readable from logs, enabling repository or workflow changes","analyst_note":"Whether any stderr redaction exists in CI wrappers is not stated in the sources.Oh, and the product data names a fix at 1.28.0; the sources do not add more.","how_to_check":"- Run `pip show zizmor` and confirm the version is `1.27.0`.\n- Check whether verbose or debug logging (`-v`, `--verbose`, or a `RUST_LOG` directive) is used in CI jobs or scripts that run zizmor and keep their stderr.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["default-logging","no-github-token","offline-mode","version-1.26.1-or-earlier"],"who_is_affected":"Teams that run zizmor 1.27.0 with a GitHub credential supplied and debug logging enabled, where the stderr output is stored or shared. Runs without a GitHub token, without verbose logging, or with --offline (which clears the token before logging) are not exposed. Version 1.26.1 and earlier are not affected.","user_interaction":"yes","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000967,"input_tokens":6179,"output_tokens":698,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-102289':12A,20A '-2026':11A,19A '-532':24B '/users/shaan/.cache/zizmor':463C '/zizmorcore/zizmor/commit/919bea4635bae204d5186e5743cb263c70b518b4),':169C '/zizmorcore/zizmor/pull/2180).':176C '0':412C '1':410C '1.26.1':178C '1.27.0':32B,85C,184C '2180':173C,246C '919bea46':166C '97qh':17A 'accept':193C 'access':88C,241C,595C,617C 'act':78B 'action':27B,221C,504C 'add':270C,307C 'affect':144C,190C,538C 'alias':326C 'also':260C 'anoth':557C 'anyon':58B 'api':200C,235C 'app':278C,283C,284C,312C,377C,378C 'app.network.gh':330C 'applic':137C,155C,239C 'arg':464C 'around':253C 'artifact':570C 'attack':576C 'audit':213C,356C,388C,426C,459C 'auditarg':389C 'authent':198C 'auto':424C,428C 'automat':507C 'avail':5A,555C 'avoid':233C 'behavior':524C 'broader':612C 'bug':68B,565C 'cach':461C 'captur':573C 'channel':561C 'ci':22B,71B,567C 'clear':341C 'cleartext':9A,91C 'cli':263C,293C 'code':431C 'collect':383C,386C 'color':420C 'command':115C 'command-lin':114C 'comment':512C 'commit':165C,223C,306C 'compat':324C 'compens':531C 'complet':477C 'confid':400C 'config':472C,475C 'configur':138C 'consid':527C 'contain':335C 'control':532C 'correspond':113C 'credenti':7A,195C,229C,508C,548C 'cve':10A,18A 'cwe':23B 'data':609C 'debug':2A,51B,94C,132C,272C,282C,309C,319C,346C,375C,542C 'debug-level':93C 'dedic':267C 'default':384C 'defens':499C 'depend':588C 'deriv':308C 'detail':159C 'diagnost':286C 'dir':462C 'direct':158C 'disclos':583C 'disclosur':560C 'downstream':535C 'earlier':180C 'effect':292C 'emit':322C,373C 'enabl':98C,147C,541C 'environ':102C 'even':529C 'event':320C,347C 'example.yml':371C,382C 'exist':533C 'exit':430C 'experi':252C 'explicit':300C,339C 'expos':86C,604C 'f42p':15A 'fals':387C,393C,404C,419C,432C,434C,438C,460C,469C,471C,476C,480C 'first':187C 'fix':390C 'flag':48B 'format':415C 'fulli':276C 'gh':38B,104C,119C,364C,439C,453C 'gh-token':118C 'gho':366C,443C 'ghsa':14A 'ghsa-f42p-wjw5-97qh':13A 'github':6A,26B,35B,40B,43B,81B,87C,106C,109C,122C,126C,194C,199C,208C,228C,446C,450C,495C,547C 'github-act':25B 'github-token':121C 'github.com':168C,175C,456C 'github.com/zizmorcore/zizmor/commit/919bea4635bae204d5186e5743cb263c70b518b4),':167C 'github.com/zizmorcore/zizmor/pull/2180).':174C 'githubtoken':315C,442C 'globalarg':465C 'help':481C 'hostnam':454C 'howev':303C,513C 'ignor':403C 'impact':483C,487C,587C 'implement':310C 'implicit':256C 'improv':250C 'includ':129C,295C,500C,562C 'infer':302C 'inform':218C 'input':379C,381C 'inputarg':380C 'intend':248C 'introduc':163C 'issu':161C 'issue/pr/etc':511C 'layer':498C 'level':95C 'lifetim':597C 'limit':236C 'line':116C 'link':423C 'log':3A,52B,55B,63B,72B,96C,145C,157C,273C,505C,518C,543C,568C,584C 'lsp':466C,468C 'lsparg':467C 'match':47B 'materi':520C 'may':215C,602C,619C 'mediat':493C 'merg':170C,328C 'metadata':226C 'min':396C,399C 'minim':599C 'mode':258C 'modif':625C 'modul':268C 'move':261C 'mre':368C,445C 'must':540C,553C 'nach':433C 'need':578C 'network':435C 'networkarg':313C,436C 'never':517C 'no-online-audit':353C 'none':391C,398C,401C,421C,448C,452C,473C,478C 'normal':349C 'oauth':613C 'offlin':257C,297C,340C,437C 'onlin':212C,350C,355C,458C 'oper':298C,351C 'option':117C 'organi':631C 'output':405C 'outputarg':406C 'packag':28B,628C 'pars':136C,277C 'parti':558C 'pedant':392C 'perform':197C,211C 'permiss':82B,579C 'permit':620C 'person':616C 'persona':394C 'phantom':413C 'phantomdata':414C 'plain':416C 'plausibl':559C 'poc':359C 'potenti':575C 'pr':172C,245C 'practic':485C 'print':4A,33B 'privat':243C,622C 'private-repositori':621C 'progress':418C 'provid':240C 'public':67B,564C,605C 'purpos':204C 'python':29B 'quiet':411C 'read':61B,581C,607C 'read-on':606C 'redact':502C 'refer':222C 'regular':395C 'releas':191C 'remot':207C 'render':422C 'report':69B,566C 'repositori':209C,225C,244C,594C,623C,627C 'represent':133C 'request':201C 'requir':216C 'resolv':217C 'result':333C,551C,586C 'retain':357C 'retriev':206C 'revoc':509C 'rust':156C,280C 'scope':593C,600C 'secret':501C 'sensit':519C 'sever':397C 'show':425C 'singl':150C 'standard':455C 'state':294C 'stderr':142C,334C,552C 'stdio':470C 'still':526C 'strict':385C 'string':316C 'summari':83C 'suppli':100C,545C 'system':536C 'take':74B 'termin':572C 'text':374C 'thank':479C 'token':36B,39B,41B,44B,76B,89C,99C,105C,107C,110C,120C,123C,127C,325C,331C,337C,343C,365C,440C,447C,451C,591C,601C,614C,618C 'trace':281C 'type':264C 'unaffect':182C 'unauthent':234C 'understand':290C 'url':427C 'use':231C,288C,360C 'user':539C 'v':151C 'v1.27.0':363C 'valu':279C 'variabl':103C 'verbatim':338C 'verbos':54B,152C,370C,407C,408C,409C 'version':177C,183C,482C 'via':101C 'vulner':490C,528C 'whether':296C 'wjw5':16A 'workflow':629C 'written':140C 'zizmor':1A,21A,30B,31B,42B,84C,108C,125C,192C,254C,361C,367C,369C,376C,444C,449C,514C 'zizmor-github-token':124C","nicknames":[],"mitigations":[],"who_affected":"Teams that run zizmor 1.27.0 with a GitHub credential supplied and debug logging enabled, where the stderr output is stored or shared. Runs without a GitHub token, without verbose logging, or with --offline (which clears the token before logging) are not exposed. Version 1.26.1 and earlier are not affected.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["zizmor"],"ptokens":["zizmor"],"labels":["ci","cwe532","githubactions","high","package","pypi","python","zizmor"],"campaign_type":null,"search_a":"'-102289':12A,20A '-2026':11A,19A '97qh':17A 'avail':5A 'cleartext':9A 'credenti':7A 'cve':10A,18A 'debug':2A 'f42p':15A 'ghsa':14A 'ghsa-f42p-wjw5-97qh':13A 'github':6A 'log':3A 'print':4A 'wjw5':16A 'zizmor':1A,21A","search_b":"'-532':24B '1.27.0':32B 'act':78B 'action':27B 'anyon':58B 'bug':68B 'ci':22B,71B 'cwe':23B 'debug':51B 'flag':48B 'gh':38B 'github':26B,35B,40B,43B,81B 'github-act':25B 'log':52B,55B,63B,72B 'match':47B 'packag':28B 'permiss':82B 'print':33B 'public':67B 'python':29B 'read':61B 'report':69B 'take':74B 'token':36B,39B,41B,44B,76B 'verbos':54B 'zizmor':30B,31B,42B","search_c":"'/users/shaan/.cache/zizmor':463C '/zizmorcore/zizmor/commit/919bea4635bae204d5186e5743cb263c70b518b4),':169C '/zizmorcore/zizmor/pull/2180).':176C '0':412C '1':410C '1.26.1':178C '1.27.0':85C,184C '2180':173C,246C '919bea46':166C 'accept':193C 'access':88C,241C,595C,617C 'action':221C,504C 'add':270C,307C 'affect':144C,190C,538C 'alias':326C 'also':260C 'anoth':557C 'api':200C,235C 'app':278C,283C,284C,312C,377C,378C 'app.network.gh':330C 'applic':137C,155C,239C 'arg':464C 'around':253C 'artifact':570C 'attack':576C 'audit':213C,356C,388C,426C,459C 'auditarg':389C 'authent':198C 'auto':424C,428C 'automat':507C 'avail':555C 'avoid':233C 'behavior':524C 'broader':612C 'bug':565C 'cach':461C 'captur':573C 'channel':561C 'ci':567C 'clear':341C 'cleartext':91C 'cli':263C,293C 'code':431C 'collect':383C,386C 'color':420C 'command':115C 'command-lin':114C 'comment':512C 'commit':165C,223C,306C 'compat':324C 'compens':531C 'complet':477C 'confid':400C 'config':472C,475C 'configur':138C 'consid':527C 'contain':335C 'control':532C 'correspond':113C 'credenti':195C,229C,508C,548C 'data':609C 'debug':94C,132C,272C,282C,309C,319C,346C,375C,542C 'debug-level':93C 'dedic':267C 'default':384C 'defens':499C 'depend':588C 'deriv':308C 'detail':159C 'diagnost':286C 'dir':462C 'direct':158C 'disclos':583C 'disclosur':560C 'downstream':535C 'earlier':180C 'effect':292C 'emit':322C,373C 'enabl':98C,147C,541C 'environ':102C 'even':529C 'event':320C,347C 'example.yml':371C,382C 'exist':533C 'exit':430C 'experi':252C 'explicit':300C,339C 'expos':86C,604C 'fals':387C,393C,404C,419C,432C,434C,438C,460C,469C,471C,476C,480C 'first':187C 'fix':390C 'format':415C 'fulli':276C 'gh':104C,119C,364C,439C,453C 'gh-token':118C 'gho':366C,443C 'github':87C,106C,109C,122C,126C,194C,199C,208C,228C,446C,450C,495C,547C 'github-token':121C 'github.com':168C,175C,456C 'github.com/zizmorcore/zizmor/commit/919bea4635bae204d5186e5743cb263c70b518b4),':167C 'github.com/zizmorcore/zizmor/pull/2180).':174C 'githubtoken':315C,442C 'globalarg':465C 'help':481C 'hostnam':454C 'howev':303C,513C 'ignor':403C 'impact':483C,487C,587C 'implement':310C 'implicit':256C 'improv':250C 'includ':129C,295C,500C,562C 'infer':302C 'inform':218C 'input':379C,381C 'inputarg':380C 'intend':248C 'introduc':163C 'issu':161C 'issue/pr/etc':511C 'layer':498C 'level':95C 'lifetim':597C 'limit':236C 'line':116C 'link':423C 'log':96C,145C,157C,273C,505C,518C,543C,568C,584C 'lsp':466C,468C 'lsparg':467C 'materi':520C 'may':215C,602C,619C 'mediat':493C 'merg':170C,328C 'metadata':226C 'min':396C,399C 'minim':599C 'mode':258C 'modif':625C 'modul':268C 'move':261C 'mre':368C,445C 'must':540C,553C 'nach':433C 'need':578C 'network':435C 'networkarg':313C,436C 'never':517C 'no-online-audit':353C 'none':391C,398C,401C,421C,448C,452C,473C,478C 'normal':349C 'oauth':613C 'offlin':257C,297C,340C,437C 'onlin':212C,350C,355C,458C 'oper':298C,351C 'option':117C 'organi':631C 'output':405C 'outputarg':406C 'packag':628C 'pars':136C,277C 'parti':558C 'pedant':392C 'perform':197C,211C 'permiss':579C 'permit':620C 'person':616C 'persona':394C 'phantom':413C 'phantomdata':414C 'plain':416C 'plausibl':559C 'poc':359C 'potenti':575C 'pr':172C,245C 'practic':485C 'privat':243C,622C 'private-repositori':621C 'progress':418C 'provid':240C 'public':564C,605C 'purpos':204C 'quiet':411C 'read':581C,607C 'read-on':606C 'redact':502C 'refer':222C 'regular':395C 'releas':191C 'remot':207C 'render':422C 'report':566C 'repositori':209C,225C,244C,594C,623C,627C 'represent':133C 'request':201C 'requir':216C 'resolv':217C 'result':333C,551C,586C 'retain':357C 'retriev':206C 'revoc':509C 'rust':156C,280C 'scope':593C,600C 'secret':501C 'sensit':519C 'sever':397C 'show':425C 'singl':150C 'standard':455C 'state':294C 'stderr':142C,334C,552C 'stdio':470C 'still':526C 'strict':385C 'string':316C 'summari':83C 'suppli':100C,545C 'system':536C 'termin':572C 'text':374C 'thank':479C 'token':89C,99C,105C,107C,110C,120C,123C,127C,325C,331C,337C,343C,365C,440C,447C,451C,591C,601C,614C,618C 'trace':281C 'type':264C 'unaffect':182C 'unauthent':234C 'understand':290C 'url':427C 'use':231C,288C,360C 'user':539C 'v':151C 'v1.27.0':363C 'valu':279C 'variabl':103C 'verbatim':338C 'verbos':152C,370C,407C,408C,409C 'version':177C,183C,482C 'via':101C 'vulner':490C,528C 'whether':296C 'workflow':629C 'written':140C 'zizmor':84C,108C,125C,192C,254C,361C,367C,369C,376C,444C,449C,514C 'zizmor-github-token':124C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-09T21:56:25+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-f42p-wjw5-97qh","url":"https://github.com/advisories/GHSA-f42p-wjw5-97qh","severity":"high","published_at":"2026-11-09T21:56:25+00:00","modified_at":"2026-11-09T21:56:26+00:00","first_seen_at":"2026-11-09T22:00:47+00:00","fetched_at":"2026-11-09T22:06:09+00:00","note":null}],"documents":[{"id":110185,"url":"https://api.github.com/repos/zizmorcore/zizmor/security-advisories/GHSA-f42p-wjw5-97qh","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":110186,"url":"https://github.com/zizmorcore/zizmor/security/advisories/GHSA-f42p-wjw5-97qh","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":110187,"url":"https://github.com/zizmorcore/zizmor/pull/2213","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110188,"url":"https://github.com/zizmorcore/zizmor/pull/2215","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110189,"url":"https://github.com/zizmorcore/zizmor/commit/0731e01706af273be860d3d221e4d122e6741b6f","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110190,"url":"https://github.com/zizmorcore/zizmor/commit/724d0e86f4c073c3dc64507fb6c39bc20e46a48f","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":110191,"url":"https://github.com/zizmorcore/zizmor/releases/tag/v1.28.0","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: 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"}