For a client using the grant type code, an attack may work as
follows:¶
Assume the redirect URL pattern https://*.somesite.example/* is
registered for the client with the client ID s6BhdRkqt3. The
intention is to allow any subdomain of somesite.example to be a
valid redirect URI for the client, for example
https://app1.somesite.example/redirect. A naive implementation on
the authorization server, however, might interpret the wildcard * as
"any character" and not "any character valid for a domain name". The
authorization server, therefore, might permit
https://attacker.example/.somesite.example as a redirect URI,
although attacker.example is a different domain potentially
controlled by a malicious party.¶
The attack can then be conducted as follows:¶
To begin, the attacker needs to trick the user into opening a tampered
URL in their browser that launches a page under the attacker's
control, say https://www.evil.example (see Attacker A1 in Section 3).¶
This URL initiates the following authorization request with the client ID of a legitimate client to the authorization endpoint (line breaks for display only):¶
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=9ad67f13
&redirect_uri=https%3A%2F%2Fattacker.example%2F.somesite.example
HTTP/1.1
Host: server.somesite.example
¶
The authorization server validates the redirect URI and compares it to
the registered redirect URL patterns for the client s6BhdRkqt3.
The authorization request is processed and presented to the user.¶
If the user does not see the redirect URI or does not recognize the attack, the code is issued and immediately sent to the attacker's domain. If an automatic approval of the authorization is enabled (which is not recommended for public clients according to [RFC6749]), the attack can be performed even without user interaction.¶
If the attacker impersonates a public client, the attacker can exchange the code for tokens at the respective token endpoint.¶
This attack will not work as easily for confidential clients, since the code exchange requires authentication with the legitimate client's secret. The attacker can, however, use the legitimate confidential client to redeem the code by performing an authorization code injection attack, see Section 4.5.¶
It is important to note that redirect URI validation vulnerabilities can also exist if the authorization
server handles wildcards properly. For example, assume that the client
registers the redirect URL pattern https://*.somesite.example/* and
the authorization server interprets this as "allow redirect URIs
pointing to any host residing in the domain somesite.example". If an
attacker manages to establish a host or subdomain in
somesite.example, the attacker can impersonate the legitimate client. This
could be caused, for example, by a subdomain takeover attack [research.udel], where an
outdated CNAME record (say, external-service.somesite.example)
points to an external DNS name that does no longer exist (say,
customer-abc.service.example) and can be taken over by an attacker
(e.g., by registering as customer-abc with the external service).¶