[PATCH v2 00/13] CRASH_WIPE_SECRETS: Wipe secrets before kdump (was: CRASH_ZEROIZE)

From: Jan Sebastian Götte

Date: Tue Aug 11 2026 - 13:55:34 EST


I'm using linux on an embedded target in a Hardware Security Module-like
application. One requirement is that I want the system to be able to
quickly erase its memory when it detects physical tampering. I'm
approaching that by using kdump to load into a small payload that
instead of dumping RAM, erases RAM from start to end. However, writing
all of RAM, especially on an embedded target, is rather slow. For this
reason, I propose the mechanism in this patch series:

Add CONFIG_CRASH_ZEROIZE (default off), which when enabled makes various
subsystems handling secret data do a quick, targeted wipe of these
secrets before kdump. This behavior might also be interesting in cases
where you run a normal kdump kernel but you still want to keep things
like fde crypto keys out of these dumps.

CONFIG_CRASH_ZEROIZE is a best effort, defense in depth solution. There
are circumstances, such as when a panic is triggered after memory
corruption, or when a panic interrupts some operation that mutates data
structures under locks, when the kernel cannot safely wipe some memory
areas. The handlers proposed in this series will just print a warning
and skip the affected areas in this case.

This series introduces handlers for the major locations I found where
having this sort of thing makes sense. Notable omissions right now are
the Ceph and CIFS subsystems. I have WIP patches for these, but since I
can't easily test them right now, I omitted them from this patch set for
now. Currently included locations are:

* various key types in security/keys
* rxrpc
* fscrypt
* dm-crypt
* crypto tfm instances
* secretmem (which I'm going to start using in my application)

I've verified this patch series on an ARM64 target using the helper code
at https://codeberg.org/yasec/crash-wipe-test . This code stuffs the
affected kernel subsystems with keys and secret data, then crashes the
system, takes a RAM dump and verifies the dump is clean of secrets. Note
that the helper code is partially LLM-generated, so read with care. It
passes a positive control test with the config option disabled.

The patch series applies on top of linux-next but should work on 7.0.0,
too. I've tested the patches on a Arduino uno Q (Qualcomm QRB2210,
ARM64) embedded target.

Signed-off-by: Jan Sebastian Götte <linux@xxxxxxxx>
---
Changes in v2:
- New keyring key types
- New handlers: rxrpc, fscrypt, dm-crypt and crypto tfm
- Renamed from "zeroize" to "wipe"
- Add ARM64-specific cache flush logic
- Link to v1: https://patch.msgid.link/20260731162739.158320-1-linux@xxxxxxxx

To: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
To: Baoquan He <baoquan.he@xxxxxxxxx>
To: Mike Rapoport <rppt@xxxxxxxxxx>
To: Pasha Tatashin <pasha.tatashin@xxxxxxxxxx>
To: Pratyush Yadav <pratyush@xxxxxxxxxx>
To: Dave Young <ruirui.yang@xxxxxxxxx>
To: Catalin Marinas <catalin.marinas@xxxxxxx>
To: Will Deacon <will@xxxxxxxxxx>
To: David Howells <dhowells@xxxxxxxxxx>
To: Jarkko Sakkinen <jarkko@xxxxxxxxxx>
To: Jonathan Corbet <corbet@xxxxxxx>
To: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
To: Paul Moore <paul@xxxxxxxxxxxxxx>
To: James Morris <jmorris@xxxxxxxxx>
To: "Serge E. Hallyn" <serge@xxxxxxxxxx>
To: Lukas Wunner <lukas@xxxxxxxxx>
To: Ignat Korchagin <ignat@xxxxxxxxx>
To: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
To: "David S. Miller" <davem@xxxxxxxxxxxxx>
To: Keith Busch <kbusch@xxxxxxxxxx>
To: Jens Axboe <axboe@xxxxxxxxx>
To: Christoph Hellwig <hch@xxxxxx>
To: Sagi Grimberg <sagi@xxxxxxxxxxx>
To: Trond Myklebust <trondmy@xxxxxxxxxx>
To: Anna Schumaker <anna@xxxxxxxxxx>
To: Mimi Zohar <zohar@xxxxxxxxxxxxx>
To: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>
To: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
To: Eric Dumazet <edumazet@xxxxxxxxxx>
To: Jakub Kicinski <kuba@xxxxxxxxxx>
To: Paolo Abeni <pabeni@xxxxxxxxxx>
To: Simon Horman <horms@xxxxxxxxxx>
To: Eric Biggers <ebiggers@xxxxxxxxxx>
To: "Theodore Y. Ts'o" <tytso@xxxxxxx>
To: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
To: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx>
To: Christian Brauner <brauner@xxxxxxxxxx>
To: Jan Kara <jack@xxxxxxx>
To: Alasdair Kergon <agk@xxxxxxxxxx>
To: Mike Snitzer <snitzer@xxxxxxxxxx>
To: Mikulas Patocka <mpatocka@xxxxxxxxxx>
To: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
Cc: kexec@xxxxxxxxxxxxxxxxxxx
Cc: linux-kernel@xxxxxxxxxxxxxxx
Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
Cc: linux-mm@xxxxxxxxx
Cc: keyrings@xxxxxxxxxxxxxxx
Cc: linux-doc@xxxxxxxxxxxxxxx
Cc: linux-security-module@xxxxxxxxxxxxxxx
Cc: linux-crypto@xxxxxxxxxxxxxxx
Cc: linux-nvme@xxxxxxxxxxxxxxxxxxx
Cc: linux-nfs@xxxxxxxxxxxxxxx
Cc: linux-integrity@xxxxxxxxxxxxxxx
Cc: linux-afs@xxxxxxxxxxxxxxxxxxx
Cc: netdev@xxxxxxxxxxxxxxx
Cc: linux-fscrypt@xxxxxxxxxxxxxxx
Cc: linux-fsdevel@xxxxxxxxxxxxxxx
Cc: dm-devel@xxxxxxxxxxxxxxx

