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

概述

上期我们了解了利用 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 {}}局分析

智能合约解决方案提供商Data Gumbo完成400万美元C轮融资:8月10日消息,智能合约解决方案提供商 Data Gumbo 宣布完成 400 万美元 C 轮融资,本轮融资由沙特阿美旗下 Saudi Aramco Energy Ventures 和挪威能源巨头 Equinor 旗下风投 Equinor Technology Ventures 联合领投。

据悉,Data Gumbo 首个智能合约市场目前已推出能够立即部署的 40 多个智能合约模板,参与 Data Gumbo 智能合约的企业网络已覆盖 180 多家,帮助客户及其业务网络能够安全地进行交易,从而提高运营效率、问责制、透明度和现金流确定性。[2022/8/10 12:16:28]

可以看到,上述代码中存在三个合约,我们先结合前置知识中的 A, B, C 三个角色来区分三个合约分别代表什么角色:

MoneyMaker 合约代表 A 合约;

Vault 合约代表 B 合约;

Hack 合约代表 C 合约。

所以用户以为的调用路径为:

MoneyMaker -> Vault。

而实际的调用路径为:

MoneyMaker -> Hack。

下面我们来看看攻击者如何完成局的:

1. Evil 部署 Vault(B) 合约并在合约中留存 100 ETH 资金,在链上将 Vault(B) 合约开源;

mfers创始人sartoshi宣布隐退,智能合约将移交社区:6月10日消息,mfers创始人sartoshi刚刚于mirror发文《mfers next era & end of sartoshi》,文中宣布将把mfers的智能合约通过非官方的多签地址(0x21130E908bba2d41B63fbca7caA131285b8724F8)转移给社区,自此社区将获得未来mfers版税收入的50%。

此外,sartoshi还表示将会推出个人的最后一件艺术作品《end of sartoshi》,该作品将开放12个小时的mint窗口,售价为0.069 ETH,而sartoshi本人也将在mint期间的某个时刻“永远消失”。[2022/6/10 4:15:10]

2. Evil 部署 Hack(C) 恶意合约;

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;

数据:二月份Fantom活跃地址和智能合约部署激增:3月20日,据FTM Scan的数据显示,上个月有364,874个独立地址加入了网络。与去年同期相比,这一数字增长了77.69%,去年同期仅增加了4637个独立地址。与此同时,据该基金会周四透露,该网络的智能合约执行量同比增长了4200%。数据显示,去年2月共有111个智能合约被部署,而今年2月为4677个。(Zycrypto)[2022/3/20 14:07:44]

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 转出。

声音 | SpankChain CEO:Compound 上出借 DAI 存在智能合约风险、中心化单点故障和挤提风险:SpankChain CEO Ameen Soleimani 发布博文列举了在 Compound 出借 DAI 的风险,他在文章中称,自己管理公司近 50 万 DAI,根据 DAI 10%的利息,大约每个月能产生 4000 美元的收入,如果将这些 DAI 放入 Compound 中是有机会成本的。此外,在 Compound 放贷还有很大的风险,包括智能合约的安全风险、中心化单点故障(他解释,Compound 是一个托管系统,如果管理私钥泄露,所有租借池的资产都可能被盗走)和挤提风险(资金利用率高达 98.62% 的 Compound 没有足够的资产储备保证出借人随时取回资产)。[2019/9/5]

预防建议

以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。

慢雾科技

个人专栏

阅读更多

金色荐读

金色财经 善欧巴

迪新财讯

Chainlink预言机

区块律动BlockBeats

白话区块链

金色早8点

Odaily星球日报

MarsBit

动态 | 《区块链智能合约安全审计白皮书(2018年)》发布:据中证网报道,中国信息通信研究院泰尔终端实验室、上海交通大学网络空间安全学院、上海掌御信息科技有限公司共建的区块链安全研究中心、中国区块链应用研究中心、上海淳粹文化传媒有限公司、杭州加密谷区块链科技有限公司等机构近日联合发布《区块链智能合约审计安全白皮书(2018年)》。白皮书归纳的智能合约安全漏洞目前有9大类,从数量上来看,权限控制占比最重,达到了46.97%,远高于其他类型,其他占比较高的安全漏洞有错误使用随机数、逻辑设计缺陷等类型。[2018/12/17]

Arcane Labs

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

金星链

[0:31ms0-0:829ms