Skip to content

Commit

Permalink
hw/xen: prevent guest from binding loopback event channel to itself
Browse files Browse the repository at this point in the history
Fuzzing showed that a guest could bind an interdomain port to itself, by
guessing the next port to be allocated and putting that as the 'remote'
port number. By chance, that works because the newly-allocated port has
type EVTCHNSTAT_unbound. It shouldn't.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
Message-Id: <20230801175747.145906-4-dwmw2@infradead.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
  • Loading branch information
dwmw2 authored and philmd committed Aug 1, 2023
1 parent 19c417e commit 75a87af
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions hw/i386/kvm/xen_evtchn.c
Original file line number Diff line number Diff line change
Expand Up @@ -1408,8 +1408,15 @@ int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdomain)
XenEvtchnPort *rp = &s->port_table[interdomain->remote_port];
XenEvtchnPort *lp = &s->port_table[interdomain->local_port];

if (rp->type == EVTCHNSTAT_unbound && rp->type_val == 0) {
/* It's a match! */
/*
* The 'remote' port for loopback must be an unbound port allocated for
* communication with the local domain (as indicated by rp->type_val
* being zero, not PORT_INFO_TYPEVAL_REMOTE_QEMU), and must *not* be
* the port that was just allocated for the local end.
*/
if (interdomain->local_port != interdomain->remote_port &&
rp->type == EVTCHNSTAT_unbound && rp->type_val == 0) {

rp->type = EVTCHNSTAT_interdomain;
rp->type_val = interdomain->local_port;

Expand Down

0 comments on commit 75a87af

Please sign in to comment.