Re: [PATCH 0/3] dm-pcache: validate on-disk fields before use

Zheng Gu <[email protected]>
Newsgroups dev.linux.lists.dm-devel,org.kernel.vger.linux-kernel
Message-ID <CADSj-VqmVQxrhDJH51inLTzUQK8K6mCC4Ce=dqscEO-iHUDA9A@mail.gmail.com>
Hi Vargas,

Thanks for catching this issue.

Best regards,
Gu

On Fri, Jun 19, 2026 at 7:44 PM Bryam Vargas via B4 Relay
<[email protected]> wrote:
>
> dm-pcache reads its layout from the cache device and mostly trusts it. The
> table load needs CAP_SYS_ADMIN, but the on-media metadata is only self-checked
> with a CRC32C over a fixed, public seed, so anyone who can format or swap the
> cache device forges the fields and recomputes the CRC. Several of them become
> segment ids, array indices, loop counts and intra-segment extents with no bound
> against the device geometry, which turns crafted metadata into kernel
> out-of-bounds accesses, both at table load and during normal cache I/O.
>
> Each patch adds the bound where the field is decoded:
>
>   1/3  segment ids that index cache->segments[] -- bound against cache->n_segs
>        (cache_pos_decode, cache_key_decode, and the last-kset paths in replay,
>        writeback and gc).
>   2/3  cache_info->n_segs and the segment-chain ids -- bound against the cache
>        device segment count.
>   3/3  the kset key_num, read by cache_kset_crc() and the replay loop before the
>        CRC is even compared, and a key whose offset+length runs past its segment
>        -- the latter is an OOB read that otherwise reaches user space on a cache
>        read hit.
>
> I found these by walking the cache-device decode paths. Each class reproduces in a
> faithful in-kernel model under KASAN: the bug arm faults (slab out-of-bounds -- a
> read for the seg_id, geometry and key_num/extent cases, a write for the n_segs
> loop), the arm with the added bound is clean, and valid metadata is clean. The key
> offset/length case also reproduces under KMSAN, where the over-read returns
> uninitialized kernel memory. Reproducer available on request. Each check rejects
> bad metadata with -EIO and leaves valid metadata alone.
>
> checkpatch --strict is clean apart from "Alignment should match open
> parenthesis" on the multi-line pcache_dev_err() calls, which match the style
> already in the driver.
>
> ---
> Bryam Vargas (3):
>       dm-pcache: validate seg_id fields from persistent memory
>       dm-pcache: validate geometry fields from on-disk cache_info
>       dm-pcache: validate kset key_num and intra-segment bounds
>
>  drivers/md/dm-pcache/cache.c           | 17 +++++++++++++++++
>  drivers/md/dm-pcache/cache.h           | 35 ++++++++++++++++++++++++++++++++++
>  drivers/md/dm-pcache/cache_gc.c        | 24 +++++++++++++++++------
>  drivers/md/dm-pcache/cache_key.c       | 21 +++++++++++++++++++-
>  drivers/md/dm-pcache/cache_writeback.c | 22 ++++++++++++++-------
>  5 files changed, 105 insertions(+), 14 deletions(-)
> ---
> base-commit: 4549871118cf616eecdd2d939f78e3b9e1dddc48
> change-id: 20260619-b4-disp-997773a1-69ada10d3a3e
>
> Best regards,
> --
> bryamzxz <[email protected]>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.