# WebSocket
웹 소켓은 웹 페이지에서 실시간으로 동작하는 웹 서비스를 만들어 줄 수 있는 표준 기술이다. (예를 들면, 채팅과 같은)
일반적으로 웹 프로토콜인 HTTP는 Request와 Response 기반으로 새로 요청이 발생하면 페이지를 다시 그려야 하는 구조이다. 이와 같은 환경아래서 인증 정보를 유지하기 위해, 쿠키도 사용되게 되었다.
http://www.websocket.org 에서 많은 내용을 확인 할 수 있다.
즉, 사용자는 페이지의 이동없이 내부 동작을 처리하길 원했고, 이 때문에 WebSocket 이 사용되게 되었다. (이는 HTML5의 표준으로 올라가게 되었다.)
아래와 같이 Upgrade 헤더와 connect 헤더에 각각 WebSocket, Upgrade 가 들어있는 것을 볼 수 있다. 이는 HTTP 기반 웹 처리에서 WebSocket으로 넘어가게 하는 구절이며, 이와 동시에 클라이언트가 랜덤한 키 값을 서버로 보내어 토큰을 생성하고 반환하는 과정, 즉, Handshake가 이루어진다.
GET /.... HTTP/1.1
Upgrade:WebSocket
Connection: Upgrade
Request
GET /?encoding=text HTTP/1.1
Host: echo.websocket.org
origin:http://www.websocket.org
Sec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw== -> BASE64(Random Byte)
Connection: keep-alive, Upgrade
Upgrade:WebSocket
Response
HTTP/1.1 101 Switching Protocols
Upgrade:WebSocket
Sec-WebSocket-Accept:
HSmrc0sMlYUkAGmm5OPpG2HaGWk= -> BASE64(SHA1(GUID))
Sec-WebSocket-Key와 Sec-WebSocket-Accept 부분은 개인정보 보호 및 무결성 검증을 위해서 사용되는 부분이다.
# Cross-Site WebSocket Hijacking
CSWSH 에서는 origin 필드가 핵심이다.
origin 은
- WebSocket 접속을 요청한 페이지의 scheme, hostname, port(만약 기본포트가 아닐 경우에만 포함) 정보
- WebSocket 서버에서 요청 페이지에 따라 다른 처리방식을 각각 결정하기 위해 필요한 정보이다.
때문에, 당연히 서버에서 제대로 대응하고 있다면 서버에서 관리하고 있는 origin 이 아닐 경우 cross-protocol attack 이나 cross-site webSocket hijacking 으로 간주하고 접속이 중지 될 것이다.
이름에서도 드러나지만 이 공격은 CSRF 와 유사하다. 로그인 한 사용자의 request 를 변조하여 victim의 세션값을 갈취 할 수 있기 때문이다.
# 검증 방법
검증 방법 역시 굉장히 간단하다. origin 의 url 을 다른것으로 변조했는데, HTTP/1.1 101 Switching protocols 메시지를 받으면 해당 서버는 취약한 것이다.
<출처 - notsosecure.com>
** 추가 **
CSWSH 에 얽힌 슬픈 이야기 <https://hackerone.com/reports/274324>
어떤 버그바운터가 CSWSH 취약점을 잡았는데, 보안담당자가 "그래, handshake 까지는 그렇다 치고, 너 origin 바꾸는걸로 어떤 해킹을 할 수 있는데? 아니면 사용자 민감데이터를 다른 서버에 보낼 수 있어? 라고 압박을 했다. 어려보이는 버그 바운터는 바로 꼬리를 내렸다. 이유가 뭘까. 어렵다.
보안 담당자가 증거로 내세운 자료는 https://github.com/meteor/meteor/issues/8317 이거다. 나중에 읽어봐야지
# 참조
- https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html
- https://www.notsosecure.com/how-cross-site-websocket-hijacking-could-lead-to-full-session-compromise/
- http://www.hahwul.com/2016/08/coding-websocket-overview-protocolapi.html