Eine Sicherheitslücke in Net-snmp hat zur Folge, dass ein entfernter Angreifer Denial-of-Service-Attacken gegen Net-snmp-Agenten durchführen kann.
Das Simple Network Management Protocol (SNMP) ist ein schon rechtes altes Protokoll, das zum Überwachen verschiedenster Netzwerkkomponenten wie Router oder Server dient. Auf jedem zu überwachenden Gerät laufen dabei so genannte SNMP-Agenten, die von einem SNMP-Manager über ein definiertes Protokoll abgefragt werden. Auch können Einstellungen an den Geräten selbst via SNMP durchgeführt werden. Grundsätzlich gibt es sechs verschiedene Nachrichtentypen: GET, GETNEXT, GETBULK, SET, RESPONSE und TRAP. Die GET-Nachrichten werden vom Manager an die Agenten gesendet um Information abzufragen. SET-Nachrichten dienen zum Setzen von Geräteeigenschaften.
Mit SNMP lässt sich eine große Anzahl ganz verschiedener Geräte steuern und überwachen. Darum spezifiziert SNMP auch nicht die Werte, die sich überwachen oder setzen lassen. Sie sind in der
Management Information Base (MIB) beschrieben und sind je nach Gerät unterschiedlich, wobei die Informationen der MIB in einer Baumstruktur verwaltet werden.
Beim Verarbeiten solcher MIB-Bäume hat sich ein Fehler in Net-snmp eingeschlichen, den ein entfernter Angreifer mit SNMP-Leserechten durch eine geschickte GET-Anfrage für Denial-of-Service-Attacken ausnutzen kann, indem er den Absturz des Daemons “snmpd” herbeiführt. Der Programmierfehler befindet sich in der Funktion “handle_nsExtendOutput2Table()” in der Datei “agent/mibgroup/agent/extend.c”:
... line_idx = *table_info->indexes->next_variable->val.integer; cp = extension->lines[line_idx-1]; ...
Der Code greift ohne Kontrolle des “line_idx”-Werts auf das auf dem Heap allozierte Array “lines” zu. Dabei kann es leicht zu einem Heap Overflow kommen, denn ein Angreifer hat Kontrolle über
den “val.integer”-Wert. Die Korrektur dieser Schwachstelle ist denkbar einfach:
...
line_idx = *table_info->indexes->next_variable->val.integer;
if (line_idx < 1 || line_idx > extension->numlines) { netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE); continue;
}
cp = extension->lines[line_idx-1];
...
Hiermit ist eine entsprechende Attacke nicht mehr möglich.
Betroffen ist die Net-snmp-Version 5.7.1.

