Access control vulnerabilities in disclosed bug bounty reports
The most-paid bug class on most programmes, because a missing modifier is worth whatever the contract holds.
- Reports indexed
- 159
- Total paid
- $850k
- Critical
- 3
- Largest payout
- $600k
Access control findings dominate disclosed bug bounty volume, and they are almost never subtle. A privileged function ships without its modifier. An initializer can be called a second time. An upgrade path leaves an implementation contract unowned. A role is granted in a constructor that a proxy never runs.
What makes this class worth studying rather than dismissing is the second tier: the cases where the modifier is present and still wrong. Role checks that verify membership in the wrong registry, signature-gated functions where the signer is recovered but never compared, cross-chain message handlers that check the sender but not the source chain, and admin paths reachable through a delegatecall that resets `msg.sender`.
This category also holds the account-level findings from wallet and infrastructure programmes — key handling, session scoping and permission prompts — where the vulnerable surface is the client rather than the chain.
What reviewers look for
- Public or external state-changing functions with no modifier
- Initializers callable more than once, or implementation contracts left uninitialized
- Signature recovery without a comparison to an expected signer
- Cross-chain handlers that validate the sender address but not the origin chain
- `delegatecall` paths where the caller identity is not what the check assumes
Curated highlights
The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.
Missing owner check on Solana instruction lets attacker drain vault
A missing program ownership check in a Solana yield vault protocol allowed unauthorized account spoofing during withdrawal processing. Because the instruction handler accepted an unchecked account and verified only a discriminator byte rather than validating account ownership, an attacker could supply a custom state account with manipulated fields. The protocol trusted the forged state data and generated a Program Derived Address (PDA) signature to execute a token transfer, enabling complete draining of the protocol's vault funds.
Cosmos SDK module allows unauthorized state migration via missing ante handler check
A logic flaw in a Cosmos SDK module's state migration handler allowed unauthorized signers to execute privileged state updates. The message authority check relied on a helper function that returned true when the authority field was empty, and the message route was incorrectly exposed as a standard transaction rather than being restricted to governance. An attacker could issue state updates with an empty authority field to inject malicious counterparties into the IBC channel allowlist, enabling the execution and processing of forged cross-chain transactions.
Putty: [Denial-of-Service] Contract Owner Could Block Users From Withdrawing Their Strike
PuttyV2's withdraw function deducts a platform fee from a user's escrowed strike and transfers that fee to the contract owner inline, before sending the remaining strike to the user. Because the user's transfer only executes if the owner fee transfer succeeds, the owner can permanently block all strike withdrawals by making that fee transfer revert — either by transferring ownership to the zero address (rejected by common ERC20s) or by adopting a malicious token whose transfer-to-owner reverts. The judge initially rated the issue high but downgraded it to medium because the triggering conditions are unlikely (fee must be nonzero or a malicious base asset adopted); the protocol confirmed it and fixed it by relocating the platform fee transfer to order-filling time, so any remaining owner griefing only causes a DoS rather than trapping user funds.
Rigor Protocol: Incorrect initialization of smart contracts with Access Control issue
Rigor Protocol's upgradeable contracts ship with initialize() functions that lack any caller authorization, and its proxy deployments pass an empty data field so initialization is deferred until after deployment. In the intervening window, a mempool-watching attacker can front-run the deployment and invoke an initializer first with arbitrary arguments, planting harmful contract addresses or settings. This can lead to loss of funds, loss of control over protocol components, contract/setting replacement, or forced redeployment. The sponsor confirmed the issue while disagreeing on severity, and the Code4rena judge upheld it as valid but downgraded it to Medium because the practical impact is limited and failed deployment transactions typically halt the script anyway.
The Graph: Governor can rug pull the escrow
The Graph's BridgeEscrow exposes an approveAll() function that the protocol governor can call to grant any address an unlimited allowance over the escrowed GRT. Because the escrowed tokens are never burned, a compromised or malicious governor could permanently drain the full L1 balance, and even an honest governor forces users into a perpetual trust assumption over the funds. The sponsor disputed the finding as intentional design meant to support multiple future bridges and emergency recovery after a critical Arbitrum incident, and the judge leaned toward closing it as invalid while noting Code4rena's convention of awarding such centralization risks as Medium for awareness. The disclosure thus represents a contested governance/centralization-risk concern rather than a directly exploitable vulnerability.
PoolTogether: `drawManager` can be set to a malicious address
The PoolTogether PrizePool contract is vulnerable to a front-running attack due to a missing access control modifier on the setDrawManager function. A malicious actor can intercept the initial setup to designate an attacker-controlled address as the draw manager. Because the contract prevents subsequent changes to the draw manager once assigned, this compromise is permanent, granting the attacker perpetual control over critical administrative functions, including the ability to withdraw from the reserve and manipulate prize draw operations.
All reports in this group
- The Graph: Initialize function in `L2GraphToken.sol`, `BridgeEscrow.sol`, `L2GraphTokenGateway.sol`, `L1GraphTokenGateway.sol` can be invoked multiple times from the implementation contractAccess control$0
- Rigor Protocol: Attacker can drain all the projects within minutes, if admin account has been exposedAccess control$0
- Good Entry: User can steal refunded underlying tokens from `initRange` operation inside `RangeManager`Access control$0
- PoolTogether: `Vault.mintYieldFee` function can be called by anyone to mint `Vault Shares` to any recipient addressAccess control$0
- Rigor Protocol: Add members to the not yet created communityAccess control$0
- stNXM by EaseDeFi: The vault can be drainedAccess control$0
- stNXM by EaseDeFi: Owner can steal funds on withdraw by burning wrong Uniswap V3 position liquidityAccess control$0
- Centrifuge Protocol V3.1: Gas engineering during `adapter` execution can be used to maliciously split critical message batchesAccess control$0
- Centrifuge Protocol V3.1: Pool managers can steal all other pools' pending deposits from `globalEscrow` via malicious `requestManager` swappingAccess control$0
- Neutrl Protocol: FULL_RESTRICTED_STAKER_ROLE Blacklist Bypass in Deposit and Mint FunctionsAccess control$0
- Malda: Rebalancer can drain market funds via excessive bridge feesAccess control$0
- Symbiotic Relay: Enabling the whitelist can grant a malicious operator a temporary whitelisted statusAccess control$0
- DODO Cross-Chain DEX: Bug in AccountEncoder causes wrong Solana account permissionsAccess control$0
- DODO Cross-Chain DEX: Unauthorized Claim of Non-EVM Chain Refunds in `claimRefund` FunctionAccess control$0
- ZetaChain Cross-Chain: The `sender` argument for the Solana `OnCall` instruction can be impersonatedAccess control$0
- ZetaChain Cross-Chain: Restricted addresses are still able to use Zetachain due to faulty updateAccess control$0
- Crestal Network: Lack of access control in `setWorkerPublicKey()` in BlueprintCore.sol which results users to lose fundsAccess control$0
- Crestal Network: Anyone who is approving `BlueprintV5` contract to spend ERC20 can get drained because `Payment::payWithERC20`Access control$0
- Chakra: Anyone can manipulate user nonce (`nonce_manager`) in settlement contractAccess control$0
- Chakra: Excessive Authority Granted to Managers in the `ckr_btc.cairo` Contract Presents Significant Management RisksAccess control$0
- Chakra: There is no refund mechanism in `ChakraSettlement.processCrossChainCallback` or `ChakraSettlementHandler.receive_cross_chain_callback` functionAccess control$0
- LoopFi: Honest users could be permanently DOS'd from withdrawing their vested tokens/rewardsAccess control$0
- LoopFi: `WhenNotPaused` modifier in the CDPVault can be bypassed by usersAccess control$0
- Superposition: It's still not possible to set pool's protocol feesAccess control$0
- Autonomint Colored Dollar V1: Malicious users can block admins from accessing setter functionsAccess control$0
- Oku's New Order Types Contract: Failure to reset unspent approval to the target address will lead to the wiping of the smart contract balanceAccess control$0
- Oku's New Order Types Contract: Insecure calls to `safeTransferFrom` leads to users tokens steal by attackerAccess control$0
- Ethena Labs: Blacklisted user can burn tokens during WHITELIST_ENABLED stateAccess control$0
- Debita Finance V3: Previous owner can steal unclaimed bribes from new owner of veNFTVaultAccess control$0
- vVv Launchpad - Investments & Token distribution: Anyone can call `VVVVCTokenDistribution::claim` function by utilizing `ClaimParams` signed by the `signer`Access control$0
- Orderly Solana Vault Contract: A malicious user can withdrawals another user's moneyAccess control$0
- Orderly Solana Vault Contract: [H-1]Access control$0
- The Wildcat Protocol: Role providers can bypass intended restrictions and lower expiry set by other providersAccess control$0
- Superposition: Users can't remove liquidity while a pool is disabledAccess control$0
- Phi: PhiNFT1155 contracts continue sending fees/royalties to old protocol destination addressAccess control$0
- Phi: Cred creator could cause stuck fundsAccess control$0
- Phi: Forced `endTime` extension in `updateArtSettings()` allows attacker to mint more tokensAccess control$0
- Phi: Incorrect fee handling prevents protocol from updating feesAccess control$0
- Phi: Signature replay in `signatureClaim` results in unauthorized claiming of rewardsAccess control$0
- Reserve: RToken can manipulate distribution to avoid paying DAO feesAccess control$0
- WOOFi Swap on Solana: Missing permission control in create_oracle and create_pool.Access control$0
- Perennial V2 Update #3: Lack of access control in the `MarketFactory.updateExtension()` function.Access control$0
- TraitForge: Incorrect `isApprovedForAll` check in the `NukeFund.nuke()` functionAccess control$0
- ZeroLend One: CuratedVaults are prone to inflation attacks due to not utilising virtual sharesAccess control$0
- Velar Artha PerpDEX: Usage of `tx.origin` to determine the user is prone to attacksAccess control$0
- Basin: `WellUpgradeable` can be upgraded by anyoneAccess control$0
- BendDAO: Anyone can get the NFT collateral token after an Auction without bidding due to missing check on `msg.sender`Access control$0
- Winnables Raffles: The setRole() function grants role instead of removingAccess control$0
- Optimism: Unvalidated memory access in `readMem` and `writeMem` functionsAccess control$0
- Olas: Attacker can cancel claimed staking incentives on ArbitrumAccess control$0
- Olas: Arbitrary tokens and data can be bridged to `GnosisTargetDispenserL2` to manipulate staking incentivesAccess control$0
- Olas: Unauthorized claiming of staking incentives for retainerAccess control$0
- Olas: `checkpoint` function is not called before staking which can cause loss of rewards for already staked servicesAccess control$0
- Vultisig: Vultisig whitelisting can be bypassed by anyoneAccess control$0
- Gondi: Any liquidators can pretend to be a loan contract to validate offers, due to insufficient validationAccess control$0
- Gondi: A malicious user can take on a loan using an existing borrower's collateral in `refinanceFromLoanExecutionData()`Access control$0
- Gondi: Anyone can remove existing term without queueing through `setTerms()`Access control$0
- Gondi: Function `distribute()` lacks access control allowing anyone to spam and disrupt the pool's accountingAccess control$0
- Gondi: `addNewTranche()` no authorization from borrowerAccess control$0
- Allora: Lack of Authentication in OnRecvPacketAccess control$0
- Curves Protocol: Unauthorized Access to `setCurves` FunctionAccess control$0
- MagicSea - the native DEX on the IotaEVM: Rewards might get stuck when approved actor renews a positionAccess control$0
- MagicSea - the native DEX on the IotaEVM: Attacker can manipulate the `lockDuration` of other users positionsAccess control$0
- Palmera: Unauthorized Access Control Due to Retained Root Role When Root Safe Exits and Joins New OrgAccess control$0
- Palmera: Unauthorized Role Modification Vulnerability in setRole FunctionAccess control$0
- DittoETH: `transferShortRecord`: Can transfer a newly created `ShortRecord` using a previously minted NFTAccess control$0
- Palmera: setRole` Function Incorrectly Assigns `_safe.lead` without Validating `enabled` ParameterAccess control$0
- Palmera: isSafeLead` Function Lacks Role Authorization Check, Leading to Unauthorized AccessAccess control$0
- Intuition: Missing events for functions that change critical parameters in `EthMultiVault.sol`Access control$0
- Munchables: Malicious User can call `lockOnBehalf` repeatedly extend a users `unlockTime`, removing their ability to withdraw previously locked tokensAccess control$0
- Arrakis Valantis SOT: A malicious executor can delete the fees belonging to the owner of `ArrakisStandardManager`Access control$0
- Lavarage: Lack of freeze authority check for collateral tokens on create trading poolAccess control$0
- Tapioca DAO: Adversary can steal user's NFT's if they have set Magnetar as `isApprovedForAll == true`Access control$0
- Tapioca DAO: Funds can be stolen through remote transfer functionalityAccess control$0
- Tapioca DAO: Adversary can utilise approved to Magnetar `oTAP` and `tOLP` NFTsAccess control$0
- Tapioca DAO: Missing check on helper contract allows arbitrary actions and theft of assetsAccess control$0
- Tapioca DAO: `IMarket.execute.selector`, `_checkSender` bypass allows to execute arbitrary operationsAccess control$0
- Revert Lend: `V3Utils.execute()` does not have caller validation, leading to stolen NFT positions from usersAccess control$0
- Revert Lend: `V3Vault::transform` does not validate the `data` input and allows a depositor to exploit any position approved on the transformerAccess control$0
- Revert Lend: Users' newly created positions can be prematurely closed and removed from the vault directly after they are createdAccess control$0
- Revert Lend: `setReserveFactor` fails to update global interest before updating reserve factorAccess control$0
- Revert Lend: User might execute `PositionToken` of token set by previous token ownerAccess control$0
- AI Arena: A locked fighter can be transferred; leads to game server unable to commit transactions, and unstoppable fightersAccess control$0
- Abracadabra Money: Miscalculation in addLiquidity of Router results in unauthorized spending of tokensAccess control$0
- Abracadabra Money: Loss of assumed functionality of the Onboarding contract in a highly-sensitive areaAccess control$0
- Abracadabra Money: `LockingMultiRewards` contract on Blast does not configure gas yield nor token yield mode.Access control$0
- Abracadabra Money: User can grief bootstrap process by sending the cap amount of unlocked tokens to it.Access control$0
- Taiko: First block proposer check in the `LibProposing._isProposerPermitted` function is errorneousAccess control$0
- TITLES Publishing Protocol: Malicious users can block creators from acknowledging or deacknowledging an edgeAccess control$0
- Taiko: Bridge watcher can forge arbitrary message and drain bridgeAccess control$0
- Canto: When the `unlockOverride` flag is true, users can "freely" vote for gauge weights.Access control$0
- Salty.IO: Development Team might receive less SALT because there is no access control on `VestingWallet#release()`Access control$0
- Althea Liquid Infrastructure: Distribution can be bricked, and double claims by a few holders are possible when owner calls `LiquidInfrastructureERC20::setDistributableERC20s`Access control$0
- M^0: An earner can still continue earning even after being removed from the approved list.Access control$0
- Decent: Missing access control on UTB:receiveFromBridge allows UTB swaps to be executed without spending bridge fees while bypassing fee/swap instruction signature verificationAccess control$0
- Decent: Users can use the protocol freely without paying any fees by calling the `DecentEthRouter::bridgeWithPayload()` function directly.Access control$0
- Decent: Anyone can update the address of the Router in the DcntEth contract to any address they would like to set.Access control$0
- Decent: When `DecentBridgeExecutor.execute` fails, funds will be sent to a random addressAccess control$0
- reNFT: A malicious borrower can hijack any NFT with `permit()` function he rents.Access control$0
- reNFT: Incorrect `gnosis_safe_disable_module_offset` constant leads to removing the rental safe's `module` without verificationAccess control$0
- reNFT: An attacker is able to hijack any ERC721 / ERC1155 he borrows because guard is missing validation on the address supplied to function call `setFallbackHandler()`Access control$0
- Most Aleph Zero Bridge: Attacker can initialize `Most.sol` to set critical parametersAccess control$0
- Tapioca: Multiple contracts cannot be pausedAccess control$0
- Tapioca: `mTOFT` can be forced to receive the wrong ERC20 leading to token lockupAccess control$0
- Tapioca: Balancer rebalance operation is permanently blocked whenever owner assigns `rebalancer` role to some other addressAccess control$0
- Tapioca: Unprotected `executeModule` function allows to steal the tokensAccess control$0
- Tapioca: StargateRouter cannot send payloads and rebalancing of ERC20s is brokenAccess control$0
- Tapioca: exerciseOptionsReceiver() Lack of Ownership Check for oTAP, Allowing Anyone to Use oTAPTokenIDAccess control$0
- Smilee Finance: FeeManager `receiveFee` and `trackVaultFee` functions allow anyone to call it with user-provided dvp/vault address and add any arbitrary feeAmount to any address, breaking fees accounting and temporarily bricking DVP smart contractAccess control$0
- zkSync: Governance logic may enter a deadlockAccess control$0
- zkSync: Wrong encoding of the data in the `sendCompressedBytecode` functionAccess control$0
- Napier: Permissioned rebalancing functions leading to loss of assetsAccess control$0
- Ethereum Credit Guild: Auction manipulation by block stuffing and reverting on ERC-777 hooksAccess control$0
- Ethereum Credit Guild: `PnL` system can be broken by large users intentionally or unintentionally.Access control$0
- INIT Capital: MarginTradingHook#updateOrder lacks access controlAccess control$0
- Ethereum Credit Guild: Wrong ProfitManager in GuildToken, will always revert for other types of gauges leading to bad debtAccess control$0
- Arcadia: `LendingPool#flashAction` is broken when trying to refinance position across `LendingPools` due to improper access controlAccess control$0
- Asymmetry Finance: Lack of access control and value validation in the reward flow exposes functions to public accessAccess control$0
- Olas: CM can `delegatecall` to any address and bypass all restrictionsAccess control$0
- Catalyst Exchange: No access control on IncentivzedMessageEscrow's ``submitMessage`` can lead to a short-term dos of usersAccess control$0
- Covalent: `validatorMaxStake` can be bypassed by using `setValidatorAddress()`Access control$0
- NextGen: Artist signatures can be forged to impersonate the artist behind a collectionAccess control$0
- Wildcat Protocol: Borrower has no way to update `maxTotalSupply` of `market` or close market.Access control$0
- Maia DAO: All tokens can be stolen from `VirtualAccount` due to missing access modifierAccess control$0
- Maia DAO: if the Virtual Account's owner is a Contract Account (multisig wallet), attackers can gain control of the Virtual Accounts by gaining control of the same owner's address in a different chainAccess control$0
- Tapioca DAO: `AaveStrategy.sol`: Changing swapper breaks the contractAccess control$0
- Tapioca DAO: `twTAP.participate()` can be permanently frozen due to lack of access control on host-chain-only operationsAccess control$0
- Tapioca DAO: Tokens can be stolen from other users who have approved MagnetarAccess control$0
- Centrifuge: You can deposit really small amount for other users to DoS themAccess control$0
- Centrifuge: The Restriction Manager does not completely implement ERC1404 which leads to accounts that are supposed to be restricted actually having access to do with their tokens as they see fitAccess control$0
- Maia DAO Ecosystem: Ulysses omnichain - `addbridgeagentfactory` in `rootPort` is not functionalAccess control$0
- Maia DAO Ecosystem: `migratePartnerVault()` in the first vault does not work properlyAccess control$0
- Maia DAO Ecosystem: An attacker can mint an arbitrary amount of `hToken` on `RootChain`Access control$0
- Maia DAO Ecosystem: Overpaying remaining gas to the user for failing `anyExecute` call due to an incorrect gas unit calculation in `BranchBridgeAgent`Access control$0
- Maia DAO Ecosystem: The `RestakeToken` function is not permissionlessAccess control$0
- Maia DAO Ecosystem: `BribesFactory::createBribeFlywheel` can be completely blocked from creating any `Flywheel` by a malicious actorAccess control$0
- Maia DAO Ecosystem: `ERC4626PartnerManager.sol` mints extra `partnerGovernance` tokens to itself, resulting in over supply of governance tokenAccess control$0
- Maia DAO Ecosystem: If a STRATEGY TOKEN is "Toggled off" STRATEGIES will still be able to withdraw, but returning of tokens with `replenishReserves` will be disabled.Access control$0
- Maia DAO Ecosystem: `BoostAggregator` owner can set fees to 100% and steal all of the user's rewardsAccess control$0
- Maia DAO Ecosystem: `RootBridgeAgent.redeemSettlement` can be front-run using `RootBridgeAgent.retrySettlement`, causing redeem to DoSAccess control$0
- Maia DAO Ecosystem: The difference between `gasLeft` and `gasAfterTransfer` is greater than `TRANSFER_OVERHEAD`, causing `anyExecute` to always failAccess control$0
- Maia DAO Ecosystem: `withdrawProtocolFees()` Possible malicious or accidental withdrawal of all rewardsAccess control$0
- Maia DAO Ecosystem: `MIN_FALLBACK_RESERVE` (in `BranchBridgeAgent`) doesn't consider the actual gas consumption in ``AnyCall`` contracts, which lets the user underpay the actual cost when replenishing the execution budgetAccess control$0
- Maia DAO Ecosystem: Removing a `BribeFlywheel` from a Gauge does not remove the reward asset from the rewards depo, making it impossible to add a new Flywheel with the same reward tokenAccess control$0
- Lybra Finance: Rewards for initial period can be lost in all of the synthetix derivative contractsAccess control$0
- Lybra Finance: Incorrectly implemented modifiers in `LybraConfigurator.sol` allow any address to call functions that are supposed to be restrictedAccess control$0
- Asymmetry Finance: `Reth.sol`: Withdrawals are unreliable and depend on excess `RocketDepositPool` balance which can brick the whole protocolAccess control$0
- Asymmetry Finance: Users can fail to unstake and lose their deserved ETH because malfunctioning or untrusted derivative cannot be removedAccess control$0
- Asymmetry Finance: Missing derivative limit and deposit availability checks will revert the whole `stake()` functionAccess control$0
- Asymmetry Finance: Residual ETH unreachable and unutilized in SafEth.solAccess control$0
- Asymmetry Finance: Division before multiplication truncate `minOut` and incurs heavy precision loss and result in insufficient slippage protectionAccess control$0
- Ethos Reserve: Rewards will be locked in LQTYStaking ContractAccess control$0
- Biconomy: Methods used by EntryPoint has `onlyOwner` modifierAccess control$0