{"id":"CVE-2026-45321","kind":"vulnerability","aliases":["CVE-2026-45321"],"related":[],"title":"On 2026-05-11, between approximately 19:20 and 19:26 UTC, 84 malicious versions across 42 @tanstack/* packages were…","description":"On 2026-05-11, between approximately 19:20 and 19:26 UTC, 84 malicious versions across 42 @tanstack/* packages were published to the npm registry. The publishes were authenticated via the legitimate GitHub Actions OIDC trusted-publisher binding for TanStack/router, but the publish workflow itself was not modified. The attacker chained three known vulnerability classes — a pull_request_target \"Pwn Request\" misconfiguration, GitHub Actions cache poisoning across the fork↔base trust boundary, and runtime memory extraction of the OIDC token from the Actions runner process — to publish credential-stealing malware under a trusted identity. Each affected package received exactly two malicious versions, published a few minutes apart.","summary":"TanStack packages were compromised so that malicious versions were published to the npm registry under a trusted identity. Installing those versions lets an attacker steal credentials from the machine or CI system that runs them.","severity":"critical","cvss":9.6,"epss":null,"exploited":true,"exploited_at":"2026-05-27T00:00:00+00:00","products":[{"name":"TanStack TanStack","fixed":[],"affected":"","ecosystem":"vendor"},{"name":"tanstack tanstack\\/arktype-adapter","fixed":[],"affected":"= 1.166.12","ecosystem":"vendor"},{"name":"tanstack tanstack\\/arktype-adapter","fixed":[],"affected":"= 1.166.15","ecosystem":"vendor"},{"name":"tanstack tanstack\\/eslint-plugin-router","fixed":[],"affected":"= 1.161.9","ecosystem":"vendor"},{"name":"tanstack tanstack\\/eslint-plugin-router","fixed":[],"affected":"= 1.161.12","ecosystem":"vendor"},{"name":"tanstack tanstack\\/eslint-plugin-start","fixed":[],"affected":"= 0.0.4","ecosystem":"vendor"},{"name":"tanstack tanstack\\/eslint-plugin-start","fixed":[],"affected":"= 0.0.7","ecosystem":"vendor"},{"name":"tanstack tanstack\\/history","fixed":[],"affected":"= 1.161.9","ecosystem":"vendor"},{"name":"tanstack tanstack\\/history","fixed":[],"affected":"= 1.161.12","ecosystem":"vendor"},{"name":"tanstack tanstack\\/nitro-v2-vite-plugin","fixed":[],"affected":"= 1.154.12","ecosystem":"vendor"},{"name":"tanstack tanstack\\/nitro-v2-vite-plugin","fixed":[],"affected":"= 1.154.15","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router","fixed":[],"affected":"= 1.169.5","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router","fixed":[],"affected":"= 1.169.8","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router-devtools","fixed":[],"affected":"= 1.166.16","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router-devtools","fixed":[],"affected":"= 1.166.19","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router-ssr-query","fixed":[],"affected":"= 1.166.15","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-router-ssr-query","fixed":[],"affected":"= 1.166.18","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start","fixed":[],"affected":"= 1.167.68","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start","fixed":[],"affected":"= 1.167.71","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-client","fixed":[],"affected":"= 1.166.51","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-client","fixed":[],"affected":"= 1.166.54","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-rsc","fixed":[],"affected":"= 0.0.47","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-rsc","fixed":[],"affected":"= 0.0.50","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-server","fixed":[],"affected":"= 1.166.55","ecosystem":"vendor"},{"name":"tanstack tanstack\\/react-start-server","fixed":[],"affected":"= 1.166.58","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-cli","fixed":[],"affected":"= 1.166.46","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-cli","fixed":[],"affected":"= 1.166.49","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-core","fixed":[],"affected":"= 1.169.5","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-core","fixed":[],"affected":"= 1.169.8","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-devtools","fixed":[],"affected":"= 1.166.16","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-devtools","fixed":[],"affected":"= 1.166.19","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-devtools-core","fixed":[],"affected":"= 1.167.6","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-devtools-core","fixed":[],"affected":"= 1.167.9","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-generator","fixed":[],"affected":"= 1.166.45","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-generator","fixed":[],"affected":"= 1.166.48","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-plugin","fixed":[],"affected":"= 1.167.38","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-plugin","fixed":[],"affected":"= 1.167.41","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-ssr-query-core","fixed":[],"affected":"= 1.168.3","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-ssr-query-core","fixed":[],"affected":"= 1.168.6","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-utils","fixed":[],"affected":"= 1.161.11","ecosystem":"vendor"},{"name":"tanstack tanstack\\/router-utils","fixed":[],"affected":"= 1.161.14","ecosystem":"vendor"}],"ecosystems":["vendor"],"tags":["ci-cd","exploited","javascript","npm","package","ransomware","tanstack"],"not_affected_if":["no-tanstack-dependency","pinned-clean-versions"],"how_to_check":"Run npm ls to list installed TanStack packages and compare versions against the advisory list of malicious releases (source not specified in the sources).\nCheck lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for TanStack packages installed since the compromise date.","fix":"Remove or pin away from the affected TanStack versions and reinstall from a known-good version, then rotate any credentials available to builds or machines that installed them.\nCISA directs following vendor mitigation instructions, or discontinuing use if mitigations are unavailable.","status":"open","published_at":"2026-05-12T01:16:46+00:00","first_seen_at":"2026-10-23T19:11:51+00:00","triaged_at":"2026-10-23T20:34:03+00:00","updated_at":"2026-10-23T23:44:51+00:00","category":"package","confidence":0.5,"triage":{"at":"2026-10-23T20:34:03Z","model":"claude-haiku-5-5","output":{"fix":"Remove or pin away from the affected TanStack versions and reinstall from a known-good version, then rotate any credentials available to builds or machines that installed them.\nCISA directs following vendor mitigation instructions, or discontinuing use if mitigations are unavailable.","summary":"TanStack packages were compromised so that malicious versions were published to the npm registry under a trusted identity. Installing those versions lets an attacker steal credentials from the machine or CI system that runs them.","category":"package","who_cares":["npm","javascript","tanstack","ci-cd"],"confidence":0.5,"analyst_note":"Sources give no affected version range or fixed version; find the TanStack advisory and the list of malicious package versions (see CISA KEV entry for CVE-2026-45321).","how_to_check":"Run npm ls to list installed TanStack packages and compare versions against the advisory list of malicious releases (source not specified in the sources).\nCheck lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for TanStack packages installed since the compromise date.\nunknown","needs_analyst":true,"not_affected_if":["no-tanstack-dependency","pinned-clean-versions"],"severity_if_unknown":"critical"},"cost_usd":0.000421,"input_tokens":2063,"output_tokens":430,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-05':3A,193C '-11':4A,194C '-2026':21A,24A '-45321':22A,25A '/arktype-adapter':30A,33A '/eslint-plugin-router':36A,39A '/eslint-plugin-start':42A,45A '/history':48A,51A '/nitro-v2-vite-plugin':54A,57A '/react-router':60A,63A '/react-router-devtools':66A,69A '/react-router-ssr-query':72A,75A '/react-start':78A,81A '/react-start-client':84A,87A '/react-start-rsc':90A,93A '/react-start-server':96A,99A '/router-cli':102A,105A '/router-core':108A,111A '/router-devtools':114A,117A '/router-devtools-core':120A,123A '/router-generator':126A,129A '/router-plugin':132A,135A '/router-ssr-query-core':138A,141A '/router-utils':144A,147A '19':7A,10A,197C,200C '20':8A,198C '2026':2A,192C '26':11A,201C '42':17A,207C '84':13A,203C 'across':16A,206C,258C 'action':224C,255C,274C 'affect':288C 'apart':299C 'approxim':6A,196C 'attack':180B,241C 'authent':219C 'base':261C 'bind':229C 'boundari':263C 'cach':256C 'cd':150B 'chain':242C 'ci':149B,187B 'ci-cd':148B 'class':246C 'compromis':160B 'credenti':182B,280C 'credential-st':279C 'cve':20A,23A 'exact':291C 'exploit':151B 'extract':267C 'fork':260C 'github':223C,254C 'ident':174B,286C 'instal':175B 'javascript':152B 'known':244C 'legitim':222C 'let':178B 'machin':185B 'malici':14A,163B,204C,293C 'malwar':282C 'memori':266C 'minut':298C 'misconfigur':253C 'modifi':239C 'npm':153B,169B,214C 'oidc':225C,270C 'packag':19A,154B,158B,209C,289C 'poison':257C 'process':276C 'publish':166B,211C,217C,228C,234C,278C,295C 'pull':248C 'pwn':251C 'ransomwar':155B 'receiv':290C 'registri':170B,215C 'request':249C,252C 'run':190B 'runner':275C 'runtim':265C 'steal':181B,281C 'system':188B 'tanstack':18A,26A,27A,28A,29A,31A,32A,34A,35A,37A,38A,40A,41A,43A,44A,46A,47A,49A,50A,52A,53A,55A,56A,58A,59A,61A,62A,64A,65A,67A,68A,70A,71A,73A,74A,76A,77A,79A,80A,82A,83A,85A,86A,88A,89A,91A,92A,94A,95A,97A,98A,100A,101A,103A,104A,106A,107A,109A,110A,112A,113A,115A,116A,118A,119A,121A,122A,124A,125A,127A,128A,130A,131A,133A,134A,136A,137A,139A,140A,142A,143A,145A,146A,156B,157B,208C 'tanstack/router':231C 'target':250C 'three':243C 'token':271C 'trust':173B,227C,262C,285C 'trusted-publish':226C 'two':292C 'utc':12A,202C 'version':15A,164B,177B,205C,294C 'via':220C 'vulner':245C 'workflow':235C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-05-12T01:16:46+00:00","kev":{"dateAdded":"2026-05-27","dueDate":"2026-06-10","requiredAction":"Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.","knownRansomwareCampaignUse":"Known"},"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"kev","external_id":"CVE-2026-45321","url":"https://www.cisa.gov/known-exploited-vulnerabilities-catalog?search_api_fulltext=CVE-2026-45321","severity":null,"published_at":"2026-05-27T00:00:00+00:00","modified_at":null,"first_seen_at":"2026-10-23T19:11:51+00:00","fetched_at":"2026-10-25T10:39:04+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-45321","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-45321","severity":null,"published_at":"2026-05-12T01:16:46+00:00","modified_at":"2026-06-17T10:51:54+00:00","first_seen_at":"2026-10-23T23:44:51+00:00","fetched_at":"2026-10-23T23:44:51+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}