SAF-T1507: Authorization Code Interception
June 1, 2026 · View on GitHub
Overview
Tactic: Credential Access (ATK-TA0006)
Technique ID: SAF-T1507
Severity: High
First Observed: Threat documented 2013-01 (RFC 6819 §4.4.1.1); PKCE mitigation standardized 2015-09 (RFC 7636). No MCP-specific incident was identified during this review.
Last Updated: 2026-04-23
Author: bishnu bista
Note: Authorization-code interception is a long-standing, well-catalogued OAuth 2.0 threat. The MCP-specific exposure arises in two layers: (a) MCP servers act as OAuth clients to upstream providers (Google, Slack, GitHub, Notion, etc.), inheriting whatever flow hardening the upstream authorization server enforces; and (b) MCP clients authorize against MCP servers under the 2025-06-18 MCP authorization spec, which mandates PKCE and explicitly cites code-interception prevention as its purpose. This review did not identify a publicly disclosed incident where an MCP deployment was breached specifically via authorization-code interception; the underlying OAuth attack primitives are nevertheless well-documented outside MCP and the MCP threat surface inherits them.
Description
Authorization Code Interception is a credential-access technique in which an adversary captures a short-lived OAuth 2.0 authorization code during the redirect that follows user consent, then exchanges that code at the token endpoint to obtain access (and often refresh) tokens. The code is a one-time credential with a recommended lifetime of at most 10 minutes (RFC 6749 §4.1.2), so the attacker must either race the legitimate client to the token endpoint or prevent the legitimate client from redeeming the code at all.
In MCP deployments, two distinct OAuth relationships are exposed to this class of attack. First, MCP servers routinely act as OAuth clients to upstream services to fetch user data on behalf of the LLM; the authorization-code flow executed by the MCP server is functionally identical to any other OAuth client flow and subject to the same interception vectors. Second, the MCP 2025-06-18 Authorization specification defines how MCP clients authorize against MCP servers (which act as OAuth 2.1 resource servers) and explicitly addresses this threat: "MCP clients MUST implement PKCE according to OAuth 2.1 Section 7.5.2. PKCE helps prevent authorization code interception and injection attacks by requiring clients to create a secret verifier-challenge pair, ensuring that only the original requestor can exchange an authorization code for tokens." Because code exchange and code_verifier verification occur at the authorization server (not at the MCP resource server), an authorization server that accepts token requests without enforcing code_verifier validation remains exploitable even when the MCP client correctly generates a verifier.
Once the attacker exchanges a stolen code, the resulting tokens are indistinguishable from legitimate ones for the scopes granted. Because the token exchange itself succeeds, no downstream API sees a failure; detection relies on observing the symptom at the code stage (duplicate redemption, timing anomaly, or codes visible in unexpected locations) rather than at the token-use stage.
Attack Vectors
Primary Vector: Man-in-the-Browser Code Interception
- Method: A malicious browser extension, a compromised JavaScript dependency loaded on the redirect-target page, or in-browser malware reads the authorization code from the URL of the redirect back to the client's
redirect_uri. The attacker then races the legitimate client to the token endpoint. - Prerequisites: Attacker controls code running in the victim's browser context for the duration of the OAuth flow. A compliant authorization server does not enforce PKCE for the target client, or the attacker has also captured the
code_verifier(e.g., via the same extension). - Detection difficulty: Medium — duplicate-exchange attempts and sub-second race conditions are observable at the authorization server; after-the-fact evidence may be limited.
Secondary Vectors
RFC 6819 §4.4.1.1 ("Threat: Eavesdropping or Leaking Authorization 'codes'") enumerates the following leakage paths. Each remains applicable to MCP-server OAuth flows.
1. Referrer-Header Leakage
- Target: Authorization codes included as query parameters in the redirect URL.
- Method: If the page at
redirect_uriissues outbound requests (analytics, images, third-party scripts) before the server-side code exchange completes, the authorization code may appear in theRefererheader sent to every third-party origin the page contacts. - Mitigation anchor:
Referrer-Policy: no-referrer(orstrict-origin) on the redirect-target page; complete the code exchange server-side before rendering any page that issues outbound requests.
2. Open-Redirect or Non-Exact redirect_uri
- Target: Authorization servers that accept non-exact
redirect_urimatching (wildcards, subdomain matches, trailing-path flexibility) or clients that host open redirects on their registeredredirect_uridomain. - Method: Attacker registers a malicious
redirect_uriwithin the accepted pattern, or chains through an open redirect on the legitimate client's domain to forward the code to an attacker endpoint. - Mitigation anchor: RFC 9700 §2.1 — "authorization servers MUST utilize exact string matching except for port numbers in
localhostredirection URIs of native apps." The MCP 2025-06-18 authorization spec restates this requirement: "Authorization servers MUST validate exact redirect URIs against pre-registered values to prevent redirection attacks."
3. Codes in Browser History, Server Logs, or Analytics Pipelines
- Target: Any component that records full URLs — browser history syncing across devices, web-server access logs, CDN logs, SIEM ingestion, client-side analytics instrumentation.
- Method: An attacker with log, history, or analytics access reads codes after the redirect. Even short-lived codes are usable if the logs are read and the code redeemed before the legitimate client completes the exchange or before expiry.
- Mitigation anchor: Server-side consumption of the code before the URL is logged; redaction of
codeandstateparameters in log pipelines;Referrer-Policy(as above) to limit analytics exposure.
4. TLS Interception with a Trusted Root
- Target: Corporate MITM proxies or devices with attacker-installed root certificates.
- Method: Full visibility of the OAuth redirect traffic through a break-and-inspect gateway.
- Scope: Limited to environments where the attacker has already achieved trust-anchor compromise; primarily an insider or advanced-persistent-threat scenario. RFC 6819 §4.4.1.1 does not enumerate this specific variant — it lists referrer headers, server request logs, open redirectors, and browser history — but the general eavesdropping threat the section catalogues applies when TLS integrity is broken upstream of the client.
MCP-Specific Amplification
- Multi-provider exposure: An MCP server frequently holds tokens for multiple upstream providers (e.g., Gmail + Drive + Slack). A single intercepted code grants scope-bounded access to one provider, but correlated interception across a user's MCP onboarding session can yield a wide credential bundle.
- PKCE obligation under the MCP spec: MCP clients MUST implement PKCE per the MCP 2025-06-18 Authorization specification, regardless of whether the underlying authorization server classifies them as public or confidential clients. The spec notes that authorization servers used by MCP deployments must implement OAuth 2.1 "with appropriate security measures for both confidential and public clients" — in either case, the authorization server must enforce
code_verifiervalidation at token exchange, since that is the step that binds the code to the originating client's memory. - Confused-deputy adjacency: The MCP Security Best Practices document describes a related attack in which an MCP proxy server using a static client ID with a third-party authorization server can be tricked into redirecting an authorization code to an attacker-controlled
redirect_uriregistered via dynamic client registration. That attack is catalogued as a distinct confused-deputy pattern but shares the same end state — attacker possession of a redeemable authorization code — and is defended by the same per-client consent, exactredirect_urivalidation, andstateparameter controls.
Technical Details
Prerequisites
- The victim initiates an OAuth 2.0 authorization-code flow with a provider the MCP server (or the MCP client, under the MCP spec) integrates.
- At least one of the following holds:
- Attacker code runs in the victim's browser during the redirect (extension, injected script, compromised dependency loaded on the redirect-target page).
- The
redirect_urior the page it resolves to leaks the code viaReferer, logs, analytics, or synced browser history. - The authorization server does not enforce exact
redirect_urimatching, or the client hosts an open redirect on a registered host. - PKCE is not enforced at the authorization server for the target client, OR PKCE is enforced only client-side without server-side
code_verifiervalidation.
Attack Flow
sequenceDiagram
participant V as Victim Browser
participant X as Attacker (in browser)
participant AS as Authorization Server
participant M as MCP Server (OAuth client)
participant U as Upstream API
V->>AS: 1. /authorize (client_id, redirect_uri, scope, state, [code_challenge])
AS->>V: 2. Consent screen
V->>AS: 3. User approves
AS->>V: 4. 302 Redirect: redirect_uri?code=...&state=...
V->>X: 5. Redirect observed by in-browser attacker
X->>AS: 6. (Race) POST /token with code
V->>M: 7. Redirect delivered to MCP server
M->>AS: 8. POST /token with code (+ code_verifier if PKCE)
alt Attacker possesses every credential the AS requires (code, plus code_verifier if PKCE is enforced, plus client authentication if the client is confidential)
AS-->>X: 9a. access_token + refresh_token (attacker wins race)
AS-->>M: 9b. invalid_grant (code already redeemed)
X->>U: 10. Use stolen token against upstream API
else Attacker is missing one or more required credentials (no code_verifier under PKCE, or missing client_secret / private_key_jwt / mTLS cert for a confidential client)
AS-->>X: 9c. invalid_grant or invalid_client (exchange rejected)
AS-->>M: 9d. access_token + refresh_token
end
- User initiates OAuth: The MCP client or MCP server redirects the user's browser to the authorization server with a standard authorization request.
- User consents: The authorization server issues a short-lived authorization code and redirects to
redirect_uri. - Code exposed: The code is briefly visible in the browser URL or in a redirect chain.
- Attacker captures: A malicious extension, injected script, referrer leak, or log read exposes the code to the attacker.
- Race to token endpoint: The attacker POSTs to
/tokenusing the stolen code. The token endpoint enforces two independent defense layers, and the attacker must satisfy whichever of them the authorization server requires: (a) client authentication — for confidential clients, the AS authenticates the client at the token endpoint usingclient_secret,private_key_jwt, or mTLS; an attacker without the legitimate client's credentials is rejected withinvalid_clientregardless of PKCE state, and public clients skip this check sinceclient_idis a non-secret identifier; (b) PKCE proof of possession — if PKCE is enforced, the attacker must also supplycode_verifiermatching the storedcode_challenge; the verifier normally lives only in the legitimate client's memory, so the attacker fails unless they captured the verifier through the same vector that captured the code (for example the same malicious browser extension). The attack succeeds only when the attacker can satisfy every layer the AS enforces for the target client type. - Token exchange: Whoever reaches the token endpoint first and presents all required credentials (client authentication if applicable, and
code_verifierwhen PKCE is enforced) receives the tokens. The loser seesinvalid_grant— the RFC 6749 error returned for any invalid, expired, or already-redeemed code. Some providers surface a more descriptiveerror_descriptionsuch ascode_already_used, but the standards-defined error code isinvalid_grant. - Post-exploitation: The attacker's tokens are indistinguishable from legitimate tokens and grant the scopes the user approved. Refresh tokens, if issued, extend access beyond the original session until the user explicitly revokes the authorization at the provider.
Example Scenario
Scenario: Browser extension intercepts Google OAuth code for an MCP server
1. User installs MCP server "gmail-helper" which integrates Gmail via Google OAuth.
2. User visits gmail-helper.example.com, clicks "Connect Gmail".
3. Browser redirects to https://accounts.google.com/o/oauth2/v2/auth?
client_id=12345.apps.googleusercontent.com&
redirect_uri=https://gmail-helper.example.com/oauth/callback&
response_type=code&
scope=https://www.googleapis.com/auth/gmail.readonly&
state=a1b2c3
(No PKCE — gmail-helper is a confidential client relying on client_secret only.)
4. User consents. Google redirects to:
https://gmail-helper.example.com/oauth/callback?code=4/0AY0e-g7...&state=a1b2c3
5. A malicious extension with content-script access to gmail-helper.example.com
reads the callback URL.
6. The extension's background service worker POSTs the code to the attacker's
infrastructure.
7. The attacker has gmail-helper's client_id + client_secret (leaked in a prior
breach) and POSTs:
POST https://oauth2.googleapis.com/token
Body: code=4/0AY0e-g7...
client_id=12345.apps.googleusercontent.com
client_secret=<leaked>
redirect_uri=https://gmail-helper.example.com/oauth/callback
grant_type=authorization_code
8. If the attacker reaches Google's /token endpoint before gmail-helper does,
the attacker receives an access_token + refresh_token with gmail.readonly.
9. gmail-helper's subsequent exchange fails with invalid_grant.
What changes when PKCE (RFC 7636) is enforced: In step 3 the client generates a random code_verifier and sends code_challenge to the authorization server. Under code_challenge_method=S256 (RFC 7636 §4.2), code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))); under the legacy plain method, code_challenge = code_verifier. In step 7 the attacker's token request must supply the original code_verifier; the verifier normally stays in the legitimate client's process, so the attacker cannot produce it and the exchange fails. PKCE is bypassed only if the attacker captures the code_verifier through the same vector that captured the code (e.g., a malicious extension with access to the client's JavaScript state), which is why PKCE is a necessary but not sufficient defense against a full man-in-the-browser compromise — and why confidential-client authentication (when applicable) remains an independent, complementary defense layer even when PKCE is enabled.
Impact Assessment
- Confidentiality: High — Stolen tokens grant whatever scopes the user consented to. OAuth consent screens frequently request broader scopes than the immediate action requires.
- Integrity: High — Most OAuth scopes for productivity providers (Gmail, Drive, Slack, GitHub, Notion) include write permissions, enabling data modification, email sending, or resource deletion.
- Availability: Low–Medium — Indirect; stolen tokens could be used for rate-limit consumption or resource deletion depending on scope.
- Scope: Bounded by the stolen token's scope. For MCP servers that integrate multiple providers, correlated interception across the onboarding flow can broaden scope substantially.
Additional Impacts
- MFA bypass: Post-consent tokens do not require re-authentication; MFA at the upstream provider does not protect subsequent token use.
- Persistent access via refresh tokens: If the stolen code yields a refresh token, the attacker retains access until the user explicitly revokes the authorization in the provider's dashboard.
- Silent from the provider's perspective: The attacker's API calls are indistinguishable from legitimate MCP-server traffic unless the provider correlates tokens to unexpected client IPs, ASNs, or user agents.
Detection Methods
Indicators of Compromise (IoCs)
- Multiple
POST /tokenrequests with the same authorization code from different source IPs or different TLS fingerprints within a few seconds. - Token-exchange attempts that fail with
invalid_grant(the RFC 6749 error code; some providers additionally surface anerror_descriptionsuch ascode_already_usedorredemption_limit) at the legitimate MCP server's OAuth client shortly after a successful authorization response — an asymmetric signal that something else redeemed the code first. - Authorization codes observed in
Refererheaders, in theurlfield of analytics payloads, in web-server access logs, or in synced browser history. redirect_uriparameters that differ from registered exact matches on authorization servers that previously allowed wildcards and are tightening policy.- Post-exchange API calls from tokens issued to MCP infrastructure appearing from client IPs or autonomous-system numbers unrelated to the MCP server's known deployment.
Detection Rules
Important: The following rule is written in Sigma format and contains example patterns only. The duplicate-code and race-condition selectors express correlation/windowing semantics that require Sigma v2 correlation rules or equivalent stateful SIEM logic keyed on authorization_code; they are documented inline for clarity but are not runnable as a single stateless Sigma rule. Authorization-code-interception vectors evolve as PKCE enforcement spreads; attackers shift toward client-secret exfiltration or authorization-server impersonation (see SAF-T1009) once code_verifier enforcement is universal. Organizations should:
- Correlate authorization-server logs with client-side token-exchange logs to detect duplicate redemption.
- Monitor for tokens used from client IPs or ASNs not associated with the registered MCP deployment.
- Review
Referrer-Policyand client-side analytics pipelines on everyredirect_uripage; theselection_code_in_referrerbranch below relies on web/proxy/analytics logs, not on the token-exchange logsource the other selectors use.
# EXAMPLE SIGMA RULE - Not comprehensive
title: MCP OAuth Authorization Code Interception Detection
id: 2aa0f9c2-f9b0-4b20-96e8-e2325f215491
status: experimental
description: Detects potential authorization code interception through duplicate token exchange attempts, sub-second token-endpoint races, or authorization codes appearing in HTTP Referer headers
author: SAF-MCP Team
date: 2025-01-20
references:
- https://github.com/SAF-MCP/saf-mcp/tree/main/techniques/SAF-T1507
- https://datatracker.ietf.org/doc/html/rfc6749
- https://datatracker.ietf.org/doc/html/rfc6819
- https://datatracker.ietf.org/doc/html/rfc7636
- https://datatracker.ietf.org/doc/html/rfc9700
logsource:
product: mcp
service: oauth_token_exchange
detection:
# Correlation selectors — require Sigma v2 correlation rules or equivalent
# stateful SIEM logic keyed on `authorization_code`.
selection_duplicate_code:
authorization_code|count|gt: 1
timeframe: 5s
selection_race_condition:
token_exchange_timestamp:
- '|difference|lt: 1s'
same_authorization_code: true
different_source_ip: true
# Web/proxy/analytics logsource selector — callback page logs, not token-exchange logs.
selection_code_in_referrer:
http_referrer|contains:
- '*code=*'
- '*authorization_code=*'
http_referrer|not|contains:
- 'oauth.example.com'
condition: selection_duplicate_code or selection_race_condition or selection_code_in_referrer
falsepositives:
- Legitimate retry attempts with the same authorization code (RFC 6749 §4.1.2 requires the AS to deny reuse; the standards-defined error is invalid_grant, sometimes surfaced by providers with an error_description such as code_already_used)
- Load-balanced token endpoints where the client-side source IP legitimately varies between the first attempt and its retry
- Development/testing environments with instrumented OAuth flows
level: high
tags:
- attack.credential_access
- attack.t1557
- safe.t1507
The original
detection-rule.ymlfor this technique usedattack.t1550alone. This revision refines the rule tagging toattack.t1557(Adversary-in-the-Middle — the interception step), since this analytic observes authorization-code and token-exchange telemetry rather than application access token use. The broader replay mapping toattack.t1550.001(Use Alternate Authentication Material: Application Access Token) is retained at the narrative level — see the MITRE mapping section — but is not claimed by this specific rule's tags.
Behavioral Indicators
- Authorization flows that generate a code but never result in a successful token exchange from the registered client.
- Bursts of
invalid_granterrors at the MCP server's token-exchange handler with no preceding authorization failure. - First-time redirect through a recently installed browser extension for an OAuth flow the user has previously completed without extension involvement.
- Authorization completions followed by API calls to the upstream provider from client IPs that have never previously hosted the MCP deployment.
Mitigation Strategies
Preventive Controls
-
Enforce PKCE (RFC 7636) server-side, not just client-side. The
code_verifierbinds token exchange to the originating client's process. The authorization server MUST reject any token exchange that lacks acode_verifieror whosecode_verifierdoes not match the storedcode_challengeunder thecode_challenge_methodthe client declared (S256, which RFC 7636 §4.2 requires for clients technically capable of it and which RFC 9700 §2.1.1 recommends; or the legacyplainmethod where explicitly supported). RFC 7636 scopes PKCE to public clients; RFC 9700 §2.1.1 requires PKCE (MUST) for all public clients and recommends it (RECOMMENDED) for confidential clients. The MCP 2025-06-18 Authorization specification is stricter: MCP clients MUST implement PKCE regardless of client type.
See also SAF-M-38: PKCE Enforcement for the cross-technique PKCE mitigation entry. -
Exact-match
redirect_uri. Per RFC 9700 §2.1 — "authorization servers MUST utilize exact string matching except for port numbers inlocalhostredirection URIs of native apps" — reject any authorization request whoseredirect_uridoes not exactly match a pre-registered value. Disallow wildcards, subdomain patterns, and trailing-path flexibility. The MCP 2025-06-18 authorization spec restates this: "Authorization servers MUST validate exact redirect URIs against pre-registered values to prevent redirection attacks." -
Single-use authorization codes with short TTL. Per RFC 6749 §4.1.2: "A maximum authorization code lifetime of 10 minutes is RECOMMENDED" and "The client MUST NOT use the authorization code more than once. If an authorization code is used more than once, the authorization server MUST deny the request and SHOULD revoke (when possible) all tokens previously issued based on that authorization code." Enforce both properties strictly at the authorization server; short TTLs shrink the race window and single-use enforcement turns a successful race into a detectable
invalid_granterror (or a provider-specific variant such ascode_already_used) at the legitimate client. -
SAF-M-13: OAuth Flow Verification. Validate the
issparameter (RFC 9207) in authorization responses before redeeming the code. This addresses the related mix-up-attack class (SAF-T1009) and hardens the OAuth flow against category-adjacent interception patterns. -
Referrer-Policyon redirect-target pages. The page that receives thecodequery parameter must setReferrer-Policy: no-referrer(orstrict-origin) so the code does not leak in outboundRefererheaders. Complete the code exchange server-side before rendering any page that issues outbound requests. RFC 6819 §4.4.1.1 enumerates referrer leakage as a primary interception path. -
Minimize front-channel code exposure. Server-side redirect handlers should consume and invalidate the code before returning any HTML. Avoid SPA patterns that parse the code from the URL in client-side JavaScript, since JavaScript execution is the same threat surface that hosts the man-in-the-browser attacker.
-
Protect client credentials as an independent defense layer. For confidential clients, token-endpoint client authentication (
client_secret,private_key_jwt, or mTLS) is an independent defense that stops the attacker even if PKCE is bypassed by a same-contextcode_verifiertheft — and it is the primary defense when PKCE is not enforced. Rotate credentials on suspected exposure; prefer asymmetric schemes (private_key_jwt, mTLS) over shared-secret schemes where the authorization server supports them. -
stateparameter validation. Generate a cryptographically randomstateper authorization request, bind it server-side to the user's session or consent decision, and validate exact equality at the callback. The MCP 2025-06-18 Security Best Practices document ("OAuth State Parameter Validation") ties this control to authorization-code interception prevention and specifies that thestate-tracking cookie MUST NOT be set until after the user has approved the consent screen.
Detective Controls
-
Duplicate-code detection at the authorization server. Alert on any
POST /tokenwhose authorization code has already been redeemed — even when the second attempt fails — because this is the signal that a race occurred. -
Cross-correlate AS and client logs. For every authorization code issued, verify the registered client subsequently redeemed it. Codes that are never redeemed by the intended client, or that the intended client saw fail with
invalid_grant(or a provider-specific variant such ascode_already_used), warrant investigation. -
Monitor referrer, log, and analytics pipelines for OAuth-parameter leakage. Scan web-server access logs, analytics payloads, and SIEM ingestion for
code=,authorization_code=, andstate=parameters appearing in URLs outside the expected redirect path. -
Token-usage fingerprinting. Baseline the client IPs, ASNs, and user agents from which tokens issued to each MCP server are used, and alert on deviation. Tokens stolen via code interception are typically used from the attacker's infrastructure, not the MCP server's.
Response Procedures
-
Immediate actions:
- Revoke the authorization at the upstream provider (delete the user's grant) — this invalidates both access and refresh tokens.
- Re-issue a fresh authorization flow only after confirming the endpoint device is clean.
- If
client_secretis suspected of exposure, rotate it and redeploy the MCP server before re-authorization.
-
Investigation steps:
- Correlate authorization-server logs, MCP-server token-exchange logs, and upstream API access logs for the affected user within the last token lifetime.
- Identify the interception vector: duplicate redemption (MITB race), referrer leakage (downstream page analytics), or misconfigured
redirect_urimatching. - For MITB suspicion: enumerate browser extensions installed on the victim's browser and correlate installation timestamps with the first suspicious OAuth flow.
-
Remediation:
- Enforce PKCE at the authorization server for all future flows involving the affected client.
- Tighten
redirect_uripolicy to exact match. - Deploy
Referrer-Policy: no-referreron all OAuth callback pages. - User guidance: recommend a clean browser profile (or disabled extensions) for high-scope OAuth flows, and periodic audit of active OAuth grants in provider dashboards.
Related Techniques
- SAF-T1009: OAuth Authorization Server Mix-Up — Attacker confuses the client about which AS issued the code; often combined with or adjacent to code interception.
- SAF-T1408: OAuth Protocol Downgrade — Forces the flow to a less-protected grant (e.g., implicit) that exposes tokens without the PKCE/code-exchange step; an upstream enabler when PKCE is the primary defense.
- SAF-T1506: Infrastructure Token Theft — Post-exchange theft from logs, TLS termination proxies, or infrastructure; the step after a successful (legitimate) code exchange, not an alternative to it.
- SAF-T1504: Token Theft via API Response — Post-exchange theft by inducing an MCP tool to return tokens; same end state (attacker-held token), different vector (LLM-mediated vs. redirect interception).
References
Standards and specifications
- RFC 6749 — The OAuth 2.0 Authorization Framework (October 2012) — authorization-code grant definition (§4.1); code single-use and TTL (§4.1.2)
- RFC 6819 — OAuth 2.0 Threat Model and Security Considerations (January 2013) — §4.4.1.1 "Threat: Eavesdropping or Leaking Authorization 'codes'" catalogues the interception vectors used in this technique
- RFC 7636 — Proof Key for Code Exchange by OAuth Public Clients (PKCE) (September 2015) — primary mitigation; scoped to public clients
- RFC 9207 — OAuth 2.0 Authorization Server Issuer Identification (March 2022) —
issparameter; defense against the adjacent mix-up-attack class - RFC 9700 — Best Current Practice for OAuth 2.0 Security (January 2025) — §2.1 exact
redirect_urimatching; §2.1.1 PKCE for public clients (MUST) and confidential clients (RECOMMENDED); §4.5 authorization-code injection attack and PKCE countermeasure - Model Context Protocol Specification — Authorization (2025-06-18) — MCP's Authorization Code Protection section mandates PKCE for all MCP clients
- Model Context Protocol Specification — Security Best Practices (2025-06-18) — Confused Deputy Problem and OAuth State Parameter Validation sections
Research
- Fett, Küsters, Schmitz — A Comprehensive Formal Security Analysis of OAuth 2.0 (arXiv:1601.01229) — formal analysis of OAuth 2.0 across all four grant types; identifies several previously unknown attacks breaking OAuth's intended security properties
MITRE ATT&CK Mapping
Note: MITRE ATT&CK does not include OAuth-specific techniques or enumerate man-in-the-browser as a named realization. The mappings below are the closest tactic-level analogues, split between the interception step and the replay step.
- T1557 — Adversary-in-the-Middle — Closest match for the interception step. The MITRE page enumerates network-level realizations (DNS manipulation, ARP poisoning, DHCP spoofing, SSL/TLS downgrade) rather than in-browser realizations; the shared element is the adversary positioning themselves within the communication path between the browser and the legitimate OAuth client. Man-in-the-browser fits this positioning model even though MITRE does not list it as an enumerated example.
- T1550.001 — Use Alternate Authentication Material: Application Access Token — Match for the replay step. Once the attacker has exchanged the intercepted code for an access token, MITRE's description applies directly: "Adversaries may use stolen application access tokens to bypass the typical authentication process and access restricted accounts, information, or services on remote systems." The original
detection-rule.ymlused the bareT1550parent technique;T1550.001is the specific sub-technique for OAuth-style access tokens.
Version History
| Version | Date | Changes | Author |
|---|---|---|---|
| 1.0 | 2026-04-23 | Initial documentation of Authorization Code Interception — L3 reconstruction authored from the detection rule, root corpus README slot, and verified primary sources (RFCs 6749, 6819, 7636, 9207, 9700; MCP 2025-06-18 authorization and security-best-practices specifications; MITRE T1557, T1550.001; Fett et al. arXiv:1601.01229). | bishnu bista |