Linux: arm64: hibernate: mask DAIF before restoring hibernated kernel
What fixes it
- 099ad3edcef1d955d9f5d6aab16ae78ecdfd4cdaLinuxCVE List
- 716c41bd476334afb943308be9ff2142e34461b7LinuxCVE List
- 5370853041a3cb53a125b77528586278f64b378bLinuxCVE List
- 290c5b0c9fc0c61fb1c41421ed2394f955206ea0LinuxCVE List
- 012823494e20c3cce622982ebd3fd6971be39ad2LinuxCVE List
- 684bde100117931f4c51c644a95f42f2dab041bcLinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
arm64: hibernate: mask DAIF before restoring hibernated kernel
The arm64 hibernate code manages the exception masking in an unsound way, leading to potential crashes and/or warnings during resume.
When a hibernation image is saved in swsusp_arch_suspend(), all DAIF exceptions are masked (by virtue of local_daif_save()), and the suspended image is saved assuming that all DAIF exceptions will remain masked when the image is restored.
When a hibernation image is resumed by swsusp_arch_resume(), only interrupts are masked (by virtue of local_irq_disable() in resume_target_kernel()). When pseudo-NMI is enabled the DAIF.IF bits will be clear, and regardless of pseudo-NMI the DAIF.DA bits will be clear.
This means that there are two problems:
(1) It is possible to take Debug, SError, or pseudo-NMI exceptions during the resume process. This is unsafe, as during the resume process both the old ane new kernels will tranisently be in an inconsistent state, and swsusp_arch_suspend_exit() won't retain an executable mapping of any exception vectors.
Any exception taken here will be fatal and silent.
(2) When re-entering the resumed kernel, some DAIF bits will be clear unexpectedly. This permits Debug, SError, or pseudo-NMI exceptions to be taken for a short period while the resumed kernel is not yet in a consistent state.
This is detected by CONFIG_ARM64_DEBUG_PRIORITY_MASKING.
Avoid these issues by masking all DAIF exceptions during resume.
Text from CVE List
Affected versions 18
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before c9c671e9ab87b639720db8f7f8648bdf0f3bc8ecCVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 099ad3edcef1d955d9f5d6aab16ae78ecdfd4cdaCVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 716c41bd476334afb943308be9ff2142e34461b7CVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 5370853041a3cb53a125b77528586278f64b378bCVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 290c5b0c9fc0c61fb1c41421ed2394f955206ea0CVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 012823494e20c3cce622982ebd3fd6971be39ad2CVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before d736ace2c491623c9ab5e73744085e93e9ae3ebeCVE List
- Linuxaffected: 82869ac57b5d3b550446932c918dbf2caf020c9e before 684bde100117931f4c51c644a95f42f2dab041bcCVE List
- Linuxaffected: 4.7CVE List
- Linuxunaffected: all versions before 4.7CVE List
- Linuxunaffected: 5.10.270 through 5.10.*CVE List
- Linuxunaffected: 5.15.221 through 5.15.*CVE List
- Linuxunaffected: 6.1.188 through 6.1.*CVE List
- Linuxunaffected: 6.6.157 through 6.6.*CVE List
- Linuxunaffected: 6.12.110 through 6.12.*CVE List
- Linuxunaffected: 6.18.52 through 6.18.*CVE List
- Linuxunaffected: 7.2.6 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/c9c671e9ab87b639720db8f7f8648bdf0f3bc8ecReferencevia CVE List
- git.kernel.org/stable/c/099ad3edcef1d955d9f5d6aab16ae78ecdfd4cdaReferencevia CVE List
- git.kernel.org/stable/c/716c41bd476334afb943308be9ff2142e34461b7Referencevia CVE List
- git.kernel.org/stable/c/5370853041a3cb53a125b77528586278f64b378bReferencevia CVE List
- git.kernel.org/stable/c/290c5b0c9fc0c61fb1c41421ed2394f955206ea0Referencevia CVE List
- git.kernel.org/stable/c/012823494e20c3cce622982ebd3fd6971be39ad2Referencevia CVE List
- git.kernel.org/stable/c/d736ace2c491623c9ab5e73744085e93e9ae3ebeReferencevia CVE List
- git.kernel.org/stable/c/684bde100117931f4c51c644a95f42f2dab041bcReferencevia CVE List