summaryrefslogtreecommitdiff
path: root/print-snmp.c
diff options
context:
space:
mode:
authorDenis Ovsienko <denis@ovsienko.info>2017-01-12 13:47:50 +0000
committerFrancois-Xavier Le Bail <fx.lebail@yahoo.com>2017-01-18 09:16:41 +0100
commiteec1624f7be88008f519d92150ee0eb85633518b (patch)
tree77656a46eec698c55703affe9be45d6f51c363d8 /print-snmp.c
parentc39c1d99ac3b6d5d9519b39da6717180651650d3 (diff)
downloadtcpdump-eec1624f7be88008f519d92150ee0eb85633518b.tar.gz
CVE-2017-5483/SNMP: improve ASN.1 bounds checks
Kamil Frankowicz had found that truncated BE_STR and BE_SEQ ASN.1 elements could lead to an overread, from the source code it looked like other ids could have this problem too. Move the checks introduced in commit 72e501f out of the switch blocks to cover all ids by default. This fixes GH#559 and GH#566.
Diffstat (limited to 'print-snmp.c')
-rw-r--r--print-snmp.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/print-snmp.c b/print-snmp.c
index 69b6a13f..1b096dcf 100644
--- a/print-snmp.c
+++ b/print-snmp.c
@@ -519,6 +519,7 @@ asn1_parse(netdissect_options *ndo,
ND_PRINT((ndo, "[id?%c/%s/%d]", *Form[form], Class[class].name, id));
return -1;
}
+ ND_TCHECK2(*p, elem->asnlen);
switch (form) {
case PRIMITIVE:
@@ -539,7 +540,6 @@ asn1_parse(netdissect_options *ndo,
ND_PRINT((ndo, "[asnlen=0]"));
return -1;
}
- ND_TCHECK2(*p, elem->asnlen);
if (*p & ASN_BIT8) /* negative */
data = -1;
for (i = elem->asnlen; i-- > 0; p++)
@@ -577,7 +577,6 @@ asn1_parse(netdissect_options *ndo,
case GAUGE:
case TIMETICKS: {
register uint32_t data;
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_UNS;
data = 0;
for (i = elem->asnlen; i-- > 0; p++)
@@ -588,7 +587,6 @@ asn1_parse(netdissect_options *ndo,
case COUNTER64: {
register uint64_t data64;
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_UNS64;
data64 = 0;
for (i = elem->asnlen; i-- > 0; p++)
@@ -627,7 +625,6 @@ asn1_parse(netdissect_options *ndo,
default:
ND_PRINT((ndo, "[P/%s/%s]", Class[class].name, Class[class].Id[id]));
- ND_TCHECK2(*p, elem->asnlen);
elem->type = BE_OCTET;
elem->data.raw = (const uint8_t *)p;
break;