개요

OpenSSL에서 사용하는 HeartBeat는 서버와 클라이언트 사이에 정상적으로 연결이 존재하는지 확인하기 위한 프로토콜이다. HeartBeat는 주기적으로 클라이언트에서 서버에게 랜덤한 정보를 정보의 길이와 함께 서버에 전송한다. 그후 서버는 그 요청에대한 echo를 보냄으로써 서버가 정상 작동한다는 것을 알려준다.

클라이언트 (사과 2글자) -> 서버 (사과)

이때 이 취약점은 Bound check를 하지 않은 것에서 이루어진다. 만약 클라이언트가 (사과 10글자) 라고 보내게 되면 서버는 bound check를 하지 않은채 자신의 버퍼 즉 메모리에 가지고 있던 내용까지 함께 지속적으로 요청마다 전송하게 된다.

클라이언트 (사과 10글자) -> 서버 (사과 + 중요한정보의부분)

그러나 이 HeartBeat는 최대 64KB의 메시지만을 전송할 수 있다. 즉 한번에 정보가 leak되지는 않지만 지속적인 공격으로 서버가 가지고 있는 trusted domain의 정보를 가져올 수 있게 되는 것이다.

참고

  1. https://en.wikipedia.org/wiki/Heartbleed