xl, libxl: Provide dm_restrict

This functionality is still quite imperfect, but it will be useful in
certain restricted use cases.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Ian Jackson authored and Ian Jackson committed 2017-10-11 12:51:22 +01:00
1 parent f37c2aa323
commit 6dd27e6ce5
5 files changed
+100

No files matched your search

+86
View File
@@ -2197,6 +2197,92 @@ specified, enabling the use of XenServer PV drivers in the guest.
This parameter only takes effect when device_model_version=qemu-xen.
See B<xen-pci-device-reservations(7)> for more information.
=item B<dm_restrict=BOOLEAN>
Restrict the HVM device model after startup,
to limit the consequencese of security vulnerabilities in qemu.
With this feature enabled,
a compromise of the device model,
via such a vulnerability,
will not provide a privilege escalation attack on the whole system.
This feature is a B<technology preview>.
There are some significant limitations:
=over 4
=item
You must have a new enough qemu.
In particular,
if your qemu does not have the commit
B<xen: restrict: use xentoolcore_restrict_all>
the restriction request will be silently ineffective!
=item
The mechanisms used are not effective against
denial of service problems.
A compromised qemu can probably still impair
or perhaps even prevent
the proper functioning of the whole system,
(at the very least, but not limited to,
through resource exhaustion).
=item
It is not known whether the protection is
effective when a domain is migrated.
=item
Some domain management functions do not work.
For example, cdrom insert will fail.
=item
You must create user(s) for qemu to run as.
Currently, you should either create
B<xen-qemuuser-domid$domid>
for every $domid from 1 to 32751 inclusive,
or
B<xen-qemuuser-shared>
(in which case different guests will not
be protected against each other).
And if you do not create the user,
the restriction request will be silently ineffective!
=item
There are no countermeasures taken against reuse
of the same unix user (uid)
for subsequent domains,
even if the B<xen-qemuuser-domid$domid> users are created.
So a past domain with the same domid may be able to
interferer with future domains.
Possibly, even after a reboot.
=item
A compromised qemu will be able to read world-readable
files in the dom0 operating system.
=item
Because of these limitations, this functionality,
while it may enhance your security,
should not be relied on.
Any further limitations discovered in the current version
will B<not> be handled via the Xen Project Security Process.
=item
In the future as we enhance this feature to improve the security,
we may break backward compatibility.
=back
=back
=head2 PVH Guest Specific Options
+1
View File
@@ -308,6 +308,7 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
libxl_defbool_setdefault(&b_info->u.hvm.altp2m, false);
libxl_defbool_setdefault(&b_info->u.hvm.usb, false);
libxl_defbool_setdefault(&b_info->u.hvm.xen_platform_pci, true);
libxl_defbool_setdefault(&b_info->u.hvm.dm_restrict, false);
libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);
if (!libxl_defbool_val(b_info->u.hvm.spice.enable) &&
+9
View File
@@ -641,6 +641,12 @@ static int libxl__build_device_model_args_old(libxl__gc *gc,
flexarray_append(dm_args, "-nographic");
}
if (libxl_defbool_val(b_info->u.hvm.dm_restrict)) {
LOGD(ERROR, domid,
"dm_restrict not supported by qemu-xen-traditional");
return ERROR_INVAL;
}
if (state->saved_state) {
flexarray_vappend(dm_args, "-loadvm", state->saved_state, NULL);
}
@@ -1397,6 +1403,9 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
}
}
if (libxl_defbool_val(b_info->u.hvm.dm_restrict))
flexarray_append(dm_args, "-xen-domid-restrict");
if (state->saved_state) {
/* This file descriptor is meant to be used by QEMU */
*dm_state_fd = open(state->saved_state, O_RDONLY);
+1
View File
@@ -580,6 +580,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
("rdm", libxl_rdm_reserve),
("rdm_mem_boundary_memkb", MemKB),
("mca_caps", uint64),
("dm_restrict", libxl_defbool),
])),
("pv", Struct(None, [("kernel", string),
("slack_memkb", MemKB),
+3
View File
@@ -2274,6 +2274,9 @@ skip_usbdev:
b_info->u.hvm.vendor_device = d;
}
xlu_cfg_get_defbool(config, "dm_restrict",
&b_info->u.hvm.dm_restrict, 0);
}
if (!xlu_cfg_get_string (config, "gic_version", &buf, 1)) {
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.