{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-40139", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2025-04-16T07:20:57.171Z", "datePublished": "2025-11-12T10:23:24.216Z", "dateUpdated": "2026-08-05T12:08:01.554Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:08:01.554Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nsmc: Use __sk_dst_get() and dst_dev_rcu() in in smc_clc_prfx_set().\n\nsmc_clc_prfx_set() is called during connect() and not under RCU\nnor RTNL.\n\nUsing sk_dst_get(sk)->dev could trigger UAF.\n\nLet's use __sk_dst_get() and dev_dst_rcu() under rcu_read_lock()\nafter kernel_getsockname().\n\nNote that the returned value of smc_clc_prfx_set() is not used\nin the caller.\n\nWhile at it, we change the 1st arg of smc_clc_prfx_set[46]_rcu()\nnot to touch dst there." } ], "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 - `smc_clc_prfx_set()` is only reached from the client side of the CLC handshake, via `connect()` on a locally created AF_SMC socket (`smc_connect` → `__smc_connect` → `smc_clc_send_proposal`). The attacker must have local code execution to initiate the connection, so the vector is Local even though the leaked bytes are subsequently sent to a remote peer.\nAC:L - The attacker drives both sides of the race — one thread loops `connect()` on AF_SMC sockets (the stale `dst->dev` dereference), while another repeatedly creates and deletes net_devices to force `dst_dev_put()`/`free_netdev()`, which unprivileged users can do freely inside a user namespace with CAP_NET_ADMIN. No condition depends on state outside the attacker's influence, and the window is widened at will by using non-blocking connect so the work runs in `smc_connect_work`.\nPR:L - `smc_create()` performs no capability check and `MODULE_ALIAS_NETPROTO(PF_SMC)` lets any unprivileged user autoload the module; the netdev teardown side needs CAP_NET_ADMIN, which is obtainable by an ordinary user via `unshare -Urn` and therefore counts as Low, not High.\nUI:N - The attacker's own process performs every step — creating the SMC socket, connecting to a listener it controls, and tearing down the device — with no action required from any other user or administrator.\nS:U - The use-after-free touches the freed `net_device` slab and the `in_device`/`inet6_dev` structures it points to, all within the kernel's own security authority; no VM, IOMMU, or sandbox boundary is crossed.\nC:H - The freed `net_device` is dereferenced and its `ifa_list`/`addr_list` walked, and a reclaimed slab can be groomed with attacker-controlled data, yielding an arbitrary kernel-memory read; worse, `smc_clc_prfx_set6_rcu()` copies up to 8 prefixes out of that freed memory into the CLC Proposal that `smc_clc_send_proposal()` transmits, exfiltrating freed kernel bytes onto the wire.\nI:H - A use-after-free on a `net_device` is a heap-corruption primitive — the reclaimed object's contents are attacker-influenceable through heap spraying and the code follows pointers out of it (`dev->ip_ptr`, `dev->ip6_ptr`, list heads), which can be groomed into an arbitrary write and control-flow hijack.\nA:H - Dereferencing the freed device and walking a bogus `in_dev`/`inet6_dev` address list reliably produces a kernel oops or panic, or an unbounded list walk that hangs the CPU, and the attacker can repeat the attempt indefinitely." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "net/smc/smc_clc.c" ], "versions": [ { "version": "a046d57da19f812216f393e7c535f5858f793ac3", "lessThan": "0736993bfe5c7a9c744ae3fac62d769dfdae54e1", "status": "affected", "versionType": "git" }, { "version": "a046d57da19f812216f393e7c535f5858f793ac3", "lessThan": "935d783e5de9b64587f3adb25641dd8385e64ddb", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "net/smc/smc_clc.c" ], "versions": [ { "version": "4.11", "status": "affected" }, { "version": "0", "lessThan": "4.11", "status": "unaffected", "versionType": "semver" }, { "version": "6.17.3", "lessThanOrEqual": "6.17.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.18", "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": "4.11", "versionEndExcluding": "6.17.3" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.11", "versionEndExcluding": "6.18" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/0736993bfe5c7a9c744ae3fac62d769dfdae54e1" }, { "url": "https://git.kernel.org/stable/c/935d783e5de9b64587f3adb25641dd8385e64ddb" } ], "title": "smc: Use __sk_dst_get() and dst_dev_rcu() in in smc_clc_prfx_set().", "x_generator": { "engine": "bippy-1.2.0" } } } }