diff options
| author | Zhao Gongyi <zhaogongyi@bytedance.com> | 2026-11-02 01:10:30 +0800 |
|---|---|---|
| committer | Catalin Marinas <catalin.marinas@arm.com> | 2026-11-04 18:46:10 +0000 |
| commit | b0958b1397fb5ffdb995c0ccc74349841929c08d (patch) | |
| tree | 2774c9a4c8c81dbeac0d3c7ea72ab48adbcf8a23 /scripts/subarch.include | |
| parent | beeec04046227eba42b7cc5ab32498aa43da9632 (diff) | |
arm64: mm: validate /dev/mem mmap ranges without overflow
An arm64 syzkaller reproducer creates a FUSE character device with
major:minor 1:1, so opening it uses the /dev/mem file operations. It
maps one page from offset 0xfffffffffffff000 at user address zero.
The next openat() with a NULL pathname triggers a synchronous external
abort (SEA, ESR 0x96000010) in strncpy_from_user() via do_getname(),
panicking the kernel.
valid_mmap_phys_addr_range() checks the exclusive end by adding the
mapping size to the starting address. For this offset, the sum wraps
to zero and passes the PHYS_MASK test, allowing an out-of-range PFN to
reach remap_pfn_range(). The inclusive-end overflow check in
mmap_mem_prepare() does not catch it because the end is ULONG_MAX.
Reject starting PFNs outside PHYS_MASK and compare the inclusive length
against the remaining physical range without overflowing. This also
allows mappings that end exactly at PHYS_MASK, which the old check
incorrectly rejects.
Fixes: 1d18c47c735e ("arm64: MMU fault handling and page table management")
Cc: stable@vger.kernel.org
Signed-off-by: Zhao Gongyi <zhaogongyi@bytedance.com>
[catalin.marinas@arm.com: changed the check to look more like __access_ok()]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'scripts/subarch.include')
0 files changed, 0 insertions, 0 deletions
