[하루한줄] CVE-2021-23017: nginx DNS Resolver Off-by-One Heap Write Vulnerability
URL
Advisory X41-2021-002: nginx DNS Resolver Off-by-One Heap Write Vulnerability
Target
- nginx 0.6.18 - 1.20.0
Explain
오픈 소스 웹 서버 프로그램 nginx의 ngx_resolver_copy()
에서 DNS response를 처리하는 동안 발생하는 off-by-one으로 인해 heap 영역의 1-byte 메모리를 덮어쓸 수 있는 취약점이 발견되었습니다.
ngx_resolver_copy()
는 DNS response에 포함된 DNS 도메인 이름의 유효성을 검사하고 압축을 해제하는 작업을 다음 두 단계로 처리합니다.
- 압축되지 않은 도메인 이름 크기인
len
을 계산하고 128 포인터가 넘어가거나 버퍼의 범위를 벗어나는 부분을 버립니다. - Output buffer를 할당하고 압축되지 않은 이름을 복사합니다.
이 과정에서 1번의 len
과 2번에 압축되지 않은 이름의 크기가 달라 name->data
에서 1 바이트를 벗어나 덮어쓸 수 있습니다.
nginx DNS response를 받기 위해 DNS request를 보낸 후, QNAME
, NAME
, RDATA
중 하나의 값을 통해 해당 취약점을 트리거할 수 있습니다. 또한 CNAME
을 사용할 경우 재귀적으로 처리되어 ngx_resolve_name_locked()
가 호출될 때 추가적인 OOB write가 가능하고 ngx_resolver_dup()
과 ngx_crc32_short()
를 통해 OOB read가 가능합니다.
해당 취약점의 POC 코드는 github에서 확인할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.