Back to Blog

주간 Web3 보안 사고 요약 | 2026년 3월 23일 – 3월 29일

Code Auditing
April 2, 2026
17 min read

지난 한 주(2026/03/23 - 2026/03/29) 동안 BlockSec은 8건의 공격 사건을 탐지 및 분석했으며, 총 추정 손실액은 약 $1.53M입니다. 아래 표는 이러한 사건들을 요약한 것이며, 각 사례에 대한 상세 분석은 이후 소절에서 제공됩니다.

날짜 사건 유형 추정 손실
2026/03/23 미상 사건 1 정수 오버플로우 ~$97K
2026/03/23 미상 사건 2 재진입 공격 ~$11K
2026/03/23 Cyrus Finance 사건 비즈니스 로직 결함 ~$512K
2026/03/23 BCE 토큰 사건 토큰 설계 결함 ~$679K
2026/03/25 미상 사건 3 회계 오류 ~$1.2K
2026/03/25 MYX 사건 비즈니스 로직 결함 ~$3.6K
2026/03/26 미상 사건 4 토큰 설계 결함 ~$133.5K
2026/03/27 EST 토큰 사건 토큰 설계 결함 &
스팟 가격 의존성
~$92.3K

Web3 최고의 보안 감사 기관

출시 전 설계, 코드, 비즈니스 로직을 검증하세요


1. 미상 사건 1

간략 요약

2026년 3월 23일, 이더리움 상의 미검증 컨트랙트가 배분 로직의 정수 오버플로우로 인해 약 $97K의 피해를 입었습니다. 함수 0x317de4f6()은 오버플로우 방지 없이 사용자가 제어하는 토큰 금액을 합산하여, 공격자가 래핑어라운드를 유발하고 단 1 wei의 USDT만 지불하여 claim() 함수를 통해 컨트랙트의 전체 USDT 잔액을 출금할 수 있게 했습니다.

취약점 분석

근본 원인은 컨트랙트 0xF0a105...568C97의 함수 0x317de4f6()에서 발생한 정수 오버플로우입니다. 이 함수는 레코드 배열(각각 계정과 금액 포함)을 인수로 받아 배열을 순회하면서 모든 금액을 totalAmount에 합산합니다. 누적 과정에서 오버플로우 검사가 없었기 때문에, 공격자는 금액이 uint256을 래핑어라운드하도록 조작된 레코드를 제공하여 totalAmount를 임의로 작게 만들면서 개별 할당량은 크게 유지할 수 있었습니다.

공격 분석

다음 분석은 트랜잭션 0x73bd1384...630b053을 기반으로 합니다.

  • 1단계: 공격자는 공격의 초기 자본으로 Uniswap V4에서 1 wei의 USDT를 가져왔습니다.

  • 2단계: 공격자는 피해 컨트랙트의 USDT 잔액을 조회한 후, 조작된 배열로 0x317de4f6()을 호출했습니다. 하나의 금액은 uint256 상한값 근처로 설정되었고, 다른 하나는 피해 컨트랙트의 USDT 잔액으로 설정되었습니다. 두 값의 합이 1로 오버플로우되어, 공격자는 피해자의 전체 USDT 잔액에 해당하는 할당량을 기록하면서 단 1 wei의 USDT만 지불할 수 있었습니다.

  • 3단계: 공격자는 claim()을 호출하여 피해 컨트랙트에서 97,812e6 USDT를 출금했습니다.

  • 4단계: 공격자는 Uniswap V4에서 빌린 1 wei USDT를 상환하고 나머지 USDTWETH로 교환하여 공격을 완료했습니다.

결론

이 사건은 Solidity 0.8.0 이전 버전에서 검사되지 않은 산술 연산을 사용할 때의 위험성을 강조합니다. 모든 중요한 금융 계산은 래핑어라운드 문제를 방지하기 위해 오버플로우 안전 산술(예: SafeMath 또는 Solidity >=0.8.x)을 명시적으로 사용해야 합니다.


Phalcon Explorer 시작하기

트랜잭션을 심층 분석하여 현명하게 행동하세요

지금 무료로 체험하기

2. 미상 사건 2

간략 요약

2026년 3월 23일, 이더리움 상의 미검증 컨트랙트가 재진입 취약점으로 인해 약 $11K의 피해를 입었습니다. 함수 0xbe16634e()는 결제 전에 유동성 관련 회계를 업데이트하고 재진입 방지 없이 외부 콜백을 호출했습니다. 공격자는 이전 호출이 결제되기 전에 함수를 반복적으로 재진입하여 기록된 유동성을 부풀리고, 나중에 실제로 예치한 것보다 더 많은 USDCWETH를 출금했습니다.

취약점 분석

근본 원인은 컨트랙트 0x39Ed37...9C6b08의 함수 0xbe16634e()에서 발생한 재진입 문제입니다. 이 함수는 결제 전에 사용자 유동성 및 틱 리저브를 포함한 유동성 관련 상태를 업데이트하고, 재진입 방지 장치 없이 msg.sender.call()을 통해 외부 콜백을 호출합니다. 잔액 확인이 호출별로 수행되기 때문에, 공격자는 함수를 재귀적으로 재진입하여 내부 유동성 회계를 부풀릴 수 있으며, 가장 깊은 호출에서의 단일 토큰 전송만으로도 중첩 실행 흐름을 충족시킬 수 있습니다.

공격 분석

다음 분석은 트랜잭션 0x1382e898...fad993을 기반으로 합니다.

  • 1단계: 공격자는 공격의 초기 자본으로 Uniswap V4에서 100e8 USDC와 10e18 WETH를 가져왔습니다.

  • 2단계: 공격자는 0xbe16634e()를 호출하여 유동성을 추가했습니다. 실행 중에 피해 컨트랙트가 공격자의 함수 0x7c65be42()를 호출했고, 이전 호출이 결제되기 전에 0xbe16634e()로 재진입했습니다.

  • 3단계: 이 재진입 흐름을 여러 번 반복함으로써, 공격자는 기록된 유동성을 지속적으로 증가시켰습니다. 가장 깊은 호출에서 공격자는 필요한 토큰을 한 번만 전송했으며, 이것으로 중첩된 잔액 확인을 충족시키기에 충분했습니다.

  • 4단계: 기록된 유동성을 부풀린 후, 공격자는 풀 상태를 확인하고 다가오는 출금을 커버할 수 있을 만큼의 USDCWETH를 풀에 추가 자금으로 이체했습니다.

  • 5단계: 공격자는 0xbe16634e()를 다시 호출하여 유동성을 제거하고, 부풀려진 회계를 기반으로 풀에서 USDCWETH를 출금했습니다.

  • 6단계: 공격자는 Uniswap V4를 상환하고, 나머지 USDCWETH로 교환하여 공격을 완료했습니다.

결론

이 사건은 결제 전에 유동성 회계를 업데이트하면서 보호되지 않은 외부 콜백을 호출하는 것의 위험성을 보여줍니다. 유사한 공격을 방지하기 위해, 프로토콜은 checks-effects-interactions 패턴을 엄격히 따르고 재진입 방지 장치로 외부 콜백을 보호해야 합니다.


3. Cyrus Finance 사건

간략 요약

2026년 3월 23일, BNB 체인의 수익 농사 프로토콜인 Cyrus Finance가 풀의 현재 스팟 가격에 의존하는 결함 있는 유동성 제거 공식으로 인해 약 $512K의 피해를 입었습니다. 이 프로토콜은 CYRP NFT 포지션을 사용하여 PancakeSwap V3 유동성의 비례 지분을 나타내지만, 사용자 지분에서 기초 유동성으로의 변환 시 동일 트랜잭션 내에서 조작 가능한 slot0()을 읽습니다. 공격자는 플래시 론으로 조달한 스왑을 통해 가격을 이동시켜 NFT 포지션의 유동성 가치를 부풀리고 정당한 권리보다 더 많이 출금했습니다.

배경

Cyrus Finance는 BNB 체인에서 PancakeSwap V3 풀의 유동성 포지션을 관리하는 수익 농사 프로토콜입니다. 사용자는 USDT를 예치하여 CYRP NFT 포지션을 받으며, 이는 여러 PancakeSwap V3 포지션에 걸친 프로토콜 유동성의 지분을 나타냅니다. 사용자는 exit() 함수를 통해 원금과 보상을 출금할 수 있습니다.

취약점 분석

취약점은 CyrusTreasury(0xb042Ea...0aE10b)의 withdrawUSDTFromAny() 함수에 있습니다. 출금을 처리할 때, 이 함수는 PancakeSwap V3 풀의 slot0()(즉, 현재 스팟 가격)에서 sqrtPriceX96을 가져와 getAmountsForLiquidity()에 전달하여 프로토콜의 전체 포지션 유동성이 현재 나타내는 amount0 / amount1을 추정합니다.

그런 다음 해당 스팟 가격 기반 평가에서 availableUSDT를 도출하고 다음 공식을 사용하여 요청된 출금에 대해 제거해야 할 유동성을 결정합니다:

liquidityToUse=liquidityremaining/availableUSDTliquidityToUse = liquidity \cdot remaining / availableUSDT

즉, 컨트랙트는 고정된 소유권 지분을 직접 상환하지 않습니다. 대신 먼저 현재 풀 가격을 사용하여 포지션의 현재 USDT 등가 가치를 추정한 다음, 요청된 USDT 금액을 비례적인 유동성 금액으로 다시 변환합니다.

