一种针对共谋攻击的I2P节点选择优化算法*
2020-03-26仇润宇王轶骏
仇润宇,王轶骏,薛 质
(上海交通大学 网络空间安全学院,上海 200240)
0 引 言
互联网技术的飞速发展给人们的生活带来了极大便利,越来越多的个人信息在网络上传播。在享受互联网便利性的同时,人们的隐私保护意识逐渐提高,匿名通信网络得到了越来越多的关注,暗网(Darknet)也因此诞生。
匿名通信网络旨在提供匿名的、无法被第三方识别的网络通信服务,人们使用这些匿名通信网络隐藏他们的网络活动。在当前的匿名系统实现技术中,洋葱路由技术被匿名通信网络普遍采用,其中I2P和Tor是现如今使用最广泛的两种匿名通信网络。I2P作为Tor的一种变体,采用“大蒜路由”技术使得收发双方能够隐藏自己的真实地址,以达到匿名通信的目的。
因为暗网自身的高匿名性和安全性,暗网成了很多灰色产业如信息贩卖和违禁物品贩卖的温床。2018年3月,国内著名视频网站AcFun的800万条账户信息在暗网某论坛被公开售卖[1];2013年9月,华住集团旗下品牌酒店的5亿住客信息在暗网某论坛以8比特币的价格公开兜售[2]。在这种背景下,越来越多的国家和组织开始研究匿名网络去匿名化的技术,希望以此来控制这些非法产业的源头。
国内外现有的研究主要聚焦于I2P网络的性能、规模以及流量特征等方面。
Bernd Conrad[3]等人对Tor和I2P两种著名的低延时匿名通信系统进行了系统比较和分析,结果显示根据不同的应用领域两种匿名通信系统分别有自己的优势。Nguyen Phong Hoang[4]等人对I2P匿名网络的研究结果表明,尽管I2P网络是分散的,但是审查者可以通过将本地I2P节点的已知节点列入黑名单的方法,使内网中的用户无法访问I2P网络。Zincir-Heywood[5]等人对I2P的共享带宽与匿名性之间的关系作了深入研究,结果显示共享带宽越多,I2P用户的匿名性越强。Juan Pablo Timpanaro[6]等人设计并成功部署了I2P网络的第一个大规模监控系统,结果表明I2P网络中有约30%的用户使用的是匿名文件共享服务。Christoph Egger[7]等人分析并实施了一些可以用来对I2P用户进行去匿名化的攻击,得到的结论显示虽然I2P拥有一定的对攻击防御的措施,但是针对DHTs攻击(如Sybil攻击和Eclipse攻击)仍然会被攻击者利用。曹旭[8]等人通过爬虫程序对Twitter、Pastebin以及Reddit三个站点进行I2P的域名收集,实验结果显示I2P的匿名性要高于Tor和Freenet,但I2P的使用规模要小于Tor和Freenet。李金栓[9]等人详细分析了I2P匿名通信系统的运行原理和通信协议,提出了基于报文载荷长度熵过滤的方法对I2P流量进行识别。刘培朋[10]等人的分析表明,当前I2P路径选择算法仍然面临着来自内部和外部的巨大威胁。
现有的研究成果大多停留在对I2P网络性能和规模的研究上,论证I2P网络在匿名通信方面的效果及其优势。少数人对I2P网络的流量特征进行了分析,探讨了通过流量特征识别网络中I2P流量的可能性以及其可能受到的攻击和部署攻击的可行性。本文针对I2P网络容易受到的共谋攻击提出一种可以减轻攻击带来影响的节点选择优化算法,能够增强I2P网络的匿名性。
1 匿名通信系统I2P运行原理
I2P是一个面向信息、基于对等网络的低延时匿名通信网络。I2P的概念在2003年的IIP项目中首次被提出[8]。I2P匿名网络旨在提供高匿名性的网络通信服务。在I2P中通信收发双方之间的通信内容难以被恶意攻击者掌握。目前,I2P可以提供的匿名服务包括匿名网页浏览、匿名网站、匿名博客以及匿名电子邮件等。
I2P网络中的所有用户同时也充当着I2P网络的路由节点,任意一个用户发送的信息都要经过数个路由节点组成的隧道(Tunnel),以达到隐藏真实收发双方的目的。这样第三方的网络监听者只能知晓当前路由节点的上一跳地址和下一跳地址,而无法掌握整个收发双发的全部信息。I2P网络的整体架构与Tor网络有很多相似的地方[9],但实际上I2P网络提供的服务与后者完全不同。Tor网络使得用户能够在保证自己隐私的前提下匿名访问明网和被网络审查者屏蔽的网站,而I2P网络更注重保护网络中的各种信息,所以通信双方都必须是I2P网络中的节点。
I2P网络主要由用户客户端、网络中参与的节点和网络数据库(NetDb)3个部分组成。下面简要介绍I2P网络中大蒜路由、隧道以及网络数据库3个重要的概念。
1.1 大蒜路由
大蒜路由是Tor网络中洋葱路由的变体,I2P网络中的数据包通过使用包含多个节点的隧道,使得隧道中的任意一个节点都无法同时获知通信双方的具体信息,以达到匿名的目的。
与Tor一样,数据在传输过程中经过的各个节点都被认为是不可信的,所以I2P在通信过程中进行了端到端加密、隧道加密和传输加密3层加密。
首先,在代理生成消息后,先使用对方的公钥进行加密,也就是端到端加密;其次,消息进入出口网关后,先进行隧道加密(对称加密);最后,根据输出隧道的节点顺序从后往前层层加密,也就是传输加密(非对称加密)。消息经历输出隧道的每一跳时都进行一次对应的传输解密,得到下一跳的地址和解密的数据,再将数据发送给下一个节点,直到隧道的终点。进行隧道解密后,得到网关预处理的信息,并将该信息发送给Bob的输入网关。当Bob本地客户端收到最后的加密数据后,使用私钥对数据进行解密,即可收到最终的明文内容。
1.2 I2P隧道
I2P隧道是I2P网络在Tor网络“洋葱路由”基础上衍生出的机制,本地客户端选择网络中的节点作为隧道的参与者,搭建一条单向数据传输的通道。一条I2P隧道由数个网络节点(默认为3个节点)按固定顺序组成,通常一条隧道需要拥有一个入口节点(隧道中的第一个节点)和一个出口节点(隧道中的最后一个节点)。
I2P隧道根据隧道中信息方向的不同分为发送信息的输出隧道(Inbond Tunnel)和接收信息的输入隧道(Outbound Tunnel)。图1展示了Alice发送数据给Bob的整个过程。发送方Alice建立了一条输出隧道,接收方Bob建立了一条输入隧道。Alice输出隧道的终点(Outbound Endpoint)将需要发送的信息发送给Bob输入隧道的网关节点(Inbound Gateway),输入隧道的网关可以接收任何用户的消息并发送给接收方Bob。每个I2P本地客户端需要同时维护多个输入隧道和输出隧道,以满足用户的各种匿名服务需求。
如果从隧道功能来划分,I2P隧道主要有探测隧道、客户端隧道和共享隧道3种类型。探测隧道的主要功能是与洪范节点通信、创建新的隧道和测试现有隧道;客户端隧道主要用于满足本地客户端和其他节点之间的正常通信;共享隧道是指本地客户端作为他人隧道参与者的隧道。共享隧道的数量根据网络需求、共享带宽和本地生成的通信量而变化。
图1 I2P中Alice与Bob通信过程
隧道的创建需要用户客户端从NetDb中检索已知的路由节点信息,选择符合条件的路由节点作为自己的隧道节点。如果创建的是出口隧道,本地客户端自己充当出口网关的角色;反之,则充当入口网关的角色。随后,本地客户端隧道创建的信息发送给隧道中的节点,直到隧道末端节点也获得信息并反馈给隧道创建者。该隧道创建完成并获得一个独特的隧道ID,如图2所示。当隧道创建完成后,本地客户端需要将网关的地址和隧道ID上传给NetDb,使得网络中的其他节点能够获取该隧道的信息。
图2 输出隧道创建过程
客户端根据节点的顺序对数据包进行层层加密,每一层解密后得到下一个路由节点的地址,直到隧道的终点。这样的过程保证了隧道中的中继节点无法获得任何隧道中传输信息的内容,中继节点只负责按照隧道中节点的顺序从上一个节点获取数据包并转发给下个中继节点。
1.3 网络数据库
I2P网络的网络数据库Network Database(简称NetDb)允许节点查询其他节点和隐藏服务的信息。网络数据库包含着I2P网络中所有网络节点的消息,主要由两个部分组成。
(1)路由信息(RouterInfo):RouterInfo中包含与I2P中路由节点通信必须的信息,如公钥、地址和端口等;
(2)租约集(LeaseSet):LeaseSet中包含访问特定网络服务所必须的信息,如网关路由器地址、输入隧道的隧道ID以及隧道传输的公钥等。
当I2P中的一个节点试图与其他节点建立通信时,需要获得各个节点的联系信息,包括IP地址、端口号和公钥等。这些信息被封装在一个数据结构中,即路由节点信息(RouterInfo)
NetDb分布式服务器包含I2P中所有路由节点的信息,由网络中一种特殊对等节点洪泛节点(Floodfill Routers)维护,洪泛节点随机根据节点带宽选取或者节点志愿加入。洪泛节点为NetDb收集网络中的路由信息,并与其他洪泛节点同步,回应网络中用户对其他路由节点的RouterInfo或LeaseSet的查询请求。当I2P中一个节点想要访问一个入口时,需要先询问洪泛节点哪个节点距离该入口最接近。如果被询问的洪泛节点拥有该入口,会提供节点需要的信息,否则它应该知道其他距离该入口更近的洪范节点,并将该询问转发给它们。
新加入I2P的网络节点需要通过“补种”服务器(Reseed Servers)获得I2P网络一小部分节点的信息以访问I2P网络。与Tor的中央目录服务器不同,这些“补种”服务器并不能掌握整个I2P网络的全貌,它们各自只拥有一小部分I2P网络节点的信息。这些“补种”服务器和网络中其他的网络节点一样,只是它们额外拥有了能够对新加入节点声明一小部分I2P已知路由节点的功能。
2 I2P节点选择算法
I2P网络中的对等节点选择是为本地客户端生成的消息及其应答选择传输路径的节点序列的过程。每个路由器都要维护一个已知节点性能的配置文件(Profile),本地客户端通过配置文件评估各个对等节点的带宽、每个对等节点多久接受一次隧道沟通的请求以及对等节点是否过载或无法可靠地执行,并通过这些性能数据选择搭建隧道的节点。
根据前文介绍的I2P匿名网络的传输机制可知,I2P网络的匿名性和通信效率取决于节点选择的优劣,因此隧道节点的选择在I2P网络中具有非常重要的意义。这里首先介绍当前I2P网络中的节点选择算法。
I2P网络的隧道节点选择算法工作在源路由模式下,即发送方负责选择隧道节点并创建隧道。与其他匿名网络不同,路由节点自己提供的性能数据不被其他路由节点信任,因为I2P网络中可能存在不想参与其他隧道搭建而宣称自己性能较差的“慵懒”节点或者想要参与更多隧道搭建而宣称自己性能很好的恶意节点。因此,I2P中的路由节点主动测量其他路由节点的性能,如带宽、隧道创建成功率、工作负载和可达性等。同时,节点的性能评估不断实时更新状态,包括路由节点响应查询的时间、路由节点参与隧道故障的次数和路由节点的最后通信时间。
2.1 节点选择指标
目前,I2P对其他路由节点的选择主要基于容量(Capacity)和速度(Speed)两个指标。为了表示路由节点的综合性能,下面简要介绍几个节点选择算法的重要指标。
2.1.1 容 量(Capacity)
容量是指一个路由节点在一段时间内成功建立的隧道数量。创建隧道的操作开销需要根据响应隧道请求的意愿来评估路由节点。由于带宽、CPU使用和参与隧道的数量有限制,路由节点有时可能拒绝或丢弃隧道请求。
容量计算是通过历史统计信息估计一个路由节点同意参与下一时间的隧道数量。历史统计信息的权重随着时间的推移降低,评估的时间间隔为10 min、30 min、1 h和1 d。具体的计算公式如下:
C代表该节点的容量得分,c(t)表示参与隧道的路由节点在最近t时刻的统计信息,c(t)计算公式为:
C(t)=accepts-rejects-timeouts-4×failures(2)
accepts代表路由节点接受成为隧道参与节点的次数,rejects代表路由节点拒绝成为隧道参与节点的次数,timeous代表路由节点不响应参与隧道的次数,failures代表路由节点同意参与隧道搭建但是隧道测试失败的次数。
2.1.2 带 宽(Bandwidth)
带宽被定义为一个节点在不同时间段内速度的加权结果。路由节点将其在隧道中1 min内发送和接收的字节数作为隧道中每个参与节点的速度,而隧道节点在1 min内的带宽是其参与的所有隧道的平均速度,计算公式为:
B代表路由节点的权重带宽,b(t)代表最近t时刻内3个最大带宽的平均值。
2.1.3 在线时间(Online Time)
在线时间是指节点在线的时间,认为节点在线的时间越长,保持在线的可能性越大。如果节点在测试期间处于脱机状态,则联机时间重置为0。在线时间的计算公式如下:
T是节点在线时间的分数,ot代表节点的在线时间,rt代表系统的运行时间。
2.1.4 可达性(Reachability)
可达性是路由节点选择的必要条件。一个节点的可达性表示该节点是否拥有被选作隧道参与者的资格。
2.1.5 时 延(Delay)
I2P每10 min测量一次路由节点的时延,以确定被测量节点是否在线。显然,一个路由节点的时延越低,该节点的得分越高。
2.2 I2P节点选择基础算法
基于以上5个评估指标,I2P网络将所有路由节点划分为3个级别:可达节点(Reachable Node)、高容节点(High-Capacity Node)和快速节点(Fast Node)。其中,快速节点是高容节点的子集,高容节点是可达节点的子集。
当前的I2P网络的节点选择基础算法分为3个步骤,如图3所示。
图3 传统I2P节点选择算法
第一步,测试本地客户端已知的所有路由节点的可达性,并把可以通过测试的节点归类为可达节点;
第二步,计算可达节点的可靠性得分(Reliability Score),这里可靠性得分是指节点容量和在线时间的综合得分。一个路由节点的可靠性得分计算公式如下:
R代表该节点的可靠性得分;C表示该路由节点的容量得分;T表示该节点的在线时间得分;k代表调整在线时间得分权重的系数(默认值为1),取值范围0~10。
通过公式计算每个路由节点的可靠性,并得到所有已知路由节点的平均可靠性得分(AveReliability Score)。可靠性得分高于平均得分的节点被放入高容节点池中。此外,本地客户端还会使用最大值和最小值作为高容节点池中节点数量的上限和下限。如果节点池中的路由节点数量小于最小值,那么更多可靠性评分较低的路由节点将被选中并添加到节点池中;反之,如果节点池中的路由节点数量大于最大值,那么评分较高的节点会被选中添加到高容节点池中。
第三步,计算高容节点池中每个高容节点的带宽得分(Bandwidth Score),同时计算平均带宽得分(AveBandwidth Score),将带宽得分高于平均带宽得分的路由节点添加到快速节点池中。类似地,本地客户端使用最大值和最小值界定快速节点池中路由节点数量的上下限。如果快速节点池中的节点数量低于设定的最小值,那么更多带宽得分较低的路由节点将被添加到快速节点池中;反之,如果快速节点池中的节点数量高于最大值,则只选取带宽得分最高的路由节点添加到节点池中。
3 I2P节点选择优化算法
虽然现行的I2P节点选择算法保证了传输隧道的稳定性和可靠性,但是很难防御攻击者对I2P网络的共谋攻击。这里的共谋攻击指的是攻击者在I2P网络中部署大量恶意的路由节点,这些恶意节点不仅可以直接拒绝本地客户端的服务请求,还可以互相协同收集I2P网络中用户的信息,以达到去匿名的攻击目的。这些恶意节点由于优秀的性能,往往会成为I2P网络中的洪泛节点,同时拥有更高的可能性被其他用户选择加入快速节点池成为隧道的参与者。显然,如果本地客户端的隧道中存在多个恶意节点,将很难保证本地用户通信的匿名性和系统性能。
当前的I2P网络中,发达国家和地区(如欧洲、俄罗斯和美国)相对于其他国家和地区拥有更多的I2P路由节点。所以,在传统的I2P节点选择算法下,隧道中的多个节点可能来自于同一个地区。实际上,在课题研究的过程中就曾经发现大量来自纽约州立大学石溪分校的I2P节点处于本地客户端的快速节点池中,也发现了两个来自该大学的节点参与同一隧道的搭建。为了对抗这种针对I2P节点选择的共谋攻击,I2P官方建议使用者增加隧道长度以减少隧道中恶意节点的比例。但是,由于I2P网络本身的网络时延较高,这种增加隧道长度的解决方法无疑会增加通信时延。
为了更好地解决这种问题,提出了一种节点选择优化算法,如图4所示。优化的I2P节点选择算法在传统算法的基础上增加一个步骤,即根据节点的IP地址划分每个节点所属的区域。这里假设攻击者拥有在一个国家及周边地区部署大量恶意节点的能力。因此,优化算法将节点按地理位置的大洲划分为6个分组,其中由于南极洲的特殊情况将其排除在外。在划分完已知节点的区域后,再分别对每个区域的节点按照性能指标进行进一步划分,选出其中的可达节点、高容节点和高速节点。在本地客户端搭建隧道时,随机选择3个区域内的节点作为隧道的参与者。
图4 优化节点选择算法
在优化节点选择算法下,因为I2P本地客户端的每条隧道都只有一个参与者处于同个地区,所以攻击者通过在某个区域内部署大量节点来发动共谋攻击的传统方法将不能奏效。此外,由于没有改变隧道长度和节点性能的评估标准,对整个I2P网络的时延影响无法通过单纯增加隧道长度来实现。实际上,优化算法中影响I2P网络时延的主要因素来自跨大洲的节点传播时延,而这种情况在传统节点选择算法中也会出现,所以整体时延的提高并不明显。
4 结 语
I2P网络作为当今最流行的暗网访问工具之一,其匿名性要优于其前身Tor网络,但是其算法复杂度高,用户数量相对较少,通信时延要比Tor高。因此,单纯增加隧道长度来提高I2P网络匿名性的做法,对于I2P用户是难以接受的。提高匿名性的同时尽量减少对通信时延的影响,是优先级较高的做法。本文提出的优化节点选择算法是在这样的思想下提出的,可以大大提高攻击者的攻击成本,让攻击者不得不选择其他攻击手段。同时,由于优化算法并没有改变算法本身的筛选标准,所以对整个I2P网络的通信时延并没有很大影响。不过,因为优化算法无法在真实的I2P网络中部署以进行测试评估,所以无法具体分析优化算法对I2P用户带来的影响。后续将与I2P官方人员沟通,在部分节点上部署这种优化节点算法进行测试和评估。