首页> 中国专利> 使用非确定性有限自动机的并行模式匹配

使用非确定性有限自动机的并行模式匹配

摘要

本申请描述了确定符号流是否包括由正则表达式定义的模式的技术。如本文所述,可使用非确定性有限自动机(NFA)表示该正则表达式。可并行评估NFA中的多个状态。这些状态可与符号流中的多个符号位置相关。并行评估多个状态和符号使得能够更快速地确定该符号流是否包括由正则表达式定义的模式。

著录项

  • 公开/公告号CN101296116A

    专利类型发明专利

  • 公开/公告日2008-10-29

    原文格式PDF

  • 申请/专利权人 丛林网络公司;

    申请/专利号CN200710135741.0

  • 申请日2007-08-10

  • 分类号H04L12/24(20060101);

  • 代理机构11240 北京康信知识产权代理有限责任公司;

  • 代理人余刚;尚志峰

  • 地址 美国加利福尼亚州

  • 入库时间 2023-12-17 20:58:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-04-02

    专利权人的姓名或者名称、地址的变更 IPC(主分类):H04L12/24 变更前: 变更后: 申请日:20070810

    专利权人的姓名或者名称、地址的变更

  • 2012-05-23

    授权

    授权

  • 2008-12-24

    实质审查的生效

    实质审查的生效

  • 2008-10-29

    公开

    公开

说明书

技术领域

本发明涉及计算机网络,更具体地,涉及网络安全。

背景技术

企业计算机网络通常包括交换数据并共享资源的相互连接的计算装置的集合。这些装置可包括例如:网络服务器、数据库服务器、文件服务器、路由器、打印机、终端用户计算机以及其它装置。各种装置可执行无数不同服务和通信协议。这些不同服务和通信协议中的每一个都使得企业网络暴露了不同的安全脆弱性。

用于检测网络攻击的常规技术使用模式匹配。例如,企业可部署一个或多个安全装置,其检查病毒或其它安全性威胁的网络流量。这种安全装置通常将正则表达式或子串匹配应用到该网络流量中,以在协议流中检测所定义的模式。多种模式可用于尝试检测不同类型的攻击并通常改善了这种攻击检测的准确性和强壮性。

发明内容

总的来说,本公开描述了用于确定符号流是否包括由正则表达式定义的模式的技术。如本文所述,这些技术通过使用一个或多个非确定性有限自动机(NFA)来表示该正则表达式。此外,这些技术可用于并行评估该NFA中的多个状态。可相对于符号流中的多个不同符号来评估这些状态。NFA状态的并行评估可使得能够更快且更有效地检测网络攻击,也就是说,确定符号流是否包括由正则表达式定义的任何模式。

例如,侵入检测和防范(IDP)装置可使用一种NFA表示(representation),其接受遵从与计算机安全性威胁相关的模式的符号流。IDP装置可包括基于硬件的能够维持一组节点向量的模式匹配模块。每一个节点向量都可暂时与符号流中的符号位置(即,该符号流中的位置)相关。例如,在符号流“abcdefg”中,符号“a”处于该符号流中的第一符号位置,符号“b”处于该符号流中的第二符号位置,等等。除非本文另外说明,术语“第一符号位置”、“第二符号位置”等,可标识符号流中的任何符号位置。例如,术语“第一符号位置”可以指符号流开始之后的十个符号位置的符号位置。

此外,每一个节点向量都可指定对应于该节点向量当前符号位置的在NFA表示中的一组节点。也就是说,对于给定节点向量,指定的节点表示对于与该节点向量相关的特定符号位置来说是已被评估的、正被评估的、或者未被评估的节点。除节点向量之外,IDP装置的模式匹配模块还可包括多个线程。每个线程都是运行以评估由节点向量指定的节点的硬件组件。由于NFA可有效地具有多个当前节点,所以这些线程可并行地评估多个当前节点。当线程评估节点时,这些线程可更新这些节点向量之一来指定附加节点或可输出标识该符号流所遵从的特定模式的指示符。

在一个实施例中,一种方法包括:维持包括有多个节点的非确定性有限自动机(NFA)表示。NFA表示表示检测符号流是否遵从由正则表达式定义的符号模式的NFA。此外,该方法还包括:接收符号流。本方法进一步包括:通过在利用第二线程评估NFA表示的第二节点时,利用第一线程同时评估NFA表示的第一节点,来确定符号流是否遵从由正则表达式所定义的符号模式。此外,该方法包括:当符号流不遵从由正则表达式定义的符号模式时,经由计算机网络传送符号流中的数据。

在另一实施例中,一种装置包括存储单元,该存储单元存储包括有多个节点的非确定性有限自动机(NFA)表示。NFA表示表示检测符号流是否遵从由正则表达式定义的符号模式的NFA。该装置还包括模式匹配模块,该模式匹配模块通过在利用第二线程评估NFA表示的第二节点时,利用第一线程同时评估NFA表示的第一节点,来确定符号流是否遵从由正则表达式定义的符号模式。该装置还包括网络接口,该网络接口用于在符号流不遵从由正则表达式定义的模式时,经由计算机网络传送符号流中的数据。

在另一实施例中,一种计算机可读介质包括指令。这些指令使得可编程处理器维持包括有多个节点的非确定性有限自动机(NFA)表示。NFA表示表示检测符号流是否遵从由正则表达式所定义的符号模式的NFA。这些指令还使得可编程处理器接收符号流。此外,这些指令还使得可编程处理器通过在利用第二线程评估NFA表示的第二节点时,利用第一线程同时评估NFA表示的第一节点,来确定该符号流是否遵从由正则表达式定义的符号模式。此外,这些指令又使得可编程处理器在符号流不遵从由正则表达式定义的模式时,经由计算机网络传送符号流中的数据。

在附图和以下描述中阐述了本发明的一个或多个实施例的细节。本发明的其它特征、目的和有益效果将从说明书及其附图、以及权利要求书中变得显而易见。

附图说明

图1是示出了包括侵入检测和防范装置(IDP)、受保护的网络和公共网络的示例性系统的框图;

图2A是示出了列表状态节点的示例性格式的框图;

图2B是示出了范围状态节点的示例性格式的框图;

图2C是示出了掩码测试状态节点的示例性格式的框图;

图3是示出了用于映射节点的示例性格式的框图;

图4是示出了模式匹配模块的示例性细节的框图;

图5是示出了示例性的非确定性有限自动机表示的框图;

图6是示出了模式匹配模块中的仲裁器的示例性操作的流程图;

图7是示出了用于评估状态节点的处理引擎中的线程的示例性操作的流程图;

图8是示出了用于评估映射节点的示例性操作的流程图;

图9是示出了用于处理下一状态元素的示例性操作的流程图;以及

图10是示出了其中模式匹配模块评估同一代码(Unicode)符号的示例性节点的框图。

具体实施方式

总的来说,本公开描述了用于确定符号流是否包括由正则表达式所定义的模式的技术。如本文所述,该技术通过使用具有多个可被并行评估的状态的非确定性有限自动机(NFA)来表示该正则表达式。这些状态可与符号流中的多个符号相关。并行评估多个状态和多个符号可使得能够更快确定符号流是否包括由正则表达式所定义的模式,因此,表示网络攻击或其它安全威胁。

图1是示出了包括侵入检测和防范装置(IDP)4、受保护网络6和公共网络8的示例性系统2的框图。公共网络8可为不安全的诸如互联网的广域网、无线网络、局域网或者另一种计算机网络。受保护网络6可以是诸如在办公室或网络数据中心里的局域网的安全的计算机网络。

在系统2中,IDP装置4连接到公共网络8及受保护网络6,以使从公共网络8流向受保护网络6的网络流量首先流到IDP装置4。IDP装置4可为单机网络设备、另一网络设备的组件(如,防火墙设备)、在网络设备上执行的软件模块、或者其它构造。通常,IDP装置4检查来自公共网络8的网络流量并确定该网络流量是否包括任何计算机安全威胁。计算机安全威胁是访问敏感信息的企图、扰乱组织运营的企图、或是另一类型的攻击。计算机安全威胁的实例包括:计算机病毒、间谍软件、、rootkits、试图猜到密码、以及网络钓鱼邮件(phishing email)、与拒绝服务攻击相关的请求、及其它类型的攻击。