이는 slot0()이 동일 트랜잭션 내에서 조작 가능하기 때문에 안전하지 않습니다. 풀 가격을 일시적으로 이동시킴으로써, 공격자는 availableUSDT를 왜곡할 수 있으며, 이는 계산된 liquidityToUse에 직접 영향을 미칩니다.

공격 분석

다음 분석은 트랜잭션 0x85ac5d15...46d452를 기반으로 합니다.

  • 1단계: 공격자는 PancakeSwap V3 풀에서 플래시 론을 시작하여 약 1,798 ETH를 빌렸습니다.

  • 2단계: 공격자는 프로토콜이 유동성을 유지하는 대상 풀에서 대규모 ETH-USDT 스왑을 실행하여 의도적으로 풀 가격과 현재 틱을 이동시켰습니다. 동시에, 공격자는 safeTransferFrom()을 통해 0x01737d...6ffa3에서 공격 컨트랙트로 CYRP NFT 포지션 #15505를 이체했습니다.

  • 3단계: 공격자는 CyrusTreasury에서 exit(15505)를 호출했습니다. 실행 중에 withdrawUSDTFromAny()는 PancakeSwap V3 풀에서 slot0()을 읽고 조작된 스팟 가격을 기반으로 availableUSDT를 계산했습니다. 왜곡된 틱으로 인해, 프로토콜은 NFT 지분에 해당하는 유동성 가치를 과대평가했습니다. 그런 다음 decreaseLiquidity()collect()를 호출하여 Cyrus 포지션의 공정 가치를 초과하는 USDT를 방출했습니다.

  • 4단계: 공격자는 풀 상태를 복원하고, 플래시 론을 상환하고, 나머지 수익(~$512K)을 EOA 0xf96EB1...3b63b로 이체했습니다.

결론

완화 방법으로는 스팟 slot0() 가격을 조작 저항적인 가격 책정(충분한 관찰 윈도우의 TWAP 또는 Chainlink와 같은 외부 오라클)으로 대체한 후 유동성을 출금 가능한 USDT로 변환해야 합니다.


4. BCE 토큰 사건

간략 요약

2026년 3월 23일, BNB 체인의 PancakeSwap BCE-USDT 풀이 BCE 토큰의 결함 있는 소각 메커니즘으로 인해 약 $679K의 피해를 입었습니다. 공격자는 두 개의 악성 컨트랙트를 배포하여 BCE의 매수/매도 한도를 우회하고, 유동성 풀 리저브에 대한 토큰 소각을 유발하여 풀 가격을 조작하고 USDT를 탈취했습니다.

취약점 분석

취약점은 BCE 토큰(0xcdb189...999999)의 결함 있는 소각 메커니즘에서 비롯됩니다. 핵심 문제는 사용자가 영향을 미칠 수 있는 상태 변수 scheduledDestruction이 사용자 자신의 잔액이 아닌 PancakeSwap 페어 주소에서 직접 토큰을 소각하는 데 사용된다는 것입니다. 매도 작업 중에 컨트랙트는 거래량과 현재 풀 리저브를 기반으로 scheduledDestruction에 파괴 금액을 누적합니다. 이 값은 판매자에게서 차감되지 않습니다. 대신, 나중에 페어에서 토큰을 소각하고 sync()를 호출하는 별도의 코드 경로를 통해 실행됩니다.

공격자는 거래량을 제어하고 풀 리저브를 조작할 수 있으므로, scheduledDestruction을 임의 값으로 설정하고 페어의 BCE 리저브를 압축하는 소각을 유발하여 자신에게 유리하게 풀 가격을 왜곡할 수 있습니다.

공격 분석

