Back to Blog

FEG토큰 보안 사고 분석: 악마는 디테일에 있다

Code Auditing
May 18, 2022
5 min read

2022년 5월 15일 오후 8시 20분(UTC) 경, 저희 모니터링 시스템은 FEGtoken 프로젝트의 FEGexPRO 컨트랙트가 해킹당한 것을 감지했습니다. 공격자는 ETH와 BSC 메인넷 모두에 일련의 공격을 가했으며, 프로젝트 측이 온체인으로 전송한 메시지에 따르면 총 피해 규모는 약 130만 달러에 달합니다.

이번 사건에 대한 더 자세한 정보는 해당 프로젝트의 공식 트위터에서 확인하실 수 있습니다. 이 보고서에서는 이번 사건의 근본 원인을 밝히기 위해 세부 사항을 자세히 살펴보겠습니다.

0x1 취약점 분석: 첫 번째 시각

취약한 FEGexPRO 컨트랙트는 ETHBSC 모두에 배포되어 있으며, 취약한 함수는 아래와 같이 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 기타 관련 공격

이 글을 작성하는 시점에, 또 다른 공격자에 의해 더 많은 관련 공격이 발생한 것도 확인했습니다.

이번에도 이더리움과 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

Sign up for the latest updates
~$160만 손실: Moke 토큰, LpdFi 익스플로잇 | BlockSec 위클리
Security Insights

~$160만 손실: Moke 토큰, LpdFi 익스플로잇 | BlockSec 위클리

2026년 8월 3~9일, BNB 체인에서 2건의 보안 사고가 발생해 총 약 160만 달러의 손실이 발생했으며, 모두 가격 조작이 원인이었습니다. LpdFi(약 69.7만 달러)는 PancakeSwap 유동성 풀을 주문 평가와 이자 정산에 동시 사용해 공격자가 원금을 부풀리고 과도한 이자를 탈취했습니다. Moke Token(약 90.6만 달러)은 조작 가능한 현물 가격과 중복 LP 배당 회계를 결합해 MOKE를 부풀려 BNB 배당을 반복 수령했습니다.

COLDCARD 사건: 지갑의 "무작위" 시드가 무작위가 아니었을 때
Security Insights

COLDCARD 사건: 지갑의 "무작위" 시드가 무작위가 아니었을 때

COLDCARD 펌웨어의 빌드 통합 버그로 비트코인 시드 생성이 취약한 소프트웨어 RNG로 라우팅되어 지갑 시드가 오프라인 복구 가능해졌습니다. 시드 자체의 취약점이므로 펌웨어 업데이트로 해결 불가하며, 2026년 8월 7일 기준 확인된 피해는 1,405 BTC(~9,100만 달러), 비공개 추정치는 최대 2,055 BTC입니다.

~$88M 손실: COLDCARD 및 LULA 익스플로잇 | BlockSec 위클리
Security Insights

~$88M 손실: COLDCARD 및 LULA 익스플로잇 | BlockSec 위클리

2026년 7월 27일~8월 2일, 비트코인과 BNB 체인에서 약 8,800만 달러 손실을 유발한 두 건의 보안 사고가 발생했습니다. COLDCARD 사고는 하드웨어 지갑 펌웨어의 엔트로피 오류로, RNG 매크로 활성화 여부 미확인으로 결정론적 폴백이 실행되어 약 1,370 BTC(~8,800만 달러)가 탈취됐습니다. BNB 체인의 LULA 토큰은 비즈니스 로직 취약점으로 `recycle()` 함수가 악용되어 PancakeSwap V2 유동성에서 약 57만 8천 달러가 유출됐습니다.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
FEG토큰 보안 사고 분석: 악마는 디테일에 있다