VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-46085

CVE-2026-46085

Description

In the Linux kernel, the following vulnerability has been resolved:

rxrpc: Fix rxkad crypto unalignment handling

Fix handling of a packet with a misaligned crypto length. Also handle non-ENOMEM errors from decryption by aborting. Further, remove the WARN_ON_ONCE() so that it can't be remotely triggered (a trace line can still be emitted).

Affected products

2

Patches

10
f1c6bd0cc786

rxrpc: Fix rxkad crypto unalignment handling

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDavid HowellsApr 22, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 6965099dda89fa..2da9fbd5c5a323 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -36,6 +36,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 0f57c02d249e53..e2119af5525002 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -492,6 +492,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -525,8 +528,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
440d20d95e84

rxrpc: Fix rxkad crypto unalignment handling

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDavid HowellsApr 22, 2026Fixed in 6.12.86via kernel-cna
2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 3eb806f7bc6a5e..0348d1d20cf874 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -36,6 +36,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index c59a0c375740ec..73bbe8cd391be9 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -494,6 +494,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -527,8 +530,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
f0d3efd03b2a

rxrpc: Fix rxkad crypto unalignment handling

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDavid HowellsApr 22, 2026Fixed in 6.18.27via kernel-cna
2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 8d77828b751551..13b9d017f8e177 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 4e04e5acf6eed0..af24d54b6b4fc5 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
def304aae2ed

rxrpc: Fix rxkad crypto unalignment handling

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDavid HowellsApr 22, 2026Fixed in 7.1-rc1via kernel-cna
2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 578b8038b21178..5820d7e41ea09a 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 5a720222854fac..cba7935977f0ba 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
af9271eb666d

rxrpc: Fix rxkad crypto unalignment handling

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDavid HowellsApr 22, 2026Fixed in 7.0.4via kernel-cna
2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 8d77828b751551..13b9d017f8e177 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 5a720222854fac..cba7935977f0ba 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
440d20d95e84

rxrpc: Fix rxkad crypto unalignment handling

2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 3eb806f7bc6a5e..0348d1d20cf874 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -36,6 +36,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index c59a0c375740ec..73bbe8cd391be9 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -494,6 +494,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -527,8 +530,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
af9271eb666d

rxrpc: Fix rxkad crypto unalignment handling

2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 8d77828b751551..13b9d017f8e177 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 5a720222854fac..cba7935977f0ba 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
def304aae2ed

rxrpc: Fix rxkad crypto unalignment handling

2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 578b8038b21178..5820d7e41ea09a 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 5a720222854fac..cba7935977f0ba 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
f1c6bd0cc786

rxrpc: Fix rxkad crypto unalignment handling

2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 6965099dda89fa..2da9fbd5c5a323 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -36,6 +36,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 0f57c02d249e53..e2119af5525002 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -492,6 +492,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -525,8 +528,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    
f0d3efd03b2a

rxrpc: Fix rxkad crypto unalignment handling

2 files changed · +8 3
  • include/trace/events/rxrpc.h+1 0 modified
    diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
    index 8d77828b751551..13b9d017f8e177 100644
    --- a/include/trace/events/rxrpc.h
    +++ b/include/trace/events/rxrpc.h
    @@ -37,6 +37,7 @@
     	EM(rxkad_abort_1_short_encdata,		"rxkad1-short-encdata")	\
     	EM(rxkad_abort_1_short_header,		"rxkad1-short-hdr")	\
     	EM(rxkad_abort_2_short_check,		"rxkad2-short-check")	\
    +	EM(rxkad_abort_2_crypto_unaligned,	"rxkad2-crypto-unaligned") \
     	EM(rxkad_abort_2_short_data,		"rxkad2-short-data")	\
     	EM(rxkad_abort_2_short_header,		"rxkad2-short-hdr")	\
     	EM(rxkad_abort_2_short_len,		"rxkad2-short-len")	\
    
  • net/rxrpc/rxkad.c+7 3 modified
    diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
    index 4e04e5acf6eed0..af24d54b6b4fc5 100644
    --- a/net/rxrpc/rxkad.c
    +++ b/net/rxrpc/rxkad.c
    @@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
     					  rxkad_abort_2_short_header);
     
    +	/* Don't let the crypto algo see a misaligned length. */
    +	sp->len = round_down(sp->len, 8);
    +
     	/* Decrypt the skbuff in-place.  TODO: We really want to decrypt
     	 * directly into the target buffer.
     	 */
    @@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
     	if (sg != _sg)
     		kfree(sg);
     	if (ret < 0) {
    -		WARN_ON_ONCE(ret != -ENOMEM);
    -		return ret;
    +		if (ret == -ENOMEM)
    +			return ret;
    +		return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
    +					  rxkad_abort_2_crypto_unaligned);
     	}
     
     	/* Extract the decrypted packet length */
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing length alignment check in rxkad_verify_packet_2 allows the crypto algorithm to receive a misaligned packet length, and non-ENOMEM decryption errors are improperly handled while a WARN_ON_ONCE can be remotely triggered."

Attack vector

An attacker sends a crafted RxRPC packet with a misaligned crypto length to a system using the rxkad security class. The function rxkad_verify_packet_2 in net/rxrpc/rxkad.c passes this misaligned length to the decryption algorithm, which can cause undefined behavior or a crash. Additionally, if decryption fails with a non-ENOMEM error, the old code returned the raw error code and triggered a WARN_ON_ONCE, which a remote attacker could use to cause a kernel warning or panic [patch_id=2659829].

Affected code

The vulnerable function is `rxkad_verify_packet_2` in `net/rxrpc/rxkad.c`. The trace event header `include/trace/events/rxrpc.h` is also modified to add the new abort tracepoint `rxkad_abort_2_crypto_unaligned` [patch_id=2659829].

What the fix does

The patch adds `sp->len = round_down(sp->len, 8)` before decryption to ensure the crypto algorithm never sees a misaligned length [patch_id=2659829]. It also replaces the unconditional `return ret` on decryption failure with a check: only -ENOMEM errors propagate, while all other errors trigger `rxrpc_abort_eproto()` with the new tracepoint `rxkad_abort_2_crypto_unaligned`. Finally, the `WARN_ON_ONCE(ret != -ENOMEM)` is removed and replaced with a trace line, preventing remote triggering of a kernel warning [patch_id=2659829].

Preconditions

  • configThe target must be using the rxkad security class for RxRPC connections.
  • networkThe attacker must be able to send a crafted RxRPC packet over the network to the target.
  • authNo authentication is required; the vulnerability is triggered during packet verification before authentication completes.

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.