다음 분석은 트랜잭션 0x85ac5d15...46d452를 기반으로 합니다.

  • 1단계: 공격자는 악성 컨트랙트(MC1)를 호출하여 여러 플래시 론과 렌딩 풀을 통해 1억 2,350만 USDT를 빌렸습니다.

  • 2단계: 공격자는 두 번째 악성 컨트랙트(MC2)를 배포하고 빌린 모든 USDT를 MC2로 이체했습니다.

  • 3단계: 공격자는 (MC2를 통해) BCE-USDT 풀에서 222만 2천 USDT를 552만 9천 BCE로 교환했습니다.

  • 4단계: 공격자는 MC2에서 MC1으로 552만 9천 BCE를 이체했습니다(MC1.drain()을 통해). 소각 메커니즘으로 인해 MC1은 276만 4천 BCE를 받았습니다.

  • 5단계: 공격자는 (MC1을 통해) 248만 8천 BCE를 136만 8천 USDT로 교환했으며, 풀 리저브와 스왑 금액을 기반으로 변수 scheduledDestruction을 약 17만 4천으로 업데이트했습니다. 이 변수는 나중에 소각 금액으로 사용되었습니다.

  • 6단계: 공격자는 (MC2를 통해) 3,490만 USDT를 348만 4천 BCE로 교환하여 BCE 리저브를 약 17만 4천에 가깝게 추가로 조작했습니다.

  • 7단계: 공격자는 MC2에서 MC1으로 348만 4천 BCE와 나머지 USDT를 이체했습니다. scheduledDestruction이 0보다 컸기 때문에(즉, 약 17만 4천), BCE 이체가 소각을 유발하여 BCE 리저브가 약 10,000으로 압축되었습니다.

  • 8단계: 공격자는 나머지 BCE를 조작된 가격에 USDT로 교환했습니다.

  • 9단계: 공격자는 모든 대출을 상환하고 약 $679K의 수익을 얻었습니다.

결론

이 사건은 사용자가 영향을 미칠 수 있는 상태 변수가 사용자 자신의 잔액 대신 유동성 풀의 잔액을 수정하는 데 사용된 토큰 경제 로직의 근본적인 결함으로 인해 발생했습니다. 컨트랙트는 거래 활동에서 파생된 파괴가 사용자 비용을 반영할 것이라고 암묵적으로 가정했지만, 실제로는 공격자가 LP 리저브에 대해 결제되는 지연 소각을 구성할 수 있게 했습니다. 결과적으로, 공격자는 제한된 자본 노출로 풀 깊이와 가격을 조작하여 유동성 공급자로부터 가치를 추출할 수 있었습니다.


5. 미상 사건 3

간략 요약

2026년 3월 25일, BNB 체인의 미검증 스테이킹 컨트랙트가 여러 스테이킹 모드에 걸친 일관성 없는 회계로 인해 약 $1.2K의 피해를 입었습니다. 컨트랙트는 이러한 함수들이 서로 다른 토큰 바스켓과 비율을 처리함에도 불구하고 stake2()/withdraw2()stake3()/withdraw3()에서 동일한 포지션 변수를 공유했습니다. 공격자는 더 가벼운 stake2() 모드로 예치하고 더 무거운 withdraw3() 모드로 상환하여 반복적으로 초과 토큰을 추출했습니다.

배경

이것은 여러 스테이킹 및 출금 모드를 갖춘 스테이킹 컨트랙트입니다. 표준 stake()withdraw() 경로는 보상 회계 로직과 함께 Pangolin, Bzzt, Bzzone의 바스켓을 처리하는 완전 스테이킹 모드입니다. stake3()withdraw3() 경로는 동일한 세 토큰 바스켓과 동일한 예치/출금 비율을 사용하지만 추가 보상 회계 흐름을 건너뜁니다. 반면, stake2()withdraw2() 경로는 PangolinBzzt만 처리하는 더 가벼운 모드이므로 다른 두 모드와 다른 토큰 조합과 비율을 사용합니다.

취약점 분석

근본 원인은 컨트랙트 0x29d36c...774137의 일관성 없는 회계였습니다. stake2()/withdraw2()stake3()/withdraw3()가 서로 다른 토큰 바스켓을 처리했음에도 불구하고, 모두 동일한 변수 _exit[msg.sender]_totalSupply를 업데이트했습니다. 결과적으로, 더 가벼운 stake2() 모드로 생성된 포지션이 더 무거운 withdraw3() 모드로 상환될 수 있었습니다.

실제로, stake2(amount)amountPangolinamountBzzt만 가져왔지만, withdraw3(amount)amountPangolin, 10 * amountBzzt, 10 * amountBzzone을 돌려주었습니다. 이는 stake2()를 통해 20e18 Pangolin과 20e18 Bzzt를 스테이킹하면, 나중에 withdraw3()를 통해 20e18 Pangolin, 200e18 Bzzt, 200e18 Bzzone을 출금하는 데 사용할 수 있는 _exit 잔액이 생성된다는 것을 의미했습니다. 이 불일치를 반복함으로써, 공격자는 컨트랙트에서 계속해서 초과 토큰을 추출했습니다.

공격 분석