如果IDP装置4确定给定的网络流量流不包括任何计算机安全威胁,则IDP装置4就可将该网络流量流传送到受保护网络6。否则,如果IDP装置4确定了该网络流量流包括一个或多个计算机安全威胁,则IDP装置4就可中断(drop)网络流量、记录该网络流量和/或转发(forward)该流量到流量分析器以进行进一步分析。以此方式,IDP装置4可防止包括有计算机安全威胁的网络流量到达受保护网络6。

如图1的实例所示,IDP装置4可包括多个组件。本公开示出这些组件仅仅是为了说明的目的。在一些情况下,IDP装置4可包括少于图1所示组件的组件,而在其他情况下,IDP装置4可包括多于图1所示组件的组件。此外,如本文所述的这些组件的功能可分布于单个的组件或装置之中。

当来自公共网络8的网络流量到达IDP装置4时,第一网络接口10可以处理来自公共网络8的物理信号并且将链路层帧输出到网络层模块12。在基于分组的网络中,网络层模块12通常处理链路层帧,以产生具有公共源和目的地址的网络分组(packet,包)流。

传输层模块14可使用这些网络分组流中的每一个来产生传输层段的流。例如,传输层模块14可以为每个网络分组流都产生一个或多个传输控制协议(TCP)段的流。例如,传输层模块14可基于链路层的帧来组合和输出互连网协议(IP)分组流。IP分组在其共享公共的源地址、目的地址、源端口、目的端口以及协议时,尽管可能或多或少地被认为是颗粒流(granular flow),但通常被认为是同一分组流的一部分。在一些实施例中,可组合网络层模块12和传输层模块14的功能以识别一个动作中的网络分组流。这些传输层段又可由应用层模块16使用。

应用层模块16可组合TCP段来组成应用层数据并且从该数据中提取应用层消息(communication)。应用层模块16可包括一个或多个协议指定(protocol-specific)的插入式模块,其为各种应用层协议提取应用层消息。例如,应用层模块16可包括从TCP段中提取超文本传输协议(HTTP)消息的插入式模块、从TCP段中提取会话发起协议(SIP)消息的插入式模块、以及提取其它应用层协议中的消息的插入式模块。应用层模块16可支持的应用层通信协议的其它实例包括:文件传输协议(FTP)、网络新闻传送协议(NNTP)、简单邮件传送协议(SMTP)、远程登录协议、域名系统(DNS)、Gopher(因特网双向沟通界面)、Finger(查找器)、邮局协议(POP)、安全套接字层(SSL)协议、轻量目录访问协议(LDAP)、安全外壳(SSH)、因特网消息访问协议(IMAP)、服务器消息块(SMB)、动态主机配置协议(DHCP)和其它协议。

应用层模块16可分析应用层消息并提取符号串形式的协议指定的元素(element)。如本文所使用的,术语“应用层元素”指的是在应用层得到的协议指定的符号串。例如,应用层模块16可从重新组合成的应用层消息中提取协议指定的“上下文”和“值”。通常,“上下文”被指定为唯一标识各种类型应用层元素的应用层消息流中的元素。被指定的元素为描述通信会话提供应用层基础。上下文实例包括文件名、用户名、应用名、附加文档名、协议指定的头部信息、协议指定的认证数据、格式数据以及其它描述该通信会话的信息。作为特定实例,用于HTTP协议流的上下文可包括:提供HTTP服务的服务器名和访问该服务器的网络浏览器(如,“Internet Explorer”)的类型名。通过重新组合应用层消息,应用层模块16可提取特定的上下文(如,浏览器类型)及对应的值(如,“Internet Explorer”)。应用层模块16可输出这些应用层元素作为该符号流的部分。例如,应用层模块16可输出包括表示应用层元素的一组符号的符号流,该组符号其后跟着表示应用层消息的一组符号。在应用层模块16形成符号流之后,应用层模块16可以将这些符号流转发到模式匹配模块18。

模式匹配模块18可确定符号流是否包括与一个或多个计算机安全威胁相关的一个或多个符号模式。与计算机安全威胁相关的符号模式在本文被称为“威胁签名”。如果模式匹配模块18确定了符号流包括威胁签名,模式匹配模块18就可将搜索结果输出到应用层模块16。这些搜索结果可包括指示哪个威胁签名已被检测到的模式标识符。另外,这些搜索结果还可包括索引,其指示该威胁签名在符号流中开始或结束的位置。当应用层模块16接收这些搜索结果时,应用层模块16可以使传输层模块14中断与该符号流有关的分组,将与该符号流有关的分组转到另一目的地,或者执行一些其它动作。否则,如果模式匹配模块18没有在该符号流中检测到的威胁签名,应用层模块16可以使传输层模块14利用网络层模块12和第二网络接口22将与该符号流有关的分组传送到受保护的网络6。

为了确定符号流是否包括威胁签名,模式匹配模块18可使用描述符号模式的一组正则表达式。正则表达式是根据某些语法规则来描述一组字符串的字符串。例如,正则表达式“(a|b)*cd?e”描述一组字符串,它们以任意数量的“a”或“b”符号开始,其后总是跟着“c”符号,“c”后可以跟着或者可以不跟着“d”符号,而“d”后总是跟着“e”符号。举例来说,由正则表达式描述的这组字符串包括“abcde”、“bacde”、“ababce”、“ce”等等。正则表达式可包括由字母ε(即,epsilon)表示的空字符串。例如,字符串“abεεεcde”与字符串“abcde”是相同的,这是因为ε是空字符串。

每个可能的正则表达式都可被表示为非确定性有限自动机(即,“NFA”)。通常,有限自动机为一种由有限数量的状态、这些状态之间的转换以及动作所构成的行为的模型。NFA是有限自动机,其为非确定性的,这是因为,对于每个状态和输入符号对,都可能有若干种可能的下一状态。在执行期间,NFA消耗符号流。也就是说,对于符号流中的每个符号来说,该NFA都转换成新状态,直到所有符号都被消耗(即,都被评估)为止。在NFA中,还可能转换为新状态而不消耗符号流中的任何符号。这样的转换被称为ε转换,这是因为在转换期间只有空字符串ε被“消耗”。由于NFA可以转换成一种状态而不消耗符号,所以,NFA可具有多个有效当前状态。当NFA消耗符号流中的符号时,NFA可“接受”作为属于被由通过NFA表示的正则表达式所定义的一组字符串的符号流。在NFA的当前状态之一为接受状态或者NFA可进行从NFA的当前状态之一到接受状态的一个或多个ε转换时,NFA接受该符号流。正如该公开在以下所详细描述的,因为NFA可有效地处于多个当前状态,所以,可并行评估该多个当前状态。

IDP装置4可将NFA表示23存储在存储模块20之中。NFA表示23可表示NFA。在NFA表示23中,每个非接受状态都可被表示为一个或多个节点25。节点25中的每一个都可以是将一个或多个符号映射到一个或多个下一状态元素的数据结构。例如,节点25之一可将符号“a”映射到在该节点中的下一状态元素。这些符号可包括字母、数字、控制字符、Unicode符号、标点符号、西里尔字母或其他非拉丁字母或字符集中的符号、二进制符号、以及其它类型的符号。此外,正如本公开以下详细说明的,这些符号可包括描述符号类的元符号。

下一状态元素可为16位的值,其指示NFA中的接受或非接受状态。如果下一状态元素指示NFA的非接受状态,则该下一状态元素可以包含节点索引。节点索引是从中可以得到节点存储地址的值。例如,节点索引可为15位的值。通过左移节点索引两个位置并通过加上基地址,可从节点索引得到节点的存储地址。如果下一状态元素指示NFA的接受状态,则下一状态元素可包括指定由正则表达式所描述的符号模式的模式标识符。

在NFA表示23中的节点25中的每一个都可以是状态节点或是映射节点。状态节点可将有限数量的符号映射到单个下一状态元素。因为下一状态元素可以指示NFA表示23中的节点,所以状态节点可以将有限数量的符号映射到NFA表示23中的单个节点。映射节点可以为一组符号中的每个符号提供从这些符号之一到在该映射节点中的一组下一状态元素中的一个下一状态元素的映射。由于相同原因,映射节点可以为一组符号中的每个符号提供从这些符号之一到NFA表示23中的节点之一的映射。

