배경
2025년 6월 25일, 우리는 SiloFinance 에 대한 Ethereum의 공격을 모니터링했습니다.
https://etherscan.io/주소/0xcbee4617abf667830fe3ee7dc8d6f46380829df9
이 공격으로 총 54,600달러 의 손실이 발생했습니다.
공격 및 사고 분석
먼저, 공격자는 레버리지 포지션을 개설하는 데 사용되는 함수인 계약의 openLeveragePosition을 호출했습니다. 플래시론 메커니즘을 사용하여 레버리지 거래를 구현합니다. 그런 다음, onFlashLoan 콜백에서 _openLeverage를 실행하여 _fillQuote를 통해 플래시론 자금을 담보로 전환하는 등의 작업을 완료합니다.

관련 코드를 볼 수 있습니다.

이 중 _flashArgs.flashloadTarget은 공격자가 설정한 공격 계약이므로, 이 함수는 공격 계약의 flashloan을 호출합니다.

그러면 공격 계약이 onFlashLoan을 호출하고, 다음과 같이 관련 코드를 볼 수 있습니다.

openLeveragePosition 함수에서 _txAction이 LeverageAction.Open으로 설정되었으므로, 다음으로 _openLerverage가 호출됩니다.

그런 다음 부채 토큰을 담보 토큰으로 변환하는 데 사용되는 _fillQuote가 호출됩니다. 바로 여기에 문제가 있습니다. _fillQuote의 구현을 살펴보겠습니다.
struct SwapArgs {
address exchangeProxy; //0x160287e2d3fdcde9e91317982fc1cc01c1f94085
address sellToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address buyToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address allowanceTarget;//0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
bytes swapCallData; //0xd516418400000000000000000000000000000000000000000000000c249fdd327780000000000000000000000000000004377cfaf4b4a44bb84042218cdda4cebcf8fd6200000000000000000000000060baf994f44dd10c19c0c47cbfe6048a4ffe4860}
swapCallData인 입력 데이터를 디코딩하면 다음을 얻습니다.
0xd5164184 // borrow(uint256,address,address)
0x00000000000000000000000c249fdd3277800000 //uint256 _assets
0x04377cfaf4b4a44bb84042218cdda4cebcf8fd62 //address _recviver
0x60baf994f44dd10c19c0c47cbfe6048a4ffe4860 //address _borrower
이는 공격자가 borrow 함수를 호출했음을 의미합니다. 이후 공격자는 borrow를 통해 224 WETH를 획득하여 공격을 완료했습니다.

요약하다
이 취약점의 원인은 Silo 계약의 플래시론 콜백 함수가 수신 데이터를 검증하지 않아 공격자가 악성 데이터를 전달하고 결국 Silo에 대한 공격을 완료했기 때문입니다. 프로젝트 당사자는 경제 모델 및 코드 작동 로직을 설계할 때 다자간 검증을 수행하고, 계약이 온라인으로 전환되기 전에 감사할 때 교차 감사를 위해 여러 감사 기관을 선정하는 것이 좋습니다.
