2022년 5월 15일 오후 8시 20분(UTC) 경, 저희 모니터링 시스템은 FEGtoken 프로젝트의 FEGexPRO 컨트랙트가 해킹당한 것을 감지했습니다. 공격자는 ETH와 BSC 메인넷 모두에 일련의 공격을 가했으며, 프로젝트 측이 온체인으로 전송한 메시지에 따르면 총 피해 규모는 약 130만 달러에 달합니다.
@FEGtoken The paramter `path` in your FEGexPRO contract (0x818E2013dD7D9bf4547AaabF6B617c1262578bc7) should be checked in advance ! Our monitor system just reports an attack against the FEGexPRO contract, which lost its fBNB and FEG. pic.twitter.com/A4obANAMhW
— BlockSec (@BlockSecTeam) May 16, 2022
이번 사건에 대한 더 자세한 정보는 해당 프로젝트의 공식 트위터에서 확인하실 수 있습니다. 이 보고서에서는 이번 사건의 근본 원인을 밝히기 위해 세부 사항을 자세히 살펴보겠습니다.
0x1 취약점 분석: 첫 번째 시각
취약한 FEGexPRO 컨트랙트는 ETH와 BSC 모두에 배포되어 있으며,
취약한 함수는 아래와 같이 swapToSwap입니다:

소셜 미디어에서 지적된 바와 같이, swapToSwap 함수의 첫 번째 매개변수인 ***path***는 함수 호출자가 임의로 지정할 수 있습니다. 따라서 공격자는 이를 악용하여 **임의 승인(arbitrary approval)**을 수행할 수 있습니다(swapToSwap 함수의 682번째 줄 참조).
지금까지는 새로운 내용이 없으며, 검증되지 않은 매개변수로 인한 또 다른 사례처럼 보입니다. 그러나 공격 흔적을 분석해 보면, 이 공격은 단순히 임의 승인 문제로만 설명하기 어렵습니다. 사실, 여기에는 미묘한 트릭이 존재하며, 이 부분이 흥미로운 점입니다.
0x2 공격 분석
0x2.1 기초 공격 분석
BSC에서의 공격 트랜잭션 하나를 예시로 들어 공격 절차를 설명하며, fBNB 자산을 대상으로 한 공격 흔적을 간략히 요약하면 다음과 같습니다:

- 1단계: 자금 및 가짜
path준비. 공격자는 DVM에서 약 915 BNB의 플래시론을 빌리고, 그 중 일부를 116 fBNB로 스왑합니다. 그런 다음 가짜path로 사용될 여러 컨트랙트를 생성합니다. - 2단계: 초기 자금 예치. 115 fBNB를 FEGexPRO 컨트랙트에 예치함으로써, 공격자는 피해 컨트랙트 내 자신의
balances2를 증가시킵니다. - 3단계: 임의 승인 수행. 공격자는
swapToSwap함수를 호출하고 가짜path를 첫 번째 매개변수로 전달하여, FEGexPRO 컨트랙트가 해당path에 114 fBNB를 사용하도록 승인하게 합니다. - 4단계:
depositInternal함수와swapToSwap함수를 호출하여 또 다른 승인 수행. FEGexPRO 컨트랙트는 다른path에 114 fBNB를 사용하도록 승인합니다.
공격자는 더 많은 승인을 받기 위해 4단계를 반복적으로 실행합니다. 최종적으로, 공격자는 승인된 가짜 path를 이용해 FEGexPRO의 모든 fBNB를 탈취하고 일부를 BNB로 스왑하여 플래시론을 상환합니다.
분명히, 컨트랙트는 path 매개변수를 반드시 검증했어야 합니다.
그러나, 이 공격을 완전히 이해하기 위해서는 한 가지 더 다루어야 할 문제가 있습니다: FEGexPRO 컨트랙트가 가짜 path를 승인하더라도, approve 작업은 사용자의 balances2가 즉시 감소한다는 사실에 기반합니다(swapToSwap 함수의 684번째 줄 참조), 즉, 승인된 자금은 정확히 3단계에서 예치한 금액에서 나옵니다. 다시 말해, 공격자는 자신이 예치한 자금을 가짜 path에 승인하는 것입니다. 그 이후에는 balances2가 감소했기 때문에 다른 가짜 path에 대한 추가 승인을 할 수 없어야 합니다.
따라서 다음과 같은 의문이 생깁니다: 공격자가 추가 이익을 위해 다른 승인을 가능하게 한 정확한 트릭은 무엇인가?
0x2.2 심층 공격 분석
이 질문에 답하기 위해 swapToSwap 함수로 돌아가 보겠습니다.
코드를 면밀히 검토한 결과, 여기서 사용된 트릭은 가짜 path뿐만 아니라 가짜 swap도 포함되어 있으며, 이로 인해 피해 컨트랙트의 실제 잔액과 기록된 잔액 사이에 불일치가 발생합니다. 결과적으로, 이 불일치는 depositInternal 함수를 호출하여 공격자의 예치 금액을 복원함으로써 반복적으로 승인을 수행하는 데 사용될 수 있습니다.
구체적으로, depositInternal 함수는 주로 컨트랙트의 Main.balanceOf와 _totalSupply2의 차이를 기반으로 사용자의 balances2를 수정합니다(depositInternal 함수의 651번째 줄 참조).

