{"id":"CVE-2026-46290","state":"PUBLISHED","title":"x86/efi: Fix graceful fault handling after FPU softirq changes","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nx86/efi: Fix graceful fault handling after FPU softirq changes\n\nSince commit d02198550423 (\"x86/fpu: Improve crypto performance by\nmaking kernel-mode FPU reliably usable in softirqs\"), kernel_fpu_begin()\ncalls fpregs_lock() which uses local_bh_disable() instead of the\nprevious preempt_disable(). This sets SOFTIRQ_OFFSET in preempt_count\nduring the entire EFI runtime service call, causing in_interrupt() to\nreturn true in normal task context.\n\nThe graceful page fault handler efi_crash_gracefully_on_page_fault()\nuses in_interrupt() to bail out for faults in real interrupt context.\nWith SOFTIRQ_OFFSET now set, the handler always bails out, leaving EFI\nfirmware page faults unhandled. This escalates to die() which also sees\nin_interrupt() as true and calls panic(\"Fatal exception in interrupt\"),\nresulting in a hard system freeze. On systems with buggy firmware that\ntriggers page faults during EFI runtime calls (e.g., accessing unmapped\nmemory in GetTime()), this causes an unrecoverable hang instead of the\nexpected graceful EFI_ABORTED recovery.\n\nFix by replacing in_interrupt() with !in_task(). This preserves the\noriginal intent of bailing for interrupts or NMI faults, while no longer\nfalsely triggering from the FPU code path's local_bh_disable().\n\n[ardb: Sashiko spotted that using 'in_hardirq() || in_nmi()' leaves a\n       window where a softirq may be taken before fpregs_lock() is\n       called, but after efi_rts_work.efi_rts_id has been assigned,\n       and any page faults occurring in that window will then be\n       misidentified as having been caused by the firmware. Instead,\n       use !in_task(), which incorporates in_serving_softirq(). ]","publishedAt":"2026-06-08T15:46:17.224Z","updatedAt":"2026-06-14T18:06:47.501Z","severity":null,"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"22b365ba1af3d8c6036b8e5112fffe80998b85a0","versionType":"git"},{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"db155b86d1523e85941f61efd7d7ffb594cc9a29","versionType":"git"},{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"088f65e206087bf903743bd18417261d7a4c9644","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["arch/x86/platform/efi/quirks.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.15","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.15","versionType":"semver"},{"version":"6.18.30","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.0.7","status":"unaffected","lessThanOrEqual":"7.0.*","versionType":"semver"},{"version":"7.1","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["arch/x86/platform/efi/quirks.c"]}],"references":["https://git.kernel.org/stable/c/22b365ba1af3d8c6036b8e5112fffe80998b85a0","https://git.kernel.org/stable/c/db155b86d1523e85941f61efd7d7ffb594cc9a29","https://git.kernel.org/stable/c/088f65e206087bf903743bd18417261d7a4c9644"],"weaknesses":[],"ingestedAt":"2026-10-29T20:12:07.131Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/46xxx/CVE-2026-46290.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-46290","state":"PUBLISHED","datePublished":"2026-06-08T15:46:17.224Z","dateUpdated":"2026-06-14T18:06:47.501Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-05-13T15:03:33.110Z"},"containers":{"cna":{"title":"x86/efi: Fix graceful fault handling after FPU softirq changes","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nx86/efi: Fix graceful fault handling after FPU softirq changes\n\nSince commit d02198550423 (\"x86/fpu: Improve crypto performance by\nmaking kernel-mode FPU reliably usable in softirqs\"), kernel_fpu_begin()\ncalls fpregs_lock() which uses local_bh_disable() instead of the\nprevious preempt_disable(). This sets SOFTIRQ_OFFSET in preempt_count\nduring the entire EFI runtime service call, causing in_interrupt() to\nreturn true in normal task context.\n\nThe graceful page fault handler efi_crash_gracefully_on_page_fault()\nuses in_interrupt() to bail out for faults in real interrupt context.\nWith SOFTIRQ_OFFSET now set, the handler always bails out, leaving EFI\nfirmware page faults unhandled. This escalates to die() which also sees\nin_interrupt() as true and calls panic(\"Fatal exception in interrupt\"),\nresulting in a hard system freeze. On systems with buggy firmware that\ntriggers page faults during EFI runtime calls (e.g., accessing unmapped\nmemory in GetTime()), this causes an unrecoverable hang instead of the\nexpected graceful EFI_ABORTED recovery.\n\nFix by replacing in_interrupt() with !in_task(). This preserves the\noriginal intent of bailing for interrupts or NMI faults, while no longer\nfalsely triggering from the FPU code path's local_bh_disable().\n\n[ardb: Sashiko spotted that using 'in_hardirq() || in_nmi()' leaves a\n       window where a softirq may be taken before fpregs_lock() is\n       called, but after efi_rts_work.efi_rts_id has been assigned,\n       and any page faults occurring in that window will then be\n       misidentified as having been caused by the firmware. Instead,\n       use !in_task(), which incorporates in_serving_softirq(). ]"}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"22b365ba1af3d8c6036b8e5112fffe80998b85a0","versionType":"git"},{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"db155b86d1523e85941f61efd7d7ffb594cc9a29","versionType":"git"},{"version":"d02198550423a0b695e7a24ec77153209ad45b09","status":"affected","lessThan":"088f65e206087bf903743bd18417261d7a4c9644","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["arch/x86/platform/efi/quirks.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.15","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.15","versionType":"semver"},{"version":"6.18.30","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.0.7","status":"unaffected","lessThanOrEqual":"7.0.*","versionType":"semver"},{"version":"7.1","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["arch/x86/platform/efi/quirks.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/22b365ba1af3d8c6036b8e5112fffe80998b85a0"},{"url":"https://git.kernel.org/stable/c/db155b86d1523e85941f61efd7d7ffb594cc9a29"},{"url":"https://git.kernel.org/stable/c/088f65e206087bf903743bd18417261d7a4c9644"}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-06-14T18:06:47.501Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"6.18.30"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"7.0.7"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.15","versionEndExcluding":"7.1"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}