J'écris un filtre réseau très simple et j'arrive là où je veux analyser les en-têtes IPv6 pour faire correspondre des éléments tels que les types ICMPv6, les numéros de port TCP / UDP, etc.
Donc, je lis en profondeur le format de paquet IPv6 , et je suis un peu comme ... eh bien ... j'ai en quelque sorte dû le lire encore et encore pour m'assurer que je le lisais correctement. Il me semble que vous devez commencer par l'en-tête fixe de 40 octets et regarder son champ d'en-tête suivant. Ensuite, vous devez regarder le champ d'en-tête suivant de l'en-tête suivant, et ainsi de suite, comme une liste liée, jusqu'à ce que vous atteigniez la fin. S'il y a une charge utile, cela suivra.
Le problème est qu'il n'y a pas de champ de longueur dans l'en-tête fixe ou dans les en-têtes d'extension. Vous devez disposer d'un tableau des types d'en-têtes d'extension et de leurs tailles afin de pouvoir poursuivre cette liste liée jusqu'à la fin.
Cela me semble être un design étrange, peut-être même insensé. Que faire si je rencontre un type d'en-tête d'extension non reconnu? Que fais-je? Je ne connais pas sa longueur. Je suppose que je dois jeter le paquet et le bloquer, car dans un filtre réseau, autoriser le paquet permettrait à un attaquant d'échapper au filtre réseau en incluant un type d'en-tête faux. Mais cela signifie que si le protocole est étendu, chaque élément du logiciel d'analyse d'en-tête IPv6 jamais écrit doit être mis à jour simultanément si la nouvelle extension doit être utilisée.
Alors, comment puis-je analyser les en-têtes IPv6 si je ne connais pas les extensions qu'ils utilisent? Comment puis-je sauter un en-tête pour une extension inconnue, car je ne connais pas sa longueur?