Evolving Censorship Evasion Strategies

Geneva: Evolving Censorship Evasion Strategies

简介

研究人员和审查者的猫鼠游戏在过去一直是手动完成的。这里我们提出了基于遗传算法的自动化方法来找到审查规避策略。我们开发了 Geneva,可以生成、变异、进化出策略,基于 drop, tamper headers, duplicate, and fragment
4 种原型。在实验室环境和真实世界(中国、印度和哈萨克斯坦)Geneva 都可以独立发现之前研究者找到的有效策略,和从未出现过的策略。Geneva 还发现了过去被认为不有效的策略,并且成功恢复了之前已经灭绝的策略,通过生成他们的变种。Geneva 是自动化审查规避的第一步。我们还公开了实验数据和源代码。

背景

许多国家部署的审查器是旁路的,好比网络入侵检测系统(Network Instruction Detection System),其必须正确实现 TCP 协议以追踪各个连接的状态,记录于其传输控制表(Transmission Control Block)中。由于其实现的不完全,客户端发送特制的封包可以绕过 NIDS。研究者可能发现其漏洞,利用它直到下一次修复,然后他们重新测量,分析,找出新的方法。这一直是手动完成的。

我们这里会提出新的基于遗传算法的自动化工具—Geneva。

我们实现了 Geneva 并且在中国的防火长城(Great Firewall),印度的 ISP 审查和哈萨克斯坦的 HTTPS 拦截中测试。Geneva 非常成功。在 GFW 内的 27 次实验中,Geneva 找到了 4 个不同物种,8个亚种(其中 5 个是从未出现过的),和这些亚种的一共 21 个不同变种。对于印度和哈萨克斯坦,Geneva 找到了 5 个物种。在实验室环境下,Geneva 独立地重现了过去发现的 36 种策略中的 30 个(未发现的只是要么我们没有给 Geneva 构建那种包的能力的,要么包括发包之间的故意延迟的方法),在数小时内。

我们的工作总结如下:

  • 提出了 Geneva,一种基于遗传算法的,可以快速独立发现新的封包修改方法来规避旁路的审查。

  • 在中国、印度和哈萨克斯坦测试了 Geneva,并分析了它发现的规避策略。

  • 展示 Geneva 可以重现之前发现的规避策略,并派生出两种全新的策略的物种。

  • 展示了一些曾经有效的策略如今已经灭绝,但是通过向 Geneva 输入这些策略,它可以进化出新的,有效的策略。

旁路审查

(略)

修改封包的规避策略

审查器通常“soft-fail”,如果某封包没有相应 state 或者算法来决定是否审查,就不会审查连接。比如,如果一个封包目标不在 IP 黑名单中,而有没有相关的 TCB 用于 stateful 的分析,审查器就默认地允许该连接。由于不同 endpoints 的协议栈的实现差异,之前的研究表明没有 NIDS 可以和通信两端一摸一样地,完美地重组封包流 4。许多这些中间盒、NIDS 和 DPI 系统也运作着不完整的 TCP/IP 栈。

这些系统处理 TCP 包的差异提供了审查规避的机会。客户端发送特制的封包,有可能欺骗 NIDS 进入脱同步(esynchronizing)状态或关闭对应连接的 TCB,或者完全忽略该连接,允许所有后续封包。重要的是,这不需要该国国外的协同。规避只要在客户端修改封包流就可以做到。

基于封包修改的规避策略(packet-manipulation-based evasion strategy) 是通过修改封包(改变,添加或丢弃)从而规避审查器的方法。之前的研究说明了许多可用于无效化审查器维护的 state 的策略。以下是最近 3 个与我们的设计相关的。

Khattak et al. 2013年,Khattak et al. 1 手制了 17 种不同规避策略,利用 GFW 的实现上的弱点。尽管之后的研究 3 表明这些方法在 2017 年失效了,Geneva identifies some strategies that fall within their taxonomy that are still highly effective today.

INTANG 2017 年,Wang et al. 3 发布了分析 GFW 的代表性研究。它们开发了一整套非常有效的策略,它们的开源系统 INTANG 可以系统地从这套策略中找出最有效的,根据特定服务器和网络环境。它们根据经验对 GFW 的行为进行测试,并对新的未知行为作出假设。

