You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@startumltitleCSRF Attack on OAuth 2.0 - Fraud to Bind WeChat Account - Problemactorattackeras"Attacker"actoruseras"User"participantgeekbang_clientas"Geekbang Client"participantauth_serveras"WeChat AuthServer"collectionsprotected_resourceas"ProtectedResource"attacker->geekbang_client: Request to bind **Attacker's WeChat account**
activateattackeractivategeekbang_clientattacker<--geekbang_client: 1. Redirect User to AuthServer
deactivategeekbang_clientattacker->auth_server: Load AuthServer for authentication with redirect_uri = **https://geekbang.com/client/callback**
activateauth_serverattacker<--auth_server: 2. authorization code = **codeA** for **Attacker's WeChat account**
deactivateauth_servernoteoverattacker
Attacker DO NOT
exchange for access_token
with given authorization code DELIBERATELY.
endrnoteattacker-x geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA**
deactivateattacker==Soon==user<->geekbang_client: Login via username & password
activateuser'user -> geekbang_client: Request to bind **User's WeChat account**'activate geekbang_client'user <-- geekbang_client: 1. Redirect User to AuthServer'deactivate geekbang_client''user -> auth_server: Load AuthServer for authentication \n with redirect_uri = **https://geekbang.com/client/callback**'activate auth_server'user <-- auth_server: 2. authorization code = **codeB**'deactivate auth_server''note over user' User DO NOT' exchange for access_token' with given authorization code IN TIME.'endrnote''user -x geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeB**user->user: Do something else
rnoteoveruser
Attacker induces User to click the link to
**https://geekbang.com/client/callback?code=codeA**
endrnoteuser->geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA**
activategeekbang_clientdeactivateusergeekbang_client->auth_server: 3. Exchange for access_token \n with given authorization code = **codeA**
activateauth_servergeekbang_client<--auth_server: 4. Return **access_token** \n for **User's Geekbang account** \n bound to **Attacker's WeChat account**
deactivateauth_serverdeactivategeekbang_clientrnoteovergeekbang_client
User's Geekbang Account is bound to Attacker's WeChat account.
endrnote==Later==rnoteovergeekbang_client
Attacker can social-login User's Geekbang account via Attacker's WeChat account NOW!
endrnoteattacker->geekbang_client: Login via Attacker's WeChat account
activateattackeractivategeekbang_clientattacker<--geekbang_client: 1. Redirect User to AuthServer
deactivategeekbang_clientattacker->auth_server: Load AuthServer for authentication with redirect_uri = **https://geekbang.com/client/callback**
activateauth_serverattacker<--auth_server: 2. authorization code = **codeC** for **Attacker's WeChat account**
deactivateauth_serverattacker->geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeC**
activategeekbang_clientgeekbang_client->auth_server: 3. Exchange for access_token \n with given authorization code = **codeC**
activateauth_servergeekbang_client<--auth_server: 4. Return **access_token** \n for **User's Geekbang account** \n bound to **Attacker's WeChat account**
deactivateauth_serverattacker->geekbang_client: Do something bad: \n e.g. access User's private data
geekbang_client->protected_resource: Load ProtectedResource for User's private data \n witch **access_token**
activateprotected_resourcegeekbang_client<--protected_resource: User's private data
deactivateprotected_resourcedeactivategeekbang_clientdeactivateattacker@enduml
Solution: Random STATE
User hasn't requested to bind WeChat account
@startumltitleCSRF Attack on OAuth 2.0 - Fraud to Bind WeChat Account - Solution: Random STATEactorattackeras"Attacker"actoruseras"User"participantgeekbang_clientas"Geekbang Client"participantauth_serveras"WeChat AuthServer"attacker->geekbang_client: Request to bind **Attacker's WeChat account**
activateattackeractivategeekbang_clientattacker<--geekbang_client: 1. Redirect User to AuthServer
deactivategeekbang_clientattacker->auth_server: Load AuthServer for authentication with redirect_uri = **https://geekbang.com/client/callback**
activateauth_serverattacker<--auth_server: 2. authorization code = **codeA** for **Attacker's WeChat account**
deactivateauth_servernoteoverattacker
Attacker DO NOT
exchange for access_token
with given authorization code DELIBERATELY.
endrnoteattacker-x geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA**
deactivateattacker==Soon==user<->geekbang_client: Login via username & password
activateuseruser->user: Do something else
rnoteoveruser
Attacker induces User to click the link to
**https://geekbang.com/client/callback?code=codeA&state=stateA**
endrnoteuser->geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA** \n and state = **stateA**
deactivateuseractivategeekbang_clientgeekbang_client-x geekbang_client: Load original state, which **doesn't exist**, from storage \n and compare with current state = **stateA**
rnoteovergeekbang_client
Abort becuase state DOES NOT match!
endrnotegeekbang_client-x auth_server: 3. Exchange for access_token \n with given authorization code = **codeA**
deactivategeekbang_clientrnoteovergeekbang_client
State protects User!
endrnote@enduml
User requested to bind WeChat account
@startumltitleCSRF Attack on OAuth 2.0 - Fraud to Bind WeChat Account - Solution: Random STATEactorattackeras"Attacker"actoruseras"User"participantgeekbang_clientas"Geekbang Client"participantauth_serveras"WeChat AuthServer"attacker->geekbang_client: Request to bind **Attacker's WeChat account**
activateattackeractivategeekbang_clientattacker<--geekbang_client: 1. Redirect User to AuthServer
deactivategeekbang_clientattacker->auth_server: Load AuthServer for authentication with redirect_uri = **https://geekbang.com/client/callback**
activateauth_serverattacker<--auth_server: 2. authorization code = **codeA** for **Attacker's WeChat account**
deactivateauth_servernoteoverattacker
Attacker DO NOT
exchange for access_token
with given authorization code DELIBERATELY.
endrnoteattacker-x geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA**
deactivateattacker==Soon==user<->geekbang_client: Login via username & password
activateuseruser->geekbang_client: Request to bind **User's WeChat account**
activategeekbang_clientgeekbang_client->geekbang_client: Generate random state = **stateB** \n and save in storage
user<--geekbang_client: 1. Redirect User to Auth Server with state = **stateB**
deactivategeekbang_clientuser->auth_server: Load AuthServer for authentication \n with redirect_uri = **https://geekbang.com/client/callback** \n and state = **stateB**
activateauth_serveruser<--auth_server: 2. authorization code = **codeB** \n and state = **stateB**
deactivateauth_servernoteoveruser
User DO NOT
exchange for access_token
with given authorization code IN TIME.
endrnoteuser-x geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeB** \n and state = **stateB**
rnoteoveruser
Attacker induces User to click the link to
**https://geekbang.com/client/callback?code=codeA&state=stateA**
endrnoteuser->geekbang_client: Redirect to Geekbang Client redirect_uri \n with authorization code = **codeA** \n and state = **stateA**
deactivateuseractivategeekbang_clientgeekbang_client-x geekbang_client: Load original state = **stateB** from storage \n and compare with current state = **stateA**
rnoteovergeekbang_client
Abort becuase state DOES NOT match!
endrnotegeekbang_client-x auth_server: 3. Exchange for access_token \n with given authorization code = **codeA**
deactivategeekbang_clientrnoteovergeekbang_client
State protects User!
endrnote@enduml