🇰🇷 한글 설명
NLnet Labs Unbound 1.15.0부터 1.25.1까지 DNS-over-TLS(DoT) 포워딩 쿼리에 사용되는 TLS 서버 이름이 'serviced_query' 구조체의 수명에 묶여 있으나 'waiting_tcp' 구조체에서도 참조됩니다. 소유 구조체가 DoT TCP 핸드셰이크 중 메시에서 밀려나면 참조 문자열의 메모리가 해제되고, 이후 TLS 스트림 오류 시 해제된 포인터를 역참조하여 데몬이 충돌하면서 서비스 거부가 발생합니다. 영향을 받으려면 DoT용 stub/forward 존과 서버 식별자에 '#authname' 접미사가 설정되어 있어야 합니다.
💡 쉬운 설명
DNS 서버 프로그램 Unbound가 특정 조건에서 메모리 오류를 일으켜 갑자기 종료될 수 있는 취약점입니다. 공격자가 서버에 많은 부하를 주면서 정확한 타이밍에 네트워크 오류를 유도하면 DNS 서비스가 중단될 수 있습니다.
🇺🇸 원문 (English)
In NLnet Labs Unbound 1.15.0 up to and including 1.25.1, the TLS server name used for DNS-over-TLS (DoT) forwarded queries is tied to a struct's ('serviced_query') lifetime but also referenced by another struct ('waiting_tcp'). When the owning struct is jostled out of the mesh while the DoT TCP stream is still handshaking it frees the storage behind the referenced string and if the TLS stream then errors out, it dereferences the freed pointer. The dereference is read-only and the practical impact is a daemon crash resulting in denial of service. A malicious actor that knows a DoT forwarding/stub Unbound's configuration could exploit the vulnerability by quering records in the appropriate zone while keeping Unbound uder pressure so that the jostle logic kicks in. If answers for the vulnerable zone are slow, the likelihood of jostling such queries is higher, although the timing of the jostle needs to be precise. Requirements for a vulnerable Unbound is the existence of a stub/forward zone configured for DoT together with a configured '#authname' suffix on the server identification. The connectivity to the server needs to exhibit a transient failure at the correct time in order to kick off the vulnerable error path.
📍 영향받는 시스템
Unbound 1.15.0 ~ 1.25.1 (DoT 포워딩/stub 존 및 #authname 설정 사용 환경)
⚔️ 공격 벡터
DoT 포워딩 존에 대한 쿼리를 대량으로 보내 부하를 유발하고, 정밀한 타이밍에 TLS 연결 실패를 일으켜 데몬 충돌(DoS)을 유도
🛡️ 대응 방법
Unbound를 1.25.2 이상(해당 패치 버전)으로 업데이트하고, 패치 전까지 DoT 포워딩에서 #authname 사용을 제한
🔧 검증 코드
출력된 버전이 1.15.0 이상 1.25.1 이하이면 취약하므로 패치가 필요하며, 1.25.2 이상이면 해당 취약점에서 벗어난 것입니다.
unbound -V 2>/dev/null | head -1