Skip to main content

bitcoinj-core CVE-2026-44714

| EUVDEUVD-2026-30571 HIGH
Improper Verification of Cryptographic Signature (CWE-347)
2026-05-08 https://github.com/bitcoinj/bitcoinj GHSA-hfcf-v2f8-x9pc
7.5
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit crafted Bitcoin transaction
  2. Delivery
    Inject attacker-controlled pubkey/signature pair
  3. Exploit
    Trigger correctlySpends() fast-path validation
  4. Execution
    Bypass missing hash verification
  5. Persist
    Application accepts fraudulent transaction
  6. Impact
    Business logic processes invalid spend

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V11 - Cryptography Signature verification
Exploitation Conditions

Exploitation requires that the target application uses bitcoinj-core versions 0.15.0 through 0.17.0 and operates OUTSIDE the standard SPV (Simple Payment Verification) trust model. Specifically vulnerable are applications that call ScriptExecution.correctlySpends() - either directly or through affected methods in TransactionInput.java:546, Wallet.java:4520, LocalTransactionSigner.java:84, or CustomTransactionSigner.java:77 - and make security-critical decisions based on the return value for P2PKH or P2WPKH transaction validation. The application must process attacker-supplied Bitcoin transactions (via API, RPC interface, or network peer connections) and rely on local signature verification rather than pure SPV proof-of-work following. Standard SPV wallet implementations are NOT vulnerable because they do not verify input signatures locally. Most at risk are custom payment processors, layer-2 protocol implementations (Lightning Network components), Bitcoin exchanges with non-standard validation logic, and any service using correctlySpends() for authorization checks outside Bitcoin's consensus validation. Network access (AV:N) means attacker can deliver malicious transactions remotely without requiring local system access. No authentication (PR:N) or user interaction (UI:N) required once the vulnerable application accepts transaction data for validation. Default configurations are exploitable if they include the vulnerable code path in their transaction processing pipeline.

Impact

CVSS rates this 7.5 HIGH (AV:N/AC:L/PR:N/UI:N) indicating network-exploitable without authentication or user interaction, but impact is limited to integrity (I:H) with no confidentiality or availability compromise. However, real-world risk depends heavily on deployment context. For SPV nodes (majority of bitcoinj usage in lightweight wallets), there is NO direct risk because SPV follows longest proof-of-work chain without local signature verification. Risk is HIGH ONLY for non-SPV applications that: (1) call correctlySpends() for input validation, (2) make security decisions (transaction acceptance, pre-signing authorization) based on its return value, and (3) operate outside Bitcoin's consensus layer (e.g., payment processors with custom validation, layer-2 protocols). The CVSS vector's PR:N may be misleading - exploitation requires the target application to process attacker-crafted transactions through the vulnerable code path, which in practice requires some application-specific delivery mechanism. No EPSS score available limits quantitative exploitation probability assessment. Not listed in CISA KEV indicates no confirmed active exploitation despite public disclosure and patch availability since version 0.17.1 release. GitHub advisory provides detailed technical breakdown and proof-of-concept code snippets, lowering exploitation barrier for sophisticated attackers targeting vulnerable integrations. Primary risk is to custom Bitcoin applications and layer-2 implementations that depend on bitcoinj for transaction validation outside standard SPV workflows.

Exploit ScenarioDerived

An attacker targeting a Bitcoin payment processor that uses bitcoinj for transaction pre-validation crafts a fraudulent transaction attempting to spend a P2PKH output they don't control. Instead of providing the legitimate public key that hashes to the output's committed hash, they insert their own keypair and generate a valid ECDSA signature with their private key. When the payment processor's validation logic calls ScriptExecution.correctlySpends(), the vulnerable fast-path verifies the attacker's signature against the attacker's public key and incorrectly returns success, bypassing the missing hash comparison check. The processor's application logic interprets this as a valid spend authorization and processes the fraudulent transaction, potentially crediting the attacker's account or triggering downstream business logic. If the transaction reaches the Bitcoin network, consensus nodes with correct verification (Bitcoin Core) would reject it, but damage occurs in the application's internal state or off-chain systems that trusted the flawed local validation.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.0% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – May 08, 2026

