BSP:智能合约安全审计入门篇 —— 移花接木

概述

上期我们了解了利用 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]

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

地球链

[0:0ms0-0:808ms