IOP _ ThunderNFT 34962 - [Smart Contract - Low] tranfer_from function have critical issue which lead
Submitted on Sun Sep 01 2024 21:59:24 GMT-0400 (Atlantic Standard Time) by @zeroK for IOP | ThunderNFT
Report ID: #34962
Report type: Smart Contract
Report severity: Low
Target: https://github.com/ThunderFuel/smart-contracts/tree/main/contracts-v1/pool
Impacts:
Contract fails to deliver promised returns, but doesn't lose value
Description
Brief/Intro
the function transfer_from does not prevent setting the from and to to same address which lead to money printing, this issue exist only in transfer_from function because of incorrect implementation, more in ## Vulnerability Details
Vulnerability Details
the transfer_from implemented as below:
#[storage(read, write)]
fn transfer_from(from: Identity, to: Identity, asset: AssetId, amount: u64) -> bool {
let caller = get_msg_sender_contract_or_panic();
let exchange = storage.exchange.read().unwrap();
require(caller == exchange, PoolErrors::CallerMustBeTheExchange);
_transfer(from, to, asset, amount);
true
}
#[storage(read, write)]
fn _transfer(from: Identity, to: Identity, asset: AssetId, amount: u64) {
require(
to != ZERO_IDENTITY_ADDRESS &&
to != ZERO_IDENTITY_CONTRACT,
PoolErrors::IdentityMustBeNonZero
); // no check for from at all
// @audit we get both to and from balance before update
let from_balance = _balance_of(from, asset);
let to_balance = _balance_of(to, asset);
require(from_balance >= amount, PoolErrors::AmountHigherThanBalance);
storage.balance_of.insert((from, asset), from_balance - amount);
storage.balance_of.insert((to, asset), to_balance + amount); //@audit double increase amount if to is same as from
log(Transfer {
from,
to,
asset,
amount,
});
}the scenario below can happen:
call transfer_from with to and from equal to alice.
since the balance returned before decreasing the update will be like this:
this report is insight since the transfer_from called by thunder_exchange and the issue above does not exist.
Impact Details
double increasing of user balance when from == to in transfer_from function.
References
we recommend to add check below: require(from != to, "revert double increase");
Proof of concept
Proof of Concept
check report id: 34567 for better experience:
Last updated
Was this helpful?