Signature verification bypass in bitcoinj-core library allows attackers to forge Bitcoin transaction validations by exploiting fast-path optimization flaws in P2PKH and P2WPKH script execution. Versions 0.15 through 0.17.0 fail to verify that attacker-supplied public keys match the hash committed to in transaction outputs, enabling arbitrary keypairs to satisfy local transaction validation checks. While this does not affect SPV (Simple Payment Verification) nodes that follow proof-of-work without signature verification, applications using the correctlySpends() method for transaction validation or pre-signing checks are vulnerable to accepting fraudulent transactions. Vendor-released patch available in version 0.17.1, fixes confirmed in GitHub commits 2bc5653c and b575a682. No active exploitation confirmed (not in CISA KEV); EPSS data unavailable.

RemediationAI

Upgrade org.bitcoinj:bitcoinj-core to version 0.17.1 or later, which contains fixes in commits 2bc5653c41d260d840692bc554690d4d79208f9c (release-0.17 branch) and b575a682acf614b9ff95cacbdeb48f86c3ababe0 (master branch). Update your Maven or Gradle dependency to 'org.bitcoinj:bitcoinj-core:0.17.1' - the patched version is available on Maven Central. For applications that cannot immediately upgrade, implement compensating controls by avoiding reliance on correctlySpends() return values for security-critical validation decisions in non-SPV contexts. Specifically, for any transaction acceptance or authorization logic outside standard SPV operation, add explicit verification that HASH160(extracted_pubkey) matches the committed hash in scriptPubKey for both P2PKH and P2WPKH spends before trusting correctlySpends() results. Note this workaround requires reimplementing the missing hash verification logic and has maintenance overhead risk. For applications using SPV trust model exclusively (following longest proof-of-work chain without local signature verification), no immediate action is required beyond normal upgrade cycles, as SPV operation is unaffected by this flaw. Vendor advisory and technical details: https://github.com/bitcoinj/bitcoinj/security/advisories/GHSA-hfcf-v2f8-x9pc. Release information: https://github.com/bitcoinj/bitcoinj/releases/tag/v0.17.1.

Affected VersionsENISA

bitcoinj < 0.17.1

Affected Packages

maven org.bitcoinj:bitcoinj-core fix: 0.17.1
euvd bitcoinj fix: 0.17.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in maven, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

bitcoinj is a Java implementation of the Bitcoin protocol used by wallets and applications to interact with Bitcoin networks. The vulnerability resides in the ScriptExecution.correctlySpends() method's optimized fast-paths for two standard Bitcoin transaction types: Pay-to-PubKey-Hash (P2PKH) and native Pay-to-Witness-PubKey-Hash (P2WPKH). These fast-paths were designed to bypass full Bitcoin Script interpreter execution for performance, but introduced a critical logic error. In Bitcoin's UTXO model, outputs lock funds to a specific public key hash - the spender must provide a public key that hashes to that committed value. The vulnerable code verifies ECDSA signatures against attacker-supplied public keys but skips the crucial HASH160(pubkey) == committed_hash check mandated by Bitcoin's OP_EQUALVERIFY opcode semantics. For P2WPKH, the flaw is compounded because the attacker-controlled pubkey is used to construct the scriptCode for BIP143 signature hashing, allowing complete control over the verification context. This is classified as CWE-347 (Improper Verification of Cryptographic Signature) because the cryptographic operation succeeds but lacks binding to the claimed identity. The affected CPE is pkg:maven/org.bitcoinj:bitcoinj-core covering versions ≥0.15 and <0.17.1.

Know when Java gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N

Primary rating from GitHub Advisory · only source for this CVE.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
High
Availability
None

DescriptionGitHub Advisory

Summary

ScriptExecution.correctlySpends() contains two fast-path verification bugs for standard P2PKH and native P2WPKH spends in core/src/main/java/org/bitcoinj/script/ScriptExecution.java.

In both branches, bitcoinj verifies an attacker-controlled signature/public-key pair but fails to verify that the public key is the one committed to by the output being spent. As a result, any attacker keypair can satisfy bitcoinj's local verification for arbitrary P2PKH and P2WPKH outputs.

This doesn't affect the SPV (simple payment verification) trust model, as this model follows PoW and doesn't verify input signatures at all.

Details

The issue is in the optimized branches of ScriptExecution.correctlySpends(...).

In the P2PKH fast path at core/src/main/java/org/bitcoinj/script/ScriptExecution.java:1042, the code:

  • parses the attacker-supplied signature from scriptSig
  • parses the attacker-supplied public key from scriptSig
  • computes the sighash against the victim output's scriptPubKey
  • checks only pubkey.verify(sigHash, signature)

