Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit crafted Bitcoin transaction
-
DeliveryInject attacker-controlled pubkey/signature pair
-
ExploitTrigger correctlySpends() fast-path validation
-
ExecutionBypass missing hash verification
-
PersistApplication accepts fraudulent transaction
-
ImpactBusiness 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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:
} 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
scriptCodefrom that attacker pubkey withScriptBuilder.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:
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:546core/src/main/java/org/bitcoinj/wallet/Wallet.java:4520core/src/main/java/org/bitcoinj/signers/LocalTransactionSigner.java:84core/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
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.
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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m
Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti
Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent
Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug
JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up
Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up
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
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow
Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla
The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during
EUVD-2026-30571
GHSA-hfcf-v2f8-x9pc
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB