summaryrefslogtreecommitdiff
path: root/RFC_8021_Generation_of_IPv6_Atomic_Fragments_Considered_Harmful.txt
blob: 0b4d1aaf242ca982fe01f90578af69f467168653 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Titre: RFC 8021: Generation of IPv6 Atomic Fragments Considered Harmful
Auteur: 
Date: Sat 07 Jan 2017 01:00:00 +0100
Lien: https://www.bortzmeyer.org/8021.html

C'est quoi, un « fragment atomique » ? Décrits dans le RFC 6946, ces charmants 
objets sont des datagrammes IPv6 qui sont des fragments... sans en être. Ils 
ont un en-tête de fragmentation sans être fragmentés du tout. Ce RFC estime 
qu'ils ne servent à rien, et sont dangereux, et devraient donc ne plus être 
générés.

Le mécanisme de fragmentation d'IPv6 (assez différent de celui d'IPv4) est 
décrit dans le RFC 2460, sections 4.5 et 5. Que se passe-t-il si un routeur 
génère un message ICMP Packet Too Big (RFC 4443, section 3.2) en indiquant une 
MTU inférieure à 1 280 octets, qui est normalement la MTU minimale d'IPv6 ? (Le
plus beau, c'est que ce routeur n'est pas forcément en tort, cf. RFC 6145, qui 
décrivait leur utilisation pour être sûr d'avoir un identificateur de 
datagramme.) Eh bien, dans ce cas, l'émetteur du datagramme trop gros doit 
mettre un en-tête « Fragmentation » dans les datagrammes suivants, même s'il ne
réduit pas sa MTU en dessous de 1 280 octets. Ce sont ces datagrammes portant 
un en-tête « Fragmentation » mais pas réellement fragmentés (leur bit M est à 
0), qui sont les fragments atomiques du RFC 6946.

Malheureusement, ces fragments atomiques permettent des attaques contre les 
machines IPv6 (section 2 du RFC). Il existe des attaques liées à la 
fragmentation (RFC 6274 et RFC 7739). Certaines nécessitent que les datagrammes
soient réellement fragmentés mais ce n'est pas le cas de toutes : il y en a qui
marchent aussi bien avec des fragments atomiques. Un exemple d'une telle 
attaque exploite une énorme erreur de certaines middleboxes, jeter les 
datagrammes IPv6 ayant un en-tête d'extension, quel qu'il soit (y compris, 
donc, l'en-tête Fragmentation). Ce comportement est stupide mais hélas répandu 
(cf. RFC 7872). Un attaquant peut exploiter cette violation de la neutralité du
réseau pour faire une attaque par déni de service : il émet des faux messages 
ICMP Packet Too Big avec une MTU inférieur à 1 280 octets, la source se met à 
générer des fragments atomiques, et ceux-ci sont jetés par ces imbéciles de 
middleboxes.

Le RFC décrit aussi une variante de cette attaque, où deux pairs BGP jettent 
les fragments reçus (méthode qui évite certaines attaques contre le plan de 
contrôle du routeur) mais reçoivent les ICMP Packet Too Big et fabriquent alors
des fragments atomiques. Il serait alors facile de couper la session entre ces 
deux pairs. (Personnellement, le cas me parait assez tiré par les cheveux...)

Ces attaques sont plus faciles à faire qu'on ne pourrait le croire car : 

  * Un paquet ICMP peut être légitimement émis par un routeur intermédiaire et 
    l'attaquant n'a donc pas besoin d'usurper l'adresse IP de la destination 
    (donc, BCP 38[1] ne sert à rien).
  * Certes, l'attaquant doit usurper les adresses IP contenues dans le message 
    ICMP lui-même mais c'est trivial : même si on peut en théorie envisager des
    contrôles du style BCP 38 de ce contenu, en pratique, personne ne le fait 
    aujourd'hui.
  * De toute façon, pas mal de mises en œuvres d'IP ne font aucune validation 
    du contenu du message ICMP (malgré les recommandations du RFC 5927).
  * Un seul message ICMP suffit, y compris pour plusieurs connexions TCP, car 
    la MTU réduite est typiquement mémorisée dans le cache de l'émetteur.
  * Comme la seule utilisation légitime connue des fragments atomiques était 
    celle du RFC 6145 (qui a depuis été remplacé par le RFC 7915), on pourrait 
    se dire qu'il suffit de limiter leur génération aux cas où on écrit à un 
    traducteur utilisant le RFC 6145. Mais cela ne marche pas, car il n'y a pas
    de moyen fiable de détecter ces traducteurs.

Outre ces problèmes de sécurité, le RFC note (section 3) que les fragments 
atomiques ne sont de toute façon pas quelque chose sur lequel on puisse 
compter. Il faut que la machine émettrice les génère (elle devrait, mais la 
section 6 du RFC 6145 note que beaucoup ne le font pas), et, malheureusement, 
aussi bien les messages ICMP Packet Too Big que les fragments sont souvent 
jetés par des machines intermédiaires.

D'ailleurs, il n'est même pas certain que la méthode du RFC 6145 (faire générer
des fragments atomiques afin d'obtenir un identificateur par datagramme) marche
vraiment, l'API ne donnant pas toujours accès à cet identificateur de fragment.
(Au passage, pour avoir une idée de la complexité de la mise en œuvre des 
fragments IP, voir cet excellent article sur le noyau Linux[2].)

En conclusion (section 4), notre RFC demande qu'on abandonne les fragments 
atomiques : 

  * Les traducteurs du RFC 7915 (la seule utilisation légitime connue) 
    devraient arrêter d'en faire générer.
  * Les machines IPv6 devraient désormais ignorer les messages ICMP Packet Too 
    Big lorsqu'ils indiquent une MTU inférieure à 1 280 octets.


Liens:
[1]: http://www.bortzmeyer.org/bcp38.html (lien)
[2]: https://github.com/NICMx/Jool/wiki/nf_defrag_ipv4-and-nf_defrag_ipv6 (lien)