CVE: CVE-2023-53742
Published: 2025-12-08
Description: In the Linux kernel, the following vulnerability has been resolved:

kcsan: Avoid READ_ONCE() in read_instrumented_memory()

Haibo Li reported:

 | Unable to handle kernel paging request at virtual address
 |   ffffff802a0d8d7171
 | Mem abort info:o:
 |   ESR = 0x[PII_REDACTED]
 |   EC = 0x25: DABT (current EL), IL = 32 bitsts
 |   SET = 0, FnV = 0 0
 |   EA = 0, S1PTW = 0 0
 |   FSC = 0x21: alignment fault
 | Data abort info:o:
 |   ISV = 0, ISS = 0x[PII_REDACTED]
 |   CM = 0, WnR = 0 0
 | swapper pgtable: 4k pages, 39-bit VAs, pgdp=[PII_REDACTED]35200000
 | [ffffff802a0d8d71] pgd=180000005fbf9003, p4d=180000005fbf9003,
 | pud=180000005fbf9003, pmd=180000005fbe8003, pte=006800002a0d8707
 | Internal error: Oops: 96000021 [#1] PREEMPT SMP
 | Modules linked in:
 | CPU: 2 PID: 45 Comm: kworker/u8:2 Not tainted
 |   5.15.78-android13-8-g63561175bbda-dirty #1
 | ...
 | pc : kcsan_setup_watchpoint+0x26c/0x6bc
 | lr : kcsan_setup_watchpoint+0x88/0x6bc
 | sp : ffffffc00ab4b7f0
 | x29: ffffffc00ab4b800 x28: ffffff80294fe588 x27: [PII_REDACTED]
 | x26: [PII_REDACTED] x25: [PII_REDACTED] x24: ffffff80294fdb80
 | x23: [PII_REDACTED] x22: ffffffc00a70fb68 x21: ffffff802a0d8d71
 | x20: [PII_REDACTED] x19: [PII_REDACTED] x18: ffffffc00a9bd060
 | x17: [PII_REDACTED] x16: [PII_REDACTED] x15: ffffffc00a59f000
 | x14: [PII_REDACTED] x13: [PII_REDACTED] x12: ffffffc00a70faa0
 | x11: 00000000aaaaaaab x10: [PII_REDACTED] x9 : ffffffc00839adf8
 | x8 : ffffffc009b4cf00 x7 : [PII_REDACTED] x6 : [PII_REDACTED]
 | x5 : [PII_REDACTED] x4 : [PII_REDACTED] x3 : ffffffc00a70fb70
 | x2 : 0005ff802a0d8d71 x1 : [PII_REDACTED] x0 : [PII_REDACTED]
 | Call trace:
 |  kcsan_setup_watchpoint+0x26c/0x6bc
 |  __tsan_read2+0x1f0/0x234
 |  inflate_fast+0x498/0x750
 |  zlib_inflate+0x1304/0x2384
 |  __gunzip+0x3a0/0x45c
 |  gunzip+0x20/0x30
 |  unpack_to_rootfs+0x2a8/0x3fc
 |  do_populate_rootfs+0xe8/0x11c
 |  async_run_entry_fn+0x58/0x1bc
 |  process_one_work+0x3ec/0x738
 |  worker_thread+0x4c4/0x838
 |  kthread+0x20c/0x258
 |  ret_from_fork+0x10/0x20
 | Code: b8bfc2a8 2a0803f7 14000007 d503249f (78bfc2a8) )
 | ---[ end trace 613a943cb0a572b6 ]-----

The reason for this is that on certain arm64 configuration since
e35123d83ee3 ("arm64: lto: Strengthen READ_ONCE() to acquire when
CONFIG_LTO=y"), READ_ONCE() may be promoted to a full atomic acquire
instruction which cannot be used on unaligned addresses.

Fix it by avoiding READ_ONCE() in read_instrumented_memory(), and simply
forcing the compiler to do the required access by casting to the
appropriate volatile type. In terms of generated code this currently
only affects architectures that do not use the default READ_ONCE()
implementation.

The only downside is that we are not guaranteed atomicity of the access
itself, although on most architectures a plain load up to machine word
size should still be atomic (a fact the default READ_ONCE() still relies
on itself).
References: https://git.kernel.org/stable/c/706ae665747b629bcf87a2d7e6438602f904b8d5; https://git.kernel.org/stable/c/75c03a8cfc731519236f08c34c7e029ae153a613; https://git.kernel.org/stable/c/8dec88070d964bfeb4198f34cb5956d89dd1f557