引入
匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性,这些数据转发链路通常由多跳加密代理服务节点构成,而所有这些节点即构成了匿名通信系统(或称匿名通信网络)。匿名通信系统本质上是一种提供匿名通信服务的覆盖网络,可以向普通用户提供Internet匿名访问功能以掩盖其网络通信源和目标,向服务提供商提供隐藏服务机制以实现匿名化的网络服务部署。作为匿名通信系统的核心功能,隐藏服务机制通常利用多跳反向代理或通过资源共享存储来掩盖服务提供商的真实地址,可以保证匿名服务不可追踪和定位。
匿名通信技术的提出源于网络用户的隐私保护需求,但是随之而来的是各种匿名滥用问题。尤为突出的是,一些不法用户基于Tor,I2P,Freenet等匿名通信系统提供的隐藏服务机制,架设必须通过特殊软件或进行特殊配置才能访问的网络服务,形成了无法被直接检索的暗网。术语“DarkWeb”和“Darknet”经常被混用指代暗网。为了更好地厘清这2个术语之间的关系和差异,并界定本文所讨论的暗网的内容,给出如下定义:
- DarkWeb:必须通过特殊的软件、特殊的配置才能访问的拥有特殊域名的Web站点,搜索引擎无法对其进行检索。
- Darknet:必须通过特殊的软件、特殊的配置才能访问,包含Web、IRC、文件共享等各类资源和服务的匿名网络,搜索引擎无法对其进行检索。
两者的关系如图1所示,其中DarkWeb重点在于不可检索、不可直接访问,并不强调匿名,因此既包含匿名Web站点(如Tor隐藏服务站点),也包含非匿名Web站点(如ZeroNet提供的Web站点);而Darknet则强调匿名性,即所有的资源都需要基于相应的匿名通信系统才能进行访问,其中的资源不限于Web服务。
Tor匿名通信系统
Tor(the second-generation onion router)是目前使用范围最广的匿名通信系统之一,其核心技术“洋葱路由”在20世纪90年代中期由美国海军研究实验室提出,并在1997年交由美国国防高级研究计划局(DARPA)进一步开发。2003年Tor正式版发布,2004年Tor设计文档在第13届USENIX安全讨论会上正式发表,并在同年由美国海军研究实验室公开其源码。
Tor使用多跳代理机制对用户通信隐私进行保护:首先,客户端使用基于加权随机的路由选择算法分别选择3个中继节点,并逐跳与这些中继节点建立链路。在数据传输过程中,客户端对数据进行3层加密,由各个中继节点依次进行解密。由于中继节点和目的服务器无法同时获知客户端IP地址、目的服务器IP地址以及数据内容,从而保障了用户隐私。Tor于2004年开始支持隐藏服务,为Tor暗网的出现提供了技术支撑。Tor暗网是目前规模最大的暗网之一,其中包含大量的敏感内容与恶意内容。Tor隐藏服务是仅能在Tor暗网中通过特定形式的域名(.onion)访问的网络服务。Tor暗网的基本组件包括客户端、目录服务器(directory server)、隐藏服务目录服务器(hidden service directory)、洋葱路由器(onion router, OR)和隐藏服务器(hidden server),如图2所示。
- 客户端:客户端是运行在用户操作系统上的本地程序,称为洋葱代理(onion proxy, OP)。OP将用户数据封装成Tor信元并层层加密,为各类TCP应用程序提供匿名代理服务。
- 洋葱路由器:Tor暗网中的数据中继节点。Tor默认匿名链路由3个OR组成,分别为入口节点(Entry)、中间节点(Middle)和出口节点(Exit),其中入口节点一般选择可信度较高的守护节点(Guard)。
- 隐藏服务器:提供Web,IRC等TCP应用服务。隐藏服务器受到Tor匿名性的保护,必须使用Tor客户端才能够访问其TCP应用服务。
- 目录服务器:目录服务器保存了所有洋葱路由器的IP地址、带宽等信息。客户端在首次启动后向目录服务器请求洋葱路由器信息,以便完成节点选择和链路建立。
- 隐藏服务目录服务器:隐藏服务目录服务器存储并为客户端提供隐藏服务器的引入节点(introduction point, IPO)、公钥等节点信息。
客户端、洋葱路由器、目录服务器、隐藏服务目录服务器和隐藏服务器的功能都集成在Tor软件包中,用户可以通过配置文件对具体功能进行配置。
Tor隐藏服务器在启动时会选择3个引入节点作为其前置代理,并将引入节点及其公钥信息上传至隐藏服务目录服务器。客户端访问隐藏服务时,首先建立3跳链路访问隐藏服务目录服务器,获取引入节点和公钥信息。客户端选择一个汇聚节点(rendezvous point, RPO)作为客户端和隐藏服务器通信链路的汇聚点,并将汇聚节点的信息通过引入节点告知隐藏服务器。客户端和隐藏服务器各自建立到达汇聚节点的链路,完成6跳链路的搭建后即可开始通信。Tor用户通过6跳链路访问隐藏服务器,在此过程中任意节点无法同时获知Tor客户端IP地址、隐藏服务器IP地址以及数据内容,保障了Tor客户端与隐藏服务器的匿名性。
匿名接入技术
匿名接入技术是匿名通信网络为了规避网络监管而提供的客户端隐蔽接入技术。网络监管者出于安全审计的考虑,会检测匿名网络的中继节点并阻止用户接入。为了规避此类网络审查,研究人员提出了各种匿名接入技术,包括bridge,pbfs,meek,FTE,Flashproxy等。
bridge节点
Tor的设计者在2011年提出了bridge节点的概念以突破网络监管。由于此类节点的信息不公开,因此Tor客户端可以将其作为入口节点从而接入匿名网络。
bridge是匿名网络为了提升自身隐蔽性和规避基于IP阻断的网络监管而开发的一种接入机制。bridge节点功能上与一般的Tor中继节点相同,但其信息并未被目录服务器公开,从而降低了被网络监管者发现和阻断的风险。为了方便用户获取此类节点信息,Tor项目提供了2种获取方式:
- 在bridgeDB数据库中保存了bridge节点信息,用户可通过直接访问官网站点获取3个bridge节点;
- 用户还可通过Google和Yahoo邮箱向指定邮箱发送请求,邮件服务器会自动回复3个bridge节点信息。由于Google和Yahoo申请虚假邮件地址比较困难,所以可有效防止无限制获取bridge节点信息等恶意攻击。
obfs混淆代理
虽然Tor可以使用bridge节点来规避基于IP阻断的监管,但监管者仍能通过深度包检测(deep packet inspection, DPI)技术来识别出Tor流量。鉴于此,Tor项目开发了第1个传输插件obfs混淆代理。Obfs后续又经历了3次版本改进,分别为obfs2,obfs3,obfs4,当前最新版本的Tor使用的是obfs4。其中,obfs2设计于2012年,采用分组密码(AES-CTR-128)对Tor的传输数据进行加密,擦除了Tor流量相关的标识信息,从而实现了有效混淆。但是obfs2在设计上存在2个问题:
- 握手阶段的连接容易被识别。通信双方在传输数据之前需要交换秘密信息并协商出会话密钥,而在这一阶段的密钥种子是通过明文传输且报文格式固定,导致这种obfs2流量容易被中间审查机制识别并计算出双方的会话密钥。
- 可利用Tor客户端探测bridge节点以检查其是否可进行obfs2握手,从而实施主动的bridge探测攻击。
鉴于上述设计缺陷,Tor后续又推出了obfs3和obfs4方案。作为obfs2的后续设计,obfs3使用Diffie-Hellman协议来计算通信双方的共享秘密,并由此生成对称密钥。相较于obfs2,obfs3在握手阶段有了很大的改进,但其在密钥交换阶段仍然缺乏对bridge身份的验证,存在中间人攻击和主动探测攻击的风险。
为了抵御上述攻击,需要能够有效保证双方通信真实性、完整性和机密性的优化方案。ScrambleSuit提出利用带外方式交换共享秘密实现通信双方的互认证,能够有效防御主动探测攻击。在此基础上,obfs4进一步利用BridgeDB实现了基于bridge身份验证的密钥交换。客户端通过BridgeDB查询bridge节点,获得其IP地址、节点ID和公钥信息。只有同时匹配这3个信息才能通过obfs4节点的身份验证并建立连接。obfs4是对obfs3的重大升级,既有效地混淆了Tor流量,又实现了bridge身份验证,达到能够抵御主动探测攻击和中间人攻击的效果。
meek隐蔽通道构建技术
meek是一种基于前置域(domain fronting)的隐蔽通道构建技术,其工作原理如图7所示。首先,meek-client向前置域名服务器发送一个TLS Client Hello消息,并将该服务器域名填入SNI(server name indication)字段。在TLS握手成功后,meek-client把实际传输的Tor流量封装在HTTP POST载荷中,并将目标bridge地址写入HTTP HOST字段。由于监管者无法查看加密后的HTTP POST内容,因此无法识别真正的目标bridge地址。前置域服务器接收到meek-client数据后,根据HTTP HOST字段值将数据转发到目标bridge节点。该节点上运行的meek-server对HTTP报头处理后将封装的Tor流量转发给后续中继节点。在当前Tor网络中,meek的实现主要依赖于Google,Amazon和Azure等大型服务提供商提供的白名单前置域名服务器,造成Tor客户端在访问正常网站的假象,从而规避网络流量监控。
FTE加密流量转换技术
FTE(format-transforming encryption)由Dyer等人在2013年ACM计算机与通信安全会议(ACM Conference on Computer and Communications Security, CCS)上发表,其主要原理是通过扩展传统对称加密,将密文转换为指定的传输格式。与obfs流量混淆方式不同,FTE没有将原协议流量转换为无序的未知流量,而是根据用户输入的正则表达式,输出具有一定协议格式的流量。其中,用户输入的正则表达式可以从DPI系统源码中直接提取或根据应用层流量自动学习得到。这使得基于正则表达式的DPI技术会将其误识别为用户选定的协议流量,从而实现规避审查的目的。由于大部分Tor流量为HTTP流量,默认情况下采用HTTP正则表达式将之转化为HTTP协议,从而实现流量伪装。
洋葱匿名路由技术
匿名路由技术是匿名通信系统为用户提供匿名服务时所使用的一种关键技术。该技术具体涉及路由节点选择、链路建立、数据传输等多个阶段。通过匿名路由技术,匿名通信系统的安全和性能都能够得到保障。目前,低延迟匿名通信系统所使用的路由技术主要包括洋葱路由、大蒜路由和基于DHT的路由。
洋葱路由技术的核心思想是通过多跳代理与层层加密的方法为用户的通信隐私提供保护。Tor是最典型的使用洋葱路由技术的匿名通信系统。在Tor暗网中,客户端与隐藏服务器之间需要各自选择3个节点建立多跳链路才能进行通信。目前,Tor主要采用基于加权随机的路由选择算法选择洋葱路由器构建链路。该算法依据服务器描述符(server descriptor)与共识文档(consensus document)中的带宽信息与放缩因子计算各节点的加权值,并按照出口节点、入口节点和中间节点的顺序选择链路节点。值得注意的是,链路中任意2个洋葱路由器应来自不同的C类网段。
在节点选择完成之后,OP从入口节点开始逐跳建立匿名链路,节点之间均采用TLS/SSLv3对链路进行认证。为增强可读性,下面将入口节点、中间节点、出口节点用OR1,OR2,OR3表示。首先,OP与OR1建立TLS链接,即OP发送CELL_CREATE信元,OR1进行响应以完成Diffie-Hellman握手并协商会话密钥 k 1 k_{1} k1,从而建立第1跳链路。其中,CELL_CREATE信元是Tor中一种数据传输的基本单元,长度为512B。然后,OP向OR1发出与OR2建立链路的Tor信元,OR1收到后与OR2建立TLS链路,并通过Diffie-Hellman协议协商OP与OR2之间的会话密钥 k 2 k_{2} k2。OR1将会话密钥通过加密报文告知OP,完成第2跳链路的建立。以此类推,Tor建立多跳链路实现与通信目标的安全连接。
在匿名链路建立后,用户可以通过OP访问公共网络进行数据传输。当OP获得目标服务的IP地址和端口后,使用 k 1 k_{1} k1, k 2 k_{2} k2, k 3 k_{3} k3对数据信元进行层层加密封装,即 { { { < I P : p o r t > } k 3 } k 2 } k 1 \{\{\{<IP:port>\}_{k_{3}}\}_{k_{2}}\}_{k_{1}} {{{<IP:port>}k3}k2}k1,这种加密方式称为“洋葱加密”。该信元经过每个OR节点时,都会被使用对应的密钥对最外层进行解密并转发。当到达OR3后进行最后一次解密,即可识别出目标服务器的IP地址和端口,从而建立TCP连接。在此过程中,用户的上行数据经过OP层层加密,由各OR逐层解密并转发至目标服务器;与此相反,目标服务器的下行数据经过各OR加密,由OP逐层解密并最终返回给应用程序。对于目标服务器来说,Tor用户是透明的,其始终认为自己在和OR3通信,而各OR无法同时获得Tor用户IP、目的服务器IP和应用数据,从而保证了通信的匿名性。
Tor隐藏服务
Tor隐藏服务是通过隐藏服务域名(即洋葱域名)唯一标识和查找的。服务器首次运行后将生成一个隐藏服务域名,其域名形式为.onion。其中是长度为16B的字符串,由RSA公钥Hash值的前80b进行base32编码获得。
Tor隐藏服务器在启动过程中会将其信息上传至隐藏服务目录服务器,Tor客户端能够通过目录服务器获取足够的信息与隐藏服务器建立双向链路。图2展示了客户端访问隐藏服务的具体过程:
- 隐藏服务器选择3个洋葱路由器作为其引入节点,并与引入节点建立3跳链路;
- 隐藏服务器将其隐藏服务描述符(hidden service descriptor)上传至隐藏服务目录服务器,描述符中包含引入节点的信息与自身RSA公钥;
- 客户端通过隐藏服务域名(.onion)进行访问时,从隐藏服务目录服务器获取引入节点的相关信息;
- 客户端选择一个洋葱路由器作为汇聚节点并与该节点建立3跳链路;
- 客户端建立到达引入节点的3跳链路,并通过引入节点将汇聚节点的信息发送到隐藏服务器;
- 隐藏服务器建立到达汇聚节点的3跳链路,并对该链路进行认证;
- 经过汇聚节点,客户端与隐藏服务器通过6跳链路进行交互。
Tor隐藏服务器运行时,将自身的RSA公钥及引入节点信息上传至通过下式选定的6个隐藏服务目录服务器上,其中 H ( x ) H(x) H(x)是结果长度为160b的Hash函数, ∥ \parallel ∥为拼接函数。
D e s c r i p t o r − i d = H ( P u b l i c − k e y − i d ∥ S e c r e t − i d − p a r t ) Descriptor-id=H(Public-key-id\parallel Secret-id-part) Descriptor−id=H(Public−key−id∥Secret−id−part)
其中,Public-key-id即为RSA公钥的SHA1摘要的前80b。Secret-id-part,可计算为
S e c r e t − i d − p a r t = H ( T i m e − p e r i o d ∥ D e s c r i p t o r − c o o k i e ∥ R e p l i c a − i n d e x ) Secret-id-part=H(Time-period\parallel Descriptor-cookie\parallel Replica-index) Secret−id−part=H(Time−period∥Descriptor−cookie∥Replica−index)
其中,Descriptor-cookie为可选字段,该字段可以用来防止未授权客户端访问隐藏服务;Replica-index有2种取值,其作用为选择不同的隐藏服务目录服务器。Time-period字段用于分散隐藏服务重新选择隐藏服务目录服务器的时间,可计算为
T i m e − p e r i o d = t + P [ 0 : 1 ] × 86400 256 86400 Time-period=\frac{t+P[0:1]\times \frac{86400}{256} }{86400} Time−period=86400t+P[0:1]×25686400
其中,t为当前的UNIX时间。该字段将一天划分为256个时段,并在其中某个时刻重新选择隐藏服务目录服务器上传信息。
隐藏服务目录服务器利用DHT进行组织,每个目录服务器都是DHT中的一个节点,DHT结构如图12所示。