From 92f0fe9e0dc3cf7ab6e8cc94d7962df83d0ddbec Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 4 Jan 2021 12:21:59 -0800 Subject: [PATCH] libsnmp: Fix asn_parse_nlength() Handle length zero correctly. Fixes: https://github.com/net-snmp/net-snmp/issues/253 Fixes: a9850f4445cf ("asn parse: add NULL checks, check length lengths") --- snmplib/asn1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snmplib/asn1.c b/snmplib/asn1.c index e983500e7..33c272768 100644 --- a/snmplib/asn1.c +++ b/snmplib/asn1.c @@ -345,7 +345,7 @@ asn_parse_nlength(u_char *pkt, size_t pkt_len, u_long *data_len) * long length; first byte is length of length (after masking high bit) */ len_len = (int) ((*pkt & ~0x80) + 1); - if ((int) pkt_len <= len_len ) + if (pkt_len < len_len) return NULL; /* still too short for length and data */ /* now we know we have enough data to parse length */ From baef04f9c6fe0eb3ac74dd4d26a19264eeaf7fa1 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 4 Jan 2021 10:00:33 -0800 Subject: [PATCH] testing/fulltests/unit-tests/T105trap_parse_clib: Add this test Add a reproducer for the bug fixed by the previous patch. --- .../unit-tests/T105trap_parse_clib.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 testing/fulltests/unit-tests/T105trap_parse_clib.c diff --git a/testing/fulltests/unit-tests/T105trap_parse_clib.c b/testing/fulltests/unit-tests/T105trap_parse_clib.c new file mode 100644 index 000000000..5c21ccdc7 --- /dev/null +++ b/testing/fulltests/unit-tests/T105trap_parse_clib.c @@ -0,0 +1,41 @@ +/* HEADER Parsing of an SNMP trap with no varbinds */ +netsnmp_pdu pdu; +int rc; +static u_char trap_pdu[] = { + /* Sequence with length of 0x2d = 45 bytes. */ + [ 0] = 0x30, [ 1] = 0x82, [ 2] = 0x00, [ 3] = 0x2d, + /* version = INTEGER 0 */ + [ 4] = 0x02, [ 5] = 0x01, [ 6] = 0x00, + /* community = public (OCTET STRING 0x70 0x75 0x62 0x6c 0x69 0x63) */ + [ 7] = 0x04, [ 8] = 0x06, [ 9] = 0x70, [10] = 0x75, + [11] = 0x62, [12] = 0x6c, [13] = 0x69, [14] = 0x63, + /* SNMP_MSG_TRAP; 32 bytes. */ + [15] = 0xa4, [16] = 0x20, + /* enterprise = OBJECT IDENTIFIER .1.3.6.1.6.3.1.1.5 = snmpTraps */ + [17] = 0x06, [18] = 0x08, + [19] = 0x2b, [20] = 0x06, [21] = 0x01, [22] = 0x06, + [23] = 0x03, [24] = 0x01, [25] = 0x01, [26] = 0x05, + /* agent-addr = ASN_IPADDRESS 192.168.1.34 */ + [27] = 0x40, [28] = 0x04, [29] = 0xc0, [30] = 0xa8, + [31] = 0x01, [32] = 0x22, + /* generic-trap = INTEGER 0 */ + [33] = 0x02, [34] = 0x01, [35] = 0x00, + /* specific-trap = INTEGER 0 */ + [36] = 0x02, [37] = 0x01, [38] = 0x00, + /* ASN_TIMETICKS 0x117f243a */ + [39] = 0x43, [40] = 0x04, [41] = 0x11, [42] = 0x7f, + [43] = 0x24, [44] = 0x3a, + /* varbind list */ + [45] = 0x30, [46] = 0x82, [47] = 0x00, [48] = 0x00, +}; +static size_t trap_pdu_length = sizeof(trap_pdu); +netsnmp_session session; + +snmp_set_do_debugging(TRUE); +debug_register_tokens("dumpv_recv,dumpv_send,asn,recv"); +memset(&session, 0, sizeof(session)); +snmp_sess_init(&session); +memset(&pdu, 0, sizeof(pdu)); +rc = snmp_parse(NULL, &session, &pdu, trap_pdu, trap_pdu_length); + +OKF((rc == 0), ("Parsing of a trap PDU"));