It never enforces the missing P2PKH binding:

  • HASH160(pubkey) == ScriptPattern.extractHashFromP2PKH(scriptPubKey)

That means the OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG semantics are not actually enforced in this fast path.

Relevant code:

java
} else if (ScriptPattern.isP2PKH(scriptPubKey)) {
    if (chunks.size() != 2)
        throw new ScriptException(...);
    TransactionSignature signature;
    try {
        byte[] data = Objects.requireNonNull(chunks.get(0).data);
        signature = TransactionSignature.decodeFromBitcoin(data, true, true);
    } catch (SignatureDecodeException x) {
        throw new ScriptException(...);
    }
    ECKey pubkey = ECKey.fromPublicOnly(Objects.requireNonNull(chunks.get(1).data));
    Sha256Hash sigHash = txContainingThis.hashForSignature(scriptSigIndex, scriptPubKey,
            signature.sigHashMode(), false);
    boolean validSig = pubkey.verify(sigHash, signature);
    if (!validSig)
        throw new ScriptException(...);
}

In the native P2WPKH fast path at core/src/main/java/org/bitcoinj/script/ScriptExecution.java:1023, the bug is similar. The code:

  • reads the attacker-supplied pubkey from witness
  • builds scriptCode from that attacker pubkey with ScriptBuilder.createP2PKHOutputScript(pubkey)
  • computes the BIP143 sighash using that attacker-derived scriptCode
  • verifies the signature against the attacker pubkey

It never enforces:

  • HASH160(pubkey) == ScriptPattern.extractHashFromP2WH(scriptPubKey)

So for P2WPKH, the attacker controls both the pubkey and the scriptCode used for signing.

Relevant code:

java
if (ScriptPattern.isP2WPKH(scriptPubKey)) {
    Objects.requireNonNull(witness);
    if (witness.getPushCount() < 2)
        throw new ScriptException(...);
    TransactionSignature signature;
    try {
        signature = TransactionSignature.decodeFromBitcoin(witness.getPush(0), true, true);
    } catch (SignatureDecodeException x) {
        throw new ScriptException(...);
    }
    ECKey pubkey = ECKey.fromPublicOnly(witness.getPush(1));
    Script scriptCode = ScriptBuilder.createP2PKHOutputScript(pubkey);
    Sha256Hash sigHash = txContainingThis.hashForWitnessSignature(scriptSigIndex, scriptCode, value,
            signature.sigHashMode(), false);
    boolean validSig = pubkey.verify(sigHash, signature);
    if (!validSig)
        throw new ScriptException(...);
}

Affected call sites include:

  • core/src/main/java/org/bitcoinj/core/TransactionInput.java:546
  • core/src/main/java/org/bitcoinj/wallet/Wallet.java:4520
  • core/src/main/java/org/bitcoinj/signers/LocalTransactionSigner.java:84
  • core/src/main/java/org/bitcoinj/signers/CustomTransactionSigner.java:77

These call sites use correctlySpends() for transaction/input validation and pre-signing checks. Any application that treats a successful result from this path as proof that a spend is valid is affected.

Fix

The issue is fixed on the release-0.17 branch via 2bc5653c41d260d840692bc554690d4d79208f9c, and on master via b575a682acf614b9ff95cacbdeb48f86c3ababe0. A 0.17.1 maintenance release has been made available on Maven Central.

Executive ViewAI

Why It Matters

CVE-2026-44714 affects bitcoinj-core library versions 0.15-0.17.0, allowing attackers to bypass Bitcoin transaction signature verification and forge valid transactions within vulnerable applications. Organizations using bitcoinj for transaction validation, wallet operations, or cryptocurrency processing face direct risk of accepting fraudulent transactions and financial loss. This is critical for any fintech, cryptocurrency exchange, or blockchain infrastructure relying on this library.

Business Impact: High
Compensating Controls

Vendor-released patch: bitcoinj-core version 0.17.1. Until patched, restrict transaction validation to external proof-of-work verification (SPV mode without reliance on local correctlySpends() checks); implement independent signature verification using alternative cryptographic libraries; disable the vulnerable fast-path optimization if library configuration allows. These mitigations are insufficient long-term-patch deployment is mandatory.

Threat Intelligence Overview

EPSS Score
0.0%
Top 92% exploitable
Threat Intel
1
1 source
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.0%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy