FRB Security Research

COLDCARD RNG incident: how weak entropy became an on-chain event

A developer-focused report connecting the public firmware root cause to reproducible on-chain evidence, without publishing seed-recovery tooling, victim addresses, or private material.

Evidence snapshot verified 12 August 2026
COLDCARD RNG incident: how weak entropy became an on-chain event

Direct answer

The incident traces to a firmware path where a disabled hardware RNG was still selected by a preprocessor check, allowing a deterministic fallback generator to influence seed creation. Newer devices added hardware material, but only a 32-bit derived value entered the reseed path. Firmware updates close the generation flaw; they do not strengthen seeds created earlier.

4

reported first-wave collector clusters

1,195

graph-linked source inputs in wave one

1,478

graph-linked source inputs in follow-on observations

2

primary technical advisories cited

The technical method, step by step

This is the public, defensible explanation of the failure chain. It is detailed enough for firmware and wallet developers to review the class of defect, but it stops before operational key recovery.

Diagram showing the COLDCARD RNG control-flow weakness from configuration to public-address validation
Figure 1. The weakness is a chain: configuration semantics, fallback selection, low-entropy state, derivation, then public validation. No single hash step restores missing entropy.
01

Configuration said “disabled”

The board configuration defined the RNG feature as zero. That expresses a disabled value, but the symbol still exists to the preprocessor.

02

The guard checked existence, not value

A conditional compiled the fallback path when the RNG symbol was defined, even when its value was zero. The linked rng_get implementation therefore resolved to a deterministic software generator instead of a hardware entropy source.

03

Observable device state seeded the fallback

The fallback initialization mixed identifiers and timer registers. These values can vary, but they are not equivalent to cryptographically independent entropy and can be constrained by device behavior and call order.

04

Hashing did not create missing entropy

Downstream hashing and BIP-39 checksum processing can distribute existing uncertainty; they cannot manufacture entropy that was absent from the generator state.

05

Newer devices truncated the reseed

On later devices, hardware RNG reads were hashed, but only four digest bytes were unpacked into the reseed value. That bounds the direct reseed contribution to 32 bits, subject to the wider execution context.

06

Public addresses become a validation oracle

An attacker who can enumerate plausible internal states can derive public keys or addresses and compare them with public blockchain data. This explains the risk model; it is not an end-to-end benchmark or a claim that every seed is equally recoverable.

The control-flow mismatch in four safe fragments

These fragments describe the root cause without providing a wallet-recovery loop.

Board setting
#define MICROPY_HW_ENABLE_RNG (0)
Incorrect existence check
#ifndef MICROPY_HW_ENABLE_RNG
Fallback state ingredient
pad = UID_low32 ^ SysTick->VAL
Later reseed boundary
reseed = SHA256d(rng1 || rng2)[0:4]
Timeline of COLDCARD firmware regression, affected generations, disclosure, and fixed releases
Figure 2. Updating closes future vulnerable generation, but a seed produced on affected firmware must be migrated.

Affected firmware and the action boundary

The matrix below follows Coinkite’s public advisory. Device owners should verify the current vendor guidance before acting because release channels may change.

Device familyAffected rangeFixed releaseWhat the fix means
Mk2 / Mk34.0.1 through 4.1.94.2.0 or laterNew seed generation uses the corrected path; old seeds remain weak.
Mk4 / Mk5Standard releases before 5.6.05.6.0 or laterThe corrected release prevents future generation through the affected path.
COLDCARD QStandard releases before 1.5.0Q1.5.0Q or laterUpdate first, then create and migrate to a new seed.
Edge channelBefore 6.6.0X / 6.6.0QX6.6.0X / 6.6.0QX or laterUse the fixed channel release appropriate to the device.

A firmware update does not retroactively add entropy to an existing seed. The defensive action is a newly generated seed on fixed software followed by a verified migration.

What the public chain shows

We reproduced a bounded public snapshot from reported collector labels and Blockstream’s public address and transaction endpoints. The table is evidence of flow, not proof of operator identity and not a definitive victim or loss total.

Diagram showing two observed COLDCARD incident consolidation waves and the rule against double counting
Figure 3. Source inputs and later consolidation outputs are stages of the same graph. Adding both as separate losses would double count the flow.

Wave one linked source-input volume

1,082.58680432 BTC

Reproduced graph snapshot; labels are public incident reports, not identity attribution.

Follow-on linked source-input volume

76.09142381 BTC

Reproduced graph snapshot; labels are public incident reports, not identity attribution.

Publicly reported collector addresses

