Flare의 Challenger 컨트랙트에는 runArbitrageWithCustomParams()라는 함수가 있습니다.
이 함수는 차익거래를 실행하기 위해 설계된 것인데, public하고, 내부에서 사용하는 파라미터(_agentVault, _flashLender, _blazeSwapRouter, _to)에 대한 검증이 전혀 없습니다.
공격자는 이 점을 이용해 가짜 컨트랙트(FakeVault)를 넣고 호출하여:
function runArbitrageWithCustomParams(
address _agentVault,
IERC3156FlashLender _flashLender,
IBlazeSwapRouter _blazeSwapRouter,
address _to
) public {
// 청산 시작
IIAssetManager _assetManager =
IIAgentVault(_agentVault).assetManager();
_assetManager.startLiquidation(address(_agentVault));
// 차익거래 데이터 준비
Ecosystem.Data memory _data = Ecosystem.getData(
_agentVault,
address(_blazeSwapRouter),
address(_flashLender)
);
_runArbitrageWithData(_data);
// 수익 전송
uint256 earnings =
IERC20(_data.vaultToken).balanceOf(address(this));
IERC20(_data.vaultToken).transfer(_to, earnings);
}