취약점 요약
Flare의 Challenger 컨트랙트는 보상 토큰을 받은 뒤 차익거래(arbitrage) 또는 수동 인출을 통해 보상을 회수합니다.
그런데 보상 토큰이 비표준 ERC20 토큰(transfer/approve가 표준 반환값을 따르지 않거나, 전송 수수료를 부과하는 토큰)일 경우,
- arbitrage 로직이 revert 되거나,
- withdrawToken() 호출이 revert 되어서, 결국 보상 토큰이 Challenger 컨트랙트 안에 영원히 잠기게 됩니다.
알아야 하는 정보
- 표준 ERC20 : transfer와 approve가 bool 값을 반환하는 구조.
- 비표준 ERC20 (Non-standard) : 일부 오래된 토큰이나 변형된 토큰은 반환값이 없거나, fee on transfer 구조(전송 수수료 차감) 때문에 기대한 수량과 실제 수량이 다름.
- Flare 시스템 내 FAssets Protocol은 safeTransfer로 토큰을 주지만, Challenger는 transfer를 그대로 쓰기 때문에 충돌이 발생함.
문제 위치
- Liquidator.sol
- FlashLender.sol
문제의 코드
1. FlashLender 상환 처리
if (fee == 0 || _flashFeeReceiver == address(0)) {
_burn(address(_receiver), _amount + fee);
} else {
_burn(address(_receiver), _amount);
_transfer(address(_receiver), _flashFeeReceiver, fee);
}