Wer das DNS manipuliert, kann Internet-Nutzer unbemerkt auf beliebige Server schicken, um dort Einwahldaten, Kreditkartennummern oder dergleichen abzugreifen. Eine verbreitete IoT-Bibliothek ist anfällig für solche Angriffe.
Das Domain Name System (DNS) ist einer der wichtigen Dienste in IP-basierten Netzwerken. Es übernimmt die Auflösung von Namen und läuft auf Servern, auf denen es eine hierarchische Verzeichnisstruktur bildet. Der DNS-Namensraum unterteilt sich dabei in Zonen, für die jeweils unabhängige Administratoren zuständig sind. Hauptsächlich übersetzt das DNS Domain-Namen in IP-Adressen. DNS-Anfragen werden via UDP auf Port 53 zu einem Nameserver gesendet, größere Anfragen dürfen laut DNS-Standard auch TCP verwenden.
Störungen des DNS können erheblichen Schaden anrichten. Verfälschungen von DNS-Daten etwa eignen sich als Ausgangspunkt für weitere Angriffe. Das Ziel von DNS-Attacken ist es, das Opfer auf andere Webseiten zu lenken als die von ihm beabsichtigten. Danach kann der Angreifer dann beispielsweise Login- oder Kreditkartendaten abgreifen.
Eine Schwachstelle in den DNS-Auflösungsfunktionen der Bibliotheken uClibc und uClibc-ng erlaubt entfernten Angreifern derartige Attacken [1]. Dadurch können sie eine Anfrage auf ein von ihnen kontrolliertes System umleiten. uClibc ist eine für Linux-Embedded-Systeme konzipierte C-Standard-Bibliothek, die deutlich kleiner als die GNU-C-Bibliothek Glibc ist. Letztere nutzen die meisten Linux-Distributionen als C-Standard-Bibliothek. In der uClibc lassen sich verschiedene Funktionen deaktivieren, um Speicher zu sparen. Die Bibliothek kommt auf zahlreichen IoT-Geräten zum Einsatz.
Bei der Attacke handelt es sich um eine Variante einer DNS-Poisoning-Attacke. Sie basiert darauf, dass das UDP-Protokoll im Gegensatz zu TCP verbindungslos ist. Eine UDP-DNS-Anfrage enthält immer IP-Adresse und Port von Quelle und Ziel, Protokoll, Daten und eine Transaction-ID. Letztere ist eindeutig und wird vom Client für jede DNS-Anfrage neu generiert. Die Antwort des DNS-Servers muss diese Transaction-ID enthalten, um vom Client angenommen und verarbeitet zu werden.
Errät ein entfernter Angreifer die Transaction-ID, kann er eigene DNS-Daten an den Client senden. Aufgrund der korrekten ID wird der Client die DNS-Daten des Angreifers annehmen und verarbeiten. Der Angreifer leitet so die Anfragen des Clients auf eine von ihm gewünschte IP-Adresse um. Dort betreibt er dann seinen eigenen Webserver und fängt so beispielsweise Login-Daten ab. Die Sicherheit solch gewöhnlicher DNS-Abfragen hängt damit unter anderem davon ab, wie zufällig die Transaction-IDs generiert werden. Idealerweise geschieht das so, dass es für einen Angreifer möglichst schwierig ist, sie zu erraten. Die von uClibc und uClibc-ng erzeugten Transaction-IDs lassen sich allerdings recht einfach erraten, was letztendlich die DNS-Poisoning-Attacken ermöglicht.
DNS-Anfragen sind in der Datei »/libc/inet/resolv.c« der Bibliothek in der Funktion »__dns_lookup()« implementiert. Dort dient die statische Variable »last_id« dazu, die zuletzt verwendete Transaction-ID zu speichern. Beim ersten Aufruf der Funktion wird »last_id« mit 1 initialisiert und eine Variable namens »local_id« deklariert. Sie nimmt die Transaction-ID für den nächsten DNS-Lookup auf. In der Funktion werden verschiedene mathematische Operationen auf »local_id« und »last_id« angewandt, um neue Transaction-IDs zu berechnen. Der Algorithmus ist allerdings so konstruiert, dass ein Angreifer die Transaction-ID vorhersagen kann.
Das Beheben des Problems gestaltet sich schwierig und war Mitte Mai noch immer nicht gelöst, da der Projekt-Maintainer selbst keinen Patch bereitstellen konnte. (jcb)





