{"id":"CVE-2026-88982","kind":"vulnerability","aliases":["CVE-2026-88982"],"related":[],"title":"Kubeflow Pipelines: cache lets one tenant read or poison another's outputs","description":"Kubeflow Pipelines enables users to build and deploy portable, scalable machine learning workflows. Prior to 2.18.0, the legacy V1/raw-Argo execution cache mutating webhook and cache-server storage path hash selected template fields without the Kubernetes namespace, use the key alone for lookups and duplicate checks, and trust the mutable pipelines.kubeflow.org/execution_cache_key annotation when publishing outputs. In multi-user deployments where tenant namespaces share the cache service, a tenant with workload-submission privileges can read another namespace's cached outputs or seed matching outputs that are substituted into a later step. Standard KFP V2 component pods bypass this cache, matching requires the selected template fields and staleness policy, and arbitrary code execution or service availability impact is not established. This issue is fixed in version 2.18.0.","summary":"In multi-user Kubeflow Pipelines deployments, the legacy V1 execution cache keys lookups without the namespace and trusts a mutable annotation. A tenant who can submit workloads can read another namespace's cached outputs or seed outputs that get substituted into a later pipeline step.","severity":"medium","cvss":5.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["ai-tooling","kubeflow-pipelines","kubernetes","machine-learning","multi-tenant"],"not_affected_if":["default-config","kfp-v2-only","single-tenant"],"how_to_check":"- Check the installed Kubeflow Pipelines version against `2.18.0`\n- Confirm whether you run multi-user deployments where tenant namespaces share the cache service\n- Check whether pipelines use the legacy V1/raw-Argo execution path rather than KFP V2 components","fix":"- Kubeflow Pipelines: move to `2.18.0`","status":"open","published_at":"2026-11-05T23:17:01+00:00","first_seen_at":"2026-11-05T23:48:40+00:00","triaged_at":"2026-11-05T23:49:49+00:00","updated_at":"2026-11-05T23:49:49+00:00","category":"ai-tooling","confidence":0.8,"triage":{"at":"2026-11-05T23:49:49Z","model":"claude-haiku-5-5","output":{"fix":"- Kubeflow Pipelines: move to `2.18.0`","reach":"network","title":"Kubeflow Pipelines: cache lets one tenant read or poison another's outputs","impact":"medium","summary":"In multi-user Kubeflow Pipelines deployments, the legacy V1 execution cache keys lookups without the namespace and trusts a mutable annotation. A tenant who can submit workloads can read another namespace's cached outputs or seed outputs that get substituted into a later pipeline step.","audience":"businesses","category":"ai-tooling","nicknames":[],"who_cares":["kubeflow-pipelines","kubernetes","multi-tenant","machine-learning"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Tenant reads other namespace's cached outputs or injects substituted outputs","analyst_note":"","how_to_check":"- Check the installed Kubeflow Pipelines version against `2.18.0`\n- Confirm whether you run multi-user deployments where tenant namespaces share the cache service\n- Check whether pipelines use the legacy V1/raw-Argo execution path rather than KFP V2 components","plain_action":"","needs_analyst":false,"not_affected_if":["single-tenant","kfp-v2-only","default-config"],"who_is_affected":"Exposure needs a multi-user Kubeflow Pipelines deployment where tenant namespaces share the execution cache service, and a tenant with workload-submission rights. Standard KFP V2 component pods bypass this cache, so single-tenant installs and V2-only pipelines are unlikely to be affected. Teams running only V2 components can deprioritize it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000754,"input_tokens":4447,"output_tokens":619,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':14A,17A '-88982':15A,18A '/execution_cache_key':130C '2.18.0':93C,206C 'ai':20B 'ai-tool':19B 'alon':118C 'annot':53B,131C 'anoth':10A,62B,156C 'arbitrari':190C 'avail':195C 'build':83C 'bypass':177C 'cach':3A,43B,65B,98C,103C,145C,159C,179C 'cache-serv':102C 'check':123C 'code':191C 'compon':175C 'cve':13A,16A 'deploy':38B,85C,139C 'duplic':122C 'enabl':80C 'establish':199C 'execut':42B,97C,192C 'field':110C,185C 'fix':203C 'get':71B 'hash':107C 'impact':196C 'issu':201C 'key':44B,117C 'kfp':173C 'kubeflow':1A,23B,36B,78C 'kubeflow-pipelin':22B 'kubernet':25B,113C 'later':75B,170C 'learn':28B,89C 'legaci':40B,95C 'let':4A 'lookup':45B,120C 'machin':27B,88C 'machine-learn':26B 'match':163C,180C 'multi':30B,34B,137C 'multi-ten':29B 'multi-us':33B,136C 'mutabl':52B,127C 'mutat':99C 'namespac':48B,63B,114C,142C,157C 'one':5A 'output':12A,66B,69B,134C,160C,164C 'path':106C 'pipelin':2A,24B,37B,76B,79C 'pipelines.kubeflow.org':129C 'pipelines.kubeflow.org/execution_cache_key':128C 'pod':176C 'poison':9A 'polici':188C 'portabl':86C 'prior':91C 'privileg':153C 'publish':133C 'read':7A,61B,155C 'requir':181C 'scalabl':87C 'seed':68B,162C 'select':108C,183C 'server':104C 'servic':146C,194C 'share':143C 'stale':187C 'standard':172C 'step':77B,171C 'storag':105C 'submiss':152C 'submit':58B 'substitut':72B,167C 'templat':109C,184C 'tenant':6A,31B,55B,141C,148C 'tool':21B 'trust':50B,125C 'use':115C 'user':35B,81C,138C 'v1':41B 'v1/raw-argo':96C 'v2':174C 'version':205C 'webhook':100C 'without':46B,111C 'workflow':90C 'workload':59B,151C 'workload-submiss':150C","nicknames":[],"mitigations":[],"who_affected":"Exposure needs a multi-user Kubeflow Pipelines deployment where tenant namespaces share the execution cache service, and a tenant with workload-submission rights. Standard KFP V2 component pods bypass this cache, so single-tenant installs and V2-only pipelines are unlikely to be affected. Teams running only V2 components can deprioritize it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["aitooling","kubeflowpipelines","kubernetes","machinelearning","medium","multitenant"],"campaign_type":null,"first_public_at":"2026-10-28T04:20:33+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-88982","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-88982","severity":null,"published_at":"2026-11-05T23:17:01+00:00","modified_at":"2026-11-05T23:17:01+00:00","first_seen_at":"2026-11-05T23:48:40+00:00","fetched_at":"2026-11-05T23:48:40+00:00","note":null}],"documents":[{"id":81497,"url":"https://github.com/kubeflow/pipelines/commit/620d0cc89ae0d042a484a003f8ffe6e9a55d347e","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":26806,"url":"https://github.com/kubeflow/pipelines/releases/tag/2.18.0","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":81499,"url":"https://github.com/kubeflow/pipelines/security/advisories/GHSA-2xwh-426q-42c5","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-28T04:20:33+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}