NFA表示23可包括若干种状态节点。这些类型可包括:列表状态节点、范围状态节点以及掩码测试状态节点。列表状态节点将一个或多个符号映射到单个下一状态元素。范围状态节点将落入值的连续范围中的符号映射到单个下一状态元素。例如,范围节点可指定高范围值、低范围值以及下一状态元素。在当前符号大于或等于低范围值而小于或等于高范围值时该符号满足范围状态节点的符号准则。当对符号与任意位掩码上进行逻辑“与”运算产生等于所指定值的值时,掩码测试状态节点将该符号映射到单个下一状态元素。举例来说,掩码测试状态节点可包括:掩码、值、以及下一状态元素。当对当前符号与该掩码进行逐位逻辑“与”运算而产生的值与在掩码测试状态节点中所指定的值相匹配时,该符号就满足掩码测试状态节点的符号准则。

在NFA表示23中的状态节点可包括到NFA表示23中的第二节点的一个ε转换。该第二节点可为状态节点或者映射节点。如果该第二节点是状态节点,则该第二节点可包括到NFA表示23中的第三节点的一个ε转换等等。以此方式,NFA表示23可包括一个节点链,其中,一个节点通过ε转换链接到另一个节点。本公开可将这样的节点链称为ε链。

NFA表示23可使用ε链来表示包括到多个状态的转换的NFA中的状态。例如,NFA中的第一状态可以将符号“a”映射到第二状态,并可以将符号“b”映射到第三状态。在此实例中,NFA表示23可以包括:表示第一状态的第一状态节点、表示第二状态的第二节点、以及表示该第三状态的第三节点。此外,NFA表示23还可以包括:不表示NFA中的状态的第四节点。第一节点可以将符号“a”映射到包括第二节点的节点索引的下一状态元素。此外,第一节点还可以指定到第四节点的ε转换。第四节点可以将符号“b”映射到包括第三节点的节点索引的下一状态元素。

正则表达式编译器26可以将正则表达式编译成NFA表示23。当正则表达式编译器26对正则表达式进行编译时,正则表达式编译器26可以将ε链中的多个节点安置在存储模块20中的连续存储位置中。因为ε链中的节点被定位在连续的存储位置中,因此可以使用单个存储读取请求来检索这些节点。因此,ε链中的多个节点可出现在高速缓存里,进而可被快速返回。例如,第一节点可包括到第二节点的ε转换,而第二节点可以包括到第三节点的ε转换。这些节点中的每一个都可存储于连续存储位置中。因此,当请求第一节点时,存储模块20可以返回第一节点、第二节点以及第三节点。当存储模块20返回这些节点时,高速缓存可以存储第一节点、第二节点以及第三节点的副本。因此,当请求第二节点时,高速缓存可以返回第二节点。这可以明显快于从存储模块20返回第二节点。

映射节点可以为一组符号中的每一个符号都提供从该符号到在该映射节点中的一组下一状态元素之中的一个下一状态元素的映射。映射节点可以是长ε链的有用替代。例如,正则表达式编译器26可以创建单个映射节点而不是创建包括八个或更多状态节点的ε链。

映射节点可遵从位映射(bitmap)压缩机制,其减少了每个映射节点的大小。例如,映射节点可以包括位映射部分和一个或多个下一状态元素的组。在该实例中,位映射部分包括一组位。每一位都与一组符号中的一个符号相关。如果将与符号相关的位设为“1”,则该映射节点将该符号映射到在该映射节点中的下一状态元素之一。如果将与该符号相关的位设为“0”,则该映射节点不将该符号映射到实际位于该映射节点中的下一状态元素。相反,如果将与该符号相关的位设为“0”,则该映射节点将该符号映射到“逻辑”下一状态元素。该“逻辑”下一状态元素指定该NFA的“死”状态的节点索引。该“逻辑”下一状态元素并不实际处于该映射节点中,但当将与该符号相关的位设为“0”时,对于该符号来说,就隐含着该“逻辑”下一状态元素的存在。通常,NFA表示23中的典型映射节点为大多数符号指定到“死”状态的转换。由于不包括到大多数符号的“死”状态的这些转变中的每一个的实际下一状态元素,这些映射节点中的每一个都可显著的更小。本公开在下面提供了有关图3的映射节点的实例格式。

NFA表示23还可包括非锚定(unanchored)映射节点。用于多种符号模式的正则表达式具有“.*<X>”形式,其中<X>为符号串。匹配这样的符号模式的符号流可以以后面跟随有由<X>标识的符号序列的任何符号的无限序列开始。例如,与计算机病毒相关的符号串X可被嵌入到符号流的中间。换句话说,标识的符号串未被锚定在该符号流开始的某一位置处的符号流之中。类似于普通映射节点,非锚定映射节点可以为一组符号中的每个符号都提供在该符号和该映射节点中的下一状态元素之间的映射。

模式匹配模块18可维持一组节点向量。这些节点向量的每一个都可以包括位于模式匹配模块18中的一个或多个硬件寄存器。模式匹配模块18可以临时使一组连续符号位置中的不同符号位置与这些节点向量的不同节点向量相关。例如,如果模式匹配模块18维持五个节点向量的组,则模式匹配模块18可临时使符号流中的第四、第五、第六、第七和第八符号位置与各个节点向量相关。除了与节点向量相关的最后符号位置外,每个与节点向量相关的符号位置都可构成一个符号窗。继续以前的实例,第四、第五、第六、和第七符号位置可构成符号窗。例如,在符号流“abcdefghij”中,符号‘d’、‘e’、‘f’和‘g’处在符号窗中的符号位置处。此外,每一个节点向量都可指定已被评估的、当前正被评估的或者未被评估的节点25中的多个。

当与符号窗中的符号位置相关的节点向量指定未被评估的节点时,模式匹配模块18将这些节点分配给不同的线程。这些线程可用硬件或软件来实现。这些线程的每一个都可并行运行来评估所分配的节点。当模式匹配模块18将由节点向量指定的节点分配给线程时,该线程可从存储模块20中检索该节点。该线程然后可评估相对于与节点向量相关的符号位置处的符号流中的符号的节点,来确定该节点是否将该符号映射到该节点的下一状态元素。如果节点将符号映射到包括节点索引的下一状态元素,则线程可更新与下一符号位置相关的节点向量以包括该节点索引作为未被评估的节点。如果节点将符号映射到包括指示模式已被检测的模式标识符的下一状态元素,则线程可以将该模式标识符提供给应用层模块16。以此方式,当模式匹配模块18开始通过符号流时,该线程实时更新这些节点向量。

当与符号窗中的第一符号位置相关的节点向量仅仅指定模式匹配模块18已评估的节点并且不包括当前正被评估、或者未被评估的节点时,模式匹配模块18可前移(advance)该符号窗。当模式匹配模块18前移符号窗时,与符号窗中的第一符号位置相关的节点向量就可成为与跟在符号窗中的最后符号位置之后的符号位置相关的节点向量。以此方式,模式匹配模块18就可再利用节点向量。

本公开中描述的技术可提供一个或多个优点。例如,模式匹配模块18可同时评估符号流中的若干个符号位置。同时评估若干个符号位置可导致更快地全面处理符号流。进一步地,模式匹配模块18可在单个周期里评估NFA中的若干个状态。例如,状态节点块可按顺序位置排列在存储模块20中。因而,模式匹配模块18能够检索和评估全部状态节点块而同时仅产生与单个存储器读取相关的成本。在另一实例中,NFA的表示可明显小于用于检测相同安全威胁的、等同的确定性有限自动机(DFA)的表示。出于该原因,IDP装置4可存储NFA的表示,与等同大小的DFA相比,在相同数量存储空间中,该NFA接受遵从更多数量的不同模式的符号串。换句话说,IDP装置4能够使用NFA来检测比通过使用类似大小的确定性有限自动机明显多的类型的安全威胁。在另一实例中,因为NFA可有效具有多个当前状态,所以,IDP装置4可以并行评估该多个当前状态。在进一步的实例中,在本公开所提出的NFA表示可展示所访问节点的相当多的时间和空间存储器位置。由于此原因,模式匹配模块18可更有效地利用存储器高速缓存技术来改善性能。

图2A-图2C以及图3示出了用于表示非确定性有限自动机(如图1中的NFA 23)的不同类型节点的示例性格式。具体来说,图2A为示出列表状态节点30的示例性格式的框图。在此实例中,列表状态节点30包括一组符号元素32A~32N和下一状态元素34。符号元素32A~32N在本文中统称为“符号元素32”。每一个符号元素32都可指定一组符号准则。通常,列表状态节点30将遵从符号元素32中的符号准则的多个符号映射到下一状态元素34。

