Thanks for the detailed review Martijn, I'll follow up with the vendors and see if they can address the issue with a firmware update.
On Sat, Dec 10, 2022, at 01:42, Martijn van Duren wrote: > On Fri, 2022-12-09 at 13:35 -0700, Byron Klippert wrote: >> On Fri, Dec 9, 2022, at 12:57, Stuart Henderson wrote: >> > On 2022-12-09, Byron Klippert <byronklipp...@ml1.net> wrote: >> > > Hello, >> > > >> > > I get an snmp protocol error response when attempting to `snmp get` >> > > certain OIDs on various devices. However `tcpdump` shows that the device >> > > is actually responding with the anticipated result but it appears snmp >> > > isn't able to parse the response correctly? Any suggestions on how to >> > > troubleshoot further are welcome. >> > > >> > > >> > > I'm requesting the mntrFreq OID which is formatted as such: >> > > Name: mntrFreq >> > > OID: .1.3.6.1.4.1.35833.12.3.1 >> > > MIB: DB7000-MIB >> > > Syntax: INTEGER32 (87100..108100) >> > > Access: read-only >> > > Status: current >> > > DefVal: >> > > Indexes: >> > > Descr: "mntr Freq" >> > >> > btw, the information in the mib file doesn't necessarily correspond >> > to what the device actually sends, "snmp get" doesn't care about the >> > mib file at all, just whether the pdu is correctly formatted. >> >> Yup, understood. I've seen a few half-baked snmp implementations in the wild >> to know the MIB docs are often only suggestions as to how devices actually >> respond. >> >> > >> > > imac:/home/admin $ snmp get -v 2c -r 0 -c *redacted* >> > > udp:paint-receiver:161 .1.3.6.1.4.1.35833.12.3.1.0 >> > > snmp: get: Protocol error >> > > >> > > imac:/home/admin $ doas tcpdump host paint-receiver >> > > tcpdump: listening on bge0, link-type EN10MB >> > > 10:10:02.804614 192.168.0.4.21246 > paint-receiver.snmp: C=*redacted* >> > > GetRequest(32) E:35833.12.3.1.0 >> > > 10:10:03.231863 paint-receiver.snmp > 192.168.0.4.21246: C=*redacted* >> > > GetResponse(40) E:35833.12.3.1.0=103500 >> > >> > It might be useful to use -X to do a hexdump (and maybe -s1500 to make >> > sure you get full packets); if you need to redact the snmp community >> > (although it probably doesn't really matter all that much seeing as >> > it's on a private lan address) make sure you get the hex digits too >> > >> > That way we can get a better idea of what's actually sent on the wire >> > >> > >> > -- >> > Please keep replies on the mailing list. >> >> imac:/home/admin $ snmp get -v 2c -r 0 -c *redacted* udp:paint-receiver:161 >> .1.3.6.1.4.1.35833.12.3.1.0 >> snmp: get: Protocol error >> >> imac:/home/admin $ clear; doas tcpdump -X -s1500 host paint-receiver >> tcpdump: listening on bge0, link-type EN10MB >> 13:23:16.478673 192.168.0.4.11162 > paint-receiver.snmp: C=*redacted* >> GetRequest(32) E:35833.12.3.1.0 >> 0000: 4500 004d ce0a 0000 4011 0000 c0a8 0004 E..M....@....... >> 0010: c0a8 050c 2b9a 00a1 0039 aac2 302f 0201 ....+....9..0/.. >> 0020: 0104 082a 2a2a 2a2a 2a2a 2aa0 2002 0428 ...********. ..( >> 0030: f7c4 fb02 0100 0201 0030 1230 1006 0c2b .........0.0...+ >> 0040: 0601 0401 8297 790c 0301 0005 00 ......y...... >> >> 13:23:17.366836 paint-receiver.snmp > 192.168.0.4.11162: C=*redacted* >> GetResponse(40) E:35833.12.3.1.0=103500 >> 0000: 4500 0059 f938 0000 fd11 3dfa c0a8 050c E..Y.8....=..... >> 0010: c0a8 0004 00a1 2b9a 0045 c089 3082 0039 ......+..E..0..9 >> 0020: 0201 0104 082a 2a2a 2a2a 2a2a 2aa2 8200 .....********... >> 0030: 2802 0428 f7c4 fb02 0100 0201 0030 8200 (..(.........0.. >> 0040: 1830 8200 1406 0c2b 0601 0401 8297 790c .0.....+......y. >> 0050: 0301 0002 0400 0194 4c ........L > > The problem is here in the final 4 bytes: 0x0001944c, which is the int > value of the response (0x0204 is the integer preamble). > According to X.690 section 8.3.2: > If the contents octets of an integer value encoding consist of more than > one octet, then the bits of the first octet and bit 8 of the second > octet: > a) shall not all be ones; and > b) shall not all be zero. > NOTE - These rules ensure that an integer value is always encoded in the > smallest possible number of octets > > In this case the 1st byte is all zeroes, violating the rule. A check for > this was introduced to ber.c by rob@ to enforce this: > revision 1.5 > date: 2019/05/12 20:13:08; author: rob; state: Exp; lines: +9 -2; > commitid: 7FpdY7sgslPEOJU0; > Enforce smallest number of contents octets for int (and enum). > > ok claudio@ > > Although the additional byte(s) don't really hurt I'm not sure if > reverting this diff for a single misbehaving device is worth it. > Unless anyone thinks differently I think it'd be better to first > go to the vendor of your device and ask them to fix this. > > martijn@ >> >> >> And here's the OID that responds correctly... >> >> imac:/home/admin $ snmp get -v 2c -r 0 -c *redacted* udp:paint-receiver:161 >> .1.3.6.1.4.1.35833.12.2.10.1.0 >> enterprises.35833.12.2.10.1.0 = STRING: DB7000: Paint Mt >> >> imac:/home/admin $ clear; doas tcpdump -X -s1500 host paint-receiver >> tcpdump: listening on bge0, link-type EN10MB >> 13:32:08.168829 192.168.0.4.44771 > paint-receiver.snmp: C=*redacted* >> GetRequest(33) E:35833.12.2.10.1.0 >> 0000: 4500 004e 36ee 0000 4011 0000 c0a8 0004 E..N6...@....... >> 0010: c0a8 050c aee3 00a1 003a caeb 3030 0201 .........:..00.. >> 0020: 0104 082a 2a2a 2a2a 2a2a 2aa0 2102 0459 ...********.!..Y >> 0030: f71a 4f02 0100 0201 0030 1330 1106 0d2b ..O......0.0...+ >> 0040: 0601 0401 8297 790c 020a 0100 0500 ......y....... >> >> 13:32:08.988687 paint-receiver.snmp > 192.168.0.4.44771: C=*redacted* >> GetResponse(53) E:35833.12.2.10.1.0="DB7000: Paint Mt" >> 0000: 4500 0066 f967 0000 fd11 3dbe c0a8 050c E..f.g....=..... >> 0010: c0a8 0004 00a1 aee3 0052 ade8 3082 0046 .........R..0..F >> 0020: 0201 0104 082a 2a2a 2a2a 2a2a 2aa2 8200 .....********... >> 0030: 3502 0459 f71a 4f02 0100 0201 0030 8200 5..Y..O......0.. >> 0040: 2530 8200 2106 0d2b 0601 0401 8297 790c %0..!..+......y. >> 0050: 020a 0100 0410 4442 3730 3030 3a20 5061 ......DB7000: Pa >> 0060: 696e 7420 4d74 int Mt >> -- Byron Klippert byronklipp...@ml1.net c. 867-334-5179