---
Jan Sebastian Götte (13):
kexec: add CRASH_WIPE_SECRETS to wipe secrets before kdump
crash-core: Flush caches on CRASH_WIPE_SECRETS
arm64/mm: add set_direct_map_default_nosplit()
mm/secretmem: wipe secret pages before kdump
security/keys: wipe key payloads before kdump
security/keys: implement wipe op for user-type keys
security/keys: implement wipe op for big_key
security/keys: implement wipe op for trusted and encrypted keys
security/keys: implement wipe op for asymmetric keys
rxrpc: implement wipe op for rxrpc keys
fscrypt: wipe master keys before kdump
crypto: api - wipe tfm contexts before kdump
dm crypt: wipe key material before kdump

Documentation/security/keys/core.rst | 13 +++
arch/arm64/include/asm/set_memory.h | 2 +
arch/arm64/kernel/machine_kexec.c | 20 ++++
arch/arm64/mm/pageattr.c | 21 +++++
crypto/api.c | 78 +++++++++++++--
crypto/asymmetric_keys/asymmetric_type.c | 11 +++
crypto/asymmetric_keys/pkcs7_key_type.c | 1 +
crypto/asymmetric_keys/public_key.c | 15 +++
drivers/md/dm-crypt.c | 151 ++++++++++++++++++++++++++----
drivers/nvme/common/keyring.c | 1 +
fs/crypto/block.c | 10 ++
fs/crypto/fscrypt_private.h | 15 +++
fs/crypto/keyring.c | 68 +++++++++++++-
fs/crypto/keysetup_v1.c | 15 +++
fs/nfs/nfs4idmap.c | 2 +
fs/super.c | 29 ++++++
include/keys/asymmetric-subtype.h | 5 +
include/keys/user-type.h | 1 +
include/linux/crash_core.h | 37 ++++++++
include/linux/crypto.h | 11 +++
include/linux/fs.h | 4 +
include/linux/key-type.h | 9 ++
include/linux/set_memory.h | 17 +++-
kernel/Kconfig.kexec | 16 ++++
kernel/crash_core.c | 52 ++++++++++
mm/secretmem.c | 53 +++++++++++
net/rxrpc/ar-internal.h | 5 +
net/rxrpc/key.c | 34 +++++++
net/rxrpc/rxgk.c | 11 +++
net/rxrpc/rxkad.c | 14 +++
net/rxrpc/server_key.c | 11 +++
security/keys/big_key.c | 17 ++++
security/keys/encrypted-keys/encrypted.c | 13 +++
security/keys/key.c | 43 +++++++++
security/keys/trusted-keys/trusted_core.c | 15 +++
security/keys/user_defined.c | 15 +++
36 files changed, 808 insertions(+), 27 deletions(-)
---
base-commit: a0dbb7d3457bdebe2dbe198bd08bf9690be5f1ec
change-id: 20260811-crash-zeroize-rework-bb1a5d917577

Best regards,
--
Jan Sebastian Götte <linux@xxxxxxxx>