commit:     7b14e6ede407fbfa69976840b71cc39d1e3cf2cc
Author:     Marc Schiffbauer <mschiff <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 24 16:08:20 2025 +0000
Commit:     Jason Zaman <perfinion <AT> gentoo <DOT> org>
CommitDate: Tue Jul 15 08:04:54 2025 +0000
URL:        
https://gitweb.gentoo.org/proj/hardened-refpolicy.git/commit/?id=7b14e6ed

qemu: add qemu_incus_managed tunable

This tunable makes it possible to run qemu virtual
machines controlled by incus

Also add interface required by qemu to these modules:

  * files
  * storage

Signed-off-by: Marc Schiffbauer <mschiff <AT> gentoo.org>
Signed-off-by: Jason Zaman <perfinion <AT> gentoo.org>

 policy/modules/apps/qemu.te      | 37 +++++++++++++++++++++++++++++++++++++
 policy/modules/kernel/files.if   | 18 ++++++++++++++++++
 policy/modules/kernel/storage.if | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+)

diff --git a/policy/modules/apps/qemu.te b/policy/modules/apps/qemu.te
index cfbcedf73..29480ec7a 100644
--- a/policy/modules/apps/qemu.te
+++ b/policy/modules/apps/qemu.te
@@ -13,6 +13,14 @@ policy_module(qemu)
 ## </desc>
 gen_tunable(qemu_full_network, false)
 
+## <desc>
+##     <p>
+##     Determine whether qemu can be
+##     managed by incus.
+##     </p>
+## </desc>
+gen_tunable(qemu_incus_managed, false)
+
 attribute_role qemu_roles;
 roleattribute system_r qemu_roles;
 
@@ -47,6 +55,35 @@ tunable_policy(`qemu_full_network',`
        corenet_tcp_connect_all_ports(qemu_t)
 ')
 
+optional_policy(`
+       tunable_policy(`qemu_incus_managed',`
+               incus_stream_connect_daemon(qemu_t)
+
+               files_create_generic_tmp_named_sockets(qemu_t)
+
+               kernel_read_kernel_sysctls(qemu_t)
+               kernel_read_vm_overcommit_sysctl(qemu_t)
+
+               # incus VMs do not start otherwise
+               allow qemu_t self:capability { dac_override dac_read_search 
setuid setgid };
+               allow qemu_t qemu_tmpfs_t:file mmap_read_file_perms;
+
+               # this is due to incus lack of selinux support for VMs
+               # see https://github.com/lxc/incus/issues/1037
+               kernel_rw_unlabeled_files(qemu_t)
+               kernel_rw_unlabeled_dirs(qemu_t)
+               kernel_manage_unlabeled_symlinks(qemu_t)
+
+               container_manage_engine_tmp_files(qemu_t)
+               container_manage_log_files(qemu_t)
+               container_manage_runtime_files(qemu_t)
+               container_manage_runtime_sock_files(qemu_t)
+       ')
+
+       storage_raw_read_fixed_disk_cond(qemu_t, qemu_incus_managed)
+       storage_raw_write_fixed_disk_cond(qemu_t, qemu_incus_managed)
+')
+
 optional_policy(`
        fs_manage_xenfs_files(qemu_t)
 

diff --git a/policy/modules/kernel/files.if b/policy/modules/kernel/files.if
index 592d0c2d8..a37365e9d 100644
--- a/policy/modules/kernel/files.if
+++ b/policy/modules/kernel/files.if
@@ -7554,6 +7554,24 @@ interface(`files_create_all_runtime_pipes',`
 
 ')
 
+########################################
+## <summary>
+##     Create tmp_t sockets.
+## </summary>
+## <param name="domain">
+##     <summary>
+##     Domain allowed access.
+##     </summary>
+## </param>
+#
+interface(`files_create_generic_tmp_named_sockets',`
+        gen_require(`
+                type tmp_t;
+        ')
+
+       create_sock_files_pattern($1, tmp_t, tmp_t)
+')
+
 ########################################
 ## <summary>
 ##     Delete all runtime named pipes

diff --git a/policy/modules/kernel/storage.if b/policy/modules/kernel/storage.if
index 6f62adead..81a4d1a61 100644
--- a/policy/modules/kernel/storage.if
+++ b/policy/modules/kernel/storage.if
@@ -186,6 +186,39 @@ interface(`storage_raw_write_fixed_disk',`
        typeattribute $1 fixed_disk_raw_write;
 ')
 
+########################################
+## <summary>
+##     Allow the caller to directly write to a fixed disk
+##     if a tunable is set.
+##     This is extremely dangerous as it can bypass the
+##     SELinux protections for filesystem objects, and
+##     should only be used by trusted domains.
+## </summary>
+## <param name="domain">
+##     <summary>
+##     Domain allowed access.
+##     </summary>
+## </param>
+## <param name="tunable">
+##     <summary>
+##     Tunable to depend on
+##     </summary>
+## </param>
+#
+interface(`storage_raw_write_fixed_disk_cond',`
+       gen_require(`
+               attribute fixed_disk_raw_write;
+               type fixed_disk_device_t;
+       ')
+
+       typeattribute $1 fixed_disk_raw_write;
+       tunable_policy(`$2', `
+               dev_list_all_dev_nodes($1)
+               allow $1 fixed_disk_device_t:blk_file write_blk_file_perms;
+               allow $1 fixed_disk_device_t:chr_file write_chr_file_perms;
+       ')
+')
+
 ########################################
 ## <summary>
 ##     Do not audit attempts made by the caller to write

Reply via email to