Files
vuln-cve/data/2021/47xxx/CVE-2021-47391.json
T

223 lines
12 KiB
JSON

{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2021-47391",
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"state": "PUBLISHED",
"assignerShortName": "Linux",
"dateReserved": "2024-05-21T14:58:30.813Z",
"datePublished": "2024-05-21T15:03:49.545Z",
"dateUpdated": "2026-08-05T08:47:36.737Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux",
"dateUpdated": "2026-08-05T08:47:36.737Z"
},
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nRDMA/cma: Ensure rdma_addr_cancel() happens before issuing more requests\n\nThe FSM can run in a circle allowing rdma_resolve_ip() to be called twice\non the same id_priv. While this cannot happen without going through the\nwork, it violates the invariant that the same address resolution\nbackground request cannot be active twice.\n\n CPU 1 CPU 2\n\nrdma_resolve_addr():\n RDMA_CM_IDLE -> RDMA_CM_ADDR_QUERY\n rdma_resolve_ip(addr_handler) #1\n\n\t\t\t process_one_req(): for #1\n addr_handler():\n RDMA_CM_ADDR_QUERY -> RDMA_CM_ADDR_BOUND\n mutex_unlock(&id_priv->handler_mutex);\n [.. handler still running ..]\n\nrdma_resolve_addr():\n RDMA_CM_ADDR_BOUND -> RDMA_CM_ADDR_QUERY\n rdma_resolve_ip(addr_handler)\n !! two requests are now on the req_list\n\nrdma_destroy_id():\n destroy_id_handler_unlock():\n _destroy_id():\n cma_cancel_operation():\n rdma_addr_cancel()\n\n // process_one_req() self removes it\n\t\t spin_lock_bh(&lock);\n cancel_delayed_work(&req->work);\n\t if (!list_empty(&req->list)) == true\n\n ! rdma_addr_cancel() returns after process_on_req #1 is done\n\n kfree(id_priv)\n\n\t\t\t process_one_req(): for #2\n addr_handler():\n\t mutex_lock(&id_priv->handler_mutex);\n !! Use after free on id_priv\n\nrdma_addr_cancel() expects there to be one req on the list and only\ncancels the first one. The self-removal behavior of the work only happens\nafter the handler has returned. This yields a situations where the\nreq_list can have two reqs for the same \"handle\" but rdma_addr_cancel()\nonly cancels the first one.\n\nThe second req remains active beyond rdma_destroy_id() and will\nuse-after-free id_priv once it inevitably triggers.\n\nFix this by remembering if the id_priv has called rdma_resolve_ip() and\nalways cancel before calling it again. This ensures the req_list never\ngets more than one item in it and doesn't cost anything in the normal flow\nthat never uses this strange error path."
}
],
"metrics": [
{
"cvssV3_1": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
"baseScore": 7.8,
"baseSeverity": "HIGH"
},
"scenarios": [
{
"lang": "en",
"value": "AV:L - The bug is reached through the RDMA userspace CM misc device (/dev/infiniband/rdma_cm) via ucma_resolve_ip/ucma_resolve_addr and destroy ioctls; it is a local syscall path, not triggered by remote packets alone.\nAC:L - The attacker fully controls both sides of the race by issuing concurrent RESOLVE_IP and DESTROY_ID commands on the same CM id, so success does not depend on victim state outside attacker influence.\nPR:L - The rdma_cm misc device is registered with mode 0666 and create/resolve/destroy paths perform no capability checks, so any unprivileged local user can open it and trigger the bug.\nUI:N - Exploitation requires only the attacker's own ucma operations; no action by another user is needed.\nS:U - This is a standard in-kernel use-after-free leading to privilege escalation within the same OS security authority, not a VM/IOMMU/sandbox boundary crossing.\nC:H - The dangling addr_handler runs against a freed rdma_id_private, giving a classic kernel UAF that can be leveraged for arbitrary memory disclosure.\nI:H - UAF of id_priv enables heap reuse and corruption suitable for arbitrary write or control-flow hijacking in the kernel.\nA:H - The second queued request inevitably invokes addr_handler on freed memory, causing kernel oops/panic even when not fully exploited."
}
]
}
],
"affected": [
{
"product": "Linux",
"vendor": "Linux",
"defaultStatus": "unaffected",
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"programFiles": [
"drivers/infiniband/core/cma.c",
"drivers/infiniband/core/cma_priv.h"
],
"versions": [
{
"version": "e51060f08a61965c4dd91516d82fe90617152590",
"lessThan": "9a085fa9b7d644a234465091e038c1911e1a4f2a",
"status": "affected",
"versionType": "git"
},
{
"version": "e51060f08a61965c4dd91516d82fe90617152590",
"lessThan": "03d884671572af8bcfbc9e63944c1021efce7589",
"status": "affected",
"versionType": "git"
},
{
"version": "e51060f08a61965c4dd91516d82fe90617152590",
"lessThan": "305d568b72f17f674155a2a8275f865f207b3808",
"status": "affected",
"versionType": "git"
}
]
},
{
"product": "Linux",
"vendor": "Linux",
"defaultStatus": "affected",
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"programFiles": [
"drivers/infiniband/core/cma.c",
"drivers/infiniband/core/cma_priv.h"
],
"versions": [
{
"version": "2.6.18",
"status": "affected"
},
{
"version": "0",
"lessThan": "2.6.18",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "5.10.188",
"lessThanOrEqual": "5.10.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "5.14.10",
"lessThanOrEqual": "5.14.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "5.15",
"lessThanOrEqual": "*",
"status": "unaffected",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "2.6.18",
"versionEndExcluding": "5.10.188"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "2.6.18",
"versionEndExcluding": "5.14.10"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "2.6.18",
"versionEndExcluding": "5.15"
}
]
}
]
}
],
"references": [
{
"url": "https://git.kernel.org/stable/c/9a085fa9b7d644a234465091e038c1911e1a4f2a"
},
{
"url": "https://git.kernel.org/stable/c/03d884671572af8bcfbc9e63944c1021efce7589"
},
{
"url": "https://git.kernel.org/stable/c/305d568b72f17f674155a2a8275f865f207b3808"
}
],
"title": "RDMA/cma: Ensure rdma_addr_cancel() happens before issuing more requests",
"x_generator": {
"engine": "bippy-1.2.0"
}
},
"adp": [
{
"title": "CISA ADP Vulnrichment",
"metrics": [
{
"other": {
"type": "ssvc",
"content": {
"id": "CVE-2021-47391",
"role": "CISA Coordinator",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"version": "2.0.3",
"timestamp": "2024-05-21T17:33:43.729564Z"
}
}
}
],
"providerMetadata": {
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP",
"dateUpdated": "2024-06-04T17:14:30.710Z"
}
},
{
"providerMetadata": {
"orgId": "af854a3a-2127-422b-91ae-364da2661108",
"shortName": "CVE",
"dateUpdated": "2024-08-04T05:39:59.044Z"
},
"title": "CVE Program Container",
"references": [
{
"url": "https://git.kernel.org/stable/c/9a085fa9b7d644a234465091e038c1911e1a4f2a",
"tags": [
"x_transferred"
]
},
{
"url": "https://git.kernel.org/stable/c/03d884671572af8bcfbc9e63944c1021efce7589",
"tags": [
"x_transferred"
]
},
{
"url": "https://git.kernel.org/stable/c/305d568b72f17f674155a2a8275f865f207b3808",
"tags": [
"x_transferred"
]
}
]
}
]
}
}