mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	fix(grpc): enforce DNS message size limits (#7490)
Add DNS wire size validation for requests/replies. Limit gRPC recv/send via default call options, accounting necessary framing/protobuf overhead. An error is returned for oversized messages. Add test. Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
This commit is contained in:
		| @@ -5,6 +5,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"net" | ||||
| 	"path" | ||||
| 	"slices" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/coredns/caddy" | ||||
| @@ -61,6 +62,33 @@ func TestProxy(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestProxy_RejectsOversizedReply(t *testing.T) { | ||||
| 	p := &Proxy{} | ||||
| 	oversized := make([]byte, maxDNSMessageBytes+1) | ||||
| 	p.client = testServiceClient{dnsPacket: &pb.DnsPacket{Msg: oversized}, err: nil} | ||||
| 	_, err := p.query(context.TODO(), new(dns.Msg)) | ||||
| 	if !errors.Is(err, ErrDNSMessageTooLarge) { | ||||
| 		t.Fatalf("expected %v, got %v", ErrDNSMessageTooLarge, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestProxy_RejectsOversizedRequest(t *testing.T) { | ||||
| 	p := &Proxy{} | ||||
| 	p.client = testServiceClient{dnsPacket: &pb.DnsPacket{Msg: []byte("ok")}, err: nil} | ||||
|  | ||||
| 	oversizedMsg := &dns.Msg{} | ||||
| 	oversizedMsg.SetQuestion("example.org.", dns.TypeA) | ||||
| 	oversizedMsg.Extra = slices.Repeat([]dns.RR{&dns.TXT{ | ||||
| 		Hdr: dns.RR_Header{Name: "example.org.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 300}, | ||||
| 		Txt: []string{"very long text record to make the message oversized when packed"}, | ||||
| 	}}, 2000) | ||||
|  | ||||
| 	_, err := p.query(context.TODO(), oversizedMsg) | ||||
| 	if !errors.Is(err, ErrDNSMessageTooLarge) { | ||||
| 		t.Fatalf("expected %v, got %v", ErrDNSMessageTooLarge, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type testServiceClient struct { | ||||
| 	dnsPacket *pb.DnsPacket | ||||
| 	err       error | ||||
|   | ||||
		Reference in New Issue
	
	Block a user