在一个示例性表示中,符号元素32中的每一个都包括符号和一组标志。例如,符号元素32的位15:8可包含符号而位7:2可包含一组标志。位1:0可被保留。下面呈现的表1示出了符号元素的示例性格式:

表1

  字段  位  描述  C  15:8  符号  M  7  元符号标志  U  6  UNICODE标志  N  5  非标志  E  4  E标志  B  3  E条标志  L  2  最后标志  -  1:0  保留

在表1所示的示例性格式中,Unicode标志指示该符号是否是Unicode符号。例如,如果Unicode标志设为“1”,则列表状态节点30可将与字段C中的符号相匹配的当前符号映射到下一状态元素34。此外,如果Unicode标志设为“1”,则列表状态节点30还可将为零字节(“\0”)的当前符号和与字段C中的符号相匹配的下一符号映射到下一状态元素34。

非标志指示不匹配。例如,如果非标志设为‘1’,则列表状态节点30可以将与由符号元素32之一指定的任一符号不匹配的任一符号映射到下一状态元素34。在一些实施例中,对于符号元素32中的每一个都将非标志设为相同值。

表1所示的示例性格式包括与ε转换相关的两个标志。例如,ε标志指示列表状态节点30包括ε转换。如果ε标志设为“1”,在模式匹配模块18中的线程就可在评估列表状态节点30以后立即评估存储器中列表状态节点30之后的节点。在一些实施例中,对于符号元素32中的每一个都将ε标志设为相同值。

仅当列表状态节点30不将当前符号映射到下一状态元素34时,ε条标志才指示模式匹配模块18评估存储模块20中的下一节点。例如,如果ε条标志设为“1”,则在当前符号满足在任一符号元素32中所指定的符号准则时,模式匹配模块18中的线程不进行到下一节点的ε转换。在一些实施例中,符号元素32中的每个元素中都将ε条标志设为相同值。

“最后”标志指示符号元素是列表状态节点30中的最后符号元素。如果符号元素的“最后”标志被设为“0”,则模式匹配模块18可以将该符号元素之后的16位解释为另一符号元素。例如,如果列表状态节点30仅包括一个符号元素,则“最后”标志在所述第一符号元素之中被设为“1”。

在表1所示的示例性格式中,模式匹配模块18可以将符号字段和元符号标志一起解释为9位元符号。通常,如果该符号标志被设为“1”,则列表状态节点30将由元符号描述的符号类中的符号映射到下一状态节点34。下面所示的表2示出了元符号的实例组:

表2

  元符号  符号类 描述  0XOFF  字符 将被匹配的正常符号。  0X100  E 显式E转换。不执行符号匹配。由与符号元素相关的下 一状态元素指示的节点被添加到与当前符号相关的节点 向量。该显式E转换可仅用于包括单个符号元素和单个下 一状态元素的列表状态节点中。  0X101  点 与任一符号匹配。  0X102  ALPHA 与任一字母符号(即,[A-Z,A-Z])匹配。

  0X103  大写字母 与任一大写字母符号(即,[A-Z])匹配。  0X104  小写字母 与任一小写字母符号(即,[A-Z])匹配。  0X105  数字 与任一数字匹配。  0X106  十六进制数字 与任一十六进制数字(即,[0-9,A-F,A-F])匹配。  0X107  字母数字 与任一字母数字符号(即,[0-9,A-Z,A-Z])匹配。  0X108  空白 与任一空白符号(即,[\0X09-\0X0D,\0X20])匹配。  0X109  不小于/  不大于 与除了小于或大于符号的所有符号(即,C!=‘>’且C!=‘<’)匹配。  0X10A  范围 当符号大于或等于低值且小于或等于高值时就与任一符 号匹配。  0X10B  掩码 当C&MASK==VALUE时,就与任一符号C匹配。  0X10C  非匹配 从不匹配。  0X141-0X15A  不区分大小写 不区分A-Z的大小写。

表2将与元符号相关的数值表示为十六进制数,其中,更高编号位出现在较低编号位的右侧。因此,符号元素的位7是在元符号列中所表示的最左位,而符号元素的位15是在元符号列中所表示的最右位。

通常,列表状态节点被填充到奇数个符号元素。因此,如果列表状态节点仅包括偶数个有意义的符号元素,则具有非可匹配的符号(即,0x10C)的符号元素被添加到该列表状态节点的结尾。

下一状态元素34可指示NFA中的若干种状态。例如,下一状态元素34可通过指定表示NFA中状态的节点的节点索引来指示NFA的非接受状态。下一状态元素34可通过指定模式标识符来指示NFA中的接受状态。下一状态元素34可遵从在表3中所概括的格式:

表3

  二进制  前缀  编码  描述  0*  NODE_INDEX=下一状态元  素[14:0]  下一状态元素的位14:0指示状态节点的节点索引。  10*  保留  保留以用于UNICODE处理。  110*  NODE_INDEX=下一状态元  素[12:0]  下一状态元素的位12:0指示映射节点的节点索引。  1110*  PATTERN_IDENTIFIER=  下一状态元素[12:0](非锚定)  下一状态元素的位12:0指示非锚定模式的模式标识  符。  1111*  PATTERN_IDENTIFIER=下  一状态元素[12:0]结尾-锚定)  下一状态元素的位12:0指示结尾锚定模式的模式标  识符。

图2B是示出范围状态节点40的示例性格式的框图。在图2B所示出的示例性格式中,范围状态节点40包括符号元素,该符号元素包括范围元符号42(即,0x10A)以及一组标志44。范围元符号42和一组标志44可遵从在表1和表2中所描述的格式。此外,在图2B所示出的示例性格式中,范围状态节点40包括下一状态元素46。下一状态元素46可遵从在表3中所描述的格式。

如图2B的实例所示,范围状态节点40还包括在位31:24处的低值48、在位23:16处的高值50、以及在位15:0处的填充52。高值50表示范围的上限而低值48表示该范围的下限。范围状态节点40可以将大于或等于低值48且小于或等于高值50的任何符号映射到下一状态元素48。在此例中,模式匹配模块18不使用填充52。

图2C是示出掩码(masked)测试状态节点60的示例性格式的框图。在图2C所示的示例性格式中,掩码测试状态节点60包括:其中包括掩码元符号62(即,0x10B)和一组标志64的符号元素。掩码元符号62和该组标志64可遵从表1和2中所描述的格式。此外,在此示例性格式中,掩码测试状态节点60包括下一状态元素66。下一状态元素66可遵从表3中所描述的格式。

在此示例性格式中,掩码测试状态节点60包括:在位31:24处的掩码68、在位23:16处的值字段70、以及在位15:0处的填充72。掩码测试状态节点60将当与掩码68中的值进行逻辑与时等于值字段70的值的任一符号映射到下一状态元素66。例如,当模式匹配模块18中的线程评估掩码测试状态节点60时,该线程可对当前符号和掩码68执行逐位与运算。如果结果值与值70相匹配,则模式匹配模块18可评估下一状态元素66。在此实例中,模式匹配模块18不使用填充72。

图3是示出映射节点80的示例性格式的框图。许多映射节点不需要为一组符号中的每一个符号值都指定下一状态元素。由于此原因,使用利用游长(run-length)压缩的位映射编码机制来对映射节点进行格式化。如在图3的实例中所示,映射节点80包括一个或多个下一状态元素84的变长列表。下一状态元素84的列表包括下一状态元素94A~94N(统称为“下一状态元素94”)。此外,映射节点80还包括64字节的位映射部82。位映射部82提供该游长编码信息。

位映射部82可被分割为32个映射子部86A~86N(统称为“位映射子部86”)。每个位映射子部86都可为由位组和先前1计数(prior-ls-count)组成的16位值。在图3所示的实例中,位组被标记为88A~88N并在本文中可统称为“位组88”。先前1计数被标记为90A~90N并在本文可统称为“先前1计数90”。位组88中的每个都可包括八位并且每个先前1计数也都可包括八位。

位组88中的每个位都可与256个不同符号之一相关。在位组88中,当一位是在与下一状态元素94的公共下一状态元素相关的位组88中的位的“游程”(“run”)的最后位时,该位就具有值“1”。例如,假设位组88A包括二进制值“00100001”。在此例中,映射节点80将与前三个位相关的符号映射到下一状态元素84的列表中的下一状态元素94中的第一个,并且将与下五个位相关的符号映射到下一状态元素84的列表中的下一状态元素94中的第二个。

