Tyojong

[Solodit] Withdrawal Calculation Causes Underflow, Locking All User FundsTerplayer Bvt Staking&Distribution 본문

web3/Solodit Report

[Solodit] Withdrawal Calculation Causes Underflow, Locking All User FundsTerplayer Bvt Staking&Distribution

Tyojong 2025. 9. 22. 12:23

개요


심각도 : Critical

언어 : Solidity

프로토콜 : Terplayer BVT Staking & Distribution]

취약점 유형 : Underflow, Logic Bug

이 리포트는 Terplayer BVT Staking & Distribution 프로토콜의 출금 (withdrawal) 로직에서 발견된 취약점에 대해 설명한다.

 

출금 함수에서 사용자 자신이 본인의 delegation list(위임 목록)에 포함된다.

모든 계산에서 ceil(올림) 나눗셈을 사용해, delegation된 전체 금액(totalDelegatedAmount)이 요청 출금금액을 초과하게 된다.

그 결과, remainingAmout = amout - totalDelegatedAmout 계산에서 언더플로우가 발생해 전체 출금이 실패하고 모든 자금이 영구적으로 잠김 현상이 발생한다.

 

영향 받는 코드


src/BvtRewardVault.sol 파일의 155번째 줄을 확인해보면

function withdraw(uint256 amount) external nonReentrant {
  // code
​
  // Calculate and withdraw from delegated stakes
  for (uint256 i = 0; i < users.length; i++) {
      address user = users[i];
      uint256 delegatedAmount = delegatedStakes[msg.sender][user];
      if (delegatedAmount > 0) {
          uint256 withdrawAmount = (delegatedAmount * amount + stakes[msg.sender] - 1)  / stakes[msg.sender];
          if (withdrawAmount > 0) {
              totalDelegatedAmount += withdrawAmount;
              _delegateWithdraw(msg.sender, user, withdrawAmount);
          }
      }
  }
  // Calculate remaining amount to withdraw from user's own stake
  uint256 remainingAmount = amount - totalDelegatedAmount;
  if (remainingAmount > 0) {
      _delegateWithdraw(msg.sender, msg.sender, remainingAmount);
  }
  // code
}

 

users.length에 자신(msg.sender)이 포함되어, delegation 계산 누적에서 본인의 몫도 중복된다.

선택된 나눗셈 방식(floor 대신 ceil, 즉 올림)으로 총 위임 출금량이 실제 요청량보다 커지게된다.

결과적으로 남은 출금 가능 금액 (remainingAmount)이 음수가 되면서 언더플로우 상황이 되고, 출금 컨트랙트 자체가 동작 불가 상태로 고장 나게 된다.

 

모든 사용자의 예치금 인출이 영구적으로 차단되고 단일 코드 오류로 플랫폼 자금 전체가 영구적으로 락(Lock)이 된다.

 

레퍼런스


 

 

Smart Contract Vulnerability Dataset - Cyfrin Solodit

c-01-withdrawal-calculation-causes-underflow-locking-all-user-funds-shieldify-none-terplayer-bvt-stakingdistribution-markdown

solodit.cyfrin.io

 

 

audits-portfolio-md/Terplayer-BVT-Staking&Distribution-Security-Review.md at main · shieldify-security/audits-portfolio-md

Contribute to shieldify-security/audits-portfolio-md development by creating an account on GitHub.

github.com