Slide 1

Slide 1 text

How to Hack OAuth AARON PARECKI @aaronpk aaronpk.com

Slide 2

Slide 2 text

@aaronpk Senior Security Architect
 at Okta @oktadev

Slide 3

Slide 3 text

@aaronpk oauth.net

Slide 4

Slide 4 text

RFC6749 RFC6750 CLIENT TYPE AUTH METHOD GRANT TYPE RFC6819 RFC7009 RFC7592 RFC7662 RFC7636 RFC7591 RFC7519 BUILDING YOUR APPLICATION RFC8252 OIDC RFC8414 STATE PARAM TLS CSRF UMA 2 FAPI RFC7515 RFC7516 RFC7517 RFC7518 TOKEN BINDING POP SECURITY BCP CIBA HTTP SIGNING MUTUAL TLS SPA BCP JARM JAR TOKEN EXCHANGE DPOP

Slide 5

Slide 5 text

@aaronpk THE PASSWORD ANTI-PATTERN

Slide 6

Slide 6 text

@aaronpk THE PASSWORD ANTI-PATTERN facebook.com ~2010

Slide 7

Slide 7 text

@aaronpk

Slide 8

Slide 8 text

@aaronpk so... how can I let an app access my data without giving it my password?

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

@aaronpk POST /resource/1/update HTTP/1.1 Authorization: Bearer RsT5OjbzRn430zqMLgV3Ia Host: api.authorization-server.com description=Hello+World

Slide 11

Slide 11 text

@aaronpk A HOTEL KEY CARD, FOR APPS Authorization Server Access Token Resource (API)

Slide 12

Slide 12 text

@aaronpk HOW OAUTH WORKS

Slide 13

Slide 13 text

@aaronpk ROLES IN OAUTH OAuth Server (Authorization Server) aka the token factory API (Resource Server) The Application (Client) The User (Resource Owner) Device (User Agent)

Slide 14

Slide 14 text

User: I’d like to use this great app App: Please go to the authorization server to grant me access User: I’d like to log in to “Yelp”, it wants to access my contacts AS: Here is a temporary code the app can use App: Here is the temporary code, and my secret, please give me a token User: Here is the temporary code, please use this to get a token AS: Here is an access token! App: Please let me access this user’s data with this access token! User Agent App OAuth Server API ?

Slide 15

Slide 15 text

Front Channel Back Channel https://accounts.google.com/?... Passing data via the browser's address bar The user, or malicious software, can modify the requests and responses Sent from client to server HTTPS request from client to server, so requests cannot be tampered with

Slide 16

Slide 16 text

Back Channel Benefits ‣ The application knows it's talking to the right server ‣ Connection from app to server can't be tampered with ‣ Response from the server can be trusted because it came back in the same connection

Slide 17

Slide 17 text

OAuth Server OAuth Client Passing Data via the Back Channel

Slide 18

Slide 18 text

OAuth Server OAuth Client Passing Data via the Front Channel Did they catch 
 it? Did someone else 
 steal it? Is this really 
 from the real 
 OAuth server?

Slide 19

Slide 19 text

Front Channel Benefits https://accounts.google.com/?... ‣ The user being involved enables them to give consent ‣ Enables easier two-factor authorization integration ‣ Doesn't require the receiver to have a publicly routable IP
 (e.g. can work on a phone)

Slide 20

Slide 20 text

@aaronpk THE HACKS

Slide 21

Slide 21 text

@aaronpk HOW TO HACK OAUTH RFC 6749 Section 10 RFC 8252 Section 8 RFC 6819 draft-ietf-oauth-security-topics

Slide 22

Slide 22 text

@aaronpk TWITTER STOLEN API KEYS

Slide 23

Slide 23 text

@aaronpk 2013

Slide 24

Slide 24 text

@aaronpk

Slide 25

Slide 25 text

@aaronpk ANYONE CAN 
 IMPERSONATE 
 THE TWITTER APPS

Slide 26

Slide 26 text

@aaronpk DON'T PUT SECRETS
 IN NATIVE APPS! https://developer.okta.com/blog/2019/01/22/oauth-api-keys-arent-safe-in-mobile-apps

Slide 27

Slide 27 text

@aaronpk PKCE PROOF-KEY FOR CODE EXCHANGE RFC 7636 (pronounced "pixie")

Slide 28

Slide 28 text

User: I’d like to use this great app App: Please go to the authorization server to grant me access, take this hash with you User: I’d like to log in to this app, here's the hash AS: Here is a temporary code the app can use App: Here's the code, and the plaintext secret, please give me a token User: Here is the temporary code, please use this to get a token AS: Let me verify the hash of that secret... ok here is an access token! App: Please let me access this user’s data with this access token! App: Hang on while I generate a new secret and hash it User
 Agent App OAuth Server API ?

Slide 29

Slide 29 text

@aaronpk AppAuth.io iOS / Android / JavaScript

Slide 30

Slide 30 text

@aaronpk JWT ALG=NONE photo by flickr.com/quidox

Slide 31

Slide 31 text

@aaronpk 2015

Slide 32

Slide 32 text

