ISSUE DESCRIPTION
=================
The function `__gnttab_cache_flush` handles GNTTABOP_cache_flush grant
table operations. It checks to see if the calling domain is the owner
of the page that is to be operated on. If it is not, the owner's grant
table is checked to see if a grant mapping to the calling domain
exists for the page in question.
However, the function does not check to see if the owning domain
actually has a grant table or not. Some special domains, such as
`DOMID_XEN`, `DOMID_IO` and `DOMID_COW` are created without grant
tables. Hence, if __gnttab_cache_flush operates on a page owned by
these special domains, it will attempt to dereference a null pointer
in the domain struct.
IMPACT
======
The guest can get Xen to dereference a NULL pointer.
For ARM guests and x86 PV guests on systems with SMAP enabled, this will cause a host crash (denial-of-service).
For x86 PV guests on systems without SMAP enabled, an attacker can map
a crafted grant structure at virtual address 0. This can be leveraged
to increment an arbitrary virtual address, which can then probably be
leveraged into a full privilege escalation.
VULNERABLE SYSTEMS
==================
All versions of Xen since Xen 4.5 are vulnerable.
x86 HVM guests do not expose the vulnerability.
ARM guests and x86 PV guests on systems with SMAP enabled are only
vulnerable to a Denial-of-Service (host crash).
x86 PV guests on systems without SMAP running are vulnerable to a
privilege escalation.
MITIGATION
==========
Hardware supporting Supervisor Mode Access Prevention (Intel Broadwell,
AMD Zen) can mitigate the privilege escalation to a DoS.
External References:
http://xenbits.xen.org/xsa/advisory-232.html