mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-16 13:17:19 +02:00
cmd/cli: discard upstream answers whose question mismatches the request
Defense in depth against cache poisoning: a compromised or misbehaving upstream can return an answer for a different name than was asked (e.g. records for attacker.example in response to a query for victim.example). Such an answer would be cached under the legitimate request key and served to subsequent queries. Validate that the upstream answer echoes the request's question (case-insensitive name plus Qtype/Qclass, per RFC 1035 section 4.1.2) before serving or caching it. A mismatch is logged at debug level and the upstream is skipped, failing safe to the next upstream or SERVFAIL. Refs github.com/Control-D-Inc/ctrld/issues/322
This commit is contained in:
+2
-2
@@ -748,7 +748,7 @@ func TestDoQResolve_PreservesRcode(t *testing.T) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
pool := newDOQConnPool(uc, []string{"127.0.0.1"})
|
||||
pool := newDOQConnPool(ctx, uc, []string{"127.0.0.1"})
|
||||
t.Cleanup(pool.CloseIdleConnections)
|
||||
|
||||
msg := new(dns.Msg)
|
||||
@@ -797,7 +797,7 @@ func TestDoQResolve_PreservesWrongQuestion(t *testing.T) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
pool := newDOQConnPool(uc, []string{"127.0.0.1"})
|
||||
pool := newDOQConnPool(ctx, uc, []string{"127.0.0.1"})
|
||||
t.Cleanup(pool.CloseIdleConnections)
|
||||
|
||||
msg := new(dns.Msg)
|
||||
|
||||
Reference in New Issue
Block a user