{"dataType":"CVE_RECORD","cveMetadata":{"cveId":"CVE-2024-35847","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2024-05-17T13:50:33.105Z","datePublished":"2024-05-17T14:47:26.175Z","dateUpdated":"2026-08-05T11:30:16.581Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-05T11:30:16.581Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nirqchip/gic-v3-its: Prevent double free on error\n\nThe error handling path in its_vpe_irq_domain_alloc() causes a double free\nwhen its_vpe_init() fails after successfully allocating at least one\ninterrupt. This happens because its_vpe_irq_domain_free() frees the\ninterrupts along with the area bitmap and the vprop_page and\nits_vpe_irq_domain_alloc() subsequently frees the area bitmap and the\nvprop_page again.\n\nFix this by unconditionally invoking its_vpe_irq_domain_free() which\nhandles all cases correctly and by removing the bitmap/vprop_page freeing\nfrom its_vpe_irq_domain_alloc().\n\n[ tglx: Massaged change log ]"}],"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 only path into `its_vpe_irq_domain_alloc()` is the local `/dev/kvm` ioctl chain (`KVM_CREATE_VM`/`KVM_CREATE_VCPU`/`KVM_CREATE_DEVICE`/`KVM_DEV_ARM_ VGIC_CTRL_INIT` → `vgic_v4_init()` → `its_alloc_vcpu_irqs()`). No network, adjacent, or remote-peer input reaches this code.\nAC:L - The attacker deterministically creates the failure condition by exhausting the global 65536-entry `its_vpeid_ida` with its own VMs/vCPUs, then launching a multi-vCPU VM so vCPU 0 succeeds and vCPU 1 gets `-ENOSPC` — and it also chooses `nr_vcpus`, which selects the bitmap's kmalloc size class for grooming. Nothing depends on a race or on state outside the attacker's control; GICv4 hardware is the vulnerable configuration, not an attacker-uncontrolled precondition.\nPR:L - Only an unprivileged local account with an fd on `/dev/kvm` is needed — the `kvm` group on ordinary distros, world-accessible on many Android/ChromeOS/cloud images, and routinely passed into containers and untrusted-tenant VMM processes. There is no capability check on `vgic_init()`/`vgic_v4_init()`/`its_alloc_vcpu_irqs()`.\nUI:N - The attacker performs every step itself — draining the VPE ID space with its own VMs, then creating the VM whose vGIC init trips the error path. No victim action or other user's involvement is required.\nS:U - The defect and its consequences are confined to host kernel memory within a single security authority; no VM-escape, IOMMU, or sandbox boundary is crossed by the corruption itself.\nC:H - The `kmalloc()` inside the second `free_lpi_range()` reallocates the just-freed bitmap as a live `struct lpi_range`, which is then freed again, leaving a list-linked object on the slab freelist — a use-after-free the attacker can realloc and read back, giving uncontrolled disclosure of kernel memory. The duplicated `free_lpi_range()` additionally hands identical LPI IDs to two different devices/VMs, aliasing interrupt configuration and pending state across owners.\nI:H - The same dangling `lpi_range` can be re-allocated with attacker-controlled bytes, so `merge_lpi_ranges()`/`list_del()` operate on a forged `list_head` — a write-what-where primitive suitable for control-flow hijacking and privilege escalation. The order-4 `vprop_page` is also released twice, corrupting buddy-allocator state.\nA:H - Even unexploited, the double `kfree()`/`free_pages()` trips SLUB double-free detection, page refcount underflow, or later freelist corruption, producing an oops or panic. Any local user with `/dev/kvm` can trigger it at will and repeatedly."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/irqchip/irq-gic-v3-its.c"],"versions":[{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"f5417ff561b8ac9a7e53c747b8627a7ab58378ae","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"b72d2b1448b682844f995e660b77f2a1fabc1662","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"aa44d21574751a7d6bca892eb8e0e9ac68372e52","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"5dbdbe1133911ca7d8466bb86885adec32ad9438","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"dd681710ab77c8beafe2e263064cb1bd0e2d6ca9","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"03170e657f62c26834172742492a8cb8077ef792","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"5b012f77abde89bf0be8a0547636184fea618137","status":"affected","versionType":"git"},{"version":"7d75bbb4bc1ad90386776459d37e4ddfe605671e","lessThan":"c26591afd33adce296c022e3480dea4282b7ef91","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/irqchip/irq-gic-v3-its.c"],"versions":[{"version":"4.14","status":"affected"},{"version":"0","lessThan":"4.14","status":"unaffected","versionType":"semver"},{"version":"4.19.313","lessThanOrEqual":"4.19.*","status":"unaffected","versionType":"semver"},{"version":"5.4.275","lessThanOrEqual":"5.4.*","status":"unaffected","versionType":"semver"},{"version":"5.10.216","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.158","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.90","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.30","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.8.9","lessThanOrEqual":"6.8.*","status":"unaffected","versionType":"semver"},{"version":"6.9","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.14","versionEndExcluding":"4.19.313"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"5.4.275"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"5.10.216"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"5.15.158"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"6.1.90"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"6.6.30"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"6.8.9"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.14","versionEndExcluding":"6.9"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/f5417ff561b8ac9a7e53c747b8627a7ab58378ae"},{"url":"https://git.kernel.org/stable/c/b72d2b1448b682844f995e660b77f2a1fabc1662"},{"url":"https://git.kernel.org/stable/c/aa44d21574751a7d6bca892eb8e0e9ac68372e52"},{"url":"https://git.kernel.org/stable/c/5dbdbe1133911ca7d8466bb86885adec32ad9438"},{"url":"https://git.kernel.org/stable/c/dd681710ab77c8beafe2e263064cb1bd0e2d6ca9"},{"url":"https://git.kernel.org/stable/c/03170e657f62c26834172742492a8cb8077ef792"},{"url":"https://git.kernel.org/stable/c/5b012f77abde89bf0be8a0547636184fea618137"},{"url":"https://git.kernel.org/stable/c/c26591afd33adce296c022e3480dea4282b7ef91"}],"title":"irqchip/gic-v3-its: Prevent double free on error","x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"metrics":[{"other":{"type":"ssvc","content":{"timestamp":"2024-06-12T15:13:12.628141Z","id":"CVE-2024-35847","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"partial"}],"role":"CISA Coordinator","version":"2.0.3"}}}],"title":"CISA ADP Vulnrichment","providerMetadata":{"orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","shortName":"CISA-ADP","dateUpdated":"2024-06-12T15:13:20.451Z"}},{"providerMetadata":{"orgId":"af854a3a-2127-422b-91ae-364da2661108","shortName":"CVE","dateUpdated":"2024-08-02T03:21:48.906Z"},"title":"CVE Program Container","references":[{"url":"https://git.kernel.org/stable/c/f5417ff561b8ac9a7e53c747b8627a7ab58378ae","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/b72d2b1448b682844f995e660b77f2a1fabc1662","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/aa44d21574751a7d6bca892eb8e0e9ac68372e52","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/5dbdbe1133911ca7d8466bb86885adec32ad9438","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/dd681710ab77c8beafe2e263064cb1bd0e2d6ca9","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/03170e657f62c26834172742492a8cb8077ef792","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/5b012f77abde89bf0be8a0547636184fea618137","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/c26591afd33adce296c022e3480dea4282b7ef91","tags":["x_transferred"]},{"url":"https://lists.debian.org/debian-lts-announce/2024/06/msg00017.html","tags":["x_transferred"]},{"url":"https://lists.debian.org/debian-lts-announce/2024/06/msg00020.html","tags":["x_transferred"]}]}]},"dataVersion":"5.2"}