
DHCP 옵션 119를 구문 분석할 때 발생하는 FreeBSD dhclient 힙 기반 버퍼 오버플로우 취약점에 대한 재현 PoC (CVE-2020-7461)
저자: Moshe Kol, Shlomi Oberman
FreeBSD dhclient의 DHCP 옵션 119 파싱 시 힙 기반 버퍼 오버플로우 취약점(CVE-2020-7461)에 대한 재현 PoC입니다.
문제는 sbin/dhclient/options.c 파일의 find_search_domain_name_len 함수에 있습니다.
이 함수는 서버로부터 DHCP 옵션 119(도메인 검색, RFC 3397)가 제공될 때 expand_domain_search에 의해 호출됩니다.
압축 방식이 사용될 때, find_search_domain_name_len 함수는 가리키는 위치부터 재귀적으로 호출되지만, 재귀 호출의 반환 값을 확인하지 않습니다. 재귀 호출이 실패하면 -1의 반환 값이 사용되며, 이 값은 누적 길이 변수에 단순히 추가됩니다.
다음은 버그가 있는 코드입니다(옵션.c, 299-301줄, 마지막 커밋 70066b9):
299: pointed_len = find_search_domain_name_len(option,
300: &pointer);
301: domain_name_len += pointed_len;
이후 expand_domain_search 함수에서 find_search_domain_name_len으로 계산된 길이로 버퍼가 할당되고, 그런 다음 expand_search_domain_name 함수를 사용하여 확장된 이름이 이 버퍼에 기록됩니다. 후자의 함수는 압축 방식의 포인터 값에 대한 검사가 없기 때문에 할당된 버퍼를 초과하여 쓸 수 있습니다.
FreeBSD 보안 권고는 여기에서 확인할 수 있습니다.