{"id":"CVE-2026-123084","kind":"vulnerability","aliases":["CVE-2026-123084"],"related":[],"title":"Pulpcore: header content guard filter lets attackers read process environment","description":"An **expression language injection** has been found in the HeaderContentGuard.permit function in publication.py of the content guard in the **Pulpcore** package. The guard is supposed to check a value in a request header. It saves a jq filter and runs that filter against the header when a client asks for content. The filter is not limited to the header, and jq's env builtin also returns the environment of the content process. A low-privileged network attacker or user who can create a header content guard and attach it to a distribution can save a filter that reads that environment. The content request is allowed or denied according to the filter result. Repeating the request lets that attacker or user recover the environment, including Pulp settings held there, such as the Django secret key or the database password.","summary":"The header content guard in Pulpcore saves a jq filter that runs against request headers, and jq's env builtin exposes the server's environment. An attacker who can create a header content guard can read Pulp secrets such as the Django secret key or database password from that environment by repeating requests.","severity":"medium","cvss":6.5,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["package","pulpcore","python","self-hosted"],"not_affected_if":["auth-required","default-config"],"how_to_check":"- Check the installed pulpcore version with `pip show pulpcore`\n- Look for existing header content guards on distributions in the Pulp admin API or database","fix":null,"status":"open","published_at":"2026-11-10T23:17:19+00:00","first_seen_at":"2026-11-10T23:27:36+00:00","triaged_at":"2026-11-10T23:28:46+00:00","updated_at":"2026-11-10T23:28:46+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-10T23:28:46Z","model":"claude-haiku-5-5","output":{"fix":"unknown","reach":"network","title":"Pulpcore: header content guard filter lets attackers read process environment","impact":"high","summary":"The header content guard in Pulpcore saves a jq filter that runs against request headers, and jq's env builtin exposes the server's environment. An attacker who can create a header content guard can read Pulp secrets such as the Django secret key or database password from that environment by repeating requests.","audience":"businesses","category":"package","nicknames":[],"who_cares":["pulpcore","python","self-hosted"],"confidence":0.7,"fix_status":"unknown","needs_auth":"yes","worst_case":"secrets in process environment readable, including Django secret key and database password","analyst_note":"Confirm the fixed Pulpcore version and whether a patch exists; the sources given do not state a fix.","how_to_check":"- Check the installed pulpcore version with `pip show pulpcore`\n- Look for existing header content guards on distributions in the Pulp admin API or database\n- unknown","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["auth-required","default-config"],"who_is_affected":"Pulpcore installations where a low-privileged user can create a header content guard and attach it to a distribution. The exposure comes from the jq filter running with access to the content process environment. Installations where only trusted administrators manage content guards carry much less risk.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000727,"input_tokens":4669,"output_tokens":520,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-123084':13A,16A '-2026':12A,15A 'accord':184C 'allow':181C 'also':140C 'ask':124C 'attach':164C 'attack':7A,49B,153C,194C 'builtin':42B,139C 'check':102C 'client':123C 'content':3A,25B,55B,91C,126C,146C,161C,178C 'creat':52B,158C 'cve':11A,14A 'databas':68B,213C 'deni':183C 'distribut':168C 'django':64B,208C 'env':41B,138C 'environ':10A,47B,72B,143C,176C,199C 'expos':43B 'express':77C 'filter':5A,32B,113C,117C,128C,172C,187C 'found':82C 'function':86C 'guard':4A,26B,56B,92C,98C,162C 'header':2A,24B,37B,54B,108C,120C,134C,160C 'headercontentguard.permit':85C 'held':203C 'host':22B 'includ':200C 'inject':79C 'jq':31B,39B,112C,136C 'key':66B,210C 'languag':78C 'let':6A,192C 'limit':131C 'low':150C 'low-privileg':149C 'network':152C 'packag':17B,96C 'password':69B,214C 'privileg':151C 'process':9A,147C 'publication.py':88C 'pulp':59B,201C 'pulpcor':1A,18B,28B,95C 'python':19B 'read':8A,58B,174C 'recov':197C 'repeat':74B,189C 'request':36B,75B,107C,179C,191C 'result':188C 'return':141C 'run':34B,115C 'save':29B,110C,170C 'secret':60B,65B,209C 'self':21B 'self-host':20B 'server':45B 'set':202C 'suppos':100C 'user':155C,196C 'valu':104C","nicknames":[],"mitigations":[],"who_affected":"Pulpcore installations where a low-privileged user can create a header content guard and attach it to a distribution. The exposure comes from the jq filter running with access to the content process environment. Installations where only trusted administrators manage content guards carry much less risk.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"none","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["medium","package","pulpcore","python","selfhosted"],"campaign_type":null,"search_a":"'-123084':13A,16A '-2026':12A,15A 'attack':7A 'content':3A 'cve':11A,14A 'environ':10A 'filter':5A 'guard':4A 'header':2A 'let':6A 'process':9A 'pulpcor':1A 'read':8A","search_b":"'attack':49B 'builtin':42B 'content':25B,55B 'creat':52B 'databas':68B 'django':64B 'env':41B 'environ':47B,72B 'expos':43B 'filter':32B 'guard':26B,56B 'header':24B,37B,54B 'host':22B 'jq':31B,39B 'key':66B 'packag':17B 'password':69B 'pulp':59B 'pulpcor':18B,28B 'python':19B 'read':58B 'repeat':74B 'request':36B,75B 'run':34B 'save':29B 'secret':60B,65B 'self':21B 'self-host':20B 'server':45B","search_c":"'accord':184C 'allow':181C 'also':140C 'ask':124C 'attach':164C 'attack':153C,194C 'builtin':139C 'check':102C 'client':123C 'content':91C,126C,146C,161C,178C 'creat':158C 'databas':213C 'deni':183C 'distribut':168C 'django':208C 'env':138C 'environ':143C,176C,199C 'express':77C 'filter':113C,117C,128C,172C,187C 'found':82C 'function':86C 'guard':92C,98C,162C 'header':108C,120C,134C,160C 'headercontentguard.permit':85C 'held':203C 'includ':200C 'inject':79C 'jq':112C,136C 'key':210C 'languag':78C 'let':192C 'limit':131C 'low':150C 'low-privileg':149C 'network':152C 'packag':96C 'password':214C 'privileg':151C 'process':147C 'publication.py':88C 'pulp':201C 'pulpcor':95C 'read':174C 'recov':197C 'repeat':189C 'request':107C,179C,191C 'result':188C 'return':141C 'run':115C 'save':110C,170C 'secret':209C 'set':202C 'suppos':100C 'user':155C,196C 'valu':104C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-10T23:17:19+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","cvss_by":"secalert@redhat.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-123084","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123084","severity":null,"published_at":"2026-11-10T23:17:19+00:00","modified_at":"2026-11-10T23:17:20+00:00","first_seen_at":"2026-11-10T23:27:36+00:00","fetched_at":"2026-11-10T23:27:36+00:00","note":null}],"documents":[],"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"}