Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Wed, 22 Mar 2023 15:29:16 +0300
From: Alexey Kodanev <aleksei.kodanev@...l-sw.com>
To: musl@...ts.openwall.com
Cc: Alexey Kodanev <aleksei.kodanev@...l-sw.com>
Subject: [PATCH] dns: check length field in tcp response message

The received length field in the message may be greater than the
size of the 'answer' buffer in which the message resides. Currently,
ABUF_SIZE is 768. And if we get a larger 'alen', it will result
in an out-of-bounds reading during parsing, because 'alen' will
be passed to __dns_parse() later:

    __dns_parse(abuf[i], alens[i], dns_parse_callback, &ctx);

To fix this, limit 'alen' to the size of the received buffer.
---
 src/network/res_msend.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/network/res_msend.c b/src/network/res_msend.c
index fef7e3a2..291853de 100644
--- a/src/network/res_msend.c
+++ b/src/network/res_msend.c
@@ -297,6 +297,7 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries,
 			int rcode = answers[i][3] & 15;
 			if (rcode != 0 && rcode != 3)
 				goto out;
+			if (alen > asize) alen = asize;
 
 			/* Storing the length here commits the accepted answer.
 			 * Immediately close TCP socket so as not to consume
-- 
2.25.1

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.