Fix CVE-2018-15471 (rhbz 1610555 1618414)

This commit is contained in:
Justin M. Forbes 2018-08-20 09:00:59 -05:00
parent 1b0fe53452
commit fc841cf8d3
2 changed files with 61 additions and 0 deletions

View File

@ -647,6 +647,9 @@ Patch528: 0008-console-dummycon-export-dummycon_-un-register_output.patch
Patch529: 0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch
Patch530: 0010-fbcon-Do-not-takeover-the-console-from-atomic-contex.patch
# CVE-2018-15471 rhbz 1610555 1618414
Patch531: xsa270.patch
# END OF PATCH DEFINITIONS
%endif
@ -1906,6 +1909,9 @@ fi
#
#
%changelog
* Mon Aug 20 2018 Justin M. Forbes <jforbes@fedoraproject.org>
- Fix CVE-2018-15471 (rhbz 1610555 1618414)
* Fri Aug 17 2018 Peter Robinson <pbrobinson@fedoraproject.org>
- Add fix and re-enable BPF JIT on ARMv7

55
xsa270.patch Normal file
View File

@ -0,0 +1,55 @@
From: Jan Beulich <jbeulich@suse.com>
Subject: xen-netback: fix input validation in xenvif_set_hash_mapping()
Both len and off are frontend specified values, so we need to make
sure there's no overflow when adding the two for the bounds check. We
also want to avoid undefined behavior and hence use off to index into
->hash.mapping[] only after bounds checking. This at the same time
allows to take care of not applying off twice for the bounds checking
against vif->num_queues.
It is also insufficient to bounds check copy_op.len, as this is len
truncated to 16 bits.
This is XSA-270.
Reported-by: Felix Wilhelm <fwilhelm@google.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Tested-by: Paul Durrant <paul.durrant@citrix.com>
---
The bounds checking against vif->num_queues also occurs too early afaict
(it should be done after the grant copy). I have patches ready as public
follow-ups for both this and the (at least latent) issue of the mapping
array crossing a page boundary.
--- a/drivers/net/xen-netback/hash.c
+++ b/drivers/net/xen-netback/hash.c
@@ -332,20 +332,22 @@ u32 xenvif_set_hash_mapping_size(struct
u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gref, u32 len,
u32 off)
{
- u32 *mapping = &vif->hash.mapping[off];
+ u32 *mapping = vif->hash.mapping;
struct gnttab_copy copy_op = {
.source.u.ref = gref,
.source.domid = vif->domid,
- .dest.u.gmfn = virt_to_gfn(mapping),
.dest.domid = DOMID_SELF,
- .dest.offset = xen_offset_in_page(mapping),
- .len = len * sizeof(u32),
+ .len = len * sizeof(*mapping),
.flags = GNTCOPY_source_gref
};
- if ((off + len > vif->hash.size) || copy_op.len > XEN_PAGE_SIZE)
+ if ((off + len < off) || (off + len > vif->hash.size) ||
+ len > XEN_PAGE_SIZE / sizeof(*mapping))
return XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER;
+ copy_op.dest.u.gmfn = virt_to_gfn(mapping + off);
+ copy_op.dest.offset = xen_offset_in_page(mapping + off);
+
while (len-- != 0)
if (mapping[off++] >= vif->num_queues)
return XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER;