Search

Find a vulnerability

Search criteria Use this form to refine search results.
Full-text search supports keyword queries with ranking and filtering.
You can combine vendor, product, and sources to narrow results.
Enable “Apply ordering” to sort by date instead of relevance.

    Related vulnerabilities

    GHSA-QC2X-6F54-M6H9

    Vulnerability from github – Published: 2026-06-22 23:07 – Updated: 2026-06-22 23:07
    VLAI
    Summary
    zeroconf: Unvalidated rdlength in record payload readers allows LAN-local cache corruption via crafted mDNS packet
    Details

    Impact

    _read_character_string and _read_string in src/zeroconf/_protocol/incoming.py sliced self.data[self.offset : self.offset + length] and advanced self.offset by the declared length without checking it against self._data_len. Python's slice silently returns fewer bytes when the end index runs past the buffer, so a record whose 16-bit RDLENGTH (RFC 1035 §3.2.1) over-advertised by tens of kilobytes was constructed from a truncated payload, appended to DNSIncoming._answers, and committed to the cache before any later parse failure surfaced. The follow-up _read_name for the next record then failed, but the corrupt record had already entered the answer list and propagated to DNSCache and ServiceInfo.

    Any unauthenticated host on the local link (UDP/5353, 224.0.0.251 / ff02::fb) can multicast a single mDNS response carrying a TXT, HINFO, or A/AAAA record that advertises rdlength=65535 and only a handful of real payload bytes; consumers calling ServiceInfo.properties then parse the truncated bytes as if they matched the wire, and downstream integrations (Home Assistant and other zeroconf-driven discovery) trust the decoded record. The bug is parser-state desync rather than RCE, but it seeds the cache with attacker-shaped key/value and address records for a TTL window and is a building block for higher-impact chains.

    The impact is likely lower than the other recently released advisories as there is no additional risk of OOM so the severity was manually set to low to override the score CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N (6.5, Medium) since that doesn't fully consider the mDNS threat model.

    Patches

    Fixed in zeroconf 0.149.16 (PR #1756). Note that this change originally intended to ship in 0.149.13 but we ran out of space on PyPI: see https://github.com/python-zeroconf/python-zeroconf/issues/1769

    Upgrade to >= 0.149.16.

    Workarounds

    There is no in-process workaround; upgrading is the fix. Otherwise, restrict mDNS (UDP/5353) to trusted Layer-2 segments via AP client isolation, guest-network separation, or host firewall rules.

    Resources

    Show details on source website

    {
      "affected": [
        {
          "package": {
            "ecosystem": "PyPI",
            "name": "zeroconf"
          },
          "ranges": [
            {
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "0.149.16"
                }
              ],
              "type": "ECOSYSTEM"
            }
          ]
        }
      ],
      "aliases": [
        "CVE-2026-48487"
      ],
      "database_specific": {
        "cwe_ids": [
          "CWE-130"
        ],
        "github_reviewed": true,
        "github_reviewed_at": "2026-06-22T23:07:44Z",
        "nvd_published_at": null,
        "severity": "MODERATE"
      },
      "details": "### Impact\n\n`_read_character_string` and `_read_string` in `src/zeroconf/_protocol/incoming.py` sliced `self.data[self.offset : self.offset + length]` and advanced `self.offset` by the declared `length` without checking it against `self._data_len`. Python\u0027s slice silently returns fewer bytes when the end index runs past the buffer, so a record whose 16-bit RDLENGTH (RFC 1035 \u00a73.2.1) over-advertised by tens of kilobytes was constructed from a truncated payload, appended to `DNSIncoming._answers`, and committed to the cache before any later parse failure surfaced. The follow-up `_read_name` for the next record then failed, but the corrupt record had already entered the answer list and propagated to `DNSCache` and `ServiceInfo`.\n\nAny unauthenticated host on the local link (UDP/5353, `224.0.0.251` / `ff02::fb`) can multicast a single mDNS response carrying a TXT, HINFO, or A/AAAA record that advertises rdlength=65535 and only a handful of real payload bytes; consumers calling `ServiceInfo.properties` then parse the truncated bytes as if they matched the wire, and downstream integrations (Home Assistant and other zeroconf-driven discovery) trust the decoded record. The bug is parser-state desync rather than RCE, but it seeds the cache with attacker-shaped key/value and address records for a TTL window and is a building block for higher-impact chains.\n\nThe impact is likely lower than the other recently released advisories as there is no additional risk of OOM so the severity was manually set to low to override the score CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N (6.5, Medium) since that doesn\u0027t fully consider the mDNS threat model.\n\n### Patches\n\nFixed in `zeroconf` 0.149.16 ([PR #1756](https://github.com/python-zeroconf/python-zeroconf/pull/1756)).  Note that this change originally intended to ship in 0.149.13 but we ran out of space on PyPI: see https://github.com/python-zeroconf/python-zeroconf/issues/1769\n\nUpgrade to `\u003e= 0.149.16`.\n\n### Workarounds\n\nThere is no in-process workaround; upgrading is the fix. Otherwise, restrict mDNS (UDP/5353) to trusted Layer-2 segments via AP client isolation, guest-network separation, or host firewall rules.\n\n### Resources\n\n- [PR #1756](https://github.com/python-zeroconf/python-zeroconf/pull/1756), fix\n- [Issue #1752](https://github.com/python-zeroconf/python-zeroconf/issues/1752), public tracking issue\n- [RFC 1035 \u00a73.2.1](https://www.rfc-editor.org/rfc/rfc1035#section-3.2.1), [RFC 1035 \u00a73.3](https://www.rfc-editor.org/rfc/rfc1035#section-3.3), [CWE-130](https://cwe.mitre.org/data/definitions/130.html)",
      "id": "GHSA-qc2x-6f54-m6h9",
      "modified": "2026-06-22T23:07:44Z",
      "published": "2026-06-22T23:07:44Z",
      "references": [
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/security/advisories/GHSA-qc2x-6f54-m6h9"
        },
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/issues/1752"
        },
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/pull/1756"
        },
        {
          "type": "PACKAGE",
          "url": "https://github.com/python-zeroconf/python-zeroconf"
        }
      ],
      "schema_version": "1.4.0",
      "severity": [
        {
          "score": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
          "type": "CVSS_V3"
        },
        {
          "score": "CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:U",
          "type": "CVSS_V4"
        }
      ],
      "summary": "zeroconf: Unvalidated rdlength in record payload readers allows LAN-local cache corruption via crafted mDNS packet"
    }

    OPENSUSE-SU-2026:11036-1

    Vulnerability from csaf_opensuse - Published: 2026-06-15 00:00 - Updated: 2026-06-15 00:00
    Summary
    python311-zeroconf-0.149.16-1.1 on GA media
    Severity
    Moderate
    Notes
    Title of the patch: python311-zeroconf-0.149.16-1.1 on GA media
    Description of the patch: These are all security issues fixed in the python311-zeroconf-0.149.16-1.1 package on the GA media of openSUSE Tumbleweed.
    Patchnames: openSUSE-Tumbleweed-2026-11036
    Terms of use: CSAF 2.0 data is provided by SUSE under the Creative Commons License 4.0 with Attribution (CC-BY-4.0).
    Affected products
    Product Identifier Version Remediation
    Unresolved product id: openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.aarch64
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.ppc64le
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.s390x
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.x86_64
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.aarch64
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.ppc64le
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.s390x
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.x86_64
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.aarch64
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.ppc64le
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.s390x
    Vendor Fix
    Unresolved product id: openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.x86_64
    Vendor Fix
    Threats
    Impact moderate

    {
      "document": {
        "aggregate_severity": {
          "namespace": "https://www.suse.com/support/security/rating/",
          "text": "moderate"
        },
        "category": "csaf_security_advisory",
        "csaf_version": "2.0",
        "distribution": {
          "text": "Copyright 2024 SUSE LLC. All rights reserved.",
          "tlp": {
            "label": "WHITE",
            "url": "https://www.first.org/tlp/"
          }
        },
        "lang": "en",
        "notes": [
          {
            "category": "summary",
            "text": "python311-zeroconf-0.149.16-1.1 on GA media",
            "title": "Title of the patch"
          },
          {
            "category": "description",
            "text": "These are all security issues fixed in the python311-zeroconf-0.149.16-1.1 package on the GA media of openSUSE Tumbleweed.",
            "title": "Description of the patch"
          },
          {
            "category": "details",
            "text": "openSUSE-Tumbleweed-2026-11036",
            "title": "Patchnames"
          },
          {
            "category": "legal_disclaimer",
            "text": "CSAF 2.0 data is provided by SUSE under the Creative Commons License 4.0 with Attribution (CC-BY-4.0).",
            "title": "Terms of use"
          }
        ],
        "publisher": {
          "category": "vendor",
          "contact_details": "https://www.suse.com/support/security/contact/",
          "name": "SUSE Product Security Team",
          "namespace": "https://www.suse.com/"
        },
        "references": [
          {
            "category": "external",
            "summary": "SUSE ratings",
            "url": "https://www.suse.com/support/security/rating/"
          },
          {
            "category": "self",
            "summary": "URL of this CSAF notice",
            "url": "https://ftp.suse.com/pub/projects/security/csaf/opensuse-su-2026_11036-1.json"
          },
          {
            "category": "self",
            "summary": "SUSE CVE CVE-2026-48487 page",
            "url": "https://www.suse.com/security/cve/CVE-2026-48487/"
          }
        ],
        "title": "python311-zeroconf-0.149.16-1.1 on GA media",
        "tracking": {
          "current_release_date": "2026-06-15T00:00:00Z",
          "generator": {
            "date": "2026-06-15T00:00:00Z",
            "engine": {
              "name": "cve-database.git:bin/generate-csaf.pl",
              "version": "1"
            }
          },
          "id": "openSUSE-SU-2026:11036-1",
          "initial_release_date": "2026-06-15T00:00:00Z",
          "revision_history": [
            {
              "date": "2026-06-15T00:00:00Z",
              "number": "1",
              "summary": "Current version"
            }
          ],
          "status": "final",
          "version": "1"
        }
      },
      "product_tree": {
        "branches": [
          {
            "branches": [
              {
                "branches": [
                  {
                    "category": "product_version",
                    "name": "python311-zeroconf-0.149.16-1.1.aarch64",
                    "product": {
                      "name": "python311-zeroconf-0.149.16-1.1.aarch64",
                      "product_id": "python311-zeroconf-0.149.16-1.1.aarch64"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python313-zeroconf-0.149.16-1.1.aarch64",
                    "product": {
                      "name": "python313-zeroconf-0.149.16-1.1.aarch64",
                      "product_id": "python313-zeroconf-0.149.16-1.1.aarch64"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python314-zeroconf-0.149.16-1.1.aarch64",
                    "product": {
                      "name": "python314-zeroconf-0.149.16-1.1.aarch64",
                      "product_id": "python314-zeroconf-0.149.16-1.1.aarch64"
                    }
                  }
                ],
                "category": "architecture",
                "name": "aarch64"
              },
              {
                "branches": [
                  {
                    "category": "product_version",
                    "name": "python311-zeroconf-0.149.16-1.1.ppc64le",
                    "product": {
                      "name": "python311-zeroconf-0.149.16-1.1.ppc64le",
                      "product_id": "python311-zeroconf-0.149.16-1.1.ppc64le"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python313-zeroconf-0.149.16-1.1.ppc64le",
                    "product": {
                      "name": "python313-zeroconf-0.149.16-1.1.ppc64le",
                      "product_id": "python313-zeroconf-0.149.16-1.1.ppc64le"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python314-zeroconf-0.149.16-1.1.ppc64le",
                    "product": {
                      "name": "python314-zeroconf-0.149.16-1.1.ppc64le",
                      "product_id": "python314-zeroconf-0.149.16-1.1.ppc64le"
                    }
                  }
                ],
                "category": "architecture",
                "name": "ppc64le"
              },
              {
                "branches": [
                  {
                    "category": "product_version",
                    "name": "python311-zeroconf-0.149.16-1.1.s390x",
                    "product": {
                      "name": "python311-zeroconf-0.149.16-1.1.s390x",
                      "product_id": "python311-zeroconf-0.149.16-1.1.s390x"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python313-zeroconf-0.149.16-1.1.s390x",
                    "product": {
                      "name": "python313-zeroconf-0.149.16-1.1.s390x",
                      "product_id": "python313-zeroconf-0.149.16-1.1.s390x"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python314-zeroconf-0.149.16-1.1.s390x",
                    "product": {
                      "name": "python314-zeroconf-0.149.16-1.1.s390x",
                      "product_id": "python314-zeroconf-0.149.16-1.1.s390x"
                    }
                  }
                ],
                "category": "architecture",
                "name": "s390x"
              },
              {
                "branches": [
                  {
                    "category": "product_version",
                    "name": "python311-zeroconf-0.149.16-1.1.x86_64",
                    "product": {
                      "name": "python311-zeroconf-0.149.16-1.1.x86_64",
                      "product_id": "python311-zeroconf-0.149.16-1.1.x86_64"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python313-zeroconf-0.149.16-1.1.x86_64",
                    "product": {
                      "name": "python313-zeroconf-0.149.16-1.1.x86_64",
                      "product_id": "python313-zeroconf-0.149.16-1.1.x86_64"
                    }
                  },
                  {
                    "category": "product_version",
                    "name": "python314-zeroconf-0.149.16-1.1.x86_64",
                    "product": {
                      "name": "python314-zeroconf-0.149.16-1.1.x86_64",
                      "product_id": "python314-zeroconf-0.149.16-1.1.x86_64"
                    }
                  }
                ],
                "category": "architecture",
                "name": "x86_64"
              },
              {
                "branches": [
                  {
                    "category": "product_name",
                    "name": "openSUSE Tumbleweed",
                    "product": {
                      "name": "openSUSE Tumbleweed",
                      "product_id": "openSUSE Tumbleweed",
                      "product_identification_helper": {
                        "cpe": "cpe:/o:opensuse:tumbleweed"
                      }
                    }
                  }
                ],
                "category": "product_family",
                "name": "SUSE Linux Enterprise"
              }
            ],
            "category": "vendor",
            "name": "SUSE"
          }
        ],
        "relationships": [
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python311-zeroconf-0.149.16-1.1.aarch64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.aarch64"
            },
            "product_reference": "python311-zeroconf-0.149.16-1.1.aarch64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python311-zeroconf-0.149.16-1.1.ppc64le as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.ppc64le"
            },
            "product_reference": "python311-zeroconf-0.149.16-1.1.ppc64le",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python311-zeroconf-0.149.16-1.1.s390x as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.s390x"
            },
            "product_reference": "python311-zeroconf-0.149.16-1.1.s390x",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python311-zeroconf-0.149.16-1.1.x86_64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.x86_64"
            },
            "product_reference": "python311-zeroconf-0.149.16-1.1.x86_64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python313-zeroconf-0.149.16-1.1.aarch64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.aarch64"
            },
            "product_reference": "python313-zeroconf-0.149.16-1.1.aarch64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python313-zeroconf-0.149.16-1.1.ppc64le as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.ppc64le"
            },
            "product_reference": "python313-zeroconf-0.149.16-1.1.ppc64le",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python313-zeroconf-0.149.16-1.1.s390x as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.s390x"
            },
            "product_reference": "python313-zeroconf-0.149.16-1.1.s390x",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python313-zeroconf-0.149.16-1.1.x86_64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.x86_64"
            },
            "product_reference": "python313-zeroconf-0.149.16-1.1.x86_64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python314-zeroconf-0.149.16-1.1.aarch64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.aarch64"
            },
            "product_reference": "python314-zeroconf-0.149.16-1.1.aarch64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python314-zeroconf-0.149.16-1.1.ppc64le as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.ppc64le"
            },
            "product_reference": "python314-zeroconf-0.149.16-1.1.ppc64le",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python314-zeroconf-0.149.16-1.1.s390x as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.s390x"
            },
            "product_reference": "python314-zeroconf-0.149.16-1.1.s390x",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          },
          {
            "category": "default_component_of",
            "full_product_name": {
              "name": "python314-zeroconf-0.149.16-1.1.x86_64 as component of openSUSE Tumbleweed",
              "product_id": "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.x86_64"
            },
            "product_reference": "python314-zeroconf-0.149.16-1.1.x86_64",
            "relates_to_product_reference": "openSUSE Tumbleweed"
          }
        ]
      },
      "vulnerabilities": [
        {
          "cve": "CVE-2026-48487",
          "ids": [
            {
              "system_name": "SUSE CVE Page",
              "text": "https://www.suse.com/security/cve/CVE-2026-48487"
            }
          ],
          "notes": [
            {
              "category": "general",
              "text": "unknown",
              "title": "CVE description"
            }
          ],
          "product_status": {
            "recommended": [
              "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.aarch64",
              "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.ppc64le",
              "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.s390x",
              "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.x86_64",
              "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.aarch64",
              "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.ppc64le",
              "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.s390x",
              "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.x86_64",
              "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.aarch64",
              "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.ppc64le",
              "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.s390x",
              "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.x86_64"
            ]
          },
          "references": [
            {
              "category": "external",
              "summary": "CVE-2026-48487",
              "url": "https://www.suse.com/security/cve/CVE-2026-48487"
            },
            {
              "category": "external",
              "summary": "SUSE Bug 1268235 for CVE-2026-48487",
              "url": "https://bugzilla.suse.com/1268235"
            }
          ],
          "remediations": [
            {
              "category": "vendor_fix",
              "details": "To install this SUSE Security Update use the SUSE recommended installation methods like YaST online_update or \"zypper patch\".\n",
              "product_ids": [
                "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.aarch64",
                "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.ppc64le",
                "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.s390x",
                "openSUSE Tumbleweed:python311-zeroconf-0.149.16-1.1.x86_64",
                "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.aarch64",
                "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.ppc64le",
                "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.s390x",
                "openSUSE Tumbleweed:python313-zeroconf-0.149.16-1.1.x86_64",
                "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.aarch64",
                "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.ppc64le",
                "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.s390x",
                "openSUSE Tumbleweed:python314-zeroconf-0.149.16-1.1.x86_64"
              ]
            }
          ],
          "threats": [
            {
              "category": "impact",
              "date": "2026-06-15T00:00:00Z",
              "details": "moderate"
            }
          ],
          "title": "CVE-2026-48487"
        }
      ]
    }

    PYSEC-2026-3438

    Vulnerability from pysec - Published: 2026-07-13 15:46 - Updated: 2026-07-13 16:07
    VLAI
    Details

    Impact

    _read_character_string and _read_string in src/zeroconf/_protocol/incoming.py sliced self.data[self.offset : self.offset + length] and advanced self.offset by the declared length without checking it against self._data_len. Python's slice silently returns fewer bytes when the end index runs past the buffer, so a record whose 16-bit RDLENGTH (RFC 1035 §3.2.1) over-advertised by tens of kilobytes was constructed from a truncated payload, appended to DNSIncoming._answers, and committed to the cache before any later parse failure surfaced. The follow-up _read_name for the next record then failed, but the corrupt record had already entered the answer list and propagated to DNSCache and ServiceInfo.

    Any unauthenticated host on the local link (UDP/5353, 224.0.0.251 / ff02::fb) can multicast a single mDNS response carrying a TXT, HINFO, or A/AAAA record that advertises rdlength=65535 and only a handful of real payload bytes; consumers calling ServiceInfo.properties then parse the truncated bytes as if they matched the wire, and downstream integrations (Home Assistant and other zeroconf-driven discovery) trust the decoded record. The bug is parser-state desync rather than RCE, but it seeds the cache with attacker-shaped key/value and address records for a TTL window and is a building block for higher-impact chains.

    The impact is likely lower than the other recently released advisories as there is no additional risk of OOM so the severity was manually set to low to override the score CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N (6.5, Medium) since that doesn't fully consider the mDNS threat model.

    Patches

    Fixed in zeroconf 0.149.16 (PR #1756). Note that this change originally intended to ship in 0.149.13 but we ran out of space on PyPI: see https://github.com/python-zeroconf/python-zeroconf/issues/1769

    Upgrade to >= 0.149.16.

    Workarounds

    There is no in-process workaround; upgrading is the fix. Otherwise, restrict mDNS (UDP/5353) to trusted Layer-2 segments via AP client isolation, guest-network separation, or host firewall rules.

    Resources

    Impacted products
    Name purl
    zeroconf pkg:pypi/zeroconf

    {
      "affected": [
        {
          "package": {
            "ecosystem": "PyPI",
            "name": "zeroconf",
            "purl": "pkg:pypi/zeroconf"
          },
          "ranges": [
            {
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "0.149.16"
                }
              ],
              "type": "ECOSYSTEM"
            }
          ],
          "versions": [
            "0.100.0",
            "0.101.0",
            "0.102.0",
            "0.103.0",
            "0.104.0",
            "0.105.0",
            "0.106.0",
            "0.107.0",
            "0.108.0",
            "0.109.0",
            "0.110.0",
            "0.111.0",
            "0.112.0",
            "0.114.0",
            "0.115.0",
            "0.115.1",
            "0.115.2",
            "0.116.0",
            "0.117.0",
            "0.118.0",
            "0.118.1",
            "0.119.0",
            "0.120.0",
            "0.121.0",
            "0.122.0",
            "0.122.1",
            "0.122.2",
            "0.122.3",
            "0.123.0",
            "0.124.0",
            "0.125.0",
            "0.126.0",
            "0.127.0",
            "0.128.0",
            "0.128.1",
            "0.128.2",
            "0.128.3",
            "0.128.4",
            "0.128.5",
            "0.129.0",
            "0.130.0",
            "0.131.0",
            "0.132.0",
            "0.132.1",
            "0.132.2",
            "0.133.0",
            "0.134.0",
            "0.135.0",
            "0.136.0",
            "0.136.1",
            "0.136.2",
            "0.137.0",
            "0.137.1",
            "0.137.2",
            "0.138.0",
            "0.138.1",
            "0.139.0",
            "0.14",
            "0.140.0",
            "0.140.1",
            "0.141.0",
            "0.142.0",
            "0.143.0",
            "0.143.1",
            "0.144.0",
            "0.144.1",
            "0.144.2",
            "0.144.3",
            "0.145.0",
            "0.145.1",
            "0.146.0",
            "0.146.1",
            "0.146.2",
            "0.146.3",
            "0.146.4",
            "0.146.5",
            "0.147.0",
            "0.147.1",
            "0.147.2",
            "0.147.3",
            "0.147.4",
            "0.148.0",
            "0.149.0",
            "0.149.1",
            "0.149.10",
            "0.149.11",
            "0.149.12",
            "0.149.2",
            "0.149.3",
            "0.149.4",
            "0.149.5",
            "0.149.6",
            "0.149.7",
            "0.149.8",
            "0.149.9",
            "0.15",
            "0.15.1",
            "0.16.0",
            "0.17.0",
            "0.17.1",
            "0.17.2",
            "0.17.3",
            "0.17.4",
            "0.17.5",
            "0.17.6",
            "0.17.7",
            "0.18.0",
            "0.19.0",
            "0.19.1",
            "0.20.0",
            "0.21.0",
            "0.21.1",
            "0.21.2",
            "0.21.3",
            "0.22.0",
            "0.23.0",
            "0.24.0",
            "0.24.1",
            "0.24.2",
            "0.24.3",
            "0.24.4",
            "0.24.5",
            "0.25.0",
            "0.25.1",
            "0.26.0",
            "0.26.1",
            "0.26.2",
            "0.26.3",
            "0.27.0",
            "0.27.1",
            "0.28.0",
            "0.28.1",
            "0.28.2",
            "0.28.3",
            "0.28.4",
            "0.28.5",
            "0.28.6",
            "0.28.7",
            "0.28.8",
            "0.29.0",
            "0.30.0",
            "0.31.0",
            "0.32.0",
            "0.32.1",
            "0.33.0",
            "0.33.1",
            "0.33.2",
            "0.33.3",
            "0.33.4",
            "0.34.0",
            "0.34.1",
            "0.34.2",
            "0.34.3",
            "0.35.0",
            "0.35.1",
            "0.36.0",
            "0.36.1",
            "0.36.11",
            "0.36.12",
            "0.36.13",
            "0.36.2",
            "0.36.3",
            "0.36.4",
            "0.36.5",
            "0.36.6",
            "0.36.7",
            "0.36.8",
            "0.36.9",
            "0.37.0",
            "0.38.0",
            "0.38.1",
            "0.38.3",
            "0.38.4",
            "0.38.5",
            "0.38.6",
            "0.38.7",
            "0.39.0",
            "0.39.1",
            "0.39.2",
            "0.39.3",
            "0.39.4",
            "0.43.0",
            "0.44.0",
            "0.45.0",
            "0.46.0",
            "0.47.0",
            "0.47.1",
            "0.47.2",
            "0.47.3",
            "0.47.4",
            "0.48.0",
            "0.49.0",
            "0.50.0",
            "0.51.0",
            "0.52.0",
            "0.53.0",
            "0.53.1",
            "0.54.0",
            "0.55.0",
            "0.56.0",
            "0.57.0",
            "0.58.0",
            "0.58.1",
            "0.58.2",
            "0.59.0",
            "0.60.0",
            "0.61.0",
            "0.62.0",
            "0.63.0",
            "0.64.0",
            "0.64.1",
            "0.65.0",
            "0.66.0",
            "0.67.0",
            "0.68.0",
            "0.68.1",
            "0.69.0",
            "0.70.0",
            "0.71.0",
            "0.71.1",
            "0.71.2",
            "0.71.3",
            "0.71.4",
            "0.71.5",
            "0.72.0",
            "0.72.1",
            "0.72.2",
            "0.72.3",
            "0.73.0",
            "0.74.0",
            "0.75.0",
            "0.76.0",
            "0.77.0",
            "0.78.0",
            "0.79.0",
            "0.80.0",
            "0.81.0",
            "0.82.0",
            "0.82.1",
            "0.83.0",
            "0.83.1",
            "0.84.0",
            "0.85.0",
            "0.86.0",
            "0.87.0",
            "0.88.0",
            "0.89.0",
            "0.90.0",
            "0.91.0",
            "0.91.1",
            "0.92.0",
            "0.93.0",
            "0.93.1",
            "0.94.0",
            "0.95.0",
            "0.96.0",
            "0.97.0",
            "0.98.0",
            "0.99.0"
          ]
        }
      ],
      "aliases": [
        "CVE-2026-48487",
        "GHSA-qc2x-6f54-m6h9"
      ],
      "details": "### Impact\n\n`_read_character_string` and `_read_string` in `src/zeroconf/_protocol/incoming.py` sliced `self.data[self.offset : self.offset + length]` and advanced `self.offset` by the declared `length` without checking it against `self._data_len`. Python\u0027s slice silently returns fewer bytes when the end index runs past the buffer, so a record whose 16-bit RDLENGTH (RFC 1035 \u00a73.2.1) over-advertised by tens of kilobytes was constructed from a truncated payload, appended to `DNSIncoming._answers`, and committed to the cache before any later parse failure surfaced. The follow-up `_read_name` for the next record then failed, but the corrupt record had already entered the answer list and propagated to `DNSCache` and `ServiceInfo`.\n\nAny unauthenticated host on the local link (UDP/5353, `224.0.0.251` / `ff02::fb`) can multicast a single mDNS response carrying a TXT, HINFO, or A/AAAA record that advertises rdlength=65535 and only a handful of real payload bytes; consumers calling `ServiceInfo.properties` then parse the truncated bytes as if they matched the wire, and downstream integrations (Home Assistant and other zeroconf-driven discovery) trust the decoded record. The bug is parser-state desync rather than RCE, but it seeds the cache with attacker-shaped key/value and address records for a TTL window and is a building block for higher-impact chains.\n\nThe impact is likely lower than the other recently released advisories as there is no additional risk of OOM so the severity was manually set to low to override the score CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N (6.5, Medium) since that doesn\u0027t fully consider the mDNS threat model.\n\n### Patches\n\nFixed in `zeroconf` 0.149.16 ([PR #1756](https://github.com/python-zeroconf/python-zeroconf/pull/1756)).  Note that this change originally intended to ship in 0.149.13 but we ran out of space on PyPI: see https://github.com/python-zeroconf/python-zeroconf/issues/1769\n\nUpgrade to `\u003e= 0.149.16`.\n\n### Workarounds\n\nThere is no in-process workaround; upgrading is the fix. Otherwise, restrict mDNS (UDP/5353) to trusted Layer-2 segments via AP client isolation, guest-network separation, or host firewall rules.\n\n### Resources\n\n- [PR #1756](https://github.com/python-zeroconf/python-zeroconf/pull/1756), fix\n- [Issue #1752](https://github.com/python-zeroconf/python-zeroconf/issues/1752), public tracking issue\n- [RFC 1035 \u00a73.2.1](https://www.rfc-editor.org/rfc/rfc1035#section-3.2.1), [RFC 1035 \u00a73.3](https://www.rfc-editor.org/rfc/rfc1035#section-3.3), [CWE-130](https://cwe.mitre.org/data/definitions/130.html)",
      "id": "PYSEC-2026-3438",
      "modified": "2026-07-13T16:07:37.052096Z",
      "published": "2026-07-13T15:46:23.146611Z",
      "references": [
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/security/advisories/GHSA-qc2x-6f54-m6h9"
        },
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/issues/1752"
        },
        {
          "type": "WEB",
          "url": "https://github.com/python-zeroconf/python-zeroconf/pull/1756"
        },
        {
          "type": "PACKAGE",
          "url": "https://github.com/python-zeroconf/python-zeroconf"
        },
        {
          "type": "PACKAGE",
          "url": "https://pypi.org/project/zeroconf"
        },
        {
          "type": "ADVISORY",
          "url": "https://github.com/advisories/GHSA-qc2x-6f54-m6h9"
        },
        {
          "type": "ADVISORY",
          "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-48487"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
          "type": "CVSS_V3"
        },
        {
          "score": "CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:U",
          "type": "CVSS_V4"
        }
      ],
      "summary": "zeroconf: Unvalidated rdlength in record payload readers allows LAN-local cache corruption via crafted mDNS packet"
    }