swapToSwap에 전달된 path 주소가 공격자가 제어하는 가짜 path이므로, 실제로는 아무것도 전송되지 않습니다. 결과적으로 Main.balanceOf의 반환값은 3단계와 동일하게 유지됩니다. swapToSwap 함수에서 _totalSupply2가 감소했으므로, 공격자가 예치할 때마다 증가하는 balance2는 실제 예치 금액보다 필연적으로 커지게 됩니다.
따라서 4단계에서, 공격자는 먼저 depositInternal 함수를 호출하여 예치 금액을 복원한 다음, swapToSwap 함수를 호출하여 승인과 가짜 swap을 수행합니다.
공격자가 사용하는 예치 금액은 거의 0(즉, 1 / 1e18) fBNB에 불과하므로, depositInternal 함수는 위에서 설명한 바와 같이 공격자의 balances2를 3단계와 거의 같은 금액으로 복원합니다(이는 다음 승인의 흔적에서도 확인됩니다).

공격자는 4단계를 반복적으로 실행하여 탈취 금액을 늘릴 수 있습니다.
마지막으로, 위에서 설명한 공격은 공격자가 활용한 공격 경로 중 하나에 불과하다는 점에 주목할 필요가 있습니다. 동일한 공격 트랜잭션에서 공격자는 FEG 자산도 대상으로 삼았습니다:

0x3 근본 원인
이번 공격의 근본 원인을 다음과 같이 정리합니다:
- 첫째,
swapToSwap함수에서 검증되지 않은 매개변수로 인한 임의 승인(arbitrary approval). - 둘째,
swapToSwap함수에서의 가짜 swap으로 인해 피해 컨트랙트의 실제 잔액과 기록된 잔액 사이에 발생하는 불일치. 이는 공격자의 예치 금액을 복원함으로써 반복적으로 승인을 수행하는 데 사용됩니다.
이 두 가지를 결합하여, 공격자는 피해 컨트랙트에서 모든 자금을 성공적으로 탈취했습니다.
0x4 기타 관련 공격
이 글을 작성하는 시점에, 또 다른 공격자에 의해 더 많은 관련 공격이 발생한 것도 확인했습니다.
ROX(https://t.co/NWvSy5faY3) is not open-sourced, but something is wrong.
— BlockSec (@BlockSecTeam) May 17, 2022
Take a look at the following transaction:https://t.co/chPxcDoFOD@Mudit__Gupta
이번에도 이더리움과 BSC 모두에 배포된 컨트랙트가 공격을 받았습니다. 흥미롭게도, 공격 흔적은 앞서 논의한 것과 다릅니다. 피해 컨트랙트가 오픈소스가 아님에도 불구하고, 공격자가 유사한 공격 방법으로 동일한 취약점을 악용했을 가능성이 높다고 판단합니다.
0x5 시사점
DeFi 프로젝트를 안전하게 유지하는 것은 쉬운 일이 아닙니다. 코드 감사 외에도, 커뮤니티는 프로젝트 상태를 모니터링하는 능동적인 방법을 취해야 하며, 공격이 발생하기 전에 차단해야 한다고 생각합니다.
BlockSec 소개
BlockSec은 2021년 세계적으로 저명한 보안 전문가 그룹이 설립한 선도적인 블록체인 보안 회사입니다. 이 회사는 대중적 채택을 촉진하기 위해 새롭게 부상하는 Web3 세계의 보안과 사용성을 향상시키는 데 전념하고 있습니다. 이를 위해 BlockSec은 스마트 컨트랙트 및 EVM 체인 보안 감사 서비스, 보안 개발 및 위협을 사전에 차단하는 Phalcon 플랫폼, 자금 추적 및 조사를 위한 MetaSleuth 플랫폼, 그리고 크립토 세계에서 web3 빌더들이 효율적으로 서핑할 수 있는 MetaDock 익스텐션을 제공합니다.
현재까지 MetaMask, Uniswap Foundation, Compound, Forta, PancakeSwap 등 300개 이상의 저명한 고객사에 서비스를 제공했으며, Matrix Partners, Vitalbridge Capital, Fenbushi Capital 등 저명한 투자자들로부터 두 차례의 파이낸싱을 통해 수천만 달러를 조달했습니다.
공식 웹사이트: https://blocksec.com/
공식 트위터 계정: https://twitter.com/BlockSecTeam



