|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] tools/flask: Reformat allow declarations
---- On Mon, 28 Jul 2025 13:55:48 -0400 Andrew Cooper
<andrew.cooper3@xxxxxxxxxx> wrote ---
> Having multiple values wrapped onto as few lines as practical is good for
> space efficiency, but causes complex collisions for hypercall backports and
> local policy changes. Reformat to use one value per line.
>
> No functional change, only whitespace changes.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
> ---
> tools/flask/policy/modules/dom0.te | 122 ++++++++++---
> tools/flask/policy/modules/xen.if | 241 +++++++++++++++++++++----
> tools/flask/policy/modules/xen.te | 25 ++-
> tools/flask/policy/modules/xenstore.te | 6 +-
> 4 files changed, 327 insertions(+), 67 deletions(-)
>
> diff --git a/tools/flask/policy/modules/dom0.te
> b/tools/flask/policy/modules/dom0.te
> index ccadbd6469db..ad2b4f9ea75f 100644
> --- a/tools/flask/policy/modules/dom0.te
> +++ b/tools/flask/policy/modules/dom0.te
> @@ -7,23 +7,61 @@
> #
>
> ################################################################################
>
> allow dom0_t xen_t:xen {
> - settime tbufcontrol readconsole clearconsole perfcontrol mtrr_add
> - mtrr_del mtrr_read microcode physinfo quirk writeconsole readapic
> - writeapic privprofile nonprivprofile kexec firmware sleep frequency
> - getidle debug getcpuinfo heap pm_op mca_op lockprof cpupool_op
> - getscheduler setscheduler hypfs_op
> + settime
> + tbufcontrol
> + readconsole
> + clearconsole
> + perfcontrol
> + mtrr_add
> + mtrr_del
> + mtrr_read
> + microcode
> + physinfo
> + quirk
> + writeconsole
> + readapic
> + writeapic
> + privprofile
> + nonprivprofile
> + kexec
> + firmware
> + sleep
> + frequency
> + getidle
> + debug
> + getcpuinfo
> + heap
> + pm_op
> + mca_op
> + lockprof
> + cpupool_op
> + getscheduler
> + setscheduler
> + hypfs_op
> };
> allow dom0_t xen_t:xen2 {
> - resource_op psr_cmt_op psr_alloc pmu_ctrl get_symbol
> - get_cpu_levelling_caps get_cpu_featureset livepatch_op
> - coverage_op get_dom0_console
> + resource_op
> + psr_cmt_op
> + psr_alloc
> + pmu_ctrl
> + get_symbol
> + get_cpu_levelling_caps
> + get_cpu_featureset
> + livepatch_op
> + coverage_op
> + get_dom0_console
> };
>
> # Allow dom0 to use all XENVER_ subops that have checks.
> # Note that dom0 is part of domain_type so this has duplicates.
> allow dom0_t xen_t:version {
> - xen_extraversion xen_compile_info xen_capabilities
> - xen_changeset xen_pagesize xen_guest_handle xen_commandline
> + xen_extraversion
> + xen_compile_info
> + xen_capabilities
> + xen_changeset
> + xen_pagesize
> + xen_guest_handle
> + xen_commandline
> xen_build_id
> };
>
> @@ -32,41 +70,83 @@ allow dom0_t xen_t:mmu memorymap;
> # Allow dom0 to use these domctls on itself. For domctls acting on other
> # domains, see the definitions of create_domain and manage_domain.
> allow dom0_t dom0_t:domain {
> - setvcpucontext max_vcpus setaffinity getaffinity getscheduler
> - getdomaininfo getvcpuinfo getvcpucontext setdomainmaxmem
> setdomainhandle
> - setdebugging hypercall settime setaddrsize getaddrsize trigger
> - getpodtarget setpodtarget getpagingmempool setpagingmempool
> set_misc_info
> + setvcpucontext
> + max_vcpus
> + setaffinity
> + getaffinity
> + getscheduler
> + getdomaininfo
> + getvcpuinfo
> + getvcpucontext
> + setdomainmaxmem
> + setdomainhandle
> + setdebugging
> + hypercall
> + settime
> + setaddrsize
> + getaddrsize
> + trigger
> + getpodtarget
> + setpodtarget
> + getpagingmempool
> + setpagingmempool
> + set_misc_info
> set_virq_handler
> };
> allow dom0_t dom0_t:domain2 {
> - set_cpu_policy gettsc settsc setscheduler set_vnumainfo
> - get_vnumainfo psr_cmt_op psr_alloc get_cpu_policy dt_overlay
> + set_cpu_policy
> + gettsc
> + settsc
> + setscheduler
> + set_vnumainfo
> + get_vnumainfo
> + psr_cmt_op
> + psr_alloc
> + get_cpu_policy
> + dt_overlay
> get_domain_state
> };
> -allow dom0_t dom0_t:resource { add remove };
> +allow dom0_t dom0_t:resource {
> + add
> + remove
> +};
>
> # These permissions allow using the FLASK security server to compute access
> # checks locally, which could be used by a domain or service (such as
> xenstore)
> # that does not have its own security server to make access decisions based
> on
> # Xen's security policy.
> allow dom0_t security_t:security {
> - compute_av compute_create compute_member compute_relabel
> + compute_av
> + compute_create
> + compute_member
> + compute_relabel
> };
>
> # Allow string/SID conversions (for "xl list -Z" and similar)
> allow dom0_t security_t:security check_context;
>
> # Allow flask-label-pci to add and change labels
> -allow dom0_t security_t:security { add_ocontext del_ocontext };
> +allow dom0_t security_t:security {
> + add_ocontext
> + del_ocontext
> +};
>
> # Allow performance parameters of the security server to be tweaked
> allow dom0_t security_t:security setsecparam;
>
> # Allow changing the security policy
> -allow dom0_t security_t:security { load_policy setenforce setbool };
> +allow dom0_t security_t:security {
> + load_policy
> + setenforce
> + setbool
> +};
>
> # Audit policy change events even when they are allowed
> -auditallow dom0_t security_t:security { load_policy setenforce setbool };
> +auditallow dom0_t security_t:security {
> + load_policy
> + setenforce
> + setbool
> +};
>
> # Allow dom0 to report platform configuration changes back to the
> hypervisor
> allow dom0_t xen_t:resource setup;
> diff --git a/tools/flask/policy/modules/xen.if
> b/tools/flask/policy/modules/xen.if
> index cfa11b27b786..ef7d8f438c65 100644
> --- a/tools/flask/policy/modules/xen.if
> +++ b/tools/flask/policy/modules/xen.if
> @@ -6,9 +6,25 @@
> #
>
> ################################################################################
>
> define(`declare_domain_common', `
> - allow $1 $2:grant { query setup };
> - allow $1 $2:mmu { adjust physmap map_read map_write stat pinpage
> updatemp mmuext_op };
> - allow $1 $2:hvm { getparam setparam altp2mhvm_op };
> + allow $1 $2:grant {
> + query
> + setup
> + };
> + allow $1 $2:mmu {
> + adjust
> + physmap
> + map_read
> + map_write
> + stat
> + pinpage
> + updatemp
> + mmuext_op
> + };
> + allow $1 $2:hvm {
> + getparam
> + setparam
> + altp2mhvm_op
> + };
> allow $1 $2:domain2 get_vnumainfo;
> ')
>
> @@ -46,22 +62,65 @@ define(`declare_build_label', `
> ')
>
> define(`create_domain_common', `
> - allow $1 $2:domain { create max_vcpus setdomainmaxmem setaddrsize
> - getdomaininfo hypercall setvcpucontext getscheduler
> - getvcpuinfo getaddrsize getaffinity setaffinity
> - settime setdomainhandle getvcpucontext set_misc_info
> - getpagingmempool setpagingmempool };
> - allow $1 $2:domain2 { set_cpu_policy settsc setscheduler setclaim
> - set_vnumainfo get_vnumainfo cacheflush
> - psr_cmt_op psr_alloc soft_reset
> - resource_map get_cpu_policy vuart_op set_llc_colors
> - get_domain_state };
> + allow $1 $2:domain {
> + create
> + max_vcpus
> + setdomainmaxmem
> + setaddrsize
> + getdomaininfo
> + hypercall
> + setvcpucontext
> + getscheduler
> + getvcpuinfo
> + getaddrsize
> + getaffinity
> + setaffinity
> + settime
> + setdomainhandle
> + getvcpucontext
> + set_misc_info
> + getpagingmempool
> + setpagingmempool
> + };
> + allow $1 $2:domain2 {
> + set_cpu_policy
> + settsc
> + setscheduler
> + setclaim
> + set_vnumainfo
> + get_vnumainfo
> + cacheflush
> + psr_cmt_op
> + psr_alloc
> + soft_reset
> + resource_map
> + get_cpu_policy
> + vuart_op
> + set_llc_colors
> + get_domain_state
> + };
> allow $1 $2:security check_context;
> allow $1 $2:shadow enable;
> - allow $1 $2:mmu { map_read map_write adjust memorymap physmap pinpage
> mmuext_op updatemp };
> + allow $1 $2:mmu {
> + map_read
> + map_write
> + adjust
> + memorymap
> + physmap
> + pinpage
> + mmuext_op
> + updatemp
> + };
> allow $1 $2:grant setup;
> - allow $1 $2:hvm { getparam hvmctl sethvmc
> - setparam altp2mhvm altp2mhvm_op dm };
> + allow $1 $2:hvm {
> + getparam
> + hvmctl
> + sethvmc
> + setparam
> + altp2mhvm
> + altp2mhvm_op
> + dm
> + };
> ')
>
> # xen_build_domain(target)
> @@ -91,11 +150,30 @@ define(`create_domain_build_label', `
> # manage_domain(priv, target)
> # Allow managing a running domain
> define(`manage_domain', `
> - allow $1 $2:domain { getdomaininfo getvcpuinfo getaffinity
> - getaddrsize pause unpause trigger shutdown destroy
> - setaffinity setdomainmaxmem getscheduler resume
> - setpodtarget getpodtarget getpagingmempool setpagingmempool };
> - allow $1 $2:domain2 { set_vnumainfo dt_overlay get_domain_state };
> + allow $1 $2:domain {
> + getdomaininfo
> + getvcpuinfo
> + getaffinity
> + getaddrsize
> + pause
> + unpause
> + trigger
> + shutdown
> + destroy
> + setaffinity
> + setdomainmaxmem
> + getscheduler
> + resume
> + setpodtarget
> + getpodtarget
> + getpagingmempool
> + setpagingmempool
> + };
> + allow $1 $2:domain2 {
> + set_vnumainfo
> + dt_overlay
> + get_domain_state
> + };
> ')
>
> # migrate_domain_out(priv, target)
> @@ -103,11 +181,27 @@ define(`manage_domain', `
> # (inbound migration is the same as domain creation)
> define(`migrate_domain_out', `
> allow $1 domxen_t:mmu map_read;
> - allow $1 $2:hvm { gethvmc getparam };
> - allow $1 $2:mmu { stat pageinfo map_read };
> - allow $1 $2:domain { getaddrsize getvcpucontext pause destroy };
> + allow $1 $2:hvm {
> + gethvmc
> + getparam
> + };
> + allow $1 $2:mmu {
> + stat
> + pageinfo
> + map_read
> + };
> + allow $1 $2:domain {
> + getaddrsize
> + getvcpucontext
> + pause
> + destroy
> + };
> allow $1 $2:domain2 gettsc;
> - allow $1 $2:shadow { enable disable logdirty };
> + allow $1 $2:shadow {
> + enable
> + disable
> + logdirty
> + };
> ')
>
>
> ################################################################################
>
> @@ -120,8 +214,14 @@ define(`migrate_domain_out', `
> # This allows an event channel to be created from domains with labels
> # <source> to <dest> and will label it <chan-label>
> define(`create_channel', `
> - allow $1 $3:event { create send status };
> - allow $3 $2:event { bind };
> + allow $1 $3:event {
> + create
> + send
> + status
> + };
> + allow $3 $2:event {
> + bind
> + };
> ')
>
> # domain_event_comms(dom1, dom2)
> @@ -135,8 +235,18 @@ define(`domain_event_comms', `
> # Allow two domain types to communicate using grants and event channels
> define(`domain_comms', `
> domain_event_comms($1, $2)
> - allow $1 $2:grant { map_read map_write copy unmap };
> - allow $2 $1:grant { map_read map_write copy unmap };
> + allow $1 $2:grant {
> + map_read
> + map_write
> + copy
> + unmap
> + };
> + allow $2 $1:grant {
> + map_read
> + map_write
> + copy
> + unmap
> + };
> ')
>
> # domain_self_comms(domain)
> @@ -144,7 +254,12 @@ define(`domain_comms', `
> # and event channels
> define(`domain_self_comms', `
> create_channel($1, $1_self, $1_channel)
> - allow $1 $1_self:grant { map_read map_write copy unmap };
> + allow $1 $1_self:grant {
> + map_read
> + map_write
> + copy
> + unmap
> + };
> ')
>
> # device_model(dm_dom, hvm_dom)
> @@ -159,9 +274,23 @@ define(`device_model', `
> create_channel($2, $1, $2_channel)
> allow $1 $2_channel:event create;
>
> - allow $1 $2_target:domain { getdomaininfo shutdown };
> - allow $1 $2_target:mmu { map_read map_write adjust physmap target_hack
> };
> - allow $1 $2_target:hvm { getparam setparam hvmctl dm };
> + allow $1 $2_target:domain {
> + getdomaininfo
> + shutdown
> + };
> + allow $1 $2_target:mmu {
> + map_read
> + map_write
> + adjust
> + physmap
> + target_hack
> + };
> + allow $1 $2_target:hvm {
> + getparam
> + setparam
> + hvmctl
> + dm
> + };
> allow $1 $2_target:domain2 resource_map;
> ')
>
> @@ -184,7 +313,10 @@ define(`make_device_model', `
> define(`use_device_iommu', `
> allow $1 $1_self:mmu exchange;
> allow $1 $2:resource use_iommu;
> - allow $1 domio_t:mmu { map_read map_write };
> + allow $1 domio_t:mmu {
> + map_read
> + map_write
> + };
> ')
>
> # use_device_iommu_nointremap(domain, device)
> @@ -194,8 +326,14 @@ define(`use_device_iommu', `
> # Allows acceptance of (typically older) less isolating hardware.
> define(`use_device_iommu_nointremap', `
> allow $1 $1_self:mmu exchange;
> - allow $1 $2:resource { use_iommu use_iommu_nointremap };
> - allow $1 domio_t:mmu { map_read map_write };
> + allow $1 $2:resource {
> + use_iommu
> + use_iommu_nointremap
> + };
> + allow $1 domio_t:mmu {
> + map_read
> + map_write
> + };
> ')
>
> # use_device_noiommu(domain, device)
> @@ -203,14 +341,34 @@ define(`use_device_iommu_nointremap', `
> # even without an IOMMU available.
> define(`use_device_noiommu', `
> allow $1 $1_self:mmu exchange;
> - allow $1 $2:resource { use_iommu use_iommu_nointremap use_noiommu };
> - allow $1 domio_t:mmu { map_read map_write };
> + allow $1 $2:resource {
> + use_iommu
> + use_iommu_nointremap
> + use_noiommu
> + };
> + allow $1 domio_t:mmu {
> + map_read
> + map_write
> + };
> ')
>
> # admin_device(domain, device)
> # Allow a device to be used and delegated by a domain
> define(`admin_device', `
> - allow $1 $2:resource { setup stat_device add_device add_irq add_iomem
> add_ioport remove_device remove_irq remove_iomem remove_ioport plug unplug
> };
> + allow $1 $2:resource {
> + setup
> + stat_device
> + add_device
> + add_irq
> + add_iomem
> + add_ioport
> + remove_device
> + remove_irq
> + remove_iomem
> + remove_ioport
> + plug
> + unplug
> + };
> allow $1 $2:hvm bind_irq;
> use_device_noiommu($1, $2)
> ')
> @@ -218,5 +376,8 @@ define(`admin_device', `
> # delegate_devices(priv-domain, target-domain)
> # Allow devices to be delegated
> define(`delegate_devices', `
> - allow $1 $2:resource { add remove };
> + allow $1 $2:resource {
> + add
> + remove
> + };
> ')
> diff --git a/tools/flask/policy/modules/xen.te
> b/tools/flask/policy/modules/xen.te
> index de98206fdd89..1427f81b0d7b 100644
> --- a/tools/flask/policy/modules/xen.te
> +++ b/tools/flask/policy/modules/xen.te
> @@ -52,7 +52,11 @@ type device_t, resource_type;
>
> # Domain destruction can result in some access checks for actions performed
> by
> # the hypervisor. These should always be allowed.
> -allow xen_t resource_type : resource { remove_irq remove_ioport
> remove_iomem };
> +allow xen_t resource_type : resource {
> + remove_irq
> + remove_ioport
> + remove_iomem
> +};
>
>
> ################################################################################
>
> #
> @@ -65,15 +69,26 @@ allow xen_t resource_type : resource { remove_irq
> remove_ioport remove_iomem };
>
> ################################################################################
>
>
> # Domains must be declared using domain_type
> -neverallow * ~domain_type:domain { create transition };
> +neverallow * ~domain_type:domain {
> + create
> + transition
> +};
>
> # Resources must be declared using resource_type
> -neverallow * ~resource_type:resource { use use_iommu use_iommu_nointremap
> - use_noiommu };
> +neverallow * ~resource_type:resource {
> + use
> + use_iommu
> + use_iommu_nointremap
> + use_noiommu
> +};
>
> # Events must use event_type (see create_channel for a template)
> neverallow ~event_type *:event bind;
> -neverallow * ~event_type:event { create send status };
> +neverallow * ~event_type:event {
> + create
> + send
> + status
> +};
>
>
> ################################################################################
>
> #
> diff --git a/tools/flask/policy/modules/xenstore.te
> b/tools/flask/policy/modules/xenstore.te
> index 49de53ebe2a5..776c2748698e 100644
> --- a/tools/flask/policy/modules/xenstore.te
> +++ b/tools/flask/policy/modules/xenstore.te
> @@ -19,7 +19,11 @@ allow xenstore_t domain_type:domain2 get_domain_state;
> # rule between xenstore_t and every domain type that talks to xenstore
> create_channel(xenstore_t, domain_type, xenstore_t_channel)
> allow event_type xenstore_t: event bind;
> -allow xenstore_t domain_type:grant { map_read map_write unmap };
> +allow xenstore_t domain_type:grant {
> + map_read
> + map_write
> + unmap
> +};
>
> # Xenstore is a utility domain, so it should use the system role
> role system_r types xenstore_t;
> --
> 2.39.5
>
>
Acked-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |