Blame SOURCES/bind-9.16-CVE-2022-2795.patch

bcb1e2
From bf2ea6d8525bfd96a84dad221ba9e004adb710a8 Mon Sep 17 00:00:00 2001
bcb1e2
From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= <michal@isc.org>
bcb1e2
Date: Thu, 8 Sep 2022 11:11:30 +0200
bcb1e2
Subject: [PATCH] Bound the amount of work performed for delegations
bcb1e2
bcb1e2
Limit the amount of database lookups that can be triggered in
bcb1e2
fctx_getaddresses() (i.e. when determining the name server addresses to
bcb1e2
query next) by setting a hard limit on the number of NS RRs processed
bcb1e2
for any delegation encountered.  Without any limit in place, named can
bcb1e2
be forced to perform large amounts of database lookups per each query
bcb1e2
received, which severely impacts resolver performance.
bcb1e2
bcb1e2
The limit used (20) is an arbitrary value that is considered to be big
bcb1e2
enough for any sane DNS delegation.
bcb1e2
bcb1e2
(cherry picked from commit 3a44097fd6c6c260765b628cd1d2c9cb7efb0b2a)
bcb1e2
---
bcb1e2
 lib/dns/resolver.c | 12 ++++++++++++
bcb1e2
 1 file changed, 12 insertions(+)
bcb1e2
bcb1e2
diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c
bcb1e2
index d2cf14bbc8..73a0ee9f77 100644
bcb1e2
--- a/lib/dns/resolver.c
bcb1e2
+++ b/lib/dns/resolver.c
bcb1e2
@@ -195,6 +195,12 @@
bcb1e2
  */
bcb1e2
 #define NS_FAIL_LIMIT 4
bcb1e2
 #define NS_RR_LIMIT   5
bcb1e2
+/*
bcb1e2
+ * IP address lookups are performed for at most NS_PROCESSING_LIMIT NS RRs in
bcb1e2
+ * any NS RRset encountered, to avoid excessive resource use while processing
bcb1e2
+ * large delegations.
bcb1e2
+ */
bcb1e2
+#define NS_PROCESSING_LIMIT 20
bcb1e2
 
bcb1e2
 /* Number of hash buckets for zone counters */
bcb1e2
 #ifndef RES_DOMAIN_BUCKETS
bcb1e2
@@ -3711,6 +3717,7 @@ fctx_getaddresses(fetchctx_t *fctx, bool badcache) {
bcb1e2
 	bool need_alternate = false;
bcb1e2
 	bool all_spilled = true;
bcb1e2
 	unsigned int no_addresses = 0;
bcb1e2
+	unsigned int ns_processed = 0;
bcb1e2
 
bcb1e2
 	FCTXTRACE5("getaddresses", "fctx->depth=", fctx->depth);
bcb1e2
 
bcb1e2
@@ -3902,6 +3909,11 @@ normal_nses:
bcb1e2
 
bcb1e2
 		dns_rdata_reset(&rdata);
bcb1e2
 		dns_rdata_freestruct(&ns);
bcb1e2
+
bcb1e2
+		if (++ns_processed >= NS_PROCESSING_LIMIT) {
bcb1e2
+			result = ISC_R_NOMORE;
bcb1e2
+			break;
bcb1e2
+		}
bcb1e2
 	}
bcb1e2
 	if (result != ISC_R_NOMORE) {
bcb1e2
 		return (result);
bcb1e2
-- 
bcb1e2
2.37.3
bcb1e2