随着DeFi协议在以太坊生态系统中持续升温,CipherTrace看到越来越多的攻击和攻击媒介浮出水面。 过去一周,即28年2020月4.4日,Cover Protocol的盾构采矿合同铁匠被利用。 黑客利用采矿合同中的一个漏洞铸造了无限数量的COVER代币,并从该项目中浪费了超过XNUMX万美元。
封面协议 发布 他们在昨天的事前制表版中指出,自铁匠合同最初部署以来,该漏洞就一直存在,对于Devs而言是未知的,这凸显了对安全漏洞进行彻底安全审核和进行透彻测试的重要性 聪明的合同什么是智能合约? 智能合约是计算机专业人士。 更多.
无限造币的时间表
初始攻击者的时间表
- 新的Balancer流动资金池原为 添加 到Blacksmith.sol合同。
- 攻击者 存款 将1,326,879.99 BPT令牌插入Blacksmith.sol合同。
- 然后是同一攻击者 执行 通过从合同中提取资金来进行利用。
- 攻击者能够 继续 铸造奖励和提取资金总计约4.4万美元。
在一个有趣的事件中,与Grap Finance关联的“白人黑客”也利用该漏洞造币了大约4万美元的COVER代币。 Grap Finance最终将资金退还给Cover Protocol。
Grap Finance Deployer外部拥有帐户(EOA)时间线
- 新的流动资金池原为 批准 用于流动性开采。
- Grap 金融部署者 EOA 沉积 通过Blacksmith.sol合约将15,255.55 BPT(DAI /基础)放入Cover上的池中。
- 大约四分钟后,资金被 撤回 在Cover上将1 Wei留在Grap Finance Deployer的EOA余额中。
- 另一个外部用户 撤回 大约在同一时间,他们的大部分余额来自Blacksmith.sol合约,这使得Grap Finance拥有了Blacksmith.sol合约DAI /基础池的全部流动资金。
- 掌握财务部署者 沉积 将15,255.55 BPT(DAI /基础)返回到池中。
- 然后抓紧财务部署者 索赔 奖励,并且由于该漏洞,铸币40,796,131,214,802,500,000.21 COVER。
- 在烧掉铸造的令牌后,Grap Finance Deployer 发送 后退以掩护说明 “下次,照顾好自己的狗屎。”
如何铸造无限代币-技术分析
背景
该漏洞利用使我们回到了Solidity编程语言的基础,该语言用于在以太坊内实现智能合约。 一旦这些合同被编译,以太坊虚拟机(EVM)将能够理解用于执行各种功能以及操纵内存和存储的指令(即操作码)。 EVM具有三个可以存储数据的区域: 内存,存储和堆栈。 了解这些区域对于了解漏洞的利用方式非常重要。
类似于计算设备上的随机存取存储器(RAM),“记忆Solidity中的”关键字为特定变量分配内存。 在这种情况下,该变量的作用域是特定功能。 一旦函数执行完毕,内存将被清除,但是如果该内存的内容在函数返回之前被推入存储,则可能会保留。
“”存储Solidity中的”关键字允许变量充当指向映射或数据结构中数据存储的指针。 存储数据在函数调用和事务之间是持久的。 在本质上,存储实际上是将256位字映射到256位字的键值存储。
请注意,EVM不是寄存器机,而是堆栈机,因此所有计算都在称为 堆栈。 堆栈的最大容量为1024个项目,但只有顶部的16个易于访问,可用于将顶部的元素与位于其下方的16个元素之一以及更多元素交换。
错误
黑客利用了Cover Protocol的Blacksmith.sol(一种屏蔽采矿合同),该合同允许利益相关者以Cover Protocol中的特定项目或池的代币(例如CLAIM和NOCLAIM代币)获得奖励。
为了更好地理解该错误,首先让我们看看公众 池 变量,它是一个映射(即数据存储):
At 行118,我们看到合同通过“ memory”关键字将池数据缓存在内存中。
然后 行121,合同将存储中的池更新为 updatePool(地址_lpToken) 功能 使用 泳池储存池 变量。
但是,如果您朝下看 存款(地址_lpToken,uint256 _amount) 功能,它使用相同的 池 来自行118的变量已被缓存到函数内的内存中,用于计算 pool.accRewardsPerToken。 此时, 池 变量是从 池 映射并保存到内存。
因此,对 池 内的变量 存款(地址_lpToken,uint256 _amount) 功能不会改变 池 由于使用“内存”关键字的变量仅在函数本身范围内,因此在合同的链上存储中进行映射。 从那里,合同更新 pool.accRewardsPerToken 字幕可视电话用于 updatePool(地址_lpToken) 函数,它使用存储。 所以现在,在 updatePool(地址_lpToken) 功能 pool.accRewardsPerToken 从技术上讲,它是一个新池,并且与 池 在记忆中。
鉴于此漏洞以及内存和存储之间的滥用, 矿工奖励注销 字幕可视电话用于 存款(地址_lpToken,uint256 _amount) 函数计算错误以及使用不正确 pool.accRewardsPerToken, 因为我们仍然在deposit函数中,该函数正在处理内存的缓存实例 池.
除了存款功能外,任何人,例如Grap Finance,在执行加密货币时都可以获得大量的铸造令牌。 ClaimRewards(地址_lpToken) 功能。 该功能用于获取奖励,最终导致通话 _claimCoverRewards(池内存池,矿工矿工) 引用了 矿工奖励注销 我们在上面强调了。 由于该变量比实际变量小得多 pool.accRewardsPerToken,该合同会产生大量令牌。
关键精华
CipherTrace希望利用此漏洞中的这一背景可以揭示对无论哪种方法进行智能合约进行彻底的安全审核和渗透测试的重要性 blockchain区块链—比特币和其他货币基础的技术 更多 选择部署到。 虽然Grap Finance归还了通过漏洞利用所获得的资金,但最初的黑客仍然能够从DeFi协议中获利超过4万美元,COVER令牌的价值此后暴跌了近99%。
资料来源:https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/