[하루한줄] 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 도메인 이름의 유효성을 검사하고 압축을 해제하는 작업을 다음 두 단계로 처리합니다.

  1. 압축되지 않은 도메인 이름 크기인 len을 계산하고 128 포인터가 넘어가거나 버퍼의 범위를 벗어나는 부분을 버립니다.
  2. 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에서 확인할 수 있습니다.