CVE-2026-64527 (GCVE-0-2026-64527)
Vulnerability from cvelistv5 – Published: 2026-07-25 09:20 – Updated: 2026-07-25 09:20
VLAI
EPSS
VEX
Title
drm/hyperv: validate VMBus packet size in receive callback
Summary
In the Linux kernel, the following vulnerability has been resolved:
drm/hyperv: validate VMBus packet size in receive callback
hyperv_receive_sub() reads msg->vid_hdr.type and dispatches into one
of four message-type branches without knowing how many bytes the host
wrote into hv->recv_buf. The completion path then runs
memcpy(hv->init_buf, msg, VMBUS_MAX_PACKET_SIZE), so the consumer that
wakes on wait_for_completion_timeout() can read up to 16 KiB of
residue from a prior message as if it were the response payload.
Pass bytes_recvd into hyperv_receive_sub() and reject any packet that
does not cover the pipe + synthvid header. A single switch on
msg->vid_hdr.type then computes the type-specific payload size: the
three completion-driving types (SYNTHVID_VERSION_RESPONSE,
SYNTHVID_RESOLUTION_RESPONSE, SYNTHVID_VRAM_LOCATION_ACK) fall through
to a shared exit that requires that size before memcpy/complete, while
SYNTHVID_FEATURE_CHANGE validates its own payload and returns before
reading is_dirt_needed. Unknown types are dropped.
SYNTHVID_RESOLUTION_RESPONSE is variable length: the host fills
resolution_count entries, not the full SYNTHVID_MAX_RESOLUTION_COUNT
array. Validate the fixed prefix first so resolution_count can be
read, bound it against the array, then require only the count-sized
array, so the shorter responses the host actually sends are accepted.
Only run the sub-handler when vmbus_recvpacket() returned success. The
memcpy length is bytes_recvd, which is bounded by VMBUS_MAX_PACKET_SIZE
only on a successful receive; on -ENOBUFS vmbus_recvpacket() instead
reports the required length, which can exceed hv->recv_buf, so copying
bytes_recvd would read and write past the 16 KiB buffers. Gating on the
success return keeps the copy bounded. The nonzero-return path is itself
a malformed-message case and is now logged rather than silently skipped;
channel recovery is not attempted.
Rejected packets are reported via drm_err_ratelimited() rather than
silently dropped, matching the CoCo-hardened pattern in
hv_kvp_onchannelcallback().
Severity
No CVSS data available.
Assigner
References
7 references
Impacted products
2 products
| Vendor | Product | Version | |
|---|---|---|---|
| Linux | Linux |
Affected:
76c56a5affeba1e163b66b9d8cc192e6154466f0 , < 57d5d697642e05d5dd2d40660817765943dd709f
(git)
Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < f5251226551bfec98c4705641b6f94ff1f238d91 (git) Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < 049a6b474823049fe60212f25f26e4b30f44ee8f (git) Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < 588c84b461393ff1998ac7b97b04f953f642e0df (git) Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < 164dc7bf17609340233c6bf4f66bb7c7008a0511 (git) Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < c8974d96b6a5496f33dc69a3ce28a7bf5078def4 (git) Affected: 76c56a5affeba1e163b66b9d8cc192e6154466f0 , < 7f87763f47a3c22fb50265a00619ef10f2394b18 (git) |
|
| Linux | Linux |
Affected:
5.14
Unaffected: 0 , < 5.14 (semver) Unaffected: 5.15.210 , ≤ 5.15.* (semver) Unaffected: 6.1.176 , ≤ 6.1.* (semver) Unaffected: 6.6.143 , ≤ 6.6.* (semver) Unaffected: 6.12.93 , ≤ 6.12.* (semver) Unaffected: 6.18.35 , ≤ 6.18.* (semver) Unaffected: 7.0.12 , ≤ 7.0.* (semver) Unaffected: 7.1 , ≤ * (original_commit_for_fix) |
{
"containers": {
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"drivers/gpu/drm/hyperv/hyperv_drm_proto.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "57d5d697642e05d5dd2d40660817765943dd709f",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "f5251226551bfec98c4705641b6f94ff1f238d91",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "049a6b474823049fe60212f25f26e4b30f44ee8f",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "588c84b461393ff1998ac7b97b04f953f642e0df",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "164dc7bf17609340233c6bf4f66bb7c7008a0511",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "c8974d96b6a5496f33dc69a3ce28a7bf5078def4",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
},
{
"lessThan": "7f87763f47a3c22fb50265a00619ef10f2394b18",
"status": "affected",
"version": "76c56a5affeba1e163b66b9d8cc192e6154466f0",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"drivers/gpu/drm/hyperv/hyperv_drm_proto.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "5.14"
},
{
"lessThan": "5.14",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "5.15.*",
"status": "unaffected",
"version": "5.15.210",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.1.*",
"status": "unaffected",
"version": "6.1.176",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.6.*",
"status": "unaffected",
"version": "6.6.143",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.12.*",
"status": "unaffected",
"version": "6.12.93",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"version": "6.18.35",
"versionType": "semver"
},
{
"lessThanOrEqual": "7.0.*",
"status": "unaffected",
"version": "7.0.12",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.1",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "5.15.210",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.1.176",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.6.143",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.12.93",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.18.35",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.0.12",
"versionStartIncluding": "5.14",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.1",
"versionStartIncluding": "5.14",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\ndrm/hyperv: validate VMBus packet size in receive callback\n\nhyperv_receive_sub() reads msg-\u003evid_hdr.type and dispatches into one\nof four message-type branches without knowing how many bytes the host\nwrote into hv-\u003erecv_buf. The completion path then runs\nmemcpy(hv-\u003einit_buf, msg, VMBUS_MAX_PACKET_SIZE), so the consumer that\nwakes on wait_for_completion_timeout() can read up to 16 KiB of\nresidue from a prior message as if it were the response payload.\n\nPass bytes_recvd into hyperv_receive_sub() and reject any packet that\ndoes not cover the pipe + synthvid header. A single switch on\nmsg-\u003evid_hdr.type then computes the type-specific payload size: the\nthree completion-driving types (SYNTHVID_VERSION_RESPONSE,\nSYNTHVID_RESOLUTION_RESPONSE, SYNTHVID_VRAM_LOCATION_ACK) fall through\nto a shared exit that requires that size before memcpy/complete, while\nSYNTHVID_FEATURE_CHANGE validates its own payload and returns before\nreading is_dirt_needed. Unknown types are dropped.\n\nSYNTHVID_RESOLUTION_RESPONSE is variable length: the host fills\nresolution_count entries, not the full SYNTHVID_MAX_RESOLUTION_COUNT\narray. Validate the fixed prefix first so resolution_count can be\nread, bound it against the array, then require only the count-sized\narray, so the shorter responses the host actually sends are accepted.\n\nOnly run the sub-handler when vmbus_recvpacket() returned success. The\nmemcpy length is bytes_recvd, which is bounded by VMBUS_MAX_PACKET_SIZE\nonly on a successful receive; on -ENOBUFS vmbus_recvpacket() instead\nreports the required length, which can exceed hv-\u003erecv_buf, so copying\nbytes_recvd would read and write past the 16 KiB buffers. Gating on the\nsuccess return keeps the copy bounded. The nonzero-return path is itself\na malformed-message case and is now logged rather than silently skipped;\nchannel recovery is not attempted.\n\nRejected packets are reported via drm_err_ratelimited() rather than\nsilently dropped, matching the CoCo-hardened pattern in\nhv_kvp_onchannelcallback()."
}
],
"providerMetadata": {
"dateUpdated": "2026-07-25T09:20:51.078Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/57d5d697642e05d5dd2d40660817765943dd709f"
},
{
"url": "https://git.kernel.org/stable/c/f5251226551bfec98c4705641b6f94ff1f238d91"
},
{
"url": "https://git.kernel.org/stable/c/049a6b474823049fe60212f25f26e4b30f44ee8f"
},
{
"url": "https://git.kernel.org/stable/c/588c84b461393ff1998ac7b97b04f953f642e0df"
},
{
"url": "https://git.kernel.org/stable/c/164dc7bf17609340233c6bf4f66bb7c7008a0511"
},
{
"url": "https://git.kernel.org/stable/c/c8974d96b6a5496f33dc69a3ce28a7bf5078def4"
},
{
"url": "https://git.kernel.org/stable/c/7f87763f47a3c22fb50265a00619ef10f2394b18"
}
],
"title": "drm/hyperv: validate VMBus packet size in receive callback",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2026-64527",
"datePublished": "2026-07-25T09:20:51.078Z",
"dateReserved": "2026-07-19T15:36:31.794Z",
"dateUpdated": "2026-07-25T09:20:51.078Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-64527",
"date": "2026-07-25",
"epss": "0.00215",
"percentile": "0.11987"
},
"nvd": "{\"cve\":{\"id\":\"CVE-2026-64527\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-07-25T10:17:39.053\",\"lastModified\":\"2026-07-25T10:17:39.053\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\ndrm/hyperv: validate VMBus packet size in receive callback\\n\\nhyperv_receive_sub() reads msg-\u003evid_hdr.type and dispatches into one\\nof four message-type branches without knowing how many bytes the host\\nwrote into hv-\u003erecv_buf. The completion path then runs\\nmemcpy(hv-\u003einit_buf, msg, VMBUS_MAX_PACKET_SIZE), so the consumer that\\nwakes on wait_for_completion_timeout() can read up to 16 KiB of\\nresidue from a prior message as if it were the response payload.\\n\\nPass bytes_recvd into hyperv_receive_sub() and reject any packet that\\ndoes not cover the pipe + synthvid header. A single switch on\\nmsg-\u003evid_hdr.type then computes the type-specific payload size: the\\nthree completion-driving types (SYNTHVID_VERSION_RESPONSE,\\nSYNTHVID_RESOLUTION_RESPONSE, SYNTHVID_VRAM_LOCATION_ACK) fall through\\nto a shared exit that requires that size before memcpy/complete, while\\nSYNTHVID_FEATURE_CHANGE validates its own payload and returns before\\nreading is_dirt_needed. Unknown types are dropped.\\n\\nSYNTHVID_RESOLUTION_RESPONSE is variable length: the host fills\\nresolution_count entries, not the full SYNTHVID_MAX_RESOLUTION_COUNT\\narray. Validate the fixed prefix first so resolution_count can be\\nread, bound it against the array, then require only the count-sized\\narray, so the shorter responses the host actually sends are accepted.\\n\\nOnly run the sub-handler when vmbus_recvpacket() returned success. The\\nmemcpy length is bytes_recvd, which is bounded by VMBUS_MAX_PACKET_SIZE\\nonly on a successful receive; on -ENOBUFS vmbus_recvpacket() instead\\nreports the required length, which can exceed hv-\u003erecv_buf, so copying\\nbytes_recvd would read and write past the 16 KiB buffers. Gating on the\\nsuccess return keeps the copy bounded. The nonzero-return path is itself\\na malformed-message case and is now logged rather than silently skipped;\\nchannel recovery is not attempted.\\n\\nRejected packets are reported via drm_err_ratelimited() rather than\\nsilently dropped, matching the CoCo-hardened pattern in\\nhv_kvp_onchannelcallback().\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"drivers/gpu/drm/hyperv/hyperv_drm_proto.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"57d5d697642e05d5dd2d40660817765943dd709f\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"f5251226551bfec98c4705641b6f94ff1f238d91\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"049a6b474823049fe60212f25f26e4b30f44ee8f\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"588c84b461393ff1998ac7b97b04f953f642e0df\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"164dc7bf17609340233c6bf4f66bb7c7008a0511\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"c8974d96b6a5496f33dc69a3ce28a7bf5078def4\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"76c56a5affeba1e163b66b9d8cc192e6154466f0\",\"lessThan\":\"7f87763f47a3c22fb50265a00619ef10f2394b18\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"drivers/gpu/drm/hyperv/hyperv_drm_proto.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"5.14\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"5.14\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"5.15.210\",\"lessThanOrEqual\":\"5.15.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.1.176\",\"lessThanOrEqual\":\"6.1.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.6.143\",\"lessThanOrEqual\":\"6.6.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.93\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.35\",\"lessThanOrEqual\":\"6.18.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.0.12\",\"lessThanOrEqual\":\"7.0.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.1\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/049a6b474823049fe60212f25f26e4b30f44ee8f\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/164dc7bf17609340233c6bf4f66bb7c7008a0511\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/57d5d697642e05d5dd2d40660817765943dd709f\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/588c84b461393ff1998ac7b97b04f953f642e0df\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/7f87763f47a3c22fb50265a00619ef10f2394b18\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/c8974d96b6a5496f33dc69a3ce28a7bf5078def4\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/f5251226551bfec98c4705641b6f94ff1f238d91\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}"
}
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
Loading…
Loading…