Fw: SNMPv3 engine id discovery

2013-09-08 Thread Gerhard Roth
Anybody willing to ok that patch?

Gerhard


Begin forwarded message:

Date: Fri, 16 Aug 2013 10:24:02 +0200
From: Gerhard Roth 
To: 
Subject: SNMPv3 engine id discovery


Hi,

in SNMPv3 engine id discovery is done by sending a noAuthNoPriv request
to the SNMP agent. The agent should reply with a usmStatsUnknownEngineIDs
report containing the authoritative engine id.

In case snmpd was configured with a minimum seclevel higher than none,
a usmStatsUnsupportedSecLevels report was generated instead.

The fix below delays checking the required seclevel until after engine
id discovery has been handled.

Ok?

Gerhard



Index: usr.sbin/snmpd/snmpe.c
===
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.33
diff -u -p -u -p -r1.33 snmpe.c
--- usr.sbin/snmpd/snmpe.c  29 Mar 2013 12:53:41 -  1.33
+++ usr.sbin/snmpd/snmpe.c  16 Aug 2013 08:05:19 -
@@ -530,8 +530,7 @@ snmpe_parse(struct sockaddr_storage *ss,
goto parsefail;
 
msg->sm_flags = *flagstr;
-   if (MSG_SECLEVEL(msg) < env->sc_min_seclevel ||
-   msg->sm_secmodel != SNMP_SEC_USM) {
+   if (msg->sm_secmodel != SNMP_SEC_USM) {
/* XXX currently only USM supported */
errstr = "unsupported security model";
stats->snmp_usmbadseclevel++;
Index: usr.sbin/snmpd/usm.c
===
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 usm.c
--- usr.sbin/snmpd/usm.c24 Jan 2013 09:30:27 -  1.6
+++ usr.sbin/snmpd/usm.c16 Aug 2013 08:05:19 -
@@ -287,6 +287,13 @@ usm_decode(struct snmp_message *msg, str
msg->sm_engine_boots = (u_int32_t)engine_boots;
msg->sm_engine_time = (u_int32_t)engine_time;
 
+   if (MSG_SECLEVEL(msg) < env->sc_min_seclevel) {
+   *errp = "security level too low";
+   msg->sm_usmerr = OIDVAL_usmErrSecLevel;
+   stats->snmp_usmbadseclevel++;
+   goto done;
+   }
+
memcpy(msg->sm_username, user, userlen);
msg->sm_username[userlen] = '\0';
msg->sm_user = usm_finduser(msg->sm_username);



SNMPv3 engine id discovery

2013-08-16 Thread Gerhard Roth
Hi,

in SNMPv3 engine id discovery is done by sending a noAuthNoPriv request
to the SNMP agent. The agent should reply with a usmStatsUnknownEngineIDs
report containing the authoritative engine id.

In case snmpd was configured with a minimum seclevel higher than none,
a usmStatsUnsupportedSecLevels report was generated instead.

The fix below delays checking the required seclevel until after engine
id discovery has been handled.

Ok?

Gerhard



Index: usr.sbin/snmpd/snmpe.c
===
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.33
diff -u -p -u -p -r1.33 snmpe.c
--- usr.sbin/snmpd/snmpe.c  29 Mar 2013 12:53:41 -  1.33
+++ usr.sbin/snmpd/snmpe.c  16 Aug 2013 08:05:19 -
@@ -530,8 +530,7 @@ snmpe_parse(struct sockaddr_storage *ss,
goto parsefail;
 
msg->sm_flags = *flagstr;
-   if (MSG_SECLEVEL(msg) < env->sc_min_seclevel ||
-   msg->sm_secmodel != SNMP_SEC_USM) {
+   if (msg->sm_secmodel != SNMP_SEC_USM) {
/* XXX currently only USM supported */
errstr = "unsupported security model";
stats->snmp_usmbadseclevel++;
Index: usr.sbin/snmpd/usm.c
===
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 usm.c
--- usr.sbin/snmpd/usm.c24 Jan 2013 09:30:27 -  1.6
+++ usr.sbin/snmpd/usm.c16 Aug 2013 08:05:19 -
@@ -287,6 +287,13 @@ usm_decode(struct snmp_message *msg, str
msg->sm_engine_boots = (u_int32_t)engine_boots;
msg->sm_engine_time = (u_int32_t)engine_time;
 
+   if (MSG_SECLEVEL(msg) < env->sc_min_seclevel) {
+   *errp = "security level too low";
+   msg->sm_usmerr = OIDVAL_usmErrSecLevel;
+   stats->snmp_usmbadseclevel++;
+   goto done;
+   }
+
memcpy(msg->sm_username, user, userlen);
msg->sm_username[userlen] = '\0';
msg->sm_user = usm_finduser(msg->sm_username);