Platform: Code4rena
Start Date: 25/01/2023
Pot Size: $36,500 USDC
Total HM: 11
Participants: 173
Period: 5 days
Judge: kirk-baird
Total Solo HM: 1
Id: 208
League: ETH
Rank: 151/173
Findings: 1
Award: $2.59
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: adriro
Also found by: 0xMAKEOUTHILL, 0xMirce, 7siech, AkshaySrivastav, AlexCzm, Awesome, Aymen0909, Cryptor, Deivitto, DimitarDimitrov, ElKu, Garrett, Jayus, Josiah, Kenshin, KrisApostolov, RaymondFam, SovaSlava, Timenov, UdarTeam, amaechieth, btk, c3phas, codeislight, fellows, frankudoags, gzeon, hansfriese, luxartvinsec, millersplanet, mookimgo, navinavu, oberon, paspe, pavankv, petersspetrov, pfapostol, prestoncodes, rbserver, sakshamguruji, shark, thekmj, trustindistrust, tsvetanovv, usmannk, vagrant, vanko1, xAriextz, yosuke
2.5852 USDC - $2.59
https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleReceipt.sol#L58-L61 https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleReceipt.sol#L98-L104
The RabbitHoleReceipt.sol
contract has a onlyMinter()
modifier attempting to allow a specific address only to be allowed to mint. However, the implementation for the modifier is not correct and allows any address to bypass it because it does not revert in case the minterAddress != msg.sender
:
modifier onlyMinter() { msg.sender == minterAddress; _; }
Improper access control on incorrectly implemented modifier allows any caller to mint tokens on the protocol at any given time, ultimately rendering the value of the NFTs to zero.
mint()
function passing his address in the to_
parameter assigning any uncreated questId_
he likes.Place an if()
statement to check that the msg.sender
is minterAddress
and revert if it isn't.
modifier onlyMinter() { if (msg.sender != minterAddress) revert OnlyMinter(); _; }
#0 - c4-judge
2023-02-03T11:03:48Z
kirk-baird marked the issue as primary issue
#1 - Simon-Busch
2023-02-03T11:35:52Z
Mark the issue as duplicate-9 as requested by @kirk-baird
#2 - c4-judge
2023-02-14T08:39:33Z
kirk-baird marked the issue as satisfactory
🌟 Selected for report: adriro
Also found by: 0xMAKEOUTHILL, 0xMirce, 7siech, AkshaySrivastav, AlexCzm, Awesome, Aymen0909, Cryptor, Deivitto, DimitarDimitrov, ElKu, Garrett, Jayus, Josiah, Kenshin, KrisApostolov, RaymondFam, SovaSlava, Timenov, UdarTeam, amaechieth, btk, c3phas, codeislight, fellows, frankudoags, gzeon, hansfriese, luxartvinsec, millersplanet, mookimgo, navinavu, oberon, paspe, pavankv, petersspetrov, pfapostol, prestoncodes, rbserver, sakshamguruji, shark, thekmj, trustindistrust, tsvetanovv, usmannk, vagrant, vanko1, xAriextz, yosuke
2.5852 USDC - $2.59
https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleTickets.sol#L47-L50 https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleTickets.sol#L83-L85 https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleTickets.sol#L92-L99
The RabbitHoleTickets.sol
contract has a onlyMinter()
modifier attempting to allow a specific address only to be allowed to mint. However, the implementation for the modifier is not correct and allows any address to bypass it because it does not revert in case the minterAddress != msg.sender
:
modifier onlyMinter() { msg.sender == minterAddress; _; }
Improper access control on incorrectly implemented modifier allows any caller to mint tokens on the protocol at any given time, ultimately rendering the value of the NFTs to zero.
Vulnerable mint() function: https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleTickets.sol#L83-L85
Vulnerable mintBatch()) function: https://github.com/rabbitholegg/quest-protocol/blob/8c4c1f71221570b14a0479c216583342bd652d8d/contracts/RabbitHoleTickets.sol#L92-L99
mintBatch()
function passing his address in the to_
parameter and sending any _amounts
of token he likes, passing any arbitrary _data
that he likes as well.Place an if()
statement to check that the msg.sender
is minterAddress
and revert if it isn't.
modifier onlyMinter() { if (msg.sender != minterAddress) revert OnlyMinter(); _; }
#0 - c4-judge
2023-02-03T11:18:57Z
kirk-baird marked the issue as duplicate of #9
#1 - c4-judge
2023-02-14T08:39:32Z
kirk-baird marked the issue as satisfactory