PPP: When un-escaping, don't allocate a too-large buffer. 27/249827/1 accepted/tizen_6.5_unified accepted/tizen_7.0_unified accepted/tizen_7.0_unified_hotfix accepted/tizen_8.0_unified tizen_6.5 tizen_7.0 tizen_7.0_hotfix tizen_8.0 accepted/tizen/6.5/unified/20211029.015054 accepted/tizen/7.0/unified/20221110.061409 accepted/tizen/7.0/unified/hotfix/20221116.111453 accepted/tizen/8.0/unified/20231005.095602 accepted/tizen/unified/20210107.123455 submit/tizen/20201218.054408 submit/tizen/20210106.042955 submit/tizen_6.5/20211028.163901 tizen_6.5.m2_release tizen_7.0_m2_release tizen_8.0_m2_release
authorGuy Harris <guy@alum.mit.edu>
Sat, 18 Apr 2020 21:04:59 +0000 (14:04 -0700)
committerSeonah Moon <seonah1.moon@samsung.com>
Thu, 17 Dec 2020 03:39:48 +0000 (12:39 +0900)
The buffer should be big enough to hold the captured data, but it
doesn't need to be big enough to hold the entire on-the-network packet,
if we haven't captured all of it.

(backported from commit e4add0b010ed6f2180dcb05a13026242ed935334)

CVE-2020-8037

Change-Id: Ic28093fcb75e2c597aa8486bf81427fa244694a2

print-ppp.c

index 8917617..33fb034 100644 (file)
@@ -1367,19 +1367,29 @@ trunc:
        return 0;
 }
 
+/*
+ * Un-escape RFC 1662 PPP in HDLC-like framing, with octet escapes.
+ * The length argument is the on-the-wire length, not the captured
+ * length; we can only un-escape the captured part.
+ */
 static void
 ppp_hdlc(netdissect_options *ndo,
          const u_char *p, int length)
 {
+       u_int caplen = ndo->ndo_snapend - p;
        u_char *b, *t, c;
        const u_char *s;
-       int i, proto;
+       u_int i;
+       int proto;
        const void *se;
 
+       if (caplen == 0)
+               return;
+
         if (length <= 0)
                 return;
 
-       b = (u_char *)malloc(length);
+       b = (u_char *)malloc(caplen);
        if (b == NULL)
                return;
 
@@ -1388,10 +1398,10 @@ ppp_hdlc(netdissect_options *ndo,
         * Do this so that we dont overwrite the original packet
         * contents.
         */
-       for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) {
+       for (s = p, t = b, i = caplen; i != 0; i--) {
                c = *s++;
                if (c == 0x7d) {
-                       if (i <= 1 || !ND_TTEST(*s))
+                       if (i <= 1)
                                break;
                        i--;
                        c = *s++ ^ 0x20;