Worked example · 2022-20
Cosmos-SDK Validator Downtime Jailing and Slashing-Evasion Patterns — 2022–2025
Summary
Per the Cosmos SDK slashing module documentation, validator liveness is tracked over a sliding window of SignedBlocksWindow blocks. When the missed-block count exceeds the window minus MinSignedPerWindow times the window, the validator is slashed by SlashFractionDowntime, jailed for DowntimeJailDuration, and its missed-block counters are reset. A jailed validator must send MsgUnjail, which fails unless the validator exists, has nonzero self-delegation, is jailed, is not tombstoned and has passed its JailedUntil time. The docs' example values are a 100-block window, 0.5 minimum signed fraction, 600s jail and 0.01 downtime slash; these are examples, and each chain sets its own. Double-signing is a separate consensus fault with its own fraction (0.05 in the docs' example), tombstoning the validator, which then cannot unjail; liveness slashes do not tombstone.
The delegator impact and the manual unjail requirement follow from this design: delegations to a jailed validator earn nothing while it is out, and a jailed operator who cannot send the unjail transaction stays out longer than the minimum jail time.
The sourced slashing-evasion item is Cosmos SDK advisory ASA-2024-005, "Potential slashing evasion during re-delegation" (severity Low, CWE-372): if a delegation contributed to a validator's byzantine behaviour and the validator had not yet been slashed, the delegator could use re-delegation to evade the pending slash. It was reported to the Cosmos Bug Bounty Program on 2023-12-06, published 2024-02-27 and fixed in 0.50.5 and 0.47.10 (affects 0.50.4 and earlier, 0.47.9 and earlier). The original draft's claim that a validator can self-unbond and thereby be beyond slashing is not supported by the cited sources; the SDK docs describe slashing code that handles unbonding delegations and redelegations by height.
Timeline (UTC)
| When | Event | OAK ref |
|---|---|---|
| 2023-12-06 | Redelegation slashing-evasion issue reported to the Cosmos Bug Bounty Program | T14.001 |
| 2024-02-27 | ASA-2024-005 published; fixed in SDK 0.50.5 and 0.47.10 | T14.001 (slashing-evasion class, redelegation) |
| Continuing | Chain-specific downtime parameters keep a standing T14.006 surface | T14.006 |
Public references
[cosmosslashingdocs]— Cosmos SDK documentation, "x/slashing": https://docs.cosmos.network/sdk/latest/modules/slashing/README[asa2024005]— Cosmos SDK GitHub advisory, "ASA-2024-005: Potential slashing evasion during re-delegation" (2024-02-27): https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-86h5-xcpx-cfqc- See
techniques/T14.001-slashing-condition-exploit.mdandtechniques/T14.006-validator-proposer-liveness-fault-griefing.mdfor Technique definitions.
Discussion
The Cosmos-SDK downtime-jailing mechanism anchors the cross-chain parameter-differentiation sub-class of T14.001 and T14.006: slashing and jailing parameters are chain-specific, so a chain's choices determine how attractive liveness-fault griefing is. The surface is a property of the SDK's slashing module and of each chain's configuration. A cross-chain comparison of penalty regimes remains a research item; exact per-chain values should be taken from each chain's on-chain parameters rather than from this file.