Je suis tombé sur un petit problème DNS interressant…
Le voici dans l’ordre…
$ dig www.leparisien.fr
; <<>> DiG 9.9.5-9+deb8u1-Debian <<>> www.leparisien.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 53534
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.leparisien.fr. IN A
;; Query time: 448 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 15 21:36:55 CEST 2015
;; MSG SIZE rcvd: 46
$
Marche pas, status: SERVFAIL
Interressant
$ dig cname www.leparisien.fr
www.leparisien.fr. 86400 IN CNAME 2-01-275c-0002.cdx.cedexis.net.
Bon cette 1ère partie fonctionne.
- Essayons de voir ce que donne 2-01-275c-0002.cdx.cedexis.net.
$ dig 2-01-275c-0002.cdx.cedexis.net.
; <<>> DiG 9.9.5-9+deb8u1-Debian <<>> 2-01-275c-0002.cdx.cedexis.net.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 7708
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;2-01-275c-0002.cdx.cedexis.net. IN A
;; Query time: 25 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 15 21:39:41 CEST 2015
;; MSG SIZE rcvd: 59
Donc c’est lui qui ne résoud pas chez moi… status: SERVFAIL…
- Voyons voir les DNS de cdx.cedexis.net. ou plutôt ceux de cedexis.net.
$ dig ns cedexis.net. +short
flipa.cedexis.net.
flipd.cedexis.net.
flipg.cedexis.net.
$
$ dig 2-01-275c-0002.cdx.cedexis.net. @flipa.cedexis.net. +short
cdn2.lequipe.fr.
$ dig 2-01-275c-0002.cdx.cedexis.net. @flipd.cedexis.net. +short
cdn2.lequipe.fr.
$ dig 2-01-275c-0002.cdx.cedexis.net. @flipg.cedexis.net. +short
cdn2.lequipe.fr.
$
Arf çà répond.
Alors que cela ne répond toujours pas avec mon serveur local:
$ dig 2-01-275c-0002.cdx.cedexis.net.
; <<>> DiG 9.9.5-9+deb8u1-Debian <<>> 2-01-275c-0002.cdx.cedexis.net.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31061
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;2-01-275c-0002.cdx.cedexis.net. IN A
;; Query time: 44 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 15 21:44:22 CEST 2015
;; MSG SIZE rcvd: 59
- Comme vous l’avez remarqué, j’interroge mon serveur récursif local.
Quand la demande passe par lui, cela ne fonctionne pas, sinon cela semble fonctionner.
$ dig 2-01-275c-0002.cdx.cedexis.net. @8.8.8.8 +short
cdn2.lequipe.fr.
62.210.149.48
$
-
Mon serveur DNS local est Unbound, et il semble qu’un truc le dérange (uniquement avec ces serveurs DNS cedexis.net !)…
-
Activation des logs verbeux par la ligne
verbosity: 3
1436989983] unbound[12494:1] info: reply from <cedexis.net.> 209.107.211.4#53
1436989983] unbound[12494:1] info: Capsforid fallback: getting different replies, failed
1436989983] unbound[12494:1] debug: return error response SERVFAIL
Capsforid
… Interressant
use-caps-for-id: Use 0x20-encoded random bits in the query to foil spoof
attempts. This perturbs the lowercase and uppercase of query
names sent to authority servers and checks if the reply still
has the correct casing. Disabled by default. This feature is
an experimental implementation of draft dns-0x20.
Donc en gros, avec ce paramètre à “yes”, unbound envoit le nom à résoudre avec des minuscule/majuscule aléatoires, puis vérifie que la réponse à la question, qui contient la question, à bien les minuscules/majuscules aux bons endroits.
Et ce paramètre est à yes
dans ma conf Unbound
.
- Avant d’aller voir le draft dns-0x20, on lance wireshark
On voit clairement ce qui se passe, la réponse contient la question en minuscule, donc pas exactement comme elle a été posée.
- Vérifions avec un autre domaine.. Au hasard
bortzmeyer.org
$ dig www.bortzmeyer.org +short
204.62.14.153
$
Mon unbound résoud parfaitement.
On voit bien que la réponse, contient bien cette fois exactement la question, avec les minuscules/majuscules aux bons endroits.
- Vérifions en mettant à
no
le use-caps-for-id (ce qui, il est vrai, est la valeur par défaut)
Bingo, çà fonctionne cette fois
$ dig 2-01-275c-0002.cdx.cedexis.net. +short
cdn2.lequipe.fr.
62.210.149.48
$
Unbound considère maintenant comme valide la réponse des serveurs de cedexis.net
Victoire, je peux lire mon article sur www.leparisien.fr
- C’est quoi
cedexis.net
, ils auraient leur propre serveur DNS maison ?
“We’re dedicated to building a faster web for everyone in the world. Cedexis optimizes web performance across data centers, content delivery networks (CDNs) and clouds…”
Ah oui, çà colle, ils seraient bien capable d’avoir leur implémentation DNS maison.
Déjà on peut noter que c’est rédigé par Paul Vixie de l’ISC, c’est du sérieux.
Je vais vous résumer en gros:
Le protocole DNS est tel, qu’il y a parfois moyen de réussir à forger des réponses et donc de poluer les caches DNS.
Il est donc ensuite possible de rediriger les users vers des faux site web.. bref pas cool.. mais rien de nouveau pour l’instant.
Mais tout moyen permettant d’améliorer la sécurité, en rendant plus difficile de forger des fausses réponses, sans tout casser au protocole existant, est donc la bienvenue.
Ce draft expose un moyen d’y parvenir.
Comme vous l’avez compris (pour les 3 personnes qui sont arrivées jusqu’ici, chapeau bas), il s’agit de mettre des majuscules/minuscules aléatoires dans la question envoyée au serveur DNS, puis considérer comme invalides, les réponses qui ne reprendaient pas la question en respectant la casse.
Pour forger une fausse réponse DNS et donc polluer le cache, il faudrait donc non seulement trouver le bon ID (Kaminsky, Paradoxe des anniversaires etc..) mais donc en plus avoir les bonnes majuscules/minuscules aux bons endroits. (Pas con le Paul Vixie ! )
Mais pour que l’idée soit exploitable, il faut donc voir ce que dit la RFC 1035 et voir comment réagissent les principales implémentations de serveurs DNS authoritatives.
Pour ce qui est de la RFC1035 on peut lire en 7.3
that the question section corresponds to the information currently desired
Mmmm…Ce n’est pas super précis … Est-ce que cela inclu le respect de la casse… ?
Voyons voir les différentes implémentations:
On peut lire en 6.1
Several popular authoritative DNS implementations including ISC BIND (versions 4, 8, and 9), Nominum ANS, Akamai AKADNS, Neustar UltraDNS, Verisign Atlas, NLNetLabs NSD, PowerDNS, and DJBDNS were tested. All copied the question name exactly, bit for bit, from the request into the response.
Et en 6.2
Operational testing has revealed a small set of rare and/or private label authoritative DNS implementations who modify the 0x20 bits in question names while copying the question section from the request to the response. Usually this modification is to set the 0x20 bit, thus converting a domain name to be all-lower-case (0x61..0x7A, e.g., a-z).
Toutes les implémentations de serveur DNS authoritative majeures répondent en respectant la casse de la question.
Si les serveurs récursifs pouvaient implémenter cette vérification, ceci pourrrait améliorer la sécurité du DNS.
Et c’est d’ailleurs la 1ère fois que j’ai ce problème avec un serveur DNS, je vais donc garder mon paramêtre, et tant pis pour le site web du Parisien ;)
Les serveurs DNS de cedexis.net ne semblent pas tourner sous une “popular authoritative DNS implementations” :)
Je les ai contacté pour les informer…. si çà les interresse…
EDIT 31 Août 2015:
Antoine de Cedexis est tombé sur le billet et a remonté l’information aux bonnes personnes chez eux.
Je contaste que les modifications nécessaires (indiquées dans la roadmap dans son commentaire ci-dessous) semblent avoir été implémentées en production sur leurs serveurs DNS, et les résolutions ce font donc désormais correctement en respectant le draft dns-0x20.
Merci Antoine