Skip to content
Snippets Groups Projects
Commit 3accba79 authored by Andy Whitcroft's avatar Andy Whitcroft Committed by jenkins_ndg
Browse files

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

Change-Id: Ida6d8c19161eb93d54a1cc0dddcb93bab3eb2e43
Tracked-On: https://jira01.devtools.intel.com/browse/AW-5094


Signed-off-by: default avatarAndy Whitcroft <apw@canonical.com>
Acked-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Reviewed-on: https://android.intel.com/577958


Reviewed-by: default avatarLouis, FabienX <fabienx.louis@intel.com>
Tested-by: default avatarLouis, FabienX <fabienx.louis@intel.com>
Reviewed-by: default avatarDubray, SimonX <simonx.dubray@intel.com>
Reviewed-by: default avatarTasayco Loarte, VictorX <victorx.tasayco.loarte@intel.com>
parent 223871c7
No related branches found
No related tags found
No related merge requests found
......@@ -393,6 +393,9 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es
if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
return -EINVAL;
if (up->replay_window > up->bmp_len * sizeof(__u32) * 8)
return -EINVAL;
return 0;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment