Я пишу очень простой сетевой фильтр и добираюсь до места, где я хочу разбирать заголовки IPv6, чтобы соответствовать типам ICMPv6, номерам портов TCP/UDP и т.д.
Итак, я подробно читаю о формате пакета IPv6, и я вроде как... ну... Мне вроде как пришлось читать это снова и снова, чтобы убедиться, что я действительно читаю его правильно. Мне кажется, что вы должны начать с 40-байтового фиксированного заголовка и посмотреть его следующее поле заголовка. Затем вам нужно посмотреть следующее поле заголовка следующего заголовка и т.д., Как связанный список, до тех пор, пока вы не достигнете конца. Если есть полезная нагрузка, она будет следовать.
Проблема заключается в том, что поле длины не существует ни в фиксированном заголовке, ни в заголовках расширений. У вас должна быть таблица типов заголовков расширений и их размеры, чтобы вы могли преследовать этот связанный список до конца.
Это поражает меня как странный, возможно, даже модный дизайн. Что делать, если я сталкиваюсь с непризнанным типом заголовка расширений? Что я делаю? Я не знаю его длины. Думаю, мне нужно выбросить пакет и заблокировать его, поскольку в сетевом фильтре, разрешающем сквозной пакет, позволит злоумышленнику уклониться от сетевого фильтра, включив поддельный тип заголовка. Но это означает, что если протокол когда-либо расширяется, каждый отдельный файл программного обеспечения для разбора заголовков IPv6, когда-либо написанный, должен быть одновременно обновлен, если будет использоваться новое расширение.
Итак, как я могу разобрать заголовки IPv6, если не знаю, какие расширения они используют? Как я могу пропустить заголовок для неизвестного расширения, так как я не знаю его длины?