GHSA-pm4j-7r4q-ccg8: Soroban Muxed Address<->ScVal Conversions May Break Vulnerability

LOW
CWE-681
Published
Advisory Summary

GHSA-pm4j-7r4q-ccg8 is a LOW muxed address<->scval conversions may break vulnerability (CWE-681: Incorrect Conversion between Numeric Types) affecting Soroban libraries in the crates.io ecosystem. The issue involves muxed address<->scval conversions may break after a conversion failure. Remediation is available by upgrading affected packages to version 26.0.0.

GHSA-pm4j-7r4q-ccg8 at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-pm4j-7r4q-ccg8
Severity LOW
CVSS v3.1 Base Score N/A
CWE Classification CWE-681: Incorrect Conversion between Numeric Types
Affected Product Soroban
Package Ecosystem crates.io
Published Date
Last Updated

How to Fix GHSA-pm4j-7r4q-ccg8

To remediate this vulnerability, upgrade all affected Soroban dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

soroban-env-host fixed: 26.0.0
Upgrade soroban-env-host to 26.0.0
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for soroban-env-host

How to Check if You Are Affected

To determine whether your application is affected by GHSA-pm4j-7r4q-ccg8, inspect your project dependencies for Soroban:

inspect dependencies for soroban-env-host

Analyze the terminal output to locate any version of Soroban in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 26.0.0), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-681: Incorrect Conversion between Numeric Types, where when converting from one data type to another, such as long to integer, data can be omitted or translated in a way that produces unexpected values. if the resulting values are used in a sensitive context, then dangerous behaviors may occur. In Soroban, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary Soroban host ensures that `MuxedAddress` objects can't be used as storage keys in order to proactively prevent the contract logic bugs. However, due to a bug in Soroban host implementation, a failure in `Val`->`ScVal` conversion during the storage key computation will have the flag indicating that storage conversion is happening stuck in the `true` state until the next storage access. While the flag is stuck in `true` state, any `MuxedAddress` object conversions to `ScVal` will fail, i.e. a failure will occur if a `MuxedAddress` is emitted in the event or is serialized to XDR via a host function. ### Impact The bug may cause unexpected contract failures in the rare edge case scenarios. In the worst case scenario the whole transaction will fail and the changes will be rolled back. Because the contract call is simply rolled back, there is no risk of the state corruption. An example scenario that would be affected by the bug is as follows: - Contract A calls contract B via `try_call` - Contract B calls a storage function (e.g. `put_contract_data`) with a non-convertible `Val` as a key (e.g. a `MuxedAddress` object, or a deeply nested vector) - Contract B fails - Contract A handles the failure gracefully and proceeds without accessing any storage methods - Contract A tries to emit an event with a `MuxedAddress` argument. That should be allowed, but instead of succeeding, contract A fails. ### Patches The bug will be fixed in protocol 26. ### Workarounds We believe that the bug is highly unlikely to occur in practice, as it involves three rare events happening simultaneously: `Val` conversion failure (these should normally not occur for the audited protocols), graceful handling of a cross-contract call failure (most protocols need cross-contract calls to succeed, or fail with a contract error), and `MuxedAddress` write (most of the contracts don't support `MuxedAddress` at all). In the case if the bug does occur, the mitigation depends on the reason of the value conversion failure: - If the conversion failure has been caused by a malicious contract, then either no action is necessary (because the whole interaction is malicious and has been correctly rolled back), or the contract invocation should be replaced by a non-malicious contract - If the conversion failure has been caused by a bad user input for a non-malicious contract (e.g. a bad user input passed to a legitimate protocol), then the user input has to be fixed In both scenarios the mitigation is to basically retry the transaction with proper arguments.

GHSA-pm4j-7r4q-ccg8 Affected Soroban Versions

1 component(s)
Fixed Versions:
26.0.0
Product / Package Ecosystem Affected Versions Fixed Version
soroban-env-host
crates.io
< 26.0.0
26.0.0

References

Frequently Asked Questions

