On Tue, May 07, 2019 at 03:02:24PM +0200, Martijn van Duren wrote:
> Hello,
>
> When trying to make p5-Net-SNMP connect to snmpd with seclevel enc it
> fails to do so. This is because NET::SNMP verifies agains
> usmStatsUnknownEngineIDs, while we return usmStatsUnsupportedSecLevels.
>
> According to RFC3414 chapter 4 we should return usmStatsUnknownEngineIDs
> when: Request message with a securityLevel of noAuthNoPriv, a
> msgUserName of zero-length, a msgAuthoritativeEngineID value of zero
> length, and the varBindList left empty
>
> The diff below doesn't do the full check (which might be a bit
> excessive) but does do the usm_decode before the securelevel, so we
> trigger the OIDVAL_usmErrEngineId first.
>
> Found via check_snmp_load.pl.
> Note that this doesn't make check_snmp_load work yet, it still errors
> on the digest check, but gets us at least one step closer to a working
> situation with securelevel enc.
>
> OK?
Not really my area, but this patch is ok tb - fwiw.
>
> martijn@
>
> Index: snmpe.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
> retrieving revision 1.57
> diff -u -p -r1.57 snmpe.c
> --- snmpe.c 29 Apr 2019 16:04:05 -0000 1.57
> +++ snmpe.c 7 May 2019 12:51:21 -0000
> @@ -254,6 +254,9 @@ snmpe_parse(struct snmp_message *msg)
> goto parsefail;
>
> msg->sm_flags = *flagstr;
> + if ((a = usm_decode(msg, a, &msg->sm_errstr)) == NULL)
> + goto parsefail;
> +
> if (MSG_SECLEVEL(msg) < env->sc_min_seclevel ||
> msg->sm_secmodel != SNMP_SEC_USM) {
> /* XXX currently only USM supported */
> @@ -262,9 +265,6 @@ snmpe_parse(struct snmp_message *msg)
> msg->sm_usmerr = OIDVAL_usmErrSecLevel;
> goto parsefail;
> }
> -
> - if ((a = usm_decode(msg, a, &msg->sm_errstr)) == NULL)
> - goto parsefail;
>
> if (ber_scanf_elements(a, "{xxe",
> &msg->sm_ctxengineid, &msg->sm_ctxengineid_len,
>