lib·erate Li et al. 2 studied numerous middlebox traffic classifiers in their 2017 work, and pioneered automated work of identifying traffic differentiation. Once traffic differentiation is de- tected, their system could choose from a library of pre-built evasion techniques to evade the censor. They tested their work on many censorship regimes, including the GFW, and many of the censorship techniques they leverage are still relevant today.

Geneva 和以上三个的方法完全不同。它们开发的策略是手制的,通过研究者自己和审查器互动。尽管也包含高成功率的自动系统,但这自动是从已有的策略中选择。Geneva 可以自己获取策略,

封包修改策略的分类法

比较不同的策略时,我们使用这样的分类等级:物种(species)、亚种(subspecies)和变种(variants)。最高层级的是物种,对利用的审查器弱点进行大体的分类。比如 TCB Teardown 就是一个物种,如果审查器从来不拆除 TCB,这一分类下所有策略都无法工作。对于各个物种,各个亚种定义了利用该弱点的不同方式。比如注入一个 TCP RST 包构成了 TCB Teardown 下的一个亚种,注入 TCP FIN 包构成另一个亚种。在亚种之下,我们定义了变种,利用同一个攻击面但是稍微不同:corrupt RST/ACK 包的 checksum field 是 TCB Teardown 种下的 RST 亚种的一个变种,corrupt ack field 是另一个变种。

我们将特定个体(individual)称为灭绝(extinct),如果其之前对某审查器有效,但是后来失效(成功率低于 5%)了。我们在真实审查器下的进化章节提到,之前的研究者讨论过的许多种,比如 TCB 创建(TCB Creation)、 数据重组(Data Reassembly) 和流量去特征(Traffic Misclassification) 现在灭绝了。过去工作的方法许多年后可能失效,从而为可快速学习新策略的技术提供动机。

Geneva 设计

我们从 Geneva 的构成和演变方法的角度来描述其设计。

概述和挑战

遗传算法是一种受生物启发的自主算法设计方法。包含三个部分:

  • genetic building blocks,定义了如何用编程方式表示出不同算法。

  • fitness function,定义算法性能如何的函数。

  • 执行交叉和突变的方法,来产生新的算法。

将遗传算法用于审查规避的挑战在于自由度的规定。我们可以允许几乎无限的自由度,把所有的数据包仅仅当作比特串,允许遗传算法从比特翻转、比特移除和比特插入中构建策略。这种方法最终会学会几乎所有可能的策略,但需要大量的时间。另一个极端,我们可以使用之前有效的方法作为 building block,这使学习更快,但可能导致“over-fitting”已知的策略。我们需要找到新策略和快速寻找之间取得平衡。

Geneva’s Genetic Building Blocks

Geneva 的策略由一组 (tigger, action tree) 构成。匹配到相应 trigger 的封包(比如所有设置有ACK flag的TCP包)会用相应的行为树修改。我们允许 Geneva 进化 trigger、action tree 的结构和特定 action 本身。

下面是 trigger、action 和 action tree 的结构。

Triggers

Trigger 包含封包头部的特定信息,当匹配时封包修改就会执行。我们这里只支持按照TCP和IP协议匹配,尽管添加其他的也很容易。

Trigger 由以下语法构成:

1
[PROTOCOL:FIELD:VALUE]

比如[TCP:flags:R]会匹配所有带有 RST flag 设置的 TCP 包。Geneva 需要精确的匹配,比如[TCP:flags:RA]不会匹配到仅设置了 RST flag 的 TCP 包。

Actions

为了平衡辨识度和简易性,我们将封包级的行为分为 4 类:

duplicate(A1, A2)

生成副本,然后向原来的包执行 A1 行为组,然后向副本执行 A2 行为组。

fragment{protocol:offset:inOrder}(A1, A2)

在特定 offset 分片(IP 协议)或者分段(TCP 协议),然后向第一个碎片执行A1行为组,向第二个碎片执行A2行为组。可选地,按顺序(inOrder)发送它们。

tamper{protocol:field:mode[:newValue]}(A1)

修改封包的特定 field 的特定值,然后向其执行A1行为树。tamper 修改后会重新计算 checksum 或者 length,除非指令本来就要修改它们。

注意如果设定的 field 在原包中本来就不存在,Geneva 会加入它们。tamper 有两种模式:replace 和 corrupt 。

replace:newValue 将特定 field 的值设定为 newValue 。
corrupt 将特定 field 的值设定为相同 bitsize 的随机值(每次行为都生成新的随机值)。

drop

丢弃封包。

Action Trees

Geneva 的 actions 以二叉树形式呈现:duplicate 和 fragment 都有 2 个子树;tamper 有一个:drop 没有子树。每个匹配的封包从根部开始按照顺序执行修改。

我们把 an ordered list of (trigger, action tree) pairs 称为森林,策略中可以混合许多森林。

行为树是 stateless 的,一次处理一个封包。我们未来可能会将 Geneva 扩展到可以在封包流上运行。

出站 vs. 入站

Geneva 可以修改入站和出站的封包。因此某策略有两个部分组成:分别包括 trigger 和 action tree 的两个森林。由于 NFQuene 的限制,带分支的 actions (duplicate 和 fragment)在入站森林被禁用。总体来说表示是这样: outbound-forest \/ inbound-forest

示例

下面是一个策略的演示:

Strategy 1: TCB Turnaround / RST Drop

1
2
3
4
5
6
[TCP:flags:S]-
duplicate(
tamper{TCP:flags:replace:SA}(
send),
send)-| \/
[TCP:flags:R]-drop-|

此策略有一个出站树和一个入站树。第一个(出站)先生成 SYN 包的两个副本,然后将第一个副本的 TCP flag 替换为 SYN/ACK,第二个拷贝不变,然后发送。在入站树,RST包会引发 action tree,将其丢弃。这种策略是之前研究者发现的两种策略的杂交种(hybrid):

  • TCB-Reversal,在三路握手前先发一个SYN/ACK

  • RST-Drop,忽略任何RST

不幸地,正如真实审查器的下进化一章指出,此杂交种的每个一半作为单独策略面对 GFW 已经灭绝。

表示能力

Geneva 的 genetic building blocks 反映了可以发生在 IP 层的修改:我们认为它可以表示任何封包流。为了证明,我们测试了它能否通过 duplicate, fragment, tamper, drop 和 send 表示出之前研究者找到的策略。
我们找到了 36 种中的 30 个(83.3%)。没找到的是

  • 修改 HTTP 包的,as was done by Khattak et al 1
  • 暂停 40-240 秒的,as was done by lib·erate 2

这不是什么根本的限制:当然可以加入对 HTTP 包头的修改和一个 tamper action 的新的值 sleeping time。本文只关注 IPv4 和 TCP 协议上的修改,因为这是之前的研究的关注点,也不会包括暂停,因为其显著减慢训练速度。

验证一章,Geneva 可以在实验室环境独立发现 30 种策略。在真实审查器下训练时,发现了更多策略。Geneva 自动获取这些策略,通过进化(evolution)这一过程。

进化

Geneva 通过进化(evolution)发现新策略,在许多世代(generation)中完成。每一世代都包含许多个体(individual)(即策略,包含入站和出站行为树的森林),进化通常包括三步:

  • 变异(mutation)和交叉(crossover)
  • 适应度(fitness)分析
  • 对个体的选择(selection)

种群初始化

我们探索了两种方法来初始化 Geneva 的种群,大部分实验我们随机生成了 200 个个体,每个都有随机的 3 个 actions。另外,我们还尝试用已经灭绝的策略的一大堆副本建立种群。

变异

As in biological systems, Geneva’s genetic building blocks can be altered through random mutations. Mutations can occur at the level of actions, action-trees, and entire individuals. Each action mutates in the following ways:

  • duplicate 变异改换子树的顺序 (i.e., duplicate(A1, A2)duplicate(A2, A1)).

  • fragment 变异改变协议(fragmentation or segmentation)、碎片的顺序或者 fragmentation index。

  • tamper 变异取决于其模式:replace 模式变异可以改变“修改为”的值,corrupt模式的变异可以改变它 corrupt 的 field。每个模式可以互相变异为另一种。

  • drop 不支持变异。

交叉

和变异不同,它只随机扰乱单个的策略或者行为树。交叉是在两个个体之间的生育(breeding)过程,从种群池中随机选取2个体,然后发生以下之一。

  • 行为森林(action forest)中的所有树随机交换(swap)

  • 每个森林中的一个随机的树互相交配(mate)

交配指,每个树随机选取一个行为,两个行为所在的子树互相交换。如果每个某个方向的行为森林仅有一个树,则使用第二个机制。

每一代中各个个体间的交叉以设定的可能性(默认值是 40%)发生。我们的实现中,交叉发生在变异之前。

