linux/Documentation/crypto
Eric Biggers 15dd81da35 crypto: af_alg - Remove zero-copy support from skcipher and aead
commit ffdd2bc378 upstream.

The zero-copy support is one of the riskiest aspects of AF_ALG.  It
allows userspace to request cryptographic operations directly on
pagecache pages of files like the 'su' binary.  It also allows userspace
to concurrently modify the memory which is being operated on, a recipe
for TOCTOU vulnerabilities.

While zero-copy support is more valuable in other areas of the kernel
like the frequently used networking and file I/O code, it has far less
value in AF_ALG, which is a niche UAPI.  AF_ALG primarily just exists
for backwards compatibility with a small set of userspace programs such
as 'iwd' that haven't yet been fixed to use userspace crypto code.

Originally AF_ALG was intended to be used to access hardware crypto
accelerators.  However, it isn't an efficient interface for that anyway,
and it turned out to be rarely used in this way in practice.

Thus, the risks of the zero-copy support in AF_ALG vastly outweigh its
benefits.  Let's just remove it.

This commit removes it from the "skcipher" and "aead" algorithm types.
"hash" will be handled separately.

This is a soft break, not a hard break.  Even after this commit, it
still works to use splice() or sendfile() to transfer data to an AF_ALG
request socket from a pipe or any file, respectively.  What changes is
just that the kernel now makes an internal, stable copy of the data
before doing the crypto operation.  So performance is slightly reduced,
but the UAPI isn't broken.  And, very importantly, it's much safer.

Tested with libkcapi/test.sh.  All its test cases still pass.  I also
verified that this would have prevented the copy.fail exploit as well.
I also used a custom test program to verify that sendfile() still works.

Fixes: 8ff590903d ("crypto: algif_skcipher - User-space interface for skcipher operations")
Fixes: 400c40cf78 ("crypto: algif - add AEAD support")
Reported-by: Taeyang Lee <0wn@theori.io>
Link: https://copy.fail/
Reported-by: Feng Ning <feng@innora.ai>
Closes: https://lore.kernel.org/r/afYcc-tZFwvZZo76@ans-MacBook-Pro.local
Reviewed-by: Demi Marie Obenour <demiobenour@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-07-24 15:51:27 +02:00
..
api-aead.rst crypto: doc - optimize compilation 2016-12-13 16:38:07 -07:00
api-akcipher.rst crypto: doc - optimize compilation 2016-12-13 16:38:07 -07:00
api-digest.rst crypto: doc - Fix hash export state information 2017-02-03 18:16:11 +08:00
api-intro.rst It's been a busy cycle for documentation - hopefully the busiest for a 2020-08-04 22:47:54 -07:00
api-kpp.rst crypto: doc - optimize compilation 2016-12-13 16:38:07 -07:00
api-rng.rst crypto: doc - optimize compilation 2016-12-13 16:38:07 -07:00
api-samples.rst crypto: doc - improve the skcipher API example code 2019-06-13 14:31:40 +08:00
api-skcipher.rst crypto: remove cipher routines from public crypto API 2021-01-03 08:41:35 +11:00
api.rst crypto: skcipher - remove remnants of internal IV generators 2018-12-23 11:52:45 +08:00
architecture.rst crypto: ablkcipher - remove deprecated and unused ablkcipher support 2019-11-17 09:02:49 +08:00
asymmetric-keys.rst docs: crypto: convert asymmetric-keys.txt to ReST 2020-06-19 14:03:46 -06:00
async-tx-api.rst docs: crypto: convert async-tx-api.txt to ReST format 2020-06-19 14:05:15 -06:00
crypto_engine.rst crypto: ablkcipher - remove deprecated and unused ablkcipher support 2019-11-17 09:02:49 +08:00
descore-readme.rst docs: crypto: descore-readme.txt: convert to ReST format 2020-06-19 14:05:22 -06:00
devel-algos.rst crypto: algapi - make unregistration functions return void 2019-12-20 14:58:35 +08:00
index.rst docs: crypto: descore-readme.txt: convert to ReST format 2020-06-19 14:05:22 -06:00
intro.rst crypto: doc - convert crypto API documentation to Sphinx 2016-12-13 16:37:54 -07:00
userspace-if.rst crypto: af_alg - Remove zero-copy support from skcipher and aead 2026-07-24 15:51:27 +02:00