白帽黑客:Trea合约漏洞攻击方案与漏洞分析及修复建议

合约采集自ConfluxScan
很高兴看到生态项目如此火热,但在项目的早期,我更加期待项目的各个生态项目能够平稳发展。


熬鹰项目作为一个简单上手的项目,自然能为生态带来许多人气。
TREA,融合Fomo3d和DeFi流动性挖矿机制的创新Dapp应用成功登陆Conflux。TREA支持CFX参与,玩法新颖,创意十足。边玩游戏边挖矿,娱乐收益两不误。持续回购确保长期增值,赋能方式多样,好玩根本停不下来。合约代码全部开源,已经通过成都链安安全审计。
单币质押挖矿已开启,流动性挖矿即将开启。
参与地址:http://trea.finance/conflux/
Trea地址:0x83f924c12144807da960ddb8934256f9aca14408

目前第18局游戏总奖池已超13700CFX,本局大佬争夺激励,有望冲击66666硬顶,届时开奖规则将为随机抽奖,各位老铁们走过路过别错过,投入1CFX即有机会抽大奖。
但是,在检查合约之后,发现似乎有些地方存在漏洞,而且这种漏洞借用Conflux的底层机制可以很好地被避免。因为以太坊等其他链并没有通过地址0x8开头来判定被合约调用的能力,而Conflux就有这种能力,这也是我一直看好Conflux的原因之一。

那么接下来来分析攻击的方案:

  1. 核心的薄弱点还是其使用了Fomo3D早期被攻击过的随机数方法。并且没有利用Conflux的合约辨识功能来避免被其他合约调用。
    网上有很多对该函数的攻击复现

  2. 对于十个抽一个的翻倍奖励2CFX:

    可以参考闪电贷的结果校验,对于没有中奖的交易进行回滚。
    3.对于最终触顶66666CFX的攻击方案:

只需要等到最后资金池66656的时候,100分钟倒计时。连续攻击10次,并在这100分钟中反复校验是否是自己的地址中奖,即便我参与1%,中奖概率为1%,但是我可以通过合约尝试100次,那么我的中奖概率是:1-(0.99 ** 100) = 63.39%。我在100分钟的时间中可以多次尝试,直到中奖3万CFX为止。
测试攻击结果:
连续攻击4次
连续攻击10次
如果攻击成功


则将攻击子合约的金额转回攻击管理器
4.善后方案
由于Conflux单个区块的Gas限制,使得攻击时的奖池倒计时有限,官方可以在最后100CFX的时候直接调用合约,用小的损失,来实现真正的随机数,触发最终奖池。
并在后续的合约中按照相关方案优化合约。

5.其他
因为攻击方案已经实验成功,如果我真的想攻击的话,只需要等到最后资金池66656的时候,等待100分钟。连续攻击10次,并在这100分钟中反复校验是否是自己的地址中奖,即便我参与1%,中奖概率为1%,但是我可以通过合约尝试100次,那么我的中奖概率是:1-(0.99 ** 100) = 63.39%。我在100分钟的时间中可以多次尝试,直到中奖3万CFX为止。
在此是希望能够提醒项目方,在其他非白帽黑客发现攻击方案之前预先做好防御准备工作。也希望大家不要盲目相信审计机构,并多多利用Conflux底层抗合约攻击的机制来进行合约开发。
攻击器的合约就不开源了,避免到时出现直接利用的情况。

被攻击的合约Trea:https://testnet.confluxscan.io/address/cfxtest:acemvbjnmfpkmx5fumsyrukh2y6f6jdnjpn3rdf193
攻击器管理器:
https://testnet.confluxscan.io/address/cfxtest:ach9m3tzsxxdcy017vr31yswau9x2mjfn2uez0tsws
攻击进行的子合约:
https://testnet.confluxscan.io/address/cfxtest:acfhx16n576s9k5jh17dbe5uzxm9vdfk9jfuxss3rw

测试网合约部署:
Starting migrations…

Network name: ‘testnet’
Network id: 10001
Block gas limit: 30000000 (0x1c9c380)

1_initial_migration.js

0x1bfef18aea292d508d37d524368844eb146e75c6

Replacing ‘Migrations’

transaction hash: 0x15576d155dccd1a2c5ae75ff7da756ee82cbf0434fc2f25c6ffc58f112cf84c9
Blocks: 29 Seconds: 14
contract address: 0x866080a15671EC1599505B2757ef557C823744Db
block number: 21374159
block timestamp: 1617939885
account: 0x1BfEF18AEA292D508D37D524368844eb146e75c6
balance: 108.51001108
gas used: 179801 (0x2be59)
gas price: 20 GDrip
value sent: 0 CFX
total cost: 0.00359602 CFX

Deploying ‘TreasureConflux’

transaction hash: 0x2c2f272bf410638f186d34d5c4464e0e36f3906ce98c679b9c164c25acb15671
Blocks: 18 Seconds: 18
contract address: 0x88A8850B5158954F65829d46C127c5385e206b43
block number: 21374198
block timestamp: 1617939910
account: 0x1BfEF18AEA292D508D37D524368844eb146e75c6
balance: 102.22168144
gas used: 2986527 (0x2d921f)
gas price: 20 GDrip
value sent: 0 CFX
total cost: 0.05973054 CFX

var TreasureConflux = " 0x88A8850B5158954F65829d46C127c5385e206b43 ";

Deploying ‘A_mainAttacker’

transaction hash: 0xff165ac7157f845bbac635fada49b68a2bae0a9eb392c7c0e9bc48f5232f0d22
Blocks: 17 Seconds: 14
contract address: 0x8fF565f574E63152D7eC5B9bd1d2043F3c29055e
block number: 21374237
block timestamp: 1617939942
account: 0x1BfEF18AEA292D508D37D524368844eb146e75c6
balance: 98.9958518
gas used: 1663100 (0x19607c)
gas price: 20 GDrip
value sent: 0 CFX
total cost: 0.033262 CFX

var AttackerAddress = " 0x8fF565f574E63152D7eC5B9bd1d2043F3c29055e ";

Deploying ‘leaf’

transaction hash: 0xbfd54ec56f5babbe0361301c08538c7257d7c0094a14a77cd3425cb08247444f
Blocks: 20 Seconds: 14
contract address: 0x8A79Df8bdF78efa7683Dfa309370acd5F88ca9FA
block number: 21374279
block timestamp: 1617939969
account: 0x1BfEF18AEA292D508D37D524368844eb146e75c6
balance: 98.33252216
gas used: 303532 (0x4a1ac)
gas price: 20 GDrip
value sent: 0 CFX
total cost: 0.00607064 CFX

0var LeafAddress = " 0x8A79Df8bdF78efa7683Dfa309370acd5F88ca9FA ";

3 Likes

我很久之前写过一个Conflux专用的抗合约攻击大法,可以参考:

1 Like

:flushed::flushed::flushed:

:+1::+1::+1::+1::+1::+1:

强帖留名!

大神强大:hamburger:

强帖留名

给力的,表率

有两下子,赞👍

山外有山,人外有人,善人有好报

这个学习了~

coo l

很好的技术贴!赞!希望能有更多这样的讨论

3 Likes

大佬,会影响现在参与挖矿资金的安全吗?还是只是用来抢夺奖池呢?谢谢

1 Like

66656都会疯狂押,怎么还会撑到100分钟

66656都会疯狂押消耗的1秒,对于脚本和合约自动执行来说,等价100分钟是保守的相对时间概念。

强帖留名。

666

强帖留名
:+1:

:+1: