Commit 83ee89c6 authored by Florian Westphal's avatar Florian Westphal Committed by Greg Kroah-Hartman

xfrm_user: uncoditionally validate esn replay attribute struct

commit d97ca5d7 upstream.

The sanity test added in ecd79187 can be bypassed, validation
only occurs if XFRM_STATE_ESN flag is set, but rest of code doesn't care
and just checks if the attribute itself is present.

So always validate.  Alternative is to reject if we have the attribute
without the flag but that would change abi.

Reported-by: syzbot+0ab777c27d2bb7588f73@syzkaller.appspotmail.com
Cc: Mathias Krause <minipli@googlemail.com>
Fixes: ecd79187 ("xfrm_user: ensure user supplied esn replay window is valid")
Fixes: d8647b79 ("xfrm: Add user interface for esn and big anti-replay windows")
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 28dae08f
...@@ -121,22 +121,17 @@ static inline int verify_replay(struct xfrm_usersa_info *p, ...@@ -121,22 +121,17 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
struct xfrm_replay_state_esn *rs; struct xfrm_replay_state_esn *rs;
if (p->flags & XFRM_STATE_ESN) { if (!rt)
if (!rt) return (p->flags & XFRM_STATE_ESN) ? -EINVAL : 0;
return -EINVAL;
rs = nla_data(rt); rs = nla_data(rt);
if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8) if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8)
return -EINVAL; return -EINVAL;
if (nla_len(rt) < xfrm_replay_state_esn_len(rs) &&
nla_len(rt) != sizeof(*rs))
return -EINVAL;
}
if (!rt) if (nla_len(rt) < xfrm_replay_state_esn_len(rs) &&
return 0; nla_len(rt) != sizeof(*rs))
return -EINVAL;
/* As only ESP and AH support ESN feature. */ /* As only ESP and AH support ESN feature. */
if ((p->id.proto != IPPROTO_ESP) && (p->id.proto != IPPROTO_AH)) if ((p->id.proto != IPPROTO_ESP) && (p->id.proto != IPPROTO_AH))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment