using namespace snort;
extern const BaseApi* cd_ipv4[]; // static due to dependence on fpdetect
+extern const BaseApi* cd_ipv6[]; // static due to dependence on fpdetect
extern const BaseApi* cd_hopopts[]; // static to ensure the symbols CheckIPV6HopOptions
// and CheckIPv6ExtensionOrder the final executable.
extern const BaseApi* cd_tcp[]; // static because only file that specific functions
extern const BaseApi* cd_icmp4_ip[];
extern const BaseApi* cd_icmp6[];
extern const BaseApi* cd_icmp6_ip[];
-extern const BaseApi* cd_ipv6[];
extern const BaseApi* cd_igmp[];
extern const BaseApi* cd_llc[];
extern const BaseApi* cd_mobility[];
void load_codecs()
{
PluginManager::load_plugins(cd_ipv4);
+ PluginManager::load_plugins(cd_ipv6);
PluginManager::load_plugins(cd_tcp);
PluginManager::load_plugins(cd_hopopts);
PluginManager::load_plugins(cd_icmp4_ip);
PluginManager::load_plugins(cd_icmp6);
PluginManager::load_plugins(cd_icmp6_ip);
- PluginManager::load_plugins(cd_ipv6);
PluginManager::load_plugins(cd_igmp);
PluginManager::load_plugins(cd_llc);
PluginManager::load_plugins(cd_mobility);
cd_icmp4.cc
cd_icmp6.cc
cd_igmp.cc
- cd_ipv6.cc
cd_no_next.cc
cd_mobility.cc
cd_pgm.cc
add_dynamic_module(cd_icmp6 codecs cd_icmp6.cc checksum.h)
add_dynamic_module(cd_igmp codecs cd_igmp.cc)
# add_dynamic_module(cd_ipv4 codecs cd_ipv4.cc checksum.h)
- add_dynamic_module(cd_ipv6 codecs cd_ipv6.cc checksum.h)
+# add_dynamic_module(cd_ipv6 codecs cd_ipv6.cc checksum.h)
add_dynamic_module(cd_mobility codecs cd_mobility.cc)
add_dynamic_module(cd_no_next codecs cd_no_next.cc)
add_dynamic_module(cd_pgm codecs cd_pgm.cc checksum.h)
add_library( ip_codecs OBJECT
cd_ipv4.cc # Static due to its dependence on fpdetect
+ cd_ipv6.cc # Static due to its dependence on fpdetect
cd_hop_opts.cc # Ensured the symbols CheckIPV6HopOptions && CheckIPv6ExtensionOrder are in the binary.
cd_tcp.cc # Only file to use some functions. Must be included in binary.
checksum.h
#include "framework/codec.h"
#include "log/text_log.h"
#include "main/snort_config.h"
+#include "parser/parse_ip.h"
+#include "sfip/sf_ipvar.h"
using namespace snort;
#define CD_IPV6_NAME "ipv6"
#define CD_IPV6_HELP_STR "support for Internet protocol v6"
#define CD_IPV6_HELP ADD_DLT(CD_IPV6_HELP_STR, DLT_IPV6)
+static sfip_var_t* ReservedIpv6 = nullptr;
namespace
{
{ DECODE_IP6_EXCESS_EXT_HDR, "too many IPv6 extension headers" },
{ DECODE_MIPV6_BAD_PAYLOAD_PROTO,
"IPv6 mobility header includes an invalid value for the 'payload protocol' field" },
+ { DECODE_IPV6_SRC_RESERVED, "IPv6 packet from reserved source address" },
+ { DECODE_IPV6_DST_RESERVED, "IPv6 packet to reserved dest address" },
{ 0, nullptr }
};
{
codec_event(codec, DECODE_IPV6_DST_ZERO);
}
+
+ if (codec.conf->is_address_anomaly_check_enabled())
+ {
+ if (sfvar_ip_in(ReservedIpv6, ip_src))
+ codec_event(codec, DECODE_IPV6_SRC_RESERVED);
+
+ if (sfvar_ip_in(ReservedIpv6, ip_dst))
+ codec_event(codec, DECODE_IPV6_DST_RESERVED);
+ }
}
void Ipv6Codec::CheckIPV6Multicast(const ip::IP6Hdr* const ip6h, const CodecData& codec)
static void mod_dtor(Module* m)
{ delete m; }
+static void ipv6_codec_ginit()
+{
+ /* Check against reserved ipv6 addresses. These are listed at:
+ https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xml */
+ ReservedIpv6 = sfip_var_from_string(
+ "[0000::/8,0100::/8,0200::/7,0400::/6,0800::/5,1000::/4,4000::/3,6000::/3,8000::/3,"
+ "a000::/3,c000::/3,e000::/4,f000::/5,f800::/6,fe00::/9]", "ipv6");
+ assert(ReservedIpv6);
+}
+
+static void ipv6_codec_gterm()
+{
+ sfvar_free(ReservedIpv6);
+}
+
static Codec* ctor(Module*)
{ return new Ipv6Codec(); }
mod_ctor,
mod_dtor,
},
- nullptr, // pinit
- nullptr, // pterm
+ ipv6_codec_ginit, // pinit
+ ipv6_codec_gterm, // pterm
nullptr, // tinit
nullptr, // tterm
ctor, // ctor