@aaronpk JWTS ARE OFTEN USED
 FOR API AUTHENTICATION
 AND AS OAUTH ACCESS TOKENS

Slide 33

Slide 33 text

An Example JWT eyJraWQiOiJvQ1JjR3RxVDhRV2tJR0MyVXpmcEZUczVqSkdnM00zSTNOMHgtZDJhSFNNIiwiYW xnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULkp3eVRTcTlqNDU0bDNTNmRTM1VTV1hMV VpwekdKdWNSd1ZEbFZCNWNIc3cuVVM1V1NGYVFiQllUMC9GM2tjMG8vK1ZUY3VZZzdwVnZqZXZ TT3hkUHhCMD0iLCJpc3MiOiJodHRwczovL2Rldi0zOTYzNDMub2t0YXByZXZpZXcuY29tL29hd XRoMi9kZWZhdWx0IiwiYXVkIjoiYXBpOi8vZGVmYXVsdCIsImlhdCI6MTU0MzgwMzAyNSwiZXh wIjoxNTQzODA2NjI1LCJjaWQiOiIwb2FoenBwM3RjcEZyZmNXSTBoNyIsInVpZCI6IjAwdWkwZ mpraWV5TDQ2bWEwMGg3Iiwic2NwIjpbIm9mZmxpbmVfYWNjZXNzIiwicGhvdG8iXSwic3ViIjo iaW5xdWlzaXRpdmUtYWxiYXRyb3NzQGV4YW1wbGUuY29tIn0.ncVkzcc6qrFJSXE3-5UsRu_kH vbwIMKYL3PFaMwReYTquPAcOQ8t93xF0bxbS8wrP0udCDvk6eYq4VbjoFdD59Yy6ltz0OKQl3- g8uFg2RwqTBMOKR0mYtQH0RCr9ORhSsmKolaDDt4TcRX78ZOAyhZ_Qg_UcEoHM4uZikpzBJYpY KbCCfbx-6FzYyHuvevSFzURISYpSHv3nbzirkEzKbOv7eZlg1cCYBdUoGuVBskyHxfMxFpoKQU 3mwIFdlQJR8LZ8hA_5ZdYjjMeSXfjnhlP2rppJiHy1NreGXXcUsUA74V2t_keY44deTrnPgoFO Se9IchWqcj6sDMDutC4ag

Slide 34

Slide 34 text

ID Token: JWT eyJraWQiOiJiRmxZbmkzLXRhMXFSa0lFellHc2tLeFFRVUJvczZnOU9RQnRmNm9xcUxJIiwiYWxnI joiUlMyNTYifQ . eyJzdWIiOiIwMHVjcTNid2o0V25JcTNnejBoNyIsIm5hbWUiOiJQYWRtYS0yIEdvdmluZGFyYWphb HUiLCJsb2NhbGUiOiJlbi1VUyIsInZlciI6MSwiaXNzIjoiaHR0cHM6Ly9wYWRtYWdvdmluZGFyYW phbHUub2t0YXByZXZpZXcuY29tL29hdXRoMi9kZWZhdWx0IiwiYXVkIjoiMG9hZDlydTd0endmNUF qcGIwaDcgIiwiaWF0IjoxNTI0NTk0OTEwLCJleHAiOjE1MjQ1OTg1MTAsImp0aSI6IklELklfNUc4 RzhWdXowMHJvYl9aSzlja3J0T0pseVdwNzhxMU5naGV2QlJ6dkEiLCJhbXIiOlsicHdkIl0sImlkc CI6IjAwb2NxM2J3aTFoTnpRT3B5MGg3Iiwibm9uY2UiOiJhYmMiLCJwcmVmZXJyZWRfdXNlcm5hbW UiOiJwYWRtYS5nb3ZpbmRhcmFqYWx1QG9rdGEuY29tIiwiZ2l2ZW5fbmFtZSI6IlBhZG1hIiwibWl kZGxlX25hbWUiOiJLcmlzaG5hIiwiZmFtaWx5X25hbWUiOiJHb3ZpbmRhcmFqYWx1Iiwiem9uZWlu Zm8iOiJBbWVyaWNhL0xvc19BbmdlbGVzIiwidXBkYXRlZF9hdCI6MTUyNDU5NDM2MSwiYXV0aF90a W1lIjoxNTI0NTk0OTA3fQ . HvMYW8XbdCf1BW- ZfHQ1odaAYJjZqKkh1NUkHW0clk6J7pYunn8jllbIp0IhSjcCn6PBIlZPrrE0dkuyjvdHjVI8ALQN wtM7FnIs9H6gCH0oONx4EL4K-Ef4d_w46qeqsCwMClvNoaE3c2I5-kON- uJUlaefbnr6Al_y9z5mvLyDynf9IjrOyTPoIrgk9V46l28Aulp4dJhqBtZfpYyVbKrXawHSO5FvKT DMPBhQgxt0_6PKG7sSkhbMeBicIc35SJJaXt81KSfkYDUp5s1UQ74ATHrtLe7HMU1yp_KajgYUKxM XO5NiXpeNEHzarAOWzLHblrQcgkpuJbY3KM1HHg header payload signature

