[v2,net-next] IPsec: do not ignore crypto err in ah input

Message ID 1484460583-2303-1-git-send-email-gilad@benyossef.com
State Superseded
Headers show

Commit Message

Gilad Ben-Yossef Jan. 15, 2017, 6:09 a.m.
ah input processing uses the asynchronous hash crypto API which supplies 
an error code as part of the operation completion but the error code was 
being ignored.

Treat a crypto API error indication as a verification failure.

While a crypto API reported error would almost certainly result in a 
memcmp of the digest failing anyway and thus the security risk seems 
minor, performing a memory compare on what might be uninitialized memory 
is wrong.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>

CC: Alexander Alemayhu <alexander@alemayhu.com>
---

The change was boot tested on Arm64 but I did not exercise
the specific error code path in question.

Changes from v1:
- Fixed typo in patch description pointed out by Alexander

 net/ipv4/ah4.c | 3 +++
 1 file changed, 3 insertions(+)

-- 
2.1.4

Comments

Steffen Klassert Jan. 16, 2017, 7:35 a.m. | #1
On Sun, Jan 15, 2017 at 08:09:43AM +0200, Gilad Ben-Yossef wrote:
> ah input processing uses the asynchronous hash crypto API which supplies 

> an error code as part of the operation completion but the error code was 

> being ignored.

> 

> Treat a crypto API error indication as a verification failure.

> 

> While a crypto API reported error would almost certainly result in a 

> memcmp of the digest failing anyway and thus the security risk seems 

> minor, performing a memory compare on what might be uninitialized memory 

> is wrong.

> 

> Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>

> CC: Alexander Alemayhu <alexander@alemayhu.com>

> ---

> 

> The change was boot tested on Arm64 but I did not exercise

> the specific error code path in question.

> 

> Changes from v1:

> - Fixed typo in patch description pointed out by Alexander

> 

>  net/ipv4/ah4.c | 3 +++

>  1 file changed, 3 insertions(+)

> 

> diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c

> index f2a7102..22377c8 100644

> --- a/net/ipv4/ah4.c

> +++ b/net/ipv4/ah4.c

> @@ -270,6 +270,9 @@ static void ah_input_done(struct crypto_async_request *base, int err)

>  	int ihl = ip_hdrlen(skb);

>  	int ah_hlen = (ah->hdrlen + 2) << 2;

>  

> +	if (err)

> +		goto out;

> +


IPv6 has the same problem, can we get it fixed there too?

Thanks!

Patch

diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c
index f2a7102..22377c8 100644
--- a/net/ipv4/ah4.c
+++ b/net/ipv4/ah4.c
@@ -270,6 +270,9 @@  static void ah_input_done(struct crypto_async_request *base, int err)
 	int ihl = ip_hdrlen(skb);
 	int ah_hlen = (ah->hdrlen + 2) << 2;
 
+	if (err)
+		goto out;
+
 	work_iph = AH_SKB_CB(skb)->tmp;
 	auth_data = ah_tmp_auth(work_iph, ihl);
 	icv = ah_tmp_icv(ahp->ahash, auth_data, ahp->icv_trunc_len);