{"id":"CVE-2026-118668","kind":"vulnerability","aliases":["CVE-2026-118668","GHSA-4hm6-w6qq-w73v"],"related":[],"title":"LangGraph JavaScript custom authentication may permit cross-user Store access","description":"## Summary\n\nLangGraph deployments using JavaScript or TypeScript custom authentication may fail to apply Store authorization changes returned by an authorization handler. In affected deployments, an authenticated user may be able to access Store data outside their authorized namespace.\n\n## Required conditions\n\nA deployment is affected only when all of the following conditions apply:\n\n- It uses an affected `langgraph-api` version.\n- It runs JavaScript or TypeScript custom authentication.\n- Its Store authorization handler relies on rewriting the requested namespace to restrict each user to their own data.\n- The attacker can authenticate as an ordinary user.\n- Multiple users' data is stored through the affected authorization path.\n\nPython custom authentication handlers are not affected. JavaScript or TypeScript handlers that reject unauthorized namespace requests instead of rewriting them are also not affected.\n\nThe attack does not require administrator privileges, user interaction, a race condition, or the bypass of another mitigation.\n\n## Impact\n\nAn authenticated user may be able to read, overwrite, search, or delete Store data belonging to another user.\n\n## Patches\n\nThe issue is fixed in `langgraph-api` version `0.15.0`. The server now carries changes made by a JavaScript or TypeScript authorization handler across the runtime boundary and applies them before performing the Store operation. It validates the resulting namespace after authorization and rejects the request if an authorization change is malformed or cannot be applied safely.\n\nUsers should upgrade to `langgraph-api>=0.15.0`.\n\n## Workarounds\n\nDeployments that cannot upgrade immediately should change JavaScript or TypeScript Store authorization handlers to reject requests for unauthorized namespaces rather than relying on namespace rewriting.\n\nThis workaround must be applied to every Store action exposed by the deployment.","summary":"LangGraph deployments that use JavaScript or TypeScript custom authentication can drop Store authorization changes, so the namespace restriction is not applied. An authenticated ordinary user can then read, overwrite, search or delete another user's Store data.","severity":"high","cvss":8.6,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"langgraph-api","fixed":["0.15.0"],"affected":">= 0.1.2, < 0.15.0","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["ai-tooling","cwe-639","cwe-863","javascript","langgraph","langgraph-api","python","self-hosted","typescript"],"not_affected_if":["default-config","python-auth","rejects-unauthorized-namespaces","single-user-deployment"],"how_to_check":"- Check the installed version with `pip show langgraph-api`; affected versions are `>=0.1.2` and `<0.15.0`.\n- Look for a JavaScript or TypeScript custom auth handler whose Store authorization rewrites the requested namespace to the user's own namespace.\n- Confirm whether multiple users' data is stored through that path.","fix":"- Upgrade `langgraph-api` to `0.15.0` or later.\n- Until upgraded, change JavaScript or TypeScript Store authorization handlers to reject requests for unauthorized namespaces instead of rewriting them, and apply this to every Store action the deployment exposes.","status":"open","published_at":"2026-10-28T21:09:42+00:00","first_seen_at":"2026-10-28T21:12:44+00:00","triaged_at":"2026-10-28T21:13:46+00:00","updated_at":"2026-10-28T21:35:45+00:00","category":"ai-tooling","confidence":0.8,"triage":{"at":"2026-10-28T21:13:46Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade `langgraph-api` to `0.15.0` or later.\n- Until upgraded, change JavaScript or TypeScript Store authorization handlers to reject requests for unauthorized namespaces instead of rewriting them, and apply this to every Store action the deployment exposes.","reach":"internet","title":"LangGraph API: JavaScript auth handlers let users reach other users' Store data","impact":"high","summary":"LangGraph deployments that use JavaScript or TypeScript custom authentication can drop Store authorization changes, so the namespace restriction is not applied. An authenticated ordinary user can then read, overwrite, search or delete another user's Store data.","category":"ai-tooling","nicknames":[],"who_cares":["langgraph","langgraph-api","python","javascript","typescript","self-hosted"],"confidence":0.8,"needs_auth":"yes","worst_case":"Authenticated user reads or overwrites other users' Store data","analyst_note":"","how_to_check":"- Check the installed version with `pip show langgraph-api`; affected versions are `>=0.1.2` and `<0.15.0`.\n- Look for a JavaScript or TypeScript custom auth handler whose Store authorization rewrites the requested namespace to the user's own namespace.\n- Confirm whether multiple users' data is stored through that path.","needs_analyst":false,"not_affected_if":["python-auth","rejects-unauthorized-namespaces","single-user-deployment","default-config"],"who_is_affected":"Only deployments that run JavaScript or TypeScript custom authentication with a Store authorization handler that rewrites namespaces to isolate users, on an affected `langgraph-api` version, and that hold data for multiple users. Python custom auth handlers and JavaScript handlers that reject unauthorized namespaces are not affected.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000719,"input_tokens":3858,"output_tokens":666,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-118668':14A,22A '-2026':13A,21A '-639':30B '-863':32B '0.15.0':254C,309C '4hm6':17A 'abl':109C,231C 'access':11A,111C 'across':268C 'action':344C 'administr':212C 'affect':102C,123C,135C,180C,189C,206C 'ai':27B 'ai-tool':26B 'also':204C 'anoth':75B,223C,242C 'api':25A,37B,138C,252C,308C 'appli':63B,92C,131C,273C,300C,340C 'attack':166C,208C 'authent':4A,51B,65B,88C,105C,146C,168C,185C,227C 'author':55B,94C,99C,116C,149C,181C,266C,286C,293C,322C 'belong':240C 'boundari':271C 'bypass':221C 'cannot':298C,313C 'carri':258C 'chang':56B,95C,259C,294C,317C 'condit':119C,130C,218C 'cross':8A 'cross-us':7A 'custom':3A,50B,87C,145C,184C 'cve':12A,20A 'cwe':29B,31B 'data':79B,113C,164C,175C,239C 'delet':74B,237C 'deploy':44B,82C,103C,121C,311C,348C 'drop':53B 'everi':342C 'expos':345C 'fail':90C 'fix':248C 'follow':129C 'ghsa':16A 'ghsa-4hm6-w6qq-w73v':15A 'handler':100C,150C,186C,193C,267C,323C 'host':41B 'immedi':315C 'impact':225C 'instead':199C 'interact':215C 'issu':246C 'javascript':2A,33B,47B,84C,142C,190C,263C,318C 'langgraph':1A,24A,34B,36B,43B,81C,137C,251C,307C 'langgraph-api':23A,35B,136C,250C,306C 'made':260C 'malform':296C 'may':5A,89C,107C,229C 'mitig':224C 'multipl':173C 'must':338C 'namespac':59B,117C,156C,197C,284C,329C,334C 'oper':279C 'ordinari':66B,171C 'outsid':114C 'overwrit':71B,234C 'patch':244C 'path':182C 'perform':276C 'permit':6A 'privileg':213C 'python':38B,183C 'race':217C 'rather':330C 'read':70B,233C 'reject':195C,288C,325C 'reli':151C,332C 'request':155C,198C,290C,326C 'requir':118C,211C 'restrict':60B,158C 'result':283C 'return':96C 'rewrit':153C,201C,335C 'run':141C 'runtim':270C 'safe':301C 'search':72B,235C 'self':40B 'self-host':39B 'server':256C 'store':10A,54B,78B,93C,112C,148C,177C,238C,278C,321C,343C 'summari':80C 'tool':28B 'typescript':42B,49B,86C,144C,192C,265C,320C 'unauthor':196C,328C 'upgrad':304C,314C 'use':46B,83C,133C 'user':9A,67B,76B,106C,160C,172C,174C,214C,228C,243C,302C 'valid':281C 'version':139C,253C 'w6qq':18A 'w73v':19A 'workaround':310C,337C","nicknames":[],"mitigations":[],"who_affected":"Only deployments that run JavaScript or TypeScript custom authentication with a Store authorization handler that rewrites namespaces to isolate users, on an affected `langgraph-api` version, and that hold data for multiple users. Python custom auth handlers and JavaScript handlers that reject unauthorized namespaces are not affected.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T21:09:42+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/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":"ghsa","external_id":"GHSA-4hm6-w6qq-w73v","url":"https://github.com/advisories/GHSA-4hm6-w6qq-w73v","severity":"high","published_at":"2026-10-28T21:09:42+00:00","modified_at":"2026-10-28T21:09:43+00:00","first_seen_at":"2026-10-28T21:12:44+00:00","fetched_at":"2026-10-28T21:12:44+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-118668","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-118668","severity":null,"published_at":"2026-10-28T21:16:57+00:00","modified_at":"2026-10-28T21:16:57+00:00","first_seen_at":"2026-10-28T21:35:45+00:00","fetched_at":"2026-10-28T21:35:45+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"}