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