다음 분석은 트랜잭션 0x7fcd5882...323f8d를 기반으로 합니다.

  • 1단계: 공격자는 0x9bce07d8bbe4f19dfe465710ff9612878bfe3302에 컨트랙트를 배포하고 0.05 BNB로 자금을 조달했으며, 자금을 WBNB로 래핑하고, 정확히 20e18 Pangolin, 20e18 Bzzt, 200e18 Bzzone으로 교환하고, 스테이킹 컨트랙트가 취득한 토큰을 사용하도록 승인했습니다.

  • 2단계: 공격자는 입력 20e18로 stake2()를 호출했으며, 이로 인해 스테이킹 컨트랙트에 20e18 Pangolin과 20e18 Bzzt가 이체되고 공격자의 공유 _exit 잔액이 20e18 증가했습니다.

  • 3단계: 그런 다음 공격자는 입력 20e18로 withdraw3()를 호출했습니다. withdraw3()는 공유 _exit 잔액만 확인했기 때문에, 포지션이 stake2()를 통해 생성되었음에도 불구하고 컨트랙트는 20e18 Pangolin, 200e18 Bzzt, 200e18 Bzzone을 돌려줬습니다.

  • 4단계: 공격자는 동일한 트랜잭션 내에서 stake2() -> withdraw3() 사이클을 여러 번 반복했습니다. 각 라운드에서 반환된 Pangolin과 반환된 Bzzt의 일부를 다음 stake2() 호출에 재사용했으며, Bzzone은 이후 withdraw3() 호출이 계속 성공할 수 있도록 스테이킹 컨트랙트로 다시 전송되었습니다. 이 루프를 통해 공격자는 Bzzt 잔액을 20e18에서 16,400e18으로 증가시켰습니다.

  • 5단계: 공격자는 취득한 토큰을 다시 WBNB로 교환하고, 자금을 BNB로 언래핑하고, 약 2.007e18 BNB를 공격자 EOA로 이체하여 공격을 완료했습니다.

결론

유사한 공격을 방지하기 위해, 스테이킹 컨트랙트는 각 모드에 대한 회계를 격리하고 모든 출금 경로가 해당 예치 경로의 정확한 자산 구성과 비율과 일치하도록 해야 합니다.


6. MYX 사건

간략 요약

2026년 3월 25일, 이더리움의 MYX Network sMYX 컨트랙트가 공격받아 풀에서 약 667만 MYX 토큰(약 $3.6K 수익)이 탈취되었습니다. 근본 원인은 sMYX 컨트랙트의 전송 함수의 공급 회계와 배당 배분 로직 사이의 결함 있는 상호작용이었습니다. 공격자는 제어되는 계정 간에 sMYX를 반복적으로 전송함으로써 주당 수익 변수를 부풀리고, 담보 없는 배당을 조작하고, 처음 예치한 것보다 더 많은 MYX를 추출했습니다.

배경

sMYX 컨트랙트(0x404328...d27F66)는 배당 배분 토큰 모델을 따릅니다. 사용자는 매수 함수를 통해 MYX 토큰을 예치하고 자신의 지분을 나타내는 sMYX 지분을 받습니다. 배당은 stor_11에 저장된 전역 누산기(주당 수익)를 사용하여 추적됩니다. 각 사용자의 청구 가능한 배당은 누적 수익의 비례적 지분과 기록된 지급 기준선 간의 차이로 계산됩니다. 이 모델은 개념적으로 들어오는 가치가 기존 보유자들 사이에 재분배되는 초기 반사형 토큰과 유사합니다.

취약점 분석

취약점은 공급 회계와 배당 배분 로직 간의 결함 있는 상호작용에서 발생합니다. 전송 함수는 전송된 금액을 현재 총 공급량으로 나눈 값을 기반으로 전역 주당 수익 변수를 증가시킴으로써 잘못되게 새 배당을 도입합니다. 이 작업은 실제 MYX 토큰의 유입으로 뒷받침되지 않으므로, 배당은 실제 경제 활동이 아닌 내부 회계에서 사실상 생성됩니다. 동시에, 함수는 실제로 토큰이 소각되지 않음에도 불구하고 뺄셈 헬퍼의 역전된 의미로 인해 전송된 금액만큼 기록된 총 공급량을 줄입니다.

결과적으로, 동일한 전송 금액이 점점 더 작아지는 총 공급량으로 나뉘어지므로, 이후의 각 전송은 주당 수익 값에 더 큰 증분을 초래합니다.

공격 분석

