code4rena-2022-04-axelar-m04
[M-04] Unsupported fee-on-transfer tokens
Summary
fee-on-transfer 토큰을 고려하지 않았다. 출발지 체인에 실제로 예치된 토큰보다 많은 양의 토큰을 목적지 체인에서 받을 수 있다.
Keyword
fee-on-transfer token, erc20
Vulnerability
출발지 체인에서 토큰을 이동할 시, 외부 토큰을 이용한다면 유저의 토큰을 transferFrom으로 게이트웨이에 예치한다.
fee-on-transfer 토큰은 transfer 할 때 수수료를 뗀다. 따라서 실제로 게이트웨이에 예치되는 토큰은 요청한 것보다 적어진다.
function _burnTokenFrom(
address sender,
string memory symbol,
uint256 amount
) internal {
address tokenAddress = tokenAddresses(symbol);
if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);
if (amount == 0) revert InvalidAmount();
TokenType tokenType = _getTokenType(symbol);
bool burnSuccess;
if (tokenType == TokenType.External) {
_checkTokenStatus(symbol);
burnSuccess = _callERC20Token(
tokenAddress,
abi.encodeWithSelector(IERC20.transferFrom.selector, sender, address(this), amount)
);
if (!burnSuccess) revert BurnFailed(symbol);
return;
}
...
}Impact
실제로 예치된 토큰보다 많은 토큰을 목적지 체인에서 받을 수 있다.
Mitigation
목적지 체인에서 토큰을 보내줄 때, 수수료를 제한 만큼(실제로 예치된 만큼) 보낸다.
tags: bughunting, axelar, smart contract, solidity, erc20, fee-on-transfer token, severity medium