2026-05-01 7:21CVE-2026-7584NCSC.ch
PUBLISHED5.2CWE-502

Arbitrary Code Execution via Unsafe Deserialization in LabOne Q

The LabOne Q serialization framework uses a class-loading mechanism (import_cls) to dynamically import and instantiate Python classes during deserialization. Prior to the fix, this mechanism accepted arbitrary fully-qualified class names from the serialized data without any validation of the target class or restriction on which modules could be imported. An attacker can craft a serialized experiment file that causes the deserialization engine to import and instantiate arbitrary Python classes with attacker-controlled constructor arguments, resulting in arbitrary code execution in the context of the user running the Python process. Exploitation requires the victim to load a malicious file using LabOne Q's deserialization functions, for example a compromised experiment file shared for collaboration or support purposes.

Problem type

Affected products

Zurich Instruments

LabOne Q

< 26.1.2 - AFFECTED

<= 26.4.0b5 - AFFECTED

References

JSON source

https://cveawg.mitre.org/api/cve/CVE-2026-7584
Click to expand
{
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "cveMetadata": {
    "cveId": "CVE-2026-7584",
    "assignerOrgId": "455daabc-a392-441d-aa46-37d35189897c",
    "assignerShortName": "NCSC.ch",
    "dateUpdated": "2026-05-01T07:21:18.781Z",
    "dateReserved": "2026-05-01T07:14:23.592Z",
    "datePublished": "2026-05-01T07:21:18.781Z",
    "state": "PUBLISHED"
  },
  "containers": {
    "cna": {
      "providerMetadata": {
        "orgId": "455daabc-a392-441d-aa46-37d35189897c",
        "shortName": "NCSC.ch",
        "dateUpdated": "2026-05-01T07:21:18.781Z"
      },
      "title": "Arbitrary Code Execution via Unsafe Deserialization in LabOne Q",
      "descriptions": [
        {
          "lang": "en",
          "value": "The LabOne Q serialization framework uses a class-loading mechanism (import_cls) to dynamically import and instantiate Python classes during deserialization. Prior to the fix, this mechanism accepted arbitrary fully-qualified class names from the serialized data without any validation of the target class or restriction on which modules could be imported. An attacker can craft a serialized experiment file that causes the deserialization engine to import and instantiate arbitrary Python classes with attacker-controlled constructor arguments, resulting in arbitrary code execution in the context of the user running the Python process. Exploitation requires the victim to load a malicious file using LabOne Q's deserialization functions, for example a compromised experiment file shared for collaboration or support purposes.",
          "supportingMedia": [
            {
              "type": "text/html",
              "base64": false,
              "value": "<p>The LabOne Q serialization framework uses a class-loading mechanism (import_cls) to dynamically import and instantiate Python classes during deserialization. Prior to the fix, this mechanism accepted arbitrary fully-qualified class names from the serialized data without any validation of the target class or restriction on which modules could be imported. An attacker can craft a serialized experiment file that causes the deserialization engine to import and instantiate arbitrary Python classes with attacker-controlled constructor arguments, resulting in arbitrary code execution in the context of the user running the Python process. Exploitation requires the victim to load a malicious file using LabOne Q's deserialization functions, for example a compromised experiment file shared for collaboration or support purposes.</p>"
            }
          ]
        }
      ],
      "affected": [
        {
          "vendor": "Zurich Instruments",
          "product": "LabOne Q",
          "collectionURL": "https://pypi.org/project/laboneq/",
          "packageName": "laboneq",
          "defaultStatus": "unaffected",
          "versions": [
            {
              "version": "2.41.0",
              "status": "affected",
              "versionType": "python",
              "lessThan": "26.1.2"
            },
            {
              "version": "26.4.0b1",
              "status": "affected",
              "versionType": "python",
              "lessThanOrEqual": "26.4.0b5"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "lang": "en",
              "description": "CWE-502 Deserialization of Untrusted Data",
              "cweId": "CWE-502",
              "type": "CWE"
            }
          ]
        }
      ],
      "references": [
        {
          "url": "https://www.zhinst.com/support/security/2026/zi-sa-2026-002/",
          "name": "ZI-SA-2026-002",
          "tags": [
            "vendor-advisory"
          ]
        }
      ],
      "metrics": [
        {
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ],
          "cvssV3_1": {
            "version": "3.1",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H",
            "attackVector": "LOCAL",
            "attackComplexity": "LOW",
            "privilegesRequired": "NONE",
            "userInteraction": "REQUIRED",
            "scope": "UNCHANGED",
            "confidentialityImpact": "HIGH",
            "integrityImpact": "HIGH",
            "availabilityImpact": "HIGH",
            "baseScore": 7.8,
            "baseSeverity": "HIGH"
          }
        },
        {
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "workarounds": [
        {
          "lang": "en",
          "value": "Do not load untrusted experiment files: only deserialize experiment files (JSON, YAML) that originate from a trusted source. Treat serialized experiment files with the same caution as executable scripts.\n\n\n\nValidate file provenance: when receiving experiment files from external parties (e.g. for support or collaboration), verify their origin before loading them.\n\n\n\nAudit serialized files: before loading, inspect serialized experiment files and verify that only trusted classes are listed as deserializers.",
          "supportingMedia": [
            {
              "type": "text/html",
              "base64": false,
              "value": "<p>Do not load untrusted experiment files: only deserialize experiment files (JSON, YAML) that originate from a trusted source. Treat serialized experiment files with the same caution as executable scripts.</p><p>Validate file provenance: when receiving experiment files from external parties (e.g. for support or collaboration), verify their origin before loading them.</p><p>Audit serialized files: before loading, inspect serialized experiment files and verify that only trusted classes are listed as deserializers.</p>"
            }
          ]
        }
      ],
      "solutions": [
        {
          "lang": "en",
          "value": "Update LabOne Q to version 26.1.2 (security backport on the 26.1.x line) or to 26.4.0 or later. The package can be updated via `pip install --upgrade laboneq`.",
          "supportingMedia": [
            {
              "type": "text/html",
              "base64": false,
              "value": "<p>Update LabOne Q to version 26.1.2 (security backport on the 26.1.x line) or to 26.4.0 or later. The package can be updated via `pip install --upgrade laboneq`.</p>"
            }
          ]
        }
      ]
    }
  }
}