PoolTogether - radin100's results

General Information

Platform: Code4rena

Start Date: 04/03/2024

Pot Size: $36,500 USDC

Total HM: 9

Participants: 80

Period: 7 days

Judge: hansfriese

Total Solo HM: 2

Id: 332

League: ETH

PoolTogether

Findings Distribution

Researcher Performance

Rank: 64/80

Findings: 1

Award: $1.47

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

1.4652 USDC - $1.47

Labels

bug
3 (High Risk)
satisfactory
sufficient quality report
upgraded by judge
:robot:_10_group
duplicate-59

External Links

Lines of code

https://github.com/code-423n4/2024-03-pooltogether/blob/480d58b9e8611c13587f28811864aea138a0021a/pt-v5-vault/src/PrizeVault.sol#L611-L622

Vulnerability details

Impact

Potential yield shares could be lost due to applying zero value on yieldFeeBalance, no matter the _shares input value

Proof of Concept

  1. yieldFeeRecipient executes 'PrizeVault::claimYieldFeeShares' with input value lower than yieldFeeBalance.
  2. yieldFeeBalance goes to zero(yieldFeeBalance -= _yieldFeeBalance), no matter the input value
  3. Input value shares are minted
  4. yieldFeeBalance - _shares asset value is going to be wasted

Tools Used

There are 2 main ways depending on the protocol logic to solve this issue: 1. Subtract _shares input value from yieldFeeBalance instead of _yieldFeeBalance as shown below:

function claimYieldFeeShares(uint256 _shares) external onlyYieldFeeRecipient { if (_shares == 0) revert MintZeroShares(); uint256 _yieldFeeBalance = yieldFeeBalance; if (_shares > _yieldFeeBalance) revert SharesExceedsYieldFeeBalance(_shares, _yieldFeeBalance); --- yieldFeeBalance -= _yieldFeeBalance; +++ yieldFeeBalance -= _shares; _mint(msg.sender, _shares); emit ClaimYieldFeeShares(msg.sender, _shares); }

2. Validate _shares input value not to be lower than yieldFeeBalance 3. Instead using the input value, use _yieldFeeBalance as shown below:

function claimYieldFeeShares(uint256 _shares) external onlyYieldFeeRecipient { if (_shares == 0) revert MintZeroShares(); uint256 _yieldFeeBalance = yieldFeeBalance; if (_shares > _yieldFeeBalance) revert SharesExceedsYieldFeeBalance(_shares, _yieldFeeBalance); yieldFeeBalance -= _yieldFeeBalance; // @audit if _shares <= _yieldFeeBalance, yieldFeeBalance goes to 0? --- _mint(msg.sender, _shares); +++ _mint(msg.sender, _yieldFeeBalance); emit ClaimYieldFeeShares(msg.sender, _shares); }

Assessed type

Invalid Validation

#0 - c4-pre-sort

2024-03-11T21:53:49Z

raymondfam marked the issue as sufficient quality report

#1 - c4-pre-sort

2024-03-11T21:53:55Z

raymondfam marked the issue as duplicate of #10

#2 - c4-pre-sort

2024-03-13T04:38:30Z

raymondfam marked the issue as duplicate of #59

#3 - c4-judge

2024-03-15T07:37:31Z

hansfriese changed the severity to 3 (High Risk)

#4 - c4-judge

2024-03-15T07:39:03Z

hansfriese marked the issue as satisfactory

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter