来源:创宇区块链安全实验室
前言
Tornado.Cash作为以太坊网络上最火的去中心化隐私解决方案,打破了存款人和取款人地址之间的链上链接,做到了交易机密性,保护了用户隐私。
越来越多有隐私需求的用户开始使用Tornado.Cash,那Tornado.Cash真正的隐私性到底如何,能做到百分百的安全吗?
知道创宇区块链安全实验室?将对Tornado.Cash进行多维度分析,探索Tornado.Cash真正的隐私可靠性。
Tornado.Cash工作原理
在分析Tornado.Cash之前,我们必须知道Tornado.Cash的工作原理。
Tornado.Cash使用智能合约,接收来自一个地址的代币存款,并允许他们从不同的地址提款,并且通过零知识证明阻断了存款地址和提款地址之间的联系,让隐私性得到了保护。
其中,匿名池的大小直接决定了Tornado.Cash隐私可靠性的高低,想想如果只有一笔存款进入匿名池,那不管从哪个地址提款,肯定和存款地址是同一个人。
感兴趣的读者可以阅读官方文档:how-does-tornado.cash-work。
前期准备
Tornado.Cash目前支持?ETH?及ERC20代币存、提款交易,我们选取了其中交易量最大的ETH进行隐私性分析,提取了2021-11-04日之前,所有Tornado.Cash合约的交易记录,数据如下表所示:
可以看到,在启用代理合约后,大量交易都是通过代理进行,通过匿名池交易量占比图可知,1ETH匿名池和10ETH匿名池是使用最多的匿名池。
Beosin:UVT项目被黑客攻击事件简析,被盗资金已全部转入Tornado Cash:金色财经报道,据Beosin EagleEye 安全预警与监控平台检测显示,UVT项目被黑客攻击,涉及金额为150万美元。攻击交易为0x54121ed538f27ffee2dbb232f9d9be33e39fdaf34adf993e5e019c00f6afd499
经Beosin安全团队分析,发现攻击者首先利用开发者部署的另一个合约的具有Controller权限的0xc81daf6e方法,该方法会调用被攻击合约的0x7e39d2f8方法,因为合约具有Controller权限,所以通过验证直接转走了被攻击合约的所有UVT代币,Beosin安全团队通过Beosin Trace进行追踪,发现被盗资金已全部转入Tornado Cash。[2022/10/27 11:48:46]
交易分析
交易分类
对所有交易进行存款、提款归类后,统计了每个地址存/提款总额、次数、最大存/提款金额、最小存/提款金额统计。得到了22714个存款地址,31737个提款地址,其中存/提款总额Top10数据如下:
存钱总额Top10
提款地址总额Top10
可以看到,存款地址和提款地址并不是一一对应,也无法知道存款地址和取款地址之间的关系。
挖矿地址过滤
Tornado.Cash推出了匿名挖矿激励措施,用于增加匿名池内交易的数量,提高Tornado.Cash整体的隐私可靠性。
慢雾:GenomesDAO被黑简析:据慢雾区hacktivist消息,MATIC上@GenomesDAO项目遭受黑客攻击,导致其LPSTAKING合约中资金被非预期的取出。慢雾安全团队进行分析有以下原因:
1.由于GenomesDAO的LPSTAKING合约的initialized函数公开可调用且无权限与不可能重复初始化限制,攻击者利用initialized函数将合约的stakingToken设置为攻击者创建的虚假LP代币。
2.随后攻击者通过stake函数进行虚假LP代币的抵押操作,以获得大量的LPSTAKING抵押凭证。
3.获得凭证后再次通过initialized函数将合约的stakingToken设置为原先真是的LP代币,随后通过withdraw函数销毁LPSTAKING凭证获取合约中真实的LP抵押物。
4.最后将LP发送至DEX中移除流动性获利。
本次事件是因为GenomesDAO的LPSTAKING合约可被任意重复初始化设置关键参数而导致合约中的抵押物被恶意耗尽。[2022/8/7 12:07:06]
所以我们第一步便是过滤掉匿名池内的挖矿交易,可以大大降低匿名池内交易数量。
通过分析观察,发现挖矿地址有如下特征:
挖矿地址会到Tornado.Cash矿池合约地址0x746aebc06d2ae31b71ac51429a19d54e797878e9提取TRON代币;
挖矿地址没有隐私保护需求,提款的时候一般直接使用自己钱包地址支付矿工费;
挖矿地址一般是常用且交易比较多的老地址;
采用该方法获取到1051个满足条件的矿池地址。排除挖矿地址后,存、提款地址数量变化如下:
排除挖矿地址后存款总额Top10
慢雾:跨链互操作协议Nomad桥攻击事件简析:金色财经消息,据慢雾区消息,跨链互操作协议Nomad桥遭受黑客攻击,导致资金被非预期的取出。慢雾安全团队分析如下:
1. 在Nomad的Replica合约中,用户可以通过send函数发起跨链交易,并在目标链上通过process函数进行执行。在进行process操作时会通过acceptableRoot检查用户提交的消息必须属于是可接受的根,其会在prove中被设置。因此用户必须提交有效的消息才可进行操作。
2. 项目方在进行Replica合约部署初始化时,先将可信根设置为0,随后又通过update函数对可信根设置为正常非0数据。Replica合约中会通过confirmAt映射保存可信根开始生效的时间以便在acceptableRoot中检查消息根是否有效。但在update新根时却并未将旧的根的confirmAt设置为0,这将导致虽然合约中可信根改变了但旧的根仍然在生效状态。
3. 因此攻击者可以直接构造任意消息,由于未经过prove因此此消息映射返回的根是0,而项目方由于在初始化时将0设置为可信根且其并未随着可信根的修改而失效,导致了攻击者任意构造的消息可以正常执行,从而窃取Nomad桥的资产。
综上,本次攻击是由于Nomad桥Replica合约在初始化时可信根被设置为0x0,且在进行可信根修改时并未将旧根失效,导致了攻击可以构造任意消息对桥进行资金窃取。[2022/8/2 2:52:59]
排除挖矿地址后取款地址总额Top10
相同地址过滤
存款地址和提款地址相同的交易,没有交易隐私性,所有也可以过滤掉,过滤后数据变化如下:
慢雾:BSC项目Value DeFi vSwap 模块被黑简析:据慢雾区情报,币安智能链项目 Value DeFi 的 vSwap 模块被黑,慢雾安全团队第一时间介入分析,并将结果以简讯的形式分享,供大家参考:
1. 攻击者首先使用 0.05 枚 WBNB 通过 vSwap 合约兑换出 vBSWAP 代币;
2. 攻击者在兑换的同时也进行闪电贷操作,因此 vSwap 合约会将兑换的 vBSWAP 代币与闪电贷借出的 WBNB 转给攻击者;
3. 而在完成整个兑换流程并更新池子中代币数量前,会根据池子的 tokenWeight0 参数是否为 50 来选择不同的算法来检查池子中的代币数量是否符合预期;
4. 由于 vSwap 合约的 tokenWeight0 参数设置为 70,因此将会采用第二种算法对池子中的代币数量进行检查;
5. 而漏洞的关键点就在于采用第二种算法进行检查时,可以通过特殊构造的数据来使检查通过;
6. 第二种算法是通过调用 formula 合约的 ensureConstantValue 函数并传入池子中缓存的代币数量与实时的代币数量进行检查的;
7. 在通过对此算法进行具体分析调试后我们可以发现,在使用 WBNB 兑换最小单位(即 0.000000000000000001) vBSWAP 时,池子中缓存的 WBNB 值与实时的值之间允许有一个巨大的波动范围,在此范围内此算法检查都将通过;
8. 因此攻击者可以转入 WBNB 进行最小单位的 vBSWAP 代币兑换的同时,将池子中的大量 WBNB 代币通过闪电贷的方式借出,由于算法问题,在不归还闪电贷的情况下仍可以通过 vSwap 的检查;
9. 攻击者只需要在所有的 vSwap 池子中,不断的重复此过程,即可将池子中的流动性盗走完成获利。详情见原文链接。[2021/5/8 21:37:37]
慢雾:Polkatrain 薅羊毛事故简析:据慢雾区消息,波卡生态IDO平台Polkatrain于今早发生事故,慢雾安全团队第一时间介入分析,并定位到了具体问题。本次出现问题的合约为Polkatrain项目的POLT_LBP合约,该合约有一个swap函数,并存在一个返佣机制,当用户通过swap函数购买PLOT代币的时候获得一定量的返佣,该笔返佣会通过合约里的_update函数调用transferFrom的形式转发送给用户。由于_update函数没有设置一个池子的最多的返佣数量,也未在返佣的时候判断总返佣金是否用完了,导致恶意的套利者可通过不断调用swap函数进行代币兑换来薅取合约的返佣奖励。慢雾安全团队提醒DApp项目方在设计AMM兑换机制的时候需充分考虑项目的业务场景及其经济模型,防止意外情况发生。[2021/4/5 19:46:39]
存款地址总额Top10
提款地址总额Top10
过滤中继地址
为了最大化提款地址的隐私性安全性,大部分用户提款时,会选择使用中继器来支付矿工手续费,所以一次提款操作,会有两笔交易。
其中一笔小额是支付给中继器的手续费,另外一笔才是真正的提款交易,如下图
我们使用过滤条件:max>0.8|(max<=0.1&max>=0.08)对中继器交易进行过滤,过滤后数据变化如下:
过滤中继地址后的提款地址次数Top10:
同一用户关联地址关系
接下来分析torando交易池里面的地址是否存在关联关系,在分析之前我们首先排除了矿池地址和中继器地址之后再进行分析。
分析办法采用直接交易对手分析方式,假设A是充币地址,B是提币地址,A和B之间没有直接关系,但C地址是A的直接交易对手,C地址同时也是B的直接交易对手,那我们可以判定A和B是有关联的,直接交易对手的数据直接从链探查询获取。
按地址类型区分可以把关系分为:充币地址与充币地址,提币地址与提币地址以及充币地址与提币地址三类关系,这三类关联关系都适用于不同的场景。
1、充币地址与充币地址之间的关系
由于tornado只能存0.1ETH、1ETH、10ETH、100ETH,所以在实际转账过程中,可能会出现资金分配,矿工费分配,或者存入之后地址剩余ETH汇集等情况。
2、提币地址与提币地址之间的关系
在需要提款时,提款地址之间可能也会存在汇集的可能,比如汇集到交易所。
3、充币地址和提币地址之间的关系
充币地址和提币地址之间是否任然存在关联,这是关键所在,如果是一个非常熟悉隐私交易的黑客,他可能会想尽一切办法来切断关键地址之间的联系,但实际操作过程中因为都是人在操作,难免会有疏忽或者遗漏,可能会留下蛛丝马迹。
基于以上三个场景和关联类型的猜想,我们先对100ETH的交易池进行分析。根据直接交易对手数据直接生成相应的关联图
第一种情况
充币地址与充币地址存在关联关系,以0x0022d8bda338fd7e5c7248f32090252fd6dc11ef为例:
该地址与多个充币地址间出现过交易对手重叠的情况,链上分析这些地址的关系,可以判断出该地址在对tornado先后充值100ETH和10ETH之后
剩余的ETH汇集到了0x6bafcd65f9ad3a99509d8d7d987acfa393db7c39地址中,并由该地址将剩余的0.1ETH也充值到tornado交易池中。
第二种情况
提币地址与提币地址之间存在关联关系,以0x9c67d8383f1eeb6e2ff2b0d296aa6a51ea2858a1为例:
该地址与多个提币地址之间产生关联关系,这些地址都从tornado100eth的交易池中发起过提币行为,每个地址都提取了1000ETH
并在提币之后都汇集到了0x120cffb605c8127442c2f8515eb25749cce52947地址中
继续分析后续路径可以看到0x120cffb605c8127442c2f8515eb25749cce52947又将ETH进行了多次周转最终到了0x32e9dc9968fab4c4528165cd37b613dd5d229650等地址中,并最终经过Swap将ETH换成其他代币转到了币安等交易所中。
上面两种情况,隐私交易都只在充币端或者提币端之后产生了关联,虽然能够追溯到一些信息,但充币和提币之间的联系还是断开的,那么我们探索第三种情况。
正所谓人无完人,再缜密的计划也可能留下线索,如果tornado的使用者在使用时没有完全隔离地址,则通过交易对手的关系是有可能关联上的,以0x167ae15b74cd20482e80f7e425b4ae6d2cc631c4为例。
在上面关联关系中,五个地址都通过直接交易对手0x4278314c1a50da6014e580cbff34fc383b335049进行关联,从而在一定程度上可以将这五个地址的出入金关系建立起来,如果进一步挖掘金额和后续资金流向关系,则可以尝试进一步溯源。
在整个试验中,100ETH池子有4132个充币地址,有703个提币地址,清洗出来有直接交易对手重叠的关联地址有2859个,大约占整个地址59%左右,说明大部分人在使用tornado隐私协议的时候,因为使用上的疏忽,并没有做到100%的隐私。
挖出关联地址也意味着对tornado的溯源成为一种可能,在获取到大量的关联地址之后可以根据交易所地址的kyc或者ens推特等渠道进一步挖掘真实信息。
基于案例验证结果数据
我们从链探的黑客事件库中挖掘历史上发生过的一些安全事件,并筛选出事件中使用了tornado的相关地址按照上述理论进行分析。
对KuCoin被盗事件进行分析
直接交易对手关联地址分析
黑客通过8个地址将ETH存入到Tornado100ETH的交易池中,这8个充币地址通过直接交易对手0x23156749a0acefc8f07b9954d181d50084c1519e和0x82e6b31b0fe94925b9cd1473d05894c86f277398进行了关联。
而从上面的关联图可以看到由于黑客疏忽,充币地址0x34a17418cec67b82d08cf77a987941f99dc87c6b通过直接交易对手地址0x82e6b31b0fe94925b9cd1473d05894c86f277398和提币地址0xc609b3940be560c8c00e593bea47fb6ecef6b2c6进行了关联。
0xc609b3940be560c8c00e593bea47fb6ecef6b2c6只提币2900ETH,
可以看到黑客因为0x82e6b31b0fe94925b9cd1473d05894c86f277398中没有足够的矿工费,
先后从0xc609b3940be560c8c00e593bea47fb6ecef6b2c6和0x23156749a0acefc8f07b9954d181d50084c1519e中转出过矿工费到0xc609b3940be560c8c00e593bea47fb6ecef6b2c6,
而正好充币地址的矿工费也从这两个地址转出过,从而让提币地址和充币地址建立了关联。
继续顺藤摸瓜可以发现,提币出来的ETH又转到了其他地址,在整个链路上继续深入,可以发现ETH被分散发到了很多地址,并有大量的ETH转入了币安的充币地址0x28c6c06298d514db089934071355e5743bf21d60
至此,整个链路追踪在币安断开,如果能获取到币安kyc信息便可具体定位人员。
交易所Liquid被盗
发现四个充币地址向100ETH的池子充过币,并且通过直接交易对手0x5578840aae68682a9779623fa9e8714802b59946关联。
FinNexus?DeFi?项目被盗
发现两个充币地址关联,0x5271b379f3e1954e20791142d734596a3de28efd和0x5ebc7d1ff1687a75f76c3edfabcde89d1c09cd5f都向100eth的池充过ETH,并通过直接对手0xfe381bc045b85e0acd93e85ecfe65ecb0fec2a44关联。
?
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。