网络安全中的字符串匹配与IP回溯技术
1. 多字符串匹配算法
在网络安全领域,对数据包负载中的多字符串进行搜索是一项重要任务。早期的Snort版本通过依次将每个数据包与每个Snort规则进行匹配来进行字符串搜索,对于分类器部分匹配的每个规则,Snort会对相应的字符串运行Boyer - Moore搜索,每个数据包可能需要进行多次字符串搜索。由于每次扫描数据包的成本较高,因此自然会想到能否在一次遍历数据包的过程中搜索所有可能的字符串。有两种算法可用于此目的:Aho - Corasick算法和Commentz - Walter提出的改进算法。
1.1 Aho - Corasick算法
Aho - Corasick算法在要搜索的字符串集合上构建一个字母树(trie)。例如,在图中构建了基于“babar”和“barney”这两个字符串的trie。搜索字符串时,通过文本中的字符沿着trie的指针进行遍历,直到找到叶节点字符串或搜索失败。
当搜索在数据包负载中可以从任意位置开始的字符串时,简单的方法是假设字符串从负载的第一个字节开始,然后遍历trie,如果失败则从第二个字节重新开始。但这种方法效率较低,因为如果数据包字节与目标字符串多次“接近匹配”,对于每个可能的起始位置,搜索可能会遍历接近trie高度的节点。
为了避免这种情况,Aho - Corasick算法引入了失败指针。当搜索失败时,失败指针可以使搜索直接跳转到trie中对应路径的节点,而无需回到trie的顶部重新开始。例如,在搜索“babar”时,当遇到不匹配的字节时,根据失败指针可以直接跳转到对应“bab”路径的节点继续搜索。
该算法在硬件中实现搜索较为容易,因为带有