{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-31525", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2026-03-09T15:48:24.111Z", "datePublished": "2026-04-22T13:54:39.144Z", "dateUpdated": "2026-08-05T12:23:15.645Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:23:15.645Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Fix undefined behavior in interpreter sdiv/smod for INT_MIN\n\nThe BPF interpreter's signed 32-bit division and modulo handlers use\nthe kernel abs() macro on s32 operands. The abs() macro documentation\n(include/linux/math.h) explicitly states the result is undefined when\nthe input is the type minimum. When DST contains S32_MIN (0x80000000),\nabs((s32)DST) triggers undefined behavior and returns S32_MIN unchanged\non arm64/x86. This value is then sign-extended to u64 as\n0xFFFFFFFF80000000, causing do_div() to compute the wrong result.\n\nThe verifier's abstract interpretation (scalar32_min_max_sdiv) computes\nthe mathematically correct result for range tracking, creating a\nverifier/interpreter mismatch that can be exploited for out-of-bounds\nmap value access.\n\nIntroduce abs_s32() which handles S32_MIN correctly by casting to u32\nbefore negating, avoiding signed overflow entirely. Replace all 8\nabs((s32)...) call sites in the interpreter's sdiv32/smod32 handlers.\n\ns32 is the only affected case -- the s64 division/modulo handlers do\nnot use abs()." } ], "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 vulnerable interpreter code is reached by locally loading and executing a crafted eBPF program through the bpf() syscall, or by attaching/running that program through local BPF interfaces. It is not reachable directly from unauthenticated network packets without first installing attacker-controlled BPF locally.\nAC:L - There is no race or probabilistic prerequisite; the attacker controls the BPF arithmetic operands and can deterministically create the verifier/interpreter mismatch. The interpreter/JIT setting is an affected-deployment precondition, not exploit complexity once present.\nPR:L - A basic local user can reach BPF program and unprivileged map creation on systems with unprivileged BPF enabled for permitted program types such as socket filters. If disabled, higher privileges or delegation are needed, but the highest reasonable affected deployment supports PR:L.\nUI:N - The attacker can load and run or attach the malicious BPF program directly. No victim action is required.\nS:U - The impact is compromise of kernel memory and privileges within the same operating-system security authority. This is standard local kernel privilege escalation rather than a VM or hardware boundary escape.\nC:H - The verifier/interpreter mismatch can be exploited for out-of-bounds BPF map value access. Such map OOB access can disclose kernel memory and be shaped into stronger read primitives.\nI:H - Out-of-bounds map value writes allow kernel memory corruption. In BPF verifier-style bugs, this is defensibly exploitable for arbitrary write, privilege escalation, or control-flow compromise.\nA:H - The same out-of-bounds kernel memory access can corrupt critical state and crash or panic the kernel. The malicious program can be executed repeatedly by the local attacker." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "kernel/bpf/core.c" ], "versions": [ { "version": "ec0e2da95f72d4a46050a4d994e4fe471474fd80", "lessThan": "694ea55f1b1c74f9942d91ec366ae9e822422e42", "status": "affected", "versionType": "git" }, { "version": "ec0e2da95f72d4a46050a4d994e4fe471474fd80", "lessThan": "9ab1227765c446942f290c83382f0b19887c55cf", "status": "affected", "versionType": "git" }, { "version": "ec0e2da95f72d4a46050a4d994e4fe471474fd80", "lessThan": "f14ca604c0ff274fba19f73f1f0485c0047c1396", "status": "affected", "versionType": "git" }, { "version": "ec0e2da95f72d4a46050a4d994e4fe471474fd80", "lessThan": "0d5d8c3ce45c734aaf3c51cbef59155a6746157d", "status": "affected", "versionType": "git" }, { "version": "ec0e2da95f72d4a46050a4d994e4fe471474fd80", "lessThan": "c77b30bd1dcb61f66c640ff7d2757816210c7cb0", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "kernel/bpf/core.c" ], "versions": [ { "version": "6.6", "status": "affected" }, { "version": "0", "lessThan": "6.6", "status": "unaffected", "versionType": "semver" }, { "version": "6.6.131", "lessThanOrEqual": "6.6.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.80", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.18.21", "lessThanOrEqual": "6.18.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.19.11", "lessThanOrEqual": "6.19.*", "status": "unaffected", "versionType": "semver" }, { "version": "7.0", "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": "6.6", "versionEndExcluding": "6.6.131" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.6", "versionEndExcluding": "6.12.80" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.6", "versionEndExcluding": "6.18.21" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.6", "versionEndExcluding": "6.19.11" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.6", "versionEndExcluding": "7.0" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/694ea55f1b1c74f9942d91ec366ae9e822422e42" }, { "url": "https://git.kernel.org/stable/c/9ab1227765c446942f290c83382f0b19887c55cf" }, { "url": "https://git.kernel.org/stable/c/f14ca604c0ff274fba19f73f1f0485c0047c1396" }, { "url": "https://git.kernel.org/stable/c/0d5d8c3ce45c734aaf3c51cbef59155a6746157d" }, { "url": "https://git.kernel.org/stable/c/c77b30bd1dcb61f66c640ff7d2757816210c7cb0" } ], "title": "bpf: Fix undefined behavior in interpreter sdiv/smod for INT_MIN", "x_generator": { "engine": "bippy-1.2.0" } } } }