Skip to content

Commit fa5a377

Browse files
Herbert XuPlaidCat
authored andcommitted
crypto: algif_aead - snapshot IV for async AEAD requests
jira VULN-181877 cve-bf CVE-2026-31431 commit-author Douya Le <ldy3087146292@gmail.com> commit 5aa58c3 AF_ALG AEAD AIO requests currently use the socket-wide IV buffer during request processing. For async requests, later socket activity can update that shared state before the original request has fully completed, which can lead to inconsistent IV handling. Snapshot the IV into per-request storage when preparing the AEAD request, so in-flight operations no longer depend on mutable socket state. Fixes: d887c52 ("crypto: algif_aead - overhaul memory management") Cc: stable@kernel.org Reported-by: Yuan Tan <yuantan098@gmail.com> Reported-by: Yifan Wu <yifanwucs@gmail.com> Reported-by: Juefei Pu <tomapufckgml@gmail.com> Reported-by: Xin Liu <bird@lzu.edu.cn> Co-developed-by: Luxing Yin <tr0jan@lzu.edu.cn> Signed-off-by: Luxing Yin <tr0jan@lzu.edu.cn> Tested-by: Yucheng Lu <kanolyc@gmail.com> Signed-off-by: Douya Le <ldy3087146292@gmail.com> Signed-off-by: Ren Wei <n05ec@lzu.edu.cn> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent dedddb7 commit fa5a377

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

crypto/algif_aead.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
100100
struct crypto_aead *tfm = aeadc->aead;
101101
struct crypto_skcipher *null_tfm = aeadc->null_tfm;
102102
unsigned int as = crypto_aead_authsize(tfm);
103+
unsigned int ivsize = crypto_aead_ivsize(tfm);
103104
struct af_alg_async_req *areq;
104105
struct scatterlist *rsgl_src, *tsgl_src = NULL;
106+
void *iv;
105107
int err = 0;
106108
size_t used = 0; /* [in] TX bufs to be en/decrypted */
107109
size_t outlen = 0; /* [out] RX bufs produced by kernel */
@@ -153,10 +155,14 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
153155

154156
/* Allocate cipher request for current operation. */
155157
areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) +
156-
crypto_aead_reqsize(tfm));
158+
crypto_aead_reqsize(tfm) + ivsize);
157159
if (IS_ERR(areq))
158160
return PTR_ERR(areq);
159161

162+
iv = (u8 *)aead_request_ctx(&areq->cra_u.aead_req) +
163+
crypto_aead_reqsize(tfm);
164+
memcpy(iv, ctx->iv, ivsize);
165+
160166
/* convert iovecs of output buffers into RX SGL */
161167
err = af_alg_get_rsgl(sk, msg, flags, areq, outlen, &usedpages);
162168
if (err)
@@ -218,7 +224,7 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
218224

219225
/* Initialize the crypto operation */
220226
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
221-
areq->first_rsgl.sgl.sg, used, ctx->iv);
227+
areq->first_rsgl.sgl.sg, used, iv);
222228
aead_request_set_ad(&areq->cra_u.aead_req, ctx->aead_assoclen);
223229
aead_request_set_tfm(&areq->cra_u.aead_req, tfm);
224230

0 commit comments

Comments
 (0)