Insecure Integer Arithmetic
Why is this important?
An overflow/underflow happens when an arithmetic operation reaches the maximum
or minimum size of a type. For instance, if a number is stored in the uint8
type, it means that the number is stored in an 8 bits unsigned number ranging
from 0 to 2^8-1. In computer programming, an integer overflow occurs when an
arithmetic operation attempts to create a numeric value that is outside of the
range that can be represented with a given number of bits – either larger
than the maximum or lower than the minimum representable value.
For Solidity contracts, this could mean that attackers could get extremely large amounts of tokens and/or manipulate other crypto-currencies as a result.
Using Integer Arithmetic Securely
Option A: Adding Arithmetic Checks
- Go through the issues that GuardRails identified in the PR.
- Add the SafeMath library to your code.
- Identify the code that looks like this:
pragma solidity 0.4.24;
contract OverflowVulnerableAndFixed {
mapping (address => uint256) public balanceOf;
// INSECURE
function transfer(address _to, uint256 _value) public {
/* Check if sender has balance */
require(balanceOf[msg.sender] >= _value);
/* Add and subtract new balances */
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}
}
- Replace it with the following pattern:
function transfer(address _to, uint256 _value) public {
/* Check if sender has balance and for overflows */
require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]);
/* Add and subtract new balances */
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}
- Test it
- Ship it 🚢 and relax 🌴
Option B: Using Safe Math Libraries
- Go through the issues that GuardRails identified in the PR.
- Add the SafeMath library to your code.
- Identify the code that looks like this:
uint256 amount = uint256(cnt) * _value;
- Use the SafeMath library like so:
using SafeMath for uint256; // use SafeMath for uint256 variables
// Change the previous line to this:
uint256 amount = uint256(cnt).mul(_value);
- Test it
- Ship it 🚢 and relax 🌴
More information:
- Smart Contract Weakness Classification (SWC 101)
- Common Weakness Enumeration (CWE-682)
- BatchOverflow - Original Post
- Batchoverflow Bug - Coin Telegraph
- Prevent Integer Overflow in Ethereum Smart Contracts
- SafeMath Library
- Smart Contract Best Practices - Integer Overflow and Underflow
- Underflow attacks smart contracts