Patch "KVM: x86: Introduce segmented_write_std" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
KVM: x86: Introduce segmented_write_std
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-x86-introduce-segmented_write_std.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
129a72a0d3c8e139a04512325384fe5ac119e74dMon Sep 17 00:00:00 2001
From: Steve Rutherford <[email protected]>
Date: Wed, 11 Jan 2017 18:28:29 -0800
Subject: KVM: x86: Introduce segmented_write_std
From: Steve Rutherford <[email protected]>
commit 129a72a0d3c8e139a04512325384fe5ac119e74d upstream.
Introduces segemented_write_std.
Switches from emulated reads/writes to standard read/writes in fxsave, fxrstor, sgdt, and sidt. This fixes CVE-2017-2584, a longstanding kernel memory leak.
Since commit 283c95d0e389 ("KVM: x86: emulate FXSAVE and FXRSTOR", 2016-11-09), which is luckily not yet in any final release, this would also be an exploitable kernel memory *write*!
--- arch/x86/kvm/emulate.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
arch/x86/kvm/emulate.c +18 -4
@@ -791,6 +791,20 @@ static int segmented_read_std(struct x86return ctxt->ops->read_std (ctxt, linear, data, size, &ctxt->exception); } +static int segmented_write_std (struct x86_emulate_ctxt *ctxt, +struct segmented_address addr, +void *data, +unsigned int size) +{ +int rc; +ulong linear; + + rc =linearize (ctxt, addr, size, true, &linear); +if (rc !=X86EMUL_CONTINUE ) +return rc; +return ctxt->ops->write_std (ctxt, linear, data, size, &ctxt->exception); +} +/* * Prefetch the remaining bytes of the instruction without crossing page * boundary if they are not in fetch_cache yet.
@@ -3686,8 +3700,8 @@ static int emulate_store_desc_ptr(struct }/* Disable writeback. */ ctxt->dst.type =OP_NONE ; -return segmented_write (ctxt, ctxt->dst.addr.mem, - &desc_ptr,2 + ctxt->op_bytes); +return segmented_write_std (ctxt, ctxt->dst.addr.mem, + &desc_ptr,2 + ctxt->op_bytes); }static int em_sgdt (struct x86_emulate_ctxt *ctxt)
@@ -3933,7 +3947,7 @@ static int em_fxsave(struct x86_emulate_else size = offsetof(struct fxregs_state, xmm_space[0]); -return segmented_write (ctxt, ctxt->memop.addr.mem, &fx_state, size); +return segmented_write_std (ctxt, ctxt->memop.addr.mem, &fx_state, size); } static int fxrstor_fixup(struct x86_emulate_ctxt *ctxt,
@@ -3975,7 +3989,7 @@ static int em_fxrstor(struct x86_emulateif (rc !=X86EMUL_CONTINUE )return rc; - rc =segmented_read (ctxt, ctxt->memop.addr.mem, &fx_state,512 ); + rc =segmented_read_std (ctxt, ctxt->memop.addr.mem, &fx_state,512 );if (rc !=X86EMUL_CONTINUE )return rc;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/kvm-x86-introduce-segmented_write_std.patch