{"id":1827,"date":"2026-07-16T15:19:42","date_gmt":"2026-07-16T15:19:42","guid":{"rendered":"https:\/\/thedigitalfortress.us\/?p=1827"},"modified":"2026-07-16T15:19:42","modified_gmt":"2026-07-16T15:19:42","slug":"n8n-token-exchange-flaw-could-let-attackers-log-in-as-users-from-another-issuer","status":"publish","type":"post","link":"https:\/\/thedigitalfortress.us\/?p=1827","title":{"rendered":"n8n Token Exchange Flaw Could Let Attackers Log In as Users From Another Issuer"},"content":{"rendered":"<div>\n<p><span class=\"p-author\"><i class=\"icon-font icon-user\">\ue804<\/i><span class=\"author\">Swati Khandelwal<\/span><i class=\"icon-font icon-calendar\">\ue802<\/i><span class=\"author\">Jul 16, 2026<\/span><\/span><span class=\"p-tags\">Vulnerability \/ Web Security<\/span><\/p>\n<\/div>\n<div id=\"articlebody\">\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj1Pvezsft8WXzYy1Lw3zKDZrkf0TNZfj95rzTnuQgzbJuztRDNDFK35ahO9UfhNJOicjjuzyZGFCtC_idBl8vgNdw4kzfeYFo6LwUur66S5qUTO2Bl3WVLwCDWoDTnw4dlZdj_ZQ1T2JcG1dWfJeoO3WDZs94EVm9z0hZ8VPL36KDpaAmw7fH9hSWSSaw\/s1700-e365\/n8n-main.jpg\" style=\"display: block;  text-align: center; clear: left; float: left;\"><\/a><\/div>\n<p>n8n, the workflow automation platform, handed out the wrong accounts at login. On Enterprise instances configured to trust more than one external token issuer, it matched an incoming JWT to a local user on the <code>sub<\/code> claim alone and ignored <code>iss<\/code>.<\/p>\n<p>A valid token from issuer A carrying a <code>sub<\/code> that belongs to someone under issuer B logged you in as them. Their password never came into it. n8n shipped the fix on June 24.<\/p>\n<p>The flaw is tracked as <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-59208\" target=\"_blank\"><code>CVE-2026-59208<\/code><\/a>. The CVE record did not go public until July 9. n8n <a href=\"https:\/\/github.com\/n8n-io\/n8n\/security\/advisories\/GHSA-mq3m-f8x3-579w\" target=\"_blank\">credits the report<\/a> to the GitHub account <a href=\"https:\/\/github.com\/bearsyankees\" target=\"_blank\">bearsyankees<\/a>, whose profile lists Strix, which makes an AI penetration testing agent.<\/p>\n<p>Strix <a href=\"https:\/\/www.strix.ai\/blog\/n8n-cross-issuer-account-takeover\" target=\"_blank\">says<\/a> it pointed out that the agent at the token-exchange flow and found the identity-binding bug there.<\/p>\n<h2>Two issuers, one account<\/h2>\n<p>Token exchange is n8n&#8217;s Enterprise route for <a href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/deploy-as-an-oem-integration\" target=\"_blank\">OEM partners who embed the product<\/a>, an <a href=\"https:\/\/docs.n8n.io\/release-notes\" target=\"_blank\">RFC 8693 implementation<\/a> that spares their users a second login screen.<\/p>\n<p>The partner signs a short-lived JWT with its own key, n8n verifies it against a configured public key, matches the claims to a local account, and the user is in. Trusted keys go in <code>N8N_TOKEN_EXCHANGE_TRUSTED_KEYS<\/code>, and the <a href=\"https:\/\/docs.n8n.io\/deploy\/host-n8n\/configure-n8n\/basic-configuration\/use-environment-variables\/deployment\" target=\"_blank\">deployment docs<\/a> still tag the feature as preview.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/ai-vuln-protection-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjQl2axNwsfhbXOFynrg_uAZsvHi3OvNGSA8KJO-BKR8Xm3x7yjKV3EvfY4v5mwXx6LF0uWFb9h9d9iAV_Pi-YYhqimX9wx4OaLdDJEdR215Xrxq_PAtXkaLfQso4pTSjbj6fvh_ZTliLpzWZSZfcoZgyXtKwhN-SSDDlmbtUqGLshc0KqYQGWYHMN52Sl1\/s728-e100\/zz-d.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>The token itself checks out. The matching is the bug. A <code>sub<\/code> value is only guaranteed to be unique inside the issuer that minted it. <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc7519.html\" target=\"_blank\">RFC 7519<\/a> asks that it be \u00abscoped to be locally unique in the context of the issuer\u00bb or else globally unique. The identifier for a user is therefore the pair, <code>iss<\/code> plus <code>sub<\/code>.<\/p>\n<p><a name=\"more\"\/><\/p>\n<p>n8n keyed on half of it. Nothing stops two issuers from emitting the same subject string, and when they do, both land on one n8n account.<\/p>\n<h2>How big a deal is this<\/h2>\n<p>The flaw reaches an instance only if token exchange is switched on and the config trusts at least two external issuers. <a href=\"https:\/\/github.com\/n8n-io\/n8n\/security\/advisories\/GHSA-mq3m-f8x3-579w\" target=\"_blank\">n8n says<\/a> nothing else is affected. Token exchange is Enterprise-only and still flagged as a preview, so the exposed set is small and specific: OEM deployments, where trusting a second issuer is a supported configuration.<\/p>\n<p>What the advisory does not pin down is how an attacker gets the token. It says only that they can obtain one. The practical question is whether an ordinary user at a trusted issuer can influence the <code>sub<\/code> they receive. The public record does not answer it. GitHub&#8217;s CVSS 4.0 vector marks attack requirements as present and stops there.<\/p>\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEg5_A0dukdP3uSsRE-4hAiRENYYs2QhsO2JXXFdgoU0KOFApL9CBqhjYFmJ0_PVBC7xBoUl6qm98VXYB7mH6r4UJUU2H3I4wS3Y8Tr7kPgka2Cj5jvJqQtpFqU8gTYXor0bC4_evYFTNz_YthZ4Go7xsOs_9wBASZ5o2Gtb9x83E53B2j5HPGvIYdUWBt0\/s1700-e365\/n8n.jpg\" style=\"display: block;  text-align: center; clear: left; float: left;\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEg5_A0dukdP3uSsRE-4hAiRENYYs2QhsO2JXXFdgoU0KOFApL9CBqhjYFmJ0_PVBC7xBoUl6qm98VXYB7mH6r4UJUU2H3I4wS3Y8Tr7kPgka2Cj5jvJqQtpFqU8gTYXor0bC4_evYFTNz_YthZ4Go7xsOs_9wBASZ5o2Gtb9x83E53B2j5HPGvIYdUWBt0\/s1700-e365\/n8n.jpg\" alt=\"\" border=\"0\" data-original-height=\"723\" data-original-width=\"1067\"\/><\/a><\/div>\n<p>GitHub assigned that vector. As the CNA here, it puts <code>CVE-2026-59208<\/code> at 7.6 on CVSS 4.0, high. NVD puts the same bug at 6.8 on CVSS 3.1, medium, and has not issued a 4.0 assessment at all; its record carries <code>CWE-287<\/code> and <code>CWE-346<\/code>. CISA&#8217;s July 13 SSVC assessment records exploitation as none, and The Hacker News found no public proof-of-concept in searches on July 16.<\/p>\n<p>Two weeks before the June 24 fix, the maintainers patched <a href=\"https:\/\/github.com\/n8n-io\/n8n\/security\/advisories\/GHSA-2j5h-858j-5mpf\" target=\"_blank\"><code>CVE-2026-54305<\/code><\/a>, another Enterprise-only flaw. It lets any authenticated user overwrite or revoke another user&#8217;s stored OAuth tokens through the Dynamic Credentials endpoints. That one was a missing ownership check, not an identity binding. Different bug, same surface.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/sygnia-cyber-response-d-1\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiBxLQDy7VdLze43eMmpRllTXaPKPfB_veNUxQlqIu3-68GBJtegkhDGCqtaiSymOQviROdxln1FSd4zdMp5Jv9jeF1xQxLPc9uo9H7zW2nWHNax0wT0Y8JRj-zyUfbaCLqhxSfQT2sCfhWMBPL6UVgsh5RYVNVxwus_mW_BY9Ptwz3z7iF0_LWOnte-gqg\/s1600\/sy-d-1.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>The Hacker News has reached out to n8n for confirmation on the scope and impact of <code>CVE-2026-59208<\/code> and will update this story with any response.<\/p>\n<h2>Patch or cut the issuer list<\/h2>\n<p><code>CVE-2026-59208<\/code> affects every n8n release below 2.27.4 and version 2.28.0. The fix first landed in 2.27.4 and 2.28.1. Those are the floor. On July 16, n8n&#8217;s npm package carried 2.30.6 on both its <code>latest<\/code> and <code>stable<\/code> tags. It ships a new minor most weeks by its own account, so check the tag and take the newest stable build your deployment supports.<\/p>\n<p>If patching has to wait, work out what you are running: <code>N8N_TOKEN_EXCHANGE_TRUSTED_KEYS<\/code> holds the trusted signing keys, and a separate preview flag controls whether token exchange is on at all. Cut back to a single trusted issuer, or turn the feature off.<\/p>\n<p>The advisory calls both short-term measures and says neither fully remediates the risk. That is boilerplate, identical in at least three other n8n advisories, including the June 10 one. By n8n&#8217;s own scope statement, an instance with token exchange off is not affected.<\/p>\n<p>Neither release note mentions the fix. The Hacker News checked both: between them, the <a href=\"https:\/\/github.com\/n8n-io\/n8n\/releases\/tag\/n8n%402.27.4\" target=\"_blank\">2.27.4<\/a> and <a href=\"https:\/\/github.com\/n8n-io\/n8n\/releases\/tag\/n8n%402.28.1\" target=\"_blank\">2.28.1<\/a> changelogs cover a Python import fix, a Google Ads node upgrade, an AI workflow check, and a node-building change, and nothing about identity.<\/p>\n<p>The advisory is where this one lives. If your upgrade decisions run on changelogs, this is the kind of fix that slips past.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ue804Swati Khandelwal\ue802Jul 16, 2026Vulnerability \/ Web Security n8n, the workflow automation platform, handed out the wrong accounts at login. On Enterprise instances configured to trust more than one external token&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1828,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[622,1290,70,2572,2571,602,979,826],"class_list":["post-1827","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-attackers","tag-exchange","tag-flaw","tag-issuer","tag-log","tag-n8n","tag-token","tag-users"],"_links":{"self":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/1827","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1827"}],"version-history":[{"count":0,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/1827\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/media\/1828"}],"wp:attachment":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}