每个先前1计数90都指示在位组88的位中被设为‘1’的位数,位组88位于所述先前1计数是其一部分的位映射子部的左侧。例如,先前1计数90A总是零,这是因为没有位组在位映射子部86A的左侧,先前1计数90B指示在位组88A中设为‘1’的位数,先前1计数90C指示在位组88A和88B中设为‘1’的位数,如此等等。在另一实例中,如果位组88A的值是二进制值“00100001”,则先前1计数90A指示数目‘0’而先前1计数90B指示数目‘2’,这是因为在位于位映射子部86B(即,位组88A)左侧的位映射子部中的位组88的位中有两位设为‘1’。

使用图3中所示的示例性格式,模式匹配模块18(图1)可通过执行以下步骤使下一状态元素94之一符号位于下一状态元素84的列表中:

(1)通过访问由下一状态元素列表开始处的存储地址加上将符号的位7:3左移一个位置的值所标识的存储位置,从存储器检索位映射子部;

(2)通过将来自位映射子部的先前1计数与对应于符号的符号2:0的左侧的符号的位组中设为‘1’的位的计数相加,来用公式表示游程数;以及

(3)通过访问由值映射指针加上64再加上游程数的两倍所标识的存储位置,从存储模块20检索下一状态元素。

图4是示出侵入检测和防范(IDP)装置4(图1)中的模式匹配模块18的基于硬件实施的示例性细节的框图。在图4的实例中,模式匹配模块18包括符号缓冲器100,其接收来自应用层模块16的符号流中的符号,并缓存这些符号。此外,模式匹配模块18可包括:处理引擎102、一组节点向量104A~104E(统称为“节点向量104”)、高速缓冲存储器106、结果缓冲器108以及仲裁器112。

高速缓冲存储器106截取从处理引擎102到存储模块20的读写请求。当高速缓冲存储器106截取对与特定存储地址相关的数据的读取请求时,高速缓冲存储器106可确定高速缓冲存储器106是否包括与该存储地址相关的数据。如果高速缓冲存储器106包括与该存储地址相关的数据,则高速缓冲存储器106可将该数据提供到处理引擎102。否则,如果高速缓冲存储器106不包括与该存储地址相关的数据,则高速缓冲存储器106可将该读取请求转发到存储模块20。当存储模块20返回所请求的数据时,高速缓冲存储器106可存储该数据,并将该数据转发到处理引擎102。当高速缓冲存储器106截取将数据写入到特定存储地址的请求时,高速缓冲存储器106可存储该数据,并将该写入请求转发到存储模块20。

每个节点向量104都可表示高速存储器,例如队列或者寄存器库,其具有存储元素,其中每一个元素都可指定NFA表示23(图1)的一个或多个节点。例如,每个节点向量104的每一个元素都可为相应节点存储数据。在一实例中,每个节点向量104的每一个元素都可存储指示节点的节点索引。在另一实例中,每个节点向量104的每一个元素都可存储整个节点。

每个节点向量104都可存储有限数量的节点索引。例如,节点向量104可存储多达八或者十六个节点索引。然而,可能存在这样一些情况,其中节点向量104之一需要存储比该节点向量能够存储的更多的节点索引。在这些情况中,模式匹配模块18可以将多余节点索引存储到存储模块20之中。

节点向量104的元素可存储用于将各个节点指定为“被评估”、“当前正在被评估”或者“未被评估”的状态数据。将节点指定为“被评估”意味着处理引擎102已经评估了该节点。将定节点指定为“当前正在被评估”意味着处理引擎102当前正在评估该节点。将节点指定为“未被评估”意味着处理引擎102尚未评估该节点。

通常,仲裁器112管理节点向量104。仲裁器112可临时使每个节点向量104都与单个符号索引相关。正如本公开所使用的,“符号索引”是表示在符号流中的位置(即,符号位置)的值。例如,符号索引‘0’表示在该符号流中的第一符号位置,符号索引‘1’表示在该符号流中的第二符号位置等等。因此,每个节点向量104都与符号流中的一个符号位置相关。

仲裁器112可使每个节点向量104都与“向量索引”永久相关。“向量索引”是与节点向量104之一相关的号码。例如,仲裁器112可使节点向量104A与‘0’的节点向量相关、使节点向量104B与‘1’的节点向量相关、使节点向量104C与‘2’的节点向量相关、使节点向量104D与‘3’的节点向量相关、节点向量104E与‘4’的节点向量相关。符号索引以5为模(modulo 5)的结果等于与该符号索引相关的节点向量的向量索引。例如,假设仲裁器112使节点向量104B与向量索引1相关。在此例中,节点向量104B可与符号索引6相关,这是因为6mod(模)5=1。由于这一关系,可以确定节点向量104中的哪一个与任一符号索引相关。

仲裁器112可将“符号窗索引”变量设为“0”。该“符号窗索引”变量表示最低的符号索引,对该符号索引在节点向量104之一中有未被评估的状态。当与该“符号窗索引”变量相关的节点向量104之一仅包含被评估的节点索引时,仲裁器112就可清除与该“符号窗索引”变量相关的节点向量104之一中的节点索引。仲裁器112然后就可增加该“符号窗索引”变量的值。以此方式,之前与“符号窗索引”相关的节点向量104之一可成为在与符号窗中的最后符号相关的节点向量之后的节点向量。此外,仲裁器112可使得之前与“符号窗索引”相关的节点向量104之一指定表示NFA的未锚定状态的节点。未锚定状态可表示可在符号流中的任一符号处开始的威胁签名的初始状态。

处理引擎102可包括被称为线程114A~114N(统称为“线程114”)的多个并行处理硬件组件。每个线程114都可以硬件来实现并且彼此并行运行。当线程114之一为空闲时,该线程就可提供一事件给仲裁器112,该事件提醒仲裁器112该线程空闲。响应于该事件,仲裁器112访问节点向量104来选择由与符号窗中的符号位置相关的节点向量104中的多个所指定的任一未被评估的节点。

在选择未被评估的节点过程中,仲裁器112可将由与较低符号索引相关的节点向量所指定的节点列入优先地位。例如,假设节点向量104A与“符号窗索引”变量相关。在此实例中,仲裁器112可确定节点向量104A是否指定任何未被评估的节点。如果节点向量104A指定一个或多个未被评估的节点,则仲裁器112选择这些未被评估的节点之一。否则,如果节点向量104A没有指定任何未被评估的节点,则仲裁器112可确定与“符号窗索引”的符号索引相关的节点向量104之一再加上1(如,节点向量104B)是否指定任何未被评估的节点。如果节点向量104B指定一个或多个未被评估的节点索引,则仲裁器112可选择这些未被评估的节点索引之一。否则,如果节点向量104B没有指定任何未被评估的节点索引,则仲裁器112确定与“符号窗索引”的符号索引相关的节点向量104之一再加上2(如,节点向量104C)是否指定任何未被评估的节点。如果节点向量104C指定一个或多个未被评估的节点索引,则仲裁器112可选择这些未被评估的节点索引之一。否则,如果节点向量104C没有指定任何未被评估的节点索引,则仲裁器112可确定与“符号窗口索引”的符号索引相关的节点向量104之一再加上3(如,节点向量104D)是否指定任何未被评估的节点。如果节点向量104D指定一个或多个未被评估的节点索引,则仲裁器112就可选择这些未被评估的节点索引之一。否则,如果节点向量104D没有指定任何未被评估的节点索引,则仲裁器112可再次确定节点向量104A是否指定任何未被评估的节点。尽管实际上节点向量104A并未初始指定任何未被评估的节点,但是节点向量104A现在却可包含未被评估的节点,这是因为由节点向量104A指定的、正在被评估的节点可能已经将新节点添加到了节点向量104A。仲裁器112可以此方式继续进行一直到仲裁器112识别一个未被评估的节点为止。

在选择未被评估的节点之后,仲裁器112可以将该未被评估的节点指定为“当前正被评估”。仲裁器112然后就可将所选择的节点分配到线程114中的空闲线程。为了将由节点向量104之一所指定的节点分配给线程114之一,仲裁器112可以将该节点的节点索引和与该节点向量相关的符号索引提供给该线程。由该符号索引所标识的符号位置在本文中可被称为“当前符号位置”。

在仲裁器112将节点索引和符号索引提供给线程114中之一后,该线程可相对于该符号索引所指示的符号来评估由该节点索引所指定的节点。例如,该线程可使用符号索引来从符号缓冲器100检索符号。该符号在本文可称为“当前符号”。此外,该线程还可从存储模块20(或高速缓冲存储器106)检索由该节点索引所标识的节点。该节点在本文中可被称为“当前节点”。

