Skip to content
Permalink
Browse files Browse the repository at this point in the history
Refactored SNMP engine after vulnerabilities
  • Loading branch information
Yagoor committed Oct 18, 2020
1 parent c61897a commit 12c8243
Show file tree
Hide file tree
Showing 19 changed files with 1,236 additions and 1,003 deletions.
7 changes: 6 additions & 1 deletion examples/snmp-server/project-conf.h
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* Copyright (C) 2019-2020 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -30,4 +30,9 @@
*/
/*---------------------------------------------------------------------------*/

/*
* In order to test SNMP compliance,
* at least three OID's in the same package are necessary
*/
#define SNMP_CONF_MAX_NR_VALUES 3
#define LOG_CONF_LEVEL_SNMP LOG_LEVEL_NONE
32 changes: 16 additions & 16 deletions examples/snmp-server/resources/snmp-SNMP-MIB-2-System.c
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* Copyright (C) 2019-2020 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -33,91 +33,91 @@

/*---------------------------------------------------------------------------*/
static void
sysDescr_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysDescr_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysDescr, sysDescr_handler, 1, 3, 6, 1, 2, 1, 1, 1, 0);

static void
sysDescr_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysDescr_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_string(varbind, oid, CONTIKI_VERSION_STRING);
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysObjectID_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysObjectID_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysObjectID, sysObjectID_handler, 1, 3, 6, 1, 2, 1, 1, 2, 0);

static void
sysObjectID_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysObjectID_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
OID(sysObjectID_oid, 1, 3, 6, 1, 4, 1, 54352);
snmp_api_set_oid(varbind, oid, sysObjectID_oid);
snmp_api_set_oid(varbind, oid, &sysObjectID_oid);
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysUpTime_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysUpTime_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysUpTime, sysUpTime_handler, 1, 3, 6, 1, 2, 1, 1, 3, 0);

static void
sysUpTime_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysUpTime_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_time_ticks(varbind, oid, clock_seconds() * 100);
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysContact_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysContact_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysContact, sysContact_handler, 1, 3, 6, 1, 2, 1, 1, 4, 0);

static void
sysContact_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysContact_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_string(varbind, oid, "Contiki-NG, https://github.com/contiki-ng/contiki-ng");
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysName_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysName_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysName, sysName_handler, 1, 3, 6, 1, 2, 1, 1, 5, 0);

static void
sysName_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysName_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_string(varbind, oid, "Contiki-NG - "CONTIKI_TARGET_STRING);
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysLocation_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysLocation_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysLocation, sysLocation_handler, 1, 3, 6, 1, 2, 1, 1, 6, 0);

static void
sysLocation_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysLocation_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_string(varbind, oid, "");
}
/*---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
static void
sysServices_handler(snmp_varbind_t *varbind, uint32_t *oid);
sysServices_handler(snmp_varbind_t *varbind, snmp_oid_t *oid);

MIB_RESOURCE(sysServices, sysServices_handler, 1, 3, 6, 1, 2, 1, 1, 7, 0);

static void
sysServices_handler(snmp_varbind_t *varbind, uint32_t *oid)
sysServices_handler(snmp_varbind_t *varbind, snmp_oid_t *oid)
{
snmp_api_set_time_ticks(varbind, oid, clock_seconds() * 100);
}
Expand Down
2 changes: 1 addition & 1 deletion examples/snmp-server/snmp-server.c
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* Copyright (C) 2019-2020 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down
38 changes: 11 additions & 27 deletions os/net/app-layer/snmp/snmp-api.c
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* Copyright (C) 2019-2020 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -32,7 +32,7 @@

/**
* \file
* An implementation of the Simple Network Management Protocol (RFC 3411-3418)
* SNMP Implementation of the public API
* \author
* Yago Fontoura do Rosario <yago.rosario@hotmail.com.br
*/
Expand All @@ -43,47 +43,31 @@

#include "snmp-message.h"
#include "snmp-ber.h"
#include "snmp-oid.h"