다음 분석은 트랜잭션 0x843c9ea7...a55b90을 기반으로 합니다.

  • 1단계: 공격자는 플래시 스왑을 통해 자본을 조성하여 MYX로 전환하고, sMYX 컨트랙트에 예치하여 배당 시스템 내에서 지배적인 지분 포지션을 확보함으로써, 미래 보상 배분의 대부분을 제어할 수 있도록 했습니다.

  • 2단계: 공격자는 두 개의 제어 컨트랙트에 걸쳐 포지션을 분할하고, 배당 실현과 상태 조작을 번갈아 가며 수행하는 조율된 루프를 시작하여 취약한 회계 경로를 반복적으로 통과할 수 있게 했습니다.

  • 3단계: 제어 계정 간의 반복적인 전송을 통해, 공격자는 기록된 총 공급량을 동시에 줄이면서 프로토콜의 주당 수익 변수를 인위적으로 부풀려, 담보 없는 배당을 만들고 배분율을 증폭시켰습니다.

  • 4단계: 공격자는 각 조작 사이클 후 지속적으로 출금함으로써, 새 자본을 투입하지 않고도 이러한 조작된 보상의 대부분을 추출하여 프로토콜에서 MYX 리저브를 사실상 탈취했습니다.

  • 5단계: 공격자는 모든 포지션을 청산하고, 추출한 MYXWETH로 다시 교환하고, 플래시 론을 상환하고, 나머지 잔액을 수익으로 보유했습니다.

결론

이 사건은 단순히 폰지형 경제 설계의 결과가 아니라 배당 회계 구현의 심각한 결함입니다. 이러한 취약점을 완화하려면, 전송 작업이 총 공급량에 영향을 미치거나 배당 배분을 유발해서는 안 되며, 주당 수익 업데이트는 실제 자산이 투입될 때만 발생해야 합니다.


7. 미상 사건 4

간략 요약

2026년 3월 26일, BNB 체인의 추천 보상이 있는 TUR 스테이킹 컨트랙트가 약 $133.5K의 피해를 입었습니다. Stake 컨트랙트는 단일 트랜잭션 내에서 조작 가능한 라이브 AMM 스팟 가격을 사용하여 예치 가치를 계산했습니다. 공격자는 플래시 론을 사용하여 TUR의 가격을 부풀리고, 부풀려진 윈도우 동안 스테이킹하고, 자기 제어 추천인 계정을 통해 과도한 TUR 보상을 탈취했습니다.

배경

Stake 컨트랙트(0x03D809...415Abe)는 추천 보상이 있는 TUR 스테이킹 컨트랙트입니다. 사용자는 먼저 bind()를 통해 상위 라인을 연결한 다음 stake()를 호출하며, 이는 스테이킹된 TUR을 소각(0xdead로 전송)하고 사용자에게 내부 power를 부여합니다. 이 가중치는 사용자가 나중에 청구할 수 있는 TUR 보상의 양을 결정합니다.

power는 고정 비율로 할당되지 않습니다. 대신, getPowerAmount()는 두 개의 라이브 AMM 가격인 TUR/NOBELNOBEL/USDT를 현재 페어 리저브에서 읽어 예치된 TUR을 USDT 표시 가치로 변환합니다. 컨트랙트는 또한 _distributeRefPower()를 통해 1단계 및 2단계 추천인에게 보너스 파워를 부여합니다.

취약점 분석

근본 원인은 Stake 컨트랙트의 안전하지 않은 스팟 가격 의존성이었습니다. 각 예치 시, stake()uValue = getPowerAmount(amount)를 계산하고, 이를 _power = _uValue * 100으로 변환하고, 스테이커의 회계를 업데이트한 다음, _distributeRefPower()를 호출하여 상위 추천인에게 추가 파워를 전파합니다.

구체적으로, uValue는 다음과 같이 계산됩니다:

uValue=getPowerAmount(amount)uValue = getPowerAmount(amount)

여기서 getPowerAmount()는 실질적으로 다음과 같습니다:

amount×TUR/NOBEL 스팟 가격×NOBEL/USDT 스팟 가격amount \times \text{TUR/NOBEL 스팟 가격} \times \text{NOBEL/USDT 스팟 가격}

이 구현은 getReserves()를 통해 현재 페어 리저브에서 직접 해당 가격을 읽으므로, 스테이킹 평가는 조작 저항적인 오라클이나 TWAP 대신 동일 트랜잭션 스팟 가격에 전적으로 의존합니다.

이를 통해 공격자는 TUR의 온체인 평가를 일시적으로 부풀리고, 조작된 윈도우 동안 스테이킹하고, 과장된 uValuepower를 받을 수 있습니다. 추천 로직은 피해를 증폭시킵니다: _distributeRefPower()는 스테이커 파워의 20%를 첫 번째 추천인에게, 5%를 두 번째 추천인에게 부여하지만, 이러한 추가 할당은 해당 추천인에 대한 rewardDebt 업데이트와 매치되지 않습니다. 결과적으로, 공격자가 제어하는 추천인 계정은 Stake 컨트랙트에서 즉시 불균형적인 TUR 보상을 청구할 수 있습니다.

공격 분석

