| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2021-47227: x86/fpu: Prevent state corruption in __fpu__restore_sig() |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| x86/fpu: Prevent state corruption in __fpu__restore_sig() |
| |
| The non-compacted slowpath uses __copy_from_user() and copies the entire |
| user buffer into the kernel buffer, verbatim. This means that the kernel |
| buffer may now contain entirely invalid state on which XRSTOR will #GP. |
| validate_user_xstate_header() can detect some of that corruption, but that |
| leaves the onus on callers to clear the buffer. |
| |
| Prior to XSAVES support, it was possible just to reinitialize the buffer, |
| completely, but with supervisor states that is not longer possible as the |
| buffer clearing code split got it backwards. Fixing that is possible but |
| not corrupting the state in the first place is more robust. |
| |
| Avoid corruption of the kernel XSAVE buffer by using copy_user_to_xstate() |
| which validates the XSAVE header contents before copying the actual states |
| to the kernel. copy_user_to_xstate() was previously only called for |
| compacted-format kernel buffers, but it works for both compacted and |
| non-compacted forms. |
| |
| Using it for the non-compacted form is slower because of multiple |
| __copy_from_user() operations, but that cost is less important than robust |
| code in an already slow path. |
| |
| [ Changelog polished by Dave Hansen ] |
| |
| The Linux kernel CVE team has assigned CVE-2021-47227 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 5.8 with commit b860eb8dce5906b14e3a7f3c771e0b3d6ef61b94 and fixed in 5.10.46 with commit 076f732b16a5bf842686e1b43ab6021a2d98233e |
| Issue introduced in 5.8 with commit b860eb8dce5906b14e3a7f3c771e0b3d6ef61b94 and fixed in 5.12.13 with commit ec25ea1f3f05d6f8ee51d1277efea986eafd4f2a |
| Issue introduced in 5.8 with commit b860eb8dce5906b14e3a7f3c771e0b3d6ef61b94 and fixed in 5.13 with commit 484cea4f362e1eeb5c869abbfb5f90eae6421b38 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2021-47227 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| arch/x86/kernel/fpu/signal.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/076f732b16a5bf842686e1b43ab6021a2d98233e |
| https://git.kernel.org/stable/c/ec25ea1f3f05d6f8ee51d1277efea986eafd4f2a |
| https://git.kernel.org/stable/c/484cea4f362e1eeb5c869abbfb5f90eae6421b38 |