Re: [PATCH V3] Ensure correct monolithic binary policy is loaded

Chris PeBenito <[email protected]>
Newsgroups org.kernel.vger.selinux-refpolicy
Message-ID <[email protected]>
On 12/21/20 7:22 AM, Richard Haines wrote:
> When building a monolithic policy with 'make load', the
> selinux_config(5) file 'SELINUXTYPE' entry determines what policy
> is loaded as load_policy(8) does not take a path value (it always loads
> the active system policy as defined by /etc/selinux/config).
> 
> Currently it is possible to load the wrong binary policy, for example if
> the Reference Policy source is located at:
> /etc/selinux/refpolicy
> and the /etc/selinux/config file has the following entry:
> SELINUXTYPE=targeted
> Then the /etc/selinux/targeted/policy/policy.<ver> is loaded when
> 'make load' is executed.
> Resolve this by using selinux_binary_policy_path(3) to determine the
> current configured policy name and its location.
> 
> Another example is that if the Reference Policy source is located at:
> /tmp/custom-rootfs/etc/selinux/refpolicy
> and the /etc/selinux/config file has the following entry:
> SELINUXTYPE=refpolicy
> Then the /etc/selinux/refpolicy/policy/policy.<ver> is loaded when
> 'make DESTDIR=/tmp/custom-rootfs load' is executed (not the
> /tmp/custom-rootfs/etc/selinux/refpolicy/policy/policy.<ver> that the
> developer thought would be loaded).
> Resolve this by checking if DESTDIR has been set.
> 
> Remove the '@touch $(tmpdir)/load' line as the file is never referenced.
> 
> Signed-off-by: Richard Haines <[email protected]>
> ---
> V2 Changes: Use $(error .. instead of NO_LOAD logic. Use python script to
> find selinux path not sestatus. Reword error messages.
> V3 Change: Use the selinux_binary_policy_path() python script and reword
> error messages.
> 
>   Makefile                              |  1 +
>   Rules.monolithic                      | 15 ++++++++++++++-
>   support/selinux_binary_policy_path.py | 12 ++++++++++++
>   3 files changed, 27 insertions(+), 1 deletion(-)
>   create mode 100644 support/selinux_binary_policy_path.py
> 
> diff --git a/Makefile b/Makefile
> index 6ba215f1..1b0a4826 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -97,6 +97,7 @@ genxml := $(PYTHON) $(support)/segenxml.py
>   gendoc := $(PYTHON) $(support)/sedoctool.py
>   genperm := $(PYTHON) $(support)/genclassperms.py
>   policyvers := $(PYTHON) $(support)/policyvers.py
> +binary_policy_path := $(PYTHON) $(support)/selinux_binary_policy_path.py
>   fcsort := $(PYTHON) $(support)/fc_sort.py
>   setbools := $(AWK) -f $(support)/set_bools_tuns.awk
>   get_type_attr_decl := $(SED) -r -f $(support)/get_type_attr_decl.sed
> diff --git a/Rules.monolithic b/Rules.monolithic
> index a8ae98d1..7dbc2e1c 100644
> --- a/Rules.monolithic
> +++ b/Rules.monolithic
> @@ -13,6 +13,12 @@ ifeq "$(kv)" ""
>   	kv := $(pv)
>   endif
>   
> +# load_policy(8) loads policy from /etc/selinux/<SELINUXTYPE>/policy/policy.$(pv)
> +# It does this by reading the /etc/selinux/config file SELINUXTYPE entry to
> +# form the full path. $(polbinpath) will contain this evaluated path for use as
> +# a validation check.
> +polbinpath := $(shell $(binary_policy_path))
> +
>   policy_conf = $(builddir)policy.conf
>   fc = $(builddir)file_contexts
>   polver = $(builddir)policy.$(pv)
> @@ -91,9 +97,16 @@ endif
>   # Load the binary policy
>   #
>   reload $(tmpdir)/load: $(loadpath) $(fcpath) $(appfiles)
> +ifneq ($(DESTDIR),)
> +	$(error Cannot load policy as '$$DESTDIR' is set to $(DESTDIR), \
> +		creating an invalid policy load path)
> +endif
> +ifneq ($(polbinpath).$(pv),$(loadpath))
> +	$(error Cannot load policy as invalid policy path: $(polbinpath).$(pv) - \
> +		Check $(topdir)/config file entry is: "SELINUXTYPE=$(NAME)")
> +endif
>   	@echo "Loading $(NAME) $(loadpath)"
>   	$(verbose) $(LOADPOLICY) -q $(loadpath)
> -	@touch $(tmpdir)/load
>   
>   ########################################
>   #
> diff --git a/support/selinux_binary_policy_path.py b/support/selinux_binary_policy_path.py
> new file mode 100644
> index 00000000..a30eb9b6
> --- /dev/null
> +++ b/support/selinux_binary_policy_path.py
> @@ -0,0 +1,12 @@
> +#!/usr/bin/env python3
> +
> +try:
> +    import warnings
> +    with warnings.catch_warnings():
> +        warnings.filterwarnings("ignore", category=PendingDeprecationWarning)
> +        import selinux
> +
> +    if selinux.is_selinux_enabled():
> +        print(selinux.selinux_binary_policy_path())
> +except ImportError:
> +    exit(0)

Merged, sorry for the slow response.

-- 
Chris PeBenito
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.