Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1659767 > unrolled thread
| Started by | Mateusz Jurczyk <mjurczyk@google.com> |
|---|---|
| First post | 2017-06-07 14:40 +0200 |
| Last post | 2017-06-07 16:00 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
[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
| From | Mateusz Jurczyk <mjurczyk@google.com> |
|---|---|
| Date | 2017-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]
| From | Eric Dumazet <eric.dumazet@gmail.com> |
|---|---|
| Date | 2017-06-07 15:30 +0200 |
| Subject | Re: [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]
| From | Mateusz Jurczyk <mjurczyk@google.com> |
|---|---|
| Date | 2017-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