'웹소켓 보안 취약점 분석' 프로젝트의 첫번째 실습으로는 WebSocket의 기밀성/무결성 취약점 실습을 진행하게 되었다.
일단 Spring boot를 이용하여 웹소켓을 이용한 채팅 프로그램을 구현한다.
[소켓통신/websocket] Spring boot로 소켓통신 채팅 웹 페이지 만들기 - EUNII's BLOG
[소켓통신/websocket] Spring boot로 소켓통신 채팅 웹 페이지 만들기
1.Spring boot로 웹 소켓통신 채팅 페이지 만들기2. STS에서 Spirng project 만들기2.1 files - new - Spring Start Project 클릭 2.2 아래와 같이 입력(프로젝트 이름 등) - next클릭 2.3 Available에web 검색 후 WebSocket, Sprin
eunii.github.io
해당 글을 참고하여 웹소켓을 이용한 채팅 프로그램을 구현하였다.
구현한 채팅 프로그램이다.
채팅 시작하기를 누르고 텍스트를 입력한 후 보내기를 누르면
다른 창의 채팅에도 보낸 내용이 뜬다.
다른 두 창에서 채팅이 이루어지고 있는 것을 확인할 수 있다.
<body>
<h1>Chatting</h1>
<button onclick="connectWs()" id="startBtn">채팅 시작하기</button>
<input id="chatting"></input><button onclick="send()">보내기</button>
<div>
<p id="chat"></p>
</div>
</body>
</html>
코드를 살펴보면 "채팅 시작하기" 버튼을 누르면 'connect\s' 함수가 호출되어 웹소켓 연결을 시작한다.
사용자가 입력한 채팅 메세지는 입력창의 (#chatting)에서 보내기 버튼을 클릭하면 send 함수를 통해 서버로 전송되며, 받은 메시지는 #chat 요소에 추가된다.
<script type="text/javascript">
var ws;
function connectWs() {
ws = new WebSocket('ws://' + location.host + '/chat');
ws.onmessage = function(data) {
console.log(data.data);
$("<p>"+data.data+"</p>").prependTo('#chat');
}
$('#startBtn').hide();
}
function send() {
ws.send($("#chatting").val());
$('#chatting').val("");
}
</script>
- connectWs 함수는 웹소켓 연결을 설정하고, 메시지를 받을 때마다 화면에 출력한다.
- send 함수는 사용자가 입력한 메시지를 웹소켓을 통해 서버로 전송한다.
이 채팅 프로그램을 통해 확인해야 할 부분은 WebSocket의 기밀성/무결성 취약점이다.
보안은 기밀성 (confidentiality), 무결성 (intergrity), 가용성(availability) 라는 세가지 속성으로 나뉜다.
기밀성이란 인가된 사용자만 정보 자산에 접근할 수 있다는 것으로, 이를 위협하는 공격으로는 스누핑이나 트래픽 분석 등이 있다.
무결성이란 적절한 권한을 가진 사용자가 인가된 방법으로만 정보를 변경할 수 있다는 것을 의미한다.
무결성을 위협하는 공격으로는 변경, 가장 (masquerading), 재전송 (replying),부인(repudiation) 등이 있다.
가용성이란 필요한 시점에 정보 자산에 대한 접근이 언제든 가능하도록 하는 것이다.
이를 위협하는 공격으로는 DoS 공격 등이 있다.
기밀성/무결성 취약점 실습
다음은 WebSocket을 이용한 채팅 프로그램에서 기밀성/무결성 취약점을 확인하는 실습이다.
채팅 프로그램에서 채팅 시작하기를 누른 후 , '안녕' , '안녕하세요' 라는 텍스트를 보냈을 때 wireshark로 패킷을 확인한다.
wireshark에서 websocket 패킷만 볼 수 있게 websocket으로 필터링한다.
패킷을 확인해보면 통신 중에 frame에 노출되는 평문 데이터를 확인할 수 있다.
데이터를 보낼 때 암호화하지 않고 보낼 경우, 확인한 것과 같이 데이터가 노출되어 기밀성 취약점이 발생한다.
그리고 데이터가 노출되고, 그 데이터의 변조 여부를 확인할 수 없기 때문에 무결성 취약점이 발생하게 된다.
기밀성/무결성 취약점이 발생하는 이유
WebSocket에서 기밀성/무결성 취약점이 발생하는 이유는 암호화 부재와 무결성 검증 부재로 볼 수 있다.
웹소켓은 기본적으로 암호화를 제공하지 않는다. 데이터나 패킷이 중간에서 가로채질 경우 제 3자는 데이터를 읽을 수 있게 되고, 특히 HTTP로 연결되는 경우에는 데이터가 평문으로 전송되므로 데이터가 노출될 위험이 있다.
그리고 웹소켓은 데이터 무결성을 위한 추가적인 보호 매커니즘을 제공하지 않기 때문에, 데이터가 중간에 조작되거나 변조될 경우, 수신자가 이를 감지할 방법이 없다.
보완 방법
이러한 기밀성/무결성 취약점을 보완하기 위한 방법은 다음과 같다.
1. TLS/SSL 사용 (암호화)
2. 데이터 무결성 검증
: 무결성을 강화하기 위해서 메시지에 대한 무결성 검증을 수행할 수 있다. 메시지에 해시 함수를 적용하여, 해시값을 계산하고 수신측에서 이를 검증하여 데이터의 무결성을 확인하는 등으로 진행할 수 있다.
3. 보안 헤더 및 토큰 사용
: 웹 소켓 메시지에 기밀성과 무결성을 더 강화하기 위해서 보안 헤더나 토큰을 사용할 수 있다.
예를 들면, 서버에서 클라이언트로 메시지를 보낼 때, 메시지에 서명을 추가하여 무결성을 검증할 수 있다.
4. WebSocket 확장 사용
: Secure WebSocket (WebSocket Secure ,WSS)를 사용하는 등의 확장을 통해 추가적인 보안 기능을 제공할 수 있다.
우선, TLS/SSL 에 대해서 자세하게 알아보자.
TLS/SSL
웹소켓 통신에서 TLS/SSL (HTTPS)를 사용하여 데이터를 암호화한다.
TLS/SSL을 사용하면 데이터의 기밀성을 제공하고, 중간에서의 데이터 감청을 방지할 수 있다.
- SSL: 보안 소켓 계층, 웹 사이트와 브라우저 사이에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술
해커가 개인 데이터나 금융 데이터 등의 전송되는 정보를 보거나 훔치는 것을 방지한다.
- TLS: 전송 계층 보안, SSL의 향상된 버전
- HTTPS: 하이퍼 텍스트 전송 프로토콜 보안, 웹 사이트가 SSL/TLS 인증서로 보호되는 경우 HTTPS가 URL에 표시된다.
SSL/TLS의 원칙
-보안 통신은 상대방과 보안 연결을 하고, 공개키를 교환하는 TLS handshake로 시작한다.
-TLS handshake 중에 세션키를 생성하고, 세션 키는 TLS handshake 이후의 모든 통신을 암호화하고 해독한다.
-새 세션마다 다른 세션 키가 통신을 암호화하는데 사용된다.
-TLS는 서버 측의 사용자가 상호작용하는 웹 사이트가 실제 웹 사이트인지 확인한다.
-TLS는 메세지 인증 코드(MAC)가 전송에 포함되어 있으므로 데이터가 변경되지 않았음을 보장한다. -> 무결성 취약점 보완
---> TLS를 사용하면 사용자가 웹사이트에 전송하는 HTTP 데이터와 웹사이트가 사용자에게 전송하는 HTTP데이터가 모두 암호화된다. 암호화된 데이터는 수신자가 키를 이용하여 해독해야 한다.
TLS Handshake
:TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스로 클라이언트와 서버가 교환하는 일련의 데이터 그램, 즉 메시지이다. TLS Handshake 중에, 통신 양측에서는 메세지를 교환하여 서로를 인식, 검증하고 암호화 알고리즘을 구성하고 세션키를 합의한다.
TLS Handshake 는 사용자가 HTTPS를 통해 웹사이트를 탐색하고, 브라우저가 웹사이트의 원본 서버를 쿼리하기 시작할 때마다 발생한다.
TLS Handshake 작동 단계
1. ClientHello 메시지
: 클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 시작한다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함된다.
2. ServerHello 메시지
: 클라이언트 헬로 메시지에 대한 응답으로 서버가 서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송한다.
3. 인증
: 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증한다.. 이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인한다.
4.예비 마스터 암호
: 클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송한다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있다.
5.개인 키 사용
: 서버가 예비 마스터 암호를 해독한다.
6. 세션 키 생성
: 클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성한다. 모두 같은 결과가 나와야 한다.
7. 클라이언트 준비 완료
: 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송한다.
8. 서버 준비 완료
: 서버가 세션 키로 암호화된 "완료" 메시지를 전송한다.
9. 안전한 대칭 암호화 성공
: 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행된다.
다음 단계를 통해, TLS Handshake 가 동작하고, 안전한 소켓 통신이 가능하게 된다.
WebSocket은 기본적으로 암호화와 데이터 무결성을 위한 보호 메커니즘을 제공하지 않기 때문에, 기밀성과 무결성 취약점이 발생한다.
따라서 이를 보완하기 위하여 TLS/SSL을 통해 암호화를 하고, 보안 헤더 및 토큰을 사용하는 등의 방법을 통하여 이러한 취약점을 보완할 수 있다.
이번 실습에서는 기본적인 WebSocket에서 발생할 수 있는 기밀성/무결성 취약점에 대해서 알아봤고, 이를 보완할 수 있는 방법에 대해서 알아봤다.
다음 실습은 WebSocket Connection Smuggling 실습으로 진행할 예정이다.
[참고]
TLS 핸드셰이크란? | 세션키 교환 | Cloudflare
'INCOGNITO 2023' 카테고리의 다른 글
[WebSocket] WebSocket 취약점 확인 스크립트 (0) | 2024.02.11 |
---|---|
[WebSocket] CORS 취약점 분석 (0) | 2024.02.11 |
[WebSocket] XSS 취약점과 WebSocket 핸드셰이크 조작 (0) | 2024.02.04 |
[WebSocket] Cross-site WebSocket hijacking (0) | 2024.02.04 |
WebSocket 보안 취약점 분석 (0) | 2024.01.19 |