WaveFirst observedAddressTotal received at snapshotAddress tx count
Wave 12026-07-30bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0594.47727254 BTC506
Wave 12026-07-30bc1qc779m8gec84k3t0ffvu0pps94zheht7lr7ueyn398.48587857 BTC492
Wave 12026-07-30bc1qdaarag7729c2n4l2wnyt3hkhfpcs66n98z7uuh88.85045709 BTC101
Wave 12026-07-30bc1qh0l7q0mca3ln7wsl9luwns0jc9jhgrtft025l40.77324382 BTC105
Wave 22026-07-31bc1qsjrf5ze5tmulz7y2x4pc7qaex2a35sanp3rqlx45.90666052 BTC1217
Wave 22026-08-07bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp630.18478329 BTC96

“Total received” is an address statistic as observed on 12 August 2026. Do not add these balances to downstream consolidation outputs or describe the sum as confirmed theft.

Representative consolidation transactions

ObservedInputsSingle outputTransaction
2026-07-30 01:43 UTC491398.47573857 BTC14edd9ee8445…
2026-07-30 01:43 UTC20489.62327890 BTC4b50d61a3d6e…
2026-07-30 01:51 UTC341562.01962301 BTC0c6bf853a645…
2026-07-31 09:22 UTC121245.90251994 BTCba119968ec4b…
2026-08-07 03:35 UTC9330.18461329 BTC93df0d26e08c…

Reproducible on-chain methodology

  1. 01Start only from collector labels already published in incident reporting; exclude self-reported victim addresses from the public page.
  2. 02Query public address and transaction endpoints, preserving transaction IDs, confirmation times, input counts, output values, and the verification date.
  3. 03Recalculate BTC values from integer satoshis rather than formatted screenshots or market-price estimates.
  4. 04Deduplicate by transaction ID and classify source, first-stage, and second-stage nodes before aggregating.
  5. 05Never add a consolidation output to the source inputs that funded it; both describe the same flow at different stages.
  6. 06Treat graph labels as observed relationships. A blockchain path alone does not prove ownership, intent, device model, or legal responsibility.

Defensive reproduction, without real wallets

A separate local harness used 1,000 deterministic synthetic wallets to validate BIP-39 checksum handling, expected-address re-derivation, and test-vector uniqueness. All 1,000 synthetic vectors re-derived successfully and five bounded recovery smoke tests passed. The dataset contains no real wallet material and is not published because the objective is engineering validation, not operational recovery.

Important limits

  • Neither the official source nor this report claims a universal end-to-end brute-force time.
  • The 32-bit reseed observation is not automatically equivalent to exactly 32 bits of complete seed security; call history and fallback state still matter.
  • Collector addresses can receive unrelated or later funds, so current address totals are not a frozen loss ledger.
  • The public graph does not identify the actor and cannot independently prove every source input came from the same firmware defect.
  • FRB Agent is not a Bitcoin hardware wallet and this report does not claim FRB prevents this incident class.

Defensive actions for potentially affected owners

01

Read the current Coinkite advisory and confirm the exact device and firmware channel.

02

Update to a fixed firmware release before generating replacement material.

03

Create a new seed using a corrected process; follow the vendor’s dice guidance if using manual entropy.

04

Move assets from all wallets derived from the affected seed, including passphrase-derived wallets, after verifying the new backup.

05

Do not post seed words, xprvs, private keys, or suspected victim addresses in support threads or public checkers.

Why execution developers should care

The incident is a reminder that “local” and “non-custodial” are architecture boundaries, not automatic proofs of safety. Entropy, signer firmware, key lifecycle, update provenance, simulation, and operator verification remain separate controls. FRB’s security pages document its own local-signing boundary; they do not substitute for wallet-firmware review.

Primary sources and live evidence

Sources were checked on 12 August 2026. Explorer state can change as addresses receive or spend funds.

Frequently asked questions

Does updating firmware repair an old seed?

No. The update corrects future seed generation. A seed created through the affected path must be replaced and funds migrated to addresses derived from new material.

Was this a remote exploit against the device?

The documented weakness is in seed generation. The public attack model uses constrained candidate state plus public blockchain data as a validation oracle; it does not require later remote control of the hardware wallet.

Does a 32-bit reseed mean every seed can be recovered instantly?

No. It bounds one contribution to the reseed path, but practical exploitability also depends on fallback state, call order, observations, derivation targets, and implementation details. No universal timing claim is made here.

Why publish collector addresses but not victim addresses?

Collectors are already public incident labels and help independent researchers verify consolidation flows. Victim addresses add privacy risk and are unnecessary for explaining the technical or graph methodology.

Why is recovery code omitted?

The page is intended to help developers audit entropy and help owners migrate safely. An executable seed-recovery pipeline would add misuse risk without improving the public root-cause evidence.

Control the Pulse

Expand Your Execution

Maximize your edge by exploring the full FRB toolkit. From institutional-grade telemetry to ready-to-export strategy scripts.

Frequently Asked Questions