Mittwoch, 25. Januar 2017

PKCE: What can(not) be protected


This post is about PKCE [RFC7636], a protection mechanism for OAuth and OpenIDConnect designed for public clients to detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authorization code interception attack.
At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of our research, we wrongly believed that PKCE protects mobile and native apps from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 so called „App Impersonation“ attacks. Considering our ideas and after a short discussion with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PKCE specification, we found out that PKCE does not address this issue.
In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protection of PKCE can be bypassed on public clients (mobile and native apps) by using a maliciously acting app.

OAuth Code Flow


In Figure 1, we briefly introduce how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OAuth flow works on mobile apps and show show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason why we do need PKCE.
In our example cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user has two apps installed on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mobile phone: an Honest App and an Evil App. We assume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App is able to register cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same handler as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App and thus intercept messages sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App. If you are more interested in this issue, you can find more information here [1].

Figure 1: An example of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "authorization code interception" attack on mobile devices. 

Step 1: A user starts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App and initiates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication via OpenID Connect or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authorization via OAuth. Consequentially, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App generates an Auth Request containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenID Connect/OAuth parameters: client_id, state, redirect_uri, scope, authorization_grant, nonce, …. 
Step 2: The Browser is called and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request is sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorization Server (usually Facebook, Google, …).
  • The Honest App could use a Web View browser. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current specification clearly advice to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system's default browser and avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usage of Web Views [2]. In addition, Google does not allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usage of Web View browser since August 2016 [3].
Step 3: We asume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticated and he authorizes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested resources. As a result, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Response containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code is sent back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser.

Step 4: Now, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser calls cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App registered handler. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App is registered on this handler too and receives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.

Step 5: The Evil App sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stolen code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorization Server and receives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding access_token in step 6. Now, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App can access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authorized ressources.
  • Optionally, in step 5 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 App can aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticate on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorization Server via client_id, client_secret. Since, Apps are public clients cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not have any protection mechanisms regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 storage of this information. Thus, an attacker can easy get this information and add it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App.

Proof Key for Code Exchange - PKCE (RFC 7636)

Now, let‘s see how PKCE does prevent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack. The basic idea of PKCE is to bind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request in Step 1 to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code redemption in Step 5. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 app generated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request is able to redeem cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated code.


Figure 2: PKCE - RFC 7636 

Step 1: The Auth Request is generated as previosly described. Additionally, two parameters are added:
  • The Honest App generates a random string called code_verifier
  • The Honest App computes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code_challenge=SHA-256(code_verifier)
  • The Honest App specifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 challenge_method=SHA256

Step 2: The Authorization Server receives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request and binds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 received code_challenge and challenge_method.
  • Later in Step 5, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorzation Server expects to receive cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code_verifier. By comparing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SHA-256(code_verifier) value with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recieved code_challenge, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorization Server verifies that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request ist cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.
Step 3-4: The code leaks again to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App.

Step 5: Now, Evil App must send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code_verifier togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code. Unfortunatelly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 App does not have it and is not able to compute it. Thus, it cannot redeem cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.

 PKCE Bypass via App Impersonation

Again, PKCE binds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Auth Request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code redemption.
The question rises, if an Evil App can build its own Auth Request with its own code_verifier, code_challenge and challenge_method. The short answer is – yes, it can.

Figure 3: Bypassing PKCE via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 App Impersonation attack
Step 1: The Evil App generates an Auth Request. The Auth Request contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client_id and redirect_uri of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Honest App. Thus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 User and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Authorization Server cannot recognize that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App initiates this request. 

Step 2-4: These steps do not deviate from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous description in Figure 2.

Step 5: In Step 5 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code_verifier used for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 computation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code_challenge. Thus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stolen code can be successfully redeemed and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Evil App receives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access_token and id_token.

OAuth 2.0 for Native Apps

The attack cannot be prevented by PKCE. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IETF working group is currently working on a Draft describing recommendations for using OAuth 2.0 for native apps.

References

Vladislav Mladenov
Christian Mainka (@CheariX)

Beliebte Posts