| 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-2024-36906: ARM: 9381/1: kasan: clear stale stack poison |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| ARM: 9381/1: kasan: clear stale stack poison |
| |
| We found below OOB crash: |
| |
| [ 33.452494] ================================================================== |
| [ 33.453513] BUG: KASAN: stack-out-of-bounds in refresh_cpu_vm_stats.constprop.0+0xcc/0x2ec |
| [ 33.454660] Write of size 164 at addr c1d03d30 by task swapper/0/0 |
| [ 33.455515] |
| [ 33.455767] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G O 6.1.25-mainline #1 |
| [ 33.456880] Hardware name: Generic DT based system |
| [ 33.457555] unwind_backtrace from show_stack+0x18/0x1c |
| [ 33.458326] show_stack from dump_stack_lvl+0x40/0x4c |
| [ 33.459072] dump_stack_lvl from print_report+0x158/0x4a4 |
| [ 33.459863] print_report from kasan_report+0x9c/0x148 |
| [ 33.460616] kasan_report from kasan_check_range+0x94/0x1a0 |
| [ 33.461424] kasan_check_range from memset+0x20/0x3c |
| [ 33.462157] memset from refresh_cpu_vm_stats.constprop.0+0xcc/0x2ec |
| [ 33.463064] refresh_cpu_vm_stats.constprop.0 from tick_nohz_idle_stop_tick+0x180/0x53c |
| [ 33.464181] tick_nohz_idle_stop_tick from do_idle+0x264/0x354 |
| [ 33.465029] do_idle from cpu_startup_entry+0x20/0x24 |
| [ 33.465769] cpu_startup_entry from rest_init+0xf0/0xf4 |
| [ 33.466528] rest_init from arch_post_acpi_subsys_init+0x0/0x18 |
| [ 33.467397] |
| [ 33.467644] The buggy address belongs to stack of task swapper/0/0 |
| [ 33.468493] and is located at offset 112 in frame: |
| [ 33.469172] refresh_cpu_vm_stats.constprop.0+0x0/0x2ec |
| [ 33.469917] |
| [ 33.470165] This frame has 2 objects: |
| [ 33.470696] [32, 76) 'global_zone_diff' |
| [ 33.470729] [112, 276) 'global_node_diff' |
| [ 33.471294] |
| [ 33.472095] The buggy address belongs to the physical page: |
| [ 33.472862] page:3cd72da8 refcount:1 mapcount:0 mapping:00000000 index:0x0 pfn:0x41d03 |
| [ 33.473944] flags: 0x1000(reserved|zone=0) |
| [ 33.474565] raw: 00001000 ed741470 ed741470 00000000 00000000 00000000 ffffffff 00000001 |
| [ 33.475656] raw: 00000000 |
| [ 33.476050] page dumped because: kasan: bad access detected |
| [ 33.476816] |
| [ 33.477061] Memory state around the buggy address: |
| [ 33.477732] c1d03c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
| [ 33.478630] c1d03c80: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 00 00 00 |
| [ 33.479526] >c1d03d00: 00 04 f2 f2 f2 f2 00 00 00 00 00 00 f1 f1 f1 f1 |
| [ 33.480415] ^ |
| [ 33.481195] c1d03d80: 00 00 00 00 00 00 00 00 00 00 04 f3 f3 f3 f3 f3 |
| [ 33.482088] c1d03e00: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 |
| [ 33.482978] ================================================================== |
| |
| We find the root cause of this OOB is that arm does not clear stale stack |
| poison in the case of cpuidle. |
| |
| This patch refer to arch/arm64/kernel/sleep.S to resolve this issue. |
| |
| From cited commit [1] that explain the problem |
| |
| Functions which the compiler has instrumented for KASAN place poison on |
| the stack shadow upon entry and remove this poison prior to returning. |
| |
| In the case of cpuidle, CPUs exit the kernel a number of levels deep in |
| C code. Any instrumented functions on this critical path will leave |
| portions of the stack shadow poisoned. |
| |
| If CPUs lose context and return to the kernel via a cold path, we |
| restore a prior context saved in __cpu_suspend_enter are forgotten, and |
| we never remove the poison they placed in the stack shadow area by |
| functions calls between this and the actual exit of the kernel. |
| |
| Thus, (depending on stackframe layout) subsequent calls to instrumented |
| functions may hit this stale poison, resulting in (spurious) KASAN |
| splats to the console. |
| |
| To avoid this, clear any stale poison from the idle thread for a CPU |
| prior to bringing a CPU online. |
| |
| From cited commit [2] |
| |
| Extend to check for CONFIG_KASAN_STACK |
| |
| [1] commit 0d97e6d8024c ("arm64: kasan: clear stale stack poison") |
| [2] commit d56a9ef84bd0 ("kasan, arm64: unpoison stack only with CONFIG_KASAN_STACK") |
| |
| The Linux kernel CVE team has assigned CVE-2024-36906 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 5.11 with commit 5615f69bc2097452ecc954f5264d784e158d6801 and fixed in 5.15.159 with commit 20ac71bee028ffbae4fc14ed679b23b4d3e95726 |
| Issue introduced in 5.11 with commit 5615f69bc2097452ecc954f5264d784e158d6801 and fixed in 6.1.91 with commit ad702338fe423cb1e79745787090317256a98dab |
| Issue introduced in 5.11 with commit 5615f69bc2097452ecc954f5264d784e158d6801 and fixed in 6.6.31 with commit ee0ce7573e5083031960faf602c9db693ab5b477 |
| Issue introduced in 5.11 with commit 5615f69bc2097452ecc954f5264d784e158d6801 and fixed in 6.8.10 with commit b26f353786d365e658cebc9a9ace88e04fc2325e |
| Issue introduced in 5.11 with commit 5615f69bc2097452ecc954f5264d784e158d6801 and fixed in 6.9 with commit c4238686f9093b98bd6245a348bcf059cdce23af |
| |
| 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-2024-36906 |
| 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/arm/kernel/sleep.S |
| |
| |
| 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/20ac71bee028ffbae4fc14ed679b23b4d3e95726 |
| https://git.kernel.org/stable/c/ad702338fe423cb1e79745787090317256a98dab |
| https://git.kernel.org/stable/c/ee0ce7573e5083031960faf602c9db693ab5b477 |
| https://git.kernel.org/stable/c/b26f353786d365e658cebc9a9ace88e04fc2325e |
| https://git.kernel.org/stable/c/c4238686f9093b98bd6245a348bcf059cdce23af |