`@bsv/wallet-toolbox` / `-client` / `-mobile` don't verify storage-supplied recipient output scripts against caller-requested outputs in createAction
Reported by @echennells (Eric Chennells). Migrated from public issue #191 to a private advisory. **Affected:** `@bsv/wallet-toolbox` / `-client` / `-mobile`. Verified in `2.1.21` and `2.1.21-parity-fix.2`; the relevant code is the same at current HEAD **Summary:** When `createAction` runs against a remote `StorageClient`, the storage server returns the outputs to build. `buildSignableTransaction` takes each non-change output's `lockingScript` from the storage response and signs it, without comparing it to the `lockingScript` the caller supplied in `args.outputs`. `WalletPermissionsManager.createAction` parses the built transaction and has `args.outputs` available, but uses the tx only for `inputs` and `getFee()`; it does not inspect `tx.outputs`. A storage provider that returns a different recipient script than requested will therefore have that script signed and broadcast, while the calling app and UI still show the originally requested recipient. **Relevant code:** - `signer/methods/buildSignableTransaction.js` — non-change output `lockingScript = asBsvSdkScript(out.lockingScript)`, sourced from the storage response; `args.outputs` is not consulted. - `WalletPermissionsManager.js` `createAction` — parses the built tx, derives spend from `args.outputs` satoshis + `tx.getFee()`, reads `tx.inputs`; does not read `tx.outputs`. - `signer/methods/signAction.js`, `completeSignedTransaction.js` — sign the as-built tx; no output comparison. **Context:** Remote storage is a supported
GHSA-36f9-7rg5-cpf8
Primary source · Revision 1
Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.
Security context
Source reference: osv:GHSA-36f9-7rg5-cpf8
@bsv/wallet-toolbox
Source reference: /affected/0/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 2.4.0
Source reference:
/affected/0/ranges - Prerequisites
- Not stated in this record
@bsv/wallet-toolbox-client
Source reference: /affected/1/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 2.4.0
Source reference:
/affected/1/ranges - Prerequisites
- Not stated in this record
@bsv/wallet-toolbox-mobile
Source reference: /affected/2/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 2.4.0
Source reference:
/affected/2/ranges - Prerequisites
- Not stated in this record
Structured affected-version data
Original package identities and version rules from this source.
[
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.1.47"
},
{
"fixed": "2.4.0"
}
]
}
],
"package": {
"name": "@bsv/wallet-toolbox",
"purl": "pkg:npm/%40bsv/wallet-toolbox",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-36f9-7rg5-cpf8/GHSA-36f9-7rg5-cpf8.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.1.47"
},
{
"fixed": "2.4.0"
}
]
}
],
"package": {
"name": "@bsv/wallet-toolbox-client",
"purl": "pkg:npm/%40bsv/wallet-toolbox-client",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-36f9-7rg5-cpf8/GHSA-36f9-7rg5-cpf8.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.3.21"
},
{
"fixed": "2.4.0"
}
]
}
],
"package": {
"name": "@bsv/wallet-toolbox-mobile",
"purl": "pkg:npm/%40bsv/wallet-toolbox-mobile",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-36f9-7rg5-cpf8/GHSA-36f9-7rg5-cpf8.json"
}
}
]- Related CVEs
- CVE-2026-56744
Source reference:
/aliases
Publisher severity
high
Source reference: /database_specific/severity
- Event
- #14228 · Revision 1
- Added to Heist Feed
- Publisher date