近来一篇名为 Your State is Not Mine: A Closer Look at Evading Stateful Internet Censorship 的论文在中文互联网上炒的沸沸扬扬,作者为加州大学的三名学生。文章号称详细分析了墙的状态机,实现了成功率高达98%的穿墙策略,并将其实现在 Github 上进行了开源。

因为某些机会,正好有时间让我大致读了读这篇论文,文章水平与工作的完成度很高,其中有很多思路是极具启发性的,现分享心得于此:

墙的工作原理

对于明文协议,墙想要实现关键词审查,必须对于所有的TCP流量进行重建并在应用层进行审查。对于主干网来说,这个开销是巨大的。为了不影响到正常的网络通信,墙是一套旁路系统,不能对流量进行直接干涉。当其检测到敏感词的时候,对于已存在的TCP连接,会向连接双方发送RST阻断连接,并持续监测接下来的握手请求90s,一旦发现SYN,则会回应RST/ACK阻断握手。

想要实现正确的高层协议重建,墙必须对TCP连接的状态进行跟踪记录,这也是为什么我们说墙是基于状态的。根据观察,墙会建立一个TCB(TCP Control Block),对每个TCP连接的状态进行追踪。根据推测,TCB中最起码应该记录了源、目标IP、端口、Sequence Number、当前状态、窗口等信息。

知道了这些,就可以针对TCB做一些事情了。

曾经存在的策略:

TCB Creation:

建立真实连接之前首先发送一个带有错误SEQ的SYN,让墙创建一个错误的TCB,之后进行正常握手,墙会因为TCB中SEQ的错误无法继续追踪。

DATA Reassembly:

1.将带IP报分片,对于带有相同SEQ和Lenth的数据包,墙会捕获第一个忽略第二个。故可以先发送构造的带有垃圾数据的分片,填充墙的接收缓存,再发送带有真实数据的分片,最后发送分片的第一部分完成数据发送。

2.对于不分片的数据同理,对于同一个TCP包(具有相同五元组的)先后发送填充了垃圾数据虚假包与真实数据,绕过审查。

TCB Teardown:

墙在观察到RST、RST/ACK或FIN包的时候,会终止TCB块。曾经著名的西厢计划就是使用的此策略。

注入包的构造方法

以上构造用于引发TCB异常的Insert Packet,需要特别处理防止对服务端行为造成影响,一般的思路为使用比测量值更低的TTL、错误的checksum使得Packet只经过墙而不到达服务端,或者让服务端检查出错误从而丢弃。

论文中发现了一种新的构造方法,即在事先未声明的情况下使用MD5 header,相应的包会被服务端所忽略但会被墙所接受。

新的策略

墙的进化

论文中对既有策略进行了测试,发现TCP Creation与TCP Teardown策略基本失效,这是墙的不断迭代升级所导致的,另外还观察到在不同的路由上墙的表现有所不同,应为墙的不同实现或是不同版本同时在路由中存在。

经过观察和实验验证,对于进化后的墙的行为,得出了以下三个结论:

1.墙不仅在收到客户端发起的SYN时,在收到服务端的SYN/ACK,也会创建相应的TCB。

2.墙在观察到:
(1)客户端发出多个SYN
(2)服务端返回多个SYN/ACK
(3)SYN/ACK的确认号与之前的SYN包不匹配
任意一种情况,会进入”re-synchronization state”,利用下一个收到的从服务端到客户端的SYN/ACK包或是从客户端到服务端的数据包重新同步TCB。

3.当收到RST、RST/ACK或FIN包的时候,TCB不会马上被销毁,而是进入re-synchronization state。若有后续的数据传输发生,则会重新同步。

对应策略

由以上墙的新版本行为,可以构建出以下的新策略来:
1.Resync + Desync:

Resync:三次握手完成后发送一个SYN包,使墙进入re-synchronization state;
Desync:紧接着发送1字节超出当前窗口的数据包,诱使TCB重新同步到错误的SEQ上去。

2.TCB Reversal:
TCP三次握手之前首先发送一个SYN/ACK包让墙建立反向的TCB,把客户端当作服务端,因为墙几乎不审查HTTP response,所以同样可以实现绕开审查的效果。

INTANG

工具架构

联合策略

因为墙的新老行为即设备在网络中均有部署,为了提高成功率,INTANG工具使用了联合策略来进行穿墙工作,工作流程如图:

同时论文中还测试了不同构造包的可用性

总结

尽管目前主流的穿墙方法是将无状态加密流量通过境外的服务器进行转发,典型的工具有 Shadowsocks、V2ray 等,这一思路因为部署简单,灵活去中心而在近年的翻墙实践中占据主流,相关产业链也应运而生。
但随着审查力度的提升,可用IP的有限,这种猫捉耗子的游戏是不可持续的。今后的研究方向应该向提高审查成本,寻找墙本身的协议栈缺陷上来,这篇文章给予了我们很好的启示。

以下是论文中关于这场军备竞赛的论述,值得一读:

Our work is based on the latest developments of the GFW. It is certainly possible that GFW may undergo additional improvements to defeat our evasion strategies, and we acknowledge that it is an arms race. For instance, we demonstrate that GFW is more liberal in accepting RST packets than normal servers. It is possible that the censor may perform additional checks on the RST packets (e.g., checksum and MD5 option fields) as a defense. But that may open up a new evasion attack on the GFW (e.g., when the server does not check MD5 option fields). One can also leverage GFW’s agnostic nature to network topology. For example, we can measure the exact TTL value to bypass the GFW while not to reach the server (although it is also a challenge to achieve accuracy and efficiency simultaneously).

Another potential improvement the GFW can make is to trust the data packet sent by the client only after seeing the server’s ACK packet acknowledging the appropriate sequence number. However, this will greatly complicates the GFW’s design and implementation.

In summary, we believe this is an arms race. As GFW evolves, so can the evasion strategies. We believe that the cost of rolling out new GFW models is quite high and such evolution will happen at the timescale of months (if not years), which leaves enough time for evasion strategy development (especially when tools like INTANG are leveraged). For instance, as soon as the GFW evolves, a new GFW model will be derived and subjected to the “ignore path” analysis, which can lead to the generation of new evasion strategies.

需要注意的是,INTANG所用策略是无法处理已经上黑名单的IP的,因为黑名单封锁发生在IP层,对于一切黑名单上IP的入站均会被丢弃。所以仅凭INTANG无法访问大部分互联网主流服务,如Facebook、Google等。而DNS over TCP、Tor等目前在INTANG上工作的很好。

另外一些思考:因为目前INTANG仅处理HTTP与DNS等流量,如果将INTANG用到所有的跨境TCP连接上来,对于目前的某些转发协议,如ss、vmess、websocket over SSL等,是否有着规避审查,更加低调的效果呢?(因为对于加密流量的审查,第一步也需要重建数据流,而论文中所述策略则直接绕开了这一步。除非是可能的大规模机器学习方法上线,且仅从IP或TCP层进行流量特征的抽取、学习,但是这个成本是非常巨大的。)故在可见的未来如果目前的审查目的不被放弃的话,墙的升级策略应该仍会以修修补补为主,这就存在着潜在的机会。