The ERC20 core implementation contains a critical design weakness in the internal burning logic.
The _burn() function inside ERC20Internals.sol allows unrestricted destruction of user balances and total supply without any built-in authorization or safety checks.
Although _burn() is marked internal, this contract is built to be inherited. Any child contract can expose this functionality through a public or external wrapper, unintentionally or maliciously.
In addition, the function performs raw arithmetic inside inline assembly without underflow protection. This enables balance and total supply corruption if the burn amount exceeds the user’s balance or the current total supply.
Likelihood: High
The contract is designed for inheritance.
There are no internal access restrictions.
Arithmetic is performed without safety checks.
Impact: High
Arbitrary destruction of user balances.
Total supply corruption via underflow.
Permanent loss of funds
The following PoC shows how a malicious inheriting contract can expose the burn functionality publicly and destroy tokens from any address.
The test passes, confirming arbitrary burning is possible when inherited.
Enforce strict authorization and balance checks inside _burn().
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.