在检索该当前符号和当前节点之后,该线程可确定当前节点是状态节点还是映射节点。如果当前节点是映射节点,则该线程可计算与当前符号相关的映射节点中的下一状态元素的存储地址。例如,该线程可使用上面根据图3所概括的处理(process,进程)来计算在存储模块20中的下一状态元素的存储地址。在计算对应于该当前符号的下一状态元素的存储器地址之后,线程可发送读取请求给存储模块20以请求与计算出来的存储地址相关的存储位置的内容。如果高速缓冲存储器106包括与计算出来的存储地址相关的存储位置的内容,则高速缓冲存储器106可以存储模块20的名义响应该读取请求。在检索下一状态元素之后,该线程就可如下所述地处理下一状态元素。

如果当前节点是状态节点,则该线程可确定当前节点是否将当前符号映射到当前节点的下一状态元素。为了确定当前节点是否将当前符号映射到下一状态元素,该线程可检查该状态节点的每个符号元素并确定该符号是否遵从由任一符号元素指定的符号准则。例如,如果符号元素的元符号标志被设为‘0’,则线程确定当前符号是否与在符号元素中指定的符号相匹配。如果当前符号与符号元素中指定的符号相匹配,则当前节点确实将当前符号映射到当前状态的下一状态元素。另一方面,如果符号元素的元符号标志被设为‘1’,则该线程可确定当前符号是否为由元符号描述的符号类的一项。例如,如果在符号元素中所指定的符号值为“0x02”,则在当前符号是字母符号的情况下,该线程可确定当前节点将当前符号映射到下一状态元素。当在符号元素中所指定的符号值为“0x00”(即,显式ε转换)时,该线程就可使得与当前符号位置相关的节点向量104之一指定由下一状态元素所指示的节点。该线程没有确定当前节点将当前符号映射到下一状态元素。

在确定当前节点是否将当前符号映射到下一状态元素之后,该线程可确定符号元素的ε标志是否已被设为‘1’。如果符号元素的ε标志已被设为‘1’并且当前节点将当前符号映射到下一状态元素,则该线程就可按如下所述来处理该状态节点的下一状态元素。

不管当前节点是否将当前符号映射到下一状态元素,如果符号元素的ε标志被设为‘1’,则该线程可确定是否将符号元素的ε条标志设为‘1’。如果符号元素的ε条标志被设为‘0’或者当前节点没有将当前符号映射到下一状态元素,则该线程就可发送对在存储模块20中的在当前节点之后的节点的读取请求。当前节点之后的节点可为状态节点或者映射节点,其包括一个或多个ε转换并可将一个或多个符号映射到一个或多个下一状态元素。在接收当前节点之后的节点以后,该线程就可类似于任何其它节点一样来评估这一节点。另一方面,如果将符号元素的ε条标志设为‘0’并且当前节点将当前符号映射到下一状态元素,则该线程就‘退出(retire)’并通知仲裁器112该线程空闲。

如果符号元素的ε标志未被设为‘0’并且如果当前节点将当前符号映射到下一状态元素,则该线程可确定当前节点之后的、存储模块20中的节点是否是由当前节点的下一状态元素所指示的节点。如果当前节点之后的、存储模块20中的节点是由当前节点的下一状态元素所指示的节点,则由下一状态元素所指示的节点就成为新的“当前节点”。此外,该线程还可增加符号索引的值。该线程然后可返回并用新的当前符号来评估该新的当前状态。另一方面,如果符号元素的ε标志未被设为‘1’,当前节点将当前符号映射到下一状态元素,并且当前节点之后的、存储模块20中的节点不是由该状态节点的下一状态元素所指示的节点,则该线程就可处理当前节点的下一状态元素并退出。

如果符号元素的ε标志未被设为‘1’并且如果当前节点未将当前符号映射到下一状态元素,则该线程可‘退出’并通知仲裁器112该线程空闲。

为了处理下一状态元素,该线程可首先确定下一状态元素的位15是否是0。如果下一状态元素的位15是0,则该线程可确定位14:0的值是否等于0x7FFF(即,死状态)。下一状态元素的位14:0可表示节点索引。如果节点索引的值不等于0x7FFF,则该线程可确定与当前符号位置之后的符号位置相关的节点向量104之一是否已经指定了由该节点索引所指示的节点。在这个实例中,如果节点向量已经指定了该节点,则该线程不将该节点索引添加到节点向量。另一方面,如果该节点向量未指定该节点,则该线程可使该节点向量指定该节点。在一实例中,该线程可将该节点索引存储在节点向量104之一中,该节点向量104之一与等于当前符号的符号索引加上1再对5取模的向量索引相关。如果节点索引的值是0x7FFF,就不需要进一步的动作,这是因为下一状态元素指示死状态。

如果下一状态元素的位15的值是‘1’,则该线程可确定位14的值是否是‘1’以及位13的值是否是‘0’。如果位14的值是‘1’且位13的值是‘0’,则下一状态元素的位12:0可指示映射节点索引。在此情况下,该线程可使得由该映射节点索引指示的映射节点由与当前符号位置之后的符号位置相关的节点向量104之一所指定。

如果下一状态元素的位15的值是‘1’、位14的值是‘1’、位13的值是‘1’以及位12的值是‘0’,则位12:0的值可表示模式标识符。在此情况下,该线程可将该模式标识符添加到结果缓冲器108。此外,该线程还可将当前符号索引添加到结果缓冲器108,以指示符号流中威胁签名的位置。

如果下一状态元素的位15的值是‘1’、位14的值是‘1’、位13的值是‘1’以及位12的值是‘1’,则位12:0的值可表示用于结尾锚定模式的模式标识符。在这种情况下,线程可确定当前符号是否是“文本末尾”,并且确定当前符号是否是符号流中最后的符号。如果当前符号是“文本结尾”符号并且当前符号是在符号流中最后的符号,则该线程可将位12:0的模式标识符和该符号索引添加到结果缓冲器108。

图5是示出示例性的非确定性有限自动机120的表示的框图。在图5的实例中,NFA 120的节点表示为圆圈,符号转换表示为实线箭头,并且ε转换表示为虚线箭头。此外,接受状态表示为虚线圆圈。每个接受状态都可与模式标识符相关。NFA 120接受遵从由正则表达式“abc|h[ao]t|[a-z].[0-9]”描述的模式的符号流。

最初,仲裁器112可以使节点向量104A与符号流中的第一符号位置相关、使节点向量104B与符号流中的第二符号位置相关、使节点向量104C与符号流中的第三符号位置相关、使节点向量104D与符号流中的第四符号位置相关,以及使节点向量104E与符号流中的第五符号位置相关。仲裁器112然后可将节点121的节点索引添加到节点向量104A。在将节点121的节点索引添加到节点向量104A之后,仲裁器112可将节点121分配到线程114的第一个线程。

当线程114的第一个线程评估状态121时,线程114的第一个线程可确定在缓冲器100中的在符号索引0处的符号是否是符号‘a’。如果是这样,则线程114的第一个线程可将节点124的节点索引添加到节点向量104B。线程114的第一个线程可将节点124的节点索引添加到节点向量104B,这是因为节点向量104B当前与符号流的第二符号位置相关。此外,线程114的第一个线程还可评估节点122,这是因为存在从节点121到节点122的ε转换。当线程114的第一个线程评估节点122时,线程114的第一个线程就可确定在符号索引0处的符号是否是符号‘h’。如果是这样,则线程114的第一个线程可将节点125的节点索引添加到节点向量104B。此外,线程114的第一个线程还可评估节点123,这是因为存在从节点122到节点123的ε转换。当线程114的第一个线程评估节点123时,线程114的第一个线程可确定在符号索引0处的符号是否是小写字母符号。如果是这样,则线程114的第一个线程可将节点127的节点索引添加到节点向量104B。因为没有来自状态123的ε转换,所以线程114的第一个线程可在评估状态123之后退出。线程114的第一个线程评估节点121、122和123,这是因为节点121、122和123通过ε转换而相连。由于节点121、122和123通过ε转换而相连,因此,在节点121被评估时,节点122和123也将总会被评估。因此,由于不将节点122和123添加到节点向量104A而可以节省时间。此外,因为节点121、122和123通过ε转换而相连,所以,节点121、122和123被存储在存储模块20中的连续存储位置之中,因此就可在单个存储请求中来检索它们。此外,如果节点121被评估,则节点122和123将总会被评估。在线程114的第一个线程执行这些动作的同时,仲裁器112可将由节点向量104指定的其它未被评估的节点分配给线程114的其它线程。

