Cosmos SDK and IBC vulnerabilities in disclosed bug bounty reports
App-chain security is consensus security: a module bug can halt a chain or mint supply without any contract being involved.
- Reports indexed
- 133
- Total paid
- $250k
- Critical
- 0
- Largest payout
- $250k
Cosmos chains ship their own state machine, so the vulnerable surface is module code rather than deployed contracts. Non-deterministic execution across validators, unbounded iteration in `BeginBlock`, and panics reachable from user messages all translate directly into liveness failures for the whole network.
IBC adds a cross-chain layer with its own failure modes: packet timeout handling, acknowledgement processing, and the escrow accounting that keeps voucher supply matched to locked supply. Several of the highest-value disclosures in this environment are IBC accounting bugs rather than exploits in the usual sense.
Where CosmWasm is in play, the contract-level classes from the EVM taxonomy reappear, with the addition of reply-handler and submessage ordering issues specific to the runtime.
What reviewers look for
- Non-deterministic behaviour across validator implementations
- Unbounded loops or unbounded state growth in block handlers
- Panics reachable from unauthenticated messages
- IBC escrow accounting divergence between chains
- CosmWasm reply handlers processing untrusted submessage results
Curated highlights
The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.
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.
Dango DEX: Inconsistent multiplication during order creation and cancellation can lead to panics and Denial of Service during order cancellation
Dango DEX, a Rust-based order-book DEX built on the LeftCurve/Grug framework, uses inconsistent multiplication paths when computing ASK quote amounts at order creation versus cancellation. Creation employs an integer-times-decimal multiplication that narrows after dividing by precision, while cancellation multiplies two decimal values whose raw product can exceed u128. An attacker can place an ASK order at a maximum price such that creation succeeds but cancellation always overflows and panics, permanently blocking the administrator's ForceCancelOrders cleanup and creating a persistent administration-level denial-of-service, with no direct loss of funds.
Dango DEX: Ineffective minimum order size check for ASK limit orders can lead to Denial of Service
Dango DEX's ASK-limit-order creation validates order size against the user-supplied quote value, computing amount_in_quote as base times the order's limit price. An attacker can defeat this by posting a 1-wei base quantity with an arbitrarily high price, generating a large volume of economically trivial ImmediateOrCancel orders that never fill. When the cron-driven auction sweeps and refunds all pending IOC orders in a single pass, the excessive order count can blow past block execution time and stall block production on the Tendermint/CometBFT chain. The same flood also exhausts gas in the owner-only ForceCancelOrders path, which cancels every order type, effectively blocking emergency order-book management.
Dango DEX: A newly deployed pool can be DoS
A freshly deployed Dango DEX pool can be permanently bricked (DoS) by any caller supplying exactly zero of both base and quote assets as the very first liquidity provision. Because the code never validates that the initial deposit amounts or the first LP token mint are non-zero, the pool ends up in a state where reserves are still zero but LP supply is non-zero. Every subsequent liquidity provision then invokes add_subsequent_liquidity, which divides by the zero invariant/reserve value and reverts with an arithmetic error, leaving the pool unable to ever operate.
Dango DEX: User can pause all auctions by overflow in mid-price average
Dango DEX's on-chain cron job clears and re-saves resting orders for each trading pair each block, computing a mid-price from the best bid and best ask. Because these prices are stored as Udec128_24 fixed-point values, computing mid_price = (bid + ask) / 2 can overflow at the addition step when the ask is near the type maximum and the bid is a positive value. A user can intentionally place one extreme GTC sell and one small GTC buy on a fresh pair with no passive reserves, so no match occurs and the unchecked checked_add overflows when the resting book is saved. The resulting error bubbles out of the auction submessage into a reply handler that unconditionally sets a global PAUSED=true flag, causing a denial of service on auctions across every pair. The fix is to compute the mid price with the subtraction-safe form lo + (hi - lo) / 2 so the two extremes are never added.
Dango DEX: XYK reflect_curve omits swap fee in order sizing, leaking LP fees
Dango DEX's XYK passive-liquidity reflect_curve computes total order sizes from pool reserves without applying the configured swap fee, so reflected passive orders are matchable as if they were fee-free. A taker can match these orders and pay no swap fee while the pool fails to accrue the fee that liquidity providers should earn. The finding includes a Rust test showing that after matching a passive bid at price 0.99 under a 1% fee, the constant-product invariant K does not increase, confirming no fee accrued. The proposed fix incorporates the (1 - f) term into both the bid and ask sizing formulas.
All reports in this group
- Dango DEX: The first Liquidity Provider can perform a fee less swap by providing unbalanced liquidity.Logic error$0
- Dango DEX: `OwnerMsg::ForceCancelOrders` is unusable due to the DEX contract lacking a `receive` function to accept refunds from cancelled passive liquidity ordersLogic error$0
- Dango DEX: Overflow in geometric can dos swapLogic error$0
- Dango DEX: Users may fail to add liquidity because of overflowInteger overflow/underflow$0
- ZetaChain Cross-Chain: Removing an observer doesn't update an active ballot's voter list, leading to deadlocksLogic error$0
- ZetaChain Cross-Chain: Jailed validators are able to participate in votingLogic error$0
- ZetaChain Cross-Chain: removed observers are still able to voteLogic error$0
- ZetaChain Cross-Chain: Observer rewards are less than expected due to not properly accounting for negative rewardsLogic error$0
- ZetaChain Cross-Chain: ZETA token supply keeps growing on failed `onReceive()` contract callsLogic error$0
- ZetaChain Cross-Chain: Claiming delegation rewards via the precompile can result in a loss of ZETA rewards due to state synchronization issuesLogic error$0
- ZetaChain Cross-Chain: Protocol fee is stuck in the `crosschain` moduleLogic error$0
- ZetaChain Cross-Chain: Setting `RevertGasLimit` to a value larger than `uint64` in the Solidity gateway contract will cause a panic that prevents finalizing the inbound CCTX and observers from receiving block rewardsLogic error$0
- ZetaChain Cross-Chain: Stateful precompiles panic on empty calldata, which can be exploited to prevent finalizing outbound CCTXsLogic error$0
- SEDA Protocol: Tallying a Data Request with a wildcard expression in its consensus filter will store non-deterministic data and cause a chain haltLogic error$0
- SEDA Protocol: Anyone can post a request with `gasPrice` of 0 to cause SEDA chain to haltLogic error$0
- SEDA Protocol: Anyone can crash validators with a Tally VM program that panics the call_result_write importLogic error$0
- SEDA Protocol: Anyone can pass any length to some Tally imports to inflate memory, induce OOM, and crash validatorsLogic error$0
- SEDA Protocol: Chain can deadlock due to no consensus because New Validators can not submit vote extensionsLogic error$0
- SEDA Protocol: ExecuteTallyVM has a memory leak which will lead to nodes eventually crashingLogic error$0
- SEDA Protocol: Mean-Based Outlier Detection Vulnerability Allows Single Node to Sabotage ConsensusLogic error$0
- SEDA Protocol: Data requests queue can be DoS'edLogic error$0
- SEDA Protocol: Gas costs are severely underpriced for certain WASM instructions which can lead to network DoSLogic error$0
- SEDA Protocol: Attackers can flood validators with Commit/Reveal execution messages to delay blocks or DOS the nodeLogic error$0
- SEDA Protocol: Wrong amount of gas will be used in a certain caseLogic error$0
- SEDA Protocol: Malicious proposer can submit a request with large invalid transactions because of no mempool to bloat the block storeLogic error$0
- SEDA Protocol: A request poster can set gas_price to 1 and pay minimal fees for a lot of gas and drain validators' resourcesLogic error$0
- SEDA Protocol: Executors will get underpaid while excessive gas will be refunded to the requestorLogic error$0
- SEDA Protocol: The outlier gets the reduced payout when there is consensus on errorsLogic error$0
- SEDA Protocol: Signatures for the first batch will be rejected by VerifyVoteExtensionHandlerLogic error$0
- SEDA Protocol: Validators will not be able to sign first batchLogic error$0
- SEDA Protocol: Attacker can front-run Withdraw and steal the withdrawalFront-running / MEV$0
- SEDA Protocol: A jailed validator with no registered key blocks proving scheme activationLogic error$0
- SEDA Protocol: Anyone can front-run the creation of a vesting account to block itFront-running / MEV$0
- SEDA Protocol: `call_result_write` import can be exploited for unmetered execution and memory growthLogic error$0
- Babylon Chain Launch (Phase-2): Refund mechanism doesn't make sure that there is a fee granterLogic error$0
- Babylon Chain Launch (Phase-2): Btcstaking module allows `stakingTx` to be coinbase transaction which is unslashable for 100 blocksLogic error$0
- Babylon Chain Launch (Phase-2): Message is indexed as refundable even if the signature was over a forkLogic error$0
- Babylon Chain Launch (Phase-2): The EXPIRED judgment does not include the current blockLogic error$0
- Nibiru: Non-deterministic gas consumption due to shared `StateDB` pointer in bank keeper affecting consensusLogic error$0
- Nibiru: Vesting account preemption attack preventing future contract deploymentLogic error$0
- Nibiru: Nonce can be manipulated by inserting a contract creation `EthereumTx` message first in an SDK TX with multiple `EthereumTX` messagesLogic error$0
- Nibiru: Gas refunds use block gas instead of transaction gas, leading to incorrect refund amountsLogic error$0
- Nibiru: The `bankBalance` function failed to handle errors correctlyLogic error$0
- Nibiru: Gas used mismatch in failed contract calls can lead to wrong gas deductionsLogic error$0
- Nibiru: Inconsistent fee denomination handling in transaction validation and buildingLogic error$0
- Nibiru: Hardcoded gas used in ERC20 queries allows for block production halt from infinite recursionLogic error$0
- Nibiru: Unlimited Nibi could be minted because evm and bank balance are not synced when stakingLogic error$0
- Nibiru: Gas is not consumed when precompile method fail, allowing resource consumption related DOSLogic error$0
- Coded Estate: Adversary can use `send_nft` to bypass the payment and steal seller's token in auto-approve scenarioLogic error$0
- Coded Estate: Insufficient price validation in `transfer_nft` function enables theft of listed tokensLogic error$0
- Coded Estate: Attakers can steal the funds from long-term reservationLogic error$0
- Coded Estate: `setbidtobuy` allows token purchase even when sale is no longer listedLogic error$0
- Coded Estate: Reservations can be made outside of rental property's `available_period`Logic error$0
- Coded Estate: Can impersonate another high value rental because `token_uri` is arbitrary and supplied by userLogic error$0
- ZetaChain: `AddToInTxTracker` doens't allow permissionless tx validation for Bitcoin chain, InTxTracker permissionless tx validation for Bitcoin chain will always failLogic error$0
- ZetaChain: `AddBlockHeader` Cannot Cope with ReorgsLogic error$0
- ZetaChain: Lagging median gas price when the set of observers changesLogic error$0
- ZetaChain: Arbitrary destination gas limit for `CoinType_Zeta` cctxs results in paying lower gas feesLogic error$0
- ZetaChain: Zeta Supply Inflation on Deploy Fungible Gas CoinLogic error$0
- ZetaChain: A single malicious observer can exploit the infinite gas meter to grief ZetaChain blocks without proper gas compensationLogic error$0
- ZetaChain: Observer can halt outbound cctxs and steal fundsLogic error$0
- ZetaChain: UpdateSystemContract is not copying `gasPriceByChainId` state variable to the new upgraded which will halt ZRC20 token withdraw until system contract is updated accordinglyLogic error$0
- ZetaChain: Incorrect genesis initialization of pending noncesLogic error$0
- ZetaChain: The outbound transaction tracker only keeps track of a maximum of two different transaction hashes, preventing cctxs from being efficiently confirmed and blocking the outbound transaction queueLogic error$0
- ZetaChain: The `Sender` of an outbound cctx originating from the zEVM is potentially set to an incorrect sender address resulting in lost assets during a refundLogic error$0
- ZetaChain: A single malicious observer can fill the block space with `MsgGasPriceVoter` messages without proper gas compensation resulting in griefing blocksLogic error$0
- ZetaChain: ZRC20 Token Pause Check BypassLogic error$0
- ZetaChain: Limited Voting Options Allow Ballot Creation SpamLogic error$0
- ZetaChain: JSON-RPC DoS through WebsocketsLogic error$0
- ZetaChain: `PayGasFeeInZetaAndUpdateCctx()` is prone to slippage, causing sender overpays the revert gas and lose returned fundsLogic error$0
- Canto: Incorrect names provided in `RegisterConcrete` calls break `LegacyAmino` signing methodLogic error$0
- Canto: `Govshuttle` module does not register its transaction `MsgServer`Logic error$0
- Canto: `MsgSwapOrder` will never work for Canto nodesLogic error$0
- Canto: An attacker can DoS a coinswap poolLogic error$0
- Allora: The SelectTopNWorkerNonces function lacks a sorting algorithm internally.Logic error$0
- Allora: `GenerateForecastScores` acidentally updates inferences scoresLogic error$0
- Allora: math miscalculation artificially deflates scoresLogic error$0
- Allora: Silent Failure in MustNewDecFromString Can Lead to Node CrashesLogic error$0
- Allora: Topics wont activate even with a sufficient stakeLogic error$0
- Allora: Missing highestVotingPower Update in argmaxBlockByStake Resulting in Incorrect Block SelectionLogic error$0
- Allora: Standard deviation calculation is biasedLogic error$0
- Allora: The formula for forecast normalization differs from the one in the whitepaper.Logic error$0
- Allora: Mint and Emissions modules register errors with an error code of 1Logic error$0
- Allora: incorrect condition for the iterative update of Equation 34Logic error$0
- Allora: Malicious peer can cause a syncing node to panic during blocksyncLogic error$0
- Allora: SetDelegateStakePlacement error is not handled in RewardDelegateStakeLogic error$0
- Allora: Funding amount is accounted twice leading to activating topic before reaching the global minimumLogic error$0
- Allora: `msg_server_stake::AddStake` calculates the weight incorrectly resulting in incorrect activation of a topicLogic error$0
- Allora: Treasury cap restriction will not hold and one block per month will be compromisedLogic error$0
- Allora: The worker and reputer's payload may be tampered due to lack of check for the pubkey's ownershipLogic error$0
- Allora: The malicious node may not execute the http requestLogic error$0
- Allora: If old coefficient is bigger than the new one then the reputer has it's coeff reduced more than it shouldLogic error$0
- Allora: SafeApplyFuncOnAllActiveEpochEndingTopics processes two more pages than the desired max topic pageLogic error$0
- Allora: emissions/keeper/GetIdsOfActiveTopics may always return empty array []Logic error$0
- Allora: Anyone can overwrite Reputer and Worker info attached to a LibP2PKeyLogic error$0
- Allora: Not appropriate Inferences will be used when calculating the forecastLogic error$0
- Allora: logic bug in this IBC middleware code related to packet handling.Logic error$0
- Allora: Potential race conditions due to usage of ````sdk.Context```` in concurrent goroutinesLogic error$0
- Allora: `AlloraPendingRewardForDelegator` module account could have insufficient rewards due to truncationLogic error$0
- Allora: Broken invariant : the sum of all (delegateRewardsPerShare * delegated stakeLogic error$0
- Allora: Lack of Authentication in OnRecvPacketAccess control$0
- Allora: SendDataWithRetry doesn't work properly(Retries will not happen)Logic error$0
- Allora: Incomplete Zero-Height Genesis Preparation in Allora NetworkLogic error$0
- Allora: Adversary can arbitrarily trigger a chain halt by sending `MsgRemove{Delegate}Stake` with negative amountLogic error$0
- Allora: RemoveDelegateStake silently handles the error when checking for existing removalsLogic error$0
- Allora: Lack of error handling when making blockless api callLogic error$0
- Allora: coefficients math mistakenly calculates the coefficient diff with the same valueLogic error$0
- Allora: Unchecked Error in ResetChurnableTopics FunctionLogic error$0
- Allora: RemoveStakes and RemoveDelegateStakes silently handle errors in EndBlockerLogic error$0
- Allora: `GetForecastScoresUntilBlock` can get more score samples than the max allowedLogic error$0
- Allora: topic_rewards/SafeApplyFuncOnAllActiveEpochEndingTopics used the wrong parametersLogic error$0
- Allora: `DripTopicFeeRevenue` drips the internal `topicFeeRevenue` and not the one provided by `GetCurrentTopicWeight`Logic error$0
- Allora: Malicious Reputer cause emissions/msgserver/InsertBulkReputerPayload to failLogic error$0
- Allora: Some Iterators are not closed in emissions module KeeperLogic error$0
- Allora: Incomplete Topic Processing Due to Continuous Retry on Pagination ErrorLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: Valid VFS paths with usernames can always fail validationLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: if Slash Validator occurs, UNSTAKING_QUEUE's unstake amount will not be accurateLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: the DEFAULTVALIDATOR cannot be changedLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: execute_claim() possible loss of accuracy or even inability to retrieve fundsInteger overflow/underflow$0
- Andromeda – Validator Staking ADO and Vesting ADO: Permission checks will unnecessarily consume Limited usesLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: when a validator is kicked out of the bonded validator set ,unstake funds will remain in the contractLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: Staked tokens will get stuck after claimLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: is_permissioned() may underflowLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: Changes of the `UnbondingTime` are not accounted forLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: is_permissioned() It doesn't make sense to have permissions by default after Blacklisted expires.Logic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: Calculating tax amount does not include taxes in `WasmMsg::Execute` messagesLogic error$0
- Andromeda – Validator Staking ADO and Vesting ADO: Batch creation will break if vestings are opened to recipientsLogic error$0