dnsmasq: backport official fix for CVE-2017-13704
Remove LEDE partial fix for CVE-2017-13704. Backport official fix from upstream. Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> Signed-off-by: Hans Dedecker <dedeckeh@gmail.com> (PKG_RELEASE increase)
This commit is contained in:
		 Kevin Darbyshire-Bryant
					Kevin Darbyshire-Bryant
				
			
				
					committed by
					
						 Hans Dedecker
						Hans Dedecker
					
				
			
			
				
	
			
			
			 Hans Dedecker
						Hans Dedecker
					
				
			
						parent
						
							f12a5b8f6d
						
					
				
				
					commit
					9a753c49ea
				
			| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | |||||||
|  |  | ||||||
| PKG_NAME:=dnsmasq | PKG_NAME:=dnsmasq | ||||||
| PKG_VERSION:=2.77 | PKG_VERSION:=2.77 | ||||||
| PKG_RELEASE:=10 | PKG_RELEASE:=11 | ||||||
|  |  | ||||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | ||||||
| PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/ | PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/ | ||||||
|   | |||||||
| @@ -0,0 +1,94 @@ | |||||||
|  | From 63437ffbb58837b214b4b92cb1c54bc5f3279928 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Simon Kelley <simon@thekelleys.org.uk> | ||||||
|  | Date: Wed, 6 Sep 2017 22:34:21 +0100 | ||||||
|  | Subject: [PATCH] Fix CVE-2017-13704, which resulted in a crash on a large DNS | ||||||
|  |  query. | ||||||
|  |  | ||||||
|  | A DNS query recieved by UDP which exceeds 512 bytes (or the EDNS0 packet size, | ||||||
|  | if different.) is enough to cause SIGSEGV. | ||||||
|  | --- | ||||||
|  |  CHANGELOG     |    7 +++++++ | ||||||
|  |  src/auth.c    |    5 ----- | ||||||
|  |  src/forward.c |    8 ++++++++ | ||||||
|  |  src/rfc1035.c |    5 ----- | ||||||
|  |  4 files changed, 15 insertions(+), 10 deletions(-) | ||||||
|  |  | ||||||
|  | diff --git a/CHANGELOG b/CHANGELOG | ||||||
|  | index 3a640f3..7e65912 100644 | ||||||
|  | --- a/CHANGELOG | ||||||
|  | +++ b/CHANGELOG | ||||||
|  | @@ -17,6 +17,13 @@ version 2.78 | ||||||
|  |  	--strict-order active. Thanks to Hans Dedecker | ||||||
|  |  	for the patch | ||||||
|  |   | ||||||
|  | +	Fix regression in 2.77, ironically added as a security | ||||||
|  | +	improvement, which resulted in a crash when a DNS | ||||||
|  | +	query exceeded 512 bytes (or the EDNS0 packet size, | ||||||
|  | +	if different.) Thanks to Christian Kujau, Arne Woerner | ||||||
|  | +	Juan Manuel Fernandez and Kevin Darbyshire-Bryant for | ||||||
|  | +	chasing this one down.  CVE-2017-13704 applies. | ||||||
|  | + | ||||||
|  |  	 | ||||||
|  |  version 2.77 | ||||||
|  |  	Generate an error when configured with a CNAME loop, | ||||||
|  | diff --git a/src/auth.c b/src/auth.c | ||||||
|  | index 2c24e16..7f95f98 100644 | ||||||
|  | --- a/src/auth.c | ||||||
|  | +++ b/src/auth.c | ||||||
|  | @@ -119,11 +119,6 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n | ||||||
|  |    struct cname *a, *candidate; | ||||||
|  |    unsigned int wclen; | ||||||
|  |     | ||||||
|  | -  /* Clear buffer beyond request to avoid risk of | ||||||
|  | -     information disclosure. */ | ||||||
|  | -  memset(((char *)header) + qlen, 0,  | ||||||
|  | -	 (limit - ((char *)header)) - qlen); | ||||||
|  | -   | ||||||
|  |    if (ntohs(header->qdcount) == 0 || OPCODE(header) != QUERY ) | ||||||
|  |      return 0; | ||||||
|  |   | ||||||
|  | diff --git a/src/forward.c b/src/forward.c | ||||||
|  | index f22556a..e3fa94b 100644 | ||||||
|  | --- a/src/forward.c | ||||||
|  | +++ b/src/forward.c | ||||||
|  | @@ -1188,6 +1188,10 @@ void receive_query(struct listener *listen, time_t now) | ||||||
|  |        (msg.msg_flags & MSG_TRUNC) || | ||||||
|  |        (header->hb3 & HB3_QR)) | ||||||
|  |      return; | ||||||
|  | + | ||||||
|  | +  /* Clear buffer beyond request to avoid risk of | ||||||
|  | +     information disclosure. */ | ||||||
|  | +  memset(daemon->packet + n, 0, daemon->edns_pktsz - n); | ||||||
|  |     | ||||||
|  |    source_addr.sa.sa_family = listen->family; | ||||||
|  |     | ||||||
|  | @@ -1688,6 +1692,10 @@ unsigned char *tcp_request(int confd, time_t now, | ||||||
|  |     | ||||||
|  |        if (size < (int)sizeof(struct dns_header)) | ||||||
|  |  	continue; | ||||||
|  | + | ||||||
|  | +      /* Clear buffer beyond request to avoid risk of | ||||||
|  | +	 information disclosure. */ | ||||||
|  | +      memset(payload + size, 0, 65536 - size); | ||||||
|  |         | ||||||
|  |        query_count++; | ||||||
|  |   | ||||||
|  | diff --git a/src/rfc1035.c b/src/rfc1035.c | ||||||
|  | index 26f5301..af2fe46 100644 | ||||||
|  | --- a/src/rfc1035.c | ||||||
|  | +++ b/src/rfc1035.c | ||||||
|  | @@ -1223,11 +1223,6 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, | ||||||
|  |    struct mx_srv_record *rec; | ||||||
|  |    size_t len; | ||||||
|  |   | ||||||
|  | -  /* Clear buffer beyond request to avoid risk of | ||||||
|  | -     information disclosure. */ | ||||||
|  | -  memset(((char *)header) + qlen, 0,  | ||||||
|  | -	 (limit - ((char *)header)) - qlen); | ||||||
|  | -   | ||||||
|  |    if (ntohs(header->ancount) != 0 || | ||||||
|  |        ntohs(header->nscount) != 0 || | ||||||
|  |        ntohs(header->qdcount) == 0 ||  | ||||||
|  | --  | ||||||
|  | 1.7.10.4 | ||||||
|  |  | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| From 38af9b1ac3242a4128e88069c495024caa565f0e Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk> |  | ||||||
| Date: Tue, 29 Aug 2017 12:35:40 +0100 |  | ||||||
| Subject: [PATCH] forward.c: fix CVE-2017-13704 |  | ||||||
|  |  | ||||||
| Fix SIGSEGV in rfc1035.c answer_request() line 1228 where memset() |  | ||||||
| is called with header & limit pointing at the same address and thus |  | ||||||
| tries to clear memory from before the buffer begins. |  | ||||||
|  |  | ||||||
| answer_request() is called with an invalid edns packet size provided by |  | ||||||
| the client.  Ensure the udp_size provided by the client is bounded by |  | ||||||
| 512 and configured maximum as per RFC 6891 6.2.3 "Values lower than 512 |  | ||||||
| MUST be treated as equal to 512" |  | ||||||
|  |  | ||||||
| The client that exposed the problem provided a payload udp size of 0. |  | ||||||
|  |  | ||||||
| Signed-off-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk> |  | ||||||
| --- |  | ||||||
|  src/forward.c | 2 ++ |  | ||||||
|  1 file changed, 2 insertions(+) |  | ||||||
|  |  | ||||||
| diff --git a/src/forward.c b/src/forward.c |  | ||||||
| index f22556a..62c5a5a 100644 |  | ||||||
| --- a/src/forward.c |  | ||||||
| +++ b/src/forward.c |  | ||||||
| @@ -1408,6 +1408,8 @@ void receive_query(struct listener *listen, time_t now) |  | ||||||
|  	 defaults to 512 */ |  | ||||||
|        if (udp_size > daemon->edns_pktsz) |  | ||||||
|  	udp_size = daemon->edns_pktsz; |  | ||||||
| +      if (udp_size < 512) |  | ||||||
| +	udp_size = 512; /* RFC 6891 6.2.3 */ |  | ||||||
|      } |  | ||||||
|   |  | ||||||
|  #ifdef HAVE_AUTH |  | ||||||
| --  |  | ||||||
| 2.7.4 |  | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user