Slide 35

Slide 35 text

Attacking a JWT { "typ": "JWT", "alg": "RS256" } { "ver": 1, "jti": "AT.JwyTSq9j454l3S6dS3USWXLUZpzGJucRwVDlVB5cHsw.US5WSFaQbBYT0/F3kc0o/+VTcuYg7pVvjevSOxdPxB0=", "iss": "https://dev-396343.oktapreview.com/oauth2/default", "aud": "api://default", "iat": 1543803025, "exp": 1543806625, "cid": "0oahzpp3tcpFrfcWI0h7", "uid": "00ui0fjkieyL46ma00h7", "scp": [ "offline_access", "photo" ], "sub": "[email protected]" } header claims signature

Slide 36

Slide 36 text

Attacking a JWT { "typ": "JWT", "alg": "none" } { "ver": 1, "jti": "AT.JwyTSq9j454l3S6dS3USWXLUZpzGJucRwVDlVB5cHsw.US5WSFaQbBYT0/F3kc0o/+VTcuYg7pVvjevSOxdPxB0=", "iss": "https://dev-396343.oktapreview.com/oauth2/default", "aud": "api://default", "iat": 1543803025, "exp": 1543806625, "cid": "0oahzpp3tcpFrfcWI0h7", "uid": "00ui0fjkieyL46ma00h7", "scp": [ "offline_access", "photo" ], "sub": "[email protected]" } header claims

Slide 37

Slide 37 text

Attacking a JWT { "typ": "JWT", "alg": "HS256" } { "ver": 1, "jti": "AT.JwyTSq9j454l3S6dS3USWXLUZpzGJucRwVDlVB5cHsw.US5WSFaQbBYT0/F3kc0o/+VTcuYg7pVvjevSOxdPxB0=", "iss": "https://dev-396343.oktapreview.com/oauth2/default", "aud": "api://default", "iat": 1543803025, "exp": 1543806625, "cid": "0oahzpp3tcpFrfcWI0h7", "uid": "00ui0fjkieyL46ma00h7", "scp": [ "offline_access", "photo" ], "sub": "[email protected]" } header claims signature

Slide 38

Slide 38 text

@aaronpk Treat the JWT header as 
 untrusted external information

Slide 39

Slide 39 text

@aaronpk Never let the JWT header
 determine your verification mechanism

Slide 40

Slide 40 text

@aaronpk Thankfully most JWT libraries
 fixed this in 2015-2016

Slide 41

Slide 41 text

@aaronpk GOOGLE OAUTH PHISHING

Slide 42

Slide 42 text

@aaronpk 2017

Slide 43

Slide 43 text

https://accounts.google.com/oauth/authorize?response_ty

Slide 44

Slide 44 text

https://arstechnica.com/information-technology/2017/05/dont-trust-oauth-why-the-google-docs-worm-was-so-convincing/

Slide 45

Slide 45 text

https://accounts.google.com/oauth/authorize?response_ty

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

https://developers.google.com/terms/api-services-user-data-policy

Slide 52

Slide 52 text

https://developers.google.com/terms/api-services-user-data-policy

Slide 53

Slide 53 text

https://developers.google.com/terms/api-services-user-data-policy

Slide 54

Slide 54 text

https://support.google.com/cloud/answer/9110914

Slide 55

Slide 55 text

https://blog.context.io/context-io-deprecation-notice-ce8b77e6e477
 https://www.voice2biz.com/oauth-2-0-for-google-apis-3rd-party-audit-costs-require-emailmonkey-to-shutdown/
 https://help.ifttt.com/hc/en-us/articles/360020249393-Important-update-about-Gmail-on-IFTTT

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

@aaronpk FACEBOOK STOLEN ACCESS TOKENS improperly issued

Slide 58

Slide 58 text

@aaronpk 2018

Slide 59

Slide 59 text

@aaronpk "The vulnerability was the result of 
 the interaction of three distinct bugs" https://newsroom.fb.com/news/2018/09/security-update/ - Guy Rosen, VP of Product Management, Facebook

Slide 60

Slide 60 text

@aaronpk

Slide 61

Slide 61 text

@aaronpk

Slide 62

Slide 62 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 63

Slide 63 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 64

Slide 64 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 65

Slide 65 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 66

Slide 66 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 67

Slide 67 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 68

Slide 68 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 69

Slide 69 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs:

Slide 70

Slide 70 text

@aaronpk https://newsroom.fb.com/news/2018/09/security-update/ The vulnerability was the result of the interaction of three distinct bugs: ??!

Slide 71

Slide 71 text

@aaronpk By using the "View As" feature to see what your profile looks like to someone else, you would end up with an access token belonging to that user, which had the permissions of the Facebook mobile app.

Slide 72

Slide 72 text

@aaronpk Keep clean security boundaries even for internal applications

Slide 73

Slide 73 text

@aaronpk Don't let applications pretend
 to be other applications or other users

Slide 74

Slide 74 text

Thank You! @aaronpk aaronpk.com oauth2simplified.com