What is GHSA-pm4j-7r4q-ccg8?
GHSA-pm4j-7r4q-ccg8 is a security vulnerability in Soroban involving Muxed address<->ScVal conversions may break after a conversion failure under CWE-681: Incorrect Conversion between Numeric Types.
Which Soroban versions are affected?
Affected versions include releases prior to 26.0.0 across affected packages: soroban-env-host.
What version fixes GHSA-pm4j-7r4q-ccg8?
Upgrading to 26.0.0 (or the latest patched release for your respective branch) resolves the vulnerability.
Is soroban-env-host affected?
Yes, soroban-env-host is affected in releases prior to 26.0.0. Upgrade your dependency to 26.0.0 or later.
What CWE is associated with GHSA-pm4j-7r4q-ccg8?
GHSA-pm4j-7r4q-ccg8 is classified under CWE-681: Incorrect Conversion between Numeric Types (When converting from one data type to another, such as long to integer, data can be omitted or translated in a way that produces unexpected values. If the resulting values are used in a sensitive context, then dangerous behaviors may occur.).
How can I check crates.io dependencies for GHSA-pm4j-7r4q-ccg8?
Run the dependency tree command: 'inspect dependencies for soroban-env-host'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-pm4j-7r4q-ccg8",
  "modified" : "2026-03-07T02:39:44Z",
  "published" : "2026-03-07T02:39:44Z",
  "aliases" : [ ],
  "summary" : "Soroban: Muxed address<->ScVal conversions may break after a conversion failure",
  "details" : "### Summary\n\nSoroban host ensures that `MuxedAddress` objects can't be used as storage keys in order to proactively prevent the contract logic bugs. However, due to a bug in Soroban host implementation, a failure in `Val`->`ScVal` conversion during the storage key computation will have the flag indicating that storage conversion is happening stuck in the `true` state until the next storage access. While the flag is stuck in `true` state, any `MuxedAddress` object conversions to `ScVal` will fail, i.e. a failure will occur if a `MuxedAddress` is emitted in the event or is serialized to XDR via a host function.\n\n### Impact\n\nThe bug may cause unexpected contract failures in the rare edge case scenarios. In the worst case scenario the whole transaction will fail and the changes will be rolled back. Because the contract call is simply rolled back, there is no risk of the state corruption.\n\nAn example scenario that would be affected by the bug is as follows:\n\n- Contract A calls contract B via `try_call`\n- Contract B calls a storage function (e.g. `put_contract_data`) with a non-convertible `Val` as a key (e.g. a `MuxedAddress` object, or a deeply nested vector)\n- Contract B fails\n- Contract A handles the failure gracefully and proceeds without accessing any storage methods\n- Contract A tries to emit an event with a `MuxedAddress` argument. That should be allowed, but instead of succeeding, contract A fails.\n\n### Patches\n\nThe bug will be fixed in protocol 26.\n\n### Workarounds\n\nWe believe that the bug is highly unlikely to occur in practice, as it involves three rare events happening simultaneously: `Val` conversion failure (these should normally not occur for the audited protocols), graceful handling of a cross-contract call failure (most protocols need cross-contract calls to succeed, or fail with a contract error), and `MuxedAddress` write (most of the contracts don't support `MuxedAddress` at all).\n\nIn the case if the bug does occur, the mitigation depends on the reason of the value conversion failure:\n\n- If the conversion failure has been caused by a malicious contract, then either no action is necessary (because the whole interaction is malicious and has been correctly rolled back), or the contract invocation should be replaced by a non-malicious contract\n- If the conversion failure has been caused by a bad user input for a non-malicious contract (e.g. a bad user input passed to a legitimate protocol), then the user input has to be fixed\n\nIn both scenarios the mitigation is to basically retry the transaction with proper arguments.",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:U"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "crates.io",
      "name" : "soroban-env-host"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "26.0.0"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/stellar/rs-soroban-env/security/advisories/GHSA-pm4j-7r4q-ccg8"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/stellar/rs-soroban-env"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-681" ],
    "severity" : "LOW",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-03-07T02:39:44Z",
    "nvd_published_at" : null
  }
}