智能合约中的重入攻击_ENS:DAO

智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由NickSzabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。

漏洞概述:

因为以太坊智能合约中是可以调用外部的合约代码,外部合约可能是攻击者构造的恶意不安全的合约代码,当在转账操作时执行代码,迫使攻击的合约回调包括自身的代码,和绕过源代码的限制发生了重入攻击事件。

发生重入攻击漏洞有两个原因:

1.?调用了外面不安全的合约代码

DeFi借贷协议Sentiment:鉴于Vyper最近披露漏洞,暂停协议运行:7月31日消息,DeFi借贷协议Sentiment发推称,鉴于Curve和Vyper团队最近披露的漏洞,作为预防风险措施暂停了协议运行。

据此前报道,Sentiment于四月遭受黑客攻击,后黑客归还了88万美元,保留9.6万美元。[2023/7/31 16:09:39]

2.?外部合约的函数早于状态变量的修改

以美元计价的比特币闪电网络容量创下年内新高:金色财经报道,根据The Block数据显示,以美元计价的比特币闪电网络容量已超过1.72亿美元,创下年内新高。此外,以BTC计价的比特币闪电网络容量于今年四月突破5630历史高点,不过目前出现回落,本文撰写时降至5439.82 BTC。(U.today)[2023/6/27 22:01:37]

漏洞分析:

看withdraw函数,我们可以看到它接收了一个_amount参数,将其与发送者的balance进行比较,不超过发送者的balance就将这些_amount发送给sender,同时我们注意到这里它用来发送ether的函数是call.value,发送完成后,它才在下面更新了sender的balances,这里就是可重入攻击的关键所在了,因为该函数在发送ether后才更新余额,所以我们可以想办法让它卡在call.value这里不断给我们发送ether,同样利用的是我们熟悉的fallback函数来实现。

Vitalik:可以对ENS域名年费进行投标,增加ENS DAO收入:金色财经消息,以太坊创始人Vitalik Buterin(V神)在其个人网站发表文章,讨论ENS域名是否应该引入基于需求的注册常态费用。V神表示,如今的ENS域名注册常态费用非常便宜,由此引发了产权强度和公平性之间的权衡问题,而且ENS二级市场的高度投机性也无法确保市场的有效性。因此,V神提出可考虑为ENS域名引入基于需求的维护费用,对于ENS域名年费进行投标,从而以市场化方式对高需求的ENS域名进行定价。这一方法可提高域名抢注成本,同时可为ENS DAO增加收入。[2022/9/9 13:19:05]

比特币矿商Greenidge Generation Holdings第二季度收入3130万美元,低于分析师预期:金色财经报道,据FactSet数据显示,比特币矿商Greenidge Generation Holdings(GREE)报告第二季度收入为3130万美元,低于分析师预期的3400万美元。该公司还报告了本季度GAAP净亏损1.079亿美元,其中包括9820万美元的特殊项目。Greenidge在2022年第二季度生产了约621枚比特币,而2021年第二季度为315枚,截至2022年6月30日,Greenidge拥有约27,500台矿机,总产能约为2.5EH/s。

Greenidge Generation Holdings首席执行官JeffKirt在新闻稿中表示,第二季度比特币价格下跌约60%,加上全球能源价格飙升,呈现出“具有挑战性的盈利环境”。根据Kirt的说法,Greenidge现在计划暂停新矿区的开发,转而专注于其在南卡罗来纳州和纽约的两个现有矿场。[2022/8/16 12:27:35]

当然,这里还有另外一个关键的地方——call.value函数特性,当我们使用call.value()来调用代码时,执行的代码会被赋予账户所有可用的gas,这样就能保证我们的fallback函数能被顺利执行,对应的,如果我们使用transfer和send函数来发送时,代码可用的gas仅有2300而已,这点gas可能仅仅只够捕获一个event,所以也将无法进行可重入攻击,因为send本来就是transfer的底层实现,所以他两性质也差不多。

2016年6月以太币组织TheDAO被攻击,攻击者利用两个代码漏洞创建子合约提取了360万个以太币。接下来我们简单说一下这个事件

攻击者利用the?DAO函数智能合约中splitDAO()函数,重复对DAO资产进行重入攻击,不断从项目的资产里面分离出DAO资产并转移到自己的账户中

1.?创建钱包,调用splitDAO函数

2.?创建一个分割提案到一个新的钱包地址

3.?等待再调用splitDAO函数

4.?成功获取了ether

?解决方法:

1.?使用其他转账函数

进行以太坊转账时发送给外部地址时使用Solidity的内置函数,这将不足以调用另一份合约.

2.?先修改状态变量

这种方式就是确保状态变量的修改要早于转账操作,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions)。

1.?使用互斥锁

互斥锁就是添加一个在代码执行过程中锁定合约的状态变量以防止重入攻击。

2.?使用OpenZeppelin官方库

OpenZeppelin官方库中有一个专门针对重入攻击的安全合约

??本文作者:权星实验室团队

来源:金色财经

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

TRX什么时段以太坊Gas费最低?_GAS:DAP

什么时候以太坊gas费最低,什么时候是在以太坊上交易的最佳时机?作为NFT热衷者、DeFi投资者或交易者、以太坊上项目方,如何支付尽可能低的gas费?如果你想省钱,以下内容不要错过.

[0:15ms0-1:728ms