胡晓艳,童钟奇,吴桦,许昱玮
〔1.东南大学网络空间安全学院,江苏南京 211189;2.计算机网络和信息集成教育部重点实验室(东南大学),江苏南京 211189;3.网络空间国际治理研究基地(东南大学),江苏南京 211189;4.网络通信与安全紫金山实验室,江苏南京 211111〕
区块链是一种由多方共同维护,能够实现数据一致存储、不可篡改、多方访问、去中心化的记账技术,也称为分布式账本技术。区块链技术诞生于中本聪名为《比特币:一种点对点式的电子现金系统》[1]的论文中,它为进一步解决互联网中的信任问题、安全问题和效率问题提供了新的解决方案,也为金融等行业的发展带来了新的机遇和挑战。近年来,区块链技术的应用逐渐广泛,据Cisco预测[2],2027年区块链行业将占全球GDP的10%,但随之而来的监管问题也变得愈发突出。区块链匿名性和多方维护的设计,使得区块链的有效监管十分棘手。
作为区块链中的代表性应用,以太坊在中本聪提出的区块链结构基础上,引入了私有RLPx加密协议对数据打包和加密,进一步加强了其匿名性,这也使得以太坊成为了驱使网络安全事件发生的催化剂。据PeckShield统计[3],仅2019年就有超177起区块链安全事件发生,造成的经济损失高达76.79亿美元。因此,监管以太坊流量从而及时发现攻击行为对以太坊的稳定运行至关重要,而以太坊流量监管的第一步就是对以太坊加密流量的识别。
已有研究中的加密流量识别方法可以分为数据分组负载随机性检测方法[4,5]、基于有效负载的识别方法[6,7]和基于机器学习的识别方法[8]。数据分组随机性检测方法需要对数据流中不完全随机加密特征字段进行识别;基于有效负载的识别方法分析提取数据中未加密部分进行识别;基于机器学习的识别方法通过提取加密流特征,结合机器学习方法,实现加密流量识别。而国内外涉及以太坊加密流量的研究集中在对以太坊应用的识别和对以太坊拓扑结构的构建上。对以太坊应用识别主要是对在以太坊平台上开发的Dapps的识别[11],其本质还是对传统TLS流量的分类,不是针对以太坊私有协议加密流量的研究;对以太坊节点拓扑的构建是通过NetFlow流[12]或者主动探测[13]的方法收集以太坊节点信息,构建以太坊拓扑结构,这些方案也没有对以太坊加密流量进行深入研究,无法准确识别以太坊加密流量。
综上所述,为夯实以太坊网络监管的第一步,本文提出一种基于活跃节点的以太坊加密流量识别方法,通过活跃节点库过滤以太坊节点,提高了识别效率,进一步实现以太坊加密流量准确识别。
以太坊的基本机构如图1所示,一般将其分为自底向上的6层结构。数据层定义了区块内部数据存储格式、区块的链式相连方式以及以太坊钱包地址采用的非对称加密方法;网络层则定义了以P2P为基础的RLPx数据格式化打包和数据传播协议;共识层则采用了POW(Proof of Work,工作量证明)和POA(Proof of Authority,授权证明)共识方法;激励层定义了矿工成功打包区块和运行以太坊合约时的奖励方法;合约层包含了以太坊所有的智能合约,是以太坊实现自定义的、具备图灵完备性的分布式应用的基础,它运行在独立的以太坊虚拟机EVM上;应用层是在以太坊平台上,使用智能合约编写的不同的去中心化应用。本文主要关注的是以太坊的网络层中RLPx协议的加密方法和通信过程,因此,下面将主要介绍RLPx协议的基本概念和相关内容。
图1 以太坊分层结构
RLPx跟随RLP(Recursive Length Prefix)命名,RLP是以太坊中采用的数据序列格式化的方法。RLPx协议中定义了基于UDP的不加密节点发现过程和基于TCP的加密数据传输过程。
图2是RLPx连接建立过程的示意图。由于以太坊基于P2P设计,因此当一个节点加入以太坊网络时,首先是节点的发现过程。RLPx基于UDP实现了其他节点的发现。起始时通过Ping内部预置的一些公开节点,对返回Pong的节点进一步发送请求获取邻居节点信息,并用K桶保存这些节点信息。
在建立TCP连接前,会通过UDP的Ping-Pong来确认连接的可用性。连接建立过程中首先会通过Enchandshake握手过程确定此次连接的临时通信密钥。EncHandshake握手过程中双方使用自身信息随机的各自生成一个私钥,然后将对应公钥发送给另一方,最后双方通过手中的私钥和对方的公钥生成一个共享密钥,此次连接的信道上将会使用此共享密钥加密传输信息。该共享密钥只在本次通信过程中保持有效,保证了以太坊的完备的前向安全性。随后将会进行状态的同步和区块同步等操作,保证节点与整个以太坊信息的一致。
由于以太坊通信内容都采用了RLP方法进行序列格式化,并且定义的通信内容格式间也存在着相似性,导致UDP报文在大小和内容之间存在着很多的重复性,TCP报文在握手过程和通信内容大小上也存在很多的相似,这些相似的内容为识别以太坊加密流量提供了可用的特征。本文因此提出了一种基于以太坊活跃节点的以太坊加密流量识别方法。下一章将会介绍算法的整体设计。
本文将会介绍基于活跃节点库的以太坊加密流量识别方法的具体设计。图3是整个算法实现的结构图。
图2 RLPx协议通信过程
图3 以太坊加密流量识别算法结构图
算法包含了两个主要部分,节点库设计部分和流量处理部分。核心节点库存储支撑以太坊运行的核心节点信息,活跃节点库基本覆盖区域内所有的以太坊节点。因此,可以认为区域内所有的以太坊流量不是从活跃节点库中发出的就是以活跃节点库中的节点为目的地址。算法首先判断流量源宿地址是否在活跃节点库中存在记录,对存在记录的流量转入流量处理部分。在流量处理部分会分别对UDP流量和TCP流量进行识别,将以太坊UDP报文识别结果作为TCP识别的基础,同时采用UDP和TCP识别结果共同更新维护活跃节点库中信息。下面是对这两部分的详细介绍。
以太坊节点库包含以太坊核心节点库和以太坊活跃节点库。以太坊维护机构为保证以太坊POW共识算法的可靠性,维持以太坊的正常运行,设置了部分以太坊节点并公开了这些节点的信息。此外,以太坊会在Geth等工具中内置一些以太坊节点以保证新节点加入时能与邻居节点建立连接。本文引入核心节点库存储这两种节点信息,在算法起始时填充活跃节点库。
活跃节点库包含了当前区域内所有活跃的以太坊节点的信息,活跃节点库初始由核心节点库填充,随着算法的运行,活跃节点库不断趋于收敛,最终实现对整个区域内以太坊活跃节点的记录。不同区域中活跃节点库的信息可能有所区别,而整个以太坊的核心节点库信息保持一致。
由于以太坊流量中包含了UDP流量和TCP流量,因此针对两者采用不同的处理方式。以太坊在建立TCP连接前会通过UDP的Ping-Pong探测节点的可用性或获取相关的邻居节点信息,因此,算法首先会针对UDP流量进行识别。
如图4所示,以太坊UDP定义了四种结构,包括Ping、Pong、FindNode和Neighbors。以太坊Ping-Pong过程是对等节点对某另一个节点可用性的探测过程。FindNode用来向自己的邻居节点查询距离目的节点比较近的邻居节点。Neighbors是对FindNode的回应,包含了该节点中距离目的节点较近的节点的信息。此外,以太坊RLPx协议中对UDP流量是不加密的,因此以太坊的UDP流量表现出了极高的相似性,报文大小、报文顺序等都有着极高的统一性。
对于探测节点是否可用的Ping-Pong过程,一条UDP流中可能会包含一次或多次重复的Ping-Pong,Ping报文的内容大小约为127B,而Pong包内容稍大,约为150B;针对邻居节点信息获取的过程,首先会是一次或者多次的节点可用性的探测,当节点可用时会发送一个FindNode报文,对等节点也返回一个Neighbors报文,该次的邻居节点信息获取过程结束。其中,FindNode内容大小固定为171B,且返回的Neighbors是固定的两个1057B和425B的报文。此外,以太坊会选用较高的通信端口,初始的默认端口号为30303,若端口号30303被占用会重新选择端口,一般选用10000以上的端口号。
针对以太坊TCP流量,其RLPx协议一共定义了以太坊TCP中的12种报文格式,为区分其中的相似报文,在发送相似报文前会发送一个固定大小的标识报文标识将要发送的报文格式。此外,以太坊TCP的Enchandshake是通信的第一步,由连接发起方开始,双方交换一次大小约500B的自身信息实现Enchandshake握手。
图4 以太坊UDP报文数据结构
综上,当一个待识别流的源、宿地址在以太坊活跃节点库中存在记录时,转入以太坊流量识别过程。首先判断双方是否存在UDP流量,进而判断UDP端口是否是较高端口,其次结合UDP的Ping-Pong报文大小、Ping-Pong报文顺序以及NodeFide报文Neighbors报文的大小、顺序进一步确定是否是以太坊UDP流量。对确认存在以太坊UDP流量的节点进行记录,更新活跃节点库信息,转入对TCP流量的识别。对于TCP流量,首先通过高端口号初步判断是否是以太坊TCP流量,在TCP握手后判断是否进行Enchandshake握手过程,最后,对传输内容的报文大小进行统计,设置阈值,该阈值反映了流量中标识报文和相似行为报文的出现频率,满足高端口特性、进行了Enchandshake并且统计结果高于阈值的即为以太坊TCP流量,同时更新以太坊活跃节点库中信息。
为获取以太坊核心节点信息,本文使用网络爬虫方法爬取以太坊节点统计网站ethernodes.org中公开节点,共爬取了5,672个公开节点填充核心节点库。由于缺乏可用的以太坊流量数据集,本文参考使用了文献[13]中NodeFinder的设计,同时为了保证收集到足够可用的TCP流量,本文延长了NodeFinder中的连接保持时间至2min,一般会在此时间内完成多次交易的转发和区块的同步。为保证最终实验结果的准确性,需要保证活跃节点库达到收敛。考虑到现实情况中识别是一个持续的过程,本文采用两组数据进行实验,第一组数据是模拟现实环境对活跃节点库进行填充。第二组数据中混入背景流量,测试实验结果。本文设置了两台位于同一子网中的设备分别抓取了实验数据一和实验数据二,具体实验数据如表1所示。
表1 实验数据
为研究UDP中报文大小范围设置对结果的影响,在排除425B和1057B的固定大小的UDP报文的影响后,本文分别设置算法中UDP报文大小范围从[110,200]至[110,320],实验结果如图5所示。为研究TCP中阈值对实验准确率的影响,本文分别对阈值为7%至15%进行了实验,实验结果如图6所示。
图5 报文范围对UDP识别结果的影响
由图5可以看出,随着UDP报文大小范围的增加,准确率先降低再升高再降低,精确率持续降低,召回率在[110,300]处提升明显。这是因为以太坊UDP报文在剔除425B、1057B两种固定大小的报文后,主要分布在[110,200]和[280,300]的区间内,而报文大小范围的增加会导致将非以太坊流量误判为以太坊流量的比例增加。因此,准确率会在[110,280]和[280,300]之间提升,而整体呈现下降趋势,精确率则会因为误判的增加而持续降低,召回率在[110,280]和[280,300]也会有显著提升而整体呈现缓慢上升趋势。
由图6可以看出,随着阈值的不断升高,准确率和精确率不断上升,而召回率程现下降趋势。这是因为随着阈值的提升,将以太坊流量误判为非以太坊流量的比例不断上升,将非以太坊流量误判为以太坊流量的比例都不断下降,但将以太坊流量误判为非以太坊流量的上升趋势较将非以太坊流量误判为以太坊流量的下降趋势更不明显,因此整体呈现的效果就是准确率和精确率缓慢提升,而召回率不断下降。
图6 阈值对TCP结果的影响
本文进行了以太坊加密流量识别的研究,提出了一种基于以太坊活跃节点库的以太坊加密流量识别方法,在获取区域内以太坊节点信息构建以太坊活跃节点库的基础上,针对以太坊UDP和TCP流量分别进行了识别,在实验中得到了较高的识别准确率、精确率和召回率。
但是,由于目前尚无针对以太坊加密流量识别的工作,因而实验结果中缺乏对比实验,针对这一缺憾,本文后续工作将会跟进学术界最新进展,在出现了相关研究工作时进行对比实验。