适应度

要评估特定策略,Geneva 客户端尝试在真实审查器(或者模拟的审查器,在实验室环境)下发送被禁止的 GET 请求,策略在客户端执行,具体请求如何取决于审查器:对于 GFW,Geneva 发送带有屏蔽词的 HTTP GET 请求,对于印度互联网服务提供商 Airtel,我们向被屏蔽的 URL 发起 HTTP GET 请求;对于哈萨克斯坦的 HTTPS MITM,我们发送 HTTPS 请求。如果连接可以顺利完成,Geneva 分配一个正的适应度分析值。如果连接被审查(分别是被重置,屏蔽或者被注入伪造证书),一个较大的负值加在适应度上。我们在真实审查器的下进化一章看到一些审查器不会 100% 几率工作。为避免策略评估的假阳性出现,Geneva 会评估两次并记录其中更低的适应度。

为了帮助完善和优化,我们还做了三个额外的调整。

  • 如果某策略的某个行为树从未被使用,适应度会受到惩罚。这鼓励修剪不必要的行为树。

  • 策略需要注入额外的数据包,其数量更多会有更多惩罚。这鼓励减少资源开销。

  • 对策略中行为树的数量进行惩罚。这鼓励更加简洁的策略。这个只在适应度本来为正时才会执行,以鼓励算法尽可能地探索策略空间。

选择

(略)

策略的覆盖范围

一些策略本身非常有效,Geneva 会倾向在这个方向上寻找,而没有进化压力使其偏离。为了扩大覆盖范围,我们可以手动排除一些被多次重复的成功策略的原型。从而鼓励在其他方向的探索。

实现

(略)

验证

(略)

真实审查器下的进化

我们在评估Geneva时有三个问题。

  • (1) 在面对真实审查器时,Geneva 能否有效地找到成功的规避策略?

  • (2) Geneva 在面对真实的审查器时能找到哪些新的策略?

  • (3) Geneva 是否可以推广到多国审查制度?

为了回答这些问题,我们在三个国家的审查制度下运行了 Geneva。中国的防火长城,印度基于 ISP 的审查制度(Airtel),以及哈萨克斯坦最近的 HTTPS MITM 基础设施。表1列出了所有策略和策略变体的成功率、描述和分类。

Experiment Setup

观测点

我们在中国大陆的四个观测点(上海、郑州、深圳和北京)使用 VPS;在印度,我们使用班加罗尔的 VPS;在哈萨克斯坦,使用阿拉木图和卡拉甘迪的 VPS。在单个国家中,尽管地区和 ISP 不同,我们发现 Geneva 发现的策略,以及它们的成功率并没有多大差异。然而如果引入更多观测点,结果可能不同。

Initialization

我们使用随机生成的个体来初始化 Geneva,每个个体有 3 个行为和 1 个触发器。起始池有 200 个个体,如果到达50代或者发生种群收敛则终止。平均每一代产生 500KB 出站和 2MB 入站流量,耗时 5-10 分钟。合计训练时间 4-8 小时。

防火长城

(略)

其他国家

(略)

Training Defunct Strategies

(略)

讨论

Is Geneva Necessary?

(略)

Censor Countermeasures

审查者有两种方法应对 Geneva:

  1. 修复它们的系统。他们甚至可以用 Geneva 发现自己的漏洞并修复,然而有的 bug 修复之后会引起其他问题。

  2. 检测 Geneva 本身。检测到 Geneva 的训练封包时即提供错误反应。Geneva 可以通过在适应度函数惩罚“可检测性”来应对。

我们认为审查的军备竞赛接下来会这样:最终,审查者必须完全修复它们的系统(十分昂贵),或者阻止对其系统的探测(看起来并不现实)。Geneva 的自动化加速了这一进程。

Limitations of Our Evaluation

我们没能部署和前面研究 2, 3 那么多的观测点,因为自那些研究之后,外国人很难租到中国的主机。

Ethical Considerations

  • 我们将 Geneva 设计为对其他主机产生的影响最小,策略的分析是逐个进行的。

  • 所有实验都是在我们租用和控制的机器上完成,而不是请不知情的用户帮助实验。

相关作品

(略)

结论

我们公开了源代码和数据,在 https://geneva.cs.umd.edu

(完)


source: https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf

Translated to Chinese by yogaskung