From: David Ahern <dsahern@kernel.org> Date: 2021-12-11 16:21:56
syzbot reported uninit-value:
============================================================
BUG: KMSAN: uninit-value in fib_get_nhs+0xac4/0x1f80
net/ipv4/fib_semantics.c:708
fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708
fib_create_info+0x2411/0x4870 net/ipv4/fib_semantics.c:1453
fib_table_insert+0x45c/0x3a10 net/ipv4/fib_trie.c:1224
inet_rtm_newroute+0x289/0x420 net/ipv4/fib_frontend.c:886
Add length checking before using the attribute.
Fixes: 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Reported-by: syzbot+d4b9a2851cc3ce998741@syzkaller.appspotmail.com
Signed-off-by: David Ahern <dsahern@kernel.org>
Cc: Thomas Graf <tgraf@suug.ch>
---
I do not have KMSAN setup, so this is based on a code analysis. Before
4e902c57417c fib_get_attr32 was checking the attribute length; the
switch to nla_get_u32 does not.
net/ipv4/fib_semantics.c | 4 ++++
1 file changed, 4 insertions(+)
On Sat, Dec 11, 2021 at 09:21:48AM -0700, David Ahern wrote:
syzbot reported uninit-value:
============================================================
BUG: KMSAN: uninit-value in fib_get_nhs+0xac4/0x1f80
net/ipv4/fib_semantics.c:708
fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708
fib_create_info+0x2411/0x4870 net/ipv4/fib_semantics.c:1453
fib_table_insert+0x45c/0x3a10 net/ipv4/fib_trie.c:1224
inet_rtm_newroute+0x289/0x420 net/ipv4/fib_frontend.c:886
Add length checking before using the attribute.
Fixes: 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Reported-by: syzbot+d4b9a2851cc3ce998741@syzkaller.appspotmail.com
Signed-off-by: David Ahern <dsahern@kernel.org>
Cc: Thomas Graf <tgraf@suug.ch>
---
I do not have KMSAN setup, so this is based on a code analysis. Before
4e902c57417c fib_get_attr32 was checking the attribute length; the
switch to nla_get_u32 does not.
net/ipv4/fib_semantics.c | 4 ++++
1 file changed, 4 insertions(+)
@@ -704,6 +704,10 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,return-EINVAL;}if(nla){+if(nla_len(nla)<sizeof(__be32)){+NL_SET_ERR_MSG(extack,"Invalid IPv4 address in RTA_GATEWAY");+return-EINVAL;+}
Isn't the problem more general than that? It seems that there is no
minimum length validation to any of the attributes inside RTA_MULTIPATH.
Except maybe RTA_VIA
From: David Ahern <hidden> Date: 2021-12-11 22:13:05
On 12/11/21 12:13 PM, Ido Schimmel wrote:
On Sat, Dec 11, 2021 at 09:21:48AM -0700, David Ahern wrote:
quoted
syzbot reported uninit-value:
============================================================
BUG: KMSAN: uninit-value in fib_get_nhs+0xac4/0x1f80
net/ipv4/fib_semantics.c:708
fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708
fib_create_info+0x2411/0x4870 net/ipv4/fib_semantics.c:1453
fib_table_insert+0x45c/0x3a10 net/ipv4/fib_trie.c:1224
inet_rtm_newroute+0x289/0x420 net/ipv4/fib_frontend.c:886
Add length checking before using the attribute.
Fixes: 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Reported-by: syzbot+d4b9a2851cc3ce998741@syzkaller.appspotmail.com
Signed-off-by: David Ahern <dsahern@kernel.org>
Cc: Thomas Graf <tgraf@suug.ch>
---
I do not have KMSAN setup, so this is based on a code analysis. Before
thanks for the pointer. I am a bit hardware challenged at the moment for
out of tree features.
quoted
4e902c57417c fib_get_attr32 was checking the attribute length; the
switch to nla_get_u32 does not.
net/ipv4/fib_semantics.c | 4 ++++
1 file changed, 4 insertions(+)
@@ -704,6 +704,10 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,return-EINVAL;}if(nla){+if(nla_len(nla)<sizeof(__be32)){+NL_SET_ERR_MSG(extack,"Invalid IPv4 address in RTA_GATEWAY");+return-EINVAL;+}
Isn't the problem more general than that? It seems that there is no
minimum length validation to any of the attributes inside RTA_MULTIPATH.
Except maybe RTA_VIA
On Sat, Dec 11, 2021 at 03:13:02PM -0700, David Ahern wrote:
On 12/11/21 12:13 PM, Ido Schimmel wrote:
quoted
On Sat, Dec 11, 2021 at 09:21:48AM -0700, David Ahern wrote:
quoted
syzbot reported uninit-value:
============================================================
BUG: KMSAN: uninit-value in fib_get_nhs+0xac4/0x1f80
net/ipv4/fib_semantics.c:708
fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708
fib_create_info+0x2411/0x4870 net/ipv4/fib_semantics.c:1453
fib_table_insert+0x45c/0x3a10 net/ipv4/fib_trie.c:1224
inet_rtm_newroute+0x289/0x420 net/ipv4/fib_frontend.c:886
Add length checking before using the attribute.
Fixes: 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Reported-by: syzbot+d4b9a2851cc3ce998741@syzkaller.appspotmail.com
Signed-off-by: David Ahern <dsahern@kernel.org>
Cc: Thomas Graf <tgraf@suug.ch>
---
I do not have KMSAN setup, so this is based on a code analysis. Before
thanks for the pointer. I am a bit hardware challenged at the moment for
out of tree features.
quoted
quoted
4e902c57417c fib_get_attr32 was checking the attribute length; the
switch to nla_get_u32 does not.
net/ipv4/fib_semantics.c | 4 ++++
1 file changed, 4 insertions(+)
@@ -704,6 +704,10 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,return-EINVAL;}if(nla){+if(nla_len(nla)<sizeof(__be32)){+NL_SET_ERR_MSG(extack,"Invalid IPv4 address in RTA_GATEWAY");+return-EINVAL;+}
Isn't the problem more general than that? It seems that there is no
minimum length validation to any of the attributes inside RTA_MULTIPATH.
Except maybe RTA_VIA
A follow up commit is needed for RTA_FLOW.
The same problem seems to exists in the delete path and IPv6. See
fib_nh_match() and ip6_route_multipath_add(), for example.