用于遍历为具有高级特征的正则表达式图样生成的非确定有限自动机(nfa)的系统和方法

文档序号:8395915阅读:227来源:国知局
用于遍历为具有高级特征的正则表达式图样生成的非确定有限自动机(nfa)的系统和方法
【专利说明】用于遍历为具有高级特征的正则表达式图样生成的非确定 有限自动机(NFA)的系统和方法 背景
[0001] 开放系统互连(OSI)参考模型定义了用于通过传输介质进行通信的7个网络协议 层(L1-L7)。上层(L4-L7)表示端到端通信并且下层(L1-L3)表示本地通信。
[0002] 联网应用感知系统需要处理、过滤和切换L3到L7网络协议层的范围,例如,L7网 络协议层诸如超文本传输协议(HTTP)和简单邮件传输协议(SMTP),以及L4网络协议层诸 如传输控制协议(TCP)。除了处理网络协议层以外,联网应用感知系统需要通过L4-L7网络 协议层来同时通过基于访问和内容的安全性来保护这些协议,这些协议层包括防火墙、虚 拟专用网(VPN)、安全套接字层(SSL)、入侵检测系统(IDS)、互联网协议安全(IPSec)、线速 的防病毒(AV)和防垃圾邮件功能。线速是在其上传输和接收数据的网络的物理介质上的 数据传送速率。
[0003] 网络处理器可用于高吞吐量L2和L3网络协议处理,S卩,执行数据包处理从而以线 速转发数据包。通常,通用处理器用于处理需要更多智能处理的L4-L7网络协议。虽然通 用处理器可以执行计算密集型任务,但是没有足够用于处理数据使得其能够被以线速转发 的性能。
[0004] 内容感知联网需要以"线速"的对数据包的内容的检查。可以对内容进行分析,以 确定是否存在安全漏洞或入侵。应用大量正则表达式形式的图样和规则以确保所有的安全 漏洞或入侵被检测到。正则表达式是用于描述值/字符/字母串中的图样的紧凑型方法。 由正则表达式所匹配的最简单图样是单个值/字符/字母或值/字符/字母串,例如,/c/ 或/cat/。正则表达式还包括具有特殊含义的运算符和元字符。
[0005] 通过使用元字符,正则表达式可以用于更复杂的搜索,诸如"abc.*xyz"。即,在 "abc"和"xyz"之间的无限量字符的情况下,找到字符串"abc",之后是字符串"xyz"。另一 示例是正则表达式"abc. .abc.*xyz; ",S卩,找到字符串"abc",后面两个字符,然后是字符 串"abc"并且在无限量字符后由字符串"xyz"跟随。
[0006] 入侵检测系统(IDS)应用检查所有流过网络的单独数据包的内容,并且标识可能 指示尝试闯入或威胁系统的可疑图样。可疑图样的一个示例可以是数据包中的特定文本 串,该特定文本串在100个字符以后跟随另一特定文本串。
[0007] 通常使用搜索算法(如用于处理正则表达式的确定有限自动机(DFA)或非确定有 限自动机(NFA))执行内容搜索。 概述
[0008] 在一个实施例中,有效载荷段(也被称为有效载荷的段)为有效载荷的被检查与 NFA图形节点中所指示的元素匹配的部分。有效载荷段可以是值、字符、字母、字节或其他数 据大小。有效载荷段可以具有任何粒度(例如,大小)。例如,有效载荷段可以是一个字节、 多个字节、小于一个字节、或甚至任何数量的位。引擎可以处理最小粒度(例如,一个字节、 或任何数据量),但其还可以处理大于最小的粒度。在一个实施例中,有效载荷段可以是有 效载荷字节。
[0009] 在一个实施例中,一种行走表示图样的非确定有限自动机(NFA)图形的方法可以 包括:从该NFA图形的一个节点中提取一种节点类型、下一个节点地址、计数值、和一个元 素;以及通过使一个有效载荷与该元素进行匹配至少零次来将该有效载荷的一段针对该元 素进行匹配。该次数可以基于该节点类型。
[0010] 在一个实施例中,该节点类型可以是以下各项中的至少一项:可变计数、固定计 数、固定计数和可变计数、字符、不区分大小写的字符、字符类、字符串、不区分大小写的字 符串、标记的或分离的。
[0011] 在一个实施例中,该方法还可以包括将一个条目推送至一个运行堆栈。该条目可 以指示该节点类型、图形中的下一个节点的地址、一个复制位、一个逆向位、一个有效载荷 偏移位、匹配类型、或计数值。将该条目推送至该运行堆栈可以基于该节点类型。如果该节 点类型为可变计数、固定-可变计数、或分离的,则可以执行将该条目推送至该运行堆栈。 该方法还可以包括:弹出该运行堆栈的一个顶条目,加载所弹出的顶条目所指示的一个图 形节点,以及将该有效载荷的该段与该元素进行匹配。在所弹出的顶条目中所指示的一个 有效载荷偏移下,可以在所加载的图形节点中指示该元素。在将该有效载荷的该段与该元 素进行匹配的失配后执行将该运行堆栈的该顶条目弹出。
[0012] 在一个实施例中,该方法包括:弹出该运行堆栈的该顶条目,提取所弹出的顶条目 所存储的图形节点信息,以及将该有效载荷的该段与该元素进行匹配。在所弹出的顶条目 中所指示的一个有效载荷偏移下,可以在所提取的图形节点中指示该元素。在将该有效载 荷的该段与该元素进行匹配的失配后可以执行将该运行堆栈的该顶条目弹出。
[0013] 在一个实施例中,字符串节点类型可以表示多个值的图样。每个值可以是字节、字 母、或字符中的至少一项。将该有效载荷的该段针对与字符串节点类型相关联的该元素进 行匹配可以包括使该段内的至少两个值针对被存储作为该节点中的该元素的字符串的对 应值进行匹配(例如,并行)。如果该段与该元素部分匹配,并且如果该有效载荷的长度比 被存储作为该节点的该元素的字符串的长度更短,则该方法可以包括加载该有效载荷的同 一流的下一个有效载荷并继续将该字符串中的剩余值与该下一个有效载荷中的值进行匹 配。该方法可以进一步包括将一个部分匹配推送至一个当加载该下一个有效载荷后有待加 载的保存缓冲区。将该部分匹配推送至该保存缓冲区可以包括:将正在被处理的一个当前 运行堆栈条目存储在该保存缓冲区内,当加载该下一个有效载荷后,将该保存缓冲区中所 存储的至少一个条目拷贝至该运行堆栈。如果从该运行堆栈条目中读取该节点,则该方法 可以进一步包括减少该运行堆栈中所存储的段的数量,并且如果该运行堆栈条目中所存储 的段的数量大于零,则将该运行堆栈条目推送至该运行堆栈。如果该节点类型为可变计数 领属节点则将该有效载荷的该段与该元素进行匹配可以包括:提取该有效载荷的至少一段 并且将该至少一段与该元素进行匹配,直到不存在匹配,并且如果该有效载荷用尽,则将堆 该栈条目推送至该保存缓冲区并设置一个终止行走值。
[0014] 在一个实施例中,将该有效载荷的该段针对具有可变计数节点类型的该元素进行 匹配可以包括针对该元素进行匹配该节点所指示的可变次数。该可变次数可以为至少零 次、最多有限次数、或最多无限次数。该节点类型可以进一步指示该可变计数节点为一个贪 婪节点、懒惰节点、领属节点、或全匹配节点。
[0015] 在一个实施例中,如果节点类型为可变计数懒惰节点则将该有效载荷的该段与该 元素进行匹配可以包括返回在该有效载荷中找到的最短匹配。如果该节点类型为可变计 数懒惰节点则针对该元素对该有效载荷的该段进行匹配可以包括:将该段与该元素进行匹 配,并且如果该段匹配,则加载该图形中的该下一个节点地址处的下一个节点,并且如果该 段不匹配,则返回不匹配。针对该可变计数懒惰节点对该有效载荷的该段进行匹配可以包 括:如果该段匹配,则将该堆栈条目推送至该运行堆栈并且加载该图形中的该下一个节点 地址处的下一个节点。该堆栈条目可以指示该可变计数懒惰节点和有效载荷偏移。如果该 节点类型为可变计数懒惰节点则将该有效载荷的该段与该元素进行匹配包括:如果将该下 一个节点元素与该段进行匹配为失配,则从该运行堆栈的该堆栈条目中弹出该可变计数懒 惰节点的节点类型的该节点,并将所弹出的节点中所存储的该元素与该有效载荷段进行匹 配。当将该有效载荷的该段与所弹出的节点中所存储的该元素进行匹配后,该方法可以包 括:减少该可变计数懒惰节点的一个计数值,将一个经更新的堆栈条目推送至该运行堆栈, 以及加载在所弹出的条目中所存储的该下一个节点地址处的下一个节点。如果该有效载荷 的该段继续在该第一有效载荷的同一流的下一个有效载荷内,则该方法还包括将该运行堆 栈条目推送至一个保存缓冲区以及当加载该下一个有效载荷后,将之后的缓冲区条目加载 到该运行堆栈内。
[0016] 在一个实施例中,如果该节点类型为可变计数贪婪节点或可变计数领属节点则将 该有效载荷的该段针对该元素进行匹配包括返回在该有效载荷中找到的最长匹配。
[0017] 在一个实施例中,如果该节点类型为可变计数贪婪节点则将该有效载荷的该段与 该元素进行匹配可以包括提取该有效载荷的至少一段。该方法可以进一步包括将该至少一 段与该元素进行匹配。如果存在不匹配并且对该元素进行匹配小于等于可变计数贪婪节点 中的可变计数的次数,或该有效载荷中不再有可用的段,则该方法可以包括:如果所匹配的 段的数量指示已经对该元素进行匹配小于最大次数,则推送存储该节点的该节点类型、该 有效载荷的至少一段的有效载荷偏移、和所匹配的该数量的段的运行堆栈条目,提取该下 一个节点地址所指示的该NFA图形的下一个节点,以及继续将该有效载荷偏移后面的一个 位置所指示的该有效载荷的下一段与该下一个节点的一个第二元素进行匹配,其中,如果 存在不匹配,则从该运行堆栈弹出该运行堆栈条目,使段匹配计数的数量减量,将该经更新 的运行堆栈条目推送回该运行堆栈,并且继续将来自所弹出的条目中所存储的偏移的该有 效载荷的该下一段与所弹出的条目中所存储的该下一个节点地址处存储的下一个节点的 该元素进行匹配。
[0018] 该方法可以进一步包括:如果确定匹配,则将一个条目推送至一个指示该段的有 效载荷偏移的运行堆栈,如果到达该可变计数贪婪节点的计数,则加载下一个节点。该方法 可以进一步包括:如果没有达到该可变计数贪婪节点的该计数,则确定该有效载荷的后续 段与该元素匹配。该方法可以进一步包括:如果确定不匹配,则从一个运行堆栈弹出一个条 目并确定在所弹出的条目的节点中指示的该有效载荷偏移处的该有效载荷的该段与所弹 出的条目的节点中指示的该元素匹配。
[0019] 在一个实施例中,该方法可以进一步包括:如果该节点类型为可变计数贪婪节点, 则对该有效载荷的该段针对该元素进行以下匹配:提取该有效载荷的至少一段并将该至少 一段与该元素进行匹配直到存在不匹配,其中,该至少一段与该元素匹配等于该可变计数 贪婪节点中的可变计数的次数,或该有效载荷中不再有可用的段,并且然后,如果一个运行 堆栈条目的计数大于零,则推送该堆栈条目。该方法可以进一步包括:如果从该堆栈条目读 取该节点,则减少该堆栈条目的该可变计数,并且如果该可变计数大于零,则推送一个运行 堆栈条目。
[0020] 在一个实施例中,该方法可以进一步包括:如果该节点类型为可变计数领属节点, 则将该有效载荷的该段与该元素进行以下匹配:连续地将该有效载荷段与该元素进行匹配 直到不匹配或该可变计数领属节点的计数指示已经对该元素进行匹配最大次数,并且然后 继续将该有效载荷的后续段与该下一个节点地址处所存储的该下一个节点进行匹配。如果 包括该有效载荷段的有效载荷用尽,则该方法包括将该节点、计数、和有效载荷偏移推送至 一个保存缓冲区,并且当从该有效载荷段的同一流中加载下一个有效载荷段后,从该保存 缓冲区加载该节点、计数、和有效载荷偏移并且继续将该下一个有效载荷段的该段与该元 素进行匹配。
[0021] 在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段 与该元素进行匹配可以包括返回在该有效载荷中找到的所有匹配。如果该节点类型为可变 计数全匹配节点则针对该元素对该有效载荷的该段进行匹配可以进一步包括:将该段与该 元素进行匹配,并且如果其匹配,则将该节点推送至该运行堆栈,并且如果其不匹配,则返 回不匹配。该堆栈条目可以用继续对该NFA图形进行匹配的指示来指示该可变计数全匹配 节点和有效载荷偏移。推送该运行堆栈条目可以包括将复制值设置成假。如果该有效载荷 的该段不可用,则对该有效载荷的该段进行匹配可以包括将该节点推送至该保存缓冲区并 将一个终止行走值设置成真。
[0022] 在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段 针对该元素进行匹配可以包括将该段与该元素进行匹配,并且如果字节匹配,则存储该匹 配,并且指示如果找到匹配则继续对该NFA图形进行匹配。
[0023] 在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段 与该元素进行匹配包括:将该段与该元素进行匹配,并且如果其匹配,则将该节点推送至该 运行堆栈,并且如果其不匹配,则返回不匹配。推送该运行堆栈条目包括将复制值设置成 假。如果该有效载荷的该段不可用,则该方法包括:对该有效载荷的该段进行匹配包括将该 节点推送至该保存缓冲区并将一个终止行走值设置成真。
[0024] 在一个实施例中,一种固定计数节点类型表示有待针对一个元素进行匹配固定次 数的图样。如果该有效载荷的长度比该固定计数节点的计数更短,则该方法可以包括加载 下一个有效载荷并继续将该元素中的剩余值与该下一个有效载荷中的值进行匹配。该方法 可以进一步包括将一个部分匹配推送至一个当加载该下一个有效载荷后有待加载的保存 缓冲区。将该部分匹配推送至该保存缓冲区可以包括:将来自一个运行堆栈的至少一个条 目存储在该保存缓冲区内,并且当加载该下一个有效载荷后,将该保存缓冲区中所存储的 至少一个条目拷贝至该运行堆栈。该固定计数节点类型的该元素可以是字符、字符类或字 符串。将该有效载荷的该段与和该固定计数节点类型相关联的该元素进行匹配包括将该 段内的至少两个值针对该节点中所存储的该元素的一个值进行匹配。如果该段与该元素匹 配,并且如果该有效载荷的长度比该固定计数节点的计数更短,则该方法包括加载该有效 载荷的同一流的下一个有效载荷并继续将该元素中的剩余值与该下一个有效载荷中的值 进行匹配。
[0025] 在一个实施例中,元素可以是字符、字符类和字符串中的至少一项。字符类可以表 示至少一个值的布尔或运算。每个字符类可以作为遮罩存储在存储器内,其中,如果遮罩 中的每个可能的字符为字符类的一部分,则设置一个与该字符相对应的指示符,并且如果 其不是字符类的一部分,则不设置。该方法可以进一步包括通过将该有效载荷的一段用作 该遮罩的索引来对该有效载荷的该段进行匹配,从而使得如果设置所标引的条目,则图形 行走引擎确定该有效载荷段与该字符类匹配。每个字符类可以作为二维矩阵存储在存储器 中。与该字符类相关联的第一索引和与该字符值相关联的第二索引可以访问该二维矩阵。 如果该节点类型为字符类则将该有效载荷的一段针对该元素进行匹配可以包括:用是该节 点的该元素中所指示的字符类索引的第一索引和是该有效载荷的该段的第二索引访问该 二维矩阵,并且如果设置了该条目则发布匹配并且如果未设置该条目则发布不匹配。
[0026] 在一个实施例中,该方法可以包括:当成功匹配后,从自该节点提取的该下一个节 点地址加载该NFA图形的一个第二节点。
[0027] 在一个实施例中,该计数值可以指示针对该元素匹配的最大次数。如果该节点类 型为固定计数,则该计数值可以指示针对该元素匹配的恰好次数。如果该节点类型为字符 串,则该计数值可以指示字符串的长度。
[0028] 该方法还可以包括:如果该节点类型为可变计数,则从该节点提取一个计数值, 其中该计数值指示与该元素进行匹配的最大次数,如果该节点类型为固定计数,则从该节 点提取一个计数值,该计数值指示与元素进行匹配的恰好次数,如果该节点类型为字符串, 则从该节点提取一个计数值,该计数值指示该字符串的长度,并且如果该节点类型为固 定-可变计数,则从该节点提取两个计数值,一个第一计数值指示与该元素进行匹配的恰 好次数而一个第二计数值指示与该元素进行匹配的最大次数。
[0029] 在一个实施例中,该方法可以包括:该有效载荷的该段与标记节点类型相关联的 该元素进行以下匹配:指示找到匹配,并且弹出一个运行堆栈中的任何条目,或者,如果在 该节点中进行了指示,贝1」继续在逆向方向上行走该节点中所指示的该下一个地址处的下一 个节点。
[0030] 在一个实施例中,将该有效载荷的该段与和节点类型为固定-可变计数节点类型 相关联的该元素进行匹配可以包括对该元素进行匹配从该节点提取的固定计数值所指示 的固定次数和从该节点提取的可变计数值所指示的可变次数。该可变次数可以为至少零 次、最多有限次数或最多无限次数。该固定次数可以是指示一次。该固定次数可以是零次, 从而使得该固定-可变计数节点类型的元素被匹配为可变计数节点。
[0031] 在一个实施例中,如果该节点类型为固定-可变计数懒惰节点则将该有效载荷的 该段与该元素进行匹配可以包括:将该段与该元素进行匹配,并且如果该段匹配,则加载该 图形中的该下一个节点地址处的下一个节点,并且如果该段不匹配,则返回不匹配。如果该 节点类型为可固定-变计数懒惰节点则将该有效载荷的该段与该元素进行匹配可以包括 将一个堆栈条目推送至一个运行堆栈,该堆栈条目指示该可变计数懒惰节点和
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1