static void
snmp_api_replace_oid(snmp_varbind_t *varbind, uint32_t *oid)
{
uint8_t i;

i = 0;
while(oid[i] != ((uint32_t)-1)) {
varbind->oid[i] = oid[i];
i++;
}
varbind->oid[i] = ((uint32_t)-1);
}
/*---------------------------------------------------------------------------*/
void
snmp_api_set_string(snmp_varbind_t *varbind, uint32_t *oid, char *string)
snmp_api_set_string(snmp_varbind_t *varbind, snmp_oid_t *oid, char *string)
{

snmp_api_replace_oid(varbind, oid);
memcpy(&varbind->oid, oid, sizeof(snmp_oid_t));
varbind->value_type = BER_DATA_TYPE_OCTET_STRING;
varbind->value.string.string = string;
varbind->value.string.length = strlen(string);
}
/*---------------------------------------------------------------------------*/
void
snmp_api_set_time_ticks(snmp_varbind_t *varbind, uint32_t *oid, uint32_t integer)
snmp_api_set_time_ticks(snmp_varbind_t *varbind, snmp_oid_t *oid, uint32_t integer)
{

snmp_api_replace_oid(varbind, oid);
varbind->value_type = SNMP_DATA_TYPE_TIME_TICKS;
memcpy(&varbind->oid, oid, sizeof(snmp_oid_t));
varbind->value_type = BER_DATA_TYPE_TIMETICKS;
varbind->value.integer = integer;
}
/*---------------------------------------------------------------------------*/
void
snmp_api_set_oid(snmp_varbind_t *varbind, uint32_t *oid, uint32_t *ret_oid)
snmp_api_set_oid(snmp_varbind_t *varbind, snmp_oid_t *oid, snmp_oid_t *ret_oid)
{

snmp_api_replace_oid(varbind, oid);
varbind->value_type = BER_DATA_TYPE_OID;
varbind->value.oid = ret_oid;
memcpy(&varbind->oid, oid, sizeof(snmp_oid_t));
varbind->value_type = BER_DATA_TYPE_OBJECT_IDENTIFIER;
memcpy(&varbind->value.oid, ret_oid, sizeof(snmp_oid_t));
}
/*---------------------------------------------------------------------------*/
void
Expand Down
30 changes: 19 additions & 11 deletions os/net/app-layer/snmp/snmp-api.h
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* Copyright (C) 2019-2020 Yago Fontoura do Rosario <yago.rosario@hotmail.com.br>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -32,7 +32,7 @@

/**
* \file
* The public API for the Contiki-NG SNMP implementation
* SNMP Implementation of the public API
* \author
* Yago Fontoura do Rosario <yago.rosario@hotmail.com.br
*/
Expand All @@ -49,11 +49,10 @@
#include "snmp-mib.h"

/**
* \defgroup SNMPAPI This is the SNMP Public API
* \addtogroup SNMPAPI SNMP Public API
* @{
*
* This group contains all the functions that can be used outside the OS level.
* The function outside this header can be changed without notice
*/

/**
Expand All @@ -62,7 +61,7 @@
* @param varbind The varbind that is being changed
* @param oid The oid from the resource
*/
typedef void (*snmp_mib_resource_handler_t)(snmp_varbind_t *varbind, uint32_t *oid);
typedef void (*snmp_mib_resource_handler_t)(snmp_varbind_t *varbind, snmp_oid_t *oid);

/**
* @brief The MIB Resource struct
Expand All @@ -78,7 +77,10 @@ typedef struct snmp_mib_resource_s snmp_mib_resource_t;
* @param ... The Oid (comma-separeted)
*/
#define OID(name, ...) \
static uint32_t name[] = { __VA_ARGS__, -1 };
static snmp_oid_t name = { \
.data = __VA_ARGS__, \
.length = (sizeof((uint32_t[]){ __VA_ARGS__ }) / sizeof(uint32_t)) \
};

/**
* @brief Declare a MIB resource
Expand All @@ -88,8 +90,14 @@ typedef struct snmp_mib_resource_s snmp_mib_resource_t;
* @param ... The OID (comma-separated)
*/
#define MIB_RESOURCE(name, handler, ...) \
uint32_t name##_oid[] = { __VA_ARGS__, -1 }; \
snmp_mib_resource_t name = { NULL, name##_oid, handler };
snmp_mib_resource_t name = { \
NULL, \
{ \
.data = __VA_ARGS__, \
.length = (sizeof((uint32_t[]){ __VA_ARGS__ }) / sizeof(uint32_t)) \
}, \
handler \
};

/**
* @brief Function to set a varbind with a string
Expand All @@ -101,7 +109,7 @@ typedef struct snmp_mib_resource_s snmp_mib_resource_t;
* @param string The string
*/
void
snmp_api_set_string(snmp_varbind_t *varbind, uint32_t *oid, char *string);
snmp_api_set_string(snmp_varbind_t *varbind, snmp_oid_t *oid, char *string);

/**
* @brief Function to set a varbind with a time tick
Expand All @@ -113,7 +121,7 @@ snmp_api_set_string(snmp_varbind_t *varbind, uint32_t *oid, char *string);
* @param integer The time tick value
*/
void
snmp_api_set_time_ticks(snmp_varbind_t *varbind, uint32_t *oid, uint32_t integer);
snmp_api_set_time_ticks(snmp_varbind_t *varbind, snmp_oid_t *oid, uint32_t integer);

/**
* @brief Function to set a varbind with a oid
Expand All @@ -125,7 +133,7 @@ snmp_api_set_time_ticks(snmp_varbind_t *varbind, uint32_t *oid, uint32_t integer
* @param ret_oid The oid value
*/
void
snmp_api_set_oid(snmp_varbind_t *varbind, uint32_t *oid, uint32_t *ret_oid);
snmp_api_set_oid(snmp_varbind_t *varbind, snmp_oid_t *oid, snmp_oid_t *ret_oid);

/**
* @brief Function to add a new resource
Expand Down

0 comments on commit 12c8243

Please sign in to comment.