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:07Impact
_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
- PR #1756, fix
- Issue #1752, public tracking issue
- RFC 1035 §3.2.1, RFC 1035 §3.3, CWE-130
{
"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| 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
|
{
"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:07Impact
_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
- PR #1756, fix
- Issue #1752, public tracking issue
- RFC 1035 §3.2.1, RFC 1035 §3.3, CWE-130
| 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"
}