http://www.bortzmeyer.org/7513.html

----------------------------

Auteur(s) du RFC: J. Bi, J. Wu, G. Yao
(Tsinghua Univ.), F. Baker (Cisco)

Chemin des normes

----------------------------


Le cadre SAVI ("Source Address Validation Improvement"), décrit dans le 
RFC 7039, vise à rendre plus difficile l'usurpation d'adresses IP. SAVI 
fournit un cadre général et plusieurs solutions techniques concrètes 
sont ensuite développées selon le type de réseau et selon le niveau de 
sécurité qu'on désire et qu'on est prêt à « payer ». Ainsi, le RFC 6620 
décrivait un mécanisme où le réseau d'accès assurait que le premier 
titulaire d'une adresse IP puisse la garder. Ce nouveau RFC décrit un 
autre mécanisme, où c'est via l'utilisation de DHCP qu'on contrôle les 
adresses : le réseau d'accès va empêcher l'utilisation d'adresses qui 
n'ont pas été allouées par le serveur DHCP. (Ce mécanisme est largement 
déployé depuis des années, sous divers noms, comme « "DHCP snooping" », 
mais n'avait pas été formellement décrit dans un RFC.)

L'usurpation d'adresse IP est à la base de nombreuses attaques sur 
l'Internet, comme les attaques par réflexion 
<http://www.bortzmeyer.org/attaques-reflexion.html>. Il existe depuis 
longtemps des techniques pour limiter l'usurpation d'adresses IP (le 
RFC 2827 est un exemple classique, qui permet de protéger un réseau 
contre l'usurpation par un autre). Celles de SAVI visent surtout le 
réseau local (réseau d'accès pour un FAI) en limitant le risque 
d'usurpation interne (qu'un utilisateur du réseau local usurpe 
l'adresse d'un autre). Ici, dans ce RFC 7513, l'allocation d'une 
adresse IP via DHCP va créer un *lien* ("binding") entre cette adresse 
et des informations qui permettront au réseau de filtrer les 
usurpateurs. Par exemple, en retenant le port physique du commutateur 
comme lien, le commutateur peut bloquer les paquets dont l'adresse IP 
source n'est pas celle qui a été allouée à la machine connectée à ce 
port. Un tel mécanisme est souvent présent dans les commutateurs 
existants, souvent sous le nom de "DHCP snooping" mais attention : 
parfois, ce "DHCP snooping" se limite à bloquer les réponses DHCP 
arrivant sur un port inattendu, et n'intégre pas forcément la 
protection contre l'usurpation d'adresses IP, le but principal de ce 
RFC. Vérifiez avec votre commutateur !

Ce mécanisme de lien ("binding anchor") est décrit en section 3 du RFC 
7039 et rappelé en section 3 de notre RFC. Un lien doit être un 
attribut caractéristique, et difficile à changer (un contre-exemple est 
l'adresse MAC, facile à changer sur beaucoup de systèmes, et pourtant 
citée par notre RFC). C'est le cas du port physique du commutateur 
Ethernet cité plus haut, ou bien d'une association de sécurité WiFi (la 
section 3.2 du RFC 7039 donne d'autres exemples).

SAVI-DHCP va donc surveiller le trafic DHCP, notant les requêtes et 
réponses DHCP et les associant aux liens. Notez que cela marche avec le 
DHCP avec état (RFC 2131 pour IPv4 et RFC 3315 pour IPv6), pas avec le 
DHCP sans état du RFC 3736, qui ne s'occupe pas d'allocation d'adresses 
IP. De même, SAVI-DHCP ne gère évidemment pas le cas des réseaux où les 
adresses IP sont obtenues par un autre moyen que DHCP, par exemple le 
SLAAC du RFC 4862. Idem pour les adresses locales au lien (RFC 4291, 
section 2.5.6). Dans ces deux derniers cas, il faut utiliser une autre 
technique SAVI, le FCFS du RFC 6620.

Bon, maintenant, les détails. La section 4 précise quels acteurs sont 
considérés : un serveur DHCP évidemment, des clients DHCP, et les 
machines SAVI, typiquement des commutateurs, qui vont faire respecter 
les règles SAVI (il y a aussi quelques commutateurs non-SAVI dans le 
réseau d'exemple, pour mieux refléter la réalité). La machine SAVI va 
avoir besoin d'une certaine configuration. Par exemple, si le réseau 
contient un serveur DHCP menteur, la machine SAVI ne peut pas le 
deviner, et il faut lui dire sur quel port est attaché le vrai serveur 
DHCP (attribut SAVI DHCP-trust, cf. par exemple cette documentation 
Cisco 
<http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst6500/ios/12-2
SX/configuration/guide/book/snoodhcp.html#wp1114389>, la commande ip 
dhcp snooping trust indiquera qu'un serveur DHCP légitime opère sur 
cette interface). De même, certains ports physiques ne doivent pas 
valider les adresses IP (attribut SAVI Trust, par exemple un port 
attaché au routeur de sortie, port sur lequel on verra passer, et c'est 
normal, plusieurs adresses IP) et il faudra donc indiquer à la machine 
SAVI sur quels ports elle doit surveiller (ceux où ne se trouve 
normalement qu'une ou plusieurs machines obtenant des adresses par 
DHCP).

SAVI sépare le réseau en deux, la partie de confiance et le reste. Dans 
la partie de confiance, on peut être raisonnablement sûr que les 
adresses IP source sont authentiques : tous les commutateurs valident. 
SAVI ne prétend pas sécuriser tout l'Internet. Et, même dans le réseau 
local, une partie du réseau peut être non-SAVI et ne sera donc pas de 
confiance. Cette notion de périmètre (séparant la partie de confiance 
et le reste) est essentielle pour configurer SAVI, et pour savoir ce 
qu'on peut attendre de cette technique. Par exemple, des réponses DHCP 
venues d'un serveur situé en dehors du périmètre ne seront pas 
utilisées par SAVI : puisque cette zone n'est pas de confiance, il peut 
parfaitement s'agir d'un serveur pirate (section 4.3.3 du RFC, un bon 
exemple de l'utilisation de la notion de périmètre, avec un schéma 
d'exemple).

La sécurité de SAVI-DHCP dépend évidemment de la sécurité des liens. Il 
faut notamment s'assurer que les attributs utilisés pour construire le 
lien sont difficiles à usurper. Un port physique du commutateur est un 
bon exemple. A contrario, une adresse MAC est un mauvais attribut (trop 
facile à changer) et même un attribut fort peut être affaibli par 
certains usages. Par exemple, si on utilise le port physique du 
commutateur Ethernet comme "binding anchor", mais que ce dernier est 
connecté à des commutateurs non-SAVI en cascade, les nombreuses 
machines qui partagent ce port physique peuvent encore usurper leurs 
adresses IP entre elles.

Ces liens et les adresses IP associées doivent être stockées dans la 
mémoire de la machine SAVI, dans un structure de données dite BST 
("Binding State Table", section 5). Chaque ligne de cette table stocke 
également la durée de vie du lien et l'état du lien (établi, en cours 
d'établissement, inconnu).

La BST se remplit en « espionnant » ("snooping") le trafic DHCP 
(section 6). En résumant (beaucoup) : la machine SAVI voit passer une 
requête DHCP et la réponse arrive depuis un port marqué comme 
DHCP-trust. On stocke alors dans la BST le port d'où est venu la 
requête (le lien, le "binding anchor"), l'adresse IP dans la réponse, 
le fait que le lien est établi, et sa durée de vie (typiquement la 
durée du bail DHCP). Désormais, si on voit un paquet IP arriver par le 
port d'où venait la requête DHCP, on pourra regarder son adresse IP 
source, et jeter le paquet si elle ne correspond pas à ce qui est dans 
la BST (ce filtrage est décrit en section 8). Sur un Juniper, on peut 
afficher cette BST avec show dhcp snooping binding. Cet exemple est 
tiré d'une documentation Juniper :

user@switch> show dhcp snooping binding
DHCP Snooping Information:
MAC Address             IP Address Lease   Type     VLAN    Interface
-----------------       ---------- -----   -------  ----    ---------
00:00:01:00:00:03       192.0.2.0  640     dynamic  guest    ge-0/0/12.0
00:00:01:00:00:04       192.0.2.1  720     dynamic  guest    ge-0/0/12.0
00:00:01:00:00:05       192.0.2.5  800     dynamic  guest    ge-0/0/13.0



Attention, il y a quelques pièges. Par exemple, s'il existe plusieurs 
chemins entre le client et le serveur DHCP, et que la machine SAVI 
n'est que sur un seul de ces chemins, elle risque de rater le dialogue 
DHCP. Autre cas problématique si une machine se déplace d'un port à un 
autre sans refaire une requête DHCP.

La section 7 propose des solutions à ces problèmes de faux positifs. 
L'idée est de noter le trafic rejeté par SAVI-DHCP et de vérifier 
activement si le paquet a été rejeté à tort (le mal nommé « "Data 
Snooping Process" »). Par exemple, en IPv4, on peut envoyer des 
requêtes ARP (RFC 826 et RFC 5227) pour déterminer si deux machines (la 
vraie et l'usurpatrice) utilisent la même adresse IP (s'il n'y a qu'une 
machine, la vraie, on ne recevra qu'une réponse). En IPv6, on peut 
utiliser un message DAD ("Duplicate Address Detection", cf. RFC 4862, 
section 5.4) pour faire le même test.

On peut aussi, si on a raté ou qu'on pense avoir raté le dialogue DHCP, 
demander directement au serveur DHCP, avec un message DHCPLEASEQUERY 
(RFC 4388) en IPv4 et LEASEQUERY (RFC 5007) en IPv6.

Bref, comme toujours en sécurité, on n'a pas de repas gratuit : 
SAVI-DHCP protège contre bien des usurpations mais, comme toute 
technique de filtrage, il peut mener au rejet de messages légitimes.

Le mécanisme de SAVI-DHCP nécessite de mémoriser un état, la BST 
("Binding State Table", décrite en section 5). Si elle est gardée en 
RAM et qu'on redémarre,la liste des liens est perdue et tous les 
paquets seront rejetés (c'est pourquoi, en général, IP déconseille de 
garder de l'état dans le réseau). La section 9 rappelle ce problème et 
demande donc que la BST soit stockée dans une mémoire qui survit aux 
redémarrages. (On pourrait récupérer un bon bout de la BST par les 
méthodes de la section 7 mais ça prendrait un temps fou.) À noter que, 
sur un Juniper, ce n'est pas fait par défaut (il faut la directive 
dhcp-snooping-file pour stocker la BST).

Terminons ce résumé du RFC avec la section 11, consacrée aux questions 
de sécurité. D'abord, les risques que crée le "Data Snooping process" 
de la section 7. Comme ce processus est coûteux en nombre de paquets 
envoyés, un attaquant pourrait être tenté de le déclencher afin de 
réaliser une attaque par déni de service. Pour cela, il aurait juste à 
envoyer quelques paquets usurpés. Le processus doit donc avoir une 
limitation de trafic.

Plusieurs autres attaques sont possibles contre ce mécanisme de 
sécurité complexe qu'est SAVI-DHCP (réutiliser l'adresse d'un client 
qui est parti et ne peut donc plus se défendre en cas de détection 
d'adresse dupliquée, créer de nombreux liens pour remplir la BST et 
faire une attaque par déni de service, etc). Il y a aussi un risque sur 
la vie privée, puisque la BST stocke de nombreuses informations sur 
l'arrivée et le départ des machines des utilisateurs. Elle ne doit donc 
pas être archivée. L'idée est qu'aucune information ne devrait être 
gardée sur les machines qui n'usurpent jamais d'adresse IP (ne pas 
fliquer les gens honnêtes).

À noter que Cisco prétend avoir inventé la technique et a un brevet 
<http://datatracker.ietf.org/ipr/2373/> sur l'idée, mais propose une 
licence (avec clause de représailles).

Merci à Cécile Grange pour des indications sur les solutions Juniper.


---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/

Répondre à