Skip to content

Commit 677e806

Browse files
Andy Whitcrofttorvalds
Andy Whitcroft
authored andcommitted
xfrm_user: validate XFRM_MSG_NEWAE XFRMA_REPLAY_ESN_VAL replay_window
When a new xfrm state is created during an XFRM_MSG_NEWSA call we validate the user supplied replay_esn to ensure that the size is valid and to ensure that the replay_window size is within the allocated buffer. However later it is possible to update this replay_esn via a XFRM_MSG_NEWAE call. There we again validate the size of the supplied buffer matches the existing state and if so inject the contents. We do not at this point check that the replay_window is within the allocated memory. This leads to out-of-bounds reads and writes triggered by netlink packets. This leads to memory corruption and the potential for priviledge escalation. We already attempt to validate the incoming replay information in xfrm_new_ae() via xfrm_replay_verify_len(). This confirms that the user is not trying to change the size of the replay state buffer which includes the replay_esn. It however does not check the replay_window remains within that buffer. Add validation of the contained replay_window. CVE-2017-7184 Signed-off-by: Andy Whitcroft <apw@canonical.com> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c470abd commit 677e806

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

Diff for: net/xfrm/xfrm_user.c

+3
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es
415415
if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
416416
return -EINVAL;
417417

418+
if (up->replay_window > up->bmp_len * sizeof(__u32) * 8)
419+
return -EINVAL;
420+
418421
return 0;
419422
}
420423

0 commit comments

Comments
 (0)