Back to Blog

파시클 파이낸스 보안 사고 분석

Code Auditing
2021년 8월 4일
3 min read

2021년 8월 4일, Popsicle Finance는 공격으로 인해 막대한 금전적 손실(2천만 달러 이상)을 입었습니다 [1]. 수동 분석 결과, 이것이 이중 청구(double-claiming) 공격임을 확인하였습니다. 즉, 보상 시스템의 허점으로 인해 공격자가 반복적으로 보상을 청구할 수 있었습니다. 이하에서는 공격 트랜잭션을 사용하여 공격 과정과 취약점의 근본 원인을 설명합니다.

배경

Popsicle Finance는 이더리움, BSC 등 다양한 체인을 위한 여러 볼트를 지원하는 수익 최적화 플랫폼입니다.

구체적으로, 사용자는 먼저 deposit 함수를 호출하여 유동성을 제공하고, Popsicle LP 토큰(PLP)을 받습니다. 그 후 Popsicle Finance는 사용자를 위해 수익을 창출하고자 유동성을 관리합니다(Uniswap과 같은 플랫폼과 상호작용). 사용자는 withdraw 함수를 호출하여 Popsicle Finance로부터 유동성을 돌려받을 수 있으며, 이 때 PLP 토큰을 기반으로 금액이 계산됩니다. 인센티브 보상은 유동성에서 발생하며, 시간이 지남에 따라 누적됩니다. 사용자는 collectFees 함수를 호출하여 보상을 청구할 수 있으며, 이것이 이번 공격의 핵심입니다.

취약점 분석

collectFees 함수에서는 사용자에 대한 token0Reward와 token1Reward(해당 LP 토큰 쌍의 보상)가 계산됩니다. 전체 계산 로직은 간단합니다. 그러나 이 함수는 updateVault라는 modifier를 사용하며, 이는 보상을 적절히 업데이트하는 데 사용됩니다.

요약하면, updateVault는 다음을 수행합니다:

  1. 먼저 _earnFees 함수를 호출하여 풀에서 누적된 수수료를 가져옵니다;
  2. 그 다음 _tokenPerShare 함수를 호출하여 token0PerShareStored와 token1PerShareStored를 업데이트합니다. 이는 각 지분에 대한 풀의 token0 및 token1 수량을 나타냅니다;
  3. 마지막으로 _fee0Earned와 _fee1Earned 함수를 호출하여 사용자의 보상(즉, 각각 token0Rewards와 token1Rewards)을 업데이트합니다.

_fee0Earned와 _fee1Earned 함수는 동일한 로직을 공유하며, 다음 공식을 구현합니다(token0을 예시로 사용):

user.token0Rewards += PLP.balanceOf(account) * (fee0PerShare - user.token0PerSharePaid) / 1e18

계산이 증분 방식임을 유의하십시오. 즉, 사용자가 PLP 토큰을 보유하지 않더라도 계산된 보상은 token0Rewards에 저장된 값을 유지합니다.

따라서 다음 두 가지 사실을 도출할 수 있습니다:

  1. 사용자의 보상은 token0Rewards와 token1Rewards에 저장되며, 이는 어떠한 PLP 토큰과도 연관되지 않습니다;
  2. collectFees 함수는 오직 token0Rewards와 token1Rewards의 상태에만 의존하므로, PLP 토큰을 보유하지 않아도 보상을 인출할 수 있습니다.

실제 상황에 비유하자면, 사용자가 은행에 돈을 예금하고 은행이 예금 증서를 발급하는 경우와 같습니다. 안타깝게도 이 증서는 위조 방지 기능도 없고, 사용자와 연결되어 있지도 않습니다. 이러한 경우, 증서를 복제하여 다른 사람들에게 배포함으로써 은행으로부터 이익을 취하는 것이 가능합니다.

공격 흐름

간략히 말하면, 공격자는 다음 단계를 통해 공격을 감행했습니다:

  1. 세 개의 컨트랙트를 생성했습니다. 그 중 하나는 공격 실행에 사용되었고, 나머지 두 개는 collectFees 함수를 호출하여 보상을 가져오는 데 사용되었습니다;
  2. 플래시 론(Flash Loan)을 활용하여 AAVE로부터 대량의 유동성을 차용했습니다;
  3. 입금-출금-수수료 청구(Deposit-Withdraw-CollectFees) 사이클을 실행하여 공격을 수행했습니다(총 8번의 사이클이 있었으며, Popsicle Finance의 여러 볼트에서 대량의 유동성이 인출되었습니다);
  4. 플래시 론을 AAVE에 상환하고, Tornado.Cash를 통해 수익을 세탁했습니다.

