Hyperscan在Suricata中的应用【转】

转自:http://syswift.com/260.html

Suricata简介

Hyperscan作为一款高性能的正则表达式匹配库,极适用于部署在IDS/IPS等网络解决方案中。
Suricata(https://suricata-ids.org)是一款免费、开源、成熟、快速、健壮的网络威胁检测引擎,该引擎能够进行实时入侵检测(IDS),嵌入式入侵防御(IPS),网络安全监控(NSM)和离线pcap处理。Suricata与其竞争对手Snort类似,有着相似的设计和规则样式,同样涉及到大量纯字符串及正则表达式匹配。本文重点介绍Hyperscan在Suricata中的应用,主要是单字符串匹配和多字符串匹配的基本原理。

image

Hyperscan的应用

自Suricata(3.1 release)开始,Hyperscan在支持的平台作为其单字符串匹配和多字符串匹配的默认选项。另外也有单正则表达式匹配的试验工作。

单字符串匹配

Suricata原先使用BM算法做单字符串匹配,使用Hyperscan后,由Hyperscan中的Noodle引擎替换相关工作。Noodle充分发挥SIMD指令优势,通过对输入数据进行快速的预过滤来实现快速的单字符串匹配,在AVX2、AVX512上能达到更快的效果。预过滤的基本原理其实是使用朴素的shift-and算法。

例如,对单条字符串规则/Hyperscan/的单模式匹配,取字符串前2字节做预过滤,构建2个16字节的掩码:


image

运行时每次读取16字节输入数据,用2次PCMPEQB指令与上述掩码做逐字节比较。假设运行时读到输入数据为“MATCHmyHyperscan”,则2次PCMPEQB的结果为(表中的1实际应为0xFF,为表达简便标记为1):


image

对上述结果做“shift-and”,即LSHIFT+AND指令,得到用2个字节做预过滤的结果:


image

预过滤结果中出现“1”的位置才是可能产生真实匹配的位置(我们称之为Positive),我们对这些位置进行确认,最终生成一个真实匹配(True Positive),或者发现不是真实匹配(False Positive)。本例中是一个真实匹配。
对AVX2/AVX512环境,能够得到更好的表现,因为对AVX2可以构建32字节掩码且每次读取32字节输入数据,对AVX512可以构建64字节掩码且每次读取64字节输入数据,完成同样的预过滤目标所需的指令数减少了很多。

多字符串匹配

Suricata原先使用AC算法做多字符串匹配,使用Hyperscan后,由Hyperscan中的Teddy/FDR引擎替换相关工作。Teddy通常在轻量级多字符串匹配场景下(2-72条字符串)优先使用,FDR则用来应对极大量字符串的场景。同样,Teddy和FDR使用SIMD指令对输入数据进行快速预过滤,在多字符串匹配场景下,比单字符串匹配有更好的效果。类似的,其预过滤的基本原理是使用朴素的shift-or算法。
以Teddy为例,Teddy通常情况下使用字符串中的后3字节做预过滤,对多字符串规则,根据每个字符串的后3字节进行分组,分组上限为8或16组,为表达输入数据中每个位置的预过滤结果,前者用1字节(每位各对应一组),后者用2字节。
例如,对3条字符串规则:

<textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="color: rgb(0, 0, 0); font-family: Monaco, MonacoRegular, "Courier New", monospace !important; font-size: 12px !important; line-height: 15px !important; margin: 0px; vertical-align: top; background: rgb(255, 255, 255); border: 0px; transition: all 0.3s ease-in-out 0s; padding: 0px 5px; overflow: hidden; width: 638px; box-sizing: border-box; height: 45px; position: absolute; opacity: 0; border-radius: 0px; box-shadow: none; white-space: pre; word-wrap: normal; resize: none; tab-size: 4; z-index: 0;"></textarea>

/Teddy/

/daddy/

/Hyperscan/

根据后3字节分为2组:组0 – “ddy”(0x64, 0x64, 0x79),组1 – “can”(0x63, 0x61, 0x6e)。
再根据3字节中的6个4位构建出6个16字节掩码,初值全1,每个4位有16种可能取值,对应16字节掩码中的1字节,并在该对应字节的对应位(组)上贡献一个0。6个掩码依次对应最末字节低4位、高4位(绿色),倒数第二字节低4位、高4位(橙色),倒数第三字节低4位、高4位(蓝色)。为简化表达每字节只记录本例中两组对应的两位:


image

运行时每次读取16字节输入数据,并以上述掩码用PSHUFB指令逐字节做映射。假设运行时读到输入数据为“TeddyinHyperscan”(54 65 64 64 79 69 6e 48 79 70 65 72 73 63 61 6e),则6次PSHUFB的结果为:


image

结果中的”0”表示输入数据中每个位置(列)对规则集后3字节是否产生匹配。相同位置只有高4位和低4位均得到相同组的匹配,才是一个完整字节的匹配。对相同颜色的掩码做OR得到:


image

对上述结果做“shift-or”,第一行不变,第二行做LSHIFT左移1字节,第三行做LSHIFT左移2字节,然后做OR得到:


image

此为预过滤的结果,其中的”0”表示在该位置出现与某组连续后3字节的匹配,是可能产生真实匹配的位置(Positive)。我们对这些位置进行确认,最终找出与候选组中哪个字符串产生了真实匹配(True Positive),或者发现不是真实匹配(False Positive)。本例中在位置4对组0的“Teddy”、位置15对组1的“Hyperscan”产生真实匹配。
同样的,对AVX2环境,我们只需把6个掩码均复制扩大一倍至32字节,且每次读取32字节输入数据;对AVX512环境,把掩码复制扩大至64字节,每次读取64字节输入数据。完成相同过滤目标的指令数也减少了很多。

性能数据

测试环境:Intel® Core i7 6700K CPU @ 4.0 GHz
软件版本:Hyperscan 4.3.1,Suricata 3.1
规则集:Emerging Threats public set (“emerging-all-20161102.rules”)
ET Pro set (“etpro-all-20161102.rules”)
输入PCAP文件:Alexa Top 100 browsing PCAP file
测试中我们衡量的是全部处理时间,包括编译和运行。原生的Suricata使用AC算法做多字符串匹配(MPM)和BM算法做单字符串匹配(SPM),使用Hyperscan全部替换后,在Emerging Threats规则集上获得1.95x性能提升,在ET Pro规则集上获得2.15x性能提升。
我们同样比较了单独替换多字符串AC算法及单独替换单字符串BM算法的性能,可见替换AC的性能要好于替换BM的性能,而二者性能又都介于原生和全部替换之间。各性能数据如下图所示。

image

这是可以预见的结果,因为对多模式匹配的良好支持正是Hyperscan的一大优势。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352