Solidity智能合约审计



我有一个像这样的稳健代码要审计

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// Allow to split the balance through complex rules
interface Split{
function getAddressAndAmountToSplit() view external returns(address, uint);
}
// MyBank contract
// This contract allows anyone to store any ERC20 tokens
contract MyBank {
// (token => user => amount)
mapping (address => mapping(address => uint)) public userBalance;
// (address => Split contract)
mapping (address => Split) splits;
// Deposit ERC20 tokens to the contracts
// The user must approve the bank before calling addToBalance
function addToBalance(IERC20 token, uint amount) external {
token.transferFrom(msg.sender, address(this), amount);
userBalance[address(token)][msg.sender] += amount;
}
// Withdraw part of the balance
function withdrawBalance(IERC20 token) external {
token.transfer(msg.sender, userBalance[address(token)][msg.sender]);
userBalance[address(token)][msg.sender] = 0;
}
// Allow to register a split contract
function registerSplit(Split split) external {
splits[msg.sender] = split;
}
// Split the balance into two accounts
// The usage of a Split contract allows to create complex split strategies
function splitBalance(IERC20 token) external {
Split split = splits[msg.sender];
require(split != Split(address(0x0)));
uint balance = userBalance[address(token)][msg.sender];
(address dest, uint amount) = Split(split).getAddressAndAmountToSplit();
userBalance[address(token)][dest] = amount;
userBalance[address(token)][msg.sender] = balance - amount;
}
}

我发现了什么。

  1. 函数withdrawBalance(IERC20令牌(外部可能的重入攻击,因为我们最终会检查余额
  2. 函数splitBalance(IERC20令牌(外部-易受攻击的业务逻辑,因为如果金额大于余额,我们会得到负值,并可能出现整数溢出

如果您知道上述代码可能存在的漏洞,请随时为提供任何进一步的帮助

可能有点晚了,但如果有人读到这篇文章,我认为这些不是漏洞。首先,这里不可能有重入攻击,因为传递函数只转发2300个气体,这不足以执行有意义的事情。

其次,如果余额大于金额,则可以添加一张活期支票。但由于合约使用的编译器版本高于或等于0.8.0,若数量确实大于余额,则会由于下溢而自动恢复。

我认为作为一个聪明的合同审计员,你应该更了解这些。

最新更新