Skip to content

Commit 945aa89

Browse files
Herbert XuPlaidCat
authored andcommitted
crypto: algif_aead - snapshot IV for async AEAD requests
jira VULN-181881 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 77160bf commit 945aa89

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
@@ -97,8 +97,10 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
9797
struct crypto_aead *tfm = aeadc->aead;
9898
struct crypto_sync_skcipher *null_tfm = aeadc->null_tfm;
9999
unsigned int as = crypto_aead_authsize(tfm);
100+
unsigned int ivsize = crypto_aead_ivsize(tfm);
100101
struct af_alg_async_req *areq;
101102
struct scatterlist *rsgl_src, *tsgl_src = NULL;
103+
void *iv;
102104
int err = 0;
103105
size_t used = 0; /* [in] TX bufs to be en/decrypted */
104106
size_t outlen = 0; /* [out] RX bufs produced by kernel */
@@ -150,10 +152,14 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
150152

151153
/* Allocate cipher request for current operation. */
152154
areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) +
153-
crypto_aead_reqsize(tfm));
155+
crypto_aead_reqsize(tfm) + ivsize);
154156
if (IS_ERR(areq))
155157
return PTR_ERR(areq);
156158

159+
iv = (u8 *)aead_request_ctx(&areq->cra_u.aead_req) +
160+
crypto_aead_reqsize(tfm);
161+
memcpy(iv, ctx->iv, ivsize);
162+
157163
/* convert iovecs of output buffers into RX SGL */
158164
err = af_alg_get_rsgl(sk, msg, flags, areq, outlen, &usedpages);
159165
if (err)
@@ -215,7 +221,7 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
215221

216222
/* Initialize the crypto operation */
217223
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
218-
areq->first_rsgl.sgl.sg, used, ctx->iv);
224+
areq->first_rsgl.sgl.sg, used, iv);
219225
aead_request_set_ad(&areq->cra_u.aead_req, ctx->aead_assoclen);
220226
aead_request_set_tfm(&areq->cra_u.aead_req, tfm);
221227

0 commit comments

Comments
 (0)