Time Lords and Consensus: The "Tachyon" Exploit in CometBFT
Jan 23, 2026·6 min read·10 visits
Executive Summary (TL;DR)
CometBFT (formerly Tendermint) failed to strictly verify that a vote's signer matched the validator set index during block construction. A malicious proposer could exploit this to perform an "identity swap"—attributing a future-dated timestamp from a low-weight validator to a high-weight one, artificially inflating the block's weighted median time. This breaks the chronological integrity of the blockchain.
A critical logic flaw in CometBFT's consensus engine allows a malicious block proposer to manipulate the chain's timestamp (BFT Time). By exploiting a disconnect between signature verification and weight attribution, attackers can skew block time forward, disrupting time-sensitive applications like vesting, unbonding, and IBC.
The Hook: When Time is Relative (and Hackable)
Time in distributed systems is usually a suggestion, not a rule. But in the Cosmos ecosystem, BFT Time is the heartbeat of the blockchain. It governs when your tokens unlock, when governance polls close, and whether your IBC packets expire. CometBFT calculates this time deterministically using a "weighted median" of the timestamps from the validators who voted on the previous block. It’s a clever system designed to ignore clock drift from a few faulty nodes.
But what if you could grab that median and drag it kicking and screaming into the future? Enter Tachyon (GHSA-C32P-WCQJ-J677). This isn't a memory corruption bug or a buffer overflow. It's a logic error in the fundamental machinery of consensus. It turns a malicious proposer into a Time Lord, capable of warping the chain’s perception of reality without ever stealing a private key.
This vulnerability exposes the fragility of assuming that just because a cryptographic signature is valid, the context around it is correct. It’s a classic case of checking the ID card but forgetting to check if the person holding it is actually on the guest list.
The Flaw: A Case of Mistaken Identity
The root cause of Tachyon is a subtle disconnect in the verification logic of LastCommit signatures. In CometBFT, a block contains a set of signatures (votes) from the previous height to prove consensus was reached. To calculate the new block time, the engine takes the weighted median of the timestamps inside those votes.
Here is the catch: The engine verified that the signatures were cryptographically valid for the signer provided in the struct. However, it failed to strictly enforce that the signer provided in the struct actually matched the validator expected at that specific index in the validator set.
Imagine a voting lineup where Seat #1 belongs to a Whale (high voting power) and Seat #100 belongs to a Shrimp (low voting power). The verification logic effectively said, "Is this signature valid for the Shrimp? Yes. Okay, count it for Seat #1." By swapping the identity, a malicious proposer could take a timestamp vote from a controlled, low-weight node (which voted for a time far in the future) and attribute its weight to a high-weight node, skewing the median calculation drastically.
The Code: The Smoking Gun
The fix reveals the severity of the oversight. The developers had to introduce explicit checks to ensure that the address in the commit signature actually matches the address of the validator at that index. Before this patch, the code was trusting the CommitSig payload a little too much.
Here is the critical diff in types/validation.go (simplified for clarity). Look at the new check for validator address mismatch:
// BEFORE: Blindly trusted the mapping
// AFTER: Strict identity verification
if lookUpByIndex {
val = vals.Validators[idx]
// The Fix: Explicitly compare the expected address vs the signed address
if !bytes.Equal(val.Address, commitSig.ValidatorAddress) {
return fmt.Errorf("validator address mismatch at index %d: expected %X, got %X",
idx, val.Address, commitSig.ValidatorAddress)
}
}Additionally, in state/state.go, the MakeBlock function was refactored. Previously, it might have swallowed errors during MedianTime calculation. Now, it fails hard if something smells fishy:
func (state State) MakeBlock(...) (*types.Block, error) {
// ...
ts, err := MedianTime(lastCommit, state.LastValidators)
if err != nil {
// No more silent failures. If time is broken, the block is broken.
return nil, fmt.Errorf("error making block while calculating median time: %w", err)
}
timestamp = ts
// ...
}The Exploit: Warping BFT Time
To exploit this, you need to be the Proposer for the current block (a rotating role in CometBFT). You don't need 2/3 control of the network, just one compromised validator and the proposer slot.
Step 1: The Setup
Control a small validator (Validator B) with minimal stake. Configure Validator B to vote with a timestamp set to T + 10 years. Normally, this vote would be ignored or have such low weight it wouldn't move the median.
Step 2: The Switch
As the Proposer, you construct the LastCommit for your proposed block. You take the valid signature from Validator B (with the future timestamp) and place it in the array index corresponding to Validator A (a massive node with 20% voting power).
Step 3: The Execution Before the patch, the validators receiving your block would verify the signature: "Does this signature belong to Validator B? Yes. Is it a valid vote? Yes." They would then mistakenly apply Validator A's massive voting weight to Validator B's future timestamp during the median calculation.
Step 4: Profit The calculated BFT Time for the new block jumps forward. Vesting contracts unlock instantly. Unbonding periods expire immediately. The chain's internal clock is now broken.
The Impact: Why Should We Panic?
While this doesn't allow double-spending or minting infinite tokens directly, breaking the time consensus is catastrophic for DeFi and governance logic dependent on the chain.
Financial Impact: Many Cosmos chains use staking with unbonding periods (often 14 or 21 days). A time-warp attack could theoretically allow an attacker to unbond instantly, bypassing slashing risks and liquidity constraints. Vesting schedules for team tokens or grants could be accelerated to release funds years early.
Infrastructure Impact: The Inter-Blockchain Communication (IBC) protocol relies heavily on timeouts to ensure packet liveness. Warping time could cause mass packet timeouts, effectively DoSing the bridge connections between chains. Light clients, which trust the header times, would be fed a distorted view of reality, potentially accepting invalid headers.
The Fix: Remediation
This is a consensus-breaking change, meaning all validators must upgrade in a coordinated fashion to avoid a chain split. The patched versions introduce strict validation logic that binds the signer's identity to their slot in the validator set.
Action Items:
- Upgrade Immediately: If you run a validator on a CometBFT-based chain (Cosmos Hub, Osmosis, dYdX, etc.), ensure you are running v0.37.18 or v0.38.21.
- Audit Time-Dependent Logic: Developers should review smart contracts that rely on
block.timestamp. While BFT Time is generally robust, it is not a wall clock. Avoid logic that breaks catastrophically if the block time drifts slightly. - Monitor Block Times: Observability tools should alert if
block.Timedeviates significantly from wall clock time or increases non-linearly compared to block height.
Official Patches
Fix Analysis (1)
Technical Appendix
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:HAffected Systems
Affected Versions Detail
| Product | Affected Versions | Fixed Version |
|---|---|---|
CometBFT CometBFT | < 0.37.18 | 0.37.18 |
CometBFT CometBFT | >= 0.38.0, < 0.38.21 | 0.38.21 |
| Attribute | Detail |
|---|---|
| Attack Vector | Network (Proposer Role) |
| CVSS | 8.1 (High) |
| CWE | CWE-345 |
| Impact | Integrity & Availability (Time Manipulation) |
| Exploit Status | PoC / Conceptual |
| Patch Date | 2026-01-23 |
MITRE ATT&CK Mapping
Known Exploits & Detection
Vulnerability Timeline
Subscribe to updates
Get the latest CVE analysis reports delivered to your inbox.