AI-generated analysisPublished automatically and not human-verified. Validated context appears in community notes below.
← Watch feed
Low 35 Bitcoin

fix(legacy): align coinjoin behavior with core

Public commit record

What the developer wrote

Authored by Andrew Kozlik

85/100 · Strong
fix(legacy): align coinjoin behavior with core

An authorization granted by DoPreauthorized was consumed by whatever
message arrived next, and the same applied to a path unlocked by
UnlockPath. Core allows a coinjoin preauthorization to be used only by
SignTx and GetOwnershipProof, and an unlocked path only by GetAddress,
GetPublicKey and SignTx. Apply the same allowlists by dropping the
authorization before dispatching a message it does not apply to, which
reproduces core's behavior of aborting the workflow and reprocessing the
message as a new one.

This is defense in depth rather than a fix for a reachable issue. The
authorization is stored per session, so whoever can use it is the host
that ran AuthorizeCoinJoin, which already holds the SLIP-25 xpub from a
confirmed UnlockPath. Without the allowlist a coinjoin authorization
additionally let GetAddress and GetOwnershipId reach the SLIP-25
external chain without the coinjoin account access confirmation. The
xpub was never exposed, as GetPublicKey checks unlock_path directly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
The short version

What changed, and why it matters

This commit tightens access controls in the older Trezor firmware (legacy) for a privacy feature called CoinJoin. Previously, after a host app was pre-authorized, any next message could consume that authorization. Now only specific message types (SignTx and GetOwnershipProof for preauthorization; GetAddress, GetPublicKey, and SignTx for an unlocked path) can use it. The vendor describes this as defense in depth, not a fix for a directly reachable attack, because the host that could trigger it already has related access. Still, without the change, a preauthorization could let GetAddress or GetOwnershipId touch the CoinJoin account without showing the user the usual confirmation screen.

Recommended action

Treat as a security hardening patch for the legacy firmware. Users relying on CoinJoin/SLIP-25 on legacy devices should update when a release containing this commit is available. Reviewers should verify that the allowlists match Core exactly and that no other message types legitimately rely on the broader authorization.

Security signals we found

01

Authorization scope restriction (allowlist)

02

Defense-in-depth hardening for SLIP-25/CoinJoin path

03

Behavioral alignment between legacy and Core firmware

04

Added regression test for forbidden key-path access via preauthorization

Risk score

Why this scored 35/100

Our methodology →
Potential impact 8/30
Exploitability 4/25
Stealth signal 5/15
Affected reach 6/15
Confidence 8/10
Evidence quality 4/5
Human-validated context

Community notes

Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.

No validated notes yet.

The AI analysis stands alone for now. Submit a note if you can add evidence or important context.