基于存储器层次的有限自动机的编译的制作方法_2

文档序号:9263437阅读:来源:国知局
如,gr[ea]y查找grey和gray两者。其他的复杂子图样的示例是可以使用破折号来表示字符范围的那些,例如,[A-Z]或匹配任何一个字符的元字符”。图样的一个元素可以是一个基本元素或者一个或多个基本元元组合与一个或多个元字符的组合。
[0054]对DFA或NFA状态机的输入典型地包括多个区段,如一个(8位)字节的字符串,也就是,字母表可以是来自输入流(即,所接收的数据包)的单个字节(一个字符或符号)。输入流中的每个区段(例如,字节)可以造成从一个状态到另一个状态的转换。DFA或NFA状态机的这些状态和转换函数可以通过一个节点图形来表示。图形中的每个节点可以表示一个状态并且图中的弧线(在此也被称为转换或转换弧线)可以代表状态转换。该状态机的当前状态可以通过一个节点标识符来代表,该标识符选择该图形中的一个特定的节点。
[0055]使用DFA来处理正则表达式并且在字符输入流中找到由正则表达式描述的一个或多个图样可以被表征为具有确定型运行时间性能。DFA的下一状态可以从一个输入字符(或符号)以及该DFA的当前状态来确定,因为每个DFA状态仅有一次状态转换。于是,DFA的运行时间性能被称为是确定型的,并且其行为可以从该输入进行完全地预测。然而,确定论的折中是这样一个图形:其中节点的数目(或图形尺寸)可能随着图样的尺寸以指数增长。
[0056]相反,NFA图形的节点数目(或图形尺寸)可以被表征为随着图样的尺寸线性地增长。然而,使用NFA来处理正则表达式并且在字符输入流中找到由正则表达式描述的一个或多个图样可以被表征为具有非确定型运行时间性能。例如,给定一个输入字符(或符号)以及NFA的一个当前状态,有可能存在该NFA转换到一个以上的下一状态。于是,NFA的下一状态不能从输入和NFA的当前状态唯一地确定。因此,NFA的运行时间性能被称为是非确定型的,因为其行为不能从该输入进行完全地预测。
[0057]图2A-G展示了 DFA “图爆”概念。图2A、2B、和2C展示了分别用于图样*a[~\η], ” “.*&Γ\η] Γ\η],” “.*&Γ\η] Γ\η] Γ\η],”的 NFA 图形,而图 2D、2E、和 2F 展示了分另Ij用于相同图样的DFA图形。如在图2A-2F中所示并且由图2G的表总结的,NFA图形可以对于某些图样线性地增长而DFA图形对于相同的图样可能指数地增长,从而导致图爆。如所示的,对于一个或多个给定的图样,DFA状态的数目可以大于NFA状态的数目,典型地是在多数百个或多数千个状态的量级。这是“图爆”的一个示例,这是DFA的标志特征。
[0058]根据在此披露的实施例,内容搜索可以使用DFA、NFA或其组合来进行。根据一个实施例,一个运行时间处理器、协处理器、或其组合可以硬件实现并且可以被配置成实现一个编译器或行走器。
[0059]该编译器可以将一个图样或一个图样输入列表(也称为签名或规则)编译到DFA、NFA或其组合中。DFA和NFA可以是二进制数据结构,如DFA和NFA图形和表。
[0060]行走器可以执行运行时间处理,即用于标识在输入流中的一个图样的存在或者将该图样与在输入流中的内容进行匹配的行动。内容可以是一个互联网协议(IP)数据报的一个有效载荷部分、或在输入流中的任何其他合适的有效载荷。DFA或NFA图形的运行时间处理可以被称为使用该有效载荷行走该DFA或NFA图形,以确定图样匹配。被配置成用于生成DFA、NFA或其组合的一个处理器在此可以被称为编译器。被配置成用于使用所生成的DFA、NFA或其组合来实现有效载荷的运行时间处理的一个处理器在此可以被称为行走器。根据在此披露的实施例,网络服务处理器100可以被配置成用于在安全装置102中实现一个编译器和一个行走器。
[0061]图3A是图1的安全装置102的另一个实施例的框图,其中,可以实现在此披露的实施例。如参考图1披露的,安全装置102可以操作地耦合到一个或多个网络并且可以包括存储器104和网络服务处理器100,该网络服务处理器可以包括加速单元106。参考图3A,网络服务处理器100可以被配置成用于实现一个编译器306,该编译器生成二进制图像112和一个使用二进制图像112的行走器320。例如,编译器306可以生成包括由行走器320使用的编译规则数据的二进制图像112以便在所接收的数据包1la(在图1中展示)上执行图样匹配方法。根据在此披露的实施例,编译器306可以基于如下进一步描述的至少一种启发法通过确定DFA、NFA或其组合的编译规则数据来生成二进制图像112。编译器306可以确定有利地适合DFA和NFA的规则数据。
[0062]根据在此描述的实施例,编译器306可以通过处理一个规则集310来生成二进制图像112,该规则集可以包括一组一个或多个正则表达式图样304和任选的限定符308。从规则集310中,编译器306可以使用选自该一个或多个正则表达式图样中所有图样的子图样生成一个统一的DFA 312以及用于在该组一个或多个正则表达式图样304中的至少一个图样的至少一个NFA 314,用于由行走器320在运行时间处理过程中使用,以及包括用于在统一的DFA 312的状态(未展示)和该至少一个NFA 314的状态之间转换行走器320的映射信息的元数据(未展示)。
[0063]该统一的DFA 312和该至少一个NFA 314可以逐数据结构地作为图形或者以其他任何合适的形式来表示,并且在元数据中的映射可以逐数据结构地作为一个或多个表或者以其他任何合适的形式来表示。根据在此披露的实施例,如果选自一个图样的一个子图样是该图样,则对于该图样不生成NFA。根据在此披露的实施例,所生成的每个NFA可以用于该组中的一个特定的图样,而一个统一的DFA可以基于来自该组中所有图样的所有子图样来生成。
[0064]行走器320基于消耗(即,处理)来自所接收的数据包1la中的有效载荷的区段(如字节)通过转换该统一的DFA 312和该至少一个NFA的状态用该有效载荷来行走该统一的DFA 312和该至少一个NFA 314。于是,行走器320使该有效载荷走过该统一的DFA312和该至少一个NFA 314,该至少一个NFA可以是对于单个正则表达式图样生成的一个每图样NFA。
[0065]规则集310可以包括一组一个或多个正则表达式图样304,并且可以处于Perl兼容的正则表达式(PCRE)形式或者任何其他合适的形式。PCRE已经成为在安全和联网应用中正则表达式句法的事实标准。由于更多的要求深度数据包检查的应用已经出现或者更多的威胁已经在互联网上变得流行,用于标识病毒/攻击或应用的相应的签名/图样也已经变得更复杂。例如,签名数据库已经从具有简单的字符串图样演进到具有通配符、范围、字符类和高级PCRE签名的正则表达式(regex)图样。
[0066]如在图3A中所示,任选的限定符308可以各自与该组正则表达式图样304中的一个图样相关联。例如,任选的限定符322可以与图样316相关联。任选的限定符308可以各自是指定所希望的定制、高级PCRE签名选项、或其他对于处理与这些限定符相关的图样而言合适的选项的一个或多个限定符。例如,限定符322可以指示该高级PCRE签名选项的一个起始偏移(即,在有效载荷中匹配的一个图样的一个第一匹配字符在有效载荷中的位置)选项对于图样316是否是希望的。
[0067]根据在此披露的实施例,编译器306可以使用选自该组一个或多个正则表达式图样304中的所有图样的子图样302来生成一个统一的DFA 312。编译器306可以基于如下进一步描述的至少一种启发法从该组一个或多个正则表达式图样304中的每一个图样中选择子图样302。编译器306还可以生成用于该组中的至少一个图样316的至少一个NFA314,该至少一个图样316的一部分(未展示)用于生成该至少一个NFA314,并且用于该至少一个NFA 314的运行时间处理(B卩,行走)的至少一个行走方向可以是基于所选的子图样318的长度是固定的还是可变的、以及所选的子图样318在该至少一个图样316中的位置来确定。编译器306可以将该统一的DFA 312和该至少一个NFA 314存储在该至少一个存储器104 中。
[0068]该编译器可以确定所选的潜在子图样的长度是固定的还是可变的。例如,如“cdef”的子图样的长度可以被确定为具有为4的固定长度,因为“cdef”是一个字符串,而包括运算符的复杂的子图样可以被确定为具有可变的长度。例如,如“a.*cdr\n]{O, 10}.*y”的复杂子图样可以具有“cdr\n] {O, 10} ”作为所选的子图样,该子图样可以具有2到12的可变长度。
[0069]根据在此披露的实施例,子图样选择可以是基于至少一种启发法。一个子图样是一组来自一个图样的一个或多个连续的元素,其中,来自该图样的每一个元素可以通过一个在DFA或NFA图形中的节点表示,这是为了匹配来自该有效载荷的字节或字符的目的。如上所述,一个元素可以是由一个节点表示的单个文本字符,或由一个节点表示的一个字符类。基于一个子图样是否有可能导致过多的DFA图爆,如以上参考图2A-G描述的,编译器306可以确定该图样中的哪个子图样更好地适合NFA。例如,从一个包括连续文本字符的子图样生成DFA将不会导致DFA图爆,而如上所述的复杂的子图样可以包括运算符以及字符并因此可能导致DFA图爆。例如,包括重复多次的通配符或更大字符类的子图样(例如,Γ\η]*或Γ\η]{16})可能导致在DFA中过多的状态并因此可能更有利地适合于NFA。于是,编译器306在此可以被称为“智能编译器”。
[0070]如以上所披露的,从在该组一个或多个正则表达式304中的每个图样选择一个子图样可以是基于至少一种启发法。根据一个实施例,该至少一种启发法可以包括将所选唯一子图样的数目和所选每个子图样的长度最大化。例如,如“ab.*cdef.*mn”的一个图样可以具有多个潜在的子图样,如“ab.”、“cdef”和该编译器可以选择“cdef”作为该图样的子图样,因为它是在图样“ab.*cdef.*mn”中不太可能导致DFA图爆的最大的子图样。然而,如果子图样“cdef”已经对另一个图样选中,则该编译器可以选择图样“ab.*cdef.*mn”的一个替代子图样。替代性地,该编译器可以对于该另一个图样用另外的子图样来替换子图样“cdef ”,使得子图样“cdef”能够对于图样“ab.*cdef.*mn”进行选择。
[0071]于是,编译器306可以基于对于这些图样304中的每个而言可能的子图样的上下文来对图样304选择子图样,使得能够将所选的唯一子图样的数目和所选的每个子图样的长度最大化。于是,编译器306可以从所选的子图样302生成一个统一的DFA 312,这通过增加一个图样在该至少一个NFA 314中匹配的概率而使在该至少一个NFA 314的图样匹配中误报(即,无匹配或部分匹配)的数目最小化。
[0072]通过使子图样长度最大化,在NFA处理中的误报可以避免。在NFA处理中的误报可能导致非确定型运行时间处理,并且因此可能降低运行时间性能。另外,通过使所选的唯一子图样的数目最大化,编译器306使得在该统一的DFA与从该统一的DFA中(来自该图样)的一个子图样的匹配所给定的组中的一个子图样所生成的该至少一个NFA 314的1:1的转换成为可能。
[0073]例如,如果所选的子图样由多个图样共享,那么该统一的DFA的一个行走器将会需要转换到多个至少一个NFA,因为每个至少一个NFA是一个每图样NFA,并且来自该统一的DFA的子图样匹配表示对于该多个图样中的每个的部分匹配。于是,使唯一子图样的数目最大化减少了 DFA:NFA数目1:N的转换,从而减少了通过行走器320的运行时间处理。
[0074]为了使唯一子图样的数目能够最大化,编译器302可以计算所选子图样318的一个哈希值326并且将所计算的哈希值326与从中选择子图样318的一个图样316的一个标识符(未展示)相关联地进行存储。例如,编译器306可以对于在该组304中的每个图样计算所选子图样的一个哈希值。所计算的哈希值324可以作为一个表或以任何合适的方式存储在该至少一个存储器104中。所用的哈希方法可以是任何合适的哈希方法。该编译器可以将所计算的哈希值与对于该组中其他图样所选的子图样的一个哈希值列表进行比较,以便确定所选的子图样是否唯一。
[0075]如果所计算的哈希值存在于该列表中,该编译器可以确定是(i)用来自该图样的另一个子图样替换该子图样还是(ii)用选自该组中的另一个图样的一个替代子图样来替换对于该组中的该另一个图样所选的子图样。该组中的另一个图样可以基于与该列表中与所计算的哈希值的关联进行标识。确定是替换(i)还是(ii)可以是基于比较考虑用于替换的子图样的长度,以便如上所述使正被选择的唯一子图样的长度最大化。替换一个所选的子图样可以包括选择对于一个给定图样标识的下一最长子图样或者下一最高优先级的子图样。例如,潜在的子图样可以基于造成DFA图爆的可能性或者预期的DFA图爆的强度来确定优先级。
[0076]根据在此披露的实施例,该至少一种启发法可以包括标识每个图样的子图样并且如果给定的子图样具有小于一个最小阈值的长度,则忽略每个图样的这些所标识的子图样中的一个给定的子图样。例如,为了减少在该至少一个NFA中的误报,该编译器可以忽略具有小于该最小阈值的长度的子图样,因为此类子图样可能导致在该至少一个NFA中的更高的误报概率。
[0077]该至少一种启发法可以包括访问与使用指示符的历史频率相关联的一个子图样知识库(未展示),并且如果在所访问的知识库中对于该给定子图样的使用指示符的历史频率大于或等于一个频率使用阈值,则忽略每个图样的这些所标识的子图样中的一个给定的子图样。例如,应用或协议专用的子图样可以具有高使用频率,如对于超文本传送协议(HTTP)有效载荷、“回车换行”、或空流量(clear traffic)如来自二进制文件的多个连续的O,或任何其他频繁使用的子图样。
[0078]该至少一种启发法可以包括标识每个图样的子图样,并且对于每个图样,通过选择所标识的子图样中的一个给定的子图样,基于该给定的子图样具有这些所标识的子图样中最大的连续文本字符数目并且基于该给定的子图样对于该组一个或多个正则表达式所选的所有子图样中是唯一的,来最大化在所选子图样中的连续文本字符的数目。如以上所披露的,使所选的子图样的长度最大化可以使能在该至少一个NFA中存在更高的匹配概率。
[0079]该至少一种启发法可以包括基于这些给定子图样中每个的子图样类型和这些给定子图样的长度来设置每个图样的给定子图样的优先级。该子图样类型可以是纯文本、交替、单字符重复、或多字符重复,并且对于子图样类型从最高到最低的优先级顺序可以是纯文本、交替、单字符重复、和多字符重复。于是,为具有至少一个最小长度阈值的长度的文本串的子图样可以被设置为优先级高于可变长度的复杂子图样。
[0080]编译器306可以使更长长度的子图样的优先级高于较短长度的另一个子图样。编译器306可以基于优先级设置选择一个唯一子图样作为该所选子图样。如上所述,所选的唯一子图样可以具有至少一个最小长度阈值的长度。
[0081]如果给定的子图样都不是唯一并且具有至少该最小长度阈值的长度的,则编译器306可以基于优先级设置选择一个非唯一子图样作为所选的子图样。于是,编译器306可以从一个图样中选择一个子图样,该子图样是选自另一个图样的子图样的一个副本,而不是选择具有小于该最小阈值的长度的一个子图样。为了协助完成子图样,编译器306可以在这些图样上进行多次忽略并且将可能的子图样通过长度分类。于是,对于在该组一个或多个正则表达式304中的一个给定图样的编译器子图样选择可以在对于在该组一个或多个正则表达式304中的其他图样的子图样选择的上下文内进行。
[0082]如上所述,限定符322可以指示希望报告一个起始偏移。然而,该起始偏移可能不容易分辨。例如,在给定一个如“axycamb”的有效载荷时,在有效载荷匹配图样中找到一个起始偏移如“a.*b”或“a.*d”可能是困难的,因为可能正在匹配两个图样“axycamb”和“amb.”。于是,可能需要追踪对于在该有效载荷中“a”的两个实例的偏移作为潜在起始偏移。根据在此披露的实施例,潜在的起始偏移不需要被追踪,由于在已经确定在一个有效载荷中找到该整个图样的匹配之前不确定该起始偏移。确定整个图样的匹配可以通过采用来自该统一的DFA、该至少一个NFA或其组合的匹配结果来发现
当前第2页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1