如果在符号索引0处的符号是符号‘a’,则一将节点124添加到节点向量104B,仲裁器112就可将节点124分配给线程114之一。该线程可确定在符号索引1处的符号是否是符号‘b’。如果是这样,则该线程可确定符号索引1是否处在符号窗中。如果符号索引1处在符号窗中,则该线程可确定在符号索引2处的符号是否是符号‘c’。如果符号索引2处的符号是符号‘c’,则该线程就可将与节点131相关的模式标识符和符号索引‘2’添加到结果缓冲器108。如果符号索引1不在符号窗中,则该线程可将节点124添加到节点向量104B并且退出。

可选地,如果在符号索引0处的符号是符号‘h’,则节点向量104B包括节点125的节点索引。在此情况下,一将节点125添加到节点向量104B,仲裁器112就可将节点125分配给处理引擎102中的线程。该线程可确定在符号位置1处的符号是否是符号‘a’。如果在符号位置1处的符号是符号‘a’并且节点129的节点索引还未在节点向量104C中,则该线程可将节点129的节点索引添加到节点向量104C。此外,该节点还可执行到状态126的ε转换。当该线程评估节点126时,该线程可确定在符号位置1处的符号是否是符号‘o’。如果在符号位置(索引)1处的符号是符号‘o’并且节点129的节点索引还未在节点向量104C中,则该线程可将节点129的节点索引添加到节点向量104C。因为没有来自节点126的进一步的ε转换,所以,该线程可在评估节点126之后退出。

如果节点向量104C包含节点129,则仲裁器112可将节点129分配给处理引擎102中的线程。该线程可确定在符号索引2处的符号是否是符号‘t’。如果在符号索引2处的符号是符号‘t’,该线程就可将与节点132相关的模式标识符和符号索引2添加到结果缓冲器108。因为没有来自节点129的进一步ε转换,该线程可在将模式标识符和符号索引添加到结果缓冲器108之后退出。

如果节点向量104B包含节点127的节点索引,则仲裁器112可将节点127分配给线程114之一。该线程然后可确定在符号索引1处的符号与<.>符号相匹配,这是因为<.>符号与所有符号都相匹配。接下来,该线程可确定符号索引1是否在该符号窗中。如果符号索引1不在该符号窗中,则该线程就可将节点130的节点索引添加到节点向量104C并且退出。如果符号索引1在该符号窗中,则该线程可确定符号索引2处的符号是否是0和9之间的符号。如果符号索引2处的符号是0和9之间的符号,则该线程可将与节点133相关的模式标识符和符号索引‘2’添加到结果缓冲器108。

图6是示出在模式匹配模块18中的仲裁器112的示例性操作的流程图。最初,仲裁器112可使节点向量104的每一个节点向量都与符号窗中的不同符号位置相关(140)。例如,仲裁器112可使节点向量104A与符号流的第一符号位置相关、使节点向量104B与符号流的第二符号位置相关,等等。接下来,仲裁器112还可将指示代表NFA开始状态的节点的节点索引添加到节点向量104A(142)。在图6的实例中,节点向量104A被称为第一节点向量,这是因为仲裁器112已使节点向量104A与符号窗中的第一符号位置相关。

在将节点索引添加到第一节点向量之后,仲裁器112可确定节点向量104之中的任何一个是否都指定一个未被评估的节点(144)。如果仲裁器112确定节点向量104之一指定一个未被评估的节点(144的“是”),则仲裁器112可确定是否所有线程114都忙(146)。如果所有线程114都忙(146的“是”),则仲裁器112可一直等待直到线程114之一提供事件给仲裁器112,通知仲裁器112该线程空闲(148)。当仲裁器112接收这种事件时,仲裁器112可将未被评估的节点分配给空闲线程(150)。另一方面,仲裁器112确定这些线程之一不忙(146的“否”),仲裁器112可立即将未被评估的节点分配给空闲线程(150)。

在仲裁器112将未被评估的节点分配给空闲线程之后或者在仲裁器112确定节点向量104中任一个都不包括未被评估的节点(144的“否”)之后,仲裁器112可确定所有由第一节点向量指定的节点是否都已被评估(152)。如果并非所有由第一节点向量指定的节点都已被评估(152的“否”),则仲裁器112可返回并再次确定第一节点向量是否指定任何未被评估的节点(144)。换句话说,当第一节点向量指定了未被评估或当前正被评估的一个或多个节点时,仲裁器112就可返回。

如果所有由第一节点向量指定的节点都已被评估(152的“是”),则仲裁器112就可清除存储在第一节点向量中的节点索引(154)。在清除了存储在第一节点向量中的节点索引之后,仲裁器112就可前移符号窗(156)。当仲裁器112前移符号窗时,第一节点向量就成为与该符号窗的最后符号位置之后的符号位置相关的节点向量。在前移该符号窗之后,仲裁器112可将表示NFA的未锚定状态的节点的节点索引插入到第一节点向量中(158)。仲裁器112将这些节点索引插入到第一节点向量之中是因为一些威胁签名可起始于在符号流中的任一点处。

图7是示出了用于评估状态节点的处理引擎102中的线程114之一的示例性操作的流程图。最初,该线程确定当前节点是映射节点还是状态节点(160)。如果当前节点是映射节点(160的“是”),则该线程可执行图8中的实例所示出的操作。

另一方面,如果当前节点不是映射节点(160的“否”),则当前节点就是状态节点。当该线程确定当前节点是状态节点时,该线程可确定当前节点的ε标志是否被设为‘1’(162)。如果当前节点的ε标志被设为‘1’(162的“是”),则该线程可确定当前节点是否将当前符号映射到当前节点的下一状态元素(164)。如果当前节点将当前符号映射到所述下一状态元素(164的“是”),则该线程可评估当前节点的下一状态元素(166)。例如,该线程可根据图9的实例中所描述的操作来评估下一状态元素。

在处理下一状态元素之后,该线程可确定当前节点的ε条标志是否已被设为‘1’(168)。此外,如果当前节点未将当前符号映射到下一状态元素(164的“否”),则该线程可确定当前节点的ε条标志是否已被设为‘1’(168)。如果当前节点的ε条标志被设为‘1’(168的“是”),则该线程可确定当前节点是否将当前符号映射到下一状态元素(170)。如果当前节点将当前符号映射到下一状态元素(170的“是”),则该线程退出(174)。另一方面,如果当前节点未将当前符号映射到下一状态元素(170的“否”),则该线程就可请求来自存储模块20的下一节点(172)。下一节点是存储模块20中的当前节点之后的节点。该线程然后就可将该“下一节点”指定为新的当前节点。在请求来自存储模块20的下一节点之后,该线程可返回并确定当前节点是状态节点还是映射节点(160)。

如果当前节点的ε条标志未被设为‘1’(168的“否”),则该线程可从存储模块20中检索下一节点(172)。然后该线程就可将该下一节点指定为新的‘当前节点’。然后该线程可返回并确定新的当前节点是状态节点还是映射节点(160)。

如果当前节点的ε标志未被设为‘1’(162的“否”),则该线程可确定当前节点是否将当前符号映射到下一状态元素(174)。如果该线程确定当前节点未将当前符号映射到下一状态元素(174的“否”),则没有更多工作可由该线程来做。因此,该线程可完成其操作并退出(176)。

如果该线程确定当前节点将当前符号映射到下一状态元素(174的“是”),则该线程可确定由当前节点的下一状态元素所指示的节点是否与在存储模块20之中的、当前节点之后的节点相同(178)。如果由当前节点的下一状态元素所指示的节点与在存储模块20之中的、当前节点之后的节点相同(178的“是”),则该线程可确定在流缓冲器100中的下一符号是否在符号窗中(179)。如果流缓冲器100中的下一符号在该符号窗中(179的“是”),那么,该线程可将存储模块20之中的、当前节点之后的节点指定为“当前节点”(180)。接下来,该线程就可将当前符号设为流缓冲器100中的下一符号(182)。换句话说,该线程可将当前符号之后的符号指定为“当前符号”。然后该线程可返回,检索在符号索引处的符号缓冲器100中的符号,并且确定新的当前节点是映射节点还是状态节点(160)。以此方式,该线程可快速评估一系列连续符号。

