Heartbleed(CVE-2014-0160)

img

하트블리드는 2014년 4월에 발견된 오픈 소스 암호화 라이브러리인 OpenSSL의 소프트웨어 버그이다. OpenSSL의 확장규격 중 하나인 HeartBeat는 서버와 클라이언트 사이에 무슨 문제는 없는지 또는 안정적인 연결을 유지하기 위한 목적으로 일정 신호를 주고 받을 때 사용하는 확장규격이다. Heartbleed 취약점은 서버가 클라이언트로부터 전달받은 정보의 내용과 그 정보의 길이의 일치 여부를 검증하지 않은 채 정보를 보내주면서 문제가 발생한다.

이 취약점을 AFL을 이용하여 분석할 수 있는지 확인해보자.

Let's see HeartBleed

이전 문서에서 이용했던 afl-training 의 heartbleed 디렉토리를 사용했다.

Download AFL

이전에 afl을 쓰고 있긴 했는데, 웬만하면 오리지날을 쓰는 게 좋을 것 같아서 다시 다운받았다.

$ git clone https://github.com/google/AFL.git
$ cd AFL
$ make

Download OpenSSL

$ cd heartbleed
$ git clone https://github.com/openssl/openssl.git
$ cd openssl
$ git checkout OpenSSL_1_0_1f

취약점이 발견되었던 버전인 1.0.1f를 이용한다.

OpenSSL Build할 때, afl fuzzer를 이용하기 위해선 afl 자체적인 컴파일러를 이용해햐 한다. 따라서 다음과 같이 빌드한다.

$ CC=~/fuzzer/AFL/afl-clang CXX=~/fuzzer/AFL/afl-clang++ ./config -d
$ AFL_USE_ASAN=1 make

AFL_USE_ASAN 이라는 환경변수의 값을 1로 만들면, ASAN이라는 memory error detector가 바이너리에 붙게 된다(?).

Fuzzing!

이제 이 openssl의 취약점을 발견할 sample code를 만들어야 하지만 이미 handshake.cc라고 주어져 있다.

int main() {
  static SSL_CTX *sctx = Init();
  SSL *server = SSL_new(sctx);
  BIO *sinbio = BIO_new(BIO_s_mem());
  BIO *soutbio = BIO_new(BIO_s_mem());
  SSL_set_bio(server, sinbio, soutbio);
  SSL_set_accept_state(server);

  /* TODO: To spoof one end of the handshake, we need to write data to sinbio
   * here */
  BIO_write(sinbio, data, size);

  SSL_do_handshake(server);
  SSL_free(server);
  return 0;
}

여기 보면 write data를 하는 구문을 작성하라고 되어있는데 직접 작성해도 되고 ANSWERS.md에서 복붙해도 된다. 그렇게 handshake.cc를 수정하고 컴파일을 해주자.

$ AFL_USE_ASAN=1 ~/fuzzer/AFL/afl-clang++ -g handshake.cc openssl/libssl.a openssl/libcrypto.a -o handshake -I openssl/include -ldl

컴파일이 잘 된다. 이제 afl로 분석하는 일만 남았다!

$ mkdir in
$ echo 'AAAA' > in/a

간단한 seed 파일을 생성해주자.

$ ~/fuzzer/AFL/afl-fuzz -i in -o out -m none -- ./handshake
  • -m megs : memory limit for child process (50 MB)

image

image

unique crash가 발생했다!

l0z1k@ubuntu:~/fuzzer/training/challenges/heartbleed$ xxd out/crashes/id\:000000\,sig\:06\,src\:000006\,op\:arith8\,pos\:0\,val\:+25 
00000000: 1803 e800 0101                           ......

이렇게 간단한 데이터가 crash를 발생시켰다..

image

ASAN이 켜져 있어서 heap overflow가 났음을 알 수 있다.

'System Hacking' 카테고리의 다른 글

libFuzzer Training - (2) HeartBleed  (2) 2020.04.19
libFuzzer Training - (1) Start  (2) 2020.04.18
AFL Fuzzing Training - (1) Setup & Easy Example  (0) 2020.04.12

+ Recent posts