GitHub Advisoryadvisory · npm

GHSA-vjpq-xx5g-qvmm BSV Blockchain SDK has an Authentication Signature Data Preparation Vulnerability

MEDIUM Published 2026-02-17 Modified 2026-02-18 Official page ↗
Aliases
CVE-2025-69287
Ecosystem
npm
Packages
@bsv/sdk
Severity
Moderate
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weaknesses
CWE-573
Reviewed
2026-02-17

Affected packages

• npm @bsv/sdk: < 2.0.0 → fixed in 2.0.0

Description

BRC-104 Authentication Signature Data Preparation Vulnerability Summary A critical cryptographic vulnerability in the TypeScript SDK's BRC-104 authentication implementation caused incorrect signature data preparation, resulting in signature incompatibility between SDK implementations and potential authentication bypass scenarios. Details The vulnerability was located in the `Peer.ts` file of the TypeScript SDK, specifically in the `processInitialRequest` and `processInitialResponse` methods where signature data is prepared for BRC-104 mutual authentication. Vulnerable Code Locations: • `ts-sdk/src/auth/Peer.ts` lines 527-531 (signing) • `ts-sdk/src/auth/Peer.ts` lines 584-590 (verification) Root Cause: The TypeScript SDK incorrectly prepared signature data by: 1. Concatenating base64-encoded nonce strings: `message.initialNonce + sessionNonce` 2. Then decoding the concatenated base64 string: `base64ToBytes(concatenatedString)` This produced ~32-34 bytes of signature data instead of the correct 64 bytes. Buggy Implementation (Before Fix): ```typescript // CRITICAL BUG: Concatenating base64 strings before decoding data: Peer.base64ToBytes(message.initialNonce + sessionNonce) ``` Correct Implementation (After Fix): The fix properly decodes each base64 nonce individually, then concatenates the byte arrays: ```typescript data: [ ...Peer.base64ToBytes(message.initialNonce), ...Peer.base64ToBytes(sessionNonce) ] ``` Why This is Critical: BRC-104 authentication relies on cryptographic signatures to establish mutual trust between peers. When signature data preparation is incorrect: • Signatures generated by the TypeScript SDK don't match those expected by Go/Python SDKs • Cross-implementation authentication fails • An attacker could potentially exploit this to bypass authentication checks PoC The cross-language test suite demonstrates this vulnerability: 1. Setup: Use identical nonces and cryptographic inputs across TypeScript, Python, and Go SDKs 2. Vulnerable behavior: TypeScript SDK produces different signature data than Go/Python reference implementations 3. Impact demonstration: Authentication attempts between TypeScript clients and Go/Python servers fail due to signature mismatch Test Evidence: ```typescript // Buggy approach (produces ~32-34 bytes) const concatenatedB64 = INITIAL_NONCE_B64 + SESSION_NONCE_B64; const buggyResult = Array.from(Buffer.from(concatenatedB64, 'base64')); // Correct approach (produces 64 bytes) const correctResult = [...INITIAL_NONCE_BYTES, ...SESSION_NONCE_BYTES]; ``` Base64 Padding Short Circuit Analysis: The vulnerability occurs because base64 padding characters (`=`) act as early termination signals for base64 decoders. When concatenating base64 strings before decoding: 1. Individual nonces: Each 44-character base64 string decodes to 32 bytes 2. Concatenated string: 88-character string containing padding in the middle 3. Decoding result: Base64 decoder stops at the first `=` padding character, producing only 32 bytes instead of 64 Example with test data: • `INITIAL_NONCE_B64`: `"QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE="` (44 chars → 32 bytes) • `SESSION_NONCE_B64`: `"QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI="` (44 chars → 32 bytes) • Concatenated: `"QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE=QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI="` • Buggy decode: Only 32 bytes (decoder stops at first `=`) • Correct decode: 64 bytes (32 + 32, decoded separately then concatenated) Impact Vulnerability Type: Cryptographic signature verification bypass Severity: Critical (CVSS 9.1 - Critical) Affected Systems: • TypeScript SDK clients attempting to authenticate with Go or Python SDK servers • Any BRC-104 implementation relying on cross-SDK compatibility • Mutual authentication protocols using the affected signature preparation Who is Impacted: • Applications using the TypeScript SDK for BRC-104 authentication • Systems requiring cross-language/SDK authentication compatibility • Any peer-to-peer authentication scenarios where TypeScript clients communicate with non-TypeScript servers Potential Attack Vectors: • Authentication bypass through signature verification failure • Man-in-the-middle attacks if authentication is silently ignored • Denial of service through failed authentication attempts The fix ensures all SDKs now produce identical cryptographic signatures, restoring proper mutual authentication across implementations.

Related

Alias · CVE (1)

  • CVE-2025-69287 The BSV Blockchain SDK is a unified TypeScript SDK for developing scalable apps on the BSV Blockchain. vulnerability

Weakness · CWE (1)

  • CWE-573 Improper Following of Specification by Caller weakness

References