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
- 70
- Total paid
- $850k
- Critical
- 1
- 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.
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.
PoolTogether: `Vault.mintYieldFee` function can be called by anyone to mint `Vault Shares` to any recipient address
The mintYieldFee function in the PoolTogether Vault contract contained a critical access control vulnerability that allowed unauthorized users to steal protocol-accrued yield fees. The function failed to restrict access to authorized callers and incorrectly allowed the sender to specify an arbitrary address to receive minted shares, rather than sending them to the designated protocol address. By exploiting this, an attacker could mint and claim fee shares intended for the protocol, leading to a direct loss of revenue. The flaw was mitigated by removing the user-inputted recipient parameter and forcing the function to use the hardcoded yield fee recipient address.
The Wildcat Protocol: Role providers can bypass intended restrictions and lower expiry set by other providers
In Wildcat Protocol's credential management logic, role updating rules were intended to prevent one role provider from reducing the expiry duration set by another provider. However, an authorized role provider can circumvent this restriction via a two-transaction sequence. By first issuing a call to extend the user's role expiry slightly beyond its current timestamp, the calling provider becomes the recorded owner of the credential; subsequent calls by that same provider can then arbitrarily reduce or expire the role.
Superposition: Users can't remove liquidity while a pool is disabled
In Superposition's Seawater pool contract, an emergency pool disable mechanism inadvertently locks user funds. While protocol documentation intended to allow liquidity removal during pool pauses, the internal position update function strictly enforced an active pool state assertion regardless of whether liquidity was being added or removed. Consequently, when a pool is disabled during an emergency, users are blocked from withdrawing their liquidity, temporarily trapping funds.
All reports in this group
- Phi: Forced `endTime` extension in `updateArtSettings()` allows attacker to mint more tokensAccess 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: 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
- 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
- Optimism: Unvalidated memory access in `readMem` and `writeMem` functionsAccess control$0
- Olas: `checkpoint` function is not called before staking which can cause loss of rewards for already staked servicesAccess control$0
- Olas: Unauthorized claiming of staking incentives for retainerAccess control$0
- Olas: Arbitrary tokens and data can be bridged to `GnosisTargetDispenserL2` to manipulate staking incentivesAccess control$0
- Olas: Attacker can cancel claimed staking incentives on ArbitrumAccess control$0
- Revert Lend: User might execute `PositionToken` of token set by previous token ownerAccess control$0
- Revert Lend: `setReserveFactor` fails to update global interest before updating reserve factorAccess 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: `V3Utils.execute()` does not have caller validation, leading to stolen NFT positions from usersAccess control$0
- Abracadabra Money: Miscalculation in addLiquidity of Router results in unauthorized spending of tokensAccess 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
- Taiko: Bridge watcher can forge arbitrary message and drain bridgeAccess control$0
- Salty.IO: Development Team might receive less SALT because there is no access control on `VestingWallet#release()`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: Users can use the protocol freely without paying any fees by calling the `DecentEthRouter::bridgeWithPayload()` function directly.Access control$0
- Decent: When `DecentBridgeExecutor.execute` fails, funds will be sent to a random addressAccess control$0
- zkSync: Governance logic may enter a deadlockAccess 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
- Ethereum Credit Guild: Wrong ProfitManager in GuildToken, will always revert for other types of gauges leading to bad debtAccess control$0
- Olas: CM can `delegatecall` to any address and bypass all restrictionsAccess 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: 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
- Maia DAO: All tokens can be stolen from `VirtualAccount` due to missing access modifierAccess control$0
- Tapioca DAO: Tokens can be stolen from other users who have approved MagnetarAccess 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: `AaveStrategy.sol`: Changing swapper breaks the contractAccess 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: `ERC4626PartnerManager.sol` mints extra `partnerGovernance` tokens to itself, resulting in over supply of governance tokenAccess control$0
- Maia DAO Ecosystem: `BribesFactory::createBribeFlywheel` can be completely blocked from creating any `Flywheel` by a malicious actorAccess 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: `migratePartnerVault()` in the first vault does not work properlyAccess control$0
- Maia DAO Ecosystem: `RootBridgeAgent.redeemSettlement` can be front-run using `RootBridgeAgent.retrySettlement`, causing redeem to DoSAccess 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
- 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 difference between `gasLeft` and `gasAfterTransfer` is greater than `TRANSFER_OVERHEAD`, causing `anyExecute` to always failAccess control$0
- Maia DAO Ecosystem: An attacker can mint an arbitrary amount of `hToken` on `RootChain`Access control$0
- Maia DAO Ecosystem: `withdrawProtocolFees()` Possible malicious or accidental withdrawal of all rewardsAccess 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: `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: The `RestakeToken` function is not permissionlessAccess control$0
- Lybra Finance: Incorrectly implemented modifiers in `LybraConfigurator.sol` allow any address to call functions that are supposed to be restrictedAccess control$0
- Lybra Finance: Rewards for initial period can be lost in all of the synthetix derivative contractsAccess control$0
- Asymmetry Finance: Missing derivative limit and deposit availability checks will revert the whole `stake()` functionAccess 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: 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
- Asymmetry Finance: Users can fail to unstake and lose their deserved ETH because malfunctioning or untrusted derivative cannot be removedAccess control$0
- Ethos Reserve: Rewards will be locked in LQTYStaking ContractAccess control$0
- Biconomy: Methods used by EntryPoint has `onlyOwner` modifierAccess control$0