概述
上期我们了解了利用 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 {}}局分析
马克·库班:坚持投资加密货币是因为相信智能合约:11月14日消息,NBA达拉斯独行侠队老板、亿万富翁马克·库班发文称,他坚持投资加密货币是因为相信智能合约。马克·库班补充称,从第一天开始,我就说过,智能合约将对创建有价值的应用程序产生重大影响,代币的价值来源于在其平台上运行的应用程序和平台创建的实用程序。现在,这些实用程序还没有出来,但其实每个人都会需要。[2022/11/14 13:03:47]
可以看到,上述代码中存在三个合约,我们先结合前置知识中的 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) 恶意合约;
3. Evil 放出消息说他将会部署一个开源的赚钱 MoneyMaker(A) 合约,部署时会将 Vault(B) 合约地址传入且会调用 Vault.setMacker() 将 maker 角色设置为 MoneyMaker 合约地址,任何人调用 MoneyMaker.makeMoney() 向合约中打入不少于一个以太都会得到双倍以太的回报;
V神:DeFi用户低估了智能合约的风险:在最近的播客节目中,以太坊创始人Vitalik Buterin称,“DeFi还不错,但不是一个应该倡导很多普通人把毕生积蓄投入其中的地方。我认为一个重要的问题是,很多人低估了智能合约的风险。它的利率比传统银行账户的利率要高很多,这意味着DeFi产品的风险也要大得多,“崩溃”的几率也要高得多。”(Cointelegraph)[2020/7/29]
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!"。
咋回事呢?其实这个局非常简单但是很常见。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 转出。
公告 | 币安已升级Augur智能合约地址 充提服务现已恢复:币安发布公告宣布Augur智能合约地址升级成功,充值和提现服务现已恢复。目前的智能合约地址为0x1985365e9f78359a9B6AD760e32412f4a445E862。[2018/7/10]
预防建议
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。
慢雾科技
个人专栏
阅读更多
金色荐读
金色财经 善欧巴
迪新财讯
Chainlink预言机
区块律动BlockBeats
白话区块链
金色早8点
Odaily星球日报
MarsBit
Arcane Labs
英特尔与Enigma合作 确保其隐私智能合约安全:据coindesk消息,英特尔正与区块链创业公司Enigma合作,帮助确保其隐私增强型智能合约的安全。Enigma的协议将集成智能合约技术及英特尔系统。[2018/6/21]
ADA发布智能合约测试网 涨幅近10%:Cardano(ADA)官方发布消息,IOHK已经发布ADA第一个智能合约测试网——KEVM 测试网。受此利好消息影响,ADA自今日10点起开始大幅上涨,市场普跌时依然保持涨幅势头,行情显示,ADA全球均价0.199美元,涨幅9.43%。[2018/5/30]
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。