0003-dnsproxy-Add-length-checks-to-prevent-buffer-overflo.patch 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. From e4079a20f617a4b076af503f6e4e8b0304c9f2cb Mon Sep 17 00:00:00 2001
  2. From: Colin Wee <cwee@tesla.com>
  3. Date: Thu, 28 Jan 2021 19:41:53 +0100
  4. Subject: [PATCH] dnsproxy: Add length checks to prevent buffer overflow
  5. Fixes: CVE-2021-26675
  6. Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
  7. ---
  8. src/dnsproxy.c | 14 +++++++++++---
  9. 1 file changed, 11 insertions(+), 3 deletions(-)
  10. diff --git a/src/dnsproxy.c b/src/dnsproxy.c
  11. index a7bf87a1..4f5c897f 100644
  12. --- a/src/dnsproxy.c
  13. +++ b/src/dnsproxy.c
  14. @@ -1767,6 +1767,7 @@ static char *uncompress(int16_t field_count, char *start, char *end,
  15. char **uncompressed_ptr)
  16. {
  17. char *uptr = *uncompressed_ptr; /* position in result buffer */
  18. + char * const uncomp_end = uncompressed + uncomp_len - 1;
  19. debug("count %d ptr %p end %p uptr %p", field_count, ptr, end, uptr);
  20. @@ -1787,12 +1788,15 @@ static char *uncompress(int16_t field_count, char *start, char *end,
  21. * tmp buffer.
  22. */
  23. - ulen = strlen(name);
  24. - strncpy(uptr, name, uncomp_len - (uptr - uncompressed));
  25. -
  26. debug("pos %d ulen %d left %d name %s", pos, ulen,
  27. (int)(uncomp_len - (uptr - uncompressed)), uptr);
  28. + ulen = strlen(name);
  29. + if ((uptr + ulen + 1) > uncomp_end) {
  30. + goto out;
  31. + }
  32. + strncpy(uptr, name, uncomp_len - (uptr - uncompressed));
  33. +
  34. uptr += ulen;
  35. *uptr++ = '\0';
  36. @@ -1802,6 +1806,10 @@ static char *uncompress(int16_t field_count, char *start, char *end,
  37. * We copy also the fixed portion of the result (type, class,
  38. * ttl, address length and the address)
  39. */
  40. + if ((uptr + NS_RRFIXEDSZ) > uncomp_end) {
  41. + debug("uncompressed data too large for buffer");
  42. + goto out;
  43. + }
  44. memcpy(uptr, ptr, NS_RRFIXEDSZ);
  45. dns_type = uptr[0] << 8 | uptr[1];
  46. --
  47. 2.20.1