否则,如果由当前节点的下一状态元素所指示的节点与在存储模块20之中的、当前节点之后的节点不相同(178的“否”),或者如果流缓冲器100中的下一符号不在符号窗中(179的“否”),则该线程可处理当前节点的下一状态元素(184)。例如,该线程可使用在图9的实例中所概括的操作来处理当前节点的下一状态元素。在处理当前节点的下一状态元素之后,该线程可以退出(174)。

图8是示出了评估映射节点的实例操作的流程图。在图8中示出的实例中,线程114之一可通过计算映射起始地址来开始评估映射节点(190)。该线程可通过将MAP_BASE地址左移七个位置、将该映射节点的映射索引左移四个位置、以及将这两个移位后的值加在一起,来计算该映射起始地址。

在计算映射起始地址之后,该线程可从存储模块20或者高速缓冲存储器106中获得位组和先前1计数(192)。例如,该线程可通过提取当前符号的位7:3并将所提取的位左移一个位置来获得位组和先前1计数。然后该线程可通过将该移位后的值加到该映射起始地址来计算存储地址。在计算该存储地址之后,该线程就可从与该计算出来的存储地址相关的存储器中的位置检索16位块。该块的第一个八位可表示位组而该块的第二个八位可表示先前1计数。

当该线程已经获得了位组和先前1计数时,该线程就可计算游程数(194)。该游程数表示在与当前符号相关的位的左侧的1(1’s)的个数。为了计算该游程数,该线程就可计算在与当前符号相关的位的左侧的位组中的被设为‘1’的位的个数。在计算在与当前符号相关的位的左侧的位组中的被设为‘1’的位的个数之后,该线程通过将在与当前符号相关的位的左侧的位组中被设为‘1’的位的个数与先前1计数相加来计算该游程数。

接下来,该线程可从存储模块20中获得当前节点中的下一状态元素(196)。为了获得下一状态元素,该线程可计算下一状态元素的存储地址。例如,该线程可通过将该映射起始地址、数字六十四以及与二相乘的游程数相加来计算下一状态元素的存储地址。该线程然后可使用该存储地址来从存储模块20(或高速缓冲存储器106)中获得下一状态元素。

在该线程从存储模块20或高速缓冲存储器106中获得下一状态元素之后,该线程可处理下一状态元素(198)。例如,该线程可通过执行图9的实例中所述的操作来处理下一状态元素。

图9是示出了处理下一状态元素的操作实例的流程图。在该示例性操作中,线程114之一可确定下一状态元素指定状态节点索引(200)。如果下一状态元素指定状态节点索引(200的“是”),则该线程可确定下一状态元素是否指定节点索引0x7FFF(即,死状态)(202)。在该示例性操作中,如果下一状态元素指定节点索引0x7FFF(202的“是”),则该线程就不进行操作(204)。另一方面,如果下一状态元素指定除了0x7FFF以外的节点索引(202的“否”),则该线程可确定与向量索引((N+1)mod 5)相关的节点向量104之一是否包括该状态节点索引,其中N是当前符号索引(206)。如果该节点向量已经包括该状态节点索引(206的“是”),则该线程不进行操作(204)。否则,如果该节点向量还未包括该状态节点索引(206的“否”),则该线程可将状态节点索引加到该节点向量(208)。

如果下一状态元素未指定状态节点索引(200的“否”),则该线程可确定下一状态元素是否指定映射节点索引(210)。如果下一状态元素指定映射节点索引(210的“是”),则该线程可确定与向量索引((N+1)mod 5)相关的节点向量104之一是否包括该状态节点索引(206)。如果该节点向量已经包括该状态节点索引(206的“是”),则该线程就不进行操作(204)。否则,如果该节点向量还未包括该状态节点索引(206的“否”),则该线程可将该状态节点索引添加到该节点向量(208)。

另一方面,如果下一状态元素不指定映射节点索引(210的“否”),则该线程可确定下一状态元素是否为非结尾锚定的模式指定模式标识符(212)。如果下一状态元素指定非结尾锚定的模式标识符(212的“否”),则该线程可将在下一状态元素中指定的模式标识符和当前符号索引添加到结果缓冲器108(214)。

如果下一状态元素指定结尾锚定的模式标识符(212的“是”),则该线程可确定当前符号是否是文本结尾符号(216)。如果该线程确定当前符号是文本结尾符号(216的“是”),则该线程可确定当前符号是否是该符号流的最后符号(218)。如果当前符号是该符号流的最后符号(218的“是”),则该线程可将下一状态元素中的模式标识符和当前符号索引添加到结果缓冲器108(220)。否则,如果当前符号不是文本结尾符号(216的“否”)或者如果当前符号不是该符号流中的最后符号(218的“否”),则该线程就不进行操作(204)。

图10是示出了其中模式匹配模块18评估Unicode符号的示例性节点230的框图。如上所述,在状态节点中符号元素的位15:8可指定符号值。然而,Unicode标准规定至少两种表示单个标准ASCII符号的方式。特别地,该Unicode标准规定:标准ASCII符号可以单个8位块表示。另外,Unicode标准规定:相同ASCII符号可以两个8位块表示,其中,这些8位块的第一个全是零,且这些8位块的第二个与单个8位块表示相同。例如,在Unicode标准中,字母‘A’可由位‘0100 0001’或者由位‘0000 0000 0100 0001’来表示。

图10的实例提供了有限自动机节点232的细节,其中,Unicode标志已被设为‘1’。当模式匹配模块18开始处理状态节点230时,模式匹配模块18可转换到第一子状态。在当前符号全是零时,模式匹配模块18可从第一子状态转换到第二子状态。以此方式,模式匹配模块18‘消耗’当前符号并使当前符号之后的、符号流中的符号成为新的当前符号。此外,模式匹配模块18还可通过ε转换而转换到第二子状态。然后模式匹配模块18可确定“当前符号”是否与状态节点230的符号元素中的符号之一相匹配。如果“当前符号”与状态节点230的符号元素中的符号之一相匹配,则如由与指定该匹配符号的符号元素相关的下一状态元素所指示的那样,模式匹配模块18可从第二子状态转换到节点234。以此方式,在当前符号与在状态节点230的符号元素中的符号之一相匹配时,或在当前符号全为零且下一符号与状态节点230中的符号之一相匹配时,模式匹配模块18可从状态节点230转换到节点234。

本公开中描述的功能可被应用到通过使用数据存储介质存储和/或检索的,或者经由有线或无线通信系统传送(如,发射和/或接收)的各种数据中的任一种。有线和无线通信系统的实例包括任何通信技术(包括但不限于使用CDMA、GSM、802.11、蓝牙、超宽带(UWB)、OFDM、FDMA、TDMA、W-CDMA或任何其它无线电存取技术)的无线传输,以及使用诸如TCP/IP、ATM等等各种网络协议中的任一种的有线或无线传输。这些功能可被应用于任何类型的数据(包括但不限于,音乐数据、视频数据、多媒体数据或其它娱乐数据、金融数据、安全数据、商业数据、政府数据、军事数据、营销数据、销售数据、医疗病人数据、医疗诊断数据、医学影像数据、表示图形或文本内容的数据、图像数据、化学数据、地理数据、映像数据、电视播放数据、无线电广播数据、email数据、互联网数据、个人数据等等)。

在一个或多个示例性实施例中,所描述的功能可以硬件、软件、和/或固件或其任意组合来实现。如果以硬件形式实现,则这些功能可以一个或多个微处理器、微控制器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)等等形式实现。这些组件可位于通信系统、数据写入和/或读取系统、或者其它系统中。如果以软件形式实现,则这些功能就可作为一条或多条指令或代码而被存储到或传输到计算机可读介质之上。计算机可读介质既包括计算机存储介质也包括通信介质(包括便于计算机程序从一个地方传送到另一地方的任何介质)。存储介质可以是能由计算机所存取的任意可用介质。利用实例(但不限于此),这样的计算机可读介质可包括:RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或者能用于承载或存储以指令或数据结构形式的且能由计算机存取的所想要的程序代码的其它任何介质。本文所用的Disk和Disc(“盘”)包括:光盘(CD)、激光盘、光盘、数字多功能盘(DVD)、软盘以及蓝光盘,其中有的盘(“disk”)通常通过磁的方式再生数据,而有的盘(“disc”)则使用激光光学再生数据。上述的组合也应该包括在计算机可读介质的范围内。

已经描述了本发明的各种实施例。这些和其它实施例都在权利要求书的范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号