Heartbleed(CVE-2014-0160)
하트블리드는 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)
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를 발생시켰다..
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 |