【论文分享】SymTCP:基于状态差异的自动化深度包检测逃逸技术
今天分享的论文是一篇针对网络审查的研究。该论文根据深度包检测系统(Deep Packet Inspection,DPI)与用户终端网络协议实现之间的差异,利用符号执行技术在TCP层自动化生成插入包(被DPI接受但被服务端忽略)与逃避包(被DPI忽略但被服务端接受)。论文通过对一些知名DPI系统进行测试,不仅发现了已知的逃逸策略中使用的插入包与逃避包,还发现很多未发现的插入、逃避包可用于组成新的审查逃逸策略。该论文主要由加州大学滨河分校的研究人员完成,其中钱志云教授在网络与系统安全两大领域进行了多项安全研究,已在多个国际网络安全顶级会议上发表文章30余篇。论文发表于国际网络安全四大顶级会议 NDSS 2020(录用率:17.4%)。
全文约3300字,阅读时间约10分钟。
01【研究背景】
深度包检测技术(DPI)针对网络应用层的内容进行检测与控制,已广泛部署于现代网络安全基础设施中。但是DPI系统面临一类主要限制,即容易受到协议歧义的影响。不同的网络栈的实现通常在其状态机中存在固有差异,甚至同一网络栈的不同版本也可能存在差异[1]。为了确保低开销与兼容性,DPI通常会单独实现简化的协议状态机,这与终端主机上的协议状态机存在诸多不同。
DPI与终端主机网络协议实现之间的差异,能够导致某些网络包被DPI与终端主机接受或者丢弃。利用该特性,可以使用插入数据包与逃避数据包误导DPI的协议状态机,进入与终端主机不同的协议状态,从而失去组装应用层数据包并检测恶意或敏感负载的功能。
当前针对插入数据包与逃逸数据包生成的研究工作,大多是针对特定的DPI中间盒人工构造这种对抗性数据包。然而,人工分析所有DPI实现并生成对抗性数据包是非常耗时耗力的,并且难以在不同DPI实现之间进行拓展应用。尽管可以通过搜索所有可能的数据包序列完成自动化生成的过程,但是遍历指数级庞大的搜索空间是非常具有挑战的,比如,单个数据包的20字节TCP头就有2的160次方种可能性。因此,如何自动化构造数据包,引起DPI中间盒与终端主机解除协议状态同步,是非常具有挑战的。
02【研究问题】
该论文利用符号执行的方法构建TCP协议状态机,生成候选数据包,这些候选数据包在黑盒场景下针对DPI中间盒进行差分测试,自动发现插入与逃逸数据包,识别DPI与终端主机之间的TCP协议实现差异。首先解释符号执行方法,并定义TCP协议状态机中的几个重要概念。
符号执行相关技术
- 1、符号执行:用符号代替具体值来表示变量去探索目标程序的执行空间。该方法能够突破复杂而严密的分支条件,并沿着执行路径深入。
- 2、混合执行:通过具体的执行操作增强符号执行结果。具体而言,将一个具体值绑定到每个符号表达式,从而可以随时在符号执行与具体执行之间切换模式。
- 3、选择性符号执行:进一步扩展了混合执行方法,在测试大型复杂软件(如操作系统内核)时更加灵活、实用。该方法能使部分系统运行在符号执行模式下,其他系统运行在具体执行模式下。
TCP状态机
首先,每个TCP协议实现都可以建模为一个确定性的状态机,Mealy。与传统的确定性有限状态机相比,Mealy的输出由其当前状态与当前输入决定。该论文将Mealy的输出定义为应用层有效负载的缓冲区输出,而不是响应包,原因包括两方面:(1) DPI对敏感关键字的检测严格依赖于应用层的有效负载;(2) DPI的TCP层不会生成任何类似ACK数据包的TCP层输出。论文根据该状态机模型,定义了以下几个重要概念。
1. 丢弃与接受:给定一个TCP协议状态机,如果输入一个数据包,既不会引起协议状态改变,也不会产生任何输出,那么该行为被定义为丢弃。相应的,将丢弃路径定义为不改变TCP会话当前状态或不产生任何输出的情况下,释放传入TCP数据包的程序路径。在丢弃路径上执行的程序动作称为丢弃点。接受的定义与之相反,即引起协议状态改变或者产生某些输出。
2. 同步与去同步:从TCP的LISTEN状态开始,客户端发送给服务器(Ms)n个数据包(P1到Pn),处于客户端与服务器中间的DPI的TCP状态机(Md)能够拷贝每个数据包,这个过程被定义为同步。如果第n+1个包(Pn+1)导致Md和Ms的数据流出现差异,则表明Pn+1导致了Md与Ms的去同步。
3. 插入包与逃避包:两者都是能够引起DPI与服务器去同步的数据包,这样包含敏感信息的数据包就能绕过DPI的审查。插入包是被服务器丢弃而被DPI接受的数据包,逃避包是服务器接受但被DPI丢弃的数据包。
论文的核心目标是通过符号执行与TCP状态机构建一个能自动发现插入包与逃避包的框架,即SymTCP。
03【SymTCP】
SymTCP的工作框架如图表1所示,整体可以划分为离线选择混合执行模块与在线测试模块。
- 图表1:SymTCP的工作框架
Step I. 离线选择混合执行模块
离线选择混合执行模块借助TCP状态机与符号执行技术,自动生成候选数据包。该模块的输入是一组初始TCP数据包(如SYN包)作为种子集合,与一组Linux操作系统上TCP协议实现的接受点与丢弃点(如bad checksum)。随后,将服务器上的TCP协议实现抽象为混合执行,收集所有在不同TCP状态下到达接受点或者丢弃点的执行路径以及对应的路径约束,这些数据包与路径约束将会输出到下一个在线测试阶段,作为候选插入包与逃避包。图表2显示了一些到达丢弃点与接受点的示例数据包,以及最后输出的路径约束,即候选插入包与逃避包。
图表2:候选数据包生成流程示意图
总结而言,该模块运行了一个以Linux为内核的混合执行引擎,通过输入各种符号化数据包,在整个TCP连接过程中尽可能地探索服务器的TCP协议状态机,输出以符号公式与符号约束形式的候选插入/逃避数据包序列,并将这些序列作为候选插入包与逃避包输送到下一阶段进行测试。此外,该模块还会输出对应的连接状态,以方便后续生成探测数据包。
Step II. 在线测试阶段
在线测试模块将上一阶段的候选数据包具体化,然后送入真实的网络环境用DPI进行测试。因为上一阶段是符号执行,整个阶段的数据都是抽象存在的(没有具体的数据结构),所以输出的候选包进入在线测试模块后,首先会添加额外的约束以具体化这些候选包。具体而言,该模块给候选数据包生成具体的序列号,具体化TCP所需的各个字段成为真实数据包后送入DPI prober。图表3显示了该模块的主要工作流程,对于每个数据包序列,从第一个数据包开始逐一进行探测。如果某个数据包到达丢弃点(即被服务器丢弃),则被认为是一个候选插入包,然后进行DPI prober,查看它是否会被DPI接受,若被接受则证明该数据包为插入包。同理,到达接受点(即被服务器接受)的数据包,若被DPI prober丢弃则为逃避包,若被接受则针对该数据包的后续一个数据包进行探测。
图表3:对候选数据包的评估过程示意图
04 实验评估
离线选择混合执行模块在TCP协议实现的源代码中标注了38个不改变状态的丢弃点,作者在这一阶段使用的符号执行系统是S2E,是一款强大的选择符号执行工具。S2E引擎工作在二进制级别,映射后为47个丢失点,具体如图表5所示。其中,同一个丢失点可以对应不同的数据包种类,比如TCP checksum可以是SYN包,也可以是ACK包,并且可以在不同的TCP协议状态。
图表4:标注的丢弃点
随后,对离线选择混合执行模块进行了覆盖性测试,分别选取20字节、40字节与60字节大小的数据包进行实验,探究能够使丢弃点覆盖率达到最高的TCP数据包大小。根据图表2所示的三次握手阶段数据包的符号执行,观察丢失点的覆盖情况,结果如图表5所示。论文发现40字节的TCP包可以覆盖39个丢弃点,而无法覆盖的8个丢弃点也因为在实际情况中很难复现对实验没有影响,因此证明该阶段能够覆盖插入包与逃避包的各项特征。最终论文选取40字节的TCP包为初始种子包进行数据包生成,经过筛选与精简后,共生成了大小为10,000的待测试集。
- 图表5:不同大小的TCP包对于丢弃点的覆盖情况
并且,论文针对主流开源的NIDS系统,包括Zeek[2]、Snort[3],评估SymTCP的效果。图表6显示了在各系统上发现的逃逸用例的数量。
1. Zeek。在大多数情况下,Zeek只查看数据包的TCP标志,而不检查TCP控制数据包的SEQ或ACK号,例如SYN、RST、FIN。这样宽松的检测机制导致Zeek十分容易被绕过,具体表现在其逃避包比例较低。
2. Snort。Snort的TCP实现是最为严格的。Snort针对不同的操作系统实现了不同的TCP状态机,包括Windows、Linux和Mac OS。一般情况下,Snort会检查控制包的SEQ号,但不会检查ACK号。同时,Snort不检查TCP MD5选项,比较轻易接受窗口内的SYN、FIN和RST数据包。
05 总结
论文主要研究如何使用符号执行引导在TCP层生成插入和逃避包,针对DPI中间盒进行自动化测试。根据这一思想,论文开发了自动化评估系统SymTCP,对三种流行的DPI系统(包括Zeek与Snort)进行了有效性验证,并且发现了一些新的逃逸策略。SymTCP解决了以往只能手工发现逃逸DPI策略的局限性,并且能在短时间内自动生成大量的插入包、逃避包用于逃逸DPI的审查。
--
原文链接
https://www.ndss-symposium.org/ndss-paper/symtcp-eluding-stateful-deep-packet-inspection-with-automated-discrepancy-discovery/
SymTCP源码链接
https://github.com/seclab-ucr/SymTCP
参考文献
[1]A. Quach, Z. Wang, and Z. Qian, “Investigation of the 2016 linux tcp stack vulnerability at scale,” SIGMETRICS Perform. Eval. Rev., vol. 45, no. 1, pp. 8–8, Jun. 2017. [Online]. Available: http://doi.acm.org/10.1145/3143314.3078510
[2]The Zeek Network Security Monitor. [Online]. Available:https://zeek.org/
[3]Snort - network intrusion detection & prevention system. [Online]. Available: https://www.snort.org/
编辑&审校 | 刘明烜