lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20220901030610.1121299-2-keescook@chromium.org> Date: Wed, 31 Aug 2022 20:06:09 -0700 From: Kees Cook <keescook@...omium.org> To: Jakub Kicinski <kuba@...nel.org> Cc: Kees Cook <keescook@...omium.org>, "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Paolo Abeni <pabeni@...hat.com>, Pablo Neira Ayuso <pablo@...filter.org>, Jozsef Kadlecsik <kadlec@...filter.org>, Florian Westphal <fw@...len.de>, syzbot <syzkaller@...glegroups.com>, Yajun Deng <yajun.deng@...ux.dev>, netdev@...r.kernel.org, netfilter-devel@...r.kernel.org, coreteam@...filter.org, Oliver Hartkopp <socketcan@...tkopp.net>, Harshit Mogalapalli <harshit.m.mogalapalli@...cle.com>, linux-kernel@...r.kernel.org, linux-hardening@...r.kernel.org Subject: [PATCH 1/2] netlink: Bounds-check nlmsg_len() The nlmsg_len() helper returned "int" from a u32 calculation that could possible go negative. WARN() if this calculation ever goes negative (instead returning 0), or if the result would be larger than INT_MAX (instead returning INT_MAX). Cc: "David S. Miller" <davem@...emloft.net> Cc: Eric Dumazet <edumazet@...gle.com> Cc: Jakub Kicinski <kuba@...nel.org> Cc: Paolo Abeni <pabeni@...hat.com> Cc: Pablo Neira Ayuso <pablo@...filter.org> Cc: Jozsef Kadlecsik <kadlec@...filter.org> Cc: Florian Westphal <fw@...len.de> Cc: syzbot <syzkaller@...glegroups.com> Cc: Yajun Deng <yajun.deng@...ux.dev> Cc: netdev@...r.kernel.org Cc: netfilter-devel@...r.kernel.org Cc: coreteam@...filter.org Signed-off-by: Kees Cook <keescook@...omium.org> --- include/net/netlink.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/include/net/netlink.h b/include/net/netlink.h index 7a2a9d3144ba..f8cb0543635e 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -576,7 +576,15 @@ static inline void *nlmsg_data(const struct nlmsghdr *nlh) */ static inline int nlmsg_len(const struct nlmsghdr *nlh) { - return nlh->nlmsg_len - NLMSG_HDRLEN; + u32 nlmsg_contents_len; + + if (WARN_ON_ONCE(check_sub_overflow(nlh->nlmsg_len, + (u32)NLMSG_HDRLEN, + &nlmsg_contents_len))) + return 0; + if (WARN_ON_ONCE(nlmsg_contents_len > INT_MAX)) + return INT_MAX; + return nlmsg_contents_len; } /** -- 2.34.1
Powered by blists - more mailing lists