Ich schreibe einen sehr einfachen Netzfilter und komme dahin, wo ich IPv6-Header analysieren möchte, um Dinge wie ICMPv6-Typen, TCP / UDP-Portnummern usw. abzugleichen.
Ich lese also ausführlich über das IPv6-Paketformat und ich denke, ich musste es immer wieder lesen, um sicherzugehen, dass ich es tatsächlich richtig gelesen habe. Mir scheint, Sie müssen mit dem festen 40-Byte-Header beginnen und sich das nächste Header-Feld ansehen. Dann müssen Sie sich das nächste Headerfeld des nächsten Headers usw. wie eine verknüpfte Liste ansehen, bis Sie das Ende erreichen. Wenn es Nutzlast gibt, wird es folgen.
Das Problem ist, dass weder im festen Header noch im Erweiterungsheader ein Längenfeld vorhanden ist. Sie müssen eine Tabelle mit Erweiterungsheadertypen und deren Größen haben, damit Sie diese verknüpfte Liste bis zum Ende verfolgen können.
Dies scheint mir ein seltsames, möglicherweise sogar hasenhirniges Design zu sein. Was passiert, wenn ich auf einen nicht erkannten Erweiterungsheadertyp stoße? Was mache ich? Ich weiß nicht, wie lang es ist. Ich denke, ich muss das Paket wegwerfen und blockieren, da in einem Netzfilter, der das Paket durchlässt, ein Angreifer dem Netzfilter ausweichen kann, indem er einen falschen Headertyp hinzufügt. Dies bedeutet jedoch, dass, wenn das Protokoll jemals erweitert wird, jede einzelne jemals geschriebene IPv6-Header-Parsing-Software gleichzeitig aktualisiert werden muss, wenn die neue Erweiterung verwendet werden soll.
Wie kann ich IPv6-Header analysieren, wenn ich die verwendeten Erweiterungen nicht kenne? Wie kann ich einen Header für eine unbekannte Erweiterung überspringen, da ich deren Länge nicht kenne?