Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1659767 > unrolled thread

[PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv

Started byMateusz Jurczyk <mjurczyk@google.com>
First post2017-06-07 14:40 +0200
Last post2017-06-07 16:00 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv Mateusz Jurczyk <mjurczyk@google.com> - 2017-06-07 14:40 +0200
    Re: [PATCH] netfilter: nfnetlink: Improve input length sanitization  in nfnetlink_rcv Eric Dumazet <eric.dumazet@gmail.com> - 2017-06-07 15:30 +0200
      [PATCH v2] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv Mateusz Jurczyk <mjurczyk@google.com> - 2017-06-07 16:00 +0200

#1659767 — [PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv

FromMateusz Jurczyk <mjurczyk@google.com>
Date2017-06-07 14:40 +0200
Subject[PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv
Message-ID<tPIpJ-6D4-51@gated-at.bofh.it>
Verify that the length of the socket buffer is sufficient to cover the
entire nlh->nlmsg_len field before accessing that field for further
input sanitization. If the client only supplies 1-3 bytes of data in
sk_buff, then nlh->nlmsg_len remains partially uninitialized and
contains leftover memory from the corresponding kernel allocation.
Operating on such data may result in indeterminate evaluation of the
nlmsg_len < NLMSG_HDRLEN expression.

The bug was discovered by a runtime instrumentation designed to detect
use of uninitialized memory in the kernel. The patch prevents this and
other similar tools (e.g. KMSAN) from flagging this behavior in the future.

Signed-off-by: Mateusz Jurczyk <mjurczyk@google.com>
---
 net/netfilter/nfnetlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 80f5ecf2c3d7..c634cfca40ec 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -491,7 +491,8 @@ static void nfnetlink_rcv(struct sk_buff *skb)
 {
 	struct nlmsghdr *nlh = nlmsg_hdr(skb);
 
-	if (nlh->nlmsg_len < NLMSG_HDRLEN ||
+	if (skb->len < sizeof(nlh->nlmsg_len) ||
+	    nlh->nlmsg_len < NLMSG_HDRLEN ||
 	    skb->len < nlh->nlmsg_len)
 		return;
 
-- 
2.13.1.508.gb3defc5cc-goog

[toc] | [next] | [standalone]


#1659796 — Re: [PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv

FromEric Dumazet <eric.dumazet@gmail.com>
Date2017-06-07 15:30 +0200
SubjectRe: [PATCH] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv
Message-ID<tPJc7-7aN-27@gated-at.bofh.it>
In reply to#1659767
On Wed, 2017-06-07 at 14:35 +0200, Mateusz Jurczyk wrote:
> Verify that the length of the socket buffer is sufficient to cover the
> entire nlh->nlmsg_len field before accessing that field for further
> input sanitization. If the client only supplies 1-3 bytes of data in
> sk_buff, then nlh->nlmsg_len remains partially uninitialized and
> contains leftover memory from the corresponding kernel allocation.
> Operating on such data may result in indeterminate evaluation of the
> nlmsg_len < NLMSG_HDRLEN expression.
> 
> The bug was discovered by a runtime instrumentation designed to detect
> use of uninitialized memory in the kernel. The patch prevents this and
> other similar tools (e.g. KMSAN) from flagging this behavior in the future.
> 
> Signed-off-by: Mateusz Jurczyk <mjurczyk@google.com>
> ---
>  net/netfilter/nfnetlink.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
> index 80f5ecf2c3d7..c634cfca40ec 100644
> --- a/net/netfilter/nfnetlink.c
> +++ b/net/netfilter/nfnetlink.c
> @@ -491,7 +491,8 @@ static void nfnetlink_rcv(struct sk_buff *skb)
>  {
>  	struct nlmsghdr *nlh = nlmsg_hdr(skb);
>  
> -	if (nlh->nlmsg_len < NLMSG_HDRLEN ||
> +	if (skb->len < sizeof(nlh->nlmsg_len) ||

This assumes nlmsg_len is first field of the structure.

offsetofend() might be more descriptive, one does not have to check the
structure to make sure the code is correct.

Or simply use the more common form :

	if (skb->len < NLMSG_HDRLEN ||

> +	    nlh->nlmsg_len < NLMSG_HDRLEN ||
>  	    skb->len < nlh->nlmsg_len)
>  		return;
>  

[toc] | [prev] | [next] | [standalone]


#1659822 — [PATCH v2] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv

FromMateusz Jurczyk <mjurczyk@google.com>
Date2017-06-07 16:00 +0200
Subject[PATCH v2] netfilter: nfnetlink: Improve input length sanitization in nfnetlink_rcv
Message-ID<tPJF7-7mI-5@gated-at.bofh.it>
In reply to#1659796
Verify that the length of the socket buffer is sufficient to cover the
nlmsghdr structure before accessing the nlh->nlmsg_len field for further
input sanitization. If the client only supplies 1-3 bytes of data in
sk_buff, then nlh->nlmsg_len remains partially uninitialized and
contains leftover memory from the corresponding kernel allocation.
Operating on such data may result in indeterminate evaluation of the
nlmsg_len < NLMSG_HDRLEN expression.

The bug was discovered by a runtime instrumentation designed to detect
use of uninitialized memory in the kernel. The patch prevents this and
other similar tools (e.g. KMSAN) from flagging this behavior in the future.

Signed-off-by: Mateusz Jurczyk <mjurczyk@google.com>
---
Changes in v2:
  - Compare skb->len against NLMSG_HDRLEN to avoid assuming the layout of
    the nlmsghdr structure.

 net/netfilter/nfnetlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 80f5ecf2c3d7..1f9667f52be5 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -491,7 +491,8 @@ static void nfnetlink_rcv(struct sk_buff *skb)
 {
 	struct nlmsghdr *nlh = nlmsg_hdr(skb);
 
-	if (nlh->nlmsg_len < NLMSG_HDRLEN ||
+	if (skb->len < NLMSG_HDRLEN ||
+	    nlh->nlmsg_len < NLMSG_HDRLEN ||
 	    skb->len < nlh->nlmsg_len)
 		return;
 
-- 
2.13.1.508.gb3defc5cc-goog

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web