Skip to content
Heist/ feed
Back to feed
Medium

SignXML's signature verification with HMAC is vulnerable to an algorithm confusion attack

Type: advisorySources: OSV

SignXML is an implementation of the W3C XML Signature standard in Python. When verifying signatures with X509 certificate validation turned off and HMAC shared secret set (`signxml.XMLVerifier.verify(require_x509=False, hmac_key=...`), versions of SignXML prior to 4.0.4 are vulnerable to a potential algorithm confusion attack. Unless the user explicitly limits the expected signature algorithms using the `signxml.XMLVerifier.verify(expect_config=...)` setting, an attacker may supply a signature unexpectedly signed with a key other than the provided HMAC key, using a different (asymmetric key) signature algorithm. Starting with SignXML 4.0.4, specifying `hmac_key` causes the set of accepted signature algorithms to be restricted to HMAC only, if not already restricted by the user.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2025-48994
Confirmed fixed CVEs
Not specified
Updated in this feed
4 Nov 2026, 15:41 UTC · Revision 1

Source evidence

SignXML's signature verification with HMAC is vulnerable to an algorithm confusion attack

core-osv · Original source

Published 2 Jun 2025, 16:22 UTC

SignXML is an implementation of the W3C XML Signature standard in Python. When verifying signatures with X509 certificate validation turned off and HMAC shared secret set (`signxml.XMLVerifier.verify(require_x509=False, hmac_key=...`), versions of SignXML prior to 4.0.4 are vulnerable to a potential algorithm confusion attack. Unless the user explicitly limits the expected signature algorithms using the `signxml.XMLVerifier.verify(expect_config=...)` setting, an attacker may supply a signature unexpectedly signed with a key other than the provided HMAC key, using a different (asymmetric key) signature algorithm. Starting with SignXML 4.0.4, specifying `hmac_key` causes the set of accepted signature algorithms to be restricted to HMAC only, if not already restricted by the user.

osv:CVE-2025-48994
Complete source record
{
  "id": "3637a62235fc39a7bebba791f4c394b79b594536e33a12dcc17de7a5afe874ae",
  "url": "https://osv.dev/vulnerability/CVE-2025-48994",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "SignXML's signature verification with HMAC is vulnerable to an algorithm confusion attack",
    "summary": "SignXML is an implementation of the W3C XML Signature standard in Python. When verifying signatures with X509 certificate validation turned off and HMAC shared secret set (`signxml.XMLVerifier.verify(require_x509=False, hmac_key=...`), versions of SignXML prior to 4.0.4 are vulnerable to a potential algorithm confusion attack. Unless the user explicitly limits the expected signature algorithms using the `signxml.XMLVerifier.verify(expect_config=...)` setting, an attacker may supply a signature unexpectedly signed with a key other than the provided HMAC key, using a different (asymmetric key) signature algorithm. Starting with SignXML 4.0.4, specifying `hmac_key` causes the set of accepted signature algorithms to be restricted to HMAC only, if not already restricted by the user.",
    "evidence": "osv:CVE-2025-48994",
    "products": [],
    "severity": "medium",
    "structured": {
      "id": "CVE-2025-48994",
      "aliases": [
        "CVE-2025-48994",
        "GHSA-6vx8-pcwv-xhf4",
        "PYSEC-2026-1921"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/xml-security/signxml",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "f7da15cbcba2f9f17d4aede3ec83ff165535c4bb"
                },
                {
                  "fixed": "e3c0c2b82a3329a65d917830657649c98b8c7600"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "4.0.4"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StringRangeExpression"
                  },
                  {
                    "range": [
                      {
                        "fixed": "e3c0c2b82a3329a65d917830657649c98b8c7600"
                      }
                    ],
                    "source": "REFERENCES_COMMIT"
                  }
                ]
              }
            }
          ],
          "versions": [
            "v4.0.3",
            "v4.0.2",
            "v4.0.1",
            "v4.0.0",
            "v3.2.2",
            "v3.2.1",
            "v3.2.0",
            "v3.1.1",
            "v3.1.0",
            "v3.0.2",
            "v3.0.1",
            "v3.0.0",
            "v2.10.1",
            "v2.10.0",
            "v2.9.0",
            "v2.8.2",
            "v2.8.1",
            "v2.8.0",
            "v2.7.3",
            "v2.7.2",
            "v2.7.1",
            "v2.7.0",
            "v2.6.0",
            "v2.5.2",
            "v2.5.1",
            "v2.5.0",
            "v2.4.0",
            "v2.3.0",
            "v2.2.6",
            "v2.2.5",
            "v2.2.4",
            "v2.2.3",
            "v2.2.2",
            "v2.2.1",
            "v2.2.0",
            "v2.1.4",
            "v2.1.3",
            "v2.1.2",
            "v2.1.1",
            "v2.1.0",
            "v2.0.0",
            "v1.0.2",
            "v1.0.1",
            "v1.0.0",
            "v0.6.0",
            "v0.5.0",
            "v0.4.6",
            "v0.4.5",
            "v0.4.4",
            "v0.4.2",
            "v0.4.1",
            "v0.4.0",
            "v0.3.9",
            "v0.3.8",
            "v0.3.7",
            "v0.3.6",
            "v0.3.5",
            "v0.3.4",
            "v0.3.3",
            "v0.3.2",
            "v0.3.1",
            "v0.3.0",
            "v0.2.8",
            "v0.2.7",
            "v0.2.6",
            "v0.2.5",
            "v0.2.4",
            "v0.2.3",
            "v0.2.2",
            "v0.2.0",
            "v0.1.9",
            "v0.1.8",
            "v0.1.7",
            "v0.1.6",
            "v0.1.5",
            "v0.1.4",
            "v0.1.3",
            "v0.1.0"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2025-48994.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:36.805691917Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/48xxx/CVE-2025-48994.json",
        "https://github.com/XML-Security/signxml/security/advisories/GHSA-6vx8-pcwv-xhf4",
        "https://nvd.nist.gov/vuln/detail/CVE-2025-48994",
        "https://github.com/XML-Security/signxml/commit/e3c0c2b82a3329a65d917830657649c98b8c7600"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-303"
        ],
        "cna_assigner": "GitHub_M",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/48xxx/CVE-2025-48994.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2025-48994",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 504222,
  "published_at": "2025-06-02T16:22:08.966+00:00"
}