구체적으로, 입금-출금-수수료 청구(Deposit-Withdraw-CollectFees) 사이클은 여러 단계로 구성되어 있으며, 저희 온라인 도구 [2]를 사용하여 쉽게 레이블링하고 명확하게 요약할 수 있습니다:

수익 분석

공격자는 Popsicle Finance로부터 총 2천만 달러를 탈취했으며, 여기에는 2,560 WETH, 96.2 WBTC, 160K DAI, 539만 USDC, 498만 USDT, 10,500 UNI가 포함됩니다. 공격 후, 공격자는 Uniswap과 WETH를 통해 나머지 토큰을 모두 ETH로 교환한 후, Tornado.Cash를 이용하여 자금 세탁을 진행했습니다.

크레딧

Yufeng Hu, Ziling Lin, Junjie Fei, Lei Wu, Yajin Zhou @BlockSec

(성(last name) 기준 알파벳 순)

https://www.blocksecteam.com

Medium: https://blocksecteam.medium.com/

Twitter: https://twitter.com/BlockSecTeam

Contact: [email protected]

참고문헌

[1] https://twitter.com/defiprime/status/1422708265423556611

[2] https://tx.blocksecteam.com/

Sign up for the latest updates
약 557만 USD 손실: X100 Freezer·NEM 공격 | BlockSec 주간 보고서
Security Insights

약 557만 USD 손실: X100 Freezer·NEM 공격 | BlockSec 주간 보고서

이 주간 보고서는 2026년 10월 19일–2026년 10월 25일에 Ethereum과 BNB Chain에서 발생한 보안 사고 두 건을 다룹니다. 플래시론으로 자금을 조달해 X100 Freezer의 거버넌스를 장악한 사건과 BNB Chain의 NEM 토큰 유동성 풀에 영향을 미친 세금 정산 결함을 살펴봅니다. 보고서 범위에 포함된 추정 손실액은 X100의 대표 거래에서 발생한 약 475만 USD와 NEM 풀 사고에서 발생한 약 82.0만 USD를 합쳐 총 약 557만 USD입니다. 이 총액에는 별도로 보고된 후속 X100 자금 유출액은 포함되지 않습니다.

Autheo Network·UNCX 해킹으로 약 387만 USD 손실 | BlockSec 주간 소식
Security Insights

Autheo Network·UNCX 해킹으로 약 387만 USD 손실 | BlockSec 주간 소식

이 주간 보고서는 2026년 10월 12일–2026년 10월 18일 기간에 발생한 보안 사고 3건을 다루며, 총 추정 손실액은 약 387만 USD입니다. Autheo Network에서는 개인 키 침해로 약 176만 USD의 손실이 발생했고, Qubic Wallet에서는 취약한 시드 생성으로 약 130만 USD의 손실이 발생했습니다. UNCX Network의 Smart Token Vesting V2 계약에서는 Ethereum, BNB Chain, Base, Robinhood Chain에 걸쳐 약 80.7만 USD의 손실을 초래한 회계 오류가 발생했습니다. 중점적으로 다룬 UNCX 분석에서는 잘못된 지분 합산 계산이 서로 다른 토큰 대 지분 비율로 생성된 베스팅 트랜치를 혼합해 공유 풀에서 초과 인출을 가능하게 한 과정을 설명합니다.

약 54만 2천 달러 손실: MakerDaoBot 공격 | BlockSec 주간 소식
Security Insights

약 54만 2천 달러 손실: MakerDaoBot 공격 | BlockSec 주간 소식

2026/10/05~10/11 이더리움 보안 사고 1건의 추정 손실은 약 54.2만 달러입니다. 공격 컨트랙트가 악성 어댑터를 접근 제어가 없는 MakerDaoBot 함수에 전달하자 봇이 내부 MakerDAO 잔액 권한을 부여했습니다. 어댑터는 기존 ETH-A 경매 4건을 정산하고 담보 200 ETH-A를 WETH로 전환했습니다. 공격 컨트랙트는 이를 언래핑해 공격자에게 200 ETH를 보냈습니다.

Best Security Auditor for Web3

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

BlockSec Audit
파시클 파이낸스 보안 사고 분석