CVE-2025-1403: Qiskit Denial of Service Vulnerability
HIGHCVE-2025-1403 is a HIGH (CVSS 8.6) denial of service vulnerability (CWE-502: Deserialization of Untrusted Data) affecting Qiskit libraries in the PyPI ecosystem. The issue involves malciously crafted qpy files can allows remote attackers to cause denial of service in qiskit. Remediation is available by upgrading affected packages to version 1.3.0.
CVE-2025-1403 at a Glance
Security Impact
CVSS: 8.6
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:N/A:H).
How to Fix CVE-2025-1403
To remediate this vulnerability, upgrade all affected Qiskit dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
pip install qiskit>=1.3.0
pip install qiskit-terra>=Latest secure release
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
pip show qiskit
How to Check if You Are Affected
To determine whether your Python environment is affected by CVE-2025-1403, inspect your installed packages using pip:
pip show qiskit
Analyze the terminal output to locate any version of Qiskit in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.3.0), your application is affected.
Note: The pip show qiskit command checks currently installed packages in your active Python environment.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-502: Deserialization of Untrusted Data, where the product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid. In Qiskit, 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
CVE-2025-1403 Affected Qiskit Versions
2 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
qiskit
|
PyPI |
≥ 0.45.0
< 1.3.0
|
1.3.0
|
|
qiskit-terra
|
PyPI |
≥ 0.45.0
≤ 0.46.3
|
|
References
Frequently Asked Questions
What is CVE-2025-1403?
Which Qiskit versions are affected?
What version fixes CVE-2025-1403?
Is qiskit affected?
Is qiskit-terra affected?
What is the CVSS score of CVE-2025-1403?
What CWE is associated with CVE-2025-1403?
How can I check PyPI dependencies for CVE-2025-1403?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-fpmr-m242-xm7x",
"modified" : "2025-02-21T21:42:43Z",
"published" : "2025-02-21T21:42:43Z",
"aliases" : [ "CVE-2025-1403" ],
"summary" : "Malciously crafted QPY files can allows Remote Attackers to Cause Denial of Service in Qiskit",
"details" : "### Impact\n\nA maliciously crafted QPY file containing a malformed `symengine` serialization stream as part of the larger QPY serialization of a `ParameterExpression` object can cause a segfault within the `symengine` library, allowing an attacker to terminate the hosting process deserializing the QPY payload.\n\n### Patches\n\nThis issue is addressed in 1.3.0 when using QPY format version 13. QPY format versions 10, 11, and 12 are all still inherently vulnerable if they are using symengine symbolic encoding and `symengine <= 0.13.0` is installed in the deserializing environment (as of publishing there is no newer compatible release of symengine available). Using QPY 13 is strongly recommended for this reason.\n\nThe symengine 0.14.0 release has addressed the segfault issue, but it is backward incompatible and will not work with any Qiskit release; it also prevents loading a payload generated with any other version of symengine. Using QPY 13 is strongly recommended for this reason.\n\nIt is also strongly suggested to patch the locally installed version of symengine in the deserializing environment to prevent the specific segfault. The commit [1] can be applied on top of symengine 0.13.0 and used to build a patched python library that will not segfault in the presence of a malformed payload and instead raise a `RuntimeError` which will address the vulnerability.\n\n### Workarounds\n\nAs QPY is backwards compatible `qiskit.qpy.load()` function will always attempt to deserialize the `symengine`-serialized payloads in QPY format versions 10, 11, and 12. These are any payloads generated with the `use_symengine` argument on `qiskit.qpy.dump()` set to `True` (which is the default value starting in Qiskit 1.0.0. The only option is to disallow parsing if those QPY formats are being read and the `use_symengine` flag was set in the file's header. You can detect whether a payload is potentially vulnerable by using the following function built using the Python standard library:\n\n```python\nimport struct\nfrom collections import namedtuple\n\n\ndef check_qpy_payload(path: str) -> bool:\n \"\"\"Function to check if a QPY payload is potentially vulnerable to a symengine vulnerability.\n\n Args:\n path: The path to the QPY file\n\n Returns:\n Whether the specified payload is potentially vulnerable. If ``True`` the conditions for\n being vulnerable exist, however the payload may not be vulnerable it can't be detected\n until trying to deserialize.\n \"\"\"\n with open(path, \"rb\") as file_obj:\n version = struct.unpack(\"!6sB\", file_obj.read(7))[1]\n if version < 10 or version >= 13:\n return False\n file_obj.seek(0)\n header_tuple = namedtuple(\n \"FILE_HEADER\",\n [\n \"preface\",\n \"qpy_version\",\n \"major_version\",\n \"minor_version\",\n \"patch_version\",\n \"num_programs\",\n \"symbolic_encoding\",\n ],\n )\n header_pack_str = \"!6sBBBBQc\"\n header_read_size = struct.calcsize(header_pack_str)\n data = struct.unpack(header_pack_str, file_obj.read(header_read_size))\n header = header_tuple(*data)\n return header.symbolic_encoding == b\"e\"\n```\n\nNote, this function does **not** tell you whether the payload is malicious and will cause the segfault, just that conditions for it to be potentially malicious exist. It's not possible to know ahead of time whether `symengine` will segfault until the data is passed to that library.\n\n### References\n\n[1] https://github.com/symengine/symengine/commit/eb3e292bf13b2dfdf0fa1c132944af8df2bc7d51",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:N/A:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "PyPI",
"name" : "qiskit"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0.45.0"
}, {
"fixed" : "1.3.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "PyPI",
"name" : "qiskit-terra"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0.45.0"
}, {
"last_affected" : "0.46.3"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/Qiskit/qiskit/security/advisories/GHSA-fpmr-m242-xm7x"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2025-1403"
}, {
"type" : "WEB",
"url" : "https://github.com/symengine/symengine/commit/eb3e292bf13b2dfdf0fa1c132944af8df2bc7d51"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/Qiskit/qiskit"
}, {
"type" : "WEB",
"url" : "https://www.ibm.com/support/pages/node/7183868"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-502" ],
"severity" : "HIGH",
"github_reviewed" : true,
"github_reviewed_at" : "2025-02-21T21:42:43Z",
"nvd_published_at" : "2025-02-21T17:15:13Z"
}
}