다음 분석은 트랜잭션 0x96c9ce3c...81e348을 기반으로 합니다.

  • 1단계: 공격자는 플래시 론 자본으로 ListaDAO의 Moolah 컨트랙트에서 1,900,000e18 USDT를 빌렸습니다.

  • 2단계: 공격자는 빌린 자본을 사용하여 NOBEL-USDTTUR-NOBEL 풀을 조작하여 TUR의 스팟 가치를 일시적으로 급격히 상승시켰습니다.

  • 3단계: 조작된 윈도우 동안, 공격자는 Stake 컨트랙트에 7,770,707e18 TUR을 스테이킹했습니다. 트랜잭션은 대규모로 부풀려진 uValue 8,283,864e18과 대응하는 power 828,386,488e18을 보여주는 StakeEvent를 발생시켰습니다.

  • 4단계: 공격자가 이미 자기 제어 추천인 계정을 배치했기 때문에, _distributeRefPower()는 조작된 스테이크에서 파생된 추가 보상 파워를 그들에게 부여했습니다. 첫 번째와 두 번째 추천인은 예상되는 20% 및 5% 추천 할당을 받았습니다.

  • 5단계: 부스트된 추천인 계정은 Stake 컨트랙트에서 TUR 보상을 청구했습니다. 동일한 트랜잭션에서, Stake0xFd11...AcEaB에 15,238,941e18 TUR을, 0x9007...E550B에 3,809,924e18 TUR을 이체했으며, 두 주소 모두 즉시 동일한 금액을 공격자에게 전달했습니다. 4:1 지급 비율은 컨트랙트의 20% 대 5% 추천 파워 분할과 일치합니다.

  • 6단계: 트랜잭션은 또한 Stake에서 펀드 지갑 0xb302...89923으로 청구 수수료가 흐르는 것을 보여주며, 이는 보상을 청구자에게 전송하기 전에 3% TUR 수수료를 부과하는 claim() 구현과 일치합니다.

  • 7단계: 증폭된 TUR 보상을 추출한 후, 공격자는 수익을 USDT로 다시 교환하고, 1,900,000 USDT 플래시 론을 상환하고, 133,490e18 USDT0xEf67...4e5898으로 수익으로 이체했습니다.

결론

이 사건은 TUR 토큰의 별도 LP 배당 회계가 아닌 Stake 컨트랙트의 조작 가능한 보상 평가 모델로 인해 발생했습니다. 라이브 AMM 리저브 비율에 스테이킹 파워와 추천 보상을 연결함으로써, 컨트랙트는 플래시 론으로 자금을 조달한 공격자가 TUR의 스팟 가격을 부풀리고, 과도한 보상 파워를 만들고, 자기 제어 추천 계정을 통해 스테이킹 컨트랙트에서 TUR을 탈취할 수 있게 했습니다. 더 안전한 설계는 스팟 리저브 가격을 조작 저항적인 오라클이나 충분히 긴 TWAP으로 대체하고, 모든 추천 파워 증가가 일관된 보상 부채 회계와 함께 이루어지도록 해야 합니다.


8. EST 토큰 사건

간략 요약

2026년 3월 27일, BNB 체인의 BNBDeposit 컨트랙트가 두 가지 문제로 인해 약 $92.3K의 피해를 입었습니다: BNBDeposit의 스팟 가격 의존성과 EST 토큰의 결함 있는 소각 메커니즘. 가격 의존성은 공격자가 대량의 EST를 획득하게 했으며, 결함 있는 소각 메커니즘은 공격자가 샌드위치 방식의 조작을 통해 EST-WBNB 풀을 탈취하게 했습니다.

취약점 분석

사건의 근본 원인은 두 가지입니다:

  1. BNBDeposit 컨트랙트(0xE71547...d29A61)의 함수 onTokenReceived()는 쉽게 조작 가능한 컨트랙트 잔액과 EST 스팟 가격을 기반으로 사용자의 청구 가능 금액을 계산했습니다.

  2. EST 토큰(0xD4524B...498a91)은 공격자가 EST를 풀에 직접 전송하여 EST-WBNB 풀에서 EST를 소각할 수 있게 하는 결함 있는 소각 메커니즘을 구현했습니다.

결과적으로, 공격자는 두 취약점을 모두 활용하여 샌드위치 공격을 수행하고 EST-WBNB 풀에서 WBNB를 사취했습니다.

공격 분석

