Merge commit from fork

DoH, DoQ, and DNS-over-gRPC unpack messages without the acceptance
checks used by UDP and TCP. An unauthenticated request with a large
QDCOUNT can therefore force excessive allocations while names are
decoded and exhaust server memory.

Enforce the same request policy across all server transports.

Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
This commit is contained in:
Ville Vesilehto
2026-07-16 03:54:46 +03:00
committed by GitHub
parent d5e54040ff
commit 530b0a5ff2
5 changed files with 66 additions and 8 deletions

View File

@@ -0,0 +1,24 @@
package dnsutil
import (
"encoding/binary"
"errors"
"github.com/miekg/dns"
)
var errRequestRejected = errors.New("dns request rejected")
// UnpackRequest unpacks a request after applying the default miekg/dns request policy.
func UnpackRequest(msg []byte) (*dns.Msg, error) {
var header dns.Header
if _, err := binary.Decode(msg, binary.BigEndian, &header); err != nil {
return nil, dns.ErrBuf
}
if dns.DefaultMsgAcceptFunc(header) != dns.MsgAccept {
return nil, errRequestRejected
}
request := new(dns.Msg)
return request, request.Unpack(msg)
}