다음 분석은 트랜잭션 0x2f1c33ea...bd1626을 기반으로 합니다.

  • 1단계: 공격자는 Moolah를 통해 250,000e18 WBNB를 빌리고 공격을 위해 15e18 WBNBBNB로 언래핑했습니다.

  • 2단계: 공격자는 BNBDeposit에 0.3e18 BNB를 34회 반복하여 이체했습니다(총 10.2e18 BNB). 각 직접 이체는 예치 로직을 트리거했습니다. 이 단계에서 공격자는 약 9,100e18 LP 토큰(가상 회계)과 보너스로 2.65e18 WBNB를 받았습니다.

  • 3단계: 공격자는 400e18 WBNB를 약 8억 2,200만e18 EST로 교환하고 BNBDeposit을 수신자로 설정하여, BNBDepositEST 잔액과 풀의 EST 가격을 모두 부풀렸습니다.

  • 4단계: 공격자는 클레임 메커니즘을 유발하기 위해 BNBDeposit에 1e18 EST를 이체하여, 증폭된 가격과 잔액을 기반으로 2,000만e18 EST를 받았습니다.

  • 5단계: 공격자는 245,000e18 WBNB를 약 3억 3,000만e18 EST로 교환하고 BNBDeposit을 수신자로 설정했습니다.

  • 6단계: 공격자는 EST-WBNB 풀에서 EST를 지속적으로 소각하기 위해 약 150회의 transfer-skim 작업을 수행했습니다.

  • 7단계: 공격자는 나머지 EST를 245,560e18 WBNB로 교환했습니다.

  • 8단계: 공격자는 플래시 론을 상환하고 150 WBNB의 수익을 얻었습니다.

결론

이 사건은 두 가지 문제로 인해 발생했습니다: 스팟 가격 의존성과 결함 있는 소각 메커니즘. 유사한 위험을 완화하기 위해, 프로젝트는 배포 전에 신뢰할 수 있는 가격 오라클과 건전한 토큰 소각 로직을 보장해야 합니다.


Phalcon Security 시작하기

모든 위협을 탐지하고, 중요한 사항을 알림하며, 공격을 차단하세요.

지금 무료로 체험하기

BlockSec 소개

BlockSec은 풀스택 블록체인 보안 및 암호화폐 컴플라이언스 제공업체입니다. 저희는 고객이 프로토콜 및 플랫폼의 전체 라이프사이클에 걸쳐 코드 감사(스마트 컨트랙트, 블록체인 및 지갑 포함)를 수행하고, 공격을 실시간으로 차단하고, 사건을 분석하고, 불법 자금을 추적하고, AML/CFT 의무를 이행하는 데 도움이 되는 제품과 서비스를 구축합니다.

BlockSec은 권위 있는 컨퍼런스에서 여러 블록체인 보안 논문을 발표했으며, DeFi 애플리케이션의 여러 제로데이 공격을 보고했고, 2,000만 달러 이상을 구제하기 위한 여러 해킹을 차단했으며, 수십억 달러의 암호화폐를 보호했습니다.

Sign up for the latest updates
~$410만 손실: Taiko, SecondFi 익스플로잇 | BlockSec 위클리
Security Insights

~$410만 손실: Taiko, SecondFi 익스플로잇 | BlockSec 위클리

이 주간 블록체인 보안 리포트는 2026년 6월 22~28일 발생한 주요 사건 2건을 다루며, 이더리움과 카르다노에서 약 410만 달러의 피해가 확인됐습니다. Taiko 브릿지 공격은 노출된 SGX 서명 키와 디버그 엔클레이브를 거부하지 못한 증명 정책 결함을 이용해 악성 증명자를 등록하고 L2 상태 증명을 위조했습니다. SecondFi 지갑은 Ed25519 논스 도출 시 비밀 입력이 제거되는 결함으로 공개 트랜잭션 데이터만으로 개인 키 복구가 가능했습니다.

~$18M 손실: jaredFromSubway, Aztec 등 | BlockSec 위클리
Security Insights

~$18M 손실: jaredFromSubway, Aztec 등 | BlockSec 위클리

이 주간 블록체인 보안 보고서는 2026년 6월 15일~21일을 다루며, 이더리움과 BNB 체인에서 3건의 주요 사고가 발생해 약 $18.3M의 손실이 발생했습니다. jaredFromSubway 사건은 MEV 봇이 차익거래를 위해 신뢰할 수 없는 제3자 컨트랙트에 자산을 승인한 역방향 승인 공격으로, 가짜 래퍼 토큰과 스왑 풀을 이용해 약 $15M 손실이 발생했습니다. Aztec은 이스케이프 해치 ZK 회로의 제약 누락으로 공격자가 가짜 머클 트리로 온체인 검증을 통과했습니다.

Web3 컴패니언: 오픈소스 보안 에이전틱 지갑

Web3 컴패니언: 오픈소스 보안 에이전틱 지갑

BlockSec가 Web3 Companion을 오픈소스로 공개했습니다. 이 보안 중심의 에이전트 지갑은 자체 AI 에이전트를 신뢰하지 않는 방식으로 설계되었으며, 키 격리, 강력한 정책, Passkey를 활용해 온체인 자산을 보호합니다.

Best Security Auditor for Web3

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

BlockSec Audit