From 5f46da452557a147043bc38c41896d0f6351193a Mon Sep 17 00:00:00 2001 From: basebuilder_pel7x64builder0 Date: Mon, 14 Dec 2020 15:37:36 +0100 Subject: [PATCH] selinux-policy package version update Signed-off-by: basebuilder_pel7x64builder0 --- SOURCES/policy-rhel-7.9-base.patch | 61478 +++++++++++ SOURCES/policy-rhel-7.9-contrib.patch | 124936 +++++++++++++++++++++++ SPECS/selinux-policy.spec | 24 +- 3 files changed, 186433 insertions(+), 5 deletions(-) create mode 100644 SOURCES/policy-rhel-7.9-base.patch create mode 100644 SOURCES/policy-rhel-7.9-contrib.patch diff --git a/SOURCES/policy-rhel-7.9-base.patch b/SOURCES/policy-rhel-7.9-base.patch new file mode 100644 index 00000000..7d6407e2 --- /dev/null +++ b/SOURCES/policy-rhel-7.9-base.patch @@ -0,0 +1,61478 @@ +diff --git a/Makefile b/Makefile +index ec7b5cba87..2431fcd29c 100644 +--- a/Makefile ++++ b/Makefile +@@ -61,6 +61,7 @@ SEMODULE ?= $(tc_usrsbindir)/semodule + SEMOD_PKG ?= $(tc_usrbindir)/semodule_package + SEMOD_LNK ?= $(tc_usrbindir)/semodule_link + SEMOD_EXP ?= $(tc_usrbindir)/semodule_expand ++SEPOLGEN ?= $(tc_usrbindir)/sepolgen-ifgen + LOADPOLICY ?= $(tc_usrsbindir)/load_policy + SETFILES ?= $(tc_sbindir)/setfiles + XMLLINT ?= $(BINDIR)/xmllint +@@ -250,7 +251,7 @@ seusers := $(appconf)/seusers + appdir := $(contextpath) + user_default_contexts := $(wildcard config/appconfig-$(TYPE)/*_default_contexts) + user_default_contexts_names := $(addprefix $(contextpath)/users/,$(subst _default_contexts,,$(notdir $(user_default_contexts)))) +-appfiles := $(addprefix $(appdir)/,default_contexts default_type initrc_context failsafe_context userhelper_context removable_context dbus_contexts sepgsql_contexts x_contexts customizable_types securetty_types virtual_domain_context virtual_image_context) $(contextpath)/files/media $(fcsubspath) $(user_default_contexts_names) ++appfiles := $(addprefix $(appdir)/,default_contexts default_type initrc_context failsafe_context userhelper_context removable_context dbus_contexts sepgsql_contexts x_contexts customizable_types securetty_types virtual_image_context virtual_domain_context lxc_contexts systemd_contexts snapperd_contexts) $(contextpath)/files/media $(user_default_contexts_names) + net_contexts := $(builddir)net_contexts + + all_layers := $(shell find $(wildcard $(moddir)/*) -maxdepth 0 -type d) +@@ -365,7 +366,7 @@ $(moddir)/kernel/corenetwork.if: $(moddir)/kernel/corenetwork.te.in $(moddir)/ke + @echo "# $(notdir $@).in or $(notdir $@).m4 file should be modified." >> $@ + @echo "#" >> $@ + $(verbose) cat $@.in >> $@ +- $(verbose) $(GREP) "^[[:blank:]]*network_(interface|node|port|packet)(_controlled)?\(.*\)" $< \ ++ $(verbose) $(GREP) "^[[:blank:]]*(network_(interface|node|port|packet)(_controlled)?)|ib_(pkey|endport)\(.*\)" $< \ + | $(M4) -D self_contained_policy $(M4PARAM) $(m4divert) $@.m4 $(m4undivert) - \ + | $(SED) -e 's/dollarsone/\$$1/g' -e 's/dollarszero/\$$0/g' >> $@ + +@@ -609,15 +610,17 @@ resetlabels: + # Clean everything + # + bare: clean +- rm -f $(polxml) +- rm -f $(layerxml) +- rm -f $(modxml) +- rm -f $(tunxml) +- rm -f $(boolxml) +- rm -f $(mod_conf) +- rm -f $(booleans) +- rm -fR $(htmldir) +- rm -f $(tags) ++ echo "hehe kde jsem asi tak" ++ pwd ++ #rm -f $(polxml) ++ #rm -f $(layerxml) ++ #rm -f $(modxml) ++ #rm -f $(tunxml) ++ #rm -f $(boolxml) ++ #rm -f $(mod_conf) ++ #rm -f $(booleans) ++ #rm -fR $(htmldir) ++ #rm -f $(tags) + # don't remove these files if we're given a local root + ifndef LOCAL_ROOT + rm -f $(fcsort) +diff --git a/Rules.modular b/Rules.modular +index 313d8375b3..1e92c7d5df 100644 +--- a/Rules.modular ++++ b/Rules.modular +@@ -71,7 +71,7 @@ $(modpkgdir)/%.pp: $(builddir)%.pp + # Build module packages + # + $(tmpdir)/%.mod: $(m4support) $(tmpdir)/generated_definitions.conf $(tmpdir)/all_interfaces.conf %.te +- @echo "Compliling $(NAME) $(@F) module" ++ @echo "Compiling $(NAME) $(@F) module" + @test -d $(tmpdir) || mkdir -p $(tmpdir) + $(verbose) $(M4) $(M4PARAM) -s $^ > $(@:.mod=.tmp) + $(verbose) $(CHECKMODULE) -m $(@:.mod=.tmp) -o $@ +@@ -168,6 +168,8 @@ $(tmpdir)/all_attrs_types.conf $(tmpdir)/only_te_rules.conf $(tmpdir)/all_post.c + $(verbose) $(GREP) ^netifcon $(tmpdir)/all_te_files.conf >> $(tmpdir)/all_post.conf || true + $(verbose) $(GREP) ^nodecon $(tmpdir)/all_te_files.conf >> $(tmpdir)/all_post.conf || true + $(verbose) $(comment_move_decl) $(tmpdir)/all_te_files.conf > $(tmpdir)/only_te_rules.conf ++ $(verbose) $(GREP) ^ibpkeycon $(tmpdir)/all_te_files.conf >> $@ || true ++ $(verbose) $(GREP) ^ibendportcon $(tmpdir)/all_te_files.conf >> $@ || true + + ######################################## + # +@@ -201,6 +203,7 @@ validate: $(base_pkg) $(mod_pkgs) + @echo "Validating policy linking." + $(verbose) $(SEMOD_LNK) -o $(tmpdir)/test.lnk $^ + $(verbose) $(SEMOD_EXP) $(tmpdir)/test.lnk $(tmpdir)/policy.bin ++ $(verbose) $(SEPOLGEN) -p $(tmpdir)/policy.bin -i $(poldir) -o $(tmpdir)/output + @echo "Success." + + ######################################## +diff --git a/Rules.monolithic b/Rules.monolithic +index 808a5398ad..77f71cd95f 100644 +--- a/Rules.monolithic ++++ b/Rules.monolithic +@@ -155,6 +155,8 @@ $(tmpdir)/all_attrs_types.conf $(tmpdir)/only_te_rules.conf $(tmpdir)/all_post.c + $(verbose) $(GREP) ^netifcon $(tmpdir)/all_te_files.conf >> $(tmpdir)/all_post.conf || true + $(verbose) $(GREP) ^nodecon $(tmpdir)/all_te_files.conf >> $(tmpdir)/all_post.conf || true + $(verbose) $(comment_move_decl) $(tmpdir)/all_te_files.conf > $(tmpdir)/only_te_rules.conf ++ $(verbose) $(GREP) ^ibpkeycon $(tmpdir)/all_te_files.conf >> $@ || true ++ $(verbose) $(GREP) ^ibendportcon $(tmpdir)/all_te_files.conf >> $@ || true + + ######################################## + # +diff --git a/config/appconfig-mcs/staff_u_default_contexts b/config/appconfig-mcs/staff_u_default_contexts +index 881a292e3b..80110a4322 100644 +--- a/config/appconfig-mcs/staff_u_default_contexts ++++ b/config/appconfig-mcs/staff_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t:s0 staff_r:staff_t:s0 sysadm_r:sysadm_t:s0 + system_r:remote_login_t:s0 staff_r:staff_t:s0 + system_r:sshd_t:s0 staff_r:staff_t:s0 sysadm_r:sysadm_t:s0 +-system_r:crond_t:s0 staff_r:cronjob_t:s0 ++system_r:crond_t:s0 staff_r:staff_t:s0 + system_r:xdm_t:s0 staff_r:staff_t:s0 + staff_r:staff_su_t:s0 staff_r:staff_t:s0 + staff_r:staff_sudo_t:s0 staff_r:staff_t:s0 +diff --git a/config/appconfig-mcs/sysadm_u_default_contexts b/config/appconfig-mcs/sysadm_u_default_contexts +new file mode 100644 +index 0000000000..b8fda95437 +--- /dev/null ++++ b/config/appconfig-mcs/sysadm_u_default_contexts +@@ -0,0 +1,12 @@ ++system_r:local_login_t:s0 sysadm_r:sysadm_t:s0 ++system_r:remote_login_t:s0 sysadm_r:sysadm_t:s0 ++system_r:sshd_t:s0 sysadm_r:sysadm_t:s0 ++system_r:crond_t:s0 sysadm_r:sysadm_t:s0 ++system_r:xdm_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_sudo_t:s0 sysadm_r:sysadm_t:s0 ++system_r:initrc_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_sudo_t:s0 sysadm_r:sysadm_t:s0 ++ +diff --git a/config/appconfig-mcs/systemd_contexts b/config/appconfig-mcs/systemd_contexts +new file mode 100644 +index 0000000000..ff32accd17 +--- /dev/null ++++ b/config/appconfig-mcs/systemd_contexts +@@ -0,0 +1 @@ ++runtime=system_u:object_r:systemd_runtime_unit_file_t:s0 +diff --git a/config/appconfig-mcs/user_u_default_contexts b/config/appconfig-mcs/user_u_default_contexts +index cacbc939f7..4f59f94013 100644 +--- a/config/appconfig-mcs/user_u_default_contexts ++++ b/config/appconfig-mcs/user_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t:s0 user_r:user_t:s0 + system_r:remote_login_t:s0 user_r:user_t:s0 + system_r:sshd_t:s0 user_r:user_t:s0 +-system_r:crond_t:s0 user_r:cronjob_t:s0 ++system_r:crond_t:s0 user_r:user_t:s0 + system_r:xdm_t:s0 user_r:user_t:s0 + user_r:user_su_t:s0 user_r:user_t:s0 + user_r:user_sudo_t:s0 user_r:user_t:s0 +diff --git a/config/appconfig-mcs/virtual_domain_context b/config/appconfig-mcs/virtual_domain_context +index d387b428b9..150f281d10 100644 +--- a/config/appconfig-mcs/virtual_domain_context ++++ b/config/appconfig-mcs/virtual_domain_context +@@ -1 +1,2 @@ + system_u:system_r:svirt_t:s0 ++system_u:system_r:svirt_tcg_t:s0 +diff --git a/config/appconfig-mls/staff_u_default_contexts b/config/appconfig-mls/staff_u_default_contexts +index 881a292e3b..80110a4322 100644 +--- a/config/appconfig-mls/staff_u_default_contexts ++++ b/config/appconfig-mls/staff_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t:s0 staff_r:staff_t:s0 sysadm_r:sysadm_t:s0 + system_r:remote_login_t:s0 staff_r:staff_t:s0 + system_r:sshd_t:s0 staff_r:staff_t:s0 sysadm_r:sysadm_t:s0 +-system_r:crond_t:s0 staff_r:cronjob_t:s0 ++system_r:crond_t:s0 staff_r:staff_t:s0 + system_r:xdm_t:s0 staff_r:staff_t:s0 + staff_r:staff_su_t:s0 staff_r:staff_t:s0 + staff_r:staff_sudo_t:s0 staff_r:staff_t:s0 +diff --git a/config/appconfig-mls/systemd_contexts b/config/appconfig-mls/systemd_contexts +new file mode 100644 +index 0000000000..ff32accd17 +--- /dev/null ++++ b/config/appconfig-mls/systemd_contexts +@@ -0,0 +1 @@ ++runtime=system_u:object_r:systemd_runtime_unit_file_t:s0 +diff --git a/config/appconfig-mls/user_u_default_contexts b/config/appconfig-mls/user_u_default_contexts +index cacbc939f7..4f59f94013 100644 +--- a/config/appconfig-mls/user_u_default_contexts ++++ b/config/appconfig-mls/user_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t:s0 user_r:user_t:s0 + system_r:remote_login_t:s0 user_r:user_t:s0 + system_r:sshd_t:s0 user_r:user_t:s0 +-system_r:crond_t:s0 user_r:cronjob_t:s0 ++system_r:crond_t:s0 user_r:user_t:s0 + system_r:xdm_t:s0 user_r:user_t:s0 + user_r:user_su_t:s0 user_r:user_t:s0 + user_r:user_sudo_t:s0 user_r:user_t:s0 +diff --git a/config/appconfig-standard/staff_u_default_contexts b/config/appconfig-standard/staff_u_default_contexts +index c2a5ea871e..f63999e77f 100644 +--- a/config/appconfig-standard/staff_u_default_contexts ++++ b/config/appconfig-standard/staff_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t staff_r:staff_t sysadm_r:sysadm_t + system_r:remote_login_t staff_r:staff_t + system_r:sshd_t staff_r:staff_t sysadm_r:sysadm_t +-system_r:crond_t staff_r:cronjob_t ++system_r:crond_t staff_r:staff_t + system_r:xdm_t staff_r:staff_t + staff_r:staff_su_t staff_r:staff_t + staff_r:staff_sudo_t staff_r:staff_t +diff --git a/config/appconfig-standard/sysadm_u_default_contexts b/config/appconfig-standard/sysadm_u_default_contexts +new file mode 100644 +index 0000000000..b8fda95437 +--- /dev/null ++++ b/config/appconfig-standard/sysadm_u_default_contexts +@@ -0,0 +1,12 @@ ++system_r:local_login_t:s0 sysadm_r:sysadm_t:s0 ++system_r:remote_login_t:s0 sysadm_r:sysadm_t:s0 ++system_r:sshd_t:s0 sysadm_r:sysadm_t:s0 ++system_r:crond_t:s0 sysadm_r:sysadm_t:s0 ++system_r:xdm_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_sudo_t:s0 sysadm_r:sysadm_t:s0 ++system_r:initrc_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_su_t:s0 sysadm_r:sysadm_t:s0 ++sysadm_r:sysadm_sudo_t:s0 sysadm_r:sysadm_t:s0 ++ +diff --git a/config/appconfig-standard/systemd_contexts b/config/appconfig-standard/systemd_contexts +new file mode 100644 +index 0000000000..ff32accd17 +--- /dev/null ++++ b/config/appconfig-standard/systemd_contexts +@@ -0,0 +1 @@ ++runtime=system_u:object_r:systemd_runtime_unit_file_t:s0 +diff --git a/config/appconfig-standard/user_u_default_contexts b/config/appconfig-standard/user_u_default_contexts +index f5bfac34a2..639555b9a7 100644 +--- a/config/appconfig-standard/user_u_default_contexts ++++ b/config/appconfig-standard/user_u_default_contexts +@@ -1,7 +1,7 @@ + system_r:local_login_t user_r:user_t + system_r:remote_login_t user_r:user_t + system_r:sshd_t user_r:user_t +-system_r:crond_t user_r:cronjob_t ++system_r:crond_t user_r:user_t + system_r:xdm_t user_r:user_t + user_r:user_su_t user_r:user_t + user_r:user_sudo_t user_r:user_t +diff --git a/config/appconfig-standard/virtual_domain_context b/config/appconfig-standard/virtual_domain_context +index c049e104bd..150f281d10 100644 +--- a/config/appconfig-standard/virtual_domain_context ++++ b/config/appconfig-standard/virtual_domain_context +@@ -1 +1,2 @@ +-system_u:system_r:svirt_t ++system_u:system_r:svirt_t:s0 ++system_u:system_r:svirt_tcg_t:s0 +diff --git a/man/man8/ftpd_selinux.8 b/man/man8/ftpd_selinux.8 +deleted file mode 100644 +index 5bebd82d47..0000000000 +--- a/man/man8/ftpd_selinux.8 ++++ /dev/null +@@ -1,65 +0,0 @@ +-.TH "ftpd_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "ftpd SELinux policy documentation" +-.SH "NAME" +-.PP +-ftpd_selinux \- Security-Enhanced Linux policy for ftp daemons. +-.SH "DESCRIPTION" +-.PP +-Security-Enhanced Linux provides security for ftp daemons via flexible mandatory access control. +-.SH FILE_CONTEXTS +-.PP +-SELinux requires files to have a file type. File types may be specified with semanage and are restored with restorecon. Policy governs the access that daemons have to files. +-.TP +-Allow ftp servers to read the /var/ftp directory by adding the public_content_t file type to the directory and by restoring the file type. +-.PP +-.B +-semanage fcontext -a -t public_content_t "/var/ftp(/.*)?" +-.TP +-.B +-restorecon -F -R -v /var/ftp +-.TP +-Allow ftp servers to read and write /var/tmp/incoming by adding the public_content_rw_t type to the directory and by restoring the file type. This also requires the allow_ftpd_anon_write boolean to be set. +-.PP +-.B +-semanage fcontext -a -t public_content_rw_t "/var/ftp/incoming(/.*)?" +-.TP +-.B +-restorecon -F -R -v /var/ftp/incoming +- +-.SH BOOLEANS +-.PP +-SELinux policy is based on least privilege required and may also be customizable by setting a boolean with setsebool. +-.TP +-Allow ftp servers to read and write files with the public_content_rw_t file type. +-.PP +-.B +-setsebool -P allow_ftpd_anon_write on +-.TP +-Allow ftp servers to read or write files in the user home directories. +-.PP +-.B +-setsebool -P ftp_home_dir on +-.TP +-Allow ftp servers to read or write all files on the system. +-.PP +-.B +-setsebool -P allow_ftpd_full_access on +-.TP +-Allow ftp servers to use cifs for public file transfer services. +-.PP +-.B +-setsebool -P allow_ftpd_use_cifs on +-.TP +-Allow ftp servers to use nfs for public file transfer services. +-.PP +-.B +-setsebool -P allow_ftpd_use_nfs on +-.TP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-.PP +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-.PP +- +-selinux(8), ftpd(8), setsebool(8), semanage(8), restorecon(8) +diff --git a/man/man8/git_selinux.8 b/man/man8/git_selinux.8 +deleted file mode 100644 +index e9c43b190c..0000000000 +--- a/man/man8/git_selinux.8 ++++ /dev/null +@@ -1,109 +0,0 @@ +-.TH "git_selinux" "8" "27 May 2010" "domg472@gmail.com" "Git SELinux policy documentation" +-.de EX +-.nf +-.ft CW +-.. +-.de EE +-.ft R +-.fi +-.. +-.SH "NAME" +-git_selinux \- Security Enhanced Linux Policy for the Git daemon. +-.SH "DESCRIPTION" +-Security-Enhanced Linux secures the Git server via flexible mandatory access +-control. +-.SH FILE_CONTEXTS +-SELinux requires files to have an extended attribute to define the file type. +-Policy governs the access daemons have to these files. +-SELinux Git policy is very flexible allowing users to setup their web services in as secure a method as possible. +-.PP +-The following file contexts types are by default defined for Git: +-.EX +-git_system_content_t +-.EE +-- Set files with git_system_content_t if you want the Git system daemon to read the file, and if you want the file to be modifiable and executable by all "Git shell" users. +-.EX +-git_session_content_t +-.EE +-- Set files with git_session_content_t if you want the Git session and system daemon to read the file, and if you want the file to be modifiable and executable by all users. Note that "Git shell" users may not interact with this type. +-.SH BOOLEANS +-SELinux policy is customizable based on least access required. Git policy is extremely flexible and has several booleans that allow you to manipulate the policy and run Git with the tightest access possible. +-.PP +-Allow the Git system daemon to search user home directories so that it can find git session content. This is useful if you want the Git system daemon to host users personal repositories. +-.EX +-sudo setsebool -P git_system_enable_homedirs 1 +-.EE +-.PP +-Allow the Git system daemon to read system shared repositories on NFS shares. +-.EX +-sudo setsebool -P git_system_use_nfs 1 +-.EE +-.PP +-Allow the Git system daemon to read system shared repositories on Samba shares. +-.EX +-sudo setsebool -P git_system_use_cifs 1 +-.EE +-.PP +-Allow the Git session daemon to read users personal repositories on NFS mounted home directories. +-.EX +-sudo setsebool -P use_nfs_home_dirs 1 +-.EE +-.PP +-Allow the Git session daemon to read users personal repositories on Samba mounted home directories. +-.EX +-sudo setsebool -P use_samba_home_dirs 1 +-.EE +-.PP +-To also allow Git system daemon to read users personal repositories on NFS and Samba mounted home directories you must also allow the Git system daemon to search home directories so that it can find the repositories. +-.EX +-sudo setsebool -P git_system_enable_homedirs 1 +-.EE +-.PP +-To allow the Git System daemon mass hosting of users personal repositories you can allow the Git daemon to listen to any unreserved ports. +-.EX +-sudo setsebool -P git_session_bind_all_unreserved_ports 1 +-.EE +-.SH GIT_SHELL +-The Git policy by default provides a restricted user environment to be used with "Git shell". This default git_shell_u SELinux user can modify and execute generic Git system content (generic system shared respositories with type git_system_content_t). +-.PP +-To add a new Linux user and map him to this Git shell user domain automatically: +-.EX +-sudo useradd -Z git_shell_u joe +-.EE +-.SH ADVANCED_SYSTEM_SHARED_REPOSITORY_AND GIT_SHELL_RESTRICTIONS +-Alternatively Git SELinux policy can be used to restrict "Git shell" users to git system shared repositories. The policy allows for the creation of new types of Git system content and Git shell user environment. The policy allows for delegation of types of "Git shell" environments to types of Git system content. +-.PP +-To add a new Git system repository type, for example "project1" create a file named project1.te and add to it: +-.EX +-policy_module(project1, 1.0.0) +-git_content_template(project1) +-.EE +-Next create a file named project1.fc and add a file context specification for the new repository type to it: +-.EX +-/srv/git/project1\.git(/.*)? gen_context(system_u:object_r:git_project1_content_t,s0) +-.EE +-Build a binary representation of this source policy module, load it into the policy store and restore the context of the repository: +-.EX +-make -f /usr/share/selinux/devel/Makefile project.pp +-sudo semodule -i project1.pp +-sudo restorecon -R -v /srv/git/project1 +-.EE +-To create a "Git shell" domain that can interact with this repository create a file named project1user.te in the same directory as where the source policy for the Git systemm content type is and add the following: +-.EX +-policy_module(project1user, 1.0.0) +-git_role_template(project1user) +-git_content_delegation(project1user_t, git_project1_content_t) +-gen_user(project1user_u, user, project1user_r, s0, s0) +-.EE +-Build a binary representation of this source policy module, load it into the policy store and map Linux users to the new project1user_u SELinux user: +-.EX +-make -f /usr/share/selinux/devel/Makefile project1user.pp +-sudo semodule -i project1user.pp +-sudo useradd -Z project1user_u jane +-.EE +-.PP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dominick Grift . +-.SH "SEE ALSO" +-selinux(8), git(8), chcon(1), semodule(8), setsebool(8) +diff --git a/man/man8/httpd_selinux.8 b/man/man8/httpd_selinux.8 +deleted file mode 100644 +index 16e8b13235..0000000000 +--- a/man/man8/httpd_selinux.8 ++++ /dev/null +@@ -1,120 +0,0 @@ +-.TH "httpd_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "httpd Selinux Policy documentation" +-.de EX +-.nf +-.ft CW +-.. +-.de EE +-.ft R +-.fi +-.. +-.SH "NAME" +-httpd_selinux \- Security Enhanced Linux Policy for the httpd daemon +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the httpd server via flexible mandatory access +-control. +-.SH FILE_CONTEXTS +-SELinux requires files to have an extended attribute to define the file type. +-Policy governs the access daemons have to these files. +-SELinux httpd policy is very flexible allowing users to setup their web services in as secure a method as possible. +-.PP +-The following file contexts types are defined for httpd: +-.EX +-httpd_sys_content_t +-.EE +-- Set files with httpd_sys_content_t if you want httpd_sys_script_exec_t scripts and the daemon to read the file, and disallow other non sys scripts from access. +-.EX +-httpd_sys_script_exec_t +-.EE +-- Set cgi scripts with httpd_sys_script_exec_t to allow them to run with access to all sys types. +-.EX +-httpd_sys_content_rw_t +-.EE +-- Set files with httpd_sys_content_rw_t if you want httpd_sys_script_exec_t scripts and the daemon to read/write the data, and disallow other non sys scripts from access. +-.EX +-httpd_sys_content_ra_t +-.EE +-- Set files with httpd_sys_content_ra_t if you want httpd_sys_script_exec_t scripts and the daemon to read/append to the file, and disallow other non sys scripts from access. +-.EX +-httpd_unconfined_script_exec_t +-.EE +-- Set cgi scripts with httpd_unconfined_script_exec_t to allow them to run without any SELinux protection. This should only be used for a very complex httpd scripts, after exhausting all other options. It is better to use this script rather than turning off SELinux protection for httpd. +- +-.SH NOTE +-With certain policies you can define additional file contexts based on roles like user or staff. httpd_user_script_exec_t can be defined where it would only have access to "user" contexts. +- +-.SH SHARING FILES +-If you want to share files with multiple domains (Apache, FTP, rsync, Samba), you can set a file context of public_content_t and public_content_rw_t. These context allow any of the above domains to read the content. If you want a particular domain to write to the public_content_rw_t domain, you must set the appropriate boolean. allow_DOMAIN_anon_write. So for httpd you would execute: +- +-.EX +-setsebool -P allow_httpd_anon_write=1 +-.EE +- +-or +- +-.EX +-setsebool -P allow_httpd_sys_script_anon_write=1 +-.EE +- +-.SH BOOLEANS +-SELinux policy is customizable based on least access required. SELinux can be setup to prevent certain http scripts from working. httpd policy is extremely flexible and has several booleans that allow you to manipulate the policy and run httpd with the tightest access possible. +-.PP +-httpd can be setup to allow cgi scripts to be executed, set httpd_enable_cgi to allow this +- +-.EX +-setsebool -P httpd_enable_cgi 1 +-.EE +- +-.PP +-SELinux policy for httpd can be setup to not allowed to access users home directories. If you want to allow access to users home directories you need to set the httpd_enable_homedirs boolean and change the context of the files that you want people to access off the home dir. +- +-.EX +-setsebool -P httpd_enable_homedirs 1 +-chcon -R -t httpd_sys_content_t ~user/public_html +-.EE +- +-.PP +-SELinux policy for httpd can be setup to not allow access to the controlling terminal. In most cases this is preferred, because an intruder might be able to use the access to the terminal to gain privileges. But in certain situations httpd needs to prompt for a password to open a certificate file, in these cases, terminal access is required. Set the httpd_tty_comm boolean to allow terminal access. +- +-.EX +-setsebool -P httpd_tty_comm 1 +-.EE +- +-.PP +-httpd can be configured to not differentiate file controls based on context, i.e. all files labeled as httpd context can be read/write/execute. Setting this boolean to false allows you to setup the security policy such that one httpd service can not interfere with another. +- +-.EX +-setsebool -P httpd_unified 0 +-.EE +- +-.PP +-SELinu policy for httpd can be configured to turn on sending email. This is a security feature, since it would prevent a vulnerabiltiy in http from causing a spam attack. I certain situations, you may want http modules to send mail. You can turn on the httpd_send_mail boolean. +- +-.EX +-setsebool -P httpd_can_sendmail 1 +-.PP +-httpd can be configured to turn off internal scripting (PHP). PHP and other +-loadable modules run under the same context as httpd. Therefore several policy rules allow httpd greater access to the system then is needed if you only use external cgi scripts. +- +-.EX +-setsebool -P httpd_builtin_scripting 0 +-.EE +- +-.PP +-SELinux policy can be setup such that httpd scripts are not allowed to connect out to the network. +-This would prevent a hacker from breaking into you httpd server and attacking +-other machines. If you need scripts to be able to connect you can set the httpd_can_network_connect boolean on. +- +-.EX +-setsebool -P httpd_can_network_connect 1 +-.EE +- +-.PP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), httpd(8), chcon(1), setsebool(8) +- +- +diff --git a/man/man8/kerberos_selinux.8 b/man/man8/kerberos_selinux.8 +deleted file mode 100644 +index a8f81c8e78..0000000000 +--- a/man/man8/kerberos_selinux.8 ++++ /dev/null +@@ -1,28 +0,0 @@ +-.TH "kerberos_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "kerberos Selinux Policy documentation" +-.de EX +-.nf +-.ft CW +-.. +-.de EE +-.ft R +-.fi +-.. +-.SH "NAME" +-kerberos_selinux \- Security Enhanced Linux Policy for Kerberos. +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the system via flexible mandatory access +-control. SELinux policy can be configured to deny Kerberos access to confined applications, since it requires daemons to be allowed greater access to certain secure files and additional access to the network. +-.SH BOOLEANS +-.PP +-You must set the allow_kerberos boolean to allow your system to work properly in a Kerberos environment. +-.EX +-setsebool -P allow_kerberos 1 +-.EE +-.PP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), kerberos(1), chcon(1), setsebool(8) +diff --git a/man/man8/named_selinux.8 b/man/man8/named_selinux.8 +deleted file mode 100644 +index fce0b4815e..0000000000 +--- a/man/man8/named_selinux.8 ++++ /dev/null +@@ -1,30 +0,0 @@ +-.TH "named_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "named Selinux Policy documentation" +-.de EX +-.nf +-.ft CW +-.. +-.de EE +-.ft R +-.fi +-.. +-.SH "NAME" +-named_selinux \- Security Enhanced Linux Policy for the Internet Name server (named) daemon +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the named server via flexible mandatory access +-control. +-.SH BOOLEANS +-SELinux policy is customizable based on least access required. So by +-default SELinux policy does not allow named to write master zone files. If you want to have named update the master zone files you need to set the named_write_master_zones boolean. +-.EX +-setsebool -P named_write_master_zones 1 +-.EE +-.PP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), named(8), chcon(1), setsebool(8) +- +- +diff --git a/man/man8/nfs_selinux.8 b/man/man8/nfs_selinux.8 +deleted file mode 100644 +index 8e30c4c65f..0000000000 +--- a/man/man8/nfs_selinux.8 ++++ /dev/null +@@ -1,31 +0,0 @@ +-.TH "nfs_selinux" "8" "9 Feb 2009" "dwalsh@redhat.com" "NFS SELinux Policy documentation" +-.SH "NAME" +-nfs_selinux \- Security Enhanced Linux Policy for NFS +-.SH "DESCRIPTION" +- +-Security Enhanced Linux secures the NFS server via flexible mandatory access +-control. +-.SH BOOLEANS +-SELinux policy is customizable based on the least level of access required. SELinux can be configured to not allow NFS to share files. If you want to share NFS partitions, and only allow read-only access to those NFS partitions, turn the nfs_export_all_ro boolean on: +- +-.TP +-setsebool -P nfs_export_all_ro 1 +-.TP +-If you want to share files read/write you must set the nfs_export_all_rw boolean. +-.TP +-setsebool -P nfs_export_all_rw 1 +- +-.TP +-These booleans are not required when files to be shared are labeled with the public_content_t or public_content_rw_t types. NFS can share files labeled with the public_content_t or public_content_rw_t types even if the nfs_export_all_ro and nfs_export_all_rw booleans are off. +- +-.TP +-If you want to use a remote NFS server for the home directories on this machine, you must set the use_nfs_home_dirs boolean: +-.TP +-setsebool -P use_nfs_home_dirs 1 +-.TP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), chcon(1), setsebool(8) +diff --git a/man/man8/nis_selinux.8 b/man/man8/nis_selinux.8 +deleted file mode 100644 +index 6271c951f1..0000000000 +--- a/man/man8/nis_selinux.8 ++++ /dev/null +@@ -1 +0,0 @@ +-.so man8/ypbind_selinux.8 +diff --git a/man/man8/rsync_selinux.8 b/man/man8/rsync_selinux.8 +deleted file mode 100644 +index ad9ccf5cd2..0000000000 +--- a/man/man8/rsync_selinux.8 ++++ /dev/null +@@ -1,52 +0,0 @@ +-.TH "rsync_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "rsync Selinux Policy documentation" +-.de EX +-.nf +-.ft CW +-.. +-.de EE +-.ft R +-.fi +-.. +-.SH "NAME" +-rsync_selinux \- Security Enhanced Linux Policy for the rsync daemon +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the rsync server via flexible mandatory access +-control. +-.SH FILE_CONTEXTS +-SELinux requires files to have an extended attribute to define the file type. +-Policy governs the access daemons have to these files. +-If you want to share files using the rsync daemon, you must label the files and directories public_content_t. So if you created a special directory /var/rsync, you +-would need to label the directory with the chcon tool. +-.TP +-chcon -t public_content_t /var/rsync +-.TP +-.TP +-To make this change permanent (survive a relabel), use the semanage command to add the change to file context configuration: +-.TP +-semanage fcontext -a -t public_content_t "/var/rsync(/.*)?" +-.TP +-This command adds the following entry to /etc/selinux/POLICYTYPE/contexts/files/file_contexts.local: +-.TP +-/var/rsync(/.*)? system_u:object_r:publix_content_t:s0 +-.TP +-Run the restorecon command to apply the changes: +-.TP +-restorecon -R -v /var/rsync/ +-.EE +- +-.SH SHARING FILES +-If you want to share files with multiple domains (Apache, FTP, rsync, Samba), you can set a file context of public_content_t and public_content_rw_t. These context allow any of the above domains to read the content. If you want a particular domain to write to the public_content_rw_t domain, you must set the appropriate boolean. allow_DOMAIN_anon_write. So for rsync you would execute: +- +-.EX +-setsebool -P allow_rsync_anon_write=1 +-.EE +- +-.SH BOOLEANS +-.TP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), rsync(1), chcon(1), setsebool(8), semanage(8) +diff --git a/man/man8/samba_selinux.8 b/man/man8/samba_selinux.8 +deleted file mode 100644 +index ca702c7991..0000000000 +--- a/man/man8/samba_selinux.8 ++++ /dev/null +@@ -1,56 +0,0 @@ +-.TH "samba_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "Samba Selinux Policy documentation" +-.SH "NAME" +-samba_selinux \- Security Enhanced Linux Policy for Samba +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the Samba server via flexible mandatory access +-control. +-.SH FILE_CONTEXTS +-SELinux requires files to have an extended attribute to define the file type. +-Policy governs the access daemons have to these files. +-If you want to share files other than home directories, those files must be +-labeled samba_share_t. So if you created a special directory /var/eng, you +-would need to label the directory with the chcon tool. +-.TP +-chcon -t samba_share_t /var/eng +-.TP +-To make this change permanent (survive a relabel), use the semanage command to add the change to file context configuration: +-.TP +-semanage fcontext -a -t samba_share_t "/var/eng(/.*)?" +-.TP +-This command adds the following entry to /etc/selinux/POLICYTYPE/contexts/files/file_contexts.local: +-.TP +-/var/eng(/.*)? system_u:object_r:samba_share_t:s0 +-.TP +-Run the restorecon command to apply the changes: +-.TP +-restorecon -R -v /var/eng/ +- +-.SH SHARING FILES +-If you want to share files with multiple domains (Apache, FTP, rsync, Samba), you can set a file context of public_content_t and public_content_rw_t. These context allow any of the above domains to read the content. If you want a particular domain to write to the public_content_rw_t domain, you must set the appropriate boolean. allow_DOMAIN_anon_write. So for samba you would execute: +- +-setsebool -P allow_smbd_anon_write=1 +- +-.SH BOOLEANS +-.br +-SELinux policy is customizable based on least access required. So by +-default SELinux policy turns off SELinux sharing of home directories and +-the use of Samba shares from a remote machine as a home directory. +-.TP +-If you are setting up this machine as a Samba server and wish to share the home directories, you need to set the samba_enable_home_dirs boolean. +-.br +- +-setsebool -P samba_enable_home_dirs 1 +-.TP +-If you want to use a remote Samba server for the home directories on this machine, you must set the use_samba_home_dirs boolean. +-.br +- +-setsebool -P use_samba_home_dirs 1 +-.TP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +- +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), samba(7), chcon(1), setsebool(8), semanage(8) +diff --git a/man/man8/ypbind_selinux.8 b/man/man8/ypbind_selinux.8 +deleted file mode 100644 +index 5061a5f041..0000000000 +--- a/man/man8/ypbind_selinux.8 ++++ /dev/null +@@ -1,19 +0,0 @@ +-.TH "ypbind_selinux" "8" "17 Jan 2005" "dwalsh@redhat.com" "ypbind Selinux Policy documentation" +-.SH "NAME" +-ypbind_selinux \- Security Enhanced Linux Policy for NIS. +-.SH "DESCRIPTION" +- +-Security-Enhanced Linux secures the system via flexible mandatory access +-control. SELinux can be setup deny NIS from working, since it requires daemons to be allowed greater access to the network. +-.SH BOOLEANS +-.TP +-You must set the allow_ypbind boolean to allow your system to work properly in a NIS environment. +-.TP +-setsebool -P allow_ypbind 1 +-.TP +-system-config-selinux is a GUI tool available to customize SELinux policy settings. +-.SH AUTHOR +-This manual page was written by Dan Walsh . +- +-.SH "SEE ALSO" +-selinux(8), ypbind(8), chcon(1), setsebool(8) +diff --git a/policy/constraints b/policy/constraints +index 3a45f236b4..225034c759 100644 +--- a/policy/constraints ++++ b/policy/constraints +@@ -105,6 +105,18 @@ constrain process { transition dyntransition noatsecure siginh rlimitinh } + or ( t1 == process_uncond_exempt ) + ); + ++constrain process dyntransition ++( ++ u1 == u2 ++ or ( t1 == can_change_process_identity and t2 == process_user_target ) ++); ++ ++constrain process dyntransition ++( ++ r1 == r2 ++ or ( t1 == can_change_process_identity and t2 == process_user_target ) ++); ++ + # These permissions do not have ubac constraints: + # fork + # setexec +@@ -130,6 +142,7 @@ exempted_ubac_constraint(fd, ubacfd) + + exempted_ubac_constraint(socket, ubacsock) + exempted_ubac_constraint(tcp_socket, ubacsock) ++exempted_ubac_constraint(sctp_socket, ubacsock) + exempted_ubac_constraint(udp_socket, ubacsock) + exempted_ubac_constraint(rawip_socket, ubacsock) + exempted_ubac_constraint(netlink_socket, ubacsock) +@@ -150,6 +163,14 @@ exempted_ubac_constraint(netlink_kobject_uevent_socket, ubacsock) + exempted_ubac_constraint(appletalk_socket, ubacsock) + exempted_ubac_constraint(dccp_socket, ubacsock) + exempted_ubac_constraint(tun_socket, ubacsock) ++exempted_ubac_constraint(netlink_iscsi_socket, ubacsock) ++exempted_ubac_constraint(netlink_fib_lookup_socket, ubacsock) ++exempted_ubac_constraint(netlink_connector_socket, ubacsock) ++exempted_ubac_constraint(netlink_netfilter_socket, ubacsock) ++exempted_ubac_constraint(netlink_generic_socket, ubacsock) ++exempted_ubac_constraint(netlink_scsitransport_socket, ubacsock) ++exempted_ubac_constraint(netlink_rdma_socket, ubacsock) ++exempted_ubac_constraint(netlink_crypto_socket, ubacsock) + + constrain socket_class_set { create relabelto relabelfrom } + ( +diff --git a/policy/flask/access_vectors b/policy/flask/access_vectors +index a94b16980a..803600a4f4 100644 +--- a/policy/flask/access_vectors ++++ b/policy/flask/access_vectors +@@ -20,6 +20,7 @@ common file + relabelfrom + relabelto + append ++ map + unlink + link + rename +@@ -47,6 +48,7 @@ common socket + relabelfrom + relabelto + append ++ map + # socket-specific + bind + connect +@@ -120,6 +122,60 @@ common x_device + destroy + } + ++# ++# Define a common for capability access vectors. ++# ++common cap ++{ ++ # The capabilities are defined in include/linux/capability.h ++ # Capabilities >= 32 are defined in the cap2 common. ++ # Care should be taken to ensure that these are consistent with ++ # those definitions. (Order matters) ++ ++ chown ++ dac_override ++ dac_read_search ++ fowner ++ fsetid ++ kill ++ setgid ++ setuid ++ setpcap ++ linux_immutable ++ net_bind_service ++ net_broadcast ++ net_admin ++ net_raw ++ ipc_lock ++ ipc_owner ++ sys_module ++ sys_rawio ++ sys_chroot ++ sys_ptrace ++ sys_pacct ++ sys_admin ++ sys_boot ++ sys_nice ++ sys_resource ++ sys_time ++ sys_tty_config ++ mknod ++ lease ++ audit_write ++ audit_control ++ setfcap ++} ++ ++common cap2 ++{ ++ mac_override # unused by SELinux ++ mac_admin # unused by SELinux ++ syslog ++ wake_alarm ++ block_suspend ++ audit_read ++} ++ + # + # Define the access vectors. + # +@@ -329,8 +385,14 @@ class process + execheap + setkeycreate + setsockcreate ++ ptrace_child + } + ++class process2 ++{ ++ nnp_transition ++ nosuid_transition ++} + + # + # Define the access vector interpretation for ipc-related objects +@@ -379,6 +441,7 @@ class security + setsecparam + setcheckreqprot + read_policy ++ validate_trans + } + + +@@ -393,62 +456,30 @@ class system + syslog_mod + syslog_console + module_request ++ module_load ++ halt ++ reboot ++ status ++ undefined ++ enable ++ disable ++ reload ++ kill + } + + # +-# Define the access vector interpretation for controling capabilies ++# Define the access vector interpretation for controlling capabilities + # + + class capability +-{ +- # The capabilities are defined in include/linux/capability.h +- # Capabilities >= 32 are defined in the capability2 class. +- # Care should be taken to ensure that these are consistent with +- # those definitions. (Order matters) +- +- chown +- dac_override +- dac_read_search +- fowner +- fsetid +- kill +- setgid +- setuid +- setpcap +- linux_immutable +- net_bind_service +- net_broadcast +- net_admin +- net_raw +- ipc_lock +- ipc_owner +- sys_module +- sys_rawio +- sys_chroot +- sys_ptrace +- sys_pacct +- sys_admin +- sys_boot +- sys_nice +- sys_resource +- sys_time +- sys_tty_config +- mknod +- lease +- audit_write +- audit_control +- setfcap +-} ++inherits cap + +-class capability2 ++class capability2 ++inherits cap2 + { +- mac_override # unused by SELinux +- mac_admin # unused by SELinux +- syslog +- wake_alarm +- block_suspend ++ epolwakeup ++ compromise_kernel + } +- + # + # Define the access vector interpretation for controlling + # changes to passwd information. +@@ -690,6 +721,8 @@ class nscd + shmemhost + getserv + shmemserv ++ getnetgrp ++ shmemnetgrp + } + + # Define the access vector interpretation for controlling +@@ -831,6 +864,38 @@ inherits socket + attach_queue + } + ++class binder ++{ ++ impersonate ++ call ++ set_context_mgr ++ transfer ++} ++ ++class netlink_iscsi_socket ++inherits socket ++ ++class netlink_fib_lookup_socket ++inherits socket ++ ++class netlink_connector_socket ++inherits socket ++ ++class netlink_netfilter_socket ++inherits socket ++ ++class netlink_generic_socket ++inherits socket ++ ++class netlink_scsitransport_socket ++inherits socket ++ ++class netlink_rdma_socket ++inherits socket ++ ++class netlink_crypto_socket ++inherits socket ++ + class x_pointer + inherits x_device + +@@ -859,9 +924,175 @@ inherits database + set_value + } + ++class infiniband_pkey ++{ ++ access ++} ++ ++class infiniband_endport ++{ ++ manage_subnet ++} ++ + class db_language + inherits database + { + implement + execute + } ++ ++class service ++{ ++ start ++ stop ++ status ++ reload ++ enable ++ disable ++ kill ++ load ++} ++ ++class proxy ++{ ++ read ++} ++ ++# ++# Define the access vector interpretation for controlling capabilities ++# in user namespaces ++# ++class cap_userns ++inherits cap ++ ++class cap2_userns ++inherits cap2 ++ ++# ++# Define the access vector interpretation for the new socket classes ++# enabled by the extended_socket_class policy capability. ++# ++ ++# ++# The next two classes were previously mapped to rawip_socket and therefore ++# have the same definition as rawip_socket (until further permissions ++# are defined). ++# ++class sctp_socket ++inherits socket ++{ ++ node_bind ++ name_connect ++ association ++} ++ ++class icmp_socket ++inherits socket ++{ ++ node_bind ++} ++ ++# ++# The remaining network socket classes were previously ++# mapped to the socket class and therefore have the ++# same definition as socket. ++# ++ ++class ax25_socket ++inherits socket ++ ++class ipx_socket ++inherits socket ++ ++class netrom_socket ++inherits socket ++ ++class bridge_socket ++inherits socket ++ ++class atmpvc_socket ++inherits socket ++ ++class x25_socket ++inherits socket ++ ++class rose_socket ++inherits socket ++ ++class decnet_socket ++inherits socket ++ ++class atmsvc_socket ++inherits socket ++ ++class rds_socket ++inherits socket ++ ++class irda_socket ++inherits socket ++ ++class pppox_socket ++inherits socket ++ ++class llc_socket ++inherits socket ++ ++class ib_socket ++inherits socket ++ ++class mpls_socket ++inherits socket ++ ++class can_socket ++inherits socket ++ ++class tipc_socket ++inherits socket ++ ++class bluetooth_socket ++inherits socket ++ ++class iucv_socket ++inherits socket ++ ++class rxrpc_socket ++inherits socket ++ ++class isdn_socket ++inherits socket ++ ++class phonet_socket ++inherits socket ++ ++class ieee802154_socket ++inherits socket ++ ++class caif_socket ++inherits socket ++ ++class alg_socket ++inherits socket ++ ++class nfc_socket ++inherits socket ++ ++class vsock_socket ++inherits socket ++ ++class kcm_socket ++inherits socket ++ ++class qipcrtr_socket ++inherits socket ++ ++class smc_socket ++inherits socket ++ ++class bpf ++{ ++ map_create ++ map_read ++ map_write ++ prog_load ++ prog_run ++} +diff --git a/policy/flask/security_classes b/policy/flask/security_classes +index 14a4799114..918ad2d9bc 100644 +--- a/policy/flask/security_classes ++++ b/policy/flask/security_classes +@@ -121,14 +121,81 @@ class kernel_service + + class tun_socket + ++class binder ++ ++# Updated netlink classes for more recent netlink protocols. ++class netlink_iscsi_socket ++class netlink_fib_lookup_socket ++class netlink_connector_socket ++class netlink_netfilter_socket ++class netlink_generic_socket ++class netlink_scsitransport_socket ++class netlink_rdma_socket ++class netlink_crypto_socket ++ + # Still More SE-X Windows stuff + class x_pointer # userspace + class x_keyboard # userspace + ++# Infiniband ++class infiniband_pkey ++class infiniband_endport ++ + # More Database stuff + class db_schema # userspace + class db_view # userspace + class db_sequence # userspace + class db_language # userspace + ++# systemd services ++class service ++ ++# gssd services ++class proxy ++ ++ ++# Capability checks when on a non-init user namespace ++class cap_userns ++class cap2_userns ++ ++class process2 ++ ++# New socket classes introduced by extended_socket_class policy capability. ++# These two were previously mapped to rawip_socket. ++class sctp_socket ++class icmp_socket ++# These were previously mapped to socket. ++class ax25_socket ++class ipx_socket ++class netrom_socket ++class bridge_socket ++class atmpvc_socket ++class x25_socket ++class rose_socket ++class decnet_socket ++class atmsvc_socket ++class rds_socket ++class irda_socket ++class pppox_socket ++class llc_socket ++class ib_socket ++class mpls_socket ++class can_socket ++class tipc_socket ++class bluetooth_socket ++class iucv_socket ++class rxrpc_socket ++class isdn_socket ++class phonet_socket ++class ieee802154_socket ++class caif_socket ++class alg_socket ++class nfc_socket ++class vsock_socket ++class kcm_socket ++class qipcrtr_socket ++class smc_socket ++ ++class bpf ++ + # FLASK +diff --git a/policy/global_booleans b/policy/global_booleans +index 66e85ea545..d02654d7f4 100644 +--- a/policy/global_booleans ++++ b/policy/global_booleans +@@ -6,7 +6,7 @@ + + ## + ##

+-## Enabling secure mode disallows programs, such as ++## disallow programs, such as + ## newrole, from transitioning to administrative + ## user domains. + ##

+diff --git a/policy/global_tunables b/policy/global_tunables +index 4705ab6187..b82865c432 100644 +--- a/policy/global_tunables ++++ b/policy/global_tunables +@@ -4,54 +4,61 @@ + # file should be used. + # + ++## ++##

++## Deny any process from ptracing or debugging any other processes. ++##

++##
++gen_tunable(deny_ptrace, false) ++ + ## + ##

+ ## Allow unconfined executables to make their heap memory executable. Doing this is a really bad idea. Probably indicates a badly coded executable, but could indicate an attack. This executable should be reported in bugzilla + ##

+ ##
+-gen_tunable(allow_execheap,false) ++gen_tunable(selinuxuser_execheap,false) + + ## + ##

+-## Allow unconfined executables to map a memory region as both executable and writable, this is dangerous and the executable should be reported in bugzilla") ++## Deny user domains applications to map a memory region as both executable and writable, this is dangerous and the executable should be reported in bugzilla + ##

+ ##
+-gen_tunable(allow_execmem,false) ++gen_tunable(deny_execmem,false) + + ## + ##

+-## Allow all unconfined executables to use libraries requiring text relocation that are not labeled textrel_shlib_t") ++## Allow all unconfined executables to use libraries requiring text relocation that are not labeled textrel_shlib_t + ##

+ ##
+-gen_tunable(allow_execmod,false) ++gen_tunable(selinuxuser_execmod,false) + + ## + ##

+-## Allow unconfined executables to make their stack executable. This should never, ever be necessary. Probably indicates a badly coded executable, but could indicate an attack. This executable should be reported in bugzilla") ++## Allow unconfined executables to make their stack executable. This should never, ever be necessary. Probably indicates a badly coded executable, but could indicate an attack. This executable should be reported in bugzilla + ##

+ ##
+-gen_tunable(allow_execstack,false) ++gen_tunable(selinuxuser_execstack,false) + + ## + ##

+ ## Enable polyinstantiated directory support. + ##

+ ##
+-gen_tunable(allow_polyinstantiation,false) ++gen_tunable(polyinstantiation_enabled,false) + + ## + ##

+ ## Allow system to run with NIS + ##

+ ##
+-gen_tunable(allow_ypbind,false) ++gen_tunable(nis_enabled,false) + + ## + ##

+ ## Allow logging in and using the system from /dev/console. + ##

+ ##
+-gen_tunable(console_login,true) ++gen_tunable(login_console_enabled,true) + + ## + ##

+@@ -66,15 +73,6 @@ gen_tunable(console_login,true) + ## + gen_tunable(global_ssp,false) + +-## +-##

+-## Allow email client to various content. +-## nfs, samba, removable devices, and user temp +-## files +-##

+-##
+-gen_tunable(mail_read_content,false) +- + ## + ##

+ ## Allow any files/directories to be exported read/write via NFS. +@@ -103,6 +101,20 @@ gen_tunable(use_nfs_home_dirs,false) + ## + gen_tunable(use_samba_home_dirs,false) + ++## ++##

++## Support ecryptfs home directories ++##

++##
++gen_tunable(use_ecryptfs_home_dirs,false) ++ ++## ++##

++## Support fusefs home directories ++##

++##
++gen_tunable(use_fusefs_home_dirs,false) ++ + ## + ##

+ ## Allow users to run TCP servers (bind to ports and accept connection from +@@ -110,4 +122,20 @@ gen_tunable(use_samba_home_dirs,false) + ## and may change other protocols. + ##

+ ##
+-gen_tunable(user_tcp_server,false) ++gen_tunable(selinuxuser_tcp_server,false) ++ ++## ++##

++## Allow users to run UDP servers (bind to ports and accept connection from ++## the same domain and outside users) disabling this may break avahi ++## discovering services on the network and other udp related services. ++##

++##
++gen_tunable(selinuxuser_udp_server,false) ++ ++## ++##

++## Allow the mount commands to mount any directory or file. ++##

++##
++gen_tunable(mount_anyfile, false) +diff --git a/policy/mcs b/policy/mcs +index 216b3d1254..ba9e2ee166 100644 +--- a/policy/mcs ++++ b/policy/mcs +@@ -1,4 +1,6 @@ + ifdef(`enable_mcs',` ++default_range dir_file_class_set target low; ++ + # + # Define sensitivities + # +@@ -69,58 +71,61 @@ gen_levels(1,mcs_num_cats) + # - /proc/pid operations are not constrained. + + mlsconstrain file { read ioctl lock execute execute_no_trans } +- (( h1 dom h2 ) or ( t1 == mcsreadall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain file { write setattr append unlink link rename } +- (( h1 dom h2 ) or ( t1 == mcswriteall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain dir { search read ioctl lock } +- (( h1 dom h2 ) or ( t1 == mcsreadall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain dir { write setattr append unlink link rename add_name remove_name } +- (( h1 dom h2 ) or ( t1 == mcswriteall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain fifo_file { open } +- (( h1 dom h2 ) or ( t1 == mcsreadall ) or +- (( t1 != mcs_constrained_type ) and ( t2 == domain ))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain { lnk_file chr_file blk_file sock_file } { getattr read ioctl } +- (( h1 dom h2 ) or ( t1 == mcsreadall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain { lnk_file chr_file blk_file sock_file } { write setattr } +- (( h1 dom h2 ) or ( t1 == mcswriteall ) or +- (( t1 != mcs_constrained_type ) and (t2 == domain))); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); ++ ++mlsconstrain key { create link read search setattr view write } ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); ++ ++mlsconstrain { ipc sem msgq shm } { create destroy setattr write unix_write } ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + # New filesystem object labels must be dominated by the relabeling subject + # clearance, also the objects are single-level. + mlsconstrain file { create relabelto } +- (( h1 dom h2 ) and ( l2 eq h2 )); ++ ((( h1 dom h2 ) and ( l2 eq h2 )) or ++ ( t1 != mcs_constrained_type )); + + # new file labels must be dominated by the relabeling subject clearance + mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } { relabelfrom } +- ( h1 dom h2 ); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); ++ ++mlsconstrain { file lnk_file fifo_file } { create relabelto } ++ (( l2 eq h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } { create relabelto } +- (( h1 dom h2 ) and ( l2 eq h2 )); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain process { transition dyntransition } +- (( h1 dom h2 ) or ( t1 == mcssetcats )); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain process { ptrace } +- (( h1 dom h2) or ( t1 == mcsptraceall )); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain process { sigkill sigstop } +- (( h1 dom h2 ) or ( t1 == mcskillall )); ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + mlsconstrain process { signal } + (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + +-mlsconstrain { tcp_socket udp_socket rawip_socket } node_bind ++mlsconstrain { tcp_socket udp_socket rawip_socket sctp_socket } node_bind + (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); + + # +@@ -135,6 +140,9 @@ mlsconstrain { db_database db_schema db_table db_sequence db_view db_procedure d + mlsconstrain { db_tuple } { insert relabelto } + (( h1 dom h2 ) and ( l2 eq h2 )); + ++mlsconstrain context contains ++ (( h1 dom h2 ) and ( l1 domby l2)); ++ + # Access control for any database objects based on MCS rules. + mlsconstrain db_database { drop getattr setattr relabelfrom access install_module load_module get_param set_param } + ( h1 dom h2 ); +@@ -166,4 +174,23 @@ mlsconstrain db_language { drop getattr setattr relabelfrom execute } + mlsconstrain db_blob { drop getattr setattr relabelfrom read write import export } + ( h1 dom h2 ); + ++mlsconstrain { tcp_socket udp_socket rawip_socket } node_bind ++ (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); ++ ++# the node recvfrom/sendto ops, the recvfrom permission is a "write" operation ++# because the subject in this particular case is the remote domain which is ++# writing data out the network node which is acting as the object ++mlsconstrain { node } { recvfrom sendto } ++ (( l1 dom l2 ) or (t1 != mcs_constrained_type)); ++ ++mlsconstrain { packet peer } { recv } ++ (( l1 dom l2 ) or ++ ((t1 != mcs_constrained_type) and (t2 != mcs_constrained_type))); ++ ++# the netif ingress/egress ops, the ingress permission is a "write" operation ++# because the subject in this particular case is the remote domain which is ++# writing data out the network interface which is acting as the object ++mlsconstrain { netif } { egress ingress } ++ (( l1 dom l2 ) or (t1 != mcs_constrained_type)); ++ + ') dnl end enable_mcs +diff --git a/policy/mls b/policy/mls +index f11e5e2b7b..c862bbe899 100644 +--- a/policy/mls ++++ b/policy/mls +@@ -70,7 +70,9 @@ mlsconstrain { file lnk_file fifo_file } { create relabelto } + + # new file labels must be dominated by the relabeling subjects clearance + mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } relabelto +- ( h1 dom h2 ); ++ (( h1 dom h2 ) or ++ (( t1 == mlsfilerelabeltoclr ) and ( h1 dom l2 )) or ++ ( t1 == mlsfilewrite )); + + # the file "read" ops (note the check is dominance of the low level) + mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } { read getattr execute } +@@ -156,21 +158,18 @@ mlsconstrain filesystem { mount remount unmount relabelfrom quotamod } + # these access vectors have no MLS restrictions + # filesystem { transition associate } + +- +- +- + # + # MLS policy for the socket classes + # + + # new socket labels must be dominated by the relabeling subjects clearance +-mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } relabelto ++mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket netlink_iscsi_socket netlink_fib_lookup_socket netlink_connector_socket netlink_netfilter_socket netlink_generic_socket netlink_scsitransport_socket netlink_rdma_socket netlink_crypto_socket sctp_socket } relabelto + ( h1 dom h2 ); + + # the socket "read+write" ops + # (Socket FDs are generally bidirectional, equivalent to open(..., O_RDWR), + # require equal levels for unprivileged subjects, or read *and* write overrides) +-mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } { accept connect } ++mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket sctp_socket } { accept connect } + (( l1 eq l2 ) or + (((( t1 == mlsnetreadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsnetread )) and +@@ -180,7 +179,7 @@ mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_s + + + # the socket "read" ops (note the check is dominance of the low level) +-mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } { read getattr listen accept getopt recv_msg } ++mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket netlink_iscsi_socket netlink_fib_lookup_socket netlink_connector_socket netlink_netfilter_socket netlink_generic_socket netlink_scsitransport_socket netlink_rdma_socket netlink_crypto_socket sctp_socket } { read getattr listen accept getopt recv_msg } + (( l1 dom l2 ) or + (( t1 == mlsnetreadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsnetread )); +@@ -191,14 +190,15 @@ mlsconstrain { netlink_route_socket netlink_firewall_socket netlink_tcpdiag_sock + ( t1 == mlsnetread )); + + # the socket "write" ops +-mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } { write setattr relabelfrom connect setopt shutdown } ++mlsconstrain { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket netlink_iscsi_socket netlink_fib_lookup_socket netlink_connector_socket netlink_netfilter_socket netlink_generic_socket netlink_scsitransport_socket netlink_rdma_socket netlink_crypto_socket sctp_socket } { write setattr relabelfrom connect setopt shutdown } + (( l1 eq l2 ) or + (( t1 == mlsnetwriteranged ) and ( l1 dom l2 ) and ( l1 domby h2 )) or + (( t1 == mlsnetwritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or +- ( t1 == mlsnetwrite )); ++ ( t1 == mlsnetwrite ) or ++ ( t2 == mlstrustedobject )); + + # used by netlabel to restrict normal domains to same level connections +-mlsconstrain { tcp_socket udp_socket rawip_socket } recvfrom ++mlsconstrain { tcp_socket udp_socket rawip_socket sctp_socket } recvfrom + (( l1 eq l2 ) or + (( t1 == mlsnetreadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsnetread )); +@@ -219,13 +219,13 @@ mlsconstrain unix_dgram_socket sendto + ( t2 == mlstrustedobject )); + + # these access vectors have no MLS restrictions +-# { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } { ioctl create lock append bind sendto send_msg name_bind } ++# { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket sctp_socket } { ioctl create lock append bind sendto send_msg name_bind } + # +-# { tcp_socket udp_socket rawip_socket } node_bind ++# { tcp_socket udp_socket rawip_socket sctp_socket } node_bind + # +-# { tcp_socket unix_stream_socket } { connectto newconn acceptfrom } ++# { tcp_socket unix_stream_socket sctp_socket } { connectto newconn acceptfrom } + # +-# tcp_socket name_connect ++# { tcp_socket sctp_socket } name_connect + # + # { netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_xfrm_socket netlink_audit_socket netlink_ip6fw_socket } nlmsg_write + # +@@ -252,6 +252,11 @@ mlsconstrain msg receive + (( t1 == mlsipcreadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsipcread )); + ++mlsconstrain key { create link read search setattr view write } ++ (( l1 eq l2 ) or ++ (( t1 == mlsprocwritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or ++ ( t1 == mlsprocwrite )); ++ + # the ipc "write" ops (implicit single level) + mlsconstrain { ipc sem msgq shm } { create destroy setattr write unix_write } + (( l1 eq l2 ) or +@@ -361,9 +366,6 @@ mlsconstrain { peer packet } { recv } + (( t1 == mlsnetreadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsnetread )); + +- +- +- + # + # MLS policy for the process class + # +@@ -763,13 +765,14 @@ mlsconstrain context contains + # + + # make sure these database classes are "single level" +-mlsconstrain { db_database db_schema db_table db_sequence db_view db_procedure db_language db_column db_blob } { create relabelto } ++mlsconstrain { db_sequence db_view db_procedure db_language db_blob } { create relabelto } + ( l2 eq h2 ); ++ + mlsconstrain { db_tuple } { insert relabelto } + ( l2 eq h2 ); + + # new database labels must be dominated by the relabeling subjects clearance +-mlsconstrain { db_database db_schema db_table db_sequence db_view db_procedure db_language db_column db_tuple db_blob } { relabelto } ++mlsconstrain { db_database db_schema db_table db_column } { relabelto } + ( h1 dom h2 ); + + # the database "read" ops (note the check is dominance of the low level) +@@ -833,7 +836,7 @@ mlsconstrain { db_tuple } { use select } + ( t1 == mlsdbread ) or + ( t2 == mlstrustedobject )); + +-# the "single level" file "write" ops ++# the "single level" database "write" ops + mlsconstrain { db_database } { create drop setattr relabelfrom install_module load_module set_param } + (( l1 eq l2 ) or + (( t1 == mlsdbwritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or +diff --git a/policy/modules/admin/bootloader.fc b/policy/modules/admin/bootloader.fc +index 2626ebf954..5745bb240e 100644 +--- a/policy/modules/admin/bootloader.fc ++++ b/policy/modules/admin/bootloader.fc +@@ -1,11 +1,16 @@ ++/etc/default/grub -- gen_context(system_u:object_r:bootloader_etc_t,s0) ++/etc/lilo\.conf.* gen_context(system_u:object_r:bootloader_etc_t,s0) ++/etc/yaboot\.conf.* gen_context(system_u:object_r:bootloader_etc_t,s0) ++/etc/zipl\.conf.* gen_context(system_u:object_r:bootloader_etc_t,s0) + +-/etc/lilo\.conf.* -- gen_context(system_u:object_r:bootloader_etc_t,s0) +-/etc/yaboot\.conf.* -- gen_context(system_u:object_r:bootloader_etc_t,s0) +- +-/sbin/grub -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/sbin/grub.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) + /sbin/lilo.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) + /sbin/ybin.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/sbin/zipl -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++ ++/usr/sbin/grub.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/usr/sbin/lilo.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/usr/sbin/ybin.* -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/usr/sbin/zipl -- gen_context(system_u:object_r:bootloader_exec_t,s0) + +-/usr/sbin/grub -- gen_context(system_u:object_r:bootloader_exec_t,s0) +-/usr/sbin/grub2-bios-setup -- gen_context(system_u:object_r:bootloader_exec_t,s0) +-/usr/sbin/grub2-probe -- gen_context(system_u:object_r:bootloader_exec_t,s0) ++/var/lib/os-prober(/.*)? gen_context(system_u:object_r:bootloader_var_lib_t,s0) +diff --git a/policy/modules/admin/bootloader.if b/policy/modules/admin/bootloader.if +index cc8df9d7db..90467f3af3 100644 +--- a/policy/modules/admin/bootloader.if ++++ b/policy/modules/admin/bootloader.if +@@ -19,6 +19,24 @@ interface(`bootloader_domtrans',` + domtrans_pattern($1, bootloader_exec_t, bootloader_t) + ') + ++###################################### ++## ++## Execute bootloader in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bootloader_exec',` ++ gen_require(` ++ type bootloader_exec_t; ++ ') ++ ++ can_exec($1, bootloader_exec_t) ++') ++ + ######################################## + ## + ## Execute bootloader interactively and do +@@ -38,16 +56,18 @@ interface(`bootloader_domtrans',` + # + interface(`bootloader_run',` + gen_require(` ++ type bootloader_t; + attribute_role bootloader_roles; + ') + + bootloader_domtrans($1) + roleattribute $2 bootloader_roles; ++ + ') + + ######################################## + ## +-## Execute bootloader in the caller domain. ++## Read the bootloader configuration file. + ## + ## + ## +@@ -55,36 +75,37 @@ interface(`bootloader_run',` + ## + ## + # +-interface(`bootloader_exec',` ++interface(`bootloader_read_config',` + gen_require(` +- type bootloader_exec_t; ++ type bootloader_etc_t; + ') + +- corecmd_search_bin($1) +- can_exec($1, bootloader_exec_t) ++ allow $1 bootloader_etc_t:file read_file_perms; + ') + + ######################################## + ## +-## Read the bootloader configuration file. ++## Read and write the bootloader ++## configuration file. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`bootloader_read_config',` ++interface(`bootloader_rw_config',` + gen_require(` + type bootloader_etc_t; + ') + +- allow $1 bootloader_etc_t:file read_file_perms; ++ allow $1 bootloader_etc_t:file rw_file_perms; + ') + + ######################################## + ## +-## Read and write the bootloader ++## Manage the bootloader + ## configuration file. + ## + ## +@@ -94,12 +115,12 @@ interface(`bootloader_read_config',` + ## + ## + # +-interface(`bootloader_rw_config',` ++interface(`bootloader_manage_config',` + gen_require(` + type bootloader_etc_t; + ') + +- allow $1 bootloader_etc_t:file rw_file_perms; ++ manage_files_pattern($1, bootloader_etc_t, bootloader_etc_t) + ') + + ######################################## +@@ -119,7 +140,7 @@ interface(`bootloader_rw_tmp_files',` + ') + + files_search_tmp($1) +- allow $1 bootloader_tmp_t:file rw_file_perms; ++ allow $1 bootloader_tmp_t:file rw_inherited_file_perms; + ') + + ######################################## +@@ -141,3 +162,24 @@ interface(`bootloader_create_runtime_file',` + allow $1 boot_runtime_t:file { create_file_perms rw_file_perms }; + files_boot_filetrans($1, boot_runtime_t, file) + ') ++ ++######################################## ++## ++## Type transition files created in /etc ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bootloader_filetrans_config',` ++ gen_require(` ++ type bootloader_etc_t; ++ ') ++ ++ files_etc_filetrans($1,bootloader_etc_t,file, "grub") ++ files_etc_filetrans($1,bootloader_etc_t,file, "lilo.conf") ++ files_etc_filetrans($1,bootloader_etc_t,file, "yaboot.conf") ++ files_etc_filetrans($1,bootloader_etc_t,file, "zipl.conf") ++') +diff --git a/policy/modules/admin/bootloader.te b/policy/modules/admin/bootloader.te +index 0fd5c5f2eb..a14addb410 100644 +--- a/policy/modules/admin/bootloader.te ++++ b/policy/modules/admin/bootloader.te +@@ -20,13 +20,20 @@ type bootloader_t; + type bootloader_exec_t; + application_domain(bootloader_t, bootloader_exec_t) + role bootloader_roles types bootloader_t; ++role system_r types bootloader_t; ++ ++type bootloader_var_run_t; ++files_pid_file(bootloader_var_run_t) ++ ++type bootloader_var_lib_t; ++files_type(bootloader_var_lib_t) + + # + # bootloader_etc_t is the configuration file, + # grub.conf, lilo.conf, etc. + # + type bootloader_etc_t alias etc_bootloader_t; +-files_type(bootloader_etc_t) ++files_config_file(bootloader_etc_t) + + # + # The temp file is used for initrd creation; +@@ -41,7 +48,7 @@ dev_node(bootloader_tmp_t) + # bootloader local policy + # + +-allow bootloader_t self:capability { dac_override dac_read_search fsetid sys_rawio sys_admin mknod chown }; ++allow bootloader_t self:capability { dac_override dac_read_search fsetid sys_rawio sys_admin sys_chroot mknod chown }; + allow bootloader_t self:process { signal_perms execmem }; + allow bootloader_t self:fifo_file rw_fifo_file_perms; + +@@ -59,6 +66,15 @@ files_tmp_filetrans(bootloader_t, bootloader_tmp_t, { dir file lnk_file chr_file + # for tune2fs (cjp: ?) + files_root_filetrans(bootloader_t, bootloader_tmp_t, file) + ++manage_dirs_pattern(bootloader_t, bootloader_var_run_t, bootloader_var_run_t) ++manage_files_pattern(bootloader_t, bootloader_var_run_t, bootloader_var_run_t) ++files_pid_filetrans(bootloader_t, bootloader_var_run_t, {dir file }) ++ ++manage_dirs_pattern(bootloader_t, bootloader_var_lib_t, bootloader_var_lib_t) ++manage_files_pattern(bootloader_t, bootloader_var_lib_t, bootloader_var_lib_t) ++manage_lnk_files_pattern(bootloader_t, bootloader_var_lib_t, bootloader_var_lib_t) ++files_var_lib_filetrans(bootloader_t, bootloader_var_lib_t, {dir file }) ++ + kernel_getattr_core_if(bootloader_t) + kernel_read_network_state(bootloader_t) + kernel_read_system_state(bootloader_t) +@@ -81,6 +97,8 @@ dev_rw_nvram(bootloader_t) + + fs_getattr_xattr_fs(bootloader_t) + fs_getattr_tmpfs(bootloader_t) ++fs_list_hugetlbfs(bootloader_t) ++fs_list_tmpfs(bootloader_t) + fs_read_tmpfs_symlinks(bootloader_t) + #Needed for ia64 + fs_manage_dos_files(bootloader_t) +@@ -89,7 +107,10 @@ mls_file_read_all_levels(bootloader_t) + mls_file_write_all_levels(bootloader_t) + + term_getattr_all_ttys(bootloader_t) ++term_getattr_all_ptys(bootloader_t) + term_dontaudit_manage_pty_dirs(bootloader_t) ++term_dontaudit_getattr_generic_ptys(bootloader_t) ++term_use_unallocated_ttys(bootloader_t) + + corecmd_exec_all_executables(bootloader_t) + +@@ -98,12 +119,14 @@ domain_use_interactive_fds(bootloader_t) + files_create_boot_dirs(bootloader_t) + files_manage_boot_files(bootloader_t) + files_manage_boot_symlinks(bootloader_t) ++files_manage_kernel_modules(bootloader_t) + files_read_etc_files(bootloader_t) + files_exec_etc_files(bootloader_t) + files_read_usr_src_files(bootloader_t) + files_read_usr_files(bootloader_t) + files_read_var_files(bootloader_t) + files_read_kernel_modules(bootloader_t) ++files_read_kernel_symbol_table(bootloader_t) + # for nscd + files_dontaudit_search_pids(bootloader_t) + # for blkid.tab +@@ -111,6 +134,8 @@ files_manage_etc_runtime_files(bootloader_t) + files_etc_filetrans_etc_runtime(bootloader_t, file) + files_dontaudit_search_home(bootloader_t) + ++ ++init_read_state(bootloader_t) + init_getattr_initctl(bootloader_t) + init_use_script_ptys(bootloader_t) + init_use_script_fds(bootloader_t) +@@ -118,19 +143,20 @@ init_rw_script_pipes(bootloader_t) + + libs_read_lib_files(bootloader_t) + libs_exec_lib_files(bootloader_t) ++libs_exec_ld_so(bootloader_t) + +-logging_send_syslog_msg(bootloader_t) +-logging_rw_generic_logs(bootloader_t) ++auth_use_nsswitch(bootloader_t) + +-miscfiles_read_localization(bootloader_t) ++logging_send_syslog_msg(bootloader_t) ++logging_manage_generic_logs(bootloader_t) + + modutils_domtrans_insmod(bootloader_t) + + seutil_read_bin_policy(bootloader_t) + seutil_read_loadpolicy(bootloader_t) +-seutil_dontaudit_search_config(bootloader_t) + +-userdom_use_user_terminals(bootloader_t) ++userdom_getattr_user_tmp_files(bootloader_t) ++userdom_use_inherited_user_terminals(bootloader_t) + userdom_dontaudit_search_user_home_dirs(bootloader_t) + + ifdef(`distro_debian',` +@@ -173,6 +199,10 @@ ifdef(`distro_redhat',` + ') + ') + ++optional_policy(` ++ devicekit_dontaudit_read_pid_files(bootloader_t) ++') ++ + optional_policy(` + fstools_exec(bootloader_t) + ') +@@ -182,6 +212,14 @@ optional_policy(` + hal_write_log(bootloader_t) + ') + ++optional_policy(` ++ gpm_getattr_gpmctl(bootloader_t) ++') ++ ++optional_policy(` ++ fsadm_manage_pid(bootloader_t) ++') ++ + optional_policy(` + kudzu_domtrans(bootloader_t) + ') +@@ -194,18 +232,19 @@ optional_policy(` + ') + + optional_policy(` +- modutils_exec_insmod(bootloader_t) +- modutils_read_module_deps(bootloader_t) +- modutils_read_module_config(bootloader_t) + modutils_exec_insmod(bootloader_t) + modutils_exec_depmod(bootloader_t) + modutils_exec_update_mods(bootloader_t) ++ modutils_domtrans_insmod_uncond(bootloader_t) ++ modutils_list_module_config(bootloader_t) ++ modutils_read_module_deps(bootloader_t) ++ modutils_read_module_config(bootloader_t) + ') + + optional_policy(` +- nscd_use(bootloader_t) ++ rpm_rw_pipes(bootloader_t) + ') + + optional_policy(` +- rpm_rw_pipes(bootloader_t) ++ udev_read_pid_files(bootloader_t) + ') +diff --git a/policy/modules/admin/consoletype.fc b/policy/modules/admin/consoletype.fc +index b7f053bf6d..5d4fc31883 100644 +--- a/policy/modules/admin/consoletype.fc ++++ b/policy/modules/admin/consoletype.fc +@@ -1,2 +1,4 @@ + + /sbin/consoletype -- gen_context(system_u:object_r:consoletype_exec_t,s0) ++ ++/usr/sbin/consoletype -- gen_context(system_u:object_r:consoletype_exec_t,s0) +diff --git a/policy/modules/admin/consoletype.if b/policy/modules/admin/consoletype.if +index 0f57d3bc02..655d07f013 100644 +--- a/policy/modules/admin/consoletype.if ++++ b/policy/modules/admin/consoletype.if +@@ -19,10 +19,6 @@ interface(`consoletype_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, consoletype_exec_t, consoletype_t) +- +- ifdef(`hide_broken_symptoms', ` +- dontaudit consoletype_t $1:socket_class_set { read write }; +- ') + ') + + ######################################## +diff --git a/policy/modules/admin/consoletype.te b/policy/modules/admin/consoletype.te +index cd5e005ce8..247259ac46 100644 +--- a/policy/modules/admin/consoletype.te ++++ b/policy/modules/admin/consoletype.te +@@ -7,8 +7,8 @@ policy_module(consoletype, 1.10.0) + + type consoletype_t; + type consoletype_exec_t; +-init_domain(consoletype_t, consoletype_exec_t) +-init_system_domain(consoletype_t, consoletype_exec_t) ++application_domain(consoletype_t, consoletype_exec_t) ++role system_r types consoletype_t; + + ######################################## + # +@@ -47,14 +47,16 @@ fs_list_inotifyfs(consoletype_t) + mls_file_read_all_levels(consoletype_t) + mls_file_write_all_levels(consoletype_t) + +-term_use_all_terms(consoletype_t) ++term_use_all_inherited_terms(consoletype_t) ++term_use_ptmx(consoletype_t) + + init_use_fds(consoletype_t) + init_use_script_ptys(consoletype_t) + init_use_script_fds(consoletype_t) + init_rw_script_pipes(consoletype_t) ++init_rw_inherited_script_tmp_files(consoletype_t) + +-userdom_use_user_terminals(consoletype_t) ++userdom_use_inherited_user_terminals(consoletype_t) + + ifdef(`distro_redhat',` + fs_rw_tmpfs_chr_files(consoletype_t) +@@ -79,16 +81,14 @@ optional_policy(` + ') + + optional_policy(` +- files_read_etc_files(consoletype_t) +- firstboot_use_fds(consoletype_t) +- firstboot_rw_pipes(consoletype_t) ++ devicekit_dontaudit_read_pid_files(consoletype_t) ++ devicekit_dontaudit_rw_log(consoletype_t) + ') + + optional_policy(` +- hal_dontaudit_use_fds(consoletype_t) +- hal_dontaudit_rw_pipes(consoletype_t) +- hal_dontaudit_rw_dgram_sockets(consoletype_t) +- hal_dontaudit_write_log(consoletype_t) ++ files_read_etc_files(consoletype_t) ++ firstboot_use_fds(consoletype_t) ++ firstboot_rw_pipes(consoletype_t) + ') + + optional_policy(` +@@ -114,6 +114,7 @@ optional_policy(` + + optional_policy(` + userdom_use_unpriv_users_fds(consoletype_t) ++ userdom_dontaudit_rw_dgram_socket(consoletype_t) + ') + + optional_policy(` +diff --git a/policy/modules/admin/dmesg.fc b/policy/modules/admin/dmesg.fc +index d6cc2d9709..0685b190d9 100644 +--- a/policy/modules/admin/dmesg.fc ++++ b/policy/modules/admin/dmesg.fc +@@ -1,2 +1,4 @@ + + /bin/dmesg -- gen_context(system_u:object_r:dmesg_exec_t,s0) ++ ++/usr/bin/dmesg -- gen_context(system_u:object_r:dmesg_exec_t,s0) +diff --git a/policy/modules/admin/dmesg.te b/policy/modules/admin/dmesg.te +index 72bc6d8159..bb4a6f0d76 100644 +--- a/policy/modules/admin/dmesg.te ++++ b/policy/modules/admin/dmesg.te +@@ -9,6 +9,10 @@ type dmesg_t; + type dmesg_exec_t; + init_system_domain(dmesg_t, dmesg_exec_t) + ++ifdef(`enable_mls',` ++ init_ranged_daemon_domain(dmesg_t, dmesg_exec_t, mls_systemhigh) ++') ++ + ######################################## + # + # Local policy +@@ -19,14 +23,18 @@ dontaudit dmesg_t self:capability sys_tty_config; + + allow dmesg_t self:process signal_perms; + ++kernel_read_system_state(dmesg_t) + kernel_read_kernel_sysctls(dmesg_t) + kernel_read_ring_buffer(dmesg_t) + kernel_clear_ring_buffer(dmesg_t) + kernel_change_ring_buffer_level(dmesg_t) + kernel_list_proc(dmesg_t) + kernel_read_proc_symlinks(dmesg_t) ++kernel_dontaudit_write_kernel_sysctl(dmesg_t) + + dev_read_sysfs(dmesg_t) ++dev_read_kmsg(dmesg_t) ++dev_read_raw_memory(dmesg_t) + + fs_search_auto_mountpoints(dmesg_t) + +@@ -44,10 +52,14 @@ init_use_script_ptys(dmesg_t) + logging_send_syslog_msg(dmesg_t) + logging_write_generic_logs(dmesg_t) + +-miscfiles_read_localization(dmesg_t) ++miscfiles_read_hwdata(dmesg_t) + + userdom_dontaudit_use_unpriv_user_fds(dmesg_t) +-userdom_use_user_terminals(dmesg_t) ++userdom_use_inherited_user_terminals(dmesg_t) ++ ++optional_policy(` ++ abrt_rw_inherited_cache(dmesg_t) ++') + + optional_policy(` + seutil_sigchld_newrole(dmesg_t) +diff --git a/policy/modules/admin/netutils.fc b/policy/modules/admin/netutils.fc +index 407078f4bc..1a09bead74 100644 +--- a/policy/modules/admin/netutils.fc ++++ b/policy/modules/admin/netutils.fc +@@ -1,15 +1,22 @@ + /bin/ping.* -- gen_context(system_u:object_r:ping_exec_t,s0) +-/bin/tracepath.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) ++/bin/tracepath.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) + /bin/traceroute.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) + + /sbin/arping -- gen_context(system_u:object_r:netutils_exec_t,s0) + + /usr/bin/lft -- gen_context(system_u:object_r:traceroute_exec_t,s0) ++/usr/bin/mtr -- gen_context(system_u:object_r:traceroute_exec_t,s0) + /usr/bin/nmap -- gen_context(system_u:object_r:traceroute_exec_t,s0) ++/usr/bin/ping.* -- gen_context(system_u:object_r:ping_exec_t,s0) ++/usr/bin/tracepath.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) + /usr/bin/traceroute.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) + +-/usr/sbin/fping -- gen_context(system_u:object_r:ping_exec_t,s0) ++/usr/lib/heartbeat/send_arp -- gen_context(system_u:object_r:ping_exec_t,s0) ++ ++/usr/sbin/arping -- gen_context(system_u:object_r:netutils_exec_t,s0) ++/usr/sbin/fping.* -- gen_context(system_u:object_r:ping_exec_t,s0) + /usr/sbin/traceroute.* -- gen_context(system_u:object_r:traceroute_exec_t,s0) + /usr/sbin/hping2 -- gen_context(system_u:object_r:ping_exec_t,s0) ++/usr/sbin/mtr -- gen_context(system_u:object_r:traceroute_exec_t,s0) + /usr/sbin/send_arp -- gen_context(system_u:object_r:ping_exec_t,s0) + /usr/sbin/tcpdump -- gen_context(system_u:object_r:netutils_exec_t,s0) +diff --git a/policy/modules/admin/netutils.if b/policy/modules/admin/netutils.if +index c6ca761c9b..6edd674204 100644 +--- a/policy/modules/admin/netutils.if ++++ b/policy/modules/admin/netutils.if +@@ -42,6 +42,7 @@ interface(`netutils_run',` + ') + + netutils_domtrans($1) ++ allow $1 netutils_t:process { signal sigkill }; + role $2 types netutils_t; + ') + +@@ -99,6 +100,7 @@ interface(`netutils_domtrans_ping',` + + corecmd_search_bin($1) + domtrans_pattern($1, ping_exec_t, ping_t) ++ allow $1 ping_exec_t:file map; + ') + + ######################################## +@@ -161,6 +163,7 @@ interface(`netutils_run_ping',` + + netutils_domtrans_ping($1) + role $2 types ping_t; ++ allow $1 ping_t:process { signal sigkill }; + ') + + ######################################## +@@ -183,13 +186,14 @@ interface(`netutils_run_ping',` + interface(`netutils_run_ping_cond',` + gen_require(` + type ping_t; +- bool user_ping; ++ bool selinuxuser_ping; + ') + + role $2 types ping_t; + +- if ( user_ping ) { ++ if ( selinuxuser_ping ) { + netutils_domtrans_ping($1) ++ allow $1 ping_t:process { signal sigkill }; + } + ') + +@@ -254,6 +258,7 @@ interface(`netutils_run_traceroute',` + ') + + netutils_domtrans_traceroute($1) ++ allow $1 traceroute_t:process { signal sigkill }; + role $2 types traceroute_t; + ') + +@@ -277,13 +282,14 @@ interface(`netutils_run_traceroute',` + interface(`netutils_run_traceroute_cond',` + gen_require(` + type traceroute_t; +- bool user_ping; ++ bool selinuxuser_ping; + ') + + role $2 types traceroute_t; + +- if( user_ping ) { ++ if( selinuxuser_ping ) { + netutils_domtrans_traceroute($1) ++ allow $1 traceroute_t:process { signal sigkill }; + } + ') + +diff --git a/policy/modules/admin/netutils.te b/policy/modules/admin/netutils.te +index c44c3592a8..982e33e1ca 100644 +--- a/policy/modules/admin/netutils.te ++++ b/policy/modules/admin/netutils.te +@@ -7,10 +7,10 @@ policy_module(netutils, 1.12.1) + + ## + ##

+-## Control users use of ping and traceroute ++## Allow confined users the ability to execute the ping and traceroute commands. + ##

+ ##
+-gen_tunable(user_ping, false) ++gen_tunable(selinuxuser_ping, false) + + type netutils_t; + type netutils_exec_t; +@@ -33,25 +33,29 @@ init_system_domain(traceroute_t, traceroute_exec_t) + # + + # Perform network administration operations and have raw access to the network. +-allow netutils_t self:capability { dac_read_search net_admin net_raw setuid setgid sys_chroot }; ++allow netutils_t self:capability { chown dac_read_search net_admin net_raw setuid setgid sys_chroot setpcap }; + dontaudit netutils_t self:capability { dac_override sys_tty_config }; + allow netutils_t self:process { setcap signal_perms }; + allow netutils_t self:netlink_route_socket create_netlink_socket_perms; + allow netutils_t self:netlink_socket create_socket_perms; +-allow netutils_t self:packet_socket create_socket_perms; ++# For tcpdump. ++allow netutils_t self:netlink_netfilter_socket create_socket_perms; ++allow netutils_t self:packet_socket { create_socket_perms map }; + allow netutils_t self:udp_socket create_socket_perms; + allow netutils_t self:tcp_socket create_stream_socket_perms; ++allow netutils_t self:bluetooth_socket create_stream_socket_perms; + allow netutils_t self:socket create_socket_perms; ++allow netutils_t self:netlink_socket create_socket_perms; + + manage_dirs_pattern(netutils_t, netutils_tmp_t, netutils_tmp_t) + manage_files_pattern(netutils_t, netutils_tmp_t, netutils_tmp_t) + files_tmp_filetrans(netutils_t, netutils_tmp_t, { file dir }) + + kernel_search_proc(netutils_t) +-kernel_read_network_state(netutils_t) + kernel_read_all_sysctls(netutils_t) ++kernel_read_network_state(netutils_t) ++kernel_request_load_module(netutils_t) + +-corenet_all_recvfrom_unlabeled(netutils_t) + corenet_all_recvfrom_netlabel(netutils_t) + corenet_tcp_sendrecv_generic_if(netutils_t) + corenet_raw_sendrecv_generic_if(netutils_t) +@@ -66,6 +70,10 @@ corenet_sendrecv_all_client_packets(netutils_t) + corenet_udp_bind_generic_node(netutils_t) + + dev_read_sysfs(netutils_t) ++dev_read_usbmon_dev(netutils_t) ++dev_write_usbmon_dev(netutils_t) ++dev_map_usbmon_dev(netutils_t) ++dev_rw_generic_usb_dev(netutils_t) + + fs_getattr_xattr_fs(netutils_t) + +@@ -80,12 +88,12 @@ init_use_script_ptys(netutils_t) + + auth_use_nsswitch(netutils_t) + +-logging_send_syslog_msg(netutils_t) ++libs_use_ld_so(netutils_t) + +-miscfiles_read_localization(netutils_t) ++logging_send_syslog_msg(netutils_t) + + term_dontaudit_use_console(netutils_t) +-userdom_use_user_terminals(netutils_t) ++userdom_use_inherited_user_terminals(netutils_t) + userdom_use_all_users_fds(netutils_t) + + optional_policy(` +@@ -110,11 +118,11 @@ allow ping_t self:capability { setuid net_raw }; + allow ping_t self:process { getcap setcap }; + dontaudit ping_t self:capability sys_tty_config; + allow ping_t self:tcp_socket create_socket_perms; +-allow ping_t self:rawip_socket { create ioctl read write bind getopt setopt }; +-allow ping_t self:packet_socket { create ioctl read write bind getopt setopt }; ++allow ping_t self:rawip_socket create_socket_perms; ++allow ping_t self:packet_socket create_socket_perms; + allow ping_t self:netlink_route_socket create_netlink_socket_perms; ++allow ping_t self:icmp_socket create_socket_perms; + +-corenet_all_recvfrom_unlabeled(ping_t) + corenet_all_recvfrom_netlabel(ping_t) + corenet_tcp_sendrecv_generic_if(ping_t) + corenet_raw_sendrecv_generic_if(ping_t) +@@ -124,6 +132,9 @@ corenet_raw_bind_generic_node(ping_t) + corenet_tcp_sendrecv_all_ports(ping_t) + + fs_dontaudit_getattr_xattr_fs(ping_t) ++fs_dontaudit_rw_anon_inodefs_files(ping_t) ++ ++dev_read_urand(ping_t) + + domain_use_interactive_fds(ping_t) + +@@ -131,14 +142,14 @@ files_read_etc_files(ping_t) + files_dontaudit_search_var(ping_t) + + kernel_read_system_state(ping_t) ++kernel_read_network_state(ping_t) ++kernel_request_load_module(ping_t) + + auth_use_nsswitch(ping_t) + +-logging_send_syslog_msg(ping_t) +- +-miscfiles_read_localization(ping_t) ++init_rw_inherited_script_tmp_files(ping_t) + +-userdom_use_user_terminals(ping_t) ++logging_send_syslog_msg(ping_t) + + ifdef(`hide_broken_symptoms',` + init_dontaudit_use_fds(ping_t) +@@ -146,13 +157,28 @@ ifdef(`hide_broken_symptoms',` + optional_policy(` + nagios_dontaudit_rw_log(ping_t) + nagios_dontaudit_rw_pipes(ping_t) ++ nagios_dontaudit_write_pipes_nrpe(ping_t) + ') + ') + ++term_use_all_inherited_terms(ping_t) ++ ++tunable_policy(`selinuxuser_ping',` ++ term_use_all_ttys(ping_t) ++ term_use_all_ptys(ping_t) ++',` ++ term_dontaudit_use_all_ttys(ping_t) ++ term_dontaudit_use_all_ptys(ping_t) ++') ++ + optional_policy(` + munin_append_log(ping_t) + ') + ++optional_policy(` ++ nagios_rw_inerited_tmp_files(ping_t) ++') ++ + optional_policy(` + pcmcia_use_cardmgr_fds(ping_t) + ') +@@ -161,6 +187,15 @@ optional_policy(` + hotplug_use_fds(ping_t) + ') + ++optional_policy(` ++ openshift_rw_inherited_content(ping_t) ++ openshift_dontaudit_rw_inherited_fifo_files(ping_t) ++') ++ ++optional_policy(` ++ zabbix_read_tmp(ping_t) ++') ++ + ######################################## + # + # Traceroute local policy +@@ -168,13 +203,18 @@ optional_policy(` + + allow traceroute_t self:capability { net_admin net_raw setuid setgid }; + allow traceroute_t self:rawip_socket create_socket_perms; +-allow traceroute_t self:packet_socket create_socket_perms; ++allow traceroute_t self:packet_socket { create_socket_perms map }; + allow traceroute_t self:udp_socket create_socket_perms; ++allow traceroute_t self:sctp_socket create_socket_perms; ++allow traceroute_t self:icmp_socket create_socket_perms; ++allow traceroute_t self:dccp_socket create_socket_perms; + + kernel_read_system_state(traceroute_t) + kernel_read_network_state(traceroute_t) ++kernel_read_net_sysctls(traceroute_t) ++kernel_request_load_module(traceroute_t) ++kernel_search_network_sysctl(traceroute_t) + +-corenet_all_recvfrom_unlabeled(traceroute_t) + corenet_all_recvfrom_netlabel(traceroute_t) + corenet_tcp_sendrecv_generic_if(traceroute_t) + corenet_udp_sendrecv_generic_if(traceroute_t) +@@ -198,6 +238,7 @@ fs_dontaudit_getattr_xattr_fs(traceroute_t) + domain_use_interactive_fds(traceroute_t) + + files_read_etc_files(traceroute_t) ++files_read_usr_files(traceroute_t) + files_dontaudit_search_var(traceroute_t) + + init_use_fds(traceroute_t) +@@ -206,11 +247,17 @@ auth_use_nsswitch(traceroute_t) + + logging_send_syslog_msg(traceroute_t) + +-miscfiles_read_localization(traceroute_t) +- +-userdom_use_user_terminals(traceroute_t) + + #rules needed for nmap + dev_read_rand(traceroute_t) + dev_read_urand(traceroute_t) +-files_read_usr_files(traceroute_t) ++ ++term_use_all_inherited_terms(traceroute_t) ++ ++tunable_policy(`selinuxuser_ping',` ++ term_use_all_ttys(traceroute_t) ++ term_use_all_ptys(traceroute_t) ++',` ++ term_dontaudit_use_all_ttys(traceroute_t) ++ term_dontaudit_use_all_ptys(traceroute_t) ++') +diff --git a/policy/modules/admin/su.fc b/policy/modules/admin/su.fc +index 688abc2ae8..3d89250a69 100644 +--- a/policy/modules/admin/su.fc ++++ b/policy/modules/admin/su.fc +@@ -3,3 +3,4 @@ + + /usr/(local/)?bin/ksu -- gen_context(system_u:object_r:su_exec_t,s0) + /usr/bin/kdesu -- gen_context(system_u:object_r:su_exec_t,s0) ++/usr/bin/su -- gen_context(system_u:object_r:su_exec_t,s0) +diff --git a/policy/modules/admin/su.if b/policy/modules/admin/su.if +index 03ec5cafe9..06bcbf4a5e 100644 +--- a/policy/modules/admin/su.if ++++ b/policy/modules/admin/su.if +@@ -41,13 +41,14 @@ template(`su_restricted_domain_template', ` + + allow $2 $1_su_t:process signal; + +- allow $1_su_t self:capability { audit_control audit_write setuid setgid net_bind_service chown dac_override fowner sys_nice sys_resource }; ++ allow $1_su_t self:capability { audit_control audit_write setuid setgid net_bind_service chown dac_read_search dac_override fowner sys_nice sys_resource }; + dontaudit $1_su_t self:capability sys_tty_config; + allow $1_su_t self:key { search write }; + allow $1_su_t self:process { setexec setsched setrlimit }; + allow $1_su_t self:fifo_file rw_fifo_file_perms; + allow $1_su_t self:netlink_audit_socket { nlmsg_relay create_netlink_socket_perms }; + allow $1_su_t self:unix_stream_socket create_stream_socket_perms; ++ allow $1_su_t self:netlink_selinux_socket create_socket_perms; + + # Transition from the user domain to this domain. + domtrans_pattern($2, su_exec_t, $1_su_t) +@@ -58,6 +59,7 @@ template(`su_restricted_domain_template', ` + allow $2 $1_su_t:fifo_file rw_file_perms; + allow $2 $1_su_t:process sigchld; + ++ kernel_getattr_core_if($1_su_t) + kernel_read_system_state($1_su_t) + kernel_read_kernel_sysctls($1_su_t) + kernel_search_key($1_su_t) +@@ -86,10 +88,10 @@ template(`su_restricted_domain_template', ` + # Write to utmp. + init_rw_utmp($1_su_t) + init_search_script_keys($1_su_t) ++ init_getattr_initctl($1_su_t) + + logging_send_syslog_msg($1_su_t) + +- miscfiles_read_localization($1_su_t) + + ifdef(`distro_redhat',` + # RHEL5 and possibly newer releases incl. Fedora +@@ -119,11 +121,6 @@ template(`su_restricted_domain_template', ` + userdom_spec_domtrans_unpriv_users($1_su_t) + ') + +- ifdef(`hide_broken_symptoms',` +- # dontaudit leaked sockets from parent +- dontaudit $1_su_t $2:socket_class_set { read write }; +- ') +- + optional_policy(` + cron_read_pipes($1_su_t) + ') +@@ -171,15 +168,9 @@ template(`su_role_template',` + domain_interactive_fd($1_su_t) + role $2 types $1_su_t; + +- allow $3 $1_su_t:process signal; +- +- allow $1_su_t self:capability { audit_control audit_write setuid setgid net_bind_service chown dac_override fowner sys_nice sys_resource }; +- dontaudit $1_su_t self:capability sys_tty_config; +- allow $1_su_t self:process { setexec setsched setrlimit }; +- allow $1_su_t self:fifo_file rw_fifo_file_perms; +- allow $1_su_t self:netlink_audit_socket { nlmsg_relay create_netlink_socket_perms }; +- allow $1_su_t self:key { search write }; ++ allow $1_su_t self:netlink_selinux_socket create_socket_perms; + ++ allow $3 $1_su_t:process signal; + allow $1_su_t $3:key search; + + # Transition from the user domain to this domain. +@@ -194,125 +185,16 @@ template(`su_role_template',` + allow $3 $1_su_t:process sigchld; + + kernel_read_system_state($1_su_t) +- kernel_read_kernel_sysctls($1_su_t) +- kernel_search_key($1_su_t) +- kernel_link_key($1_su_t) +- +- # for SSP +- dev_read_urand($1_su_t) +- +- fs_search_auto_mountpoints($1_su_t) +- +- # needed for pam_rootok +- selinux_compute_access_vector($1_su_t) +- +- auth_domtrans_chk_passwd($1_su_t) +- auth_dontaudit_read_shadow($1_su_t) +- auth_use_nsswitch($1_su_t) +- auth_rw_faillog($1_su_t) +- +- corecmd_search_bin($1_su_t) ++ kernel_dontaudit_getattr_core_if($1_su_t) + +- domain_use_interactive_fds($1_su_t) ++ auth_use_pam($1_su_t) + +- files_read_etc_files($1_su_t) +- files_read_etc_runtime_files($1_su_t) +- files_search_var_lib($1_su_t) +- files_dontaudit_getattr_tmp_dirs($1_su_t) +- +- init_dontaudit_use_fds($1_su_t) +- # Write to utmp. +- init_rw_utmp($1_su_t) ++ init_dontaudit_getattr_initctl($1_su_t) + + mls_file_write_all_levels($1_su_t) + + logging_send_syslog_msg($1_su_t) + +- miscfiles_read_localization($1_su_t) +- +- userdom_use_user_terminals($1_su_t) +- userdom_search_user_home_dirs($1_su_t) +- +- ifdef(`distro_redhat',` +- # RHEL5 and possibly newer releases incl. Fedora +- auth_domtrans_upd_passwd($1_su_t) +- +- optional_policy(` +- locallogin_search_keys($1_su_t) +- ') +- ') +- +- ifdef(`distro_rhel4',` +- domain_role_change_exemption($1_su_t) +- domain_subj_id_change_exemption($1_su_t) +- domain_obj_id_change_exemption($1_su_t) +- +- selinux_get_fs_mount($1_su_t) +- selinux_validate_context($1_su_t) +- selinux_compute_create_context($1_su_t) +- selinux_compute_relabel_context($1_su_t) +- selinux_compute_user_contexts($1_su_t) +- +- # Relabel ttys and ptys. +- term_relabel_all_ttys($1_su_t) +- term_relabel_all_ptys($1_su_t) +- # Close and re-open ttys and ptys to get the fd into the correct domain. +- term_use_all_ttys($1_su_t) +- term_use_all_ptys($1_su_t) +- +- seutil_read_config($1_su_t) +- seutil_read_default_contexts($1_su_t) +- +- if(secure_mode) { +- # Only allow transitions to unprivileged user domains. +- userdom_spec_domtrans_unpriv_users($1_su_t) +- } else { +- # Allow transitions to all user domains +- userdom_spec_domtrans_all_users($1_su_t) +- } +- +- optional_policy(` +- unconfined_domtrans($1_su_t) +- unconfined_signal($1_su_t) +- ') +- ') +- +- ifdef(`hide_broken_symptoms',` +- # dontaudit leaked sockets from parent +- dontaudit $1_su_t $3:socket_class_set { read write }; +- ') +- +- tunable_policy(`allow_polyinstantiation',` +- fs_mount_xattr_fs($1_su_t) +- fs_unmount_xattr_fs($1_su_t) +- ') +- +- tunable_policy(`use_nfs_home_dirs',` +- fs_search_nfs($1_su_t) +- ') +- +- tunable_policy(`use_samba_home_dirs',` +- fs_search_cifs($1_su_t) +- ') +- +- optional_policy(` +- cron_read_pipes($1_su_t) +- ') +- +- optional_policy(` +- kerberos_use($1_su_t) +- ') +- +- optional_policy(` +- # used when the password has expired +- usermanage_read_crack_db($1_su_t) +- ') +- +- # Modify .Xauthority file (via xauth program). +- optional_policy(` +- xserver_user_home_dir_filetrans_user_xauth($1_su_t) +- xserver_domtrans_xauth($1_su_t) +- ') + ') + + ####################################### +diff --git a/policy/modules/admin/su.te b/policy/modules/admin/su.te +index 85bb77e054..a4302332a6 100644 +--- a/policy/modules/admin/su.te ++++ b/policy/modules/admin/su.te +@@ -9,3 +9,82 @@ attribute su_domain_type; + + type su_exec_t; + corecmd_executable_file(su_exec_t) ++ ++allow su_domain_type self:capability { audit_control audit_write setuid setgid net_bind_service chown dac_read_search dac_override fowner sys_nice sys_resource }; ++dontaudit su_domain_type self:capability sys_tty_config; ++allow su_domain_type self:process { setexec setsched setrlimit }; ++allow su_domain_type self:fifo_file rw_fifo_file_perms; ++allow su_domain_type self:netlink_audit_socket { nlmsg_relay create_netlink_socket_perms }; ++allow su_domain_type self:key { search write }; ++ ++kernel_read_kernel_sysctls(su_domain_type) ++kernel_search_key(su_domain_type) ++kernel_link_key(su_domain_type) ++ ++# for SSP ++dev_read_urand(su_domain_type) ++dev_dontaudit_getattr_all(su_domain_type) ++ ++fs_search_auto_mountpoints(su_domain_type) ++ ++# needed for pam_rootok ++selinux_compute_access_vector(su_domain_type) ++ ++corecmd_search_bin(su_domain_type) ++ ++domain_use_interactive_fds(su_domain_type) ++ ++files_read_etc_files(su_domain_type) ++files_read_etc_runtime_files(su_domain_type) ++files_search_var_lib(su_domain_type) ++files_dontaudit_getattr_tmp_dirs(su_domain_type) ++ ++init_dontaudit_use_fds(su_domain_type) ++# Write to utmp. ++init_rw_utmp(su_domain_type) ++init_read_state(su_domain_type) ++ ++userdom_use_user_terminals(su_domain_type) ++userdom_search_user_home_dirs(su_domain_type) ++userdom_search_admin_dir(su_domain_type) ++ ++ifdef(`distro_redhat',` ++ # RHEL5 and possibly newer releases incl. Fedora ++ auth_domtrans_upd_passwd(su_domain_type) ++ ++ optional_policy(` ++ locallogin_search_keys(su_domain_type) ++ ') ++') ++ ++tunable_policy(`polyinstantiation_enabled',` ++ fs_mount_xattr_fs(su_domain_type) ++ fs_unmount_xattr_fs(su_domain_type) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_search_nfs(su_domain_type) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_search_cifs(su_domain_type) ++') ++ ++optional_policy(` ++ cron_read_pipes(su_domain_type) ++') ++ ++optional_policy(` ++ kerberos_use(su_domain_type) ++') ++ ++optional_policy(` ++ # used when the password has expired ++ usermanage_read_crack_db(su_domain_type) ++') ++ ++# Modify .Xauthority file (via xauth program). ++optional_policy(` ++ xserver_user_home_dir_filetrans_user_xauth(su_domain_type) ++ xserver_domtrans_xauth(su_domain_type) ++') +diff --git a/policy/modules/admin/sudo.fc b/policy/modules/admin/sudo.fc +index 7bddc02a49..6083c590e1 100644 +--- a/policy/modules/admin/sudo.fc ++++ b/policy/modules/admin/sudo.fc +@@ -1,2 +1,6 @@ + + /usr/bin/sudo(edit)? -- gen_context(system_u:object_r:sudo_exec_t,s0) ++ ++/var/db/sudo(/.*)? gen_context(system_u:object_r:sudo_db_t,s0) ++ ++/var/log/sudo-io(/.*)? gen_context(system_u:object_r:sudo_log_t,s0) +diff --git a/policy/modules/admin/sudo.if b/policy/modules/admin/sudo.if +index 096019932e..e79eef7a82 100644 +--- a/policy/modules/admin/sudo.if ++++ b/policy/modules/admin/sudo.if +@@ -32,6 +32,7 @@ template(`sudo_role_template',` + + gen_require(` + type sudo_exec_t; ++ type sudo_db_t; + attribute sudodomain; + ') + +@@ -45,28 +46,16 @@ template(`sudo_role_template',` + domain_interactive_fd($1_sudo_t) + domain_role_change_exemption($1_sudo_t) + role $2 types $1_sudo_t; ++ userdom_home_manager($1_sudo_t) + +- ############################## +- # +- # Local Policy +- # ++ type $1_sudo_tmp_t; ++ files_tmp_file($1_sudo_tmp_t) + +- # Use capabilities. +- allow $1_sudo_t self:capability { fowner setuid setgid dac_override sys_nice sys_resource }; +- allow $1_sudo_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; +- allow $1_sudo_t self:process { setexec setrlimit }; +- allow $1_sudo_t self:fd use; +- allow $1_sudo_t self:fifo_file rw_fifo_file_perms; +- allow $1_sudo_t self:shm create_shm_perms; +- allow $1_sudo_t self:sem create_sem_perms; +- allow $1_sudo_t self:msgq create_msgq_perms; +- allow $1_sudo_t self:msg { send receive }; +- allow $1_sudo_t self:unix_dgram_socket create_socket_perms; +- allow $1_sudo_t self:unix_stream_socket create_stream_socket_perms; +- allow $1_sudo_t self:unix_dgram_socket sendto; +- allow $1_sudo_t self:unix_stream_socket connectto; +- allow $1_sudo_t self:key manage_key_perms; ++ allow $1_sudo_t $1_sudo_tmp_t:file manage_file_perms; ++ files_tmp_filetrans($1_sudo_t, $1_sudo_tmp_t, file) + ++ allow $1_sudo_t $3:dir search_dir_perms;; ++ allow $1_sudo_t $3:file read_file_perms;; + allow $1_sudo_t $3:key search; + + # Enter this derived domain from the user domain +@@ -75,88 +64,38 @@ template(`sudo_role_template',` + # By default, revert to the calling domain when a shell is executed. + corecmd_shell_domtrans($1_sudo_t, $3) + corecmd_bin_domtrans($1_sudo_t, $3) ++ userdom_domtrans_user_home($1_sudo_t, $3) ++ userdom_domtrans_user_tmp($1_sudo_t, $3) ++ domain_entry_file($3, sudo_exec_t) ++ domain_auto_transition_pattern($1_sudo_t, sudo_exec_t, $3) ++ + allow $3 $1_sudo_t:fd use; + allow $3 $1_sudo_t:fifo_file rw_fifo_file_perms; + allow $3 $1_sudo_t:process signal_perms; + +- kernel_read_kernel_sysctls($1_sudo_t) + kernel_read_system_state($1_sudo_t) +- kernel_link_key($1_sudo_t) +- +- corecmd_read_bin_symlinks($1_sudo_t) +- corecmd_exec_all_executables($1_sudo_t) +- +- dev_getattr_fs($1_sudo_t) +- dev_read_urand($1_sudo_t) +- dev_rw_generic_usb_dev($1_sudo_t) +- dev_read_sysfs($1_sudo_t) +- +- domain_use_interactive_fds($1_sudo_t) +- domain_sigchld_interactive_fds($1_sudo_t) +- domain_getattr_all_entry_files($1_sudo_t) +- +- files_read_etc_files($1_sudo_t) +- files_read_var_files($1_sudo_t) +- files_read_usr_symlinks($1_sudo_t) +- files_getattr_usr_files($1_sudo_t) +- # for some PAM modules and for cwd +- files_dontaudit_search_home($1_sudo_t) +- files_list_tmp($1_sudo_t) +- +- fs_search_auto_mountpoints($1_sudo_t) +- fs_getattr_xattr_fs($1_sudo_t) +- +- selinux_validate_context($1_sudo_t) +- selinux_compute_relabel_context($1_sudo_t) +- +- term_getattr_pty_fs($1_sudo_t) +- term_relabel_all_ttys($1_sudo_t) +- term_relabel_all_ptys($1_sudo_t) ++ seutil_libselinux_linked($1_sudo_t) + + auth_run_chk_passwd($1_sudo_t, $2) +- # sudo stores a token in the pam_pid directory +- auth_manage_pam_pid($1_sudo_t) + auth_use_nsswitch($1_sudo_t) + +- init_rw_utmp($1_sudo_t) +- +- logging_send_audit_msgs($1_sudo_t) + logging_send_syslog_msg($1_sudo_t) ++ logging_read_syslog_pid($1_sudo_t) + +- miscfiles_read_localization($1_sudo_t) +- +- seutil_search_default_contexts($1_sudo_t) +- seutil_libselinux_linked($1_sudo_t) +- +- userdom_spec_domtrans_all_users($1_sudo_t) +- userdom_create_all_users_keys($1_sudo_t) +- userdom_manage_user_home_content_files($1_sudo_t) +- userdom_manage_user_home_content_symlinks($1_sudo_t) +- userdom_manage_user_tmp_files($1_sudo_t) +- userdom_manage_user_tmp_symlinks($1_sudo_t) +- userdom_use_user_terminals($1_sudo_t) +- # for some PAM modules and for cwd +- userdom_dontaudit_search_user_home_content($1_sudo_t) +- userdom_dontaudit_search_user_home_dirs($1_sudo_t) +- +- ifdef(`hide_broken_symptoms', ` +- dontaudit $1_sudo_t $3:socket_class_set { read write }; +- ') +- +- tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_files($1_sudo_t) +- ') +- +- tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_files($1_sudo_t) +- ') ++ term_use_generic_ptys($1_sudo_t) ++ term_setattr_generic_ptys($1_sudo_t) + + optional_policy(` +- dbus_system_bus_client($1_sudo_t) ++ mta_role($2, $1_sudo_t) + ') + ++ optional_policy(` ++ rpm_run($1_sudo_t, $2) ++ ') ++ + optional_policy(` +- fprintd_dbus_chat($1_sudo_t) ++ kerberos_manage_host_rcache($1_sudo_t) ++ kerberos_read_config($1_sudo_t) + ') + + ') +@@ -178,3 +117,41 @@ interface(`sudo_sigchld',` + + allow $1 sudodomain:process sigchld; + ') ++ ++####################################### ++## ++## Allow execute sudo in called domain. ++## This interfaces is added for nova-stack policy. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sudo_exec',` ++ gen_require(` ++ type sudo_exec_t; ++ ') ++ ++ can_exec($1, sudo_exec_t) ++') ++ ++###################################### ++## ++## Allow to manage sudo database in called domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sudo_manage_db',` ++ gen_require(` ++ type sudo_db_t; ++ ') ++ ++ manage_dirs_pattern($1, sudo_db_t, sudo_db_t) ++ manage_files_pattern($1, sudo_db_t, sudo_db_t) ++') +diff --git a/policy/modules/admin/sudo.te b/policy/modules/admin/sudo.te +index d9fce57aba..da004d8a0e 100644 +--- a/policy/modules/admin/sudo.te ++++ b/policy/modules/admin/sudo.te +@@ -1,5 +1,9 @@ + policy_module(sudo, 1.10.0) + ++gen_require(` ++ class passwd { passwd rootok }; ++') ++ + ######################################## + # + # Declarations +@@ -7,3 +11,126 @@ attribute sudodomain; + + type sudo_exec_t; + application_executable_file(sudo_exec_t) ++ ++type sudo_db_t; ++files_type(sudo_db_t) ++mls_trusted_object(sudo_db_t) ++ ++type sudo_log_t; ++logging_log_file(sudo_log_t) ++ ++manage_dirs_pattern(sudodomain, sudo_db_t, sudo_db_t) ++manage_files_pattern(sudodomain, sudo_db_t, sudo_db_t) ++ ++manage_dirs_pattern(sudodomain, sudo_log_t, sudo_log_t) ++manage_files_pattern(sudodomain, sudo_log_t, sudo_log_t) ++logging_log_filetrans(sudodomain, sudo_log_t, dir, "sudo-io") ++ ++############################## ++# ++# Local Policy ++# ++ ++# Use capabilities. ++allow sudodomain self:capability { chown fowner setuid setgid dac_read_search dac_override sys_nice sys_resource }; ++dontaudit sudodomain self:capability net_admin; ++allow sudodomain self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++allow sudodomain self:process { setexec setrlimit }; ++allow sudodomain self:fd use; ++allow sudodomain self:fifo_file rw_fifo_file_perms; ++allow sudodomain self:shm create_shm_perms; ++allow sudodomain self:sem create_sem_perms; ++allow sudodomain self:msgq create_msgq_perms; ++allow sudodomain self:msg { send receive }; ++allow sudodomain self:unix_dgram_socket create_socket_perms; ++allow sudodomain self:unix_stream_socket create_stream_socket_perms; ++allow sudodomain self:unix_dgram_socket sendto; ++allow sudodomain self:unix_stream_socket connectto; ++allow sudodomain self:key manage_key_perms; ++allow sudodomain self:netlink_kobject_uevent_socket create_socket_perms; ++allow sudodomain self:netlink_selinux_socket create_socket_perms; ++allow sudodomain self:passwd { passwd rootok }; ++ ++kernel_getattr_core_if(sudodomain) ++kernel_link_key(sudodomain) ++kernel_read_kernel_sysctls(sudodomain) ++ ++corecmd_read_bin_symlinks(sudodomain) ++corecmd_exec_all_executables(sudodomain) ++ ++dev_getattr_fs(sudodomain) ++dev_read_urand(sudodomain) ++dev_rw_generic_usb_dev(sudodomain) ++dev_read_sysfs(sudodomain) ++dev_dontaudit_getattr_all(sudodomain) ++ ++domain_use_interactive_fds(sudodomain) ++domain_sigchld_interactive_fds(sudodomain) ++domain_getattr_all_entry_files(sudodomain) ++ ++files_read_etc_files(sudodomain) ++files_read_var_files(sudodomain) ++files_read_usr_files(sudodomain) ++# for some PAM modules and for cwd ++files_dontaudit_search_home(sudodomain) ++files_list_tmp(sudodomain) ++ ++fs_search_auto_mountpoints(sudodomain) ++fs_getattr_all_fs(sudodomain) ++ ++selinux_validate_context(sudodomain) ++selinux_compute_relabel_context(sudodomain) ++selinux_compute_access_vector(sudodomain) ++ ++term_getattr_pty_fs(sudodomain) ++term_relabel_all_ttys(sudodomain) ++term_relabel_all_ptys(sudodomain) ++term_use_ptmx(sudodomain) ++ ++#auth_run_chk_passwd(sudodomain) ++# sudo stores a token in the pam_pid directory ++auth_manage_pam_pid(sudodomain) ++auth_manage_faillog(sudodomain) ++auth_rw_lastlog(sudodomain) ++ ++application_signal(sudodomain) ++ ++init_rw_utmp(sudodomain) ++ ++logging_send_audit_msgs(sudodomain) ++logging_set_audit_parameters(sudodomain) ++ ++seutil_read_default_contexts(sudodomain) ++ ++userdom_spec_domtrans_all_users(sudodomain) ++userdom_manage_user_home_content_files(sudodomain) ++userdom_manage_user_home_content_symlinks(sudodomain) ++userdom_manage_user_tmp_files(sudodomain) ++userdom_manage_user_tmp_symlinks(sudodomain) ++userdom_use_user_terminals(sudodomain) ++userdom_signal_all_users(sudodomain) ++userdom_exec_user_home_content_files(sudodomain) ++# for some PAM modules and for cwd ++userdom_search_user_home_content(sudodomain) ++userdom_search_admin_dir(sudodomain) ++userdom_manage_all_users_keys(sudodomain) ++ ++tunable_policy(`authlogin_yubikey',` ++ auth_manage_home_content(sudodomain) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(sudodomain) ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(sudodomain) ++ ') ++') ++ ++optional_policy(` ++ systemd_write_inherited_logind_sessions_pipes(sudodomain) ++') ++ ++optional_policy(` ++ fprintd_dbus_chat(sudodomain) ++') +diff --git a/policy/modules/admin/usermanage.fc b/policy/modules/admin/usermanage.fc +index f82f0ce0ab..7b8915d474 100644 +--- a/policy/modules/admin/usermanage.fc ++++ b/policy/modules/admin/usermanage.fc +@@ -20,6 +20,7 @@ ifdef(`distro_gentoo',` + /usr/sbin/groupmod -- gen_context(system_u:object_r:groupadd_exec_t,s0) + /usr/sbin/grpconv -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) + /usr/sbin/grpunconv -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) ++/usr/sbin/newusers -- gen_context(system_u:object_r:useradd_exec_t,s0) + /usr/sbin/pwconv -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) + /usr/sbin/pwunconv -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) + /usr/sbin/useradd -- gen_context(system_u:object_r:useradd_exec_t,s0) +@@ -27,6 +28,7 @@ ifdef(`distro_gentoo',` + /usr/sbin/usermod -- gen_context(system_u:object_r:useradd_exec_t,s0) + /usr/sbin/vigr -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) + /usr/sbin/vipw -- gen_context(system_u:object_r:admin_passwd_exec_t,s0) ++/usr/sbin/chpasswd -- gen_context(system_u:object_r:passwd_exec_t,s0) + + /usr/share/cracklib(/.*)? gen_context(system_u:object_r:crack_db_t,s0) + +diff --git a/policy/modules/admin/usermanage.if b/policy/modules/admin/usermanage.if +index 99e3903ea6..5c56278302 100644 +--- a/policy/modules/admin/usermanage.if ++++ b/policy/modules/admin/usermanage.if +@@ -17,10 +17,6 @@ interface(`usermanage_domtrans_chfn',` + + corecmd_search_bin($1) + domtrans_pattern($1, chfn_exec_t, chfn_t) +- +- ifdef(`hide_broken_symptoms',` +- dontaudit chfn_t $1:socket_class_set { read write }; +- ') + ') + + ######################################## +@@ -42,6 +38,7 @@ interface(`usermanage_domtrans_chfn',` + interface(`usermanage_run_chfn',` + gen_require(` + attribute_role chfn_roles; ++ type chfn_t; + ') + + usermanage_domtrans_chfn($1) +@@ -65,10 +62,25 @@ interface(`usermanage_domtrans_groupadd',` + + corecmd_search_bin($1) + domtrans_pattern($1, groupadd_exec_t, groupadd_t) ++') + +- ifdef(`hide_broken_symptoms',` +- dontaudit groupadd_t $1:socket_class_set { read write }; ++######################################## ++## ++## Check access to the groupadd executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`usermanage_access_check_groupadd',` ++ gen_require(` ++ type groupadd_exec_t; + ') ++ ++ corecmd_search_bin($1) ++ allow $1 groupadd_exec_t:file { getattr_file_perms execute }; + ') + + ######################################## +@@ -90,6 +102,7 @@ interface(`usermanage_domtrans_groupadd',` + # + interface(`usermanage_run_groupadd',` + gen_require(` ++ type groupadd_t; + attribute_role groupadd_roles; + ') + +@@ -114,10 +127,6 @@ interface(`usermanage_domtrans_passwd',` + + corecmd_search_bin($1) + domtrans_pattern($1, passwd_exec_t, passwd_t) +- +- ifdef(`hide_broken_symptoms',` +- dontaudit passwd_t $1:socket_class_set { read write }; +- ') + ') + + ######################################## +@@ -174,6 +183,7 @@ interface(`usermanage_check_exec_passwd',` + # + interface(`usermanage_run_passwd',` + gen_require(` ++ type passwd_t; + attribute_role passwd_roles; + ') + +@@ -181,6 +191,25 @@ interface(`usermanage_run_passwd',` + roleattribute $2 passwd_roles; + ') + ++######################################## ++## ++## Check access to the passwd executable ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`usermanage_access_check_passwd',` ++ gen_require(` ++ type passwd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ allow $1 passwd_exec_t:file { getattr_file_perms execute }; ++') ++ + ######################################## + ## + ## Execute password admin functions in +@@ -221,6 +250,7 @@ interface(`usermanage_domtrans_admin_passwd',` + # + interface(`usermanage_run_admin_passwd',` + gen_require(` ++ type sysadm_passwd_t; + attribute_role sysadm_passwd_roles; + ') + +@@ -263,10 +293,7 @@ interface(`usermanage_domtrans_useradd',` + + corecmd_search_bin($1) + domtrans_pattern($1, useradd_exec_t, useradd_t) +- +- ifdef(`hide_broken_symptoms',` +- dontaudit useradd_t $1:socket_class_set { read write }; +- ') ++ allow $1 useradd_exec_t:file map; + ') + + ######################################## +@@ -307,12 +334,32 @@ interface(`usermanage_check_exec_useradd',` + interface(`usermanage_run_useradd',` + gen_require(` + attribute_role useradd_roles; ++ type useradd_t; + ') + + usermanage_domtrans_useradd($1) + roleattribute $2 useradd_roles; + ') + ++######################################## ++## ++## Check access to the useradd executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`usermanage_access_check_useradd',` ++ gen_require(` ++ type useradd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ allow $1 useradd_exec_t:file { getattr_file_perms execute }; ++') ++ + ######################################## + ## + ## Read the crack database. +diff --git a/policy/modules/admin/usermanage.te b/policy/modules/admin/usermanage.te +index 1d732f1e74..96df6ebb22 100644 +--- a/policy/modules/admin/usermanage.te ++++ b/policy/modules/admin/usermanage.te +@@ -26,6 +26,7 @@ type chfn_exec_t; + domain_obj_id_change_exemption(chfn_t) + application_domain(chfn_t, chfn_exec_t) + role chfn_roles types chfn_t; ++role system_r types chfn_t; + + type crack_t; + type crack_exec_t; +@@ -44,9 +45,11 @@ domain_obj_id_change_exemption(groupadd_t) + init_system_domain(groupadd_t, groupadd_exec_t) + role groupadd_roles types groupadd_t; + ++ + type passwd_t; + type passwd_exec_t; + domain_obj_id_change_exemption(passwd_t) ++domain_system_change_exemption(passwd_t) + application_domain(passwd_t, passwd_exec_t) + role passwd_roles types passwd_t; + +@@ -61,15 +64,19 @@ files_tmp_file(sysadm_passwd_tmp_t) + type useradd_t; + type useradd_exec_t; + domain_obj_id_change_exemption(useradd_t) ++domain_system_change_exemption(useradd_t) + init_system_domain(useradd_t, useradd_exec_t) + role useradd_roles types useradd_t; + ++type useradd_var_run_t; ++files_pid_file(useradd_var_run_t) ++ + ######################################## + # + # Chfn local policy + # + +-allow chfn_t self:capability { chown dac_override fsetid setuid setgid sys_resource }; ++allow chfn_t self:capability { chown dac_read_search dac_override fsetid setuid setgid sys_resource }; + allow chfn_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execheap execstack }; + allow chfn_t self:process { setrlimit setfscreate }; + allow chfn_t self:fd use; +@@ -86,6 +93,7 @@ allow chfn_t self:unix_stream_socket connectto; + + kernel_read_system_state(chfn_t) + kernel_read_kernel_sysctls(chfn_t) ++kernel_dontaudit_getattr_core_if(chfn_t) + + selinux_get_fs_mount(chfn_t) + selinux_validate_context(chfn_t) +@@ -94,25 +102,29 @@ selinux_compute_create_context(chfn_t) + selinux_compute_relabel_context(chfn_t) + selinux_compute_user_contexts(chfn_t) + +-term_use_all_ttys(chfn_t) +-term_use_all_ptys(chfn_t) ++term_use_all_inherited_ttys(chfn_t) ++term_use_all_inherited_ptys(chfn_t) ++term_getattr_all_ptys(chfn_t) + + fs_getattr_xattr_fs(chfn_t) + fs_search_auto_mountpoints(chfn_t) + + # for SSP + dev_read_urand(chfn_t) ++dev_dontaudit_getattr_all(chfn_t) + ++auth_manage_passwd(chfn_t) ++auth_use_pam(chfn_t) + auth_run_chk_passwd(chfn_t, chfn_roles) +-auth_dontaudit_read_shadow(chfn_t) +-auth_use_nsswitch(chfn_t) ++#auth_dontaudit_read_shadow(chfn_t) ++#auth_use_nsswitch(chfn_t) + + # allow checking if a shell is executable + corecmd_check_exec_shell(chfn_t) ++corecmd_exec_bin(chfn_t) + + domain_use_interactive_fds(chfn_t) + +-files_manage_etc_files(chfn_t) + files_read_etc_runtime_files(chfn_t) + files_dontaudit_search_var(chfn_t) + files_dontaudit_search_home(chfn_t) +@@ -120,13 +132,15 @@ files_dontaudit_search_home(chfn_t) + # /usr/bin/passwd asks for w access to utmp, but it will operate + # correctly without it. Do not audit write denials to utmp. + init_dontaudit_rw_utmp(chfn_t) +- +-miscfiles_read_localization(chfn_t) ++init_dontaudit_getattr_initctl(chfn_t) + + logging_send_syslog_msg(chfn_t) + + seutil_read_file_contexts(chfn_t) + ++userdom_manage_user_tmp_files(chfn_t) ++userdom_tmp_filetrans_user_tmp(chfn_t, { file }) ++ + userdom_use_unpriv_users_fds(chfn_t) + # user generally runs this from their home directory, so do not audit a search + # on user home dir +@@ -136,6 +150,16 @@ optional_policy(` + nscd_run(chfn_t, chfn_roles) + ') + ++optional_policy(` ++ rssh_exec(chfn_t) ++') ++ ++optional_policy(` ++ # allow to exec tmux ++ screen_exec(chfn_t) ++') ++ ++ + ######################################## + # + # Crack local policy +@@ -154,6 +178,8 @@ files_tmp_filetrans(crack_t, crack_tmp_t, { file dir }) + + kernel_read_system_state(crack_t) + ++auth_read_passwd(crack_t) ++ + # for SSP + dev_read_urand(crack_t) + +@@ -186,7 +212,7 @@ optional_policy(` + # Groupadd local policy + # + +-allow groupadd_t self:capability { dac_override chown kill setuid sys_resource audit_write }; ++allow groupadd_t self:capability { dac_read_search dac_override chown kill setuid sys_resource audit_write }; + dontaudit groupadd_t self:capability { fsetid sys_tty_config }; + allow groupadd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execheap execstack }; + allow groupadd_t self:process { setrlimit setfscreate }; +@@ -212,8 +238,8 @@ selinux_compute_create_context(groupadd_t) + selinux_compute_relabel_context(groupadd_t) + selinux_compute_user_contexts(groupadd_t) + +-term_use_all_ttys(groupadd_t) +-term_use_all_ptys(groupadd_t) ++term_use_all_inherited_terms(groupadd_t) ++term_getattr_all_ptys(groupadd_t) + + init_use_fds(groupadd_t) + init_read_utmp(groupadd_t) +@@ -221,8 +247,8 @@ init_dontaudit_write_utmp(groupadd_t) + + domain_use_interactive_fds(groupadd_t) + +-files_manage_etc_files(groupadd_t) + files_relabel_etc_files(groupadd_t) ++files_read_etc_files(groupadd_t) + files_read_etc_runtime_files(groupadd_t) + files_read_usr_symlinks(groupadd_t) + +@@ -232,14 +258,14 @@ corecmd_exec_bin(groupadd_t) + logging_send_audit_msgs(groupadd_t) + logging_send_syslog_msg(groupadd_t) + +-miscfiles_read_localization(groupadd_t) + + auth_run_chk_passwd(groupadd_t, groupadd_roles) + auth_rw_lastlog(groupadd_t) + auth_use_nsswitch(groupadd_t) ++auth_manage_passwd(groupadd_t) ++auth_manage_shadow(groupadd_t) + # these may be unnecessary due to the above + # domtrans_chk_passwd() call. +-auth_manage_shadow(groupadd_t) + auth_relabel_shadow(groupadd_t) + auth_etc_filetrans_shadow(groupadd_t) + +@@ -273,7 +299,7 @@ optional_policy(` + # Passwd local policy + # + +-allow passwd_t self:capability { chown dac_override fsetid setuid setgid sys_nice sys_resource }; ++allow passwd_t self:capability { chown dac_read_search dac_override ipc_lock fsetid setuid setgid sys_nice sys_resource sys_admin sys_chroot }; + dontaudit passwd_t self:capability sys_tty_config; + allow passwd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow passwd_t self:process { setrlimit setfscreate }; +@@ -288,6 +314,7 @@ allow passwd_t self:shm create_shm_perms; + allow passwd_t self:sem create_sem_perms; + allow passwd_t self:msgq create_msgq_perms; + allow passwd_t self:msg { send receive }; ++allow passwd_t self:netlink_selinux_socket create_socket_perms; + + allow passwd_t crack_db_t:dir list_dir_perms; + read_files_pattern(passwd_t, crack_db_t, crack_db_t) +@@ -296,6 +323,7 @@ kernel_read_kernel_sysctls(passwd_t) + + # for SSP + dev_read_urand(passwd_t) ++dev_dontaudit_getattr_all(passwd_t) + + fs_getattr_xattr_fs(passwd_t) + fs_search_auto_mountpoints(passwd_t) +@@ -310,26 +338,34 @@ selinux_compute_create_context(passwd_t) + selinux_compute_relabel_context(passwd_t) + selinux_compute_user_contexts(passwd_t) + +-term_use_all_ttys(passwd_t) +-term_use_all_ptys(passwd_t) ++term_use_all_inherited_terms(passwd_t) ++term_getattr_all_ptys(passwd_t) + + auth_run_chk_passwd(passwd_t, passwd_roles) ++auth_manage_passwd(passwd_t) ++auth_map_passwd(passwd_t) + auth_manage_shadow(passwd_t) ++auth_map_shadow(passwd_t) + auth_relabel_shadow(passwd_t) + auth_etc_filetrans_shadow(passwd_t) +-auth_use_nsswitch(passwd_t) ++auth_use_pam(passwd_t) + + # allow checking if a shell is executable + corecmd_check_exec_shell(passwd_t) ++corecmd_exec_bin(passwd_t) ++ ++corenet_tcp_connect_kerberos_password_port(passwd_t) + + domain_use_interactive_fds(passwd_t) + + files_read_etc_runtime_files(passwd_t) +-files_manage_etc_files(passwd_t) ++files_read_usr_files(passwd_t) + files_search_var(passwd_t) + files_dontaudit_search_pids(passwd_t) + files_relabel_etc_files(passwd_t) + ++term_search_ptys(passwd_t) ++ + # /usr/bin/passwd asks for w access to utmp, but it will operate + # correctly without it. Do not audit write denials to utmp. + init_dontaudit_rw_utmp(passwd_t) +@@ -338,12 +374,11 @@ init_use_fds(passwd_t) + logging_send_audit_msgs(passwd_t) + logging_send_syslog_msg(passwd_t) + +-miscfiles_read_localization(passwd_t) + + seutil_read_config(passwd_t) + seutil_read_file_contexts(passwd_t) + +-userdom_use_user_terminals(passwd_t) ++userdom_use_inherited_user_terminals(passwd_t) + userdom_use_unpriv_users_fds(passwd_t) + # make sure that getcon succeeds + userdom_getattr_all_users(passwd_t) +@@ -352,6 +387,21 @@ userdom_read_user_tmp_files(passwd_t) + # user generally runs this from their home directory, so do not audit a search + # on user home dir + userdom_dontaudit_search_user_home_content(passwd_t) ++userdom_dontaudit_manage_user_home_dirs(passwd_t) ++userdom_stream_connect(passwd_t) ++userdom_rw_stream(passwd_t) ++ ++# needed by gnome-keyring ++userdom_manage_user_tmp_files(passwd_t) ++userdom_manage_user_tmp_sockets(passwd_t) ++userdom_manage_user_tmp_dirs(passwd_t) ++ ++optional_policy(` ++ gnome_exec_keyringd(passwd_t) ++ gnome_manage_cache_home_dir(passwd_t) ++ gnome_manage_generic_cache_sockets(passwd_t) ++ gnome_stream_connect_gkeyringd(passwd_t) ++') + + optional_policy(` + nscd_run(passwd_t, passwd_roles) +@@ -362,7 +412,7 @@ optional_policy(` + # Password admin local policy + # + +-allow sysadm_passwd_t self:capability { chown dac_override fsetid setuid setgid sys_resource }; ++allow sysadm_passwd_t self:capability { chown dac_read_search dac_override fsetid setuid setgid sys_resource }; + allow sysadm_passwd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow sysadm_passwd_t self:process { setrlimit setfscreate }; + allow sysadm_passwd_t self:fd use; +@@ -401,9 +451,10 @@ dev_read_urand(sysadm_passwd_t) + fs_getattr_xattr_fs(sysadm_passwd_t) + fs_search_auto_mountpoints(sysadm_passwd_t) + +-term_use_all_ttys(sysadm_passwd_t) +-term_use_all_ptys(sysadm_passwd_t) ++term_use_all_inherited_terms(sysadm_passwd_t) ++term_getattr_all_ptys(sysadm_passwd_t) + ++auth_manage_passwd(sysadm_passwd_t) + auth_manage_shadow(sysadm_passwd_t) + auth_relabel_shadow(sysadm_passwd_t) + auth_etc_filetrans_shadow(sysadm_passwd_t) +@@ -416,7 +467,6 @@ files_read_usr_files(sysadm_passwd_t) + + domain_use_interactive_fds(sysadm_passwd_t) + +-files_manage_etc_files(sysadm_passwd_t) + files_relabel_etc_files(sysadm_passwd_t) + files_read_etc_runtime_files(sysadm_passwd_t) + # for nscd lookups +@@ -426,12 +476,9 @@ files_dontaudit_search_pids(sysadm_passwd_t) + # correctly without it. Do not audit write denials to utmp. + init_dontaudit_rw_utmp(sysadm_passwd_t) + +-miscfiles_read_localization(sysadm_passwd_t) + + logging_send_syslog_msg(sysadm_passwd_t) + +-seutil_dontaudit_search_config(sysadm_passwd_t) +- + userdom_use_unpriv_users_fds(sysadm_passwd_t) + # user generally runs this from their home directory, so do not audit a search + # on user home dir +@@ -446,7 +493,8 @@ optional_policy(` + # Useradd local policy + # + +-allow useradd_t self:capability { dac_override chown kill fowner fsetid setuid sys_resource }; ++allow useradd_t self:capability { dac_read_search dac_override chown kill fowner fsetid setuid sys_ptrace sys_resource sys_chroot }; ++ + dontaudit useradd_t self:capability sys_tty_config; + allow useradd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow useradd_t self:process setfscreate; +@@ -461,6 +509,10 @@ allow useradd_t self:unix_stream_socket create_stream_socket_perms; + allow useradd_t self:unix_dgram_socket sendto; + allow useradd_t self:unix_stream_socket connectto; + ++manage_dirs_pattern(useradd_t, useradd_var_run_t, useradd_var_run_t) ++manage_files_pattern(useradd_t, useradd_var_run_t, useradd_var_run_t) ++files_pid_filetrans(useradd_t, useradd_var_run_t, dir) ++ + # for getting the number of groups + kernel_read_kernel_sysctls(useradd_t) + +@@ -468,29 +520,28 @@ corecmd_exec_shell(useradd_t) + # Execute /usr/bin/{passwd,chfn,chsh} and /usr/sbin/{useradd,vipw}. + corecmd_exec_bin(useradd_t) + ++kernel_getattr_core_if(useradd_t) ++dev_dontaudit_getattr_all(useradd_t) ++ + domain_use_interactive_fds(useradd_t) + domain_read_all_domains_state(useradd_t) ++domain_dontaudit_read_all_domains_state(useradd_t) + +-files_manage_etc_files(useradd_t) + files_search_var_lib(useradd_t) + files_relabel_etc_files(useradd_t) + files_read_etc_runtime_files(useradd_t) ++files_manage_etc_files(useradd_t) ++files_create_var_lib_dirs(useradd_t) ++files_rw_var_lib_dirs(useradd_t) + + fs_search_auto_mountpoints(useradd_t) + fs_getattr_xattr_fs(useradd_t) + + mls_file_upgrade(useradd_t) ++mls_process_read_to_clearance(useradd_t) + +-# Allow access to context for shadow file +-selinux_get_fs_mount(useradd_t) +-selinux_validate_context(useradd_t) +-selinux_compute_access_vector(useradd_t) +-selinux_compute_create_context(useradd_t) +-selinux_compute_relabel_context(useradd_t) +-selinux_compute_user_contexts(useradd_t) +- +-term_use_all_ttys(useradd_t) +-term_use_all_ptys(useradd_t) ++term_use_all_inherited_terms(useradd_t) ++term_getattr_all_ptys(useradd_t) + + auth_run_chk_passwd(useradd_t, useradd_roles) + auth_rw_lastlog(useradd_t) +@@ -498,6 +549,7 @@ auth_rw_faillog(useradd_t) + auth_use_nsswitch(useradd_t) + # these may be unnecessary due to the above + # domtrans_chk_passwd() call. ++auth_manage_passwd(useradd_t) + auth_manage_shadow(useradd_t) + auth_relabel_shadow(useradd_t) + auth_etc_filetrans_shadow(useradd_t) +@@ -508,33 +560,32 @@ init_rw_utmp(useradd_t) + logging_send_audit_msgs(useradd_t) + logging_send_syslog_msg(useradd_t) + +-miscfiles_read_localization(useradd_t) ++ ++seutil_semanage_policy(useradd_t) ++seutil_manage_file_contexts(useradd_t) ++seutil_manage_config(useradd_t) ++seutil_manage_login_config(useradd_t) ++seutil_manage_default_contexts(useradd_t) + + seutil_read_config(useradd_t) + seutil_read_file_contexts(useradd_t) + seutil_read_default_contexts(useradd_t) ++seutil_get_semanage_trans_lock(useradd_t) ++seutil_get_semanage_read_lock(useradd_t) + seutil_run_semanage(useradd_t, useradd_roles) + seutil_run_setfiles(useradd_t, useradd_roles) ++seutil_run_loadpolicy(useradd_t, useradd_roles) + + userdom_use_unpriv_users_fds(useradd_t) + # Add/remove user home directories +-userdom_manage_user_home_dirs(useradd_t) +-userdom_home_filetrans_user_home_dir(useradd_t) +-userdom_manage_user_home_content_dirs(useradd_t) +-userdom_manage_user_home_content_files(useradd_t) + userdom_home_filetrans_user_home_dir(useradd_t) +-userdom_user_home_dir_filetrans_user_home_content(useradd_t, notdevfile_class_set) ++userdom_manage_home_role(system_r, useradd_t) ++userdom_delete_all_user_home_content(useradd_t) + + optional_policy(` + mta_manage_spool(useradd_t) + ') + +-ifdef(`distro_redhat',` +- optional_policy(` +- unconfined_domain(useradd_t) +- ') +-') +- + optional_policy(` + apache_manage_all_user_content(useradd_t) + ') +@@ -544,14 +595,27 @@ optional_policy(` + dpkg_rw_pipes(useradd_t) + ') + ++optional_policy(` ++ kerberos_manage_kdc_var_lib(useradd_t) ++') ++ + optional_policy(` + nscd_run(useradd_t, useradd_roles) + ') + ++optional_policy(` ++ openshift_manage_content(useradd_t) ++') ++ + optional_policy(` + puppet_rw_tmp(useradd_t) + ') + ++optional_policy(` ++ rpc_list_nfs_state_data(useradd_t) ++ rpc_read_nfs_state_data(useradd_t) ++') ++ + optional_policy(` + tunable_policy(`samba_domain_controller',` + samba_append_log(useradd_t) +@@ -562,3 +626,12 @@ optional_policy(` + rpm_use_fds(useradd_t) + rpm_rw_pipes(useradd_t) + ') ++ ++optional_policy(` ++ smsd_manage_lib_files(useradd_t) ++ smsd_manage_lib_dirs(useradd_t) ++') ++ ++optional_policy(` ++ stapserver_manage_lib(useradd_t) ++') +diff --git a/policy/modules/apps/seunshare.if b/policy/modules/apps/seunshare.if +index 1dc7a85d31..1a2084fdc7 100644 +--- a/policy/modules/apps/seunshare.if ++++ b/policy/modules/apps/seunshare.if +@@ -43,18 +43,18 @@ interface(`seunshare_run',` + role $2 types seunshare_t; + + allow $1 seunshare_t:process signal_perms; +- +- ifdef(`hide_broken_symptoms', ` +- dontaudit seunshare_t $1:tcp_socket rw_socket_perms; +- dontaudit seunshare_t $1:udp_socket rw_socket_perms; +- dontaudit seunshare_t $1:unix_stream_socket rw_socket_perms; +- ') + ') + + ######################################## + ## +-## Role access for seunshare ++## The role template for the seunshare module. + ## ++## ++## ++## The prefix of the user role (e.g., user ++## is the prefix for user_r). ++## ++## + ## + ## + ## Role allowed access. +@@ -66,15 +66,45 @@ interface(`seunshare_run',` + ## + ## + # +-interface(`seunshare_role',` ++interface(`seunshare_role_template',` + gen_require(` +- type seunshare_t; ++ attribute seunshare_domain; ++ type seunshare_exec_t; + ') + +- role $2 types seunshare_t; ++ type $1_seunshare_t, seunshare_domain; ++ application_domain($1_seunshare_t, seunshare_exec_t) ++ role $2 types $1_seunshare_t; + +- seunshare_domtrans($1) ++ kernel_read_system_state($1_seunshare_t) ++ ++ auth_use_nsswitch($1_seunshare_t) ++ ++ logging_send_syslog_msg($1_seunshare_t) ++ ++ mls_process_set_level($1_seunshare_t) ++ ++ domtrans_pattern($3, seunshare_exec_t, $1_seunshare_t) ++ allow $1_seunshare_t $3:unix_stream_socket getattr; ++ ++ # part of sandboxX.pp ++ optional_policy(` ++ sandbox_x_transition($1_seunshare_t, $2) ++ ') ++ ++ # part of sandbox.pp ++ optional_policy(` ++ sandbox_transition($1_seunshare_t, $2) ++ ') ++ ++ ps_process_pattern($3, $1_seunshare_t) ++ dontaudit $1_seunshare_t $3:file read; ++ allow $3 $1_seunshare_t:process signal_perms; ++ allow $3 $1_seunshare_t:fd use; ++ ++ allow $1_seunshare_t $3:process transition; ++ dontaudit $1_seunshare_t $3:process { noatsecure siginh rlimitinh }; + +- ps_process_pattern($2, seunshare_t) +- allow $2 seunshare_t:process signal; ++ corecmd_bin_domtrans($1_seunshare_t, $1_t) ++ corecmd_shell_domtrans($1_seunshare_t, $1_t) + ') +diff --git a/policy/modules/apps/seunshare.te b/policy/modules/apps/seunshare.te +index 7590165833..f50f79935c 100644 +--- a/policy/modules/apps/seunshare.te ++++ b/policy/modules/apps/seunshare.te +@@ -5,40 +5,65 @@ policy_module(seunshare, 1.1.0) + # Declarations + # + +-type seunshare_t; ++attribute seunshare_domain; + type seunshare_exec_t; +-application_domain(seunshare_t, seunshare_exec_t) +-role system_r types seunshare_t; + + ######################################## + # + # seunshare local policy + # ++allow seunshare_domain self:capability { fowner setgid setuid dac_read_search dac_override setpcap sys_admin sys_nice }; ++allow seunshare_domain self:process { fork setexec signal getcap setcap setcurrent setsched }; + +-allow seunshare_t self:capability { setuid dac_override setpcap sys_admin }; +-allow seunshare_t self:process { setexec signal getcap setcap }; ++allow seunshare_domain self:fifo_file rw_file_perms; ++allow seunshare_domain self:unix_stream_socket create_stream_socket_perms; + +-allow seunshare_t self:fifo_file rw_file_perms; +-allow seunshare_t self:unix_stream_socket create_stream_socket_perms; ++corecmd_exec_shell(seunshare_domain) ++corecmd_exec_bin(seunshare_domain) ++corecmd_getattr_all_executables(seunshare_domain) + +-corecmd_exec_shell(seunshare_t) +-corecmd_exec_bin(seunshare_t) ++dev_read_urand(seunshare_domain) ++dev_dontaudit_rw_dri(seunshare_domain) + +-files_read_etc_files(seunshare_t) +-files_mounton_all_poly_members(seunshare_t) ++files_search_all(seunshare_domain) ++files_read_etc_files(seunshare_domain) ++files_mounton_all_poly_members(seunshare_domain) ++files_mounton_rootfs(seunshare_domain) ++files_manage_generic_tmp_dirs(seunshare_domain) ++files_relabelfrom_tmp_dirs(seunshare_domain) + +-auth_use_nsswitch(seunshare_t) +- +-logging_send_syslog_msg(seunshare_t) +- +-miscfiles_read_localization(seunshare_t) +- +-userdom_use_user_terminals(seunshare_t) ++fs_manage_cgroup_dirs(seunshare_domain) ++fs_manage_cgroup_files(seunshare_domain) ++fs_unmount_all_fs(seunshare_domain) + ++userdom_dontaudit_rw_user_tmp_pipes(seunshare_domain) ++userdom_use_inherited_user_terminals(seunshare_domain) ++userdom_list_user_home_content(seunshare_domain) + ifdef(`hide_broken_symptoms', ` +- fs_dontaudit_rw_anon_inodefs_files(seunshare_t) ++ fs_dontaudit_rw_anon_inodefs_files(seunshare_domain) ++ fs_dontaudit_list_inotifyfs(seunshare_domain) + + optional_policy(` +- mozilla_dontaudit_manage_user_home_files(seunshare_t) ++ gnome_dontaudit_rw_inherited_config(seunshare_domain) + ') ++ ++ optional_policy(` ++ mozilla_dontaudit_manage_user_home_files(seunshare_domain) ++ mozilla_plugin_dontaudit_leaks(seunshare_domain) ++ ') ++') ++optional_policy(` ++ rsync_exec(seunshare_domain) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_mounton_nfs(seunshare_domain) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_mounton_cifs(seunshare_domain) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_mounton_fusefs(seunshare_domain) + ') +diff --git a/policy/modules/kernel/corecommands.fc b/policy/modules/kernel/corecommands.fc +index 33e0f8dad8..3806eab60d 100644 +--- a/policy/modules/kernel/corecommands.fc ++++ b/policy/modules/kernel/corecommands.fc +@@ -1,9 +1,10 @@ + # + # /bin + # +-/bin -d gen_context(system_u:object_r:bin_t,s0) ++/bin gen_context(system_u:object_r:bin_t,s0) + /bin/.* gen_context(system_u:object_r:bin_t,s0) + /bin/d?ash -- gen_context(system_u:object_r:shell_exec_t,s0) ++/bin/esh -- gen_context(system_u:object_r:shell_exec_t,s0) + /bin/bash -- gen_context(system_u:object_r:shell_exec_t,s0) + /bin/bash2 -- gen_context(system_u:object_r:shell_exec_t,s0) + /bin/fish -- gen_context(system_u:object_r:shell_exec_t,s0) +@@ -46,6 +47,7 @@ ifdef(`distro_redhat',` + /etc/apcupsd/offbattery -- gen_context(system_u:object_r:bin_t,s0) + /etc/apcupsd/onbattery -- gen_context(system_u:object_r:bin_t,s0) + ++/etc/auto\.[^/]* -- gen_context(system_u:object_r:bin_t,s0) + /etc/avahi/.*\.action -- gen_context(system_u:object_r:bin_t,s0) + + /etc/cipe/ip-up.* -- gen_context(system_u:object_r:bin_t,s0) +@@ -67,18 +69,28 @@ ifdef(`distro_redhat',` + /etc/hotplug\.d/default/default.* gen_context(system_u:object_r:bin_t,s0) + + /etc/kde/env(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/etc/kde/kdm(/.*)? gen_context(system_u:object_r:bin_t,s0) + /etc/kde/shutdown(/.*)? gen_context(system_u:object_r:bin_t,s0) + ++/etc/redhat-lsb(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ ++/etc/lxdm/LoginReady -- gen_context(system_u:object_r:bin_t,s0) ++/etc/lxdm/Post.* -- gen_context(system_u:object_r:bin_t,s0) ++/etc/lxdm/Pre.* -- gen_context(system_u:object_r:bin_t,s0) ++/etc/lxdm/Xsession -- gen_context(system_u:object_r:bin_t,s0) ++ + /etc/mail/make -- gen_context(system_u:object_r:bin_t,s0) + + /etc/mcelog/.*-error-trigger -- gen_context(system_u:object_r:bin_t,s0) + /etc/mcelog/.*\.local -- gen_context(system_u:object_r:bin_t,s0) ++/etc/mcelog/.*\.setup -- gen_context(system_u:object_r:bin_t,s0) + + ifdef(`distro_redhat',` + /etc/mcelog/triggers(/.*)? gen_context(system_u:object_r:bin_t,s0) + ') + + /etc/mgetty\+sendfax/new_fax -- gen_context(system_u:object_r:bin_t,s0) ++/etc/munin/plugins(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /etc/netplug\.d(/.*)? gen_context(system_u:object_r:bin_t,s0) + +@@ -101,11 +113,8 @@ ifdef(`distro_redhat',` + + /etc/rc\.d/init\.d/functions -- gen_context(system_u:object_r:bin_t,s0) + +-/etc/security/namespace.init -- gen_context(system_u:object_r:bin_t,s0) +- + /etc/sysconfig/crond -- gen_context(system_u:object_r:bin_t,s0) + /etc/sysconfig/init -- gen_context(system_u:object_r:bin_t,s0) +-/etc/sysconfig/libvirtd -- gen_context(system_u:object_r:bin_t,s0) + /etc/sysconfig/netconsole -- gen_context(system_u:object_r:bin_t,s0) + /etc/sysconfig/readonly-root -- gen_context(system_u:object_r:bin_t,s0) + +@@ -114,7 +123,7 @@ ifdef(`distro_redhat',` + /etc/sysconfig/network-scripts/net.* gen_context(system_u:object_r:bin_t,s0) + /etc/sysconfig/network-scripts/init.* gen_context(system_u:object_r:bin_t,s0) + +-/etc/vmware-tools(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/etc/wdmd\.d/checkquorum\.wdmd gen_context(system_u:object_r:bin_t,s0) + + /etc/X11/xdm/GiveConsole -- gen_context(system_u:object_r:bin_t,s0) + /etc/X11/xdm/TakeConsole -- gen_context(system_u:object_r:bin_t,s0) +@@ -128,6 +137,8 @@ ifdef(`distro_debian',` + /etc/mysql/debian-start -- gen_context(system_u:object_r:bin_t,s0) + ') + ++/etc/dhcp/scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ + # + # /lib + # +@@ -135,10 +146,12 @@ ifdef(`distro_debian',` + /lib/nut/.* -- gen_context(system_u:object_r:bin_t,s0) + /lib/readahead(/.*)? gen_context(system_u:object_r:bin_t,s0) + /lib/security/pam_krb5/pam_krb5_storetmp -- gen_context(system_u:object_r:bin_t,s0) +-/lib/systemd/systemd.* -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib64/security/pam_krb5/pam_krb5_cchelper -- gen_context(system_u:object_r:bin_t,s0) + /lib/udev/[^/]* -- gen_context(system_u:object_r:bin_t,s0) ++/lib/udev/devices/MAKEDEV -l gen_context(system_u:object_r:bin_t,s0) + /lib/udev/scsi_id -- gen_context(system_u:object_r:bin_t,s0) + /lib/upstart(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/lib/security/pam_krb5(/.*)? gen_context(system_u:object_r:bin_t,s0) + + ifdef(`distro_gentoo',` + /lib/dhcpcd/dhcpcd-run-hooks -- gen_context(system_u:object_r:bin_t,s0) +@@ -149,10 +162,12 @@ ifdef(`distro_gentoo',` + /lib/rcscripts/net\.modules\.d/helpers\.d/udhcpc-.* -- gen_context(system_u:object_r:bin_t,s0) + ') + ++/usr/lib/erlang/erts.*/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ + # + # /sbin + # +-/sbin -d gen_context(system_u:object_r:bin_t,s0) ++/sbin gen_context(system_u:object_r:bin_t,s0) + /sbin/.* gen_context(system_u:object_r:bin_t,s0) + /sbin/insmod_ksymoops_clean -- gen_context(system_u:object_r:bin_t,s0) + /sbin/mkfs\.cramfs -- gen_context(system_u:object_r:bin_t,s0) +@@ -168,6 +183,7 @@ ifdef(`distro_gentoo',` + /opt/(.*/)?sbin(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /opt/google/talkplugin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/opt/google/chrome(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /opt/gutenprint/cups/lib/filter(/.*)? gen_context(system_u:object_r:bin_t,s0) + +@@ -179,34 +195,50 @@ ifdef(`distro_gentoo',` + /opt/vmware/workstation/lib/lib/wrapper-gtk24\.sh -- gen_context(system_u:object_r:bin_t,s0) + ') + ++/root/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ + # + # /usr + # ++/usr/bin -d gen_context(system_u:object_r:bin_t,s0) + /usr/(.*/)?Bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/(.*/)?bin(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/bin/git-shell -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/d?ash -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/esh -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/bash -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/bash2 -- gen_context(system_u:object_r:shell_exec_t,s0) + /usr/bin/fish -- gen_context(system_u:object_r:shell_exec_t,s0) +-/usr/bin/scponly -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/ksh.* -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/mksh -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/mountpoint -- gen_context(system_u:object_r:bin_t,s0) ++/usr/bin/pingus.* -- gen_context(system_u:object_r:bin_t,s0) ++/usr/bin/sash -- gen_context(system_u:object_r:shell_exec_t,s0) + /usr/bin/tcsh -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/yash -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/zsh.* -- gen_context(system_u:object_r:shell_exec_t,s0) + +-/usr/lib(.*/)?bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/bin/git-shell -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/scponly -- gen_context(system_u:object_r:shell_exec_t,s0) + + /usr/(.*/)?sbin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib(.*/)?sbin(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /usr/lib/avahi/avahi-daemon-check-dns\.sh -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/jvm/java(.*/)bin(/.*) gen_context(system_u:object_r:bin_t,s0) ++/usr/lib(.*/)?bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/ccache/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/fence(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/libreoffice(/.*)?/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/pgsql/test/regress/.*\.sh -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/qt.*/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/wicd/monitor\.py -- gen_context(system_u:object_r:bin_t, s0) +-/usr/lib/apt/methods.+ -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/apt/methods.+ -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/chromium-browser(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/ConsoleKit/scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/ConsoleKit/run-session.d(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/courier(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/cups(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/cyrus/.* -- gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/cyrus-imapd/.* -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/ConsoleKit/run-session\.d(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/courier(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/cups(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/cyrus-imapd/.* -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/dpkg/.+ -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/emacsen-common/.* gen_context(system_u:object_r:bin_t,s0) + /usr/lib/gimp/.*/plug-ins(/.*)? gen_context(system_u:object_r:bin_t,s0) +@@ -218,19 +250,32 @@ ifdef(`distro_gentoo',` + /usr/lib/mailman/mail(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/mediawiki/math/texvc.* gen_context(system_u:object_r:bin_t,s0) + /usr/lib/misc/sftp-server -- gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/nagios/plugins(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/netsaint/plugins(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nagios/plugins/negate -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nagios/plugins/urlize -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nagios/plugins/utils.sh -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nagios/plugins/utils.pm -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/netsaint/plugins(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/news/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/NetworkManager/nm\-.* -- gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/news/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/nspluginwrapper/np.* gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/portage/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/pm-utils(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nspluginwrapper/np.* gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/ocf(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/portage/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/pm-utils(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/readahead(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/rpm/rpmd -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/rpm/rpmk -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/rpm/rpmq -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/rpm/rpmv -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/tumbler-[^/]*/tumblerd -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/security/pam_krb5(/.*)? -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/sftp-server -- gen_context(system_u:object_r:bin_t,s0) +-/usr/lib/vte/gnome-pty-helper -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/systemd/system-sleep(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/vte/gnome-pty-helper -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/yaboot/addnote -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/udev/[^/]* -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/udev/devices/MAKEDEV -l gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/udev/scsi_id -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/upstart(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/xfce4/exo-1/exo-compose-mail-1 -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/xfce4/exo-1/exo-helper-1 -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/xfce4/panel/migrate -- gen_context(system_u:object_r:bin_t,s0) +@@ -245,26 +290,41 @@ ifdef(`distro_gentoo',` + /usr/lib/debug/sbin(/.*)? -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/debug/usr/bin(/.*)? -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/debug/usr/sbin(/.*)? -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/debug/usr/libexec(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /usr/lib/[^/]*thunderbird[^/]*/thunderbird -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/[^/]*thunderbird[^/]*/thunderbird-bin -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/[^/]*thunderbird[^/]*/open-browser\.sh -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/xulrunner[^/]*/xulrunner[^/]* -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/xulrunner[^/]*/updater -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/xulrunner[^/]*/crashreporter -- gen_context(system_u:object_r:bin_t,s0) ++ + /usr/lib/[^/]*/run-mozilla\.sh -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/[^/]*/mozilla-xremote-client -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/thunderbird.*/mozilla-xremote-client -- gen_context(system_u:object_r:bin_t,s0) + + /usr/lib/xen/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) +- + /usr/libexec(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ + /usr/libexec/git-core/git-shell -- gen_context(system_u:object_r:shell_exec_t,s0) +-/usr/libexec/sesh -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/libexec/cockpit-agent -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/bin/cockpit-bridge -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/libexec/sesh -- gen_context(system_u:object_r:shell_exec_t,s0) ++/usr/libexec/sudo/sesh -- gen_context(system_u:object_r:shell_exec_t,s0) + + /usr/libexec/openssh/sftp-server -- gen_context(system_u:object_r:bin_t,s0) + +-/usr/local/Brother(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/local/Printer(/.*)? gen_context(system_u:object_r:bin_t,s0) +-/usr/local/linuxprinter/filters(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/xfce4(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ ++/usr/Brother(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/Printer(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/Brother/(.*/)?inf/brprintconf.* gen_context(system_u:object_r:bin_t,s0) ++/usr/Brother/(.*/)?inf/setup.* gen_context(system_u:object_r:bin_t,s0) ++/usr/linuxprinter/filters(/.*)? gen_context(system_u:object_r:bin_t,s0) + ++/usr/sbin/insmod_ksymoops_clean -- gen_context(system_u:object_r:bin_t,s0) ++/usr/sbin/mkfs\.cramfs -- gen_context(system_u:object_r:bin_t,s0) ++/usr/sbin/nologin -- gen_context(system_u:object_r:shell_exec_t,s0) + /usr/sbin/scponlyc -- gen_context(system_u:object_r:shell_exec_t,s0) + /usr/sbin/sesh -- gen_context(system_u:object_r:shell_exec_t,s0) + /usr/sbin/smrsh -- gen_context(system_u:object_r:shell_exec_t,s0) +@@ -280,10 +340,14 @@ ifdef(`distro_gentoo',` + /usr/share/cluster/.*\.sh gen_context(system_u:object_r:bin_t,s0) + /usr/share/cluster/ocf-shellfuncs -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/cluster/svclib_nfslock -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/cluster/SAPDatabase -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/cluster/SAPInstance -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/cluster/checkquorum.* -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/e16/misc(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/gedit-2/plugins/externaltools/tools(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/gitolite/hooks/common/update -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/gitolite/hooks/gitolite-admin/post-update -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/gitolite3/commands(/.*)? -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/gnucash/finance-quote-check -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/gnucash/finance-quote-helper -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/hal/device-manager/hal-device-manager -- gen_context(system_u:object_r:bin_t,s0) +@@ -298,16 +362,22 @@ ifdef(`distro_gentoo',` + /usr/share/selinux/devel/policygentool -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/smolt/client(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/shorewall/compiler\.pl -- gen_context(system_u:object_r:bin_t,s0) +-/usr/share/shorewall/configpath -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/shorewall6?/configpath -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/shorewall/getparams -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/shorewall6?/wait4ifup -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/shorewall-perl(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/shorewall-shell(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/shorewall-lite(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/shorewall6-lite(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/spamassassin/sa-update\.cron gen_context(system_u:object_r:bin_t,s0) ++/usr/share/texlive/texmf/web2c/mktex(dir|nam|upd) gen_context(system_u:object_r:bin_t,s0) + /usr/share/turboprint/lib(/.*)? -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/tucan.*/tucan.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/vhostmd/scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/share/virtualbox/.*\.sh gen_context(system_u:object_r:bin_t,s0) ++/usr/share/wicd/daemon(/.*)? gen_context(system_u:object_r:bin_t,s0) + +-/usr/X11R6/lib(64)?/X11/xkb/xkbcomp -- gen_context(system_u:object_r:bin_t,s0) ++/usr/X11R6/lib/X11/xkb/xkbcomp -- gen_context(system_u:object_r:bin_t,s0) + + ifdef(`distro_debian',` + /usr/lib/ConsoleKit/.* -- gen_context(system_u:object_r:bin_t,s0) +@@ -325,20 +395,27 @@ ifdef(`distro_redhat', ` + /etc/gdm/[^/]+ -d gen_context(system_u:object_r:bin_t,s0) + /etc/gdm/[^/]+/.* gen_context(system_u:object_r:bin_t,s0) + ++/usr/lib/.*/scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/.*/program(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/bluetooth(/.*)? -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/nfs-utils/scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/oracle/xe/apps(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/tuned/.*/.*\.sh -- gen_context(system_u:object_r:bin_t,s0) + /usr/lib/vmware-tools/(s)?bin32(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/lib/vmware-tools/(s)?bin64(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/authconfig/authconfig-gtk\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/authconfig/authconfig-tui\.py -- gen_context(system_u:object_r:bin_t,s0) +-/usr/share/authconfig/authconfig\.py -- gen_context(system_u:object_r:bin_t,s0) ++#/usr/share/authconfig/authconfig\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/cvs/contrib/rcs2log -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/clamav/clamd-gen -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/clamav/freshclam-sleep -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/createrepo(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/share/doc/ghc/html/libraries/gen_contents_index -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/fedora-usermgmt/wrapper -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/hplip/[^/]* -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/hwbrowser/hwbrowser -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/kde4/apps/kajongg/kajongg.py -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/munin/plugins/plugin\.sh -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/pwlib/make/ptlib-config -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/pydict/pydict\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/rhn/rhn_applet/applet\.py -- gen_context(system_u:object_r:bin_t,s0) +@@ -346,6 +423,7 @@ ifdef(`distro_redhat', ` + /usr/share/ssl/misc(/.*)? gen_context(system_u:object_r:bin_t,s0) + /usr/share/switchdesk/switchdesk-gui\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/system-config-date/system-config-date\.py -- gen_context(system_u:object_r:bin_t,s0) ++/usr/share/system-config-selinux/polgengui.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/system-config-selinux/polgen\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/system-config-selinux/system-config-selinux\.py -- gen_context(system_u:object_r:bin_t,s0) + /usr/share/system-config-display/system-config-display -- gen_context(system_u:object_r:bin_t,s0) +@@ -387,17 +465,34 @@ ifdef(`distro_suse', ` + # + # /var + # +-/var/mailman/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/var/mailman.*/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /var/ftp/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + + /var/lib/asterisk/agi-bin(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/var/lib/dirsrv/scripts-INSTANCE -- gen_context(system_u:object_r:bin_t,s0) ++/var/lib/iscan/interpreter gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/ruby/gems(/.*)?/helper-scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/share/gems(/.*)?/helper-scripts(/.*)? gen_context(system_u:object_r:bin_t,s0) ++ + /usr/lib/yp/.+ -- gen_context(system_u:object_r:bin_t,s0) + + /var/qmail/bin -d gen_context(system_u:object_r:bin_t,s0) + /var/qmail/bin(/.*)? gen_context(system_u:object_r:bin_t,s0) + /var/qmail/rc -- gen_context(system_u:object_r:bin_t,s0) + ++/var/lib/glusterd/hooks/.*/.*\.sh -- gen_context(system_u:object_r:bin_t,s0) ++/var/lib/glusterd/hooks/.*/.*\.py -- gen_context(system_u:object_r:bin_t,s0) ++ + ifdef(`distro_suse',` + /var/lib/samba/bin/.+ gen_context(system_u:object_r:bin_t,s0) + ') ++ ++# ++# /usr/lib ++# ++ ++/usr/lib/dracut(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/iscan/network -- gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/ruby/gems/.*/agents(/.*)? gen_context(system_u:object_r:bin_t,s0) ++/usr/lib/virtualbox/VBoxManage -- gen_context(system_u:object_r:bin_t,s0) +diff --git a/policy/modules/kernel/corecommands.if b/policy/modules/kernel/corecommands.if +index 9e9263a68c..5175abbf57 100644 +--- a/policy/modules/kernel/corecommands.if ++++ b/policy/modules/kernel/corecommands.if +@@ -8,6 +8,22 @@ + ## run init. + ## + ++##################################### ++## ++## corecmd stub bin_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`corecmd_stub_bin',` ++ gen_require(` ++ type bin_t; ++ ') ++') ++ + ######################################## + ## + ## Make the specified type usable for files +@@ -68,9 +84,11 @@ interface(`corecmd_bin_alias',` + interface(`corecmd_bin_entry_type',` + gen_require(` + type bin_t; ++ type usr_t; + ') + + domain_entry_file($1, bin_t) ++ domain_entry_file($1, usr_t) + ') + + ######################################## +@@ -122,6 +140,7 @@ interface(`corecmd_search_bin',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks($1) + search_dirs_pattern($1, bin_t, bin_t) + ') + +@@ -158,6 +177,7 @@ interface(`corecmd_list_bin',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks($1) + list_dirs_pattern($1, bin_t, bin_t) + ') + +@@ -203,7 +223,7 @@ interface(`corecmd_getattr_bin_files',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -231,6 +251,7 @@ interface(`corecmd_read_bin_files',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks($1) + read_files_pattern($1, bin_t, bin_t) + ') + +@@ -252,6 +273,24 @@ interface(`corecmd_dontaudit_write_bin_files',` + dontaudit $1 bin_t:file write; + ') + ++######################################## ++## ++## Do not audit attempts to access check bin files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corecmd_dontaudit_access_check_bin',` ++ gen_require(` ++ type bin_t; ++ ') ++ ++ dontaudit $1 bin_t:file audit_access; ++') ++ + ######################################## + ## + ## Read symbolic links in bin directories. +@@ -285,6 +324,7 @@ interface(`corecmd_read_bin_pipes',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks(bin_t) + read_fifo_files_pattern($1, bin_t, bin_t) + ') + +@@ -303,6 +343,7 @@ interface(`corecmd_read_bin_sockets',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks($1) + read_sock_files_pattern($1, bin_t, bin_t) + ') + +@@ -345,6 +386,10 @@ interface(`corecmd_exec_bin',` + read_lnk_files_pattern($1, bin_t, bin_t) + list_dirs_pattern($1, bin_t, bin_t) + can_exec($1, bin_t) ++ ++ ifdef(`enable_mls',`',` ++ files_exec_all_base_ro_files($1) ++ ') + ') + + ######################################## +@@ -362,6 +407,7 @@ interface(`corecmd_manage_bin_files',` + type bin_t; + ') + ++ corecmd_read_bin_symlinks($1) + manage_files_pattern($1, bin_t, bin_t) + ') + +@@ -398,7 +444,8 @@ interface(`corecmd_mmap_bin_files',` + type bin_t; + ') + +- mmap_files_pattern($1, bin_t, bin_t) ++ corecmd_read_bin_symlinks($1) ++ mmap_exec_files_pattern($1, bin_t, bin_t) + ') + + ######################################## +@@ -440,10 +487,14 @@ interface(`corecmd_mmap_bin_files',` + interface(`corecmd_bin_spec_domtrans',` + gen_require(` + type bin_t; ++ type usr_t; + ') + + read_lnk_files_pattern($1, bin_t, bin_t) + domain_transition_pattern($1, bin_t, $2) ++ ++ read_lnk_files_pattern($1, usr_t, usr_t) ++ domain_transition_pattern($1, usr_t, $2) + ') + + ######################################## +@@ -483,10 +534,12 @@ interface(`corecmd_bin_spec_domtrans',` + interface(`corecmd_bin_domtrans',` + gen_require(` + type bin_t; ++ type usr_t; + ') + + corecmd_bin_spec_domtrans($1, $2) + type_transition $1 bin_t:process $2; ++ type_transition $1 usr_t:process $2; + ') + + ######################################## +@@ -945,6 +998,7 @@ interface(`corecmd_shell_domtrans',` + interface(`corecmd_exec_chroot',` + gen_require(` + type chroot_exec_t; ++ type bin_t; + ') + + read_lnk_files_pattern($1, bin_t, bin_t) +@@ -952,6 +1006,24 @@ interface(`corecmd_exec_chroot',` + allow $1 self:capability sys_chroot; + ') + ++######################################## ++## ++## Do not audit attempts to access check executable files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corecmd_dontaudit_access_all_executables',` ++ gen_require(` ++ attribute exec_type; ++ ') ++ ++ dontaudit $1 exec_type:file audit_access; ++') ++ + ######################################## + ## + ## Get the attributes of all executable files. +@@ -1012,6 +1084,10 @@ interface(`corecmd_exec_all_executables',` + can_exec($1, exec_type) + list_dirs_pattern($1, bin_t, bin_t) + read_lnk_files_pattern($1, bin_t, exec_type) ++ ++ ifdef(`enable_mls',`',` ++ files_exec_all_base_ro_files($1) ++ ') + ') + + ######################################## +@@ -1049,6 +1125,7 @@ interface(`corecmd_manage_all_executables',` + type bin_t; + ') + ++ manage_dirs_pattern($1, bin_t, exec_type) + manage_files_pattern($1, bin_t, exec_type) + manage_lnk_files_pattern($1, bin_t, bin_t) + ') +@@ -1089,5 +1166,38 @@ interface(`corecmd_mmap_all_executables',` + type bin_t; + ') + +- mmap_files_pattern($1, bin_t, exec_type) ++ mmap_exec_files_pattern($1, bin_t, exec_type) ++') ++ ++######################################## ++## ++## Create objects in the /bin directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created ++## ++## ++## ++## ++## The object class. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`corecmd_bin_filetrans',` ++ gen_require(` ++ type bin_t; ++ ') ++ ++ filetrans_pattern($1, bin_t, $2, $3, $4) + ') +diff --git a/policy/modules/kernel/corecommands.te b/policy/modules/kernel/corecommands.te +index 20c76cff9f..cc63dcc9c9 100644 +--- a/policy/modules/kernel/corecommands.te ++++ b/policy/modules/kernel/corecommands.te +@@ -13,7 +13,8 @@ attribute exec_type; + # + # bin_t is the type of files in the system bin/sbin directories. + # +-type bin_t alias { ls_exec_t sbin_t }; ++type bin_t alias { ls_exec_t sbin_t unconfined_execmem_exec_t execmem_exec_t java_exec_t mono_exec_t }; ++files_ro_base_file(bin_t) + corecmd_executable_file(bin_t) + dev_associate(bin_t) #For /dev/MAKEDEV + +@@ -21,6 +22,7 @@ dev_associate(bin_t) #For /dev/MAKEDEV + # shell_exec_t is the type of user shells such as /bin/bash. + # + type shell_exec_t; ++files_ro_base_file(shell_exec_t) + corecmd_executable_file(shell_exec_t) + + type chroot_exec_t; +diff --git a/policy/modules/kernel/corenetwork.fc b/policy/modules/kernel/corenetwork.fc +index f9b25c12fe..9af1f7a615 100644 +--- a/policy/modules/kernel/corenetwork.fc ++++ b/policy/modules/kernel/corenetwork.fc +@@ -8,3 +8,6 @@ + + /lib/udev/devices/ppp -c gen_context(system_u:object_r:ppp_device_t,s0) + /lib/udev/devices/net/.* -c gen_context(system_u:object_r:tun_tap_device_t,s0) ++ ++/usr/lib/udev/devices/ppp -c gen_context(system_u:object_r:ppp_device_t,s0) ++/usr/lib/udev/devices/net/.* -c gen_context(system_u:object_r:tun_tap_device_t,s0) +diff --git a/policy/modules/kernel/corenetwork.if.in b/policy/modules/kernel/corenetwork.if.in +index 07126bdcc3..7ff70b2d8a 100644 +--- a/policy/modules/kernel/corenetwork.if.in ++++ b/policy/modules/kernel/corenetwork.if.in +@@ -55,6 +55,7 @@ interface(`corenet_reserved_port',` + ') + + typeattribute $1 reserved_port_type; ++ corenet_port($1) + ') + + ######################################## +@@ -82,6 +83,7 @@ interface(`corenet_rpc_port',` + ') + + typeattribute $1 rpc_port_type; ++ corenet_port($1) + ') + + ######################################## +@@ -580,6 +582,24 @@ interface(`corenet_raw_send_all_if',` + allow $1 netif_type:netif { rawip_send egress }; + ') + ++######################################## ++## ++## Send and receive SCTP network traffic on generic nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_sendrecv_generic_node',` ++ gen_require(` ++ type node_t; ++ ') ++ ++ allow $1 node_t:node { sendto recvfrom }; ++') ++ + ######################################## + ## + ## Receive raw IP packets on all interfaces. +@@ -613,6 +633,24 @@ interface(`corenet_raw_sendrecv_all_if',` + corenet_raw_receive_all_if($1) + ') + ++######################################## ++## ++## Send and receive DCCP network traffic on generic nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_generic_node',` ++ gen_require(` ++ type node_t; ++ ') ++ ++ allow $1 node_t:node { dccp_send dccp_recv sendto recvfrom }; ++') ++ + ######################################## + ## + ## Send and receive TCP network traffic on generic nodes. +@@ -787,6 +825,24 @@ interface(`corenet_raw_sendrecv_generic_node',` + corenet_raw_receive_generic_node($1) + ') + ++######################################## ++## ++## Bind DCCP sockets to generic nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_generic_node',` ++ gen_require(` ++ type node_t; ++ ') ++ ++ allow $1 node_t:dccp_socket node_bind; ++') ++ + ######################################## + ## + ## Bind TCP sockets to generic nodes. +@@ -853,6 +909,44 @@ interface(`corenet_udp_bind_generic_node',` + allow $1 node_t:udp_socket node_bind; + ') + ++######################################## ++## ++## Dontaudit attempts to bind TCP sockets to generic nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`corenet_dontaudit_tcp_bind_generic_node',` ++ gen_require(` ++ type node_t; ++ ') ++ ++ dontaudit $1 node_t:tcp_socket node_bind; ++') ++ ++######################################## ++## ++## Dontaudit attempts to bind UDP sockets to generic nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`corenet_dontaudit_udp_bind_generic_node',` ++ gen_require(` ++ type node_t; ++ ') ++ ++ dontaudit $1 node_t:udp_socket node_bind; ++') ++ + ######################################## + ## + ## Bind raw sockets to genric nodes. +@@ -926,6 +1020,24 @@ interface(`corenet_inout_generic_node',` + corenet_out_generic_node($1) + ') + ++######################################## ++## ++## Send and receive DCCP network traffic on all nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_all_nodes',` ++ gen_require(` ++ attribute node_type; ++ ') ++ ++ allow $1 node_type:node { dccp_send dccp_recv sendto recvfrom }; ++') ++ + ######################################## + ## + ## Send and receive TCP network traffic on all nodes. +@@ -981,6 +1093,24 @@ interface(`corenet_dontaudit_udp_send_all_nodes',` + dontaudit $1 node_type:node { udp_send sendto }; + ') + ++######################################## ++## ++## Send and receive SCTP network traffic on all nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_sendrecv_all_nodes',` ++ gen_require(` ++ attribute node_type; ++ ') ++ ++ allow $1 node_type:node { sendto recvfrom }; ++') ++ + ######################################## + ## + ## Receive UDP network traffic on all nodes. +@@ -1100,6 +1230,24 @@ interface(`corenet_raw_sendrecv_all_nodes',` + corenet_raw_receive_all_nodes($1) + ') + ++######################################## ++## ++## Bind DCCP sockets to all nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_all_nodes',` ++ gen_require(` ++ attribute node_type; ++ ') ++ ++ allow $1 node_type:dccp_socket node_bind; ++') ++ + ######################################## + ## + ## Bind TCP sockets to all nodes. +@@ -1155,6 +1303,24 @@ interface(`corenet_raw_bind_all_nodes',` + allow $1 node_type:rawip_socket node_bind; + ') + ++######################################## ++## ++## Send and receive DCCP network traffic on generic ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:dccp_socket { send_msg recv_msg }; ++') ++ + ######################################## + ## + ## Send and receive TCP network traffic on generic ports. +@@ -1167,12 +1333,51 @@ interface(`corenet_raw_bind_all_nodes',` + # + interface(`corenet_tcp_sendrecv_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:tcp_socket { send_msg recv_msg }; ++') ++ ++######################################## ++## ++## Do not audit attempts to send and ++## receive DCCP network traffic on ++## generic ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_sendrecv_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ dontaudit $1 { port_t unreserved_port_t ephemeral_port_t }:dccp_socket { send_msg recv_msg }; ++') ++ ++######################################## ++## ++## Bind SCTP sockets to all nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_bind_all_nodes',` ++ gen_require(` ++ attribute node_type; + ') + +- allow $1 port_t:tcp_socket { send_msg recv_msg }; ++ allow $1 node_type:sctp_socket node_bind; + ') + ++ + ######################################## + ## + ## Do not audit send and receive TCP network traffic on generic ports. +@@ -1185,10 +1390,10 @@ interface(`corenet_tcp_sendrecv_generic_port',` + # + interface(`corenet_dontaudit_tcp_sendrecv_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + ') + +- dontaudit $1 port_t:tcp_socket { send_msg recv_msg }; ++ dontaudit $1 { port_t unreserved_port_t ephemeral_port_t }:tcp_socket { send_msg recv_msg }; + ') + + ######################################## +@@ -1203,10 +1408,10 @@ interface(`corenet_dontaudit_tcp_sendrecv_generic_port',` + # + interface(`corenet_udp_send_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + ') + +- allow $1 port_t:udp_socket send_msg; ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:udp_socket send_msg; + ') + + ######################################## +@@ -1221,10 +1426,10 @@ interface(`corenet_udp_send_generic_port',` + # + interface(`corenet_udp_receive_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + ') + +- allow $1 port_t:udp_socket recv_msg; ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:udp_socket recv_msg; + ') + + ######################################## +@@ -1242,6 +1447,26 @@ interface(`corenet_udp_sendrecv_generic_port',` + corenet_udp_receive_generic_port($1) + ') + ++######################################## ++## ++## Bind DCCP sockets to generic ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ attribute defined_port_type; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:dccp_socket name_bind; ++ dontaudit $1 defined_port_type:dccp_socket name_bind; ++') ++ + ######################################## + ## + ## Bind TCP sockets to generic ports. +@@ -1254,14 +1479,33 @@ interface(`corenet_udp_sendrecv_generic_port',` + # + interface(`corenet_tcp_bind_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + attribute defined_port_type; + ') + +- allow $1 port_t:tcp_socket name_bind; ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:tcp_socket name_bind; + dontaudit $1 defined_port_type:tcp_socket name_bind; + ') + ++######################################## ++## ++## Do not audit attempts to bind DCCP ++## sockets to generic ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_bind_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ dontaudit $1 { port_t unreserved_port_t ephemeral_port_t }:dccp_socket name_bind; ++') ++ + ######################################## + ## + ## Do not audit bind TCP sockets to generic ports. +@@ -1274,10 +1518,10 @@ interface(`corenet_tcp_bind_generic_port',` + # + interface(`corenet_dontaudit_tcp_bind_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + ') + +- dontaudit $1 port_t:tcp_socket name_bind; ++ dontaudit $1 { port_t unreserved_port_t ephemeral_port_t }:tcp_socket name_bind; + ') + + ######################################## +@@ -1292,14 +1536,32 @@ interface(`corenet_dontaudit_tcp_bind_generic_port',` + # + interface(`corenet_udp_bind_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; + attribute defined_port_type; + ') + +- allow $1 port_t:udp_socket name_bind; ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:udp_socket name_bind; + dontaudit $1 defined_port_type:udp_socket name_bind; + ') + ++######################################## ++## ++## Connect DCCP sockets to generic ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_connect_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t,ephemeral_port_t; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:dccp_socket name_connect; ++') ++ + ######################################## + ## + ## Connect TCP sockets to generic ports. +@@ -1312,10 +1574,28 @@ interface(`corenet_udp_bind_generic_port',` + # + interface(`corenet_tcp_connect_generic_port',` + gen_require(` +- type port_t; ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:tcp_socket name_connect; ++') ++ ++######################################## ++## ++## Send and receive DCCP network traffic on all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_all_ports',` ++ gen_require(` ++ attribute port_type; + ') + +- allow $1 port_t:tcp_socket name_connect; ++ allow $1 port_type:dccp_socket { send_msg recv_msg }; + ') + + ######################################## +@@ -1382,7 +1662,7 @@ interface(`corenet_udp_send_all_ports',` + + ######################################## + ## +-## Receive UDP network traffic on all ports. ++## Bind SCTP sockets to generic ports. + ## + ## + ## +@@ -1390,45 +1670,176 @@ interface(`corenet_udp_send_all_ports',` + ## + ## + # +-interface(`corenet_udp_receive_all_ports',` ++interface(`corenet_sctp_bind_generic_port',` + gen_require(` +- attribute port_type; ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ attribute defined_port_type; + ') + +- allow $1 port_type:udp_socket recv_msg; ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:sctp_socket name_bind; ++ dontaudit $1 defined_port_type:sctp_socket name_bind; + ') + + ######################################## + ## +-## Send and receive UDP network traffic on all ports. ++## Do not audit attempts to bind SCTP ++## sockets to generic ports. + ## +-## +-##

+-## Send and receive UDP network traffic on all ports. +-## Related interfaces: +-##

+-##
    +-##
  • corenet_all_recvfrom_unlabeled()
  • +-##
  • corenet_udp_sendrecv_generic_if()
  • +-##
  • corenet_udp_sendrecv_generic_node()
  • +-##
  • corenet_udp_bind_all_ports()
  • +-##
+-##

+-## Example client being able to send to all ports over +-## generic nodes, without labeled networking: +-##

+-##

+-## allow myclient_t self:udp_socket create_socket_perms; +-## corenet_udp_sendrecv_generic_if(myclient_t) +-## corenet_udp_sendrecv_generic_node(myclient_t) +-## corenet_udp_sendrecv_all_ports(myclient_t) +-## corenet_all_recvfrom_unlabeled(myclient_t) +-##

+-##
+ ## +-## +-## Domain allowed access. +-## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_sctp_bind_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t, ephemeral_port_t; ++ ') ++ ++ dontaudit $1 { port_t unreserved_port_t ephemeral_port_t }:sctp_socket name_bind; ++') ++ ++######################################## ++## ++## Do not audit attepts to bind SCTP sockets to any ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_sctp_bind_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ dontaudit $1 port_type:sctp_socket name_bind; ++') ++ ++######################################## ++## ++## Do not audit attempts to connect SCTP sockets ++## to all ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_sctp_connect_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ dontaudit $1 port_type:sctp_socket name_connect; ++') ++ ++######################################## ++## ++## Connect SCTP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_connect_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:sctp_socket name_connect; ++') ++ ++######################################## ++## ++## Connect SCTP sockets to all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_connect_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ allow $1 port_type:sctp_socket name_connect; ++') ++ ++######################################## ++## ++## Bind SCTP sockets to all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:sctp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ ++######################################## ++## ++## Receive UDP network traffic on all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_receive_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ allow $1 port_type:udp_socket recv_msg; ++') ++ ++######################################## ++## ++## Send and receive UDP network traffic on all ports. ++## ++## ++##

++## Send and receive UDP network traffic on all ports. ++## Related interfaces: ++##

++##
    ++##
  • corenet_all_recvfrom_unlabeled()
  • ++##
  • corenet_udp_sendrecv_generic_if()
  • ++##
  • corenet_udp_sendrecv_generic_node()
  • ++##
  • corenet_udp_bind_all_ports()
  • ++##
++##

++## Example client being able to send to all ports over ++## generic nodes, without labeled networking: ++##

++##

++## allow myclient_t self:udp_socket create_socket_perms; ++## corenet_udp_sendrecv_generic_if(myclient_t) ++## corenet_udp_sendrecv_generic_node(myclient_t) ++## corenet_udp_sendrecv_all_ports(myclient_t) ++## corenet_all_recvfrom_unlabeled(myclient_t) ++##

++##
++## ++## ++## Domain allowed access. ++## + ## + ## + # +@@ -1437,6 +1848,25 @@ interface(`corenet_udp_sendrecv_all_ports',` + corenet_udp_receive_all_ports($1) + ') + ++######################################## ++## ++## Bind DCCP sockets to all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ allow $1 port_type:dccp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ + ######################################## + ## + ## Bind TCP sockets to all ports. +@@ -1456,6 +1886,24 @@ interface(`corenet_tcp_bind_all_ports',` + allow $1 self:capability net_bind_service; + ') + ++######################################## ++## ++## Do not audit attepts to bind DCCP sockets to any ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_bind_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ dontaudit $1 port_type:dccp_socket name_bind; ++') ++ + ######################################## + ## + ## Do not audit attepts to bind TCP sockets to any ports. +@@ -1493,6 +1941,24 @@ interface(`corenet_udp_bind_all_ports',` + allow $1 self:capability net_bind_service; + ') + ++######################################## ++## ++## Connect SCTP sockets to generic ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_connect_generic_port',` ++ gen_require(` ++ type port_t, unreserved_port_t,ephemeral_port_t; ++ ') ++ ++ allow $1 { port_t unreserved_port_t ephemeral_port_t }:sctp_socket name_connect; ++') ++ + ######################################## + ## + ## Do not audit attepts to bind UDP sockets to any ports. +@@ -1511,6 +1977,24 @@ interface(`corenet_dontaudit_udp_bind_all_ports',` + dontaudit $1 port_type:udp_socket name_bind; + ') + ++######################################## ++## ++## Connect DCCP sockets to all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_connect_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ allow $1 port_type:dccp_socket name_connect; ++') ++ + ######################################## + ## + ## Connect TCP sockets to all ports. +@@ -1557,6 +2041,25 @@ interface(`corenet_tcp_connect_all_ports',` + allow $1 port_type:tcp_socket name_connect; + ') + ++######################################## ++## ++## Do not audit attempts to connect DCCP sockets ++## to all ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_connect_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ dontaudit $1 port_type:dccp_socket name_connect; ++') ++ + ######################################## + ## + ## Do not audit attempts to connect TCP sockets +@@ -1576,6 +2079,24 @@ interface(`corenet_dontaudit_tcp_connect_all_ports',` + dontaudit $1 port_type:tcp_socket name_connect; + ') + ++######################################## ++## ++## Send and receive DCCP network traffic on generic reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_reserved_port',` ++ gen_require(` ++ type reserved_port_t; ++ ') ++ ++ allow $1 reserved_port_t:dccp_socket { send_msg recv_msg }; ++') ++ + ######################################## + ## + ## Send and receive TCP network traffic on generic reserved ports. +@@ -1645,6 +2166,25 @@ interface(`corenet_udp_sendrecv_reserved_port',` + corenet_udp_receive_reserved_port($1) + ') + ++######################################## ++## ++## Bind DCCP sockets to generic reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_reserved_port',` ++ gen_require(` ++ type reserved_port_t; ++ ') ++ ++ allow $1 reserved_port_t:dccp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ + ######################################## + ## + ## Bind TCP sockets to generic reserved ports. +@@ -1664,6 +2204,25 @@ interface(`corenet_tcp_bind_reserved_port',` + allow $1 self:capability net_bind_service; + ') + ++######################################## ++## ++## Bind SCTP sockets to all ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_bind_all_ports',` ++ gen_require(` ++ attribute port_type; ++ ') ++ ++ allow $1 port_type:sctp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ + ######################################## + ## + ## Bind UDP sockets to generic reserved ports. +@@ -1683,6 +2242,24 @@ interface(`corenet_udp_bind_reserved_port',` + allow $1 self:capability net_bind_service; + ') + ++######################################## ++## ++## Connect DCCP sockets to generic reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_connect_reserved_port',` ++ gen_require(` ++ type reserved_port_t; ++ ') ++ ++ allow $1 reserved_port_t:dccp_socket name_connect; ++') ++ + ######################################## + ## + ## Connect TCP sockets to generic reserved ports. +@@ -1701,6 +2278,24 @@ interface(`corenet_tcp_connect_reserved_port',` + allow $1 reserved_port_t:tcp_socket name_connect; + ') + ++######################################## ++## ++## Send and receive DCCP network traffic on all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_sendrecv_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:dccp_socket { send_msg recv_msg }; ++') ++ + ######################################## + ## + ## Send and receive TCP network traffic on all reserved ports. +@@ -1716,12 +2311,300 @@ interface(`corenet_tcp_sendrecv_all_reserved_ports',` + attribute reserved_port_type; + ') + +- allow $1 reserved_port_type:tcp_socket { send_msg recv_msg }; ++ allow $1 reserved_port_type:tcp_socket { send_msg recv_msg }; ++') ++ ++######################################## ++## ++## Send UDP network traffic on all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_send_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:udp_socket send_msg; ++') ++ ++######################################## ++## ++## Receive UDP network traffic on all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_receive_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:udp_socket recv_msg; ++') ++ ++######################################## ++## ++## Send and receive UDP network traffic on all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_sendrecv_all_reserved_ports',` ++ corenet_udp_send_all_reserved_ports($1) ++ corenet_udp_receive_all_reserved_ports($1) ++') ++ ++######################################## ++## ++## Bind DCCP sockets to all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:dccp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ ++######################################## ++## ++## Bind TCP sockets to all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_tcp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:tcp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ ++######################################## ++## ++## Do not audit attempts to bind DCCP sockets to all reserved ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ dontaudit $1 reserved_port_type:dccp_socket name_bind; ++') ++ ++######################################## ++## ++## Do not audit attempts to bind TCP sockets to all reserved ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_tcp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ dontaudit $1 reserved_port_type:tcp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind UDP sockets to all reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:udp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ ++######################################## ++## ++## Do not audit attempts to bind UDP sockets to all reserved ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_udp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ dontaudit $1 reserved_port_type:udp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind DCCP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:dccp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind TCP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_tcp_bind_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:tcp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind TCP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_tcp_bind_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_t; ++ ') ++ ++ allow $1 unreserved_port_t:tcp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind UDP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_bind_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:udp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind TCP sockets to all ports > 32768. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_tcp_bind_all_ephemeral_ports',` ++ gen_require(` ++ attribute ephemeral_port_type; ++ ') ++ ++ allow $1 ephemeral_port_type:tcp_socket name_bind; ++') ++ ++######################################## ++## ++## Bind UDP sockets to all ports > 32768. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_udp_bind_all_ephemeral_ports',` ++ gen_require(` ++ attribute ephemeral_port_type; ++ ') ++ ++ allow $1 ephemeral_port_type:udp_socket name_bind; ++') ++ ++######################################## ++## ++## Connect DCCP sockets to reserved ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_connect_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ allow $1 reserved_port_type:dccp_socket name_connect; + ') + + ######################################## + ## +-## Send UDP network traffic on all reserved ports. ++## Connect TCP sockets to reserved ports. + ## + ## + ## +@@ -1729,17 +2612,17 @@ interface(`corenet_tcp_sendrecv_all_reserved_ports',` + ## + ## + # +-interface(`corenet_udp_send_all_reserved_ports',` ++interface(`corenet_tcp_connect_all_reserved_ports',` + gen_require(` + attribute reserved_port_type; + ') + +- allow $1 reserved_port_type:udp_socket send_msg; ++ allow $1 reserved_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Receive UDP network traffic on all reserved ports. ++## Connect DCCP sockets to all ports > 1024. + ## + ## + ## +@@ -1747,17 +2630,35 @@ interface(`corenet_udp_send_all_reserved_ports',` + ## + ## + # +-interface(`corenet_udp_receive_all_reserved_ports',` ++interface(`corenet_dccp_connect_all_unreserved_ports',` + gen_require(` +- attribute reserved_port_type; ++ attribute unreserved_port_type; + ') + +- allow $1 reserved_port_type:udp_socket recv_msg; ++ allow $1 unreserved_port_type:dccp_socket name_connect; ++') ++ ++####################################### ++## ++## Connect TCP sockets to ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_tcp_connect_unreserved_ports',` ++ gen_require(` ++ type unreserved_port_t; ++ ') ++ ++ allow $1 unreserved_port_t:tcp_socket name_connect; + ') + + ######################################## + ## +-## Send and receive UDP network traffic on all reserved ports. ++## Connect TCP sockets to all ports > 1024. + ## + ## + ## +@@ -1765,14 +2666,17 @@ interface(`corenet_udp_receive_all_reserved_ports',` + ## + ## + # +-interface(`corenet_udp_sendrecv_all_reserved_ports',` +- corenet_udp_send_all_reserved_ports($1) +- corenet_udp_receive_all_reserved_ports($1) ++interface(`corenet_tcp_connect_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Bind TCP sockets to all reserved ports. ++## Connect TCP sockets to all ports > 32768. + ## + ## + ## +@@ -1780,18 +2684,18 @@ interface(`corenet_udp_sendrecv_all_reserved_ports',` + ## + ## + # +-interface(`corenet_tcp_bind_all_reserved_ports',` ++interface(`corenet_tcp_connect_all_ephemeral_ports',` + gen_require(` +- attribute reserved_port_type; ++ attribute ephemeral_port_type; + ') + +- allow $1 reserved_port_type:tcp_socket name_bind; +- allow $1 self:capability net_bind_service; ++ allow $1 ephemeral_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Do not audit attempts to bind TCP sockets to all reserved ports. ++## Do not audit attempts to connect DCCP sockets ++## all reserved ports. + ## + ## + ## +@@ -1799,54 +2703,54 @@ interface(`corenet_tcp_bind_all_reserved_ports',` + ## + ## + # +-interface(`corenet_dontaudit_tcp_bind_all_reserved_ports',` ++interface(`corenet_dontaudit_dccp_connect_all_reserved_ports',` + gen_require(` + attribute reserved_port_type; + ') + +- dontaudit $1 reserved_port_type:tcp_socket name_bind; ++ dontaudit $1 reserved_port_type:dccp_socket name_connect; + ') + + ######################################## + ## +-## Bind UDP sockets to all reserved ports. ++## Do not audit attempts to connect TCP sockets ++## all reserved ports. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`corenet_udp_bind_all_reserved_ports',` ++interface(`corenet_dontaudit_tcp_connect_all_reserved_ports',` + gen_require(` + attribute reserved_port_type; + ') + +- allow $1 reserved_port_type:udp_socket name_bind; +- allow $1 self:capability net_bind_service; ++ dontaudit $1 reserved_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Do not audit attempts to bind UDP sockets to all reserved ports. ++## Connect DCCP sockets to rpc ports. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`corenet_dontaudit_udp_bind_all_reserved_ports',` ++interface(`corenet_dccp_connect_all_rpc_ports',` + gen_require(` +- attribute reserved_port_type; ++ attribute rpc_port_type; + ') + +- dontaudit $1 reserved_port_type:udp_socket name_bind; ++ allow $1 rpc_port_type:dccp_socket name_connect; + ') + + ######################################## + ## +-## Bind TCP sockets to all ports > 1024. ++## Connect TCP sockets to rpc ports. + ## + ## + ## +@@ -1854,53 +2758,55 @@ interface(`corenet_dontaudit_udp_bind_all_reserved_ports',` + ## + ## + # +-interface(`corenet_tcp_bind_all_unreserved_ports',` ++interface(`corenet_tcp_connect_all_rpc_ports',` + gen_require(` +- attribute unreserved_port_type; ++ attribute rpc_port_type; + ') + +- allow $1 unreserved_port_type:tcp_socket name_bind; ++ allow $1 rpc_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Bind UDP sockets to all ports > 1024. ++## Do not audit attempts to connect DCCP sockets ++## all rpc ports. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`corenet_udp_bind_all_unreserved_ports',` ++interface(`corenet_dontaudit_dccp_connect_all_rpc_ports',` + gen_require(` +- attribute unreserved_port_type; ++ attribute rpc_port_type; + ') + +- allow $1 unreserved_port_type:udp_socket name_bind; ++ dontaudit $1 rpc_port_type:dccp_socket name_connect; + ') + + ######################################## + ## +-## Connect TCP sockets to reserved ports. ++## Do not audit attempts to connect TCP sockets ++## all rpc ports. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`corenet_tcp_connect_all_reserved_ports',` ++interface(`corenet_dontaudit_tcp_connect_all_rpc_ports',` + gen_require(` +- attribute reserved_port_type; ++ attribute rpc_port_type; + ') + +- allow $1 reserved_port_type:tcp_socket name_connect; ++ dontaudit $1 rpc_port_type:tcp_socket name_connect; + ') + + ######################################## + ## +-## Connect TCP sockets to all ports > 1024. ++## Read and write the TUN/TAP virtual network device. + ## + ## + ## +@@ -1908,87 +2814,85 @@ interface(`corenet_tcp_connect_all_reserved_ports',` + ## + ## + # +-interface(`corenet_tcp_connect_all_unreserved_ports',` ++interface(`corenet_sctp_bind_reserved_port',` + gen_require(` +- attribute unreserved_port_type; ++ type reserved_port_t; + ') + +- allow $1 unreserved_port_type:tcp_socket name_connect; ++ allow $1 reserved_port_t:sctp_socket name_bind; ++ allow $1 self:capability net_bind_service; + ') + + ######################################## + ## +-## Do not audit attempts to connect TCP sockets +-## all reserved ports. + ## + ## + ## +-## Domain to not audit. ++## The domain allowed access. + ## + ## + # +-interface(`corenet_dontaudit_tcp_connect_all_reserved_ports',` ++interface(`corenet_rw_tun_tap_dev',` + gen_require(` +- attribute reserved_port_type; ++ type tun_tap_device_t; + ') + +- dontaudit $1 reserved_port_type:tcp_socket name_connect; ++ dev_list_all_dev_nodes($1) ++ allow $1 tun_tap_device_t:chr_file rw_chr_file_perms; + ') + + ######################################## + ## +-## Connect TCP sockets to rpc ports. ++## Relabel to and from the TUN/TAP virtual network device. + ## + ## + ## +-## Domain allowed access. ++## The domain allowed access. + ## + ## + # +-interface(`corenet_tcp_connect_all_rpc_ports',` ++interface(`corenet_relabel_tun_tap_dev',` + gen_require(` +- attribute rpc_port_type; ++ type tun_tap_device_t; + ') + +- allow $1 rpc_port_type:tcp_socket name_connect; ++ relabel_chr_files_pattern($1, tun_tap_device_t, tun_tap_device_t) + ') + + ######################################## + ## +-## Do not audit attempts to connect TCP sockets +-## all rpc ports. ++## Read and write inherited TUN/TAP virtual network device. + ## + ## + ## +-## Domain to not audit. ++## The domain allowed access. + ## + ## + # +-interface(`corenet_dontaudit_tcp_connect_all_rpc_ports',` ++interface(`corenet_rw_inherited_tun_tap_dev',` + gen_require(` +- attribute rpc_port_type; ++ type tun_tap_device_t; + ') + +- dontaudit $1 rpc_port_type:tcp_socket name_connect; ++ allow $1 tun_tap_device_t:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## + ## +-## Read and write the TUN/TAP virtual network device. ++## Connect SCTP sockets to generic reserved ports. + ## + ## + ## +-## The domain allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`corenet_rw_tun_tap_dev',` ++interface(`corenet_sctp_connect_reserved_port',` + gen_require(` +- type tun_tap_device_t; ++ type reserved_port_t; + ') + +- dev_list_all_dev_nodes($1) +- allow $1 tun_tap_device_t:chr_file rw_chr_file_perms; ++ allow $1 reserved_port_t:sctp_socket name_connect; + ') + + ######################################## +@@ -2047,6 +2951,25 @@ interface(`corenet_rw_ppp_dev',` + allow $1 ppp_device_t:chr_file rw_chr_file_perms; + ') + ++######################################## ++## ++## Bind DCCP sockets to all RPC ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_bind_all_rpc_ports',` ++ gen_require(` ++ attribute rpc_port_type; ++ ') ++ ++ allow $1 rpc_port_type:dccp_socket name_bind; ++ allow $1 self:capability net_bind_service; ++') ++ + ######################################## + ## + ## Bind TCP sockets to all RPC ports. +@@ -2066,6 +2989,24 @@ interface(`corenet_tcp_bind_all_rpc_ports',` + allow $1 self:capability net_bind_service; + ') + ++######################################## ++## ++## Do not audit attempts to bind DCCP sockets to all RPC ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_bind_all_rpc_ports',` ++ gen_require(` ++ attribute rpc_port_type; ++ ') ++ ++ dontaudit $1 rpc_port_type:dccp_socket name_bind; ++') ++ + ######################################## + ## + ## Do not audit attempts to bind TCP sockets to all RPC ports. +@@ -2192,6 +3133,25 @@ interface(`corenet_tcp_recv_netlabel',` + corenet_tcp_recvfrom_netlabel($1) + ') + ++######################################## ++## ++## Receive DCCP packets from a NetLabel connection. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dccp_recvfrom_netlabel',` ++ gen_require(` ++ type netlabel_peer_t; ++ ') ++ ++ allow $1 netlabel_peer_t:peer recv; ++ allow $1 netlabel_peer_t:dccp_socket recvfrom; ++') ++ + ######################################## + ## + ## Receive TCP packets from a NetLabel connection. +@@ -2213,7 +3173,7 @@ interface(`corenet_tcp_recvfrom_netlabel',` + + ######################################## + ## +-## Receive TCP packets from an unlabled connection. ++## Receive DCCP packets from an unlabled connection. + ## + ## + ## +@@ -2221,16 +3181,39 @@ interface(`corenet_tcp_recvfrom_netlabel',` + ## + ## + # +-interface(`corenet_tcp_recvfrom_unlabeled',` +- kernel_tcp_recvfrom_unlabeled($1) ++interface(`corenet_dccp_recvfrom_unlabeled',` ++ gen_require(` ++ attribute corenet_unlabeled_type; ++ ') ++ ++ kernel_dccp_recvfrom_unlabeled($1) + kernel_recvfrom_unlabeled_peer($1) + ++ typeattribute $1 corenet_unlabeled_type; + # XXX - at some point the oubound/send access check will be removed + # but for right now we need to keep this in place so as not to break + # older systems + kernel_sendrecv_unlabeled_association($1) + ') + ++######################################## ++## ++## Do not audit attempts to bind SCTP sockets to all reserved ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_sctp_bind_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ dontaudit $1 reserved_port_type:sctp_socket name_bind; ++') ++ + ######################################## + ## + ## Do not audit attempts to receive TCP packets from a NetLabel +@@ -2247,6 +3230,26 @@ interface(`corenet_dontaudit_tcp_recv_netlabel',` + corenet_dontaudit_tcp_recvfrom_netlabel($1) + ') + ++######################################## ++## ++## Do not audit attempts to receive DCCP packets from a NetLabel ++## connection. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_recvfrom_netlabel',` ++ gen_require(` ++ type netlabel_peer_t; ++ ') ++ ++ dontaudit $1 netlabel_peer_t:peer recv; ++ dontaudit $1 netlabel_peer_t:dccp_socket recvfrom; ++') ++ + ######################################## + ## + ## Do not audit attempts to receive TCP packets from a NetLabel +@@ -2267,6 +3270,27 @@ interface(`corenet_dontaudit_tcp_recvfrom_netlabel',` + dontaudit $1 netlabel_peer_t:tcp_socket recvfrom; + ') + ++######################################## ++## ++## Do not audit attempts to receive DCCP packets from an unlabeled ++## connection. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_dccp_recvfrom_unlabeled',` ++ kernel_dontaudit_dccp_recvfrom_unlabeled($1) ++ kernel_dontaudit_recvfrom_unlabeled_peer($1) ++ ++ # XXX - at some point the oubound/send access check will be removed ++ # but for right now we need to keep this in place so as not to break ++ # older systems ++ kernel_dontaudit_sendrecv_unlabeled_association($1) ++') ++ + ######################################## + ## + ## Do not audit attempts to receive TCP packets from an unlabeled +@@ -2342,6 +3366,24 @@ interface(`corenet_udp_recvfrom_unlabeled',` + kernel_sendrecv_unlabeled_association($1) + ') + ++######################################## ++## ++## Bind SCTP sockets to all ports > 1024. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_bind_all_unreserved_ports',` ++ gen_require(` ++ attribute unreserved_port_type; ++ ') ++ ++ allow $1 unreserved_port_type:sctp_socket name_bind; ++') ++ + ######################################## + ## + ## Do not audit attempts to receive UDP packets from a NetLabel +@@ -2471,22 +3513,40 @@ interface(`corenet_dontaudit_raw_recv_netlabel',` + + ######################################## + ## +-## Do not audit attempts to receive Raw IP packets from a NetLabel +-## connection. ++## Do not audit attempts to receive Raw IP packets from a NetLabel ++## connection. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_raw_recvfrom_netlabel',` ++ gen_require(` ++ type netlabel_peer_t; ++ ') ++ ++ dontaudit $1 netlabel_peer_t:peer recv; ++ dontaudit $1 netlabel_peer_t:rawip_socket recvfrom; ++') ++ ++######################################## ++## ++## Connect SCTP sockets to reserved ports. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`corenet_dontaudit_raw_recvfrom_netlabel',` ++interface(`corenet_sctp_connect_all_reserved_ports',` + gen_require(` +- type netlabel_peer_t; ++ attribute reserved_port_type; + ') + +- dontaudit $1 netlabel_peer_t:peer recv; +- dontaudit $1 netlabel_peer_t:rawip_socket recvfrom; ++ allow $1 reserved_port_type:sctp_socket name_connect; + ') + + ######################################## +@@ -2533,15 +3593,10 @@ interface(`corenet_dontaudit_raw_recvfrom_unlabeled',` + ## + # + interface(`corenet_all_recvfrom_unlabeled',` +- kernel_tcp_recvfrom_unlabeled($1) +- kernel_udp_recvfrom_unlabeled($1) +- kernel_raw_recvfrom_unlabeled($1) +- kernel_recvfrom_unlabeled_peer($1) +- +- # XXX - at some point the oubound/send access check will be removed +- # but for right now we need to keep this in place so as not to break +- # older systems +- kernel_sendrecv_unlabeled_association($1) ++ gen_require(` ++ attribute corenet_unlabeled_type; ++ ') ++ typeattribute $1 corenet_unlabeled_type; + ') + + ######################################## +@@ -2567,11 +3622,34 @@ interface(`corenet_all_recvfrom_unlabeled',` + # + interface(`corenet_all_recvfrom_netlabel',` + gen_require(` +- type netlabel_peer_t; ++ attribute netlabel_peer_type; + ') + +- allow $1 netlabel_peer_t:peer recv; +- allow $1 netlabel_peer_t:{ tcp_socket udp_socket rawip_socket } recvfrom; ++ typeattribute $1 netlabel_peer_type; ++') ++ ++######################################## ++## ++## Enable unlabeled net packets ++## ++## ++##

++## Allow unlabeled_packet_t to be used by all domains that use the network ++##

++##
++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`corenet_enable_unlabeled_packets',` ++ gen_require(` ++ attribute corenet_unlabeled_type; ++ ') ++ ++ kernel_sendrecv_unlabeled_association(corenet_unlabeled_type) + ') + + ######################################## +@@ -2585,6 +3663,7 @@ interface(`corenet_all_recvfrom_netlabel',` + ## + # + interface(`corenet_dontaudit_all_recvfrom_unlabeled',` ++ kernel_dontaudit_dccp_recvfrom_unlabeled($1) + kernel_dontaudit_tcp_recvfrom_unlabeled($1) + kernel_dontaudit_udp_recvfrom_unlabeled($1) + kernel_dontaudit_raw_recvfrom_unlabeled($1) +@@ -2596,6 +3675,25 @@ interface(`corenet_dontaudit_all_recvfrom_unlabeled',` + kernel_dontaudit_sendrecv_unlabeled_association($1) + ') + ++######################################## ++## ++## Do not audit attempts to connect SCTP sockets ++## all reserved ports. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`corenet_dontaudit_sctp_connect_all_reserved_ports',` ++ gen_require(` ++ attribute reserved_port_type; ++ ') ++ ++ dontaudit $1 reserved_port_type:sctp_socket name_connect; ++') ++ + ######################################## + ## + ## Do not audit attempts to receive packets from a NetLabel +@@ -2613,7 +3711,35 @@ interface(`corenet_dontaudit_all_recvfrom_netlabel',` + ') + + dontaudit $1 netlabel_peer_t:peer recv; +- dontaudit $1 netlabel_peer_t:{ tcp_socket udp_socket rawip_socket } recvfrom; ++ dontaudit $1 netlabel_peer_t:{ tcp_socket udp_socket rawip_socket dccp_socket } recvfrom; ++') ++ ++######################################## ++## ++## Rules for receiving labeled DCCP packets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Peer domain. ++## ++## ++# ++interface(`corenet_dccp_recvfrom_labeled',` ++ allow { $1 $2 } self:association sendto; ++ allow $1 $2:{ association dccp_socket } recvfrom; ++ allow $2 $1:{ association dccp_socket } recvfrom; ++ ++ allow $1 $2:peer recv; ++ allow $2 $1:peer recv; ++ ++ # allow receiving packets from MLS-only peers using NetLabel ++ corenet_dccp_recvfrom_netlabel($1) ++ corenet_dccp_recvfrom_netlabel($2) + ') + + ######################################## +@@ -2727,6 +3853,7 @@ interface(`corenet_raw_recvfrom_labeled',` + ## + # + interface(`corenet_all_recvfrom_labeled',` ++ corenet_sctp_recvfrom_labeled($1, $2) + corenet_tcp_recvfrom_labeled($1, $2) + corenet_udp_recvfrom_labeled($1, $2) + corenet_raw_recvfrom_labeled($1, $2) +@@ -2997,6 +4124,24 @@ interface(`corenet_send_all_server_packets',` + allow $1 server_packet_type:packet send; + ') + ++######################################## ++## ++## Receive SCTP packets from a NetLabel connection. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_recvfrom_netlabel',` ++ gen_require(` ++ type netlabel_peer_t; ++ ') ++ ++ allow $1 netlabel_peer_t:peer recv; ++') ++ + ######################################## + ## + ## Receive all server packets. +@@ -3048,6 +4193,27 @@ interface(`corenet_relabelto_all_server_packets',` + allow $1 server_packet_type:packet relabelto; + ') + ++######################################## ++## ++## Receive SCTP packets from an unlabled connection. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_sctp_recvfrom_unlabeled',` ++ gen_require(` ++ attribute corenet_unlabeled_type; ++ ') ++ ++ kernel_recvfrom_unlabeled_peer($1) ++ ++ typeattribute $1 corenet_unlabeled_type; ++ kernel_sendrecv_unlabeled_association($1) ++') ++ + ######################################## + ## + ## Send all packets. +@@ -3134,3 +4300,216 @@ interface(`corenet_unconfined',` + + typeattribute $1 corenet_unconfined_type; + ') ++ ++######################################## ++## ++## Dontaudit bind tcp sockets to defined ports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dontaudit_tcp_bind_all_defined_ports',` ++ gen_require(` ++ attribute defined_port_type; ++ ') ++ dontaudit $1 defined_port_type:tcp_socket name_bind; ++') ++ ++######################################## ++## ++## Create all network named devices with the correct label ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_filetrans_all_named_dev',` ++ ++ gen_require(` ++ type tun_tap_device_t; ++ type ppp_device_t; ++ ') ++ ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap0") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap1") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap2") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap3") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap4") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap5") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap6") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap7") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap8") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap9") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap10") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap11") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap12") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap13") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap14") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap15") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap16") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap17") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap18") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap19") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap20") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap21") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap22") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap23") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap24") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap25") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap26") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap27") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap28") ++ dev_filetrans($1, tun_tap_device_t, chr_file, "tap29") ++ dev_filetrans($1, ppp_device_t, chr_file, "ppp") ++') ++ ++######################################## ++## ++## Define type to be an infiniband pkey type ++## ++## ++##

++## Define type to be an infiniband pkey type ++##

++##

++## This is for supporting third party modules and its ++## use is not allowed in upstream reference policy. ++##

++##
++## ++## ++## Type to be used for infiniband pkeys. ++## ++## ++# ++interface(`corenet_ib_pkey',` ++ gen_require(` ++ attribute ibpkey_type; ++ ') ++ ++ typeattribute $1 ibpkey_type; ++') ++ ++######################################## ++## ++## Access unlabeled infiniband pkeys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_ib_access_unlabeled_pkeys',` ++ kernel_ib_access_unlabeled_pkeys($1) ++') ++ ++######################################## ++## ++## Access all labeled infiniband pkeys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_ib_access_all_pkeys',` ++ gen_require(` ++ attribute ibpkey_type; ++ ') ++ ++ allow $1 ibpkey_type:infiniband_pkey access; ++') ++ ++######################################## ++## ++## Define type to be an infiniband endport ++## ++## ++##

++## Define type to be an infiniband endport ++##

++##

++## This is for supporting third party modules and its ++## use is not allowed in upstream reference policy. ++##

++##
++## ++## ++## Type to be used for infiniband endports. ++## ++## ++# ++interface(`corenet_ib_endport',` ++ gen_require(` ++ attribute ibendport_type; ++ ') ++ ++ typeattribute $1 ibendport_type; ++') ++ ++######################################## ++## ++## Manage subnets on all labeled Infiniband endports ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_ib_manage_subnet_all_endports',` ++ gen_require(` ++ attribute ibendport_type; ++ ') ++ ++ allow $1 ibendport_type:infiniband_endport manage_subnet; ++') ++ ++######################################## ++## ++## Rules for receiving labeled SCTP packets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Peer domain. ++## ++## ++# ++interface(`corenet_sctp_recvfrom_labeled',` ++ allow { $1 $2 } self:association sendto; ++ allow $1 $2:association recvfrom; ++ allow $2 $1:association recvfrom; ++ ++ allow $1 $2:peer recv; ++ allow $2 $1:peer recv; ++ ++ # allow receiving packets from MLS-only peers using NetLabel ++ corenet_sctp_recvfrom_netlabel($1) ++ corenet_sctp_recvfrom_netlabel($2) ++') ++ ++######################################## ++## ++## Manage subnet on all unlabeled Infiniband endports ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_ib_manage_subnet_unlabeled_endports',` ++ kernel_ib_manage_subnet_unlabeled_endports($1) ++') +diff --git a/policy/modules/kernel/corenetwork.if.m4 b/policy/modules/kernel/corenetwork.if.m4 +index 8e0f9cd145..2fe34db473 100644 +--- a/policy/modules/kernel/corenetwork.if.m4 ++++ b/policy/modules/kernel/corenetwork.if.m4 +@@ -629,6 +629,26 @@ interface(`corenet_udp_bind_$1_port',` + $4 + ') + ++######################################## ++## ++## Do not audit attempts to sbind to $1 port. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`corenet_dontaudit_udp_bind_$1_port',` ++ gen_require(` ++ $3 $1_$2; ++ ') ++ ++ dontaudit dollarsone $1_$2:udp_socket name_bind; ++ $4 ++') ++ + ######################################## + ## + ## Make a TCP connection to the $1 port. +@@ -646,6 +666,23 @@ interface(`corenet_tcp_connect_$1_port',` + + allow dollarsone $1_$2:tcp_socket name_connect; + ') ++######################################## ++## ++## Do not audit attempts to make a TCP connection to $1 port. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corenet_dontaudit_tcp_connect_$1_port',` ++ gen_require(` ++ $3 $1_$2; ++ ') ++ ++ dontaudit dollarsone $1_$2:tcp_socket name_connect; ++') + '') dnl end create_port_interfaces + + define(`create_packet_interfaces',`` +@@ -776,6 +813,48 @@ interface(`corenet_relabelto_$1_packets',` + ') + '') dnl end create_port_interfaces + ++define(`create_ibpkey_interfaces',`` ++######################################## ++## ++## Access the infiniband fabric on the $1 ibpkey. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`corenet_ib_access_$1_pkey',` ++ gen_require(` ++ $3 $1_$2; ++ ') ++ ++ allow dollarsone $1_$2:infiniband_pkey access; ++') ++'') dnl end create_ibpkey_interfaces ++ ++define(`create_ibendport_interfaces',`` ++######################################## ++## ++## Manage the subnet on $1 ibendport. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`corenet_ib_manage_subnet_$1_endport',` ++ gen_require(` ++ $3 $1_$2; ++ ') ++ ++ allow dollarsone $1_$2:infiniband_endport manage_subnet; ++') ++'') dnl end create_ibendport_interfaces ++ + # + # create_netif_*_interfaces(linux_interfacename) + # +@@ -851,3 +930,25 @@ define(`network_packet',` + create_packet_interfaces($1_client) + create_packet_interfaces($1_server) + ') ++ ++# create_ibpkey_*_interfaces(name, subnet_prefix, pkeynum,mls_sensitivity) ++# (these wrap create_port_interfaces to handle attributes and types) ++define(`create_ibpkey_type_interfaces',`create_ibpkey_interfaces($1,ibpkey_t,type,determine_reserved_capability(shift($*)))') ++ ++# ++# ib_pkey(name,subnet_prefix pkeynum mls_sensitivity) ++# ++define(`ib_pkey',` ++create_ibpkey_type_interfaces($*) ++') ++ ++# create_ibendport_*_interfaces(name, devname, portnum,mls_sensitivity) ++# (these wrap create_port_interfaces to handle attributes and types) ++define(`create_ibendport_type_interfaces',`create_ibendport_interfaces($1,ibendport_t,type,determine_reserved_capability(shift($*)))') ++ ++# ++# ib_endport(name,device_name, portnum mls_sensitivity) ++# ++define(`ib_endport',` ++create_ibendport_type_interfaces($*) ++') +diff --git a/policy/modules/kernel/corenetwork.te.in b/policy/modules/kernel/corenetwork.te.in +index b191055f91..b1d9e4572b 100644 +--- a/policy/modules/kernel/corenetwork.te.in ++++ b/policy/modules/kernel/corenetwork.te.in +@@ -5,6 +5,7 @@ policy_module(corenetwork, 1.19.2) + # Declarations + # + ++attribute netlabel_peer_type; + attribute client_packet_type; + # This is an optimization for { port_type -port_t } + attribute defined_port_type; +@@ -14,12 +15,16 @@ attribute node_type; + attribute packet_type; + attribute port_type; + attribute reserved_port_type; ++attribute ephemeral_port_type; + attribute rpc_port_type; + attribute server_packet_type; ++attribute ibpkey_type; ++attribute ibendport_type; + # This is an optimization for { port_type -reserved_port_type } + attribute unreserved_port_type; + + attribute corenet_unconfined_type; ++attribute corenet_unlabeled_type; + + type ppp_device_t; + dev_node(ppp_device_t) +@@ -29,12 +34,25 @@ dev_node(ppp_device_t) + # + type tun_tap_device_t; + dev_node(tun_tap_device_t) ++mls_trusted_object(tun_tap_device_t) + + ######################################## + # + # Ports and packets + # + ++# ++# client_packet_t is the default type of IPv4 and IPv6 client packets. ++# ++type intranet_packet_t; ++corenet_packet(intranet_packet_t) ++ ++# ++# client_packet_t is the default type of IPv4 and IPv6 client packets. ++# ++type internet_packet_t; ++corenet_packet(internet_packet_t) ++ + # + # client_packet_t is the default type of IPv4 and IPv6 client packets. + # +@@ -46,6 +64,7 @@ type client_packet_t, packet_type, client_packet_type; + # + type netlabel_peer_t; + sid netmsg gen_context(system_u:object_r:netlabel_peer_t,mls_systemhigh) ++mcs_constrained(netlabel_peer_t) + + # + # port_t is the default type of INET port numbers. +@@ -58,6 +77,12 @@ sid port gen_context(system_u:object_r:port_t,s0) + # + type unreserved_port_t, port_type, unreserved_port_type; + ++# ++# ephemeral_port_t is the default type of ephemeral port numbers. ++# cat /proc/sys/net/ipv4/ip_local_port_range ++# ++type ephemeral_port_t, port_type, ephemeral_port_type; ++ + # + # reserved_port_t is the type of INET port numbers below 1024. + # +@@ -76,63 +101,82 @@ type server_packet_t, packet_type, server_packet_type; + network_port(afs_bos, udp,7007,s0) + network_port(afs_fs, tcp,2040,s0, udp,7000,s0, udp,7005,s0) + network_port(afs_ka, udp,7004,s0) +-network_port(afs_pt, udp,7002,s0) ++network_port(afs_pt, tcp,7002,s0, udp,7002,s0) + network_port(afs_vl, udp,7003,s0) + network_port(afs3_callback, tcp,7001,s0, udp,7001,s0) + network_port(agentx, udp,705,s0, tcp,705,s0) + network_port(amanda, udp,10080-10082,s0, tcp,10080-10083,s0) + network_port(amavisd_recv, tcp,10024,s0) + network_port(amavisd_send, tcp,10025,s0) +-network_port(amqp, udp,5671-5672,s0, tcp,5671-5672,s0) +-network_port(aol, udp,5190-5193,s0, tcp,5190-5193,s0) ++network_port(amqp, udp,5671-5672,s0, tcp,5671-5672,s0, tcp,15672,s0) ++network_port(aol, udp,5190-5193,s0, tcp,5190-5193,s0) ++network_port(apc, tcp,3052,s0, udp,3052,s0) + network_port(apcupsd, tcp,3551,s0, udp,3551,s0) + network_port(apertus_ldp, tcp,539,s0, udp,539,s0) +-network_port(armtechdaemon, tcp,9292,s0, udp,9292,s0) + network_port(asterisk, tcp,1720,s0, udp,2427,s0, udp,2727,s0, udp,4569,s0) + network_port(audit, tcp,60,s0) + network_port(auth, tcp,113,s0) ++network_port(bacula, tcp,9103,s0, udp,9103,s0) ++network_port(bctp, tcp,8999,s0, udp,8999,s0) + network_port(bgp, tcp,179,s0, udp,179,s0, tcp,2605,s0, udp,2605,s0) + network_port(boinc, tcp,31416,s0) + network_port(boinc_client, tcp,1043,s0, udp,1034,s0) ++network_port(brlp, tcp,4101,s0) + network_port(biff) # no defined portcon + network_port(certmaster, tcp,51235,s0) ++network_port(collectd, udp,25826,s0) + network_port(chronyd, udp,323,s0) + network_port(clamd, tcp,3310,s0) + network_port(clockspeed, udp,4041,s0) + network_port(cluster, tcp,5149,s0, udp,5149,s0, tcp,40040,s0, tcp,50006-50008,s0, udp,50006-50008,s0) + network_port(cma, tcp,1050,s0, udp,1050,s0) + network_port(cobbler, tcp,25151,s0) +-network_port(commplex_link, tcp,5001,s0, udp,5001,s0) ++network_port(commplex_link, tcp,4331,s0, tcp,5001,s0, udp,5001,s0) + network_port(commplex_main, tcp,5000,s0, udp,5000,s0) + network_port(comsat, udp,512,s0) + network_port(condor, tcp,9618,s0, udp,9618,s0) +-network_port(couchdb, tcp,5984,s0, udp,5984,s0) +-network_port(cslistener, tcp,9000,s0, udp,9000,s0) +-network_port(ctdb, tcp,4379,s0, udp,4397,s0) ++network_port(conman, tcp,7890,s0, udp,7890,s0) ++network_port(connlcli, tcp,1358,s0, udp,1358,s0) ++network_port(couchdb, tcp,5984,s0, udp,5984,s0, tcp,6984,s0, udp,6984,s0) ++network_port(ctdb, tcp,4379,s0, udp,4379,s0) + network_port(cvs, tcp,2401,s0, udp,2401,s0) + network_port(cyphesis, tcp,6767,s0, tcp,6769,s0, tcp,6780-6799,s0, udp,32771,s0) ++network_port(cyrus_imapd, tcp,2005,s0) + network_port(daap, tcp,3689,s0, udp,3689,s0) + network_port(dbskkd, tcp,1178,s0) + network_port(dcc, udp,6276,s0, udp,6277,s0) + network_port(dccm, tcp,5679,s0, udp,5679,s0) ++network_port(dey_keyneg, tcp,8750,s0, udp,8750,s0) ++network_port(dey_sapi, tcp,4330,s0) + network_port(dhcpc, udp,68,s0, tcp,68,s0, udp,546,s0, tcp, 546,s0, udp,5546,s0, tcp,5546,s0) + network_port(dhcpd, udp,67,s0, udp,547,s0, tcp, 547,s0, udp,548,s0, tcp, 548,s0, tcp,647,s0, udp,647,s0, tcp,847,s0, udp,847,s0, tcp,7911,s0) + network_port(dict, tcp,2628,s0) + network_port(distccd, tcp,3632,s0) +-network_port(dns, tcp,53,s0, udp,53,s0) ++network_port(dogtag, tcp,7390,s0) ++network_port(dns, udp,53,s0, tcp,53,s0) ++network_port(dnssec, tcp,8955,s0) ++network_port(echo, tcp,7,s0, udp,7,s0) + network_port(efs, tcp,520,s0) + network_port(embrace_dp_c, tcp,3198,s0, udp,3198,s0) + network_port(epmap, tcp,135,s0, udp,135,s0) + network_port(epmd, tcp,4369,s0, udp,4369,s0) ++network_port(fac_restore, tcp,5582,s0, udp,5582,s0) + network_port(fingerd, tcp,79,s0) +-network_port(ftp, tcp,21,s0, tcp,990,s0, udp,990,s0) ++network_port(fmpro_internal, tcp,5003,s0, udp,5003,s0) ++network_port(flash, tcp,843,s0, tcp,1935,s0, udp,1935,s0) ++network_port(freeipmi, tcp,9225,s0, udp,9225,s0) ++network_port(ftp, tcp,21,s0, tcp,989,s0, udp,989,s0, tcp,990,s0, udp,990,s0) + network_port(ftp_data, tcp,20,s0) + network_port(gatekeeper, udp,1718,s0, udp,1719,s0, tcp,1721,s0, tcp,7000,s0) ++network_port(gear, tcp,43273,s0, udp,43273,s0) ++network_port(geneve, tcp,6080,s0) + network_port(gdomap, tcp,538,s0, udp,538,s0) + network_port(gds_db, tcp,3050,s0, udp,3050,s0) + network_port(giftd, tcp,1213,s0) + network_port(git, tcp,9418,s0, udp,9418,s0) ++network_port(glance, tcp,9292,s0, udp,9292,s0) + network_port(glance_registry, tcp,9191,s0, udp,9191,s0) ++network_port(gluster, tcp,24007-24027,s0, udp,24007-24027,s0, tcp, 38465-38469,s0) + network_port(gopher, tcp,70,s0, udp,70,s0) + network_port(gpsd, tcp,2947,s0) + network_port(hadoop_datanode, tcp,50010,s0) +@@ -140,45 +184,60 @@ network_port(hadoop_namenode, tcp,8020,s0) + network_port(hddtemp, tcp,7634,s0) + network_port(howl, tcp,5335,s0, udp,5353,s0) + network_port(hplip, tcp,1782,s0, tcp,2207,s0, tcp,2208,s0, tcp, 8290,s0, tcp,50000,s0, tcp,50002,s0, tcp,8292,s0, tcp,9100,s0, tcp,9101,s0, tcp,9102,s0, tcp,9220,s0, tcp,9221,s0, tcp,9222,s0, tcp,9280,s0, tcp,9281,s0, tcp,9282,s0, tcp,9290,s0, tcp,9291,s0) +-network_port(http, tcp,80,s0, tcp,443,s0, tcp,488,s0, tcp,8008,s0, tcp,8009,s0, tcp,8443,s0) #8443 is mod_nss default port +-network_port(http_cache, tcp,3128,s0, udp,3130,s0, tcp,8080,s0, tcp,8118,s0, tcp,10001-10010,s0) # 8118 is for privoxy ++network_port(http, tcp,80,s0, tcp,81,s0, tcp,443,s0, tcp,488,s0, tcp,8008,s0, tcp,8009,s0, tcp,8443,s0,tcp,9000, s0) #8443 is mod_nss default port ++network_port(http_cache, udp,3130,s0, tcp,8080,s0, tcp,8118,s0, tcp,8123,s0, tcp,10001-10010,s0) # 8118 is for privoxy ++network_port(ibm_dt_2, tcp,1792,s0, udp,1792,s0) ++network_port(intermapper, tcp,8181,s0) + network_port(i18n_input, tcp,9010,s0) + network_port(imaze, tcp,5323,s0, udp,5323,s0) +-network_port(inetd_child, tcp,1,s0, udp,1,s0, tcp,7,s0, udp,7,s0, tcp,9,s0, udp,9,s0, tcp,13,s0, udp,13,s0, tcp,19,s0, udp,19,s0, tcp,37,s0, udp,37,s0, tcp,512,s0, tcp,543,s0, tcp,544,s0, tcp,891,s0, udp,891,s0, tcp,892,s0, udp,892,s0, tcp,2105,s0, tcp,5666,s0) ++network_port(inetd_child, tcp,1,s0, udp,1,s0, tcp,9,s0, udp,9,s0, tcp,13,s0, udp,13,s0, tcp,19,s0, udp,19,s0, tcp,512,s0, tcp,544,s0, tcp,891,s0, udp,891,s0, tcp,892,s0, udp,892,s0, tcp,5666,s0) + network_port(innd, tcp,119,s0) + network_port(interwise, tcp,7778,s0, udp,7778,s0) + network_port(ionixnetmon, tcp,7410,s0, udp,7410,s0) + network_port(ipmi, udp,623,s0, udp,664,s0) + network_port(ipp, tcp,631,s0, udp,631,s0, tcp,8610-8614,s0, udp,8610-8614,s0) + network_port(ipsecnat, tcp,4500,s0, udp,4500,s0) +-network_port(ircd, tcp,6667,s0) ++network_port(ircd, tcp,6667,s0, tcp,6697,s0) + network_port(isakmp, udp,500,s0) + network_port(iscsi, tcp,3260,s0) +-network_port(isns, tcp,3205,s0, udp,3205,s0) ++network_port(isns, tcp,3205,s0, udp,3205,s0, tcp,51954,s0) + network_port(jabber_client, tcp,5222,s0, tcp,5223,s0) +-network_port(jabber_interserver, tcp,5269,s0) +-network_port(jboss_iiop, tcp,3528,s0, udp,3528,s0) +-network_port(kerberos, tcp,88,s0, udp,88,s0, tcp,750,s0, udp,750,s0) +-network_port(kerberos_admin, tcp,464,s0, udp,464,s0, tcp,749,s0) +-network_port(kerberos_master, tcp,4444,s0, udp,4444,s0) +-network_port(kismet, tcp,2501,s0) ++network_port(jabber_interserver, tcp,5269,s0, tcp,5280,s0) ++network_port(jabber_router, tcp,5347,s0) ++network_port(jacorb, tcp,3528,s0, tcp,3529,s0) ++network_port(jboss_debug, tcp,8787,s0, udp,8787,s0) ++network_port(jboss_messaging, tcp,5445,s0, tcp,5455,s0) ++network_port(jboss_management, tcp,4712,s0, udp,4712,s0, tcp,4447,s0, tcp,7600,s0, tcp,9123,s0, udp,9123,s0, tcp, 9990, s0, tcp, 9999, s0, tcp, 18001, s0) ++network_port(kerberos, tcp,88,s0, udp,88,s0, tcp,750,s0, udp,750,s0, tcp,4444,s0, udp,4444,s0) ++network_port(kerberos_admin, tcp,749,s0) ++network_port(kerberos_password, tcp,464,s0, udp,464,s0) ++network_port(keystone, tcp, 35357,s0, udp, 35357,s0) ++network_port(kubernetes, tcp, 10250,s0, tcp, 4001,s0, tcp, 4194,s0) ++network_port(llmnr, tcp, 5355, s0, udp, 5355,s0) ++network_port(lltng, tcp, 5345, s0) ++network_port(rabbitmq, tcp,25672,s0) ++network_port(rlogin, tcp,543,s0, tcp,2105,s0) ++network_port(rtsclient, tcp,2501,s0) + network_port(kprop, tcp,754,s0) + network_port(ktalkd, udp,517,s0, udp,518,s0) +-network_port(l2tp, tcp,1701,s0, udp,1701,s0) +-network_port(ldap, tcp,389,s0, udp,389,s0, tcp,636,s0, udp,636,s0, tcp,3268,s0) ++network_port(ldap, tcp,389,s0, udp,389,s0, tcp,636,s0, udp,636,s0, tcp,3268,s0, tcp,3269,s0, tcp, 7389,s0) + network_port(lirc, tcp,8765,s0) +-network_port(lmtp, tcp,24,s0, udp,24,s0) ++network_port(luci, tcp,8084,s0) ++network_port(lmtp, tcp,24,s0, udp,24,s0, tcp,2003,s0) + network_port(lrrd) # no defined portcon ++network_port(lsm_plugin, tcp,18700,s0) ++network_port(l2tp, tcp,1701,s0, udp,1701,s0) + network_port(mail, tcp,2000,s0, tcp,3905,s0) ++network_port(mailbox, tcp,2004,s0) + network_port(matahari, tcp,49000,s0, udp,49000,s0) + network_port(memcache, tcp,11211,s0, udp,11211,s0) +-network_port(milter) # no defined portcon ++network_port(milter, tcp, 8890,s0, tcp, 8891,s0, tcp, 8893,s0) # no defined portcon + network_port(mmcc, tcp,5050,s0, udp,5050,s0) ++network_port(mongod, tcp,27017-27019,s0, tcp, 28017-28019,s0) + network_port(monopd, tcp,1234,s0) + network_port(mountd, tcp,20048,s0, udp,20048,s0) + network_port(movaz_ssc, tcp,5252,s0, udp,5252,s0) + network_port(mpd, tcp,6600,s0) +-network_port(msgsrvr, tcp,8787,s0, udp,8787,s0) + network_port(msnp, tcp,1863,s0, udp,1863,s0) + network_port(mssql, tcp,1433-1434,s0, udp,1433-1434,s0) + network_port(ms_streaming, tcp,1755,s0, udp,1755,s0) +@@ -186,101 +245,130 @@ network_port(munin, tcp,4949,s0, udp,4949,s0) + network_port(mxi, tcp,8005,s0, udp,8005,s0) + network_port(mysqld, tcp,1186,s0, tcp,3306,s0, tcp,63132-63164,s0) + network_port(mysqlmanagerd, tcp,2273,s0) ++network_port(mythtv, tcp,6543-6544,s0) + network_port(nessus, tcp,1241,s0) + network_port(netport, tcp,3129,s0, udp,3129,s0) + network_port(netsupport, tcp,5404,s0, udp,5404,s0, tcp,5405,s0, udp,5405,s0) +-network_port(nfs, tcp,2049,s0, udp,2049,s0) +-network_port(nfsrdma, tcp,20049,s0, udp,20049,s0) ++network_port(nfs, tcp,2049,s0, udp,2049,s0, tcp,20048-20049,s0, udp,20048-20049,s0) + network_port(nmbd, udp,137,s0, udp,138,s0) ++network_port(nodejs_debug, tcp,5858,s0, udp,5858,s0) + network_port(ntop, tcp,3000-3001,s0, udp,3000-3001,s0) + network_port(ntp, udp,123,s0) ++network_port(oracle, tcp, 1521,s0,udp, 1521,s0, tcp,2483,s0,udp,2483,s0, tcp,2484,s0, udp,2484,s0) + network_port(oa_system, tcp,8022,s0, udp,8022,s0) +-network_port(oracledb, tcp, 1521,s0,udp, 1521,s0, tcp,2483,s0,udp,2483,s0, tcp,2484,s0, udp,2484,s0) + network_port(ocsp, tcp,9080,s0) ++network_port(openflow, tcp,6633,s0, tcp,6653,s0) + network_port(openhpid, tcp,4743,s0, udp,4743,s0) + network_port(openvpn, tcp,1194,s0, udp,1194,s0) ++network_port(openvswitch, tcp,6634,s0) ++network_port(osapi_compute, tcp, 8774, s0) ++network_port(ovsdb, tcp, 6640, s0) + network_port(pdps, tcp,1314,s0, udp,1314,s0) + network_port(pegasus_http, tcp,5988,s0) + network_port(pegasus_https, tcp,5989,s0) + network_port(pgpkeyserver, udp, 11371,s0, tcp,11371,s0) + network_port(pingd, tcp,9125,s0) ++network_port(pki_ca, tcp, 829, s0, tcp, 9180, s0, tcp, 9701, s0, tcp, 9443-9447, s0) ++network_port(pki_kra, tcp, 10180, s0, tcp, 10701, s0, tcp, 10443-10446, s0) ++network_port(pki_ocsp, tcp, 11180, s0, tcp, 11701, s0, tcp, 11443-11446, s0) ++network_port(pki_tks, tcp, 13180, s0, tcp, 13701, s0, tcp, 13443-13446, s0) ++network_port(pki_ra, tcp,12888-12889,s0) ++network_port(pki_tps, tcp,7888-7889,s0) + network_port(pktcable_cops, tcp,2126,s0, udp,2126,s0) +-network_port(pop, tcp,106,s0, tcp,109,s0, tcp,110,s0, tcp,143,s0, tcp,220,s0, tcp,993,s0, tcp,995,s0, tcp,1109,s0) ++network_port(pop, tcp,106,s0, tcp,109,s0, tcp,110,s0, tcp,143,s0, tcp,220,s0, tcp,993,s0, tcp,995,s0, tcp,1109,s0, tcp,10993,s0) + network_port(portmap, udp,111,s0, tcp,111,s0) + network_port(postfix_policyd, tcp,10031,s0) +-network_port(postgresql, tcp,5432,s0) ++network_port(postgresql, tcp,5432,s0, tcp,9898,s0) + network_port(postgrey, tcp,60000,s0) + network_port(pptp, tcp,1723,s0, udp,1723,s0) + network_port(prelude, tcp,4690,s0, udp,4690,s0) + network_port(presence, tcp,5298-5299,s0, udp,5298-5299,s0) ++network_port(preupgrade, tcp, 8099, s0) + network_port(printer, tcp,515,s0) ++network_port(prosody, tcp,5280-5281,s0) + network_port(ptal, tcp,5703,s0) +-network_port(pulseaudio, tcp,4713,s0) ++network_port(pulseaudio, tcp,4713,s0, udp,4713,s0) + network_port(puppet, tcp, 8140, s0) + network_port(pxe, udp,4011,s0) + network_port(pyzor, udp,24441,s0) +-network_port(radacct, udp,1646,s0, udp,1813,s0) +-network_port(radius, udp,1645,s0, udp,1812,s0) ++network_port(neutron, tcp, 8775, s0, tcp,9696,s0, tcp,9697,s0) ++network_port(nsd_control, tcp,8952,s0) ++network_port(radacct, udp,1646,s0, tcp,1646,s0, tcp,1813,s0, udp,1813,s0) ++network_port(radius, udp,1645,s0, tcp,1645,s0, tcp,1812,s0, udp,1812,s0, tcp,18120-18121,s0, udp,18120-18121, s0) + network_port(radsec, tcp,2083,s0) + network_port(razor, tcp,2703,s0) +-network_port(redis, tcp,6379,s0) ++network_port(time, tcp,37,s0, udp,37,s0) ++network_port(redis, tcp,6379,s0, tcp,26379,s0, tcp,16379,s0) + network_port(repository, tcp, 6363, s0) + network_port(ricci, tcp,11111,s0, udp,11111,s0) + network_port(ricci_modcluster, tcp,16851,s0, udp,16851,s0) + network_port(rlogind, tcp,513,s0) +-network_port(rndc, tcp,953,s0, udp,953,s0) ++network_port(rndc, tcp,953,s0, udp,953,s0, tcp,8953,s0) + network_port(router, udp,520,s0, udp,521,s0, tcp,521,s0) + network_port(rsh, tcp,514,s0) + network_port(rsync, tcp,873,s0, udp,873,s0) +-network_port(rtsp, tcp,554,s0, udp,554,s0) ++network_port(rtp_media, tcp,5004-5005,s0, udp,5004-5005,s0) ++network_port(rtsp, tcp,554,s0, udp,554,s0, tcp,8554,s0, udp,8554,s0) + network_port(rwho, udp,513,s0) ++network_port(salt, tcp,4505,s0, tcp,4506,s0) + network_port(sap, tcp,9875,s0, udp,9875,s0) ++network_port(saphostctrl, tcp,1128,s0, tcp,1129,s0) + network_port(servistaitsm, tcp,3636,s0, udp,3636,s0) ++network_port(sge, tcp,6444,s0, tcp,6445,s0) ++network_port(shellinaboxd, tcp,4200,s0) + network_port(sieve, tcp,4190,s0) + network_port(sip, tcp,5060,s0, udp,5060,s0, tcp,5061,s0, udp,5061,s0) + network_port(sixxsconfig, tcp,3874,s0, udp,3874,s0) + network_port(smbd, tcp,137-139,s0, tcp,445,s0) + network_port(smtp, tcp,25,s0, tcp,465,s0, tcp,587,s0) +-network_port(snmp, udp,161,s0, udp,162,s0, tcp,199,s0, tcp,1161,s0) ++network_port(snmp, tcp,161-162,s0, udp,161-162,s0, tcp,199,s0, tcp, 1161, s0) + network_port(socks) # no defined portcon + network_port(soundd, tcp,8000,s0, tcp,9433,s0, tcp, 16001, s0) +-network_port(spamd, tcp,783,s0) ++network_port(spamd, tcp,783,s0, tcp, 10026, s0, tcp, 10027, s0) + network_port(speech, tcp,8036,s0) +-network_port(squid, udp,3401,s0, tcp,3401,s0, udp,4827,s0, tcp,4827,s0) # snmp and htcp +-network_port(ssdp, tcp,1900,s0, udp,1900,s0) ++network_port(squid, tcp,3128,s0, udp,3401,s0, tcp,3401,s0, udp,4827,s0, tcp,4827,s0) # snmp and htcp ++network_port(ssdp, tcp,1900,s0, udp, 1900, s0) + network_port(ssh, tcp,22,s0) + network_port(stunnel) # no defined portcon + network_port(svn, tcp,3690,s0, udp,3690,s0) + network_port(svrloc, tcp,427,s0, udp,427,s0) + network_port(swat, tcp,901,s0) ++network_port(swift, tcp,6200-6203,s0) + network_port(sype_transport, tcp,9911,s0, udp,9911,s0) +-network_port(syslogd, udp,514,s0) +-network_port(syslog_tls, tcp,6514,s0, udp,6514,s0) ++network_port(syslogd, udp,514,s0, udp,601,s0, tcp,601,s0, tcp,20514,s0, udp,20514,s0) ++network_port(syslog_tls, tcp,6514,s0, udp,6514,s0, tcp,10514,s0, udp,10514,s0) ++network_port(tangd, tcp,7406,s0) + network_port(tcs, tcp, 30003, s0) + network_port(telnetd, tcp,23,s0) + network_port(tftp, udp,69,s0) +-network_port(tor, tcp,6969,s0, tcp,9001,s0, tcp,9030,s0, tcp,9050,s0, tcp,9051,s0) ++network_port(tor, tcp,6969,s0, tcp,9001,s0, tcp,9030,s0, tcp,9050,s0, tcp,9051,s0, tcp,9150,s0) + network_port(traceroute, udp,64000-64010,s0) ++network_port(tram, tcp, 4567, s0) + network_port(transproxy, tcp,8081,s0) + network_port(trisoap, tcp,10200,s0, udp,10200,s0) + network_port(trivnet1, tcp, 8200, s0, udp, 8200, s0) + network_port(ups, tcp,3493,s0) + network_port(utcpserver) # no defined portcon + network_port(uucpd, tcp,540,s0) ++network_port(us_cli, tcp,8082,s0, udp,8082,s0, tcp,8083,s0, udp,8083,s0) + network_port(varnishd, tcp,6081-6082,s0) + network_port(virt, tcp,16509,s0, udp,16509,s0, tcp,16514,s0, udp,16514,s0) + network_port(virtual_places, tcp,1533,s0, udp,1533,s0) + network_port(virt_migration, tcp,49152-49216,s0) +-network_port(vnc, tcp,5900,s0) ++network_port(vnc, tcp,5900-5983,s0, tcp,5985-5999,s0) + network_port(wccp, udp,2048,s0) + network_port(websm, tcp,9090,s0, udp,9090,s0) +-network_port(whois, tcp,43,s0, udp,43,s0, tcp,4321,s0, udp,4321,s0) ++network_port(whois, tcp,43,s0, udp,43,s0, tcp, 4321, s0 , udp, 4321, s0 ) + network_port(winshadow, tcp,3161,s0, udp,3261,s0) ++network_port(wap_wsp, tcp,9200,s0, udp,9200,s0) + network_port(wsdapi, tcp,5357,s0, udp,5357,s0) + network_port(wsicopy, tcp,3378,s0, udp,3378,s0) + network_port(xdmcp, udp,177,s0, tcp,177,s0) + network_port(xen, tcp,8002,s0) ++network_port(xinuexpansion3, tcp,2023,s0, udp,2023,s0) ++network_port(xinuexpansion4, tcp,2024,s0, udp,2024,s0) + network_port(xfs, tcp,7100,s0) ++network_port(xodbc_connect, tcp,6632,s0) + network_port(xserver, tcp,6000-6020,s0) + network_port(zarafa, tcp,236,s0, tcp,237,s0) + network_port(zabbix, tcp,10051,s0) +@@ -288,19 +376,26 @@ network_port(zabbix_agent, tcp,10050,s0) + network_port(zookeeper_client, tcp,2181,s0) + network_port(zookeeper_election, tcp,3888,s0) + network_port(zookeeper_leader, tcp,2888,s0) +-network_port(zebra, tcp,2600-2604,s0, tcp,2606,s0, udp,2600-2604,s0, udp,2606,s0) ++network_port(zebra, tcp,2600-2604,s0, tcp,2606,s0, tcp,2608-2609,s0, udp,2600-2604,s0, udp,2606,s0, udp,2608-2609,s0) + network_port(zented, tcp,1229,s0, udp,1229,s0) + network_port(zope, tcp,8021,s0) + + # Defaults for reserved ports. Earlier portcon entries take precedence; + # these entries just cover any remaining reserved ports not otherwise declared. + +-portcon udp 1024-65535 gen_context(system_u:object_r:unreserved_port_t, s0) +-portcon tcp 1024-65535 gen_context(system_u:object_r:unreserved_port_t, s0) + portcon tcp 512-1023 gen_context(system_u:object_r:hi_reserved_port_t, s0) ++portcon sctp 1024-65535 gen_context(system_u:object_r:unreserved_port_t, s0) ++portcon sctp 512-1023 gen_context(system_u:object_r:hi_reserved_port_t, s0) + portcon udp 512-1023 gen_context(system_u:object_r:hi_reserved_port_t, s0) + portcon tcp 1-511 gen_context(system_u:object_r:reserved_port_t, s0) + portcon udp 1-511 gen_context(system_u:object_r:reserved_port_t, s0) ++portcon sctp 1-511 gen_context(system_u:object_r:reserved_port_t, s0) ++portcon tcp 1024-32767 gen_context(system_u:object_r:unreserved_port_t, s0) ++portcon tcp 32768-61000 gen_context(system_u:object_r:ephemeral_port_t, s0) ++portcon tcp 61001-65535 gen_context(system_u:object_r:unreserved_port_t, s0) ++portcon udp 1024-32767 gen_context(system_u:object_r:unreserved_port_t, s0) ++portcon udp 32768-61000 gen_context(system_u:object_r:ephemeral_port_t, s0) ++portcon udp 61001-65535 gen_context(system_u:object_r:unreserved_port_t, s0) + + ######################################## + # +@@ -333,6 +428,8 @@ sid netif gen_context(system_u:object_r:netif_t,s0 - mls_systemhigh) + + build_option(`enable_mls',` + network_interface(lo, lo, s0 - mls_systemhigh) ++allow netlabel_peer_t lo_netif_t:netif ingress; ++allow netlabel_peer_type lo_netif_t:netif egress; + ',` + typealias netif_t alias { lo_netif_t netif_lo_t }; + ') +@@ -345,9 +442,35 @@ typealias netif_t alias { lo_netif_t netif_lo_t }; + allow corenet_unconfined_type node_type:node *; + allow corenet_unconfined_type netif_type:netif *; + allow corenet_unconfined_type packet_type:packet *; ++allow corenet_unconfined_type port_type:dccp_socket { send_msg recv_msg name_connect }; + allow corenet_unconfined_type port_type:tcp_socket { send_msg recv_msg name_connect }; ++allow corenet_unconfined_type port_type:sctp_socket { send_msg recv_msg name_connect }; + allow corenet_unconfined_type port_type:udp_socket { send_msg recv_msg }; + + # Bind to any network address. +-allow corenet_unconfined_type port_type:{ tcp_socket udp_socket rawip_socket } name_bind; +-allow corenet_unconfined_type node_type:{ tcp_socket udp_socket rawip_socket } node_bind; ++allow corenet_unconfined_type port_type:{ dccp_socket tcp_socket udp_socket rawip_socket sctp_socket} name_bind; ++allow corenet_unconfined_type node_type:{ dccp_socket tcp_socket udp_socket rawip_socket sctp_socket } node_bind; ++ ++# Infiniband ++corenet_ib_access_all_pkeys(corenet_unconfined_type) ++corenet_ib_manage_subnet_all_endports(corenet_unconfined_type) ++corenet_ib_access_unlabeled_pkeys(corenet_unconfined_type) ++corenet_ib_manage_subnet_unlabeled_endports(corenet_unconfined_type) ++ ++# ++# Rules coverning the use of unlabeled types ++# ++kernel_dccp_recvfrom_unlabeled(corenet_unlabeled_type) ++kernel_tcp_recvfrom_unlabeled(corenet_unlabeled_type) ++kernel_udp_recvfrom_unlabeled(corenet_unlabeled_type) ++kernel_raw_recvfrom_unlabeled(corenet_unlabeled_type) ++kernel_recvfrom_unlabeled_peer(corenet_unlabeled_type) ++ ++allow netlabel_peer_type netlabel_peer_t:peer recv; ++allow netlabel_peer_type netlabel_peer_t:{ tcp_socket udp_socket rawip_socket dccp_socket } recvfrom; ++allow netlabel_peer_t netif_t:netif { rawip_recv egress ingress }; ++allow netlabel_peer_t node_t:node recvfrom; ++ ++typealias neutron_port_t alias quantum_port_t; ++typealias neutron_server_packet_t alias quantum_server_packet_t; ++typealias neutron_client_packet_t alias quantum_client_packet_t; +diff --git a/policy/modules/kernel/corenetwork.te.m4 b/policy/modules/kernel/corenetwork.te.m4 +index 3f6e16889a..abd046c560 100644 +--- a/policy/modules/kernel/corenetwork.te.m4 ++++ b/policy/modules/kernel/corenetwork.te.m4 +@@ -86,6 +86,11 @@ define(`add_port_attribute',`dnl + ifelse(eval(range_start($2) < 1024),1,`typeattribute $1 reserved_port_type;',`typeattribute $1 unreserved_port_type;') + ') + ++define(`add_ephemeral_attribute',`dnl ++ifelse(eval(range_start($3) >= 50000 && range_start($3) < 61001),1,`typeattribute $1 ephemeral_port_type; ++',`ifelse(`$5',`',`',`add_ephemeral_attribute($1,shiftn(4,$*))')')dnl ++') ++ + # bindresvport in glibc starts searching for reserved ports at 512 + define(`add_rpc_attribute',`dnl + ifelse(eval(range_start($3) >= 512 && range_start($3) < 1024),1,`typeattribute $1 rpc_port_type; +@@ -101,6 +106,7 @@ type $1_client_packet_t, packet_type, client_packet_type; + type $1_server_packet_t, packet_type, server_packet_type; + ifelse(`$2',`',`',`add_port_attribute($1_port_t,$3)')dnl + ifelse(`$2',`',`',`add_rpc_attribute($1_port_t,shift($*))')dnl ++ifelse(`$2',`',`',`add_ephemeral_attribute($1_port_t,shift($*))')dnl + ifelse(`$2',`',`',`declare_portcons($1_port_t,shift($*))')dnl + ') + +@@ -111,3 +117,29 @@ define(`network_packet',` + type $1_client_packet_t, packet_type, client_packet_type; + type $1_server_packet_t, packet_type, server_packet_type; + ') ++ ++define(`declare_ibpkeycons',`dnl ++ibpkeycon $2 $3 gen_context(system_u:object_r:$1,$4) ++ifelse(`$5',`',`',`declare_ibpkeycons($1,shiftn(4,$*))')dnl ++') ++ ++# ++# ib_pkey(nam, subnet_prefix, pkey_num, mls_sensitivity [,subnet_prefix, pkey_num, mls_sensitivity[,...]]) ++# ++define(`ib_pkey',` ++type $1_ibpkey_t, ibpkey_type; ++ifelse(`$2',`',`',`declare_ibpkeycons($1_ibpkey_t,shift($*))')dnl ++') ++ ++define(`declare_ibendportcons',`dnl ++ibendportcon $2 $3 gen_context(system_u:object_r:$1,$4) ++ifelse(`$5',`',`',`declare_ibendportcons($1,shiftn(4,$*))')dnl ++') ++ ++# ++# ib_endport (name, dev_name, port_num, mls_sensitivity [, dev_name, port_num mls_sensitivity[,...]]) ++# ++define(`ib_endport',` ++type $1_ibendport_t, ibendport_type; ++ifelse(`$2',`',`',`declare_ibendportcons($1_ibendport_t,shift($*))')dnl ++') +diff --git a/policy/modules/kernel/devices.fc b/policy/modules/kernel/devices.fc +index b31c054917..f412acfece 100644 +--- a/policy/modules/kernel/devices.fc ++++ b/policy/modules/kernel/devices.fc +@@ -15,15 +15,19 @@ + /dev/atibm -c gen_context(system_u:object_r:mouse_device_t,s0) + /dev/audio.* -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/autofs.* -c gen_context(system_u:object_r:autofs_device_t,s0) ++/dev/bsr.* -c gen_context(system_u:object_r:cpu_device_t,s0) + /dev/beep -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/btrfs-control -c gen_context(system_u:object_r:lvm_control_t,s0) +-/dev/cachefiles -c gen_context(system_u:object_r:cachefiles_device_t,s0) + /dev/controlD64 -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/crash -c gen_context(system_u:object_r:crash_device_t,mls_systemhigh) + /dev/dahdi/.* -c gen_context(system_u:object_r:sound_device_t,s0) +-/dev/dmfm -c gen_context(system_u:object_r:sound_device_t,s0) ++/dev/dlm.* -c gen_context(system_u:object_r:dlm_control_device_t,s0) ++/dev/dmfm.* -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/dmmidi.* -c gen_context(system_u:object_r:sound_device_t,s0) ++/dev/drm_dp_aux.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/dsp.* -c gen_context(system_u:object_r:sound_device_t,s0) ++/dev/ecryptfs -c gen_context(system_u:object_r:ecryptfs_device_t,mls_systemhigh) ++/dev/ptp.* -c gen_context(system_u:object_r:clock_device_t,s0) + /dev/efirtc -c gen_context(system_u:object_r:clock_device_t,s0) + /dev/elographics/e2201 -c gen_context(system_u:object_r:mouse_device_t,s0) + /dev/em8300.* -c gen_context(system_u:object_r:v4l_device_t,s0) +@@ -42,8 +46,15 @@ + /dev/hpet -c gen_context(system_u:object_r:clock_device_t,s0) + /dev/hw_random -c gen_context(system_u:object_r:random_device_t,s0) + /dev/hwrng -c gen_context(system_u:object_r:random_device_t,s0) ++/dev/gpiochip[0-9]+ -c gen_context(system_u:object_r:gpio_device_t,s0) + /dev/i915 -c gen_context(system_u:object_r:dri_device_t,s0) + /dev/inportbm -c gen_context(system_u:object_r:mouse_device_t,s0) ++/dev/infiniband/.* -c gen_context(system_u:object_r:infiniband_device_t,mls_systemhigh) ++/dev/infiniband/issm[0-9]+ -c gen_context(system_u:object_r:infiniband_mgmt_device_t,mls_systemhigh) ++/dev/infiniband/umad[0-9]+ -c gen_context(system_u:object_r:infiniband_mgmt_device_t,mls_systemhigh) ++/dev/infiniband/.* -b gen_context(system_u:object_r:infiniband_device_t,mls_systemhigh) ++/dev/infiniband/issm[0-9]+ -b gen_context(system_u:object_r:infiniband_mgmt_device_t,mls_systemhigh) ++/dev/infiniband/umad[0-9]+ -b gen_context(system_u:object_r:infiniband_mgmt_device_t,mls_systemhigh) + /dev/ipmi[0-9]+ -c gen_context(system_u:object_r:ipmi_device_t,s0) + /dev/ipmi/[0-9]+ -c gen_context(system_u:object_r:ipmi_device_t,s0) + /dev/irlpt[0-9]+ -c gen_context(system_u:object_r:printer_device_t,s0) +@@ -61,8 +72,10 @@ + /dev/loop-control -c gen_context(system_u:object_r:loop_control_device_t,s0) + /dev/lp.* -c gen_context(system_u:object_r:printer_device_t,s0) + /dev/mcelog -c gen_context(system_u:object_r:kmsg_device_t,mls_systemhigh) +-/dev/mei -c gen_context(system_u:object_r:mei_device_t,s0) ++/dev/media.* -c gen_context(system_u:object_r:v4l_device_t,s0) ++/dev/mei[0-9]* -c gen_context(system_u:object_r:mei_device_t,s0) + /dev/mem -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) ++/dev/memory_bandwidth -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) + /dev/mergemem -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) + /dev/mga_vid.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/mice -c gen_context(system_u:object_r:mouse_device_t,s0) +@@ -72,7 +85,9 @@ + /dev/mixer.* -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/mmetfgrab -c gen_context(system_u:object_r:scanner_device_t,s0) + /dev/modem -c gen_context(system_u:object_r:modem_device_t,s0) ++/dev/monwriter -c gen_context(system_u:object_r:monitor_device_t,s0) + /dev/mpu401.* -c gen_context(system_u:object_r:sound_device_t,s0) ++/dev/mpt[0-9]*ctl -c gen_context(system_u:object_r:mptctl_device_t,s0) + /dev/msr.* -c gen_context(system_u:object_r:cpu_device_t,s0) + /dev/net/vhost -c gen_context(system_u:object_r:vhost_device_t,s0) + /dev/network_latency -c gen_context(system_u:object_r:netcontrol_device_t,s0) +@@ -80,7 +95,10 @@ + /dev/noz.* -c gen_context(system_u:object_r:modem_device_t,s0) + /dev/null -c gen_context(system_u:object_r:null_device_t,s0) + /dev/nvidia.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) ++/dev/nvme.* -c gen_context(system_u:object_r:nvme_device_t,s0) ++/dev/nvme.* -b gen_context(system_u:object_r:nvme_device_t,s0) + /dev/nvram -c gen_context(system_u:object_r:nvram_device_t,mls_systemhigh) ++/dev/ndctl[0-9] -c gen_context(system_u:object_r:nvram_device_t,mls_systemhigh) + /dev/oldmem -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) + /dev/opengl -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/par.* -c gen_context(system_u:object_r:printer_device_t,s0) +@@ -88,11 +106,15 @@ + /dev/pc110pad -c gen_context(system_u:object_r:mouse_device_t,s0) + /dev/pcfclock.* -c gen_context(system_u:object_r:clock_device_t,s0) + /dev/pmu -c gen_context(system_u:object_r:power_device_t,s0) ++/dev/opal-prd -c gen_context(system_u:object_r:opal_device_t,s0) ++/dev/op_panel -c gen_context(system_u:object_r:opal_device_t,s0) + /dev/port -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) + /dev/pps.* -c gen_context(system_u:object_r:clock_device_t,s0) ++/dev/prandom -c gen_context(system_u:object_r:random_device_t,s0) + /dev/(misc/)?psaux -c gen_context(system_u:object_r:mouse_device_t,s0) + /dev/rmidi.* -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/radeon -c gen_context(system_u:object_r:dri_device_t,s0) ++/dev/kfd -c gen_context(system_u:object_r:hsa_device_t,s0) + /dev/radio.* -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/random -c gen_context(system_u:object_r:random_device_t,s0) + /dev/raw1394.* -c gen_context(system_u:object_r:v4l_device_t,s0) +@@ -106,8 +128,10 @@ + /dev/snapshot -c gen_context(system_u:object_r:apm_bios_t,s0) + /dev/sndstat -c gen_context(system_u:object_r:sound_device_t,s0) + /dev/sonypi -c gen_context(system_u:object_r:v4l_device_t,s0) ++/dev/spidev.* -c gen_context(system_u:object_r:usb_device_t,s0) + /dev/tlk[0-3] -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/tpm[0-9]* -c gen_context(system_u:object_r:tpm_device_t,s0) ++/dev/tpmrm[0-9]* -c gen_context(system_u:object_r:tpm_device_t,s0) + /dev/uinput -c gen_context(system_u:object_r:event_device_t,s0) + /dev/uio[0-9]+ -c gen_context(system_u:object_r:userio_device_t,s0) + /dev/urandom -c gen_context(system_u:object_r:urandom_device_t,s0) +@@ -118,7 +142,17 @@ + ifdef(`distro_suse', ` + /dev/usbscanner -c gen_context(system_u:object_r:scanner_device_t,s0) + ') ++/dev/vmci -c gen_context(system_u:object_r:vmci_device_t,s0) ++/dev/vsock -c gen_context(system_u:object_r:vsock_device_t,s0) ++/dev/vhci -c gen_context(system_u:object_r:vhost_device_t,s0) ++/dev/vchiq -c gen_context(system_u:object_r:v4l_device_t,s0) ++/dev/vc-mem -c gen_context(system_u:object_r:memory_device_t,mls_systemhigh) ++/dev/vfio/(vfio)?[0-9]* -c gen_context(system_u:object_r:vfio_device_t,s0) ++/dev/clp[0-9]* -c gen_context(system_u:object_r:vfio_device_t,s0) ++/dev/sclp[0-9]* -c gen_context(system_u:object_r:vfio_device_t,s0) ++/dev/vmcp[0-9]* -c gen_context(system_u:object_r:vfio_device_t,s0) + /dev/vhost-net -c gen_context(system_u:object_r:vhost_device_t,s0) ++/dev/vhost-vsock -c gen_context(system_u:object_r:vhost_device_t,s0) + /dev/vbi.* -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/vbox.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/vga_arbiter -c gen_context(system_u:object_r:xserver_misc_device_t,s0) +@@ -129,12 +163,15 @@ ifdef(`distro_suse', ` + /dev/vttuner -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/vtx.* -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/watchdog.* -c gen_context(system_u:object_r:watchdog_device_t,s0) ++/dev/cdc-wdm[0-9] -c gen_context(system_u:object_r:modem_device_t,s0) + /dev/winradio.* -c gen_context(system_u:object_r:v4l_device_t,s0) + /dev/z90crypt -c gen_context(system_u:object_r:crypt_device_t,s0) ++/dev/pkey -c gen_context(system_u:object_r:crypt_device_t,s0) + /dev/zero -c gen_context(system_u:object_r:zero_device_t,s0) + + /dev/bus/usb/.*/[0-9]+ -c gen_context(system_u:object_r:usb_device_t,s0) + ++/dev/ati/card.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/card.* -c gen_context(system_u:object_r:xserver_misc_device_t,s0) + /dev/cmx.* -c gen_context(system_u:object_r:smartcard_device_t,s0) + +@@ -169,18 +206,26 @@ ifdef(`distro_suse', ` + + /dev/s(ou)?nd/.* -c gen_context(system_u:object_r:sound_device_t,s0) + ++/dev/ss[0-9]+ -c gen_context(system_u:object_r:gpfs_device_t,s0) ++ + /dev/touchscreen/ucb1x00 -c gen_context(system_u:object_r:mouse_device_t,s0) + /dev/touchscreen/mk712 -c gen_context(system_u:object_r:mouse_device_t,s0) + ++/dev/uhid -c gen_context(system_u:object_r:uhid_device_t,s0) ++ + /dev/usb/dc2xx.* -c gen_context(system_u:object_r:scanner_device_t,s0) + /dev/usb/lp.* -c gen_context(system_u:object_r:printer_device_t,s0) + /dev/usb/mdc800.* -c gen_context(system_u:object_r:scanner_device_t,s0) + /dev/usb/scanner.* -c gen_context(system_u:object_r:scanner_device_t,s0) + ++/dev/vmbus/hv_vss -c gen_context(system_u:object_r:hypervvssd_device_t,s0) ++/dev/vmbus/hv_kvp -c gen_context(system_u:object_r:hypervkvp_device_t,s0) ++ + /dev/xen/blktap.* -c gen_context(system_u:object_r:xen_device_t,s0) + /dev/xen/evtchn -c gen_context(system_u:object_r:xen_device_t,s0) + /dev/xen/gntdev -c gen_context(system_u:object_r:xen_device_t,s0) + /dev/xen/gntalloc -c gen_context(system_u:object_r:xen_device_t,s0) ++/dev/xen/xenbus -c gen_context(system_u:object_r:xen_device_t,s0) + + ifdef(`distro_debian',` + # this is a static /dev dir "backup mount" +@@ -198,12 +243,27 @@ ifdef(`distro_debian',` + /lib/udev/devices/null -c gen_context(system_u:object_r:null_device_t,s0) + /lib/udev/devices/zero -c gen_context(system_u:object_r:zero_device_t,s0) + +-/sys(/.*)? gen_context(system_u:object_r:sysfs_t,s0) +- + ifdef(`distro_redhat',` + # originally from named.fc + /var/named/chroot/dev -d gen_context(system_u:object_r:device_t,s0) + /var/named/chroot/dev/null -c gen_context(system_u:object_r:null_device_t,s0) + /var/named/chroot/dev/random -c gen_context(system_u:object_r:random_device_t,s0) + /var/named/chroot/dev/zero -c gen_context(system_u:object_r:zero_device_t,s0) ++/var/named/chroot_sdb/dev -d gen_context(system_u:object_r:device_t,s0) ++/var/named/chroot_sdb/dev/null -c gen_context(system_u:object_r:null_device_t,s0) ++/var/named/chroot_sdb/dev/random -c gen_context(system_u:object_r:random_device_t,s0) ++/var/named/chroot_sdb/dev/zero -c gen_context(system_u:object_r:zero_device_t,s0) ++/ ++/var/spool/postfix/dev -d gen_context(system_u:object_r:device_t,s0) + ') ++ ++# ++# /sys ++# ++/sys(/.*)? gen_context(system_u:object_r:sysfs_t,s0) ++/sys/devices/system/cpu/online gen_context(system_u:object_r:cpu_online_t,s0) ++ ++/usr/lib/udev/devices(/.*)? gen_context(system_u:object_r:device_t,s0) ++/usr/lib/udev/devices/lp.* -c gen_context(system_u:object_r:printer_device_t,s0) ++/usr/lib/udev/devices/null -c gen_context(system_u:object_r:null_device_t,s0) ++/usr/lib/udev/devices/zero -c gen_context(system_u:object_r:zero_device_t,s0) +diff --git a/policy/modules/kernel/devices.if b/policy/modules/kernel/devices.if +index 76f285ea65..ee4faea7bb 100644 +--- a/policy/modules/kernel/devices.if ++++ b/policy/modules/kernel/devices.if +@@ -143,13 +143,32 @@ interface(`dev_relabel_all_dev_nodes',` + type device_t; + ') + +- relabelfrom_dirs_pattern($1, device_t, device_node) +- relabelfrom_files_pattern($1, device_t, device_node) +- relabelfrom_lnk_files_pattern($1, device_t, { device_t device_node }) +- relabelfrom_fifo_files_pattern($1, device_t, device_node) +- relabelfrom_sock_files_pattern($1, device_t, device_node) +- relabel_blk_files_pattern($1, device_t, { device_t device_node }) +- relabel_chr_files_pattern($1, device_t, { device_t device_node }) ++ relabel_dirs_pattern($1, device_t, device_node) ++ relabel_files_pattern($1, device_t, device_node) ++ relabel_lnk_files_pattern($1, device_t, device_node) ++ relabel_fifo_files_pattern($1, device_t, device_node) ++ relabel_sock_files_pattern($1, device_t, device_node) ++ relabel_blk_files_pattern($1, device_t, device_node) ++ relabel_chr_files_pattern($1, device_t, device_node) ++') ++ ++######################################## ++## ++## Allow full relabeling (to and from) of all device files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`dev_relabel_all_dev_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ relabel_files_pattern($1, device_t, device_t) + ') + + ######################################## +@@ -207,6 +226,24 @@ interface(`dev_dontaudit_list_all_dev_nodes',` + dontaudit $1 device_t:dir list_dir_perms; + ') + ++######################################## ++## ++## Dontaudit attempts to list all device nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_all_access_check',` ++ gen_require(` ++ attribute device_node; ++ ') ++ ++ dontaudit $1 device_node:file_class_set audit_access; ++') ++ + ######################################## + ## + ## Add entries to directories in /dev. +@@ -352,6 +389,24 @@ interface(`dev_read_generic_files',` + read_files_pattern($1, device_t, device_t) + ') + ++####################################### ++## ++## Read generic files in /dev. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_read_generic_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ dontaudit $1 device_t:file { read getattr }; ++') ++ + ######################################## + ## + ## Read and write generic files in /dev. +@@ -460,6 +515,42 @@ interface(`dev_getattr_generic_blk_files',` + getattr_blk_files_pattern($1, device_t, device_t) + ') + ++######################################## ++## ++## Rename generic block device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rename_generic_blk_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ rename_blk_files_pattern($1, device_t, device_t) ++') ++ ++######################################## ++## ++## write generic sock files in /dev. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_write_generic_sock_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ write_sock_files_pattern($1, device_t, device_t) ++') ++ + ######################################## + ## + ## Dontaudit getattr on generic block devices. +@@ -568,6 +659,24 @@ interface(`dev_dontaudit_getattr_generic_chr_files',` + dontaudit $1 device_t:chr_file getattr; + ') + ++######################################## ++## ++## Rename generic character device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rename_generic_chr_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ rename_chr_files_pattern($1, device_t, device_t) ++') ++ + ######################################## + ## + ## Dontaudit setattr for generic character device files. +@@ -646,7 +755,7 @@ interface(`dev_rw_generic_blk_files',` + ## + ## + ## +-## Domain to dontaudit access. ++## Domain to not audit. + ## + ## + # +@@ -733,7 +842,7 @@ interface(`dev_dontaudit_setattr_generic_symlinks',` + + ######################################## + ## +-## Read symbolic links in device directories. ++## Create symbolic links in device directories. + ## + ## + ## +@@ -741,17 +850,17 @@ interface(`dev_dontaudit_setattr_generic_symlinks',` + ## + ## + # +-interface(`dev_read_generic_symlinks',` ++interface(`dev_create_generic_symlinks',` + gen_require(` + type device_t; + ') + +- allow $1 device_t:lnk_file read_lnk_file_perms; ++ create_lnk_files_pattern($1, device_t, device_t) + ') + + ######################################## + ## +-## Create symbolic links in device directories. ++## Delete symbolic links in device directories. + ## + ## + ## +@@ -759,17 +868,17 @@ interface(`dev_read_generic_symlinks',` + ## + ## + # +-interface(`dev_create_generic_symlinks',` ++interface(`dev_delete_generic_symlinks',` + gen_require(` + type device_t; + ') + +- create_lnk_files_pattern($1, device_t, device_t) ++ delete_lnk_files_pattern($1, device_t, device_t) + ') + + ######################################## + ## +-## Delete symbolic links in device directories. ++## Read symbolic links in device directories. + ## + ## + ## +@@ -777,12 +886,12 @@ interface(`dev_create_generic_symlinks',` + ## + ## + # +-interface(`dev_delete_generic_symlinks',` ++interface(`dev_read_generic_symlinks',` + gen_require(` + type device_t; + ') + +- delete_lnk_files_pattern($1, device_t, device_t) ++ allow $1 device_t:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -875,6 +984,24 @@ interface(`dev_dontaudit_rw_generic_dev_nodes',` + dontaudit $1 device_t:{ chr_file blk_file } { getattr read write ioctl }; + ') + ++######################################## ++## ++## Read block device files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_generic_blk_files',` ++ gen_require(` ++ type device_t; ++ ') ++ ++ read_blk_files_pattern($1, device_t, device_t) ++') ++ + ######################################## + ## + ## Create, delete, read, and write block device files. +@@ -981,6 +1108,25 @@ interface(`dev_tmpfs_filetrans_dev',` + fs_tmpfs_filetrans($1, device_t, $2, $3) + ') + ++######################################## ++## ++## Allow getattr on all device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_all',` ++ gen_require(` ++ attribute device_node; ++ type device_t; ++ ') ++ ++ allow $1 { device_t device_node }:dir_file_class_set getattr; ++') ++ + ######################################## + ## + ## Getattr on all block file device nodes. +@@ -1001,6 +1147,26 @@ interface(`dev_getattr_all_blk_files',` + getattr_blk_files_pattern($1, device_t, device_node) + ') + ++######################################## ++## ++## Read on all block file device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`dev_read_all_blk_files',` ++ gen_require(` ++ attribute device_node; ++ type device_t; ++ ') ++ ++ read_blk_files_pattern($1, device_t, device_node) ++') ++ + ######################################## + ## + ## Dontaudit getattr on all block file device nodes. +@@ -1034,6 +1200,7 @@ interface(`dev_dontaudit_getattr_all_blk_files',` + interface(`dev_getattr_all_chr_files',` + gen_require(` + attribute device_node; ++ type device_t; + ') + + getattr_chr_files_pattern($1, device_t, device_node) +@@ -1204,6 +1371,42 @@ interface(`dev_create_all_chr_files',` + create_chr_files_pattern($1, device_t, device_node) + ') + ++######################################## ++## ++## rw all inherited character device files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_all_inherited_chr_files',` ++ gen_require(` ++ attribute device_node; ++ ') ++ ++ allow $1 device_node:chr_file rw_inherited_chr_file_perms; ++') ++ ++######################################## ++## ++## rw all inherited blk device files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_all_inherited_blk_files',` ++ gen_require(` ++ attribute device_node; ++ ') ++ ++ allow $1 device_node:blk_file rw_inherited_blk_file_perms; ++') ++ + ######################################## + ## + ## Delete all block device files. +@@ -1558,25 +1761,6 @@ interface(`dev_relabel_autofs_dev',` + allow $1 autofs_device_t:chr_file relabel_chr_file_perms; + ') + +-######################################## +-## +-## Read and write cachefiles character +-## device nodes. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`dev_rw_cachefiles',` +- gen_require(` +- type device_t, cachefiles_device_t; +- ') +- +- rw_chr_files_pattern($1, device_t, cachefiles_device_t) +-') +- + ######################################## + ## + ## Read and write the PCMCIA card manager device. +@@ -1680,6 +1864,26 @@ interface(`dev_filetrans_cardmgr',` + filetrans_pattern($1, device_t, cardmgr_dev_t, { chr_file blk_file }, $2) + ') + ++######################################## ++## ++## Automatic type transition to the type ++## for xserver misc device nodes when ++## created in /dev. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_filetrans_xserver_misc',` ++ gen_require(` ++ type device_t, xserver_misc_device_t; ++ ') ++ ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file ) ++') ++ + ######################################## + ## + ## Get the attributes of the CPU +@@ -1791,6 +1995,24 @@ interface(`dev_rw_crypto',` + rw_chr_files_pattern($1, device_t, crypt_device_t) + ') + ++######################################## ++## ++## Read and write the the ecrypt filesystem device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_ecryptfs',` ++ gen_require(` ++ type device_t, ecryptfs_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, ecryptfs_device_t) ++') ++ + ####################################### + ## + ## Set the attributes of the dlm control devices. +@@ -1865,7 +2087,7 @@ interface(`dev_setattr_dri_dev',` + + ######################################## + ## +-## Read and write the dri devices. ++## Mmap the dri devices. + ## + ## + ## +@@ -1873,35 +2095,36 @@ interface(`dev_setattr_dri_dev',` + ## + ## + # +-interface(`dev_rw_dri',` ++interface(`dev_map_dri',` + gen_require(` + type device_t, dri_device_t; + ') + +- rw_chr_files_pattern($1, device_t, dri_device_t) ++ allow $1 dri_device_t:chr_file map; + ') + + ######################################## + ## +-## Dontaudit read and write on the dri devices. ++## Read and write the dri devices. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_rw_dri',` ++interface(`dev_rw_dri',` + gen_require(` +- type dri_device_t; ++ type device_t, dri_device_t; + ') + +- dontaudit $1 dri_device_t:chr_file rw_chr_file_perms; ++ rw_chr_files_pattern($1, device_t, dri_device_t) ++ allow $1 dri_device_t:chr_file map; + ') + + ######################################## + ## +-## Create, read, write, and delete the dri devices. ++## Read and write the dri devices. + ## + ## + ## +@@ -1909,26 +2132,63 @@ interface(`dev_dontaudit_rw_dri',` + ## + ## + # +-interface(`dev_manage_dri_dev',` ++interface(`dev_rw_inherited_dri',` + gen_require(` + type device_t, dri_device_t; + ') + +- manage_chr_files_pattern($1, device_t, dri_device_t) ++ allow $1 device_t:dir search_dir_perms; ++ allow $1 dri_device_t:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## + ## +-## Automatic type transition to the type +-## for DRI device nodes when created in /dev. ++## Dontaudit read and write on the dri devices. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## +-## +-## ++# ++interface(`dev_dontaudit_rw_dri',` ++ gen_require(` ++ type dri_device_t; ++ ') ++ ++ dontaudit $1 dri_device_t:chr_file rw_chr_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete the dri devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_manage_dri_dev',` ++ gen_require(` ++ type device_t, dri_device_t; ++ ') ++ ++ manage_chr_files_pattern($1, device_t, dri_device_t) ++') ++ ++######################################## ++## ++## Automatic type transition to the type ++## for DRI device nodes when created in /dev. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## + ## The name of the object being created. + ## + ## +@@ -2015,6 +2275,181 @@ interface(`dev_rw_input_dev',` + rw_chr_files_pattern($1, device_t, event_device_t) + ') + ++######################################## ++## ++## Read input event devices (/dev/input). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_inherited_input_dev',` ++ gen_require(` ++ type device_t, event_device_t; ++ ') ++ ++ allow $1 device_t:dir search_dir_perms; ++ allow $1 event_device_t:chr_file rw_inherited_chr_file_perms; ++') ++ ++######################################## ++## ++## Read ipmi devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_ipmi_dev',` ++ gen_require(` ++ type device_t, ipmi_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, ipmi_device_t) ++') ++ ++######################################## ++## ++## Read and write ipmi devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_ipmi_dev',` ++ gen_require(` ++ type device_t, ipmi_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, ipmi_device_t) ++') ++ ++######################################## ++## ++## Manage ipmi devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_manage_ipmi_dev',` ++ gen_require(` ++ type device_t, ipmi_device_t; ++ ') ++ ++ manage_chr_files_pattern($1, device_t, ipmi_device_t) ++') ++ ++######################################## ++## ++## Automatic type transition to the type ++## for PCMCIA card manager device nodes when ++## created in /dev. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`dev_filetrans_ipmi',` ++ gen_require(` ++ type device_t, ipmi_device_t; ++ ') ++ ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, $2) ++') ++ ++######################################## ++## ++## Read infiniband devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_infiniband_dev',` ++ gen_require(` ++ type device_t, infiniband_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, infiniband_device_t) ++ read_blk_files_pattern($1, device_t, infiniband_device_t) ++') ++ ++######################################## ++## ++## Read and write ipmi devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_infiniband_dev',` ++ gen_require(` ++ type device_t, infiniband_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, infiniband_device_t) ++ rw_blk_files_pattern($1, device_t, infiniband_device_t) ++ allow $1 infiniband_device_t:chr_file map; ++') ++ ++######################################## ++## ++## Read infiniband mgmt devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_infiniband_mgmt_dev',` ++ gen_require(` ++ type device_t, infiniband_mgmt_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, infiniband_mgmt_device_t) ++ read_blk_files_pattern($1, device_t, infiniband_mgmt_device_t) ++') ++ ++######################################## ++## ++## Read and write ipmi devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_infiniband_mgmt_dev',` ++ gen_require(` ++ type device_t, infiniband_mgmt_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, infiniband_mgmt_device_t) ++ rw_blk_files_pattern($1, device_t, infiniband_mgmt_device_t) ++') ++ + ######################################## + ## + ## Get the attributes of the framebuffer device node. +@@ -2124,6 +2559,24 @@ interface(`dev_write_framebuffer',` + write_chr_files_pattern($1, device_t, framebuf_device_t) + ') + ++######################################## ++## ++## Mmap the framebuffer. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_map_framebuffer',` ++ gen_require(` ++ type framebuf_device_t; ++ ') ++ ++ allow $1 framebuf_device_t:file map; ++') ++ + ######################################## + ## + ## Read and write the framebuffer. +@@ -2402,7 +2855,7 @@ interface(`dev_filetrans_lirc',` + + ######################################## + ## +-## Get the attributes of the lvm comtrol device. ++## Get the attributes of the loop comtrol device. + ## + ## + ## +@@ -2410,17 +2863,17 @@ interface(`dev_filetrans_lirc',` + ## + ## + # +-interface(`dev_getattr_lvm_control',` ++interface(`dev_getattr_loop_control',` + gen_require(` +- type device_t, lvm_control_t; ++ type device_t, loop_control_device_t; + ') + +- getattr_chr_files_pattern($1, device_t, lvm_control_t) ++ getattr_chr_files_pattern($1, device_t, loop_control_device_t) + ') + + ######################################## + ## +-## Read the lvm comtrol device. ++## Read the loop comtrol device. + ## + ## + ## +@@ -2428,17 +2881,17 @@ interface(`dev_getattr_lvm_control',` + ## + ## + # +-interface(`dev_read_lvm_control',` ++interface(`dev_read_loop_control',` + gen_require(` +- type device_t, lvm_control_t; ++ type device_t, loop_control_device_t; + ') + +- read_chr_files_pattern($1, device_t, lvm_control_t) ++ read_chr_files_pattern($1, device_t, loop_control_device_t) + ') + + ######################################## + ## +-## Read and write the lvm control device. ++## Read and write the loop control device. + ## + ## + ## +@@ -2446,17 +2899,17 @@ interface(`dev_read_lvm_control',` + ## + ## + # +-interface(`dev_rw_lvm_control',` ++interface(`dev_rw_loop_control',` + gen_require(` +- type device_t, lvm_control_t; ++ type device_t, loop_control_device_t; + ') + +- rw_chr_files_pattern($1, device_t, lvm_control_t) ++ rw_chr_files_pattern($1, device_t, loop_control_device_t) + ') + + ######################################## + ## +-## Do not audit attempts to read and write lvm control device. ++## Do not audit attempts to read and write loop control device. + ## + ## + ## +@@ -2464,17 +2917,17 @@ interface(`dev_rw_lvm_control',` + ## + ## + # +-interface(`dev_dontaudit_rw_lvm_control',` ++interface(`dev_dontaudit_rw_loop_control',` + gen_require(` +- type lvm_control_t; ++ type loop_control_device_t; + ') + +- dontaudit $1 lvm_control_t:chr_file rw_file_perms; ++ dontaudit $1 loop_control_device_t:chr_file rw_file_perms; + ') + + ######################################## + ## +-## Delete the lvm control device. ++## Delete the loop control device. + ## + ## + ## +@@ -2482,35 +2935,35 @@ interface(`dev_dontaudit_rw_lvm_control',` + ## + ## + # +-interface(`dev_delete_lvm_control_dev',` ++interface(`dev_delete_loop_control_dev',` + gen_require(` +- type device_t, lvm_control_t; ++ type device_t, loop_control_device_t; + ') + +- delete_chr_files_pattern($1, device_t, lvm_control_t) ++ delete_chr_files_pattern($1, device_t, loop_control_device_t) + ') + + ######################################## + ## +-## dontaudit getattr raw memory devices (e.g. /dev/mem). ++## Get the attributes of the loop comtrol device. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_getattr_memory_dev',` ++interface(`dev_getattr_lvm_control',` + gen_require(` +- type memory_device_t; ++ type device_t, lvm_control_t; + ') + +- dontaudit $1 memory_device_t:chr_file getattr; ++ getattr_chr_files_pattern($1, device_t, lvm_control_t) + ') + + ######################################## + ## +-## Read raw memory devices (e.g. /dev/mem). ++## Read the lvm comtrol device. + ## + ## + ## +@@ -2518,62 +2971,153 @@ interface(`dev_dontaudit_getattr_memory_dev',` + ## + ## + # +-interface(`dev_read_raw_memory',` ++interface(`dev_read_lvm_control',` + gen_require(` +- type device_t, memory_device_t; +- attribute memory_raw_read; ++ type device_t, lvm_control_t; + ') + +- read_chr_files_pattern($1, device_t, memory_device_t) +- +- allow $1 self:capability sys_rawio; +- typeattribute $1 memory_raw_read; ++ read_chr_files_pattern($1, device_t, lvm_control_t) + ') + + ######################################## + ## +-## Do not audit attempts to read raw memory devices +-## (e.g. /dev/mem). ++## Read and write the lvm control device. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_read_raw_memory',` ++interface(`dev_rw_lvm_control',` + gen_require(` +- type memory_device_t; ++ type device_t, lvm_control_t; + ') + +- dontaudit $1 memory_device_t:chr_file read_chr_file_perms; ++ rw_chr_files_pattern($1, device_t, lvm_control_t) + ') + + ######################################## + ## +-## Write raw memory devices (e.g. /dev/mem). ++## Do not audit attempts to read and write lvm control device. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_write_raw_memory',` ++interface(`dev_dontaudit_rw_lvm_control',` + gen_require(` +- type device_t, memory_device_t; +- attribute memory_raw_write; ++ type lvm_control_t; + ') + +- write_chr_files_pattern($1, device_t, memory_device_t) +- +- allow $1 self:capability sys_rawio; +- typeattribute $1 memory_raw_write; ++ dontaudit $1 lvm_control_t:chr_file rw_file_perms; + ') + + ######################################## + ## +-## Read and execute raw memory devices (e.g. /dev/mem). ++## Delete the lvm control device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_delete_lvm_control_dev',` ++ gen_require(` ++ type device_t, lvm_control_t; ++ ') ++ ++ delete_chr_files_pattern($1, device_t, lvm_control_t) ++') ++ ++######################################## ++## ++## dontaudit getattr raw memory devices (e.g. /dev/mem). ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_getattr_memory_dev',` ++ gen_require(` ++ type memory_device_t; ++ ') ++ ++ dontaudit $1 memory_device_t:chr_file getattr; ++') ++ ++######################################## ++## ++## Read raw memory devices (e.g. /dev/mem). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_raw_memory',` ++ gen_require(` ++ type device_t, memory_device_t; ++ attribute memory_raw_read; ++ ') ++ ++ read_chr_files_pattern($1, device_t, memory_device_t) ++ allow $1 memory_device_t:chr_file map; ++ ++ allow $1 self:capability sys_rawio; ++ typeattribute $1 memory_raw_read; ++') ++ ++######################################## ++## ++## Do not audit attempts to read raw memory devices ++## (e.g. /dev/mem). ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_read_raw_memory',` ++ gen_require(` ++ type memory_device_t; ++ ') ++ ++ dontaudit $1 memory_device_t:chr_file read_chr_file_perms; ++') ++ ++######################################## ++## ++## Write raw memory devices (e.g. /dev/mem). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_write_raw_memory',` ++ gen_require(` ++ type device_t, memory_device_t; ++ attribute memory_raw_write; ++ ') ++ ++ write_chr_files_pattern($1, device_t, memory_device_t) ++ ++ allow $1 self:capability sys_rawio; ++ typeattribute $1 memory_raw_write; ++') ++ ++######################################## ++## ++## Read and execute raw memory devices (e.g. /dev/mem). + ## + ## + ## +@@ -2587,7 +3131,7 @@ interface(`dev_rx_raw_memory',` + ') + + dev_read_raw_memory($1) +- allow $1 memory_device_t:chr_file execute; ++ allow $1 memory_device_t:chr_file { map execute }; + ') + + ######################################## +@@ -2606,7 +3150,7 @@ interface(`dev_wx_raw_memory',` + ') + + dev_write_raw_memory($1) +- allow $1 memory_device_t:chr_file execute; ++ allow $1 memory_device_t:chr_file { map execute }; + ') + + ######################################## +@@ -2725,7 +3269,7 @@ interface(`dev_write_misc',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -2809,6 +3353,78 @@ interface(`dev_rw_modem',` + rw_chr_files_pattern($1, device_t, modem_device_t) + ') + ++######################################## ++## ++## Get the attributes of the monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_monitor_dev',` ++ gen_require(` ++ type device_t, monitor_device_t; ++ ') ++ ++ getattr_chr_files_pattern($1, device_t, monitor_device_t) ++') ++ ++######################################## ++## ++## Set the attributes of the monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_monitor_dev',` ++ gen_require(` ++ type device_t, monitor_device_t; ++ ') ++ ++ setattr_chr_files_pattern($1, device_t, monitor_device_t) ++') ++ ++######################################## ++## ++## Read the monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_monitor_dev',` ++ gen_require(` ++ type device_t, monitor_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, monitor_device_t) ++') ++ ++######################################## ++## ++## Read and write to monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_monitor_dev',` ++ gen_require(` ++ type device_t, monitor_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, monitor_device_t) ++') ++ + ######################################## + ## + ## Get the attributes of the mouse devices. +@@ -2903,20 +3519,20 @@ interface(`dev_getattr_mtrr_dev',` + + ######################################## + ## +-## Read the memory type range ++## Write the memory type range + ## registers (MTRR). (Deprecated) + ## + ## + ##

+-## Read the memory type range ++## Write the memory type range + ## registers (MTRR). This interface has + ## been deprecated, dev_rw_mtrr() should be + ## used instead. + ##

+ ##

+ ## The MTRR device ioctls can be used for +-## reading and writing; thus, read access to the +-## device cannot be separated from write access. ++## reading and writing; thus, write access to the ++## device cannot be separated from read access. + ##

+ ##
+ ## +@@ -2925,43 +3541,34 @@ interface(`dev_getattr_mtrr_dev',` + ##
+ ## + # +-interface(`dev_read_mtrr',` ++interface(`dev_write_mtrr',` + refpolicywarn(`$0($*) has been replaced with dev_rw_mtrr().') + dev_rw_mtrr($1) + ') + + ######################################## + ## +-## Write the memory type range +-## registers (MTRR). (Deprecated) ++## Do not audit attempts to write the memory type ++## range registers (MTRR). + ## +-## +-##

+-## Write the memory type range +-## registers (MTRR). This interface has +-## been deprecated, dev_rw_mtrr() should be +-## used instead. +-##

+-##

+-## The MTRR device ioctls can be used for +-## reading and writing; thus, write access to the +-## device cannot be separated from read access. +-##

+-##
+ ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_write_mtrr',` +- refpolicywarn(`$0($*) has been replaced with dev_rw_mtrr().') +- dev_rw_mtrr($1) ++interface(`dev_dontaudit_write_mtrr',` ++ gen_require(` ++ type mtrr_device_t; ++ ') ++ ++ dontaudit $1 mtrr_device_t:file write_file_perms; ++ dontaudit $1 mtrr_device_t:chr_file write_chr_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to write the memory type ++## Do not audit attempts to read the memory type + ## range registers (MTRR). + ## + ## +@@ -2970,13 +3577,32 @@ interface(`dev_write_mtrr',` + ##
+ ## + # +-interface(`dev_dontaudit_write_mtrr',` ++interface(`dev_dontaudit_read_mtrr',` + gen_require(` + type mtrr_device_t; + ') + +- dontaudit $1 mtrr_device_t:file write; +- dontaudit $1 mtrr_device_t:chr_file write; ++ dontaudit $1 mtrr_device_t:file { open read }; ++ dontaudit $1 mtrr_device_t:chr_file { open read }; ++') ++ ++######################################## ++## ++## Read the memory type range registers (MTRR). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_mtrr',` ++ gen_require(` ++ type device_t, mtrr_device_t; ++ ') ++ ++ read_files_pattern($1, device_t, mtrr_device_t) ++ read_chr_files_pattern($1, device_t, mtrr_device_t) + ') + + ######################################## +@@ -3144,44 +3770,43 @@ interface(`dev_create_null_dev',` + + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of the BIOS non-volatile RAM device. ++## Get the status of a null device service. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_getattr_nvram_dev',` ++interface(`dev_service_status_null_dev',` + gen_require(` +- type nvram_device_t; ++ type null_device_t; + ') + +- dontaudit $1 nvram_device_t:chr_file getattr; ++ allow $1 null_device_t:service status; + ') + + ######################################## + ## +-## Read and write BIOS non-volatile RAM. ++## Configure null_device as a unit files. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`dev_rw_nvram',` ++interface(`dev_config_null_dev_service',` + gen_require(` +- type nvram_device_t; ++ type null_device_t; + ') + +- rw_chr_files_pattern($1, device_t, nvram_device_t) ++ allow $1 null_device_t:service manage_service_perms; + ') + + ######################################## + ## +-## Get the attributes of the printer device nodes. ++## Read Non-Volatile Memory Host Controller Interface. + ## + ## + ## +@@ -3189,17 +3814,18 @@ interface(`dev_rw_nvram',` + ## + ## + # +-interface(`dev_getattr_printer_dev',` ++interface(`dev_read_nvme',` + gen_require(` +- type device_t, printer_device_t; ++ type nvme_device_t; + ') + +- getattr_chr_files_pattern($1, device_t, printer_device_t) ++ read_chr_files_pattern($1, device_t, nvme_device_t) ++ read_blk_files_pattern($1, device_t, nvme_device_t) + ') + + ######################################## + ## +-## Set the attributes of the printer device nodes. ++## Read/Write Non-Volatile Memory Host Controller Interface. + ## + ## + ## +@@ -3207,36 +3833,37 @@ interface(`dev_getattr_printer_dev',` + ## + ## + # +-interface(`dev_setattr_printer_dev',` ++interface(`dev_rw_nvme',` + gen_require(` +- type device_t, printer_device_t; ++ type nvme_device_t; + ') + +- setattr_chr_files_pattern($1, device_t, printer_device_t) ++ rw_chr_files_pattern($1, device_t, nvme_device_t) ++ rw_blk_files_pattern($1, device_t, nvme_device_t) + ') + + ######################################## + ## +-## Append the printer device. ++## Do not audit attempts to get the attributes ++## of the BIOS non-volatile RAM device. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-# cjp: added for lpd/checkpc_t +-interface(`dev_append_printer',` ++interface(`dev_dontaudit_getattr_nvram_dev',` + gen_require(` +- type device_t, printer_device_t; ++ type nvram_device_t; + ') + +- append_chr_files_pattern($1, device_t, printer_device_t) ++ dontaudit $1 nvram_device_t:chr_file getattr; + ') + + ######################################## + ## +-## Read and write the printer device. ++## Read BIOS non-volatile RAM. + ## + ## + ## +@@ -3244,17 +3871,17 @@ interface(`dev_append_printer',` + ## + ## + # +-interface(`dev_rw_printer',` ++interface(`dev_read_nvram',` + gen_require(` +- type device_t, printer_device_t; ++ type nvram_device_t; + ') + +- rw_chr_files_pattern($1, device_t, printer_device_t) ++ read_chr_files_pattern($1, device_t, nvram_device_t) + ') + + ######################################## + ## +-## Read printk devices (e.g., /dev/kmsg /dev/mcelog) ++## Read and write BIOS non-volatile RAM. + ## + ## + ## +@@ -3262,18 +3889,17 @@ interface(`dev_rw_printer',` + ## + ## + # +-interface(`dev_read_printk',` ++interface(`dev_rw_nvram',` + gen_require(` +- type device_t, printk_device_t; ++ type nvram_device_t; + ') + +- read_chr_files_pattern($1, device_t, printk_device_t) ++ rw_chr_files_pattern($1, device_t, nvram_device_t) + ') + + ######################################## + ## +-## Get the attributes of the QEMU +-## microcode and id interfaces. ++## Get the attributes of the printer device nodes. + ## + ## + ## +@@ -3281,9 +3907,120 @@ interface(`dev_read_printk',` + ## + ## + # +-interface(`dev_getattr_qemu_dev',` ++interface(`dev_getattr_printer_dev',` + gen_require(` +- type device_t, qemu_device_t; ++ type device_t, printer_device_t; ++ ') ++ ++ getattr_chr_files_pattern($1, device_t, printer_device_t) ++') ++ ++######################################## ++## ++## Set the attributes of the printer device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_printer_dev',` ++ gen_require(` ++ type device_t, printer_device_t; ++ ') ++ ++ setattr_chr_files_pattern($1, device_t, printer_device_t) ++') ++ ++######################################## ++## ++## Append the printer device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# cjp: added for lpd/checkpc_t ++interface(`dev_append_printer',` ++ gen_require(` ++ type device_t, printer_device_t; ++ ') ++ ++ append_chr_files_pattern($1, device_t, printer_device_t) ++') ++ ++######################################## ++## ++## Read and write the printer device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_printer',` ++ gen_require(` ++ type device_t, printer_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, printer_device_t) ++') ++ ++######################################## ++## ++## Relabel the printer device node. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_relabel_printer',` ++ gen_require(` ++ type printer_device_t; ++ ') ++ ++ allow $1 printer_device_t:chr_file relabel_chr_file_perms; ++') ++ ++######################################## ++## ++## Read and write the printer device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_manage_printer',` ++ gen_require(` ++ type device_t, printer_device_t; ++ ') ++ ++ manage_chr_files_pattern($1, device_t, printer_device_t) ++ dev_filetrans_printer_named_dev($1) ++') ++ ++######################################## ++## ++## Get the attributes of the QEMU ++## microcode and id interfaces. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_qemu_dev',` ++ gen_require(` ++ type device_t, qemu_device_t; + ') + + getattr_chr_files_pattern($1, device_t, qemu_device_t) +@@ -3399,7 +4136,7 @@ interface(`dev_dontaudit_read_rand',` + + ######################################## + ## +-## Do not audit attempts to append to random ++## Do not audit attempts to append to the random + ## number generator devices (e.g., /dev/random) + ## + ## +@@ -3413,7 +4150,7 @@ interface(`dev_dontaudit_append_rand',` + type random_device_t; + ') + +- dontaudit $1 random_device_t:chr_file append_chr_file_perms; ++ dontaudit $1 random_device_t:chr_file { append }; + ') + + ######################################## +@@ -3633,6 +4370,7 @@ interface(`dev_read_sound',` + ') + + read_chr_files_pattern($1, device_t, sound_device_t) ++ allow $1 sound_device_t:chr_file map; + ') + + ######################################## +@@ -3669,6 +4407,7 @@ interface(`dev_read_sound_mixer',` + ') + + read_chr_files_pattern($1, device_t, sound_device_t) ++ allow $1 sound_device_t:chr_file map; + ') + + ######################################## +@@ -3855,7 +4594,7 @@ interface(`dev_getattr_sysfs_dirs',` + + ######################################## + ## +-## Search the sysfs directories. ++## Set the attributes of sysfs directories. + ## + ## + ## +@@ -3863,91 +4602,89 @@ interface(`dev_getattr_sysfs_dirs',` + ## + ## + # +-interface(`dev_search_sysfs',` ++interface(`dev_setattr_sysfs_dirs',` + gen_require(` + type sysfs_t; + ') + +- search_dirs_pattern($1, sysfs_t, sysfs_t) ++ allow $1 sysfs_t:dir setattr_dir_perms; + ') + + ######################################## + ## +-## Do not audit attempts to search sysfs. ++## Get attributes of sysfs filesystems. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_search_sysfs',` ++interface(`dev_getattr_sysfs_fs',` + gen_require(` + type sysfs_t; + ') + +- dontaudit $1 sysfs_t:dir search_dir_perms; ++ allow $1 sysfs_t:filesystem getattr; + ') + + ######################################## + ## +-## List the contents of the sysfs directories. ++## Mount a filesystem on /sys + ## + ## + ## +-## Domain allowed access. ++## Domain allow access. + ## + ## + # +-interface(`dev_list_sysfs',` ++interface(`dev_mounton_sysfs',` + gen_require(` + type sysfs_t; + ') + +- list_dirs_pattern($1, sysfs_t, sysfs_t) ++ allow $1 sysfs_t:dir mounton; + ') + + ######################################## + ## +-## Write in a sysfs directories. ++## Dontaudit attempts to mount a filesystem on /sys + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-# cjp: added for cpuspeed +-interface(`dev_write_sysfs_dirs',` ++interface(`dev_dontaudit_mounton_sysfs',` + gen_require(` + type sysfs_t; + ') + +- allow $1 sysfs_t:dir write; ++ dontaudit $1 sysfs_t:dir mounton; + ') + + ######################################## + ## +-## Do not audit attempts to write in a sysfs directory. ++## Mount sysfs filesystems. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_write_sysfs_dirs',` ++interface(`dev_mount_sysfs_fs',` + gen_require(` + type sysfs_t; + ') + +- dontaudit $1 sysfs_t:dir write; ++ allow $1 sysfs_t:filesystem mount; + ') + + ######################################## + ## +-## Create, read, write, and delete sysfs +-## directories. ++## Unmount sysfs filesystems. + ## + ## + ## +@@ -3955,68 +4692,53 @@ interface(`dev_dontaudit_write_sysfs_dirs',` + ## + ## + # +-interface(`dev_manage_sysfs_dirs',` ++interface(`dev_unmount_sysfs_fs',` + gen_require(` + type sysfs_t; + ') + +- manage_dirs_pattern($1, sysfs_t, sysfs_t) ++ allow $1 sysfs_t:filesystem unmount; + ') + + ######################################## + ## +-## Read hardware state information. ++## Search the sysfs directories. + ## +-## +-##

+-## Allow the specified domain to read the contents of +-## the sysfs filesystem. This filesystem contains +-## information, parameters, and other settings on the +-## hardware installed on the system. +-##

+-##
+ ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`dev_read_sysfs',` ++interface(`dev_search_sysfs',` + gen_require(` + type sysfs_t; + ') + +- read_files_pattern($1, sysfs_t, sysfs_t) +- read_lnk_files_pattern($1, sysfs_t, sysfs_t) +- +- list_dirs_pattern($1, sysfs_t, sysfs_t) ++ search_dirs_pattern($1, sysfs_t, sysfs_t) + ') + + ######################################## + ## +-## Allow caller to modify hardware state information. ++## Do not audit attempts to search sysfs. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_rw_sysfs',` ++interface(`dev_dontaudit_search_sysfs',` + gen_require(` + type sysfs_t; + ') + +- rw_files_pattern($1, sysfs_t, sysfs_t) +- read_lnk_files_pattern($1, sysfs_t, sysfs_t) +- +- list_dirs_pattern($1, sysfs_t, sysfs_t) ++ dontaudit $1 sysfs_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Read and write the TPM device. ++## List the contents of the sysfs directories. + ## + ## + ## +@@ -4024,96 +4746,73 @@ interface(`dev_rw_sysfs',` + ## + ## + # +-interface(`dev_rw_tpm',` ++interface(`dev_list_sysfs',` + gen_require(` +- type device_t, tpm_device_t; ++ type sysfs_t; + ') + +- rw_chr_files_pattern($1, device_t, tpm_device_t) ++ read_lnk_files_pattern($1, sysfs_t, sysfs_t) ++ list_dirs_pattern($1, sysfs_t, sysfs_t) + ') + + ######################################## + ## +-## Read from pseudo random number generator devices (e.g., /dev/urandom). ++## Write in a sysfs directories. + ## +-## +-##

+-## Allow the specified domain to read from pseudo random number +-## generator devices (e.g., /dev/urandom). Typically this is +-## used in situations when a cryptographically secure random +-## number is not necessarily needed. One example is the Stack +-## Smashing Protector (SSP, formerly known as ProPolice) support +-## that may be compiled into programs. +-##

+-##

+-## Related interface: +-##

+-##
    +-##
  • dev_read_rand()
  • +-##
+-##

+-## Related tunable: +-##

+-##
    +-##
  • global_ssp
  • +-##
+-##
+ ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`dev_read_urand',` ++# cjp: added for cpuspeed ++interface(`dev_write_sysfs_dirs',` + gen_require(` +- type device_t, urandom_device_t; ++ type sysfs_t; + ') + +- read_chr_files_pattern($1, device_t, urandom_device_t) ++ allow $1 sysfs_t:dir write; + ') + + ######################################## + ## +-## Do not audit attempts to read from pseudo +-## random devices (e.g., /dev/urandom) ++## Access check for a sysfs directories. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_read_urand',` ++interface(`dev_access_check_sysfs',` + gen_require(` +- type urandom_device_t; ++ type sysfs_t; + ') + +- dontaudit $1 urandom_device_t:chr_file { getattr read }; ++ allow $1 sysfs_t:dir audit_access; + ') + + ######################################## + ## +-## Write to the pseudo random device (e.g., /dev/urandom). This +-## sets the random number generator seed. ++## Do not audit attempts to write in a sysfs directory. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_write_urand',` ++interface(`dev_dontaudit_write_sysfs_dirs',` + gen_require(` +- type device_t, urandom_device_t; ++ type sysfs_t; + ') + +- write_chr_files_pattern($1, device_t, urandom_device_t) ++ dontaudit $1 sysfs_t:dir write; + ') + + ######################################## + ## +-## Getattr generic the USB devices. ++## Mmap the sysfs. + ## + ## + ## +@@ -4121,35 +4820,42 @@ interface(`dev_write_urand',` + ## + ## + # +-interface(`dev_getattr_generic_usb_dev',` ++interface(`dev_map_sysfs',` + gen_require(` +- type usb_device_t; ++ type sysfs_t; + ') + +- getattr_chr_files_pattern($1, device_t, usb_device_t) ++ allow $1 sysfs_t:file map; + ') + ++ + ######################################## + ## +-## Setattr generic the USB devices. ++## Read cpu online hardware state information. + ## ++## ++##

++## Allow the specified domain to read /sys/devices/system/cpu/online file. ++##

++##
+ ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`dev_setattr_generic_usb_dev',` ++interface(`dev_read_cpu_online',` + gen_require(` +- type usb_device_t; ++ type cpu_online_t; + ') + +- setattr_chr_files_pattern($1, device_t, usb_device_t) ++ dev_search_sysfs($1) ++ read_files_pattern($1, cpu_online_t, cpu_online_t) + ') + + ######################################## + ## +-## Read generic the USB devices. ++## Relabel cpu online hardware state information. + ## + ## + ## +@@ -4157,35 +4863,50 @@ interface(`dev_setattr_generic_usb_dev',` + ## + ## + # +-interface(`dev_read_generic_usb_dev',` ++interface(`dev_relabel_cpu_online',` + gen_require(` +- type usb_device_t; ++ type cpu_online_t; ++ type sysfs_t; + ') + +- read_chr_files_pattern($1, device_t, usb_device_t) ++ dev_search_sysfs($1) ++ allow $1 cpu_online_t:file relabel_file_perms; + ') + ++ + ######################################## + ## +-## Read and write generic the USB devices. ++## Read hardware state information. + ## ++## ++##

++## Allow the specified domain to read the contents of ++## the sysfs filesystem. This filesystem contains ++## information, parameters, and other settings on the ++## hardware installed on the system. ++##

++##
+ ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`dev_rw_generic_usb_dev',` ++interface(`dev_read_sysfs',` + gen_require(` +- type device_t, usb_device_t; ++ type sysfs_t; + ') + +- rw_chr_files_pattern($1, device_t, usb_device_t) ++ read_files_pattern($1, sysfs_t, sysfs_t) ++ read_lnk_files_pattern($1, sysfs_t, sysfs_t) ++ ++ list_dirs_pattern($1, sysfs_t, sysfs_t) + ') + + ######################################## + ## +-## Relabel generic the USB devices. ++## Allow caller to modify hardware state information. + ## + ## + ## +@@ -4193,17 +4914,247 @@ interface(`dev_rw_generic_usb_dev',` + ## + ## + # +-interface(`dev_relabel_generic_usb_dev',` ++interface(`dev_rw_sysfs',` ++ gen_require(` ++ type sysfs_t; ++ ') ++ ++ rw_files_pattern($1, sysfs_t, sysfs_t) ++ read_lnk_files_pattern($1, sysfs_t, sysfs_t) ++ ++ list_dirs_pattern($1, sysfs_t, sysfs_t) ++') ++ ++######################################## ++## ++## Relabel hardware state directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_relabel_sysfs_dirs',` ++ gen_require(` ++ type sysfs_t; ++ ') ++ ++ relabel_dirs_pattern($1, sysfs_t, sysfs_t) ++') ++ ++######################################## ++## ++## Relabel hardware state files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_relabel_all_sysfs',` ++ gen_require(` ++ type sysfs_t; ++ ') ++ ++ relabel_dirs_pattern($1, sysfs_t, sysfs_t) ++ relabel_files_pattern($1, sysfs_t, sysfs_t) ++ relabel_lnk_files_pattern($1, sysfs_t, sysfs_t) ++') ++ ++######################################## ++## ++## Allow caller to modify hardware state information. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_manage_sysfs_dirs',` ++ gen_require(` ++ type sysfs_t; ++ ') ++ ++ manage_dirs_pattern($1, sysfs_t, sysfs_t) ++') ++ ++######################################## ++## ++## Allow caller to modify hardware state information. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_manage_sysfs',` ++ gen_require(` ++ type sysfs_t; ++ ') ++ ++ manage_dirs_pattern($1, sysfs_t, sysfs_t) ++ manage_files_pattern($1, sysfs_t, sysfs_t) ++') ++ ++######################################## ++## ++## Read and write the TPM device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_tpm',` ++ gen_require(` ++ type device_t, tpm_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, tpm_device_t) ++') ++ ++######################################## ++## ++## Read from pseudo random number generator devices (e.g., /dev/urandom). ++## ++## ++##

++## Allow the specified domain to read from pseudo random number ++## generator devices (e.g., /dev/urandom). Typically this is ++## used in situations when a cryptographically secure random ++## number is not necessarily needed. One example is the Stack ++## Smashing Protector (SSP, formerly known as ProPolice) support ++## that may be compiled into programs. ++##

++##

++## Related interface: ++##

++##
    ++##
  • dev_read_rand()
  • ++##
++##

++## Related tunable: ++##

++##
    ++##
  • global_ssp
  • ++##
++##
++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`dev_read_urand',` ++ gen_require(` ++ type device_t, urandom_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, urandom_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to read from pseudo ++## random devices (e.g., /dev/urandom) ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_read_urand',` ++ gen_require(` ++ type urandom_device_t; ++ ') ++ ++ dontaudit $1 urandom_device_t:chr_file { getattr read }; ++') ++ ++######################################## ++## ++## Write to the pseudo random device (e.g., /dev/urandom). This ++## sets the random number generator seed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_write_urand',` ++ gen_require(` ++ type device_t, urandom_device_t; ++ ') ++ ++ write_chr_files_pattern($1, device_t, urandom_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to write to pseudo ++## random devices (e.g., /dev/urandom) ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_write_urand',` ++ gen_require(` ++ type urandom_device_t; ++ ') ++ ++ dontaudit $1 urandom_device_t:chr_file write; ++') ++ ++######################################## ++## ++## Getattr generic the USB devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_generic_usb_dev',` ++ gen_require(` ++ type usb_device_t,device_t; ++ ') ++ ++ getattr_chr_files_pattern($1, device_t, usb_device_t) ++') ++ ++######################################## ++## ++## Setattr generic the USB devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_generic_usb_dev',` + gen_require(` + type usb_device_t; + ') + +- relabel_chr_files_pattern($1, device_t, usb_device_t) ++ setattr_chr_files_pattern($1, device_t, usb_device_t) + ') + + ######################################## + ## +-## Read USB monitor devices. ++## Read generic the USB devices. + ## + ## + ## +@@ -4211,17 +5162,17 @@ interface(`dev_relabel_generic_usb_dev',` + ## + ## + # +-interface(`dev_read_usbmon_dev',` ++interface(`dev_read_generic_usb_dev',` + gen_require(` +- type device_t, usbmon_device_t; ++ type usb_device_t; + ') + +- read_chr_files_pattern($1, device_t, usbmon_device_t) ++ read_chr_files_pattern($1, device_t, usb_device_t) + ') + + ######################################## + ## +-## Write USB monitor devices. ++## Read and write generic the USB devices. + ## + ## + ## +@@ -4229,17 +5180,17 @@ interface(`dev_read_usbmon_dev',` + ## + ## + # +-interface(`dev_write_usbmon_dev',` ++interface(`dev_rw_generic_usb_dev',` + gen_require(` +- type device_t, usbmon_device_t; ++ type device_t, usb_device_t; + ') + +- write_chr_files_pattern($1, device_t, usbmon_device_t) ++ rw_chr_files_pattern($1, device_t, usb_device_t) + ') + + ######################################## + ## +-## Mount a usbfs filesystem. ++## Relabel generic the USB devices. + ## + ## + ## +@@ -4247,35 +5198,554 @@ interface(`dev_write_usbmon_dev',` + ## + ## + # +-interface(`dev_mount_usbfs',` ++interface(`dev_relabel_generic_usb_dev',` ++ gen_require(` ++ type usb_device_t; ++ ') ++ ++ relabel_chr_files_pattern($1, device_t, usb_device_t) ++') ++ ++######################################## ++## ++## Read USB monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_usbmon_dev',` ++ gen_require(` ++ type device_t, usbmon_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, usbmon_device_t) ++') ++ ++######################################## ++## ++## Mmap USB monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_map_usbmon_dev',` ++ gen_require(` ++ type usbmon_device_t; ++ ') ++ ++ allow $1 usbmon_device_t:chr_file map; ++') ++ ++######################################## ++## ++## Write USB monitor devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_write_usbmon_dev',` ++ gen_require(` ++ type device_t, usbmon_device_t; ++ ') ++ ++ write_chr_files_pattern($1, device_t, usbmon_device_t) ++') ++ ++######################################## ++## ++## Mount a usbfs filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_mount_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ allow $1 usbfs_t:filesystem mount; ++') ++ ++######################################## ++## ++## Associate a file to a usbfs filesystem. ++## ++## ++## ++## The type of the file to be associated to usbfs. ++## ++## ++# ++interface(`dev_associate_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ allow $1 usbfs_t:filesystem associate; ++') ++ ++######################################## ++## ++## Get the attributes of a directory in the usb filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_usbfs_dirs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ allow $1 usbfs_t:dir getattr_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of a directory in the usb filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_getattr_usbfs_dirs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ dontaudit $1 usbfs_t:dir getattr_dir_perms; ++') ++ ++######################################## ++## ++## Search the directory containing USB hardware information. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_search_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ search_dirs_pattern($1, usbfs_t, usbfs_t) ++') ++ ++######################################## ++## ++## Allow caller to get a list of usb hardware. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_list_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ read_lnk_files_pattern($1, usbfs_t, usbfs_t) ++ getattr_files_pattern($1, usbfs_t, usbfs_t) ++ ++ list_dirs_pattern($1, usbfs_t, usbfs_t) ++') ++ ++######################################## ++## ++## Set the attributes of usbfs filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_usbfs_files',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ setattr_files_pattern($1, usbfs_t, usbfs_t) ++ list_dirs_pattern($1, usbfs_t, usbfs_t) ++') ++ ++######################################## ++## ++## Read USB hardware information using ++## the usbfs filesystem interface. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ read_files_pattern($1, usbfs_t, usbfs_t) ++ read_lnk_files_pattern($1, usbfs_t, usbfs_t) ++ list_dirs_pattern($1, usbfs_t, usbfs_t) ++') ++ ++######################################## ++## ++## Allow caller to modify usb hardware configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_usbfs',` ++ gen_require(` ++ type usbfs_t; ++ ') ++ ++ list_dirs_pattern($1, usbfs_t, usbfs_t) ++ rw_files_pattern($1, usbfs_t, usbfs_t) ++ read_lnk_files_pattern($1, usbfs_t, usbfs_t) ++') ++ ++###################################### ++## ++## Read and write userio device. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_userio_dev',` ++ gen_require(` ++ type device_t, userio_device_t; ++ ') ++ ++ rw_chr_files_pattern($1, device_t, userio_device_t) ++') ++ ++######################################## ++## ++## Mmap the userio devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_map_userio_dev',` ++ gen_require(` ++ type device_t, userio_device_t; ++ ') ++ ++ allow $1 userio_device_t:chr_file map; ++') ++ ++######################################## ++## ++## Get the attributes of video4linux devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_video_dev',` ++ gen_require(` ++ type device_t, v4l_device_t; ++ ') ++ ++ getattr_chr_files_pattern($1, device_t, v4l_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of video4linux device nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_getattr_video_dev',` ++ gen_require(` ++ type v4l_device_t; ++ ') ++ ++ dontaudit $1 v4l_device_t:chr_file getattr; ++') ++ ++######################################## ++## ++## Set the attributes of video4linux device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_video_dev',` ++ gen_require(` ++ type device_t, v4l_device_t; ++ ') ++ ++ setattr_chr_files_pattern($1, device_t, v4l_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to set the attributes ++## of video4linux device nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_setattr_video_dev',` ++ gen_require(` ++ type v4l_device_t; ++ ') ++ ++ dontaudit $1 v4l_device_t:chr_file setattr; ++') ++ ++######################################## ++## ++## Read the video4linux devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_video_dev',` ++ gen_require(` ++ type device_t, v4l_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, v4l_device_t) ++') ++ ++######################################## ++## ++## Mmap the video4linux devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_map_video_dev',` ++ gen_require(` ++ type device_t, v4l_device_t; ++ ') ++ ++ allow $1 v4l_device_t:chr_file map; ++ ++') ++ ++######################################## ++## ++## Write the video4linux devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_write_video_dev',` ++ gen_require(` ++ type device_t, v4l_device_t; ++ ') ++ ++ write_chr_files_pattern($1, device_t, v4l_device_t) ++') ++ ++######################################## ++## ++## Get the attributes of vfio devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_getattr_vfio_dev',` ++ gen_require(` ++ type device_t, vfio_device_t; ++ ') ++ ++ getattr_chr_files_pattern($1, device_t, vfio_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of vfio device nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_getattr_vfio_dev',` ++ gen_require(` ++ type vfio_device_t; ++ ') ++ ++ dontaudit $1 vfio_device_t:chr_file getattr; ++') ++ ++######################################## ++## ++## Set the attributes of vfio device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_setattr_vfio_dev',` ++ gen_require(` ++ type device_t, vfio_device_t; ++ ') ++ ++ setattr_chr_files_pattern($1, device_t, vfio_device_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to set the attributes ++## of vfio device nodes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dev_dontaudit_setattr_vfio_dev',` ++ gen_require(` ++ type vfio_device_t; ++ ') ++ ++ dontaudit $1 vfio_device_t:chr_file setattr; ++') ++ ++######################################## ++## ++## Read the vfio devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_read_vfio_dev',` ++ gen_require(` ++ type device_t, vfio_device_t; ++ ') ++ ++ read_chr_files_pattern($1, device_t, vfio_device_t) ++') ++ ++######################################## ++## ++## Write the vfio devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_write_vfio_dev',` ++ gen_require(` ++ type device_t, vfio_device_t; ++ ') ++ ++ write_chr_files_pattern($1, device_t, vfio_device_t) ++') ++ ++######################################## ++## ++## Read and write the VFIO devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_rw_vfio_dev',` + gen_require(` +- type usbfs_t; ++ type device_t, vfio_device_t; + ') + +- allow $1 usbfs_t:filesystem mount; ++ rw_chr_files_pattern($1, device_t, vfio_device_t) + ') + + ######################################## + ## +-## Associate a file to a usbfs filesystem. ++## Allow read/write the vhost net device + ## +-## ++## + ## +-## The type of the file to be associated to usbfs. ++## Domain allowed access. + ## + ## + # +-interface(`dev_associate_usbfs',` ++interface(`dev_rw_vhost',` + gen_require(` +- type usbfs_t; ++ type device_t, vhost_device_t; + ') + +- allow $1 usbfs_t:filesystem associate; ++ rw_chr_files_pattern($1, device_t, vhost_device_t) + ') + + ######################################## + ## +-## Get the attributes of a directory in the usb filesystem. ++## Allow read/write inheretid the vhost net device + ## + ## + ## +@@ -4283,36 +5753,35 @@ interface(`dev_associate_usbfs',` + ## + ## + # +-interface(`dev_getattr_usbfs_dirs',` ++interface(`dev_rw_inherited_vhost',` + gen_require(` +- type usbfs_t; ++ type device_t, vhost_device_t; + ') + +- allow $1 usbfs_t:dir getattr_dir_perms; ++ allow $1 vhost_device_t:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of a directory in the usb filesystem. ++## Read and write VMWare devices. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_getattr_usbfs_dirs',` ++interface(`dev_rw_vmware',` + gen_require(` +- type usbfs_t; ++ type device_t, vmware_device_t; + ') + +- dontaudit $1 usbfs_t:dir getattr_dir_perms; ++ rw_chr_files_pattern($1, device_t, vmware_device_t) + ') + + ######################################## + ## +-## Search the directory containing USB hardware information. ++## Read, write, and mmap VMWare devices. + ## + ## + ## +@@ -4320,17 +5789,18 @@ interface(`dev_dontaudit_getattr_usbfs_dirs',` + ## + ## + # +-interface(`dev_search_usbfs',` ++interface(`dev_rwx_vmware',` + gen_require(` +- type usbfs_t; ++ type device_t, vmware_device_t; + ') + +- search_dirs_pattern($1, usbfs_t, usbfs_t) ++ dev_rw_vmware($1) ++ allow $1 vmware_device_t:chr_file { map execute }; + ') + + ######################################## + ## +-## Allow caller to get a list of usb hardware. ++## Read from watchdog devices. + ## + ## + ## +@@ -4338,20 +5808,17 @@ interface(`dev_search_usbfs',` + ## + ## + # +-interface(`dev_list_usbfs',` ++interface(`dev_read_watchdog',` + gen_require(` +- type usbfs_t; ++ type device_t, watchdog_device_t; + ') + +- read_lnk_files_pattern($1, usbfs_t, usbfs_t) +- getattr_files_pattern($1, usbfs_t, usbfs_t) +- +- list_dirs_pattern($1, usbfs_t, usbfs_t) ++ read_chr_files_pattern($1, device_t, watchdog_device_t) + ') + + ######################################## + ## +-## Set the attributes of usbfs filesystem. ++## Write to watchdog devices. + ## + ## + ## +@@ -4359,19 +5826,17 @@ interface(`dev_list_usbfs',` + ## + ## + # +-interface(`dev_setattr_usbfs_files',` ++interface(`dev_write_watchdog',` + gen_require(` +- type usbfs_t; ++ type device_t, watchdog_device_t; + ') + +- setattr_files_pattern($1, usbfs_t, usbfs_t) +- list_dirs_pattern($1, usbfs_t, usbfs_t) ++ write_chr_files_pattern($1, device_t, watchdog_device_t) + ') + + ######################################## + ## +-## Read USB hardware information using +-## the usbfs filesystem interface. ++## RW to watchdog devices. + ## + ## + ## +@@ -4379,19 +5844,17 @@ interface(`dev_setattr_usbfs_files',` + ## + ## + # +-interface(`dev_read_usbfs',` ++interface(`dev_rw_watchdog',` + gen_require(` +- type usbfs_t; ++ type device_t, watchdog_device_t; + ') + +- read_files_pattern($1, usbfs_t, usbfs_t) +- read_lnk_files_pattern($1, usbfs_t, usbfs_t) +- list_dirs_pattern($1, usbfs_t, usbfs_t) ++ rw_chr_files_pattern($1, device_t, watchdog_device_t) + ') + + ######################################## + ## +-## Allow caller to modify usb hardware configuration files. ++## Read and write the the wireless device. + ## + ## + ## +@@ -4399,19 +5862,17 @@ interface(`dev_read_usbfs',` + ## + ## + # +-interface(`dev_rw_usbfs',` ++interface(`dev_rw_wireless',` + gen_require(` +- type usbfs_t; ++ type device_t, wireless_device_t; + ') + +- list_dirs_pattern($1, usbfs_t, usbfs_t) +- rw_files_pattern($1, usbfs_t, usbfs_t) +- read_lnk_files_pattern($1, usbfs_t, usbfs_t) ++ rw_chr_files_pattern($1, device_t, wireless_device_t) + ') + + ######################################## + ## +-## Get the attributes of video4linux devices. ++## Read and write Xen devices. + ## + ## + ## +@@ -4419,17 +5880,18 @@ interface(`dev_rw_usbfs',` + ## + ## + # +-interface(`dev_getattr_video_dev',` ++interface(`dev_rw_xen',` + gen_require(` +- type device_t, v4l_device_t; ++ type device_t, xen_device_t; + ') + +- getattr_chr_files_pattern($1, device_t, v4l_device_t) ++ rw_chr_files_pattern($1, device_t, xen_device_t) ++ allow $1 xen_device_t:chr_file map; + ') + +-###################################### ++######################################## + ## +-## Read and write userio device. ++## Create, read, write, and delete Xen devices. + ## + ## + ## +@@ -4437,36 +5899,41 @@ interface(`dev_getattr_video_dev',` + ## + ## + # +-interface(`dev_rw_userio_dev',` ++interface(`dev_manage_xen',` + gen_require(` +- type device_t, userio_device_t; ++ type device_t, xen_device_t; + ') + +- rw_chr_files_pattern($1, device_t, userio_device_t) ++ manage_chr_files_pattern($1, device_t, xen_device_t) + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of video4linux device nodes. ++## Automatic type transition to the type ++## for xen device nodes when created in /dev. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. ++## ++## ++## ++## ++## The name of the object being created. + ## + ## + # +-interface(`dev_dontaudit_getattr_video_dev',` ++interface(`dev_filetrans_xen',` + gen_require(` +- type v4l_device_t; ++ type device_t, xen_device_t; + ') + +- dontaudit $1 v4l_device_t:chr_file getattr; ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, $2) + ') + + ######################################## + ## +-## Set the attributes of video4linux device nodes. ++## Get the attributes of X server miscellaneous devices. + ## + ## + ## +@@ -4474,36 +5941,35 @@ interface(`dev_dontaudit_getattr_video_dev',` + ## + ## + # +-interface(`dev_setattr_video_dev',` ++interface(`dev_getattr_xserver_misc_dev',` + gen_require(` +- type device_t, v4l_device_t; ++ type device_t, xserver_misc_device_t; + ') + +- setattr_chr_files_pattern($1, device_t, v4l_device_t) ++ getattr_chr_files_pattern($1, device_t, xserver_misc_device_t) + ') + + ######################################## + ## +-## Do not audit attempts to set the attributes +-## of video4linux device nodes. ++## Set the attributes of X server miscellaneous devices. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`dev_dontaudit_setattr_video_dev',` ++interface(`dev_setattr_xserver_misc_dev',` + gen_require(` +- type v4l_device_t; ++ type device_t, xserver_misc_device_t; + ') + +- dontaudit $1 v4l_device_t:chr_file setattr; ++ setattr_chr_files_pattern($1, device_t, xserver_misc_device_t) + ') + + ######################################## + ## +-## Read the video4linux devices. ++## Read and write X server miscellaneous devices. + ## + ## + ## +@@ -4511,35 +5977,36 @@ interface(`dev_dontaudit_setattr_video_dev',` + ## + ## + # +-interface(`dev_read_video_dev',` ++interface(`dev_rw_xserver_misc',` + gen_require(` +- type device_t, v4l_device_t; ++ type device_t, xserver_misc_device_t; + ') + +- read_chr_files_pattern($1, device_t, v4l_device_t) ++ rw_chr_files_pattern($1, device_t, xserver_misc_device_t) ++ allow $1 xserver_misc_device_t:chr_file map; + ') + + ######################################## + ## +-## Write the video4linux devices. ++## Dontaudit attempts to Read and write X server miscellaneous devices. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_write_video_dev',` ++interface(`dev_dontaudit_leaked_xserver_misc',` + gen_require(` +- type device_t, v4l_device_t; ++ type xserver_misc_device_t; + ') + +- write_chr_files_pattern($1, device_t, v4l_device_t) ++ dontaudit $1 xserver_misc_device_t:chr_file { read write }; + ') + + ######################################## + ## +-## Allow read/write the vhost net device ++## Read and write X server miscellaneous devices. + ## + ## + ## +@@ -4547,17 +6014,19 @@ interface(`dev_write_video_dev',` + ## + ## + # +-interface(`dev_rw_vhost',` ++interface(`dev_manage_xserver_misc',` + gen_require(` +- type device_t, vhost_device_t; ++ type device_t, xserver_misc_device_t; + ') + +- rw_chr_files_pattern($1, device_t, vhost_device_t) ++ manage_chr_files_pattern($1, device_t, xserver_misc_device_t) ++ ++ dev_filetrans_xserver_named_dev($1) + ') + + ######################################## + ## +-## Read and write VMWare devices. ++## Read and write to the zero device (/dev/zero). + ## + ## + ## +@@ -4565,17 +6034,17 @@ interface(`dev_rw_vhost',` + ## + ## + # +-interface(`dev_rw_vmware',` ++interface(`dev_rw_zero',` + gen_require(` +- type device_t, vmware_device_t; ++ type device_t, zero_device_t; + ') + +- rw_chr_files_pattern($1, device_t, vmware_device_t) ++ rw_chr_files_pattern($1, device_t, zero_device_t) + ') + + ######################################## + ## +-## Read, write, and mmap VMWare devices. ++## Read, write, and execute the zero device (/dev/zero). + ## + ## + ## +@@ -4583,18 +6052,18 @@ interface(`dev_rw_vmware',` + ## + ## + # +-interface(`dev_rwx_vmware',` ++interface(`dev_rwx_zero',` + gen_require(` +- type device_t, vmware_device_t; ++ type zero_device_t; + ') + +- dev_rw_vmware($1) +- allow $1 vmware_device_t:chr_file execute; ++ dev_rw_zero($1) ++ allow $1 zero_device_t:chr_file { map execute }; + ') + + ######################################## + ## +-## Read from watchdog devices. ++## Execmod the zero device (/dev/zero). + ## + ## + ## +@@ -4602,17 +6071,18 @@ interface(`dev_rwx_vmware',` + ## + ## + # +-interface(`dev_read_watchdog',` ++interface(`dev_execmod_zero',` + gen_require(` +- type device_t, watchdog_device_t; ++ type zero_device_t; + ') + +- read_chr_files_pattern($1, device_t, watchdog_device_t) ++ dev_rw_zero($1) ++ allow $1 zero_device_t:chr_file execmod; + ') + + ######################################## + ## +-## Write to watchdog devices. ++## Create the zero device (/dev/zero). + ## + ## + ## +@@ -4620,17 +6090,17 @@ interface(`dev_read_watchdog',` + ## + ## + # +-interface(`dev_write_watchdog',` ++interface(`dev_create_zero_dev',` + gen_require(` +- type device_t, watchdog_device_t; ++ type device_t, zero_device_t; + ') + +- write_chr_files_pattern($1, device_t, watchdog_device_t) ++ create_chr_files_pattern($1, device_t, zero_device_t) + ') + + ######################################## + ## +-## Read and write the the wireless device. ++## Unconfined access to devices. + ## + ## + ## +@@ -4638,35 +6108,36 @@ interface(`dev_write_watchdog',` + ## + ## + # +-interface(`dev_rw_wireless',` ++interface(`dev_unconfined',` + gen_require(` +- type device_t, wireless_device_t; ++ attribute devices_unconfined_type; + ') + +- rw_chr_files_pattern($1, device_t, wireless_device_t) ++ typeattribute $1 devices_unconfined_type; + ') + + ######################################## + ## +-## Read and write Xen devices. ++## Dontaudit getattr on all device nodes. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dev_rw_xen',` ++interface(`dev_dontaudit_getattr_all',` + gen_require(` +- type device_t, xen_device_t; ++ attribute device_node; ++ type device_t; + ') + +- rw_chr_files_pattern($1, device_t, xen_device_t) ++ dontaudit $1 { device_t device_node }:dir_file_class_set getattr; + ') + + ######################################## + ## +-## Create, read, write, and delete Xen devices. ++## Get the attributes of the mei devices. + ## + ## + ## +@@ -4674,41 +6145,35 @@ interface(`dev_rw_xen',` + ## + ## + # +-interface(`dev_manage_xen',` ++interface(`dev_getattr_mei',` + gen_require(` +- type device_t, xen_device_t; ++ type device_t, mei_device_t; + ') + +- manage_chr_files_pattern($1, device_t, xen_device_t) ++ getattr_chr_files_pattern($1, device_t, mei_device_t) + ') + + ######################################## + ## +-## Automatic type transition to the type +-## for xen device nodes when created in /dev. ++## Read the mei devices. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`dev_filetrans_xen',` ++interface(`dev_read_mei',` + gen_require(` +- type device_t, xen_device_t; ++ type device_t, mei_device_t; + ') + +- filetrans_pattern($1, device_t, xen_device_t, chr_file, $2) ++ read_chr_files_pattern($1, device_t, mei_device_t) + ') + + ######################################## + ## +-## Get the attributes of X server miscellaneous devices. ++## Read and write to mei devices. + ## + ## + ## +@@ -4716,17 +6181,17 @@ interface(`dev_filetrans_xen',` + ## + ## + # +-interface(`dev_getattr_xserver_misc_dev',` ++interface(`dev_rw_mei',` + gen_require(` +- type device_t, xserver_misc_device_t; ++ type device_t, mei_device_t; + ') + +- getattr_chr_files_pattern($1, device_t, xserver_misc_device_t) ++ rw_chr_files_pattern($1, device_t, mei_device_t) + ') + + ######################################## + ## +-## Set the attributes of X server miscellaneous devices. ++## Read and write uhid devices. + ## + ## + ## +@@ -4734,17 +6199,18 @@ interface(`dev_getattr_xserver_misc_dev',` + ## + ## + # +-interface(`dev_setattr_xserver_misc_dev',` ++interface(`dev_rw_uhid_dev',` + gen_require(` +- type device_t, xserver_misc_device_t; ++ type device_t, uhid_device_t; + ') + +- setattr_chr_files_pattern($1, device_t, xserver_misc_device_t) ++ rw_chr_files_pattern($1, device_t, uhid_device_t) + ') + ++ + ######################################## + ## +-## Read and write X server miscellaneous devices. ++## Allow read/write the hypervkvp device + ## + ## + ## +@@ -4752,17 +6218,17 @@ interface(`dev_setattr_xserver_misc_dev',` + ## + ## + # +-interface(`dev_rw_xserver_misc',` ++interface(`dev_rw_hypervkvp',` + gen_require(` +- type device_t, xserver_misc_device_t; ++ type device_t, hypervkvp_device_t; + ') + +- rw_chr_files_pattern($1, device_t, xserver_misc_device_t) ++ rw_chr_files_pattern($1, device_t, hypervkvp_device_t) + ') + + ######################################## + ## +-## Read and write to the zero device (/dev/zero). ++## Allow read/write the hypervkvp device + ## + ## + ## +@@ -4770,17 +6236,17 @@ interface(`dev_rw_xserver_misc',` + ## + ## + # +-interface(`dev_rw_zero',` ++interface(`dev_read_gpfs',` + gen_require(` +- type device_t, zero_device_t; ++ type device_t, gpfs_device_t; + ') + +- rw_chr_files_pattern($1, device_t, zero_device_t) ++ read_chr_files_pattern($1, device_t, gpfs_device_t) + ') + + ######################################## + ## +-## Read, write, and execute the zero device (/dev/zero). ++## Allow read/write the gpiochip device + ## + ## + ## +@@ -4788,18 +6254,17 @@ interface(`dev_rw_zero',` + ## + ## + # +-interface(`dev_rwx_zero',` ++interface(`dev_read_gpio',` + gen_require(` +- type zero_device_t; ++ type device_t, gpio_device_t; + ') + +- dev_rw_zero($1) +- allow $1 zero_device_t:chr_file execute; ++ read_chr_files_pattern($1, device_t, gpio_device_t) + ') + + ######################################## + ## +-## Execmod the zero device (/dev/zero). ++## Allow read/write the hypervvssd device + ## + ## + ## +@@ -4807,47 +6272,935 @@ interface(`dev_rwx_zero',` + ## + ## + # +-interface(`dev_execmod_zero',` ++interface(`dev_rw_hypervvssd',` + gen_require(` +- type zero_device_t; ++ type device_t, hypervvssd_device_t; + ') + +- dev_rw_zero($1) +- allow $1 zero_device_t:chr_file execmod; ++ rw_chr_files_pattern($1, device_t, hypervvssd_device_t) + ') + + ######################################## + ## +-## Create the zero device (/dev/zero). ++## Create all named devices with the correct label + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`dev_create_zero_dev',` ++interface(`dev_filetrans_printer_named_dev',` ++ + gen_require(` +- type device_t, zero_device_t; +- ') ++ type printer_device_t; + +- create_chr_files_pattern($1, device_t, zero_device_t) ++ ') ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt0") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt1") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt2") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt3") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt4") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt5") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt6") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt7") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt8") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "irlpt9") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp0") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp1") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp2") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp3") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp4") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp5") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp6") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp7") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp8") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "lp9") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par0") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par1") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par2") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par3") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par4") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par5") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par6") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par7") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par8") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "par9") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp0") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp1") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp2") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp3") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp4") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp5") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp6") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp7") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp8") ++ filetrans_pattern($1, device_t, printer_device_t, chr_file, "usblp9") + ') + + ######################################## + ## +-## Unconfined access to devices. ++## Create all named devices with the correct label + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`dev_unconfined',` +- gen_require(` +- attribute devices_unconfined_type; +- ') +- +- typeattribute $1 devices_unconfined_type; ++interface(`dev_filetrans_all_named_dev',` ++ ++gen_require(` ++ type device_t; ++ type usb_device_t; ++ type uhid_device_t; ++ type sound_device_t; ++ type apm_bios_t; ++ type mouse_device_t; ++ type autofs_device_t; ++ type lvm_control_t; ++ type crash_device_t; ++ type dlm_control_device_t; ++ type clock_device_t; ++ type v4l_device_t; ++ type vsock_device_t; ++ type vmci_device_t; ++ type vfio_device_t; ++ type event_device_t; ++ type xen_device_t; ++ type framebuf_device_t; ++ type null_device_t; ++ type random_device_t; ++ type dri_device_t; ++ type hsa_device_t; ++ type ipmi_device_t; ++ type memory_device_t; ++ type kmsg_device_t; ++ type qemu_device_t; ++ type ksm_device_t; ++ type kvm_device_t; ++ type lirc_device_t; ++ type cpu_device_t; ++ type scanner_device_t; ++ type modem_device_t; ++ type monitor_device_t; ++ type vhost_device_t; ++ type netcontrol_device_t; ++ type nvram_device_t; ++ type power_device_t; ++ type opal_device_t; ++ type wireless_device_t; ++ type tpm_device_t; ++ type userio_device_t; ++ type urandom_device_t; ++ type usbmon_device_t; ++ type vmware_device_t; ++ type watchdog_device_t; ++ type crypt_device_t; ++ type zero_device_t; ++ type smartcard_device_t; ++ type mtrr_device_t; ++ type ecryptfs_device_t; ++ type mptctl_device_t; ++ type hypervkvp_device_t; ++ type hypervvssd_device_t; ++ type gpfs_device_t; ++ type gpio_device_t; ++') ++ ++ dev_filetrans_printer_named_dev($1) ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "admmidi9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "adsp9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "aload9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amidi9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "amixer9") ++ filetrans_pattern($1, device_t, apm_bios_t, chr_file, "apm_bios") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "atibm") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "audio9") ++ filetrans_pattern($1, device_t, ecryptfs_device_t, chr_file, "ecryptfs") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs0") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs1") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs2") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs3") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs4") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs5") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs6") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs7") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs8") ++ filetrans_pattern($1, device_t, autofs_device_t, chr_file, "autofs9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "beep") ++ filetrans_pattern($1, device_t, lvm_control_t, chr_file, "btrfs-control") ++ filetrans_pattern($1, device_t, crash_device_t, chr_file, "crash") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm0") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm1") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm2") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm3") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm4") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm5") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm6") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm7") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm8") ++ filetrans_pattern($1, device_t, dlm_control_device_t, chr_file, "dlm9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmfm") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dmmidi9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "dsp9") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "efirtc") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "ptp0") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "ptp1") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "ptp2") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "ptp3") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "e2201") ++ filetrans_pattern($1, device_t, vfio_device_t, chr_file, "vfio") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83000") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83001") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83002") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83003") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83004") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83005") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83006") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83007") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83008") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "em83009") ++ filetrans_pattern($1, device_t, vsock_device_t, chr_file, "vsock") ++ filetrans_pattern($1, device_t, vmci_device_t, chr_file, "vmci") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event0") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event1") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event2") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event3") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event4") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event5") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event6") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event7") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event8") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event9") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event10") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event11") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event12") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event13") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event14") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event15") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event16") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event17") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event18") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event19") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event20") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event21") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event22") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event23") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event24") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event25") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event26") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event27") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event28") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event29") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "event30") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "evtchn") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb0") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb1") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb2") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb3") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb4") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb5") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb6") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb7") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb8") ++ filetrans_pattern($1, device_t, framebuf_device_t, chr_file, "fb9") ++ filetrans_pattern($1, device_t, null_device_t, chr_file, "full") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw0") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw1") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw2") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw3") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw4") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw5") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw6") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw7") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw8") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "fw9") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "000") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "001") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "002") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "003") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "004") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "005") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "006") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "007") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "008") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "009") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "010") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "011") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "012") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "013") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "014") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "015") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "016") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "017") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "018") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "019") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "020") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "021") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "022") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "023") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "024") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "025") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "026") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "027") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "028") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "029") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc0") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc1") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc2") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc3") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc4") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc5") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc6") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc7") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc8") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "gtrsc9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "hfmodem") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev0") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev1") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev2") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev3") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev4") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev5") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev6") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev7") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev8") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hiddev9") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw0") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw1") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw2") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw3") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw4") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw5") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw6") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw7") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw8") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "hidraw9") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "hpet") ++ filetrans_pattern($1, device_t, random_device_t, chr_file, "hw_random") ++ filetrans_pattern($1, device_t, random_device_t, chr_file, "hwrng") ++ filetrans_pattern($1, device_t, dri_device_t, chr_file, "i915") ++ filetrans_pattern($1, device_t, hsa_device_t, chr_file, "kfd") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "inportbm") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi0") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi1") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi2") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi3") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi4") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi5") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi6") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi7") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi8") ++ filetrans_pattern($1, device_t, ipmi_device_t, chr_file, "ipmi9") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "jbm") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js0") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js1") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js2") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js3") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js4") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js5") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js6") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js7") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js8") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "js9") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse0") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse1") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse2") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse3") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse4") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse5") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse6") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse7") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse8") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mouse9") ++ filetrans_pattern($1, device_t, memory_device_t, chr_file, "kmem") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mptctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt0ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt1ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt2ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt3ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt4ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt5ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt6ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt7ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt8ctl") ++ filetrans_pattern($1, device_t, mptctl_device_t, chr_file, "mpt9ctl") ++ filetrans_pattern($1, device_t, kmsg_device_t, chr_file, "kmsg") ++ filetrans_pattern($1, device_t, qemu_device_t, chr_file, "kqemu") ++ filetrans_pattern($1, device_t, ksm_device_t, chr_file, "ksm") ++ filetrans_pattern($1, device_t, kvm_device_t, chr_file, "kvm") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik0") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik1") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik2") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik3") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik4") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik5") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik6") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik7") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik8") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "lik9") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc0") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc1") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc2") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc3") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc4") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc5") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc6") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc7") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc8") ++ filetrans_pattern($1, device_t, lirc_device_t, chr_file, "lirc9") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "lircm") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "logibm") ++ filetrans_pattern($1, device_t, kmsg_device_t, chr_file, "mcelog") ++ filetrans_pattern($1, device_t, memory_device_t, chr_file, "mem") ++ filetrans_pattern($1, device_t, memory_device_t, chr_file, "mergemem") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mice") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "microcode") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "midi9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mixer9") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mmetfgrab") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "modem") ++ filetrans_pattern($1, device_t, monitor_device_t, chr_file, "monwriter") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4010") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4011") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4012") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4013") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4014") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4015") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4016") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4017") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4018") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "mpu4019") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr0") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr1") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr2") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr3") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr4") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr5") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr6") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr7") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr8") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "msr9") ++ filetrans_pattern($1, device_t, vhost_device_t, chr_file, "vhost") ++ filetrans_pattern($1, device_t, netcontrol_device_t, chr_file, "network_latency") ++ filetrans_pattern($1, device_t, netcontrol_device_t, chr_file, "network_throughput") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz0") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz1") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz2") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz3") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz4") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz5") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz6") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz7") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz8") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "noz9") ++ filetrans_pattern($1, device_t, null_device_t, chr_file, "null") ++ filetrans_pattern($1, device_t, nvram_device_t, chr_file, "nvram") ++ filetrans_pattern($1, device_t, memory_device_t, chr_file, "oldmem") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "pc110pad") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock0") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock1") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock2") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock3") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock4") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock5") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock6") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock7") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock8") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pcfclock9") ++ filetrans_pattern($1, device_t, power_device_t, chr_file, "pmu") ++ filetrans_pattern($1, device_t, opal_device_t, chr_file, "op_panel") ++ filetrans_pattern($1, device_t, opal_device_t, chr_file, "opal-prd") ++ filetrans_pattern($1, device_t, memory_device_t, chr_file, "port") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps0") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps1") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps2") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps3") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps4") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps5") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps6") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps7") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps8") ++ filetrans_pattern($1, device_t, clock_device_t, chr_file, "pps9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "rmidi9") ++ filetrans_pattern($1, device_t, dri_device_t, chr_file, "radeon") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "radio9") ++ filetrans_pattern($1, device_t, random_device_t, chr_file, "random") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13940") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13941") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13942") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13943") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13944") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13945") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13946") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13947") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13948") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "raw13949") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "cdc-wdm0") ++ filetrans_pattern($1, device_t, modem_device_t, chr_file, "cdc-wdm1") ++ filetrans_pattern($1, device_t, wireless_device_t, chr_file, "rfkill") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "sequencer") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "sequencer2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "smpte9") ++ filetrans_pattern($1, device_t, power_device_t, chr_file, "smu") ++ filetrans_pattern($1, device_t, apm_bios_t, chr_file, "snapshot") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "sndstat") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "sonypi") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm0") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm1") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm2") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm3") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm4") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm5") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm6") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm7") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm8") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpm9") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm0") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm1") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm2") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm3") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm4") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm5") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm6") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm7") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm8") ++ filetrans_pattern($1, device_t, tpm_device_t, chr_file, "tpmrm9") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "uinput") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio0") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio1") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio2") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio3") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio4") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio5") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio6") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio7") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio8") ++ filetrans_pattern($1, device_t, userio_device_t, chr_file, "uio9") ++ filetrans_pattern($1, device_t, urandom_device_t, chr_file, "urandom") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb0") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb1") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb2") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb3") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb4") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb5") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb6") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb7") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "usb8") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon0") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon1") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon2") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon3") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon4") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon5") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon6") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon7") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon8") ++ filetrans_pattern($1, device_t, usbmon_device_t, chr_file, "usbmon9") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "usbscanner") ++ filetrans_pattern($1, device_t, vhost_device_t, chr_file, "vhost-net") ++ filetrans_pattern($1, device_t, vhost_device_t, chr_file, "vhost-vsock") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vbi9") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmmon") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet0") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet1") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet2") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet3") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet4") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet5") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet6") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet7") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet8") ++ filetrans_pattern($1, device_t, vmware_device_t, chr_file, "vmnet9") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "media9") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "video9") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "vrtpanel") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vttuner") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "vtx9") ++ filetrans_pattern($1, device_t, watchdog_device_t, chr_file, "watchdog") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio3") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio4") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio5") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio6") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio8") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "winradio9") ++ filetrans_pattern($1, device_t, crypt_device_t, chr_file, "z90crypt") ++ filetrans_pattern($1, device_t, crypt_device_t, chr_file, "pkey") ++ filetrans_pattern($1, device_t, zero_device_t, chr_file, "zero") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx0") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx1") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx2") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx3") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx4") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx5") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx6") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx7") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx8") ++ filetrans_pattern($1, device_t, smartcard_device_t, chr_file, "cmx9") ++ filetrans_pattern($1, device_t, netcontrol_device_t, chr_file, "cpu_dma_latency") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu0") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu1") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu2") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu3") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu4") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu5") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu6") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu7") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu8") ++ filetrans_pattern($1, device_t, cpu_device_t, chr_file, "cpu9") ++ filetrans_pattern($1, device_t, mtrr_device_t, chr_file, "mtrr") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor0") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor1") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor2") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor3") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor4") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor5") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor6") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor7") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor8") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "sensor9") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m0") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m1") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m2") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m3") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m4") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m5") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m6") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m7") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m8") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "m9") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard0") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard1") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard2") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard3") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard4") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard5") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard6") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard7") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard8") ++ filetrans_pattern($1, device_t, event_device_t, chr_file, "keyboard9") ++ filetrans_pattern($1, device_t, lvm_control_t, chr_file, "control") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "ucb1x00") ++ filetrans_pattern($1, device_t, mouse_device_t, chr_file, "mk712") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx0") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx1") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx2") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx3") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx4") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx5") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx6") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx7") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx8") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "dc2xx9") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8000") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8001") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8002") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8003") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8004") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8005") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8006") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8007") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8008") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "mdc8009") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner0") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner1") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner2") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner3") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner4") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner5") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner6") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner7") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner8") ++ filetrans_pattern($1, device_t, scanner_device_t, chr_file, "scanner9") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap0") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap1") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap2") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap3") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap4") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap5") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap6") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap7") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap8") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "blktap9") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "gntdev") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "gntalloc") ++ filetrans_pattern($1, device_t, xen_device_t, chr_file, "xenbus") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC7") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC8") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC9") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC10") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC11") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC12") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC13") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC14") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC15") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC16") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC17") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC18") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC19") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC20") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC21") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC22") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC23") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC24") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC25") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC26") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC27") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC28") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "controlC29") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "patmgr0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "patmgr1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd0") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd1") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd2") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd3") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd4") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd5") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd6") ++ filetrans_pattern($1, device_t, sound_device_t, chr_file, "srnd7") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "tlk0") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "tlk1") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "tlk2") ++ filetrans_pattern($1, device_t, v4l_device_t, chr_file, "tlk3") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "uba") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "ubb") ++ filetrans_pattern($1, device_t, usb_device_t, chr_file, "ubc") ++ filetrans_pattern($1, device_t, uhid_device_t, chr_file, "uhid") ++ filetrans_pattern($1, device_t, hypervkvp_device_t, chr_file, "hv_kvp") ++ filetrans_pattern($1, device_t, hypervvssd_device_t, chr_file, "hv_vss") ++ filetrans_pattern($1, device_t, gpfs_device_t, chr_file, "ss0") ++ filetrans_pattern($1, device_t, gpio_device_t, chr_file, "gpiochip0") ++ filetrans_pattern($1, device_t, gpio_device_t, chr_file, "gpiochip1") ++ filetrans_pattern($1, device_t, gpio_device_t, chr_file, "gpiochip2") ++ dev_filetrans_xserver_named_dev($1) ++') ++ ++######################################## ++## ++## Create all named devices with the correct label ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dev_filetrans_xserver_named_dev',` ++ ++ gen_require(` ++ type xserver_misc_device_t; ++ ') ++ ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "3dfx") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "controlD64") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "gfx") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "graphics") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid0") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid1") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid2") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid3") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid4") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid5") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid6") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid7") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid8") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "mga_vid9") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia0") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia1") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia2") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia3") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia4") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia5") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia6") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia7") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia8") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidia9") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "nvidiactl") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "opengl") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox0") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox1") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox2") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox3") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox4") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox5") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox6") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox7") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox8") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vbox9") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "vga_arbiter") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card0") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card1") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card2") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card3") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card4") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card5") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card6") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card7") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card8") ++ filetrans_pattern($1, device_t, xserver_misc_device_t, chr_file, "card9") + ') +diff --git a/policy/modules/kernel/devices.te b/policy/modules/kernel/devices.te +index 0b1a8715a0..331978df5a 100644 +--- a/policy/modules/kernel/devices.te ++++ b/policy/modules/kernel/devices.te +@@ -15,11 +15,12 @@ attribute devices_unconfined_type; + # + type device_t; + fs_associate_tmpfs(device_t) +-files_type(device_t) ++files_base_file(device_t) + files_mountpoint(device_t) + files_associate_tmp(device_t) + fs_type(device_t) + fs_use_trans devtmpfs gen_context(system_u:object_r:device_t,s0); ++dev_node(device_t) + + # + # Type for /dev/agpgart +@@ -43,9 +44,6 @@ type cardmgr_dev_t; + dev_node(cardmgr_dev_t) + files_tmp_file(cardmgr_dev_t) + +-type cachefiles_device_t; +-dev_node(cachefiles_device_t) +- + # + # clock_device_t is the type of + # /dev/rtc. +@@ -65,6 +63,9 @@ dev_node(cpu_device_t) + type crash_device_t; + dev_node(crash_device_t) + ++type ecryptfs_device_t; ++dev_node(ecryptfs_device_t) ++ + # for the IBM zSeries z90crypt hardware ssl accelorator + type crypt_device_t; + dev_node(crypt_device_t) +@@ -78,6 +79,9 @@ dev_node(dlm_control_device_t) + type dri_device_t; + dev_node(dri_device_t) + ++type hsa_device_t; ++dev_node(hsa_device_t) ++ + type event_device_t; + dev_node(event_device_t) + +@@ -87,12 +91,45 @@ dev_node(event_device_t) + type framebuf_device_t; + dev_node(framebuf_device_t) + ++# ++# Type for hyperv devices ++# ++type hypervkvp_device_t; ++dev_node(hypervkvp_device_t) ++ ++type hypervvssd_device_t; ++dev_node(hypervvssd_device_t) ++ ++# ++# Type for /dev/ss0 ++# ++type gpfs_device_t; ++dev_node(gpfs_device_t) ++ ++# ++# Type for /dev/gpiochip* ++# ++type gpio_device_t; ++dev_node(gpio_device_t) ++ + # + # Type for /dev/ipmi/0 + # + type ipmi_device_t; + dev_node(ipmi_device_t) + ++# ++# Type for /dev/infiniband ++# ++type infiniband_device_t; ++dev_node(infiniband_device_t) ++ ++# ++# Type for /dev/infiniband mgmt devices ++# ++type infiniband_mgmt_device_t; ++dev_node(infiniband_mgmt_device_t) ++ + # + # Type for /dev/kmsg + # +@@ -111,6 +148,7 @@ dev_node(ksm_device_t) + # + type kvm_device_t; + dev_node(kvm_device_t) ++mls_trusted_object(kvm_device_t) + + # + # Type for /dev/lirc +@@ -118,6 +156,9 @@ dev_node(kvm_device_t) + type lirc_device_t; + dev_node(lirc_device_t) + ++# ++# Type for /dev/mapper/control ++# + type loop_control_device_t; + dev_node(loop_control_device_t) + +@@ -149,12 +190,24 @@ dev_node(misc_device_t) + type modem_device_t; + dev_node(modem_device_t) + ++# ++# A general type for monitor devices. ++# ++type monitor_device_t; ++dev_node(monitor_device_t) ++ + # + # A more general type for mouse devices. + # + type mouse_device_t; + dev_node(mouse_device_t) + ++# ++# Type for /dev/mptctl used to check RAID status. ++# ++type mptctl_device_t; ++dev_node(mptctl_device_t) ++ + # + # Type for /dev/cpu/mtrr and /proc/mtrr + # +@@ -182,6 +235,19 @@ sid devnull gen_context(system_u:object_r:null_device_t,s0) + type nvram_device_t; + dev_node(nvram_device_t) + ++# ++# Type for controller device nodes ++# ++type nvme_device_t; ++dev_node(nvme_device_t) ++ ++# ++# Type for /dev/op_panel ++# Type for /dev/opal-prd ++# ++type opal_device_t; ++dev_node(opal_device_t) ++ + # + # Type for /dev/pmu + # +@@ -227,6 +293,10 @@ files_mountpoint(sysfs_t) + fs_type(sysfs_t) + genfscon sysfs / gen_context(system_u:object_r:sysfs_t,s0) + ++type cpu_online_t; ++files_type(cpu_online_t) ++dev_associate_sysfs(cpu_online_t) ++ + # + # Type for /dev/tpm + # +@@ -266,14 +336,30 @@ dev_node(usbmon_device_t) + type userio_device_t; + dev_node(userio_device_t) + ++# ++# uhid_device_t is the type for /dev/uhid ++# ++type uhid_device_t; ++dev_node(uhid_device_t) ++ ++type vfio_device_t; ++dev_node(vfio_device_t) ++ + type v4l_device_t; + dev_node(v4l_device_t) + ++type vsock_device_t; ++dev_node(vsock_device_t) ++ ++type vmci_device_t; ++dev_node(vmci_device_t) ++ + # + # vhost_device_t is the type for /dev/vhost-net + # + type vhost_device_t; + dev_node(vhost_device_t) ++mls_trusted_object(vhost_device_t) + + # Type for vmware devices. + type vmware_device_t; +@@ -319,5 +405,6 @@ files_associate_tmp(device_node) + # + + allow devices_unconfined_type self:capability sys_rawio; +-allow devices_unconfined_type device_node:{ blk_file chr_file } *; +-allow devices_unconfined_type mtrr_device_t:file *; ++allow devices_unconfined_type device_node:{ blk_file lnk_file } *; ++allow devices_unconfined_type device_node:{ file chr_file } ~{ execmod entrypoint }; ++allow devices_unconfined_type mtrr_device_t:file ~{ execmod entrypoint }; +diff --git a/policy/modules/kernel/domain.if b/policy/modules/kernel/domain.if +index 6a1e4d1562..34fd0b0f19 100644 +--- a/policy/modules/kernel/domain.if ++++ b/policy/modules/kernel/domain.if +@@ -76,33 +76,8 @@ interface(`domain_type',` + # start with basic domain + domain_base_type($1) + +- ifdef(`distro_redhat',` +- optional_policy(` +- unconfined_use_fds($1) +- ') +- ') +- +- # send init a sigchld and signull +- optional_policy(` +- init_sigchld($1) +- init_signull($1) +- ') +- +- # these seem questionable: +- +- optional_policy(` +- rpm_use_fds($1) +- rpm_read_pipes($1) +- ') +- +- optional_policy(` +- selinux_dontaudit_getattr_fs($1) +- selinux_dontaudit_read_fs($1) +- ') +- +- optional_policy(` +- seutil_dontaudit_read_config($1) +- ') ++ # Only way to get corenet_unlabeled packets disabled to work ++ corenet_all_recvfrom_unlabeled($1) + ') + + ######################################## +@@ -128,7 +103,7 @@ interface(`domain_entry_file',` + ') + + allow $1 $2:file entrypoint; +- allow $1 $2:file { mmap_file_perms ioctl lock }; ++ allow $1 $2:file { mmap_exec_file_perms ioctl lock }; + + typeattribute $2 entry_type; + +@@ -511,6 +486,26 @@ interface(`domain_signull_all_domains',` + allow $1 domain:process signull; + ') + ++######################################## ++## ++## Do not audit attempts to send ++## signulls to all domains. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`domain_dontaudit_signull_all_domains',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ dontaudit $1 domain:process signull; ++') ++ + ######################################## + ## + ## Send a stop signal to all domains. +@@ -569,6 +564,25 @@ interface(`domain_kill_all_domains',` + allow $1 self:capability kill; + ') + ++######################################## ++## ++## Destroy all domains semaphores ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`domain_destroy_all_semaphores',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow $1 domain:sem destroy; ++') ++ + ######################################## + ## + ## Search the process state directory (/proc/pid) of all domains. +@@ -588,6 +602,42 @@ interface(`domain_search_all_domains_state',` + allow $1 domain:dir search_dir_perms; + ') + ++######################################## ++## ++## Allow read and write of process kernel keyrings ++## ++## ++## ++## Domain to dontaudit. ++## ++## ++# ++interface(`domain_rw_all_domains_keyrings',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow $1 domain:key { read write}; ++') ++ ++######################################## ++## ++## Allow manage of process kernel keyrings ++## ++## ++## ++## Domain to dontaudit. ++## ++## ++# ++interface(`domain_manage_all_domains_keyrings',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow $1 domain:key manage_key_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to search the process +@@ -631,7 +681,7 @@ interface(`domain_read_all_domains_state',` + + ######################################## + ## +-## Get the attributes of all domains of all domains. ++## Get the attributes of all domains. + ## + ## + ## +@@ -655,7 +705,7 @@ interface(`domain_getattr_all_domains',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -1114,6 +1164,25 @@ interface(`domain_dontaudit_rw_all_key_sockets',` + dontaudit $1 domain:key_socket { read write }; + ') + ++######################################## ++## ++## Do not audit attempts to link ++## all domains keys. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`domain_dontaudit_link_keys',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ dontaudit $1 domain:key { link search }; ++') ++ + ######################################## + ## + ## Do not audit attempts to get the attributes +@@ -1354,6 +1423,24 @@ interface(`domain_manage_all_entry_files',` + allow $1 entry_type:file manage_file_perms; + ') + ++######################################## ++## ++## Relabel from domain types on files if a user managed to mislable ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`domain_relabelfrom',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow $1 domain:dir_file_class_set relabelfrom_file_perms; ++') ++ + ######################################## + ## + ## Relabel to and from all entry point +@@ -1390,7 +1477,7 @@ interface(`domain_mmap_all_entry_files',` + attribute entry_type; + ') + +- allow $1 entry_type:file mmap_file_perms; ++ allow $1 entry_type:file mmap_exec_file_perms; + ') + + ######################################## +@@ -1421,7 +1508,7 @@ interface(`domain_entry_file_spec_domtrans',` + ## + ## Ability to mmap a low area of the address + ## space conditionally, as configured by +-## /proc/sys/kernel/mmap_min_addr. ++## /proc/sys/vm/mmap_min_addr. + ## Preventing such mappings helps protect against + ## exploiting null deref bugs in the kernel. + ## +@@ -1448,7 +1535,7 @@ interface(`domain_mmap_low',` + ## + ## Ability to mmap a low area of the address + ## space unconditionally, as configured +-## by /proc/sys/kernel/mmap_min_addr. ++## by /proc/sys/vm/mmap_min_addr. + ## Preventing such mappings helps protect against + ## exploiting null deref bugs in the kernel. + ## +@@ -1506,6 +1593,24 @@ interface(`domain_unconfined_signal',` + allow $1 unconfined_domain_type:process signal; + ') + ++######################################## ++## ++## Named Filetrans Domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`domain_named_filetrans',` ++ gen_require(` ++ attribute named_filetrans_domain; ++ ') ++ ++ typeattribute $1 named_filetrans_domain; ++') ++ + ######################################## + ## + ## Unconfined access to domains. +@@ -1530,4 +1635,63 @@ interface(`domain_unconfined',` + typeattribute $1 can_change_object_identity; + typeattribute $1 set_curr_context; + typeattribute $1 process_uncond_exempt; ++ ++ mcs_process_set_categories($1) ++ ++ userdom_filetrans_home_content($1) ++') ++ ++######################################## ++## ++## Do not audit attempts to read or write ++## all leaked sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`domain_dontaudit_leaks',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ dontaudit $1 domain:socket_class_set { read write }; ++') ++ ++######################################## ++## ++## Allow caller to transition to any domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`domain_transition_all',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow $1 domain:process transition; ++') ++ ++######################################## ++## ++## Do not audit attempts to access check /proc ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`domain_dontaudit_access_check',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ dontaudit $1 domain:dir_file_class_set audit_access; + ') +diff --git a/policy/modules/kernel/domain.te b/policy/modules/kernel/domain.te +index cf04cb5091..fd8148287e 100644 +--- a/policy/modules/kernel/domain.te ++++ b/policy/modules/kernel/domain.te +@@ -4,17 +4,56 @@ policy_module(domain, 1.11.0) + # + # Declarations + # ++## ++##

++## Allow all domains to use other domains file descriptors ++##

++##
++# ++gen_tunable(domain_fd_use, true) ++ ++## ++##

++## Allow all domains to execute in fips_mode ++##

++##
++# ++gen_tunable(fips_mode, true) ++ ++## ++##

++## Allow all domains to have the kernel load modules ++##

++##
++# ++gen_tunable(domain_kernel_load_modules, false) + + ## + ##

+ ## Control the ability to mmap a low area of the address space, +-## as configured by /proc/sys/kernel/mmap_min_addr. ++## as configured by /proc/sys/vm/mmap_min_addr. + ##

+ ##
+ gen_tunable(mmap_low_allowed, false) + ++## ++##

++## Allow all domains write to kmsg_device, ++## while kernel is executed with systemd.log_target=kmsg parameter. ++##

++##
++gen_tunable(domain_can_write_kmsg, false) ++ ++## ++##

++## Allow any process to mmap any file on system with attribute file_type. ++##

++##
++gen_tunable(domain_can_mmap_files, true) ++ + # Mark process types as domains + attribute domain; ++attribute named_filetrans_domain; + + # Transitions only allowed from domains to other domains + neverallow domain ~domain:process { transition dyntransition }; +@@ -86,23 +125,66 @@ neverallow ~{ domain unlabeled_t } *:process *; + allow domain self:dir list_dir_perms; + allow domain self:lnk_file { read_lnk_file_perms lock ioctl }; + allow domain self:file rw_file_perms; ++allow domain self:fifo_file rw_fifo_file_perms; ++allow domain self:sem create_sem_perms; ++allow domain self:shm create_shm_perms; ++ + kernel_read_proc_symlinks(domain) ++kernel_read_crypto_sysctls(domain) ++kernel_read_vm_overcommit_sysctls(domain) ++ + # Every domain gets the key ring, so we should default + # to no one allowed to look at it; afs kernel support creates + # a keyring + kernel_dontaudit_search_key(domain) + kernel_dontaudit_link_key(domain) ++kernel_dontaudit_search_debugfs(domain) + + # create child processes in the domain +-allow domain self:process { fork sigchld }; ++allow domain self:process { getcap fork getsched signal_perms }; + + # Use trusted objects in /dev ++dev_read_cpu_online(domain) + dev_rw_null(domain) + dev_rw_zero(domain) + term_use_controlling_term(domain) + ++# Allow all domains to read /dev/urandom. It is needed by all apps/services ++# linked to libgcrypt. There is no harm to allow it by default. ++dev_read_urand(domain) ++ + # list the root directory + files_list_root(domain) ++# allow all domains to search through base_file_type directory, since users ++# sometimes place labels within these directories. (samba_share_t) for example. ++files_search_base_file_types(domain) ++ ++files_read_inherited_tmp_files(domain) ++files_append_inherited_tmp_files(domain) ++files_read_all_base_ro_files(domain) ++files_dontaduit_getattr_kernel_symbol_table(domain) ++ ++# All executables should be able to search the directory they are in ++corecmd_search_bin(domain) ++ ++optional_policy(` ++ userdom_search_admin_dir(domain) ++') ++ ++tunable_policy(`domain_can_write_kmsg',` ++ dev_write_kmsg(domain) ++') ++ ++tunable_policy(`domain_kernel_load_modules',` ++ kernel_request_load_module(domain) ++') ++ ++tunable_policy(`domain_can_mmap_files',` ++ allow domain file_type:file map; ++ allow domain file_type:blk_file map; ++ allow domain file_type:lnk_file map; ++ allow domain file_type:chr_file map; ++') + + ifdef(`hide_broken_symptoms',` + # This check is in the general socket +@@ -120,9 +202,20 @@ tunable_policy(`global_ssp',` + dev_read_urand(domain) + ') + ++optional_policy(` ++ afs_rw_cache(domain) ++') ++ + optional_policy(` + libs_use_ld_so(domain) + libs_use_shared_libs(domain) ++ libs_read_lib_files(domain) ++') ++ ++optional_policy(` ++ miscfiles_read_localization(domain) ++ miscfiles_read_man_pages(domain) ++ miscfiles_read_fonts(domain) + ') + + optional_policy(` +@@ -133,6 +226,9 @@ optional_policy(` + optional_policy(` + xserver_dontaudit_use_xdm_fds(domain) + xserver_dontaudit_rw_xdm_pipes(domain) ++ xserver_dontaudit_append_xdm_home_files(domain) ++ xserver_dontaudit_write_log(domain) ++ xserver_dontaudit_xdm_rw_stream_sockets(domain) + ') + + ######################################## +@@ -147,12 +243,18 @@ optional_policy(` + # Use/sendto/connectto sockets created by any domain. + allow unconfined_domain_type domain:{ socket_class_set socket key_socket } *; + ++allow unconfined_domain_type domain:system all_system_perms; + # Use descriptors and pipes created by any domain. + allow unconfined_domain_type domain:fd use; + allow unconfined_domain_type domain:fifo_file rw_file_perms; + ++allow unconfined_domain_type unconfined_domain_type:dbus send_msg; ++ + # Act upon any other process. +-allow unconfined_domain_type domain:process ~{ transition dyntransition execmem execstack execheap }; ++allow unconfined_domain_type domain:process ~{ ptrace transition dyntransition execmem execstack execheap }; ++tunable_policy(`deny_ptrace',`',` ++ allow unconfined_domain_type domain:process ptrace; ++') + + # Create/access any System V IPC objects. + allow unconfined_domain_type domain:{ sem msgq shm } *; +@@ -166,5 +268,393 @@ allow unconfined_domain_type domain:lnk_file { read_lnk_file_perms ioctl lock }; + # act on all domains keys + allow unconfined_domain_type domain:key *; + ++corenet_filetrans_all_named_dev(named_filetrans_domain) ++ ++dev_filetrans_all_named_dev(named_filetrans_domain) ++ + # receive from all domains over labeled networking + domain_all_recvfrom_all_domains(unconfined_domain_type) ++ ++files_filetrans_named_content(named_filetrans_domain) ++files_filetrans_system_conf_named_files(named_filetrans_domain) ++files_config_all_files(unconfined_domain_type) ++dev_config_null_dev_service(unconfined_domain_type) ++ ++optional_policy(` ++ miscfiles_filetrans_named_content_letsencrypt(unconfined_domain_type) ++') ++ ++optional_policy(` ++ kdump_filetrans_named_content(unconfined_domain_type) ++') ++ ++optional_policy(` ++ fstools_filetrans_named_content_fsadm(named_filetrans_domain) ++') ++ ++optional_policy(` ++ ipa_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ locallogin_filetrans_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ mandb_filetrans_named_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ ppp_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ snapper_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ seutil_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ wine_filetrans_named_content(named_filetrans_domain) ++') ++ ++storage_filetrans_all_named_dev(named_filetrans_domain) ++ ++term_filetrans_all_named_dev(named_filetrans_domain) ++ ++optional_policy(` ++ init_disable_services(unconfined_domain_type) ++ init_enable_services(unconfined_domain_type) ++ init_reload_services(unconfined_domain_type) ++ init_status(unconfined_domain_type) ++ init_reboot(unconfined_domain_type) ++ init_halt(unconfined_domain_type) ++ init_undefined(unconfined_domain_type) ++ init_filetrans_named_content(named_filetrans_domain) ++') ++ ++# Allow manage transient unit files ++optional_policy(` ++ init_start_transient_unit(unconfined_domain_type) ++ init_stop_transient_unit(unconfined_domain_type) ++ init_status_transient_unit(unconfined_domain_type) ++ init_reload_transient_unit(unconfined_domain_type) ++ init_enable_transient_unit(unconfined_domain_type) ++ init_disable_transient_unit(unconfined_domain_type) ++') ++ ++optional_policy(` ++ auth_filetrans_named_content(named_filetrans_domain) ++ auth_filetrans_admin_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ libs_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ logging_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ miscfiles_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ abrt_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ alsa_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ apache_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ apcupsd_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ bootloader_filetrans_config(named_filetrans_domain) ++') ++ ++optional_policy(` ++ clock_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ cups_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ cvs_filetrans_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ dbus_filetrans_named_content_system(named_filetrans_domain) ++') ++ ++optional_policy(` ++ devicekit_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ dnsmasq_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ container_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ gnome_filetrans_admin_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ iscsi_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ iptables_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ kerberos_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ mta_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ mplayer_filetrans_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ modules_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ mysql_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ networkmanager_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ ntp_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ nx_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ plymouthd_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ postgresql_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ postfix_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ prelink_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ pulseaudio_filetrans_admin_home_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ quota_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ rpcbind_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ rsync_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ sysnet_filetrans_named_content(named_filetrans_domain) ++ sysnet_filetrans_named_content_ifconfig(named_filetrans_domain) ++') ++ ++optional_policy(` ++ systemd_login_status(unconfined_domain_type) ++ systemd_login_reboot(unconfined_domain_type) ++ systemd_login_halt(unconfined_domain_type) ++ systemd_login_undefined(unconfined_domain_type) ++ systemd_filetrans_named_content(named_filetrans_domain) ++ systemd_filetrans_named_hostname(named_filetrans_domain) ++ systemd_filetrans_home_content(named_filetrans_domain) ++ systemd_dontaudit_write_inherited_logind_sessions_pipes(domain) ++') ++ ++optional_policy(` ++ tftp_filetrans_named_content(named_filetrans_domain) ++') ++ ++optional_policy(` ++ userdom_user_home_dir_filetrans_user_home_content(named_filetrans_domain, { dir file lnk_file fifo_file sock_file }) ++') ++ ++optional_policy(` ++ ssh_filetrans_admin_home_content(named_filetrans_domain) ++ ssh_filetrans_keys(unconfined_domain_type) ++') ++ ++optional_policy(` ++ userdom_filetrans_named_user_tmp_files(named_filetrans_domain) ++') ++ ++optional_policy(` ++ virt_filetrans_named_content(named_filetrans_domain) ++') ++ ++selinux_getattr_fs(domain) ++selinux_search_fs(domain) ++selinux_dontaudit_read_fs(domain) ++ ++optional_policy(` ++ seutil_dontaudit_read_config(domain) ++') ++ ++optional_policy(` ++ init_sigchld(domain) ++ init_signull(domain) ++ init_read_machineid(domain) ++') ++ ++ifdef(`distro_redhat',` ++ files_search_mnt(domain) ++') ++ ++# these seem questionable: ++ ++optional_policy(` ++ abrt_domtrans_helper(domain) ++ abrt_read_pid_files(domain) ++ abrt_read_state(domain) ++ abrt_signull(domain) ++ abrt_append_cache(domain) ++ abrt_rw_fifo_file(domain) ++') ++ ++optional_policy(` ++ sosreport_append_tmp_files(domain) ++') ++ ++tunable_policy(`domain_fd_use',` ++ # Allow all domains to use fds past to them ++ allow domain domain:fd use; ++') ++ ++optional_policy(` ++ cron_dontaudit_write_system_job_tmp_files(domain) ++ cron_rw_pipes(domain) ++ cron_rw_system_job_pipes(domain) ++') ++ ++optional_policy(` ++ devicekit_dbus_chat_power(domain) ++') ++ ++optional_policy(` ++ container_spc_stream_connect(domain) ++') ++ ++ifdef(`hide_broken_symptoms',` ++ dontaudit domain self:capability { net_admin }; ++ dontaudit domain self:udp_socket listen; ++ allow domain domain:key { link search }; ++ dontaudit domain domain:socket_class_set { read write }; ++ dontaudit domain self:capability sys_module; ++') ++ ++optional_policy(` ++ ipsec_match_default_spd(domain) ++') ++ ++optional_policy(` ++ ifdef(`hide_broken_symptoms',` ++ afs_rw_udp_sockets(domain) ++ ') ++') ++ ++optional_policy(` ++ rolekit_dbus_chat(domain) ++') ++ ++optional_policy(` ++ vmtools_unconfined_dbus_chat(domain) ++') ++ ++optional_policy(` ++ ssh_rw_pipes(domain) ++') ++ ++optional_policy(` ++ unconfined_dontaudit_rw_pipes(domain) ++ unconfined_sigchld(domain) ++') ++ ++# broken kernel ++dontaudit can_change_object_identity can_change_object_identity:key link; ++dontaudit domain self:file create; ++ ++ifdef(`distro_redhat',` ++ optional_policy(` ++ unconfined_use_fds(domain) ++ ') ++') ++ ++# these seem questionable: ++ ++optional_policy(` ++ puppet_rw_tmp(domain) ++') ++ ++dontaudit domain domain:process { noatsecure siginh rlimitinh } ; ++ ++optional_policy(` ++ rkhunter_append_lib_files(domain) ++') ++ ++optional_policy(` ++ rpm_rw_script_inherited_pipes(domain) ++ rpm_use_fds(domain) ++ rpm_read_pipes(domain) ++ rpm_search_log(domain) ++ rpm_append_tmp_files(domain) ++ rpm_dontaudit_leaks(domain) ++ rpm_read_script_tmp_files(domain) ++ rpm_inherited_fifo(domain) ++ rpm_named_filetrans(named_filetrans_domain) ++') ++ ++tunable_policy(`fips_mode',` ++ allow domain self:fifo_file manage_fifo_file_perms; ++ kernel_read_kernel_sysctls(domain) ++') ++ ++optional_policy(` ++ tunable_policy(`fips_mode',` ++ prelink_exec(domain) ++ ') ++') ++ ++optional_policy(` ++ unconfined_server_stream_connect(domain) ++') +diff --git a/policy/modules/kernel/files.fc b/policy/modules/kernel/files.fc +index b876c48adb..df5b188be6 100644 +--- a/policy/modules/kernel/files.fc ++++ b/policy/modules/kernel/files.fc +@@ -18,6 +18,7 @@ ifdef(`distro_redhat',` + /fsckoptions -- gen_context(system_u:object_r:etc_runtime_t,s0) + /halt -- gen_context(system_u:object_r:etc_runtime_t,s0) + /poweroff -- gen_context(system_u:object_r:etc_runtime_t,s0) ++/[^/]+ -- gen_context(system_u:object_r:etc_runtime_t,s0) + ') + + ifdef(`distro_suse',` +@@ -27,7 +28,7 @@ ifdef(`distro_suse',` + # + # /boot + # +-/boot -d gen_context(system_u:object_r:boot_t,s0) ++/boot gen_context(system_u:object_r:boot_t,s0) + /boot/.* gen_context(system_u:object_r:boot_t,s0) + /boot/\.journal <> + /boot/efi(/.*)?/System\.map(-.*)? -- gen_context(system_u:object_r:system_map_t,s0) +@@ -38,27 +39,36 @@ ifdef(`distro_suse',` + # + # /emul + # +-/emul -d gen_context(system_u:object_r:usr_t,s0) ++/emul gen_context(system_u:object_r:usr_t,s0) + /emul/.* gen_context(system_u:object_r:usr_t,s0) + + # + # /etc + # +-/etc -d gen_context(system_u:object_r:etc_t,s0) ++/etc gen_context(system_u:object_r:etc_t,s0) + /etc/.* gen_context(system_u:object_r:etc_t,s0) + /etc/\.fstab\.hal\..+ -- gen_context(system_u:object_r:etc_runtime_t,s0) ++/etc/\.updated -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/blkid(/.*)? gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/cmtab -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/fstab\.REVOKE -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/ioctl\.save -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/killpower -- gen_context(system_u:object_r:etc_runtime_t,s0) +-/etc/localtime -l gen_context(system_u:object_r:etc_t,s0) +-/etc/mtab -- gen_context(system_u:object_r:etc_runtime_t,s0) +-/etc/mtab~[0-9]* -- gen_context(system_u:object_r:etc_runtime_t,s0) +-/etc/mtab\.tmp -- gen_context(system_u:object_r:etc_runtime_t,s0) +-/etc/mtab\.fuselock -- gen_context(system_u:object_r:etc_runtime_t,s0) ++/etc/mtab.* -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/nohotplug -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/nologin.* -- gen_context(system_u:object_r:etc_runtime_t,s0) ++/etc/securetty -- gen_context(system_u:object_r:etc_runtime_t,s0) ++ ++/etc/sysctl\.conf(\.old)? -- gen_context(system_u:object_r:system_conf_t,s0) ++/etc/sysconfig/ebtables.* -- gen_context(system_u:object_r:system_conf_t,s0) ++/etc/sysconfig/ip6?tables.* -- gen_context(system_u:object_r:system_conf_t,s0) ++/etc/sysconfig/ipvsadm.* -- gen_context(system_u:object_r:system_conf_t,s0) ++/etc/sysconfig/system-config-firewall.* -- gen_context(system_u:object_r:system_conf_t,s0) ++/etc/yum\.repos\.d(/.*)? gen_context(system_u:object_r:system_conf_t,s0) ++/etc/ostree/remotes.d(/.*)? gen_context(system_u:object_r:system_conf_t,s0) ++ ++/ostree/repo(/.*)? gen_context(system_u:object_r:system_conf_t,s0) ++/ostree/deploy/rhel-atomic-host/deploy(/.*)? gen_context(system_u:object_r:system_conf_t,s0) + + /etc/cups/client\.conf -- gen_context(system_u:object_r:etc_t,s0) + +@@ -70,7 +80,10 @@ ifdef(`distro_suse',` + + /etc/sysconfig/hwconf -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/sysconfig/iptables\.save -- gen_context(system_u:object_r:etc_runtime_t,s0) +-/etc/sysconfig/firstboot -- gen_context(system_u:object_r:etc_runtime_t,s0) ++ ++/etc/xorg\.conf\.d/00-system-setup-keyboard\.conf -- gen_context(system_u:object_r:etc_runtime_t,s0) ++/etc/X11/xorg\.conf\.d/00-system-setup-keyboard\.conf -- gen_context(system_u:object_r:etc_runtime_t,s0) ++ + + ifdef(`distro_gentoo', ` + /etc/profile\.env -- gen_context(system_u:object_r:etc_runtime_t,s0) +@@ -78,10 +91,6 @@ ifdef(`distro_gentoo', ` + /etc/env\.d/.* -- gen_context(system_u:object_r:etc_runtime_t,s0) + ') + +-ifdef(`distro_redhat',` +-/etc/rhgb(/.*)? -d gen_context(system_u:object_r:mnt_t,s0) +-') +- + ifdef(`distro_suse',` + /etc/defkeymap\.map -- gen_context(system_u:object_r:etc_runtime_t,s0) + /etc/rc\.d/init\.d/\.depend.* -- gen_context(system_u:object_r:etc_runtime_t,s0) +@@ -92,6 +101,8 @@ ifdef(`distro_suse',` + # expanded by genhomedircon + # + HOME_ROOT -d gen_context(system_u:object_r:home_root_t,s0-mls_systemhigh) ++HOME_ROOT/home-inst -d gen_context(system_u:object_r:home_root_t,s0-mls_systemhigh) ++HOME_ROOT/\-inst -d gen_context(system_u:object_r:home_root_t,s0-mls_systemhigh) + HOME_ROOT -l gen_context(system_u:object_r:home_root_t,s0) + HOME_ROOT/\.journal <> + HOME_ROOT/lost\+found -d gen_context(system_u:object_r:lost_found_t,mls_systemhigh) +@@ -104,7 +115,7 @@ HOME_ROOT/lost\+found/.* <> + /initrd -d gen_context(system_u:object_r:root_t,s0) + + # +-# /lib(64)? ++# /lib + # + /lib/modules(/.*)? gen_context(system_u:object_r:modules_object_t,s0) + +@@ -125,10 +136,13 @@ ifdef(`distro_debian',` + # + # Mount points; do not relabel subdirectories, since + # we don't want to change any removable media by default. +-/media(/[^/]*) -l gen_context(system_u:object_r:mnt_t,s0) ++/media(/[^/]*)? -l gen_context(system_u:object_r:mnt_t,s0) + /media(/[^/]*)? -d gen_context(system_u:object_r:mnt_t,s0) + /media/[^/]*/.* <> + /media/\.hal-.* -- gen_context(system_u:object_r:mnt_t,s0) ++/var/run/media(/[^/]*)? -d gen_context(system_u:object_r:mnt_t,s0) ++/var/run/media/.* <> ++/var/\.updated -- gen_context(system_u:object_r:etc_runtime_t,s0) + + # + # /misc +@@ -138,7 +152,7 @@ ifdef(`distro_debian',` + # + # /mnt + # +-/mnt(/[^/]*) -l gen_context(system_u:object_r:mnt_t,s0) ++/mnt(/[^/]*)? -l gen_context(system_u:object_r:mnt_t,s0) + /mnt(/[^/]*)? -d gen_context(system_u:object_r:mnt_t,s0) + /mnt/[^/]*/.* <> + +@@ -150,10 +164,10 @@ ifdef(`distro_debian',` + # + # /opt + # +-/opt -d gen_context(system_u:object_r:usr_t,s0) ++/opt gen_context(system_u:object_r:usr_t,s0) + /opt/.* gen_context(system_u:object_r:usr_t,s0) + +-/opt/(.*/)?var/lib(64)?(/.*)? gen_context(system_u:object_r:var_lib_t,s0) ++/opt/(.*/)?var/lib(/.*)? gen_context(system_u:object_r:var_lib_t,s0) + + # + # /proc +@@ -161,6 +175,12 @@ ifdef(`distro_debian',` + /proc -d <> + /proc/.* <> + ++ifdef(`distro_redhat',` ++/rhev -d gen_context(system_u:object_r:mnt_t,s0) ++/rhev(/[^/]*)? -d gen_context(system_u:object_r:mnt_t,s0) ++/rhev/[^/]*/.* gen_context(system_u:object_r:mnt_t,s0) ++') ++ + # + # /run + # +@@ -169,6 +189,7 @@ ifdef(`distro_debian',` + /run/.*\.*pid <> + /run/lock(/.*)? gen_context(system_u:object_r:var_lock_t,s0) + ++/sandbox(/.*)? gen_context(system_u:object_r:tmp_t,s0) + # + # /selinux + # +@@ -178,13 +199,14 @@ ifdef(`distro_debian',` + # + # /srv + # +-/srv -d gen_context(system_u:object_r:var_t,s0) ++/srv gen_context(system_u:object_r:var_t,s0) + /srv/.* gen_context(system_u:object_r:var_t,s0) + + # + # /tmp + # +-/tmp -d gen_context(system_u:object_r:tmp_t,s0-mls_systemhigh) ++/tmp gen_context(system_u:object_r:tmp_t,s0-mls_systemhigh) ++/tmp-inst gen_context(system_u:object_r:tmp_t,s0-mls_systemhigh) + /tmp/.* <> + /tmp/\.journal <> + +@@ -194,9 +216,11 @@ ifdef(`distro_debian',` + # + # /usr + # +-/usr -d gen_context(system_u:object_r:usr_t,s0) ++/usr gen_context(system_u:object_r:usr_t,s0) + /usr/.* gen_context(system_u:object_r:usr_t,s0) + /usr/\.journal <> ++/export(/.*)? gen_context(system_u:object_r:usr_t,s0) ++/ostree(/.*)? gen_context(system_u:object_r:usr_t,s0) + + /usr/doc(/.*)?/lib(/.*)? gen_context(system_u:object_r:usr_t,s0) + +@@ -204,15 +228,9 @@ ifdef(`distro_debian',` + + /usr/inclu.e(/.*)? gen_context(system_u:object_r:usr_t,s0) + +-/usr/local/\.journal <> +- +-/usr/local/etc(/.*)? gen_context(system_u:object_r:etc_t,s0) +- +-/usr/local/lost\+found -d gen_context(system_u:object_r:lost_found_t,mls_systemhigh) +-/usr/local/lost\+found/.* <> +- + /usr/lost\+found -d gen_context(system_u:object_r:lost_found_t,mls_systemhigh) + /usr/lost\+found/.* <> ++/usr/lib/modules(/.*)? gen_context(system_u:object_r:modules_object_t,s0) + + /usr/share/doc(/.*)?/README.* gen_context(system_u:object_r:usr_t,s0) + +@@ -220,8 +238,6 @@ ifdef(`distro_debian',` + /usr/tmp/.* <> + + ifndef(`distro_redhat',` +-/usr/local/src(/.*)? gen_context(system_u:object_r:src_t,s0) +- + /usr/src(/.*)? gen_context(system_u:object_r:src_t,s0) + /usr/src/kernels/.+/lib(/.*)? gen_context(system_u:object_r:usr_t,s0) + ') +@@ -229,19 +245,33 @@ ifndef(`distro_redhat',` + # + # /var + # +-/var -d gen_context(system_u:object_r:var_t,s0) ++/var gen_context(system_u:object_r:var_t,s0) + /var/.* gen_context(system_u:object_r:var_t,s0) + /var/\.journal <> + +-/var/db/.*\.db -- gen_context(system_u:object_r:etc_t,s0) ++/var/db(/.*)? gen_context(system_u:object_r:system_db_t,s0) + + /var/ftp/etc(/.*)? gen_context(system_u:object_r:etc_t,s0) + ++/var/named/chroot/etc(/.*)? gen_context(system_u:object_r:etc_t,s0) ++ + /var/lib(/.*)? gen_context(system_u:object_r:var_lib_t,s0) + + /var/lib/nfs/rpc_pipefs(/.*)? <> + +-/var/lock(/.*)? gen_context(system_u:object_r:var_lock_t,s0) ++/var/lib/stickshift/.stickshift-proxy.d(/.*)? gen_context(system_u:object_r:etc_t,s0) ++/var/lib/stickshift/.limits.d(/.*)? gen_context(system_u:object_r:etc_t,s0) ++ ++/var/lib/openshift/.openshift-proxy.d(/.*)? gen_context(system_u:object_r:etc_t,s0) ++/var/lib/openshift/.stickshift-proxy.d(/.*)? gen_context(system_u:object_r:etc_t,s0) ++/var/lib/openshift/.limits.d(/.*)? gen_context(system_u:object_r:etc_t,s0) ++ ++/var/lib/servicelog/servicelog\.db -- gen_context(system_u:object_r:system_db_t,s0) ++/var/lib/servicelog/servicelog\.db-journal -- gen_context(system_u:object_r:system_db_t,s0) ++ ++/var/lock -d gen_context(system_u:object_r:var_lock_t,s0) ++/var/lock -l gen_context(system_u:object_r:var_lock_t,s0) ++/var/lock/.* <> + + /var/log/lost\+found -d gen_context(system_u:object_r:lost_found_t,mls_systemhigh) + /var/log/lost\+found/.* <> +@@ -256,12 +286,14 @@ ifndef(`distro_redhat',` + /var/run -l gen_context(system_u:object_r:var_run_t,s0) + /var/run/.* gen_context(system_u:object_r:var_run_t,s0) + /var/run/.*\.*pid <> ++/var/run/lock/.* <> + + /var/spool(/.*)? gen_context(system_u:object_r:var_spool_t,s0) + /var/spool/postfix/etc(/.*)? gen_context(system_u:object_r:etc_t,s0) + + /var/tmp -d gen_context(system_u:object_r:tmp_t,s0-mls_systemhigh) + /var/tmp -l gen_context(system_u:object_r:tmp_t,s0) ++/var/tmp-inst -d gen_context(system_u:object_r:tmp_t,s0-mls_systemhigh) + /var/tmp/.* <> + /var/tmp/lost\+found -d gen_context(system_u:object_r:lost_found_t,mls_systemhigh) + /var/tmp/lost\+found/.* <> +@@ -271,3 +303,7 @@ ifdef(`distro_debian',` + /var/run/motd -- gen_context(system_u:object_r:initrc_var_run_t,s0) + /var/run/motd\.dynamic -- gen_context(system_u:object_r:initrc_var_run_t,s0) + ') ++/nsr(/.*)? gen_context(system_u:object_r:var_t,s0) ++/nsr/logs(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ ++/sysroot/ostree/deploy/.*-atomic.*/deploy(/.*)? gen_context(system_u:object_r:root_t,s0) +diff --git a/policy/modules/kernel/files.if b/policy/modules/kernel/files.if +index f962f76ad6..4a8ce9c4b9 100644 +--- a/policy/modules/kernel/files.if ++++ b/policy/modules/kernel/files.if +@@ -19,6 +19,136 @@ + ## Comains the file initial SID. + ## + ++##################################### ++## ++## files stub etc_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_etc',` ++ gen_require(` ++ type etc_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_lock_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var_lock',` ++ gen_require(` ++ type var_lock_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_log_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var_log',` ++ gen_require(` ++ type var_log_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_lib_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var_lib',` ++ gen_require(` ++ type var_lib_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_run_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var_run',` ++ gen_require(` ++ type var_run_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_run_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var_spool',` ++ gen_require(` ++ type var_spool_t; ++ ') ++') ++ ++##################################### ++## ++## files stub var_run_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_var',` ++ gen_require(` ++ type var_t; ++ ') ++') ++ ++ ++##################################### ++## ++## files stub tmp_t interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_stub_tmp',` ++ gen_require(` ++ type tmp_t; ++ ') ++') ++ ++ + ######################################## + ## + ## Make the specified type usable for files +@@ -55,6 +185,7 @@ + ##
  • files_pid_file()
  • + ##
  • files_security_file()
  • + ##
  • files_security_mountpoint()
  • ++##
  • files_spool_file()
  • + ##
  • files_tmp_file()
  • + ##
  • files_tmpfs_file()
  • + ##
  • logging_log_file()
  • +@@ -125,44 +256,59 @@ interface(`files_security_file',` + typeattribute $1 file_type, security_file_type, non_auth_file_type; + ') + ++ + ######################################## + ## + ## Make the specified type usable for +-## lock files. ++## filesystem mount points. + ## + ## + ## +-## Type to be used for lock files. ++## Type to be used for mount points. + ## + ## + # +-interface(`files_lock_file',` ++interface(`files_mountpoint',` + gen_require(` +- attribute lockfile; ++ attribute mountpoint; + ') + + files_type($1) +- typeattribute $1 lockfile; ++ typeattribute $1 mountpoint; + ') + + ######################################## + ## +-## Make the specified type usable for +-## filesystem mount points. ++## Create a private type object in mountpoint dir ++## with an automatic type transition + ## +-## ++## + ## +-## Type to be used for mount points. ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. + ## + ## + # +-interface(`files_mountpoint',` ++interface(`files_mountpoint_filetrans',` + gen_require(` + attribute mountpoint; + ') + +- files_type($1) +- typeattribute $1 mountpoint; ++ filetrans_pattern($1, mountpoint, $2, $3, $4) + ') + + ######################################## +@@ -185,6 +331,26 @@ interface(`files_security_mountpoint',` + typeattribute $1 mountpoint; + ') + ++######################################## ++## ++## Make the specified type usable for ++## lock files. ++## ++## ++## ++## Type to be used for lock files. ++## ++## ++# ++interface(`files_lock_file',` ++ gen_require(` ++ attribute lockfile; ++ ') ++ ++ files_type($1) ++ typeattribute $1 lockfile; ++') ++ + ######################################## + ## + ## Make the specified type usable for +@@ -521,7 +687,7 @@ interface(`files_mounton_non_security',` + attribute non_security_file_type; + ') + +- allow $1 non_security_file_type:dir mounton; ++ allow $1 non_security_file_type:dir { write setattr mounton }; + allow $1 non_security_file_type:file mounton; + ') + +@@ -543,6 +709,24 @@ interface(`files_write_non_security_dirs',` + allow $1 non_security_file_type:dir write; + ') + ++######################################## ++## ++## Allow attempts to setattr any directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_setattr_non_security_dirs',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ allow $1 non_security_file_type:dir { read setattr }; ++') ++ + ######################################## + ## + ## Allow attempts to manage non-security directories +@@ -580,6 +764,42 @@ interface(`files_getattr_all_files',` + getattr_lnk_files_pattern($1, file_type, file_type) + ') + ++######################################## ++## ++## Get the attributes of all chr files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_getattr_all_chr_files',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ getattr_chr_files_pattern($1, file_type, file_type) ++') ++ ++######################################## ++## ++## Get the attributes of all blk files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_getattr_all_blk_files',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ getattr_blk_files_pattern($1, file_type, file_type) ++') ++ + ######################################## + ## + ## Do not audit attempts to get the attributes +@@ -618,6 +838,63 @@ interface(`files_dontaudit_getattr_non_security_files',` + dontaudit $1 non_security_file_type:file getattr; + ') + ++######################################## ++## ++## Do not audit attempts to search ++## non security dirs. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_search_non_security_dirs',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ dontaudit $1 non_security_file_type:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to set the attributes ++## of non security files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_setattr_non_security_files',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ dontaudit $1 non_security_file_type:file setattr; ++') ++ ++######################################## ++## ++## Do not audit attempts to set the attributes ++## of non security directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_setattr_non_security_dirs',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ dontaudit $1 non_security_file_type:dir setattr; ++') ++ + ######################################## + ## + ## Read all files. +@@ -683,129 +960,261 @@ interface(`files_read_non_security_files',` + attribute non_security_file_type; + ') + ++ list_dirs_pattern($1, non_security_file_type, non_security_file_type) + read_files_pattern($1, non_security_file_type, non_security_file_type) + read_lnk_files_pattern($1, non_security_file_type, non_security_file_type) + ') + + ######################################## + ## +-## Read all directories on the filesystem, except +-## the listed exceptions. ++## Map all non-security files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The types to be excluded. Each type or attribute +-## must be negated by the caller. +-## +-## ++## + # +-interface(`files_read_all_dirs_except',` ++interface(`files_map_non_security_files',` + gen_require(` +- attribute file_type; ++ attribute non_security_file_type; + ') + +- allow $1 { file_type $2 }:dir list_dir_perms; ++ allow $1 non_security_file_type:file map; + ') + + ######################################## + ## +-## Read all files on the filesystem, except +-## the listed exceptions. ++## Read/Write all inherited non-security files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The types to be excluded. Each type or attribute +-## must be negated by the caller. +-## +-## ++## + # +-interface(`files_read_all_files_except',` ++interface(`files_rw_inherited_non_security_files',` + gen_require(` +- attribute file_type; ++ attribute non_security_file_type; + ') + +- read_files_pattern($1, { file_type $2 }, { file_type $2 }) ++ allow $1 non_security_file_type:file { read write }; + ') + + ######################################## + ## +-## Read all symbolic links on the filesystem, except +-## the listed exceptions. ++## Manage all non-security files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The types to be excluded. Each type or attribute +-## must be negated by the caller. +-## +-## ++## + # +-interface(`files_read_all_symlinks_except',` ++interface(`files_manage_non_security_files',` + gen_require(` +- attribute file_type; ++ attribute non_security_file_type; + ') + +- read_lnk_files_pattern($1, { file_type $2 }, { file_type $2 }) ++ manage_files_pattern($1, non_security_file_type, non_security_file_type) ++ manage_lnk_files_pattern($1, non_security_file_type, non_security_file_type) + ') + + ######################################## + ## +-## Get the attributes of all symbolic links. ++## Relabel all non-security files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`files_getattr_all_symlinks',` ++interface(`files_relabel_non_security_files',` + gen_require(` +- attribute file_type; ++ attribute non_security_file_type; + ') + +- getattr_lnk_files_pattern($1, file_type, file_type) ++ relabel_files_pattern($1, non_security_file_type, non_security_file_type) ++ allow $1 { non_security_file_type }:dir list_dir_perms; ++ relabel_dirs_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_lnk_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_fifo_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_sock_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_blk_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ relabel_chr_files_pattern($1, { non_security_file_type }, { non_security_file_type }) ++ ++ # satisfy the assertions: ++ seutil_relabelto_bin_policy($1) + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of all symbolic links. ++## Search all base file dirs. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_getattr_all_symlinks',` ++interface(`files_search_base_file_types',` + gen_require(` +- attribute file_type; ++ attribute base_file_type; + ') + +- dontaudit $1 file_type:lnk_file getattr; ++ allow $1 base_file_type:dir search_dir_perms; + ') + + ######################################## + ## +-## Do not audit attempts to read all symbolic links. ++## Relabel all base file types. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_base_file_types',` ++ gen_require(` ++ attribute base_file_type; ++ ') ++ ++ allow $1 base_file_type:dir list_dir_perms; ++ relabel_dirs_pattern($1, base_file_type , base_file_type ) ++ relabel_files_pattern($1, base_file_type , base_file_type ) ++ relabel_lnk_files_pattern($1, base_file_type , base_file_type ) ++ relabel_fifo_files_pattern($1, base_file_type , base_file_type ) ++ relabel_sock_files_pattern($1, base_file_type , base_file_type ) ++ relabel_blk_files_pattern($1, base_file_type , base_file_type ) ++ relabel_chr_files_pattern($1, base_file_type , base_file_type ) ++') ++ ++######################################## ++## ++## Read all directories on the filesystem, except ++## the listed exceptions. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The types to be excluded. Each type or attribute ++## must be negated by the caller. ++## ++## ++# ++interface(`files_read_all_dirs_except',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ allow $1 { file_type $2 }:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Read all files on the filesystem, except ++## the listed exceptions. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The types to be excluded. Each type or attribute ++## must be negated by the caller. ++## ++## ++# ++interface(`files_read_all_files_except',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ read_files_pattern($1, { file_type $2 }, { file_type $2 }) ++') ++ ++######################################## ++## ++## Read all symbolic links on the filesystem, except ++## the listed exceptions. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The types to be excluded. Each type or attribute ++## must be negated by the caller. ++## ++## ++# ++interface(`files_read_all_symlinks_except',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ read_lnk_files_pattern($1, { file_type $2 }, { file_type $2 }) ++') ++ ++######################################## ++## ++## Get the attributes of all symbolic links. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_getattr_all_symlinks',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ getattr_lnk_files_pattern($1, file_type, file_type) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of all symbolic links. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_getattr_all_symlinks',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ dontaudit $1 file_type:lnk_file getattr; ++') ++ ++######################################## ++## ++## Do not audit attempts to read all symbolic links. ++## ++## ++## ++## Domain to not audit. + ## + ## + # +@@ -951,6 +1360,25 @@ interface(`files_dontaudit_getattr_non_security_pipes',` + dontaudit $1 non_security_file_type:fifo_file getattr; + ') + ++######################################## ++## ++## Do not audit attempts to read/write ++## of non security named pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_rw_inherited_pipes',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ dontaudit $1 non_security_file_type:fifo_file rw_inherited_fifo_file_perms; ++') ++ + ######################################## + ## + ## Get the attributes of all named sockets. +@@ -989,6 +1417,44 @@ interface(`files_dontaudit_getattr_all_sockets',` + dontaudit $1 file_type:sock_file getattr; + ') + ++######################################## ++## ++## Do not audit attempts to read ++## of all named sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_read_all_sockets',` ++ gen_require(` ++ attribute file_type; ++ ') ++ ++ dontaudit $1 file_type:sock_file read; ++') ++ ++######################################## ++## ++## Do not audit attempts to read ++## of all security file types. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_read_all_non_security_files',` ++ gen_require(` ++ attribute non_security_file_type; ++ ') ++ ++ dontaudit $1 non_security_file_type:file read_file_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to get the attributes +@@ -1073,10 +1539,8 @@ interface(`files_relabel_all_files',` + relabel_lnk_files_pattern($1, { file_type $2 }, { file_type $2 }) + relabel_fifo_files_pattern($1, { file_type $2 }, { file_type $2 }) + relabel_sock_files_pattern($1, { file_type $2 }, { file_type $2 }) +- # this is only relabelfrom since there should be no +- # device nodes with file types. +- relabelfrom_blk_files_pattern($1, { file_type $2 }, { file_type $2 }) +- relabelfrom_chr_files_pattern($1, { file_type $2 }, { file_type $2 }) ++ relabel_blk_files_pattern($1, { file_type $2 }, { file_type $2 }) ++ relabel_chr_files_pattern($1, { file_type $2 }, { file_type $2 }) + + # satisfy the assertions: + seutil_relabelto_bin_policy($1) +@@ -1180,24 +1644,6 @@ interface(`files_list_all',` + allow $1 file_type:dir list_dir_perms; + ') + +-######################################## +-## +-## Create all files as is. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`files_create_all_files_as',` +- gen_require(` +- attribute file_type; +- ') +- +- allow $1 file_type:kernel_service create_files_as; +-') +- + ######################################## + ## + ## Do not audit attempts to search the +@@ -1443,9 +1889,6 @@ interface(`files_relabel_non_auth_files',` + # device nodes with file types. + relabelfrom_blk_files_pattern($1, non_auth_file_type, non_auth_file_type) + relabelfrom_chr_files_pattern($1, non_auth_file_type, non_auth_file_type) +- +- # satisfy the assertions: +- seutil_relabelto_bin_policy($1) + ') + + ############################################# +@@ -1599,6 +2042,24 @@ interface(`files_setattr_all_mountpoints',` + allow $1 mountpoint:dir setattr; + ') + ++######################################## ++## ++## Set the attributes of all mount points. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabelto_all_mountpoints',` ++ gen_require(` ++ attribute mountpoint; ++ ') ++ ++ allow $1 mountpoint:dir relabelto; ++') ++ + ######################################## + ## + ## Do not audit attempts to set the attributes on all mount points. +@@ -1689,6 +2150,24 @@ interface(`files_dontaudit_list_all_mountpoints',` + dontaudit $1 mountpoint:dir list_dir_perms; + ') + ++######################################## ++## ++## Write all mount points. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_write_all_mountpoints',` ++ gen_require(` ++ attribute mountpoint; ++ ') ++ ++ allow $1 mountpoint:dir write; ++') ++ + ######################################## + ## + ## Do not audit attempts to write to mount points. +@@ -1703,80 +2182,172 @@ interface(`files_dontaudit_write_all_mountpoints',` + gen_require(` + attribute mountpoint; + ') ++ dontaudit $1 self:capability { dac_read_search dac_override }; + + dontaudit $1 mountpoint:dir write; + ') + + ######################################## + ## +-## List the contents of the root directory. ++## Do not audit attempts to unmount all mount points. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_list_root',` ++interface(`files_dontaudit_unmount_all_mountpoints',` + gen_require(` +- type root_t; ++ attribute mountpoint; + ') + +- allow $1 root_t:dir list_dir_perms; +- allow $1 root_t:lnk_file { read_lnk_file_perms ioctl lock }; ++ dontaudit $1 mountpoint:filesystem unmount; + ') + + ######################################## + ## +-## Do not audit attempts to write to / dirs. ++## Read all mountpoint symbolic links. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_write_root_dirs',` ++interface(`files_read_all_mountpoint_symlinks',` + gen_require(` +- type root_t; ++ attribute mountpoint; + ') + +- dontaudit $1 root_t:dir write; ++ allow $1 mountpoint:lnk_file read_lnk_file_perms; + ') + +-################### ++######################################## + ## +-## Do not audit attempts to write +-## files in the root directory. ++## Write all file type directories. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_rw_root_dir',` ++interface(`files_write_all_dirs',` + gen_require(` +- type root_t; ++ attribute file_type; + ') + +- dontaudit $1 root_t:dir rw_dir_perms; ++ allow $1 file_type:dir write; + ') + + ######################################## + ## +-## Create an object in the root directory, with a private +-## type using a type transition. ++## List the contents of the root directory. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The type of the object to be created. +-## ++# ++interface(`files_list_root',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ allow $1 root_t:dir list_dir_perms; ++ allow $1 root_t:lnk_file { read_lnk_file_perms ioctl lock }; ++') ++######################################## ++## ++## Do not audit attempts to write to / dirs. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_write_root_dirs',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ allow $1 root_t:dir write; ++') ++ ++######################################## ++## ++## Do not audit attempts to write to / dirs. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_write_root_dirs',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ dontaudit $1 root_t:dir write; ++') ++ ++################### ++## ++## Do not audit attempts to write ++## files in the root directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_rw_root_dir',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ dontaudit $1 root_t:dir rw_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to check the ++## access on root directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_access_check_root',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ dontaudit $1 root_t:dir_file_class_set audit_access; ++') ++ ++ ++######################################## ++## ++## Create an object in the root directory, with a private ++## type using a type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## + ## + ## + ## +@@ -1892,25 +2463,25 @@ interface(`files_delete_root_dir_entry',` + + ######################################## + ## +-## Associate to root file system. ++## Set attributes of the root directory. + ## +-## ++## + ## +-## Type of the file to associate. ++## Domain allowed access. + ## + ## + # +-interface(`files_associate_rootfs',` ++interface(`files_setattr_root_dirs',` + gen_require(` + type root_t; + ') + +- allow $1 root_t:filesystem associate; ++ allow $1 root_t:dir setattr_dir_perms; + ') + + ######################################## + ## +-## Relabel to and from rootfs file system. ++## Relabel a rootfs filesystem. + ## + ## + ## +@@ -1923,7 +2494,7 @@ interface(`files_relabel_rootfs',` + type root_t; + ') + +- allow $1 root_t:filesystem { relabelto relabelfrom }; ++ allow $1 root_t:filesystem relabel_file_perms; + ') + + ######################################## +@@ -1944,6 +2515,42 @@ interface(`files_unmount_rootfs',` + allow $1 root_t:filesystem unmount; + ') + ++######################################## ++## ++## Mount a filesystem on the root file system ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_mounton_rootfs',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ allow $1 root_t:dir { search_dir_perms mounton }; ++') ++ ++######################################## ++## ++## Mount a filesystem on the root file system ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_dontaudit_mounton_rootfs',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ dontaudit $1 root_t:dir mounton; ++') ++ + ######################################## + ## + ## Get attributes of the /boot directory. +@@ -2143,6 +2750,23 @@ interface(`files_read_boot_files',` + read_files_pattern($1, boot_t, boot_t) + ') + ++###################################### ++## ++## Map files in the /boot. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_map_boot_files',` ++ gen_require(` ++ type boot_t; ++ ') ++ allow $1 boot_t:file map; ++') ++ + ######################################## + ## + ## Create, read, write, and delete files +@@ -2181,6 +2805,24 @@ interface(`files_relabelfrom_boot_files',` + relabelfrom_files_pattern($1, boot_t, boot_t) + ') + ++######################################## ++## ++## Relabel to files in the /boot directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabelto_boot_files',` ++ gen_require(` ++ type boot_t; ++ ') ++ ++ relabelto_files_pattern($1, boot_t, boot_t) ++') ++ + ###################################### + ## + ## Read symbolic links in the /boot directory. +@@ -2555,6 +3197,24 @@ interface(`files_read_default_pipes',` + allow $1 default_t:fifo_file read_fifo_file_perms; + ') + ++######################################## ++## ++## Mounton directories on filesystem /etc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_mounton_etc',` ++ gen_require(` ++ type etc_t; ++ ') ++ ++ allow $1 etc_t:dir mounton; ++') ++ + ######################################## + ## + ## Search the contents of /etc directories. +@@ -2645,6 +3305,24 @@ interface(`files_rw_etc_dirs',` + allow $1 etc_t:dir rw_dir_perms; + ') + ++####################################### ++## ++## Dontaudit remove dir /etc directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_remove_etc_dir',` ++ gen_require(` ++ type etc_t; ++ ') ++ ++ dontaudit $1 etc_t:dir rmdir; ++') ++ + ########################################## + ## + ## Manage generic directories in /etc +@@ -2716,6 +3394,7 @@ interface(`files_read_etc_files',` + allow $1 etc_t:dir list_dir_perms; + read_files_pattern($1, etc_t, etc_t) + read_lnk_files_pattern($1, etc_t, etc_t) ++ files_read_etc_runtime_files($1) + ') + + ######################################## +@@ -2724,7 +3403,7 @@ interface(`files_read_etc_files',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -2778,6 +3457,25 @@ interface(`files_manage_etc_files',` + read_lnk_files_pattern($1, etc_t, etc_t) + ') + ++######################################## ++## ++## Do not audit attempts to check the ++## access on etc files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_access_check_etc',` ++ gen_require(` ++ type etc_t; ++ ') ++ ++ dontaudit $1 etc_t:dir_file_class_set audit_access; ++') ++ + ######################################## + ## + ## Delete system configuration files in /etc. +@@ -2796,6 +3494,24 @@ interface(`files_delete_etc_files',` + delete_files_pattern($1, etc_t, etc_t) + ') + ++######################################## ++## ++## Remove entries from the etc directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_etc_dir_entry',` ++ gen_require(` ++ type etc_t; ++ ') ++ ++ allow $1 etc_t:dir del_entry_dir_perms; ++') ++ + ######################################## + ## + ## Execute generic files in /etc. +@@ -2961,24 +3677,6 @@ interface(`files_delete_boot_flag',` + delete_files_pattern($1, root_t, etc_runtime_t) + ') + +-######################################## +-## +-## Do not audit attempts to set the attributes of the etc_runtime files +-## +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`files_dontaudit_setattr_etc_runtime_files',` +- gen_require(` +- type etc_runtime_t; +- ') +- +- dontaudit $1 etc_runtime_t:file setattr; +-') +- + ######################################## + ## + ## Read files in /etc that are dynamically +@@ -3021,9 +3719,7 @@ interface(`files_read_etc_runtime_files',` + + ######################################## + ## +-## Do not audit attempts to read files +-## in /etc that are dynamically +-## created on boot, such as mtab. ++## Do not audit attempts to set the attributes of the etc_runtime files + ## + ## + ## +@@ -3031,18 +3727,17 @@ interface(`files_read_etc_runtime_files',` + ## + ## + # +-interface(`files_dontaudit_read_etc_runtime_files',` ++interface(`files_dontaudit_setattr_etc_runtime_files',` + gen_require(` + type etc_runtime_t; + ') + +- dontaudit $1 etc_runtime_t:file { getattr read }; ++ dontaudit $1 etc_runtime_t:file setattr; + ') + + ######################################## + ## +-## Do not audit attempts to write +-## etc runtime files. ++## Do not audit attempts to write etc_runtime files + ## + ## + ## +@@ -3058,6 +3753,26 @@ interface(`files_dontaudit_write_etc_runtime_files',` + dontaudit $1 etc_runtime_t:file write; + ') + ++######################################## ++## ++## Do not audit attempts to read files ++## in /etc that are dynamically ++## created on boot, such as mtab. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_read_etc_runtime_files',` ++ gen_require(` ++ type etc_runtime_t; ++ ') ++ ++ dontaudit $1 etc_runtime_t:file { getattr read }; ++') ++ + ######################################## + ## + ## Read and write files in /etc that are dynamically +@@ -3077,6 +3792,7 @@ interface(`files_rw_etc_runtime_files',` + + allow $1 etc_t:dir list_dir_perms; + rw_files_pattern($1, etc_t, etc_runtime_t) ++ read_lnk_files_pattern($1, etc_t, etc_t) + ') + + ######################################## +@@ -3098,6 +3814,7 @@ interface(`files_manage_etc_runtime_files',` + ') + + manage_files_pattern($1, { etc_t etc_runtime_t }, etc_runtime_t) ++ read_lnk_files_pattern($1, etc_t, etc_runtime_t) + ') + + ######################################## +@@ -3142,10 +3859,48 @@ interface(`files_etc_filetrans_etc_runtime',` + # + interface(`files_getattr_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir getattr; ++') ++ ++######################################## ++## ++## Getattr all file opbjects on new filesystems ++## that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_getattr_isid_type',` ++ gen_require(` ++ type unlabeled_t; + ') + +- allow $1 file_t:dir getattr; ++ allow $1 unlabeled_t:dir_file_class_set getattr; ++') ++ ++######################################## ++## ++## Setattr of directories on new filesystems ++## that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_setattr_isid_type_dirs',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir setattr; + ') + + ######################################## +@@ -3161,10 +3916,10 @@ interface(`files_getattr_isid_type_dirs',` + # + interface(`files_dontaudit_search_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- dontaudit $1 file_t:dir search_dir_perms; ++ dontaudit $1 unlabeled_t:dir search_dir_perms; + ') + + ######################################## +@@ -3180,10 +3935,10 @@ interface(`files_dontaudit_search_isid_type_dirs',` + # + interface(`files_list_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:dir list_dir_perms; ++ allow $1 unlabeled_t:dir list_dir_perms; + ') + + ######################################## +@@ -3199,10 +3954,10 @@ interface(`files_list_isid_type_dirs',` + # + interface(`files_rw_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:dir rw_dir_perms; ++ allow $1 unlabeled_t:dir rw_dir_perms; + ') + + ######################################## +@@ -3218,10 +3973,66 @@ interface(`files_rw_isid_type_dirs',` + # + interface(`files_delete_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; ++ ') ++ ++ delete_dirs_pattern($1, unlabeled_t, unlabeled_t) ++') ++######################################## ++## ++## Execute files on new filesystems ++## that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_exec_isid_files',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ can_exec($1, unlabeled_t) ++') ++ ++######################################## ++## ++## Moundon directories on new filesystems ++## that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_mounton_isid',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir mounton; ++') ++ ++######################################## ++## ++## Relabelfrom all file opbjects on new filesystems ++## that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabelfrom_isid_type',` ++ gen_require(` ++ type unlabeled_t; + ') + +- delete_dirs_pattern($1, file_t, file_t) ++ dontaudit $1 unlabeled_t:dir_file_class_set relabelfrom; + ') + + ######################################## +@@ -3237,10 +4048,10 @@ interface(`files_delete_isid_type_dirs',` + # + interface(`files_manage_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:dir manage_dir_perms; ++ allow $1 unlabeled_t:dir manage_dir_perms; + ') + + ######################################## +@@ -3256,10 +4067,29 @@ interface(`files_manage_isid_type_dirs',` + # + interface(`files_mounton_isid_type_dirs',` + gen_require(` +- type file_t; ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir { search_dir_perms mounton }; ++') ++ ++######################################## ++## ++## Mount a filesystem on a new chr_file ++## that has not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_mounton_isid_type_chr_file',` ++ gen_require(` ++ type unlabeled_t; + ') + +- allow $1 file_t:dir { search_dir_perms mounton }; ++ allow $1 unlabeled_t:chr_file mounton; + ') + + ######################################## +@@ -3275,10 +4105,10 @@ interface(`files_mounton_isid_type_dirs',` + # + interface(`files_read_isid_type_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:file read_file_perms; ++ allow $1 unlabeled_t:file read_file_perms; + ') + + ######################################## +@@ -3294,10 +4124,10 @@ interface(`files_read_isid_type_files',` + # + interface(`files_delete_isid_type_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_files_pattern($1, file_t, file_t) ++ delete_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3313,10 +4143,10 @@ interface(`files_delete_isid_type_files',` + # + interface(`files_delete_isid_type_symlinks',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_lnk_files_pattern($1, file_t, file_t) ++ delete_lnk_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3332,10 +4162,10 @@ interface(`files_delete_isid_type_symlinks',` + # + interface(`files_delete_isid_type_fifo_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_fifo_files_pattern($1, file_t, file_t) ++ delete_fifo_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3351,10 +4181,10 @@ interface(`files_delete_isid_type_fifo_files',` + # + interface(`files_delete_isid_type_sock_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_sock_files_pattern($1, file_t, file_t) ++ delete_sock_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3370,10 +4200,10 @@ interface(`files_delete_isid_type_sock_files',` + # + interface(`files_delete_isid_type_blk_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_blk_files_pattern($1, file_t, file_t) ++ delete_blk_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3389,10 +4219,10 @@ interface(`files_delete_isid_type_blk_files',` + # + interface(`files_dontaudit_write_isid_chr_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- dontaudit $1 file_t:chr_file write; ++ dontaudit $1 unlabeled_t:chr_file write; + ') + + ######################################## +@@ -3408,10 +4238,10 @@ interface(`files_dontaudit_write_isid_chr_files',` + # + interface(`files_delete_isid_type_chr_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- delete_chr_files_pattern($1, file_t, file_t) ++ delete_chr_files_pattern($1, unlabeled_t, unlabeled_t) + ') + + ######################################## +@@ -3427,10 +4257,10 @@ interface(`files_delete_isid_type_chr_files',` + # + interface(`files_manage_isid_type_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:file manage_file_perms; ++ allow $1 unlabeled_t:file manage_file_perms; + ') + + ######################################## +@@ -3446,10 +4276,10 @@ interface(`files_manage_isid_type_files',` + # + interface(`files_manage_isid_type_symlinks',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:lnk_file manage_lnk_file_perms; ++ allow $1 unlabeled_t:lnk_file manage_lnk_file_perms; + ') + + ######################################## +@@ -3465,10 +4295,29 @@ interface(`files_manage_isid_type_symlinks',` + # + interface(`files_rw_isid_type_blk_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:blk_file rw_blk_file_perms; ++') ++ ++######################################## ++## ++## rw any files inherited from another process ++## on new filesystems that have not yet been labeled. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_rw_inherited_isid_type_files',` ++ gen_require(` ++ type unlabeled_t; + ') + +- allow $1 file_t:blk_file rw_blk_file_perms; ++ allow $1 unlabeled_t:file rw_inherited_file_perms; + ') + + ######################################## +@@ -3484,10 +4333,10 @@ interface(`files_rw_isid_type_blk_files',` + # + interface(`files_manage_isid_type_blk_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:blk_file manage_blk_file_perms; ++ allow $1 unlabeled_t:blk_file manage_blk_file_perms; + ') + + ######################################## +@@ -3503,10 +4352,10 @@ interface(`files_manage_isid_type_blk_files',` + # + interface(`files_manage_isid_type_chr_files',` + gen_require(` +- type file_t; ++ type unlabeled_t; + ') + +- allow $1 file_t:chr_file manage_chr_file_perms; ++ allow $1 unlabeled_t:chr_file manage_chr_file_perms; + ') + + ######################################## +@@ -3550,6 +4399,43 @@ interface(`files_dontaudit_getattr_home_dir',` + dontaudit $1 home_root_t:lnk_file getattr; + ') + ++######################################## ++## ++## Do not audit attempts to check the ++## access on home root directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_access_check_home_dir',` ++ gen_require(` ++ type home_root_t; ++ ') ++ ++ dontaudit $1 home_root_t:dir_file_class_set audit_access; ++') ++ ++######################################## ++## ++## Create /home directories ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_create_home_dir',` ++ gen_require(` ++ type home_root_t; ++ ') ++ ++ create_dirs_pattern($1, home_root_t, home_root_t) ++') ++ + ######################################## + ## + ## Search home directories root (/home). +@@ -3814,20 +4700,38 @@ interface(`files_list_mnt',` + + ###################################### + ## +-## Do not audit attempts to list the contents of /mnt. ++## dontaudit List the contents of /mnt. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_list_mnt',` ++ gen_require(` ++ type mnt_t; ++ ') ++ ++ dontaudit $1 mnt_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to check the ++## write access on mnt files + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_dontaudit_list_mnt',` ++interface(`files_dontaudit_access_check_mnt',` + gen_require(` + type mnt_t; + ') +- +- dontaudit $1 mnt_t:dir list_dir_perms; ++ dontaudit $1 mnt_t:dir_file_class_set audit_access; + ') + + ######################################## +@@ -3921,6 +4825,45 @@ interface(`files_read_mnt_symlinks',` + read_lnk_files_pattern($1, mnt_t, mnt_t) + ') + ++ ++######################################## ++## ++## Load kernel module files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_load_kernel_modules',` ++ gen_require(` ++ type modules_object_t; ++ ') ++ ++ files_read_kernel_modules($1) ++ allow $1 modules_object_t:system module_load; ++') ++ ++######################################## ++## ++## Mmap kernel module files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_map_kernel_modules',` ++ gen_require(` ++ type modules_object_t; ++ ') ++ ++ allow $1 modules_object_t:file map; ++ ++') ++ + ######################################## + ## + ## Create, read, write, and delete symbolic links in /mnt. +@@ -4012,6 +4955,7 @@ interface(`files_read_kernel_modules',` + allow $1 modules_object_t:dir list_dir_perms; + read_files_pattern($1, modules_object_t, modules_object_t) + read_lnk_files_pattern($1, modules_object_t, modules_object_t) ++ + ') + + ######################################## +@@ -4217,174 +5161,235 @@ interface(`files_read_world_readable_sockets',` + allow $1 readable_t:sock_file read_sock_file_perms; + ') + +-######################################## ++####################################### + ## +-## Allow the specified type to associate +-## to a filesystem with the type of the +-## temporary directory (/tmp). ++## Read manageable system configuration files in /etc + ## +-## +-## +-## Type of the file to associate. +-## ++## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_associate_tmp',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_read_system_conf_files',` ++ gen_require(` ++ type etc_t, system_conf_t; ++ ') + +- allow $1 tmp_t:filesystem associate; ++ allow $1 etc_t:dir list_dir_perms; ++ read_files_pattern($1, etc_t, system_conf_t) ++ read_lnk_files_pattern($1, etc_t, system_conf_t) + ') + +-######################################## ++###################################### + ## +-## Get the attributes of the tmp directory (/tmp). ++## Manage manageable system configuration files in /etc. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_getattr_tmp_dirs',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_manage_system_conf_files',` ++ gen_require(` ++ type etc_t, system_conf_t; ++ ') + +- allow $1 tmp_t:dir getattr; ++ manage_files_pattern($1, { etc_t system_conf_t }, system_conf_t) ++ files_filetrans_system_conf_named_files($1) + ') + +-######################################## ++##################################### + ## +-## Do not audit attempts to get the +-## attributes of the tmp directory (/tmp). ++## File name transition for system configuration files in /etc. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_dontaudit_getattr_tmp_dirs',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_filetrans_system_conf_named_files',` ++ gen_require(` ++ type etc_t, system_conf_t, usr_t; ++ ') + +- dontaudit $1 tmp_t:dir getattr; ++ filetrans_pattern($1, etc_t, system_conf_t, file, "sysctl.conf") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "sysctl.conf.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ebtables") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ebtables.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ebtables-config") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ebtables-config.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "iptables") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "iptables.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "iptables-config") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "iptables-config.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ip6tables") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ip6tables.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ip6tables-config") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "ip6tables-config.old") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "redhat.repo") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "system-config-firewall") ++ filetrans_pattern($1, etc_t, system_conf_t, file, "system-config-firewall.old") ++ filetrans_pattern($1, etc_t, system_conf_t, dir, "yum.repos.d") ++ filetrans_pattern($1, etc_t, system_conf_t, dir, "remotes.d") ++ filetrans_pattern($1, usr_t, system_conf_t, dir, "repo") + ') + +-######################################## ++###################################### + ## +-## Search the tmp directory (/tmp). ++## Relabel manageable system configuration files in /etc. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_search_tmp',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_relabelto_system_conf_files',` ++ gen_require(` ++ type usr_t; ++ ') + +- allow $1 tmp_t:dir search_dir_perms; ++ relabelto_files_pattern($1, system_conf_t, system_conf_t) + ') + +-######################################## ++###################################### + ## +-## Do not audit attempts to search the tmp directory (/tmp). ++## Relabel manageable system configuration files in /etc. + ## + ## +-## +-## Domain to not audit. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_dontaudit_search_tmp',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_relabelfrom_system_conf_files',` ++ gen_require(` ++ type usr_t; ++ ') + +- dontaudit $1 tmp_t:dir search_dir_perms; ++ relabelfrom_files_pattern($1, system_conf_t, system_conf_t) + ') + +-######################################## ++################################### + ## +-## Read the tmp directory (/tmp). ++## Create files in /etc with the type used for ++## the manageable system config files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## The type of the process performing this action. ++## + ## + # +-interface(`files_list_tmp',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_etc_filetrans_system_conf',` ++ gen_require(` ++ type etc_t, system_conf_t; ++ ') + +- allow $1 tmp_t:dir list_dir_perms; ++ filetrans_pattern($1, etc_t, system_conf_t, file) + ') + +-######################################## ++###################################### + ## +-## Do not audit listing of the tmp directory (/tmp). ++## Manage manageable system db files in /var/lib. + ## + ## +-## +-## Domain not to audit. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`files_dontaudit_list_tmp',` +- gen_require(` +- type tmp_t; +- ') ++interface(`files_manage_system_db_files',` ++ gen_require(` ++ type var_lib_t, system_db_t; ++ ') + +- dontaudit $1 tmp_t:dir list_dir_perms; ++ manage_files_pattern($1, { var_lib_t system_db_t }, system_db_t) ++ files_filetrans_system_db_named_files($1) + ') + +-######################################## ++###################################### + ## +-## Remove entries from the tmp directory. ++## Map manageable system db files in /var/lib. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_map_system_db_files',` ++ gen_require(` ++ type system_db_t; ++ ') ++ allow $1 system_db_t:file map; ++') ++ ++##################################### ++## ++## File name transition for system db files in /var/lib. + ## + ## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_filetrans_system_db_named_files',` ++ gen_require(` ++ type var_lib_t, system_db_t; ++ ') ++ ++ filetrans_pattern($1, var_lib_t, system_db_t, file, "servicelog.db") ++ filetrans_pattern($1, var_lib_t, system_db_t, file, "servicelog.db-journal") ++') ++ ++######################################## ++## ++## Allow the specified type to associate ++## to a filesystem with the type of the ++## temporary directory (/tmp). ++## ++## + ## +-## Domain allowed access. ++## Type of the file to associate. + ## + ## + # +-interface(`files_delete_tmp_dir_entry',` ++interface(`files_associate_tmp',` + gen_require(` + type tmp_t; + ') + +- allow $1 tmp_t:dir del_entry_dir_perms; ++ allow $1 tmp_t:filesystem associate; + ') + + ######################################## + ## +-## Read files in the tmp directory (/tmp). ++## Allow the specified type to associate ++## to a filesystem with the type of the ++## / file system + ## +-## ++## + ## +-## Domain allowed access. ++## Type of the file to associate. + ## + ## + # +-interface(`files_read_generic_tmp_files',` ++interface(`files_associate_rootfs',` + gen_require(` +- type tmp_t; ++ type root_t; + ') + +- read_files_pattern($1, tmp_t, tmp_t) ++ allow $1 root_t:filesystem associate; + ') + + ######################################## + ## +-## Manage temporary directories in /tmp. ++## Get the attributes of the tmp directory (/tmp). + ## + ## + ## +@@ -4392,53 +5397,56 @@ interface(`files_read_generic_tmp_files',` + ## + ## + # +-interface(`files_manage_generic_tmp_dirs',` ++interface(`files_getattr_tmp_dirs',` + gen_require(` + type tmp_t; + ') + +- manage_dirs_pattern($1, tmp_t, tmp_t) ++ read_lnk_files_pattern($1, tmp_t, tmp_t) ++ allow $1 tmp_t:dir getattr; + ') + + ######################################## + ## +-## Manage temporary files and directories in /tmp. ++## Do not audit attempts to check the ++## access on tmp files + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_generic_tmp_files',` ++interface(`files_dontaudit_access_check_tmp',` + gen_require(` +- type tmp_t; ++ type etc_t; + ') + +- manage_files_pattern($1, tmp_t, tmp_t) ++ dontaudit $1 tmp_t:dir_file_class_set audit_access; + ') + + ######################################## + ## +-## Read symbolic links in the tmp directory (/tmp). ++## Do not audit attempts to get the ++## attributes of the tmp directory (/tmp). + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_read_generic_tmp_symlinks',` ++interface(`files_dontaudit_getattr_tmp_dirs',` + gen_require(` + type tmp_t; + ') + +- read_lnk_files_pattern($1, tmp_t, tmp_t) ++ dontaudit $1 tmp_t:dir getattr; + ') + + ######################################## + ## +-## Read and write generic named sockets in the tmp directory (/tmp). ++## Search the tmp directory (/tmp). + ## + ## + ## +@@ -4446,35 +5454,37 @@ interface(`files_read_generic_tmp_symlinks',` + ## + ## + # +-interface(`files_rw_generic_tmp_sockets',` ++interface(`files_search_tmp',` + gen_require(` + type tmp_t; + ') + +- rw_sock_files_pattern($1, tmp_t, tmp_t) ++ fs_search_tmpfs($1) ++ read_lnk_files_pattern($1, tmp_t, tmp_t) ++ allow $1 tmp_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Set the attributes of all tmp directories. ++## Do not audit attempts to search the tmp directory (/tmp). + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_setattr_all_tmp_dirs',` ++interface(`files_dontaudit_search_tmp',` + gen_require(` +- attribute tmpfile; ++ type tmp_t; + ') + +- allow $1 tmpfile:dir { search_dir_perms setattr }; ++ dontaudit $1 tmp_t:dir search_dir_perms; + ') + + ######################################## + ## +-## List all tmp directories. ++## Read the tmp directory (/tmp). + ## + ## + ## +@@ -4482,59 +5492,55 @@ interface(`files_setattr_all_tmp_dirs',` + ## + ## + # +-interface(`files_list_all_tmp',` ++interface(`files_list_tmp',` + gen_require(` +- attribute tmpfile; ++ type tmp_t; + ') + +- allow $1 tmpfile:dir list_dir_perms; ++ read_lnk_files_pattern($1, tmp_t, tmp_t) ++ allow $1 tmp_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Relabel to and from all temporary +-## directory types. ++## Do not audit listing of the tmp directory (/tmp). + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## +-## + # +-interface(`files_relabel_all_tmp_dirs',` ++interface(`files_dontaudit_list_tmp',` + gen_require(` +- attribute tmpfile; +- type var_t; ++ type tmp_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- relabel_dirs_pattern($1, tmpfile, tmpfile) ++ dontaudit $1 tmp_t:dir list_dir_perms; + ') + +-######################################## ++####################################### + ## +-## Do not audit attempts to get the attributes +-## of all tmp files. ++## Allow read and write to the tmp directory (/tmp). + ## + ## +-## +-## Domain not to audit. +-## ++## ++## Domain not to audit. ++## + ## + # +-interface(`files_dontaudit_getattr_all_tmp_files',` +- gen_require(` +- attribute tmpfile; +- ') ++interface(`files_rw_generic_tmp_dir',` ++ gen_require(` ++ type tmp_t; ++ ') + +- dontaudit $1 tmpfile:file getattr; ++ files_search_tmp($1) ++ allow $1 tmp_t:dir rw_dir_perms; + ') + + ######################################## + ## +-## Allow attempts to get the attributes +-## of all tmp files. ++## Remove entries from the tmp directory. + ## + ## + ## +@@ -4542,110 +5548,98 @@ interface(`files_dontaudit_getattr_all_tmp_files',` + ## + ## + # +-interface(`files_getattr_all_tmp_files',` ++interface(`files_delete_tmp_dir_entry',` + gen_require(` +- attribute tmpfile; ++ type tmp_t; + ') + +- allow $1 tmpfile:file getattr; ++ files_search_tmp($1) ++ allow $1 tmp_t:dir del_entry_dir_perms; + ') + + ######################################## + ## +-## Relabel to and from all temporary +-## file types. ++## Read files in the tmp directory (/tmp). + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`files_relabel_all_tmp_files',` ++interface(`files_read_generic_tmp_files',` + gen_require(` +- attribute tmpfile; +- type var_t; ++ type tmp_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- relabel_files_pattern($1, tmpfile, tmpfile) ++ read_files_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of all tmp sock_file. ++## Manage temporary directories in /tmp. + ## + ## + ## +-## Domain not to audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_getattr_all_tmp_sockets',` ++interface(`files_manage_generic_tmp_dirs',` + gen_require(` +- attribute tmpfile; ++ type tmp_t; + ') + +- dontaudit $1 tmpfile:sock_file getattr; ++ manage_dirs_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Read all tmp files. ++## Allow shared library text relocations in tmp files. + ## ++## ++##

    ++## Allow shared library text relocations in tmp files. ++##

    ++##

    ++## This is added to support java policy. ++##

    ++##
    + ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`files_read_all_tmp_files',` ++interface(`files_execmod_tmp',` + gen_require(` + attribute tmpfile; + ') + +- read_files_pattern($1, tmpfile, tmpfile) ++ allow $1 tmpfile:file execmod; + ') + + ######################################## + ## +-## Create an object in the tmp directories, with a private +-## type using a type transition. ++## Manage temporary files and directories in /tmp. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The type of the object to be created. +-## +-## +-## +-## +-## The object class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`files_tmp_filetrans',` ++interface(`files_manage_generic_tmp_files',` + gen_require(` + type tmp_t; + ') + +- filetrans_pattern($1, tmp_t, $2, $3, $4) ++ manage_files_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Delete the contents of /tmp. ++## Read symbolic links in the tmp directory (/tmp). + ## + ## + ## +@@ -4653,22 +5647,17 @@ interface(`files_tmp_filetrans',` + ## + ## + # +-interface(`files_purge_tmp',` ++interface(`files_read_generic_tmp_symlinks',` + gen_require(` +- attribute tmpfile; ++ type tmp_t; + ') + +- allow $1 tmpfile:dir list_dir_perms; +- delete_dirs_pattern($1, tmpfile, tmpfile) +- delete_files_pattern($1, tmpfile, tmpfile) +- delete_lnk_files_pattern($1, tmpfile, tmpfile) +- delete_fifo_files_pattern($1, tmpfile, tmpfile) +- delete_sock_files_pattern($1, tmpfile, tmpfile) ++ read_lnk_files_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Set the attributes of the /usr directory. ++## Read and write generic named sockets in the tmp directory (/tmp). + ## + ## + ## +@@ -4676,17 +5665,17 @@ interface(`files_purge_tmp',` + ## + ## + # +-interface(`files_setattr_usr_dirs',` ++interface(`files_rw_generic_tmp_sockets',` + gen_require(` +- type usr_t; ++ type tmp_t; + ') + +- allow $1 usr_t:dir setattr; ++ rw_sock_files_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Search the content of /usr. ++## Relabel a dir from the type used in /tmp. + ## + ## + ## +@@ -4694,18 +5683,17 @@ interface(`files_setattr_usr_dirs',` + ## + ## + # +-interface(`files_search_usr',` ++interface(`files_relabelfrom_tmp_dirs',` + gen_require(` +- type usr_t; ++ type tmp_t; + ') + +- allow $1 usr_t:dir search_dir_perms; ++ relabelfrom_dirs_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## List the contents of generic +-## directories in /usr. ++## Relabel a file from the type used in /tmp. + ## + ## + ## +@@ -4713,35 +5701,35 @@ interface(`files_search_usr',` + ## + ## + # +-interface(`files_list_usr',` ++interface(`files_relabelfrom_tmp_files',` + gen_require(` +- type usr_t; ++ type tmp_t; + ') + +- allow $1 usr_t:dir list_dir_perms; ++ relabelfrom_files_pattern($1, tmp_t, tmp_t) + ') + + ######################################## + ## +-## Do not audit write of /usr dirs ++## Set the attributes of all tmp directories. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_write_usr_dirs',` ++interface(`files_setattr_all_tmp_dirs',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- dontaudit $1 usr_t:dir write; ++ allow $1 tmpfile:dir { search_dir_perms setattr }; + ') + + ######################################## + ## +-## Add and remove entries from /usr directories. ++## Allow caller to read inherited tmp files. + ## + ## + ## +@@ -4749,36 +5737,35 @@ interface(`files_dontaudit_write_usr_dirs',` + ## + ## + # +-interface(`files_rw_usr_dirs',` ++interface(`files_read_inherited_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- allow $1 usr_t:dir rw_dir_perms; ++ allow $1 tmpfile:file { append open read_inherited_file_perms }; + ') + + ######################################## + ## +-## Do not audit attempts to add and remove +-## entries from /usr directories. ++## Allow caller to append inherited tmp files. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_rw_usr_dirs',` ++interface(`files_append_inherited_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- dontaudit $1 usr_t:dir rw_dir_perms; ++ allow $1 tmpfile:file append_inherited_file_perms; + ') + + ######################################## + ## +-## Delete generic directories in /usr in the caller domain. ++## Allow caller to read and write inherited tmp files. + ## + ## + ## +@@ -4786,17 +5773,17 @@ interface(`files_dontaudit_rw_usr_dirs',` + ## + ## + # +-interface(`files_delete_usr_dirs',` ++interface(`files_rw_inherited_tmp_file',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- delete_dirs_pattern($1, usr_t, usr_t) ++ allow $1 tmpfile:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Delete generic files in /usr in the caller domain. ++## List all tmp directories. + ## + ## + ## +@@ -4804,73 +5791,59 @@ interface(`files_delete_usr_dirs',` + ## + ## + # +-interface(`files_delete_usr_files',` ++interface(`files_list_all_tmp',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- delete_files_pattern($1, usr_t, usr_t) ++ allow $1 tmpfile:dir list_dir_perms; + ') + + ######################################## + ## +-## Get the attributes of files in /usr. ++## Relabel to and from all temporary ++## directory types. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`files_getattr_usr_files',` ++interface(`files_relabel_all_tmp_dirs',` + gen_require(` +- type usr_t; ++ attribute tmpfile; ++ type var_t; + ') + +- getattr_files_pattern($1, usr_t, usr_t) ++ allow $1 var_t:dir search_dir_perms; ++ relabel_dirs_pattern($1, tmpfile, tmpfile) + ') + + ######################################## + ## +-## Read generic files in /usr. ++## Do not audit attempts to get the attributes ++## of all tmp files. + ## +-## +-##

    +-## Allow the specified domain to read generic +-## files in /usr. These files are various program +-## files that do not have more specific SELinux types. +-## Some examples of these files are: +-##

    +-##
      +-##
    • /usr/include/*
    • +-##
    • /usr/share/doc/*
    • +-##
    • /usr/share/info/*
    • +-##
    +-##

    +-## Generally, it is safe for many domains to have +-## this access. +-##

    +-##
    + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## +-## + # +-interface(`files_read_usr_files',` ++interface(`files_dontaudit_getattr_all_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- allow $1 usr_t:dir list_dir_perms; +- read_files_pattern($1, usr_t, usr_t) +- read_lnk_files_pattern($1, usr_t, usr_t) ++ dontaudit $1 tmpfile:file getattr; + ') + + ######################################## + ## +-## Execute generic programs in /usr in the caller domain. ++## Allow attempts to get the attributes ++## of all tmp files. + ## + ## + ## +@@ -4878,55 +5851,58 @@ interface(`files_read_usr_files',` + ## + ## + # +-interface(`files_exec_usr_files',` ++interface(`files_getattr_all_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- allow $1 usr_t:dir list_dir_perms; +- exec_files_pattern($1, usr_t, usr_t) +- read_lnk_files_pattern($1, usr_t, usr_t) ++ allow $1 tmpfile:file getattr; + ') + + ######################################## + ## +-## dontaudit write of /usr files ++## Relabel to and from all temporary ++## file types. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## ++## + # +-interface(`files_dontaudit_write_usr_files',` ++interface(`files_relabel_all_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; ++ type var_t; + ') + +- dontaudit $1 usr_t:file write; ++ allow $1 var_t:dir search_dir_perms; ++ relabel_files_pattern($1, tmpfile, tmpfile) + ') + + ######################################## + ## +-## Create, read, write, and delete files in the /usr directory. ++## Do not audit attempts to get the attributes ++## of all tmp sock_file. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_usr_files',` ++interface(`files_dontaudit_getattr_all_tmp_sockets',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- manage_files_pattern($1, usr_t, usr_t) ++ dontaudit $1 tmpfile:sock_file getattr; + ') + + ######################################## + ## +-## Relabel a file to the type used in /usr. ++## Read all tmp files. + ## + ## + ## +@@ -4934,67 +5910,70 @@ interface(`files_manage_usr_files',` + ## + ## + # +-interface(`files_relabelto_usr_files',` ++interface(`files_read_all_tmp_files',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- relabelto_files_pattern($1, usr_t, usr_t) ++ read_files_pattern($1, tmpfile, tmpfile) + ') + + ######################################## + ## +-## Relabel a file from the type used in /usr. ++## Do not audit attempts to read or write ++## all leaked tmpfiles files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_relabelfrom_usr_files',` ++interface(`files_dontaudit_tmp_file_leaks',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- relabelfrom_files_pattern($1, usr_t, usr_t) ++ dontaudit $1 tmpfile:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Read symbolic links in /usr. ++## Do allow attempts to read or write ++## all leaked tmpfiles files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_read_usr_symlinks',` ++interface(`files_rw_tmp_file_leaks',` + gen_require(` +- type usr_t; ++ attribute tmpfile; + ') + +- read_lnk_files_pattern($1, usr_t, usr_t) ++ allow $1 tmpfile:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Create objects in the /usr directory ++## Create an object in the tmp directories, with a private ++## type using a type transition. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## + ## +-## The type of the object to be created ++## The type of the object to be created. + ## + ## +-## ++## + ## +-## The object class. ++## The object class of the object being created. + ## + ## + ## +@@ -5003,35 +5982,50 @@ interface(`files_read_usr_symlinks',` + ##
    + ## + # +-interface(`files_usr_filetrans',` ++interface(`files_tmp_filetrans',` + gen_require(` +- type usr_t; ++ type tmp_t; + ') + +- filetrans_pattern($1, usr_t, $2, $3, $4) ++ filetrans_pattern($1, tmp_t, $2, $3, $4) + ') + + ######################################## + ## +-## Do not audit attempts to search /usr/src. ++## Delete the contents of /tmp. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_search_src',` ++interface(`files_purge_tmp',` + gen_require(` +- type src_t; ++ attribute tmpfile; + ') + +- dontaudit $1 src_t:dir search_dir_perms; ++ allow $1 tmpfile:dir list_dir_perms; ++ delete_dirs_pattern($1, tmpfile, tmpfile) ++ delete_files_pattern($1, tmpfile, tmpfile) ++ delete_lnk_files_pattern($1, tmpfile, tmpfile) ++ delete_fifo_files_pattern($1, tmpfile, tmpfile) ++ delete_sock_files_pattern($1, tmpfile, tmpfile) ++ delete_chr_files_pattern($1, tmpfile, tmpfile) ++ delete_blk_files_pattern($1, tmpfile, tmpfile) ++ files_list_isid_type_dirs($1) ++ files_delete_isid_type_dirs($1) ++ files_delete_isid_type_files($1) ++ files_delete_isid_type_symlinks($1) ++ files_delete_isid_type_fifo_files($1) ++ files_delete_isid_type_sock_files($1) ++ files_delete_isid_type_blk_files($1) ++ files_delete_isid_type_chr_files($1) + ') + + ######################################## + ## +-## Get the attributes of files in /usr/src. ++## Set the attributes of the /usr directory. + ## + ## + ## +@@ -5039,20 +6033,17 @@ interface(`files_dontaudit_search_src',` + ## + ## + # +-interface(`files_getattr_usr_src_files',` ++interface(`files_setattr_usr_dirs',` + gen_require(` +- type usr_t, src_t; ++ type usr_t; + ') + +- getattr_files_pattern($1, src_t, src_t) +- +- # /usr/src/linux symlink: +- read_lnk_files_pattern($1, usr_t, src_t) ++ allow $1 usr_t:dir setattr; + ') + + ######################################## + ## +-## Read files in /usr/src. ++## Search the content of /usr. + ## + ## + ## +@@ -5060,20 +6051,18 @@ interface(`files_getattr_usr_src_files',` + ## + ## + # +-interface(`files_read_usr_src_files',` ++interface(`files_search_usr',` + gen_require(` +- type usr_t, src_t; ++ type usr_t; + ') + + allow $1 usr_t:dir search_dir_perms; +- read_files_pattern($1, { usr_t src_t }, src_t) +- read_lnk_files_pattern($1, { usr_t src_t }, src_t) +- allow $1 src_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Execute programs in /usr/src in the caller domain. ++## List the contents of generic ++## directories in /usr. + ## + ## + ## +@@ -5081,38 +6070,35 @@ interface(`files_read_usr_src_files',` + ## + ## + # +-interface(`files_exec_usr_src_files',` ++interface(`files_list_usr',` + gen_require(` +- type usr_t, src_t; ++ type usr_t; + ') + +- list_dirs_pattern($1, usr_t, src_t) +- exec_files_pattern($1, src_t, src_t) +- read_lnk_files_pattern($1, src_t, src_t) ++ allow $1 usr_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Install a system.map into the /boot directory. ++## Do not audit write of /usr dirs + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_create_kernel_symbol_table',` ++interface(`files_dontaudit_write_usr_dirs',` + gen_require(` +- type boot_t, system_map_t; ++ type usr_t; + ') + +- allow $1 boot_t:dir { list_dir_perms add_entry_dir_perms }; +- allow $1 system_map_t:file { create_file_perms rw_file_perms }; ++ dontaudit $1 usr_t:dir write; + ') + + ######################################## + ## +-## Read system.map in the /boot directory. ++## Add and remove entries from /usr directories. + ## + ## + ## +@@ -5120,37 +6106,36 @@ interface(`files_create_kernel_symbol_table',` + ## + ## + # +-interface(`files_read_kernel_symbol_table',` ++interface(`files_rw_usr_dirs',` + gen_require(` +- type boot_t, system_map_t; ++ type usr_t; + ') + +- allow $1 boot_t:dir list_dir_perms; +- read_files_pattern($1, boot_t, system_map_t) ++ allow $1 usr_t:dir rw_dir_perms; + ') + + ######################################## + ## +-## Delete a system.map in the /boot directory. ++## Do not audit attempts to add and remove ++## entries from /usr directories. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_delete_kernel_symbol_table',` ++interface(`files_dontaudit_rw_usr_dirs',` + gen_require(` +- type boot_t, system_map_t; ++ type usr_t; + ') + +- allow $1 boot_t:dir list_dir_perms; +- delete_files_pattern($1, boot_t, system_map_t) ++ dontaudit $1 usr_t:dir rw_dir_perms; + ') + + ######################################## + ## +-## Search the contents of /var. ++## Delete generic directories in /usr in the caller domain. + ## + ## + ## +@@ -5158,35 +6143,35 @@ interface(`files_delete_kernel_symbol_table',` + ## + ## + # +-interface(`files_search_var',` ++interface(`files_delete_usr_dirs',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- allow $1 var_t:dir search_dir_perms; ++ delete_dirs_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Do not audit attempts to write to /var. ++## Delete generic files in /usr in the caller domain. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_write_var_dirs',` ++interface(`files_delete_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- dontaudit $1 var_t:dir write; ++ delete_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Allow attempts to write to /var.dirs ++## Map files in /usr in the caller domain. + ## + ## + ## +@@ -5194,73 +6179,73 @@ interface(`files_dontaudit_write_var_dirs',` + ## + ## + # +-interface(`files_write_var_dirs',` ++interface(`files_mmap_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- allow $1 var_t:dir write; ++ allow $1 usr_t:file map; + ') + + ######################################## + ## +-## Do not audit attempts to search +-## the contents of /var. ++## Get the attributes of files in /usr. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_search_var',` ++interface(`files_getattr_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- dontaudit $1 var_t:dir search_dir_perms; ++ getattr_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## List the contents of /var. ++## Read generic files in /usr. + ## ++## ++##

    ++## Allow the specified domain to read generic ++## files in /usr. These files are various program ++## files that do not have more specific SELinux types. ++## Some examples of these files are: ++##

    ++##
      ++##
    • /usr/include/*
    • ++##
    • /usr/share/doc/*
    • ++##
    • /usr/share/info/*
    • ++##
    ++##

    ++## Generally, it is safe for many domains to have ++## this access. ++##

    ++##
    + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`files_list_var',` ++interface(`files_read_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- allow $1 var_t:dir list_dir_perms; ++ allow $1 usr_t:dir list_dir_perms; ++ read_files_pattern($1, usr_t, usr_t) ++ read_lnk_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Create, read, write, and delete directories +-## in the /var directory. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`files_manage_var_dirs',` +- gen_require(` +- type var_t; +- ') +- +- allow $1 var_t:dir manage_dir_perms; +-') +- +-######################################## +-## +-## Read files in the /var directory. ++## Execute generic programs in /usr in the caller domain. + ## + ## + ## +@@ -5268,35 +6253,37 @@ interface(`files_manage_var_dirs',` + ## + ## + # +-interface(`files_read_var_files',` ++interface(`files_exec_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- read_files_pattern($1, var_t, var_t) ++ allow $1 usr_t:dir list_dir_perms; ++ exec_files_pattern($1, usr_t, usr_t) ++ read_lnk_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Append files in the /var directory. ++## dontaudit write of /usr files + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_append_var_files',` ++interface(`files_dontaudit_write_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- append_files_pattern($1, var_t, var_t) ++ dontaudit $1 usr_t:file write; + ') + + ######################################## + ## +-## Read and write files in the /var directory. ++## Create, read, write, and delete files in the /usr directory. + ## + ## + ## +@@ -5304,36 +6291,17 @@ interface(`files_append_var_files',` + ## + ## + # +-interface(`files_rw_var_files',` +- gen_require(` +- type var_t; +- ') +- +- rw_files_pattern($1, var_t, var_t) +-') +- +-######################################## +-## +-## Do not audit attempts to read and write +-## files in the /var directory. +-## +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`files_dontaudit_rw_var_files',` ++interface(`files_manage_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- dontaudit $1 var_t:file rw_file_perms; ++ manage_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Create, read, write, and delete files in the /var directory. ++## Relabel a file to the type used in /usr. + ## + ## + ## +@@ -5341,17 +6309,17 @@ interface(`files_dontaudit_rw_var_files',` + ## + ## + # +-interface(`files_manage_var_files',` ++interface(`files_relabelto_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- manage_files_pattern($1, var_t, var_t) ++ relabelto_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Read symbolic links in the /var directory. ++## Relabel a file from the type used in /usr. + ## + ## + ## +@@ -5359,18 +6327,17 @@ interface(`files_manage_var_files',` + ## + ## + # +-interface(`files_read_var_symlinks',` ++interface(`files_relabelfrom_usr_files',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- read_lnk_files_pattern($1, var_t, var_t) ++ relabelfrom_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Create, read, write, and delete symbolic +-## links in the /var directory. ++## Read symbolic links in /usr. + ## + ## + ## +@@ -5378,17 +6345,17 @@ interface(`files_read_var_symlinks',` + ## + ## + # +-interface(`files_manage_var_symlinks',` ++interface(`files_read_usr_symlinks',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- manage_lnk_files_pattern($1, var_t, var_t) ++ read_lnk_files_pattern($1, usr_t, usr_t) + ') + + ######################################## + ## +-## Create objects in the /var directory ++## Create objects in the /usr directory + ## + ## + ## +@@ -5411,87 +6378,77 @@ interface(`files_manage_var_symlinks',` + ## + ## + # +-interface(`files_var_filetrans',` ++interface(`files_usr_filetrans',` + gen_require(` +- type var_t; ++ type usr_t; + ') + +- filetrans_pattern($1, var_t, $2, $3, $4) ++ filetrans_pattern($1, usr_t, $2, $3, $4) + ') + + ######################################## + ## +-## Get the attributes of the /var/lib directory. ++## Do not audit attempts to search /usr/src. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_getattr_var_lib_dirs',` ++interface(`files_dontaudit_search_src',` + gen_require(` +- type var_t, var_lib_t; ++ type src_t; + ') + +- getattr_dirs_pattern($1, var_t, var_lib_t) ++ dontaudit $1 src_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Search the /var/lib directory. ++## Get the attributes of files in /usr/src. + ## +-## +-##

    +-## Search the /var/lib directory. This is +-## necessary to access files or directories under +-## /var/lib that have a private type. For example, a +-## domain accessing a private library file in the +-## /var/lib directory: +-##

    +-##

    +-## allow mydomain_t mylibfile_t:file read_file_perms; +-## files_search_var_lib(mydomain_t) +-##

    +-##
    + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`files_search_var_lib',` ++interface(`files_getattr_usr_src_files',` + gen_require(` +- type var_t, var_lib_t; ++ type usr_t, src_t; + ') + +- search_dirs_pattern($1, var_t, var_lib_t) ++ getattr_files_pattern($1, src_t, src_t) ++ ++ # /usr/src/linux symlink: ++ read_lnk_files_pattern($1, usr_t, src_t) + ') + + ######################################## + ## +-## Do not audit attempts to search the +-## contents of /var/lib. ++## Read files in /usr/src. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## +-## + # +-interface(`files_dontaudit_search_var_lib',` ++interface(`files_read_usr_src_files',` + gen_require(` +- type var_lib_t; ++ type usr_t, src_t; + ') + +- dontaudit $1 var_lib_t:dir search_dir_perms; ++ allow $1 usr_t:dir search_dir_perms; ++ read_files_pattern($1, { usr_t src_t }, src_t) ++ read_lnk_files_pattern($1, { usr_t src_t }, src_t) ++ allow $1 src_t:dir list_dir_perms; + ') + + ######################################## + ## +-## List the contents of the /var/lib directory. ++## Execute programs in /usr/src in the caller domain. + ## + ## + ## +@@ -5499,17 +6456,19 @@ interface(`files_dontaudit_search_var_lib',` + ## + ## + # +-interface(`files_list_var_lib',` ++interface(`files_exec_usr_src_files',` + gen_require(` +- type var_t, var_lib_t; ++ type usr_t, src_t; + ') + +- list_dirs_pattern($1, var_t, var_lib_t) ++ list_dirs_pattern($1, usr_t, src_t) ++ exec_files_pattern($1, src_t, src_t) ++ read_lnk_files_pattern($1, src_t, src_t) + ') + +-########################################### ++######################################## + ## +-## Read-write /var/lib directories ++## Install a system.map into the /boot directory. + ## + ## + ## +@@ -5517,51 +6476,36 @@ interface(`files_list_var_lib',` + ## + ## + # +-interface(`files_rw_var_lib_dirs',` ++interface(`files_create_kernel_symbol_table',` + gen_require(` +- type var_lib_t; ++ type boot_t, system_map_t; + ') + +- rw_dirs_pattern($1, var_lib_t, var_lib_t) ++ allow $1 boot_t:dir { list_dir_perms add_entry_dir_perms }; ++ allow $1 system_map_t:file { create_file_perms rw_file_perms }; + ') + + ######################################## + ## +-## Create objects in the /var/lib directory ++## Dontaudit getattr attempts on the system.map file + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## The type of the object to be created +-## +-## +-## +-## +-## The object class. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`files_var_lib_filetrans',` ++interface(`files_dontaduit_getattr_kernel_symbol_table',` + gen_require(` +- type var_t, var_lib_t; ++ type system_map_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- filetrans_pattern($1, var_lib_t, $2, $3, $4) ++ dontaudit $1 system_map_t:file getattr; + ') + + ######################################## + ## +-## Read generic files in /var/lib. ++## Read system.map in the /boot directory. + ## + ## + ## +@@ -5569,18 +6513,18 @@ interface(`files_var_lib_filetrans',` + ## + ## + # +-interface(`files_read_var_lib_files',` ++interface(`files_read_kernel_symbol_table',` + gen_require(` +- type var_t, var_lib_t; ++ type boot_t, system_map_t; + ') + +- allow $1 var_lib_t:dir list_dir_perms; +- read_files_pattern($1, { var_t var_lib_t }, var_lib_t) ++ allow $1 boot_t:dir list_dir_perms; ++ read_files_pattern($1, boot_t, system_map_t) + ') + + ######################################## + ## +-## Read generic symbolic links in /var/lib ++## Delete a system.map in the /boot directory. + ## + ## + ## +@@ -5588,21 +6532,18 @@ interface(`files_read_var_lib_files',` + ## + ## + # +-interface(`files_read_var_lib_symlinks',` ++interface(`files_delete_kernel_symbol_table',` + gen_require(` +- type var_t, var_lib_t; ++ type boot_t, system_map_t; + ') + +- read_lnk_files_pattern($1, { var_t var_lib_t }, var_lib_t) ++ allow $1 boot_t:dir list_dir_perms; ++ delete_files_pattern($1, boot_t, system_map_t) + ') + +-# cjp: the next two interfaces really need to be fixed +-# in some way. They really neeed their own types. +- + ######################################## + ## +-## Create, read, write, and delete the +-## pseudorandom number generator seed. ++## Search the contents of /var. + ## + ## + ## +@@ -5610,38 +6551,35 @@ interface(`files_read_var_lib_symlinks',` + ## + ## + # +-interface(`files_manage_urandom_seed',` ++interface(`files_search_var',` + gen_require(` +- type var_t, var_lib_t; ++ type var_t; + ') + + allow $1 var_t:dir search_dir_perms; +- manage_files_pattern($1, var_lib_t, var_lib_t) + ') + + ######################################## + ## +-## Allow domain to manage mount tables +-## necessary for rpcd, nfsd, etc. ++## Do not audit attempts to write to /var. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_mounttab',` ++interface(`files_dontaudit_write_var_dirs',` + gen_require(` +- type var_t, var_lib_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- manage_files_pattern($1, var_lib_t, var_lib_t) ++ dontaudit $1 var_t:dir write; + ') + + ######################################## + ## +-## Set the attributes of the generic lock directories. ++## Allow attempts to write to /var.dirs + ## + ## + ## +@@ -5649,76 +6587,73 @@ interface(`files_manage_mounttab',` + ## + ## + # +-interface(`files_setattr_lock_dirs',` ++interface(`files_write_var_dirs',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- setattr_dirs_pattern($1, var_t, var_lock_t) ++ allow $1 var_t:dir write; + ') + + ######################################## + ## +-## Search the locks directory (/var/lock). ++## Do not audit attempts to search ++## the contents of /var. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_search_locks',` ++interface(`files_dontaudit_search_var',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- search_dirs_pattern($1, var_t, var_lock_t) ++ dontaudit $1 var_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Do not audit attempts to search the +-## locks directory (/var/lock). ++## List the contents of /var. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_search_locks',` ++interface(`files_list_var',` + gen_require(` +- type var_lock_t; ++ type var_t; + ') + +- dontaudit $1 var_lock_t:lnk_file read_lnk_file_perms; +- dontaudit $1 var_lock_t:dir search_dir_perms; ++ allow $1 var_t:dir list_dir_perms; + ') + + ######################################## + ## +-## List generic lock directories. ++## Do not audit listing of the var directory (/var). + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_list_locks',` ++interface(`files_dontaudit_list_var',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- list_dirs_pattern($1, var_t, var_lock_t) ++ dontaudit $1 var_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Add and remove entries in the /var/lock +-## directories. ++## Create, read, write, and delete directories ++## in the /var directory. + ## + ## + ## +@@ -5726,60 +6661,35 @@ interface(`files_list_locks',` + ## + ## + # +-interface(`files_rw_lock_dirs',` +- gen_require(` +- type var_t, var_lock_t; +- ') +- +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- rw_dirs_pattern($1, var_t, var_lock_t) +-') +- +-######################################## +-## +-## Create lock directories +-## +-## +-## +-## Domain allowed access +-## +-## +-# +-interface(`files_create_lock_dirs',` ++interface(`files_manage_var_dirs',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- create_dirs_pattern($1, var_lock_t, var_lock_t) ++ allow $1 var_t:dir manage_dir_perms; + ') + + ######################################## + ## +-## Relabel to and from all lock directory types. ++## Read files in the /var directory. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`files_relabel_all_lock_dirs',` ++interface(`files_read_var_files',` + gen_require(` +- attribute lockfile; +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- relabel_dirs_pattern($1, lockfile, lockfile) ++ read_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## Get the attributes of generic lock files. ++## Append files in the /var directory. + ## + ## + ## +@@ -5787,20 +6697,17 @@ interface(`files_relabel_all_lock_dirs',` + ## + ## + # +-interface(`files_getattr_generic_locks',` ++interface(`files_append_var_files',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- allow $1 var_lock_t:dir list_dir_perms; +- getattr_files_pattern($1, var_lock_t, var_lock_t) ++ append_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## Delete generic lock files. ++## Read and write files in the /var directory. + ## + ## + ## +@@ -5808,63 +6715,54 @@ interface(`files_getattr_generic_locks',` + ## + ## + # +-interface(`files_delete_generic_locks',` ++interface(`files_rw_var_files',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- delete_files_pattern($1, var_lock_t, var_lock_t) ++ rw_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## Create, read, write, and delete generic +-## lock files. ++## Do not audit attempts to read and write ++## files in the /var directory. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_generic_locks',` ++interface(`files_dontaudit_rw_var_files',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- manage_dirs_pattern($1, var_lock_t, var_lock_t) +- manage_files_pattern($1, var_lock_t, var_lock_t) ++ dontaudit $1 var_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Delete all lock files. ++## Create, read, write, and delete files in the /var directory. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`files_delete_all_locks',` ++interface(`files_manage_var_files',` + gen_require(` +- attribute lockfile; +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- delete_files_pattern($1, lockfile, lockfile) ++ manage_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## Read all lock files. ++## Read symbolic links in the /var directory. + ## + ## + ## +@@ -5872,22 +6770,18 @@ interface(`files_delete_all_locks',` + ## + ## + # +-interface(`files_read_all_locks',` ++interface(`files_read_var_symlinks',` + gen_require(` +- attribute lockfile; +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- allow $1 { var_t var_lock_t }:dir search_dir_perms; +- allow $1 lockfile:dir list_dir_perms; +- read_files_pattern($1, lockfile, lockfile) +- read_lnk_files_pattern($1, lockfile, lockfile) ++ read_lnk_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## manage all lock files. ++## Create, read, write, and delete symbolic ++## links in the /var directory. + ## + ## + ## +@@ -5895,37 +6789,31 @@ interface(`files_read_all_locks',` + ## + ## + # +-interface(`files_manage_all_locks',` ++interface(`files_manage_var_symlinks',` + gen_require(` +- attribute lockfile; +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- allow $1 { var_t var_lock_t }:dir search_dir_perms; +- manage_dirs_pattern($1, lockfile, lockfile) +- manage_files_pattern($1, lockfile, lockfile) +- manage_lnk_files_pattern($1, lockfile, lockfile) ++ manage_lnk_files_pattern($1, var_t, var_t) + ') + + ######################################## + ## +-## Create an object in the locks directory, with a private +-## type using a type transition. ++## Create objects in the /var directory + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## + ## +-## The type of the object to be created. ++## The type of the object to be created + ## + ## +-## ++## + ## +-## The object class of the object being created. ++## The object class. + ## + ## + ## +@@ -5934,39 +6822,35 @@ interface(`files_manage_all_locks',` + ##
    + ## + # +-interface(`files_lock_filetrans',` ++interface(`files_var_filetrans',` + gen_require(` +- type var_t, var_lock_t; ++ type var_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_lock_t:lnk_file read_lnk_file_perms; +- filetrans_pattern($1, var_lock_t, $2, $3, $4) ++ filetrans_pattern($1, var_t, $2, $3, $4) + ') + ++ + ######################################## + ## +-## Do not audit attempts to get the attributes +-## of the /var/run directory. ++## Relabel dirs in the /var directory. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`files_dontaudit_getattr_pid_dirs',` ++interface(`files_relabel_var_dirs',` + gen_require(` +- type var_run_t; ++ type var_t; + ') +- +- dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; +- dontaudit $1 var_run_t:dir getattr; ++ allow $1 var_t:dir relabel_dir_perms; + ') + + ######################################## + ## +-## Set the attributes of the /var/run directory. ++## Get the attributes of the /var/lib directory. + ## + ## + ## +@@ -5974,59 +6858,69 @@ interface(`files_dontaudit_getattr_pid_dirs',` + ## + ## + # +-interface(`files_setattr_pid_dirs',` ++interface(`files_getattr_var_lib_dirs',` + gen_require(` +- type var_run_t; ++ type var_t, var_lib_t; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- allow $1 var_run_t:dir setattr; ++ getattr_dirs_pattern($1, var_t, var_lib_t) + ') + + ######################################## + ## +-## Search the contents of runtime process +-## ID directories (/var/run). ++## Search the /var/lib directory. + ## ++## ++##

    ++## Search the /var/lib directory. This is ++## necessary to access files or directories under ++## /var/lib that have a private type. For example, a ++## domain accessing a private library file in the ++## /var/lib directory: ++##

    ++##

    ++## allow mydomain_t mylibfile_t:file read_file_perms; ++## files_search_var_lib(mydomain_t) ++##

    ++##
    + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`files_search_pids',` ++interface(`files_search_var_lib',` + gen_require(` +- type var_t, var_run_t; ++ type var_t, var_lib_t; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- search_dirs_pattern($1, var_t, var_run_t) ++ search_dirs_pattern($1, var_t, var_lib_t) + ') + + ######################################## + ## +-## Do not audit attempts to search +-## the /var/run directory. ++## Do not audit attempts to search the ++## contents of /var/lib. + ## + ## + ## + ## Domain to not audit. + ## + ## ++## + # +-interface(`files_dontaudit_search_pids',` ++interface(`files_dontaudit_search_var_lib',` + gen_require(` +- type var_run_t; ++ type var_lib_t; + ') + +- dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; +- dontaudit $1 var_run_t:dir search_dir_perms; ++ dontaudit $1 var_lib_t:dir search_dir_perms; + ') + + ######################################## + ## +-## List the contents of the runtime process +-## ID directories (/var/run). ++## List the contents of the /var/lib directory. + ## + ## + ## +@@ -6034,18 +6928,17 @@ interface(`files_dontaudit_search_pids',` + ## + ## + # +-interface(`files_list_pids',` ++interface(`files_list_var_lib',` + gen_require(` +- type var_t, var_run_t; ++ type var_t, var_lib_t; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- list_dirs_pattern($1, var_t, var_run_t) ++ list_dirs_pattern($1, var_t, var_lib_t) + ') + +-######################################## ++########################################### + ## +-## Read generic process ID files. ++## Read-write /var/lib directories + ## + ## + ## +@@ -6053,19 +6946,17 @@ interface(`files_list_pids',` + ## + ## + # +-interface(`files_read_generic_pids',` ++interface(`files_rw_var_lib_dirs',` + gen_require(` +- type var_t, var_run_t; ++ type var_lib_t; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- list_dirs_pattern($1, var_t, var_run_t) +- read_files_pattern($1, var_run_t, var_run_t) ++ rw_dirs_pattern($1, var_lib_t, var_lib_t) + ') + + ######################################## + ## +-## Write named generic process ID pipes ++## Create directories in /var/lib + ## + ## + ## +@@ -6073,43 +6964,1526 @@ interface(`files_read_generic_pids',` + ## + ## + # +-interface(`files_write_generic_pid_pipes',` ++interface(`files_create_var_lib_dirs',` + gen_require(` +- type var_run_t; ++ type var_lib_t; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- allow $1 var_run_t:fifo_file write; ++ allow $1 var_lib_t:dir { create rw_dir_perms }; + ') + ++ + ######################################## + ## +-## Create an object in the process ID directory, with a private type. ++## Create objects in the /var/lib directory + ## +-## +-##

    +-## Create an object in the process ID directory (e.g., /var/run) +-## with a private type. Typically this is used for creating +-## private PID files in /var/run with the private type instead +-## of the general PID file type. To accomplish this goal, +-## either the program must be SELinux-aware, or use this interface. +-##

    +-##

    +-## Related interfaces: +-##

    +-##
      +-##
    • files_pid_file()
    • +-##
    +-##

    +-## Example usage with a domain that can create and +-## write its PID file with a private PID file type in the +-## /var/run directory: +-##

    +-##

    +-## type mypidfile_t; +-## files_pid_file(mypidfile_t) +-## allow mydomain_t mypidfile_t:file { create_file_perms write_file_perms }; +-## files_pid_filetrans(mydomain_t, mypidfile_t, file) ++## ++##

    ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created ++## ++## ++## ++## ++## The object class. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`files_var_lib_filetrans',` ++ gen_require(` ++ type var_t, var_lib_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ filetrans_pattern($1, var_lib_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Read generic files in /var/lib. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_read_var_lib_files',` ++ gen_require(` ++ type var_t, var_lib_t; ++ ') ++ ++ allow $1 var_lib_t:dir list_dir_perms; ++ read_files_pattern($1, { var_t var_lib_t }, var_lib_t) ++') ++ ++######################################## ++## ++## Read generic symbolic links in /var/lib ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_read_var_lib_symlinks',` ++ gen_require(` ++ type var_t, var_lib_t; ++ ') ++ ++ read_lnk_files_pattern($1, { var_t var_lib_t }, var_lib_t) ++') ++ ++######################################## ++## ++## manage generic symbolic links ++## in the /var/lib directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_var_lib_symlinks',` ++ gen_require(` ++ type var_lib_t; ++ ') ++ ++ manage_lnk_files_pattern($1,var_lib_t,var_lib_t) ++') ++ ++# cjp: the next two interfaces really need to be fixed ++# in some way. They really neeed their own types. ++ ++######################################## ++## ++## Create, read, write, and delete the ++## pseudorandom number generator seed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_urandom_seed',` ++ gen_require(` ++ type var_t, var_lib_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ manage_files_pattern($1, var_lib_t, var_lib_t) ++') ++ ++ ++######################################## ++## ++## Relabel to dirs in the /var/lib directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabelto_var_lib_dirs',` ++ gen_require(` ++ type var_lib_t; ++ ') ++ allow $1 var_lib_t:dir relabelto; ++') ++ ++ ++######################################## ++## ++## Relabel dirs in the /var/lib directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_var_lib_dirs',` ++ gen_require(` ++ type var_lib_t; ++ ') ++ allow $1 var_lib_t:dir relabel_dir_perms; ++') ++ ++######################################## ++## ++## Allow domain to manage mount tables ++## necessary for rpcd, nfsd, etc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_mounttab',` ++ gen_require(` ++ type var_t, var_lib_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ manage_files_pattern($1, var_lib_t, var_lib_t) ++') ++ ++######################################## ++## ++## List generic lock directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_list_locks',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ list_dirs_pattern($1, var_t, var_lock_t) ++') ++ ++######################################## ++## ++## Search the locks directory (/var/lock). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_search_locks',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 var_lock_t:lnk_file read_lnk_file_perms; ++ search_dirs_pattern($1, var_t, var_lock_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to search the ++## locks directory (/var/lock). ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_search_locks',` ++ gen_require(` ++ type var_lock_t; ++ ') ++ ++ dontaudit $1 var_lock_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 var_lock_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read/write inherited ++## locks (/var/lock). ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_rw_inherited_locks',` ++ gen_require(` ++ type var_lock_t; ++ ') ++ ++ dontaudit $1 var_lock_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Set the attributes of the /var/lock directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_setattr_lock_dirs',` ++ gen_require(` ++ type var_lock_t; ++ ') ++ ++ allow $1 var_lock_t:dir setattr; ++') ++ ++######################################## ++## ++## Add and remove entries in the /var/lock ++## directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_rw_lock_dirs',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ rw_dirs_pattern($1, var_t, var_lock_t) ++') ++ ++######################################## ++## ++## Create lock directories ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`files_create_lock_dirs',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_lock_t:lnk_file read_lnk_file_perms; ++ create_dirs_pattern($1, var_lock_t, var_lock_t) ++') ++ ++######################################## ++## ++## Relabel to and from all lock directory types. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_all_lock_dirs',` ++ gen_require(` ++ attribute lockfile; ++ type var_t, var_lock_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_lock_t:lnk_file read_lnk_file_perms; ++ relabel_dirs_pattern($1, lockfile, lockfile) ++') ++ ++######################################## ++## ++## Relabel to and from all lock file types. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_all_lock_files',` ++ gen_require(` ++ attribute lockfile; ++ type var_t, var_lock_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_lock_t:lnk_file read_lnk_file_perms; ++ relabel_files_pattern($1, lockfile, lockfile) ++') ++ ++######################################## ++## ++## Get the attributes of generic lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_getattr_generic_locks',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ allow $1 var_lock_t:dir list_dir_perms; ++ getattr_files_pattern($1, var_lock_t, var_lock_t) ++') ++ ++######################################## ++## ++## Delete generic lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_generic_locks',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ delete_files_pattern($1, var_lock_t, var_lock_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete generic ++## lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_generic_locks',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ manage_files_pattern($1, var_lock_t, var_lock_t) ++') ++ ++######################################## ++## ++## Delete all lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`files_delete_all_locks',` ++ gen_require(` ++ attribute lockfile; ++ type var_t, var_lock_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_lock_t:lnk_file read_lnk_file_perms; ++ delete_files_pattern($1, lockfile, lockfile) ++') ++ ++######################################## ++## ++## Read all lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_read_all_locks',` ++ gen_require(` ++ attribute lockfile; ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ allow $1 lockfile:dir list_dir_perms; ++ read_files_pattern($1, lockfile, lockfile) ++ read_lnk_files_pattern($1, lockfile, lockfile) ++') ++ ++######################################## ++## ++## manage all lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_all_locks',` ++ gen_require(` ++ attribute lockfile; ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ manage_dirs_pattern($1, lockfile, lockfile) ++ manage_files_pattern($1, lockfile, lockfile) ++ manage_lnk_files_pattern($1, lockfile, lockfile) ++') ++ ++######################################## ++## ++## Create an object in the locks directory, with a private ++## type using a type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`files_lock_filetrans',` ++ gen_require(` ++ type var_t, var_lock_t; ++ ') ++ ++ files_search_locks($1) ++ filetrans_pattern($1, var_lock_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of the /var/run directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_getattr_pid_dirs',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 var_run_t:dir getattr; ++') ++ ++######################################## ++## ++## Set the attributes of the /var/run directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_setattr_pid_dirs',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 var_run_t:dir setattr; ++') ++ ++######################################## ++## ++## Search the contents of runtime process ++## ID directories (/var/run). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_search_pids',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ allow $1 var_t:lnk_file read_lnk_file_perms; ++ allow $1 var_run_t:lnk_file read_lnk_file_perms; ++ search_dirs_pattern($1, var_t, var_run_t) ++') ++ ++###################################### ++## ++## Add and remove entries from pid directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_rw_pid_dirs',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ allow $1 var_run_t:dir rw_dir_perms; ++') ++ ++####################################### ++## ++## Create generic pid directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_create_var_run_dirs',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_run_t:dir create_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to search ++## the /var/run directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_search_pids',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 var_run_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to search ++## the all /var/run directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_search_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ dontaudit $1 pidfile:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Allow search the all /var/run directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_search_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:dir search_dir_perms; ++') ++ ++######################################## ++## ++## List the contents of the runtime process ++## ID directories (/var/run). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_list_pids',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, var_t, var_run_t) ++') ++ ++######################################## ++## ++## Read generic process ID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_read_generic_pids',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, var_t, var_run_t) ++ read_files_pattern($1, var_run_t, var_run_t) ++') ++ ++######################################## ++## ++## Write named generic process ID pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_write_generic_pid_pipes',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 var_run_t:fifo_file write; ++') ++ ++######################################## ++## ++## Create an object in the process ID directory, with a private type. ++## ++## ++##

    ++## Create an object in the process ID directory (e.g., /var/run) ++## with a private type. Typically this is used for creating ++## private PID files in /var/run with the private type instead ++## of the general PID file type. To accomplish this goal, ++## either the program must be SELinux-aware, or use this interface. ++##

    ++##

    ++## Related interfaces: ++##

    ++##
      ++##
    • files_pid_file()
    • ++##
    ++##

    ++## Example usage with a domain that can create and ++## write its PID file with a private PID file type in the ++## /var/run directory: ++##

    ++##

    ++## type mypidfile_t; ++## files_pid_file(mypidfile_t) ++## allow mydomain_t mypidfile_t:file { create_file_perms write_file_perms }; ++## files_pid_filetrans(mydomain_t, mypidfile_t, file) ++##

    ++##
    ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++## ++# ++interface(`files_pid_filetrans',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ filetrans_pattern($1, var_run_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Create a generic lock directory within the run directories ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`files_pid_filetrans_lock_dir',` ++ gen_require(` ++ type var_lock_t; ++ ') ++ ++ files_pid_filetrans($1, var_lock_t, dir, $2) ++') ++ ++######################################## ++## ++## rw generic pid files inherited from another process ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_rw_inherited_generic_pid_files',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ allow $1 var_run_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read and write generic process ID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_rw_generic_pids',` ++ gen_require(` ++ type var_t, var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, var_t, var_run_t) ++ rw_files_pattern($1, var_run_t, var_run_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes of ++## daemon runtime data files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_getattr_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ type var_run_t; ++ ') ++ ++ dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 pidfile:file getattr; ++') ++ ++######################################## ++## ++## Do not audit attempts to write to daemon runtime data files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_write_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 pidfile:file write; ++') ++ ++######################################## ++## ++## Do not audit attempts to ioctl daemon runtime data files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_ioctl_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ type var_run_t; ++ ') ++ ++ dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 pidfile:file ioctl; ++') ++ ++######################################## ++## ++## Relable all pid directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_all_pid_dirs',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ relabel_dirs_pattern($1, pidfile, pidfile) ++') ++ ++######################################## ++## ++## Delete all pid sockets ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_all_pid_sockets',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:sock_file delete_sock_file_perms; ++') ++ ++######################################## ++## ++## Create all pid sockets ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_create_all_pid_sockets',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:sock_file create_sock_file_perms; ++') ++ ++######################################## ++## ++## Create all pid named pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_create_all_pid_pipes',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:fifo_file create_fifo_file_perms; ++') ++ ++######################################## ++## ++## Delete all pid named pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_all_pid_pipes',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:fifo_file delete_fifo_file_perms; ++') ++ ++######################################## ++## ++## manage all pidfile directories ++## in the /var/run directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_all_pid_dirs',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ manage_dirs_pattern($1,pidfile,pidfile) ++') ++ ++ ++######################################## ++## ++## Read all process ID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`files_read_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ type var_t; ++ ') ++ ++ list_dirs_pattern($1, var_t, pidfile) ++ read_files_pattern($1, pidfile, pidfile) ++ read_lnk_files_pattern($1, pidfile, pidfile) ++') ++ ++######################################## ++## ++## Relable all pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_relabel_all_pid_files',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ relabel_files_pattern($1, pidfile, pidfile) ++') ++ ++######################################## ++## ++## Execute generic programs in /var/run in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_exec_generic_pid_files',` ++ gen_require(` ++ type var_run_t; ++ ') ++ ++ exec_files_pattern($1, var_run_t, var_run_t) ++') ++ ++######################################## ++## ++## Write all sockets ++## in the /var/run directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_write_all_pid_sockets',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ allow $1 pidfile:sock_file write_sock_file_perms; ++') ++ ++######################################## ++## ++## manage all pidfiles ++## in the /var/run directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ ') ++ ++ manage_files_pattern($1,pidfile,pidfile) ++') ++ ++######################################## ++## ++## Mount filesystems on all polyinstantiation ++## member directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_mounton_all_poly_members',` ++ gen_require(` ++ attribute polymember; ++ ') ++ ++ allow $1 polymember:dir mounton; ++') ++ ++######################################## ++## ++## Delete all process IDs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`files_delete_all_pids',` ++ gen_require(` ++ attribute pidfile; ++ type var_t, var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 var_t:dir search_dir_perms; ++ allow $1 var_run_t:dir rmdir; ++ allow $1 var_run_t:lnk_file delete_lnk_file_perms; ++ delete_files_pattern($1, pidfile, pidfile) ++ delete_fifo_files_pattern($1, pidfile, pidfile) ++ delete_sock_files_pattern($1, pidfile, { pidfile var_run_t }) ++') ++ ++######################################## ++## ++## Delete all process ID directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_all_pid_dirs',` ++ gen_require(` ++ attribute pidfile; ++ type var_t, var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 var_t:dir search_dir_perms; ++ delete_dirs_pattern($1, pidfile, pidfile) ++') ++ ++######################################## ++## ++## Make the specified type a file ++## used for spool files. ++## ++## ++##

    ++## Make the specified type usable for spool files. ++## This will also make the type usable for files, making ++## calls to files_type() redundant. Failure to use this interface ++## for a spool file may result in problems with ++## purging spool files. ++##

    ++##

    ++## Related interfaces: ++##

    ++##
      ++##
    • files_spool_filetrans()
    • ++##
    ++##

    ++## Example usage with a domain that can create and ++## write its spool file in the system spool file ++## directories (/var/spool): ++##

    ++##

    ++## type myspoolfile_t; ++## files_spool_file(myfile_spool_t) ++## allow mydomain_t myfile_spool_t:file { create_file_perms write_file_perms }; ++## files_spool_filetrans(mydomain_t, myfile_spool_t, file) ++##

    ++##
    ++## ++## ++## Type of the file to be used as a ++## spool file. ++## ++## ++## ++# ++interface(`files_spool_file',` ++ gen_require(` ++ attribute spoolfile; ++ ') ++ ++ files_type($1) ++ typeattribute $1 spoolfile; ++') ++ ++######################################## ++## ++## Create all spool sockets ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_create_all_spool_sockets',` ++ gen_require(` ++ attribute spoolfile; ++ ') ++ ++ allow $1 spoolfile:sock_file create_sock_file_perms; ++') ++ ++######################################## ++## ++## Delete all spool sockets ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_delete_all_spool_sockets',` ++ gen_require(` ++ attribute spoolfile; ++ ') ++ ++ allow $1 spoolfile:sock_file delete_sock_file_perms; ++') ++ ++######################################## ++## ++## Relabel to and from all spool ++## directory types. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`files_relabel_all_spool_dirs',` ++ gen_require(` ++ attribute spoolfile; ++ type var_t; ++ ') ++ ++ relabel_dirs_pattern($1, spoolfile, spoolfile) ++') ++ ++######################################## ++## ++## Search the contents of generic spool ++## directories (/var/spool). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_search_spool',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ search_dirs_pattern($1, var_t, var_spool_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to search generic ++## spool directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`files_dontaudit_search_spool',` ++ gen_require(` ++ type var_spool_t; ++ ') ++ ++ dontaudit $1 var_spool_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## List the contents of generic spool ++## (/var/spool) directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_list_spool',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ list_dirs_pattern($1, var_t, var_spool_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete generic ++## spool directories (/var/spool). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_generic_spool_dirs',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ manage_dirs_pattern($1, var_spool_t, var_spool_t) ++') ++ ++######################################## ++## ++## Read generic spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_read_generic_spool',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ list_dirs_pattern($1, var_t, var_spool_t) ++ read_files_pattern($1, var_spool_t, var_spool_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete generic ++## spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_manage_generic_spool',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ manage_files_pattern($1, var_spool_t, var_spool_t) ++') ++ ++######################################## ++## ++## Create objects in the spool directory ++## with a private type with a type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Type to which the created node will be transitioned. ++## ++## ++## ++## ++## Object class(es) (single or set including {}) for which this ++## the transition will occur. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`files_spool_filetrans',` ++ gen_require(` ++ type var_t, var_spool_t; ++ ') ++ ++ allow $1 var_t:dir search_dir_perms; ++ filetrans_pattern($1, var_spool_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Allow access to manage all polyinstantiated ++## directories on the system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_polyinstantiate_all',` ++ gen_require(` ++ attribute polydir, polymember, polyparent; ++ type poly_t; ++ ') ++ ++ # Need to give access to /selinux/member ++ selinux_compute_member($1) ++ ++ # Need sys_admin capability for mounting ++ allow $1 self:capability { chown fsetid sys_admin fowner }; ++ ++ # Need to give access to the directories to be polyinstantiated ++ allow $1 polydir:dir { create open getattr search write add_name setattr mounton rmdir }; ++ ++ # Need to give access to the polyinstantiated subdirectories ++ allow $1 polymember:dir search_dir_perms; ++ ++ # Need to give access to parent directories where original ++ # is remounted for polyinstantiation aware programs (like gdm) ++ allow $1 polyparent:dir { getattr mounton }; ++ ++ # Need to give permission to create directories where applicable ++ allow $1 self:process setfscreate; ++ allow $1 polymember: dir { create setattr relabelto }; ++ allow $1 polydir: dir { write add_name open }; ++ allow $1 polyparent:dir { open read write remove_name add_name relabelfrom relabelto }; ++ ++ # Default type for mountpoints ++ allow $1 poly_t:dir { create mounton }; ++ fs_unmount_xattr_fs($1) ++ ++ fs_mount_tmpfs($1) ++ fs_unmount_tmpfs($1) ++ ++ ifdef(`distro_redhat',` ++ # namespace.init ++ files_search_tmp($1) ++ files_search_home($1) ++ corecmd_exec_bin($1) ++ seutil_domtrans_setfiles($1) ++ ') ++') ++ ++######################################## ++## ++## Unconfined access to files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`files_unconfined',` ++ gen_require(` ++ attribute files_unconfined_type; ++ ') ++ ++ typeattribute $1 files_unconfined_type; ++') ++ ++######################################## ++## ++## Create a core files in / ++## ++## ++##

    ++## Create a core file in /, + ##

    + ##
    + ## +@@ -6117,80 +8491,157 @@ interface(`files_write_generic_pid_pipes',` + ## Domain allowed access. + ##
    + ## +-## ++## ++# ++interface(`files_manage_root_files',` ++ gen_require(` ++ type root_t; ++ ') ++ ++ manage_files_pattern($1, root_t, root_t) ++') ++ ++######################################## ++## ++## Create a default directory ++## ++## ++##

    ++## Create a default_t direcrory ++##

    ++##
    ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`files_create_default_dir',` ++ gen_require(` ++ type default_t; ++ ') ++ ++ allow $1 default_t:dir create; ++') ++ ++######################################## ++## ++## Create, default_t objects with an automatic ++## type transition. ++## ++## + ## +-## The type of the object to be created. ++## Domain allowed access. + ## + ## + ## + ## +-## The object class of the object being created. ++## The class of the object being created. ++## ++## ++# ++interface(`files_root_filetrans_default',` ++ gen_require(` ++ type root_t, default_t; ++ ') ++ ++ filetrans_pattern($1, root_t, default_t, $2) ++') ++ ++######################################## ++## ++## Create, lib_t objects with an automatic ++## type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Type of the directory to be transitioned from ++## ++## ++## ++## ++## The class of the object being created. + ## + ## + ## + ## +-## The name of the object being created. ++## The name of the object being created. ++## ++## ++# ++interface(`files_filetrans_lib',` ++ gen_require(` ++ type lib_t, lib_t; ++ ') ++ ++ filetrans_pattern($1, $2, lib_t, $3, $4) ++') ++ ++######################################## ++## ++## manage generic symbolic links ++## in the /var/run directory. ++## ++## ++## ++## Domain allowed access. + ## + ## +-## + # +-interface(`files_pid_filetrans',` ++interface(`files_manage_generic_pids_symlinks',` + gen_require(` +- type var_t, var_run_t; ++ type var_run_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- filetrans_pattern($1, var_run_t, $2, $3, $4) ++ manage_lnk_files_pattern($1,var_run_t,var_run_t) + ') + + ######################################## + ## +-## Create a generic lock directory within the run directories ++## Do not audit attempts to getattr ++## all tmpfs files. + ## + ## +-## +-## Domain allowed access +-## +-## +-## + ## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`files_pid_filetrans_lock_dir',` ++interface(`files_dontaudit_getattr_tmpfs_files',` + gen_require(` +- type var_lock_t; ++ attribute tmpfsfile; + ') + +- files_pid_filetrans($1, var_lock_t, dir, $2) ++ allow $1 tmpfsfile:file getattr; + ') + + ######################################## + ## +-## Read and write generic process ID files. ++## Allow delete all tmpfs files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_rw_generic_pids',` ++interface(`files_delete_tmpfs_files',` + gen_require(` +- type var_t, var_run_t; ++ attribute tmpfsfile; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- list_dirs_pattern($1, var_t, var_run_t) +- rw_files_pattern($1, var_run_t, var_run_t) ++ allow $1 tmpfsfile:file delete_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes of +-## daemon runtime data files. ++## Allow read write all tmpfs files + ## + ## + ## +@@ -6198,19 +8649,17 @@ interface(`files_rw_generic_pids',` + ## + ## + # +-interface(`files_dontaudit_getattr_all_pids',` ++interface(`files_rw_tmpfs_files',` + gen_require(` +- attribute pidfile; +- type var_run_t; ++ attribute tmpfsfile; + ') + +- dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; +- dontaudit $1 pidfile:file getattr; ++ allow $1 tmpfsfile:file { read write }; + ') + + ######################################## + ## +-## Do not audit attempts to write to daemon runtime data files. ++## Do not audit attempts to read security files + ## + ## + ## +@@ -6218,18 +8667,17 @@ interface(`files_dontaudit_getattr_all_pids',` + ## + ## + # +-interface(`files_dontaudit_write_all_pids',` ++interface(`files_dontaudit_read_security_files',` + gen_require(` +- attribute pidfile; ++ attribute security_file_type; + ') + +- dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; +- dontaudit $1 pidfile:file write; ++ dontaudit $1 security_file_type:file read_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to ioctl daemon runtime data files. ++## Do not audit attempts to search security files + ## + ## + ## +@@ -6237,129 +8685,118 @@ interface(`files_dontaudit_write_all_pids',` + ## + ## + # +-interface(`files_dontaudit_ioctl_all_pids',` ++interface(`files_dontaudit_search_security_files',` + gen_require(` +- attribute pidfile; +- type var_run_t; ++ attribute security_file_type; + ') + +- dontaudit $1 var_run_t:lnk_file read_lnk_file_perms; +- dontaudit $1 pidfile:file ioctl; ++ dontaudit $1 security_file_type:dir search_dir_perms; + ') + + ######################################## + ## +-## Read all process ID files. ++## Do not audit attempts to read security dirs + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## +-## + # +-interface(`files_read_all_pids',` ++interface(`files_dontaudit_list_security_dirs',` + gen_require(` +- attribute pidfile; +- type var_t, var_run_t; ++ attribute security_file_type; + ') + +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- list_dirs_pattern($1, var_t, pidfile) +- read_files_pattern($1, pidfile, pidfile) ++ dontaudit $1 security_file_type:dir list_dir_perms; + ') + + ######################################## + ## +-## Delete all process IDs. ++## rw any files inherited from another process + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## ++## ++## Object type. ++## ++## + # +-interface(`files_delete_all_pids',` ++interface(`files_rw_all_inherited_files',` + gen_require(` +- attribute pidfile; +- type var_t, var_run_t; ++ attribute file_type; + ') + +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- allow $1 var_run_t:dir rmdir; +- allow $1 var_run_t:lnk_file delete_lnk_file_perms; +- delete_files_pattern($1, pidfile, pidfile) +- delete_fifo_files_pattern($1, pidfile, pidfile) +- delete_sock_files_pattern($1, pidfile, { pidfile var_run_t }) ++ allow $1 { file_type $2 }:file rw_inherited_file_perms; ++ allow $1 { file_type $2 }:fifo_file rw_inherited_fifo_file_perms; ++ allow $1 { file_type $2 }:sock_file rw_inherited_sock_file_perms; ++ allow $1 { file_type $2 }:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## + ## +-## Delete all process ID directories. ++## Allow any file point to be the entrypoint of this domain + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`files_delete_all_pid_dirs',` ++interface(`files_entrypoint_all_files',` + gen_require(` +- attribute pidfile; +- type var_t, var_run_t; ++ attribute file_type; + ') +- +- allow $1 var_t:dir search_dir_perms; +- allow $1 var_run_t:lnk_file read_lnk_file_perms; +- delete_dirs_pattern($1, pidfile, pidfile) ++ allow $1 file_type:file entrypoint; + ') + + ######################################## + ## +-## Create, read, write and delete all +-## var_run (pid) content ++## Do not audit attempts to rw inherited file perms ++## of non security files. + ## + ## + ## +-## Domain alloed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_all_pids',` ++interface(`files_dontaudit_all_non_security_leaks',` + gen_require(` +- attribute pidfile; ++ attribute non_security_file_type; + ') + +- manage_dirs_pattern($1, pidfile, pidfile) +- manage_files_pattern($1, pidfile, pidfile) +- manage_lnk_files_pattern($1, pidfile, pidfile) ++ dontaudit $1 non_security_file_type:file_class_set rw_inherited_file_perms; + ') + + ######################################## + ## +-## Mount filesystems on all polyinstantiation +-## member directories. ++## Do not audit attempts to read or write ++## all leaked files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_mounton_all_poly_members',` ++interface(`files_dontaudit_leaks',` + gen_require(` +- attribute polymember; ++ attribute file_type; + ') + +- allow $1 polymember:dir mounton; ++ dontaudit $1 file_type:file rw_inherited_file_perms; ++ dontaudit $1 file_type:lnk_file { read }; + ') + + ######################################## + ## +-## Search the contents of generic spool +-## directories (/var/spool). ++## Allow domain to create_file_ass all types + ## + ## + ## +@@ -6367,18 +8804,19 @@ interface(`files_mounton_all_poly_members',` + ## + ## + # +-interface(`files_search_spool',` ++interface(`files_create_as_is_all_files',` + gen_require(` +- type var_t, var_spool_t; ++ attribute file_type; ++ class kernel_service create_files_as; + ') + +- search_dirs_pattern($1, var_t, var_spool_t) ++ allow $1 file_type:kernel_service create_files_as; + ') + + ######################################## + ## +-## Do not audit attempts to search generic +-## spool directories. ++## Do not audit attempts to check the ++## access on all files + ## + ## + ## +@@ -6386,132 +8824,227 @@ interface(`files_search_spool',` + ## + ## + # +-interface(`files_dontaudit_search_spool',` ++interface(`files_dontaudit_all_access_check',` + gen_require(` +- type var_spool_t; ++ attribute file_type; + ') + +- dontaudit $1 var_spool_t:dir search_dir_perms; ++ dontaudit $1 file_type:dir_file_class_set audit_access; + ') + + ######################################## + ## +-## List the contents of generic spool +-## (/var/spool) directories. ++## Do not audit attempts to write to all files + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_list_spool',` ++interface(`files_dontaudit_write_all_files',` + gen_require(` +- type var_t, var_spool_t; ++ attribute file_type; + ') + +- list_dirs_pattern($1, var_t, var_spool_t) ++ dontaudit $1 file_type:dir_file_class_set write; + ') + + ######################################## + ## +-## Create, read, write, and delete generic +-## spool directories (/var/spool). ++## Allow domain to delete to all files + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_manage_generic_spool_dirs',` ++interface(`files_delete_all_non_security_files',` + gen_require(` +- type var_t, var_spool_t; ++ attribute non_security_file_type; + ') + +- allow $1 var_t:dir search_dir_perms; +- manage_dirs_pattern($1, var_spool_t, var_spool_t) ++ allow $1 non_security_file_type:dir del_entry_dir_perms; ++ allow $1 non_security_file_type:file_class_set delete_file_perms; + ') + + ######################################## + ## +-## Read generic spool files. ++## Allow domain to delete to all dirs + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`files_read_generic_spool',` ++interface(`files_delete_all_non_security_dirs',` + gen_require(` +- type var_t, var_spool_t; ++ attribute non_security_file_type; + ') + +- list_dirs_pattern($1, var_t, var_spool_t) +- read_files_pattern($1, var_spool_t, var_spool_t) ++ allow $1 non_security_file_type:dir { del_entry_dir_perms delete_dir_perms }; + ') + + ######################################## + ## +-## Create, read, write, and delete generic +-## spool files. ++## Transition named content in the var_run_t directory + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`files_manage_generic_spool',` ++interface(`files_filetrans_named_content',` + gen_require(` +- type var_t, var_spool_t; ++ type etc_t; ++ type mnt_t; ++ type usr_t; ++ type tmp_t; ++ type var_t; ++ type var_run_t; ++ type var_lock_t; ++ type tmp_t; + ') + +- allow $1 var_t:dir search_dir_perms; +- manage_files_pattern($1, var_spool_t, var_spool_t) ++ files_pid_filetrans($1, mnt_t, dir, "media") ++ files_root_filetrans($1, etc_runtime_t, file, ".readahead") ++ files_root_filetrans($1, etc_runtime_t, file, ".autorelabel") ++ files_root_filetrans($1, mnt_t, dir, "afs") ++ files_root_filetrans($1, mnt_t, dir, "misc") ++ files_root_filetrans($1, mnt_t, dir, "net") ++ files_root_filetrans($1, usr_t, dir, "export") ++ files_root_filetrans($1, usr_t, dir, "opt") ++ files_root_filetrans($1, usr_t, dir, "ostree") ++ files_root_filetrans($1, usr_t, dir, "emul") ++ files_root_filetrans($1, var_t, dir, "srv") ++ files_root_filetrans($1, var_run_t, dir, "run") ++ files_root_filetrans($1, var_run_t, lnk_file, "run") ++ files_root_filetrans($1, var_lock_t, lnk_file, "lock") ++ files_root_filetrans($1, tmp_t, dir, "sandbox") ++ files_root_filetrans($1, tmp_t, dir, "tmp") ++ files_root_filetrans($1, var_t, dir, "nsr") ++ files_etc_filetrans($1, etc_t, file, "system-auth-ac") ++ files_etc_filetrans($1, etc_t, file, "postlogin-ac") ++ files_etc_filetrans($1, etc_t, file, "password-auth-ac") ++ files_etc_filetrans($1, etc_t, file, "fingerprint-auth-ac") ++ files_etc_filetrans($1, etc_t, file, "smartcard-auth-ac") ++ files_etc_filetrans($1, etc_t, file, "hwdb.bin") ++ files_etc_filetrans_etc_runtime($1, file, ".updated") ++ files_etc_filetrans_etc_runtime($1, file, "runtime") ++ files_etc_filetrans_etc_runtime($1, dir, "blkid") ++ files_etc_filetrans_etc_runtime($1, dir, "cmtab") ++ files_etc_filetrans_etc_runtime($1, file, "fstab.REVOKE") ++ files_etc_filetrans_etc_runtime($1, file, "ioctl.save") ++ files_etc_filetrans_etc_runtime($1, file, "nologin") ++ files_etc_filetrans_etc_runtime($1, file, "securetty") ++ files_etc_filetrans_etc_runtime($1, file, "ifstate") ++ files_etc_filetrans_etc_runtime($1, file, "ptal-printd-like") ++ files_etc_filetrans_etc_runtime($1, file, "hwconf") ++ files_etc_filetrans_etc_runtime($1, file, "iptables.save") ++ files_tmp_filetrans($1, tmp_t, dir, "tmp-inst") ++ files_var_filetrans($1, tmp_t, dir, "tmp") ++ files_var_filetrans($1, var_run_t, dir, "run") ++ files_var_filetrans($1, etc_runtime_t, file, ".updated") + ') + + ######################################## + ## +-## Create objects in the spool directory +-## with a private type with a type transition. ++## Make the specified type a ++## base file. + ## +-## ++## ++##

    ++## Identify file type as base file type. Tools will use this attribute, ++## to help users diagnose problems. ++##

    ++##
    ++## + ## +-## Domain allowed access. ++## Type to be used as a base files. + ## + ## +-## ++## ++# ++interface(`files_base_file',` ++ gen_require(` ++ attribute base_file_type; ++ ') ++ files_type($1) ++ typeattribute $1 base_file_type; ++') ++ ++######################################## ++## ++## Make the specified type a ++## base read only file. ++## ++## ++##

    ++## Make the specified type readable for all domains. ++##

    ++##
    ++## + ## +-## Type to which the created node will be transitioned. ++## Type to be used as a base read only files. + ## + ## +-## ++## ++# ++interface(`files_ro_base_file',` ++ gen_require(` ++ attribute base_ro_file_type; ++ ') ++ files_base_file($1) ++ typeattribute $1 base_ro_file_type; ++') ++ ++######################################## ++## ++## Read all ro base files. ++## ++## + ## +-## Object class(es) (single or set including {}) for which this +-## the transition will occur. ++## Domain allowed access. + ## + ## +-## ++## ++# ++interface(`files_read_all_base_ro_files',` ++ gen_require(` ++ attribute base_ro_file_type; ++ ') ++ ++ list_dirs_pattern($1, base_ro_file_type, base_ro_file_type) ++ read_files_pattern($1, base_ro_file_type, base_ro_file_type) ++ read_lnk_files_pattern($1, base_ro_file_type, base_ro_file_type) ++') ++ ++######################################## ++## ++## Execute all base ro files. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## ++## + # +-interface(`files_spool_filetrans',` ++interface(`files_exec_all_base_ro_files',` + gen_require(` +- type var_t, var_spool_t; ++ attribute base_ro_file_type; + ') + +- allow $1 var_t:dir search_dir_perms; +- filetrans_pattern($1, var_spool_t, $2, $3, $4) ++ can_exec($1, base_ro_file_type) + ') + + ######################################## + ## +-## Allow access to manage all polyinstantiated +-## directories on the system. ++## Allow the specified domain to modify the systemd configuration of ++## any file. + ## + ## + ## +@@ -6519,53 +9052,17 @@ interface(`files_spool_filetrans',` + ## + ## + # +-interface(`files_polyinstantiate_all',` ++interface(`files_config_all_files',` + gen_require(` +- attribute polydir, polymember, polyparent; +- type poly_t; ++ attribute file_type; + ') + +- # Need to give access to /selinux/member +- selinux_compute_member($1) +- +- # Need sys_admin capability for mounting +- allow $1 self:capability { chown fsetid sys_admin fowner }; +- +- # Need to give access to the directories to be polyinstantiated +- allow $1 polydir:dir { create open getattr search write add_name setattr mounton rmdir }; +- +- # Need to give access to the polyinstantiated subdirectories +- allow $1 polymember:dir search_dir_perms; +- +- # Need to give access to parent directories where original +- # is remounted for polyinstantiation aware programs (like gdm) +- allow $1 polyparent:dir { getattr mounton }; +- +- # Need to give permission to create directories where applicable +- allow $1 self:process setfscreate; +- allow $1 polymember: dir { create setattr relabelto }; +- allow $1 polydir: dir { write add_name open }; +- allow $1 polyparent:dir { open read write remove_name add_name relabelfrom relabelto }; +- +- # Default type for mountpoints +- allow $1 poly_t:dir { create mounton }; +- fs_unmount_xattr_fs($1) +- +- fs_mount_tmpfs($1) +- fs_unmount_tmpfs($1) +- +- ifdef(`distro_redhat',` +- # namespace.init +- files_search_tmp($1) +- files_search_home($1) +- corecmd_exec_bin($1) +- seutil_domtrans_setfiles($1) +- ') ++ allow $1 file_type:service all_service_perms; + ') + + ######################################## + ## +-## Unconfined access to files. ++## Get the status of etc_t files + ## + ## + ## +@@ -6573,10 +9070,10 @@ interface(`files_polyinstantiate_all',` + ## + ## + # +-interface(`files_unconfined',` ++interface(`files_status_etc',` + gen_require(` +- attribute files_unconfined_type; ++ type etc_t; + ') + +- typeattribute $1 files_unconfined_type; ++ allow $1 etc_t:service status; + ') +diff --git a/policy/modules/kernel/files.te b/policy/modules/kernel/files.te +index 1a03abdd77..3221f80183 100644 +--- a/policy/modules/kernel/files.te ++++ b/policy/modules/kernel/files.te +@@ -5,12 +5,16 @@ policy_module(files, 1.18.1) + # Declarations + # + ++attribute base_file_type; ++attribute base_ro_file_type; + attribute file_type; + attribute files_unconfined_type; + attribute lockfile; + attribute mountpoint; + attribute pidfile; ++attribute spoolfile; + attribute configfile; ++attribute etcfile; + + # For labeling types that are to be polyinstantiated + attribute polydir; +@@ -48,47 +52,53 @@ attribute usercanread; + # + type boot_t; + files_mountpoint(boot_t) ++files_ro_base_file(boot_t) + + # default_t is the default type for files that do not + # match any specification in the file_contexts configuration + # other than the generic /.* specification. + type default_t; + files_mountpoint(default_t) ++files_base_file(default_t) + + # + # etc_t is the type of the system etc directories. + # + type etc_t, configfile; +-files_type(etc_t) ++files_ro_base_file(etc_t) ++ + # compatibility aliases for removed types: + typealias etc_t alias automount_etc_t; + typealias etc_t alias snmpd_etc_t; + ++# system_conf_t is a new type of various ++# files in /etc/ that can be managed and ++# created by several domains. ++# ++type system_conf_t, configfile; ++files_ro_base_file(system_conf_t) ++# compatibility aliases for removed type: ++typealias system_conf_t alias iptables_conf_t; ++ ++# system_db_t is a new type of various ++# db files. ++type system_db_t; ++files_ro_base_file(system_db_t) ++ + # + # etc_runtime_t is the type of various + # files in /etc that are automatically + # generated during initialization. + # +-type etc_runtime_t; +-files_type(etc_runtime_t) +-#Temporarily in policy until FC5 dissappears +-typealias etc_runtime_t alias firstboot_rw_t; +- +-# +-# file_t is the default type of a file that has not yet been +-# assigned an extended attribute (EA) value (when using a filesystem +-# that supports EAs). +-# +-type file_t; +-files_mountpoint(file_t) +-kernel_rootfs_mountpoint(file_t) +-sid file gen_context(system_u:object_r:file_t,s0) ++type etc_runtime_t, configfile; ++files_ro_base_file(etc_runtime_t) + + # + # home_root_t is the type for the directory where user home directories + # are created + # + type home_root_t; ++files_base_file(home_root_t) + files_mountpoint(home_root_t) + files_poly_parent(home_root_t) + +@@ -96,12 +106,13 @@ files_poly_parent(home_root_t) + # lost_found_t is the type for the lost+found directories. + # + type lost_found_t; +-files_type(lost_found_t) ++files_base_file(lost_found_t) + + # + # mnt_t is the type for mount points such as /mnt/cdrom + # + type mnt_t; ++files_base_file(mnt_t) + files_mountpoint(mnt_t) + + # +@@ -123,6 +134,7 @@ files_type(readable_t) + # root_t is the type for rootfs and the root directory. + # + type root_t; ++files_base_file(root_t) + files_mountpoint(root_t) + files_poly_parent(root_t) + kernel_rootfs_mountpoint(root_t) +@@ -133,45 +145,54 @@ genfscon rootfs / gen_context(system_u:object_r:root_t,s0) + # + type src_t; + files_mountpoint(src_t) ++files_ro_base_file(src_t) + + # + # system_map_t is for the system.map files in /boot + # + type system_map_t; + files_type(system_map_t) ++kernel_proc_type(system_map_t) + genfscon proc /kallsyms gen_context(system_u:object_r:system_map_t,s0) + + # + # tmp_t is the type of the temporary directories + # + type tmp_t; ++files_base_file(tmp_t) + files_tmp_file(tmp_t) + files_mountpoint(tmp_t) + files_poly(tmp_t) + files_poly_parent(tmp_t) ++typealias tmp_t alias firstboot_tmp_t; + + # + # usr_t is the type for /usr. + # + type usr_t; ++files_ro_base_file(usr_t) + files_mountpoint(usr_t) + + # + # var_t is the type of /var + # + type var_t; ++files_base_file(var_t) + files_mountpoint(var_t) + + # + # var_lib_t is the type of /var/lib + # + type var_lib_t; ++files_base_file(var_lib_t) + files_mountpoint(var_lib_t) ++files_poly(var_lib_t) + + # + # var_lock_t is tye type of /var/lock + # + type var_lock_t; ++files_base_file(var_lock_t) + files_lock_file(var_lock_t) + files_mountpoint(var_lock_t) + +@@ -180,6 +201,7 @@ files_mountpoint(var_lock_t) + # used for pid and other runtime files. + # + type var_run_t; ++files_base_file(var_run_t) + files_pid_file(var_run_t) + files_mountpoint(var_run_t) + +@@ -187,7 +209,9 @@ files_mountpoint(var_run_t) + # var_spool_t is the type of /var/spool + # + type var_spool_t; ++files_base_file(var_spool_t) + files_tmp_file(var_spool_t) ++files_spool_file(var_spool_t) + + ######################################## + # +@@ -224,12 +248,13 @@ fs_associate_tmpfs(tmpfsfile) + # + + # Create/access any file in a labeled filesystem; +-allow files_unconfined_type file_type:{ file chr_file } ~execmod; ++allow files_unconfined_type file_type:{ file chr_file } ~{ execmod entrypoint }; + allow files_unconfined_type file_type:{ dir lnk_file sock_file fifo_file blk_file } *; ++allow files_unconfined_type file_type:service *; + + # Mount/unmount any filesystem with the context= option. +-allow files_unconfined_type file_type:filesystem *; ++allow files_unconfined_type file_type:filesystem all_filesystem_perms; + +-tunable_policy(`allow_execmod',` ++tunable_policy(`selinuxuser_execmod',` + allow files_unconfined_type file_type:file execmod; + ') +diff --git a/policy/modules/kernel/filesystem.fc b/policy/modules/kernel/filesystem.fc +index d7c11a0b33..ea3ed81741 100644 +--- a/policy/modules/kernel/filesystem.fc ++++ b/policy/modules/kernel/filesystem.fc +@@ -1,15 +1,26 @@ +-/cgroup -d gen_context(system_u:object_r:cgroup_t,s0) +-/cgroup/.* <> ++# ecryptfs does not support xattr ++HOME_DIR/\.ecryptfs(/.*)? gen_context(system_u:object_r:ecryptfs_t,s0) ++HOME_DIR/\.Private(/.*)? gen_context(system_u:object_r:ecryptfs_t,s0) + + /dev/hugepages -d gen_context(system_u:object_r:hugetlbfs_t,s0) + /dev/hugepages(/.*)? <> +-/dev/shm -d gen_context(system_u:object_r:tmpfs_t,s0) +-/dev/shm/.* <> + +-/lib/udev/devices/hugepages -d gen_context(system_u:object_r:hugetlbfs_t,s0) +-/lib/udev/devices/hugepages/.* <> +-/lib/udev/devices/shm -d gen_context(system_u:object_r:tmpfs_t,s0) +-/lib/udev/devices/shm/.* <> ++/dev/shm -d gen_context(system_u:object_r:tmpfs_t,s0-mls_systemhigh) ++/dev/shm/.* <> ++ ++/dev/oracleasm(/.*)? gen_context(system_u:object_r:oracleasmfs_t,s0) ++ ++/usr/lib/udev/devices/hugepages -d gen_context(system_u:object_r:hugetlbfs_t,s0) ++/usr/lib/udev/devices/hugepages/.* <> ++/usr/lib/udev/devices/shm -d gen_context(system_u:object_r:tmpfs_t,s0) ++/usr/lib/udev/devices/shm/.* <> ++/var/run/user/[^/]*/gvfs -d gen_context(system_u:object_r:fusefs_t,s0) ++/var/run/user/[^/]*/gvfs/.* <> ++ ++# for systemd systems: ++# ++/sys/fs/bpf -d gen_context(system_u:object_r:bpf_t,s0) ++/sys/fs/bpf/.* <> + + /sys/fs/cgroup -d gen_context(system_u:object_r:cgroup_t,s0) + /sys/fs/cgroup/.* <> +@@ -17,7 +28,5 @@ + /sys/fs/pstore -d gen_context(system_u:object_r:pstore_t,s0) + /sys/fs/pstore/.* <> + +-ifdef(`distro_debian',` + /var/run/shm -d gen_context(system_u:object_r:tmpfs_t,s0) + /var/run/shm/.* <> +-') +diff --git a/policy/modules/kernel/filesystem.if b/policy/modules/kernel/filesystem.if +index 8416beb439..42af62e855 100644 +--- a/policy/modules/kernel/filesystem.if ++++ b/policy/modules/kernel/filesystem.if +@@ -21,6 +21,25 @@ interface(`fs_type',` + typeattribute $1 filesystem_type; + ') + ++ ++######################################## ++## ++## Allow the type to associate to proc filesystems. ++## ++## ++## ++## The type of the object to be associated. ++## ++## ++# ++interface(`fs_associate_proc',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ allow $1 proc_t:filesystem associate; ++') ++ + ######################################## + ## + ## Transform specified type into a filesystem +@@ -557,6 +576,48 @@ interface(`fs_register_binary_executable_type',` + rw_files_pattern($1, binfmt_misc_fs_t, binfmt_misc_fs_t) + ') + ++######################################## ++## ++## Manage bpf directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_manage_bpf_dirs',` ++ gen_require(` ++ type bpf_t; ++ ++ ') ++ ++ manage_dirs_pattern($1, bpf_t, bpf_t) ++ fs_search_tmpfs($1) ++ dev_search_sysfs($1) ++') ++ ++######################################## ++## ++## Read bpf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_manage_bpf_files',` ++ gen_require(` ++ type bpf_t; ++ ++ ') ++ ++ manage_files_pattern($1, bpf_t, bpf_t) ++ fs_search_tmpfs($1) ++ dev_search_sysfs($1) ++') ++ + ######################################## + ## + ## Mount cgroup filesystems. +@@ -629,6 +690,27 @@ interface(`fs_getattr_cgroup',` + allow $1 cgroup_t:filesystem getattr; + ') + ++######################################## ++## ++## Get attributes of cgroup files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_getattr_cgroup_files',` ++ gen_require(` ++ type cgroup_t; ++ ++ ') ++ ++ getattr_files_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) ++ dev_search_sysfs($1) ++') ++ + ######################################## + ## + ## Search cgroup directories. +@@ -646,9 +728,29 @@ interface(`fs_search_cgroup_dirs',` + ') + + search_dirs_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + ++######################################## ++## ++## Relabel cgroup directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_relabel_cgroup_dirs',` ++ gen_require(` ++ type cgroup_t; ++ ++ ') ++ ++ relabel_dirs_pattern($1, cgroup_t, cgroup_t) ++') ++ + ######################################## + ## + ## list cgroup directories. +@@ -659,15 +761,35 @@ interface(`fs_search_cgroup_dirs',` + ## + ## + # +-interface(`fs_list_cgroup_dirs', ` ++interface(`fs_list_cgroup_dirs',` + gen_require(` + type cgroup_t; + ') + + list_dirs_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + ++####################################### ++## ++## Do not audit attempts to search cgroup directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_search_cgroup_dirs', ` ++ gen_require(` ++ type cgroup_t; ++ ') ++ ++ dontaudit $1 cgroup_t:dir search_dir_perms; ++ dev_dontaudit_search_sysfs($1) ++') ++ + ######################################## + ## + ## Delete cgroup directories. +@@ -684,6 +806,7 @@ interface(`fs_delete_cgroup_dirs', ` + ') + + delete_dirs_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -704,6 +827,7 @@ interface(`fs_manage_cgroup_dirs',` + ') + + manage_dirs_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -724,6 +848,8 @@ interface(`fs_read_cgroup_files',` + ') + + read_files_pattern($1, cgroup_t, cgroup_t) ++ read_lnk_files_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -743,6 +869,7 @@ interface(`fs_write_cgroup_files', ` + ') + + write_files_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -762,7 +889,9 @@ interface(`fs_rw_cgroup_files',` + + ') + ++ read_lnk_files_pattern($1, cgroup_t, cgroup_t) + rw_files_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -803,6 +932,8 @@ interface(`fs_manage_cgroup_files',` + ') + + manage_files_pattern($1, cgroup_t, cgroup_t) ++ manage_lnk_files_pattern($1, cgroup_t, cgroup_t) ++ fs_search_tmpfs($1) + dev_search_sysfs($1) + ') + +@@ -824,6 +955,26 @@ interface(`fs_mounton_cgroup', ` + allow $1 cgroup_t:dir mounton; + ') + ++######################################## ++## ++## Read and write ceph files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_cephfs_files',` ++ gen_require(` ++ type cephfs_t; ++ ++ ') ++ ++ rw_files_pattern($1, cephfs_t, cephfs_t) ++ rw_lnk_files_pattern($1, cephfs_t, cephfs_t) ++') ++ + ######################################## + ## + ## Do not audit attempts to read +@@ -918,6 +1069,24 @@ interface(`fs_getattr_cifs',` + allow $1 cifs_t:filesystem getattr; + ') + ++######################################## ++## ++## Set the attributes of cifs directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_setattr_cifs_dirs',` ++ gen_require(` ++ type cifs_t; ++ ') ++ ++ allow $1 cifs_t:dir setattr; ++') ++ + ######################################## + ## + ## Search directories on a CIFS or SMB filesystem. +@@ -1105,6 +1274,24 @@ interface(`fs_read_noxattr_fs_files',` + read_files_pattern($1, noxattrfs, noxattrfs) + ') + ++######################################## ++## ++## Read/Write all inherited noxattrfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_inherited_noxattr_fs_files',` ++ gen_require(` ++ attribute noxattrfs; ++ ') ++ ++ allow $1 noxattrfs:file rw_inherited_file_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to read all +@@ -1245,7 +1432,7 @@ interface(`fs_append_cifs_files',` + + ######################################## + ## +-## dontaudit Append files ++## Do not audit attempts to append files + ## on a CIFS filesystem. + ## + ## +@@ -1263,6 +1450,42 @@ interface(`fs_dontaudit_append_cifs_files',` + dontaudit $1 cifs_t:file append_file_perms; + ') + ++######################################## ++## ++## Read inherited files on a CIFS or SMB filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_inherited_cifs_files',` ++ gen_require(` ++ type cifs_t; ++ ') ++ ++ allow $1 cifs_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read/Write inherited files on a CIFS or SMB filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_inherited_cifs_files',` ++ gen_require(` ++ type cifs_t; ++ ') ++ ++ allow $1 cifs_t:file rw_inherited_file_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to read or +@@ -1279,7 +1502,7 @@ interface(`fs_dontaudit_rw_cifs_files',` + type cifs_t; + ') + +- dontaudit $1 cifs_t:file rw_file_perms; ++ dontaudit $1 cifs_t:file rw_inherited_file_perms; + ') + + ######################################## +@@ -1361,6 +1584,27 @@ interface(`fs_exec_cifs_files',` + exec_files_pattern($1, cifs_t, cifs_t) + ') + ++######################################## ++## ++## Mmap files on a CIFS or SMB ++## network filesystem, in the caller ++## domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_map_cifs_files',` ++ gen_require(` ++ type cifs_t; ++ ') ++ ++ allow $1 cifs_t:file map; ++') ++ + ######################################## + ## + ## Create, read, write, and delete directories +@@ -1542,48 +1786,48 @@ interface(`fs_cifs_domtrans',` + domain_auto_transition_pattern($1, cifs_t, $2) + ') + +-####################################### ++######################################## + ## +-## Create, read, write, and delete dirs +-## on a configfs filesystem. ++## Make general progams in cifs an entrypoint for ++## the specified domain. + ## + ## + ## +-## Domain allowed access. ++## The domain for which cifs_t is an entrypoint. + ## + ## + # +-interface(`fs_manage_configfs_dirs',` ++interface(`fs_cifs_entry_type',` + gen_require(` +- type configfs_t; ++ type cifs_t; + ') + +- manage_dirs_pattern($1, configfs_t, configfs_t) ++ domain_entry_file($1, cifs_t) + ') + +-####################################### ++######################################## + ## +-## Create, read, write, and delete files +-## on a configfs filesystem. ++## Make general progams in CIFS an entrypoint for ++## the specified domain. + ## + ## + ## +-## Domain allowed access. ++## The domain for which cifs_t is an entrypoint. + ## + ## + # +-interface(`fs_manage_configfs_files',` ++interface(`fs_cifs_entrypoint',` + gen_require(` +- type configfs_t; ++ type cifs_t; + ') + +- manage_files_pattern($1, configfs_t, configfs_t) ++ allow $1 cifs_t:file entrypoint; + ') + +-######################################## ++####################################### + ## +-## Mount a DOS filesystem, such as +-## FAT32 or NTFS. ++## dontaudit write dirs ++## on a configfs filesystem. + ## + ## + ## +@@ -1591,19 +1835,18 @@ interface(`fs_manage_configfs_files',` + ## + ## + # +-interface(`fs_mount_dos_fs',` ++interface(`fs_dontaudit_write_configfs_dirs',` + gen_require(` +- type dosfs_t; ++ type configfs_t; + ') + +- allow $1 dosfs_t:filesystem mount; ++ dontaudit $1 configfs_t:dir write; + ') + +-######################################## ++####################################### + ## +-## Remount a DOS filesystem, such as +-## FAT32 or NTFS. This allows +-## some mount options to be changed. ++## Read dirs ++## on a configfs filesystem. + ## + ## + ## +@@ -1611,18 +1854,18 @@ interface(`fs_mount_dos_fs',` + ## + ## + # +-interface(`fs_remount_dos_fs',` ++interface(`fs_read_configfs_dirs',` + gen_require(` +- type dosfs_t; ++ type configfs_t; + ') + +- allow $1 dosfs_t:filesystem remount; ++ list_dirs_pattern($1, configfs_t, configfs_t) + ') + +-######################################## ++####################################### + ## +-## Unmount a DOS filesystem, such as +-## FAT32 or NTFS. ++## Create, read, write, and delete dirs ++## on a configfs filesystem. + ## + ## + ## +@@ -1630,38 +1873,37 @@ interface(`fs_remount_dos_fs',` + ## + ## + # +-interface(`fs_unmount_dos_fs',` ++interface(`fs_manage_configfs_dirs',` + gen_require(` +- type dosfs_t; ++ type configfs_t; + ') + +- allow $1 dosfs_t:filesystem unmount; ++ manage_dirs_pattern($1, configfs_t, configfs_t) + ') + +-######################################## ++####################################### + ## +-## Get the attributes of a DOS +-## filesystem, such as FAT32 or NTFS. ++## Read files ++## on a configfs filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_getattr_dos_fs',` ++interface(`fs_read_configfs_files',` + gen_require(` +- type dosfs_t; ++ type configfs_t; + ') + +- allow $1 dosfs_t:filesystem getattr; ++ read_files_pattern($1, configfs_t, configfs_t) + ') + +-######################################## ++####################################### + ## +-## Allow changing of the label of a +-## DOS filesystem using the context= mount option. ++## Create, read, write, and delete files ++## on a configfs filesystem. + ## + ## + ## +@@ -1669,15 +1911,149 @@ interface(`fs_getattr_dos_fs',` + ## + ## + # +-interface(`fs_relabelfrom_dos_fs',` ++interface(`fs_manage_configfs_files',` + gen_require(` +- type dosfs_t; ++ type configfs_t; + ') + +- allow $1 dosfs_t:filesystem relabelfrom; ++ manage_files_pattern($1, configfs_t, configfs_t) + ') + +-######################################## ++####################################### ++## ++## Create, read, write, and delete files ++## on a configfs filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_manage_configfs_lnk_files',` ++ gen_require(` ++ type configfs_t; ++ ') ++ ++ manage_lnk_files_pattern($1, configfs_t, configfs_t) ++') ++ ++######################################## ++## ++## Unmount a configfs filesystem ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_unmount_configfs',` ++ gen_require(` ++ type configfs_t; ++ ') ++ ++ allow $1 configfs_t:filesystem unmount; ++') ++ ++######################################## ++## ++## Mount a DOS filesystem, such as ++## FAT32 or NTFS. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mount_dos_fs',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:filesystem mount; ++') ++ ++######################################## ++## ++## Remount a DOS filesystem, such as ++## FAT32 or NTFS. This allows ++## some mount options to be changed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_remount_dos_fs',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:filesystem remount; ++') ++ ++######################################## ++## ++## Unmount a DOS filesystem, such as ++## FAT32 or NTFS. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_unmount_dos_fs',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:filesystem unmount; ++') ++ ++######################################## ++## ++## Get the attributes of a DOS ++## filesystem, such as FAT32 or NTFS. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_getattr_dos_fs',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:filesystem getattr; ++') ++ ++######################################## ++## ++## Allow changing of the label of a ++## DOS filesystem using the context= mount option. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_relabelfrom_dos_fs',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:filesystem relabelfrom; ++') ++ ++######################################## + ## + ## Search dosfs filesystem. + ## +@@ -1732,6 +2108,24 @@ interface(`fs_manage_dos_dirs',` + manage_dirs_pattern($1, dosfs_t, dosfs_t) + ') + ++######################################## ++## ++## Mmap files on a DOS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_map_dos_files',` ++ gen_require(` ++ type dosfs_t; ++ ') ++ ++ allow $1 dosfs_t:file map; ++') ++ + ######################################## + ## + ## Read files on a DOS filesystem. +@@ -1771,31 +2165,517 @@ interface(`fs_manage_dos_files',` + + ######################################## + ## +-## Read eventpollfs files. ++## Read eventpollfs files. ++## ++## ++##

    ++## Read eventpollfs files ++##

    ++##

    ++## This interface has been deprecated, and will ++## be removed in the future. ++##

    ++##
    ++## ++## ++## Domain allowed access. ++## ++## ++# ++# eventpollfs was changed to task SID 20060628 ++interface(`fs_read_eventpollfs',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++ ++####################################### ++## ++## Search directories ++## on a ecrypt filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_search_ecryptfs',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ allow $1 ecryptfs_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete directories ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_manage_ecryptfs_dirs',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ manage_dirs_pattern($1, ecryptfs_t, ecryptfs_t) ++ allow $1 ecryptfs_t:dir manage_dir_perms; ++') ++ ++####################################### ++## ++## Create, read, write, and delete files ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_read_ecryptfs_files',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ read_files_pattern($1, ecryptfs_t, ecryptfs_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete files ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_manage_ecryptfs_files',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ manage_files_pattern($1, ecryptfs_t, ecryptfs_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to create, ++## read, write, and delete files ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_manage_ecryptfs_files',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ dontaudit $1 ecryptfs_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## Read symbolic links on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_ecryptfs_symlinks',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ allow $1 ecryptfs_t:dir list_dir_perms; ++ read_lnk_files_pattern($1, ecryptfs_t, ecryptfs_t) ++') ++ ++####################################### ++## ++## Dontaudit append files on ecrypt filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_dontaudit_append_ecryptfs_files',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ dontaudit $1 ecryptfs_t:file append; ++') ++ ++######################################## ++## ++## Manage symbolic links on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_manage_ecryptfs_symlinks',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ manage_lnk_files_pattern($1, ecryptfs_t, ecryptfs_t) ++') ++ ++######################################## ++## ++## Execute a file on a FUSE filesystem ++## in the specified domain. ++## ++## ++##

    ++## Execute a file on a FUSE filesystem ++## in the specified domain. This allows ++## the specified domain to execute any file ++## on these filesystems in the specified ++## domain. This is not suggested. ++##

    ++##

    ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

    ++##

    ++## This interface was added to handle ++## home directories on FUSE filesystems, ++## in particular used by the ssh-agent policy. ++##

    ++##
    ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`fs_ecryptfs_domtrans',` ++ gen_require(` ++ type ecryptfs_t; ++ ') ++ ++ allow $1 ecryptfs_t:dir search_dir_perms; ++ domain_auto_transition_pattern($1, ecryptfs_t, $2) ++') ++ ++######################################## ++## ++## Mount a FUSE filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mount_fusefs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:filesystem mount; ++') ++ ++######################################## ++## ++## Unmount a FUSE filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_unmount_fusefs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:filesystem unmount; ++') ++ ++######################################## ++## ++## Mounton a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mounton_fusefs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:dir mounton; ++') ++ ++######################################## ++## ++## Search directories ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_search_fusefs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to list the contents ++## of directories on a FUSEFS filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_list_fusefs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ dontaudit $1 fusefs_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete directories ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_manage_fusefs_dirs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to create, read, ++## write, and delete directories ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_manage_fusefs_dirs',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ dontaudit $1 fusefs_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Read, a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_read_fusefs_files',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ read_files_pattern($1, fusefs_t, fusefs_t) ++') ++ ++######################################## ++## ++## Execute files on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_exec_fusefs_files',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ exec_files_pattern($1, fusefs_t, fusefs_t) ++') ++ ++######################################## ++## ++## mmap files on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_mmap_fusefs_files',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:file map; ++') ++ ++######################################## ++## ++## Make general progams in FUSEFS an entrypoint for ++## the specified domain. ++## ++## ++## ++## The domain for which fusefs_t is an entrypoint. ++## ++## ++# ++interface(`fs_fusefs_entry_type',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ domain_entry_file($1, fusefs_t) ++') ++ ++######################################## ++## ++## Make general progams in FUSEFS an entrypoint for ++## the specified domain. ++## ++## ++## ++## The domain for which fusefs_t is an entrypoint. ++## ++## ++# ++interface(`fs_fusefs_entrypoint',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:file entrypoint; ++') ++ ++######################################## ++## ++## Create, read, write, and delete files ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_manage_fusefs_files',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ manage_files_pattern($1, fusefs_t, fusefs_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to create, ++## read, write, and delete files ++## on a FUSEFS filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_manage_fusefs_files',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ dontaudit $1 fusefs_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## Read symbolic links on a FUSEFS filesystem. + ## +-## +-##

    +-## Read eventpollfs files +-##

    +-##

    +-## This interface has been deprecated, and will +-## be removed in the future. +-##

    +-##
    + ## + ## + ## Domain allowed access. + ## + ## + # +-# eventpollfs was changed to task SID 20060628 +-interface(`fs_read_eventpollfs',` +- refpolicywarn(`$0($*) has been deprecated.') ++interface(`fs_read_fusefs_symlinks',` ++ gen_require(` ++ type fusefs_t; ++ ') ++ ++ allow $1 fusefs_t:dir list_dir_perms; ++ read_lnk_files_pattern($1, fusefs_t, fusefs_t) + ') + + ######################################## + ## +-## Mount a FUSE filesystem. ++## Manage symbolic links on a FUSEFS filesystem. + ## + ## + ## +@@ -1803,210 +2683,227 @@ interface(`fs_read_eventpollfs',` + ## + ## + # +-interface(`fs_mount_fusefs',` ++interface(`fs_manage_fusefs_symlinks',` + gen_require(` + type fusefs_t; + ') + +- allow $1 fusefs_t:filesystem mount; ++ manage_lnk_files_pattern($1, fusefs_t, fusefs_t) + ') + + ######################################## + ## +-## Unmount a FUSE filesystem. ++## Execute a file on a FUSE filesystem ++## in the specified domain. + ## ++## ++##

    ++## Execute a file on a FUSE filesystem ++## in the specified domain. This allows ++## the specified domain to execute any file ++## on these filesystems in the specified ++## domain. This is not suggested. ++##

    ++##

    ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

    ++##

    ++## This interface was added to handle ++## home directories on FUSE filesystems, ++## in particular used by the ssh-agent policy. ++##

    ++##
    + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. + ## + ## + # +-interface(`fs_unmount_fusefs',` ++interface(`fs_fusefs_domtrans',` + gen_require(` + type fusefs_t; + ') + +- allow $1 fusefs_t:filesystem unmount; ++ allow $1 fusefs_t:dir search_dir_perms; ++ domain_auto_transition_pattern($1, fusefs_t, $2) + ') + + ######################################## + ## +-## Mounton a FUSEFS filesystem. ++## Get the attributes of a FUSEFS filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`fs_mounton_fusefs',` ++interface(`fs_getattr_fusefs',` + gen_require(` + type fusefs_t; + ') + +- allow $1 fusefs_t:dir mounton; ++ allow $1 fusefs_t:filesystem getattr; + ') + + ######################################## + ## +-## Search directories +-## on a FUSEFS filesystem. ++## Get the attributes of an hugetlbfs ++## filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_search_fusefs',` ++interface(`fs_getattr_hugetlbfs',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- allow $1 fusefs_t:dir search_dir_perms; ++ allow $1 hugetlbfs_t:filesystem getattr; + ') + + ######################################## + ## +-## Do not audit attempts to list the contents +-## of directories on a FUSEFS filesystem. ++## List hugetlbfs. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fs_dontaudit_list_fusefs',` ++interface(`fs_list_hugetlbfs',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- dontaudit $1 fusefs_t:dir list_dir_perms; ++ allow $1 hugetlbfs_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete directories +-## on a FUSEFS filesystem. ++## Manage hugetlbfs dirs. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_manage_fusefs_dirs',` ++interface(`fs_manage_hugetlbfs_dirs',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- allow $1 fusefs_t:dir manage_dir_perms; ++ manage_dirs_pattern($1, hugetlbfs_t, hugetlbfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to create, read, +-## write, and delete directories +-## on a FUSEFS filesystem. ++## Read hugetlbfs files. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fs_dontaudit_manage_fusefs_dirs',` ++interface(`fs_read_hugetlbfs_files',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- dontaudit $1 fusefs_t:dir manage_dir_perms; ++ read_files_pattern($1, hugetlbfs_t, hugetlbfs_t) + ') + + ######################################## + ## +-## Read, a FUSEFS filesystem. ++## Read and write hugetlbfs files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_read_fusefs_files',` ++interface(`fs_rw_hugetlbfs_files',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- read_files_pattern($1, fusefs_t, fusefs_t) ++ allow $1 hugetlbfs_t:file map; ++ rw_files_pattern($1, hugetlbfs_t, hugetlbfs_t) + ') + + ######################################## + ## +-## Execute files on a FUSEFS filesystem. ++## Manage hugetlbfs files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_exec_fusefs_files',` ++interface(`fs_manage_hugetlbfs_files',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- exec_files_pattern($1, fusefs_t, fusefs_t) ++ manage_files_pattern($1, hugetlbfs_t, hugetlbfs_t) + ') + + ######################################## + ## +-## Create, read, write, and delete files +-## on a FUSEFS filesystem. ++## Execute hugetlbfs files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_manage_fusefs_files',` ++interface(`fs_exec_hugetlbfs_files',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- manage_files_pattern($1, fusefs_t, fusefs_t) ++ allow $1 hugetlbfs_t:dir list_dir_perms; ++ exec_files_pattern($1, hugetlbfs_t, hugetlbfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to create, +-## read, write, and delete files +-## on a FUSEFS filesystem. ++## Allow the type to associate to hugetlbfs filesystems. + ## +-## ++## + ## +-## Domain to not audit. ++## The type of the object to be associated. + ## + ## + # +-interface(`fs_dontaudit_manage_fusefs_files',` ++interface(`fs_associate_hugetlbfs',` + gen_require(` +- type fusefs_t; ++ type hugetlbfs_t; + ') + +- dontaudit $1 fusefs_t:file manage_file_perms; ++ allow $1 hugetlbfs_t:filesystem associate; + ') + + ######################################## + ## +-## Read symbolic links on a FUSEFS filesystem. ++## List oracleasmfs. + ## + ## + ## +@@ -2014,18 +2911,17 @@ interface(`fs_dontaudit_manage_fusefs_files',` + ## + ## + # +-interface(`fs_read_fusefs_symlinks',` ++interface(`fs_list_oracleasmfs',` + gen_require(` +- type fusefs_t; ++ type oracleasmfs_t; + ') + +- allow $1 fusefs_t:dir list_dir_perms; +- read_lnk_files_pattern($1, fusefs_t, fusefs_t) ++ allow $1 oracleasmfs_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Get the attributes of an hugetlbfs ++## Get the attributes of an oracleasmfs + ## filesystem. + ## + ## +@@ -2034,17 +2930,18 @@ interface(`fs_read_fusefs_symlinks',` + ##
    + ## + # +-interface(`fs_getattr_hugetlbfs',` ++interface(`fs_getattr_oracleasmfs_fs',` + gen_require(` +- type hugetlbfs_t; ++ type oracleasmfs_t; + ') + +- allow $1 hugetlbfs_t:filesystem getattr; ++ allow $1 oracleasmfs_t:filesystem getattr; + ') + + ######################################## + ## +-## List hugetlbfs. ++## Get the attributes of an oracleasmfs ++## filesystem. + ## + ## + ## +@@ -2052,17 +2949,18 @@ interface(`fs_getattr_hugetlbfs',` + ## + ## + # +-interface(`fs_list_hugetlbfs',` ++interface(`fs_getattr_oracleasmfs',` + gen_require(` +- type hugetlbfs_t; ++ type oracleasmfs_t; + ') + +- allow $1 hugetlbfs_t:dir list_dir_perms; ++ allow $1 oracleasmfs_t:file getattr; + ') + + ######################################## + ## +-## Manage hugetlbfs dirs. ++## Get the attributes of an oracleasmfs ++## filesystem. + ## + ## + ## +@@ -2070,17 +2968,18 @@ interface(`fs_list_hugetlbfs',` + ## + ## + # +-interface(`fs_manage_hugetlbfs_dirs',` ++interface(`fs_setattr_oracleasmfs',` + gen_require(` +- type hugetlbfs_t; ++ type oracleasmfs_t; + ') + +- manage_dirs_pattern($1, hugetlbfs_t, hugetlbfs_t) ++ allow $1 oracleasmfs_t:file setattr; + ') + + ######################################## + ## +-## Read and write hugetlbfs files. ++## Get the attributes of an oracleasmfs ++## filesystem. + ## + ## + ## +@@ -2088,30 +2987,32 @@ interface(`fs_manage_hugetlbfs_dirs',` + ## + ## + # +-interface(`fs_rw_hugetlbfs_files',` ++interface(`fs_setattr_oracleasmfs_dirs',` + gen_require(` +- type hugetlbfs_t; ++ type oracleasmfs_t; + ') + +- rw_files_pattern($1, hugetlbfs_t, hugetlbfs_t) ++ allow $1 oracleasmfs_t:dir setattr; + ') + + ######################################## + ## +-## Allow the type to associate to hugetlbfs filesystems. ++## Read and write the oracleasm device. + ## +-## ++## + ## +-## The type of the object to be associated. ++## Domain allowed access. + ## + ## + # +-interface(`fs_associate_hugetlbfs',` ++interface(`fs_manage_oracleasm',` + gen_require(` +- type hugetlbfs_t; ++ type oracleasmfs_t; + ') + +- allow $1 hugetlbfs_t:filesystem associate; ++ manage_dirs_pattern($1, oracleasmfs_t, oracleasmfs_t) ++ manage_blk_files_pattern($1, oracleasmfs_t, oracleasmfs_t) ++ dev_filetrans($1, oracleasmfs_t, dir, "oracleasm") + ') + + ######################################## +@@ -2148,11 +3049,12 @@ interface(`fs_list_inotifyfs',` + ') + + allow $1 inotifyfs_t:dir list_dir_perms; ++ fs_read_anon_inodefs_files($1) + ') + + ######################################## + ## +-## Dontaudit List inotifyfs filesystem. ++## Do not audit attempts to list inotifyfs filesystem. + ## + ## + ## +@@ -2396,6 +3298,24 @@ interface(`fs_getattr_nfs',` + allow $1 nfs_t:filesystem getattr; + ') + ++######################################## ++## ++## Set the attributes of nfs directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_setattr_nfs_dirs',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ allow $1 nfs_t:dir setattr; ++') ++ + ######################################## + ## + ## Search directories on a NFS filesystem. +@@ -2453,138 +3373,214 @@ interface(`fs_dontaudit_list_nfs',` + + ######################################## + ## +-## Mounton a NFS filesystem. ++## Mounton a NFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mounton_nfs',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ allow $1 nfs_t:dir mounton; ++') ++ ++######################################## ++## ++## Read files on a NFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_read_nfs_files',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ fs_search_auto_mountpoints($1) ++ allow $1 nfs_t:dir list_dir_perms; ++ read_files_pattern($1, nfs_t, nfs_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to read ++## files on a NFS filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_read_nfs_files',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ dontaudit $1 nfs_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Read files on a NFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_write_nfs_files',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ fs_search_auto_mountpoints($1) ++ allow $1 nfs_t:dir list_dir_perms; ++ write_files_pattern($1, nfs_t, nfs_t) ++') ++ ++######################################## ++## ++## Execute files on a NFS filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`fs_mounton_nfs',` ++interface(`fs_exec_nfs_files',` + gen_require(` + type nfs_t; + ') + +- allow $1 nfs_t:dir mounton; ++ allow $1 nfs_t:dir list_dir_perms; ++ exec_files_pattern($1, nfs_t, nfs_t) + ') + + ######################################## + ## +-## Read files on a NFS filesystem. ++## Make general progams in nfs an entrypoint for ++## the specified domain. + ## + ## + ## +-## Domain allowed access. ++## The domain for which nfs_t is an entrypoint. + ## + ## +-## + # +-interface(`fs_read_nfs_files',` ++interface(`fs_nfs_entry_type',` + gen_require(` + type nfs_t; + ') + +- allow $1 nfs_t:dir list_dir_perms; +- read_files_pattern($1, nfs_t, nfs_t) ++ domain_entry_file($1, nfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to read +-## files on a NFS filesystem. ++## Make general progams in NFS an entrypoint for ++## the specified domain. + ## + ## + ## +-## Domain to not audit. ++## The domain for which nfs_t is an entrypoint. + ## + ## + # +-interface(`fs_dontaudit_read_nfs_files',` ++interface(`fs_nfs_entrypoint',` + gen_require(` + type nfs_t; + ') + +- dontaudit $1 nfs_t:file read_file_perms; ++ allow $1 nfs_t:file entrypoint; + ') + + ######################################## + ## +-## Read files on a NFS filesystem. ++## Append files ++## on a NFS filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`fs_write_nfs_files',` ++interface(`fs_append_nfs_files',` + gen_require(` + type nfs_t; + ') + +- allow $1 nfs_t:dir list_dir_perms; +- write_files_pattern($1, nfs_t, nfs_t) ++ append_files_pattern($1, nfs_t, nfs_t) + ') + + ######################################## + ## +-## Execute files on a NFS filesystem. ++## Do not audit attempts to append files ++## on a NFS filesystem. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + ## + # +-interface(`fs_exec_nfs_files',` ++interface(`fs_dontaudit_append_nfs_files',` + gen_require(` + type nfs_t; + ') + +- allow $1 nfs_t:dir list_dir_perms; +- exec_files_pattern($1, nfs_t, nfs_t) ++ dontaudit $1 nfs_t:file append_file_perms; + ') + + ######################################## + ## +-## Append files +-## on a NFS filesystem. ++## Read inherited files on a NFS filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`fs_append_nfs_files',` ++interface(`fs_read_inherited_nfs_files',` + gen_require(` + type nfs_t; + ') + +- append_files_pattern($1, nfs_t, nfs_t) ++ allow $1 nfs_t:file read_inherited_file_perms; + ') + + ######################################## + ## +-## dontaudit Append files +-## on a NFS filesystem. ++## Read/write inherited files on a NFS filesystem. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## +-## + # +-interface(`fs_dontaudit_append_nfs_files',` ++interface(`fs_rw_inherited_nfs_files',` + gen_require(` + type nfs_t; + ') + +- dontaudit $1 nfs_t:file append_file_perms; ++ allow $1 nfs_t:file rw_inherited_file_perms; + ') + + ######################################## +@@ -2603,7 +3599,7 @@ interface(`fs_dontaudit_rw_nfs_files',` + type nfs_t; + ') + +- dontaudit $1 nfs_t:file rw_file_perms; ++ dontaudit $1 nfs_t:file rw_inherited_file_perms; + ') + + ######################################## +@@ -2627,7 +3623,7 @@ interface(`fs_read_nfs_symlinks',` + + ######################################## + ## +-## Dontaudit read symbolic links on a NFS filesystem. ++## Do not audit attempts to read symbolic links on a NFS filesystem. + ## + ## + ## +@@ -2717,6 +3713,47 @@ interface(`fs_search_rpc',` + allow $1 rpc_pipefs_t:dir search_dir_perms; + ') + ++######################################## ++## ++## Do not audit attempts to list removable storage directories. ++## ++## ++##

    ++## Do not audit attempts to list removable storage directories ++##

    ++##

    ++## This interface has been deprecated, and will ++## be removed in the future. ++##

    ++##
    ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_list_pstorefs',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++######################################## ++## ++## Do not audit attempts to list removable storage directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_list_pstore',` ++ gen_require(` ++ type pstore_t; ++ ') ++ ++ allow $1 pstore_t:dir list_dir_perms; ++') ++ + ######################################## + ## + ## Search removable storage directories. +@@ -2741,7 +3778,7 @@ interface(`fs_search_removable',` + ## + ## + ## +-## Domain not to audit. ++## Domain to not audit. + ## + ## + # +@@ -2771,13 +3808,33 @@ interface(`fs_read_removable_files',` + read_files_pattern($1, removable_t, removable_t) + ') + ++ ++######################################## ++## ++## mmap files on a removable files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_mmap_removable_files',` ++ gen_require(` ++ type removable_t; ++ ') ++ ++ allow $1 removable_t:file map; ++') ++ + ######################################## + ## + ## Do not audit attempts to read removable storage files. + ## + ## + ## +-## Domain not to audit. ++## Domain to not audit. + ## + ## + # +@@ -2970,6 +4027,7 @@ interface(`fs_manage_nfs_dirs',` + type nfs_t; + ') + ++ fs_search_auto_mountpoints($1) + allow $1 nfs_t:dir manage_dir_perms; + ') + +@@ -3010,9 +4068,29 @@ interface(`fs_manage_nfs_files',` + type nfs_t; + ') + ++ fs_search_auto_mountpoints($1) + manage_files_pattern($1, nfs_t, nfs_t) + ') + ++######################################## ++## ++## mmap files on a NFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_mmap_nfs_files',` ++ gen_require(` ++ type nfs_t; ++ ') ++ ++ allow $1 nfs_t:file map; ++') ++ + ######################################## + ## + ## Do not audit attempts to create, +@@ -3050,6 +4128,7 @@ interface(`fs_manage_nfs_symlinks',` + type nfs_t; + ') + ++ fs_search_auto_mountpoints($1) + manage_lnk_files_pattern($1, nfs_t, nfs_t) + ') + +@@ -3135,6 +4214,24 @@ interface(`fs_nfs_domtrans',` + domain_auto_transition_pattern($1, nfs_t, $2) + ') + ++######################################## ++## ++## Mount on nfsd_fs directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mounton_nfsd_fs', ` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ allow $1 nfsd_fs_t:dir mounton; ++') ++ + ######################################## + ## + ## Mount a NFS server pseudo filesystem. +@@ -3172,28 +4269,155 @@ interface(`fs_remount_nfsd_fs',` + allow $1 nfsd_fs_t:filesystem remount; + ') + +-######################################## ++######################################## ++## ++## Unmount a NFS server pseudo filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_unmount_nfsd_fs',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ allow $1 nfsd_fs_t:filesystem unmount; ++') ++ ++######################################## ++## ++## Get the attributes of a NFS server ++## pseudo filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_getattr_nfsd_fs',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ allow $1 nfsd_fs_t:filesystem getattr; ++') ++ ++######################################## ++## ++## Search NFS server directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_search_nfsd_fs',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ allow $1 nfsd_fs_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## List NFS server directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_list_nfsd_fs',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ allow $1 nfsd_fs_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Getattr files on an nfsd filesystem ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_getattr_nfsd_files',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ getattr_files_pattern($1, nfsd_fs_t, nfsd_fs_t) ++') ++ ++####################################### ++## ++## read files on an nfsd filesystem ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_nfsd_files',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ read_files_pattern($1, nfsd_fs_t, nfsd_fs_t) ++') ++ ++####################################### ++## ++## Read and write NFS server files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_nfsd_fs',` ++ gen_require(` ++ type nfsd_fs_t; ++ ') ++ ++ rw_files_pattern($1, nfsd_fs_t, nfsd_fs_t) ++') ++ ++ ++####################################### + ## +-## Unmount a NFS server pseudo filesystem. ++## Read nsfs inodes (e.g. /proc/pid/ns/uts) + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`fs_unmount_nfsd_fs',` ++interface(`fs_read_nsfs_files',` + gen_require(` +- type nfsd_fs_t; +- ') ++ type nsfs_t; ++ ') + +- allow $1 nfsd_fs_t:filesystem unmount; ++ allow $1 nsfs_t:file read_file_perms; + ') + +-######################################## ++####################################### + ## +-## Get the attributes of a NFS server +-## pseudo filesystem. ++## Read and write nsfs inodes (e.g. /proc/pid/ns/uts) + ## + ## + ## +@@ -3201,17 +4425,18 @@ interface(`fs_unmount_nfsd_fs',` + ## + ## + # +-interface(`fs_getattr_nfsd_fs',` ++interface(`fs_rw_nsfs_files',` + gen_require(` +- type nfsd_fs_t; ++ type nsfs_t; + ') + +- allow $1 nfsd_fs_t:filesystem getattr; ++ rw_files_pattern($1, nsfs_t, nsfs_t) + ') + ++ + ######################################## + ## +-## Search NFS server directories. ++## Mount a nsfs filesystem. + ## + ## + ## +@@ -3219,17 +4444,18 @@ interface(`fs_getattr_nfsd_fs',` + ## + ## + # +-interface(`fs_search_nfsd_fs',` ++interface(`fs_mount_nsfs',` + gen_require(` +- type nfsd_fs_t; ++ type nsfs_t; + ') + +- allow $1 nfsd_fs_t:dir search_dir_perms; ++ allow $1 nsfs_t:filesystem mount; + ') + ++ + ######################################## + ## +-## List NFS server directories. ++## Remount a tmpfs filesystem. + ## + ## + ## +@@ -3237,17 +4463,17 @@ interface(`fs_search_nfsd_fs',` + ## + ## + # +-interface(`fs_list_nfsd_fs',` ++interface(`fs_remount_nsfs',` + gen_require(` +- type nfsd_fs_t; ++ type nsfs_t; + ') + +- allow $1 nfsd_fs_t:dir list_dir_perms; ++ allow $1 nsfs_t:filesystem remount; + ') + + ######################################## + ## +-## Getattr files on an nfsd filesystem ++## Unmount a tmpfs filesystem. + ## + ## + ## +@@ -3255,17 +4481,17 @@ interface(`fs_list_nfsd_fs',` + ## + ## + # +-interface(`fs_getattr_nfsd_files',` ++interface(`fs_unmount_nsfs',` + gen_require(` +- type nfsd_fs_t; ++ type nsfs_t; + ') + +- getattr_files_pattern($1, nfsd_fs_t, nfsd_fs_t) ++ allow $1 nsfs_t:filesystem unmount; + ') + + ######################################## + ## +-## Read and write NFS server files. ++## Manage NFS server files. + ## + ## + ## +@@ -3273,12 +4499,12 @@ interface(`fs_getattr_nfsd_files',` + ## + ## + # +-interface(`fs_rw_nfsd_fs',` ++interface(`fs_manage_nfsd_fs',` + gen_require(` + type nfsd_fs_t; + ') + +- rw_files_pattern($1, nfsd_fs_t, nfsd_fs_t) ++ manage_files_pattern($1, nfsd_fs_t, nfsd_fs_t) + ') + + ######################################## +@@ -3392,7 +4618,7 @@ interface(`fs_search_ramfs',` + + ######################################## + ## +-## Dontaudit Search directories on a ramfs ++## Do not audit attempts to search directories on a ramfs + ## + ## + ## +@@ -3429,7 +4655,7 @@ interface(`fs_manage_ramfs_dirs',` + + ######################################## + ## +-## Dontaudit read on a ramfs files. ++## Do not audit attempts to read on a ramfs files. + ## + ## + ## +@@ -3447,7 +4673,7 @@ interface(`fs_dontaudit_read_ramfs_files',` + + ######################################## + ## +-## Dontaudit read on a ramfs fifo_files. ++## Do not audit attempts to read on a ramfs fifo_files. + ## + ## + ## +@@ -3777,6 +5003,24 @@ interface(`fs_mount_tmpfs',` + allow $1 tmpfs_t:filesystem mount; + ') + ++######################################## ++## ++## Dontaudit remount a tmpfs filesystem. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_remount_tmpfs',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ dontaudit $1 tmpfs_t:filesystem remount; ++') ++ + ######################################## + ## + ## Remount a tmpfs filesystem. +@@ -3813,6 +5057,24 @@ interface(`fs_unmount_tmpfs',` + allow $1 tmpfs_t:filesystem unmount; + ') + ++######################################## ++## ++## Mount on tmpfs directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mounton_tmpfs', ` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ allow $1 tmpfs_t:dir mounton; ++') ++ + ######################################## + ## + ## Get the attributes of a tmpfs +@@ -3908,7 +5170,7 @@ interface(`fs_dontaudit_getattr_tmpfs_dirs',` + + ######################################## + ## +-## Mount on tmpfs directories. ++## Set the attributes of tmpfs directories. + ## + ## + ## +@@ -3916,17 +5178,17 @@ interface(`fs_dontaudit_getattr_tmpfs_dirs',` + ## + ## + # +-interface(`fs_mounton_tmpfs',` ++interface(`fs_setattr_tmpfs_dirs',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir mounton; ++ allow $1 tmpfs_t:dir setattr; + ') + + ######################################## + ## +-## Set the attributes of tmpfs directories. ++## Search tmpfs directories. + ## + ## + ## +@@ -3934,17 +5196,17 @@ interface(`fs_mounton_tmpfs',` + ## + ## + # +-interface(`fs_setattr_tmpfs_dirs',` ++interface(`fs_search_tmpfs',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir setattr; ++ allow $1 tmpfs_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Search tmpfs directories. ++## List the contents of generic tmpfs directories. + ## + ## + ## +@@ -3952,17 +5214,36 @@ interface(`fs_setattr_tmpfs_dirs',` + ## + ## + # +-interface(`fs_search_tmpfs',` ++interface(`fs_list_tmpfs',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir search_dir_perms; ++ allow $1 tmpfs_t:dir list_dir_perms; + ') + + ######################################## + ## +-## List the contents of generic tmpfs directories. ++## Do not audit attempts to list the ++## contents of generic tmpfs directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_list_tmpfs',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ dontaudit $1 tmpfs_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Relabel directory on tmpfs filesystems. + ## + ## + ## +@@ -3970,31 +5251,48 @@ interface(`fs_search_tmpfs',` + ## + ## + # +-interface(`fs_list_tmpfs',` ++interface(`fs_relabel_tmpfs_dirs',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir list_dir_perms; ++ relabel_dirs_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to list the +-## contents of generic tmpfs directories. ++## Relabel fifo_file on tmpfs filesystems. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fs_dontaudit_list_tmpfs',` ++interface(`fs_relabel_tmpfs_fifo_files',` + gen_require(` + type tmpfs_t; + ') + +- dontaudit $1 tmpfs_t:dir list_dir_perms; ++ relabel_fifo_files_pattern($1, tmpfs_t, tmpfs_t) ++') ++ ++######################################## ++## ++## Relabel files on tmpfs filesystems. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_relabel_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ relabel_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## +@@ -4061,38 +5359,166 @@ interface(`fs_dontaudit_write_tmpfs_dirs',` + ## + ## + # +-interface(`fs_tmpfs_filetrans',` ++interface(`fs_tmpfs_filetrans',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ allow $2 tmpfs_t:filesystem associate; ++ filetrans_pattern($1, tmpfs_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Do not audit attempts to getattr ++## generic tmpfs files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_getattr_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ dontaudit $1 tmpfs_t:file getattr; ++') ++ ++######################################## ++## ++## Do not audit attempts to read or write ++## generic tmpfs files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_rw_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ dontaudit $1 tmpfs_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## auto moutpoints. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_manage_auto_mountpoints',` ++ gen_require(` ++ type autofs_t; ++ ') ++ ++ allow $1 autofs_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Read generic tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ read_files_pattern($1, tmpfs_t, tmpfs_t) ++') ++ ++######################################## ++## ++## Read and write generic tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ rw_files_pattern($1, tmpfs_t, tmpfs_t) ++') ++ ++######################################## ++## ++## Read and write generic tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_inherited_tmpfs_files',` ++ gen_require(` ++ type tmpfs_t; ++ ') ++ ++ allow $1 tmpfs_t:file { read write }; ++') ++ ++######################################## ++## ++## Read tmpfs link files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_tmpfs_symlinks',` + gen_require(` + type tmpfs_t; + ') + +- allow $2 tmpfs_t:filesystem associate; +- filetrans_pattern($1, tmpfs_t, $2, $3, $4) ++ read_lnk_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to getattr +-## generic tmpfs files. ++## Read and write character nodes on tmpfs filesystems. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fs_dontaudit_getattr_tmpfs_files',` ++interface(`fs_rw_tmpfs_chr_files',` + gen_require(` + type tmpfs_t; + ') + +- dontaudit $1 tmpfs_t:file getattr; ++ allow $1 tmpfs_t:dir list_dir_perms; ++ rw_chr_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Do not audit attempts to read or write +-## generic tmpfs files. ++## Do not audit attempts to read and write character nodes on tmpfs filesystems. + ## + ## + ## +@@ -4100,72 +5526,72 @@ interface(`fs_dontaudit_getattr_tmpfs_files',` + ## + ## + # +-interface(`fs_dontaudit_rw_tmpfs_files',` ++interface(`fs_dontaudit_use_tmpfs_chr_dev',` + gen_require(` + type tmpfs_t; + ') + +- dontaudit $1 tmpfs_t:file rw_file_perms; ++ dontaudit $1 tmpfs_t:dir list_dir_perms; ++ dontaudit $1 tmpfs_t:chr_file rw_chr_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## auto moutpoints. ++## Do not audit attempts to create character nodes on tmpfs filesystems. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`fs_manage_auto_mountpoints',` ++interface(`fs_dontaudit_create_tmpfs_chr_dev',` + gen_require(` +- type autofs_t; ++ type tmpfs_t; + ') + +- allow $1 autofs_t:dir manage_dir_perms; ++ dontaudit $1 tmpfs_t:chr_file create; + ') + + ######################################## + ## +-## Read generic tmpfs files. ++## Do not audit attempts to dontaudit read block nodes on tmpfs filesystems. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`fs_read_tmpfs_files',` ++interface(`fs_dontaudit_read_tmpfs_blk_dev',` + gen_require(` + type tmpfs_t; + ') + +- read_files_pattern($1, tmpfs_t, tmpfs_t) ++ dontaudit $1 tmpfs_t:blk_file read_blk_file_perms; + ') + + ######################################## + ## +-## Read and write generic tmpfs files. ++## Do not audit attempts to read files on tmpfs filesystems. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`fs_rw_tmpfs_files',` ++interface(`fs_dontaudit_read_tmpfs_files',` + gen_require(` + type tmpfs_t; + ') + +- rw_files_pattern($1, tmpfs_t, tmpfs_t) ++ dontaudit $1 tmpfs_t:blk_file read; + ') + + ######################################## + ## +-## Read tmpfs link files. ++## Relabel character nodes on tmpfs filesystems. + ## + ## + ## +@@ -4173,17 +5599,18 @@ interface(`fs_rw_tmpfs_files',` + ## + ## + # +-interface(`fs_read_tmpfs_symlinks',` ++interface(`fs_relabel_tmpfs_chr_file',` + gen_require(` + type tmpfs_t; + ') + +- read_lnk_files_pattern($1, tmpfs_t, tmpfs_t) ++ allow $1 tmpfs_t:dir list_dir_perms; ++ relabel_chr_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Read and write character nodes on tmpfs filesystems. ++## Read and write block nodes on tmpfs filesystems. + ## + ## + ## +@@ -4191,37 +5618,37 @@ interface(`fs_read_tmpfs_symlinks',` + ## + ## + # +-interface(`fs_rw_tmpfs_chr_files',` ++interface(`fs_rw_tmpfs_blk_files',` + gen_require(` + type tmpfs_t; + ') + + allow $1 tmpfs_t:dir list_dir_perms; +- rw_chr_files_pattern($1, tmpfs_t, tmpfs_t) ++ rw_blk_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## dontaudit Read and write character nodes on tmpfs filesystems. ++## Relabel block nodes on tmpfs filesystems. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fs_dontaudit_use_tmpfs_chr_dev',` ++interface(`fs_relabel_tmpfs_blk_file',` + gen_require(` + type tmpfs_t; + ') + +- dontaudit $1 tmpfs_t:dir list_dir_perms; +- dontaudit $1 tmpfs_t:chr_file rw_chr_file_perms; ++ allow $1 tmpfs_t:dir list_dir_perms; ++ relabel_blk_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Relabel character nodes on tmpfs filesystems. ++## Relabel sock nodes on tmpfs filesystems. + ## + ## + ## +@@ -4229,18 +5656,18 @@ interface(`fs_dontaudit_use_tmpfs_chr_dev',` + ## + ## + # +-interface(`fs_relabel_tmpfs_chr_file',` ++interface(`fs_relabel_tmpfs_sock_file',` + gen_require(` + type tmpfs_t; + ') + + allow $1 tmpfs_t:dir list_dir_perms; +- relabel_chr_files_pattern($1, tmpfs_t, tmpfs_t) ++ relabel_sock_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Read and write block nodes on tmpfs filesystems. ++## Delete generic files in tmpfs directory. + ## + ## + ## +@@ -4248,18 +5675,19 @@ interface(`fs_relabel_tmpfs_chr_file',` + ## + ## + # +-interface(`fs_rw_tmpfs_blk_files',` ++interface(`fs_delete_tmpfs_files',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir list_dir_perms; +- rw_blk_files_pattern($1, tmpfs_t, tmpfs_t) ++ allow $1 tmpfs_t:dir del_entry_dir_perms; ++ allow $1 tmpfs_t:file_class_set delete_file_perms; + ') + + ######################################## + ## +-## Relabel block nodes on tmpfs filesystems. ++## Read and write, create and delete generic ++## files on tmpfs filesystems. + ## + ## + ## +@@ -4267,32 +5695,31 @@ interface(`fs_rw_tmpfs_blk_files',` + ## + ## + # +-interface(`fs_relabel_tmpfs_blk_file',` ++interface(`fs_manage_tmpfs_files',` + gen_require(` + type tmpfs_t; + ') + +- allow $1 tmpfs_t:dir list_dir_perms; +- relabel_blk_files_pattern($1, tmpfs_t, tmpfs_t) ++ manage_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## + ## +-## Read and write, create and delete generic +-## files on tmpfs filesystems. ++## Execute files on a tmpfs filesystem. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`fs_manage_tmpfs_files',` ++interface(`fs_exec_tmpfs_files',` + gen_require(` + type tmpfs_t; + ') + +- manage_files_pattern($1, tmpfs_t, tmpfs_t) ++ exec_files_pattern($1, tmpfs_t, tmpfs_t) + ') + + ######################################## +@@ -4407,6 +5834,25 @@ interface(`fs_search_xenfs',` + allow $1 xenfs_t:dir search_dir_perms; + ') + ++ ++######################################## ++## ++## Read files on a XENFS filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_read_xenfs_files',` ++ gen_require(` ++ type xenfs_t; ++ ') ++ ++ allow $1 xenfs_t:file read_file_perms; ++') ++ + ######################################## + ## + ## Create, read, write, and delete directories +@@ -4503,6 +5949,8 @@ interface(`fs_mount_all_fs',` + ') + + allow $1 filesystem_type:filesystem mount; ++# Mount checks write access on the dir ++ allow $1 filesystem_type:dir write; + ') + + ######################################## +@@ -4549,7 +5997,7 @@ interface(`fs_unmount_all_fs',` + ## + ##

    + ## Allow the specified domain to +-## et the attributes of all filesystems. ++## get the attributes of all filesystems. + ## Example attributes: + ##

    + ##
      +@@ -4594,6 +6042,26 @@ interface(`fs_dontaudit_getattr_all_fs',` + dontaudit $1 filesystem_type:filesystem getattr; + ') + ++######################################## ++## ++## Do not audit attempts to check the ++## access on all filesystems. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_all_access_check',` ++ gen_require(` ++ attribute filesystem_type; ++ ') ++ ++ dontaudit $1 filesystem_type:dir_file_class_set audit_access; ++') ++ ++ + ######################################## + ## + ## Get the quotas of all filesystems. +@@ -4669,6 +6137,25 @@ interface(`fs_getattr_all_dirs',` + allow $1 filesystem_type:dir getattr; + ') + ++######################################## ++## ++## Dontaudit Get the attributes of all directories ++## with a filesystem type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_dontaudit_getattr_all_dirs',` ++ gen_require(` ++ attribute filesystem_type; ++ ') ++ ++ dontaudit $1 filesystem_type:dir getattr; ++') ++ + ######################################## + ## + ## Search all directories with a filesystem type. +@@ -4912,3 +6399,174 @@ interface(`fs_unconfined',` + + typeattribute $1 filesystem_unconfined_type; + ') ++ ++######################################## ++## ++## Do not audit attempts to read or write ++## all leaked filesystems files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fs_dontaudit_leaks',` ++ gen_require(` ++ attribute filesystem_type; ++ ') ++ ++ dontaudit $1 filesystem_type:file rw_inherited_file_perms; ++ dontaudit $1 filesystem_type:lnk_file { read }; ++') ++ ++ ++######################################## ++## ++## Transition named content in tmpfs_t directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_tmpfs_filetrans_named_content',` ++ gen_require(` ++ type cgroup_t; ++ ') ++ ++ fs_tmpfs_filetrans($1, cgroup_t, lnk_file, "cpu") ++ fs_tmpfs_filetrans($1, cgroup_t, lnk_file, "cpuacct") ++') ++ ++####################################### ++## ++## Read files in efivarfs ++## - contains Linux Kernel configuration options for UEFI systems ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_read_efivarfs_files',` ++ gen_require(` ++ type efivarfs_t; ++ ') ++ ++ read_files_pattern($1, efivarfs_t, efivarfs_t) ++') ++ ++######################################## ++## ++## Read and write sockets of ONLOAD file system pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_onload_sockets',` ++ gen_require(` ++ type onload_fs_t; ++ ') ++ ++ rw_sock_files_pattern($1, onload_fs_t, onload_fs_t) ++ allow $1 onload_fs_t:sock_file ioctl; ++') ++ ++######################################## ++## ++## Read and write tracefs_t files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_rw_tracefs_files',` ++ gen_require(` ++ type tracefs_t; ++ ') ++ ++ rw_files_pattern($1, tracefs_t, tracefs_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete dirs ++## labeled as tracefs_t. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`fs_manage_tracefs_dirs',` ++ gen_require(` ++ type tracefs_t; ++ ') ++ ++ manage_dirs_pattern($1, tracefs_t, tracefs_t) ++') ++ ++######################################## ++## ++## Mount tracefs filesystems. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_mount_tracefs', ` ++ gen_require(` ++ type tracefs_t; ++ ') ++ ++ allow $1 tracefs_t:filesystem mount; ++') ++ ++######################################## ++## ++## Remount tracefs filesystems. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_remount_tracefs', ` ++ gen_require(` ++ type tracefs_t; ++ ') ++ ++ allow $1 tracefs_t:filesystem remount; ++') ++ ++######################################## ++## ++## Unmount tracefs filesystems. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fs_unmount_tracefs', ` ++ gen_require(` ++ type tracefs_t; ++ ') ++ ++ allow $1 tracefs_t:filesystem unmount; ++') +diff --git a/policy/modules/kernel/filesystem.te b/policy/modules/kernel/filesystem.te +index e7d1738445..0a6b394386 100644 +--- a/policy/modules/kernel/filesystem.te ++++ b/policy/modules/kernel/filesystem.te +@@ -17,6 +17,7 @@ attribute noxattrfs; + type fs_t; + fs_type(fs_t) + sid fs gen_context(system_u:object_r:fs_t,s0) ++typealias fs_t alias vxfs_t; + + # Use xattrs for the following filesystem types. + # Requires that a security xattr handler exist for the filesystem. +@@ -26,14 +27,22 @@ fs_use_xattr ext2 gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr ext3 gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr ext4 gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr ext4dev gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr f2fs gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr gfs gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr gfs2 gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr gpfs gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr jffs2 gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr jfs gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr lustre gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr ocfs2 gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr overlay gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr xfs gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr squashfs gen_context(system_u:object_r:fs_t,s0); + fs_use_xattr zfs gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr fuse.glusterfs gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr vxfs gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr odms gen_context(system_u:object_r:fs_t,s0); ++fs_use_xattr vxclonefs gen_context(system_u:object_r:fs_t,s0); + + # Use the allocating task SID to label inodes in the following filesystem + # types, and label the filesystem itself with the specified context. +@@ -43,6 +52,7 @@ fs_use_xattr zfs gen_context(system_u:object_r:fs_t,s0); + fs_use_task eventpollfs gen_context(system_u:object_r:fs_t,s0); + fs_use_task pipefs gen_context(system_u:object_r:fs_t,s0); + fs_use_task sockfs gen_context(system_u:object_r:fs_t,s0); ++fs_use_task nsfs gen_context(system_u:object_r:fs_t,s0); + + ############################## + # +@@ -53,6 +63,7 @@ type anon_inodefs_t; + fs_type(anon_inodefs_t) + files_mountpoint(anon_inodefs_t) + genfscon anon_inodefs / gen_context(system_u:object_r:anon_inodefs_t,s0) ++mls_trusted_object(anon_inodefs_t) + + type bdev_t; + fs_type(bdev_t) +@@ -63,12 +74,29 @@ fs_type(binfmt_misc_fs_t) + files_mountpoint(binfmt_misc_fs_t) + genfscon binfmt_misc / gen_context(system_u:object_r:binfmt_misc_fs_t,s0) + ++type bpf_t alias bpffs_t; ++fs_type(bpf_t) ++files_mountpoint(bpf_t) ++dev_associate_sysfs(bpf_t) ++genfscon bpf / gen_context(system_u:object_r:bpf_t,s0) ++ ++type oracleasmfs_t; ++fs_type(oracleasmfs_t) ++dev_node(oracleasmfs_t) ++files_mountpoint(oracleasmfs_t) ++genfscon oracleasmfs / gen_context(system_u:object_r:oracleasmfs_t,s0) ++ + type capifs_t; + fs_type(capifs_t) + files_mountpoint(capifs_t) + genfscon capifs / gen_context(system_u:object_r:capifs_t,s0) + +-type cgroup_t; ++type cephfs_t; ++fs_type(cephfs_t) ++files_mountpoint(cephfs_t) ++genfscon ceph / gen_context(system_u:object_r:cephfs_t,s0) ++ ++type cgroup_t alias cgroupfs_t; + fs_type(cgroup_t) + files_mountpoint(cgroup_t) + dev_associate_sysfs(cgroup_t) +@@ -88,6 +116,11 @@ fs_noxattr_type(ecryptfs_t) + files_mountpoint(ecryptfs_t) + genfscon ecryptfs / gen_context(system_u:object_r:ecryptfs_t,s0) + ++type efivarfs_t; ++fs_noxattr_type(efivarfs_t) ++files_mountpoint(efivarfs_t) ++genfscon efivarfs / gen_context(system_u:object_r:efivarfs_t,s0) ++ + type futexfs_t; + fs_type(futexfs_t) + genfscon futexfs / gen_context(system_u:object_r:futexfs_t,s0) +@@ -96,6 +129,7 @@ type hugetlbfs_t; + fs_type(hugetlbfs_t) + files_mountpoint(hugetlbfs_t) + fs_use_trans hugetlbfs gen_context(system_u:object_r:hugetlbfs_t,s0); ++dev_associate(hugetlbfs_t) + + type ibmasmfs_t; + fs_type(ibmasmfs_t) +@@ -118,13 +152,23 @@ genfscon mvfs / gen_context(system_u:object_r:mvfs_t,s0) + + type nfsd_fs_t; + fs_type(nfsd_fs_t) ++files_mountpoint(nfsd_fs_t) + genfscon nfsd / gen_context(system_u:object_r:nfsd_fs_t,s0) + ++type nsfs_t; ++fs_type(nsfs_t) ++genfscon nsfs / gen_context(system_u:object_r:nsfs_t,s0) ++ ++type onload_fs_t; ++fs_type(onload_fs_t) ++files_mountpoint(onload_fs_t) ++genfscon onloadfs / gen_context(system_u:object_r:onload_fs_t,s0) ++ + type oprofilefs_t; + fs_type(oprofilefs_t) + genfscon oprofilefs / gen_context(system_u:object_r:oprofilefs_t,s0) + +-type pstore_t; ++type pstore_t alias pstorefs_t; + fs_type(pstore_t) + files_mountpoint(pstore_t) + dev_associate_sysfs(pstore_t) +@@ -150,17 +194,16 @@ fs_type(spufs_t) + genfscon spufs / gen_context(system_u:object_r:spufs_t,s0) + files_mountpoint(spufs_t) + +-type squash_t; +-fs_type(squash_t) +-genfscon squash / gen_context(system_u:object_r:squash_t,s0) +-files_mountpoint(squash_t) +- + type sysv_t; + fs_noxattr_type(sysv_t) + files_mountpoint(sysv_t) + genfscon sysv / gen_context(system_u:object_r:sysv_t,s0) + genfscon v7 / gen_context(system_u:object_r:sysv_t,s0) + ++type tracefs_t; ++fs_type(tracefs_t) ++genfscon tracefs / gen_context(system_u:object_r:tracefs_t,s0) ++ + type vmblock_t; + fs_noxattr_type(vmblock_t) + files_mountpoint(vmblock_t) +@@ -168,11 +211,6 @@ genfscon vmblock / gen_context(system_u:object_r:vmblock_t,s0) + genfscon vboxsf / gen_context(system_u:object_r:vmblock_t,s0) + genfscon vmhgfs / gen_context(system_u:object_r:vmblock_t,s0) + +-type vxfs_t; +-fs_noxattr_type(vxfs_t) +-files_mountpoint(vxfs_t) +-genfscon vxfs / gen_context(system_u:object_r:vxfs_t,s0) +- + # + # tmpfs_t is the type for tmpfs filesystems + # +@@ -182,6 +220,8 @@ fs_type(tmpfs_t) + files_type(tmpfs_t) + files_mountpoint(tmpfs_t) + files_poly_parent(tmpfs_t) ++dev_associate(tmpfs_t) ++mls_trusted_object(tmpfs_t) + + # Use a transition SID based on the allocating task SID and the + # filesystem SID to label inodes in the following filesystem types, +@@ -261,6 +301,8 @@ genfscon udf / gen_context(system_u:object_r:iso9660_t,s0) + type removable_t; + allow removable_t noxattrfs:filesystem associate; + fs_noxattr_type(removable_t) ++files_type(removable_t) ++dev_node(removable_t) + files_mountpoint(removable_t) + + # +@@ -280,6 +322,7 @@ genfscon ncpfs / gen_context(system_u:object_r:nfs_t,s0) + genfscon reiserfs / gen_context(system_u:object_r:nfs_t,s0) + genfscon panfs / gen_context(system_u:object_r:nfs_t,s0) + genfscon gadgetfs / gen_context(system_u:object_r:nfs_t,s0) ++genfscon 9p / gen_context(system_u:object_r:nfs_t,s0) + + ######################################## + # +@@ -301,9 +344,10 @@ fs_associate_noxattr(noxattrfs) + # Unconfined access to this module + # + +-allow filesystem_unconfined_type filesystem_type:filesystem *; ++allow filesystem_unconfined_type filesystem_type:filesystem all_filesystem_perms; + + # Create/access other files. fs_type is to pick up various + # pseudo filesystem types that are applied to both the filesystem + # and its files. +-allow filesystem_unconfined_type filesystem_type:{ dir file lnk_file sock_file fifo_file chr_file blk_file } *; ++allow filesystem_unconfined_type filesystem_type:{ file } ~entrypoint; ++allow filesystem_unconfined_type filesystem_type:{ dir lnk_file sock_file fifo_file chr_file blk_file } *; +diff --git a/policy/modules/kernel/kernel.fc b/policy/modules/kernel/kernel.fc +index 7be4ddf74d..9710b33366 100644 +--- a/policy/modules/kernel/kernel.fc ++++ b/policy/modules/kernel/kernel.fc +@@ -1 +1,5 @@ +-# This module currently does not have any file contexts. ++ ++/sys/class/net/ib.* -- gen_context(system_u:object_r:sysctl_net_t,s0) ++/sys/kernel/uevent_helper -- gen_context(system_u:object_r:usermodehelper_t,s0) ++/sys/kernel/debug -d gen_context(system_u:object_r:debugfs_t,s0) ++/sys/kernel/debug/.* <> +diff --git a/policy/modules/kernel/kernel.if b/policy/modules/kernel/kernel.if +index e100d886b4..e33ae34186 100644 +--- a/policy/modules/kernel/kernel.if ++++ b/policy/modules/kernel/kernel.if +@@ -124,6 +124,24 @@ interface(`kernel_setsched',` + allow $1 kernel_t:process setsched; + ') + ++######################################## ++## ++## Dontaudit attempts to set the priority of kernel threads. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_dontaudit_setsched',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ dontaudit $1 kernel_t:process setsched; ++') ++ + ######################################## + ## + ## Send a SIGCHLD signal to kernel threads. +@@ -178,6 +196,24 @@ interface(`kernel_signal',` + allow $1 kernel_t:process signal; + ') + ++######################################## ++## ++## Send signull to kernel threads. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_signull',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:process signull; ++') ++ + ######################################## + ## + ## Allows the kernel to share state information with +@@ -286,7 +322,7 @@ interface(`kernel_rw_unix_dgram_sockets',` + type kernel_t; + ') + +- allow $1 kernel_t:unix_dgram_socket { read write ioctl }; ++ allow $1 kernel_t:unix_dgram_socket { getattr read write ioctl }; + ') + + ######################################## +@@ -762,8 +798,8 @@ interface(`kernel_manage_debugfs',` + ') + + manage_files_pattern($1, debugfs_t, debugfs_t) ++ manage_dirs_pattern($1,debugfs_t, debugfs_t) + read_lnk_files_pattern($1, debugfs_t, debugfs_t) +- list_dirs_pattern($1, debugfs_t, debugfs_t) + ') + + ######################################## +@@ -784,6 +820,24 @@ interface(`kernel_mount_kvmfs',` + allow $1 kvmfs_t:filesystem mount; + ') + ++######################################## ++## ++## Mount the proc filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_mount_proc',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ allow $1 proc_t:filesystem mount; ++') ++ + ######################################## + ## + ## Unmount the proc filesystem. +@@ -802,6 +856,24 @@ interface(`kernel_unmount_proc',` + allow $1 proc_t:filesystem unmount; + ') + ++######################################## ++## ++## Mounton a proc filesystem. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_mounton_proc',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ allow $1 proc_t:dir mounton; ++') ++ + ######################################## + ## + ## Get the attributes of the proc filesystem. +@@ -839,6 +911,25 @@ interface(`kernel_dontaudit_setattr_proc_dirs',` + dontaudit $1 proc_t:dir setattr; + ') + ++######################################## ++## ++## Do not audit attempts to set the ++## attributes of files in /proc. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kernel_dontaudit_setattr_proc_files',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ dontaudit $1 proc_t:file setattr; ++') ++ + ######################################## + ## + ## Search directories in /proc. +@@ -991,13 +1082,10 @@ interface(`kernel_read_proc_symlinks',` + # + interface(`kernel_read_system_state',` + gen_require(` +- type proc_t; ++ attribute kernel_system_state_reader; + ') + +- read_files_pattern($1, proc_t, proc_t) +- read_lnk_files_pattern($1, proc_t, proc_t) +- +- list_dirs_pattern($1, proc_t, proc_t) ++ typeattribute $1 kernel_system_state_reader; + ') + + ######################################## +@@ -1023,6 +1111,44 @@ interface(`kernel_write_proc_files',` + write_files_pattern($1, proc_t, proc_t) + ') + ++######################################## ++## ++## Do not audit attempts to write the ++## file in /proc. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kernel_dontaudit_write_proc_files',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ dontaudit $1 proc_t:file write; ++') ++ ++######################################## ++## ++## Do not audit attempts to check the ++## access on generic proc entries. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kernel_dontaudit_access_check_proc',` ++ gen_require(` ++ type proc_t; ++ ') ++ ++ dontaudit $1 proc_t:dir_file_class_set audit_access; ++') ++ + ######################################## + ## + ## Do not audit attempts by caller to +@@ -1061,6 +1187,26 @@ interface(`kernel_dontaudit_read_proc_symlinks',` + dontaudit $1 proc_t:lnk_file read; + ') + ++####################################### ++## ++## Allow caller to read state information for AFS. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_read_afs_state',` ++ gen_require(` ++ type proc_t, proc_afs_t; ++ ') ++ ++ list_dirs_pattern($1, proc_t, proc_t) ++ read_files_pattern($1, proc_afs_t, proc_afs_t) ++') ++ + ####################################### + ## + ## Allow caller to read and write state information for AFS. +@@ -1206,6 +1352,24 @@ interface(`kernel_read_messages',` + typeattribute $1 can_receive_kernel_messages; + ') + ++######################################## ++## ++## Allow caller to mounton the kernel messages file ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_mounton_messages',` ++ gen_require(` ++ type proc_kmsg_t; ++ ') ++ ++ allow $1 proc_kmsg_t:file mounton; ++') ++ + ######################################## + ## + ## Allow caller to get the attributes of kernel message +@@ -1456,6 +1620,25 @@ interface(`kernel_list_all_proc',` + allow $1 proc_type:file getattr; + ') + ++######################################## ++## ++## Allow attempts to mounton all proc directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_mounton_all_proc',` ++ gen_require(` ++ attribute proc_type; ++ ') ++ ++ allow $1 proc_type:dir mounton; ++ allow $1 proc_type:file mounton; ++') ++ + ######################################## + ## + ## Do not audit attempts to list all proc directories. +@@ -1475,6 +1658,24 @@ interface(`kernel_dontaudit_list_all_proc',` + dontaudit $1 proc_type:file getattr; + ') + ++######################################## ++## ++## Allow attempts to read all proc types. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_all_proc',` ++ gen_require(` ++ attribute proc_type; ++ ') ++ ++ read_files_pattern($1, proc_type, proc_type) ++') ++ + ######################################## + ## + ## Do not audit attempts by caller to search +@@ -1672,7 +1873,7 @@ interface(`kernel_read_net_sysctls',` + ') + + read_files_pattern($1, { proc_t sysctl_t sysctl_net_t }, sysctl_net_t) +- ++ read_lnk_files_pattern($1, { proc_t sysctl_t sysctl_net_t }, sysctl_net_t) + list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_net_t) + ') + +@@ -1693,7 +1894,7 @@ interface(`kernel_rw_net_sysctls',` + ') + + rw_files_pattern($1, { proc_t sysctl_t sysctl_net_t }, sysctl_net_t) +- ++ read_lnk_files_pattern($1, { proc_t sysctl_t sysctl_net_t }, sysctl_net_t) + list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_net_t) + ') + +@@ -1715,7 +1916,6 @@ interface(`kernel_read_unix_sysctls',` + ') + + read_files_pattern($1, { proc_t sysctl_t sysctl_net_t }, sysctl_net_unix_t) +- + list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_net_t) + ') + +@@ -1750,16 +1950,9 @@ interface(`kernel_rw_unix_sysctls',` + ## Domain allowed access. + ## + ## +-## + # + interface(`kernel_read_hotplug_sysctls',` +- gen_require(` +- type proc_t, sysctl_t, sysctl_kernel_t, sysctl_hotplug_t; +- ') +- +- read_files_pattern($1, { proc_t sysctl_t sysctl_kernel_t }, sysctl_hotplug_t) +- +- list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_kernel_t) ++ refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## +@@ -1771,16 +1964,9 @@ interface(`kernel_read_hotplug_sysctls',` + ## Domain allowed access. + ## + ## +-## + # + interface(`kernel_rw_hotplug_sysctls',` +- gen_require(` +- type proc_t, sysctl_t, sysctl_kernel_t, sysctl_hotplug_t; +- ') +- +- rw_files_pattern($1, { proc_t sysctl_t sysctl_kernel_t }, sysctl_hotplug_t) +- +- list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_kernel_t) ++ refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## +@@ -1792,16 +1978,9 @@ interface(`kernel_rw_hotplug_sysctls',` + ## Domain allowed access. + ## + ## +-## + # + interface(`kernel_read_modprobe_sysctls',` +- gen_require(` +- type proc_t, sysctl_t, sysctl_kernel_t, sysctl_modprobe_t; +- ') +- +- read_files_pattern($1, { proc_t sysctl_t sysctl_kernel_t }, sysctl_modprobe_t) +- +- list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_kernel_t) ++ refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## +@@ -1813,16 +1992,9 @@ interface(`kernel_read_modprobe_sysctls',` + ## Domain allowed access. + ## + ## +-## + # + interface(`kernel_rw_modprobe_sysctls',` +- gen_require(` +- type proc_t, sysctl_t, sysctl_kernel_t, sysctl_modprobe_t; +- ') +- +- rw_files_pattern($1, { proc_t sysctl_t sysctl_kernel_t }, sysctl_modprobe_t) +- +- list_dirs_pattern($1, { proc_t sysctl_t }, sysctl_kernel_t) ++ refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## +@@ -2048,6 +2220,26 @@ interface(`kernel_read_rpc_sysctls',` + list_dirs_pattern($1, { proc_t proc_net_t }, sysctl_rpc_t) + ') + ++ ++######################################## ++## ++## Read RPC sysctls. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_rw_rpc_sysctls_dirs',` ++ gen_require(` ++ type proc_t, proc_net_t, sysctl_rpc_t; ++ ') ++ ++ rw_dirs_pattern($1, { proc_t proc_net_t }, sysctl_rpc_t) ++') ++ + ######################################## + ## + ## Read and write RPC sysctls. +@@ -2069,6 +2261,26 @@ interface(`kernel_rw_rpc_sysctls',` + list_dirs_pattern($1, { proc_t proc_net_t }, sysctl_rpc_t) + ') + ++######################################## ++## ++## Read and write RPC sysctls. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_create_rpc_sysctls',` ++ gen_require(` ++ type proc_t, proc_net_t, sysctl_rpc_t; ++ ') ++ ++ create_files_pattern($1, { proc_t proc_net_t sysctl_rpc_t }, sysctl_rpc_t) ++ ++') ++ + ######################################## + ## + ## Do not audit attempts to list all sysctl directories. +@@ -2085,9 +2297,28 @@ interface(`kernel_dontaudit_list_all_sysctls',` + ') + + dontaudit $1 sysctl_type:dir list_dir_perms; +- dontaudit $1 sysctl_type:file getattr; ++ dontaudit $1 sysctl_type:file read_file_perms; ++') ++ ++######################################## ++## ++## Allow attempts to mounton all sysctl directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_mounton_all_sysctls',` ++ gen_require(` ++ attribute sysctl_type; ++ ') ++ ++ allow $1 sysctl_type:dir mounton; + ') + ++ + ######################################## + ## + ## Allow caller to read all sysctls. +@@ -2282,7 +2513,7 @@ interface(`kernel_list_unlabeled',` + + ######################################## + ## +-## Read the process state (/proc/pid) of all unlabeled_t. ++## Delete unlabeled files + ## + ## + ## +@@ -2290,12 +2521,31 @@ interface(`kernel_list_unlabeled',` + ## + ## + # +-interface(`kernel_read_unlabeled_state',` ++interface(`kernel_delete_unlabeled',` + gen_require(` + type unlabeled_t; + ') + +- allow $1 unlabeled_t:dir list_dir_perms; ++ allow $1 unlabeled_t:dir delete_dir_perms; ++ allow $1 unlabeled_t:dir_file_class_set delete_file_perms; ++') ++ ++######################################## ++## ++## Read the process state (/proc/pid) of all unlabeled_t. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_unlabeled_state',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir list_dir_perms; + read_files_pattern($1, unlabeled_t, unlabeled_t) + read_lnk_files_pattern($1, unlabeled_t, unlabeled_t) + ') +@@ -2306,7 +2556,7 @@ interface(`kernel_read_unlabeled_state',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -2486,6 +2736,24 @@ interface(`kernel_rw_unlabeled_blk_files',` + allow $1 unlabeled_t:blk_file getattr; + ') + ++######################################## ++## ++## Read and write unlabeled sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_rw_unlabeled_socket',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:socket rw_socket_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts by caller to get attributes for +@@ -2523,6 +2791,24 @@ interface(`kernel_relabelfrom_unlabeled_dirs',` + allow $1 unlabeled_t:dir { list_dir_perms relabelfrom }; + ') + ++######################################## ++## ++## Allow caller to relabel unlabeled filesystems. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_relabelfrom_unlabeled_fs',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:filesystem relabelfrom; ++') ++ + ######################################## + ## + ## Allow caller to relabel unlabeled files. +@@ -2665,6 +2951,24 @@ interface(`kernel_dontaudit_sendrecv_unlabeled_association',` + dontaudit $1 unlabeled_t:association { sendto recvfrom }; + ') + ++######################################## ++## ++## Receive DCCP packets from an unlabeled connection. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_dccp_recvfrom_unlabeled',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dccp_socket recvfrom; ++') ++ + ######################################## + ## + ## Receive TCP packets from an unlabeled connection. +@@ -2692,6 +2996,25 @@ interface(`kernel_tcp_recvfrom_unlabeled',` + allow $1 unlabeled_t:tcp_socket recvfrom; + ') + ++######################################## ++## ++## Do not audit attempts to receive DCCP packets from an unlabeled ++## connection. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kernel_dontaudit_dccp_recvfrom_unlabeled',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ dontaudit $1 unlabeled_t:dccp_socket recvfrom; ++') ++ + ######################################## + ## + ## Do not audit attempts to receive TCP packets from an unlabeled +@@ -2803,6 +3126,33 @@ interface(`kernel_raw_recvfrom_unlabeled',` + + allow $1 unlabeled_t:rawip_socket recvfrom; + ') ++######################################## ++## ++## Read/Write Raw IP packets from an unlabeled connection. ++## ++## ++##

      ++## Receive Raw IP packets from an unlabeled connection. ++##

      ++##

      ++## The corenetwork interface corenet_raw_recv_unlabeled() should ++## be used instead of this one. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_rw_unlabeled_rawip_socket',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:rawip_socket rw_socket_perms; ++') ++ + + ######################################## + ## +@@ -2956,6 +3306,24 @@ interface(`kernel_relabelfrom_unlabeled_database',` + allow $1 unlabeled_t:db_blob { setattr relabelfrom }; + ') + ++######################################## ++## ++## Relabel to unlabeled context . ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_relabelto_unlabeled',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:dir_file_class_set relabelto; ++') ++ + ######################################## + ## + ## Unconfined access to kernel module resources. +@@ -2972,5 +3340,701 @@ interface(`kernel_unconfined',` + ') + + typeattribute $1 kern_unconfined; +- kernel_load_module($1) ++ kernel_load_module($1) ++') ++ ++######################################## ++## ++## Allow the specified domain to getattr on ++## the kernel with a unix socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_stream_read',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:unix_stream_socket { read getattr }; ++') ++ ++####################################### ++## ++## Allow the specified domain to write on ++## the kernel with a unix socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_stream_write',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:unix_stream_socket { write getattr }; ++') ++ ++####################################### ++## ++## Allow the specified domain to read/write on ++## the kernel with a unix socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_rw_stream_socket_perms',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:unix_stream_socket rw_socket_perms; ++ allow $1 kernel_t:fd use; ++') ++ ++######################################## ++## ++## Make the specified type usable for regular entries in proc ++## ++## ++## ++## Type to be used for /proc entries. ++## ++## ++# ++interface(`kernel_proc_type',` ++ gen_require(` ++ attribute proc_type; ++ ') ++ ++ typeattribute $1 proc_type; ++') ++ ++######################################## ++## ++## Do not audit attempts by caller to get attributes on all sysctls. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kernel_dontaudit_getattr_all_sysctls',` ++ gen_require(` ++ attribute sysctl_type; ++ ') ++ ++ dontaudit $1 sysctl_type:file getattr; ++') ++ ++######################################## ++## ++## Read the process state (/proc/pid) of the kernel. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_state',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:dir search_dir_perms; ++ allow $1 kernel_t:file read_file_perms; ++ allow $1 kernel_t:lnk_file read_lnk_file_perms; ++') ++ ++######################################## ++## ++## Dontaudit attempts to read the process state (/proc/pid) of the kernel. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_dontaudit_read_state',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ dontaudit $1 kernel_t:dir search_dir_perms; ++ dontaudit $1 kernel_t:file read_file_perms; ++ dontaudit $1 kernel_t:lnk_file read_lnk_file_perms; ++') ++ ++######################################## ++## ++## Allow searching of numa state directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_search_numa_state',` ++ gen_require(` ++ type proc_t, proc_numa_t; ++ ') ++ ++ search_dirs_pattern($1, proc_t, proc_numa_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to search the numa ++## state directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`kernel_dontaudit_search_numa_state',` ++ gen_require(` ++ type proc_numa_t; ++ ') ++ ++ dontaudit $1 proc_numa_t:dir search; ++') ++ ++######################################## ++## ++## Allow caller to read the numa state information. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_read_numa_state',` ++ gen_require(` ++ type proc_t, proc_numa_t; ++ ') ++ ++ read_files_pattern($1, { proc_t proc_numa_t }, proc_numa_t) ++ read_lnk_files_pattern($1, { proc_t proc_numa_t }, proc_numa_t) ++ ++ list_dirs_pattern($1, proc_t, proc_numa_t) ++') ++ ++######################################## ++## ++## Allow caller to read the numa state symbolic links. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_read_numa_state_symlinks',` ++ gen_require(` ++ type proc_t, proc_numa_t; ++ ') ++ ++ read_lnk_files_pattern($1, { proc_t proc_numa_t }, proc_numa_t) ++ ++ list_dirs_pattern($1, proc_t, proc_numa_t) ++') ++ ++######################################## ++## ++## Allow caller to write numa state information. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_write_numa_state',` ++ gen_require(` ++ type proc_t, proc_numa_t; ++ ') ++ ++ write_files_pattern($1, { proc_t proc_numa_t }, proc_numa_t) ++') ++ ++######################################## ++## ++## Allow caller to search virtual memory overcommit sysctls. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_search_vm_overcommit_sysctl',` ++ gen_require(` ++ type sysctl_vm_overcommit_t; ++ ') ++ ++ kernel_search_vm_sysctl($1) ++ search_dirs_pattern($1, sysctl_vm_overcommit_t, sysctl_vm_overcommit_t) ++') ++ ++######################################## ++## ++## Allow caller to read virtual memory overcommit sysctls. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_read_vm_overcommit_sysctls',` ++ gen_require(` ++ type sysctl_vm_overcommit_t; ++ ') ++ ++ kernel_search_vm_sysctl($1) ++ read_files_pattern($1, sysctl_vm_overcommit_t, sysctl_vm_overcommit_t) ++') ++ ++######################################## ++## ++## Read and write virtual memory overcommit sysctls. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_rw_vm_overcommit_sysctls',` ++ gen_require(` ++ type sysctl_vm_overcommit_t; ++ ') ++ ++ kernel_search_vm_sysctl($1) ++ rw_files_pattern($1, sysctl_vm_overcommit_t, sysctl_vm_overcommit_t) ++ list_dirs_pattern($1, sysctl_vm_overcommit_t, sysctl_vm_overcommit_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to search the security ++## state directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`kernel_dontaudit_search_security_state',` ++ gen_require(` ++ type proc_security_t; ++ ') ++ ++ dontaudit $1 proc_security_t:dir search; ++') ++ ++######################################## ++## ++## Allow searching of security state directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_search_security_state',` ++ gen_require(` ++ type proc_security_t; ++ ') ++ ++ search_dirs_pattern($1, proc_t, proc_security_t) ++') ++ ++######################################## ++## ++## Read the security state information. ++## ++## ++##

      ++## Allow the specified domain to read the security ++## state information. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++# ++interface(`kernel_read_security_state',` ++ gen_require(` ++ type proc_t, proc_security_t; ++ attribute sysctl_type; ++ ') ++ ++ read_files_pattern($1, { proc_t proc_security_t }, proc_security_t) ++ read_lnk_files_pattern($1, { proc_t proc_security_t }, proc_security_t) ++ ++ list_dirs_pattern($1, proc_t, proc_security_t) ++ allow $1 sysctl_type:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Write the security state information. ++## ++## ++##

      ++## Allow the specified domain to write the security ++## state information. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++# ++interface(`kernel_write_security_state',` ++ gen_require(` ++ type proc_t, proc_security_t; ++ ') ++ ++ write_files_pattern($1, { proc_t proc_security_t }, proc_security_t) ++') ++ ++######################################## ++## ++## Allow caller to read the security state symbolic links. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_security_state_symlinks',` ++ gen_require(` ++ type proc_t, proc_security_t; ++ ') ++ ++ read_lnk_files_pattern($1, { proc_t proc_security_t }, proc_security_t) ++ ++ list_dirs_pattern($1, proc_t, proc_security_t) ++') ++ ++######################################## ++## ++## Access unlabeled infiniband pkeys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_ib_access_unlabeled_pkeys',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:infiniband_pkey access; ++') ++ ++######################################## ++## ++## Manage subnet on unlabeled Infiniband endports. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_ib_manage_subnet_unlabeled_endports',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ allow $1 unlabeled_t:infiniband_endport manage_subnet; ++') ++ ++######################################## ++## ++## Allow caller to read the security state symbolic links. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_rw_security_state',` ++ gen_require(` ++ type proc_t, proc_security_t; ++ ') ++ ++ rw_files_pattern($1, { proc_t proc_security_t }, proc_security_t) ++ ++ list_dirs_pattern($1, proc_t, proc_security_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to search the usermodehelper ++## state directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`kernel_dontaudit_search_usermodehelper_state',` ++ gen_require(` ++ type usermodehelper_t; ++ ') ++ ++ dontaudit $1 usermodehelper_t:dir search; ++') ++ ++######################################## ++## ++## Allow searching of usermodehelper state directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_search_usermodehelper_state',` ++ gen_require(` ++ type usermodehelper_t; ++ ') ++ ++ search_dirs_pattern($1, proc_t, usermodehelper_t) ++') ++ ++######################################## ++## ++## Read the usermodehelper state information. ++## ++## ++##

      ++## Allow the specified domain to read the usermodehelpering ++## state information. This includes several pieces ++## of usermodehelpering information, such as usermodehelper interface ++## names, usermodehelperfilter (iptables) statistics, protocol ++## information, routes, and remote procedure call (RPC) ++## information. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++# ++interface(`kernel_read_usermodehelper_state',` ++ gen_require(` ++ type proc_t, usermodehelper_t; ++ ') ++ ++ read_files_pattern($1, { proc_t usermodehelper_t }, usermodehelper_t) ++ read_lnk_files_pattern($1, { proc_t usermodehelper_t }, usermodehelper_t) ++ ++ list_dirs_pattern($1, proc_t, usermodehelper_t) ++') ++ ++######################################## ++## ++## Allow caller to read the usermodehelper state symbolic links. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_usermodehelper_state_symlinks',` ++ gen_require(` ++ type proc_t, usermodehelper_t; ++ ') ++ ++ read_lnk_files_pattern($1, { proc_t usermodehelper_t }, usermodehelper_t) ++ ++ list_dirs_pattern($1, proc_t, usermodehelper_t) ++') ++ ++######################################## ++## ++## Read and write usermodehelper state ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`kernel_rw_usermodehelper_state',` ++ gen_require(` ++ type proc_t, usermodehelper_t; ++ ') ++ ++ dev_search_sysfs($1) ++ rw_files_pattern($1, proc_t, usermodehelper_t) ++ list_dirs_pattern($1, proc_t, usermodehelper_t) ++') ++ ++######################################## ++## ++## Relabel to usermodehelper context . ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_relabelto_usermodehelper',` ++ gen_require(` ++ type usermodehelper_t; ++ ') ++ ++ allow $1 usermodehelper_t:file relabelto; ++') ++ ++######################################## ++## ++## Relabel from usermodehelper context . ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_relabelfrom_usermodehelper',` ++ gen_require(` ++ type usermodehelper_t; ++ ') ++ ++ allow $1 usermodehelper_t:file { getattr relabelfrom }; ++') ++ ++######################################## ++## ++## Read netlink audit socket ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_read_netlink_audit_socket',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:netlink_audit_socket r_netlink_socket_perms; ++') ++ ++######################################## ++## ++## Execute an unlabeled file in the specified domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`kernel_unlabeled_domtrans',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ read_lnk_files_pattern($1, unlabeled_t, unlabeled_t) ++ domain_transition_pattern($1, unlabeled_t, $2) ++ type_transition $1 unlabeled_t:process $2; ++') ++ ++######################################## ++## ++## Make general progams without labeles an entrypoint for ++## the specified domain. ++## ++## ++## ++## The domain for which unlabeled_t is an entrypoint. ++## ++## ++# ++interface(`kernel_unlabeled_entry_type',` ++ gen_require(` ++ type unlabeled_t; ++ ') ++ ++ domain_entry_file($1, unlabeled_t) ++') ++ ++######################################## ++## ++## Allow view the kernel key ring. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kernel_view_key',` ++ gen_require(` ++ type kernel_t; ++ ') ++ ++ allow $1 kernel_t:key view; + ') +diff --git a/policy/modules/kernel/kernel.te b/policy/modules/kernel/kernel.te +index 8dbab4c5eb..36a42c0607 100644 +--- a/policy/modules/kernel/kernel.te ++++ b/policy/modules/kernel/kernel.te +@@ -25,6 +25,9 @@ attribute kern_unconfined; + # regular entries in proc + attribute proc_type; + ++# attribute for domains which read proc_t ++attribute kernel_system_state_reader; ++ + # sysctls + attribute sysctl_type; + +@@ -48,6 +51,7 @@ ifdef(`enable_mls',` + type kernel_t, can_load_kernmodule; + domain_base_type(kernel_t) + mls_rangetrans_source(kernel_t) ++mls_trusted_object(kernel_t) + role system_r types kernel_t; + sid kernel gen_context(system_u:system_r:kernel_t,mls_systemhigh) + +@@ -58,6 +62,8 @@ sid kernel gen_context(system_u:system_r:kernel_t,mls_systemhigh) + type debugfs_t; + files_mountpoint(debugfs_t) + fs_type(debugfs_t) ++dev_associate_sysfs(debugfs_t) ++ + allow debugfs_t self:filesystem associate; + genfscon debugfs / gen_context(system_u:object_r:debugfs_t,s0) + +@@ -95,9 +101,32 @@ genfscon proc /kcore gen_context(system_u:object_r:proc_kcore_t,mls_systemhigh) + type proc_mdstat_t, proc_type; + genfscon proc /mdstat gen_context(system_u:object_r:proc_mdstat_t,s0) + ++type proc_numa_t, proc_type; ++genfscon proc /numatools gen_context(system_u:object_r:proc_numa_t,s0) ++mls_trusted_object(proc_numa_t) ++ + type proc_net_t, proc_type; + genfscon proc /net gen_context(system_u:object_r:proc_net_t,s0) + ++type proc_security_t, proc_type; ++genfscon proc /sys/fs/protected_hardlinks gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/fs/protected_symlinks gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/fs/suid_dumpable gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/kernel/dmesg_restrict gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/kernel/kptr_restrict gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/kernel/modules_disabled gen_context(system_u:object_r:proc_security_t,s0) ++genfscon proc /sys/kernel/randomize_va_space gen_context(system_u:object_r:proc_security_t,s0) ++ ++type usermodehelper_t, proc_type, sysctl_type; ++typealias usermodehelper_t alias sysctl_hotplug_t; ++typealias usermodehelper_t alias sysctl_modprobe_t; ++dev_associate_sysfs(usermodehelper_t) ++genfscon proc /sys/kernel/core_pattern gen_context(system_u:object_r:usermodehelper_t,s0) ++genfscon proc /sys/kernel/hotplug gen_context(system_u:object_r:usermodehelper_t,s0) ++genfscon proc /sys/kernel/modprobe gen_context(system_u:object_r:usermodehelper_t,s0) ++genfscon proc /sys/kernel/poweroff_cmd gen_context(system_u:object_r:usermodehelper_t,s0) ++genfscon proc /sys/kernel/usermodehelper gen_context(system_u:object_r:usermodehelper_t,s0) ++ + type proc_xen_t, proc_type; + files_mountpoint(proc_xen_t) + genfscon proc /xen gen_context(system_u:object_r:proc_xen_t,s0) +@@ -114,10 +143,12 @@ genfscon proc /sys gen_context(system_u:object_r:sysctl_t,s0) + + # /proc/irq directory and files + type sysctl_irq_t, sysctl_type; ++fs_associate_proc(sysctl_irq_t) + genfscon proc /irq gen_context(system_u:object_r:sysctl_irq_t,s0) + + # /proc/net/rpc directory and files + type sysctl_rpc_t, sysctl_type; ++fs_associate_proc(sysctl_rpc_t) + genfscon proc /net/rpc gen_context(system_u:object_r:sysctl_rpc_t,s0) + + # /proc/sys/crypto directory and files +@@ -131,16 +162,9 @@ genfscon proc /sys/fs gen_context(system_u:object_r:sysctl_fs_t,s0) + + # /proc/sys/kernel directory and files + type sysctl_kernel_t, sysctl_type; ++fs_associate(sysctl_kernel_t) + genfscon proc /sys/kernel gen_context(system_u:object_r:sysctl_kernel_t,s0) + +-# /proc/sys/kernel/modprobe file +-type sysctl_modprobe_t, sysctl_type; +-genfscon proc /sys/kernel/modprobe gen_context(system_u:object_r:sysctl_modprobe_t,s0) +- +-# /proc/sys/kernel/hotplug file +-type sysctl_hotplug_t, sysctl_type; +-genfscon proc /sys/kernel/hotplug gen_context(system_u:object_r:sysctl_hotplug_t,s0) +- + # /proc/sys/net directory and files + type sysctl_net_t, sysctl_type; + genfscon proc /sys/net gen_context(system_u:object_r:sysctl_net_t,s0) +@@ -153,6 +177,10 @@ genfscon proc /sys/net/unix gen_context(system_u:object_r:sysctl_net_unix_t,s0) + type sysctl_vm_t, sysctl_type; + genfscon proc /sys/vm gen_context(system_u:object_r:sysctl_vm_t,s0) + ++# /proc/sys/vm/overcommit_memory ++type sysctl_vm_overcommit_t, sysctl_type; ++genfscon proc /sys/vm/overcommit_memory gen_context(system_u:object_r:sysctl_vm_overcommit_t,s0) ++ + # /proc/sys/dev directory and files + type sysctl_dev_t, sysctl_type; + genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) +@@ -165,6 +193,14 @@ genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) + type unlabeled_t; + fs_associate(unlabeled_t) + sid unlabeled gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) ++allow unlabeled_t self:filesystem associate; ++ ++# Need the following because we are type alias of file_t. ++files_mountpoint(unlabeled_t) ++files_base_file(unlabeled_t) ++kernel_rootfs_mountpoint(unlabeled_t) ++sid file gen_context(system_u:object_r:unlabeled_t,s0) ++typealias unlabeled_t alias file_t; + + # These initial sids are no longer used, and can be removed: + sid any_socket gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) +@@ -189,6 +225,7 @@ sid tcp_socket gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) + # kernel local policy + # + ++allow kernel_t self:capability2 mac_admin; + allow kernel_t self:capability ~sys_module; + allow kernel_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow kernel_t self:shm create_shm_perms; +@@ -233,7 +270,6 @@ allow unlabeled_t unlabeled_t:packet { forward_in forward_out }; + corenet_in_generic_if(unlabeled_t) + corenet_in_generic_node(unlabeled_t) + +-corenet_all_recvfrom_unlabeled(kernel_t) + corenet_all_recvfrom_netlabel(kernel_t) + # Kernel-generated traffic e.g., ICMP replies: + corenet_raw_sendrecv_all_if(kernel_t) +@@ -244,17 +280,26 @@ corenet_tcp_sendrecv_all_if(kernel_t) + corenet_tcp_sendrecv_all_nodes(kernel_t) + corenet_raw_send_generic_node(kernel_t) + corenet_send_all_packets(kernel_t) ++corenet_filetrans_all_named_dev(kernel_t) ++ ++corenet_ib_access_all_pkeys(kernel_t) ++corenet_ib_access_unlabeled_pkeys(kernel_t) ++corenet_ib_manage_subnet_all_endports(kernel_t) ++corenet_ib_manage_subnet_unlabeled_endports(kernel_t) + + dev_read_sysfs(kernel_t) + dev_search_usbfs(kernel_t) + # devtmpfs handling: + dev_create_generic_dirs(kernel_t) + dev_delete_generic_dirs(kernel_t) +-dev_create_generic_blk_files(kernel_t) +-dev_delete_generic_blk_files(kernel_t) +-dev_create_generic_chr_files(kernel_t) +-dev_delete_generic_chr_files(kernel_t) ++dev_create_all_blk_files(kernel_t) ++dev_delete_all_blk_files(kernel_t) ++dev_create_all_chr_files(kernel_t) ++dev_delete_all_chr_files(kernel_t) + dev_mounton(kernel_t) ++dev_filetrans_all_named_dev(kernel_t) ++storage_filetrans_all_named_dev(kernel_t) ++term_filetrans_all_named_dev(kernel_t) + + # Mount root file system. Used when loading a policy + # from initrd, then mounting the root filesystem +@@ -263,7 +308,8 @@ fs_unmount_all_fs(kernel_t) + + selinux_load_policy(kernel_t) + +-term_use_console(kernel_t) ++term_use_all_terms(kernel_t) ++term_use_ptmx(kernel_t) + + corecmd_exec_shell(kernel_t) + corecmd_list_bin(kernel_t) +@@ -277,25 +323,54 @@ files_list_root(kernel_t) + files_list_etc(kernel_t) + files_list_home(kernel_t) + files_read_usr_files(kernel_t) ++files_manage_mounttab(kernel_t) ++files_manage_generic_spool_dirs(kernel_t) + + mcs_process_set_categories(kernel_t) ++mcs_file_read_all(kernel_t) ++mcs_file_write_all(kernel_t) ++mcs_socket_write_all_levels(kernel_t) + + mls_process_read_up(kernel_t) + mls_process_write_down(kernel_t) ++mls_file_downgrade(kernel_t) + mls_file_write_all_levels(kernel_t) + mls_file_read_all_levels(kernel_t) ++mls_socket_write_all_levels(kernel_t) ++mls_fd_share_all_levels(kernel_t) ++mls_fd_use_all_levels(kernel_t) ++mls_process_set_level(kernel_t) + + ifdef(`distro_redhat',` + # Bugzilla 222337 + fs_rw_tmpfs_chr_files(kernel_t) + ') + ++ ++optional_policy(` ++ abrt_filetrans_named_content(kernel_t) ++ abrt_dump_oops_domtrans(kernel_t) ++') ++ ++optional_policy(` ++ apache_filetrans_home_content(kernel_t) ++') ++ ++optional_policy(` ++ gnome_filetrans_home_content(kernel_t) ++') ++ ++optional_policy(` ++ kerberos_filetrans_home_content(kernel_t) ++') ++ + optional_policy(` + hotplug_search_config(kernel_t) + ') + + optional_policy(` + init_sigchld(kernel_t) ++ init_dyntrans(kernel_t) + ') + + optional_policy(` +@@ -305,12 +380,30 @@ optional_policy(` + + optional_policy(` + logging_send_syslog_msg(kernel_t) ++ logging_manage_generic_logs(kernel_t) ++') ++ ++optional_policy(` ++ mta_filetrans_home_content(kernel_t) ++') ++ ++optional_policy(` ++ ssh_filetrans_home_content(kernel_t) ++') ++ ++optional_policy(` ++ userdom_user_home_dir_filetrans_user_home_content(kernel_t, { file dir }) + ') + + optional_policy(` + nis_use_ypbind(kernel_t) + ') + ++optional_policy(` ++ plymouthd_create_log(kernel_t) ++ plymouthd_filetrans_named_content(kernel_t) ++') ++ + optional_policy(` + # nfs kernel server needs kernel UDP access. It is less risky and painful + # to just give it everything. +@@ -332,9 +425,6 @@ optional_policy(` + + sysnet_read_config(kernel_t) + +- rpc_manage_nfs_ro_content(kernel_t) +- rpc_manage_nfs_rw_content(kernel_t) +- rpc_tcp_rw_nfs_sockets(kernel_t) + rpc_udp_rw_nfs_sockets(kernel_t) + + tunable_policy(`nfs_export_all_ro',` +@@ -343,9 +433,7 @@ optional_policy(` + fs_read_noxattr_fs_files(kernel_t) + fs_read_noxattr_fs_symlinks(kernel_t) + +- files_list_non_auth_dirs(kernel_t) +- files_read_non_auth_files(kernel_t) +- files_read_non_auth_symlinks(kernel_t) ++ files_read_non_security_files(kernel_t) + ') + + tunable_policy(`nfs_export_all_rw',` +@@ -354,7 +442,7 @@ optional_policy(` + fs_read_noxattr_fs_files(kernel_t) + fs_read_noxattr_fs_symlinks(kernel_t) + +- files_manage_non_auth_files(kernel_t) ++ files_manage_non_security_files(kernel_t) + ') + ') + +@@ -367,6 +455,15 @@ optional_policy(` + unconfined_domain_noaudit(kernel_t) + ') + ++optional_policy(` ++ virt_filetrans_home_content(kernel_t) ++') ++ ++optional_policy(` ++ xserver_xdm_manage_spool(kernel_t) ++ xserver_filetrans_home_content(kernel_t) ++') ++ + ######################################## + # + # Unlabeled process local policy +@@ -388,6 +485,8 @@ optional_policy(` + if( ! secure_mode_insmod ) { + allow can_load_kernmodule self:capability sys_module; + ++ files_load_kernel_modules(can_load_kernmodule) ++ + # load_module() calls stop_machine() which + # calls sched_setscheduler() + allow can_load_kernmodule self:capability sys_nice; +@@ -399,14 +498,39 @@ if( ! secure_mode_insmod ) { + # Rules for unconfined acccess to this module + # + +-allow kern_unconfined proc_type:{ dir file lnk_file } *; ++allow kern_unconfined proc_type:{ file } ~entrypoint; ++allow kern_unconfined proc_type:{ dir lnk_file } *; + +-allow kern_unconfined sysctl_type:{ dir file } *; ++allow kern_unconfined sysctl_type:{ file } ~entrypoint; ++allow kern_unconfined sysctl_type:{ dir } *; + + allow kern_unconfined kernel_t:system *; + +-allow kern_unconfined unlabeled_t:dir_file_class_set *; ++allow kern_unconfined unlabeled_t:{ dir lnk_file sock_file fifo_file chr_file blk_file } *; ++allow kern_unconfined unlabeled_t:file ~entrypoint; + allow kern_unconfined unlabeled_t:filesystem *; + allow kern_unconfined unlabeled_t:association *; + allow kern_unconfined unlabeled_t:packet *; +-allow kern_unconfined unlabeled_t:process ~{ transition dyntransition execmem execstack execheap }; ++allow kern_unconfined unlabeled_t:process ~{ ptrace transition dyntransition execmem execstack execheap }; ++ ++gen_require(` ++ bool secure_mode_insmod; ++') ++ ++if( ! secure_mode_insmod ) { ++ allow can_load_kernmodule self:capability sys_module; ++ allow can_load_kernmodule self:capability2 compromise_kernel; ++ # load_module() calls stop_machine() which ++ # calls sched_setscheduler() ++ allow can_load_kernmodule self:capability sys_nice; ++ kernel_setsched(can_load_kernmodule) ++} ++ ++####################################### ++# ++# Kernel system state reader policy ++# ++ ++read_files_pattern(kernel_system_state_reader, proc_t, proc_t) ++read_lnk_files_pattern(kernel_system_state_reader, proc_t, proc_t) ++list_dirs_pattern(kernel_system_state_reader, proc_t, proc_t) +diff --git a/policy/modules/kernel/mcs.if b/policy/modules/kernel/mcs.if +index b08a6e8496..43d504b884 100644 +--- a/policy/modules/kernel/mcs.if ++++ b/policy/modules/kernel/mcs.if +@@ -44,11 +44,7 @@ interface(`mcs_constrained',` + ## + # + interface(`mcs_file_read_all',` +- gen_require(` +- attribute mcsreadall; +- ') +- +- typeattribute $1 mcsreadall; ++ refpolicywarn(`$0() has been deprecated, please remove mcs_constrained() instead.') + ') + + ######################################## +@@ -64,11 +60,7 @@ interface(`mcs_file_read_all',` + ## + # + interface(`mcs_file_write_all',` +- gen_require(` +- attribute mcswriteall; +- ') +- +- typeattribute $1 mcswriteall; ++ refpolicywarn(`$0() has been deprecated, please remove mcs_constrained() instead.') + ') + + ######################################## +@@ -84,11 +76,7 @@ interface(`mcs_file_write_all',` + ## + # + interface(`mcs_killall',` +- gen_require(` +- attribute mcskillall; +- ') +- +- typeattribute $1 mcskillall; ++ refpolicywarn(`$0() has been deprecated, please remove mcs_constrained() instead.') + ') + + ######################################## +@@ -104,11 +92,7 @@ interface(`mcs_killall',` + ## + # + interface(`mcs_ptrace_all',` +- gen_require(` +- attribute mcsptraceall; +- ') +- +- typeattribute $1 mcsptraceall; ++ refpolicywarn(`$0() has been deprecated, please remove mcs_constrained() instead.') + ') + + ######################################## +@@ -130,3 +114,19 @@ interface(`mcs_process_set_categories',` + + typeattribute $1 mcssetcats; + ') ++ ++######################################## ++## ++## Make specified domain MCS trusted ++## for writing to sockets at any level. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`mcs_socket_write_all_levels',` ++ refpolicywarn(`$0() has been deprecated, please remove mcs_constrained() instead.') ++') +diff --git a/policy/modules/kernel/mcs.te b/policy/modules/kernel/mcs.te +index 2da98c2575..31bed0a7ce 100644 +--- a/policy/modules/kernel/mcs.te ++++ b/policy/modules/kernel/mcs.te +@@ -11,3 +11,4 @@ attribute mcssetcats; + attribute mcswriteall; + attribute mcsreadall; + attribute mcs_constrained_type; ++attribute mcsnetwrite; +diff --git a/policy/modules/kernel/mls.if b/policy/modules/kernel/mls.if +index d178478da9..42bf05bcdd 100644 +--- a/policy/modules/kernel/mls.if ++++ b/policy/modules/kernel/mls.if +@@ -97,6 +97,26 @@ interface(`mls_file_write_to_clearance',` + typeattribute $1 mlsfilewritetoclr; + ') + ++######################################## ++## ++## Make specified domain MLS trusted ++## for relabelto to files up to its clearance. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`mls_file_relabel_to_clearance',` ++ gen_require(` ++ attribute mlsfilerelabeltoclr; ++ ') ++ ++ typeattribute $1 mlsfilerelabeltoclr; ++') ++ + ######################################## + ## + ## Make specified domain MLS trusted +diff --git a/policy/modules/kernel/mls.te b/policy/modules/kernel/mls.te +index 8c7bd90d22..66ee5b9a18 100644 +--- a/policy/modules/kernel/mls.te ++++ b/policy/modules/kernel/mls.te +@@ -12,6 +12,7 @@ attribute mlsfilewritetoclr; + attribute mlsfilewriteinrange; + attribute mlsfileupgrade; + attribute mlsfiledowngrade; ++attribute mlsfilerelabeltoclr; + + attribute mlsnetread; + attribute mlsnetreadtoclr; +diff --git a/policy/modules/kernel/selinux.fc b/policy/modules/kernel/selinux.fc +index 7be4ddf74d..4d4c577ad7 100644 +--- a/policy/modules/kernel/selinux.fc ++++ b/policy/modules/kernel/selinux.fc +@@ -1 +1 @@ +-# This module currently does not have any file contexts. ++/selinux -l gen_context(system_u:object_r:security_t,s0) +diff --git a/policy/modules/kernel/selinux.if b/policy/modules/kernel/selinux.if +index 6d0811da39..c10081b23d 100644 +--- a/policy/modules/kernel/selinux.if ++++ b/policy/modules/kernel/selinux.if +@@ -40,7 +40,7 @@ interface(`selinux_labeled_boolean',` + + # because of this statement, any module which + # calls this interface must be in the base module: +- genfscon selinuxfs /booleans/$2 gen_context(system_u:object_r:$1,s0) ++# genfscon selinuxfs /booleans/$2 gen_context(system_u:object_r:$1,s0) + ') + + ######################################## +@@ -58,6 +58,9 @@ interface(`selinux_get_fs_mount',` + type security_t; + ') + ++ allow $1 security_t:lnk_file read_lnk_file_perms; ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) + # starting in libselinux 2.0.5, init_selinuxmnt() will + # attempt to short circuit by checking if SELINUXMNT + # (/selinux) is already a selinuxfs +@@ -87,6 +90,7 @@ interface(`selinux_dontaudit_get_fs_mount',` + # starting in libselinux 2.0.5, init_selinuxmnt() will + # attempt to short circuit by checking if SELINUXMNT + # (/selinux) is already a selinuxfs ++ dev_dontaudit_search_sysfs($1) + dontaudit $1 security_t:filesystem getattr; + + # read /proc/filesystems to see if selinuxfs is supported +@@ -109,6 +113,9 @@ interface(`selinux_mount_fs',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:filesystem mount; + ') + +@@ -128,6 +135,9 @@ interface(`selinux_remount_fs',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:filesystem remount; + ') + +@@ -146,6 +156,9 @@ interface(`selinux_unmount_fs',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:filesystem unmount; + ') + +@@ -164,6 +177,7 @@ interface(`selinux_getattr_fs',` + type security_t; + ') + ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:filesystem getattr; + ') + +@@ -221,7 +235,12 @@ interface(`selinux_search_fs',` + ') + + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir search_dir_perms; ++ ++ optional_policy(` ++ seutil_search_config($1) ++ ') + ') + + ######################################## +@@ -242,6 +261,28 @@ interface(`selinux_dontaudit_search_fs',` + dontaudit $1 security_t:dir search_dir_perms; + ') + ++######################################## ++## ++## Mount on selinuxfs directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`selinux_mounton_fs',` ++ gen_require(` ++ type security_t; ++ ') ++ ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; ++ allow $1 security_t:dir mounton; ++') ++ ++ + ######################################## + ## + ## Do not audit attempts to read +@@ -258,6 +299,7 @@ interface(`selinux_dontaudit_read_fs',` + type security_t; + ') + ++ selinux_dontaudit_getattr_fs($1) + dontaudit $1 security_t:dir search_dir_perms; + dontaudit $1 security_t:file read_file_perms; + ') +@@ -280,8 +322,10 @@ interface(`selinux_get_enforce_mode',` + ') + + dev_search_sysfs($1) ++ selinux_get_fs_mount($1) + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file read_file_perms; ++ allow $1 security_t:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -310,22 +354,12 @@ interface(`selinux_set_enforce_mode',` + gen_require(` + type security_t; + attribute can_setenforce; +- bool secure_mode_policyload; + ') + + dev_search_sysfs($1) + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + typeattribute $1 can_setenforce; +- +- if(!secure_mode_policyload) { +- allow $1 security_t:security setenforce; +- +- ifdef(`distro_rhel4',` +- # needed for systems without audit support +- auditallow $1 security_t:security setenforce; +- ') +- } + ') + + ######################################## +@@ -342,22 +376,13 @@ interface(`selinux_load_policy',` + gen_require(` + type security_t; + attribute can_load_policy; +- bool secure_mode_policyload; + ') + + dev_search_sysfs($1) + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; ++ allow $1 security_t:lnk_file read_lnk_file_perms; + typeattribute $1 can_load_policy; +- +- if(!secure_mode_policyload) { +- allow $1 security_t:security load_policy; +- +- ifdef(`distro_rhel4',` +- # needed for systems without audit support +- auditallow $1 security_t:security load_policy; +- ') +- } + ') + + ######################################## +@@ -378,6 +403,7 @@ interface(`selinux_read_policy',` + dev_search_sysfs($1) + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file read_file_perms; ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:security read_policy; + ') + +@@ -438,19 +464,15 @@ interface(`selinux_set_boolean',` + interface(`selinux_set_generic_booleans',` + gen_require(` + type security_t; ++ attribute can_setbool; + ') + ++ typeattribute $1 can_setbool; + dev_search_sysfs($1) +- ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + +- allow $1 security_t:security setbool; +- +- ifdef(`distro_rhel4',` +- # needed for systems without audit support +- auditallow $1 security_t:security setbool; +- ') + ') + + ######################################## +@@ -479,25 +501,16 @@ interface(`selinux_set_all_booleans',` + gen_require(` + type security_t, secure_mode_policyload_t; + attribute boolean_type; +- bool secure_mode_policyload; ++ attribute can_setbool; + ') + ++ typeattribute $1 can_setbool; ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) +- ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; +- allow $1 { boolean_type -secure_mode_policyload_t }:file rw_file_perms; +- allow $1 secure_mode_policyload_t:file read_file_perms; +- +- allow $1 security_t:security setbool; +- +- ifdef(`distro_rhel4',` +- # needed for systems without audit support +- auditallow $1 security_t:security setbool; +- ') +- +- if(!secure_mode_policyload) { +- allow $1 secure_mode_policyload_t:file write_file_perms; +- } ++ allow $1 boolean_type:dir list_dir_perms; ++ allow $1 boolean_type:file rw_file_perms; + ') + + ######################################## +@@ -528,7 +541,9 @@ interface(`selinux_set_parameters',` + attribute can_setsecparam; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security setsecparam; +@@ -552,9 +567,11 @@ interface(`selinux_validate_context',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; +- allow $1 security_t:file rw_file_perms; ++ allow $1 security_t:file { map rw_file_perms }; + allow $1 security_t:security check_context; + ') + +@@ -595,7 +612,9 @@ interface(`selinux_compute_access_vector',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security compute_av; +@@ -617,7 +636,9 @@ interface(`selinux_compute_create_context',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security compute_create; +@@ -639,7 +660,9 @@ interface(`selinux_compute_member',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security compute_member; +@@ -669,12 +692,37 @@ interface(`selinux_compute_relabel_context',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security compute_relabel; + ') + ++######################################## ++## ++## Allows caller to setcheckreqprot ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`selinux_setcheckreqprot',` ++ gen_require(` ++ type security_t; ++ ') ++ ++ dev_getattr_sysfs_fs($1) ++ dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; ++ allow $1 security_t:dir list_dir_perms; ++ allow $1 security_t:file rw_file_perms; ++ allow $1 security_t:security setcheckreqprot; ++') ++ + ######################################## + ## + ## Allows caller to compute possible contexts for a user. +@@ -690,7 +738,9 @@ interface(`selinux_compute_user_contexts',` + type security_t; + ') + ++ dev_getattr_sysfs_fs($1) + dev_search_sysfs($1) ++ allow $1 security_t:lnk_file read_lnk_file_perms; + allow $1 security_t:dir list_dir_perms; + allow $1 security_t:file rw_file_perms; + allow $1 security_t:security compute_user; +@@ -712,4 +762,28 @@ interface(`selinux_unconfined',` + ') + + typeattribute $1 selinux_unconfined_type; ++ selinux_set_all_booleans($1) ++ selinux_load_policy($1) ++ selinux_set_parameters($1) ++ selinux_set_enforce_mode($1) ++') ++ ++######################################## ++## ++## Generate a file context for a boolean type ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`selinux_genbool',` ++ gen_require(` ++ attribute boolean_type; ++ ') ++ ++ type $1, boolean_type; ++ fs_type($1) ++ mls_trusted_object($1) + ') +diff --git a/policy/modules/kernel/selinux.te b/policy/modules/kernel/selinux.te +index e0a973ba16..7d3e431eee 100644 +--- a/policy/modules/kernel/selinux.te ++++ b/policy/modules/kernel/selinux.te +@@ -17,6 +17,7 @@ gen_bool(secure_mode_policyload,false) + attribute boolean_type; + attribute can_load_policy; + attribute can_setenforce; ++attribute can_setbool; + attribute can_setsecparam; + attribute selinux_unconfined_type; + +@@ -36,9 +37,9 @@ sid security gen_context(system_u:object_r:security_t,mls_systemhigh) + genfscon selinuxfs / gen_context(system_u:object_r:security_t,s0) + genfscon securityfs / gen_context(system_u:object_r:security_t,s0) + +-neverallow ~{ selinux_unconfined_type can_load_policy } security_t:security load_policy; +-neverallow ~{ selinux_unconfined_type can_setenforce } security_t:security setenforce; +-neverallow ~{ selinux_unconfined_type can_setsecparam } security_t:security setsecparam; ++neverallow ~{ can_load_policy } security_t:security load_policy; ++neverallow ~{ can_setenforce } security_t:security setenforce; ++neverallow ~{ can_setsecparam } security_t:security setsecparam; + + ######################################## + # +@@ -52,7 +53,7 @@ allow selinux_unconfined_type boolean_type:file read_file_perms; + allow selinux_unconfined_type { boolean_type -secure_mode_policyload_t }:file write_file_perms; + + # Access the security API. +-allow selinux_unconfined_type security_t:security ~{ load_policy setenforce }; ++allow selinux_unconfined_type security_t:security ~{ load_policy setenforce setbool }; + + ifdef(`distro_rhel4',` + # needed for systems without audit support +@@ -60,11 +61,28 @@ ifdef(`distro_rhel4',` + ') + + if(!secure_mode_policyload) { +- allow selinux_unconfined_type security_t:security { load_policy setenforce }; +- allow selinux_unconfined_type secure_mode_policyload_t:file write_file_perms; ++ allow can_setenforce security_t:security setenforce; ++ dev_getattr_sysfs_fs(can_setenforce) ++ dev_search_sysfs(can_setenforce) ++ allow can_setenforce security_t:dir list_dir_perms; ++ allow can_setenforce security_t:file rw_file_perms; + + ifdef(`distro_rhel4',` + # needed for systems without audit support +- auditallow selinux_unconfined_type security_t:security { load_policy setenforce }; ++ auditallow can_setenforce security_t:security setenforce; ++ ') ++ ++ allow can_load_policy security_t:security load_policy; ++ ++ ifdef(`distro_rhel4',` ++ # needed for systems without audit support ++ auditallow can_load_policy security_t:security load_policy; ++ ') ++ ++ allow can_setbool boolean_type:security setbool; ++ ++ ifdef(`distro_rhel4',` ++ # needed for systems without audit support ++ auditallow can_setbool boolean_type:security setbool; + ') + } +diff --git a/policy/modules/kernel/storage.fc b/policy/modules/kernel/storage.fc +index 54f1827028..a45a1f8dfc 100644 +--- a/policy/modules/kernel/storage.fc ++++ b/policy/modules/kernel/storage.fc +@@ -7,6 +7,7 @@ + /dev/n?tpqic[12].* -c gen_context(system_u:object_r:tape_device_t,s0) + /dev/[shmxv]d[^/]* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/aztcd -b gen_context(system_u:object_r:removable_device_t,s0) ++/dev/bcache[0-9]+ -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/bpcd -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/bsg/.+ -c gen_context(system_u:object_r:scsi_generic_device_t,s0) + /dev/cdu.* -b gen_context(system_u:object_r:removable_device_t,s0) +@@ -28,10 +29,12 @@ + /dev/loop.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/lvm -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/mcdx? -b gen_context(system_u:object_r:removable_device_t,s0) +-/dev/megadev.* -c gen_context(system_u:object_r:removable_device_t,s0) ++/dev/megaraid_sas_ioctl_node -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) ++/dev/megadev.* -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/mmcblk.* -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/mspblk.* -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/mtd.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) ++/dev/mtd.* -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/nb[^/]+ -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/optcd -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/p[fg][0-3] -b gen_context(system_u:object_r:removable_device_t,s0) +@@ -42,6 +45,7 @@ + /dev/ram.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/(raw/)?rawctl -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/rd.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) ++/dev/rb.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + ifdef(`distro_redhat', ` + /dev/root -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + ') +@@ -51,7 +55,8 @@ ifdef(`distro_redhat', ` + /dev/sjcd -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/sonycd -b gen_context(system_u:object_r:removable_device_t,s0) + /dev/tape.* -c gen_context(system_u:object_r:tape_device_t,s0) +-/dev/tw[a-z][^/]+ -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) ++/dev/tgt -c gen_context(system_u:object_r:scsi_generic_device_t,s0) ++/dev/tw[a-z][^/]* -c gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/ub[a-z][^/]+ -b gen_context(system_u:object_r:removable_device_t,mls_systemhigh) + /dev/ubd[^/]* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /dev/vd[^/]* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) +@@ -81,3 +86,6 @@ ifdef(`distro_redhat', ` + + /lib/udev/devices/loop.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) + /lib/udev/devices/fuse -c gen_context(system_u:object_r:fuse_device_t,s0) ++ ++/usr/lib/udev/devices/loop.* -b gen_context(system_u:object_r:fixed_disk_device_t,mls_systemhigh) ++/usr/lib/udev/devices/fuse -c gen_context(system_u:object_r:fuse_device_t,s0) +diff --git a/policy/modules/kernel/storage.if b/policy/modules/kernel/storage.if +index 64c4cd01cb..962b6858fc 100644 +--- a/policy/modules/kernel/storage.if ++++ b/policy/modules/kernel/storage.if +@@ -20,6 +20,26 @@ interface(`storage_getattr_fixed_disk_dev',` + allow $1 fixed_disk_device_t:blk_file getattr; + ') + ++######################################## ++## ++## Allow the caller to read/write inherited fixed disk ++## device nodes. ++## ++## ++## ++## The domain allowed access. ++## ++## ++# ++interface(`storage_rw_inherited_fixed_disk_dev',` ++ gen_require(` ++ type fixed_disk_device_t; ++ ') ++ ++ allow $1 fixed_disk_device_t:chr_file { read write }; ++ allow $1 fixed_disk_device_t:blk_file { read write }; ++') ++ + ######################################## + ## + ## Do not audit attempts made by the caller to get +@@ -101,6 +121,8 @@ interface(`storage_raw_read_fixed_disk',` + dev_list_all_dev_nodes($1) + allow $1 fixed_disk_device_t:blk_file read_blk_file_perms; + allow $1 fixed_disk_device_t:chr_file read_chr_file_perms; ++ #577012 ++ allow $1 fixed_disk_device_t:lnk_file read_lnk_file_perms; + typeattribute $1 fixed_disk_raw_read; + ') + +@@ -186,6 +208,7 @@ interface(`storage_dontaudit_write_fixed_disk',` + interface(`storage_raw_rw_fixed_disk',` + storage_raw_read_fixed_disk($1) + storage_raw_write_fixed_disk($1) ++ dev_rw_generic_blk_files($1) + ') + + ######################################## +@@ -205,6 +228,7 @@ interface(`storage_create_fixed_disk_dev',` + + allow $1 self:capability mknod; + allow $1 fixed_disk_device_t:blk_file create_blk_file_perms; ++ allow $1 fixed_disk_device_t:chr_file create_chr_file_perms; + dev_add_entry_generic_dirs($1) + ') + +@@ -274,6 +298,48 @@ interface(`storage_dev_filetrans_fixed_disk',` + dev_filetrans($1, fixed_disk_device_t, blk_file, $2) + ') + ++####################################### ++## ++## Create block devices in /dev with the fixed disk type ++## via an automatic type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`storage_dev_filetrans_named_fixed_disk',` ++ gen_require(` ++ type fixed_disk_device_t; ++ ') ++ ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "jsflash") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "lvm") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megaraid_sas_ioctl_node") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev9") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "device-mapper") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw9") ++') ++ + ######################################## + ## + ## Create block devices in on a tmpfs filesystem with the +@@ -293,6 +359,25 @@ interface(`storage_tmpfs_filetrans_fixed_disk',` + fs_tmpfs_filetrans($1, fixed_disk_device_t, blk_file) + ') + ++######################################## ++## ++## Create block devices in on a tmp filesystem with the ++## fixed disk type via an automatic type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`storage_tmp_filetrans_fixed_disk',` ++ gen_require(` ++ type fixed_disk_device_t; ++ ') ++ ++ files_tmp_filetrans($1, fixed_disk_device_t, blk_file) ++') ++ + ######################################## + ## + ## Relabel fixed disk device nodes. +@@ -716,6 +801,24 @@ interface(`storage_dontaudit_raw_write_removable_device',` + dontaudit $1 removable_device_t:blk_file write_blk_file_perms; + ') + ++####################################### ++## ++## Alow read and write inherited removable devices. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`storage_rw_inherited_removable_device',` ++ gen_require(` ++ type removable_device_t; ++ ') ++ ++ dontaudit $1 removable_device_t:blk_file { read write }; ++') ++ + ######################################## + ## + ## Allow the caller to directly read +@@ -813,3 +916,462 @@ interface(`storage_unconfined',` + + typeattribute $1 storage_unconfined_type; + ') ++ ++######################################## ++## ++## Create all named devices with the correct label ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`storage_filetrans_all_named_dev',` ++ ++ gen_require(` ++ type tape_device_t; ++ type fixed_disk_device_t; ++ type removable_device_t; ++ type scsi_generic_device_t; ++ type fuse_device_t; ++ ') ++ ++ dev_filetrans($1, tape_device_t, chr_file, "ht00") ++ dev_filetrans($1, tape_device_t, chr_file, "ht01") ++ dev_filetrans($1, tape_device_t, chr_file, "ht02") ++ dev_filetrans($1, tape_device_t, chr_file, "ht03") ++ dev_filetrans($1, tape_device_t, chr_file, "ht04") ++ dev_filetrans($1, tape_device_t, chr_file, "ht05") ++ dev_filetrans($1, tape_device_t, chr_file, "ht06") ++ dev_filetrans($1, tape_device_t, chr_file, "ht07") ++ dev_filetrans($1, tape_device_t, chr_file, "ht08") ++ dev_filetrans($1, tape_device_t, chr_file, "ht09") ++ dev_filetrans($1, tape_device_t, chr_file, "st00") ++ dev_filetrans($1, tape_device_t, chr_file, "st01") ++ dev_filetrans($1, tape_device_t, chr_file, "st02") ++ dev_filetrans($1, tape_device_t, chr_file, "st03") ++ dev_filetrans($1, tape_device_t, chr_file, "st04") ++ dev_filetrans($1, tape_device_t, chr_file, "st05") ++ dev_filetrans($1, tape_device_t, chr_file, "st06") ++ dev_filetrans($1, tape_device_t, chr_file, "st07") ++ dev_filetrans($1, tape_device_t, chr_file, "st08") ++ dev_filetrans($1, tape_device_t, chr_file, "st09") ++ dev_filetrans($1, tape_device_t, chr_file, "qft0") ++ dev_filetrans($1, tape_device_t, chr_file, "qft1") ++ dev_filetrans($1, tape_device_t, chr_file, "qft2") ++ dev_filetrans($1, tape_device_t, chr_file, "qft3") ++ dev_filetrans($1, tape_device_t, chr_file, "osst00") ++ dev_filetrans($1, tape_device_t, chr_file, "osst01") ++ dev_filetrans($1, tape_device_t, chr_file, "osst02") ++ dev_filetrans($1, tape_device_t, chr_file, "osst03") ++ dev_filetrans($1, tape_device_t, chr_file, "osst04") ++ dev_filetrans($1, tape_device_t, chr_file, "osst05") ++ dev_filetrans($1, tape_device_t, chr_file, "osst06") ++ dev_filetrans($1, tape_device_t, chr_file, "osst07") ++ dev_filetrans($1, tape_device_t, chr_file, "osst08") ++ dev_filetrans($1, tape_device_t, chr_file, "osst09") ++ dev_filetrans($1, tape_device_t, chr_file, "pt0") ++ dev_filetrans($1, tape_device_t, chr_file, "pt1") ++ dev_filetrans($1, tape_device_t, chr_file, "pt2") ++ dev_filetrans($1, tape_device_t, chr_file, "pt3") ++ dev_filetrans($1, tape_device_t, chr_file, "pt4") ++ dev_filetrans($1, tape_device_t, chr_file, "pt5") ++ dev_filetrans($1, tape_device_t, chr_file, "pt6") ++ dev_filetrans($1, tape_device_t, chr_file, "pt7") ++ dev_filetrans($1, tape_device_t, chr_file, "pt8") ++ dev_filetrans($1, tape_device_t, chr_file, "pt9") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic0") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic1") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic2") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic3") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic4") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic5") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic6") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic7") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic8") ++ dev_filetrans($1, tape_device_t, chr_file, "tpqic9") ++ dev_filetrans($1, removable_device_t, blk_file, "aztcd") ++ dev_filetrans($1, removable_device_t, blk_file, "bpcd") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu0") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu1") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu2") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu3") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu4") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu5") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu6") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu7") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu8") ++ dev_filetrans($1, removable_device_t, blk_file, "cdu9") ++ dev_filetrans($1, removable_device_t, blk_file, "cm200") ++ dev_filetrans($1, removable_device_t, blk_file, "cm201") ++ dev_filetrans($1, removable_device_t, blk_file, "cm202") ++ dev_filetrans($1, removable_device_t, blk_file, "cm203") ++ dev_filetrans($1, removable_device_t, blk_file, "cm204") ++ dev_filetrans($1, removable_device_t, blk_file, "cm205") ++ dev_filetrans($1, removable_device_t, blk_file, "cm206") ++ dev_filetrans($1, removable_device_t, blk_file, "cm207") ++ dev_filetrans($1, removable_device_t, blk_file, "cm208") ++ dev_filetrans($1, removable_device_t, blk_file, "cm209") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "bcache9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "md126p1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sda9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdb9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdc9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdd9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sde9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdf9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "sdg9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "dm-9") ++ dev_filetrans($1, removable_device_t, blk_file, "gscd") ++ dev_filetrans($1, removable_device_t, blk_file, "hitcd") ++ dev_filetrans($1, tape_device_t, blk_file, "ht0") ++ dev_filetrans($1, tape_device_t, blk_file, "ht1") ++ dev_filetrans($1, removable_device_t, blk_file, "hwcdrom") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "initrd") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "jsfd") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "jsflash") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "loop9") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "lvm") ++ dev_filetrans($1, removable_device_t, blk_file, "mcd") ++ dev_filetrans($1, removable_device_t, blk_file, "mcdx") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megaraid_sas_ioctl_node") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "megadev9") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk0") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk1") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk2") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk3") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk4") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk5") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk6") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk7") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk8") ++ dev_filetrans($1, removable_device_t, blk_file, "mmcblk9") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk0") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk1") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk2") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk3") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk4") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk5") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk6") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk7") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk8") ++ dev_filetrans($1, removable_device_t, blk_file, "mspblk9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "mtd9") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "mtd9") ++ dev_filetrans($1, removable_device_t, blk_file, "optcd") ++ dev_filetrans($1, removable_device_t, blk_file, "pf0") ++ dev_filetrans($1, removable_device_t, blk_file, "pf1") ++ dev_filetrans($1, removable_device_t, blk_file, "pf2") ++ dev_filetrans($1, removable_device_t, blk_file, "pf3") ++ dev_filetrans($1, removable_device_t, blk_file, "pg0") ++ dev_filetrans($1, removable_device_t, blk_file, "pg1") ++ dev_filetrans($1, removable_device_t, blk_file, "pg2") ++ dev_filetrans($1, removable_device_t, blk_file, "pg3") ++ dev_filetrans($1, removable_device_t, blk_file, "pcd0") ++ dev_filetrans($1, removable_device_t, blk_file, "pcd1") ++ dev_filetrans($1, removable_device_t, blk_file, "pcd2") ++ dev_filetrans($1, removable_device_t, blk_file, "pcd3") ++ dev_filetrans($1, removable_device_t, chr_file, "pg0") ++ dev_filetrans($1, removable_device_t, chr_file, "pg1") ++ dev_filetrans($1, removable_device_t, chr_file, "pg2") ++ dev_filetrans($1, removable_device_t, chr_file, "pg3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ps3d9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram10") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram11") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram12") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram13") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram14") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "ram15") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd0") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd1") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd2") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd3") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd4") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd5") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd6") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd7") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd8") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "rd9") ++ dev_filetrans($1, fixed_disk_device_t, blk_file, "root") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd0") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd1") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd2") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd3") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd4") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd5") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd6") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd7") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd8") ++ dev_filetrans($1, removable_device_t, blk_file, "sbpcd9") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg0") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg1") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg2") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg3") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg4") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg5") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg6") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg7") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg8") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg9") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg10") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg11") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg12") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg13") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg14") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg15") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg16") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg17") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg18") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg19") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg20") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg21") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg22") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg23") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg24") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg25") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg26") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg27") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg28") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg29") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg30") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg31") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg32") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg33") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg34") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg35") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg36") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg37") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg38") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg39") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg40") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg41") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg42") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg43") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg44") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg45") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg46") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg47") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg48") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg49") ++ dev_filetrans($1, scsi_generic_device_t, chr_file, "sg50") ++ dev_filetrans($1, removable_device_t, blk_file, "sr0") ++ dev_filetrans($1, removable_device_t, blk_file, "sr1") ++ dev_filetrans($1, removable_device_t, blk_file, "sr2") ++ dev_filetrans($1, removable_device_t, blk_file, "sr3") ++ dev_filetrans($1, removable_device_t, blk_file, "sr4") ++ dev_filetrans($1, removable_device_t, blk_file, "sr5") ++ dev_filetrans($1, removable_device_t, blk_file, "sr6") ++ dev_filetrans($1, removable_device_t, blk_file, "sr7") ++ dev_filetrans($1, removable_device_t, blk_file, "sr8") ++ dev_filetrans($1, removable_device_t, blk_file, "sr9") ++ dev_filetrans($1, removable_device_t, blk_file, "sjcd") ++ dev_filetrans($1, removable_device_t, blk_file, "sonycd") ++ dev_filetrans($1, tape_device_t, chr_file, "tape0") ++ dev_filetrans($1, tape_device_t, chr_file, "tape1") ++ dev_filetrans($1, tape_device_t, chr_file, "tape2") ++ dev_filetrans($1, tape_device_t, chr_file, "tape3") ++ dev_filetrans($1, tape_device_t, chr_file, "tape4") ++ dev_filetrans($1, tape_device_t, chr_file, "tape5") ++ dev_filetrans($1, tape_device_t, chr_file, "tape6") ++ dev_filetrans($1, tape_device_t, chr_file, "tape7") ++ dev_filetrans($1, tape_device_t, chr_file, "tape8") ++ dev_filetrans($1, tape_device_t, chr_file, "tape9") ++ dev_filetrans($1, fuse_device_t, chr_file, "fuse") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "device-mapper") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "raw9") ++ dev_filetrans($1, removable_device_t, chr_file, "rio500") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "tw9") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa0") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa1") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa2") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa3") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa4") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa5") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa6") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa7") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa8") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa9") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa10") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa11") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa12") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa13") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa14") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa15") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa16") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa17") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa18") ++ dev_filetrans($1, fixed_disk_device_t, chr_file, "twa19") ++ ++') +diff --git a/policy/modules/kernel/storage.te b/policy/modules/kernel/storage.te +index 156c333107..02f5a3c918 100644 +--- a/policy/modules/kernel/storage.te ++++ b/policy/modules/kernel/storage.te +@@ -57,3 +57,9 @@ dev_node(tape_device_t) + + allow storage_unconfined_type { fixed_disk_device_t removable_device_t }:blk_file *; + allow storage_unconfined_type { scsi_generic_device_t tape_device_t }:chr_file *; ++ ++# Since block devices are some times used before being labeled correctly ++ifdef(`hide_broken_symptoms',` ++ dev_read_generic_blk_files(fixed_disk_raw_read) ++ dev_manage_generic_blk_files(fixed_disk_raw_write) ++') +diff --git a/policy/modules/kernel/terminal.fc b/policy/modules/kernel/terminal.fc +index 0ea25b6539..37069ae93b 100644 +--- a/policy/modules/kernel/terminal.fc ++++ b/policy/modules/kernel/terminal.fc +@@ -14,12 +14,13 @@ + /dev/ip2[^/]* -c gen_context(system_u:object_r:tty_device_t,s0) + /dev/isdn.* -c gen_context(system_u:object_r:tty_device_t,s0) + /dev/ptmx -c gen_context(system_u:object_r:ptmx_t,s0) +-/dev/pts/ptmx -c gen_context(system_u:object_r:ptmx_t,s0) + /dev/rfcomm[0-9]+ -c gen_context(system_u:object_r:tty_device_t,s0) + /dev/slamr[0-9]+ -c gen_context(system_u:object_r:tty_device_t,s0) ++/dev/sclp_line[0-9]+ -c gen_context(system_u:object_r:tty_device_t,s0) + /dev/tty -c gen_context(system_u:object_r:devtty_t,s0) + /dev/ttySG.* -c gen_context(system_u:object_r:tty_device_t,s0) +-/dev/vport[0-9]p[0-9]+ -c gen_context(system_u:object_r:virtio_device_t,s0) ++/dev/ttyUSB[0-9]+ -c gen_context(system_u:object_r:usbtty_device_t,s0) ++/dev/vport.* -c gen_context(system_u:object_r:virtio_device_t,s0) + /dev/xvc[^/]* -c gen_context(system_u:object_r:tty_device_t,s0) + + /dev/pty/.* -c gen_context(system_u:object_r:bsdpty_device_t,s0) +@@ -42,3 +43,7 @@ ifdef(`distro_gentoo',` + # used by init scripts to initally populate udev /dev + /lib/udev/devices/console -c gen_context(system_u:object_r:console_device_t,s0) + ') ++ ++/lib/udev/devices/pts -d gen_context(system_u:object_r:devpts_t,s0-mls_systemhigh) ++ ++/usr/lib/udev/devices/pts -d gen_context(system_u:object_r:devpts_t,s0-mls_systemhigh) +diff --git a/policy/modules/kernel/terminal.if b/policy/modules/kernel/terminal.if +index cbb729b66f..f118b2a3b1 100644 +--- a/policy/modules/kernel/terminal.if ++++ b/policy/modules/kernel/terminal.if +@@ -124,13 +124,32 @@ interface(`term_user_tty',` + type_change $1 ttynode:chr_file $2; + ') + +- tunable_policy(`console_login',` ++ tunable_policy(`login_console_enabled',` + # When user logs in from /dev/console, relabel it + # to user tty type as well. + type_change $1 console_device_t:chr_file $2; + ') + ') + ++######################################## ++## ++## Create the /dev/pts directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_create_pty_dir',` ++ gen_require(` ++ type devpts_t; ++ ') ++ ++ allow $1 devpts_t:dir create_dir_perms; ++ dev_filetrans($1, devpts_t, dir, "devpts") ++') ++ + ######################################## + ## + ## Create a pty in the /dev/pts directory. +@@ -206,6 +225,27 @@ interface(`term_use_all_terms',` + allow $1 { devpts_t console_device_t tty_device_t ttynode ptynode }:chr_file rw_chr_file_perms; + ') + ++######################################## ++## ++## Read and write the inherited console, all inherited ++## ttys and ptys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`term_use_all_inherited_terms',` ++ gen_require(` ++ attribute ttynode, ptynode; ++ type console_device_t, devpts_t, tty_device_t; ++ ') ++ ++ allow $1 { devpts_t console_device_t tty_device_t ttynode ptynode }:chr_file rw_inherited_term_perms; ++') ++ + ######################################## + ## + ## Write to the console. +@@ -274,7 +314,6 @@ interface(`term_dontaudit_read_console',` + ## Domain allowed access. + ## + ## +-## + # + interface(`term_use_console',` + gen_require(` +@@ -299,9 +338,12 @@ interface(`term_use_console',` + interface(`term_dontaudit_use_console',` + gen_require(` + type console_device_t; ++ type tty_device_t; + ') + +- dontaudit $1 console_device_t:chr_file rw_chr_file_perms; ++ init_dontaudit_use_fds($1) ++ dontaudit $1 console_device_t:chr_file rw_inherited_chr_file_perms; ++ dontaudit $1 tty_device_t:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## +@@ -382,6 +424,42 @@ interface(`term_getattr_pty_fs',` + allow $1 devpts_t:filesystem getattr; + ') + ++######################################## ++## ++## Mount a pty filesystem ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_mount_pty_fs',` ++ gen_require(` ++ type devpts_t; ++ ') ++ ++ allow $1 devpts_t:filesystem mount; ++') ++ ++######################################## ++## ++## Unmount a pty filesystem ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_unmount_pty_fs',` ++ gen_require(` ++ type devpts_t; ++ ') ++ ++ allow $1 devpts_t:filesystem unmount; ++') ++ + ######################################## + ## + ## Relabel from and to pty filesystem. +@@ -479,6 +557,24 @@ interface(`term_list_ptys',` + allow $1 devpts_t:dir list_dir_perms; + ') + ++######################################## ++## ++## Relabel the /dev/pts directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_relabel_ptys_dirs',` ++ gen_require(` ++ type devpts_t; ++ ') ++ ++ allow $1 devpts_t:dir relabel_dir_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to read the +@@ -620,7 +716,7 @@ interface(`term_use_generic_ptys',` + + ######################################## + ## +-## Dot not audit attempts to read and ++## Do not audit attempts to read and + ## write the generic pty type. This is + ## generally only used in the targeted policy. + ## +@@ -635,6 +731,7 @@ interface(`term_dontaudit_use_generic_ptys',` + type devpts_t; + ') + ++ init_dontaudit_use_fds($1) + dontaudit $1 devpts_t:chr_file { getattr read write ioctl }; + ') + +@@ -877,6 +974,26 @@ interface(`term_use_all_ptys',` + allow $1 ptynode:chr_file { rw_term_perms lock append }; + ') + ++######################################## ++## ++## Read and write all inherited ptys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`term_use_all_inherited_ptys',` ++ gen_require(` ++ attribute ptynode; ++ type devpts_t; ++ ') ++ ++ allow $1 ptynode:chr_file { rw_inherited_term_perms lock }; ++') ++ + ######################################## + ## + ## Do not audit attempts to read or write any ptys. +@@ -892,7 +1009,7 @@ interface(`term_dontaudit_use_all_ptys',` + attribute ptynode; + ') + +- dontaudit $1 ptynode:chr_file { rw_term_perms lock append }; ++ dontaudit $1 ptynode:chr_file { rw_inherited_term_perms lock append }; + ') + + ######################################## +@@ -912,7 +1029,7 @@ interface(`term_relabel_all_ptys',` + ') + + dev_list_all_dev_nodes($1) +- relabel_chr_files_pattern($1, devpts_t, ptynode) ++ relabel_chr_files_pattern($1, devpts_t, { ptynode devpts_t } ) + ') + + ######################################## +@@ -940,7 +1057,7 @@ interface(`term_getattr_all_user_ptys',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -1065,6 +1182,28 @@ interface(`term_getattr_unallocated_ttys',` + allow $1 tty_device_t:chr_file getattr; + ') + ++######################################## ++## ++## Allow open access for all unallocated ++## tty device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_open_unallocated_ttys',` ++ gen_require(` ++ type tty_device_t; ++ ') ++ ++ dev_list_all_dev_nodes($1) ++ allow $1 tty_device_t:chr_file open; ++') ++ ++ ++ + ######################################## + ## + ## Do not audit attempts to get the attributes +@@ -1163,6 +1302,25 @@ interface(`term_relabel_unallocated_ttys',` + allow $1 tty_device_t:chr_file relabel_chr_file_perms; + ') + ++######################################## ++## ++## Mounton unallocated tty device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`term_mounton_unallocated_ttys',` ++ gen_require(` ++ type tty_device_t; ++ ') ++ ++ allow $1 tty_device_t:chr_file mounton; ++') ++ + ######################################## + ## + ## Relabel from all user tty types to +@@ -1259,7 +1417,47 @@ interface(`term_dontaudit_use_unallocated_ttys',` + type tty_device_t; + ') + +- dontaudit $1 tty_device_t:chr_file rw_chr_file_perms; ++ init_dontaudit_use_fds($1) ++ dontaudit $1 tty_device_t:chr_file rw_inherited_chr_file_perms; ++') ++ ++######################################## ++## ++## Read and write USB tty character ++## device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_use_usb_ttys',` ++ gen_require(` ++ type usbtty_device_t; ++ ') ++ ++ dev_list_all_dev_nodes($1) ++ allow $1 usbtty_device_t:chr_file rw_chr_file_perms; ++') ++ ++####################################### ++## ++## Setattr on USB tty character ++## device nodes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_setattr_usb_ttys',` ++ gen_require(` ++ type usbtty_device_t; ++ ') ++ ++ allow $1 usbtty_device_t:chr_file setattr; + ') + + ######################################## +@@ -1275,11 +1473,13 @@ interface(`term_dontaudit_use_unallocated_ttys',` + # + interface(`term_getattr_all_ttys',` + gen_require(` ++ type tty_device_t; + attribute ttynode; + ') + + dev_list_all_dev_nodes($1) + allow $1 ttynode:chr_file getattr; ++ allow $1 tty_device_t:chr_file getattr; + ') + + ######################################## +@@ -1296,10 +1496,12 @@ interface(`term_getattr_all_ttys',` + interface(`term_dontaudit_getattr_all_ttys',` + gen_require(` + attribute ttynode; ++ type tty_device_t; + ') + + dev_list_all_dev_nodes($1) + dontaudit $1 ttynode:chr_file getattr; ++ dontaudit $1 tty_device_t:chr_file getattr; + ') + + ######################################## +@@ -1377,7 +1579,27 @@ interface(`term_use_all_ttys',` + ') + + dev_list_all_dev_nodes($1) +- allow $1 ttynode:chr_file rw_chr_file_perms; ++ allow $1 ttynode:chr_file rw_term_perms; ++') ++ ++######################################## ++## ++## Read and write all inherited ttys. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`term_use_all_inherited_ttys',` ++ gen_require(` ++ attribute ttynode; ++ ') ++ ++ dev_list_all_dev_nodes($1) ++ allow $1 ttynode:chr_file rw_inherited_term_perms; + ') + + ######################################## +@@ -1396,7 +1618,7 @@ interface(`term_dontaudit_use_all_ttys',` + attribute ttynode; + ') + +- dontaudit $1 ttynode:chr_file rw_chr_file_perms; ++ dontaudit $1 ttynode:chr_file rw_inherited_chr_file_perms; + ') + + ######################################## +@@ -1504,7 +1726,7 @@ interface(`term_use_all_user_ttys',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -1513,21 +1735,435 @@ interface(`term_dontaudit_use_all_user_ttys',` + term_dontaudit_use_all_ttys($1) + ') + ++#################################### ++## ++## Getattr on the virtio console. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_getattr_virtio_console',` ++ gen_require(` ++ type virtio_device_t; ++ ') ++ ++ allow $1 virtio_device_t:chr_file getattr_chr_file_perms; ++') ++ + ##################################### + ## +-## Read from and write virtio console. ++## Read from and write to the virtio console. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`term_use_virtio_console',` +- gen_require(` +- type virtio_device_t; +- ') +- +- dev_list_all_dev_nodes($1) +- allow $1 virtio_device_t:chr_file rw_term_perms; ++ gen_require(` ++ type virtio_device_t; ++ ') ++ ++ dev_list_all_dev_nodes($1) ++ allow $1 virtio_device_t:chr_file rw_chr_file_perms; ++') ++ ++######################################## ++## ++## Create all named term devices with the correct label ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`term_filetrans_all_named_dev',` ++ ++ gen_require(` ++ type tty_device_t; ++ type bsdpty_device_t; ++ type console_device_t; ++ type ptmx_t; ++ type devtty_t; ++ type virtio_device_t; ++ type devpts_t; ++ type usbtty_device_t; ++ ') ++ ++ dev_filetrans($1, devtty_t, chr_file, "tty") ++ dev_filetrans($1, tty_device_t, chr_file, "tty0") ++ dev_filetrans($1, tty_device_t, chr_file, "tty1") ++ dev_filetrans($1, tty_device_t, chr_file, "tty2") ++ dev_filetrans($1, tty_device_t, chr_file, "tty3") ++ dev_filetrans($1, tty_device_t, chr_file, "tty4") ++ dev_filetrans($1, tty_device_t, chr_file, "tty5") ++ dev_filetrans($1, tty_device_t, chr_file, "tty6") ++ dev_filetrans($1, tty_device_t, chr_file, "tty7") ++ dev_filetrans($1, tty_device_t, chr_file, "tty8") ++ dev_filetrans($1, tty_device_t, chr_file, "tty9") ++ dev_filetrans($1, tty_device_t, chr_file, "tty10") ++ dev_filetrans($1, tty_device_t, chr_file, "tty11") ++ dev_filetrans($1, tty_device_t, chr_file, "tty12") ++ dev_filetrans($1, tty_device_t, chr_file, "tty13") ++ dev_filetrans($1, tty_device_t, chr_file, "tty14") ++ dev_filetrans($1, tty_device_t, chr_file, "tty15") ++ dev_filetrans($1, tty_device_t, chr_file, "tty16") ++ dev_filetrans($1, tty_device_t, chr_file, "tty17") ++ dev_filetrans($1, tty_device_t, chr_file, "tty18") ++ dev_filetrans($1, tty_device_t, chr_file, "tty19") ++ dev_filetrans($1, tty_device_t, chr_file, "tty20") ++ dev_filetrans($1, tty_device_t, chr_file, "tty21") ++ dev_filetrans($1, tty_device_t, chr_file, "tty22") ++ dev_filetrans($1, tty_device_t, chr_file, "tty23") ++ dev_filetrans($1, tty_device_t, chr_file, "tty24") ++ dev_filetrans($1, tty_device_t, chr_file, "tty25") ++ dev_filetrans($1, tty_device_t, chr_file, "tty26") ++ dev_filetrans($1, tty_device_t, chr_file, "tty27") ++ dev_filetrans($1, tty_device_t, chr_file, "tty28") ++ dev_filetrans($1, tty_device_t, chr_file, "tty29") ++ dev_filetrans($1, tty_device_t, chr_file, "tty30") ++ dev_filetrans($1, tty_device_t, chr_file, "tty31") ++ dev_filetrans($1, tty_device_t, chr_file, "tty32") ++ dev_filetrans($1, tty_device_t, chr_file, "tty33") ++ dev_filetrans($1, tty_device_t, chr_file, "tty34") ++ dev_filetrans($1, tty_device_t, chr_file, "tty35") ++ dev_filetrans($1, tty_device_t, chr_file, "tty36") ++ dev_filetrans($1, tty_device_t, chr_file, "tty37") ++ dev_filetrans($1, tty_device_t, chr_file, "tty38") ++ dev_filetrans($1, tty_device_t, chr_file, "tty39") ++ dev_filetrans($1, tty_device_t, chr_file, "tty40") ++ dev_filetrans($1, tty_device_t, chr_file, "tty41") ++ dev_filetrans($1, tty_device_t, chr_file, "tty42") ++ dev_filetrans($1, tty_device_t, chr_file, "tty43") ++ dev_filetrans($1, tty_device_t, chr_file, "tty44") ++ dev_filetrans($1, tty_device_t, chr_file, "tty45") ++ dev_filetrans($1, tty_device_t, chr_file, "tty46") ++ dev_filetrans($1, tty_device_t, chr_file, "tty47") ++ dev_filetrans($1, tty_device_t, chr_file, "tty48") ++ dev_filetrans($1, tty_device_t, chr_file, "tty49") ++ dev_filetrans($1, tty_device_t, chr_file, "tty50") ++ dev_filetrans($1, tty_device_t, chr_file, "tty51") ++ dev_filetrans($1, tty_device_t, chr_file, "tty52") ++ dev_filetrans($1, tty_device_t, chr_file, "tty53") ++ dev_filetrans($1, tty_device_t, chr_file, "tty54") ++ dev_filetrans($1, tty_device_t, chr_file, "tty55") ++ dev_filetrans($1, tty_device_t, chr_file, "tty56") ++ dev_filetrans($1, tty_device_t, chr_file, "tty57") ++ dev_filetrans($1, tty_device_t, chr_file, "tty58") ++ dev_filetrans($1, tty_device_t, chr_file, "tty59") ++ dev_filetrans($1, tty_device_t, chr_file, "tty60") ++ dev_filetrans($1, tty_device_t, chr_file, "tty61") ++ dev_filetrans($1, tty_device_t, chr_file, "tty62") ++ dev_filetrans($1, tty_device_t, chr_file, "tty63") ++ dev_filetrans($1, tty_device_t, chr_file, "tty64") ++ dev_filetrans($1, tty_device_t, chr_file, "tty65") ++ dev_filetrans($1, tty_device_t, chr_file, "tty66") ++ dev_filetrans($1, tty_device_t, chr_file, "tty67") ++ dev_filetrans($1, tty_device_t, chr_file, "tty68") ++ dev_filetrans($1, tty_device_t, chr_file, "tty69") ++ dev_filetrans($1, tty_device_t, chr_file, "tty70") ++ dev_filetrans($1, tty_device_t, chr_file, "tty71") ++ dev_filetrans($1, tty_device_t, chr_file, "tty72") ++ dev_filetrans($1, tty_device_t, chr_file, "tty73") ++ dev_filetrans($1, tty_device_t, chr_file, "tty74") ++ dev_filetrans($1, tty_device_t, chr_file, "tty75") ++ dev_filetrans($1, tty_device_t, chr_file, "tty76") ++ dev_filetrans($1, tty_device_t, chr_file, "tty77") ++ dev_filetrans($1, tty_device_t, chr_file, "tty78") ++ dev_filetrans($1, tty_device_t, chr_file, "tty79") ++ dev_filetrans($1, tty_device_t, chr_file, "tty80") ++ dev_filetrans($1, tty_device_t, chr_file, "tty81") ++ dev_filetrans($1, tty_device_t, chr_file, "tty82") ++ dev_filetrans($1, tty_device_t, chr_file, "tty83") ++ dev_filetrans($1, tty_device_t, chr_file, "tty84") ++ dev_filetrans($1, tty_device_t, chr_file, "tty85") ++ dev_filetrans($1, tty_device_t, chr_file, "tty86") ++ dev_filetrans($1, tty_device_t, chr_file, "tty87") ++ dev_filetrans($1, tty_device_t, chr_file, "tty88") ++ dev_filetrans($1, tty_device_t, chr_file, "tty89") ++ dev_filetrans($1, tty_device_t, chr_file, "tty90") ++ dev_filetrans($1, tty_device_t, chr_file, "tty91") ++ dev_filetrans($1, tty_device_t, chr_file, "tty92") ++ dev_filetrans($1, tty_device_t, chr_file, "tty93") ++ dev_filetrans($1, tty_device_t, chr_file, "tty94") ++ dev_filetrans($1, tty_device_t, chr_file, "tty95") ++ dev_filetrans($1, tty_device_t, chr_file, "tty96") ++ dev_filetrans($1, tty_device_t, chr_file, "tty97") ++ dev_filetrans($1, tty_device_t, chr_file, "tty98") ++ dev_filetrans($1, tty_device_t, chr_file, "tty99") ++ dev_filetrans($1, tty_device_t, chr_file, "pty") ++ dev_filetrans($1, tty_device_t, chr_file, "pty0") ++ dev_filetrans($1, tty_device_t, chr_file, "pty1") ++ dev_filetrans($1, tty_device_t, chr_file, "pty2") ++ dev_filetrans($1, tty_device_t, chr_file, "pty3") ++ dev_filetrans($1, tty_device_t, chr_file, "pty4") ++ dev_filetrans($1, tty_device_t, chr_file, "pty5") ++ dev_filetrans($1, tty_device_t, chr_file, "pty6") ++ dev_filetrans($1, tty_device_t, chr_file, "pty7") ++ dev_filetrans($1, tty_device_t, chr_file, "pty8") ++ dev_filetrans($1, tty_device_t, chr_file, "pty9") ++ dev_filetrans($1, tty_device_t, chr_file, "pty10") ++ dev_filetrans($1, tty_device_t, chr_file, "pty11") ++ dev_filetrans($1, tty_device_t, chr_file, "pty12") ++ dev_filetrans($1, tty_device_t, chr_file, "pty13") ++ dev_filetrans($1, tty_device_t, chr_file, "pty14") ++ dev_filetrans($1, tty_device_t, chr_file, "pty15") ++ dev_filetrans($1, tty_device_t, chr_file, "pty16") ++ dev_filetrans($1, tty_device_t, chr_file, "pty17") ++ dev_filetrans($1, tty_device_t, chr_file, "pty18") ++ dev_filetrans($1, tty_device_t, chr_file, "pty19") ++ dev_filetrans($1, tty_device_t, chr_file, "pty20") ++ dev_filetrans($1, tty_device_t, chr_file, "pty21") ++ dev_filetrans($1, tty_device_t, chr_file, "pty22") ++ dev_filetrans($1, tty_device_t, chr_file, "pty23") ++ dev_filetrans($1, tty_device_t, chr_file, "pty24") ++ dev_filetrans($1, tty_device_t, chr_file, "pty25") ++ dev_filetrans($1, tty_device_t, chr_file, "pty26") ++ dev_filetrans($1, tty_device_t, chr_file, "pty27") ++ dev_filetrans($1, tty_device_t, chr_file, "pty28") ++ dev_filetrans($1, tty_device_t, chr_file, "pty29") ++ dev_filetrans($1, tty_device_t, chr_file, "pty30") ++ dev_filetrans($1, tty_device_t, chr_file, "pty31") ++ dev_filetrans($1, tty_device_t, chr_file, "pty32") ++ dev_filetrans($1, tty_device_t, chr_file, "pty33") ++ dev_filetrans($1, tty_device_t, chr_file, "pty34") ++ dev_filetrans($1, tty_device_t, chr_file, "pty35") ++ dev_filetrans($1, tty_device_t, chr_file, "pty36") ++ dev_filetrans($1, tty_device_t, chr_file, "pty37") ++ dev_filetrans($1, tty_device_t, chr_file, "pty38") ++ dev_filetrans($1, tty_device_t, chr_file, "pty39") ++ dev_filetrans($1, tty_device_t, chr_file, "pty40") ++ dev_filetrans($1, tty_device_t, chr_file, "pty41") ++ dev_filetrans($1, tty_device_t, chr_file, "pty42") ++ dev_filetrans($1, tty_device_t, chr_file, "pty43") ++ dev_filetrans($1, tty_device_t, chr_file, "pty44") ++ dev_filetrans($1, tty_device_t, chr_file, "pty45") ++ dev_filetrans($1, tty_device_t, chr_file, "pty46") ++ dev_filetrans($1, tty_device_t, chr_file, "pty47") ++ dev_filetrans($1, tty_device_t, chr_file, "pty48") ++ dev_filetrans($1, tty_device_t, chr_file, "pty49") ++ dev_filetrans($1, tty_device_t, chr_file, "pty50") ++ dev_filetrans($1, tty_device_t, chr_file, "pty51") ++ dev_filetrans($1, tty_device_t, chr_file, "pty52") ++ dev_filetrans($1, tty_device_t, chr_file, "pty53") ++ dev_filetrans($1, tty_device_t, chr_file, "pty54") ++ dev_filetrans($1, tty_device_t, chr_file, "pty55") ++ dev_filetrans($1, tty_device_t, chr_file, "pty56") ++ dev_filetrans($1, tty_device_t, chr_file, "pty57") ++ dev_filetrans($1, tty_device_t, chr_file, "pty58") ++ dev_filetrans($1, tty_device_t, chr_file, "pty59") ++ dev_filetrans($1, tty_device_t, chr_file, "pty60") ++ dev_filetrans($1, tty_device_t, chr_file, "pty61") ++ dev_filetrans($1, tty_device_t, chr_file, "pty62") ++ dev_filetrans($1, tty_device_t, chr_file, "pty63") ++ dev_filetrans($1, tty_device_t, chr_file, "pty64") ++ dev_filetrans($1, tty_device_t, chr_file, "pty65") ++ dev_filetrans($1, tty_device_t, chr_file, "pty66") ++ dev_filetrans($1, tty_device_t, chr_file, "pty67") ++ dev_filetrans($1, tty_device_t, chr_file, "pty68") ++ dev_filetrans($1, tty_device_t, chr_file, "pty69") ++ dev_filetrans($1, tty_device_t, chr_file, "pty70") ++ dev_filetrans($1, tty_device_t, chr_file, "pty71") ++ dev_filetrans($1, tty_device_t, chr_file, "pty72") ++ dev_filetrans($1, tty_device_t, chr_file, "pty73") ++ dev_filetrans($1, tty_device_t, chr_file, "pty74") ++ dev_filetrans($1, tty_device_t, chr_file, "pty75") ++ dev_filetrans($1, tty_device_t, chr_file, "pty76") ++ dev_filetrans($1, tty_device_t, chr_file, "pty77") ++ dev_filetrans($1, tty_device_t, chr_file, "pty78") ++ dev_filetrans($1, tty_device_t, chr_file, "pty79") ++ dev_filetrans($1, tty_device_t, chr_file, "pty80") ++ dev_filetrans($1, tty_device_t, chr_file, "pty81") ++ dev_filetrans($1, tty_device_t, chr_file, "pty82") ++ dev_filetrans($1, tty_device_t, chr_file, "pty83") ++ dev_filetrans($1, tty_device_t, chr_file, "pty84") ++ dev_filetrans($1, tty_device_t, chr_file, "pty85") ++ dev_filetrans($1, tty_device_t, chr_file, "pty86") ++ dev_filetrans($1, tty_device_t, chr_file, "pty87") ++ dev_filetrans($1, tty_device_t, chr_file, "pty88") ++ dev_filetrans($1, tty_device_t, chr_file, "pty89") ++ dev_filetrans($1, tty_device_t, chr_file, "pty90") ++ dev_filetrans($1, tty_device_t, chr_file, "pty91") ++ dev_filetrans($1, tty_device_t, chr_file, "pty92") ++ dev_filetrans($1, tty_device_t, chr_file, "pty93") ++ dev_filetrans($1, tty_device_t, chr_file, "pty94") ++ dev_filetrans($1, tty_device_t, chr_file, "pty95") ++ dev_filetrans($1, tty_device_t, chr_file, "pty96") ++ dev_filetrans($1, tty_device_t, chr_file, "pty97") ++ dev_filetrans($1, tty_device_t, chr_file, "pty98") ++ dev_filetrans($1, tty_device_t, chr_file, "pty99") ++ dev_filetrans($1, tty_device_t, chr_file, "adb0") ++ dev_filetrans($1, tty_device_t, chr_file, "adb1") ++ dev_filetrans($1, tty_device_t, chr_file, "adb2") ++ dev_filetrans($1, tty_device_t, chr_file, "adb3") ++ dev_filetrans($1, tty_device_t, chr_file, "adb4") ++ dev_filetrans($1, tty_device_t, chr_file, "adb5") ++ dev_filetrans($1, tty_device_t, chr_file, "adb6") ++ dev_filetrans($1, tty_device_t, chr_file, "adb7") ++ dev_filetrans($1, tty_device_t, chr_file, "adb8") ++ dev_filetrans($1, tty_device_t, chr_file, "adb9") ++ dev_filetrans($1, tty_device_t, chr_file, "capi0") ++ dev_filetrans($1, tty_device_t, chr_file, "capi1") ++ dev_filetrans($1, tty_device_t, chr_file, "capi2") ++ dev_filetrans($1, tty_device_t, chr_file, "capi3") ++ dev_filetrans($1, tty_device_t, chr_file, "capi4") ++ dev_filetrans($1, tty_device_t, chr_file, "capi5") ++ dev_filetrans($1, tty_device_t, chr_file, "capi6") ++ dev_filetrans($1, tty_device_t, chr_file, "capi7") ++ dev_filetrans($1, tty_device_t, chr_file, "capi8") ++ dev_filetrans($1, tty_device_t, chr_file, "capi9") ++ dev_filetrans($1, console_device_t, chr_file, "console") ++ dev_filetrans($1, tty_device_t, chr_file, "cu0") ++ dev_filetrans($1, tty_device_t, chr_file, "cu1") ++ dev_filetrans($1, tty_device_t, chr_file, "cu2") ++ dev_filetrans($1, tty_device_t, chr_file, "cu3") ++ dev_filetrans($1, tty_device_t, chr_file, "cu4") ++ dev_filetrans($1, tty_device_t, chr_file, "cu5") ++ dev_filetrans($1, tty_device_t, chr_file, "cu6") ++ dev_filetrans($1, tty_device_t, chr_file, "cu7") ++ dev_filetrans($1, tty_device_t, chr_file, "cu8") ++ dev_filetrans($1, tty_device_t, chr_file, "cu9") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri0") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri1") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri2") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri3") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri4") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri5") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri6") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri7") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri8") ++ dev_filetrans($1, tty_device_t, chr_file, "dcbri9") ++ dev_filetrans($1, tty_device_t, chr_file, "vcsa") ++ dev_filetrans($1, tty_device_t, chr_file, "vcsb") ++ dev_filetrans($1, tty_device_t, chr_file, "vcsc") ++ dev_filetrans($1, tty_device_t, chr_file, "vcsd") ++ dev_filetrans($1, tty_device_t, chr_file, "vcse") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc0") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc1") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc2") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc3") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc4") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc5") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc6") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc7") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc8") ++ dev_filetrans($1, tty_device_t, chr_file, "hvc9") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi0") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi1") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi2") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi3") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi4") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi5") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi6") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi7") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi8") ++ dev_filetrans($1, tty_device_t, chr_file, "hvsi9") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm0") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm1") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm2") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm3") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm4") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm5") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm6") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm7") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm8") ++ dev_filetrans($1, tty_device_t, chr_file, "ircomm9") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn0") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn1") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn2") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn3") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn4") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn5") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn6") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn7") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn8") ++ dev_filetrans($1, tty_device_t, chr_file, "isdn9") ++ filetrans_pattern($1, devpts_t, ptmx_t, chr_file, "ptmx") ++ dev_filetrans($1, ptmx_t, chr_file, "ptmx") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm0") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm1") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm2") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm3") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm4") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm5") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm6") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm7") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm8") ++ dev_filetrans($1, tty_device_t, chr_file, "rfcomm9") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr0") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr1") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr2") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr3") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr4") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr5") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr6") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr7") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr8") ++ dev_filetrans($1, tty_device_t, chr_file, "slamr9") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM0") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM1") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM2") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM3") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM4") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM5") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM6") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM7") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM8") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyACM9") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS0") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS1") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS2") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS3") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS4") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS5") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS6") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS7") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS8") ++ dev_filetrans($1, tty_device_t, chr_file, "ttyS9") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG0") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG1") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG2") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG3") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG4") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG5") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG6") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG7") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG8") ++ dev_filetrans($1, tty_device_t, chr_file, "ttySG9") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB0") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB1") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB2") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB3") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB4") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB5") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB6") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB7") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB8") ++ dev_filetrans($1, usbtty_device_t, chr_file, "ttyUSB9") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p0") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p1") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p2") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p3") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p4") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p5") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p6") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p7") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p8") ++ dev_filetrans($1, virtio_device_t, chr_file, "vport0p9") ++ dev_filetrans($1, devpts_t, dir, "pts") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc0") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc1") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc2") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc3") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc4") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc5") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc6") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc7") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc8") ++ dev_filetrans($1, tty_device_t, chr_file, "xvc9") + ') +diff --git a/policy/modules/kernel/terminal.te b/policy/modules/kernel/terminal.te +index 66e116a3f9..a0a5d90feb 100644 +--- a/policy/modules/kernel/terminal.te ++++ b/policy/modules/kernel/terminal.te +@@ -29,6 +29,7 @@ files_mountpoint(devpts_t) + fs_associate_tmpfs(devpts_t) + fs_type(devpts_t) + fs_use_trans devpts gen_context(system_u:object_r:devpts_t,s0); ++dev_associate(devpts_t) + + # + # devtty_t is the type of /dev/tty. +@@ -57,5 +58,8 @@ dev_node(tty_device_t) + type usbtty_device_t, serial_device; + dev_node(usbtty_device_t) + ++# ++# virtio_device_t is the type of /dev/vport[0-9]p[0-9] ++# + type virtio_device_t, serial_device; + dev_node(virtio_device_t) +diff --git a/policy/modules/kernel/unlabelednet.fc b/policy/modules/kernel/unlabelednet.fc +new file mode 100644 +index 0000000000..f310b9d551 +--- /dev/null ++++ b/policy/modules/kernel/unlabelednet.fc +@@ -0,0 +1 @@ ++# No unlabelednet file contexts. +diff --git a/policy/modules/kernel/unlabelednet.if b/policy/modules/kernel/unlabelednet.if +new file mode 100644 +index 0000000000..0ce04703af +--- /dev/null ++++ b/policy/modules/kernel/unlabelednet.if +@@ -0,0 +1 @@ ++## Policy for allowing confined domains to use unlabeled_t packets +diff --git a/policy/modules/kernel/unlabelednet.te b/policy/modules/kernel/unlabelednet.te +new file mode 100644 +index 0000000000..48caabc7e8 +--- /dev/null ++++ b/policy/modules/kernel/unlabelednet.te +@@ -0,0 +1,12 @@ ++policy_module(unlabelednet, 1.0.0) ++ ++corenet_enable_unlabeled_packets() ++ ++gen_require(` ++ type unlabeled_t; ++ attribute domain; ++') ++ ++# temporary hack until labeling on packets is supported ++allow domain unlabeled_t:packet { send recv }; ++ +diff --git a/policy/modules/roles/auditadm.te b/policy/modules/roles/auditadm.te +index 834a065de3..ff9369756a 100644 +--- a/policy/modules/roles/auditadm.te ++++ b/policy/modules/roles/auditadm.te +@@ -7,7 +7,7 @@ policy_module(auditadm, 2.2.0) + + role auditadm_r; + role system_r; +-userdom_unpriv_user_template(auditadm) ++userdom_confined_admin_template(auditadm) + + ######################################## + # +@@ -22,16 +22,23 @@ corecmd_exec_shell(auditadm_t) + + domain_kill_all_domains(auditadm_t) + ++mls_file_read_all_levels(auditadm_t) ++ ++selinux_read_policy(auditadm_t) ++ + logging_send_syslog_msg(auditadm_t) + logging_read_generic_logs(auditadm_t) + logging_manage_audit_log(auditadm_t) + logging_manage_audit_config(auditadm_t) + logging_run_auditctl(auditadm_t, auditadm_r) + logging_run_auditd(auditadm_t, auditadm_r) ++logging_stream_connect_syslog(auditadm_t) + + seutil_run_runinit(auditadm_t, auditadm_r) + seutil_read_bin_policy(auditadm_t) + ++userdom_dontaudit_search_admin_dir(auditadm_t) ++ + optional_policy(` + consoletype_exec(auditadm_t) + ') +diff --git a/policy/modules/roles/logadm.te b/policy/modules/roles/logadm.te +index 3a45a3ef09..7499f24b53 100644 +--- a/policy/modules/roles/logadm.te ++++ b/policy/modules/roles/logadm.te +@@ -7,13 +7,12 @@ policy_module(logadm, 1.0.0) + + role logadm_r; + +-userdom_base_user_template(logadm) ++userdom_confined_admin_template(logadm) + + ######################################## + # + # logadmin local policy + # + +-allow logadm_t self:capability { dac_override dac_read_search kill sys_ptrace sys_nice }; +- ++allow logadm_t self:capability { dac_override dac_read_search kill sys_nice }; + logging_admin(logadm_t, logadm_r) +diff --git a/policy/modules/roles/secadm.te b/policy/modules/roles/secadm.te +index da111206f4..21ab89b201 100644 +--- a/policy/modules/roles/secadm.te ++++ b/policy/modules/roles/secadm.te +@@ -7,8 +7,11 @@ policy_module(secadm, 2.4.0) + + role secadm_r; + +-userdom_unpriv_user_template(secadm) +-userdom_security_admin_template(secadm_t, secadm_r) ++userdom_confined_admin_template(secadm) ++userdom_security_admin(secadm_t, secadm_r) ++userdom_inherit_append_admin_home_files(secadm_t) ++userdom_read_admin_home_files(secadm_t) ++userdom_manage_tmp_role(secadm_r, secadm_t) + + ######################################## + # +@@ -17,9 +20,12 @@ userdom_security_admin_template(secadm_t, secadm_r) + + allow secadm_t self:capability { dac_read_search dac_override }; + ++kernel_read_system_state(secadm_t) ++ + corecmd_exec_shell(secadm_t) + + dev_relabel_all_dev_nodes(secadm_t) ++dev_read_urand(secadm_t) + + domain_obj_id_change_exemption(secadm_t) + +@@ -30,14 +36,15 @@ mls_file_upgrade(secadm_t) + mls_file_downgrade(secadm_t) + + auth_role(secadm_r, secadm_t) +-files_relabel_non_auth_files(secadm_t) +-auth_relabel_shadow(secadm_t) ++files_relabel_all_files(secadm_t) + + init_exec(secadm_t) + + logging_read_audit_log(secadm_t) + logging_read_generic_logs(secadm_t) + logging_read_audit_config(secadm_t) ++logging_map_audit_config(secadm_t) ++logging_map_audit_log(secadm_t) + + optional_policy(` + aide_run(secadm_t, secadm_r) +diff --git a/policy/modules/roles/staff.if b/policy/modules/roles/staff.if +index 234a940f98..d340f20b9c 100644 +--- a/policy/modules/roles/staff.if ++++ b/policy/modules/roles/staff.if +@@ -1,4 +1,4 @@ +-## Administrator's unprivileged user role ++## Administrator's unprivileged user + + ######################################## + ## +diff --git a/policy/modules/roles/staff.te b/policy/modules/roles/staff.te +index 0fef1fca21..ce9137779d 100644 +--- a/policy/modules/roles/staff.te ++++ b/policy/modules/roles/staff.te +@@ -8,11 +8,75 @@ policy_module(staff, 2.4.0) + role staff_r; + + userdom_unpriv_user_template(staff) ++fs_exec_noxattr(staff_t) ++ ++## ++##

      ++## allow staff user to create and transition to svirt domains. ++##

      ++##
      ++gen_tunable(staff_use_svirt, false) + + ######################################## + # + # Local policy + # ++corenet_ib_access_unlabeled_pkeys(staff_t) ++ ++kernel_read_ring_buffer(staff_t) ++kernel_getattr_core_if(staff_t) ++kernel_getattr_message_if(staff_t) ++kernel_read_software_raid_state(staff_t) ++kernel_read_fs_sysctls(staff_t) ++kernel_read_numa_state(staff_t) ++kernel_write_numa_state(staff_t) ++ ++fs_read_hugetlbfs_files(staff_t) ++files_dontaudit_read_all_symlinks(staff_t) ++ ++dev_read_cpuid(staff_t) ++dev_read_kmsg(staff_t) ++dev_map_video_dev(staff_t) ++ ++domain_read_all_domains_state(staff_t) ++domain_getcap_all_domains(staff_t) ++domain_getsched_all_domains(staff_t) ++domain_getattr_all_domains(staff_t) ++domain_obj_id_change_exemption(staff_t) ++ ++files_read_kernel_modules(staff_t) ++ ++seutil_read_module_store(staff_t) ++seutil_run_newrole(staff_t, staff_r) ++seutil_dbus_chat_semanage(staff_t) ++seutil_read_login_config(staff_t) ++ ++storage_read_scsi_generic(staff_t) ++storage_write_scsi_generic(staff_t) ++ ++term_use_unallocated_ttys(staff_t) ++term_use_generic_ptys(staff_t) ++ ++auth_domtrans_pam_console(staff_t) ++ ++init_dbus_chat(staff_t) ++init_dbus_chat_script(staff_t) ++init_status(staff_t) ++ ++miscfiles_read_hwdata(staff_t) ++miscfiles_map_generic_certs(staff_t) ++ ++ifndef(`enable_mls',` ++ selinux_read_policy(staff_t) ++') ++ ++optional_policy(` ++ abrt_read_cache(staff_t) ++') ++ ++optional_policy(` ++ accountsd_read_lib_files(staff_t) ++') + + optional_policy(` + apache_role(staff_r, staff_t) +@@ -22,33 +86,213 @@ optional_policy(` + auditadm_role_change(staff_r) + ') + ++optional_policy(` ++ blueman_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ kdumpgui_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ bluetooth_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ chrome_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ colord_dbus_chat(staff_t) ++') ++ + optional_policy(` + dbadm_role_change(staff_r) + ') + + optional_policy(` +- git_role(staff_r, staff_t) ++ dnsmasq_read_pid_files(staff_t) ++') ++ ++optional_policy(` ++ dmesg_exec(staff_t) ++') ++ ++optional_policy(` ++ dirsrv_stream_connect(staff_t) ++ dirsrv_manage_log(staff_t) ++ dirsrv_manage_var_lib(staff_t) ++ dirsrv_manage_var_run(staff_t) ++ dirsrv_manage_config(staff_t) ++') ++ ++ ++ ++optional_policy(` ++ container_stream_connect(staff_t) ++ container_runtime_exec(staff_t) ++') ++ ++optional_policy(` ++ firewalld_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ firewallgui_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ freqset_run(staff_t, staff_r) ++') ++ ++optional_policy(` ++ irc_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ journalctl_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ kerneloops_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ kpatch_run(staff_t,staff_r) ++') ++ ++optional_policy(` ++ iptables_systemctl(staff_t) ++') ++ ++optional_policy(` ++ logadm_role_change(staff_r) ++') ++ ++optional_policy(` ++ lpd_list_spool(staff_t) ++') ++ ++optional_policy(` ++ mandb_map_cache_files(staff_t) ++') ++ ++optional_policy(` ++ mock_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ mozilla_run_plugin(staff_t, staff_r) ++') ++ ++optional_policy(` ++ modutils_read_module_config(staff_t) ++ modutils_read_module_deps(staff_t) ++') ++ ++optional_policy(` ++ netutils_run_ping(staff_t, staff_r) ++ netutils_run_traceroute(staff_t, staff_r) ++ netutils_signal_ping(staff_t) ++ netutils_kill_ping(staff_t) ++') ++ ++optional_policy(` ++ oident_manage_user_content(staff_t) ++ oident_relabel_user_content(staff_t) ++') ++ ++optional_policy(` ++ mta_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ mysql_exec(staff_t) ++') ++ ++optional_policy(` ++ polipo_role(staff_r, staff_t) ++ polipo_named_filetrans_cache_home_dirs(staff_t) ++ polipo_named_filetrans_config_home_files(staff_t) ++') ++ ++optional_policy(` ++ openvpn_exec(staff_t) + ') + + optional_policy(` + postgresql_role(staff_r, staff_t) + ') + ++optional_policy(` ++ rtkit_scheduled(staff_t) ++') ++ ++optional_policy(` ++ rpm_dbus_chat(staff_t) ++') ++ ++optional_policy(` ++ rwho_read_spool_files(staff_t) ++') ++ + optional_policy(` + secadm_role_change(staff_r) + ') + + optional_policy(` +- ssh_role_template(staff, staff_r, staff_t) ++ sandbox_transition(staff_t, staff_r) + ') + + optional_policy(` +- sudo_role_template(staff, staff_r, staff_t) ++ sandbox_x_transition(staff_t, staff_r) ++') ++ ++optional_policy(` ++ screen_role_template(staff, staff_r, staff_t) + ') + + optional_policy(` + sysadm_role_change(staff_r) + userdom_dontaudit_use_user_terminals(staff_t) ++ userdom_dontaudit_read_admin_home_files(staff_t) ++') ++ ++optional_policy(` ++ systemd_read_unit_files(staff_t) ++ systemd_exec_systemctl(staff_t) ++') ++ ++optional_policy(` ++ setroubleshoot_stream_connect(staff_t) ++ setroubleshoot_dbus_chat(staff_t) ++ setroubleshoot_dbus_chat_fixit(staff_t) ++') ++ ++optional_policy(` ++ ssh_role_template(staff, staff_r, staff_t) ++') ++ ++optional_policy(` ++ sudo_role_template(staff, staff_r, staff_t) ++') ++ ++optional_policy(` ++ userhelper_console_role_template(staff, staff_r, staff_t) ++') ++ ++optional_policy(` ++ unconfined_role_change(staff_r) ++') ++ ++optional_policy(` ++ usbmuxd_stream_connect(staff_t) ++') ++ ++optional_policy(` ++ virt_getattr_exec(staff_t) ++ virt_search_images(staff_t) ++ virt_stream_connect(staff_t) + ') + + optional_policy(` +@@ -56,7 +300,24 @@ optional_policy(` + ') + + optional_policy(` +- xserver_role(staff_r, staff_t) ++ vmtools_run_helper(staff_t, staff_r) ++') ++ ++optional_policy(` ++ vnstatd_read_lib_files(staff_t) ++') ++ ++optional_policy(` ++ webadm_role_change(staff_r) ++') ++ ++optional_policy(` ++ wireshark_role(staff_r, staff_t) ++') ++ ++optional_policy(` ++ xserver_read_log(staff_t) ++ xserver_run(staff_t, staff_r) + ') + + ifndef(`distro_redhat',` +@@ -64,10 +325,6 @@ ifndef(`distro_redhat',` + auth_role(staff_r, staff_t) + ') + +- optional_policy(` +- bluetooth_role(staff_r, staff_t) +- ') +- + optional_policy(` + cdrecord_role(staff_r, staff_t) + ') +@@ -78,10 +335,6 @@ ifndef(`distro_redhat',` + + optional_policy(` + dbus_role_template(staff, staff_r, staff_t) +- +- optional_policy(` +- gnome_role_template(staff, staff_r, staff_t) +- ') + ') + + optional_policy(` +@@ -100,10 +353,6 @@ ifndef(`distro_redhat',` + gpg_role(staff_r, staff_t) + ') + +- optional_policy(` +- irc_role(staff_r, staff_t) +- ') +- + optional_policy(` + java_role(staff_r, staff_t) + ') +@@ -124,10 +373,6 @@ ifndef(`distro_redhat',` + mplayer_role(staff_r, staff_t) + ') + +- optional_policy(` +- mta_role(staff_r, staff_t) +- ') +- + optional_policy(` + pyzor_role(staff_r, staff_t) + ') +@@ -140,10 +385,6 @@ ifndef(`distro_redhat',` + rssh_role(staff_r, staff_t) + ') + +- optional_policy(` +- screen_role_template(staff, staff_r, staff_t) +- ') +- + optional_policy(` + spamassassin_role(staff_r, staff_t) + ') +@@ -176,3 +417,24 @@ ifndef(`distro_redhat',` + wireshark_role(staff_r, staff_t) + ') + ') ++ ++tunable_policy(`selinuxuser_execmod',` ++ userdom_execmod_user_home_files(staff_t) ++') ++ ++optional_policy(` ++ virt_transition_svirt(staff_t, staff_r) ++ virt_filetrans_home_content(staff_t) ++') ++ ++optional_policy(` ++ tunable_policy(`staff_use_svirt',` ++ allow staff_t self:fifo_file relabelfrom; ++ dev_rw_kvm(staff_t) ++ virt_manage_images(staff_t) ++ virt_stream_connect_svirt(staff_t) ++ virt_systemctl(staff_t) ++ virt_rw_stream_sockets_svirt(staff_t) ++ virt_exec(staff_t) ++ ') ++') +diff --git a/policy/modules/roles/sysadm.if b/policy/modules/roles/sysadm.if +index ff92430786..36740eab39 100644 +--- a/policy/modules/roles/sysadm.if ++++ b/policy/modules/roles/sysadm.if +@@ -70,6 +70,23 @@ interface(`sysadm_shell_domtrans',` + allow sysadm_t $1:process sigchld; + ') + ++####################################### ++## ++## sysadm stub interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sysadm_stub',` ++ gen_require(` ++ type sysadm_t; ++ role sysadm_r; ++ ') ++') ++ + ######################################## + ## + ## Execute a generic bin program in the sysadm domain. +diff --git a/policy/modules/roles/sysadm.te b/policy/modules/roles/sysadm.te +index 2522ca6c0f..5da61cc408 100644 +--- a/policy/modules/roles/sysadm.te ++++ b/policy/modules/roles/sysadm.te +@@ -5,39 +5,114 @@ policy_module(sysadm, 2.6.1) + # Declarations + # + +-## +-##

      +-## Allow sysadm to debug or ptrace all processes. +-##

      +-##
      +-gen_tunable(allow_ptrace, false) +- + role sysadm_r; + + userdom_admin_user_template(sysadm) ++allow sysadm_t self:socket { accept listen }; ++allow sysadm_t self:netlink_tcpdiag_socket create_netlink_socket_perms; ++allow sysadm_t self:netlink_selinux_socket create_socket_perms; ++allow sysadm_t self:tipc_socket create_socket_perms; ++allow sysadm_t self:netlink_generic_socket create_socket_perms; ++allow sysadm_t self:sctp_socket create_socket_perms; ++allow sysadm_t self:rawip_socket create_socket_perms; + +-ifndef(`enable_mls',` +- userdom_security_admin_template(sysadm_t, sysadm_r) +-') + + ######################################## + # + # Local policy + # ++kernel_read_fs_sysctls(sysadm_t) ++kernel_read_all_proc(sysadm_t) + + corecmd_exec_shell(sysadm_t) + ++dev_filetrans_all_named_dev(sysadm_t) ++ ++domain_dontaudit_read_all_domains_state(sysadm_t) ++ ++files_read_kernel_modules(sysadm_t) ++files_filetrans_named_content(sysadm_t) ++files_status_etc(sysadm_t) ++ ++fs_mount_fusefs(sysadm_t) ++ ++storage_filetrans_all_named_dev(sysadm_t) ++ ++term_filetrans_all_named_dev(sysadm_t) ++ + mls_process_read_up(sysadm_t) ++mls_file_read_all_levels(sysadm_t) ++mls_file_write_all_levels(sysadm_t) ++mls_file_read_to_clearance(sysadm_t) ++mls_process_write_to_clearance(sysadm_t) ++ ++storage_setattr_fixed_disk_dev(sysadm_t) + + ubac_process_exempt(sysadm_t) + ubac_file_exempt(sysadm_t) + ubac_fd_exempt(sysadm_t) + ++application_exec(sysadm_t) ++ ++init_filetrans_named_content(sysadm_t) ++init_disable_services(sysadm_t) ++init_enable_services(sysadm_t) ++init_reload_services(sysadm_t) + init_exec(sysadm_t) ++init_exec_script_files(sysadm_t) ++init_dbus_chat(sysadm_t) ++init_script_role_transition(sysadm_r) ++init_status(sysadm_t) ++init_reboot(sysadm_t) ++init_halt(sysadm_t) ++init_undefined(sysadm_t) ++init_ioctl_stream_sockets(sysadm_t) ++init_prog_run_bpf(sysadm_t) ++ ++logging_filetrans_named_content(sysadm_t) ++logging_map_audit_config(sysadm_t) ++logging_map_audit_log(sysadm_t) ++ ++miscfiles_filetrans_named_content(sysadm_t) ++miscfiles_read_hwdata(sysadm_t) ++miscfiles_map_generic_certs(sysadm_t) ++ ++sysnet_filetrans_named_content(sysadm_t) + + # Add/remove user home directories ++userdom_manage_user_tmp_chr_files(sysadm_t) + userdom_manage_user_home_dirs(sysadm_t) + userdom_home_filetrans_user_home_dir(sysadm_t) ++userdom_manage_tmp_role(sysadm_r, sysadm_t) ++userdom_exec_admin_home_files(sysadm_t) ++userdom_manage_admin_files(sysadm_t) ++userdom_manage_admin_dirs(sysadm_t) ++ ++corenet_ib_access_unlabeled_pkeys(sysadm_t) ++corenet_ib_manage_subnet_unlabeled_endports(sysadm_t) ++ ++optional_policy(` ++ abrt_filetrans_named_content(sysadm_t) ++') ++ ++optional_policy(` ++ alsa_filetrans_named_content(sysadm_t) ++') ++ ++optional_policy(` ++ dirsrv_domtrans(sysadm_t) ++ dirsrv_stream_connect(sysadm_t) ++ dirsrv_manage_log(sysadm_t) ++ dirsrv_manage_var_lib(sysadm_t) ++ dirsrv_manage_var_run(sysadm_t) ++ dirsrv_manage_config(sysadm_t) ++ dirsrv_run(sysadm_t, sysadm_r) ++') ++ ++optional_policy(` ++ ssh_filetrans_admin_home_content(sysadm_t) ++ ssh_filetrans_keys(sysadm_t) ++') + + ifdef(`direct_sysadm_daemon',` + optional_policy(` +@@ -55,13 +130,7 @@ ifdef(`distro_gentoo',` + init_exec_rc(sysadm_t) + ') + +-ifndef(`enable_mls',` +- logging_manage_audit_log(sysadm_t) +- logging_manage_audit_config(sysadm_t) +- logging_run_auditctl(sysadm_t, sysadm_r) +-') +- +-tunable_policy(`allow_ptrace',` ++tunable_policy(`deny_ptrace',`',` + domain_ptrace_all_domains(sysadm_t) + ') + +@@ -71,9 +140,9 @@ optional_policy(` + + optional_policy(` + apache_run_helper(sysadm_t, sysadm_r) ++ apache_filetrans_named_content(sysadm_t) + #apache_run_all_scripts(sysadm_t, sysadm_r) + #apache_domtrans_sys_script(sysadm_t) +- apache_role(sysadm_r, sysadm_t) + ') + + optional_policy(` +@@ -87,6 +156,7 @@ optional_policy(` + + optional_policy(` + asterisk_stream_connect(sysadm_t) ++ asterisk_exec(sysadm_t) + ') + + optional_policy(` +@@ -109,12 +179,18 @@ optional_policy(` + bootloader_run(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ certmonger_dbus_chat(sysadm_t) ++') ++ + optional_policy(` + certwatch_run(sysadm_t, sysadm_r) + ') + + optional_policy(` + clock_run(sysadm_t, sysadm_r) ++ clock_manage_adjtime(sysadm_t) ++ clock_filetrans_named_content(sysadm_t) + ') + + optional_policy(` +@@ -122,11 +198,30 @@ optional_policy(` + ') + + optional_policy(` +- consoletype_run(sysadm_t, sysadm_r) ++ cron_admin_role(sysadm_r, sysadm_t) + ') + + optional_policy(` +- cvs_exec(sysadm_t) ++ consoletype_exec(sysadm_t) ++') ++ ++optional_policy(` ++ daemonstools_run_start(sysadm_t, sysadm_r) ++') ++ ++optional_policy(` ++ gen_require(` ++ type sysadm_dbusd_t; ++ ') ++ dontaudit sysadm_dbusd_t self:capability net_admin; ++ ++') ++ ++optional_policy(` ++ systemd_dbus_chat_timedated(sysadm_t) ++ systemd_dbus_chat_hostnamed(sysadm_t) ++ systemd_dbus_chat_localed(sysadm_t) ++ systemd_hwdb_mmap_config(sysadm_t) + ') + + optional_policy(` +@@ -139,6 +234,10 @@ optional_policy(` + ddcprobe_run(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ devicekit_filetrans_named_content(sysadm_t) ++') ++ + optional_policy(` + dmesg_exec(sysadm_t) + ') +@@ -155,6 +254,10 @@ optional_policy(` + firstboot_run(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ firewalld_dbus_chat(sysadm_t) ++') ++ + optional_policy(` + fstools_run(sysadm_t, sysadm_r) + ') +@@ -163,6 +266,11 @@ optional_policy(` + hostname_run(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ hwloc_admin(sysadm_t) ++ hwloc_run_dhwd(sysadm_t, sysadm_r) ++') ++ + optional_policy(` + hadoop_role(sysadm_r, sysadm_t) + ') +@@ -175,10 +283,31 @@ optional_policy(` + ipsec_stream_connect(sysadm_t) + # for lsof + ipsec_getattr_key_sockets(sysadm_t) ++ ipsec_run_setkey(sysadm_t, sysadm_r) ++ ipsec_run_racoon(sysadm_t, sysadm_r) ++ ipsec_stream_connect_racoon(sysadm_t) ++ ++ optional_policy(` ++ ipsec_mgmt_dbus_chat(sysadm_t) ++ ') + ') + + optional_policy(` + iptables_run(sysadm_t, sysadm_r) ++ iptables_filetrans_named_content(sysadm_t) ++') ++ ++optional_policy(` ++ irc_role(sysadm_r, sysadm_t) ++') ++ ++optional_policy(` ++ kerberos_exec_kadmind(sysadm_t) ++ kerberos_filetrans_named_content(sysadm_t) ++') ++ ++optional_policy(` ++ kpatch_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +@@ -190,11 +319,12 @@ optional_policy(` + ') + + optional_policy(` +- lockdev_role(sysadm_r, sysadm_t) ++ logrotate_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- logrotate_run(sysadm_t, sysadm_r) ++ corenet_tcp_bind_ldap_port(sysadm_t) ++ ldap_admin(sysadm_t, sysadm_r) + ') + + optional_policy(` +@@ -210,22 +340,21 @@ optional_policy(` + modutils_run_depmod(sysadm_t, sysadm_r) + modutils_run_insmod(sysadm_t, sysadm_r) + modutils_run_update_mods(sysadm_t, sysadm_r) ++ modutils_read_module_deps(sysadm_t) ++ modules_filetrans_named_content(sysadm_t) + ') + + optional_policy(` + mount_run(sysadm_t, sysadm_r) +-') +- +-optional_policy(` +- mozilla_role(sysadm_r, sysadm_t) +-') +- +-optional_policy(` +- mplayer_role(sysadm_r, sysadm_t) ++ mount_run_showmount(sysadm_t, sysadm_r) + ') + + optional_policy(` + mta_role(sysadm_r, sysadm_t) ++ # this is defined in userdom_common_user_template ++ #mta_filetrans_home_content(sysadm_t) ++ mta_filetrans_admin_home_content(sysadm_t) ++ mta_rw_aliases(sysadm_t) + ') + + optional_policy(` +@@ -236,25 +365,53 @@ optional_policy(` + mysql_stream_connect(sysadm_t) + ') + ++optional_policy(` ++ ncftool_run(sysadm_t, sysadm_r) ++') ++ + optional_policy(` + netutils_run(sysadm_t, sysadm_r) + netutils_run_ping(sysadm_t, sysadm_r) + netutils_run_traceroute(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ networkmanager_filetrans_named_content(sysadm_t) ++ networkmanager_stream_connect(sysadm_t) ++') ++ + optional_policy(` + ntp_stub() + corenet_udp_bind_ntp_port(sysadm_t) ++ ntp_admin(sysadm_t, sysadm_r) ++') ++ ++optional_policy(` ++ nx_filetrans_named_content(sysadm_t) ++') ++ ++optional_policy(` ++ oddjob_dbus_chat(sysadm_t) + ') + + optional_policy(` + oav_run_update(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ openvpn_run(sysadm_t, sysadm_r) ++') ++ + optional_policy(` + pcmcia_run_cardctl(sysadm_t, sysadm_r) + ') + ++optional_policy(` ++ polipo_role(sysadm_r, sysadm_t) ++ polipo_named_filetrans_admin_cache_home_dirs(sysadm_t) ++ polipo_named_filetrans_admin_config_home_files(sysadm_t) ++') ++ + optional_policy(` + portage_run(sysadm_t, sysadm_r) + portage_run_fetch(sysadm_t, sysadm_r) +@@ -266,19 +423,33 @@ optional_policy(` + ') + + optional_policy(` +- pyzor_role(sysadm_r, sysadm_t) ++ postfix_admin(sysadm_t, sysadm_r) ++') ++ ++optional_policy(` ++ postgresql_admin(sysadm_t, sysadm_r) ++ postgresql_run(sysadm_t, sysadm_r) ++') ++ ++optional_policy(` ++ journalctl_role(sysadm_r, sysadm_t) ++') ++ ++optional_policy(` ++ prelink_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- quota_run(sysadm_t, sysadm_r) ++ puppet_run_puppetca(sysadm_t, sysadm_r) ++ puppet_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- raid_run_mdadm(sysadm_r, sysadm_t) ++ quota_filetrans_named_content(sysadm_t) + ') + + optional_policy(` +- razor_role(sysadm_r, sysadm_t) ++ raid_run_mdadm(sysadm_r,sysadm_t) + ') + + optional_policy(` +@@ -287,14 +458,16 @@ optional_policy(` + + optional_policy(` + rpm_run(sysadm_t, sysadm_r) ++ rpm_dbus_chat(sysadm_t, sysadm_r) + ') + + optional_policy(` +- rssh_role(sysadm_r, sysadm_t) ++ rtkit_daemon_dbus_chat(sysadm_t) + ') + + optional_policy(` + rsync_exec(sysadm_t) ++ rsync_filetrans_named_content(sysadm_t) + ') + + optional_policy(` +@@ -308,19 +481,28 @@ optional_policy(` + + optional_policy(` + screen_role_template(sysadm, sysadm_r, sysadm_t) ++ allow sysadm_screen_t self:capability { dac_read_search dac_override }; + ') + + optional_policy(` + secadm_role_change(sysadm_r) + ') + ++optional_policy(` ++ setroubleshoot_stream_connect(sysadm_t) ++ setroubleshoot_dbus_chat(sysadm_t) ++ setroubleshoot_dbus_chat_fixit(sysadm_t) ++') ++ + optional_policy(` + seutil_run_setfiles(sysadm_t, sysadm_r) + seutil_run_runinit(sysadm_t, sysadm_r) ++ seutil_dbus_chat_semanage(sysadm_t) ++ seutil_read_login_config(sysadm_t) + ') + + optional_policy(` +- spamassassin_role(sysadm_r, sysadm_t) ++ shutdown_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +@@ -345,30 +527,38 @@ optional_policy(` + ') + + optional_policy(` +- thunderbird_role(sysadm_r, sysadm_t) ++ systemd_passwd_agent_run(sysadm_t, sysadm_r) ++ systemd_config_all_services(sysadm_t) ++ systemd_manage_all_unit_files(sysadm_t) ++ systemd_manage_all_unit_lnk_files(sysadm_t) ++ systemd_login_status(sysadm_t) ++ systemd_login_reboot(sysadm_t) ++ systemd_login_halt(sysadm_t) ++ systemd_login_undefined(sysadm_t) ++ systemd_tmpfiles_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- tripwire_run_siggen(sysadm_t, sysadm_r) +- tripwire_run_tripwire(sysadm_t, sysadm_r) +- tripwire_run_twadmin(sysadm_t, sysadm_r) +- tripwire_run_twprint(sysadm_t, sysadm_r) ++ systemd_exec_sysctl(sysadm_t) + ') + + optional_policy(` +- tvtime_role(sysadm_r, sysadm_t) ++ tftp_filetrans_named_content(sysadm_t) + ') + + optional_policy(` +- tzdata_domtrans(sysadm_t) ++ tripwire_run_siggen(sysadm_t, sysadm_r) ++ tripwire_run_tripwire(sysadm_t, sysadm_r) ++ tripwire_run_twadmin(sysadm_t, sysadm_r) ++ tripwire_run_twprint(sysadm_t, sysadm_r) + ') + + optional_policy(` +- uml_role(sysadm_r, sysadm_t) ++ tzdata_domtrans(sysadm_t) + ') + + optional_policy(` +- unconfined_domtrans(sysadm_t) ++ udev_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +@@ -379,10 +569,6 @@ optional_policy(` + usbmodules_run(sysadm_t, sysadm_r) + ') + +-optional_policy(` +- userhelper_role_template(sysadm, sysadm_r, sysadm_t) +-') +- + optional_policy(` + usermanage_run_admin_passwd(sysadm_t, sysadm_r) + usermanage_run_groupadd(sysadm_t, sysadm_r) +@@ -391,6 +577,9 @@ optional_policy(` + + optional_policy(` + virt_stream_connect(sysadm_t) ++ virt_filetrans_home_content(sysadm_t) ++ virt_manage_pid_dirs(sysadm_t) ++ virt_transition_svirt_sandbox(sysadm_t, sysadm_r) + ') + + optional_policy(` +@@ -398,19 +587,19 @@ optional_policy(` + ') + + optional_policy(` +- vpn_run(sysadm_t, sysadm_r) ++ vlock_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- webalizer_run(sysadm_t, sysadm_r) ++ vpn_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- wireshark_role(sysadm_r, sysadm_t) ++ webalizer_run(sysadm_t, sysadm_r) + ') + + optional_policy(` +- vlock_run(sysadm_t, sysadm_r) ++ wireshark_role(sysadm_r, sysadm_t) + ') + + optional_policy(` +@@ -421,53 +610,11 @@ optional_policy(` + yam_run(sysadm_t, sysadm_r) + ') + +-ifndef(`distro_redhat',` +- optional_policy(` +- auth_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- bluetooth_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- cdrecord_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- cron_admin_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- dbus_role_template(sysadm, sysadm_r, sysadm_t) +- +- optional_policy(` +- gnome_role_template(sysadm, sysadm_r, sysadm_t) +- ') +- ') +- +- optional_policy(` +- evolution_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- games_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- gift_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- gpg_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- irc_role(sysadm_r, sysadm_t) +- ') +- +- optional_policy(` +- java_role(sysadm_r, sysadm_t) +- ') ++optional_policy(` ++ zebra_stream_connect(sysadm_t) + ') + ++optional_policy(` ++ gnome_role_template(sysadm, sysadm_r, sysadm_t) ++ gnome_filetrans_admin_home_content(sysadm_t) ++') +diff --git a/policy/modules/roles/sysadm_secadm.fc b/policy/modules/roles/sysadm_secadm.fc +new file mode 100644 +index 0000000000..ae3b6db927 +--- /dev/null ++++ b/policy/modules/roles/sysadm_secadm.fc +@@ -0,0 +1 @@ ++# No context +diff --git a/policy/modules/roles/sysadm_secadm.if b/policy/modules/roles/sysadm_secadm.if +new file mode 100644 +index 0000000000..bd83148e18 +--- /dev/null ++++ b/policy/modules/roles/sysadm_secadm.if +@@ -0,0 +1 @@ ++## No Interfaces +diff --git a/policy/modules/roles/sysadm_secadm.te b/policy/modules/roles/sysadm_secadm.te +new file mode 100644 +index 0000000000..3f9739e1eb +--- /dev/null ++++ b/policy/modules/roles/sysadm_secadm.te +@@ -0,0 +1,27 @@ ++policy_module(sysadm_secadm, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++gen_require(` ++ type sysadm_t; ++ type sysadm_sudo_t; ++ role sysadm_r; ++') ++ ++userdom_security_admin_template(sysadm_t, sysadm_r) ++userdom_security_admin_template(sysadm_sudo_t, sysadm_r) ++ ++####################################### ++# ++# Local policy ++# ++ ++mls_file_write_all_levels(sysadm_t) ++ ++logging_manage_audit_log(sysadm_t) ++logging_manage_audit_config(sysadm_t) ++logging_run_auditctl(sysadm_t, sysadm_r) ++logging_stream_connect_syslog(sysadm_t) +diff --git a/policy/modules/roles/unconfineduser.fc b/policy/modules/roles/unconfineduser.fc +new file mode 100644 +index 0000000000..d9efb902a3 +--- /dev/null ++++ b/policy/modules/roles/unconfineduser.fc +@@ -0,0 +1,8 @@ ++# Add programs here which should not be confined by SELinux ++# e.g.: ++# /usr/local/bin/appsrv -- gen_context(system_u:object_r:unconfined_exec_t,s0) ++# For the time being until someone writes a sane policy, we need initrc to transition to unconfined_t ++#/usr/bin/vncserver -- gen_context(system_u:object_r:unconfined_exec_t,s0) ++ ++#/usr/sbin/xrdp -- gen_context(system_u:object_r:unconfined_exec_t,s0) ++#/usr/sbin/xrdp-sesman -- gen_context(system_u:object_r:unconfined_exec_t,s0) +diff --git a/policy/modules/roles/unconfineduser.if b/policy/modules/roles/unconfineduser.if +new file mode 100644 +index 0000000000..edd24e51dc +--- /dev/null ++++ b/policy/modules/roles/unconfineduser.if +@@ -0,0 +1,709 @@ ++## Unconfined user role ++ ++######################################## ++## ++## Change from the unconfineduser role. ++## ++## ++##

      ++## Change from the unconfineduser role to ++## the specified role. ++##

      ++##

      ++## This is an interface to support third party modules ++## and its use is not allowed in upstream reference ++## policy. ++##

      ++##
      ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`unconfined_role_change_to',` ++ gen_require(` ++ role unconfined_r; ++ ') ++ ++ allow unconfined_r $1; ++') ++ ++######################################## ++## ++## Transition to the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_domtrans',` ++ gen_require(` ++ type unconfined_t, unconfined_exec_t; ++ ') ++ ++ domtrans_pattern($1,unconfined_exec_t,unconfined_t) ++') ++ ++######################################## ++## ++## Execute specified programs in the unconfined domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++## ++## ++## The role to allow the unconfined domain. ++## ++## ++# ++interface(`unconfined_run',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ unconfined_domtrans($1) ++ role $2 types unconfined_t; ++') ++ ++######################################## ++## ++## Transition to the unconfined domain by executing a shell. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_shell_domtrans',` ++ gen_require(` ++ attribute unconfined_login_domain; ++ ') ++ typeattribute $1 unconfined_login_domain; ++') ++ ++######################################## ++## ++## Allow unconfined to execute the specified program in ++## the specified domain. ++## ++## ++##

      ++## Allow unconfined to execute the specified program in ++## the specified domain. ++##

      ++##

      ++## This is a interface to support third party modules ++## and its use is not allowed in upstream reference ++## policy. ++##

      ++##
      ++## ++## ++## Domain to execute in. ++## ++## ++## ++## ++## Domain entry point file. ++## ++## ++# ++interface(`unconfined_domtrans_to',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ domtrans_pattern(unconfined_t,$2,$1) ++') ++ ++######################################## ++## ++## Allow unconfined to execute the specified program in ++## the specified domain. Allow the specified domain the ++## unconfined role and use of unconfined user terminals. ++## ++## ++##

      ++## Allow unconfined to execute the specified program in ++## the specified domain. Allow the specified domain the ++## unconfined role and use of unconfined user terminals. ++##

      ++##

      ++## This is a interface to support third party modules ++## and its use is not allowed in upstream reference ++## policy. ++##

      ++##
      ++## ++## ++## Domain to execute in. ++## ++## ++## ++## ++## Domain entry point file. ++## ++## ++# ++interface(`unconfined_run_to',` ++ gen_require(` ++ type unconfined_t; ++ role unconfined_r; ++ ') ++ ++ domtrans_pattern(unconfined_t,$2,$1) ++ role unconfined_r types $1; ++ userdom_use_user_terminals($1) ++') ++ ++###################################### ++## ++## Stub unconfined role. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_stub_role',` ++ gen_require(` ++ role unconfined_r; ++ ') ++') ++ ++######################################## ++## ++## Inherit file descriptors from the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_use_fds',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:fd use; ++') ++ ++######################################## ++## ++## Send a SIGCHLD signal to the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_sigchld',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process sigchld; ++') ++ ++######################################## ++## ++## Send a SIGNULL signal to the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_signull',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process signull; ++') ++ ++######################################## ++## ++## Send generic signals to the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_signal',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process signal; ++') ++ ++######################################## ++## ++## Send generic signals to the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_setsched',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process setsched; ++') ++ ++######################################## ++## ++## Read unconfined domain unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_read_pipes',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:fifo_file read_fifo_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read unconfined domain unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_dontaudit_read_pipes',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:fifo_file read; ++') ++ ++######################################## ++## ++## Read and write unconfined domain unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_rw_pipes',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:fifo_file rw_fifo_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write ++## unconfined domain unnamed pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`unconfined_dontaudit_rw_pipes',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:fifo_file rw_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write ++## unconfined domain stream. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`unconfined_dontaudit_rw_stream',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:unix_stream_socket rw_socket_perms; ++') ++ ++######################################## ++## ++## Connect to the unconfined domain using ++## a unix domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_stream_connect',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## Do not audit attempts to read or write ++## unconfined domain tcp sockets. ++## ++## ++##

      ++## Do not audit attempts to read or write ++## unconfined domain tcp sockets. ++##

      ++##

      ++## This interface was added due to a broken ++## symptom in ldconfig. ++##

      ++##
      ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`unconfined_dontaudit_rw_tcp_sockets',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:tcp_socket { read write }; ++') ++ ++######################################## ++## ++## Do not audit attempts to read or write ++## unconfined domain packet sockets. ++## ++## ++##

      ++## Do not audit attempts to read or write ++## unconfined domain packet sockets. ++##

      ++##

      ++## This interface was added due to a broken ++## symptom. ++##

      ++##
      ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`unconfined_dontaudit_rw_packet_sockets',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:packet_socket { read write }; ++') ++ ++######################################## ++## ++## Create keys for the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_create_keys',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:key create; ++') ++ ++######################################## ++## ++## Dontaudit write process information for unconfined process. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_dontaudit_write_state',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ dontaudit $1 unconfined_t:file write; ++') ++ ++######################################## ++## ++## Write keys for the unconfined domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_write_keys',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:key write; ++') ++ ++######################################## ++## ++## Send messages to the unconfined domain over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_dbus_send',` ++ gen_require(` ++ type unconfined_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 unconfined_t:dbus send_msg; ++ allow unconfined_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## unconfined_t over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_dbus_chat',` ++ gen_require(` ++ type unconfined_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 unconfined_t:dbus send_msg; ++ allow unconfined_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Connect to the the unconfined DBUS ++## for service (acquire_svc). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_dbus_connect',` ++ gen_require(` ++ type unconfined_t; ++ class dbus acquire_svc; ++ ') ++ ++ allow $1 unconfined_t:dbus acquire_svc; ++') ++ ++######################################## ++## ++## Allow ptrace of unconfined domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_ptrace',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process ptrace; ++') ++ ++######################################## ++## ++## Read and write to unconfined shared memory. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++# ++interface(`unconfined_rw_shm',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:shm rw_shm_perms; ++') ++ ++######################################## ++## ++## Allow apps to set rlimits on unconfined user ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_set_rlimitnh',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process rlimitinh; ++') ++ ++######################################## ++## ++## Get the process group of unconfined. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_getpgid',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:process getpgid; ++') ++ ++######################################## ++## ++## Change to the unconfined role. ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`unconfined_role_change',` ++ gen_require(` ++ role unconfined_r; ++ ') ++ ++ allow $1 unconfined_r; ++') ++ ++######################################## ++## ++## Allow domain to attach to TUN devices created by unconfined_t users. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_attach_tun_iface',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ allow $1 unconfined_t:tun_socket relabelfrom; ++ allow $1 self:tun_socket relabelto; ++') ++ ++######################################## ++## ++## Allow domain to transition to unconfined_t user ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`unconfined_transition',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ domtrans_pattern($1,$2,unconfined_t) ++ allow unconfined_t $2:file entrypoint; ++ allow $1 unconfined_t:process signal_perms; ++') ++ ++######################################## ++## ++## unconfined_t domain typebounds calling domain. ++## ++## ++## ++## Domain to be typebound. ++## ++## ++# ++interface(`unconfined_typebounds',` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ typebounds unconfined_t $1; ++') ++ +diff --git a/policy/modules/roles/unconfineduser.te b/policy/modules/roles/unconfineduser.te +new file mode 100644 +index 0000000000..a82dd55855 +--- /dev/null ++++ b/policy/modules/roles/unconfineduser.te +@@ -0,0 +1,368 @@ ++policy_module(unconfineduser, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++attribute unconfined_login_domain; ++ ++## ++##

      ++## allow unconfined users to transition to the chrome sandbox domains when running chrome-sandbox ++##

      ++##
      ++gen_tunable(unconfined_chrome_sandbox_transition, false) ++ ++## ++##

      ++## Allow unconfined users to transition to the Mozilla plugin domain when running xulrunner plugin-container. ++##

      ++##
      ++gen_tunable(unconfined_mozilla_plugin_transition, false) ++ ++## ++##

      ++## Allow a user to login as an unconfined domain ++##

      ++##
      ++gen_tunable(unconfined_login, true) ++ ++# usage in this module of types created by these ++# calls is not correct, however we dont currently ++# have another method to add access to these types ++userdom_base_user_template(unconfined) ++userdom_manage_home_role(unconfined_r, unconfined_t) ++userdom_manage_tmp_role(unconfined_r, unconfined_t) ++userdom_unpriv_type(unconfined_t) ++ ++type unconfined_exec_t; ++application_domain(unconfined_t, unconfined_exec_t) ++role unconfined_r types unconfined_t; ++role_transition system_r unconfined_exec_t unconfined_r; ++allow system_r unconfined_r; ++ ++domain_user_exemption_target(unconfined_t) ++allow system_r unconfined_r; ++allow unconfined_r system_r; ++init_script_role_transition(unconfined_r) ++role system_r types unconfined_t; ++typealias unconfined_t alias unconfined_crontab_t; ++ ++######################################## ++# ++# Local policy ++# ++ ++dontaudit unconfined_t self:dir write; ++dontaudit unconfined_t self:file setattr; ++ ++allow unconfined_t self:system syslog_read; ++dontaudit unconfined_t self:capability sys_module; ++ ++allow unconfined_t file_type:system module_load; ++ ++allow unconfined_t self:cap_userns all_cap_userns_perms; ++ ++allow unconfined_t self:bpf { map_create map_read map_write prog_load prog_run }; ++ ++kernel_rw_unlabeled_socket(unconfined_t) ++kernel_rw_unlabeled_rawip_socket(unconfined_t) ++ ++files_create_boot_flag(unconfined_t) ++files_create_default_dir(unconfined_t) ++files_root_filetrans_default(unconfined_t, dir) ++ ++init_domtrans_script(unconfined_t) ++init_telinit(unconfined_t) ++ ++logging_send_syslog_msg(unconfined_t) ++ ++systemd_config_all_services(unconfined_t) ++ ++unconfined_domain_noaudit(unconfined_t) ++domain_named_filetrans(unconfined_t) ++domain_transition_all(unconfined_t) ++ ++usermanage_run_passwd(unconfined_t, unconfined_r) ++ ++tunable_policy(`deny_execmem',`',` ++ allow unconfined_t self:process execmem; ++') ++ ++tunable_policy(`selinuxuser_execstack',` ++ allow unconfined_t self:process execstack; ++') ++ ++tunable_policy(`selinuxuser_execmod',` ++ userdom_execmod_user_home_files(unconfined_t) ++') ++ ++tunable_policy(`unconfined_login',` ++ corecmd_shell_domtrans(unconfined_login_domain,unconfined_t) ++ allow unconfined_t unconfined_login_domain:fd use; ++ allow unconfined_t unconfined_login_domain:fifo_file rw_file_perms; ++ allow unconfined_t unconfined_login_domain:process sigchld; ++') ++ ++optional_policy(` ++ gen_require(` ++ type unconfined_t; ++ ') ++ ++ optional_policy(` ++ abrt_dbus_chat(unconfined_t) ++ abrt_run_helper(unconfined_t, unconfined_r) ++ ') ++ ++ optional_policy(` ++ avahi_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ blueman_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ certmonger_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ devicekit_dbus_chat(unconfined_t) ++ devicekit_dbus_chat_disk(unconfined_t) ++ devicekit_dbus_chat_power(unconfined_t) ++ ') ++ ++ optional_policy(` ++ hal_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ kpatch_run(unconfined_t,unconfined_r) ++ ') ++ ++ optional_policy(` ++ networkmanager_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ rtkit_scheduled(unconfined_t) ++ ') ++ ++ # Might remove later if this proves to be problematic, but would like to gather AVCs ++ optional_policy(` ++ thumb_role(unconfined_r, unconfined_t) ++ ') ++ ++ optional_policy(` ++ setroubleshoot_dbus_chat(unconfined_t) ++ setroubleshoot_dbus_chat_fixit(unconfined_t) ++ ') ++ ++ optional_policy(` ++ sandbox_transition(unconfined_t, unconfined_r) ++ ') ++ ++ optional_policy(` ++ sandbox_x_transition(unconfined_t, unconfined_r) ++ ') ++ ++ optional_policy(` ++ vmtools_run_helper(unconfined_t, unconfined_r) ++ ') ++ ++ optional_policy(` ++ gen_require(` ++ type user_tmpfs_t; ++ ') ++ ++ xserver_rw_session(unconfined_t, user_tmpfs_t) ++ xserver_dbus_chat_xdm(unconfined_t) ++ ') ++') ++ ++ifdef(`distro_gentoo',` ++ seutil_run_runinit(unconfined_t, unconfined_r) ++ seutil_init_script_run_runinit(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ accountsd_dbus_chat(unconfined_t) ++') ++ ++optional_policy(` ++ cron_unconfined_role(unconfined_r, unconfined_t) ++') ++ ++optional_policy(` ++ chrome_role_notrans(unconfined_r, unconfined_t) ++ ++ tunable_policy(`unconfined_chrome_sandbox_transition',` ++ chrome_domtrans_sandbox(unconfined_t) ++ ') ++') ++ ++optional_policy(` ++ container_entrypoint(unconfined_t) ++') ++ ++optional_policy(` ++ oddjob_mkhomedir_entrypoint(unconfined_t) ++') ++ ++optional_policy(` ++ dbus_role_template(unconfined, unconfined_r, unconfined_t) ++ role system_r types unconfined_dbusd_t; ++ ++ optional_policy(` ++ unconfined_domain_noaudit(unconfined_dbusd_t) ++ ++ optional_policy(` ++ xserver_rw_shm(unconfined_dbusd_t) ++ ') ++ ') ++ ++ init_dbus_chat(unconfined_t) ++ init_dbus_chat_script(unconfined_t) ++ init_prog_run_bpf(unconfined_t) ++ ++ dbus_stub(unconfined_t) ++ ++ optional_policy(` ++ bluetooth_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ consolekit_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ cups_dbus_chat_config(unconfined_t) ++ ') ++ ++ optional_policy(` ++ fprintd_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ systemd_dbus_chat_timedated(unconfined_t) ++ gnome_dbus_chat_gconfdefault(unconfined_t) ++ gnome_command_domtrans_gkeyringd(unconfined_dbusd_t,unconfined_t) ++ ') ++ ++ optional_policy(` ++ ipsec_mgmt_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ kerneloops_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ telepathy_command_domtrans(unconfined_dbusd_t, unconfined_t) ++ ') ++ ++ optional_policy(` ++ oddjob_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ vpn_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ firewalld_dbus_chat(unconfined_t) ++ ') ++ ++ optional_policy(` ++ firewallgui_dbus_chat(unconfined_t) ++ ') ++') ++ ++optional_policy(` ++ firstboot_run(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ fsadm_manage_pid(unconfined_t) ++') ++ ++optional_policy(` ++ gpsd_run(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ anaconda_run_install(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ java_run_unconfined(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ livecd_run(unconfined_t, unconfined_r) ++') ++ ++#optional_policy(` ++# mock_role(unconfined_r, unconfined_t) ++#') ++ ++optional_policy(` ++ mozilla_role_plugin(unconfined_r) ++ ++ tunable_policy(`unconfined_mozilla_plugin_transition', ` ++ mozilla_domtrans_plugin(unconfined_t) ++ ') ++') ++ ++optional_policy(` ++ ipa_run_helper(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ chronyd_run_chronyc(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ oddjob_run_mkhomedir(unconfined_t, unconfined_r) ++ oddjob_run(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ # Allow SELinux aware applications to request rpm_script execution ++ rpm_transition_script(unconfined_t, unconfined_r) ++ rpm_dbus_chat(unconfined_t) ++') ++ ++optional_policy(` ++ optional_policy(` ++ samba_run_unconfined_net(unconfined_t, unconfined_r) ++ ') ++ ++ samba_role_notrans(unconfined_r) ++ samba_run_smbcontrol(unconfined_t, unconfined_r) ++') ++ ++optional_policy(` ++ sysnet_run_dhcpc(unconfined_t, unconfined_r) ++ sysnet_dbus_chat_dhcpc(unconfined_t) ++ sysnet_role_transition_dhcpc(unconfined_r) ++') ++ ++optional_policy(` ++ openshift_run(unconfined_usertype, unconfined_r) ++') ++ ++optional_policy(` ++ virt_transition_svirt(unconfined_t, unconfined_r) ++ virt_transition_svirt_sandbox(unconfined_t, unconfined_r) ++ virt_sandbox_entrypoint(unconfined_t) ++') ++ ++optional_policy(` ++ xserver_run(unconfined_t, unconfined_r) ++ xserver_manage_home_fonts(unconfined_t) ++ xserver_xsession_entry_type(unconfined_t) ++') ++ ++gen_user(unconfined_u, user, unconfined_r system_r, s0, s0 - mls_systemhigh, mcs_allcats) ++ +diff --git a/policy/modules/roles/unprivuser.if b/policy/modules/roles/unprivuser.if +index 3835596461..fbca2be81a 100644 +--- a/policy/modules/roles/unprivuser.if ++++ b/policy/modules/roles/unprivuser.if +@@ -1,4 +1,4 @@ +-## Generic unprivileged user role ++## Generic unprivileged user + + ######################################## + ## +diff --git a/policy/modules/roles/unprivuser.te b/policy/modules/roles/unprivuser.te +index 6d77e81c59..5fc3b0b4e5 100644 +--- a/policy/modules/roles/unprivuser.te ++++ b/policy/modules/roles/unprivuser.te +@@ -1,5 +1,12 @@ + policy_module(unprivuser, 2.4.0) + ++## ++##

      ++## Allow unprivileged user to create and transition to svirt domains. ++##

      ++##
      ++gen_tunable(unprivuser_use_svirt, false) ++ + # this module should be named user, but that is + # a compile error since user is a keyword. + +@@ -12,12 +19,102 @@ role user_r; + + userdom_unpriv_user_template(user) + ++kernel_read_numa_state(user_t) ++kernel_write_numa_state(user_t) ++ ++fs_exec_noxattr(user_t) ++fs_read_hugetlbfs_files(user_t) ++ ++storage_read_scsi_generic(user_t) ++storage_write_scsi_generic(user_t) ++ ++seutil_read_module_store(user_t) ++ ++init_dbus_chat(user_t) ++init_status(user_t) ++ ++tunable_policy(`selinuxuser_execmod',` ++ userdom_execmod_user_home_files(user_t) ++') ++ ++optional_policy(` ++ abrt_read_cache(user_t) ++') ++ + optional_policy(` + apache_role(user_r, user_t) + ') + + optional_policy(` +- git_role(user_r, user_t) ++ blueman_dbus_chat(user_t) ++') ++ ++optional_policy(` ++ bluetooth_role(user_r, user_t) ++') ++ ++optional_policy(` ++ colord_dbus_chat(user_t) ++') ++ ++optional_policy(` ++ chrome_role(user_r, user_t) ++') ++ ++optional_policy(` ++ dirsrv_stream_connect(user_t) ++') ++ ++optional_policy(` ++ journalctl_role(user_r, user_t) ++') ++ ++optional_policy(` ++ irc_role(user_r, user_t) ++') ++ ++optional_policy(` ++ oident_manage_user_content(user_t) ++ oident_relabel_user_content(user_t) ++') ++ ++optional_policy(` ++ mozilla_run_plugin(user_t, user_r) ++') ++ ++optional_policy(` ++ mta_role(user_r, user_t) ++') ++ ++optional_policy(` ++ netutils_run_ping_cond(user_t, user_r) ++ netutils_run_traceroute_cond(user_t, user_r) ++') ++ ++optional_policy(` ++ polipo_role(user_r, user_t) ++ polipo_named_filetrans_cache_home_dirs(user_t) ++ polipo_named_filetrans_config_home_files(user_t) ++') ++ ++optional_policy(` ++ rpm_dontaudit_dbus_chat(user_t) ++') ++ ++optional_policy(` ++ rtkit_scheduled(user_t) ++') ++ ++optional_policy(` ++ sandbox_transition(user_t, user_r) ++') ++ ++optional_policy(` ++ sandbox_x_transition(user_t, user_r) ++') ++ ++optional_policy(` ++ ssh_role_template(user, user_r, user_t) + ') + + optional_policy(` +@@ -25,11 +122,19 @@ optional_policy(` + ') + + optional_policy(` +- vlock_run(user_t, user_r) ++ setroubleshoot_dontaudit_stream_connect(user_t) + ') + ++#optional_policy(` ++# telepathy_dbus_session_role(user_r, user_t) ++#') ++ + optional_policy(` +- xserver_role(user_r, user_t) ++ usbmuxd_stream_connect(user_t) ++') ++ ++optional_policy(` ++ vlock_run(user_t, user_r) + ') + + ifndef(`distro_redhat',` +@@ -101,10 +206,6 @@ ifndef(`distro_redhat',` + mplayer_role(user_r, user_t) + ') + +- optional_policy(` +- mta_role(user_r, user_t) +- ') +- + optional_policy(` + postgresql_role(user_r, user_t) + ') +@@ -128,7 +229,6 @@ ifndef(`distro_redhat',` + optional_policy(` + ssh_role_template(user, user_r, user_t) + ') +- + optional_policy(` + su_role_template(user, user_r, user_t) + ') +@@ -160,4 +260,24 @@ ifndef(`distro_redhat',` + optional_policy(` + wireshark_role(user_r, user_t) + ') ++ ++ optional_policy(` ++ xserver_run(user_t, user_r) ++ ') ++') ++ ++optional_policy(` ++ vmtools_run_helper(user_t, user_r) ++') ++ ++ ++optional_policy(` ++ virt_transition_svirt(user_t, user_r) ++ virt_filetrans_home_content(user_t) ++') ++ ++optional_policy(` ++ tunable_policy(`unprivuser_use_svirt',` ++ virt_manage_images(user_t) ++ ') + ') +diff --git a/policy/modules/services/postgresql.fc b/policy/modules/services/postgresql.fc +index a26f84f40d..d52bc2e3c5 100644 +--- a/policy/modules/services/postgresql.fc ++++ b/policy/modules/services/postgresql.fc +@@ -10,6 +10,10 @@ + # + /usr/bin/initdb(\.sepgsql)? -- gen_context(system_u:object_r:postgresql_exec_t,s0) + /usr/bin/(se)?postgres -- gen_context(system_u:object_r:postgresql_exec_t,s0) ++/usr/bin/pg_ctl -- gen_context(system_u:object_r:postgresql_exec_t,s0) ++/usr/bin/postgresql-check-db-dir -- gen_context(system_u:object_r:postgresql_exec_t,s0) ++ ++/usr/libexec/postgresql-ctl -- gen_context(system_u:object_r:postgresql_exec_t,s0) + + /usr/lib/pgsql/test/regress(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0) + /usr/lib/pgsql/test/regress/pg_regress -- gen_context(system_u:object_r:postgresql_exec_t,s0) +@@ -28,9 +32,10 @@ ifdef(`distro_redhat', ` + # + /var/lib/postgres(ql)?(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0) + +-/var/lib/pgsql/data(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0) ++/var/lib/pgsql(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0) + /var/lib/pgsql/logfile(/.*)? gen_context(system_u:object_r:postgresql_log_t,s0) +-/var/lib/pgsql/pgstartup\.log gen_context(system_u:object_r:postgresql_log_t,s0) ++/var/lib/pgsql/.*\.log gen_context(system_u:object_r:postgresql_log_t,s0) ++/var/lib/pgsql/data/pg_log(/.*)? gen_context(system_u:object_r:postgresql_log_t,s0) + + /var/lib/sepgsql(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0) + /var/lib/sepgsql/pgstartup\.log -- gen_context(system_u:object_r:postgresql_log_t,s0) +@@ -45,4 +50,4 @@ ifdef(`distro_redhat', ` + + /var/run/postgresql(/.*)? gen_context(system_u:object_r:postgresql_var_run_t,s0) + +-/var/run/postmaster.* gen_context(system_u:object_r:postgresql_var_run_t,s0) ++#/var/run/postmaster.* gen_context(system_u:object_r:postgresql_var_run_t,s0) +diff --git a/policy/modules/services/postgresql.if b/policy/modules/services/postgresql.if +index 9d2f311685..df0970c02d 100644 +--- a/policy/modules/services/postgresql.if ++++ b/policy/modules/services/postgresql.if +@@ -10,90 +10,46 @@ + ##
      + ## + ## +-## ++## + ## The type of the user domain. + ## + ## + # + interface(`postgresql_role',` + gen_require(` +- class db_database all_db_database_perms; +- class db_schema all_db_schema_perms; +- class db_table all_db_table_perms; +- class db_sequence all_db_sequence_perms; +- class db_view all_db_view_perms; +- class db_procedure all_db_procedure_perms; +- class db_language all_db_language_perms; +- class db_column all_db_column_perms; +- class db_tuple all_db_tuple_perms; +- class db_blob all_db_blob_perms; +- +- attribute sepgsql_client_type, sepgsql_database_type; +- attribute sepgsql_schema_type, sepgsql_sysobj_table_type; +- +- type sepgsql_trusted_proc_exec_t, sepgsql_trusted_proc_t; +- type sepgsql_ranged_proc_exec_t, sepgsql_ranged_proc_t; +- type user_sepgsql_blob_t, user_sepgsql_proc_exec_t; +- type user_sepgsql_schema_t, user_sepgsql_seq_t; +- type user_sepgsql_sysobj_t, user_sepgsql_table_t; +- type user_sepgsql_view_t; +- type sepgsql_temp_object_t; ++ attribute sepgsql_client_type; ++ type sepgsql_trusted_proc_t; ++ type sepgsql_ranged_proc_t; + ') + +- ######################################## +- # +- # Declarations +- # +- + typeattribute $2 sepgsql_client_type; + role $1 types sepgsql_trusted_proc_t; + role $1 types sepgsql_ranged_proc_t; ++') + +- ############################## +- # +- # Client local policy +- # +- +- tunable_policy(`sepgsql_enable_users_ddl',` +- allow $2 user_sepgsql_schema_t:db_schema { create drop setattr }; +- allow $2 user_sepgsql_table_t:db_table { create drop setattr }; +- allow $2 user_sepgsql_table_t:db_column { create drop setattr }; +- allow $2 user_sepgsql_sysobj_t:db_tuple { update insert delete }; +- allow $2 user_sepgsql_seq_t:db_sequence { create drop setattr set_value }; +- allow $2 user_sepgsql_view_t:db_view { create drop setattr }; +- allow $2 user_sepgsql_proc_exec_t:db_procedure { create drop setattr }; ++######################################## ++## ++## Execute the postgresql program in the postgresql domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to allow the postgresql domain. ++## ++## ++## ++# ++interface(`postgresql_run',` ++ gen_require(` ++ type postgresql_t; + ') + +- allow $2 user_sepgsql_schema_t:db_schema { getattr search add_name remove_name }; +- type_transition $2 sepgsql_database_type:db_schema user_sepgsql_schema_t; +- type_transition $2 sepgsql_database_type:db_schema sepgsql_temp_object_t "pg_temp"; +- +- allow $2 user_sepgsql_table_t:db_table { getattr select update insert delete lock }; +- allow $2 user_sepgsql_table_t:db_column { getattr select update insert }; +- allow $2 user_sepgsql_table_t:db_tuple { select update insert delete }; +- type_transition $2 sepgsql_schema_type:db_table user_sepgsql_table_t; +- +- allow $2 user_sepgsql_sysobj_t:db_tuple { use select }; +- type_transition $2 sepgsql_sysobj_table_type:db_tuple user_sepgsql_sysobj_t; +- +- allow $2 user_sepgsql_seq_t:db_sequence { getattr get_value next_value }; +- type_transition $2 sepgsql_schema_type:db_sequence user_sepgsql_seq_t; +- +- allow $2 user_sepgsql_view_t:db_view { getattr expand }; +- type_transition $2 sepgsql_schema_type:db_view user_sepgsql_view_t; +- +- allow $2 user_sepgsql_proc_exec_t:db_procedure { getattr execute }; +- type_transition $2 sepgsql_schema_type:db_procedure user_sepgsql_proc_exec_t; +- +- allow $2 user_sepgsql_blob_t:db_blob { create drop getattr setattr read write import export }; +- type_transition $2 sepgsql_database_type:db_blob user_sepgsql_blob_t; +- +- allow $2 sepgsql_ranged_proc_t:process transition; +- type_transition $2 sepgsql_ranged_proc_exec_t:process sepgsql_ranged_proc_t; +- allow sepgsql_ranged_proc_t $2:process dyntransition; +- +- allow $2 sepgsql_trusted_proc_t:process transition; +- type_transition $2 sepgsql_trusted_proc_exec_t:process sepgsql_trusted_proc_t; ++ postgresql_domtrans($1) ++ role $2 types postgresql_t; + ') + + ######################################## +@@ -312,7 +268,7 @@ interface(`postgresql_search_db',` + type postgresql_db_t; + ') + +- allow $1 postgresql_db_t:dir search; ++ allow $1 postgresql_db_t:dir search_dir_perms; + ') + + ######################################## +@@ -324,14 +280,16 @@ interface(`postgresql_search_db',` + ## Domain allowed access. + ## + ## ++# + interface(`postgresql_manage_db',` + gen_require(` + type postgresql_db_t; + ') + +- allow $1 postgresql_db_t:dir rw_dir_perms; +- allow $1 postgresql_db_t:file rw_file_perms; +- allow $1 postgresql_db_t:lnk_file { getattr read }; ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, postgresql_db_t, postgresql_db_t) ++ manage_files_pattern($1, postgresql_db_t, postgresql_db_t) ++ manage_lnk_files_pattern($1, postgresql_db_t, postgresql_db_t) + ') + + ######################################## +@@ -352,6 +310,24 @@ interface(`postgresql_domtrans',` + domtrans_pattern($1, postgresql_exec_t, postgresql_t) + ') + ++###################################### ++## ++## Execute Postgresql in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postgresql_exec',` ++ gen_require(` ++ type postgresql_exec_t; ++ ') ++ ++ can_exec($1, postgresql_exec_t) ++') ++ + ###################################### + ## + ## Allow domain to signal postgresql +@@ -369,6 +345,23 @@ interface(`postgresql_signal',` + allow $1 postgresql_t:process signal; + ') + ++###################################### ++## ++## Allow domain to signull postgresql ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postgresql_signull',` ++ gen_require(` ++ type postgresql_t; ++ ') ++ allow $1 postgresql_t:process signull; ++') ++ + ######################################## + ## + ## Allow the specified domain to read postgresql's etc. +@@ -421,7 +414,6 @@ interface(`postgresql_tcp_connect',` + ## Domain allowed access. + ## + ## +-## + # + interface(`postgresql_stream_connect',` + gen_require(` +@@ -432,6 +424,7 @@ interface(`postgresql_stream_connect',` + + files_search_pids($1) + files_search_tmp($1) ++ stream_connect_pattern($1, { postgresql_var_run_t postgresql_tmp_t }, { postgresql_var_run_t postgresql_tmp_t }, postgresql_t) + ') + + ######################################## +@@ -447,83 +440,10 @@ interface(`postgresql_stream_connect',` + # + interface(`postgresql_unpriv_client',` + gen_require(` +- class db_database all_db_database_perms; +- class db_schema all_db_schema_perms; +- class db_table all_db_table_perms; +- class db_sequence all_db_sequence_perms; +- class db_view all_db_view_perms; +- class db_procedure all_db_procedure_perms; +- class db_language all_db_language_perms; +- class db_column all_db_column_perms; +- class db_tuple all_db_tuple_perms; +- class db_blob all_db_blob_perms; +- + attribute sepgsql_client_type; +- attribute sepgsql_database_type, sepgsql_schema_type; +- attribute sepgsql_sysobj_table_type; +- +- type sepgsql_ranged_proc_t, sepgsql_ranged_proc_exec_t; +- type sepgsql_temp_object_t; +- type sepgsql_trusted_proc_t, sepgsql_trusted_proc_exec_t; +- type unpriv_sepgsql_blob_t, unpriv_sepgsql_proc_exec_t; +- type unpriv_sepgsql_schema_t, unpriv_sepgsql_seq_t; +- type unpriv_sepgsql_sysobj_t, unpriv_sepgsql_table_t; +- type unpriv_sepgsql_view_t; + ') + +- ######################################## +- # +- # Declarations +- # +- + typeattribute $1 sepgsql_client_type; +- +- ######################################## +- # +- # Client local policy +- # +- +- type_transition $1 sepgsql_ranged_proc_exec_t:process sepgsql_ranged_proc_t; +- allow $1 sepgsql_ranged_proc_t:process transition; +- allow sepgsql_ranged_proc_t $1:process dyntransition; +- +- type_transition $1 sepgsql_trusted_proc_exec_t:process sepgsql_trusted_proc_t; +- allow $1 sepgsql_trusted_proc_t:process transition; +- +- allow $1 unpriv_sepgsql_blob_t:db_blob { create drop getattr setattr read write import export }; +- type_transition $1 sepgsql_database_type:db_blob unpriv_sepgsql_blob_t; +- +- allow $1 unpriv_sepgsql_proc_exec_t:db_procedure { getattr execute }; +- type_transition $1 sepgsql_schema_type:db_procedure unpriv_sepgsql_proc_exec_t; +- +- allow $1 unpriv_sepgsql_schema_t:db_schema { getattr add_name remove_name }; +- type_transition $1 sepgsql_database_type:db_schema unpriv_sepgsql_schema_t; +- type_transition $1 sepgsql_database_type:db_schema sepgsql_temp_object_t "pg_temp"; +- +- allow $1 unpriv_sepgsql_table_t:db_table { getattr select update insert delete lock }; +- allow $1 unpriv_sepgsql_table_t:db_column { getattr select update insert }; +- allow $1 unpriv_sepgsql_table_t:db_tuple { select update insert delete }; +- type_transition $1 sepgsql_schema_type:db_table unpriv_sepgsql_table_t; +- +- allow $1 unpriv_sepgsql_seq_t:db_sequence { getattr get_value next_value set_value }; +- type_transition $1 sepgsql_schema_type:db_sequence unpriv_sepgsql_seq_t; +- +- allow $1 unpriv_sepgsql_sysobj_t:db_tuple { use select }; +- type_transition $1 sepgsql_sysobj_table_type:db_tuple unpriv_sepgsql_sysobj_t; +- +- allow $1 unpriv_sepgsql_view_t:db_view { getattr expand }; +- type_transition $1 sepgsql_schema_type:db_view unpriv_sepgsql_view_t; +- +- +- tunable_policy(`sepgsql_enable_users_ddl',` +- allow $1 unpriv_sepgsql_schema_t:db_schema { create drop setattr }; +- allow $1 unpriv_sepgsql_table_t:db_table { create drop setattr }; +- allow $1 unpriv_sepgsql_table_t:db_column { create drop setattr }; +- allow $1 unpriv_sepgsql_sysobj_t:db_tuple { update insert delete }; +- allow $1 unpriv_sepgsql_seq_t:db_sequence { create drop setattr }; +- allow $1 unpriv_sepgsql_view_t:db_view { create drop setattr }; +- allow $1 unpriv_sepgsql_proc_exec_t:db_procedure { create drop setattr }; +- ') + ') + + ######################################## +@@ -545,6 +465,29 @@ interface(`postgresql_unconfined',` + typeattribute $1 sepgsql_unconfined_type; + ') + ++######################################## ++## ++## Transition to postgresql named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postgresql_filetrans_named_content',` ++ gen_require(` ++ type postgresql_db_t; ++ type postgresql_log_t; ++ ') ++ ++ files_var_lib_filetrans($1, postgresql_db_t, dir, "postgresql") ++ files_var_lib_filetrans($1, postgresql_db_t, dir, "postgres") ++ files_var_lib_filetrans($1, postgresql_db_t, dir, "pgsql") ++ filetrans_pattern($1, postgresql_db_t, postgresql_log_t, dir, "logfile") ++ filetrans_pattern($1, postgresql_db_t, postgresql_log_t, dir, "pg_log") ++') ++ + ######################################## + ## + ## All of the rules required to administrate an postgresql environment +@@ -563,35 +506,41 @@ interface(`postgresql_unconfined',` + # + interface(`postgresql_admin',` + gen_require(` +- attribute sepgsql_admin_type; +- attribute sepgsql_client_type; +- +- type postgresql_t, postgresql_var_run_t; +- type postgresql_tmp_t, postgresql_db_t; +- type postgresql_etc_t, postgresql_log_t; +- type postgresql_initrc_exec_t; ++ attribute sepgsql_admin_type, sepgsql_client_type; ++ type postgresql_t, postgresql_var_run_t, postgresql_initrc_exec_t; ++ type postgresql_tmp_t, postgresql_db_t, postgresql_log_t; ++ type postgresql_etc_t; + ') + + typeattribute $1 sepgsql_admin_type; + +- allow $1 postgresql_t:process { ptrace signal_perms }; ++ allow $1 postgresql_t:process signal_perms; + ps_process_pattern($1, postgresql_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 postgresql_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, postgresql_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 postgresql_initrc_exec_t system_r; + allow $2 system_r; + ++ files_list_pids($1) + admin_pattern($1, postgresql_var_run_t) + ++ files_list_var_lib($1) + admin_pattern($1, postgresql_db_t) + ++ files_list_etc($1) + admin_pattern($1, postgresql_etc_t) + ++ logging_list_logs($1) + admin_pattern($1, postgresql_log_t) + ++ files_list_tmp($1) + admin_pattern($1, postgresql_tmp_t) + + postgresql_tcp_connect($1) + postgresql_stream_connect($1) ++ postgresql_filetrans_named_content($1) + ') +diff --git a/policy/modules/services/postgresql.te b/policy/modules/services/postgresql.te +index 03061349cb..9997e093c5 100644 +--- a/policy/modules/services/postgresql.te ++++ b/policy/modules/services/postgresql.te +@@ -19,25 +19,32 @@ gen_require(` + # + + ## +-##

      +-## Allow unprived users to execute DDL statement +-##

      ++##

      ++## Allow postgresql to use ssh and rsync for point-in-time recovery ++##

      ++##
      ++gen_tunable(postgresql_can_rsync, false) ++ ++## ++##

      ++## Allow unprivileged users to execute DDL statement ++##

      + ##
      +-gen_tunable(sepgsql_enable_users_ddl, false) ++gen_tunable(postgresql_selinux_users_ddl, true) + + ## + ##

      + ## Allow transmit client label to foreign database + ##

      + ##
      +-gen_tunable(sepgsql_transmit_client_label, false) ++gen_tunable(postgresql_selinux_transmit_client_label, false) + + ## + ##

      + ## Allow database admins to execute DML statement + ##

      + ##
      +-gen_tunable(sepgsql_unconfined_dbadm, false) ++gen_tunable(postgresql_selinux_unconfined_dbadm, true) + + type postgresql_t; + type postgresql_exec_t; +@@ -236,7 +243,8 @@ allow postgresql_t self:udp_socket create_stream_socket_perms; + allow postgresql_t self:unix_dgram_socket create_socket_perms; + allow postgresql_t self:unix_stream_socket { create_stream_socket_perms connectto }; + allow postgresql_t self:netlink_selinux_socket create_socket_perms; +-tunable_policy(`sepgsql_transmit_client_label',` ++ ++tunable_policy(`postgresql_selinux_transmit_client_label',` + allow postgresql_t self:process { setsockcreate }; + ') + +@@ -270,18 +278,19 @@ manage_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t) + manage_lnk_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t) + manage_fifo_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t) + manage_sock_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t) +-files_var_lib_filetrans(postgresql_t, postgresql_db_t, { dir file lnk_file sock_file fifo_file }) ++postgresql_filetrans_named_content(postgresql_t) + + allow postgresql_t postgresql_etc_t:dir list_dir_perms; + read_files_pattern(postgresql_t, postgresql_etc_t, postgresql_etc_t) + read_lnk_files_pattern(postgresql_t, postgresql_etc_t, postgresql_etc_t) + +-allow postgresql_t postgresql_exec_t:lnk_file { getattr read }; ++allow postgresql_t postgresql_exec_t:lnk_file read_lnk_file_perms; + can_exec(postgresql_t, postgresql_exec_t ) + + allow postgresql_t postgresql_lock_t:file manage_file_perms; + files_lock_filetrans(postgresql_t, postgresql_lock_t, file) + ++manage_dirs_pattern(postgresql_t, postgresql_log_t, postgresql_log_t) + manage_files_pattern(postgresql_t, postgresql_log_t, postgresql_log_t) + logging_log_filetrans(postgresql_t, postgresql_log_t, { file dir }) + +@@ -291,6 +300,7 @@ manage_lnk_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t) + manage_fifo_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t) + manage_sock_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t) + files_tmp_filetrans(postgresql_t, postgresql_tmp_t, { dir file sock_file }) ++allow postgresql_t postgresql_tmp_t:file map; + fs_tmpfs_filetrans(postgresql_t, postgresql_tmp_t, { dir file lnk_file sock_file fifo_file }) + + manage_dirs_pattern(postgresql_t, postgresql_var_run_t, postgresql_var_run_t) +@@ -299,12 +309,12 @@ manage_sock_files_pattern(postgresql_t, postgresql_var_run_t, postgresql_var_run + files_pid_filetrans(postgresql_t, postgresql_var_run_t, { dir file }) + + kernel_read_kernel_sysctls(postgresql_t) ++kernel_read_network_state(postgresql_t) + kernel_read_system_state(postgresql_t) + kernel_list_proc(postgresql_t) + kernel_read_all_sysctls(postgresql_t) + kernel_read_proc_symlinks(postgresql_t) + +-corenet_all_recvfrom_unlabeled(postgresql_t) + corenet_all_recvfrom_netlabel(postgresql_t) + corenet_tcp_sendrecv_generic_if(postgresql_t) + corenet_udp_sendrecv_generic_if(postgresql_t) +@@ -342,8 +352,7 @@ domain_dontaudit_list_all_domains_state(postgresql_t) + domain_use_interactive_fds(postgresql_t) + + files_dontaudit_search_home(postgresql_t) +-files_manage_etc_files(postgresql_t) +-files_search_etc(postgresql_t) ++files_read_etc_files(postgresql_t) + files_read_etc_runtime_files(postgresql_t) + files_read_usr_files(postgresql_t) + +@@ -354,20 +363,28 @@ init_read_utmp(postgresql_t) + logging_send_syslog_msg(postgresql_t) + logging_send_audit_msgs(postgresql_t) + +-miscfiles_read_localization(postgresql_t) +- + seutil_libselinux_linked(postgresql_t) + seutil_read_default_contexts(postgresql_t) + ++sysnet_use_ldap(postgresql_t) ++ + userdom_dontaudit_use_unpriv_user_fds(postgresql_t) + userdom_dontaudit_search_user_home_dirs(postgresql_t) + userdom_dontaudit_use_user_terminals(postgresql_t) + ++optional_policy(` ++ ccs_read_config(postgresql_t) ++') ++ + optional_policy(` + mta_getattr_spool(postgresql_t) + ') + +-tunable_policy(`allow_execmem',` ++optional_policy(` ++ rhcs_manage_cluster_pid_files(postgresql_t) ++') ++ ++tunable_policy(`deny_execmem',`',` + allow postgresql_t self:process execmem; + ') + +@@ -485,10 +502,52 @@ dontaudit { postgresql_t sepgsql_admin_type sepgsql_client_type sepgsql_unconfin + # It is always allowed to operate temporary objects for any database client. + allow sepgsql_client_type sepgsql_temp_object_t:{db_schema db_table db_column db_tuple db_sequence db_view db_procedure} ~{ relabelto relabelfrom }; + +-# Note that permission of creation/deletion are eventually controlled by +-# create or drop permission of individual objects within shared schemas. +-# So, it just allows to create/drop user specific types. +-tunable_policy(`sepgsql_enable_users_ddl',` ++############################## ++# ++# Client local policy ++# ++allow sepgsql_client_type user_sepgsql_schema_t:db_schema { getattr search add_name remove_name }; ++type_transition sepgsql_client_type sepgsql_database_type:db_schema user_sepgsql_schema_t; ++type_transition sepgsql_client_type sepgsql_database_type:db_schema sepgsql_temp_object_t "pg_temp"; ++ ++allow sepgsql_client_type user_sepgsql_table_t:db_table { getattr select update insert delete lock }; ++allow sepgsql_client_type user_sepgsql_table_t:db_column { getattr select update insert }; ++allow sepgsql_client_type user_sepgsql_table_t:db_tuple { select update insert delete }; ++type_transition sepgsql_client_type sepgsql_schema_type:db_table user_sepgsql_table_t; ++ ++allow sepgsql_client_type user_sepgsql_sysobj_t:db_tuple { use select }; ++type_transition sepgsql_client_type sepgsql_sysobj_table_type:db_tuple user_sepgsql_sysobj_t; ++ ++allow sepgsql_client_type user_sepgsql_seq_t:db_sequence { getattr get_value next_value }; ++type_transition sepgsql_client_type sepgsql_schema_type:db_sequence user_sepgsql_seq_t; ++ ++allow sepgsql_client_type user_sepgsql_view_t:db_view { getattr expand }; ++type_transition sepgsql_client_type sepgsql_schema_type:db_view user_sepgsql_view_t; ++ ++allow sepgsql_client_type user_sepgsql_proc_exec_t:db_procedure { getattr execute }; ++type_transition sepgsql_client_type sepgsql_schema_type:db_procedure user_sepgsql_proc_exec_t; ++ ++allow sepgsql_client_type user_sepgsql_blob_t:db_blob { create drop getattr setattr read write import export }; ++type_transition sepgsql_client_type sepgsql_database_type:db_blob user_sepgsql_blob_t; ++ ++allow sepgsql_client_type sepgsql_ranged_proc_t:process transition; ++type_transition sepgsql_client_type sepgsql_ranged_proc_exec_t:process sepgsql_ranged_proc_t; ++allow sepgsql_ranged_proc_t sepgsql_client_type:process dyntransition; ++ ++allow sepgsql_client_type sepgsql_trusted_proc_t:process transition; ++type_transition sepgsql_client_type sepgsql_trusted_proc_exec_t:process sepgsql_trusted_proc_t; ++ ++tunable_policy(`postgresql_selinux_users_ddl',` ++ allow sepgsql_client_type user_sepgsql_schema_t:db_schema { create drop setattr }; ++ allow sepgsql_client_type user_sepgsql_table_t:db_table { create drop setattr }; ++ allow sepgsql_client_type user_sepgsql_table_t:db_column { create drop setattr }; ++ allow sepgsql_client_type user_sepgsql_sysobj_t:db_tuple { update insert delete }; ++ allow sepgsql_client_type user_sepgsql_seq_t:db_sequence { create drop setattr set_value }; ++ allow sepgsql_client_type user_sepgsql_view_t:db_view { create drop setattr }; ++ allow sepgsql_client_type user_sepgsql_proc_exec_t:db_procedure { create drop setattr }; ++ # Note that permission of creation/deletion are eventually controlled by ++ # create or drop permission of individual objects within shared schemas. ++ # So, it just allows to create/drop user specific types. + allow sepgsql_client_type sepgsql_schema_t:db_schema { add_name remove_name }; + ') + +@@ -536,7 +595,7 @@ allow sepgsql_admin_type sepgsql_module_type:db_database install_module; + + kernel_relabelfrom_unlabeled_database(sepgsql_admin_type) + +-tunable_policy(`sepgsql_unconfined_dbadm',` ++tunable_policy(`postgresql_selinux_unconfined_dbadm',` + allow sepgsql_admin_type sepgsql_database_type:db_database *; + + allow sepgsql_admin_type sepgsql_schema_type:db_schema *; +@@ -589,3 +648,17 @@ allow sepgsql_unconfined_type sepgsql_blob_type:db_blob *; + allow sepgsql_unconfined_type sepgsql_module_type:db_database install_module; + + kernel_relabelfrom_unlabeled_database(sepgsql_unconfined_type) ++ ++optional_policy(` ++ tunable_policy(`postgresql_can_rsync',` ++ rsync_exec(postgresql_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`postgresql_can_rsync',` ++ ssh_exec(postgresql_t) ++ ssh_read_user_home_files(postgresql_t) ++ corenet_tcp_connect_ssh_port(postgresql_t) ++ ') ++') +diff --git a/policy/modules/services/ssh.fc b/policy/modules/services/ssh.fc +index 76d9f66ecc..5c271ce019 100644 +--- a/policy/modules/services/ssh.fc ++++ b/policy/modules/services/ssh.fc +@@ -1,16 +1,41 @@ + HOME_DIR/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++HOME_DIR/\.ansible/cp/.* -s gen_context(system_u:object_r:ssh_home_t,s0) ++HOME_DIR/\.shosts gen_context(system_u:object_r:ssh_home_t,s0) + +-/etc/ssh/primes -- gen_context(system_u:object_r:sshd_key_t,s0) +-/etc/ssh/ssh_host.*_key -- gen_context(system_u:object_r:sshd_key_t,s0) ++/var/lib/[^/]+/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/amanda/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/gitolite/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/gitolite3/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/nocpulse/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/one/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/openshift/[^/]+/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/openshift/gear/[^/]+/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/pgsql/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/var/lib/stickshift/[^/]+/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++ ++/etc/rc\.d/init\.d/sshd -- gen_context(system_u:object_r:sshd_initrc_exec_t,s0) ++ ++/etc/ssh/primes -- gen_context(system_u:object_r:sshd_key_t,s0) ++/etc/ssh/ssh_host.*_key -- gen_context(system_u:object_r:sshd_key_t,s0) ++/etc/ssh/ssh_host.*_key\.pub -- gen_context(system_u:object_r:sshd_key_t,s0) + + /usr/bin/ssh -- gen_context(system_u:object_r:ssh_exec_t,s0) + /usr/bin/ssh-agent -- gen_context(system_u:object_r:ssh_agent_exec_t,s0) + /usr/bin/ssh-keygen -- gen_context(system_u:object_r:ssh_keygen_exec_t,s0) + + /usr/lib/openssh/ssh-keysign -- gen_context(system_u:object_r:ssh_keysign_exec_t,s0) ++/usr/lib/systemd/system/sshd.* -- gen_context(system_u:object_r:sshd_unit_file_t,s0) ++/usr/lib/systemd/system/sshd-keygen.* -- gen_context(system_u:object_r:sshd_keygen_unit_file_t,s0) + ++/usr/libexec/nm-ssh-service -- gen_context(system_u:object_r:ssh_exec_t,s0) + /usr/libexec/openssh/ssh-keysign -- gen_context(system_u:object_r:ssh_keysign_exec_t,s0) + + /usr/sbin/sshd -- gen_context(system_u:object_r:sshd_exec_t,s0) ++/usr/sbin/sshd-keygen -- gen_context(system_u:object_r:sshd_keygen_exec_t,s0) ++/usr/sbin/gsisshd -- gen_context(system_u:object_r:sshd_exec_t,s0) + + /var/run/sshd\.init\.pid -- gen_context(system_u:object_r:sshd_var_run_t,s0) ++/var/run/sshd\.pid -- gen_context(system_u:object_r:sshd_var_run_t,s0) ++ ++/root/\.ssh(/.*)? gen_context(system_u:object_r:ssh_home_t,s0) ++/root/\.shosts gen_context(system_u:object_r:ssh_home_t,s0) +diff --git a/policy/modules/services/ssh.if b/policy/modules/services/ssh.if +index fe0c682726..68d48b722c 100644 +--- a/policy/modules/services/ssh.if ++++ b/policy/modules/services/ssh.if +@@ -32,10 +32,11 @@ + ## + # + template(`ssh_basic_client_template',` +- + gen_require(` + attribute ssh_server; + type ssh_exec_t, sshd_key_t, sshd_tmp_t; ++ type ssh_keysign_exec_t, ssh_keysign_t; ++ type ssh_home_t; + ') + + ############################## +@@ -47,10 +48,6 @@ template(`ssh_basic_client_template',` + application_domain($1_ssh_t, ssh_exec_t) + role $3 types $1_ssh_t; + +- type $1_ssh_home_t; +- files_type($1_ssh_home_t) +- typealias $1_ssh_home_t alias $1_home_ssh_t; +- + ############################## + # + # Client local policy +@@ -89,33 +86,38 @@ template(`ssh_basic_client_template',` + # or "regular" (not special like sshd_extern_t) servers + allow $2 ssh_server:unix_stream_socket rw_stream_socket_perms; + ++ # derived domain can execute ssh-keysign ++ domtrans_pattern($1_ssh_t, ssh_keysign_exec_t, ssh_keysign_t) ++ role $3 types ssh_keysign_t; ++ + # allow ps to show ssh + ps_process_pattern($2, $1_ssh_t) + + # user can manage the keys and config +- manage_files_pattern($2, $1_ssh_home_t, $1_ssh_home_t) +- manage_lnk_files_pattern($2, $1_ssh_home_t, $1_ssh_home_t) +- manage_sock_files_pattern($2, $1_ssh_home_t, $1_ssh_home_t) ++ manage_files_pattern($2, ssh_home_t, ssh_home_t) ++ manage_lnk_files_pattern($2, ssh_home_t, ssh_home_t) ++ manage_sock_files_pattern($2, ssh_home_t, ssh_home_t) + + # ssh client can manage the keys and config +- manage_files_pattern($1_ssh_t, $1_ssh_home_t, $1_ssh_home_t) +- read_lnk_files_pattern($1_ssh_t, $1_ssh_home_t, $1_ssh_home_t) ++ manage_files_pattern($1_ssh_t, ssh_home_t, ssh_home_t) ++ read_lnk_files_pattern($1_ssh_t, ssh_home_t, ssh_home_t) + + # ssh servers can read the user keys and config +- allow ssh_server $1_ssh_home_t:dir list_dir_perms; +- read_files_pattern(ssh_server, $1_ssh_home_t, $1_ssh_home_t) +- read_lnk_files_pattern(ssh_server, $1_ssh_home_t, $1_ssh_home_t) ++ allow ssh_server ssh_home_t:dir list_dir_perms; ++ read_files_pattern(ssh_server, ssh_home_t, ssh_home_t) ++ read_lnk_files_pattern(ssh_server, ssh_home_t, ssh_home_t) + + kernel_read_kernel_sysctls($1_ssh_t) + kernel_read_system_state($1_ssh_t) + +- corenet_all_recvfrom_unlabeled($1_ssh_t) + corenet_all_recvfrom_netlabel($1_ssh_t) + corenet_tcp_sendrecv_generic_if($1_ssh_t) + corenet_tcp_sendrecv_generic_node($1_ssh_t) + corenet_tcp_sendrecv_all_ports($1_ssh_t) + corenet_tcp_connect_ssh_port($1_ssh_t) + corenet_sendrecv_ssh_client_packets($1_ssh_t) ++ corenet_tcp_bind_generic_node($1_ssh_t) ++ corenet_tcp_bind_all_unreserved_ports($1_ssh_t) + + dev_read_urand($1_ssh_t) + +@@ -139,7 +141,6 @@ template(`ssh_basic_client_template',` + logging_send_syslog_msg($1_ssh_t) + logging_read_generic_logs($1_ssh_t) + +- miscfiles_read_localization($1_ssh_t) + + seutil_read_config($1_ssh_t) + +@@ -148,6 +149,29 @@ template(`ssh_basic_client_template',` + ') + ') + ++###################################### ++## ++## The template to define a domain to which sshd dyntransition. ++## ++## ++## ++## The prefix of the dyntransition domain ++## ++## ++# ++template(`ssh_dyntransition_domain_template',` ++ gen_require(` ++ attribute ssh_dyntransition_domain; ++ ') ++ ++ type $1, ssh_dyntransition_domain; ++ domain_type($1) ++ role system_r types $1; ++ ++ optional_policy(` ++ ssh_dyntransition_to($1) ++ ') ++') + ####################################### + ## + ## The template to define a ssh server. +@@ -168,7 +192,7 @@ template(`ssh_basic_client_template',` + ## + ## + # +-template(`ssh_server_template', ` ++template(`ssh_server_template',` + type $1_t, ssh_server; + auth_login_pgm_domain($1_t) + +@@ -181,20 +205,23 @@ template(`ssh_server_template', ` + type $1_var_run_t; + files_pid_file($1_var_run_t) + +- allow $1_t self:capability { kill sys_chroot sys_nice sys_resource chown dac_override fowner fsetid setgid setuid sys_tty_config }; ++ allow $1_t self:capability { kill sys_admin sys_chroot sys_nice sys_resource chown dac_read_search dac_override fowner fsetid net_admin setgid setuid sys_tty_config }; + allow $1_t self:fifo_file rw_fifo_file_perms; +- allow $1_t self:process { signal getsched setsched setrlimit setexec setkeycreate }; ++ allow $1_t self:process { getcap signal getsched setsched setrlimit setexec }; ++ allow $1_t self:process { signal getcap getsched setsched setrlimit setexec }; + allow $1_t self:tcp_socket create_stream_socket_perms; + allow $1_t self:udp_socket create_socket_perms; ++ allow $1_t self:tun_socket { create_socket_perms relabelfrom relabelto }; + # ssh agent connections: + allow $1_t self:unix_stream_socket create_stream_socket_perms; + allow $1_t self:shm create_shm_perms; + +- allow $1_t $1_devpts_t:chr_file { rw_chr_file_perms setattr getattr relabelfrom }; ++ allow $1_t $1_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms getattr_chr_file_perms relabelfrom }; + term_create_pty($1_t, $1_devpts_t) + +- manage_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) +- fs_tmpfs_filetrans($1_t, $1_tmpfs_t, file) ++ #manage_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) ++ #fs_tmpfs_filetrans($1_t, $1_tmpfs_t, file) ++ userdom_manage_tmp_role(system_r, sshd_t) + + allow $1_t $1_var_run_t:file manage_file_perms; + files_pid_filetrans($1_t, $1_var_run_t, file) +@@ -206,6 +233,7 @@ template(`ssh_server_template', ` + + kernel_read_kernel_sysctls($1_t) + kernel_read_network_state($1_t) ++ kernel_request_load_module($1_t) + + corenet_all_recvfrom_unlabeled($1_t) + corenet_all_recvfrom_netlabel($1_t) +@@ -220,10 +248,13 @@ template(`ssh_server_template', ` + corenet_tcp_bind_generic_node($1_t) + corenet_udp_bind_generic_node($1_t) + corenet_tcp_bind_ssh_port($1_t) +- corenet_tcp_connect_all_ports($1_t) + corenet_sendrecv_ssh_server_packets($1_t) ++ # -R qualifier ++ corenet_sendrecv_ssh_server_packets($1_t) ++ # tunnel feature and -w (net_admin capability also) ++ corenet_rw_tun_tap_dev($1_t) + +- fs_dontaudit_getattr_all_fs($1_t) ++ fs_getattr_all_fs($1_t) + + auth_rw_login_records($1_t) + auth_rw_faillog($1_t) +@@ -233,7 +264,10 @@ template(`ssh_server_template', ` + # for sshd subsystems, such as sftp-server. + corecmd_getattr_bin_files($1_t) + ++ dev_rw_crypto($1_t) ++ + domain_interactive_fd($1_t) ++ domain_dyntrans_type($1_t) + + files_read_etc_files($1_t) + files_read_etc_runtime_files($1_t) +@@ -241,35 +275,33 @@ template(`ssh_server_template', ` + + logging_search_logs($1_t) + +- miscfiles_read_localization($1_t) +- +- userdom_create_all_users_keys($1_t) + userdom_dontaudit_relabelfrom_user_ptys($1_t) +- userdom_search_user_home_dirs($1_t) ++ userdom_read_user_home_content_files($1_t) + + # Allow checking users mail at login + optional_policy(` + mta_getattr_spool($1_t) + ') + +- tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files($1_t) +- fs_read_nfs_symlinks($1_t) +- ') +- +- tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files($1_t) +- ') ++ userdom_home_manager($1_t) + + optional_policy(` + kerberos_use($1_t) +- kerberos_manage_host_rcache($1_t) ++ #kerberos_manage_host_rcache($1_t) + ') + + optional_policy(` + files_read_var_lib_symlinks($1_t) + nx_spec_domtrans_server($1_t) + ') ++ ++ optional_policy(` ++ rlogin_read_home_content($1_t) ++ ') ++ ++ optional_policy(` ++ shutdown_getattr_exec_files($1_t) ++ ') + ') + + ######################################## +@@ -292,14 +324,15 @@ template(`ssh_server_template', ` + ## User domain for the role + ##
      + ## ++## + # + template(`ssh_role_template',` + gen_require(` + attribute ssh_server, ssh_agent_type; +- + type ssh_t, ssh_exec_t, ssh_tmpfs_t, ssh_home_t; + type ssh_agent_exec_t, ssh_keysign_t, ssh_tmpfs_t; + type ssh_agent_tmp_t; ++ type cache_home_t; + ') + + ############################## +@@ -328,103 +361,56 @@ template(`ssh_role_template',` + + # allow ps to show ssh + ps_process_pattern($3, ssh_t) +- allow $3 ssh_t:process signal; ++ allow $3 ssh_t:process signal_perms; + + # for rsync + allow ssh_t $3:unix_stream_socket rw_socket_perms; + allow ssh_t $3:unix_stream_socket connectto; ++ allow ssh_t $3:key manage_key_perms; ++ allow $3 ssh_t:key { write search read view }; + + # user can manage the keys and config + manage_files_pattern($3, ssh_home_t, ssh_home_t) + manage_lnk_files_pattern($3, ssh_home_t, ssh_home_t) + manage_sock_files_pattern($3, ssh_home_t, ssh_home_t) + userdom_search_user_home_dirs($1_t) ++ userdom_manage_tmp_role($2, ssh_t) + + ############################## + # + # SSH agent local policy + # + +- allow $1_ssh_agent_t self:process setrlimit; +- allow $1_ssh_agent_t self:capability setgid; +- + allow $1_ssh_agent_t { $1_ssh_agent_t $3 }:process signull; + + allow $1_ssh_agent_t self:unix_stream_socket { create_stream_socket_perms connectto }; + +- manage_dirs_pattern($1_ssh_agent_t, ssh_agent_tmp_t, ssh_agent_tmp_t) +- manage_sock_files_pattern($1_ssh_agent_t, ssh_agent_tmp_t, ssh_agent_tmp_t) +- files_tmp_filetrans($1_ssh_agent_t, ssh_agent_tmp_t, { dir sock_file }) +- + # for ssh-add + stream_connect_pattern($3, ssh_agent_tmp_t, ssh_agent_tmp_t, $1_ssh_agent_t) ++ stream_connect_pattern($3, cache_home_t, cache_home_t, $1_ssh_agent_t) + + # Allow the user shell to signal the ssh program. +- allow $3 $1_ssh_agent_t:process signal; ++ allow $3 $1_ssh_agent_t:process signal_perms; + + # allow ps to show ssh + ps_process_pattern($3, $1_ssh_agent_t) + + domtrans_pattern($3, ssh_agent_exec_t, $1_ssh_agent_t) + +- kernel_read_kernel_sysctls($1_ssh_agent_t) +- +- dev_read_urand($1_ssh_agent_t) +- dev_read_rand($1_ssh_agent_t) +- +- fs_search_auto_mountpoints($1_ssh_agent_t) ++ kernel_read_system_state($1_ssh_agent_t) + + # transition back to normal privs upon exec + corecmd_shell_domtrans($1_ssh_agent_t, $3) + corecmd_bin_domtrans($1_ssh_agent_t, $3) + +- domain_use_interactive_fds($1_ssh_agent_t) +- +- files_read_etc_files($1_ssh_agent_t) +- files_read_etc_runtime_files($1_ssh_agent_t) +- files_search_home($1_ssh_agent_t) +- +- libs_read_lib_files($1_ssh_agent_t) ++ auth_use_nsswitch($1_ssh_agent_t) + + logging_send_syslog_msg($1_ssh_agent_t) + +- miscfiles_read_localization($1_ssh_agent_t) +- miscfiles_read_generic_certs($1_ssh_agent_t) +- +- seutil_dontaudit_read_config($1_ssh_agent_t) +- +- # Write to the user domain tty. +- userdom_use_user_terminals($1_ssh_agent_t) +- +- # for the transition back to normal privs upon exec +- userdom_search_user_home_content($1_ssh_agent_t) + userdom_user_home_domtrans($1_ssh_agent_t, $3) +- allow $3 $1_ssh_agent_t:fd use; +- allow $3 $1_ssh_agent_t:fifo_file rw_file_perms; +- allow $3 $1_ssh_agent_t:process sigchld; +- +- tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_files($1_ssh_agent_t) +- +- # transition back to normal privs upon exec +- fs_nfs_domtrans($1_ssh_agent_t, $3) +- ') +- +- tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_files($1_ssh_agent_t) +- +- # transition back to normal privs upon exec +- fs_cifs_domtrans($1_ssh_agent_t, $3) +- ') +- +- optional_policy(` +- nis_use_ypbind($1_ssh_agent_t) +- ') ++ userdom_home_manager($1_ssh_agent_t) + +- optional_policy(` +- xserver_use_xdm_fds($1_ssh_agent_t) +- xserver_rw_xdm_pipes($1_ssh_agent_t) +- ') ++ ssh_exec_keygen($3) + ') + + ######################################## +@@ -496,8 +482,27 @@ interface(`ssh_read_pipes',` + type sshd_t; + ') + +- allow $1 sshd_t:fifo_file { getattr read }; ++ allow $1 sshd_t:fifo_file read_fifo_file_perms; ++') ++ ++###################################### ++## ++## Read and write ssh server unix dgram sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_rw_dgram_sockets',` ++ gen_require(` ++ type sshd_t; ++ ') ++ ++ allow $1 sshd_t:unix_dgram_socket rw_stream_socket_perms; + ') ++ + ######################################## + ## + ## Read and write a ssh server unnamed pipe. +@@ -513,7 +518,7 @@ interface(`ssh_rw_pipes',` + type sshd_t; + ') + +- allow $1 sshd_t:fifo_file { write read getattr ioctl }; ++ allow $1 sshd_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## +@@ -603,6 +608,24 @@ interface(`ssh_domtrans',` + domtrans_pattern($1, sshd_exec_t, sshd_t) + ') + ++######################################## ++## ++## Execute sshd server in the sshd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_initrc_domtrans',` ++ gen_require(` ++ type sshd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, sshd_initrc_exec_t) ++') ++ + ######################################## + ## + ## Execute the ssh client in the caller domain. +@@ -637,7 +660,7 @@ interface(`ssh_setattr_key_files',` + type sshd_key_t; + ') + +- allow $1 sshd_key_t:file setattr; ++ allow $1 sshd_key_t:file setattr_file_perms; + files_search_pids($1) + ') + +@@ -660,6 +683,42 @@ interface(`ssh_agent_exec',` + can_exec($1, ssh_agent_exec_t) + ') + ++######################################## ++## ++## Getattr ssh home directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_getattr_user_home_dir',` ++ gen_require(` ++ type ssh_home_t; ++ ') ++ ++ allow $1 ssh_home_t:dir getattr; ++') ++ ++######################################## ++## ++## Dontaudit search ssh home directory ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ssh_dontaudit_search_user_home_dir',` ++ gen_require(` ++ type ssh_home_t; ++ ') ++ ++ dontaudit $1 ssh_home_t:dir search_dir_perms; ++') ++ + ######################################## + ## + ## Read ssh home directory content +@@ -697,6 +756,69 @@ interface(`ssh_domtrans_keygen',` + ') + + domtrans_pattern($1, ssh_keygen_exec_t, ssh_keygen_t) ++ allow $1 ssh_keygen_exec_t:file map; ++') ++ ++######################################## ++## ++## Execute the ssh key generator in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ssh_exec_keygen',` ++ gen_require(` ++ type ssh_keygen_exec_t; ++ ') ++ ++ can_exec($1, ssh_keygen_exec_t) ++') ++ ++####################################### ++## ++## Execute ssh-keygen in the iptables domain, and ++## allow the specified role the ssh-keygen domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`ssh_run_keygen',` ++ gen_require(` ++ type ssh_keygen_t; ++ ') ++ ++ role $2 types ssh_keygen_t; ++ ssh_domtrans_keygen($1) ++') ++ ++######################################## ++## ++## Getattr ssh server keys ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ssh_getattr_server_keys',` ++ gen_require(` ++ type sshd_key_t; ++ ') ++ ++ allow $1 sshd_key_t:file getattr_file_perms; + ') + + ######################################## +@@ -714,7 +836,26 @@ interface(`ssh_dontaudit_read_server_keys',` + type sshd_key_t; + ') + +- dontaudit $1 sshd_key_t:file { getattr read }; ++ dontaudit $1 sshd_key_t:file read_file_perms; ++') ++ ++###################################### ++## ++## Append ssh home directory content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_append_home_files',` ++ gen_require(` ++ type ssh_home_t; ++ ') ++ ++ append_files_pattern($1, ssh_home_t, ssh_home_t) ++ userdom_search_user_home_dirs($1) + ') + + ###################################### +@@ -754,3 +895,151 @@ interface(`ssh_delete_tmp',` + files_search_tmp($1) + delete_files_pattern($1, sshd_tmp_t, sshd_tmp_t) + ') ++ ++##################################### ++## ++## Allow domain dyntransition to chroot_user_t domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_dyntransition_to',` ++ gen_require(` ++ type sshd_t; ++ ') ++ ++ allow sshd_t $1:process dyntransition; ++ allow $1 sshd_t:process sigchld; ++ allow sshd_t $1:process { getattr sigkill sigstop signull signal }; ++') ++ ++######################################## ++## ++## Create .ssh directory in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_filetrans_admin_home_content',` ++ gen_require(` ++ type ssh_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, ssh_home_t, dir, ".ssh") ++ userdom_admin_home_dir_filetrans($1, ssh_home_t, dir, ".shosts") ++') ++ ++######################################## ++## ++## Create .ssh directory in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_filetrans_home_content',` ++ ++ gen_require(` ++ type ssh_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, ssh_home_t, dir, ".ssh") ++ userdom_user_home_dir_filetrans($1, ssh_home_t, dir, ".shosts") ++ files_var_lib_filetrans($1, ssh_home_t, dir, ".ssh") ++') ++ ++######################################## ++## ++## Create .ssh directory in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ssh_filetrans_keys',` ++ ++ gen_require(` ++ type sshd_key_t; ++ ') ++ ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_key") ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_dsa_key") ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_rsa_key") ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_key.pub") ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_dsa_key.pub") ++ files_etc_filetrans($1, sshd_key_t, file, ".ssh_host_rsa_key.pub") ++') ++ ++######################################## ++## ++## Do not audit attempts to read and ++## write the sshd pty type. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ssh_dontaudit_use_ptys',` ++ gen_require(` ++ type sshd_devpts_t; ++ ') ++ ++ dontaudit $1 sshd_devpts_t:chr_file { getattr read write ioctl }; ++') ++ ++######################################## ++## ++## Read and write inherited sshd pty type. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ssh_use_ptys',` ++ gen_require(` ++ type sshd_devpts_t; ++ ') ++ ++ allow $1 sshd_devpts_t:chr_file rw_inherited_chr_file_perms; ++') ++ ++######################################## ++## ++## Execute sshd server in the sshd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ssh_systemctl',` ++ gen_require(` ++ type sshd_t; ++ type sshd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 sshd_unit_file_t:file manage_file_perms; ++ allow $1 sshd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sshd_t) ++') +diff --git a/policy/modules/services/ssh.te b/policy/modules/services/ssh.te +index cc877c7b0f..f2da060bfe 100644 +--- a/policy/modules/services/ssh.te ++++ b/policy/modules/services/ssh.te +@@ -6,43 +6,69 @@ policy_module(ssh, 2.4.2) + # + + ## +-##

      +-## allow host key based authentication +-##

      ++##

      ++## allow host key based authentication ++##

      ++##
      ++gen_tunable(ssh_keysign, false) ++ ++## ++##

      ++## Allow ssh logins as sysadm_r:sysadm_t ++##

      + ##
      +-gen_tunable(allow_ssh_keysign, false) ++gen_tunable(ssh_sysadm_login, false) + + ## + ##

      +-## Allow ssh logins as sysadm_r:sysadm_t ++## Allow ssh with chroot env to read and write files ++## in the user home directories + ##

      + ##
      +-gen_tunable(ssh_sysadm_login, false) ++gen_tunable(ssh_chroot_rw_homedirs, false) + ++attribute ssh_dyntransition_domain; + attribute ssh_server; + attribute ssh_agent_type; + ++ssh_dyntransition_domain_template(chroot_user_t) ++ssh_dyntransition_domain_template(sshd_sandbox_t) ++ssh_dyntransition_domain_template(sshd_net_t) ++ + type ssh_keygen_t; + type ssh_keygen_exec_t; + init_system_domain(ssh_keygen_t, ssh_keygen_exec_t) +-role system_r types ssh_keygen_t; ++ ++type ssh_keygen_tmp_t; ++files_tmp_file(ssh_keygen_tmp_t) ++ ++type sshd_keygen_t; ++type sshd_keygen_exec_t; ++init_daemon_domain(sshd_keygen_t, sshd_keygen_exec_t) ++ ++type sshd_keygen_unit_file_t; ++systemd_unit_file(sshd_keygen_unit_file_t) + + type sshd_exec_t; + corecmd_executable_file(sshd_exec_t) + + ssh_server_template(sshd) + init_daemon_domain(sshd_t, sshd_exec_t) ++mls_trusted_object(sshd_t) ++mls_process_write_all_levels(sshd_t) ++mls_dbus_send_all_levels(sshd_t) ++ ++type sshd_initrc_exec_t; ++init_script_file(sshd_initrc_exec_t) ++ ++type sshd_unit_file_t; ++systemd_unit_file(sshd_unit_file_t) + + type sshd_key_t; + files_type(sshd_key_t) + +-type sshd_tmp_t; +-files_tmp_file(sshd_tmp_t) +-files_poly_parent(sshd_tmp_t) +- +-ifdef(`enable_mcs',` +- init_ranged_daemon_domain(sshd_t, sshd_exec_t, s0 - mcs_systemhigh) +-') ++type sshd_keytab_t; ++files_type(sshd_keytab_t) + + type ssh_t; + type ssh_exec_t; +@@ -67,15 +93,17 @@ userdom_user_application_domain(ssh_keysign_t, ssh_keysign_exec_t) + type ssh_tmpfs_t; + typealias ssh_tmpfs_t alias { user_ssh_tmpfs_t staff_ssh_tmpfs_t sysadm_ssh_tmpfs_t }; + typealias ssh_tmpfs_t alias { auditadm_ssh_tmpfs_t secadm_ssh_tmpfs_t }; +-userdom_user_tmpfs_file(ssh_tmpfs_t) ++userdom_user_tmp_file(ssh_tmpfs_t) + + type ssh_home_t; + typealias ssh_home_t alias { home_ssh_t user_ssh_home_t user_home_ssh_t staff_home_ssh_t sysadm_home_ssh_t }; + typealias ssh_home_t alias { auditadm_home_ssh_t secadm_home_ssh_t }; + userdom_user_home_content(ssh_home_t) ++files_poly_parent(ssh_home_t) + +-type sshd_keytab_t; +-files_type(sshd_keytab_t) ++ifdef(`enable_mcs',` ++ init_ranged_daemon_domain(sshd_t, sshd_exec_t, s0 - mcs_systemhigh) ++') + + ############################## + # +@@ -86,6 +114,7 @@ allow ssh_t self:capability { setuid setgid dac_override dac_read_search }; + allow ssh_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow ssh_t self:fd use; + allow ssh_t self:fifo_file rw_fifo_file_perms; ++allow ssh_t self:key manage_key_perms; + allow ssh_t self:unix_dgram_socket { create_socket_perms sendto }; + allow ssh_t self:unix_stream_socket { create_stream_socket_perms connectto }; + allow ssh_t self:shm create_shm_perms; +@@ -93,50 +122,55 @@ allow ssh_t self:sem create_sem_perms; + allow ssh_t self:msgq create_msgq_perms; + allow ssh_t self:msg { send receive }; + allow ssh_t self:tcp_socket create_stream_socket_perms; ++can_exec(ssh_t, ssh_exec_t) + + # Read the ssh key file. + allow ssh_t sshd_key_t:file read_file_perms; + +-# Access the ssh temporary files. +-allow ssh_t sshd_tmp_t:dir manage_dir_perms; +-allow ssh_t sshd_tmp_t:file manage_file_perms; +-files_tmp_filetrans(ssh_t, sshd_tmp_t, { file dir }) +- + manage_files_pattern(ssh_t, ssh_tmpfs_t, ssh_tmpfs_t) + manage_lnk_files_pattern(ssh_t, ssh_tmpfs_t, ssh_tmpfs_t) + manage_fifo_files_pattern(ssh_t, ssh_tmpfs_t, ssh_tmpfs_t) + manage_sock_files_pattern(ssh_t, ssh_tmpfs_t, ssh_tmpfs_t) +-fs_tmpfs_filetrans(ssh_t, ssh_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++#fs_tmpfs_filetrans(ssh_t, ssh_tmpfs_t, { dir file lnk_file sock_file fifo_file }) + + manage_dirs_pattern(ssh_t, ssh_home_t, ssh_home_t) + manage_sock_files_pattern(ssh_t, ssh_home_t, ssh_home_t) +-userdom_user_home_dir_filetrans(ssh_t, ssh_home_t, { dir sock_file }) ++userdom_user_home_dir_filetrans(ssh_t, ssh_home_t, sock_file) ++userdom_user_home_content_filetrans(ssh_t, ssh_home_t, sock_file) ++userdom_user_home_dir_filetrans(ssh_t, ssh_home_t, dir, ".ssh") ++userdom_read_all_users_keys(ssh_t) ++userdom_stream_connect(ssh_t) ++userdom_search_admin_dir(sshd_t) + + # Allow the ssh program to communicate with ssh-agent. + stream_connect_pattern(ssh_t, ssh_agent_tmp_t, ssh_agent_tmp_t, ssh_agent_type) + + allow ssh_t sshd_t:unix_stream_socket connectto; ++allow ssh_t sshd_t:peer recv; + + # ssh client can manage the keys and config + manage_files_pattern(ssh_t, ssh_home_t, ssh_home_t) + read_lnk_files_pattern(ssh_t, ssh_home_t, ssh_home_t) + + # ssh servers can read the user keys and config +-allow ssh_server ssh_home_t:dir list_dir_perms; +-read_files_pattern(ssh_server, ssh_home_t, ssh_home_t) +-read_lnk_files_pattern(ssh_server, ssh_home_t, ssh_home_t) ++manage_dirs_pattern(ssh_server, ssh_home_t, ssh_home_t) ++manage_files_pattern(ssh_server, ssh_home_t, ssh_home_t) + + kernel_read_kernel_sysctls(ssh_t) + kernel_read_system_state(ssh_t) + +-corenet_all_recvfrom_unlabeled(ssh_t) + corenet_all_recvfrom_netlabel(ssh_t) + corenet_tcp_sendrecv_generic_if(ssh_t) + corenet_tcp_sendrecv_generic_node(ssh_t) + corenet_tcp_sendrecv_all_ports(ssh_t) + corenet_tcp_connect_ssh_port(ssh_t) ++corenet_tcp_connect_all_unreserved_ports(ssh_t) + corenet_sendrecv_ssh_client_packets(ssh_t) ++corenet_tcp_bind_generic_node(ssh_t) ++#corenet_tcp_bind_all_unreserved_ports(ssh_t) ++corenet_rw_tun_tap_dev(ssh_t) + ++dev_read_rand(ssh_t) + dev_read_urand(ssh_t) + + fs_getattr_all_fs(ssh_t) +@@ -157,40 +191,46 @@ files_read_var_files(ssh_t) + logging_send_syslog_msg(ssh_t) + logging_read_generic_logs(ssh_t) + ++term_use_ptmx(ssh_t) ++ + auth_use_nsswitch(ssh_t) + +-miscfiles_read_localization(ssh_t) ++miscfiles_read_generic_certs(ssh_t) + + seutil_read_config(ssh_t) + + userdom_dontaudit_list_user_home_dirs(ssh_t) + userdom_search_user_home_dirs(ssh_t) ++userdom_search_admin_dir(ssh_t) + # Write to the user domain tty. +-userdom_use_user_terminals(ssh_t) +-# needs to read krb tgt ++userdom_use_inherited_user_terminals(ssh_t) ++# needs to read krb/write tgt + userdom_read_user_tmp_files(ssh_t) +- +-tunable_policy(`allow_ssh_keysign',` +- domain_auto_trans(ssh_t, ssh_keysign_exec_t, ssh_keysign_t) +- allow ssh_keysign_t ssh_t:fd use; +- allow ssh_keysign_t ssh_t:process sigchld; +- allow ssh_keysign_t ssh_t:fifo_file rw_file_perms; ++userdom_write_user_tmp_files(ssh_t) ++userdom_read_user_home_content_symlinks(ssh_t) ++userdom_rw_inherited_user_home_content_files(ssh_t) ++userdom_read_home_certs(ssh_t) ++userdom_home_manager(ssh_t) ++ ++tunable_policy(`ssh_keysign',` ++ domtrans_pattern(ssh_t, ssh_keysign_exec_t, ssh_keysign_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(ssh_t) +- fs_manage_nfs_files(ssh_t) ++# for port forwarding ++tunable_policy(`selinuxuser_tcp_server',` ++ corenet_tcp_bind_ssh_port(ssh_t) ++ corenet_tcp_bind_generic_node(ssh_t) ++ corenet_tcp_bind_all_unreserved_ports(ssh_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(ssh_t) +- fs_manage_cifs_files(ssh_t) ++ifdef(`enable_mcs',` ++ optional_policy(` ++ condor_startd_ranged_domtrans_to(sshd_t, sshd_exec_t, mcs_systemlow - mcs_systemhigh) ++ ') + ') + +-# for port forwarding +-tunable_policy(`user_tcp_server',` +- corenet_tcp_bind_ssh_port(ssh_t) +- corenet_tcp_bind_generic_node(ssh_t) ++optional_policy(` ++ gnome_stream_connect_gkeyringd(ssh_t) + ') + + optional_policy(` +@@ -198,6 +238,7 @@ optional_policy(` + xserver_domtrans_xauth(ssh_t) + ') + ++ + ############################## + # + # ssh_keysign_t local policy +@@ -205,10 +246,16 @@ optional_policy(` + + allow ssh_keysign_t self:capability { setgid setuid }; + allow ssh_keysign_t self:unix_stream_socket create_socket_perms; ++allow ssh_keysign_t self:udp_socket create_socket_perms; ++ ++allow ssh_keysign_t sshd_key_t:file { getattr open read }; ++ ++kernel_read_network_state(ssh_keysign_t) + +-allow ssh_keysign_t sshd_key_t:file { getattr read }; ++auth_read_passwd(ssh_keysign_t) + + dev_read_urand(ssh_keysign_t) ++dev_read_rand(ssh_keysign_t) + + files_read_etc_files(ssh_keysign_t) + +@@ -216,6 +263,14 @@ optional_policy(` + nscd_use(ssh_keysign_t) + ') + ++optional_policy(` ++ sssd_read_public_files(ssh_keysign_t) ++') ++ ++optional_policy(` ++ sge_rw_tcp_sockets(ssh_keysign_t) ++') ++ + ################################# + # + # sshd local policy +@@ -226,45 +281,79 @@ optional_policy(` + # so a tunnel can point to another ssh tunnel + allow sshd_t self:netlink_route_socket r_netlink_socket_perms; + allow sshd_t self:key { search link write }; ++allow sshd_t self:process setcurrent; + + allow sshd_t sshd_keytab_t:file read_file_perms; + +-manage_dirs_pattern(sshd_t, sshd_tmp_t, sshd_tmp_t) +-manage_files_pattern(sshd_t, sshd_tmp_t, sshd_tmp_t) +-manage_sock_files_pattern(sshd_t, sshd_tmp_t, sshd_tmp_t) +-files_tmp_filetrans(sshd_t, sshd_tmp_t, { dir file sock_file }) +- + kernel_search_key(sshd_t) + kernel_link_key(sshd_t) ++kernel_read_net_sysctls(sshd_t) ++ ++files_search_all(sshd_t) ++files_create_home_dir(sshd_t) ++ ++fs_search_cgroup_dirs(sshd_t) ++fs_rw_cgroup_files(sshd_t) + + term_use_all_ptys(sshd_t) + term_setattr_all_ptys(sshd_t) ++term_setattr_all_ttys(sshd_t) + term_relabelto_all_ptys(sshd_t) ++term_use_ptmx(sshd_t) + + # for X forwarding + corenet_tcp_bind_xserver_port(sshd_t) ++corenet_tcp_bind_vnc_port(sshd_t) + corenet_sendrecv_xserver_server_packets(sshd_t) + +-ifdef(`distro_debian',` +- allow sshd_t self:process { getcap setcap }; +-') ++auth_exec_login_program(sshd_t) ++auth_signal_chk_passwd(sshd_t) ++ ++userdom_read_user_home_content_files(sshd_t) ++userdom_read_user_home_content_symlinks(sshd_t) ++#userdom_manage_tmp_role(system_r, sshd_t) ++userdom_spec_domtrans_unpriv_users(sshd_t) ++userdom_signal_unpriv_users(sshd_t) ++userdom_dyntransition_unpriv_users(sshd_t) ++userdom_map_tmp_files(sshd_t) + + tunable_policy(`ssh_sysadm_login',` + # Relabel and access ptys created by sshd + # ioctl is necessary for logout() processing for utmp entry and for w to + # display the tty. + # some versions of sshd on the new SE Linux require setattr +- userdom_spec_domtrans_all_users(sshd_t) + userdom_signal_all_users(sshd_t) +-',` +- userdom_spec_domtrans_unpriv_users(sshd_t) +- userdom_signal_unpriv_users(sshd_t) ++ userdom_spec_domtrans_all_users(sshd_t) ++ userdom_dyntransition_admin_users(sshd_t) ++') ++ ++optional_policy(` ++ amanda_search_var_lib(sshd_t) ++') ++ ++optional_policy(` ++ condor_rw_lib_files(sshd_t) ++ condor_rw_tcp_sockets_startd(sshd_t) ++ condor_rw_tcp_sockets_schedd(sshd_t) + ') + + optional_policy(` + daemontools_service_domain(sshd_t, sshd_exec_t) + ') + ++optional_policy(` ++ ftp_dyntrans_sftpd(sshd_t) ++ ftp_dyntrans_anon_sftpd(sshd_t) ++') ++ ++optional_policy(` ++ gitosis_manage_lib_files(sshd_t) ++') ++ ++optional_policy(` ++ gnome_exec_keyringd(sshd_t) ++') ++ + optional_policy(` + inetd_tcp_service_domain(sshd_t, sshd_exec_t) + ') +@@ -274,10 +363,26 @@ optional_policy(` + kerberos_use(sshd_t) + ') + ++optional_policy(` ++ lvm_domtrans(sshd_t) ++') ++ ++optional_policy(` ++ munin_read_var_lib_files(sshd_t) ++') ++ ++optional_policy(` ++ nx_read_home_files(sshd_t) ++') ++ + optional_policy(` + oddjob_domtrans_mkhomedir(sshd_t) + ') + ++optional_policy(` ++ rpc_rw_gssd_keys(sshd_t) ++') ++ + optional_policy(` + rpm_use_script_fds(sshd_t) + ') +@@ -288,12 +393,101 @@ optional_policy(` + rssh_read_ro_content(sshd_t) + ') + ++optional_policy(` ++ rsync_read_data(sshd_t) ++') ++ ++optional_policy(` ++ systemd_exec_systemctl(sshd_t) ++') ++ ++optional_policy(` ++ usermanage_domtrans_passwd(sshd_t) ++ usermanage_read_crack_db(sshd_t) ++') ++ ++optional_policy(` ++ openshift_dyntransition(sshd_t) ++ openshift_transition(sshd_t) ++ openshift_manage_tmp_files(sshd_t) ++ openshift_manage_tmp_sockets(sshd_t) ++ openshift_mounton_tmp(sshd_t) ++ openshift_read_lib_files(sshd_t) ++') ++ ++optional_policy(` ++ postgresql_search_db(sshd_t) ++') ++ + optional_policy(` + unconfined_shell_domtrans(sshd_t) + ') + ++optional_policy(` ++ sge_rw_tcp_sockets(sshd_t) ++') ++ ++optional_policy(` ++ kernel_write_proc_files(sshd_t) ++ virt_transition_svirt_sandbox(sshd_t, system_r) ++ virt_stream_connect_sandbox(sshd_t) ++ virt_stream_connect(sshd_t) ++') ++ + optional_policy(` + xserver_domtrans_xauth(sshd_t) ++ xserver_xdm_signull(sshd_t) ++') ++ ++ifdef(`TODO',` ++ tunable_policy(`ssh_sysadm_login',` ++ # Relabel and access ptys created by sshd ++ # ioctl is necessary for logout() processing for utmp entry and for w to ++ # display the tty. ++ # some versions of sshd on the new SE Linux require setattr ++ allow sshd_t ptyfile:chr_file relabelto; ++ ++ optional_policy(` ++ domain_trans(sshd_t, xauth_exec_t, userdomain) ++ ') ++ ',` ++ optional_policy(` ++ domain_trans(sshd_t, xauth_exec_t, unpriv_userdomain) ++ ') ++ # Relabel and access ptys created by sshd ++ # ioctl is necessary for logout() processing for utmp entry and for w to ++ # display the tty. ++ # some versions of sshd on the new SE Linux require setattr ++ allow sshd_t userpty_type:chr_file { relabelto rw_inherited_chr_file_perms setattr_chr_file_perms }; ++ ') ++') dnl endif TODO ++ ++######################################## ++# ++# sshd-keygen local policy ++# ++ ++allow sshd_keygen_t self:capability { chown fsetid }; ++allow sshd_keygen_t self:fifo_file rw_fifo_file_perms; ++allow sshd_keygen_t self:unix_stream_socket create_stream_socket_perms; ++ ++allow sshd_keygen_t sshd_key_t:file manage_file_perms; ++ ++kernel_read_system_state(sshd_keygen_t) ++ ++corecmd_exec_bin(sshd_keygen_t) ++ ++auth_use_nsswitch(sshd_keygen_t) ++ ++files_rw_etc_dirs(sshd_keygen_t) ++ ++#run restorecon ++seutil_domtrans_setfiles(sshd_keygen_t) ++ ++ssh_domtrans_keygen(sshd_keygen_t) ++ ++optional_policy(` ++ plymouthd_exec_plymouth(sshd_keygen_t) + ') + + ######################################## +@@ -304,19 +498,33 @@ optional_policy(` + # ssh_keygen_t is the type of the ssh-keygen program when run at install time + # and by sysadm_t + ++allow ssh_keygen_t self:capability { dac_read_search dac_override }; + dontaudit ssh_keygen_t self:capability sys_tty_config; + allow ssh_keygen_t self:process { sigchld sigkill sigstop signull signal }; +- + allow ssh_keygen_t self:unix_stream_socket create_stream_socket_perms; + + allow ssh_keygen_t sshd_key_t:file manage_file_perms; + files_etc_filetrans(ssh_keygen_t, sshd_key_t, file) + ++manage_dirs_pattern(ssh_keygen_t, ssh_home_t, ssh_home_t) ++manage_files_pattern(ssh_keygen_t, ssh_home_t, ssh_home_t) ++userdom_admin_home_dir_filetrans(ssh_keygen_t, ssh_home_t, dir) ++userdom_user_home_dir_filetrans(ssh_keygen_t, ssh_home_t, dir) ++ ++manage_dirs_pattern(ssh_keygen_t, ssh_keygen_tmp_t, ssh_keygen_tmp_t) ++manage_files_pattern(ssh_keygen_t, ssh_keygen_tmp_t, ssh_keygen_tmp_t) ++files_tmp_filetrans(ssh_keygen_t, ssh_keygen_tmp_t, { file dir }) ++ ++kernel_read_system_state(ssh_keygen_t) + kernel_read_kernel_sysctls(ssh_keygen_t) + ++corecmd_exec_shell(ssh_keygen_t) ++corecmd_exec_bin(ssh_keygen_t) ++ + fs_search_auto_mountpoints(ssh_keygen_t) + + dev_read_sysfs(ssh_keygen_t) ++dev_read_rand(ssh_keygen_t) + dev_read_urand(ssh_keygen_t) + + term_dontaudit_use_console(ssh_keygen_t) +@@ -332,7 +540,13 @@ auth_use_nsswitch(ssh_keygen_t) + + logging_send_syslog_msg(ssh_keygen_t) + ++userdom_home_manager(ssh_keygen_t) + userdom_dontaudit_use_unpriv_user_fds(ssh_keygen_t) ++userdom_use_user_terminals(ssh_keygen_t) ++ ++optional_policy(` ++ glusterd_manage_lib_files(ssh_keygen_t) ++') + + optional_policy(` + seutil_sigchld_newrole(ssh_keygen_t) +@@ -341,3 +555,150 @@ optional_policy(` + optional_policy(` + udev_read_db(ssh_keygen_t) + ') ++ ++#################################### ++# ++# ssh_dyntransition domain local policy ++# ++ ++allow ssh_dyntransition_domain self:capability { setuid sys_chroot setgid }; ++allow ssh_dyntransition_domain self:unix_dgram_socket create_socket_perms; ++ ++allow ssh_dyntransition_domain self:fifo_file rw_fifo_file_perms; ++allow ssh_dyntransition_domain sshd_t:fd use; ++ ++optional_policy(` ++ ssh_rw_stream_sockets(ssh_dyntransition_domain) ++ ssh_rw_tcp_sockets(ssh_dyntransition_domain) ++') ++ ++##################################### ++# ++# ssh_sandbox local policy ++# ++ ++allow sshd_t sshd_sandbox_t:process signal; ++ ++init_ioctl_stream_sockets(sshd_sandbox_t) ++ ++logging_send_audit_msgs(sshd_sandbox_t) ++ ++##################################### ++# ++# sshd [net] child local policy ++# ++ ++allow sshd_t sshd_net_t:process signal; ++ ++allow sshd_net_t self:process setrlimit; ++ ++dev_rw_crypto(sshd_net_t) ++ ++init_ioctl_stream_sockets(sshd_net_t) ++init_rw_tcp_sockets(sshd_net_t) ++ ++logging_send_audit_msgs(sshd_net_t) ++ ++ ++###################################### ++# ++# chroot_user_t local policy ++# ++allow chroot_user_t self:fifo_file rw_fifo_file_perms; ++allow chroot_user_t self:unix_dgram_socket create_socket_perms; ++ ++corecmd_exec_shell(chroot_user_t) ++ ++domain_subj_id_change_exemption(chroot_user_t) ++domain_role_change_exemption(chroot_user_t) ++ ++term_search_ptys(chroot_user_t) ++term_use_ptmx(chroot_user_t) ++ ++fs_getattr_all_fs(chroot_user_t) ++ ++userdom_read_user_home_content_files(chroot_user_t) ++userdom_read_inherited_user_home_content_files(chroot_user_t) ++userdom_read_user_home_content_symlinks(chroot_user_t) ++userdom_exec_user_home_content_files(chroot_user_t) ++userdom_use_inherited_user_ptys(chroot_user_t) ++ ++tunable_policy(`ssh_chroot_rw_homedirs',` ++ files_list_home(chroot_user_t) ++ userdom_manage_user_home_content_files(chroot_user_t) ++ userdom_manage_user_home_content_symlinks(chroot_user_t) ++ userdom_manage_user_home_content_pipes(chroot_user_t) ++ userdom_manage_user_home_content_sockets(chroot_user_t) ++ userdom_manage_user_home_content_dirs(chroot_user_t) ++') ++ ++tunable_policy(`ssh_chroot_rw_homedirs && use_nfs_home_dirs',` ++ fs_manage_nfs_dirs(chroot_user_t) ++ fs_manage_nfs_files(chroot_user_t) ++ fs_manage_nfs_symlinks(chroot_user_t) ++') ++ ++tunable_policy(`ssh_chroot_rw_homedirs && use_samba_home_dirs',` ++ fs_manage_cifs_dirs(chroot_user_t) ++ fs_manage_cifs_files(chroot_user_t) ++ fs_manage_cifs_symlinks(chroot_user_t) ++') ++ ++tunable_policy(`ssh_chroot_rw_homedirs && use_fusefs_home_dirs',` ++ fs_manage_fusefs_dirs(chroot_user_t) ++ fs_manage_fusefs_files(chroot_user_t) ++ fs_manage_fusefs_symlinks(chroot_user_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_read_cifs_files(chroot_user_t) ++ fs_read_cifs_symlinks(chroot_user_t) ++') ++ ++userdom_home_manager(chroot_user_t) ++ ++optional_policy(` ++ ssh_rw_dgram_sockets(chroot_user_t) ++') ++ ++optional_policy(` ++ unconfined_shell_domtrans(chroot_user_t) ++') ++ ++###################################### ++# ++# ssh_agent_type common policy local policy ++# ++allow ssh_agent_type self:process setrlimit; ++allow ssh_agent_type self:capability setgid; ++ ++manage_dirs_pattern(ssh_agent_type, ssh_agent_tmp_t, ssh_agent_tmp_t) ++manage_sock_files_pattern(ssh_agent_type, ssh_agent_tmp_t, ssh_agent_tmp_t) ++files_tmp_filetrans(ssh_agent_type, ssh_agent_tmp_t, { dir sock_file }) ++ ++kernel_read_kernel_sysctls(ssh_agent_type) ++ ++dev_read_urand(ssh_agent_type) ++dev_read_rand(ssh_agent_type) ++ ++fs_search_auto_mountpoints(ssh_agent_type) ++ ++domain_use_interactive_fds(ssh_agent_type) ++ ++files_read_etc_files(ssh_agent_type) ++files_read_etc_runtime_files(ssh_agent_type) ++ ++libs_read_lib_files(ssh_agent_type) ++ ++miscfiles_read_generic_certs(ssh_agent_type) ++ ++# Write to the user domain tty. ++userdom_use_inherited_user_terminals(ssh_agent_type) ++ ++# for the transition back to normal privs upon exec ++userdom_search_user_home_content(ssh_agent_type) ++ ++optional_policy(` ++ xserver_use_xdm_fds(ssh_agent_type) ++ xserver_rw_xdm_pipes(ssh_agent_type) ++') +diff --git a/policy/modules/services/xserver.fc b/policy/modules/services/xserver.fc +index 8274418c65..29bbc59765 100644 +--- a/policy/modules/services/xserver.fc ++++ b/policy/modules/services/xserver.fc +@@ -2,13 +2,36 @@ + # HOME_DIR + # + HOME_DIR/\.fonts\.conf -- gen_context(system_u:object_r:user_fonts_config_t,s0) ++HOME_DIR/\.fonts\.d(/.*)? gen_context(system_u:object_r:user_fonts_config_t,s0) + HOME_DIR/\.fonts(/.*)? gen_context(system_u:object_r:user_fonts_t,s0) ++HOME_DIR/\.local/share/fonts(/.*)? gen_context(system_u:object_r:user_fonts_t,s0) ++HOME_DIR/\.fontconfig(/.*)? gen_context(system_u:object_r:user_fonts_cache_t,s0) + HOME_DIR/\.fonts/auto(/.*)? gen_context(system_u:object_r:user_fonts_cache_t,s0) + HOME_DIR/\.fonts\.cache-.* -- gen_context(system_u:object_r:user_fonts_cache_t,s0) ++HOME_DIR/\.DCOP.* -- gen_context(system_u:object_r:iceauth_home_t,s0) + HOME_DIR/\.ICEauthority.* -- gen_context(system_u:object_r:iceauth_home_t,s0) + HOME_DIR/\.serverauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) + HOME_DIR/\.xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++HOME_DIR/\.Xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) + HOME_DIR/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++HOME_DIR/\.cache/gdm(/.*)? gen_context(system_u:object_r:xdm_home_t,s0) ++HOME_DIR/\.xsession-errors.* -- gen_context(system_u:object_r:xdm_home_t,s0) ++HOME_DIR/\.dmrc.* -- gen_context(system_u:object_r:xdm_home_t,s0) ++ ++/root/\.fonts\.conf -- gen_context(system_u:object_r:user_fonts_config_t,s0) ++/root/\.fonts\.d(/.*)? gen_context(system_u:object_r:user_fonts_config_t,s0) ++/root/\.fonts(/.*)? gen_context(system_u:object_r:user_fonts_t,s0) ++/root/\.fontconfig(/.*)? gen_context(system_u:object_r:user_fonts_cache_t,s0) ++/root/\.fonts/auto(/.*)? gen_context(system_u:object_r:user_fonts_cache_t,s0) ++/root/\.fonts\.cache-.* -- gen_context(system_u:object_r:user_fonts_cache_t,s0) ++/root/\.DCOP.* -- gen_context(system_u:object_r:iceauth_home_t,s0) ++/root/\.ICEauthority.* -- gen_context(system_u:object_r:iceauth_home_t,s0) ++/root/\.serverauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/root/\.xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/root/\.Xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/root/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/root/\.xsession-errors.* -- gen_context(system_u:object_r:xdm_home_t,s0) ++/root/\.dmrc.* -- gen_context(system_u:object_r:xdm_home_t,s0) + + # + # /dev +@@ -22,13 +45,21 @@ HOME_DIR/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) + /etc/gdm(3)?/PreSession/.* -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/gdm(3)?/Xsession -- gen_context(system_u:object_r:xsession_exec_t,s0) + ++/etc/X11/xorg\.conf\.d(/.*)? gen_context(system_u:object_r:xserver_etc_t,s0) ++/etc/[mg]dm(/.*)? gen_context(system_u:object_r:xdm_etc_t,s0) ++/etc/[mg]dm/Init(/.*)? gen_context(system_u:object_r:xdm_unconfined_exec_t,s0) ++/etc/[mg]dm/PostLogin(/.*)? gen_context(system_u:object_r:xdm_unconfined_exec_t,s0) ++/etc/[mg]dm/PostSession(/.*)? gen_context(system_u:object_r:xdm_unconfined_exec_t,s0) ++/etc/[mg]dm/PreSession(/.*)? gen_context(system_u:object_r:xdm_unconfined_exec_t,s0) ++ + /etc/kde[34]?/kdm/Xstartup -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/kde[34]?/kdm/Xreset -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/kde[34]?/kdm/Xsession -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/kde[34]?/kdm/backgroundrc gen_context(system_u:object_r:xdm_var_run_t,s0) + +-/etc/rc\.d/init\.d/x11-common -- gen_context(system_u:object_r:xdm_exec_t,s0) ++/etc/opt/VirtualGL(/.*)? gen_context(system_u:object_r:xdm_rw_etc_t,s0) + ++/etc/rc\.d/init\.d/x11-common -- gen_context(system_u:object_r:xdm_exec_t,s0) + /etc/X11/[wx]dm/Xreset.* -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/X11/[wxg]dm/Xsession -- gen_context(system_u:object_r:xsession_exec_t,s0) + /etc/X11/wdm(/.*)? gen_context(system_u:object_r:xdm_rw_etc_t,s0) +@@ -46,26 +77,35 @@ HOME_DIR/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) + # /tmp + # + +-/tmp/\.ICE-unix -d gen_context(system_u:object_r:xdm_tmp_t,s0) +-/tmp/\.ICE-unix/.* -s <> +-/tmp/\.X0-lock -- gen_context(system_u:object_r:xserver_tmp_t,s0) +-/tmp/\.X11-unix -d gen_context(system_u:object_r:xdm_tmp_t,s0) +-/tmp/\.X11-unix/.* -s <> ++/tmp/\.font-unix(/.*)? gen_context(system_u:object_r:user_fonts_t,s0) + + # + # /usr + # + ++/usr/sbin/mdm-binary -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/s?bin/gdm(3)? -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/s?bin/gdm-binary -- gen_context(system_u:object_r:xdm_exec_t,s0) ++/usr/s?bin/lightdm* -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/s?bin/lxdm(-binary)? -- gen_context(system_u:object_r:xdm_exec_t,s0) +-/usr/s?bin/[xkw]dm -- gen_context(system_u:object_r:xdm_exec_t,s0) ++/usr/s?bin/[mxgkw]dm -- gen_context(system_u:object_r:xdm_exec_t,s0) ++ ++/usr/bin/sddm -- gen_context(system_u:object_r:xdm_exec_t,s0) ++/usr/bin/sddm-greeter -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/bin/gpe-dm -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/bin/iceauth -- gen_context(system_u:object_r:iceauth_exec_t,s0) ++/usr/bin/razor-lightdm-.* -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/bin/slim -- gen_context(system_u:object_r:xdm_exec_t,s0) + /usr/bin/Xair -- gen_context(system_u:object_r:xserver_exec_t,s0) ++/usr/bin/Xephyr -- gen_context(system_u:object_r:xserver_exec_t,s0) + /usr/bin/xauth -- gen_context(system_u:object_r:xauth_exec_t,s0) + /usr/bin/Xorg -- gen_context(system_u:object_r:xserver_exec_t,s0) ++/usr/bin/Xvnc -- gen_context(system_u:object_r:xserver_exec_t,s0) ++/usr/bin/x11vnc -- gen_context(system_u:object_r:xserver_exec_t,s0) ++/usr/bin/nvidia.* -- gen_context(system_u:object_r:xserver_exec_t,s0) ++ ++/usr/libexec/Xorg\.bin -- gen_context(system_u:object_r:xserver_exec_t,s0) ++/usr/libexec/Xorg\.wrap -- gen_context(system_u:object_r:xserver_exec_t,s0) + + /usr/lib/qt-.*/etc/settings(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) + +@@ -91,19 +131,34 @@ ifndef(`distro_debian',` + /var/[xgkw]dm(/.*)? gen_context(system_u:object_r:xserver_log_t,s0) + + /var/lib/gdm(3)?(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) ++/var/lib/sddm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) + /var/lib/lxdm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) +-/var/lib/[xkw]dm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) ++/var/lib/lightdm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) ++/var/lib/lightdm-data(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) ++/var/lib/[mxkwg]dm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) + /var/lib/xkb(/.*)? gen_context(system_u:object_r:xkb_var_lib_t,s0) ++/var/lib/xorg(/.*)? gen_context(system_u:object_r:xserver_var_lib_t,s0) ++ ++/var/cache/lightdm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) ++/var/cache/[mg]dm(/.*)? gen_context(system_u:object_r:xdm_var_lib_t,s0) + +-/var/log/[kwx]dm\.log.* -- gen_context(system_u:object_r:xserver_log_t,s0) +-/var/log/lxdm\.log -- gen_context(system_u:object_r:xserver_log_t,s0) + /var/log/gdm(3)?(/.*)? gen_context(system_u:object_r:xserver_log_t,s0) +-/var/log/slim\.log -- gen_context(system_u:object_r:xserver_log_t,s0) ++/var/log/[mkwx]dm\.log.* -- gen_context(system_u:object_r:xdm_log_t,s0) ++/var/log/lightdm(/.*)? gen_context(system_u:object_r:xserver_log_t,s0) ++/var/log/lxdm\.log.* -- gen_context(system_u:object_r:xdm_log_t,s0) ++/var/log/mdm(/.*)? gen_context(system_u:object_r:xdm_log_t,s0) ++/var/log/slim\.log.* -- gen_context(system_u:object_r:xdm_log_t,s0) + /var/log/XFree86.* -- gen_context(system_u:object_r:xserver_log_t,s0) + /var/log/Xorg.* -- gen_context(system_u:object_r:xserver_log_t,s0) ++/var/log/nvidia-installer\.log.* -- gen_context(system_u:object_r:xserver_log_t,s0) ++ ++/var/spool/[mg]dm(/.*)? gen_context(system_u:object_r:xdm_spool_t,s0) + + /var/run/gdm(3)?(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/gdm(3)?\.pid -- gen_context(system_u:object_r:xdm_var_run_t,s0) ++/var/run/[kgm]dm(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) ++/var/run/gdm_socket -s gen_context(system_u:object_r:xdm_var_run_t,s0) ++/var/run/lightdm(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/xdm\.pid -- gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/lxdm\.auth -- gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/lxdm\.pid -- gen_context(system_u:object_r:xdm_var_run_t,s0) +@@ -111,7 +166,18 @@ ifndef(`distro_debian',` + /var/run/slim.* gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/xauth(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) + /var/run/xdmctl(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) ++/var/run/sddm(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) ++ ++/var/run/video.rom -- gen_context(system_u:object_r:xserver_var_run_t,s0) ++/var/run/xorg(/.*)? gen_context(system_u:object_r:xserver_var_run_t,s0) ++/var/run/systemd/multi-session-x(/.*)? gen_context(system_u:object_r:xdm_var_run_t,s0) + + ifdef(`distro_suse',` + /var/lib/pam_devperm/:0 -- gen_context(system_u:object_r:xdm_var_lib_t,s0) + ') ++ ++/var/lib/nxserver/home/\.xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/var/lib/nxserver/home/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/var/lib/pqsql/\.xauth.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++/var/lib/pqsql/\.Xauthority.* -- gen_context(system_u:object_r:xauth_home_t,s0) ++ +diff --git a/policy/modules/services/xserver.if b/policy/modules/services/xserver.if +index 6bf0ecc2d5..28048bf64c 100644 +--- a/policy/modules/services/xserver.if ++++ b/policy/modules/services/xserver.if +@@ -18,100 +18,36 @@ + # + interface(`xserver_restricted_role',` + gen_require(` +- type xserver_t, xserver_exec_t, xserver_tmp_t, xserver_tmpfs_t; +- type user_fonts_t, user_fonts_cache_t, user_fonts_config_t; +- type iceauth_t, iceauth_exec_t, iceauth_home_t; +- type xauth_t, xauth_exec_t, xauth_home_t; ++ type xauth_t, iceauth_t; ++ attribute dridomain, x_userdomain; + ') + +- role $1 types { xserver_t xauth_t iceauth_t }; +- +- # Xserver read/write client shm +- allow xserver_t $2:fd use; +- allow xserver_t $2:shm rw_shm_perms; +- +- allow xserver_t $2:process signal; +- +- allow xserver_t $2:shm rw_shm_perms; +- +- allow $2 user_fonts_t:dir list_dir_perms; +- allow $2 user_fonts_t:file read_file_perms; +- +- allow $2 user_fonts_config_t:dir list_dir_perms; +- allow $2 user_fonts_config_t:file read_file_perms; +- +- manage_dirs_pattern($2, user_fonts_cache_t, user_fonts_cache_t) +- manage_files_pattern($2, user_fonts_cache_t, user_fonts_cache_t) +- +- stream_connect_pattern($2, xserver_tmp_t, xserver_tmp_t, xserver_t) +- files_search_tmp($2) +- +- # Communicate via System V shared memory. +- allow $2 xserver_t:shm r_shm_perms; +- allow $2 xserver_tmpfs_t:file read_file_perms; +- +- # allow ps to show iceauth +- ps_process_pattern($2, iceauth_t) +- +- domtrans_pattern($2, iceauth_exec_t, iceauth_t) +- +- allow $2 iceauth_home_t:file read_file_perms; +- +- domtrans_pattern($2, xauth_exec_t, xauth_t) +- +- allow $2 xauth_t:process signal; +- +- # allow ps to show xauth +- ps_process_pattern($2, xauth_t) +- allow $2 xserver_t:process signal; +- +- allow $2 xauth_home_t:file read_file_perms; +- +- # for when /tmp/.X11-unix is created by the system +- allow $2 xdm_t:fd use; +- allow $2 xdm_t:fifo_file { getattr read write ioctl }; +- allow $2 xdm_tmp_t:dir search; +- allow $2 xdm_tmp_t:sock_file { read write }; +- dontaudit $2 xdm_t:tcp_socket { read write }; +- +- # Client read xserver shm +- allow $2 xserver_t:fd use; +- allow $2 xserver_tmpfs_t:file read_file_perms; +- +- # Read /tmp/.X0-lock +- allow $2 xserver_tmp_t:file { getattr read }; +- +- dev_rw_xserver_misc($2) +- dev_rw_power_management($2) +- dev_read_input($2) +- dev_read_misc($2) +- dev_write_misc($2) +- # open office is looking for the following +- dev_getattr_agp_dev($2) +- dev_dontaudit_rw_dri($2) +- # GNOME checks for usb and other devices: +- dev_rw_usbfs($2) +- +- miscfiles_read_fonts($2) ++ role $1 types { xauth_t iceauth_t }; ++ typeattribute $2 x_userdomain, dridomain; + +- xserver_common_x_domain_template(user, $2) +- xserver_domtrans($2) +- xserver_unconfined($2) +- xserver_xsession_entry_type($2) +- xserver_dontaudit_write_log($2) ++ xserver_common_x_domain_template(user,$2) + xserver_stream_connect_xdm($2) +- # certain apps want to read xdm.pid file +- xserver_read_xdm_pid($2) +- # gnome-session creates socket under /tmp/.ICE-unix/ +- xserver_create_xdm_tmp_sockets($2) +- # Needed for escd, remove if we get escd policy +- xserver_manage_xdm_tmp_files($2) ++ xserver_xdm_append_log($2) + +- # Client write xserver shm +- tunable_policy(`allow_write_xshm',` +- allow $2 xserver_t:shm rw_shm_perms; +- allow $2 xserver_tmpfs_t:file rw_file_perms; ++ xserver_dri_domain($2) ++') ++ ++######################################## ++## ++## Domain wants to use direct io devices ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_dri_domain',` ++ gen_require(` ++ attribute dridomain; + ') ++ ++ typeattribute $1 dridomain; + ') + + ######################################## +@@ -143,13 +79,15 @@ interface(`xserver_role',` + allow $2 xserver_tmpfs_t:file rw_file_perms; + + allow $2 iceauth_home_t:file manage_file_perms; +- allow $2 iceauth_home_t:file { relabelfrom relabelto }; ++ allow $2 iceauth_home_t:file relabel_file_perms; + + allow $2 xauth_home_t:file manage_file_perms; +- allow $2 xauth_home_t:file { relabelfrom relabelto }; ++ allow $2 xauth_home_t:file relabel_file_perms; + ++ mls_xwin_read_to_clearance($2) + manage_dirs_pattern($2, user_fonts_t, user_fonts_t) + manage_files_pattern($2, user_fonts_t, user_fonts_t) ++ allow $2 user_fonts_t:lnk_file read_lnk_file_perms; + relabel_dirs_pattern($2, user_fonts_t, user_fonts_t) + relabel_files_pattern($2, user_fonts_t, user_fonts_t) + +@@ -162,7 +100,6 @@ interface(`xserver_role',` + manage_files_pattern($2, user_fonts_config_t, user_fonts_config_t) + relabel_dirs_pattern($2, user_fonts_config_t, user_fonts_config_t) + relabel_files_pattern($2, user_fonts_config_t, user_fonts_config_t) +- + ') + + ####################################### +@@ -197,7 +134,7 @@ interface(`xserver_ro_session',` + allow $1 xserver_t:process signal; + + # Read /tmp/.X0-lock +- allow $1 xserver_tmp_t:file { getattr read }; ++ allow $1 xserver_tmp_t:file read_file_perms; + + # Client read xserver shm + allow $1 xserver_t:fd use; +@@ -227,7 +164,7 @@ interface(`xserver_rw_session',` + type xserver_t, xserver_tmpfs_t; + ') + +- xserver_ro_session($1,$2) ++ xserver_ro_session($1, $2) + allow $1 xserver_t:shm rw_shm_perms; + allow $1 xserver_tmpfs_t:file rw_file_perms; + ') +@@ -255,7 +192,7 @@ interface(`xserver_non_drawing_client',` + + allow $1 self:x_gc { create setattr }; + +- allow $1 xdm_var_run_t:dir search; ++ allow $1 xdm_var_run_t:dir search_dir_perms; + allow $1 xserver_t:unix_stream_socket connectto; + + allow $1 xextension_t:x_extension { query use }; +@@ -282,7 +219,7 @@ interface(`xserver_non_drawing_client',` + interface(`xserver_user_client',` + refpolicywarn(`$0() has been deprecated, please use xserver_user_x_domain_template instead.') + gen_require(` +- type xdm_t, xdm_tmp_t; ++ type xdm_t; + type xauth_home_t, iceauth_home_t, xserver_t, xserver_tmpfs_t; + ') + +@@ -291,14 +228,14 @@ interface(`xserver_user_client',` + allow $1 self:unix_stream_socket { connectto create_stream_socket_perms }; + + # Read .Xauthority file +- allow $1 xauth_home_t:file { getattr read }; +- allow $1 iceauth_home_t:file { getattr read }; ++ allow $1 xauth_home_t:file read_file_perms; ++ allow $1 iceauth_home_t:file read_file_perms; + + # for when /tmp/.X11-unix is created by the system + allow $1 xdm_t:fd use; +- allow $1 xdm_t:fifo_file { getattr read write ioctl }; +- allow $1 xdm_tmp_t:dir search; +- allow $1 xdm_tmp_t:sock_file { read write }; ++ allow $1 xdm_t:fifo_file rw_inherited_fifo_file_perms; ++ userdom_search_user_tmp_dirs($1) ++ userdom_rw_user_tmp_sock_files($1) + dontaudit $1 xdm_t:tcp_socket { read write }; + + # Allow connections to X server. +@@ -316,7 +253,7 @@ interface(`xserver_user_client',` + xserver_read_xdm_tmp_files($1) + + # Client write xserver shm +- tunable_policy(`allow_write_xshm',` ++ tunable_policy(`xserver_clients_write_xshm',` + allow $1 xserver_t:shm rw_shm_perms; + allow $1 xserver_tmpfs_t:file rw_file_perms; + ') +@@ -342,19 +279,23 @@ interface(`xserver_user_client',` + # + template(`xserver_common_x_domain_template',` + gen_require(` +- type root_xdrawable_t; ++ type root_xdrawable_t, xdm_t, xserver_t; + type xproperty_t, $1_xproperty_t; + type xevent_t, client_xevent_t; + type input_xevent_t, $1_input_xevent_t; + +- attribute x_domain; ++ attribute x_domain, input_xevent_type; + attribute xdrawable_type, xcolormap_type; +- attribute input_xevent_type; + + class x_drawable all_x_drawable_perms; + class x_property all_x_property_perms; + class x_event all_x_event_perms; + class x_synthetic_event all_x_synthetic_event_perms; ++ class x_client destroy; ++ class x_server manage; ++ class x_screen { saver_setattr saver_hide saver_show show_cursor hide_cursor }; ++ class x_pointer { get_property set_property manage }; ++ class x_keyboard { read manage freeze }; + ') + + ############################## +@@ -383,9 +324,18 @@ template(`xserver_common_x_domain_template',` + allow $2 $1_input_xevent_t:{ x_event x_synthetic_event } receive; + # can receive default events + allow $2 client_xevent_t:{ x_event x_synthetic_event } receive; +- allow $2 xevent_t:{ x_event x_synthetic_event } receive; ++ allow $2 xevent_t:{ x_event x_synthetic_event } { send receive }; + # dont audit send failures + dontaudit $2 input_xevent_type:x_event send; ++ ++ allow $2 xdm_t:x_drawable { hide read add_child manage }; ++ allow $2 xdm_t:x_client destroy; ++ ++ allow $2 root_xdrawable_t:x_drawable write; ++ allow $2 xserver_t:x_server manage; ++ allow $2 xserver_t:x_screen { show_cursor hide_cursor saver_setattr saver_hide saver_show }; ++ allow $2 xserver_t:x_pointer { get_property set_property manage }; ++ allow $2 xserver_t:x_keyboard { read manage freeze }; + ') + + ####################################### +@@ -444,8 +394,9 @@ template(`xserver_object_types_template',` + # + template(`xserver_user_x_domain_template',` + gen_require(` +- type xdm_t, xdm_tmp_t; +- type xauth_home_t, iceauth_home_t, xserver_t, xserver_tmpfs_t; ++ type xdm_t, xserver_tmpfs_t; ++ type xdm_home_t; ++ type xauth_home_t, iceauth_home_t, xserver_t; + ') + + allow $2 self:shm create_shm_perms; +@@ -456,11 +407,13 @@ template(`xserver_user_x_domain_template',` + allow $2 xauth_home_t:file read_file_perms; + allow $2 iceauth_home_t:file read_file_perms; + ++ xserver_filetrans_home_content($2) ++ + # for when /tmp/.X11-unix is created by the system + allow $2 xdm_t:fd use; +- allow $2 xdm_t:fifo_file { getattr read write ioctl }; +- allow $2 xdm_tmp_t:dir search_dir_perms; +- allow $2 xdm_tmp_t:sock_file { read write }; ++ allow $2 xdm_t:fifo_file rw_inherited_fifo_file_perms; ++ userdom_search_user_tmp_dirs($2) ++ userdom_rw_user_tmp_sock_files($2) + dontaudit $2 xdm_t:tcp_socket { read write }; + + # Allow connections to X server. +@@ -472,20 +425,26 @@ template(`xserver_user_x_domain_template',` + # for .xsession-errors + userdom_dontaudit_write_user_home_content_files($2) + +- xserver_ro_session($2,$3) ++ xserver_ro_session($2, $3) + xserver_use_user_fonts($2) + +- xserver_read_xdm_tmp_files($2) ++ userdom_read_user_tmp_files($2) ++ xserver_read_xdm_pid($2) ++ xserver_xdm_append_log($2) + + # X object manager + xserver_object_types_template($1) +- xserver_common_x_domain_template($1,$2) ++ xserver_common_x_domain_template($1, $2) + + # Client write xserver shm +- tunable_policy(`allow_write_xshm',` ++ tunable_policy(`xserver_clients_write_xshm',` + allow $2 xserver_t:shm rw_shm_perms; + allow $2 xserver_tmpfs_t:file rw_file_perms; + ') ++ ++ tunable_policy(`selinuxuser_direct_dri_enabled',` ++ dev_rw_dri($2) ++ ') + ') + + ######################################## +@@ -517,6 +476,7 @@ interface(`xserver_use_user_fonts',` + # Read per user fonts + allow $1 user_fonts_t:dir list_dir_perms; + allow $1 user_fonts_t:file read_file_perms; ++ allow $1 user_fonts_t:lnk_file read_lnk_file_perms; + + # Manipulate the global font cache + manage_dirs_pattern($1, user_fonts_cache_t, user_fonts_cache_t) +@@ -547,6 +507,42 @@ interface(`xserver_domtrans_xauth',` + domtrans_pattern($1, xauth_exec_t, xauth_t) + ') + ++###################################### ++## ++## Allow exec of Xauthority program.. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`xserver_exec_xauth',` ++ gen_require(` ++ type xauth_t, xauth_exec_t; ++ ') ++ ++ can_exec($1, xauth_exec_t) ++') ++ ++######################################## ++## ++## Dontaudit exec of Xauthority program. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_exec_xauth',` ++ gen_require(` ++ type xauth_exec_t; ++ ') ++ ++ dontaudit $1 xauth_exec_t:file execute; ++') ++ + ######################################## + ## + ## Create a Xauthority file in the user home directory. +@@ -565,6 +561,24 @@ interface(`xserver_user_home_dir_filetrans_user_xauth',` + userdom_user_home_dir_filetrans($1, xauth_home_t, file) + ') + ++######################################## ++## ++## Create a Xauthority file in the admin home directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_admin_home_dir_filetrans_xauth',` ++ gen_require(` ++ type xauth_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file) ++') ++ + ######################################## + ## + ## Read all users fonts, user font configurations, +@@ -598,6 +612,25 @@ interface(`xserver_read_user_xauth',` + + allow $1 xauth_home_t:file read_file_perms; + userdom_search_user_home_dirs($1) ++ xserver_read_xdm_pid($1) ++') ++ ++######################################## ++## ++## Manage all users .Xauthority. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_manage_user_xauth',` ++ gen_require(` ++ type xauth_home_t; ++ ') ++ ++ allow $1 xauth_home_t:file manage_file_perms; + ') + + ######################################## +@@ -615,7 +648,7 @@ interface(`xserver_setattr_console_pipes',` + type xconsole_device_t; + ') + +- allow $1 xconsole_device_t:fifo_file setattr; ++ allow $1 xconsole_device_t:fifo_file setattr_fifo_file_perms; + ') + + ######################################## +@@ -636,6 +669,25 @@ interface(`xserver_rw_console',` + allow $1 xconsole_device_t:fifo_file rw_fifo_file_perms; + ') + ++######################################## ++## ++## Read XDM state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_state_xdm',` ++ gen_require(` ++ type xdm_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, xdm_t) ++') ++ + ######################################## + ## + ## Use file descriptors for xdm. +@@ -651,7 +703,7 @@ interface(`xserver_use_xdm_fds',` + type xdm_t; + ') + +- allow $1 xdm_t:fd use; ++ allow $1 xdm_t:fd use; + ') + + ######################################## +@@ -670,7 +722,7 @@ interface(`xserver_dontaudit_use_xdm_fds',` + type xdm_t; + ') + +- dontaudit $1 xdm_t:fd use; ++ dontaudit $1 xdm_t:fd use; + ') + + ######################################## +@@ -688,7 +740,7 @@ interface(`xserver_rw_xdm_pipes',` + type xdm_t; + ') + +- allow $1 xdm_t:fifo_file { getattr read write }; ++ allow $1 xdm_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## +@@ -703,12 +755,11 @@ interface(`xserver_rw_xdm_pipes',` + ## + # + interface(`xserver_dontaudit_rw_xdm_pipes',` +- + gen_require(` + type xdm_t; + ') + +- dontaudit $1 xdm_t:fifo_file rw_fifo_file_perms; ++ dontaudit $1 xdm_t:fifo_file rw_fifo_file_perms; + ') + + ######################################## +@@ -765,16 +816,19 @@ interface(`xserver_manage_xdm_spool_files',` + # + interface(`xserver_stream_connect_xdm',` + gen_require(` +- type xdm_t, xdm_tmp_t; ++ type xdm_t, xdm_var_run_t; + ') + + files_search_tmp($1) +- stream_connect_pattern($1, xdm_tmp_t, xdm_tmp_t, xdm_t) ++ files_search_pids($1) ++ stream_connect_pattern($1, { xdm_var_run_t }, { xdm_var_run_t }, xdm_t) ++ userdom_stream_connect($1) + ') + + ######################################## + ## +-## Read xdm-writable configuration files. ++## Allow domain to append XDM unix domain ++## stream socket. + ## + ## + ## +@@ -782,18 +836,18 @@ interface(`xserver_stream_connect_xdm',` + ## + ## + # +-interface(`xserver_read_xdm_rw_config',` ++ ++interface(`xserver_append_xdm_stream_socket',` + gen_require(` +- type xdm_rw_etc_t; ++ type xdm_t; + ') + +- files_search_etc($1) +- allow $1 xdm_rw_etc_t:file read_file_perms; ++ allow $1 xdm_t:unix_stream_socket append; + ') + + ######################################## + ## +-## Set the attributes of XDM temporary directories. ++## Read XDM files in user home directories. + ## + ## + ## +@@ -801,18 +855,18 @@ interface(`xserver_read_xdm_rw_config',` + ## + ## + # +-interface(`xserver_setattr_xdm_tmp_dirs',` ++interface(`xserver_read_xdm_home_files',` + gen_require(` +- type xdm_tmp_t; ++ type xdm_home_t; + ') + +- allow $1 xdm_tmp_t:dir setattr; ++ userdom_search_user_home_dirs($1) ++ allow $1 xdm_home_t:file read_file_perms; + ') + + ######################################## + ## +-## Create a named socket in a XDM +-## temporary directory. ++## Read xserver configuration files. + ## + ## + ## +@@ -820,19 +874,19 @@ interface(`xserver_setattr_xdm_tmp_dirs',` + ## + ## + # +-interface(`xserver_create_xdm_tmp_sockets',` ++interface(`xserver_read_config',` + gen_require(` +- type xdm_tmp_t; ++ type xserver_etc_t; + ') + +- files_search_tmp($1) +- allow $1 xdm_tmp_t:dir list_dir_perms; +- create_sock_files_pattern($1, xdm_tmp_t, xdm_tmp_t) ++ files_search_etc($1) ++ read_files_pattern($1, xserver_etc_t, xserver_etc_t) ++ read_lnk_files_pattern($1, xserver_etc_t, xserver_etc_t) + ') + + ######################################## + ## +-## Read XDM pid files. ++## Manage xserver configuration files. + ## + ## + ## +@@ -840,18 +894,19 @@ interface(`xserver_create_xdm_tmp_sockets',` + ## + ## + # +-interface(`xserver_read_xdm_pid',` ++interface(`xserver_manage_config',` + gen_require(` +- type xdm_var_run_t; ++ type xserver_etc_t; + ') + +- files_search_pids($1) +- allow $1 xdm_var_run_t:file read_file_perms; ++ files_search_etc($1) ++ manage_files_pattern($1, xserver_etc_t, xserver_etc_t) ++ manage_lnk_files_pattern($1, xserver_etc_t, xserver_etc_t) + ') + + ######################################## + ## +-## Read XDM var lib files. ++## Read xdm-writable configuration files. + ## + ## + ## +@@ -859,110 +914,79 @@ interface(`xserver_read_xdm_pid',` + ## + ## + # +-interface(`xserver_read_xdm_lib_files',` ++interface(`xserver_read_xdm_rw_config',` + gen_require(` +- type xdm_var_lib_t; ++ type xdm_rw_etc_t; + ') + +- allow $1 xdm_var_lib_t:file read_file_perms; ++ files_search_etc($1) ++ allow $1 xdm_rw_etc_t:file read_file_perms; + ') + + ######################################## + ## +-## Make an X session script an entrypoint for the specified domain. ++## Search XDM temporary directories. + ## + ## + ## +-## The domain for which the shell is an entrypoint. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_xsession_entry_type',` +- gen_require(` +- type xsession_exec_t; +- ') +- +- domain_entry_file($1, xsession_exec_t) ++interface(`xserver_search_xdm_tmp_dirs',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_search_user_tmp_dirs instead.') ++ userdom_search_user_tmp_dirs($1) + ') + + ######################################## + ## +-## Execute an X session in the target domain. This +-## is an explicit transition, requiring the +-## caller to use setexeccon(). ++## Set the attributes of XDM temporary directories. + ## +-## +-##

      +-## Execute an Xsession in the target domain. This +-## is an explicit transition, requiring the +-## caller to use setexeccon(). +-##

      +-##

      +-## No interprocess communication (signals, pipes, +-## etc.) is provided by this interface since +-## the domains are not owned by this module. +-##

      +-##
      + ## + ## +-## Domain allowed to transition. +-## +-## +-## +-## +-## The type of the shell process. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_xsession_spec_domtrans',` +- gen_require(` +- type xsession_exec_t; +- ') +- +- domain_trans($1, xsession_exec_t, $2) ++interface(`xserver_setattr_xdm_tmp_dirs',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_dontaudit_setattr_user_tmp instead.') ++ userdom_dontaudit_setattr_user_tmp($1) + ') + + ######################################## + ## +-## Get the attributes of X server logs. ++## Dont audit attempts to set the attributes of XDM temporary directories. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`xserver_getattr_log',` +- gen_require(` +- type xserver_log_t; +- ') +- +- logging_search_logs($1) +- allow $1 xserver_log_t:file getattr; ++interface(`xserver_dontaudit_xdm_tmp_dirs',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_dontaudit_setattr_user_tmp instead.') ++ userdom_dontaudit_setattr_user_tmp($1) + ') + + ######################################## + ## +-## Do not audit attempts to write the X server +-## log files. ++## Create a named socket in a XDM ++## temporary directory. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_dontaudit_write_log',` +- gen_require(` +- type xserver_log_t; +- ') +- +- dontaudit $1 xserver_log_t:file { append write }; ++interface(`xserver_create_xdm_tmp_sockets',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_create_user_tmp_sockets instead.') ++ userdom_create_user_tmp_sockets($1) + ') + + ######################################## + ## +-## Delete X server log files. ++## Read XDM pid files. + ## + ## + ## +@@ -970,20 +994,18 @@ interface(`xserver_dontaudit_write_log',` + ## + ## + # +-interface(`xserver_delete_log',` ++interface(`xserver_read_xdm_pid',` + gen_require(` +- type xserver_log_t; ++ type xdm_var_run_t; + ') + +- logging_search_logs($1) +- allow $1 xserver_log_t:dir list_dir_perms; +- delete_files_pattern($1, xserver_log_t, xserver_log_t) +- delete_fifo_files_pattern($1, xserver_log_t, xserver_log_t) ++ files_search_pids($1) ++ read_files_pattern($1, xdm_var_run_t, xdm_var_run_t) + ') + + ######################################## + ## +-## Read X keyboard extension libraries. ++## Mmap XDM pid files. + ## + ## + ## +@@ -991,39 +1013,544 @@ interface(`xserver_delete_log',` + ## + ## + # +-interface(`xserver_read_xkb_libs',` ++interface(`xserver_map_xdm_pid',` + gen_require(` +- type xkb_var_lib_t; ++ type xdm_var_run_t; + ') + +- files_search_var_lib($1) +- allow $1 xkb_var_lib_t:dir list_dir_perms; +- read_files_pattern($1, xkb_var_lib_t, xkb_var_lib_t) +- read_lnk_files_pattern($1, xkb_var_lib_t, xkb_var_lib_t) ++ allow $1 xdm_var_run_t:file map; + ') + +-######################################## ++###################################### + ## +-## Read xdm temporary files. ++## Dontaudit Read XDM pid files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain to not audit. ++## + ## + # +-interface(`xserver_read_xdm_tmp_files',` +- gen_require(` +- type xdm_tmp_t; +- ') ++interface(`xserver_dontaudit_read_xdm_pid',` ++ gen_require(` ++ type xdm_var_run_t; ++ ') + +- files_search_tmp($1) +- read_files_pattern($1, xdm_tmp_t, xdm_tmp_t) ++ dontaudit $1 xdm_var_run_t:dir search_dir_perms; ++ dontaudit $1 xdm_var_run_t:file read_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to read xdm temporary files. ++## Read XDM var lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_xdm_lib_files',` ++ gen_require(` ++ type xdm_var_lib_t; ++ ') ++ ++ read_files_pattern($1, xdm_var_lib_t, xdm_var_lib_t) ++ read_lnk_files_pattern($1, xdm_var_lib_t, xdm_var_lib_t) ++') ++ ++######################################## ++## ++## Read inherited XDM var lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_inherited_xdm_lib_files',` ++ gen_require(` ++ type xdm_var_lib_t; ++ ') ++ ++ allow $1 xdm_var_lib_t:file { read_inherited_file_perms map }; ++') ++ ++######################################## ++## ++## Make an X session script an entrypoint for the specified domain. ++## ++## ++## ++## The domain for which the shell is an entrypoint. ++## ++## ++# ++interface(`xserver_xsession_entry_type',` ++ gen_require(` ++ type xsession_exec_t; ++ ') ++ ++ domain_entry_file($1, xsession_exec_t) ++') ++ ++######################################## ++## ++## Execute an X session in the target domain. This ++## is an explicit transition, requiring the ++## caller to use setexeccon(). ++## ++## ++##

      ++## Execute an Xsession in the target domain. This ++## is an explicit transition, requiring the ++## caller to use setexeccon(). ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the shell process. ++## ++## ++# ++interface(`xserver_xsession_spec_domtrans',` ++ gen_require(` ++ type xsession_exec_t; ++ ') ++ ++ domain_trans($1, xsession_exec_t, $2) ++') ++ ++######################################## ++## ++## Get the attributes of X server logs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_getattr_log',` ++ gen_require(` ++ type xserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ allow $1 xserver_log_t:file getattr_file_perms; ++') ++ ++####################################### ++## ++## Allow domain to read X server logs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_log',` ++ gen_require(` ++ type xserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ allow $1 xserver_log_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to write the X server ++## log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_write_log',` ++ gen_require(` ++ type xserver_log_t; ++ ') ++ ++ dontaudit $1 xserver_log_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Delete X server log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_delete_log',` ++ gen_require(` ++ type xserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ allow $1 xserver_log_t:dir list_dir_perms; ++ delete_files_pattern($1, xserver_log_t, xserver_log_t) ++ delete_fifo_files_pattern($1, xserver_log_t, xserver_log_t) ++') ++ ++######################################## ++## ++## Read X keyboard extension libraries. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_xkb_libs',` ++ gen_require(` ++ type xkb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 xkb_var_lib_t:dir list_dir_perms; ++ read_files_pattern($1, xkb_var_lib_t, xkb_var_lib_t) ++ read_lnk_files_pattern($1, xkb_var_lib_t, xkb_var_lib_t) ++') ++ ++######################################## ++## ++## Manage X keyboard extension libraries. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_manage_xkb_libs',` ++ gen_require(` ++ type xkb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 xkb_var_lib_t:dir list_dir_perms; ++ manage_files_pattern($1, xkb_var_lib_t, xkb_var_lib_t) ++') ++ ++######################################## ++## ++## dontaudit access checks X keyboard extension libraries. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_dontaudit_xkb_libs_access',` ++ gen_require(` ++ type xkb_var_lib_t; ++ ') ++ ++ dontaudit $1 xkb_var_lib_t:dir audit_access; ++ dontaudit $1 xkb_var_lib_t:file audit_access; ++') ++ ++######################################## ++## ++## Read xdm config files. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_read_xdm_etc_files',` ++ gen_require(` ++ type xdm_etc_t; ++ ') ++ ++ files_search_etc($1) ++ read_files_pattern($1, xdm_etc_t, xdm_etc_t) ++ read_lnk_files_pattern($1, xdm_etc_t, xdm_etc_t) ++') ++ ++######################################## ++## ++## Manage xdm config files. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_manage_xdm_etc_files',` ++ gen_require(` ++ type xdm_etc_t; ++ ') ++ ++ files_search_etc($1) ++ manage_files_pattern($1, xdm_etc_t, xdm_etc_t) ++') ++ ++######################################## ++## ++## Read xdm temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_xdm_tmp_files',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_read_user_tmpfs_files instead.') ++ userdom_read_user_tmpfs_files($1) ++') ++ ++######################################## ++## ++## Do not audit attempts to read xdm temporary files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_read_xdm_tmp_files',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_dontaudit_read_user_tmp_files instead.') ++ userdom_dontaudit_read_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Read write xdm temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_rw_xdm_tmp_files',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_rw_user_tmpfs_files instead.') ++ userdom_rw_user_tmpfs_files($1) ++') ++ ++######################################## ++## ++## Create, read, write, and delete xdm temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_manage_xdm_tmp_files',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_manage_user_tmp_files instead.') ++ userdom_manage_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Create, read, write, and delete xdm temporary dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_relabel_xdm_tmp_dirs',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_relabel_user_tmp_dirs instead.') ++ userdom_relabel_user_tmp_dirs($1) ++') ++ ++######################################## ++## ++## Create, read, write, and delete xdm temporary dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_manage_xdm_tmp_dirs',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_manage_user_tmp_dirs instead.') ++ userdom_manage_user_tmp_dirs($1) ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes of ++## xdm temporary named sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_getattr_xdm_tmp_sockets',` ++ refpolicywarn(`$0() has been deprecated, please use usedom_dontaudit_user_getattr_tmp_sockets instead.') ++ usedom_dontaudit_user_getattr_tmp_sockets($1) ++') ++ ++######################################## ++## ++## Execute the X server in the X server domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`xserver_domtrans',` ++ gen_require(` ++ type xserver_t, xserver_exec_t; ++ ') ++ ++ allow $1 xserver_t:process siginh; ++ domtrans_pattern($1, xserver_exec_t, xserver_t) ++ ++ allow xserver_t $1:process getpgid; ++') ++ ++######################################## ++## ++## Signal X servers ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_signal',` ++ gen_require(` ++ type xserver_t; ++ ') ++ ++ allow $1 xserver_t:process signal; ++') ++ ++######################################## ++## ++## Send a null signal to xdm processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_xdm_signull',` ++ gen_require(` ++ type xdm_t; ++ ') ++ ++ allow $1 xdm_t:process signull; ++') ++ ++######################################## ++## ++## Kill X servers ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_kill',` ++ gen_require(` ++ type xserver_t; ++ ') ++ ++ allow $1 xserver_t:process sigkill; ++') ++ ++######################################## ++## ++## Read and write X server Sys V Shared ++## memory segments. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_rw_shm',` ++ gen_require(` ++ type xserver_t; ++ ') ++ ++ allow $1 xserver_t:shm rw_shm_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write to ++## X server sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_rw_tcp_sockets',` ++ gen_require(` ++ type xserver_t; ++ ') ++ ++ dontaudit $1 xserver_t:tcp_socket { read write }; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write X server ++## unix domain stream sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_rw_stream_sockets',` ++ gen_require(` ++ type xserver_t; ++ ') ++ ++ dontaudit $1 xserver_t:unix_stream_socket { read write }; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write xdm ++## unix domain stream sockets. + ## + ## + ## +@@ -1031,18 +1558,245 @@ interface(`xserver_read_xdm_tmp_files',` + ## + ## + # +-interface(`xserver_dontaudit_read_xdm_tmp_files',` ++interface(`xserver_dontaudit_xdm_rw_stream_sockets',` ++ gen_require(` ++ type xdm_t; ++ ') ++ ++ dontaudit $1 xdm_t:unix_stream_socket { append getattr ioctl read write }; ++') ++ ++######################################## ++## ++## Connect to the X server over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_stream_connect',` ++ gen_require(` ++ type xserver_t, xserver_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ stream_connect_pattern($1, xserver_tmp_t, xserver_tmp_t, xserver_t) ++ allow xserver_t $1:shm rw_shm_perms; ++') ++ ++###################################### ++## ++## Dontaudit attempts to connect to xserver ++## over a unix stream socket. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_stream_connect',` ++ gen_require(` ++ type xserver_t, xserver_tmp_t; ++ ') ++ ++ stream_connect_pattern($1, xserver_tmp_t, xserver_tmp_t, xserver_t) ++') ++ ++######################################## ++## ++## Read X server temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_read_tmp_files',` ++ gen_require(` ++ type xserver_tmp_t; ++ ') ++ ++ allow $1 xserver_tmp_t:file read_file_perms; ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Interface to provide X object permissions on a given X server to ++## an X client domain. Gives the domain permission to read the ++## virtual core keyboard and virtual core pointer devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_manage_core_devices',` ++ gen_require(` ++ type xserver_t, root_xdrawable_t, xevent_t; ++ class x_device all_x_device_perms; ++ class x_pointer all_x_pointer_perms; ++ class x_keyboard all_x_keyboard_perms; ++ class x_screen all_x_screen_perms; ++ class x_drawable { manage }; ++ attribute x_domain; ++ class x_drawable all_x_drawable_perms; ++ class x_resource all_x_resource_perms; ++ class x_synthetic_event all_x_synthetic_event_perms; ++ class x_cursor all_x_cursor_perms; ++ ') ++ ++ allow $1 xserver_t:{ x_device x_pointer x_keyboard } *; ++ allow $1 xserver_t:{ x_screen } setattr; ++ ++ allow $1 x_domain:x_cursor all_x_cursor_perms; ++ allow $1 x_domain:x_drawable all_x_drawable_perms; ++ allow $1 x_domain:x_resource all_x_resource_perms; ++ allow $1 root_xdrawable_t:x_drawable all_x_drawable_perms; ++ allow $1 xevent_t:x_synthetic_event all_x_synthetic_event_perms; ++') ++ ++######################################## ++## ++## Interface to provide X object permissions on a given X server to ++## an X client domain. Gives the domain complete control over the ++## display. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_unconfined',` ++ gen_require(` ++ attribute x_domain, xserver_unconfined_type; ++ ') ++ ++ typeattribute $1 x_domain; ++ typeattribute $1 xserver_unconfined_type; ++') ++ ++######################################## ++## ++## Dontaudit append to .xsession-errors file ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_dontaudit_append_xdm_home_files',` ++ gen_require(` ++ type xdm_home_t; ++ ') ++ ++ dontaudit $1 xdm_home_t:file rw_inherited_file_perms; ++ ++ tunable_policy(`use_nfs_home_dirs',` ++ fs_dontaudit_rw_nfs_files($1) ++ ') ++ ++ tunable_policy(`use_samba_home_dirs',` ++ fs_dontaudit_rw_cifs_files($1) ++ ') ++') ++ ++######################################## ++## ++## append to .xsession-errors file ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_append_xdm_home_files',` ++ gen_require(` ++ type xdm_home_t, xserver_tmp_t; ++ ') ++ ++ allow $1 xdm_home_t:file append_file_perms; ++ allow $1 xserver_tmp_t:file append_file_perms; ++ ++ tunable_policy(`use_nfs_home_dirs',` ++ fs_append_nfs_files($1) ++ ') ++ ++ tunable_policy(`use_samba_home_dirs',` ++ fs_append_cifs_files($1) ++ ') ++') ++ ++####################################### ++## ++## Allow search the xdm_spool files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_xdm_search_spool',` ++ gen_require(` ++ type xdm_spool_t; ++ ') ++ ++ files_search_spool($1) ++ search_dirs_pattern($1, xdm_spool_t, xdm_spool_t) ++') ++ ++###################################### ++## ++## Allow read the xdm_spool files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_xdm_read_spool',` ++ gen_require(` ++ type xdm_spool_t; ++ ') ++ ++ files_search_spool($1) ++ read_files_pattern($1, xdm_spool_t, xdm_spool_t) ++') ++ ++######################################## ++## ++## Manage the xdm_spool files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_xdm_manage_spool',` + gen_require(` +- type xdm_tmp_t; ++ type xdm_spool_t; + ') + +- dontaudit $1 xdm_tmp_t:dir search_dir_perms; +- dontaudit $1 xdm_tmp_t:file read_file_perms; ++ files_search_spool($1) ++ manage_files_pattern($1, xdm_spool_t, xdm_spool_t) + ') + + ######################################## + ## +-## Read write xdm temporary files. ++## Send and receive messages from ++## xdm over dbus. + ## + ## + ## +@@ -1050,18 +1804,20 @@ interface(`xserver_dontaudit_read_xdm_tmp_files',` + ## + ## + # +-interface(`xserver_rw_xdm_tmp_files',` ++interface(`xserver_dbus_chat_xdm',` + gen_require(` +- type xdm_tmp_t; ++ type xdm_t; ++ class dbus send_msg; + ') + +- allow $1 xdm_tmp_t:dir search_dir_perms; +- allow $1 xdm_tmp_t:file rw_file_perms; ++ allow $1 xdm_t:dbus send_msg; ++ allow xdm_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Create, read, write, and delete xdm temporary files. ++## Send and receive messages from ++## xdm over dbus. + ## + ## + ## +@@ -1069,55 +1825,57 @@ interface(`xserver_rw_xdm_tmp_files',` + ## + ## + # +-interface(`xserver_manage_xdm_tmp_files',` ++interface(`xserver_dbus_chat',` + gen_require(` +- type xdm_tmp_t; ++ type xserver_t; ++ class dbus send_msg; + ') + +- manage_files_pattern($1, xdm_tmp_t, xdm_tmp_t) ++ allow $1 xserver_t:dbus send_msg; ++ allow xserver_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Do not audit attempts to get the attributes of +-## xdm temporary named sockets. ++## Read xserver files created in /var/run + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_dontaudit_getattr_xdm_tmp_sockets',` ++interface(`xserver_read_pid',` + gen_require(` +- type xdm_tmp_t; ++ type xserver_var_run_t; + ') + +- dontaudit $1 xdm_tmp_t:sock_file getattr; ++ files_search_pids($1) ++ read_files_pattern($1, xserver_var_run_t, xserver_var_run_t) + ') + + ######################################## + ## +-## Execute the X server in the X server domain. ++## Execute xserver files created in /var/run + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_domtrans',` ++interface(`xserver_exec_pid',` + gen_require(` +- type xserver_t, xserver_exec_t; ++ type xserver_var_run_t; + ') + +- allow $1 xserver_t:process siginh; +- domtrans_pattern($1, xserver_exec_t, xserver_t) ++ files_search_pids($1) ++ exec_files_pattern($1, xserver_var_run_t, xserver_var_run_t) + ') + + ######################################## + ## +-## Signal X servers ++## Write xserver files created in /var/run + ## + ## + ## +@@ -1125,17 +1883,73 @@ interface(`xserver_domtrans',` + ## + ## + # +-interface(`xserver_signal',` ++interface(`xserver_write_pid',` + gen_require(` +- type xserver_t; ++ type xserver_var_run_t; + ') + +- allow $1 xserver_t:process signal; ++ files_search_pids($1) ++ write_files_pattern($1, xserver_var_run_t, xserver_var_run_t) + ') + + ######################################## + ## +-## Kill X servers ++## Allow append the xdm ++## log files. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_xdm_append_log',` ++ gen_require(` ++ type xdm_log_t; ++ attribute xdmhomewriter; ++ ') ++ ++ typeattribute $1 xdmhomewriter; ++ allow $1 xdm_log_t:file append_inherited_file_perms; ++') ++ ++######################################## ++## ++## Allow ioctl the xdm log files. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_xdm_ioctl_log',` ++ gen_require(` ++ type xdm_log_t; ++ ') ++ ++ allow $1 xdm_log_t:file ioctl; ++') ++ ++######################################## ++## ++## Allow append the xdm ++## tmp files. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`xserver_append_xdm_tmp_files',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_append_user_tmp_files instead.') ++ userdom_append_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Read a user Iceauthority domain. + ## + ## + ## +@@ -1143,18 +1957,18 @@ interface(`xserver_signal',` + ## + ## + # +-interface(`xserver_kill',` ++interface(`xserver_read_user_iceauth',` + gen_require(` +- type xserver_t; ++ type iceauth_home_t; + ') + +- allow $1 xserver_t:process sigkill; ++ # Read .Iceauthority file ++ allow $1 iceauth_home_t:file read_file_perms; + ') + + ######################################## + ## +-## Read and write X server Sys V Shared +-## memory segments. ++## Read/write inherited user homedir fonts. + ## + ## + ## +@@ -1162,132 +1976,360 @@ interface(`xserver_kill',` + ## + ## + # +-interface(`xserver_rw_shm',` ++interface(`xserver_rw_inherited_user_fonts',` + gen_require(` +- type xserver_t; ++ type user_fonts_t, user_fonts_config_t; + ') + +- allow $1 xserver_t:shm rw_shm_perms; ++ allow $1 user_fonts_t:file rw_inherited_file_perms; ++ allow $1 user_fonts_t:file read_lnk_file_perms; ++ ++ allow $1 user_fonts_config_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to read and write to +-## X server sockets. ++## Search XDM var lib dirs. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`xserver_dontaudit_rw_tcp_sockets',` ++interface(`xserver_search_xdm_lib',` + gen_require(` +- type xserver_t; ++ type xdm_var_lib_t; + ') + +- dontaudit $1 xserver_t:tcp_socket { read write }; ++ allow $1 xdm_var_lib_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Do not audit attempts to read and write X server +-## unix domain stream sockets. ++## Make an X executable an entrypoint for the specified domain. + ## + ## + ## +-## Domain to not audit. ++## The domain for which the shell is an entrypoint. + ## + ## + # +-interface(`xserver_dontaudit_rw_stream_sockets',` ++interface(`xserver_entry_type',` ++ gen_require(` ++ type xserver_exec_t; ++ ') ++ ++ domain_entry_file($1, xserver_exec_t) ++') ++ ++######################################## ++## ++## Execute xsever in the xserver domain, and ++## allow the specified role the xserver domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed the xserver domain. ++## ++## ++## ++# ++interface(`xserver_run',` + gen_require(` + type xserver_t; + ') + +- dontaudit $1 xserver_t:unix_stream_socket { read write }; ++ xserver_domtrans($1) ++ role $2 types xserver_t; + ') + + ######################################## + ## +-## Connect to the X server over a unix domain +-## stream socket. ++## Execute xsever in the xserver domain, and ++## allow the specified role the xserver domain. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## ++## ++## The role to be allowed the xserver domain. ++## ++## ++## + # +-interface(`xserver_stream_connect',` ++interface(`xserver_run_xauth',` + gen_require(` +- type xserver_t, xserver_tmp_t; ++ type xauth_t; + ') + +- files_search_tmp($1) +- stream_connect_pattern($1, xserver_tmp_t, xserver_tmp_t, xserver_t) ++ xserver_domtrans_xauth($1) ++ role $2 types xauth_t; + ') + + ######################################## + ## +-## Read X server temporary files. ++## Read user homedir fonts. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`xserver_read_tmp_files',` ++interface(`xserver_read_home_fonts',` + gen_require(` +- type xserver_tmp_t; ++ type user_fonts_t, user_fonts_config_t; + ') + +- allow $1 xserver_tmp_t:file read_file_perms; +- files_search_tmp($1) ++ list_dirs_pattern($1, user_fonts_t, user_fonts_t) ++ read_files_pattern($1, user_fonts_t, user_fonts_t) ++ read_lnk_files_pattern($1, user_fonts_t, user_fonts_t) ++ ++ read_files_pattern($1, user_fonts_config_t, user_fonts_config_t) + ') + + ######################################## + ## +-## Interface to provide X object permissions on a given X server to +-## an X client domain. Gives the domain permission to read the +-## virtual core keyboard and virtual core pointer devices. ++## Manage user fonts dir. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`xserver_manage_core_devices',` ++interface(`xserver_manage_user_fonts_dir',` + gen_require(` +- type xserver_t; +- class x_device all_x_device_perms; +- class x_pointer all_x_pointer_perms; +- class x_keyboard all_x_keyboard_perms; ++ type user_fonts_t; + ') + +- allow $1 xserver_t:{ x_device x_pointer x_keyboard } *; ++ manage_dirs_pattern($1, user_fonts_t, user_fonts_t) ++ files_tmp_filetrans($1, user_fonts_t, dir, ".font-unix") + ') + + ######################################## + ## +-## Interface to provide X object permissions on a given X server to +-## an X client domain. Gives the domain complete control over the +-## display. ++## Manage user homedir fonts. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`xserver_unconfined',` ++interface(`xserver_manage_home_fonts',` + gen_require(` +- attribute x_domain; +- attribute xserver_unconfined_type; ++ type user_fonts_t, user_fonts_config_t, user_fonts_cache_t; + ') + +- typeattribute $1 x_domain; +- typeattribute $1 xserver_unconfined_type; ++ manage_dirs_pattern($1, user_fonts_t, user_fonts_t) ++ manage_files_pattern($1, user_fonts_t, user_fonts_t) ++ manage_lnk_files_pattern($1, user_fonts_t, user_fonts_t) ++ ++ manage_files_pattern($1, user_fonts_config_t, user_fonts_config_t) ++ ++# userdom_user_home_dir_filetrans($1, user_fonts_t, dir, ".fonts.d") ++# userdom_user_home_dir_filetrans($1, user_fonts_t, dir, ".fonts") ++# userdom_user_home_dir_filetrans($1, user_fonts_cache_t, dir, ".fontconfig") ++') ++ ++####################################### ++## ++## Transition to xserver .fontconfig named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_filetrans_fonts_cache_home_content',` ++ gen_require(` ++ type user_fonts_cache_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, user_fonts_cache_t, dir, ".fontconfig") ++') ++ ++######################################## ++## ++## Transition to xserver named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_filetrans_home_content',` ++ gen_require(` ++ type xdm_home_t, xauth_home_t, iceauth_home_t; ++ type user_home_t, user_fonts_t, user_fonts_cache_t; ++ type user_fonts_config_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".dmrc") ++ userdom_user_home_dir_filetrans($1, iceauth_home_t, file, ".ICEauthority") ++ userdom_user_home_dir_filetrans($1, iceauth_home_t, file, ".ICEauthority-c") ++ userdom_user_home_dir_filetrans($1, iceauth_home_t, file, ".ICEauthority-n") ++ userdom_user_home_dir_filetrans($1, iceauth_home_t, file, ".DCOP") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority-l") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority-c") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority-n") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".xauth") ++ userdom_user_home_dir_filetrans($1, xauth_home_t, file, ".Xauth") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:0") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:1") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:2") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:3") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:4") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:5") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:6") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:7") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:8") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:9") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-stamped") ++ userdom_user_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-stamped.old") ++ userdom_user_home_dir_filetrans($1, user_fonts_config_t, file, ".fonts.conf") ++ userdom_user_home_dir_filetrans($1, user_fonts_config_t, dir, ".fonts.d") ++ userdom_user_home_dir_filetrans($1, user_fonts_t, dir, ".fonts") ++ optional_policy(` ++ gnome_data_filetrans($1, user_fonts_t, dir, "fonts") ++ ') ++ userdom_user_home_dir_filetrans($1, user_fonts_cache_t, dir, ".fontconfig") ++ filetrans_pattern($1, user_fonts_t, user_fonts_cache_t, dir, "auto") ++ files_tmp_filetrans($1, user_fonts_t, dir, ".font-unix") ++') ++ ++######################################## ++## ++## Create xserver content in admin home ++## directory with a named file transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_filetrans_admin_home_content',` ++ gen_require(` ++ type xdm_home_t, xauth_home_t, iceauth_home_t; ++ type user_home_t, user_fonts_t, user_fonts_cache_t; ++ type user_fonts_config_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".dmrc") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:0") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:1") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:2") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:3") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:4") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:5") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:6") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:7") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:8") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-:9") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-stamped") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors-stamped.old") ++ userdom_admin_home_dir_filetrans($1, xdm_home_t, file, ".xsession-errors.old") ++ userdom_admin_home_dir_filetrans($1, iceauth_home_t, file, ".DCOP") ++ userdom_admin_home_dir_filetrans($1, iceauth_home_t, file, ".ICEauthority") ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority") ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority-l") ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file, ".Xauthority-c") ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file, ".xauth") ++ userdom_admin_home_dir_filetrans($1, xauth_home_t, file, ".Xauth") ++ userdom_admin_home_dir_filetrans($1, user_fonts_config_t, file, ".fonts.conf") ++ userdom_admin_home_dir_filetrans($1, user_fonts_config_t, dir, ".fonts.d") ++ userdom_admin_home_dir_filetrans($1, user_fonts_t, dir, ".fonts") ++ userdom_admin_home_dir_filetrans($1, user_fonts_cache_t, dir, ".fontconfig") ++ ++ optional_policy(` ++ gnome_cache_filetrans($1, xdm_home_t, dir, "xdm") ++ ') ++') ++ ++######################################## ++## ++## Create objects in a xdm temporary directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`xserver_xdm_tmp_filetrans',` ++ refpolicywarn(`$0() has been deprecated, please use userdom_user_tmp_filetrans instead.') ++ userdom_user_tmp_filetrans($1,$2, $3, $4) ++') ++ ++######################################## ++## ++## Dontaudit search ssh home directory ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`xserver_dontaudit_search_log',` ++ gen_require(` ++ type xserver_log_t; ++ ') ++ ++ dontaudit $1 xserver_log_t:dir search_dir_perms; + ') ++ ++######################################## ++## ++## Manage keys for xdm. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xserver_rw_xdm_keys',` ++ gen_require(` ++ type xdm_t; ++ ') ++ ++ allow $1 xdm_t:key { read write setattr }; ++') ++ +diff --git a/policy/modules/services/xserver.te b/policy/modules/services/xserver.te +index 8b403774f2..0d882e91c2 100644 +--- a/policy/modules/services/xserver.te ++++ b/policy/modules/services/xserver.te +@@ -26,28 +26,66 @@ gen_require(` + # + + ## +-##

      +-## Allows clients to write to the X server shared +-## memory segments. +-##

      ++##

      ++## Allows clients to write to the X server shared ++## memory segments. ++##

      ++##
      ++gen_tunable(xserver_clients_write_xshm, false) ++ ++## ++##

      ++## Allows XServer to execute writable memory ++##

      + ##
      +-gen_tunable(allow_write_xshm, false) ++gen_tunable(xserver_execmem, false) + + ## + ##

      +-## Allow xdm logins as sysadm ++## Allow the graphical login program to execute bootloader + ##

      + ##
      ++gen_tunable(xdm_exec_bootloader, false) ++ ++## ++##

      ++## Allow the graphical login program to login directly as sysadm_r:sysadm_t ++##

      ++##
      + gen_tunable(xdm_sysadm_login, false) + + ## +-##

      +-## Support X userspace object manager +-##

      ++##

      ++## Allow the graphical login program to create files in HOME dirs as xdm_home_t. ++##

      ++##
      ++gen_tunable(xdm_write_home, false) ++ ++## ++##

      ++## Allows xdm_t to bind on vnc_port_t(5910) ++##

      ++##
      ++gen_tunable(xdm_bind_vnc_tcp_port, false) ++ ++## ++##

      ++## Support X userspace object manager ++##

      + ##
      + gen_tunable(xserver_object_manager, false) + ++## ++##

      ++## Allow regular users direct dri device access ++##

      ++##
      ++gen_tunable(selinuxuser_direct_dri_enabled, false) ++ ++attribute xdmhomewriter; ++attribute x_userdomain; + attribute x_domain; ++attribute dridomain; + + # X Events + attribute xevent_type; +@@ -107,44 +145,54 @@ xserver_object_types_template(remote) + xserver_common_x_domain_template(remote, remote_t) + + type user_fonts_t; +-typealias user_fonts_t alias { staff_fonts_t sysadm_fonts_t }; ++typealias user_fonts_t alias { staff_fonts_t sysadm_fonts_t xfs_fonts_t }; + typealias user_fonts_t alias { auditadm_fonts_t secadm_fonts_t }; ++typealias user_fonts_t alias { xguest_fonts_t unconfined_fonts_t user_fonts_home_t }; ++typealias user_fonts_t alias xfs_tmp_t; + userdom_user_home_content(user_fonts_t) ++files_tmp_file(user_fonts_t) + + type user_fonts_cache_t; + typealias user_fonts_cache_t alias { staff_fonts_cache_t sysadm_fonts_cache_t }; + typealias user_fonts_cache_t alias { auditadm_fonts_cache_t secadm_fonts_cache_t }; ++typealias user_fonts_cache_t alias { xguest_fonts_cache_t unconfined_fonts_cache_t }; + userdom_user_home_content(user_fonts_cache_t) + + type user_fonts_config_t; + typealias user_fonts_config_t alias { staff_fonts_config_t sysadm_fonts_config_t }; + typealias user_fonts_config_t alias { auditadm_fonts_config_t secadm_fonts_config_t }; ++typealias user_fonts_config_t alias { fonts_config_home_t xguest_fonts_config_t unconfined_fonts_config_t }; + userdom_user_home_content(user_fonts_config_t) + + type iceauth_t; + type iceauth_exec_t; + typealias iceauth_t alias { user_iceauth_t staff_iceauth_t sysadm_iceauth_t }; ++typealias iceauth_t alias { xguest_iceauth_t }; + typealias iceauth_t alias { auditadm_iceauth_t secadm_iceauth_t }; + userdom_user_application_domain(iceauth_t, iceauth_exec_t) + + type iceauth_home_t; + typealias iceauth_home_t alias { user_iceauth_home_t staff_iceauth_home_t sysadm_iceauth_home_t }; + typealias iceauth_home_t alias { auditadm_iceauth_home_t secadm_iceauth_home_t }; ++typealias iceauth_home_t alias { xguest_iceauth_home_t }; + userdom_user_home_content(iceauth_home_t) + + type xauth_t; + type xauth_exec_t; + typealias xauth_t alias { user_xauth_t staff_xauth_t sysadm_xauth_t }; + typealias xauth_t alias { auditadm_xauth_t secadm_xauth_t }; ++typealias xauth_t alias { xguest_xauth_t unconfined_xauth_t }; + userdom_user_application_domain(xauth_t, xauth_exec_t) + + type xauth_home_t; + typealias xauth_home_t alias { user_xauth_home_t staff_xauth_home_t sysadm_xauth_home_t }; + typealias xauth_home_t alias { auditadm_xauth_home_t secadm_xauth_home_t }; ++typealias xauth_home_t alias { xguest_xauth_home_t unconfined_xauth_home_t }; + userdom_user_home_content(xauth_home_t) + + type xauth_tmp_t; + typealias xauth_tmp_t alias { user_xauth_tmp_t staff_xauth_tmp_t sysadm_xauth_tmp_t }; ++typealias xauth_tmp_t alias { xguest_xauth_tmp_t unconfined_xauth_tmp_t }; + typealias xauth_tmp_t alias { auditadm_xauth_tmp_t secadm_xauth_tmp_t }; + userdom_user_tmp_file(xauth_tmp_t) + +@@ -155,19 +203,28 @@ dev_associate(xconsole_device_t) + fs_associate_tmpfs(xconsole_device_t) + files_associate_tmp(xconsole_device_t) + +-type xdm_t; ++type xdm_unconfined_exec_t; ++application_executable_file(xdm_unconfined_exec_t) ++ ++type xdm_t alias xdm_dbusd_t; + type xdm_exec_t; + auth_login_pgm_domain(xdm_t) + init_domain(xdm_t, xdm_exec_t) +-init_daemon_domain(xdm_t, xdm_exec_t) ++init_system_domain(xdm_t, xdm_exec_t) + xserver_object_types_template(xdm) + xserver_common_x_domain_template(xdm, xdm_t) + + type xdm_lock_t; + files_lock_file(xdm_lock_t) + ++type xdm_etc_t; ++files_config_file(xdm_etc_t) ++ + type xdm_rw_etc_t; +-files_type(xdm_rw_etc_t) ++files_config_file(xdm_rw_etc_t) ++ ++type xdm_spool_t; ++files_spool_file(xdm_spool_t) + + type xdm_var_lib_t; + files_type(xdm_var_lib_t) +@@ -175,13 +232,21 @@ files_type(xdm_var_lib_t) + type xdm_var_run_t; + files_pid_file(xdm_var_run_t) + +-type xdm_tmp_t; +-files_tmp_file(xdm_tmp_t) +-typealias xdm_tmp_t alias ice_tmp_t; ++type xserver_var_lib_t; ++files_type(xserver_var_lib_t) ++ ++type xserver_var_run_t; ++files_pid_file(xserver_var_run_t) + + type xdm_tmpfs_t; + files_tmpfs_file(xdm_tmpfs_t) + ++type xdm_home_t; ++userdom_user_home_content(xdm_home_t) ++ ++type xdm_log_t; ++logging_log_file(xdm_log_t) ++ + # type for /var/lib/xkb + type xkb_var_lib_t; + files_type(xkb_var_lib_t) +@@ -194,15 +259,13 @@ typealias xserver_t alias { auditadm_xserver_t secadm_xserver_t xdm_xserver_t }; + init_system_domain(xserver_t, xserver_exec_t) + ubac_constrained(xserver_t) + +-type xserver_tmp_t; +-typealias xserver_tmp_t alias { user_xserver_tmp_t staff_xserver_tmp_t sysadm_xserver_tmp_t }; +-typealias xserver_tmp_t alias { auditadm_xserver_tmp_t secadm_xserver_tmp_t xdm_xserver_tmp_t }; +-userdom_user_tmp_file(xserver_tmp_t) ++type xserver_etc_t; ++files_config_file(xserver_etc_t) + + type xserver_tmpfs_t; +-typealias xserver_tmpfs_t alias { user_xserver_tmpfs_t staff_xserver_tmpfs_t sysadm_xserver_tmpfs_t }; +-typealias xserver_tmpfs_t alias { auditadm_xserver_tmpfs_t secadm_xserver_tmpfs_t xdm_xserver_tmpfs_t }; +-userdom_user_tmpfs_file(xserver_tmpfs_t) ++typealias xserver_tmpfs_t alias { user_xserver_tmpfs_t staff_xserver_tmpfs_t sysadm_xserver_tmpfs_t xguest_xserver_tmpfs_t unconfined_xserver_tmpfs_t xdm_xserver_tmpfs_t }; ++typealias xserver_tmpfs_t alias { auditadm_xserver_tmpfs_t secadm_xserver_tmpfs_t }; ++userdom_user_tmp_file(xserver_tmpfs_t) + + type xsession_exec_t; + corecmd_executable_file(xsession_exec_t) +@@ -226,21 +289,35 @@ optional_policy(` + # + + allow iceauth_t iceauth_home_t:file manage_file_perms; +-userdom_user_home_dir_filetrans(iceauth_t, iceauth_home_t, file) + + allow xdm_t iceauth_home_t:file read_file_perms; + ++dev_read_rand(iceauth_t) ++ + fs_search_auto_mountpoints(iceauth_t) + +-userdom_use_user_terminals(iceauth_t) ++userdom_use_inherited_user_terminals(iceauth_t) + userdom_read_user_tmp_files(iceauth_t) ++userdom_read_all_users_state(iceauth_t) ++userdom_home_manager(iceauth_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_files(iceauth_t) +-') ++xserver_filetrans_home_content(iceauth_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_files(iceauth_t) ++ifdef(`hide_broken_symptoms',` ++ dev_dontaudit_read_urand(iceauth_t) ++ dev_dontaudit_rw_dri(iceauth_t) ++ dev_dontaudit_rw_generic_dev_nodes(iceauth_t) ++ fs_dontaudit_list_inotifyfs(iceauth_t) ++ fs_dontaudit_rw_anon_inodefs_files(iceauth_t) ++ term_dontaudit_use_unallocated_ttys(iceauth_t) ++ ++ userdom_dontaudit_read_user_home_content_files(iceauth_t) ++ userdom_dontaudit_write_user_home_content_files(iceauth_t) ++ userdom_dontaudit_write_user_tmp_files(iceauth_t) ++ ++ optional_policy(` ++ mozilla_dontaudit_rw_user_home_files(iceauth_t) ++ ') + ') + + ######################################## +@@ -248,48 +325,91 @@ tunable_policy(`use_samba_home_dirs',` + # Xauth local policy + # + ++allow xauth_t self:capability { dac_read_search dac_override }; + allow xauth_t self:process signal; ++allow xauth_t self:shm create_shm_perms; + allow xauth_t self:unix_stream_socket create_stream_socket_perms; ++allow xauth_t self:unix_dgram_socket create_socket_perms; ++ ++allow xauth_t xdm_t:process sigchld; ++allow xauth_t xserver_t:unix_stream_socket connectto; ++ ++corenet_tcp_connect_xserver_port(xauth_t) + + allow xauth_t xauth_home_t:file manage_file_perms; +-userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file) ++ ++manage_dirs_pattern(xauth_t, xdm_var_run_t, xdm_var_run_t) ++manage_files_pattern(xauth_t, xdm_var_run_t, xdm_var_run_t) + + manage_dirs_pattern(xauth_t, xauth_tmp_t, xauth_tmp_t) + manage_files_pattern(xauth_t, xauth_tmp_t, xauth_tmp_t) + files_tmp_filetrans(xauth_t, xauth_tmp_t, { file dir }) + +-allow xdm_t xauth_home_t:file manage_file_perms; +-userdom_user_home_dir_filetrans(xdm_t, xauth_home_t, file) ++stream_connect_pattern(xauth_t, xserver_tmp_t, xserver_tmp_t, xserver_t) + ++kernel_read_network_state(xauth_t) ++kernel_read_system_state(xauth_t) + kernel_request_load_module(xauth_t) + ++dev_read_rand(xauth_t) ++dev_read_urand(xauth_t) ++ + domain_use_interactive_fds(xauth_t) ++domain_dontaudit_leaks(xauth_t) + + files_read_etc_files(xauth_t) ++files_read_usr_files(xauth_t) + files_search_pids(xauth_t) ++files_dontaudit_getattr_all_dirs(xauth_t) ++files_dontaudit_leaks(xauth_t) ++files_var_lib_filetrans(xauth_t, xauth_home_t, file) + +-fs_getattr_xattr_fs(xauth_t) ++fs_dontaudit_leaks(xauth_t) ++fs_getattr_all_fs(xauth_t) + fs_search_auto_mountpoints(xauth_t) + +-# cjp: why? +-term_use_ptmx(xauth_t) ++# Probably a leak ++term_dontaudit_use_ptmx(xauth_t) ++term_dontaudit_use_console(xauth_t) + + auth_use_nsswitch(xauth_t) + +-userdom_use_user_terminals(xauth_t) ++userdom_use_inherited_user_terminals(xauth_t) + userdom_read_user_tmp_files(xauth_t) ++userdom_read_all_users_state(xauth_t) ++userdom_search_user_home_dirs(xauth_t) ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file) ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".Xauthority") ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".Xauthority-l") ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".Xauthority-c") ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".Xauthority-n") ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".xauth") ++userdom_user_home_dir_filetrans(xauth_t, xauth_home_t, file, ".Xauth") + + xserver_rw_xdm_tmp_files(xauth_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_files(xauth_t) ++ifdef(`hide_broken_symptoms',` ++ fs_dontaudit_rw_anon_inodefs_files(xauth_t) ++ fs_dontaudit_list_inotifyfs(xauth_t) ++ userdom_manage_user_home_content_files(xauth_t) ++ userdom_manage_user_tmp_files(xauth_t) ++ dev_dontaudit_rw_generic_dev_nodes(xauth_t) ++ miscfiles_read_fonts(xauth_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_files(xauth_t) ++userdom_home_manager(xauth_t) ++ ++ifdef(`hide_broken_symptoms',` ++ term_dontaudit_use_unallocated_ttys(xauth_t) ++ dev_dontaudit_rw_dri(xauth_t) + ') + + optional_policy(` ++ nx_var_lib_filetrans(xauth_t, xauth_home_t, file) ++') ++ ++optional_policy(` ++ ssh_use_ptys(xauth_t) + ssh_sigchld(xauth_t) + ssh_read_pipes(xauth_t) + ssh_dontaudit_rw_tcp_sockets(xauth_t) +@@ -300,64 +420,105 @@ optional_policy(` + # XDM Local policy + # + +-allow xdm_t self:capability { setgid setuid sys_resource kill sys_tty_config mknod chown dac_override dac_read_search fowner fsetid ipc_owner sys_nice sys_rawio net_bind_service }; +-allow xdm_t self:process { setexec setpgid getsched setsched setrlimit signal_perms setkeycreate }; ++allow xdm_t self:capability { setgid setuid sys_resource kill sys_tty_config mknod chown dac_override dac_read_search fowner fsetid ipc_owner sys_nice sys_rawio net_bind_service net_admin sys_ptrace }; ++allow xdm_t self:capability2 { block_suspend }; ++dontaudit xdm_t self:capability sys_admin; ++tunable_policy(`deny_ptrace',`',` ++ allow xdm_t self:process ptrace; ++') ++ ++allow xdm_t self:process { setexec setpgid getattr getcap setcap getsched getsession setsched setrlimit signal_perms setkeycreate transition }; + allow xdm_t self:fifo_file rw_fifo_file_perms; + allow xdm_t self:shm create_shm_perms; + allow xdm_t self:sem create_sem_perms; + allow xdm_t self:unix_stream_socket { connectto create_stream_socket_perms }; +-allow xdm_t self:unix_dgram_socket create_socket_perms; ++allow xdm_t self:unix_dgram_socket { create_socket_perms sendto }; + allow xdm_t self:tcp_socket create_stream_socket_perms; + allow xdm_t self:udp_socket create_socket_perms; ++allow xdm_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow xdm_t self:netlink_selinux_socket create_socket_perms; + allow xdm_t self:socket create_socket_perms; + allow xdm_t self:appletalk_socket create_socket_perms; + allow xdm_t self:key { search link write }; ++allow xdm_t self:dbus { send_msg acquire_svc }; ++ ++allow xdm_t xauth_home_t:file manage_file_perms; ++ ++allow xdm_t xconsole_device_t:fifo_file { getattr_fifo_file_perms setattr_fifo_file_perms }; ++manage_dirs_pattern(xdm_t, xkb_var_lib_t, xkb_var_lib_t) ++manage_files_pattern(xdm_t, xkb_var_lib_t, xkb_var_lib_t) + +-allow xdm_t xconsole_device_t:fifo_file { getattr setattr }; ++manage_dirs_pattern(xdm_t, xdm_home_t, xdm_home_t) ++manage_files_pattern(xdm_t, xdm_home_t, xdm_home_t) ++xserver_filetrans_home_content(xdm_t) ++xserver_filetrans_admin_home_content(xdm_t) ++ ++#Handle mislabeled files in homedir ++userdom_delete_user_home_content_files(xdm_t) ++userdom_signull_unpriv_users(xdm_t) ++userdom_dontaudit_read_admin_home_lnk_files(xdm_t) + + # Allow gdm to run gdm-binary + can_exec(xdm_t, xdm_exec_t) ++can_exec(xdm_t, xsession_exec_t) + + allow xdm_t xdm_lock_t:file manage_file_perms; + files_lock_filetrans(xdm_t, xdm_lock_t, file) + ++read_lnk_files_pattern(xdm_t, xdm_etc_t, xdm_etc_t) ++read_files_pattern(xdm_t, xdm_etc_t, xdm_etc_t) + # wdm has its own config dir /etc/X11/wdm + # this is ugly, daemons should not create files under /etc! + manage_files_pattern(xdm_t, xdm_rw_etc_t, xdm_rw_etc_t) + +-manage_dirs_pattern(xdm_t, xdm_tmp_t, xdm_tmp_t) +-manage_files_pattern(xdm_t, xdm_tmp_t, xdm_tmp_t) +-manage_sock_files_pattern(xdm_t, xdm_tmp_t, xdm_tmp_t) +-files_tmp_filetrans(xdm_t, xdm_tmp_t, { file dir sock_file }) ++userdom_manage_all_user_tmp_content(xdm_t) ++userdom_exec_user_tmp_files(xdm_t) + + manage_dirs_pattern(xdm_t, xdm_tmpfs_t, xdm_tmpfs_t) + manage_files_pattern(xdm_t, xdm_tmpfs_t, xdm_tmpfs_t) + manage_lnk_files_pattern(xdm_t, xdm_tmpfs_t, xdm_tmpfs_t) + manage_fifo_files_pattern(xdm_t, xdm_tmpfs_t, xdm_tmpfs_t) + manage_sock_files_pattern(xdm_t, xdm_tmpfs_t, xdm_tmpfs_t) +-fs_tmpfs_filetrans(xdm_t, xdm_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++ ++manage_files_pattern(xdm_t, user_fonts_t, user_fonts_t) ++ ++files_search_spool(xdm_t) ++manage_dirs_pattern(xdm_t, xdm_spool_t, xdm_spool_t) ++manage_files_pattern(xdm_t, xdm_spool_t, xdm_spool_t) ++files_spool_filetrans(xdm_t, xdm_spool_t, { file dir }) + + manage_dirs_pattern(xdm_t, xdm_var_lib_t, xdm_var_lib_t) + manage_files_pattern(xdm_t, xdm_var_lib_t, xdm_var_lib_t) +-files_var_lib_filetrans(xdm_t, xdm_var_lib_t, file) ++exec_files_pattern(xdm_t, xdm_var_lib_t, xdm_var_lib_t) ++manage_lnk_files_pattern(xdm_t, xdm_var_lib_t, xdm_var_lib_t) ++manage_sock_files_pattern(xdm_t, xdm_var_lib_t, xdm_var_lib_t) ++files_var_lib_filetrans(xdm_t, xdm_var_lib_t, { file dir }) ++# Read machine-id ++files_read_var_lib_files(xdm_t) + + manage_dirs_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) + manage_files_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) ++exec_files_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) ++manage_lnk_files_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) + manage_fifo_files_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) +-files_pid_filetrans(xdm_t, xdm_var_run_t, { dir file fifo_file }) ++manage_sock_files_pattern(xdm_t, xdm_var_run_t, xdm_var_run_t) ++files_pid_filetrans(xdm_t, xdm_var_run_t, { dir file fifo_file sock_file }) + +-allow xdm_t xserver_t:process signal; ++allow xdm_t xserver_t:process { signal signull }; + allow xdm_t xserver_t:unix_stream_socket connectto; + + allow xdm_t xserver_tmp_t:sock_file rw_sock_file_perms; +-allow xdm_t xserver_tmp_t:dir { setattr list_dir_perms }; ++allow xdm_t xserver_tmp_t:dir { setattr_dir_perms list_dir_perms }; + + # transition to the xdm xserver + domtrans_pattern(xdm_t, xserver_exec_t, xserver_t) ++ ++ps_process_pattern(xserver_t, xdm_t) + allow xserver_t xdm_t:process signal; + allow xdm_t xserver_t:process { noatsecure siginh rlimitinh signal sigkill }; + + allow xdm_t xserver_t:shm rw_shm_perms; ++read_files_pattern(xdm_t, xserver_t, xserver_t) + + # connect to xdm xserver over stream socket + stream_connect_pattern(xdm_t, xserver_tmp_t, xserver_tmp_t, xserver_t) +@@ -366,20 +527,31 @@ stream_connect_pattern(xdm_t, xserver_tmp_t, xserver_tmp_t, xserver_t) + delete_files_pattern(xdm_t, xserver_tmp_t, xserver_tmp_t) + delete_sock_files_pattern(xdm_t, xserver_tmp_t, xserver_tmp_t) + ++manage_dirs_pattern(xdm_t, xdm_log_t, xdm_log_t) ++manage_files_pattern(xdm_t, xdm_log_t, xdm_log_t) ++manage_lnk_files_pattern(xdm_t, xdm_log_t, xdm_log_t) ++manage_fifo_files_pattern(xdm_t, xdm_log_t, xdm_log_t) ++logging_log_filetrans(xdm_t, xdm_log_t, { dir file }) ++ + manage_dirs_pattern(xdm_t, xserver_log_t, xserver_log_t) + manage_files_pattern(xdm_t, xserver_log_t, xserver_log_t) ++manage_lnk_files_pattern(xdm_t, xserver_log_t, xserver_log_t) + manage_fifo_files_pattern(xdm_t, xserver_log_t, xserver_log_t) +-logging_log_filetrans(xdm_t, xserver_log_t, file) ++files_var_filetrans(xdm_t, xserver_log_t, dir, "gdm") + + kernel_read_system_state(xdm_t) ++kernel_read_device_sysctls(xdm_t) + kernel_read_kernel_sysctls(xdm_t) + kernel_read_net_sysctls(xdm_t) + kernel_read_network_state(xdm_t) ++kernel_request_load_module(xdm_t) ++kernel_stream_connect(xdm_t) ++kernel_view_key(xdm_t) + + corecmd_exec_shell(xdm_t) + corecmd_exec_bin(xdm_t) ++corecmd_dontaudit_access_all_executables(xdm_t) + +-corenet_all_recvfrom_unlabeled(xdm_t) + corenet_all_recvfrom_netlabel(xdm_t) + corenet_tcp_sendrecv_generic_if(xdm_t) + corenet_udp_sendrecv_generic_if(xdm_t) +@@ -389,38 +561,50 @@ corenet_tcp_sendrecv_all_ports(xdm_t) + corenet_udp_sendrecv_all_ports(xdm_t) + corenet_tcp_bind_generic_node(xdm_t) + corenet_udp_bind_generic_node(xdm_t) ++corenet_udp_bind_ipp_port(xdm_t) ++corenet_udp_bind_xdmcp_port(xdm_t) + corenet_tcp_connect_all_ports(xdm_t) + corenet_sendrecv_all_client_packets(xdm_t) + # xdm tries to bind to biff_port_t + corenet_dontaudit_tcp_bind_all_ports(xdm_t) + ++dev_rwx_zero(xdm_t) + dev_read_rand(xdm_t) +-dev_read_sysfs(xdm_t) ++dev_rw_sysfs(xdm_t) + dev_getattr_framebuffer_dev(xdm_t) + dev_setattr_framebuffer_dev(xdm_t) + dev_getattr_mouse_dev(xdm_t) + dev_setattr_mouse_dev(xdm_t) + dev_rw_apm_bios(xdm_t) ++dev_rw_input_dev(xdm_t) + dev_setattr_apm_bios_dev(xdm_t) + dev_rw_dri(xdm_t) + dev_rw_agp(xdm_t) ++dev_rw_wireless(xdm_t) + dev_getattr_xserver_misc_dev(xdm_t) + dev_setattr_xserver_misc_dev(xdm_t) ++dev_rw_xserver_misc(xdm_t) + dev_getattr_misc_dev(xdm_t) + dev_setattr_misc_dev(xdm_t) + dev_dontaudit_rw_misc(xdm_t) +-dev_getattr_video_dev(xdm_t) ++dev_read_video_dev(xdm_t) ++dev_write_video_dev(xdm_t) + dev_setattr_video_dev(xdm_t) + dev_getattr_scanner_dev(xdm_t) + dev_setattr_scanner_dev(xdm_t) +-dev_getattr_sound_dev(xdm_t) +-dev_setattr_sound_dev(xdm_t) ++dev_read_sound(xdm_t) ++dev_write_sound(xdm_t) + dev_getattr_power_mgmt_dev(xdm_t) + dev_setattr_power_mgmt_dev(xdm_t) ++dev_getattr_null_dev(xdm_t) ++dev_setattr_null_dev(xdm_t) ++dev_getattr_loop_control(xdm_t) + + domain_use_interactive_fds(xdm_t) + # Do not audit denied probes of /proc. + domain_dontaudit_read_all_domains_state(xdm_t) ++domain_dontaudit_signal_all_domains(xdm_t) ++domain_dontaudit_getattr_all_entry_files(xdm_t) + + files_read_etc_files(xdm_t) + files_read_var_files(xdm_t) +@@ -431,9 +615,30 @@ files_list_mnt(xdm_t) + files_read_usr_files(xdm_t) + # Poweroff wants to create the /poweroff file when run from xdm + files_create_boot_flag(xdm_t) ++files_dontaudit_getattr_boot_dirs(xdm_t) ++files_dontaudit_write_usr_files(xdm_t) ++files_dontaudit_access_check_etc(xdm_t) ++files_dontaudit_getattr_all_dirs(xdm_t) ++files_dontaudit_getattr_all_symlinks(xdm_t) ++files_dontaudit_getattr_all_tmp_sockets(xdm_t) ++files_dontaudit_all_access_check(xdm_t) ++files_dontaudit_list_non_security(xdm_t) + + fs_getattr_all_fs(xdm_t) + fs_search_auto_mountpoints(xdm_t) ++fs_search_all(xdm_t) ++fs_rw_anon_inodefs_files(xdm_t) ++fs_mount_tmpfs(xdm_t) ++fs_mounton_fusefs(xdm_t) ++fs_list_inotifyfs(xdm_t) ++fs_dontaudit_list_noxattr_fs(xdm_t) ++fs_dontaudit_read_noxattr_fs_files(xdm_t) ++fs_manage_cgroup_dirs(xdm_t) ++fs_manage_cgroup_files(xdm_t) ++mount_read_pid_files(xdm_t) ++ ++mls_socket_write_to_clearance(xdm_t) ++mls_trusted_object(xdm_t) + + storage_dontaudit_read_fixed_disk(xdm_t) + storage_dontaudit_write_fixed_disk(xdm_t) +@@ -442,28 +647,50 @@ storage_dontaudit_raw_read_removable_device(xdm_t) + storage_dontaudit_raw_write_removable_device(xdm_t) + storage_dontaudit_setattr_removable_dev(xdm_t) + storage_dontaudit_rw_scsi_generic(xdm_t) ++storage_dontaudit_rw_fuse(xdm_t) + + term_setattr_console(xdm_t) +-term_use_unallocated_ttys(xdm_t) + term_setattr_unallocated_ttys(xdm_t) ++term_use_all_terms(xdm_t) ++term_relabel_all_ttys(xdm_t) ++term_relabel_unallocated_ttys(xdm_t) ++term_getattr_virtio_console(xdm_t) + + auth_domtrans_pam_console(xdm_t) +-auth_manage_pam_pid(xdm_t) ++#auth_manage_pam_pid(xdm_t) + auth_manage_pam_console_data(xdm_t) ++auth_signal_pam(xdm_t) + auth_rw_faillog(xdm_t) + auth_write_login_records(xdm_t) + + # Run telinit->init to shutdown. + init_telinit(xdm_t) ++init_dbus_chat(xdm_t) ++init_pid_filetrans(xdm_t, xdm_var_run_t, dir, "multi-session-x") ++init_status(xdm_t) ++ ++application_exec(xdm_t) + + libs_exec_lib_files(xdm_t) ++libs_exec_ldconfig(xdm_t) + + logging_read_generic_logs(xdm_t) + +-miscfiles_read_localization(xdm_t) ++miscfiles_search_man_pages(xdm_t) + miscfiles_read_fonts(xdm_t) +- +-sysnet_read_config(xdm_t) ++miscfiles_manage_fonts_cache(xdm_t) ++miscfiles_manage_localization(xdm_t) ++miscfiles_read_hwdata(xdm_t) ++miscfiles_map_generic_certs(xdm_t) ++miscfiles_read_certs(xdm_t) ++ ++systemd_write_inhibit_pipes(xdm_t) ++systemd_dbus_chat_localed(xdm_t) ++systemd_dbus_chat_hostnamed(xdm_t) ++systemd_start_power_services(xdm_t) ++systemd_status_power_services(xdm_t) ++systemd_hwdb_mmap_config(xdm_t) ++systemd_hwdb_read_config(xdm_t) + + userdom_dontaudit_use_unpriv_user_fds(xdm_t) + userdom_create_all_users_keys(xdm_t) +@@ -472,24 +699,167 @@ userdom_read_user_home_content_files(xdm_t) + # Search /proc for any user domain processes. + userdom_read_all_users_state(xdm_t) + userdom_signal_all_users(xdm_t) ++userdom_stream_connect(xdm_t) ++userdom_manage_user_tmp_dirs(xdm_t) ++userdom_manage_user_tmp_files(xdm_t) ++userdom_manage_user_tmp_sockets(xdm_t) ++userdom_manage_tmp_role(system_r, xdm_t) ++ ++#userdom_home_manager(xdm_t) ++tunable_policy(`xdm_write_home',` ++ userdom_user_home_dir_filetrans(xdm_t, xdm_home_t, { file lnk_file }) ++ userdom_admin_home_dir_filetrans(xdm_t, xdm_home_t, { file lnk_file }) ++',` ++ userdom_user_home_dir_filetrans_user_home_content(xdm_t, { dir file lnk_file fifo_file sock_file }) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_list_auto_mountpoints(xdm_t) ++ fs_manage_nfs_dirs(xdm_t) ++ fs_manage_nfs_files(xdm_t) ++ fs_manage_nfs_symlinks(xdm_t) ++ fs_append_nfs_files(xdm_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_manage_cifs_dirs(xdm_t) ++ fs_manage_cifs_files(xdm_t) ++ fs_manage_cifs_symlinks(xdm_t) ++ fs_append_cifs_files(xdm_t) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_manage_fusefs_dirs(xdm_t) ++ fs_manage_fusefs_files(xdm_t) ++ fs_manage_fusefs_symlinks(xdm_t) ++') ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_manage_ecryptfs_dirs(xdm_t) ++ fs_manage_ecryptfs_files(xdm_t) ++') ++ ++### filename transitions ### ++userdom_filetrans_generic_home_content(xdm_t) ++ ++optional_policy(` ++ dbus_stream_connect_session_bus(xdm_t) ++') ++ ++optional_policy(` ++ cups_stream_connect(xdm_t) ++') ++ ++optional_policy(` ++ colord_read_lib_files(xdm_t) ++') ++ ++optional_policy(` ++ gnome_config_filetrans(xdm_t, home_cert_t, dir, "certificates") ++') ++ ++optional_policy(` ++ apache_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ auth_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ geoclue_dbus_chat(xdm_t) ++') ++ ++optional_policy(` ++ gnome_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ gpg_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ irc_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ kerberos_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ mozilla_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ mta_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ pulseaudio_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ remotelogin_signull(xdm_t) ++') ++ ++optional_policy(` ++ spamassassin_filetrans_home_content(xdm_t) ++ spamassassin_filetrans_admin_home_content(xdm_t) ++') ++ ++optional_policy(` ++ ssh_filetrans_admin_home_content(xdm_t) ++ ssh_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ telepathy_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ thumb_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ tvtime_filetrans_home_content(xdm_t) ++') ++ ++optional_policy(` ++ virt_filetrans_home_content(xdm_t) ++') ++ ++### end of filename transitions ### ++ ++application_signal(xdm_t) + + xserver_rw_session(xdm_t, xdm_tmpfs_t) + xserver_unconfined(xdm_t) ++xserver_domtrans_xauth(xdm_t) ++ ++ifndef(`distro_redhat',` ++ allow xdm_t self:process { execheap execmem }; ++') ++ ++ifdef(`distro_rhel4',` ++ allow xdm_t self:process { execheap execmem }; ++') + + tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(xdm_t) +- fs_manage_nfs_files(xdm_t) +- fs_manage_nfs_symlinks(xdm_t) + fs_exec_nfs_files(xdm_t) + ') + + tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(xdm_t) +- fs_manage_cifs_files(xdm_t) +- fs_manage_cifs_symlinks(xdm_t) + fs_exec_cifs_files(xdm_t) + ') + ++optional_policy(` ++ tunable_policy(`xdm_exec_bootloader',` ++ bootloader_exec(xdm_t) ++ files_read_boot_files(xdm_t) ++ files_read_boot_symlinks(xdm_t) ++ ') ++') ++ + tunable_policy(`xdm_sysadm_login',` + userdom_xsession_spec_domtrans_all_users(xdm_t) + # FIXME: +@@ -502,12 +872,31 @@ tunable_policy(`xdm_sysadm_login',` + # allow xserver_t xdm_tmpfs_t:file rw_file_perms; + ') + ++tunable_policy(`xdm_bind_vnc_tcp_port',` ++ corenet_tcp_bind_vnc_port(xdm_t) ++') ++ ++optional_policy(` ++ accountsd_read_lib_files(xdm_t) ++ accountsd_dbus_chat(xdm_t) ++') ++ ++optional_policy(` ++ acct_dontaudit_list_data(xdm_t) ++') ++ ++optional_policy(` ++ boinc_dontaudit_getattr_lib(xdm_t) ++') ++ + optional_policy(` + alsa_domtrans(xdm_t) ++ alsa_read_rw_config(xdm_t) + ') + + optional_policy(` + consolekit_dbus_chat(xdm_t) ++ consolekit_read_log(xdm_t) + ') + + optional_policy(` +@@ -517,9 +906,34 @@ optional_policy(` + optional_policy(` + dbus_system_bus_client(xdm_t) + dbus_connect_system_bus(xdm_t) ++ ++ optional_policy(` ++ accountsd_dbus_chat(xdm_t) ++ ') ++ ++ optional_policy(` ++ bluetooth_dbus_chat(xdm_t) ++ ') ++ ++ optional_policy(` ++ cpufreqselector_dbus_chat(xdm_t) ++ ') ++ ++ optional_policy(` ++ devicekit_dbus_chat_disk(xdm_t) ++ devicekit_dbus_chat_power(xdm_t) ++ ') ++ ++ optional_policy(` ++ hal_dbus_chat(xdm_t) ++ ') ++ ++ optional_policy(` ++ gnomeclock_dbus_chat(xdm_t) ++ ') + + optional_policy(` +- accountsd_dbus_chat(xdm_t) ++ networkmanager_dbus_chat(xdm_t) + ') + ') + +@@ -529,6 +943,20 @@ optional_policy(` + gpm_setattr_gpmctl(xdm_t) + ') + ++optional_policy(` ++ gnome_stream_connect_gkeyringd(xdm_t) ++ gnome_exec_gstreamer_home_files(xdm_t) ++ gnome_exec_keyringd(xdm_t) ++ gnome_delete_gkeyringd_tmp_content(xdm_t) ++ gnome_manage_config(xdm_t) ++ gnome_manage_gconf_home_files(xdm_t) ++ gnome_read_config(xdm_t) ++ gnome_read_usr_config(xdm_t) ++ gnome_read_gconf_config(xdm_t) ++ gnome_transition_gkeyringd(xdm_t) ++ gnome_cache_filetrans(xdm_t, xdm_home_t, dir, "gdm") ++') ++ + optional_policy(` + hostname_exec(xdm_t) + ') +@@ -546,29 +974,79 @@ optional_policy(` + mta_dontaudit_getattr_spool_files(xdm_t) + ') + ++optional_policy(` ++ policykit_dbus_chat(xdm_t) ++ policykit_domtrans_auth(xdm_t) ++ policykit_read_lib(xdm_t) ++ policykit_read_reload(xdm_t) ++ policykit_signal_auth(xdm_t) ++') ++ ++optional_policy(` ++ pcscd_stream_connect(xdm_t) ++') ++ ++optional_policy(` ++ plymouthd_search_spool(xdm_t) ++ plymouthd_exec_plymouth(xdm_t) ++ plymouthd_stream_connect(xdm_t) ++ plymouthd_read_log(xdm_t) ++') ++ ++optional_policy(` ++ pulseaudio_exec(xdm_t) ++ pulseaudio_dbus_chat(xdm_t) ++ pulseaudio_stream_connect(xdm_t) ++ pulseaudio_read_state(xserver_t) ++') ++ + optional_policy(` + resmgr_stream_connect(xdm_t) + ') + ++optional_policy(` ++ rhev_stream_connect_agentd(xdm_t) ++ rhev_read_pid_files_agentd(xdm_t) ++') ++ ++# On crash gdm execs gdb to dump stack ++optional_policy(` ++ rpm_exec(xdm_t) ++ rpm_read_db(xdm_t) ++ rpm_dontaudit_manage_db(xdm_t) ++ rpm_dontaudit_dbus_chat(xdm_t) ++') ++ ++optional_policy(` ++ rtkit_scheduled(xdm_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(xdm_t) + ') + + optional_policy(` +- udev_read_db(xdm_t) ++ ssh_signull(xdm_t) + ') + + optional_policy(` +- unconfined_domain(xdm_t) +- unconfined_domtrans(xdm_t) ++ shutdown_domtrans(xdm_t) ++') + +- ifndef(`distro_redhat',` +- allow xdm_t self:process { execheap execmem }; +- ') ++optional_policy(` ++ telepathy_exec(xdm_t) ++') + +- ifdef(`distro_rhel4',` +- allow xdm_t self:process { execheap execmem }; +- ') ++optional_policy(` ++ udev_read_db(xdm_t) ++') ++ ++optional_policy(` ++ unconfined_signal(xdm_t) ++') ++ ++optional_policy(` ++ usbmuxd_stream_connect(xdm_t) + ') + + optional_policy(` +@@ -579,6 +1057,14 @@ optional_policy(` + usermanage_read_crack_db(xdm_t) + ') + ++optional_policy(` ++ vdagent_stream_connect(xdm_t) ++') ++ ++optional_policy(` ++ wm_exec(xdm_t) ++') ++ + optional_policy(` + xfs_stream_connect(xdm_t) + ') +@@ -594,7 +1080,7 @@ type_transition xserver_t xserver_t:x_colormap root_xcolormap_t; + type_transition root_xdrawable_t input_xevent_t:x_event root_input_xevent_t; + + allow xserver_t { root_xdrawable_t x_domain }:x_drawable send; +-allow xserver_t input_xevent_t:x_event send; ++allow xserver_t xevent_type:x_event send; + + # setuid/setgid for the wrapper program to change UID + # sys_rawio is for iopl access - should not be needed for frame-buffer +@@ -604,8 +1090,11 @@ allow xserver_t input_xevent_t:x_event send; + # execheap needed until the X module loader is fixed. + # NVIDIA Needs execstack + +-allow xserver_t self:capability { dac_override fowner fsetid setgid setuid ipc_owner sys_rawio sys_admin sys_nice sys_tty_config mknod net_bind_service }; ++allow xserver_t self:capability { sys_ptrace dac_read_search dac_override fowner fsetid setgid setuid ipc_owner sys_rawio sys_admin sys_nice sys_tty_config mknod net_bind_service }; ++ + dontaudit xserver_t self:capability chown; ++allow xserver_t self:capability2 compromise_kernel; ++ + allow xserver_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow xserver_t self:fd use; + allow xserver_t self:fifo_file rw_fifo_file_perms; +@@ -618,8 +1107,15 @@ allow xserver_t self:unix_dgram_socket { create_socket_perms sendto }; + allow xserver_t self:unix_stream_socket { create_stream_socket_perms connectto }; + allow xserver_t self:tcp_socket create_stream_socket_perms; + allow xserver_t self:udp_socket create_socket_perms; ++allow xserver_t self:netlink_selinux_socket create_socket_perms; + allow xserver_t self:netlink_kobject_uevent_socket create_socket_perms; + ++allow xserver_t { input_xevent_t input_xevent_type }:x_event send; ++ ++domtrans_pattern(xserver_t, xauth_exec_t, xauth_t) ++ ++allow xserver_t xauth_home_t:file read_file_perms; ++ + manage_dirs_pattern(xserver_t, xserver_tmp_t, xserver_tmp_t) + manage_files_pattern(xserver_t, xserver_tmp_t, xserver_tmp_t) + manage_sock_files_pattern(xserver_t, xserver_tmp_t, xserver_tmp_t) +@@ -627,36 +1123,48 @@ files_tmp_filetrans(xserver_t, xserver_tmp_t, { file dir sock_file }) + + filetrans_pattern(xserver_t, xserver_tmp_t, xserver_tmp_t, sock_file) + ++allow xserver_t xserver_etc_t:dir list_dir_perms; ++read_files_pattern(xserver_t, xserver_etc_t, xserver_etc_t) ++read_lnk_files_pattern(xserver_t, xserver_etc_t, xserver_etc_t) ++ + manage_dirs_pattern(xserver_t, xserver_tmpfs_t, xserver_tmpfs_t) + manage_files_pattern(xserver_t, xserver_tmpfs_t, xserver_tmpfs_t) + manage_lnk_files_pattern(xserver_t, xserver_tmpfs_t, xserver_tmpfs_t) + manage_fifo_files_pattern(xserver_t, xserver_tmpfs_t, xserver_tmpfs_t) + manage_sock_files_pattern(xserver_t, xserver_tmpfs_t, xserver_tmpfs_t) + fs_tmpfs_filetrans(xserver_t, xserver_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++allow xserver_t xserver_tmpfs_t:file map; + + manage_files_pattern(xserver_t, xkb_var_lib_t, xkb_var_lib_t) + manage_lnk_files_pattern(xserver_t, xkb_var_lib_t, xkb_var_lib_t) + files_search_var_lib(xserver_t) + +-domtrans_pattern(xserver_t, xauth_exec_t, xauth_t) +-allow xserver_t xauth_home_t:file read_file_perms; ++manage_dirs_pattern(xserver_t, xserver_var_lib_t, xserver_var_lib_t) ++manage_files_pattern(xserver_t, xserver_var_lib_t, xserver_var_lib_t) ++files_var_lib_filetrans(xserver_t, xserver_var_lib_t, dir) ++ ++manage_dirs_pattern(xserver_t, xserver_var_run_t, xserver_var_run_t) ++manage_files_pattern(xserver_t, xserver_var_run_t, xserver_var_run_t) ++manage_sock_files_pattern(xserver_t, xdm_var_run_t, xdm_var_run_t) ++files_pid_filetrans(xserver_t, xserver_var_run_t, { file dir }) + + # Create files in /var/log with the xserver_log_t type. + manage_files_pattern(xserver_t, xserver_log_t, xserver_log_t) + logging_log_filetrans(xserver_t, xserver_log_t, file) ++manage_files_pattern(xserver_t, xdm_log_t, xdm_log_t) + + kernel_read_system_state(xserver_t) + kernel_read_device_sysctls(xserver_t) +-kernel_read_modprobe_sysctls(xserver_t) ++kernel_read_usermodehelper_state(xserver_t) + # Xorg wants to check if kernel is tainted + kernel_read_kernel_sysctls(xserver_t) + kernel_write_proc_files(xserver_t) ++kernel_request_load_module(xserver_t) + + # Run helper programs in xserver_t. + corecmd_exec_bin(xserver_t) + corecmd_exec_shell(xserver_t) + +-corenet_all_recvfrom_unlabeled(xserver_t) + corenet_all_recvfrom_netlabel(xserver_t) + corenet_tcp_sendrecv_generic_if(xserver_t) + corenet_udp_sendrecv_generic_if(xserver_t) +@@ -677,23 +1185,29 @@ dev_rw_apm_bios(xserver_t) + dev_rw_agp(xserver_t) + dev_rw_framebuffer(xserver_t) + dev_manage_dri_dev(xserver_t) +-dev_filetrans_dri(xserver_t) ++dev_map_dri(xserver_t) + dev_create_generic_dirs(xserver_t) + dev_setattr_generic_dirs(xserver_t) + # raw memory access is needed if not using the frame buffer + dev_read_raw_memory(xserver_t) + dev_wx_raw_memory(xserver_t) ++dev_read_urand(xserver_t) + # for other device nodes such as the NVidia binary-only driver +-dev_rw_xserver_misc(xserver_t) ++dev_manage_xserver_misc(xserver_t) ++dev_filetrans_xserver_misc(xserver_t) ++ + # read events - the synaptics touchpad driver reads raw events + dev_rw_input_dev(xserver_t) ++dev_write_raw_memory(xserver_t) + dev_rwx_zero(xserver_t) + +-domain_dontaudit_search_all_domains_state(xserver_t) ++domain_dontaudit_read_all_domains_state(xserver_t) ++domain_signal_all_domains(xserver_t) + + files_read_etc_files(xserver_t) + files_read_etc_runtime_files(xserver_t) + files_read_usr_files(xserver_t) ++files_rw_tmpfs_files(xserver_t) + + # brought on by rhgb + files_search_mnt(xserver_t) +@@ -705,6 +1219,14 @@ fs_search_nfs(xserver_t) + fs_search_auto_mountpoints(xserver_t) + fs_search_ramfs(xserver_t) + ++mls_file_read_to_clearance(xserver_t) ++mls_file_write_all_levels(xserver_t) ++mls_file_upgrade(xserver_t) ++mls_process_write_to_clearance(xserver_t) ++mls_socket_read_to_clearance(xserver_t) ++mls_sysvipc_read_to_clearance(xserver_t) ++mls_sysvipc_write_to_clearance(xserver_t) ++mls_trusted_object(xserver_t) + mls_xwin_read_to_clearance(xserver_t) + + selinux_validate_context(xserver_t) +@@ -718,28 +1240,25 @@ init_getpgid(xserver_t) + term_setattr_unallocated_ttys(xserver_t) + term_use_unallocated_ttys(xserver_t) + +-getty_use_fds(xserver_t) +- + locallogin_use_fds(xserver_t) + + logging_send_syslog_msg(xserver_t) + logging_send_audit_msgs(xserver_t) + +-miscfiles_read_localization(xserver_t) + miscfiles_read_fonts(xserver_t) +- +-modutils_domtrans_insmod(xserver_t) ++miscfiles_read_hwdata(xserver_t) + + # read x_contexts + seutil_read_default_contexts(xserver_t) ++seutil_read_config(xserver_t) ++seutil_read_file_contexts(xserver_t) + + userdom_search_user_home_dirs(xserver_t) + userdom_use_user_ttys(xserver_t) + userdom_setattr_user_ttys(xserver_t) + userdom_read_user_tmp_files(xserver_t) + userdom_rw_user_tmpfs_files(xserver_t) +- +-xserver_use_user_fonts(xserver_t) ++userdom_map_tmp_files(xserver_t) + + ifndef(`distro_redhat',` + allow xserver_t self:process { execmem execheap execstack }; +@@ -784,24 +1303,65 @@ optional_policy(` + auth_search_pam_console_data(xserver_t) + ') + ++optional_policy(` ++ consolekit_read_state(xserver_t) ++') ++ ++optional_policy(` ++ devicekit_signal_power(xserver_t) ++') ++ ++optional_policy(` ++ getty_use_fds(xserver_t) ++') ++ ++optional_policy(` ++ modutils_domtrans_insmod(xserver_t) ++') ++ + optional_policy(` + rhgb_getpgid(xserver_t) + rhgb_signal(xserver_t) + ') + ++optional_policy(` ++ setrans_translate_context(xserver_t) ++') ++ ++optional_policy(` ++ sandbox_rw_xserver_tmpfs_files(xserver_t) ++') ++ ++optional_policy(` ++ tcpd_wrapped_domain(xserver_t, xserver_exec_t) ++') ++ ++optional_policy(` ++ mozilla_plugin_read_state(xserver_t) ++ mozilla_plugin_rw_tmp_files(xserver_t) ++ mozilla_plugin_rw_tmpfs_files(xserver_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(xserver_t) ++') ++ + optional_policy(` + udev_read_db(xserver_t) + ') + + optional_policy(` +- unconfined_domain_noaudit(xserver_t) +- unconfined_domtrans(xserver_t) ++ unconfined_domain(xserver_t) + ') + + optional_policy(` + userhelper_search_config(xserver_t) + ') + ++optional_policy(` ++ wine_rw_shm(xserver_t) ++') ++ + optional_policy(` + xfs_stream_connect(xserver_t) + ') +@@ -818,18 +1378,17 @@ allow xserver_t xdm_t:shm rw_shm_perms; + + # NB we do NOT allow xserver_t xdm_var_lib_t:dir, only access to an open + # handle of a file inside the dir!!! +-allow xserver_t xdm_var_lib_t:file { getattr read }; +-dontaudit xserver_t xdm_var_lib_t:dir search; ++allow xserver_t xdm_var_lib_t:file read_file_perms; ++dontaudit xserver_t xdm_var_lib_t:dir search_dir_perms; + +-allow xserver_t xdm_var_run_t:file read_file_perms; ++read_files_pattern(xserver_t, xdm_var_run_t, xdm_var_run_t) + + # Label pid and temporary files with derived types. +-manage_files_pattern(xserver_t, xdm_tmp_t, xdm_tmp_t) +-manage_lnk_files_pattern(xserver_t, xdm_tmp_t, xdm_tmp_t) +-manage_sock_files_pattern(xserver_t, xdm_tmp_t, xdm_tmp_t) ++userdom_manage_user_tmp_files(xserver_t) ++userdom_manage_user_tmp_sockets(xserver_t) + + # Run xkbcomp. +-allow xserver_t xkb_var_lib_t:lnk_file read; ++allow xserver_t xkb_var_lib_t:lnk_file read_lnk_file_perms; + can_exec(xserver_t, xkb_var_lib_t) + + # VNC v4 module in X server +@@ -842,26 +1401,21 @@ init_use_fds(xserver_t) + # to read ROLE_home_t - examine this in more detail + # (xauth?) + userdom_read_user_home_content_files(xserver_t) ++userdom_read_all_users_state(xserver_t) ++userdom_home_manager(xserver_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(xserver_t) +- fs_manage_nfs_files(xserver_t) +- fs_manage_nfs_symlinks(xserver_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(xserver_t) +- fs_manage_cifs_files(xserver_t) +- fs_manage_cifs_symlinks(xserver_t) +-') ++xserver_use_user_fonts(xserver_t) + + optional_policy(` + dbus_system_bus_client(xserver_t) +- hal_dbus_chat(xserver_t) ++ ++ optional_policy(` ++ hal_dbus_chat(xserver_t) ++ ') + ') + + optional_policy(` +- resmgr_stream_connect(xdm_t) ++ mono_rw_shm(xserver_t) + ') + + optional_policy(` +@@ -912,7 +1466,7 @@ allow x_domain xproperty_t:x_property { getattr create read write append destroy + allow x_domain root_xdrawable_t:x_drawable { getattr setattr list_child add_child remove_child send receive hide show }; + # operations allowed on my windows + allow x_domain self:x_drawable { create destroy getattr setattr read write show hide list_child add_child remove_child manage send receive }; +-allow x_domain self:x_drawable { blend }; ++allow x_domain self:x_drawable blend; + # operations allowed on all windows + allow x_domain x_domain:x_drawable { getattr get_property set_property remove_child }; + +@@ -966,11 +1520,31 @@ allow x_domain self:x_resource { read write }; + # can mess with the screensaver + allow x_domain xserver_t:x_screen { getattr saver_getattr }; + ++# Device rules ++allow x_domain xserver_t:x_device { read getattr use setattr setfocus grab bell }; ++allow x_domain xserver_t:x_screen getattr; ++ + ######################################## + # + # Rules for unconfined access to this module + # + ++allow xserver_unconfined_type xserver_t:x_server *; ++allow xserver_unconfined_type xdrawable_type:x_drawable *; ++allow xserver_unconfined_type xserver_t:x_screen *; ++allow xserver_unconfined_type x_domain:x_gc *; ++allow xserver_unconfined_type xcolormap_type:x_colormap *; ++allow xserver_unconfined_type xproperty_type:x_property *; ++allow xserver_unconfined_type xselection_type:x_selection *; ++allow xserver_unconfined_type x_domain:x_cursor *; ++allow xserver_unconfined_type x_domain:x_client *; ++allow xserver_unconfined_type { x_domain xserver_t }:x_device *; ++allow xserver_unconfined_type { x_domain xserver_t }:x_pointer *; ++allow xserver_unconfined_type { x_domain xserver_t }:x_keyboard *; ++allow xserver_unconfined_type xextension_type:x_extension *; ++allow xserver_unconfined_type { x_domain xserver_t }:x_resource *; ++allow xserver_unconfined_type xevent_type:{ x_event x_synthetic_event } *; ++ + tunable_policy(`! xserver_object_manager',` + # should be xserver_unconfined(x_domain), + # but typeattribute doesnt work in conditionals +@@ -992,18 +1566,153 @@ tunable_policy(`! xserver_object_manager',` + allow x_domain xevent_type:{ x_event x_synthetic_event } *; + ') + +-allow xserver_unconfined_type xserver_t:x_server *; +-allow xserver_unconfined_type xdrawable_type:x_drawable *; +-allow xserver_unconfined_type xserver_t:x_screen *; +-allow xserver_unconfined_type x_domain:x_gc *; +-allow xserver_unconfined_type xcolormap_type:x_colormap *; +-allow xserver_unconfined_type xproperty_type:x_property *; +-allow xserver_unconfined_type xselection_type:x_selection *; +-allow xserver_unconfined_type x_domain:x_cursor *; +-allow xserver_unconfined_type x_domain:x_client *; +-allow xserver_unconfined_type { x_domain xserver_t }:x_device *; +-allow xserver_unconfined_type { x_domain xserver_t }:x_pointer *; +-allow xserver_unconfined_type { x_domain xserver_t }:x_keyboard *; +-allow xserver_unconfined_type xextension_type:x_extension *; +-allow xserver_unconfined_type { x_domain xserver_t }:x_resource *; +-allow xserver_unconfined_type xevent_type:{ x_event x_synthetic_event } *; ++tunable_policy(`xserver_execmem',` ++ allow xserver_t self:process { execheap execmem execstack }; ++') ++ ++# Hack to handle the problem of using the nvidia blobs ++tunable_policy(`deny_execmem',`',` ++ allow xdm_t self:process execmem; ++') ++ ++tunable_policy(`selinuxuser_execstack',` ++ allow xdm_t self:process { execstack execmem }; ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_append_nfs_files(xdmhomewriter) ++') ++ ++optional_policy(` ++ unconfined_rw_shm(xserver_t) ++ ++ # xserver signals unconfined user on startx ++ unconfined_signal(xserver_t) ++ unconfined_getpgid(xserver_t) ++') ++ ++allow xdm_t xdm_unconfined_exec_t:dir search_dir_perms; ++can_exec(xdm_t, xdm_unconfined_exec_t) ++ ++optional_policy(` ++ type xdm_unconfined_t; ++ domain_type(xdm_unconfined_t) ++ domain_entry_file(xdm_unconfined_t, xdm_unconfined_exec_t) ++ role system_r types xdm_unconfined_t; ++ ++ domtrans_pattern(xdm_t, xdm_unconfined_exec_t, xdm_unconfined_t) ++ unconfined_domain(xdm_unconfined_t) ++') ++ ++# X Userdomain ++# Xserver read/write client shm ++allow xserver_t x_userdomain:fd use; ++allow xserver_t x_userdomain:shm rw_shm_perms; ++ ++allow xserver_t x_userdomain:process { getpgid signal }; ++ ++allow xserver_t x_userdomain:shm rw_shm_perms; ++ ++allow x_userdomain user_fonts_t:dir list_dir_perms; ++allow x_userdomain user_fonts_t:file read_file_perms; ++allow x_userdomain user_fonts_t:lnk_file read_lnk_file_perms; ++ ++allow x_userdomain user_fonts_config_t:dir list_dir_perms; ++allow x_userdomain user_fonts_config_t:file read_file_perms; ++ ++manage_dirs_pattern(x_userdomain, user_fonts_cache_t, user_fonts_cache_t) ++manage_files_pattern(x_userdomain, user_fonts_cache_t, user_fonts_cache_t) ++ ++stream_connect_pattern(x_userdomain, xserver_tmp_t, xserver_tmp_t, xserver_t) ++allow x_userdomain xserver_tmp_t:sock_file delete_sock_file_perms; ++files_search_tmp(x_userdomain) ++ ++# Communicate via System V shared memory. ++allow x_userdomain xserver_t:shm r_shm_perms; ++allow x_userdomain xserver_tmpfs_t:file read_file_perms; ++ ++# allow ps to show iceauth ++ps_process_pattern(x_userdomain, iceauth_t) ++ ++domtrans_pattern(x_userdomain, iceauth_exec_t, iceauth_t) ++ ++allow x_userdomain iceauth_home_t:file read_file_perms; ++ ++domtrans_pattern(x_userdomain, xauth_exec_t, xauth_t) ++ ++allow x_userdomain xauth_t:process signal; ++ ++# allow ps to show xauth ++ps_process_pattern(x_userdomain, xauth_t) ++allow x_userdomain xserver_t:process signal; ++ ++allow x_userdomain xauth_home_t:file read_file_perms; ++ ++# for when /tmp/.X11-unix is created by the system ++allow x_userdomain xdm_t:fd use; ++allow x_userdomain xdm_t:fifo_file rw_inherited_fifo_file_perms; ++userdom_search_user_tmp_dirs(x_userdomain) ++userdom_rw_user_tmp_sock_files(x_userdomain) ++dontaudit x_userdomain xdm_t:tcp_socket { read write }; ++ ++allow x_userdomain xdm_t:dbus send_msg; ++allow xdm_t x_userdomain:dbus send_msg; ++ ++# Client read xserver shm ++allow x_userdomain xserver_t:fd use; ++allow x_userdomain xserver_tmpfs_t:file read_file_perms; ++ ++# Read /tmp/.X0-lock ++allow x_userdomain xserver_tmp_t:file read_inherited_file_perms; ++ ++dev_rw_xserver_misc(x_userdomain) ++dev_rw_power_management(x_userdomain) ++dev_read_input(x_userdomain) ++dev_read_misc(x_userdomain) ++dev_write_misc(x_userdomain) ++# open office is looking for the following ++dev_getattr_agp_dev(x_userdomain) ++ ++# GNOME checks for usb and other devices: ++dev_rw_usbfs(x_userdomain) ++ ++miscfiles_read_fonts(x_userdomain) ++miscfiles_setattr_fonts_cache_dirs(x_userdomain) ++miscfiles_read_hwdata(x_userdomain) ++ ++#xserver_common_x_domain_template(user, x_userdomain) ++#xserver_domtrans(x_userdomain) ++#xserver_unconfined(x_userdomain) ++#xserver_xsession_entry_type(x_userdomain) ++xserver_dontaudit_write_log(x_userdomain) ++#xserver_stream_connect_xdm(x_userdomain) ++# certain apps want to read xdm.pid file ++xserver_read_xdm_pid(x_userdomain) ++# gnome-session creates socket under /tmp/.ICE-unix/ ++xserver_create_xdm_tmp_sockets(x_userdomain) ++# Needed for escd, remove if we get escd policy ++xserver_manage_xdm_tmp_files(x_userdomain) ++xserver_read_xdm_etc_files(x_userdomain) ++#xserver_xdm_append_log(x_userdomain) ++ ++term_use_virtio_console(x_userdomain) ++# Client write xserver shm ++tunable_policy(`xserver_clients_write_xshm',` ++ allow x_userdomain xserver_t:shm rw_shm_perms; ++ allow x_userdomain xserver_tmpfs_t:file rw_file_perms; ++') ++ ++optional_policy(` ++ gnome_read_gconf_config(x_userdomain) ++') ++ ++optional_policy(` ++ thumb_nnp_domtrans(x_userdomain) ++') ++ ++tunable_policy(`selinuxuser_direct_dri_enabled',` ++ dev_rw_dri(dridomain) ++',` ++ dev_dontaudit_rw_dri(dridomain) ++') ++ +diff --git a/policy/modules/system/application.if b/policy/modules/system/application.if +index 1b6619e643..be02b96183 100644 +--- a/policy/modules/system/application.if ++++ b/policy/modules/system/application.if +@@ -43,6 +43,27 @@ interface(`application_executable_file',` + corecmd_executable_file($1) + ') + ++####################################### ++## ++## Make the specified type usable for files ++## that are exectuables, such as binary programs. ++## This does not include shared libraries. ++## ++## ++## ++## Type to be used for files. ++## ++## ++# ++interface(`application_executable_ioctl',` ++ gen_require(` ++ attribute application_exec_type; ++ ') ++ ++ allow $1 application_exec_type:file ioctl; ++ ++') ++ + ######################################## + ## + ## Execute application executables in the caller domain. +@@ -76,11 +97,28 @@ interface(`application_exec_all',` + corecmd_dontaudit_exec_all_executables($1) + corecmd_exec_bin($1) + corecmd_exec_shell($1) +- corecmd_exec_chroot($1) + + application_exec($1) + ') + ++######################################## ++## ++## Dontaudit execute all executable files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`application_dontaudit_exec',` ++ gen_require(` ++ attribute application_exec_type; ++ ') ++ ++ dontaudit $1 application_exec_type:file execute; ++') ++ + ######################################## + ## + ## Create a domain for applications. +@@ -187,6 +225,24 @@ interface(`application_dontaudit_signal',` + dontaudit $1 application_domain_type:process signal; + ') + ++######################################## ++## ++## Send kill signals to all application domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`application_sigkill',` ++ gen_require(` ++ attribute application_domain_type; ++ ') ++ ++ allow $1 application_domain_type:process sigkill; ++') ++ + ######################################## + ## + ## Do not audit attempts to send kill signals +@@ -205,3 +261,21 @@ interface(`application_dontaudit_sigkill',` + + dontaudit $1 application_domain_type:process sigkill; + ') ++ ++####################################### ++## ++## Getattr all application sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`application_getattr_socket',` ++ gen_require(` ++ attribute application_domain_type; ++ ') ++ ++ allow $1 application_domain_type:socket_class_set getattr; ++') +diff --git a/policy/modules/system/application.te b/policy/modules/system/application.te +index c6fdab72d9..82aea98a14 100644 +--- a/policy/modules/system/application.te ++++ b/policy/modules/system/application.te +@@ -6,15 +6,41 @@ attribute application_domain_type; + # Executables to be run by user + attribute application_exec_type; + ++domain_use_interactive_fds(application_domain_type) ++ ++userdom_inherit_append_user_home_content_files(application_domain_type) ++userdom_inherit_append_admin_home_files(application_domain_type) ++userdom_inherit_append_user_tmp_files(application_domain_type) ++userdom_rw_inherited_user_tmp_files(application_domain_type) ++userdom_mmap_rw_inherited_user_tmp_files(application_domain_type) ++userdom_rw_inherited_user_pipes(application_domain_type) ++logging_inherit_append_all_logs(application_domain_type) ++ ++files_dontaudit_search_non_security_dirs(application_domain_type) ++ ++auth_login_pgm_sigchld(application_domain_type) ++ ++optional_policy(` ++ afs_rw_udp_sockets(application_domain_type) ++') ++ + optional_policy(` ++ cfengine_append_inherited_log(application_domain_type) ++') ++ ++optional_policy(` ++ cron_rw_inherited_user_spool_files(application_domain_type) + cron_sigchld(application_domain_type) + ') + + optional_policy(` +- ssh_sigchld(application_domain_type) + ssh_rw_stream_sockets(application_domain_type) + ') + ++optional_policy(` ++ screen_sigchld(application_domain_type) ++') ++ + optional_policy(` + sudo_sigchld(application_domain_type) + ') +diff --git a/policy/modules/system/authlogin.fc b/policy/modules/system/authlogin.fc +index 2479587655..890e1e2936 100644 +--- a/policy/modules/system/authlogin.fc ++++ b/policy/modules/system/authlogin.fc +@@ -1,14 +1,28 @@ ++HOME_DIR/\.yubico(/.*)? gen_context(system_u:object_r:auth_home_t,s0) ++HOME_DIR/\.google_authenticator gen_context(system_u:object_r:auth_home_t,s0) ++HOME_DIR/\.google_authenticator~ gen_context(system_u:object_r:auth_home_t,s0) ++/root/\.yubico(/.*)? gen_context(system_u:object_r:auth_home_t,s0) ++/root/\.google_authenticator gen_context(system_u:object_r:auth_home_t,s0) ++/root/\.google_authenticator~ gen_context(system_u:object_r:auth_home_t,s0) + + /bin/login -- gen_context(system_u:object_r:login_exec_t,s0) + +-/etc/\.pwd\.lock -- gen_context(system_u:object_r:shadow_t,s0) +-/etc/group\.lock -- gen_context(system_u:object_r:shadow_t,s0) ++/etc/group\.lock -- gen_context(system_u:object_r:passwd_file_t,s0) + /etc/gshadow.* -- gen_context(system_u:object_r:shadow_t,s0) +-/etc/passwd\.lock -- gen_context(system_u:object_r:shadow_t,s0) ++/etc/nshadow.* -- gen_context(system_u:object_r:shadow_t,s0) + /etc/shadow.* -- gen_context(system_u:object_r:shadow_t,s0) ++/etc/security/opasswd -- gen_context(system_u:object_r:shadow_t,s0) ++/etc/security/opasswd\.old -- gen_context(system_u:object_r:shadow_t,s0) ++/etc/passwd\.lock -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/passwd\.adjunct.* -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/\.pwd\.lock -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/passwd[-\+]? -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/passwd\.OLD -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/ptmptmp -- gen_context(system_u:object_r:passwd_file_t,s0) ++/etc/group[-\+]? -- gen_context(system_u:object_r:passwd_file_t,s0) + + /sbin/pam_console_apply -- gen_context(system_u:object_r:pam_console_exec_t,s0) +-/sbin/pam_timestamp_check -- gen_context(system_u:object_r:pam_exec_t,s0) ++/sbin/pam_timestamp_check -- gen_context(system_u:object_r:pam_timestamp_exec_t,s0) + /sbin/unix_chkpwd -- gen_context(system_u:object_r:chkpwd_exec_t,s0) + /sbin/unix_update -- gen_context(system_u:object_r:updpwd_exec_t,s0) + /sbin/unix_verify -- gen_context(system_u:object_r:chkpwd_exec_t,s0) +@@ -16,13 +30,25 @@ ifdef(`distro_suse', ` + /sbin/unix2_chkpwd -- gen_context(system_u:object_r:chkpwd_exec_t,s0) + ') + ++/usr/bin/login -- gen_context(system_u:object_r:login_exec_t,s0) ++ + /usr/kerberos/sbin/login\.krb5 -- gen_context(system_u:object_r:login_exec_t,s0) + +-/usr/sbin/utempter -- gen_context(system_u:object_r:utempter_exec_t,s0) +-/usr/sbin/validate -- gen_context(system_u:object_r:chkpwd_exec_t,s0) ++/usr/sbin/pam_console_apply -- gen_context(system_u:object_r:pam_console_exec_t,s0) ++/usr/sbin/pam_timestamp_check -- gen_context(system_u:object_r:pam_timestamp_exec_t,s0) ++/usr/sbin/pwhistory_helper -- gen_context(system_u:object_r:updpwd_exec_t,s0) ++/usr/sbin/unix_chkpwd -- gen_context(system_u:object_r:chkpwd_exec_t,s0) ++/usr/sbin/unix_update -- gen_context(system_u:object_r:updpwd_exec_t,s0) ++/usr/sbin/unix_verify -- gen_context(system_u:object_r:chkpwd_exec_t,s0) + ifdef(`distro_gentoo', ` + /usr/sbin/unix_chkpwd -- gen_context(system_u:object_r:chkpwd_exec_t,s0) + ') ++/usr/sbin/utempter -- gen_context(system_u:object_r:utempter_exec_t,s0) ++/usr/sbin/validate -- gen_context(system_u:object_r:chkpwd_exec_t,s0) ++ ++/var/ace(/.*)? gen_context(system_u:object_r:var_auth_t,s0) ++ ++/var/opt/quest/vas/vasd(/.*)? gen_context(system_u:object_r:var_auth_t,s0) + + /var/cache/coolkey(/.*)? gen_context(system_u:object_r:auth_cache_t,s0) + +@@ -30,21 +56,25 @@ ifdef(`distro_gentoo', ` + + /var/lib/abl(/.*)? gen_context(system_u:object_r:var_auth_t,s0) + /var/lib/pam_ssh(/.*)? gen_context(system_u:object_r:var_auth_t,s0) ++/var/lib/pam_shield(/.*)? gen_context(system_u:object_r:var_auth_t,s0) ++/var/lib/google-authenticator(/.*)? gen_context(system_u:object_r:var_auth_t,s0) + + /var/log/btmp.* -- gen_context(system_u:object_r:faillog_t,s0) + /var/log/dmesg -- gen_context(system_u:object_r:var_log_t,s0) +-/var/log/faillog -- gen_context(system_u:object_r:faillog_t,s0) +-/var/log/lastlog -- gen_context(system_u:object_r:lastlog_t,s0) ++/var/log/faillog.* -- gen_context(system_u:object_r:faillog_t,s0) ++/var/log/lastlog.* -- gen_context(system_u:object_r:lastlog_t,s0) + /var/log/syslog -- gen_context(system_u:object_r:var_log_t,s0) +-/var/log/tallylog -- gen_context(system_u:object_r:faillog_t,s0) ++/var/log/tallylog.* -- gen_context(system_u:object_r:faillog_t,s0) + /var/log/wtmp.* -- gen_context(system_u:object_r:wtmp_t,s0) + ++/var/lib/rsa(/.*)? gen_context(system_u:object_r:var_auth_t,s0) ++/var/rsa(/.*)? gen_context(system_u:object_r:var_auth_t,s0) ++ + /var/run/console(/.*)? gen_context(system_u:object_r:pam_var_console_t,s0) + /var/run/faillock(/.*)? gen_context(system_u:object_r:faillog_t,s0) + /var/run/pam_mount(/.*)? gen_context(system_u:object_r:pam_var_run_t,s0) + /var/run/pam_ssh(/.*)? gen_context(system_u:object_r:var_auth_t,s0) + /var/run/sepermit(/.*)? gen_context(system_u:object_r:pam_var_run_t,s0) + /var/run/sudo(/.*)? gen_context(system_u:object_r:pam_var_run_t,s0) +-/var/run/user(/.*)? gen_context(system_u:object_r:var_auth_t,s0) + /var/(db|adm)/sudo(/.*)? gen_context(system_u:object_r:pam_var_run_t,s0) + /var/lib/sudo(/.*)? gen_context(system_u:object_r:pam_var_run_t,s0) +diff --git a/policy/modules/system/authlogin.if b/policy/modules/system/authlogin.if +index 3efd5b6697..1bfc720415 100644 +--- a/policy/modules/system/authlogin.if ++++ b/policy/modules/system/authlogin.if +@@ -23,11 +23,17 @@ interface(`auth_role',` + role $1 types chkpwd_t; + + # Transition from the user domain to this domain. +- domtrans_pattern($2, chkpwd_exec_t, chkpwd_t) ++ auth_domtrans_chkpwd($2) + + ps_process_pattern($2, chkpwd_t) + + dontaudit $2 shadow_t:file read_file_perms; ++ ++ logging_send_syslog_msg($2) ++ logging_send_audit_msgs($2) ++ ++ usermanage_read_crack_db($2) ++ + ') + + ######################################## +@@ -53,13 +59,18 @@ interface(`auth_use_pam',` + auth_read_login_records($1) + auth_append_login_records($1) + auth_rw_lastlog($1) +- auth_rw_faillog($1) ++ auth_create_lastlog($1) ++ auth_manage_faillog($1) + auth_exec_pam($1) + auth_use_nsswitch($1) + ++ init_rw_stream_sockets($1) ++ + logging_send_audit_msgs($1) + logging_send_syslog_msg($1) + ++ userdom_search_user_tmp_dirs($1) ++ + optional_policy(` + dbus_system_bus_client($1) + +@@ -77,9 +88,20 @@ interface(`auth_use_pam',` + kerberos_read_config($1) + ') + ++ optional_policy(` ++ locallogin_getattr_home_content($1) ++ ') ++ + optional_policy(` + nis_authenticate($1) + ') ++ ++ optional_policy(` ++ systemd_dbus_chat_logind($1) ++ systemd_use_fds_logind($1) ++ systemd_write_inherited_logind_sessions_pipes($1) ++ systemd_read_logind_sessions_files($1) ++ ') + ') + + ######################################## +@@ -95,69 +117,67 @@ interface(`auth_use_pam',` + interface(`auth_login_pgm_domain',` + gen_require(` + type var_auth_t, auth_cache_t; ++ attribute polydomain; ++ attribute login_pgm; + ') + + domain_type($1) ++ typeattribute $1 polydomain; ++ typeattribute $1 login_pgm; ++ + domain_subj_id_change_exemption($1) + domain_role_change_exemption($1) + domain_obj_id_change_exemption($1) + role system_r types $1; + +- # Needed for pam_selinux_permit to cleanup properly +- domain_read_all_domains_state($1) +- domain_kill_all_domains($1) +- +- # pam_keyring +- allow $1 self:capability ipc_lock; +- allow $1 self:process setkeycreate; +- allow $1 self:key manage_key_perms; +- +- files_list_var_lib($1) +- manage_files_pattern($1, var_auth_t, var_auth_t) +- +- manage_dirs_pattern($1, auth_cache_t, auth_cache_t) +- manage_files_pattern($1, auth_cache_t, auth_cache_t) +- manage_sock_files_pattern($1, auth_cache_t, auth_cache_t) +- files_var_filetrans($1, auth_cache_t, dir) +- +- # needed for afs - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=253321 +- kernel_rw_afs_state($1) +- +- # for fingerprint readers +- dev_rw_input_dev($1) +- dev_rw_generic_usb_dev($1) +- +- files_read_etc_files($1) +- +- fs_list_auto_mountpoints($1) +- + selinux_get_fs_mount($1) +- selinux_validate_context($1) +- selinux_compute_access_vector($1) +- selinux_compute_create_context($1) +- selinux_compute_relabel_context($1) +- selinux_compute_user_contexts($1) + + mls_file_read_all_levels($1) + mls_file_write_all_levels($1) + mls_file_upgrade($1) + mls_file_downgrade($1) + mls_process_set_level($1) ++ mls_process_write_to_clearance($1) + mls_fd_share_all_levels($1) + + auth_use_pam($1) ++') + +- init_rw_utmp($1) +- +- logging_set_loginuid($1) +- logging_set_tty_audit($1) ++######################################## ++## ++## Read authlogin state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authlogin_read_state',` ++ gen_require(` ++ attribute polydomain; ++ ') + +- seutil_read_config($1) +- seutil_read_default_contexts($1) ++ kernel_search_proc($1) ++ ps_process_pattern($1, polydomain) ++') + +- tunable_policy(`allow_polyinstantiation',` +- files_polyinstantiate_all($1) ++######################################## ++## ++## Read and write a authlogin unnamed pipe. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authlogin_rw_pipes',` ++ gen_require(` ++ attribute polydomain; + ') ++ ++ allow $1 polydomain:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## +@@ -227,6 +247,26 @@ interface(`auth_domtrans_login_program',` + + corecmd_search_bin($1) + domtrans_pattern($1, login_exec_t, $2) ++ allow $1 login_exec_t:file map; ++') ++ ++######################################## ++## ++## Execute a login_program in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`auth_exec_login_program',` ++ gen_require(` ++ type login_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, login_exec_t) + ') + + ######################################## +@@ -320,6 +360,24 @@ interface(`auth_rw_cache',` + rw_files_pattern($1, auth_cache_t, auth_cache_t) + ') + ++######################################## ++## ++## Create authentication cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_create_cache',` ++ gen_require(` ++ type auth_cache_t; ++ ') ++ ++ create_files_pattern($1, auth_cache_t, auth_cache_t) ++') ++ + ######################################## + ## + ## Manage authentication cache +@@ -337,6 +395,7 @@ interface(`auth_manage_cache',` + + manage_dirs_pattern($1, auth_cache_t, auth_cache_t) + manage_files_pattern($1, auth_cache_t, auth_cache_t) ++ allow $1 auth_cache_t:file map; + ') + + ####################################### +@@ -377,6 +436,7 @@ interface(`auth_domtrans_chk_passwd',` + + corecmd_search_bin($1) + domtrans_pattern($1, chkpwd_exec_t, chkpwd_t) ++ allow $1 chkpwd_exec_t:file map; + + dontaudit $1 shadow_t:file read_file_perms; + +@@ -402,6 +462,8 @@ interface(`auth_domtrans_chk_passwd',` + optional_policy(` + samba_stream_connect_winbind($1) + ') ++ ++ auth_domtrans_upd_passwd($1) + ') + + ######################################## +@@ -426,6 +488,24 @@ interface(`auth_domtrans_chkpwd',` + auth_domtrans_upd_passwd($1) + ') + ++######################################## ++## ++## Execute chkpwd in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`auth_exec_chkpwd',` ++ gen_require(` ++ type chkpwd_exec_t; ++ ') ++ ++ allow $1 chkpwd_exec_t:file execute; ++') ++ + ######################################## + ## + ## Execute chkpwd programs in the chkpwd domain. +@@ -448,6 +528,25 @@ interface(`auth_run_chk_passwd',` + + auth_domtrans_chk_passwd($1) + role $2 types chkpwd_t; ++ auth_run_upd_passwd($1, $2) ++') ++ ++######################################## ++## ++## Send generic signals to chkpwd processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_signal_chk_passwd',` ++ gen_require(` ++ type chkpwd_t; ++ ') ++ ++ allow $1 chkpwd_t:process signal; + ') + + ######################################## +@@ -467,7 +566,6 @@ interface(`auth_domtrans_upd_passwd',` + + domtrans_pattern($1, updpwd_exec_t, updpwd_t) + auth_dontaudit_read_shadow($1) +- + ') + + ######################################## +@@ -532,6 +630,24 @@ interface(`auth_dontaudit_getattr_shadow',` + dontaudit $1 shadow_t:file getattr; + ') + ++######################################## ++## ++## Mmap the shadow passwords file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_map_shadow',` ++ gen_require(` ++ type shadow_t; ++ ') ++ ++ allow $1 shadow_t:file map; ++') ++ + ######################################## + ## + ## Read the shadow passwords file (/etc/shadow) +@@ -664,6 +780,11 @@ interface(`auth_manage_shadow',` + + allow $1 shadow_t:file manage_file_perms; + typeattribute $1 can_read_shadow_passwords, can_write_shadow_passwords; ++ files_var_filetrans($1, shadow_t, file, "shadow") ++ files_var_filetrans($1, shadow_t, file, "shadow-") ++ files_etc_filetrans($1, shadow_t, file, "gshadow") ++ files_etc_filetrans($1, shadow_t, file, "nshadow") ++ files_etc_filetrans($1, shadow_t, file, "opasswd") + ') + + ####################################### +@@ -763,7 +884,50 @@ interface(`auth_rw_faillog',` + ') + + logging_search_logs($1) +- allow $1 faillog_t:file rw_file_perms; ++ rw_files_pattern($1, faillog_t, faillog_t) ++') ++ ++######################################## ++## ++## Relabel the login failure log. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_relabel_faillog',` ++ gen_require(` ++ type faillog_t; ++ ') ++ ++ allow $1 faillog_t:dir relabel_dir_perms; ++ allow $1 faillog_t:file relabel_file_perms; ++') ++ ++######################################## ++## ++## Manage the login failure log. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_manage_faillog',` ++ gen_require(` ++ type faillog_t; ++ ') ++ ++ logging_search_logs($1) ++ files_search_pids($1) ++ allow $1 faillog_t:dir manage_dir_perms; ++ allow $1 faillog_t:file manage_file_perms; ++ logging_log_named_filetrans($1, faillog_t, file, "tallylog") ++ logging_log_named_filetrans($1, faillog_t, file, "faillog") ++ logging_log_named_filetrans($1, faillog_t, file, "btmp") + ') + + ####################################### +@@ -824,9 +988,29 @@ interface(`auth_rw_lastlog',` + allow $1 lastlog_t:file { rw_file_perms lock setattr }; + ') + ++####################################### ++## ++## Manage create logins log. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_create_lastlog',` ++ gen_require(` ++ type lastlog_t; ++ ') ++ ++ logging_search_logs($1) ++ allow $1 lastlog_t:file create; ++ logging_log_named_filetrans($1, lastlog_t, file, "lastlog") ++') ++ + ######################################## + ## +-## Execute pam programs in the pam domain. ++## Execute pam timestamp programs in the pam timestamp domain. + ## + ## + ## +@@ -834,12 +1018,27 @@ interface(`auth_rw_lastlog',` + ## + ## + # +-interface(`auth_domtrans_pam',` ++interface(`auth_domtrans_pam_timestamp',` + gen_require(` +- type pam_t, pam_exec_t; ++ type pam_timestamp_t, pam_timestamp_exec_t; + ') + +- domtrans_pattern($1, pam_exec_t, pam_t) ++ domtrans_pattern($1, pam_timestamp_exec_t, pam_timestamp_t) ++') ++ ++######################################## ++## ++## Execute pam timestamp programs in the pam timestamp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`auth_domtrans_pam',` ++ auth_domtrans_pam_timestamp($1) ++ refpolicywarn(`$0() has been deprecated, please use auth_domtrans_pam_timestamp() instead.') + ') + + ######################################## +@@ -854,15 +1053,15 @@ interface(`auth_domtrans_pam',` + # + interface(`auth_signal_pam',` + gen_require(` +- type pam_t; ++ type pam_timestamp_t; + ') + +- allow $1 pam_t:process signal; ++ allow $1 pam_timestamp_t:process signal; + ') + + ######################################## + ## +-## Execute pam programs in the PAM domain. ++## Execute pam_timestamp programs in the PAM timestamp domain. + ## + ## + ## +@@ -875,13 +1074,33 @@ interface(`auth_signal_pam',` + ## + ## + # +-interface(`auth_run_pam',` ++interface(`auth_run_pam_timestamp',` + gen_require(` +- type pam_t; ++ type pam_timestamp_t; + ') + +- auth_domtrans_pam($1) +- role $2 types pam_t; ++ auth_domtrans_pam_timestamp($1) ++ role $2 types pam_timestamp_t; ++') ++ ++######################################## ++## ++## Execute pam_timestamp programs in the PAM timestamp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to allow the PAM domain. ++## ++## ++# ++interface(`auth_run_pam',` ++ auth_run_pam_timestamp($1, $2) ++ refpolicywarn(`$0() has been deprecated, please use auth_run_pam_timestamp.') + ') + + ######################################## +@@ -959,9 +1178,30 @@ interface(`auth_manage_var_auth',` + ') + + files_search_var($1) +- allow $1 var_auth_t:dir manage_dir_perms; +- allow $1 var_auth_t:file rw_file_perms; +- allow $1 var_auth_t:lnk_file rw_lnk_file_perms; ++ ++ manage_dirs_pattern($1, var_auth_t, var_auth_t) ++ manage_files_pattern($1, var_auth_t, var_auth_t) ++ manage_lnk_files_pattern($1, var_auth_t, var_auth_t) ++') ++ ++######################################## ++## ++## Relabel all var auth files. Used by various other applications ++## and pam applets etc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_relabel_var_auth_dirs',` ++ gen_require(` ++ type var_auth_t; ++ ') ++ ++ files_search_var($1) ++ relabel_dirs_pattern($1, var_auth_t, var_auth_t) + ') + + ######################################## +@@ -1040,6 +1280,10 @@ interface(`auth_manage_pam_pid',` + files_search_pids($1) + allow $1 pam_var_run_t:dir manage_dir_perms; + allow $1 pam_var_run_t:file manage_file_perms; ++ files_pid_filetrans($1, pam_var_run_t, dir, "pam_mount") ++ files_pid_filetrans($1, pam_var_run_t, dir, "pam_ssh") ++ files_pid_filetrans($1, pam_var_run_t, dir, "sepermit") ++ files_pid_filetrans($1, pam_var_run_t, dir, "sudo") + ') + + ######################################## +@@ -1176,6 +1420,7 @@ interface(`auth_manage_pam_console_data',` + files_search_pids($1) + manage_files_pattern($1, pam_var_console_t, pam_var_console_t) + manage_lnk_files_pattern($1, pam_var_console_t, pam_var_console_t) ++ files_pid_filetrans($1, pam_var_console_t, dir, "console") + ') + + ####################################### +@@ -1574,6 +1819,25 @@ interface(`auth_setattr_login_records',` + logging_search_logs($1) + ') + ++######################################## ++## ++## Relabel login record files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_relabel_login_records',` ++ gen_require(` ++ type wtmp_t; ++ ') ++ ++ allow $1 wtmp_t:file relabel_file_perms; ++') ++ ++ + ######################################## + ## + ## Read login records files (/var/log/wtmp). +@@ -1726,24 +1990,7 @@ interface(`auth_manage_login_records',` + + logging_rw_generic_log_dirs($1) + allow $1 wtmp_t:file manage_file_perms; +-') +- +-######################################## +-## +-## Relabel login record files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`auth_relabel_login_records',` +- gen_require(` +- type wtmp_t; +- ') +- +- allow $1 wtmp_t:file relabel_file_perms; ++ logging_log_named_filetrans($1, wtmp_t, file, "wtmp") + ') + + ######################################## +@@ -1767,11 +2014,13 @@ interface(`auth_relabel_login_records',` + ## + # + interface(`auth_use_nsswitch',` +- gen_require(` +- attribute nsswitch_domain; +- ') ++ gen_require(` ++ attribute nsswitch_domain; ++ ') + + typeattribute $1 nsswitch_domain; ++ ++ corenet_all_recvfrom_netlabel($1) + ') + + ######################################## +@@ -1805,3 +2054,298 @@ interface(`auth_unconfined',` + typeattribute $1 can_write_shadow_passwords; + typeattribute $1 can_relabelto_shadow_passwords; + ') ++ ++######################################## ++## ++## Transition to authlogin named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_filetrans_named_content',` ++ gen_require(` ++ type shadow_t; ++ type passwd_file_t; ++ type faillog_t; ++ type lastlog_t; ++ type wtmp_t; ++ type pam_var_console_t; ++ type pam_var_run_t; ++ type auth_cache_t; ++ ') ++ ++ files_etc_filetrans($1, passwd_file_t, file, "group") ++ files_etc_filetrans($1, passwd_file_t, file, "group-") ++ #files_etc_filetrans($1, passwd_file_t, file, "group+") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd-") ++ #files_etc_filetrans($1, passwd_file_t, file, "passwd+") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd.OLD") ++ files_etc_filetrans($1, passwd_file_t, file, "ptmptmp") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd.lock") ++ files_etc_filetrans($1, passwd_file_t, file, "group.lock") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd.adjunct") ++ files_etc_filetrans($1, passwd_file_t, file, ".pwd.lock") ++ files_etc_filetrans($1, shadow_t, file, "shadow") ++ files_etc_filetrans($1, shadow_t, file, "shadow-") ++ files_etc_filetrans($1, shadow_t, file, "gshadow") ++ files_etc_filetrans($1, shadow_t, file, "opasswd") ++ logging_log_named_filetrans($1, lastlog_t, file, "lastlog") ++ logging_log_named_filetrans($1, faillog_t, file, "tallylog") ++ logging_log_named_filetrans($1, faillog_t, file, "faillog") ++ logging_log_named_filetrans($1, faillog_t, file, "btmp") ++ files_pid_filetrans($1, faillog_t, file, "faillog") ++ files_pid_filetrans($1, faillog_t, dir, "faillock") ++ files_pid_filetrans($1, pam_var_console_t, dir, "console") ++ files_pid_filetrans($1, pam_var_run_t, dir, "pam_mount") ++ files_pid_filetrans($1, pam_var_run_t, dir, "pam_ssh") ++ files_pid_filetrans($1, pam_var_run_t, dir, "sepermit") ++ files_pid_filetrans($1, pam_var_run_t, dir, "sudo") ++ logging_log_named_filetrans($1, wtmp_t, file, "wtmp") ++ files_var_filetrans($1, auth_cache_t, dir, "coolkey") ++') ++ ++######################################## ++## ++## Get the attributes of the passwd passwords file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_getattr_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 passwd_file_t:file getattr; ++') ++ ++######################################## ++## ++## Do not audit attempts to get the attributes ++## of the passwd passwords file. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`auth_dontaudit_getattr_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ dontaudit $1 passwd_file_t:file getattr; ++') ++ ++######################################## ++## ++## Read the passwd passwords file (/etc/passwd) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_read_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ allow $1 passwd_file_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Mmap the passwd passwords file (/etc/passwd) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_map_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ allow $1 passwd_file_t:file map; ++') ++ ++######################################## ++## ++## Do not audit attempts to read the passwd ++## password file (/etc/passwd). ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`auth_dontaudit_read_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ dontaudit $1 passwd_file_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete the passwd ++## password file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_manage_passwd',` ++ gen_require(` ++ type passwd_file_t; ++ ') ++ ++ files_rw_etc_dirs($1) ++ allow $1 passwd_file_t:file manage_file_perms; ++ files_etc_filetrans($1, passwd_file_t, file, "passwd") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd-") ++ files_etc_filetrans($1, passwd_file_t, file, "ptmptmp") ++ files_etc_filetrans($1, passwd_file_t, file, "group") ++ files_etc_filetrans($1, passwd_file_t, file, "group-") ++ files_etc_filetrans($1, passwd_file_t, file, ".pwd.lock") ++ files_etc_filetrans($1, passwd_file_t, file, "passwd.lock") ++ files_etc_filetrans($1, passwd_file_t, file, "group.lock") ++') ++ ++######################################## ++## ++## Create auth directory in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_filetrans_admin_home_content',` ++ gen_require(` ++ type auth_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, auth_home_t, file, ".google_authenticator") ++ userdom_admin_home_dir_filetrans($1, auth_home_t, file, ".google_authenticator~") ++ userdom_admin_home_dir_filetrans($1, auth_home_t, dir, ".yubico") ++') ++ ++ ++######################################## ++## ++## Read the authorization data in the user home directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_read_home_content',` ++ ++ gen_require(` ++ type auth_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, auth_home_t, auth_home_t) ++') ++ ++######################################## ++## ++## Read the authorization data in the user home directory ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_manage_home_content',` ++ ++ gen_require(` ++ type auth_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ manage_files_pattern($1, auth_home_t, auth_home_t) ++ manage_dirs_pattern($1, auth_home_t, auth_home_t) ++') ++ ++######################################## ++## ++## Create auth directory in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_filetrans_home_content',` ++ ++ gen_require(` ++ type auth_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, auth_home_t, file, ".google_authenticator") ++ userdom_user_home_dir_filetrans($1, auth_home_t, file, ".google_authenticator~") ++ userdom_user_home_dir_filetrans($1, auth_home_t, dir, ".yubico") ++') ++ ++######################################## ++## ++## Send a SIGCHLD signal to login programs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_login_pgm_sigchld',` ++ gen_require(` ++ attribute login_pgm; ++ ') ++ ++ allow $1 login_pgm:process sigchld; ++') ++ ++######################################## ++## ++## Manage the keyrings of all login programs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`auth_login_manage_key',` ++ gen_require(` ++ attribute login_pgm; ++ ') ++ ++ allow $1 login_pgm:key manage_key_perms; ++') +diff --git a/policy/modules/system/authlogin.te b/policy/modules/system/authlogin.te +index 09b791dccb..073241e055 100644 +--- a/policy/modules/system/authlogin.te ++++ b/policy/modules/system/authlogin.te +@@ -5,6 +5,19 @@ policy_module(authlogin, 2.5.1) + # Declarations + # + ++## ++##

      ++## Allow users to login using a radius server ++##

      ++##
      ++gen_tunable(authlogin_radius, false) ++ ++## ++##

      ++## Allow users to login using a yubikey OTP server or challenge response mode ++##

      ++##
      ++gen_tunable(authlogin_yubikey, false) + + ## + ##

      +@@ -16,20 +29,26 @@ gen_tunable(authlogin_nsswitch_use_ldap, false) + attribute can_read_shadow_passwords; + attribute can_write_shadow_passwords; + attribute can_relabelto_shadow_passwords; ++attribute polydomain; + attribute nsswitch_domain; ++attribute login_pgm; + + type auth_cache_t; + logging_log_file(auth_cache_t) + ++type auth_home_t; ++userdom_user_home_content(auth_home_t) ++ + type chkpwd_t, can_read_shadow_passwords; + type chkpwd_exec_t; + typealias chkpwd_t alias { user_chkpwd_t staff_chkpwd_t sysadm_chkpwd_t }; +-typealias chkpwd_t alias { auditadm_chkpwd_t secadm_chkpwd_t }; ++typealias chkpwd_t alias { auditadm_chkpwd_t secadm_chkpwd_t system_chkpwd_t }; + application_domain(chkpwd_t, chkpwd_exec_t) + role system_r types chkpwd_t; + + type faillog_t; + logging_log_file(faillog_t) ++mls_trusted_object(faillog_t) + + type lastlog_t; + logging_log_file(lastlog_t) +@@ -42,15 +61,15 @@ type pam_console_exec_t; + init_system_domain(pam_console_t, pam_console_exec_t) + role system_r types pam_console_t; + +-type pam_t; +-domain_type(pam_t) +-role system_r types pam_t; ++type pam_timestamp_t alias pam_t; ++domain_type(pam_timestamp_t) ++role system_r types pam_timestamp_t; + +-type pam_exec_t; +-domain_entry_file(pam_t, pam_exec_t) ++type pam_timestamp_exec_t alias pam_exec_t; ++domain_entry_file(pam_timestamp_t, pam_timestamp_exec_t) + +-type pam_tmp_t; +-files_tmp_file(pam_tmp_t) ++type pam_timestamp_tmp_t; ++files_tmp_file(pam_timestamp_tmp_t) + + type pam_var_console_t; + files_pid_file(pam_var_console_t) +@@ -64,6 +83,9 @@ neverallow ~can_read_shadow_passwords shadow_t:file read; + neverallow ~can_write_shadow_passwords shadow_t:file { create write }; + neverallow ~can_relabelto_shadow_passwords shadow_t:file relabelto; + ++type passwd_file_t; ++files_type(passwd_file_t) ++ + type updpwd_t; + type updpwd_exec_t; + domain_type(updpwd_t) +@@ -90,11 +112,11 @@ logging_log_file(wtmp_t) + # Check password local policy + # + +-allow chkpwd_t self:capability { dac_override setuid }; ++allow chkpwd_t self:capability { dac_read_search dac_override setuid }; + dontaudit chkpwd_t self:capability sys_tty_config; + allow chkpwd_t self:process { getattr signal }; + +-allow chkpwd_t shadow_t:file read_file_perms; ++allow chkpwd_t shadow_t:file { read_file_perms map }; + files_list_etc(chkpwd_t) + + kernel_read_crypto_sysctls(chkpwd_t) +@@ -109,6 +131,9 @@ dev_read_urand(chkpwd_t) + files_read_etc_files(chkpwd_t) + # for nscd + files_dontaudit_search_var(chkpwd_t) ++files_read_usr_symlinks(chkpwd_t) ++files_list_tmp(chkpwd_t) ++files_map_system_db_files(chkpwd_t) + + fs_dontaudit_getattr_xattr_fs(chkpwd_t) + +@@ -122,12 +147,11 @@ auth_use_nsswitch(chkpwd_t) + logging_send_audit_msgs(chkpwd_t) + logging_send_syslog_msg(chkpwd_t) + +-miscfiles_read_localization(chkpwd_t) + + seutil_read_config(chkpwd_t) + seutil_dontaudit_use_newrole_fds(chkpwd_t) + +-userdom_use_user_terminals(chkpwd_t) ++userdom_dontaudit_use_user_ttys(chkpwd_t) + + ifdef(`distro_ubuntu',` + optional_policy(` +@@ -140,6 +164,10 @@ optional_policy(` + apache_dontaudit_rw_tcp_sockets(chkpwd_t) + ') + ++optional_policy(` ++ dbus_system_bus_client(chkpwd_t) ++') ++ + optional_policy(` + kerberos_use(chkpwd_t) + ') +@@ -153,53 +181,52 @@ optional_policy(` + # PAM local policy + # + +-allow pam_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; +-dontaudit pam_t self:capability sys_tty_config; ++allow pam_timestamp_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++dontaudit pam_timestamp_t self:capability sys_tty_config; + +-allow pam_t self:fd use; +-allow pam_t self:fifo_file rw_file_perms; +-allow pam_t self:unix_dgram_socket create_socket_perms; +-allow pam_t self:unix_stream_socket rw_stream_socket_perms; +-allow pam_t self:unix_dgram_socket sendto; +-allow pam_t self:unix_stream_socket connectto; +-allow pam_t self:shm create_shm_perms; +-allow pam_t self:sem create_sem_perms; +-allow pam_t self:msgq create_msgq_perms; +-allow pam_t self:msg { send receive }; ++allow pam_timestamp_t self:fd use; ++allow pam_timestamp_t self:fifo_file rw_file_perms; ++allow pam_timestamp_t self:unix_dgram_socket create_socket_perms; ++allow pam_timestamp_t self:unix_stream_socket rw_stream_socket_perms; ++allow pam_timestamp_t self:unix_dgram_socket sendto; ++allow pam_timestamp_t self:unix_stream_socket connectto; ++allow pam_timestamp_t self:shm create_shm_perms; ++allow pam_timestamp_t self:sem create_sem_perms; ++allow pam_timestamp_t self:msgq create_msgq_perms; ++allow pam_timestamp_t self:msg { send receive }; + +-delete_files_pattern(pam_t, pam_var_run_t, pam_var_run_t) +-read_files_pattern(pam_t, pam_var_run_t, pam_var_run_t) +-files_list_pids(pam_t) ++delete_files_pattern(pam_timestamp_t, pam_var_run_t, pam_var_run_t) ++read_files_pattern(pam_timestamp_t, pam_var_run_t, pam_var_run_t) ++files_list_pids(pam_timestamp_t) + +-allow pam_t pam_tmp_t:dir manage_dir_perms; +-allow pam_t pam_tmp_t:file manage_file_perms; +-files_tmp_filetrans(pam_t, pam_tmp_t, { file dir }) ++allow pam_timestamp_t pam_timestamp_tmp_t:dir manage_dir_perms; ++allow pam_timestamp_t pam_timestamp_tmp_t:file manage_file_perms; ++files_tmp_filetrans(pam_timestamp_t, pam_timestamp_tmp_t, { file dir }) + +-auth_use_nsswitch(pam_t) ++auth_use_nsswitch(pam_timestamp_t) + +-kernel_read_system_state(pam_t) ++kernel_read_system_state(pam_timestamp_t) + +-files_read_etc_files(pam_t) ++files_read_etc_files(pam_timestamp_t) + +-fs_search_auto_mountpoints(pam_t) ++fs_search_auto_mountpoints(pam_timestamp_t) + +-miscfiles_read_localization(pam_t) + +-term_use_all_ttys(pam_t) +-term_use_all_ptys(pam_t) ++term_use_all_ttys(pam_timestamp_t) ++term_use_all_ptys(pam_timestamp_t) + +-init_dontaudit_rw_utmp(pam_t) ++init_dontaudit_rw_utmp(pam_timestamp_t) + +-logging_send_syslog_msg(pam_t) ++logging_send_syslog_msg(pam_timestamp_t) + + ifdef(`distro_ubuntu',` + optional_policy(` +- unconfined_domain(pam_t) ++ unconfined_domain(pam_timestamp_t) + ') + ') + + optional_policy(` +- locallogin_use_fds(pam_t) ++ locallogin_use_fds(pam_timestamp_t) + ') + + ######################################## +@@ -289,7 +316,6 @@ init_use_script_ptys(pam_console_t) + + logging_send_syslog_msg(pam_console_t) + +-miscfiles_read_localization(pam_console_t) + miscfiles_read_generic_certs(pam_console_t) + + seutil_read_file_contexts(pam_console_t) +@@ -330,7 +356,7 @@ optional_policy(` + # updpwd local policy + # + +-allow updpwd_t self:capability { chown dac_override }; ++allow updpwd_t self:capability { chown dac_read_search dac_override }; + allow updpwd_t self:process setfscreate; + allow updpwd_t self:fifo_file rw_fifo_file_perms; + allow updpwd_t self:unix_stream_socket create_stream_socket_perms; +@@ -341,18 +367,22 @@ kernel_read_system_state(updpwd_t) + dev_read_urand(updpwd_t) + + files_manage_etc_files(updpwd_t) ++auth_manage_passwd(updpwd_t) ++ ++mls_file_read_all_levels(updpwd_t) ++mls_file_write_all_levels(updpwd_t) ++mls_file_downgrade(updpwd_t) + + term_dontaudit_use_console(updpwd_t) + term_dontaudit_use_unallocated_ttys(updpwd_t) + + auth_manage_shadow(updpwd_t) ++auth_etc_filetrans_shadow(updpwd_t) + auth_use_nsswitch(updpwd_t) + + logging_send_syslog_msg(updpwd_t) + +-miscfiles_read_localization(updpwd_t) +- +-userdom_use_user_terminals(updpwd_t) ++userdom_use_inherited_user_terminals(updpwd_t) + + ifdef(`distro_ubuntu',` + optional_policy(` +@@ -380,13 +410,15 @@ term_dontaudit_use_all_ttys(utempter_t) + term_dontaudit_use_all_ptys(utempter_t) + term_dontaudit_use_ptmx(utempter_t) + ++auth_use_nsswitch(utempter_t) ++ + init_rw_utmp(utempter_t) + + domain_use_interactive_fds(utempter_t) + + logging_search_logs(utempter_t) + +-userdom_use_user_terminals(utempter_t) ++userdom_use_inherited_user_terminals(utempter_t) + # Allow utemper to write to /tmp/.xses-* + userdom_write_user_tmp_files(utempter_t) + +@@ -397,19 +429,30 @@ ifdef(`distro_ubuntu',` + ') + + optional_policy(` +- nscd_use(utempter_t) ++ xserver_use_xdm_fds(utempter_t) ++ xserver_rw_xdm_pipes(utempter_t) ++') ++ ++tunable_policy(`polyinstantiation_enabled',` ++ files_polyinstantiate_all(polydomain) + ') + + optional_policy(` +- xserver_use_xdm_fds(utempter_t) +- xserver_rw_xdm_pipes(utempter_t) ++ tunable_policy(`polyinstantiation_enabled',` ++ namespace_init_domtrans(polydomain) ++ ') + ') + +-####################################### ++###################################### + # + # nsswitch_domain local policy + # + ++allow nsswitch_domain self:key manage_key_perms; ++ ++auth_read_passwd(nsswitch_domain) ++auth_map_passwd(nsswitch_domain) ++ + files_list_var_lib(nsswitch_domain) + + # read /etc/nsswitch.conf +@@ -417,15 +460,42 @@ files_read_etc_files(nsswitch_domain) + + sysnet_dns_name_resolve(nsswitch_domain) + ++systemd_hostnamed_read_config(nsswitch_domain) ++ ++ ++tunable_policy(`authlogin_nsswitch_use_ldap',` ++ allow nsswitch_domain self:tcp_socket create_socket_perms; ++') ++ ++tunable_policy(`authlogin_nsswitch_use_ldap',` ++ corenet_tcp_sendrecv_generic_if(nsswitch_domain) ++ corenet_tcp_sendrecv_generic_node(nsswitch_domain) ++ corenet_tcp_sendrecv_ldap_port(nsswitch_domain) ++ corenet_tcp_connect_ldap_port(nsswitch_domain) ++ corenet_sendrecv_ldap_client_packets(nsswitch_domain) ++') ++ + tunable_policy(`authlogin_nsswitch_use_ldap',` +- files_list_var_lib(nsswitch_domain) ++ # Support for LDAPS ++ dev_read_rand(nsswitch_domain) ++ # LDAP Configuration using encrypted requires ++ dev_read_urand(nsswitch_domain) ++ sysnet_read_config(nsswitch_domain) ++') + ++tunable_policy(`authlogin_nsswitch_use_ldap',` + miscfiles_read_generic_certs(nsswitch_domain) +- sysnet_use_ldap(nsswitch_domain) + ') + + optional_policy(` + tunable_policy(`authlogin_nsswitch_use_ldap',` ++ dirsrv_stream_connect(nsswitch_domain) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`authlogin_nsswitch_use_ldap',` ++ ldap_read_certs(nsswitch_domain) + ldap_stream_connect(nsswitch_domain) + ') + ') +@@ -438,6 +508,7 @@ optional_policy(` + likewise_stream_connect_lsassd(nsswitch_domain) + ') + ++# can not wrap nis_use_ypbind or kerberos_use, but they both have booleans you can turn off. + optional_policy(` + kerberos_use(nsswitch_domain) + ') +@@ -456,10 +527,161 @@ optional_policy(` + + optional_policy(` + sssd_stream_connect(nsswitch_domain) ++ sssd_read_public_files(nsswitch_domain) ++ sssd_read_lib_files(nsswitch_domain) ++') ++ ++#1134389 ++userdom_manage_all_users_keys(nsswitch_domain) ++optional_policy(` ++ sssd_manage_keys(nsswitch_domain) ++') ++ ++optional_policy(` ++ rolekit_manage_keys(nsswitch_domain) + ') + + optional_policy(` + samba_stream_connect_winbind(nsswitch_domain) ++ samba_stream_connect_nmbd(nsswitch_domain) + samba_read_var_files(nsswitch_domain) + samba_dontaudit_write_var_files(nsswitch_domain) + ') ++ ++optional_policy(` ++ virt_read_lib_files(nsswitch_domain) ++') ++ ++####################################### ++# ++# Login Program local policy ++# ++ ++domain_read_all_domains_state(login_pgm) ++corecmd_getattr_all_executables(login_pgm) ++domain_kill_all_domains(login_pgm) ++ ++allow login_pgm self:netlink_kobject_uevent_socket create_socket_perms; ++allow login_pgm self:capability ipc_lock; ++dontaudit login_pgm self:capability net_admin; ++allow login_pgm self:process setkeycreate; ++allow login_pgm self:key manage_key_perms; ++userdom_manage_all_users_keys(login_pgm) ++allow login_pgm nsswitch_domain:key manage_key_perms; ++ ++files_list_var_lib(login_pgm) ++manage_dirs_pattern(login_pgm, var_auth_t, var_auth_t) ++manage_files_pattern(login_pgm, var_auth_t, var_auth_t) ++manage_sock_files_pattern(login_pgm, var_auth_t, var_auth_t) ++ ++manage_dirs_pattern(login_pgm, auth_cache_t, auth_cache_t) ++manage_files_pattern(login_pgm, auth_cache_t, auth_cache_t) ++manage_sock_files_pattern(login_pgm, auth_cache_t, auth_cache_t) ++files_var_filetrans(login_pgm, auth_cache_t, dir, "coolkey") ++allow login_pgm auth_cache_t:file map; ++ ++manage_dirs_pattern(login_pgm, auth_home_t, auth_home_t) ++manage_files_pattern(login_pgm, auth_home_t, auth_home_t) ++auth_filetrans_admin_home_content(login_pgm) ++auth_filetrans_home_content(login_pgm) ++ ++# needed for afs - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=253321 ++kernel_search_network_sysctl(login_pgm) ++kernel_rw_afs_state(login_pgm) ++ ++tunable_policy(`authlogin_radius',` ++ corenet_udp_bind_all_unreserved_ports(login_pgm) ++') ++ ++tunable_policy(`authlogin_yubikey',` ++ corenet_tcp_connect_http_port(login_pgm) ++') ++ ++corenet_tcp_connect_pki_ca_port(login_pgm) ++ ++# for fingerprint readers ++dev_rw_input_dev(login_pgm) ++dev_rw_generic_usb_dev(login_pgm) ++ ++files_read_config_files(login_pgm) ++ ++fs_list_auto_mountpoints(login_pgm) ++fs_manage_cgroup_dirs(login_pgm) ++fs_manage_cgroup_files(login_pgm) ++fs_read_ecryptfs_symlinks(login_pgm) ++fs_read_ecryptfs_files(login_pgm) ++ ++selinux_validate_context(login_pgm) ++selinux_compute_access_vector(login_pgm) ++selinux_compute_create_context(login_pgm) ++selinux_compute_relabel_context(login_pgm) ++selinux_compute_user_contexts(login_pgm) ++ ++auth_manage_faillog(login_pgm) ++auth_manage_pam_pid(login_pgm) ++ ++init_rw_utmp(login_pgm) ++ ++logging_set_loginuid(login_pgm) ++logging_set_tty_audit(login_pgm) ++ ++miscfiles_dontaudit_write_generic_cert_files(login_pgm) ++miscfiles_filetrans_named_content(login_pgm) ++ ++seutil_read_config(login_pgm) ++seutil_read_login_config(login_pgm) ++seutil_read_default_contexts(login_pgm) ++systemd_login_read_pid_files(login_pgm) ++ ++userdom_set_rlimitnh(login_pgm) ++userdom_read_user_home_content_symlinks(login_pgm) ++userdom_delete_user_tmp_files(login_pgm) ++userdom_search_admin_dir(login_pgm) ++userdom_stream_connect(login_pgm) ++userdom_manage_user_tmp_dirs(login_pgm) ++userdom_manage_user_tmp_files(login_pgm) ++ ++optional_policy(` ++ afs_read_config(login_pgm) ++ afs_rw_udp_sockets(login_pgm) ++') ++ ++optional_policy(` ++ kerberos_read_config(login_pgm) ++') ++ ++optional_policy(` ++ oddjob_dbus_chat(login_pgm) ++ oddjob_domtrans_mkhomedir(login_pgm) ++') ++ ++optional_policy(` ++ openct_stream_connect(login_pgm) ++ openct_signull(login_pgm) ++ openct_read_pid_files(login_pgm) ++') ++ ++optional_policy(` ++ corecmd_exec_bin(login_pgm) ++ storage_getattr_fixed_disk_dev(login_pgm) ++ mount_domtrans(login_pgm) ++ mount_domtrans_ecryptmount(login_pgm) ++') ++ ++optional_policy(` ++ fprintd_dbus_chat(login_pgm) ++') ++ ++optional_policy(` ++ realmd_dbus_chat(login_pgm) ++') ++ ++optional_policy(` ++ # allow execute tmux ++ screen_exec(login_pgm) ++') ++ ++optional_policy(` ++ ssh_agent_exec(login_pgm) ++ ssh_read_user_home_files(login_pgm) ++') +diff --git a/policy/modules/system/clock.fc b/policy/modules/system/clock.fc +index c5e05ca702..c9ddbeecad 100644 +--- a/policy/modules/system/clock.fc ++++ b/policy/modules/system/clock.fc +@@ -3,3 +3,5 @@ + + /sbin/hwclock -- gen_context(system_u:object_r:hwclock_exec_t,s0) + ++/usr/sbin/hwclock -- gen_context(system_u:object_r:hwclock_exec_t,s0) ++ +diff --git a/policy/modules/system/clock.if b/policy/modules/system/clock.if +index d475c2debf..55305d5f38 100644 +--- a/policy/modules/system/clock.if ++++ b/policy/modules/system/clock.if +@@ -117,3 +117,40 @@ interface(`clock_rw_adjtime',` + allow $1 adjtime_t:file rw_file_perms; + files_list_etc($1) + ') ++ ++######################################## ++##

      ++## Manage clock drift adjustments. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`clock_manage_adjtime',` ++ gen_require(` ++ type adjtime_t; ++ ') ++ ++ allow $1 adjtime_t:file manage_file_perms; ++ files_list_etc($1) ++') ++ ++######################################## ++## ++## Transition to systemd clock content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`clock_filetrans_named_content',` ++ gen_require(` ++ type adjtime_t; ++ ') ++ ++ files_etc_filetrans($1, adjtime_t, file, "adjtime" ) ++') +diff --git a/policy/modules/system/clock.te b/policy/modules/system/clock.te +index edece47dc2..2e7b81176e 100644 +--- a/policy/modules/system/clock.te ++++ b/policy/modules/system/clock.te +@@ -20,7 +20,7 @@ role system_r types hwclock_t; + + # Give hwclock the capabilities it requires. dac_override is a surprise, + # but hwclock does require it. +-allow hwclock_t self:capability { dac_override sys_rawio sys_time sys_tty_config }; ++allow hwclock_t self:capability { dac_read_search dac_override sys_rawio sys_time sys_tty_config }; + dontaudit hwclock_t self:capability sys_tty_config; + allow hwclock_t self:process signal_perms; + allow hwclock_t self:fifo_file rw_fifo_file_perms; +@@ -46,28 +46,25 @@ fs_search_auto_mountpoints(hwclock_t) + + term_dontaudit_use_console(hwclock_t) + term_use_unallocated_ttys(hwclock_t) +-term_use_all_ttys(hwclock_t) +-term_use_all_ptys(hwclock_t) ++term_use_all_inherited_ttys(hwclock_t) ++term_use_all_inherited_ptys(hwclock_t) + + domain_use_interactive_fds(hwclock_t) + ++auth_use_nsswitch(hwclock_t) ++ + init_use_fds(hwclock_t) + init_use_script_ptys(hwclock_t) + + logging_send_audit_msgs(hwclock_t) + logging_send_syslog_msg(hwclock_t) + +-miscfiles_read_localization(hwclock_t) + + optional_policy(` + apm_append_log(hwclock_t) + apm_rw_stream_sockets(hwclock_t) + ') + +-optional_policy(` +- nscd_use(hwclock_t) +-') +- + optional_policy(` + seutil_sigchld_newrole(hwclock_t) + ') +diff --git a/policy/modules/system/fstools.fc b/policy/modules/system/fstools.fc +index 948ce2a32b..8cab8aef2f 100644 +--- a/policy/modules/system/fstools.fc ++++ b/policy/modules/system/fstools.fc +@@ -1,4 +1,3 @@ +-/sbin/badblocks -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/blkid -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/blockdev -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/cfdisk -- gen_context(system_u:object_r:fsadm_exec_t,s0) +@@ -23,7 +22,6 @@ + /sbin/mkfs.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/mkraid -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/mkreiserfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) +-/sbin/mkswap -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/parted -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/partprobe -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/partx -- gen_context(system_u:object_r:fsadm_exec_t,s0) +@@ -36,14 +34,55 @@ + /sbin/swapoff -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/swapon.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /sbin/tune2fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/sbin/xfs_growfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) + + /usr/bin/partition_uuid -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/bin/raw -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/bin/scsi_unique_id -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/bin/syslinux -- gen_context(system_u:object_r:fsadm_exec_t,s0) + ++/usr/lib/systemd/systemd-fsck -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++ ++/usr/sbin/blkid -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/blockdev -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/cfdisk -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/sbin/clubufflush -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/dosfsck -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/dump -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/dumpe2fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/e2fsck -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/e4fsck -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/e2label -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/fdisk -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/findfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/fsck.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/hdparm -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/install-mbr -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/jfs_.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/losetup.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/lsraid -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/make_reiser4 -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mkdosfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mke2fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mke4fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mkfs.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mkraid -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/mkreiserfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/sbin/parted -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/partprobe -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/partx -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/raidautorun -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/raidstart -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/reiserfs(ck|tune) -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/resize.*fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/scsi_info -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/sfdisk -- gen_context(system_u:object_r:fsadm_exec_t,s0) + /usr/sbin/smartctl -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/swapoff -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/swapon.* -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/tune2fs -- gen_context(system_u:object_r:fsadm_exec_t,s0) ++/usr/sbin/xfs_growfs -- gen_context(system_u:object_r:fsadm_exec_t,s0) + + /var/log/fsck(/.*)? gen_context(system_u:object_r:fsadm_log_t,s0) ++ ++/var/run/blkid(/.*)? gen_context(system_u:object_r:fsadm_var_run_t,s0) +diff --git a/policy/modules/system/fstools.if b/policy/modules/system/fstools.if +index 016a770b9b..3fce820a52 100644 +--- a/policy/modules/system/fstools.if ++++ b/policy/modules/system/fstools.if +@@ -154,3 +154,42 @@ interface(`fstools_getattr_swap_files',` + + allow $1 swapfile_t:file getattr; + ') ++ ++######################################## ++## ++## Create, read, write, and delete the FSADM pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fsadm_manage_pid',` ++ gen_require(` ++ type fsadm_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_dirs_pattern($1, fsadm_var_run_t, fsadm_var_run_t) ++ manage_files_pattern($1, fsadm_var_run_t, fsadm_var_run_t) ++ fstools_filetrans_named_content_fsadm($1) ++') ++ ++######################################## ++## ++## Transition to systemd content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`fstools_filetrans_named_content_fsadm',` ++ gen_require(` ++ type fsadm_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, fsadm_var_run_t, dir, "blkid") ++') +diff --git a/policy/modules/system/fstools.te b/policy/modules/system/fstools.te +index 3f48d300a0..2169fc1e0a 100644 +--- a/policy/modules/system/fstools.te ++++ b/policy/modules/system/fstools.te +@@ -13,9 +13,15 @@ role system_r types fsadm_t; + type fsadm_log_t; + logging_log_file(fsadm_log_t) + ++type fsadm_var_run_t; ++files_pid_file(fsadm_var_run_t) ++ + type fsadm_tmp_t; + files_tmp_file(fsadm_tmp_t) + ++type fsadm_tmpfs_t; ++files_tmpfs_file(fsadm_tmpfs_t) ++ + type swapfile_t; # customizable + files_type(swapfile_t) + +@@ -26,6 +32,7 @@ files_type(swapfile_t) + + # ipc_lock is for losetup + allow fsadm_t self:capability { ipc_lock sys_rawio sys_admin sys_resource sys_tty_config dac_override dac_read_search }; ++dontaudit fsadm_t self:capability net_admin; + allow fsadm_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execmem execheap }; + allow fsadm_t self:fd use; + allow fsadm_t self:fifo_file rw_fifo_file_perms; +@@ -41,10 +48,21 @@ allow fsadm_t self:msg { send receive }; + + can_exec(fsadm_t, fsadm_exec_t) + +-allow fsadm_t fsadm_tmp_t:dir manage_dir_perms; +-allow fsadm_t fsadm_tmp_t:file manage_file_perms; ++manage_dirs_pattern(fsadm_t, fsadm_var_run_t, fsadm_var_run_t) ++manage_files_pattern(fsadm_t, fsadm_var_run_t, fsadm_var_run_t) ++files_pid_filetrans(fsadm_t, fsadm_var_run_t, {dir file }) ++ ++manage_dirs_pattern(fsadm_t, fsadm_tmp_t, fsadm_tmp_t) ++manage_files_pattern(fsadm_t, fsadm_tmp_t, fsadm_tmp_t) + files_tmp_filetrans(fsadm_t, fsadm_tmp_t, { file dir }) + ++manage_dirs_pattern(fsadm_t, fsadm_tmpfs_t, fsadm_tmpfs_t) ++manage_files_pattern(fsadm_t, fsadm_tmpfs_t, fsadm_tmpfs_t) ++fs_tmpfs_filetrans(fsadm_t, fsadm_tmpfs_t, { file dir }) ++ ++files_create_boot_flag(fsadm_t) ++files_setattr_root_dirs(fsadm_t) ++ + # log files + allow fsadm_t fsadm_log_t:dir setattr; + manage_files_pattern(fsadm_t, fsadm_log_t, fsadm_log_t) +@@ -53,6 +71,7 @@ logging_log_filetrans(fsadm_t, fsadm_log_t, file) + # Enable swapping to files + allow fsadm_t swapfile_t:file { rw_file_perms swapon }; + ++kernel_get_sysvipc_info(fsadm_t) + kernel_read_system_state(fsadm_t) + kernel_read_kernel_sysctls(fsadm_t) + kernel_request_load_module(fsadm_t) +@@ -101,6 +120,8 @@ files_read_usr_files(fsadm_t) + files_read_etc_files(fsadm_t) + files_manage_lost_found(fsadm_t) + files_manage_isid_type_dirs(fsadm_t) ++# /etc/mtab is a link ++files_read_etc_runtime_files(fsadm_t) + # Write to /etc/mtab. + files_manage_etc_runtime_files(fsadm_t) + files_etc_filetrans_etc_runtime(fsadm_t, file) +@@ -112,7 +133,6 @@ files_read_isid_type_files(fsadm_t) + fs_search_auto_mountpoints(fsadm_t) + fs_getattr_xattr_fs(fsadm_t) + fs_rw_ramfs_pipes(fsadm_t) +-fs_rw_tmpfs_files(fsadm_t) + # remount file system to apply changes + fs_remount_xattr_fs(fsadm_t) + # for /dev/shm +@@ -120,6 +140,9 @@ fs_list_auto_mountpoints(fsadm_t) + fs_search_tmpfs(fsadm_t) + fs_getattr_tmpfs_dirs(fsadm_t) + fs_read_tmpfs_symlinks(fsadm_t) ++fs_manage_nfs_files(fsadm_t) ++fs_manage_cifs_files(fsadm_t) ++fs_rw_hugetlbfs_files(fsadm_t) + # Recreate /mnt/cdrom. + files_manage_mnt_dirs(fsadm_t) + # for tune2fs +@@ -133,21 +156,28 @@ storage_raw_write_fixed_disk(fsadm_t) + storage_raw_read_removable_device(fsadm_t) + storage_raw_write_removable_device(fsadm_t) + storage_read_scsi_generic(fsadm_t) ++storage_rw_fuse(fsadm_t) + storage_swapon_fixed_disk(fsadm_t) + + term_use_console(fsadm_t) + ++auth_read_passwd(fsadm_t) ++ ++init_read_state(fsadm_t) + init_use_fds(fsadm_t) + init_use_script_ptys(fsadm_t) + init_dontaudit_getattr_initctl(fsadm_t) ++init_stream_connect(fsadm_t) + + logging_send_syslog_msg(fsadm_t) +- +-miscfiles_read_localization(fsadm_t) ++logging_send_audit_msgs(fsadm_t) ++logging_stream_connect_syslog(fsadm_t) + + seutil_read_config(fsadm_t) + +-userdom_use_user_terminals(fsadm_t) ++term_use_all_inherited_terms(fsadm_t) ++ ++userdom_rw_inherited_user_tmp_pipes(fsadm_t) + + ifdef(`distro_redhat',` + optional_policy(` +@@ -165,10 +195,19 @@ optional_policy(` + cron_system_entry(fsadm_t, fsadm_exec_t) + ') + ++optional_policy(` ++ devicekit_dontaudit_read_pid_files(fsadm_t) ++ devicekit_dontaudit_rw_log(fsadm_t) ++') ++ + optional_policy(` + hal_dontaudit_write_log(fsadm_t) + ') + ++optional_policy(` ++ kdump_rw_inherited_kdumpctl_tmp_pipes(fsadm_t) ++') ++ + optional_policy(` + livecd_rw_tmp_files(fsadm_t) + ') +@@ -178,6 +217,10 @@ optional_policy(` + modutils_read_module_deps(fsadm_t) + ') + ++optional_policy(` ++ mount_read_pid_files(fsadm_t) ++') ++ + optional_policy(` + nis_use_ypbind(fsadm_t) + ') +@@ -191,6 +234,10 @@ optional_policy(` + udev_read_db(fsadm_t) + ') + ++optional_policy(` ++ virt_read_blk_images(fsadm_t) ++') ++ + optional_policy(` + xen_append_log(fsadm_t) + xen_rw_image_files(fsadm_t) +diff --git a/policy/modules/system/getty.fc b/policy/modules/system/getty.fc +index e1a1848a2a..492763873f 100644 +--- a/policy/modules/system/getty.fc ++++ b/policy/modules/system/getty.fc +@@ -3,8 +3,12 @@ + + /sbin/.*getty -- gen_context(system_u:object_r:getty_exec_t,s0) + +-/var/log/mgetty\.log.* -- gen_context(system_u:object_r:getty_log_t,s0) +-/var/log/vgetty\.log\..* -- gen_context(system_u:object_r:getty_log_t,s0) ++/usr/lib/systemd/system/[^/]*getty.* -- gen_context(system_u:object_r:getty_unit_file_t,s0) ++ ++/usr/sbin/.*getty -- gen_context(system_u:object_r:getty_exec_t,s0) ++ ++/var/log/mgetty.*\.log.* -- gen_context(system_u:object_r:getty_log_t,s0) ++/var/log/vgetty.*\.log.* -- gen_context(system_u:object_r:getty_log_t,s0) + + /var/run/mgetty\.pid.* -- gen_context(system_u:object_r:getty_var_run_t,s0) + +diff --git a/policy/modules/system/getty.if b/policy/modules/system/getty.if +index e4376aa98d..2c98c5647e 100644 +--- a/policy/modules/system/getty.if ++++ b/policy/modules/system/getty.if +@@ -96,3 +96,45 @@ interface(`getty_rw_config',` + files_search_etc($1) + allow $1 getty_etc_t:file rw_file_perms; + ') ++ ++######################################## ++## ++## Execute getty server in the getty domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`getty_systemctl',` ++ gen_require(` ++ type getty_unit_file_t; ++ type getty_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 getty_unit_file_t:file read_file_perms; ++ allow $1 getty_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, getty_t) ++') ++ ++######################################## ++## ++## Start getty unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`getty_start_services',` ++ gen_require(` ++ type getty_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 getty_unit_file_t:service start; ++') +diff --git a/policy/modules/system/getty.te b/policy/modules/system/getty.te +index f6743ea192..d99a10c072 100644 +--- a/policy/modules/system/getty.te ++++ b/policy/modules/system/getty.te +@@ -27,13 +27,24 @@ files_tmp_file(getty_tmp_t) + type getty_var_run_t; + files_pid_file(getty_var_run_t) + ++type getty_unit_file_t; ++systemd_unit_file(getty_unit_file_t) ++ ++ifdef(`enable_mcs',` ++ init_ranged_daemon_domain(getty_t, getty_exec_t, s0 - mcs_systemhigh) ++') ++ ++ifdef(`enable_mls',` ++ init_ranged_daemon_domain(getty_t, getty_exec_t, s0 - mls_systemhigh) ++') ++ + ######################################## + # + # Getty local policy + # + + # Use capabilities. +-allow getty_t self:capability { dac_override chown setgid sys_resource sys_tty_config fowner fsetid }; ++allow getty_t self:capability { dac_read_search dac_override chown setgid sys_resource sys_tty_config fowner fsetid }; + dontaudit getty_t self:capability sys_tty_config; + allow getty_t self:process { getpgid setpgid getsession signal_perms }; + allow getty_t self:fifo_file rw_fifo_file_perms; +@@ -83,8 +94,11 @@ term_use_unallocated_ttys(getty_t) + term_setattr_all_ttys(getty_t) + term_setattr_unallocated_ttys(getty_t) + term_setattr_console(getty_t) ++term_use_console(getty_t) ++term_use_usb_ttys(getty_t) + + auth_rw_login_records(getty_t) ++auth_use_nsswitch(getty_t) + + init_rw_utmp(getty_t) + init_use_script_ptys(getty_t) +@@ -94,7 +108,6 @@ locallogin_domtrans(getty_t) + + logging_send_syslog_msg(getty_t) + +-miscfiles_read_localization(getty_t) + + ifdef(`distro_gentoo',` + # Gentoo default /etc/issue makes agetty +@@ -113,19 +126,27 @@ ifdef(`distro_ubuntu',` + ') + ') + +-tunable_policy(`console_login',` ++tunable_policy(`login_console_enabled',` + # Support logging in from /dev/console + term_use_console(getty_t) + ',` + term_dontaudit_use_console(getty_t) + ') + ++optional_policy(` ++ hostname_exec(getty_t) ++') ++ ++optional_policy(` ++ lockdev_manage_files(getty_t) ++') ++ + optional_policy(` + mta_send_mail(getty_t) + ') + + optional_policy(` +- nscd_use(getty_t) ++ plymouthd_exec_plymouth(getty_t) + ') + + optional_policy(` +diff --git a/policy/modules/system/hostname.fc b/policy/modules/system/hostname.fc +index 9dfecf77c4..6d00f5c136 100644 +--- a/policy/modules/system/hostname.fc ++++ b/policy/modules/system/hostname.fc +@@ -1,2 +1,4 @@ + + /bin/hostname -- gen_context(system_u:object_r:hostname_exec_t,s0) ++ ++/usr/bin/hostname -- gen_context(system_u:object_r:hostname_exec_t,s0) +diff --git a/policy/modules/system/hostname.if b/policy/modules/system/hostname.if +index 187f04f836..cf0af09914 100644 +--- a/policy/modules/system/hostname.if ++++ b/policy/modules/system/hostname.if +@@ -53,7 +53,6 @@ interface(`hostname_run',` + ## Domain allowed access. + ##
      + ## +-## + # + interface(`hostname_exec',` + gen_require(` +diff --git a/policy/modules/system/hostname.te b/policy/modules/system/hostname.te +index 24a78897a2..a3d8f1af3e 100644 +--- a/policy/modules/system/hostname.te ++++ b/policy/modules/system/hostname.te +@@ -23,39 +23,50 @@ dontaudit hostname_t self:capability sys_tty_config; + + kernel_list_proc(hostname_t) + kernel_read_proc_symlinks(hostname_t) ++kernel_read_network_state(hostname_t) + + dev_read_sysfs(hostname_t) + # Early devtmpfs, before udev relabel + dev_dontaudit_rw_generic_chr_files(hostname_t) + ++domain_dontaudit_leaks(hostname_t) + domain_use_interactive_fds(hostname_t) + + files_read_etc_files(hostname_t) ++files_dontaudit_leaks(hostname_t) + files_dontaudit_search_var(hostname_t) + # for when /usr is not mounted: + files_dontaudit_search_isid_type_dirs(hostname_t) + + fs_getattr_xattr_fs(hostname_t) + fs_search_auto_mountpoints(hostname_t) ++fs_dontaudit_leaks(hostname_t) + fs_dontaudit_use_tmpfs_chr_dev(hostname_t) + + term_dontaudit_use_console(hostname_t) +-term_use_all_ttys(hostname_t) +-term_use_all_ptys(hostname_t) ++term_use_all_inherited_terms(hostname_t) + + init_use_fds(hostname_t) + init_use_script_fds(hostname_t) + init_use_script_ptys(hostname_t) ++init_rw_inherited_script_tmp_files(hostname_t) + + logging_send_syslog_msg(hostname_t) + +-miscfiles_read_localization(hostname_t) + + sysnet_dontaudit_rw_dhcpc_udp_sockets(hostname_t) + sysnet_dontaudit_rw_dhcpc_unix_stream_sockets(hostname_t) + sysnet_read_config(hostname_t) + sysnet_dns_name_resolve(hostname_t) + ++optional_policy(` ++ kdump_dontaudit_inherited_kdumpctl_tmp_pipes(hostname_t) ++') ++ ++optional_policy(` ++ mock_dontaudit_write_lib_chr_files(hostname_t) ++') ++ + optional_policy(` + nis_use_ypbind(hostname_t) + ') +diff --git a/policy/modules/system/hotplug.fc b/policy/modules/system/hotplug.fc +index caf736b3bc..91c4c6f23d 100644 +--- a/policy/modules/system/hotplug.fc ++++ b/policy/modules/system/hotplug.fc +@@ -7,5 +7,8 @@ + /sbin/hotplug -- gen_context(system_u:object_r:hotplug_exec_t,s0) + /sbin/netplugd -- gen_context(system_u:object_r:hotplug_exec_t,s0) + ++/usr/sbin/hotplug -- gen_context(system_u:object_r:hotplug_exec_t,s0) ++/usr/sbin/netplugd -- gen_context(system_u:object_r:hotplug_exec_t,s0) ++ + /var/run/usb(/.*)? gen_context(system_u:object_r:hotplug_var_run_t,s0) + /var/run/hotplug(/.*)? gen_context(system_u:object_r:hotplug_var_run_t,s0) +diff --git a/policy/modules/system/hotplug.if b/policy/modules/system/hotplug.if +index 40eb10c602..2a0a32c2da 100644 +--- a/policy/modules/system/hotplug.if ++++ b/policy/modules/system/hotplug.if +@@ -34,7 +34,7 @@ interface(`hotplug_domtrans',` + # + interface(`hotplug_exec',` + gen_require(` +- type hotplug_t; ++ type hotplug_exec_t; + ') + + corecmd_search_bin($1) +diff --git a/policy/modules/system/hotplug.te b/policy/modules/system/hotplug.te +index b2097e7434..0a49e14ba3 100644 +--- a/policy/modules/system/hotplug.te ++++ b/policy/modules/system/hotplug.te +@@ -23,7 +23,7 @@ files_pid_file(hotplug_var_run_t) + # + + allow hotplug_t self:capability { net_admin sys_tty_config mknod sys_rawio }; +-dontaudit hotplug_t self:capability { sys_module sys_admin sys_ptrace sys_tty_config }; ++dontaudit hotplug_t self:capability { sys_module sys_admin sys_tty_config }; + # for access("/etc/bashrc", X_OK) on Red Hat + dontaudit hotplug_t self:capability { dac_override dac_read_search }; + allow hotplug_t self:process { setpgid getsession getattr signal_perms }; +@@ -52,7 +52,6 @@ kernel_rw_net_sysctls(hotplug_t) + + files_read_kernel_modules(hotplug_t) + +-corenet_all_recvfrom_unlabeled(hotplug_t) + corenet_all_recvfrom_netlabel(hotplug_t) + corenet_tcp_sendrecv_generic_if(hotplug_t) + corenet_udp_sendrecv_generic_if(hotplug_t) +@@ -96,6 +95,8 @@ init_domtrans_script(hotplug_t) + # kernel threads inherit from shared descriptor table used by init + init_dontaudit_rw_initctl(hotplug_t) + ++auth_use_nsswitch(hotplug_t) ++ + logging_send_syslog_msg(hotplug_t) + logging_search_logs(hotplug_t) + +@@ -103,9 +104,6 @@ logging_search_logs(hotplug_t) + libs_read_lib_files(hotplug_t) + + miscfiles_read_hwdata(hotplug_t) +-miscfiles_read_localization(hotplug_t) +- +-seutil_dontaudit_search_config(hotplug_t) + + sysnet_read_config(hotplug_t) + +@@ -163,14 +161,6 @@ optional_policy(` + mta_send_mail(hotplug_t) + ') + +-optional_policy(` +- nis_use_ypbind(hotplug_t) +-') +- +-optional_policy(` +- nscd_use(hotplug_t) +-') +- + optional_policy(` + seutil_sigchld_newrole(hotplug_t) + ') +diff --git a/policy/modules/system/init.fc b/policy/modules/system/init.fc +index bc0ffc84ed..605c85da24 100644 +--- a/policy/modules/system/init.fc ++++ b/policy/modules/system/init.fc +@@ -1,6 +1,9 @@ + # + # /etc + # ++/etc/init\.d/.* -- gen_context(system_u:object_r:initrc_exec_t,s0) ++/etc/machine-id -- gen_context(system_u:object_r:machineid_t,s0) ++ + /etc/rc\.d/rc -- gen_context(system_u:object_r:initrc_exec_t,s0) + /etc/rc\.d/rc\.[^/]+ -- gen_context(system_u:object_r:initrc_exec_t,s0) + +@@ -26,6 +29,11 @@ ifdef(`distro_gentoo', ` + /lib/rc/init\.d(/.*)? gen_context(system_u:object_r:initrc_state_t,s0) + ') + ++# ++# /sbin ++# ++/bin/systemd -- gen_context(system_u:object_r:init_exec_t,s0) ++ + # + # /sbin + # +@@ -42,20 +50,36 @@ ifdef(`distro_gentoo', ` + # + /usr/bin/sepg_ctl -- gen_context(system_u:object_r:initrc_exec_t,s0) + ++/usr/sbin/init(ng)? -- gen_context(system_u:object_r:init_exec_t,s0) ++# because nowadays, /sbin/init is often a symlink to /sbin/upstart ++/usr/sbin/upstart -- gen_context(system_u:object_r:init_exec_t,s0) ++ ++/usr/lib/systemd/[^/]* -- gen_context(system_u:object_r:init_exec_t,s0) ++/usr/lib/systemd/rhel[^/]* -- gen_context(system_u:object_r:initrc_exec_t,s0) ++/usr/lib/systemd/system-generators/[^/]* -- gen_context(system_u:object_r:init_exec_t,s0) ++ + /usr/libexec/dcc/start-.* -- gen_context(system_u:object_r:initrc_exec_t,s0) + /usr/libexec/dcc/stop-.* -- gen_context(system_u:object_r:initrc_exec_t,s0) + + /usr/sbin/apachectl -- gen_context(system_u:object_r:initrc_exec_t,s0) + /usr/sbin/open_init_pty -- gen_context(system_u:object_r:initrc_exec_t,s0) ++/usr/sbin/startx -- gen_context(system_u:object_r:initrc_exec_t,s0) ++/usr/bin/systemd -- gen_context(system_u:object_r:init_exec_t,s0) ++ ++/usr/share/system-config-services/system-config-services-mechanism\.py -- gen_context(system_u:object_r:initrc_exec_t,s0) + + # + # /var + # ++/var/lib/systemd(/.*)? gen_context(system_u:object_r:init_var_lib_t,s0) + /var/run/initctl -p gen_context(system_u:object_r:initctl_t,s0) ++/var/run/systemd/initctl/fifo -p gen_context(system_u:object_r:initctl_t,s0) + /var/run/utmp -- gen_context(system_u:object_r:initrc_var_run_t,s0) + /var/run/runlevel\.dir gen_context(system_u:object_r:initrc_var_run_t,s0) + /var/run/random-seed -- gen_context(system_u:object_r:initrc_var_run_t,s0) + /var/run/setmixer_flag -- gen_context(system_u:object_r:initrc_var_run_t,s0) ++/var/run/systemd/machine-id -- gen_context(system_u:object_r:machineid_t,s0) ++/var/run/systemd/journal/dev-log -s gen_context(system_u:object_r:devlog_t,s0) + + ifdef(`distro_debian',` + /var/run/hotkey-setup -- gen_context(system_u:object_r:initrc_var_run_t,s0) +@@ -74,3 +98,4 @@ ifdef(`distro_suse', ` + /var/run/setleds-on -- gen_context(system_u:object_r:initrc_var_run_t,s0) + /var/run/sysconfig(/.*)? gen_context(system_u:object_r:initrc_var_run_t,s0) + ') ++/var/run/systemd(/.*)? gen_context(system_u:object_r:init_var_run_t,s0) +diff --git a/policy/modules/system/init.if b/policy/modules/system/init.if +index 79a45f62e2..f574f5444a 100644 +--- a/policy/modules/system/init.if ++++ b/policy/modules/system/init.if +@@ -1,5 +1,21 @@ + ## System initialization programs (init and init scripts). + ++###################################### ++## ++## initrc stub interface. No access allowed. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`init_stub_initrc',` ++ gen_require(` ++ type initrc_t; ++ ') ++') ++ + ######################################## + ## + ## Create a file type used for init scripts. +@@ -106,7 +122,11 @@ interface(`init_domain',` + role system_r types $1; + + domtrans_pattern(init_t, $2, $1) ++ allow init_t $1:unix_stream_socket create_stream_socket_perms; ++ allow $1 init_t:unix_dgram_socket sendto; + ++ allow init_t $1:process2 { nnp_transition nosuid_transition }; ++ + ifdef(`hide_broken_symptoms',` + # RHEL4 systems seem to have a stray + # fds open from the initrd +@@ -115,6 +135,25 @@ interface(`init_domain',` + ') + ') + ') ++######################################## ++## ++## Allow SELinux Domain trasition from sytemd ++## into confined domain with NoNewPrivileges ++## Systemd Security feature. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_nnp_daemon_domain',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow init_t $1:process2 { nnp_transition nosuid_transition }; ++') + + ######################################## + ## +@@ -192,50 +231,43 @@ interface(`init_ranged_domain',` + interface(`init_daemon_domain',` + gen_require(` + attribute direct_run_init, direct_init, direct_init_entry; +- type initrc_t; ++ type init_t; + role system_r; + attribute daemon; ++ attribute initrc_transition_domain; ++ attribute initrc_domain; + ') + + typeattribute $1 daemon; ++ typeattribute $2 direct_init_entry; + + domain_type($1) + domain_entry_file($1, $2) + +- role system_r types $1; +- +- domtrans_pattern(initrc_t, $2, $1) +- +- # daemons started from init will +- # inherit fds from init for the console +- init_dontaudit_use_fds($1) +- term_dontaudit_use_console($1) +- +- # init script ptys are the stdin/out/err +- # when using run_init +- init_use_script_ptys($1) ++ type_transition initrc_domain $2:process $1; + + ifdef(`direct_sysadm_daemon',` +- domtrans_pattern(direct_run_init, $2, $1) +- allow direct_run_init $1:process { noatsecure siginh rlimitinh }; +- ++ type_transition direct_run_init $2:process $1; + typeattribute $1 direct_init; +- typeattribute $2 direct_init_entry; +- +- userdom_dontaudit_use_user_terminals($1) + ') ++') + +- ifdef(`hide_broken_symptoms',` +- # RHEL4 systems seem to have a stray +- # fds open from the initrd +- ifdef(`distro_rhel4',` +- kernel_dontaudit_use_fds($1) +- ') +- ') ++####################################### ++## ++## Create initrc domain. ++## ++## ++## ++## Type to be used as a initrc daemon domain. ++## ++## ++# ++interface(`init_initrc_domain',` ++ gen_require(` ++ attribute initrc_domain; ++ ') + +- optional_policy(` +- nscd_use($1) +- ') ++ typeattribute $1 initrc_domain; + ') + + ######################################## +@@ -283,17 +315,20 @@ interface(`init_daemon_domain',` + interface(`init_ranged_daemon_domain',` + gen_require(` + type initrc_t; ++ type init_t; + ') + +- init_daemon_domain($1, $2) ++# init_daemon_domain($1, $2) + + ifdef(`enable_mcs',` + range_transition initrc_t $2:process $3; ++ range_transition init_t $2:process $3; + ') + + ifdef(`enable_mls',` + range_transition initrc_t $2:process $3; + mls_rangetrans_target($1) ++ range_transition init_t $2:process $3; + ') + ') + +@@ -336,23 +371,19 @@ interface(`init_ranged_daemon_domain',` + # + interface(`init_system_domain',` + gen_require(` +- type initrc_t; ++ type init_t; + role system_r; ++ attribute initrc_transition_domain; ++ attribute systemprocess, systemprocess_entry; ++ attribute initrc_domain; + ') + ++ typeattribute $1 systemprocess; + application_domain($1, $2) +- + role system_r types $1; ++ typeattribute $2 systemprocess_entry; + +- domtrans_pattern(initrc_t, $2, $1) +- +- ifdef(`hide_broken_symptoms',` +- # RHEL4 systems seem to have a stray +- # fds open from the initrd +- ifdef(`distro_rhel4',` +- kernel_dontaudit_use_fds($1) +- ') +- ') ++ type_transition initrc_domain $2:process $1; + ') + + ######################################## +@@ -401,20 +432,41 @@ interface(`init_system_domain',` + interface(`init_ranged_system_domain',` + gen_require(` + type initrc_t; ++ type init_t; + ') + + init_system_domain($1, $2) + + ifdef(`enable_mcs',` + range_transition initrc_t $2:process $3; ++ range_transition init_t $2:process $3; + ') + + ifdef(`enable_mls',` + range_transition initrc_t $2:process $3; ++ range_transition init_t $2:process $3; + mls_rangetrans_target($1) + ') + ') + ++###################################### ++## ++## Allow domain dyntransition to init_t domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`init_dyntrans',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ dyntrans_pattern($1, init_t) ++') ++ + ######################################## + ## + ## Mark the file type as a daemon run dir, allowing initrc_t +@@ -458,6 +510,7 @@ interface(`init_domtrans',` + ') + + domtrans_pattern($1, init_exec_t, init_t) ++ allow $1 init_exec_t:file map; + ') + + ######################################## +@@ -469,7 +522,6 @@ interface(`init_domtrans',` + ## Domain allowed access. + ## + ## +-## + # + interface(`init_exec',` + gen_require(` +@@ -478,6 +530,48 @@ interface(`init_exec',` + + corecmd_search_bin($1) + can_exec($1, init_exec_t) ++ ++ optional_policy(` ++ systemd_exec_systemctl($1) ++ ') ++') ++ ++####################################### ++## ++## Check access to the init/systemd executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_access_check',` ++ gen_require(` ++ type init_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ allow $1 init_exec_t:file { getattr_file_perms execute }; ++') ++ ++####################################### ++## ++## Dontaudit getattr on the init program. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`init_dontaudit_getattr_exec',` ++ gen_require(` ++ type init_exec_t; ++ ') ++ ++ dontaudit $1 init_exec_t:file getattr; + ') + + ######################################## +@@ -564,6 +658,107 @@ interface(`init_sigchld',` + allow $1 init_t:process sigchld; + ') + ++######################################## ++## ++## Send generic signals to init. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_signal',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:process signal; ++') ++ ++######################################## ++## ++## Create objects in the init_var_lib_t directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created ++## ++## ++## ++## ++## The object class. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`init_var_lib_filetrans',` ++ gen_require(` ++ type init_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ filetrans_pattern($1, init_var_lib_t, $2, $3, $4) ++') ++ ++######################################### ++## ++## Abstract socket service activation (systemd). ++## ++## ++## ++## The domain to be started by systemd socket activation. ++## ++## ++# ++interface(`init_abstract_socket_activation',` ++ ifdef(`init_systemd',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow init_t $1:unix_stream_socket create_stream_socket_perms; ++ ') ++') ++ ++######################################### ++## ++## Named socket service activation (systemd). ++## ++## ++## ++## The domain to be started by systemd socket activation. ++## ++## ++## ++## ++## The domain socket file type. ++## ++## ++# ++interface(`init_named_socket_activation',` ++ ifdef(`init_systemd',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow init_t $1:unix_dgram_socket create_socket_perms; ++ allow init_t $1:unix_stream_socket create_stream_socket_perms; ++ allow init_t $2:dir manage_dir_perms; ++ allow init_t $2:fifo_file manage_fifo_file_perms; ++ allow init_t $2:sock_file manage_sock_file_perms; ++ ') ++') ++ + ######################################## + ## + ## Connect to init with a unix socket. +@@ -576,10 +771,66 @@ interface(`init_sigchld',` + # + interface(`init_stream_connect',` + gen_require(` +- type init_t; ++ type init_t, init_var_run_t; + ') + +- allow $1 init_t:unix_stream_socket connectto; ++ files_search_pids($1) ++ stream_connect_pattern($1, init_var_run_t, init_var_run_t, init_t) ++ allow $1 init_t:unix_stream_socket getattr; ++') ++ ++####################################### ++## ++## Dontaudit Connect to init with a unix socket. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_stream_connect',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ dontaudit $1 init_t:unix_stream_socket connectto; ++') ++ ++###################################### ++## ++## Dontaudit getattr to init with a unix socket. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_getattr_stream_socket',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ dontaudit $1 init_t:unix_stream_socket getattr; ++') ++ ++###################################### ++## ++## Dontaudit read and write to init with a unix socket. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_rw_stream_socket',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ dontaudit $1 init_t:unix_stream_socket { getattr read write ioctl }; + ') + + ######################################## +@@ -743,22 +994,24 @@ interface(`init_write_initctl',` + interface(`init_telinit',` + gen_require(` + type initctl_t; ++ type init_t; + ') + ++ corecmd_exec_bin($1) ++ + dev_list_all_dev_nodes($1) + allow $1 initctl_t:fifo_file rw_fifo_file_perms; + + init_exec($1) + +- tunable_policy(`init_upstart',` +- gen_require(` +- type init_t; +- ') +- +- # upstart uses a datagram socket instead of initctl pipe +- allow $1 self:unix_dgram_socket create_socket_perms; +- allow $1 init_t:unix_dgram_socket sendto; +- ') ++ ps_process_pattern($1, init_t) ++ allow $1 init_t:process signal; ++ dontaudit $1 self:capability net_admin; ++ # upstart uses a datagram socket instead of initctl pipe ++ allow $1 self:unix_dgram_socket create_socket_perms; ++ allow $1 init_t:unix_dgram_socket sendto; ++ #576913 ++ allow $1 init_t:unix_stream_socket connectto; + ') + + ######################################## +@@ -787,7 +1040,7 @@ interface(`init_rw_initctl',` + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +@@ -830,11 +1083,12 @@ interface(`init_script_file_entry_type',` + # + interface(`init_spec_domtrans_script',` + gen_require(` +- type initrc_t, initrc_exec_t; ++ type initrc_t; ++ attribute init_script_file_type; + ') + + files_list_etc($1) +- spec_domtrans_pattern($1, initrc_exec_t, initrc_t) ++ spec_domtrans_pattern($1, init_script_file_type, initrc_t) + + ifdef(`distro_gentoo',` + gen_require(` +@@ -845,11 +1099,11 @@ interface(`init_spec_domtrans_script',` + ') + + ifdef(`enable_mcs',` +- range_transition $1 initrc_exec_t:process s0; ++ range_transition $1 init_script_file_type:process s0; + ') + + ifdef(`enable_mls',` +- range_transition $1 initrc_exec_t:process s0 - mls_systemhigh; ++ range_transition $1 init_script_file_type:process s0 - mls_systemhigh; + ') + ') + +@@ -865,19 +1119,41 @@ interface(`init_spec_domtrans_script',` + # + interface(`init_domtrans_script',` + gen_require(` +- type initrc_t, initrc_exec_t; ++ type initrc_t; ++ attribute init_script_file_type; ++ attribute initrc_transition_domain; + ') ++ typeattribute $1 initrc_transition_domain; + + files_list_etc($1) +- domtrans_pattern($1, initrc_exec_t, initrc_t) ++ domtrans_pattern($1, init_script_file_type, initrc_t) + + ifdef(`enable_mcs',` +- range_transition $1 initrc_exec_t:process s0; ++ range_transition $1 init_script_file_type:process s0; + ') + + ifdef(`enable_mls',` +- range_transition $1 initrc_exec_t:process s0 - mls_systemhigh; ++ range_transition $1 init_script_file_type:process s0 - mls_systemhigh; ++ ') ++') ++ ++######################################## ++## ++## Execute a file in a bin directory ++## in the initrc_t domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_bin_domtrans_spec',` ++ gen_require(` ++ type initrc_t; + ') ++ ++ corecmd_bin_domtrans($1, initrc_t) + ') + + ######################################## +@@ -933,9 +1209,14 @@ interface(`init_script_file_domtrans',` + interface(`init_labeled_script_domtrans',` + gen_require(` + type initrc_t; ++ attribute initrc_transition_domain; + ') + ++ typeattribute $1 initrc_transition_domain; ++ # service script searches all filesystems via mountpoint ++ fs_search_all($1) + domtrans_pattern($1, $2, initrc_t) ++ allow $1 $2:file ioctl; + files_search_etc($1) + ') + +@@ -1012,26 +1293,27 @@ interface(`init_read_state',` + + ######################################## + ## +-## Ptrace init ++## Dontaudit read the process state (/proc/pid) of init. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`init_ptrace',` ++interface(`init_dontaudit_read_state',` + gen_require(` + type init_t; + ') + +- allow $1 init_t:process ptrace; ++ dontaudit $1 init_t:dir search_dir_perms; ++ dontaudit $1 init_t:file read_file_perms; ++ dontaudit $1 init_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## +-## Write an init script unnamed pipe. ++## Read the process keyring of init. + ## + ## + ## +@@ -1039,17 +1321,17 @@ interface(`init_ptrace',` + ## + ## + # +-interface(`init_write_script_pipes',` ++interface(`init_read_key',` + gen_require(` +- type initrc_t; ++ type init_t; + ') + +- allow $1 initrc_t:fifo_file write; ++ allow $1 init_t:key read; + ') + + ######################################## + ## +-## Get the attribute of init script entrypoint files. ++## Write the process keyring of init. + ## + ## + ## +@@ -1057,37 +1339,38 @@ interface(`init_write_script_pipes',` + ## + ## + # +-interface(`init_getattr_script_files',` ++interface(`init_write_key',` + gen_require(` +- type initrc_exec_t; ++ type init_t; + ') + +- files_list_etc($1) +- allow $1 initrc_exec_t:file getattr; ++ allow $1 init_t:key read; + ') + + ######################################## + ## +-## Read init scripts. ++## Ptrace init + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`init_read_script_files',` ++interface(`init_ptrace',` + gen_require(` +- type initrc_exec_t; ++ type init_t; + ') + +- files_search_etc($1) +- allow $1 initrc_exec_t:file read_file_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 init_t:process ptrace; ++ ') + ') + + ######################################## + ## +-## Execute init scripts in the caller domain. ++## Write an init script unnamed pipe. + ## + ## + ## +@@ -1095,9 +1378,65 @@ interface(`init_read_script_files',` + ## + ## + # +-interface(`init_exec_script_files',` ++interface(`init_write_script_pipes',` + gen_require(` +- type initrc_exec_t; ++ type initrc_t; ++ ') ++ ++ allow $1 initrc_t:fifo_file write; ++') ++ ++######################################## ++## ++## Get the attribute of init script entrypoint files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_getattr_script_files',` ++ gen_require(` ++ type initrc_exec_t; ++ ') ++ ++ files_list_etc($1) ++ allow $1 initrc_exec_t:file getattr; ++') ++ ++######################################## ++## ++## Read init scripts. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_read_script_files',` ++ gen_require(` ++ type initrc_exec_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 initrc_exec_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Execute init scripts in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_exec_script_files',` ++ gen_require(` ++ type initrc_exec_t; + ') + + files_list_etc($1) +@@ -1123,6 +1462,25 @@ interface(`init_getattr_all_script_files',` + allow $1 init_script_file_type:file getattr; + ') + ++######################################## ++## ++## Allow the specified domain to modify the systemd configuration of ++## all init scripts. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_config_all_script_files',` ++ gen_require(` ++ attribute init_script_file_type; ++ ') ++ ++ allow $1 init_script_file_type:service all_service_perms; ++') ++ + ######################################## + ## + ## Read all init script files. +@@ -1142,6 +1500,24 @@ interface(`init_read_all_script_files',` + allow $1 init_script_file_type:file read_file_perms; + ') + ++####################################### ++## ++## Dontaudit getattr all init script files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_getattr_all_script_files',` ++ gen_require(` ++ attribute init_script_file_type; ++ ') ++ ++ dontaudit $1 init_script_file_type:file getattr; ++') ++ + ####################################### + ## + ## Dontaudit read all init script files. +@@ -1195,12 +1571,7 @@ interface(`init_read_script_state',` + ') + + kernel_search_proc($1) +- read_files_pattern($1, initrc_t, initrc_t) +- read_lnk_files_pattern($1, initrc_t, initrc_t) +- list_dirs_pattern($1, initrc_t, initrc_t) +- +- # should move this to separate interface +- allow $1 initrc_t:process getattr; ++ ps_process_pattern($1, initrc_t) + ') + + ######################################## +@@ -1312,6 +1683,24 @@ interface(`init_signal_script',` + allow $1 initrc_t:process signal; + ') + ++######################################## ++## ++## Send kill signals to init scripts. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_sigkill_script',` ++ gen_require(` ++ type initrc_t; ++ ') ++ ++ allow $1 initrc_t:process sigkill; ++') ++ + ######################################## + ## + ## Send null signals to init scripts. +@@ -1437,6 +1826,27 @@ interface(`init_dbus_send_script',` + allow $1 initrc_t:dbus send_msg; + ') + ++######################################## ++## ++## Send and receive messages from ++## init over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_dbus_chat',` ++ gen_require(` ++ type init_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 init_t:dbus send_msg; ++ allow init_t $1:dbus send_msg; ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -1545,6 +1955,25 @@ interface(`init_getattr_script_status_files',` + getattr_files_pattern($1, initrc_state_t, initrc_state_t) + ') + ++######################################## ++## ++## Manage init script ++## status files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_manage_script_status_files',` ++ gen_require(` ++ type initrc_state_t; ++ ') ++ ++ manage_files_pattern($1, initrc_state_t, initrc_state_t) ++') ++ + ######################################## + ## + ## Do not audit attempts to read init script +@@ -1603,6 +2032,24 @@ interface(`init_rw_script_tmp_files',` + rw_files_pattern($1, initrc_tmp_t, initrc_tmp_t) + ') + ++######################################## ++## ++## Read and write init script inherited temporary data. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_rw_inherited_script_tmp_files',` ++ gen_require(` ++ type initrc_tmp_t; ++ ') ++ ++ allow $1 initrc_tmp_t:file rw_inherited_file_perms; ++') ++ + ######################################## + ## + ## Create files in a init script +@@ -1675,6 +2122,43 @@ interface(`init_read_utmp',` + allow $1 initrc_var_run_t:file read_file_perms; + ') + ++######################################## ++## ++## Read utmp. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_read_machineid',` ++ gen_require(` ++ type machineid_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 machineid_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read utmp. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_read_utmp',` ++ gen_require(` ++ type initrc_var_run_t; ++ ') ++ ++ dontaudit $1 initrc_var_run_t:file read_file_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to write utmp. +@@ -1765,7 +2249,7 @@ interface(`init_dontaudit_rw_utmp',` + type initrc_var_run_t; + ') + +- dontaudit $1 initrc_var_run_t:file { getattr read write append lock }; ++ dontaudit $1 initrc_var_run_t:file rw_file_perms; + ') + + ######################################## +@@ -1806,6 +2290,133 @@ interface(`init_pid_filetrans_utmp',` + files_pid_filetrans($1, initrc_var_run_t, file, "utmp") + ') + ++###################################### ++## ++## Allow search directory in the /run/systemd directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_search_pid_dirs',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ allow $1 init_var_run_t:dir search_dir_perms; ++') ++ ++###################################### ++## ++## Allow listing of the /run/systemd directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_list_pid_dirs',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ allow $1 init_var_run_t:dir list_dir_perms; ++') ++ ++####################################### ++## ++## Create a directory in the /run/systemd directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_create_pid_dirs',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ allow $1 init_var_run_t:dir list_dir_perms; ++ create_dirs_pattern($1, init_var_run_t, init_var_run_t) ++') ++ ++####################################### ++## ++## Create objects in /run/systemd directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`init_pid_filetrans',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ filetrans_pattern($1, init_var_run_t, $2, $3, $4) ++') ++ ++####################################### ++## ++## Create objects in /run/systemd directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`init_named_pid_filetrans',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ filetrans_pattern($1, init_var_run_t, $2, $3, $4) ++') ++ + ######################################## + ## + ## Allow the specified domain to connect to daemon with a tcp socket +@@ -1840,3 +2451,566 @@ interface(`init_udp_recvfrom_all_daemons',` + ') + corenet_udp_recvfrom_labeled($1, daemon) + ') ++ ++######################################## ++## ++## Transition to system_r when execute an init script ++## ++## ++##

      ++## Execute a init script in a specified role ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Role to transition from. ++## ++## ++# ++interface(`init_script_role_transition',` ++ gen_require(` ++ attribute init_script_file_type; ++ ') ++ ++ role_transition $1 init_script_file_type system_r; ++') ++ ++######################################## ++## ++## dontaudit read and write an leaked init scrip file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`init_dontaudit_script_leaks',` ++ gen_require(` ++ type initrc_t; ++ ') ++ ++ dontaudit $1 initrc_t:socket_class_set { read write }; ++ dontaudit $1 initrc_t:shm rw_shm_perms; ++ init_dontaudit_use_script_ptys($1) ++ init_dontaudit_use_script_fds($1) ++') ++ ++####################################### ++## ++## Allow the specified domain to ioctl an ++## init with a unix domain stream sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_ioctl_stream_sockets',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:unix_stream_socket ioctl; ++') ++ ++######################################## ++## ++## Allow the specified domain to read/write to ++## init with a unix domain stream sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_rw_stream_sockets',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:unix_stream_socket rw_stream_socket_perms; ++') ++ ++####################################### ++## ++## Allow the specified domain to write to ++## init sock file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_write_pid_socket',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ allow $1 init_var_run_t:sock_file write; ++') ++ ++######################################## ++## ++## Send a message to init over a unix domain ++## datagram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_dgram_send',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:unix_dgram_socket sendto; ++') ++ ++######################################## ++## ++## Send a message to init over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_stream_send',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:unix_stream_socket sendto; ++') ++ ++######################################## ++## ++## Create a file type used for init socket files. ++## ++## ++##

      ++## This defines a type that init can create sock_file within for ++## impersonation purposes ++##

      ++##
      ++## ++## ++## Type to be used for a sock file. ++## ++## ++## ++# ++interface(`init_sock_file',` ++ gen_require(` ++ attribute init_sock_file_type; ++ ') ++ ++ typeattribute $1 init_sock_file_type; ++ ++') ++ ++######################################## ++## ++## Read init unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_read_pipes',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ read_fifo_files_pattern($1, init_var_run_t, init_var_run_t) ++') ++ ++######################################## ++## ++## Read/Write init unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_rw_pipes',` ++ gen_require(` ++ type init_var_run_t; ++ ') ++ ++ rw_fifo_files_pattern($1, init_var_run_t, init_var_run_t) ++') ++ ++####################################### ++## ++## Read and write init TCP sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_rw_tcp_sockets',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:tcp_socket { read write getattr getopt setopt }; ++') ++ ++######################################## ++## ++## Get the system status information from init ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_status',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system status; ++ allow $1 init_t:service status; ++') ++ ++######################################## ++## ++## Tell init to reboot the system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_reboot',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system reboot; ++ systemd_config_power_services($1) ++') ++ ++######################################## ++## ++## Tell init to enable the services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_enable_services',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system enable; ++') ++ ++######################################## ++## ++## Tell init to disable the services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_disable_services',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system disable; ++') ++ ++######################################## ++## ++## Tell init to reload the services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_reload_services',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system reload; ++') ++ ++######################################## ++## ++## Tell init to halt the system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_halt',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system halt; ++ systemd_config_power_services($1) ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_undefined',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:system undefined; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_start_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service start; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_enable_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service enable; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_disable_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service disable; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_stop_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service stop; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_reload_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service reload; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_status_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service status; ++') ++ ++######################################## ++## ++## Tell init to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_manage_transient_unit',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:service manage_service_perms; ++') ++ ++######################################## ++## ++## Transition to init named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_filetrans_named_content',` ++ gen_require(` ++ type init_var_run_t; ++ type initrc_var_run_t; ++ type machineid_t; ++ type initctl_t; ++ type systemd_unit_file_t; ++ ') ++ ++ files_pid_filetrans($1, initrc_var_run_t, file, "utmp") ++ files_pid_filetrans($1, init_var_run_t, file, "random-seed") ++ files_etc_filetrans($1, machineid_t, file, "machine-id" ) ++ files_pid_filetrans($1, initctl_t, fifo_file, "fifo" ) ++ init_pid_filetrans($1, systemd_unit_file_t, dir, "generator") ++ init_pid_filetrans($1, systemd_unit_file_t, dir, "system") ++') ++ ++######################################## ++## ++## Read systemd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_read_var_lib_files',` ++ gen_require(` ++ type init_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, init_var_lib_t, init_var_lib_t) ++') ++ ++######################################## ++## ++## Connect to init with a unix socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_stream_connectto',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 init_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## Allow caller domain to run bpftool. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`init_prog_run_bpf',` ++ gen_require(` ++ type init_t; ++ ') ++ ++ allow $1 init_t:bpf { map_create map_read map_write prog_load prog_run }; ++') ++ +diff --git a/policy/modules/system/init.te b/policy/modules/system/init.te +index 17eda24801..ecf2e25b5a 100644 +--- a/policy/modules/system/init.te ++++ b/policy/modules/system/init.te +@@ -11,10 +11,31 @@ gen_require(` + + ## + ##

      +-## Enable support for upstart as the init program. ++## Allow all daemons to use tcp wrappers. + ##

      + ##
      +-gen_tunable(init_upstart, false) ++gen_tunable(daemons_use_tcp_wrapper, false) ++ ++## ++##

      ++## Allow all daemons the ability to read/write terminals ++##

      ++##
      ++gen_tunable(daemons_use_tty, false) ++ ++## ++##

      ++## Allow all daemons to write corefiles to / ++##

      ++##
      ++gen_tunable(daemons_dump_core, false) ++ ++## ++##

      ++## Enable cluster mode for daemons. ++##

      ++##
      ++gen_tunable(daemons_enable_cluster_mode, false) + + # used for direct running of init scripts + # by admin domains +@@ -25,9 +46,17 @@ attribute direct_init_entry; + attribute init_script_domain_type; + attribute init_script_file_type; + attribute init_run_all_scripts_domain; ++attribute initrc_transition_domain; ++# Attribute used for systemd so domains can allow systemd to create sock_files ++attribute init_sock_file_type; + + # Mark process types as daemons + attribute daemon; ++attribute systemprocess; ++attribute systemprocess_entry; ++ ++# Mark process types as initrc domain ++attribute initrc_domain; + + # Mark file type as a daemon run directory + attribute daemonrundir; +@@ -35,12 +64,20 @@ attribute daemonrundir; + # + # init_t is the domain of the init process. + # +-type init_t; ++type init_t, initrc_transition_domain; + type init_exec_t; + domain_type(init_t) + domain_entry_file(init_t, init_exec_t) ++domain_role_change_exemption(init_t) + kernel_domtrans_to(init_t, init_exec_t) + role system_r types init_t; ++init_initrc_domain(init_t) ++ ++# ++# init_tmp_t is the type for content in /tmp directory ++# ++type init_tmp_t; ++files_tmp_file(init_tmp_t) + + # + # init_var_run_t is the type for /var/run/shutdown.pid. +@@ -48,6 +85,15 @@ role system_r types init_t; + type init_var_run_t; + files_pid_file(init_var_run_t) + ++# ++# init_var_lib_t is the type for /var/lib/systemd ++# ++type init_var_lib_t; ++files_type(init_var_lib_t) ++ ++type machineid_t; ++files_config_file(machineid_t) ++ + # + # initctl_t is the type of the named pipe created + # by init during initialization. This pipe is used +@@ -57,7 +103,7 @@ type initctl_t; + files_type(initctl_t) + mls_trusted_object(initctl_t) + +-type initrc_t, init_script_domain_type, init_run_all_scripts_domain; ++type initrc_t, initrc_domain, init_script_domain_type, init_run_all_scripts_domain; + type initrc_exec_t, init_script_file_type; + domain_type(initrc_t) + domain_entry_file(initrc_t, initrc_exec_t) +@@ -66,6 +112,7 @@ role system_r types initrc_t; + # of the below init_upstart tunable + # but this has a typeattribute in it + corecmd_shell_entry_type(initrc_t) ++corecmd_bin_entry_type(initrc_t) + + type initrc_devpts_t; + term_pty(initrc_devpts_t) +@@ -98,7 +145,13 @@ ifdef(`enable_mls',` + # + + # Use capabilities. old rule: +-allow init_t self:capability ~sys_module; ++allow init_t self:capability ~{ audit_control audit_write sys_module }; ++allow init_t self:capability2 ~{ mac_admin mac_override }; ++allow init_t self:tcp_socket { listen accept }; ++allow init_t self:packet_socket create_socket_perms; ++allow init_t self:key manage_key_perms; ++allow init_t self:bpf { map_create map_read map_write prog_load prog_run }; ++ + # is ~sys_module really needed? observed: + # sys_boot + # sys_tty_config +@@ -108,14 +161,43 @@ allow init_t self:capability ~sys_module; + + allow init_t self:fifo_file rw_fifo_file_perms; + ++allow init_t self:service manage_service_perms; ++ + # Re-exec itself + can_exec(init_t, init_exec_t) +- +-allow init_t initrc_t:unix_stream_socket connectto; +- +-# For /var/run/shutdown.pid. +-allow init_t init_var_run_t:file manage_file_perms; +-files_pid_filetrans(init_t, init_var_run_t, file) ++# executing content in /run/initramfs ++manage_files_pattern(init_t, initrc_state_t, initrc_state_t) ++can_exec(init_t, initrc_state_t) ++ ++allow daemon initrc_t:unix_dgram_socket sendto; ++allow init_t initrc_t:unix_stream_socket { connectto create_stream_socket_perms }; ++allow initrc_t init_t:unix_stream_socket { connectto rw_stream_socket_perms sendto }; ++allow initrc_t init_t:fifo_file rw_fifo_file_perms; ++ ++manage_files_pattern(init_t, init_tmp_t, init_tmp_t) ++manage_dirs_pattern(init_t, init_tmp_t, init_tmp_t) ++manage_lnk_files_pattern(init_t, init_tmp_t, init_tmp_t) ++files_tmp_filetrans(init_t, init_tmp_t, { file }) ++ ++manage_dirs_pattern(init_t, init_var_lib_t, init_var_lib_t) ++manage_files_pattern(init_t, init_var_lib_t, init_var_lib_t) ++manage_lnk_files_pattern(init_t, init_var_lib_t, init_var_lib_t) ++manage_sock_files_pattern(init_t, init_var_lib_t, init_var_lib_t) ++files_var_lib_filetrans(init_t, init_var_lib_t, { dir file }) ++ ++manage_dirs_pattern(init_t, init_var_run_t, init_var_run_t) ++manage_files_pattern(init_t, init_var_run_t, init_var_run_t) ++manage_lnk_files_pattern(init_t, init_var_run_t, init_var_run_t) ++manage_sock_files_pattern(init_t, init_var_run_t, init_var_run_t) ++manage_fifo_files_pattern(init_t, init_var_run_t, init_var_run_t) ++files_pid_filetrans(init_t, init_var_run_t, { dir file }) ++allow init_t init_var_run_t:dir mounton; ++allow init_t init_var_run_t:sock_file relabelto; ++ ++allow init_t machineid_t:file manage_file_perms; ++files_pid_filetrans(init_t, machineid_t, file, "machine-id") ++files_etc_filetrans(init_t, machineid_t, file, "machine-id") ++allow init_t machineid_t:file mounton; + + allow init_t initctl_t:fifo_file manage_fifo_file_perms; + dev_filetrans(init_t, initctl_t, fifo_file) +@@ -125,13 +207,23 @@ allow init_t initrc_var_run_t:file { rw_file_perms setattr }; + + kernel_read_system_state(init_t) + kernel_share_state(init_t) ++kernel_stream_connect(init_t) + + corecmd_exec_chroot(init_t) + corecmd_exec_bin(init_t) + +-dev_read_sysfs(init_t) ++corenet_all_recvfrom_netlabel(init_t) ++corenet_tcp_bind_all_ports(init_t) ++corenet_udp_bind_all_ports(init_t) ++ ++dev_create_all_chr_files(init_t) ++dev_rw_sysfs(init_t) ++dev_read_urand(init_t) ++dev_read_raw_memory(init_t) + # Early devtmpfs + dev_rw_generic_chr_files(init_t) ++dev_filetrans_all_named_dev(init_t) ++dev_write_watchdog(init_t) + + domain_getpgid_all_domains(init_t) + domain_kill_all_domains(init_t) +@@ -139,14 +231,24 @@ domain_signal_all_domains(init_t) + domain_signull_all_domains(init_t) + domain_sigstop_all_domains(init_t) + domain_sigchld_all_domains(init_t) ++domain_read_all_domains_state(init_t) ++domain_getattr_all_domains(init_t) + +-files_read_etc_files(init_t) ++files_read_config_files(init_t) ++files_read_all_pids(init_t) ++files_read_system_conf_files(init_t) + files_rw_generic_pids(init_t) + files_dontaudit_search_isid_type_dirs(init_t) ++files_read_isid_type_files(init_t) ++files_read_etc_runtime_files(init_t) ++files_manage_all_locks(init_t) + files_manage_etc_runtime_files(init_t) ++files_manage_etc_symlinks(init_t) + files_etc_filetrans_etc_runtime(init_t, file) + # Run /etc/X11/prefdm: + files_exec_etc_files(init_t) ++files_read_usr_files(init_t) ++files_write_root_dirs(init_t) + # file descriptors inherited from the rootfs: + files_dontaudit_rw_root_files(init_t) + files_dontaudit_rw_root_chr_files(init_t) +@@ -156,28 +258,54 @@ fs_list_inotifyfs(init_t) + fs_write_ramfs_sockets(init_t) + + mcs_process_set_categories(init_t) +-mcs_killall(init_t) + + mls_file_read_all_levels(init_t) + mls_file_write_all_levels(init_t) +-mls_process_write_down(init_t) ++mls_file_downgrade(init_t) ++mls_file_upgrade(init_t) + mls_fd_use_all_levels(init_t) ++mls_fd_share_all_levels(init_t) ++mls_process_set_level(init_t) ++mls_process_write_down(init_t) ++mls_socket_read_all_levels(init_t) ++mls_socket_write_all_levels(init_t) ++mls_rangetrans_source(init_t) + + selinux_set_all_booleans(init_t) ++selinux_load_policy(init_t) ++selinux_mounton_fs(init_t) ++allow init_t security_t:security load_policy; + +-term_use_all_terms(init_t) ++term_create_pty_dir(init_t) ++term_use_unallocated_ttys(init_t) ++term_use_console(init_t) ++term_use_all_inherited_terms(init_t) ++term_use_generic_ptys(init_t) ++term_use_virtio_console(init_t) + + # Run init scripts. + init_domtrans_script(init_t) + + libs_rw_ld_so_cache(init_t) + ++logging_create_devlog_dev(init_t) + logging_send_syslog_msg(init_t) ++logging_send_audit_msgs(init_t) + logging_rw_generic_logs(init_t) ++logging_relabel_devlog_dev(init_t) ++logging_manage_audit_config(init_t) + + seutil_read_config(init_t) ++seutil_read_module_store(init_t) ++ ++miscfiles_manage_localization(init_t) ++miscfiles_filetrans_named_content(init_t) + +-miscfiles_read_localization(init_t) ++userdom_use_user_ttys(init_t) ++userdom_manage_tmp_dirs(init_t) ++userdom_manage_tmp_sockets(init_t) ++ ++allow init_t self:process setsched; + + ifdef(`distro_gentoo',` + allow init_t self:process { getcap setcap }; +@@ -186,37 +314,308 @@ ifdef(`distro_gentoo',` + ') + + ifdef(`distro_redhat',` ++ fs_manage_tmpfs_files(init_t) ++ fs_manage_tmpfs_symlinks(init_t) ++ fs_manage_tmpfs_sockets(init_t) ++ fs_manage_tmpfs_chr_files(init_t) ++ fs_exec_tmpfs_files(init_t) + fs_read_tmpfs_symlinks(init_t) +- fs_rw_tmpfs_chr_files(init_t) + fs_tmpfs_filetrans(init_t, initctl_t, fifo_file) ++ fs_tmpfs_filetrans_named_content(init_t) ++ ++ logging_stream_connect_syslog(init_t) ++ logging_relabel_syslog_pid_socket(init_t) + ') + +-tunable_policy(`init_upstart',` +- corecmd_shell_domtrans(init_t, initrc_t) +-',` +- # Run the shell in the sysadm role for single-user mode. +- # causes problems with upstart +- sysadm_shell_domtrans(init_t) ++corecmd_shell_domtrans(init_t, initrc_t) ++ ++storage_raw_rw_fixed_disk(init_t) ++ ++sysnet_read_dhcpc_state(init_t) ++ ++optional_policy(` ++ boltd_mounton_var_lib(init_t) ++ boltd_mounton_var_run(init_t) ++') ++ ++optional_policy(` ++ chronyd_read_keys(init_t) ++') ++ ++optional_policy(` ++ journalctl_exec(init_t) ++') ++ ++optional_policy(` ++ kdump_read_crash(init_t) ++ kdump_read_config(init_t) ++') ++ ++optional_policy(` ++ gnome_filetrans_home_content(init_t) ++ gnome_manage_data(init_t) ++ gnome_manage_config(init_t) ++') ++ ++optional_policy(` ++ gssproxy_noatsecure(init_t) ++') ++ ++optional_policy(` ++ rpc_gssd_noatsecure(init_t) ++') ++ ++optional_policy(` ++ anaconda_domtrans_install(init_t) ++') ++ ++optional_policy(` ++ iscsi_read_lib_files(init_t) ++ iscsi_manage_lock(init_t) ++') ++ ++optional_policy(` ++ modutils_domtrans_insmod(init_t) ++ modutils_list_module_config(init_t) ++') ++ ++optional_policy(` ++ postfix_exec(init_t) ++ postfix_list_spool(init_t) ++ mta_read_config(init_t) ++ mta_manage_aliases(init_t) ++') ++ ++allow init_t self:system all_system_perms; ++allow init_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow init_t self:process { setsockcreate setfscreate setrlimit setexec }; ++allow init_t self:process { getcap setcap }; ++allow init_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow init_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow init_t self:netlink_selinux_socket create_socket_perms; ++allow init_t self:unix_dgram_socket lock; ++# Until systemd is fixed ++allow daemon init_t:socket_class_set { getopt read getattr ioctl setopt write }; ++allow init_t self:udp_socket create_socket_perms; ++allow init_t self:netlink_route_socket create_netlink_socket_perms; ++ ++allow init_t initrc_t:unix_dgram_socket create_socket_perms; ++ ++kernel_list_unlabeled(init_t) ++kernel_read_network_state(init_t) ++kernel_rw_all_sysctls(init_t) ++kernel_rw_security_state(init_t) ++kernel_rw_usermodehelper_state(init_t) ++kernel_read_software_raid_state(init_t) ++kernel_unmount_debugfs(init_t) ++kernel_setsched(init_t) ++ ++dev_write_kmsg(init_t) ++dev_write_urand(init_t) ++dev_rw_lvm_control(init_t) ++dev_rw_autofs(init_t) ++dev_manage_generic_symlinks(init_t) ++dev_manage_generic_dirs(init_t) ++dev_manage_generic_files(init_t) ++dev_read_generic_chr_files(init_t) ++dev_relabel_generic_dev_dirs(init_t) ++dev_relabel_all_dev_nodes(init_t) ++dev_relabel_all_dev_files(init_t) ++dev_manage_sysfs_dirs(init_t) ++dev_relabel_sysfs_dirs(init_t) ++ ++files_search_all(init_t) ++files_mounton_all_mountpoints(init_t) ++files_mounton_etc(init_t) ++files_unmount_all_file_type_fs(init_t) ++files_manage_all_pid_dirs(init_t) ++files_manage_etc_dirs(init_t) ++files_manage_generic_tmp_dirs(init_t) ++files_relabel_all_pid_dirs(init_t) ++files_relabel_all_pid_files(init_t) ++files_create_all_pid_sockets(init_t) ++files_delete_all_pids(init_t) ++files_exec_generic_pid_files(init_t) ++files_create_all_pid_pipes(init_t) ++files_create_all_spool_sockets(init_t) ++files_delete_all_spool_sockets(init_t) ++files_manage_urandom_seed(init_t) ++files_list_locks(init_t) ++files_list_spool(init_t) ++files_list_var(init_t) ++files_list_boot(init_t) ++files_list_home(init_t) ++files_create_lock_dirs(init_t) ++files_relabel_all_lock_dirs(init_t) ++files_relabel_var_dirs(init_t) ++files_relabel_var_lib_dirs(init_t) ++files_read_kernel_modules(init_t) ++files_map_kernel_modules(init_t) ++fs_getattr_all_fs(init_t) ++fs_manage_cgroup_dirs(init_t) ++fs_manage_cgroup_files(init_t) ++fs_manage_bpf_dirs(init_t) ++fs_manage_bpf_files(init_t) ++fs_manage_hugetlbfs_dirs(init_t) ++fs_manage_tmpfs_dirs(init_t) ++fs_relabel_tmpfs_dirs(init_t) ++fs_relabel_tmpfs_files(init_t) ++fs_relabel_tmpfs_fifo_files(init_t) ++fs_mount_all_fs(init_t) ++fs_unmount_all_fs(init_t) ++fs_remount_all_fs(init_t) ++fs_list_all(init_t) ++fs_list_auto_mountpoints(init_t) ++fs_register_binary_executable_type(init_t) ++fs_relabel_tmpfs_sock_file(init_t) ++fs_rw_tmpfs_files(init_t) ++fs_relabel_cgroup_dirs(init_t) ++fs_search_cgroup_dirs(init_t) ++# for network namespaces ++fs_read_nsfs_files(init_t) ++ ++selinux_compute_access_vector(init_t) ++selinux_compute_create_context(init_t) ++selinux_validate_context(init_t) ++selinux_unmount_fs(init_t) ++ ++storage_getattr_removable_dev(init_t) ++ ++term_relabel_ptys_dirs(init_t) ++ ++auth_relabel_login_records(init_t) ++auth_relabel_pam_console_data_dirs(init_t) ++ ++clock_read_adjtime(init_t) ++ ++init_read_script_state(init_t) ++ ++modutils_read_module_config(init_t) ++ ++seutil_read_file_contexts(init_t) ++ ++systemd_exec_systemctl(init_t) ++systemd_manage_home_content(init_t) ++systemd_manage_unit_dirs(init_t) ++systemd_manage_random_seed(init_t) ++systemd_manage_all_unit_files(init_t) ++systemd_logger_stream_connect(init_t) ++systemd_config_all_services(init_t) ++systemd_relabelto_fifo_file_passwd_run(init_t) ++systemd_relabel_unit_dirs(init_t) ++systemd_relabel_unit_files(init_t) ++systemd_manage_unit_dirs(initrc_t) ++systemd_manage_unit_symlinks(initrc_t) ++systemd_config_all_services(initrc_t) ++systemd_read_unit_files(initrc_t) ++systemd_login_status(init_t) ++systemd_map_networkd_exec_files(init_t) ++ ++create_sock_files_pattern(init_t, init_sock_file_type, init_sock_file_type) ++ ++auth_use_nsswitch(init_t) ++auth_rw_login_records(init_t) ++auth_domtrans_chk_passwd(init_t) ++ ++ifdef(`distro_redhat',` ++ # it comes from setupr scripts used in systemd unit files ++ # has been covered by initrc_t ++ optional_policy(` ++ bind_manage_config_dirs(init_t) ++ bind_manage_config(init_t) ++ bind_write_config(init_t) ++ bind_setattr_zone_dirs(init_t) ++ ') ++ ++ optional_policy(` ++ ipsec_read_config(init_t) ++ ipsec_manage_pid(init_t) ++ ipsec_stream_connect(init_t) ++ ') ++ ++ optional_policy(` ++ rpc_manage_nfs_state_data(init_t) ++ ') ++ ++ optional_policy(` ++ sysnet_relabelfrom_dhcpc_state(init_t) ++ sysnet_setattr_dhcp_state(init_t) ++ ') + ') + + optional_policy(` +- auth_rw_login_records(init_t) ++ lvm_rw_pipes(init_t) ++ lvm_read_config(init_t) ++ lvm_map_config(init_t) + ') + + optional_policy(` ++ consolekit_manage_log(init_t) ++') ++ ++optional_policy(` ++ dbus_connect_system_bus(init_t) + dbus_system_bus_client(init_t) ++ dbus_delete_pid_files(init_t) ++ ++ optional_policy(` ++ devicekit_dbus_chat_power(init_t) ++ ') + ') + + optional_policy(` +- nscd_use(init_t) ++ # /var/run/dovecot/login/ssl-parameters.dat is a hard link to ++ # /var/lib/dovecot/ssl-parameters.dat and init tries to clean up ++ # the directory. But we do not want to allow this. ++ # The master process of dovecot will manage this file. ++ dovecot_dontaudit_unlink_lib_files(initrc_t) ++') ++ ++optional_policy(` ++ networkmanager_stream_connect(init_t) ++ networkmanager_stream_connect(initrc_t) ++') ++ ++optional_policy(` ++ plymouthd_stream_connect(init_t) ++ plymouthd_exec_plymouth(init_t) ++ plymouthd_filetrans_named_content(init_t) ++') ++ ++optional_policy(` ++ ssh_getattr_server_keys(init_t) + ') + + optional_policy(` + sssd_stream_connect(init_t) + ') + ++optional_policy(` ++ rpcbind_filetrans_named_content(init_t) ++ rpcbind_relabel_sock_file(init_t) ++') ++ ++optional_policy(` ++ systemd_filetrans_named_content(init_t) ++') ++ ++optional_policy(` ++ udev_read_db(init_t) ++ udev_relabelto_db(init_t) ++ udev_create_kobject_uevent_socket(init_t) ++ udev_relabel_pid_sockfile(init_t) ++') ++ ++optional_policy(` ++ xserver_relabel_xdm_tmp_dirs(init_t) ++ xserver_manage_xdm_tmp_dirs(init_t) ++ xserver_read_xdm_lib_files(init_t) ++') ++ + optional_policy(` + unconfined_domain(init_t) ++ domain_named_filetrans(init_t) ++ unconfined_server_domtrans(init_t) + ') + + ######################################## +@@ -225,9 +624,9 @@ optional_policy(` + # + + allow initrc_t self:process { getpgid setsched setpgid setrlimit getsched }; +-allow initrc_t self:capability ~{ sys_admin sys_module }; ++allow initrc_t self:capability ~{ sys_ptrace audit_control audit_write sys_admin sys_module }; + allow initrc_t self:capability2 block_suspend; +-dontaudit initrc_t self:capability sys_module; # sysctl is triggering this ++dontaudit initrc_t self:capability { sys_ptrace sys_module }; # sysctl is triggering this + allow initrc_t self:passwd rootok; + allow initrc_t self:key manage_key_perms; + +@@ -258,12 +657,16 @@ manage_fifo_files_pattern(initrc_t, initrc_state_t, initrc_state_t) + + allow initrc_t initrc_var_run_t:file manage_file_perms; + files_pid_filetrans(initrc_t, initrc_var_run_t, file) ++files_manage_generic_pids_symlinks(initrc_t) ++files_create_var_run_dirs(initrc_t) ++files_relabelfrom_isid_type(initrc_t) + + can_exec(initrc_t, initrc_tmp_t) + manage_files_pattern(initrc_t, initrc_tmp_t, initrc_tmp_t) + manage_dirs_pattern(initrc_t, initrc_tmp_t, initrc_tmp_t) + manage_lnk_files_pattern(initrc_t, initrc_tmp_t, initrc_tmp_t) + files_tmp_filetrans(initrc_t, initrc_tmp_t, { file dir }) ++allow initrc_t initrc_tmp_t:dir relabelfrom; + + manage_dirs_pattern(initrc_t, initrc_var_log_t, initrc_var_log_t) + manage_files_pattern(initrc_t, initrc_var_log_t, initrc_var_log_t) +@@ -279,23 +682,36 @@ kernel_change_ring_buffer_level(initrc_t) + kernel_clear_ring_buffer(initrc_t) + kernel_get_sysvipc_info(initrc_t) + kernel_read_all_sysctls(initrc_t) ++kernel_request_load_module(initrc_t) + kernel_rw_all_sysctls(initrc_t) + # for lsof which is used by alsa shutdown: + kernel_dontaudit_getattr_message_if(initrc_t) ++kernel_stream_connect(initrc_t) ++files_read_kernel_modules(initrc_t) ++files_read_config_files(initrc_t) ++files_read_var_lib_symlinks(initrc_t) ++files_setattr_pid_dirs(initrc_t) + + files_create_lock_dirs(initrc_t) + files_pid_filetrans_lock_dir(initrc_t, "lock") + files_read_kernel_symbol_table(initrc_t) +-files_setattr_lock_dirs(initrc_t) ++files_exec_etc_files(initrc_t) ++files_manage_etc_symlinks(initrc_t) ++files_manage_system_conf_files(initrc_t) ++ ++fs_manage_tmpfs_dirs(initrc_t) ++fs_manage_tmpfs_symlinks(initrc_t) ++fs_delete_tmpfs_files(initrc_t) ++fs_tmpfs_filetrans(initrc_t, initrc_state_t, file) ++fs_read_nfsd_files(initrc_t) + + corecmd_exec_all_executables(initrc_t) + +-corenet_all_recvfrom_unlabeled(initrc_t) + corenet_all_recvfrom_netlabel(initrc_t) +-corenet_tcp_sendrecv_all_if(initrc_t) +-corenet_udp_sendrecv_all_if(initrc_t) +-corenet_tcp_sendrecv_all_nodes(initrc_t) +-corenet_udp_sendrecv_all_nodes(initrc_t) ++corenet_tcp_sendrecv_generic_if(initrc_t) ++corenet_udp_sendrecv_generic_if(initrc_t) ++corenet_tcp_sendrecv_generic_node(initrc_t) ++corenet_udp_sendrecv_generic_node(initrc_t) + corenet_tcp_sendrecv_all_ports(initrc_t) + corenet_udp_sendrecv_all_ports(initrc_t) + corenet_tcp_connect_all_ports(initrc_t) +@@ -303,9 +719,11 @@ corenet_sendrecv_all_client_packets(initrc_t) + + dev_read_rand(initrc_t) + dev_read_urand(initrc_t) ++dev_dontaudit_read_kmsg(initrc_t) + dev_write_kmsg(initrc_t) + dev_write_rand(initrc_t) + dev_write_urand(initrc_t) ++dev_write_watchdog(initrc_t) + dev_rw_sysfs(initrc_t) + dev_list_usbfs(initrc_t) + dev_read_framebuffer(initrc_t) +@@ -313,8 +731,10 @@ dev_write_framebuffer(initrc_t) + dev_read_realtime_clock(initrc_t) + dev_read_sound_mixer(initrc_t) + dev_write_sound_mixer(initrc_t) ++dev_setattr_generic_dirs(initrc_t) + dev_setattr_all_chr_files(initrc_t) + dev_rw_lvm_control(initrc_t) ++dev_rw_generic_chr_files(initrc_t) + dev_delete_lvm_control_dev(initrc_t) + dev_manage_generic_symlinks(initrc_t) + dev_manage_generic_files(initrc_t) +@@ -322,8 +742,7 @@ dev_manage_generic_files(initrc_t) + dev_delete_generic_symlinks(initrc_t) + dev_getattr_all_blk_files(initrc_t) + dev_getattr_all_chr_files(initrc_t) +-# Early devtmpfs +-dev_rw_generic_chr_files(initrc_t) ++dev_rw_xserver_misc(initrc_t) + + domain_kill_all_domains(initrc_t) + domain_signal_all_domains(initrc_t) +@@ -332,7 +751,6 @@ domain_sigstop_all_domains(initrc_t) + domain_sigchld_all_domains(initrc_t) + domain_read_all_domains_state(initrc_t) + domain_getattr_all_domains(initrc_t) +-domain_dontaudit_ptrace_all_domains(initrc_t) + domain_getsession_all_domains(initrc_t) + domain_use_interactive_fds(initrc_t) + # for lsof which is used by alsa shutdown: +@@ -340,6 +758,7 @@ domain_dontaudit_getattr_all_udp_sockets(initrc_t) + domain_dontaudit_getattr_all_tcp_sockets(initrc_t) + domain_dontaudit_getattr_all_dgram_sockets(initrc_t) + domain_dontaudit_getattr_all_pipes(initrc_t) ++domain_obj_id_change_exemption(initrc_t) + + files_getattr_all_dirs(initrc_t) + files_getattr_all_files(initrc_t) +@@ -347,14 +766,15 @@ files_getattr_all_symlinks(initrc_t) + files_getattr_all_pipes(initrc_t) + files_getattr_all_sockets(initrc_t) + files_purge_tmp(initrc_t) +-files_delete_all_locks(initrc_t) ++files_manage_all_locks(initrc_t) ++files_manage_boot_files(initrc_t) + files_read_all_pids(initrc_t) ++files_delete_root_files(initrc_t) + files_delete_all_pids(initrc_t) + files_delete_all_pid_dirs(initrc_t) + files_read_etc_files(initrc_t) + files_manage_etc_runtime_files(initrc_t) + files_etc_filetrans_etc_runtime(initrc_t, file) +-files_exec_etc_files(initrc_t) + files_read_usr_files(initrc_t) + files_manage_urandom_seed(initrc_t) + files_manage_generic_spool(initrc_t) +@@ -364,8 +784,12 @@ files_list_isid_type_dirs(initrc_t) + files_mounton_isid_type_dirs(initrc_t) + files_list_default(initrc_t) + files_mounton_default(initrc_t) ++files_manage_mnt_dirs(initrc_t) ++files_manage_mnt_files(initrc_t) + +-fs_write_cgroup_files(initrc_t) ++fs_delete_cgroup_dirs(initrc_t) ++fs_list_cgroup_dirs(initrc_t) ++fs_rw_cgroup_files(initrc_t) + fs_list_inotifyfs(initrc_t) + fs_register_binary_executable_type(initrc_t) + # rhgb-console writes to ramfs +@@ -375,10 +799,11 @@ fs_mount_all_fs(initrc_t) + fs_unmount_all_fs(initrc_t) + fs_remount_all_fs(initrc_t) + fs_getattr_all_fs(initrc_t) ++fs_search_all(initrc_t) ++fs_getattr_nfsd_files(initrc_t) ++fs_dontaudit_create_tmpfs_chr_dev(initrc_t) + + # initrc_t needs to do a pidof which requires ptrace +-mcs_ptrace_all(initrc_t) +-mcs_killall(initrc_t) + mcs_process_set_categories(initrc_t) + + mls_file_read_all_levels(initrc_t) +@@ -387,8 +812,11 @@ mls_process_read_up(initrc_t) + mls_process_write_down(initrc_t) + mls_rangetrans_source(initrc_t) + mls_fd_share_all_levels(initrc_t) ++mls_socket_write_to_clearance(initrc_t) + + selinux_get_enforce_mode(initrc_t) ++selinux_set_enforce_mode(initrc_t) ++selinux_setcheckreqprot(initrc_t) + + storage_getattr_fixed_disk_dev(initrc_t) + storage_setattr_fixed_disk_dev(initrc_t) +@@ -398,6 +826,7 @@ term_use_all_terms(initrc_t) + term_reset_tty_labels(initrc_t) + + auth_rw_login_records(initrc_t) ++auth_manage_faillog(initrc_t) + auth_setattr_login_records(initrc_t) + auth_rw_lastlog(initrc_t) + auth_read_pam_pid(initrc_t) +@@ -416,20 +845,18 @@ logging_read_all_logs(initrc_t) + logging_append_all_logs(initrc_t) + logging_read_audit_config(initrc_t) + +-miscfiles_read_localization(initrc_t) + # slapd needs to read cert files from its initscript +-miscfiles_read_generic_certs(initrc_t) ++miscfiles_manage_generic_cert_files(initrc_t) + +-modutils_read_module_config(initrc_t) +-modutils_domtrans_insmod(initrc_t) + + seutil_read_config(initrc_t) + ++userdom_read_admin_home_files(initrc_t) + userdom_read_user_home_content_files(initrc_t) + # Allow access to the sysadm TTYs. Note that this will give access to the + # TTYs to any process in the initrc_t domain. Therefore, daemons and such + # started from init should be placed in their own domain. +-userdom_use_user_terminals(initrc_t) ++userdom_use_inherited_user_terminals(initrc_t) + + ifdef(`distro_debian',` + dev_setattr_generic_dirs(initrc_t) +@@ -451,7 +878,6 @@ ifdef(`distro_gentoo',` + allow initrc_t self:process setfscreate; + dev_create_null_dev(initrc_t) + dev_create_zero_dev(initrc_t) +- dev_create_generic_dirs(initrc_t) + term_create_console_dev(initrc_t) + + # unfortunately /sbin/rc does stupid tricks +@@ -485,6 +911,10 @@ ifdef(`distro_gentoo',` + sysnet_write_config(initrc_t) + sysnet_setattr_config(initrc_t) + ++ optional_policy(` ++ abrt_manage_pid_files(initrc_t) ++ ') ++ + optional_policy(` + alsa_read_lib(initrc_t) + ') +@@ -506,7 +936,7 @@ ifdef(`distro_redhat',` + + # Red Hat systems seem to have a stray + # fd open from the initrd +- kernel_dontaudit_use_fds(initrc_t) ++ kernel_use_fds(initrc_t) + files_dontaudit_read_root_files(initrc_t) + + # These seem to be from the initrd +@@ -521,6 +951,7 @@ ifdef(`distro_redhat',` + files_create_boot_dirs(initrc_t) + files_create_boot_flag(initrc_t) + files_rw_boot_symlinks(initrc_t) ++ + # wants to read /.fonts directory + files_read_default_files(initrc_t) + files_mountpoint(initrc_tmp_t) +@@ -541,6 +972,7 @@ ifdef(`distro_redhat',` + miscfiles_rw_localization(initrc_t) + miscfiles_setattr_localization(initrc_t) + miscfiles_relabel_localization(initrc_t) ++ miscfiles_filetrans_named_content(initrc_t) + + miscfiles_read_fonts(initrc_t) + miscfiles_read_hwdata(initrc_t) +@@ -549,9 +981,45 @@ ifdef(`distro_redhat',` + alsa_manage_rw_config(initrc_t) + ') + ++ optional_policy(` ++ abrt_manage_pid_files(initrc_t) ++ ') ++ + optional_policy(` + bind_manage_config_dirs(initrc_t) ++ bind_manage_config(initrc_t) + bind_write_config(initrc_t) ++ bind_setattr_zone_dirs(initrc_t) ++ ') ++ ++ optional_policy(` ++ cyrus_write_data(initrc_t) ++ ') ++ ++ optional_policy(` ++ devicekit_append_inherited_log_files(initrc_t) ++ devicekit_dbus_chat_power(initrc_t) ++ ') ++ ++ optional_policy(` ++ dirsrvadmin_read_config(initrc_t) ++ dirsrv_manage_var_run(initrc_t) ++ ') ++ ++ optional_policy(` ++ gnome_manage_gconf_config(initrc_t) ++ ') ++ ++ optional_policy(` ++ ldap_read_db_files(initrc_t) ++ ') ++ ++ optional_policy(` ++ ntp_filetrans_named_content(initrc_t) ++ ') ++ ++ optional_policy(` ++ pulseaudio_stream_connect(initrc_t) + ') + + optional_policy(` +@@ -559,14 +1027,31 @@ ifdef(`distro_redhat',` + rpc_write_exports(initrc_t) + rpc_manage_nfs_state_data(initrc_t) + ') ++ optional_policy(` ++ rpcbind_stream_connect(initrc_t) ++ ') + + optional_policy(` + sysnet_rw_dhcp_config(initrc_t) + sysnet_manage_config(initrc_t) ++ sysnet_manage_dhcpc_state(initrc_t) ++ sysnet_relabelfrom_dhcpc_state(initrc_t) ++ sysnet_relabelfrom_net_conf(initrc_t) ++ sysnet_relabelto_net_conf(initrc_t) ++ #sysnet_filetrans_named_content(initrc_t) ++ ') ++ ++ optional_policy(` ++ tgtd_stream_connect(initrc_t) ++ ') ++ ++ optional_policy(` ++ wdmd_manage_pid_files(initrc_t) + ') + + optional_policy(` + xserver_delete_log(initrc_t) ++ xserver_manage_user_fonts_dir(initrc_t) + ') + ') + +@@ -577,6 +1062,39 @@ ifdef(`distro_suse',` + ') + ') + ++domain_dontaudit_use_interactive_fds(daemon) ++ ++userdom_dontaudit_list_admin_dir(daemon) ++userdom_dontaudit_search_user_tmp(daemon) ++ ++tunable_policy(`daemons_use_tcp_wrapper',` ++ corenet_tcp_connect_auth_port(daemon) ++') ++ ++tunable_policy(`daemons_use_tty',` ++ term_use_unallocated_ttys(daemon) ++ term_use_generic_ptys(daemon) ++ term_use_all_ttys(daemon) ++ term_use_all_ptys(daemon) ++',` ++ term_dontaudit_use_unallocated_ttys(daemon) ++ term_dontaudit_use_generic_ptys(daemon) ++ term_dontaudit_use_all_ttys(daemon) ++ term_dontaudit_use_all_ptys(daemon) ++ ') ++ ++# system-config-services causes avc messages that should be dontaudited ++tunable_policy(`daemons_dump_core',` ++ files_manage_root_files(daemon) ++') ++ ++optional_policy(` ++ unconfined_dontaudit_rw_pipes(daemon) ++ unconfined_dontaudit_rw_stream(daemon) ++ userdom_dontaudit_read_user_tmp_files(daemon) ++ userdom_dontaudit_write_user_tmp_files(daemon) ++') ++ + optional_policy(` + amavis_search_lib(initrc_t) + amavis_setattr_pid_files(initrc_t) +@@ -589,6 +1107,8 @@ optional_policy(` + optional_policy(` + apache_read_config(initrc_t) + apache_list_modules(initrc_t) ++ # webmin seems to cause this. ++ apache_search_sys_content(daemon) + ') + + optional_policy(` +@@ -610,6 +1130,7 @@ optional_policy(` + + optional_policy(` + cgroup_stream_connect_cgred(initrc_t) ++ domain_setpriority_all_domains(initrc_t) + ') + + optional_policy(` +@@ -625,6 +1146,17 @@ optional_policy(` + dev_getattr_cpu_dev(initrc_t) + ') + ++optional_policy(` ++ chronyd_append_keys(initrc_t) ++ chronyd_read_keys(initrc_t) ++') ++ ++optional_policy(` ++ cron_read_pipes(initrc_t) ++ # managing /etc/cron.d/mailman content ++ cron_manage_system_spool(initrc_t) ++') ++ + optional_policy(` + dev_getattr_printer_dev(initrc_t) + +@@ -642,9 +1174,13 @@ optional_policy(` + dbus_connect_system_bus(initrc_t) + dbus_system_bus_client(initrc_t) + dbus_read_config(initrc_t) ++ dbus_manage_lib_files(initrc_t) ++ ++ init_dbus_chat(initrc_t) + + optional_policy(` + consolekit_dbus_chat(initrc_t) ++ consolekit_manage_log(initrc_t) + ') + + optional_policy(` +@@ -657,15 +1193,11 @@ optional_policy(` + ') + + optional_policy(` +- # /var/run/dovecot/login/ssl-parameters.dat is a hard link to +- # /var/lib/dovecot/ssl-parameters.dat and init tries to clean up +- # the directory. But we do not want to allow this. +- # The master process of dovecot will manage this file. +- dovecot_dontaudit_unlink_lib_files(initrc_t) ++ ftp_read_config(initrc_t) + ') + + optional_policy(` +- ftp_read_config(initrc_t) ++ glance_manage_pid_files(initrc_t) + ') + + optional_policy(` +@@ -685,6 +1217,15 @@ optional_policy(` + modutils_read_module_deps(initrc_t) + ') + ++optional_policy(` ++ firewalld_dbus_chat(initrc_t) ++') ++ ++optional_policy(` ++ modutils_read_module_config(initrc_t) ++ modutils_domtrans_insmod(initrc_t) ++') ++ + optional_policy(` + inn_exec_config(initrc_t) + ') +@@ -726,6 +1267,7 @@ optional_policy(` + lpd_list_spool(initrc_t) + + lpd_read_config(initrc_t) ++ lpd_manage_spool(init_t) + ') + + optional_policy(` +@@ -743,7 +1285,13 @@ optional_policy(` + ') + + optional_policy(` +- mta_read_config(initrc_t) ++ milter_delete_dkim_pid_files(initrc_t) ++ milter_setattr_all_dirs(initrc_t) ++') ++ ++optional_policy(` ++ mta_manage_aliases(initrc_t) ++ mta_manage_config(initrc_t) + mta_dontaudit_read_spool_symlinks(initrc_t) + ') + +@@ -765,6 +1313,10 @@ optional_policy(` + openvpn_read_config(initrc_t) + ') + ++optional_policy(` ++ plymouthd_stream_connect(initrc_t) ++') ++ + optional_policy(` + postgresql_manage_db(initrc_t) + postgresql_read_config(initrc_t) +@@ -774,10 +1326,20 @@ optional_policy(` + postfix_list_spool(initrc_t) + ') + ++optional_policy(` ++ psad_setattr_fifo_file(initrc_t) ++ psad_setattr_log(initrc_t) ++ psad_write_log(initrc_t) ++') ++ + optional_policy(` + puppet_rw_tmp(initrc_t) + ') + ++optional_policy(` ++ qpidd_manage_var_run(initrc_t) ++') ++ + optional_policy(` + quota_manage_flags(initrc_t) + ') +@@ -786,6 +1348,10 @@ optional_policy(` + raid_manage_mdadm_pid(initrc_t) + ') + ++optional_policy(` ++ ricci_manage_lib_files(initrc_t) ++') ++ + optional_policy(` + fs_write_ramfs_sockets(initrc_t) + fs_search_ramfs(initrc_t) +@@ -808,8 +1374,6 @@ optional_policy(` + # bash tries ioctl for some reason + files_dontaudit_ioctl_all_pids(initrc_t) + +- # why is this needed: +- rpm_manage_db(initrc_t) + ') + + optional_policy(` +@@ -817,6 +1381,10 @@ optional_policy(` + samba_read_winbind_pid(initrc_t) + ') + ++optional_policy(` ++ sendmail_setattr_pid_files(initrc_t) ++') ++ + optional_policy(` + # shorewall-init script run /var/lib/shorewall/firewall + shorewall_lib_domtrans(initrc_t) +@@ -827,10 +1395,12 @@ optional_policy(` + squid_manage_logs(initrc_t) + ') + ++ifdef(`enabled_mls',` + optional_policy(` + # allow init scripts to su + su_restricted_domain_template(initrc, initrc_t, system_r) + ') ++') + + optional_policy(` + ssh_dontaudit_read_server_keys(initrc_t) +@@ -857,21 +1427,60 @@ optional_policy(` + ') + + optional_policy(` ++ virt_read_config(init_t) ++ virt_stream_connect(init_t) ++ virt_noatsecure(init_t) ++ virt_rlimitinh(init_t) ++') ++ ++optional_policy(` ++ virt_manage_pid_dirs(initrc_t) ++ virt_manage_cache(initrc_t) ++ virt_manage_lib_files(initrc_t) + virt_stream_connect(initrc_t) +- virt_manage_virt_cache(initrc_t) ++') ++ ++# Cron jobs used to start and stop services ++optional_policy(` ++ cron_rw_pipes(daemon) ++ cron_rw_inherited_user_spool_files(daemon) ++') ++ ++optional_policy(` ++ cfengine_append_inherited_log(daemon) + ') + + optional_policy(` + unconfined_domain(initrc_t) ++ domain_named_filetrans(initrc_t) ++ domain_role_change_exemption(initrc_t) ++ ++ files_tmp_filetrans(initrc_t, initrc_tmp_t, { dir_file_class_set }) + + ifdef(`distro_redhat',` + # system-config-services causes avc messages that should be dontaudited + unconfined_dontaudit_rw_pipes(daemon) + ') + ++ optional_policy(` ++ authconfig_domtrans(initrc_t) ++ ') ++ + optional_policy(` + mono_domtrans(initrc_t) + ') ++ ++ # Allow SELinux aware applications to request rpm_script_t execution ++ rpm_transition_script(initrc_t, system_r) ++ ++ optional_policy(` ++ rtkit_scheduled(initrc_t) ++ ') ++') ++ ++optional_policy(` ++ rpm_read_db(initrc_t) ++ rpm_delete_db(initrc_t) + ') + + optional_policy(` +@@ -886,6 +1495,10 @@ optional_policy(` + xfs_read_sockets(initrc_t) + ') + ++optional_policy(` ++ sanlock_manage_pid_files(initrc_t) ++') ++ + optional_policy(` + # Set device ownerships/modes. + xserver_setattr_console_pipes(initrc_t) +@@ -897,3 +1510,218 @@ optional_policy(` + optional_policy(` + zebra_read_config(initrc_t) + ') ++ ++userdom_inherit_append_user_home_content_files(daemon) ++userdom_inherit_append_user_tmp_files(daemon) ++userdom_dontaudit_rw_stream(daemon) ++ ++logging_inherit_append_all_logs(daemon) ++ ++optional_policy(` ++ # sudo service restart causes this ++ unconfined_signull(daemon) ++') ++ ++ ++optional_policy(` ++ xserver_dontaudit_append_xdm_home_files(daemon) ++ tunable_policy(`use_nfs_home_dirs',` ++ fs_dontaudit_rw_nfs_files(daemon) ++ ') ++ tunable_policy(`use_samba_home_dirs',` ++ fs_dontaudit_rw_cifs_files(daemon) ++ ') ++') ++ ++init_rw_script_stream_sockets(daemon) ++ ++optional_policy(` ++ abrt_stream_connect(daemon) ++') ++ ++optional_policy(` ++ fail2ban_read_lib_files(daemon) ++') ++ ++optional_policy(` ++ firstboot_dontaudit_leaks(daemon) ++') ++ ++init_rw_stream_sockets(daemon) ++init_dontaudit_script_leaks(daemon) ++ ++allow init_t var_run_t:dir relabelto; ++ ++init_stream_connect(initrc_t) ++ ++allow initrc_t daemon:process siginh; ++allow daemon initrc_transition_domain:fifo_file rw_inherited_fifo_file_perms; ++allow daemon initrc_transition_domain:fd use; ++allow daemon init_var_run_t:dir search_dir_perms; ++allow systemprocess init_var_run_t:dir search_dir_perms; ++ ++allow init_t daemon:unix_stream_socket create_stream_socket_perms; ++allow init_t daemon:unix_dgram_socket create_socket_perms; ++allow init_t daemon:tcp_socket create_stream_socket_perms; ++allow init_t daemon:udp_socket create_socket_perms; ++allow daemon init_t:unix_dgram_socket sendto; ++# need write to /var/run/systemd/notify ++init_write_pid_socket(daemon) ++allow daemon init_t:unix_stream_socket { append write read getattr ioctl }; ++ ++# daemons started from init will ++# inherit fds from init for the console ++init_dontaudit_use_fds(daemon) ++term_dontaudit_use_console(daemon) ++# init script ptys are the stdin/out/err ++# when using run_init ++init_use_script_ptys(daemon) ++ ++allow init_t daemon:process siginh; ++ ++ifdef(`hide_broken_symptoms',` ++ # RHEL4 systems seem to have a stray ++ # fds open from the initrd ++ ifdef(`distro_rhel4',` ++ kernel_dontaudit_use_fds(daemon) ++ ') ++ ++ dontaudit daemon init_t:dir search_dir_perms; ++') ++ ++optional_policy(` ++ nscd_socket_use(daemon) ++') ++ ++optional_policy(` ++ puppet_rw_tmp(daemon) ++') ++ ++allow direct_run_init daemon:process { noatsecure siginh rlimitinh }; ++ ++allow initrc_t systemprocess:process siginh; ++allow systemprocess initrc_transition_domain:fifo_file rw_inherited_fifo_file_perms; ++allow systemprocess initrc_transition_domain:fd use; ++ ++dontaudit systemprocess init_t:unix_stream_socket getattr; ++ ++allow init_t daemon:unix_stream_socket create_stream_socket_perms; ++allow init_t daemon:unix_dgram_socket create_socket_perms; ++allow daemon init_t:unix_stream_socket ioctl; ++allow daemon init_t:unix_dgram_socket sendto; ++# need write to /var/run/systemd/notify ++init_write_pid_socket(daemon) ++init_rw_inherited_script_tmp_files(daemon) ++ ++# Handle upstart/systemd direct transition to a executable ++allow init_t systemprocess:process { dyntransition siginh }; ++allow init_t systemprocess:unix_stream_socket create_stream_socket_perms; ++allow init_t systemprocess:unix_dgram_socket create_socket_perms; ++allow systemprocess init_t:unix_dgram_socket sendto; ++allow systemprocess init_t:unix_stream_socket { append write read getattr ioctl }; ++ ++files_dontaudit_rw_inherited_locks(systemprocess) ++files_dontaudit_tmp_file_leaks(systemprocess) ++init_rw_inherited_script_tmp_files(systemprocess) ++ ++logging_dontaudit_rw_inherited_generic_logs(systemprocess) ++ ++userdom_dontaudit_search_user_home_dirs(systemprocess) ++userdom_dontaudit_rw_stream(systemprocess) ++userdom_dontaudit_write_user_tmp_files(systemprocess) ++ ++tunable_policy(`daemons_use_tty',` ++ term_use_all_ttys(systemprocess) ++ term_use_all_ptys(systemprocess) ++',` ++ term_dontaudit_use_all_ttys(systemprocess) ++ term_dontaudit_use_all_ptys(systemprocess) ++') ++ ++# these apps are often redirect output to random log files ++logging_inherit_append_all_logs(systemprocess) ++ ++optional_policy(` ++ abrt_stream_connect(systemprocess) ++') ++ ++optional_policy(` ++ cfengine_append_inherited_log(systemprocess) ++') ++ ++optional_policy(` ++ cron_rw_pipes(systemprocess) ++') ++ ++optional_policy(` ++ puppet_rw_tmp(systemprocess) ++') ++ ++optional_policy(` ++ xserver_dontaudit_append_xdm_home_files(systemprocess) ++') ++ ++optional_policy(` ++ unconfined_dontaudit_rw_pipes(systemprocess) ++ unconfined_dontaudit_rw_stream(systemprocess) ++ userdom_dontaudit_read_user_tmp_files(systemprocess) ++') ++ ++init_rw_script_stream_sockets(systemprocess) ++ ++role system_r types systemprocess; ++role system_r types daemon; ++ ++#ifdef(`enable_mls',` ++# mls_rangetrans_target(systemprocess) ++#') ++ ++allow initrc_domain daemon:process transition; ++allow daemon initrc_domain:fd use; ++allow daemon initrc_domain:fifo_file rw_inherited_fifo_file_perms; ++allow daemon initrc_domain:process sigchld; ++allow initrc_domain direct_init_entry:file { getattr open read map execute }; ++ ++allow systemprocess initrc_domain:fd use; ++allow systemprocess initrc_domain:fifo_file rw_inherited_fifo_file_perms; ++allow systemprocess initrc_domain:process sigchld; ++allow initrc_domain systemprocess_entry:file { getattr open read execute map }; ++allow initrc_domain systemprocess:process transition; ++ ++optional_policy(` ++ systemd_getattr_unit_dirs(daemon) ++ systemd_getattr_unit_dirs(systemprocess) ++') ++ ++optional_policy(` ++ rgmanager_search_lib(initrc_domain) ++') ++ ++ifdef(`direct_sysadm_daemon',` ++ allow daemon direct_run_init:fd use; ++ allow daemon direct_run_init:fifo_file rw_inherited_fifo_file_perms; ++ allow daemon direct_run_init:process sigchld; ++ allow direct_run_init direct_init_entry:file { getattr open read execute }; ++') ++ ++optional_policy(` ++ tunable_policy(`daemons_enable_cluster_mode',` ++ rhcs_manage_cluster_pid_files(daemon) ++ rhcs_manage_cluster_lib_files(daemon) ++ rhcs_rw_inherited_cluster_tmp_files(daemon) ++ rhcs_stream_connect_cluster_to(daemon,daemon) ++',` ++ rhcs_read_cluster_lib_files(daemon) ++ rhcs_read_cluster_pid_files(daemon) ++ ') ++ ++ ') ++ ++optional_policy(` ++ tunable_policy(`daemons_enable_cluster_mode',` ++ #resource agents placed config files in /etc/cluster ++ ccs_manage_config(daemon) ++',` ++ ccs_read_config(daemon) ++ ') ++ ') +diff --git a/policy/modules/system/ipsec.fc b/policy/modules/system/ipsec.fc +index 662e79be87..c34c4aebc1 100644 +--- a/policy/modules/system/ipsec.fc ++++ b/policy/modules/system/ipsec.fc +@@ -1,14 +1,26 @@ + /etc/rc\.d/init\.d/ipsec -- gen_context(system_u:object_r:ipsec_initrc_exec_t,s0) + /etc/rc\.d/init\.d/racoon -- gen_context(system_u:object_r:ipsec_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/strongswan -- gen_context(system_u:object_r:ipsec_initrc_exec_t,s0) + +-/etc/ipsec\.secrets -- gen_context(system_u:object_r:ipsec_key_file_t,s0) ++/usr/lib/systemd/system/ipsec.* -- gen_context(system_u:object_r:ipsec_mgmt_unit_file_t,s0) ++/usr/lib/systemd/system/strongswan.* -- gen_context(system_u:object_r:ipsec_mgmt_unit_file_t,s0) ++/usr/lib/systemd/system/strongswan-swanctl.* -- gen_context(system_u:object_r:ipsec_mgmt_unit_file_t,s0) ++/usr/lib/systemd/system/strongimcv.* -- gen_context(system_u:object_r:ipsec_mgmt_unit_file_t,s0) ++ ++/etc/ipsec\.secrets.* -- gen_context(system_u:object_r:ipsec_key_file_t,s0) + /etc/ipsec\.conf -- gen_context(system_u:object_r:ipsec_conf_file_t,s0) ++/etc/strongswan/ipsec\.secrets.* -- gen_context(system_u:object_r:ipsec_key_file_t,s0) ++/etc/strongswan/ipsec\.conf -- gen_context(system_u:object_r:ipsec_conf_file_t,s0) + /etc/racoon/psk\.txt -- gen_context(system_u:object_r:ipsec_key_file_t,s0) + + /etc/racoon(/.*)? gen_context(system_u:object_r:ipsec_conf_file_t,s0) + /etc/racoon/certs(/.*)? gen_context(system_u:object_r:ipsec_key_file_t,s0) + ++/etc/strongswan(/.*)? gen_context(system_u:object_r:ipsec_conf_file_t,s0) ++/etc/strongimcv(/.*)? gen_context(system_u:object_r:ipsec_conf_file_t,s0) ++ + /etc/ipsec\.d(/.*)? gen_context(system_u:object_r:ipsec_key_file_t,s0) ++/etc/strongswan/ipsec\.d(/.*)? gen_context(system_u:object_r:ipsec_key_file_t,s0) + + /sbin/setkey -- gen_context(system_u:object_r:setkey_exec_t,s0) + +@@ -25,17 +37,30 @@ + /usr/libexec/ipsec/klipsdebug -- gen_context(system_u:object_r:ipsec_exec_t,s0) + /usr/libexec/ipsec/pluto -- gen_context(system_u:object_r:ipsec_exec_t,s0) + /usr/libexec/ipsec/spi -- gen_context(system_u:object_r:ipsec_exec_t,s0) ++/usr/libexec/ipsec/addconn -- gen_context(system_u:object_r:ipsec_exec_t,s0) + /usr/libexec/nm-openswan-service -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) ++/usr/libexec/nm-libreswan-service -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) ++/usr/libexec/strongswan/.* -- gen_context(system_u:object_r:ipsec_exec_t,s0) ++/usr/libexec/strongimcv/.* -- gen_context(system_u:object_r:ipsec_exec_t,s0) + + /usr/sbin/ipsec -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) + /usr/sbin/racoon -- gen_context(system_u:object_r:racoon_exec_t,s0) + /usr/sbin/setkey -- gen_context(system_u:object_r:setkey_exec_t,s0) ++/usr/sbin/strongswan -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) ++/usr/sbin/swanctl -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) ++/usr/sbin/strongimcv -- gen_context(system_u:object_r:ipsec_mgmt_exec_t,s0) + + /var/lock/subsys/ipsec -- gen_context(system_u:object_r:ipsec_mgmt_lock_t,s0) ++/var/lock/subsys/strongswan -- gen_context(system_u:object_r:ipsec_mgmt_lock_t,s0) + +-/var/log/pluto\.log -- gen_context(system_u:object_r:ipsec_log_t,s0) ++/var/log/pluto\.log.* -- gen_context(system_u:object_r:ipsec_log_t,s0) + + /var/racoon(/.*)? gen_context(system_u:object_r:ipsec_var_run_t,s0) + ++/var/run/charon\.ctl -s gen_context(system_u:object_r:ipsec_var_run_t,s0) ++/var/run/charon\.vici -s gen_context(system_u:object_r:ipsec_var_run_t,s0) ++/var/run/charon.* -- gen_context(system_u:object_r:ipsec_var_run_t,s0) + /var/run/pluto(/.*)? gen_context(system_u:object_r:ipsec_var_run_t,s0) + /var/run/racoon\.pid -- gen_context(system_u:object_r:ipsec_var_run_t,s0) ++/var/run/pluto/ipsec\.info -- gen_context(system_u:object_r:ipsec_mgmt_var_run_t, s0) ++/var/run/pluto/ipsec_setup\.pid -- gen_context(system_u:object_r:ipsec_mgmt_var_run_t, s0) +diff --git a/policy/modules/system/ipsec.if b/policy/modules/system/ipsec.if +index 0d4c8d35e5..0cd667eb39 100644 +--- a/policy/modules/system/ipsec.if ++++ b/policy/modules/system/ipsec.if +@@ -18,6 +18,24 @@ interface(`ipsec_domtrans',` + domtrans_pattern($1, ipsec_exec_t, ipsec_t) + ') + ++####################################### ++## ++## Allow read/write ipsec pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_rw_inherited_pipes',` ++ gen_require(` ++ type ipsec_t; ++ ') ++ ++ allow $1 ipsec_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ + ######################################## + ## + ## Connect to IPSEC using a unix domain stream socket. +@@ -55,6 +73,64 @@ interface(`ipsec_domtrans_mgmt',` + domtrans_pattern($1, ipsec_mgmt_exec_t, ipsec_mgmt_t) + ') + ++####################################### ++## ++## Allow to create OBJECT in /etc with ipsec_key_file_t. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_filetrans_key_file',` ++ gen_require(` ++ type ipsec_key_file_t; ++ ') ++ ++ files_etc_filetrans($1, ipsec_key_file_t, file) ++') ++ ++####################################### ++## ++## Allow to manage ipsec key files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_manage_key_file',` ++ gen_require(` ++ type ipsec_key_file_t; ++ ') ++ ++ manage_files_pattern($1, ipsec_key_file_t, ipsec_key_file_t) ++ files_etc_filetrans($1, ipsec_key_file_t, file, "ipsec.secrets") ++') ++ ++######################################## ++## ++## Read the ipsec_mgmt_var_run_t files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_mgmt_read_pid',` ++ gen_require(` ++ type ipsec_var_run_t; ++ type ipsec_mgmt_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, ipsec_var_run_t, ipsec_mgmt_var_run_t) ++') ++ ++ + ######################################## + ## + ## Connect to racoon using a unix domain stream socket. +@@ -120,7 +196,6 @@ interface(`ipsec_exec_mgmt',` + ## + ## + # +-# + interface(`ipsec_signal_mgmt',` + gen_require(` + type ipsec_mgmt_t; +@@ -139,7 +214,6 @@ interface(`ipsec_signal_mgmt',` + ## + ## + # +-# + interface(`ipsec_signull_mgmt',` + gen_require(` + type ipsec_mgmt_t; +@@ -158,7 +232,6 @@ interface(`ipsec_signull_mgmt',` + ##
      + ## + # +-# + interface(`ipsec_kill_mgmt',` + gen_require(` + type ipsec_mgmt_t; +@@ -167,6 +240,60 @@ interface(`ipsec_kill_mgmt',` + allow $1 ipsec_mgmt_t:process sigkill; + ') + ++######################################## ++## ++## Send ipsec a general signal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_signal',` ++ gen_require(` ++ type ipsec_t; ++ ') ++ ++ allow $1 ipsec_t:process signal; ++') ++ ++######################################## ++## ++## Send ipsec a null signal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_signull',` ++ gen_require(` ++ type ipsec_t; ++ ') ++ ++ allow $1 ipsec_t:process signull; ++') ++ ++######################################## ++## ++## Send ipsec a kill signal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_kill',` ++ gen_require(` ++ type ipsec_t; ++ ') ++ ++ allow $1 ipsec_t:process sigkill; ++') ++ + ###################################### + ## + ## Send and receive messages from +@@ -225,6 +352,7 @@ interface(`ipsec_match_default_spd',` + + allow $1 ipsec_spd_t:association polmatch; + allow $1 self:association sendto; ++ allow $1 self:peer recv; + ') + + ######################################## +@@ -245,6 +373,25 @@ interface(`ipsec_setcontext_default_spd',` + + allow $1 ipsec_spd_t:association setcontext; + ') ++######################################## ++## ++## Read the ipsec_var_run_t files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipsec_read_pid',` ++ gen_require(` ++ type ipsec_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, ipsec_var_run_t, ipsec_var_run_t) ++ read_sock_files_pattern($1, ipsec_var_run_t, ipsec_var_run_t) ++') + + ######################################## + ## +@@ -282,6 +429,7 @@ interface(`ipsec_manage_pid',` + + files_search_pids($1) + manage_files_pattern($1, ipsec_var_run_t, ipsec_var_run_t) ++ manage_sock_files_pattern($1, ipsec_var_run_t, ipsec_var_run_t) + ') + + ######################################## +@@ -369,3 +517,46 @@ interface(`ipsec_run_setkey',` + ipsec_domtrans_setkey($1) + role $2 types setkey_t; + ') ++ ++####################################### ++## ++## Execute strongswan in the ipsec_mgmt domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ipsec_mgmt_systemctl',` ++ gen_require(` ++ type ipsec_mgmt_unit_file_t; ++ type ipsec_mgmt_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 ipsec_mgmt_unit_file_t:file read_file_perms; ++ allow $1 ipsec_mgmt_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ipsec_mgmt_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to write the ipsec ++## log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ipsec_dontaudit_write_log',` ++ gen_require(` ++ type ipsec_log_t; ++ ') ++ ++ dontaudit $1 ipsec_log_t:file rw_inherited_file_perms; ++') +diff --git a/policy/modules/system/ipsec.te b/policy/modules/system/ipsec.te +index 312cd0417c..a3336c6a43 100644 +--- a/policy/modules/system/ipsec.te ++++ b/policy/modules/system/ipsec.te +@@ -48,6 +48,9 @@ init_system_domain(ipsec_mgmt_t, ipsec_mgmt_exec_t) + corecmd_shell_entry_type(ipsec_mgmt_t) + role system_r types ipsec_mgmt_t; + ++type ipsec_mgmt_unit_file_t; ++systemd_unit_file(ipsec_mgmt_unit_file_t) ++ + type ipsec_mgmt_lock_t; + files_lock_file(ipsec_mgmt_lock_t) + +@@ -67,29 +70,43 @@ type setkey_exec_t; + init_system_domain(setkey_t, setkey_exec_t) + role system_r types setkey_t; + ++# The NetworkManager helper communicates the password via PTY ++type ipsec_mgmt_devpts_t; ++term_pty(ipsec_mgmt_devpts_t) ++files_type(ipsec_mgmt_devpts_t) ++ + ######################################## + # + # ipsec Local policy + # + +-allow ipsec_t self:capability { net_admin dac_override dac_read_search setpcap sys_nice }; +-dontaudit ipsec_t self:capability { sys_ptrace sys_tty_config }; +-allow ipsec_t self:process { getcap setcap getsched signal setsched }; ++allow ipsec_t self:capability { net_admin dac_override dac_read_search setpcap sys_nice net_raw setuid setgid }; ++dontaudit ipsec_t self:capability sys_tty_config; ++allow ipsec_t self:process { getcap setcap getsched signal signull setsched sigkill }; + allow ipsec_t self:tcp_socket create_stream_socket_perms; + allow ipsec_t self:udp_socket create_socket_perms; ++allow ipsec_t self:packet_socket create_socket_perms; + allow ipsec_t self:key_socket create_socket_perms; + allow ipsec_t self:fifo_file read_fifo_file_perms; + allow ipsec_t self:netlink_xfrm_socket { create_netlink_socket_perms nlmsg_write }; ++allow ipsec_t self:netlink_selinux_socket create_socket_perms; ++allow ipsec_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow ipsec_t self:netlink_route_socket { create_netlink_socket_perms write }; + + allow ipsec_t ipsec_initrc_exec_t:file read_file_perms; + + allow ipsec_t ipsec_conf_file_t:dir list_dir_perms; +-read_files_pattern(ipsec_t, ipsec_conf_file_t, ipsec_conf_file_t) + read_lnk_files_pattern(ipsec_t, ipsec_conf_file_t, ipsec_conf_file_t) ++manage_files_pattern(ipsec_t, ipsec_conf_file_t, ipsec_conf_file_t) ++filetrans_pattern(ipsec_t, ipsec_conf_file_t, ipsec_key_file_t, file, "ipsec.secrets") + + allow ipsec_t ipsec_key_file_t:dir list_dir_perms; +-manage_files_pattern(ipsec_t, ipsec_key_file_t, ipsec_key_file_t) + read_lnk_files_pattern(ipsec_t, ipsec_key_file_t, ipsec_key_file_t) ++manage_files_pattern(ipsec_t, ipsec_key_file_t, ipsec_key_file_t) ++allow ipsec_t ipsec_key_file_t:file map; ++ ++manage_files_pattern(ipsec_t, ipsec_log_t, ipsec_log_t) ++logging_log_filetrans(ipsec_t, ipsec_log_t, file, "pluto.log") + + manage_dirs_pattern(ipsec_t, ipsec_tmp_t, ipsec_tmp_t) + manage_files_pattern(ipsec_t, ipsec_tmp_t, ipsec_tmp_t) +@@ -101,19 +118,22 @@ manage_sock_files_pattern(ipsec_t, ipsec_var_run_t, ipsec_var_run_t) + files_pid_filetrans(ipsec_t, ipsec_var_run_t, { dir file sock_file }) + + can_exec(ipsec_t, ipsec_mgmt_exec_t) ++can_exec(ipsec_t, ipsec_exec_t) + + # pluto runs an updown script (by calling popen()!) as this is by default + # a shell script, we need to find a way to make things work without + # letting all sorts of stuff possibly be run... + # so try flipping back into the ipsec_mgmt_t domain + corecmd_shell_domtrans(ipsec_t, ipsec_mgmt_t) ++allow ipsec_t ipsec_mgmt_t:process2 nnp_transition; ++ + allow ipsec_mgmt_t ipsec_t:fd use; + allow ipsec_mgmt_t ipsec_t:fifo_file rw_fifo_file_perms; + allow ipsec_mgmt_t ipsec_t:unix_stream_socket { read write }; +-allow ipsec_mgmt_t ipsec_t:process { rlimitinh sigchld }; ++allow ipsec_mgmt_t ipsec_t:process { rlimitinh sigchld signull }; + + kernel_read_kernel_sysctls(ipsec_t) +-kernel_read_net_sysctls(ipsec_t) ++kernel_rw_net_sysctls(ipsec_t) + kernel_list_proc(ipsec_t) + kernel_read_proc_symlinks(ipsec_t) + # allow pluto to access /proc/net/ipsec_eroute; +@@ -128,20 +148,22 @@ corecmd_exec_shell(ipsec_t) + corecmd_exec_bin(ipsec_t) + + # Pluto needs network access +-corenet_all_recvfrom_unlabeled(ipsec_t) +-corenet_tcp_sendrecv_all_if(ipsec_t) +-corenet_raw_sendrecv_all_if(ipsec_t) +-corenet_tcp_sendrecv_all_nodes(ipsec_t) +-corenet_raw_sendrecv_all_nodes(ipsec_t) ++corenet_tcp_sendrecv_generic_if(ipsec_t) ++corenet_raw_sendrecv_generic_if(ipsec_t) ++corenet_tcp_sendrecv_generic_node(ipsec_t) ++corenet_raw_sendrecv_generic_node(ipsec_t) + corenet_tcp_sendrecv_all_ports(ipsec_t) +-corenet_tcp_bind_all_nodes(ipsec_t) +-corenet_udp_bind_all_nodes(ipsec_t) ++corenet_tcp_bind_generic_node(ipsec_t) ++corenet_udp_bind_generic_node(ipsec_t) + corenet_tcp_bind_reserved_port(ipsec_t) + corenet_tcp_bind_isakmp_port(ipsec_t) + corenet_udp_bind_isakmp_port(ipsec_t) + corenet_udp_bind_ipsecnat_port(ipsec_t) ++corenet_udp_bind_dhcpc_port(ipsec_t) + corenet_sendrecv_generic_server_packets(ipsec_t) + corenet_sendrecv_isakmp_server_packets(ipsec_t) ++corenet_tcp_connect_http_port(ipsec_t) ++corenet_tcp_connect_ldap_port(ipsec_t) + + dev_read_sysfs(ipsec_t) + dev_read_rand(ipsec_t) +@@ -157,23 +179,40 @@ files_dontaudit_search_home(ipsec_t) + fs_getattr_all_fs(ipsec_t) + fs_search_auto_mountpoints(ipsec_t) + ++selinux_compute_access_vector(ipsec_t) ++ + term_use_console(ipsec_t) + term_dontaudit_use_all_ttys(ipsec_t) + ++auth_use_pam(ipsec_t) + auth_use_nsswitch(ipsec_t) ++auth_read_home_content(ipsec_t) + + init_use_fds(ipsec_t) + init_use_script_ptys(ipsec_t) + ++logging_send_audit_msgs(ipsec_t) + logging_send_syslog_msg(ipsec_t) + +-miscfiles_read_localization(ipsec_t) ++miscfiles_map_generic_certs(ipsec_t) + + sysnet_domtrans_ifconfig(ipsec_t) ++sysnet_exec_ifconfig(ipsec_t) ++sysnet_nnp_domtrans_ifconfig(ipsec_t) ++sysnet_manage_config(ipsec_t) ++sysnet_etc_filetrans_config(ipsec_t) + + userdom_dontaudit_use_unpriv_user_fds(ipsec_t) + userdom_dontaudit_search_user_home_dirs(ipsec_t) + ++optional_policy(` ++ iptables_domtrans(ipsec_t) ++') ++ ++optional_policy(` ++ l2tpd_read_pid_files(ipsec_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(ipsec_t) + ') +@@ -187,14 +226,15 @@ optional_policy(` + # ipsec_mgmt Local policy + # + +-allow ipsec_mgmt_t self:capability { dac_override dac_read_search net_admin setpcap sys_nice }; +-dontaudit ipsec_mgmt_t self:capability { sys_ptrace sys_tty_config }; +-allow ipsec_mgmt_t self:process { getsched ptrace setrlimit setsched signal }; +-allow ipsec_mgmt_t self:unix_stream_socket create_stream_socket_perms; ++allow ipsec_mgmt_t self:capability { dac_override dac_read_search net_admin setpcap sys_nice sys_ptrace }; ++dontaudit ipsec_mgmt_t self:capability sys_tty_config; ++allow ipsec_mgmt_t self:process { getsched setrlimit setsched signal }; ++allow ipsec_mgmt_t self:unix_stream_socket { create_stream_socket_perms connectto }; + allow ipsec_mgmt_t self:tcp_socket create_stream_socket_perms; + allow ipsec_mgmt_t self:udp_socket create_socket_perms; + allow ipsec_mgmt_t self:key_socket create_socket_perms; + allow ipsec_mgmt_t self:fifo_file rw_fifo_file_perms; ++allow ipsec_mgmt_t self:netlink_xfrm_socket { create_netlink_socket_perms nlmsg_read }; + + allow ipsec_mgmt_t ipsec_mgmt_lock_t:file manage_file_perms; + files_lock_filetrans(ipsec_mgmt_t, ipsec_mgmt_lock_t, file) +@@ -208,12 +248,14 @@ logging_log_filetrans(ipsec_mgmt_t, ipsec_log_t, file) + + allow ipsec_mgmt_t ipsec_mgmt_var_run_t:file manage_file_perms; + files_pid_filetrans(ipsec_mgmt_t, ipsec_mgmt_var_run_t, file) ++filetrans_pattern(ipsec_mgmt_t, ipsec_var_run_t, ipsec_mgmt_var_run_t, file) + + manage_files_pattern(ipsec_mgmt_t, ipsec_var_run_t, ipsec_var_run_t) ++manage_dirs_pattern(ipsec_mgmt_t, ipsec_var_run_t, ipsec_var_run_t) + manage_lnk_files_pattern(ipsec_mgmt_t, ipsec_var_run_t, ipsec_var_run_t) + + allow ipsec_mgmt_t ipsec_var_run_t:sock_file manage_sock_file_perms; +-files_pid_filetrans(ipsec_mgmt_t, ipsec_var_run_t, sock_file) ++files_pid_filetrans(ipsec_mgmt_t, ipsec_var_run_t, { dir sock_file }) + + # _realsetup needs to be able to cat /var/run/pluto.pid, + # run ps on that pid, and delete the file +@@ -236,6 +278,7 @@ can_exec(ipsec_mgmt_t, ipsec_mgmt_exec_t) + allow ipsec_mgmt_t ipsec_mgmt_exec_t:lnk_file read; + + domtrans_pattern(ipsec_mgmt_t, ipsec_exec_t, ipsec_t) ++allow ipsec_mgmt_t ipsec_exec_t:file map; + + kernel_rw_net_sysctls(ipsec_mgmt_t) + # allow pluto to access /proc/net/ipsec_eroute; +@@ -246,6 +289,16 @@ kernel_read_kernel_sysctls(ipsec_mgmt_t) + kernel_getattr_core_if(ipsec_mgmt_t) + kernel_getattr_message_if(ipsec_mgmt_t) + ++domain_dontaudit_getattr_all_sockets(ipsec_mgmt_t) ++domain_dontaudit_getattr_all_pipes(ipsec_mgmt_t) ++ ++dev_dontaudit_getattr_all_blk_files(ipsec_mgmt_t) ++dev_dontaudit_getattr_all_chr_files(ipsec_mgmt_t) ++ ++dev_read_sysfs(ipsec_mgmt_t) ++ ++files_dontaudit_getattr_all_files(ipsec_mgmt_t) ++files_dontaudit_getattr_all_sockets(ipsec_mgmt_t) + files_read_kernel_symbol_table(ipsec_mgmt_t) + files_getattr_kernel_modules(ipsec_mgmt_t) + +@@ -255,6 +308,8 @@ files_getattr_kernel_modules(ipsec_mgmt_t) + corecmd_exec_bin(ipsec_mgmt_t) + corecmd_exec_shell(ipsec_mgmt_t) + ++corenet_tcp_connect_rndc_port(ipsec_mgmt_t) ++ + dev_read_rand(ipsec_mgmt_t) + dev_read_urand(ipsec_mgmt_t) + +@@ -269,6 +324,7 @@ domain_dontaudit_rw_all_key_sockets(ipsec_mgmt_t) + files_read_etc_files(ipsec_mgmt_t) + files_exec_etc_files(ipsec_mgmt_t) + files_read_etc_runtime_files(ipsec_mgmt_t) ++files_list_kernel_modules(ipsec_mgmt_t) + files_read_usr_files(ipsec_mgmt_t) + files_dontaudit_getattr_default_dirs(ipsec_mgmt_t) + files_dontaudit_getattr_default_files(ipsec_mgmt_t) +@@ -278,9 +334,10 @@ fs_getattr_xattr_fs(ipsec_mgmt_t) + fs_list_tmpfs(ipsec_mgmt_t) + + term_use_console(ipsec_mgmt_t) +-term_dontaudit_getattr_unallocated_ttys(ipsec_mgmt_t) ++term_use_all_inherited_terms(ipsec_mgmt_t) + + auth_dontaudit_read_login_records(ipsec_mgmt_t) ++auth_use_nsswitch(ipsec_mgmt_t) + + init_read_utmp(ipsec_mgmt_t) + init_use_script_ptys(ipsec_mgmt_t) +@@ -288,17 +345,30 @@ init_exec_script_files(ipsec_mgmt_t) + init_use_fds(ipsec_mgmt_t) + init_labeled_script_domtrans(ipsec_mgmt_t, ipsec_initrc_exec_t) + +-logging_send_syslog_msg(ipsec_mgmt_t) +- +-miscfiles_read_localization(ipsec_mgmt_t) ++ipsec_mgmt_systemctl(ipsec_mgmt_t) + +-seutil_dontaudit_search_config(ipsec_mgmt_t) ++logging_read_all_logs(ipsec_mgmt_t) ++logging_send_syslog_msg(ipsec_mgmt_t) + + sysnet_manage_config(ipsec_mgmt_t) + sysnet_domtrans_ifconfig(ipsec_mgmt_t) + sysnet_etc_filetrans_config(ipsec_mgmt_t) ++sysnet_exec_ifconfig(ipsec_mgmt_t) ++sysnet_nnp_domtrans_ifconfig(ipsec_mgmt_t) + +-userdom_use_user_terminals(ipsec_mgmt_t) ++systemd_exec_systemctl(ipsec_mgmt_t) ++ ++userdom_use_inherited_user_terminals(ipsec_mgmt_t) ++ ++allow ipsec_mgmt_t ipsec_mgmt_devpts_t:chr_file rw_term_perms; ++term_create_pty(ipsec_mgmt_t,ipsec_mgmt_devpts_t) ++ ++optional_policy(` ++ bind_domtrans(ipsec_mgmt_t) ++ bind_read_dnssec_keys(ipsec_mgmt_t) ++ bind_read_config(ipsec_mgmt_t) ++ bind_read_state(ipsec_mgmt_t) ++') + + optional_policy(` + consoletype_exec(ipsec_mgmt_t) +@@ -321,6 +391,10 @@ optional_policy(` + iptables_domtrans(ipsec_mgmt_t) + ') + ++optional_policy(` ++ l2tpd_read_pid_files(ipsec_mgmt_t) ++') ++ + optional_policy(` + modutils_domtrans_insmod(ipsec_mgmt_t) + ') +@@ -335,7 +409,7 @@ optional_policy(` + # + + allow racoon_t self:capability { net_admin net_bind_service }; +-allow racoon_t self:netlink_route_socket create_netlink_socket_perms; ++allow racoon_t self:netlink_route_socket { create_netlink_socket_perms }; + allow racoon_t self:unix_dgram_socket { connect create ioctl write }; + allow racoon_t self:netlink_selinux_socket { bind create read }; + allow racoon_t self:udp_socket create_socket_perms; +@@ -370,13 +444,12 @@ kernel_request_load_module(racoon_t) + corecmd_exec_shell(racoon_t) + corecmd_exec_bin(racoon_t) + +-corenet_all_recvfrom_unlabeled(racoon_t) +-corenet_tcp_sendrecv_all_if(racoon_t) +-corenet_udp_sendrecv_all_if(racoon_t) +-corenet_tcp_sendrecv_all_nodes(racoon_t) +-corenet_udp_sendrecv_all_nodes(racoon_t) +-corenet_tcp_bind_all_nodes(racoon_t) +-corenet_udp_bind_all_nodes(racoon_t) ++corenet_tcp_sendrecv_generic_if(racoon_t) ++corenet_udp_sendrecv_generic_if(racoon_t) ++corenet_tcp_sendrecv_generic_node(racoon_t) ++corenet_udp_sendrecv_generic_node(racoon_t) ++corenet_tcp_bind_generic_node(racoon_t) ++corenet_udp_bind_generic_node(racoon_t) + corenet_udp_bind_isakmp_port(racoon_t) + corenet_udp_bind_ipsecnat_port(racoon_t) + +@@ -401,10 +474,10 @@ locallogin_use_fds(racoon_t) + logging_send_syslog_msg(racoon_t) + logging_send_audit_msgs(racoon_t) + +-miscfiles_read_localization(racoon_t) +- + sysnet_exec_ifconfig(racoon_t) + ++auth_use_pam(racoon_t) ++ + auth_can_read_shadow_passwords(racoon_t) + tunable_policy(`racoon_read_shadow',` + auth_tunable_read_shadow(racoon_t) +@@ -438,9 +511,8 @@ corenet_setcontext_all_spds(setkey_t) + + locallogin_use_fds(setkey_t) + +-miscfiles_read_localization(setkey_t) + + seutil_read_config(setkey_t) + +-userdom_use_user_terminals(setkey_t) +- ++userdom_use_inherited_user_terminals(setkey_t) ++userdom_read_user_tmp_files(setkey_t) +diff --git a/policy/modules/system/iptables.fc b/policy/modules/system/iptables.fc +index 73a1c4e1eb..193006ef64 100644 +--- a/policy/modules/system/iptables.fc ++++ b/policy/modules/system/iptables.fc +@@ -1,22 +1,50 @@ + /etc/rc\.d/init\.d/ip6?tables -- gen_context(system_u:object_r:iptables_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/ebtables -- gen_context(system_u:object_r:iptables_initrc_exec_t,s0) +-/etc/sysconfig/ip6?tables.* -- gen_context(system_u:object_r:iptables_conf_t,s0) +-/etc/sysconfig/system-config-firewall.* -- gen_context(system_u:object_r:iptables_conf_t,s0) ++/etc/rc\.d/init\.d/ebtables -- gen_context(system_u:object_r:iptables_initrc_exec_t,s0) + +-/sbin/ebtables -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/lib/systemd/system/arptables.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++/usr/lib/systemd/system/iptables.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++/usr/lib/systemd/system/ip6tables.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++/usr/lib/systemd/system/ipset.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++ ++/usr/libexec/iptables/iptables.init -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/libexec/iptables/ip6tables.init -- gen_context(system_u:object_r:iptables_exec_t,s0) ++ ++ ++/usr/libexec/ipset -- gen_context(system_u:object_r:iptables_exec_t,s0) ++ ++/sbin/arptables -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/arptables-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/arptables-save -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ebtables -- gen_context(system_u:object_r:iptables_exec_t,s0) + /sbin/ebtables-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ipchains.* -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ip6?tables -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ip6?tables-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ip6?tables-multi -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ipvsadm -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ipchains.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ip6?tables.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ip6?tables-restore.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ip6?tables-multi.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ipset -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ipvsadm -- gen_context(system_u:object_r:iptables_exec_t,s0) + /sbin/ipvsadm-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/ipvsadm-save -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/sbin/xtables-multi -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/ipvsadm-save -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/sbin/xtables-multi -- gen_context(system_u:object_r:iptables_exec_t,s0) + +-/usr/sbin/conntrack -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/arptables -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/conntrack -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ebtables -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ebtables-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) + /usr/sbin/ipchains.* -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/usr/sbin/ipset -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/usr/sbin/iptables -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/usr/sbin/iptables-multi -- gen_context(system_u:object_r:iptables_exec_t,s0) +-/usr/sbin/iptables-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ip6?tables.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ip6?tables-restore.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ip6?tables-multi.* -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ipset -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ipvsadm -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ipvsadm-restore -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/ipvsadm-save -- gen_context(system_u:object_r:iptables_exec_t,s0) ++/usr/sbin/xtables-multi -- gen_context(system_u:object_r:iptables_exec_t,s0) ++ ++/var/lib/ebtables(/.*)? gen_context(system_u:object_r:iptables_var_lib_t,s0) ++ ++/var/lock/subsys/iptables -- gen_context(system_u:object_r:iptables_lock_t,s0) ++/var/lock/subsys/ip6tables -- gen_context(system_u:object_r:iptables_lock_t,s0) ++ ++/var/run/xtables.* -- gen_context(system_u:object_r:iptables_var_run_t,s0) ++/var/run/ebtables.* -- gen_context(system_u:object_r:iptables_var_run_t,s0) +diff --git a/policy/modules/system/iptables.if b/policy/modules/system/iptables.if +index c42fbc3293..5e1a4a51cd 100644 +--- a/policy/modules/system/iptables.if ++++ b/policy/modules/system/iptables.if +@@ -17,10 +17,7 @@ interface(`iptables_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, iptables_exec_t, iptables_t) +- +- ifdef(`hide_broken_symptoms', ` +- dontaudit iptables_t $1:socket_class_set { read write }; +- ') ++ allow $1 iptables_exec_t:file map; + ') + + ######################################## +@@ -86,6 +83,30 @@ interface(`iptables_initrc_domtrans',` + init_labeled_script_domtrans($1, iptables_initrc_exec_t) + ') + ++######################################## ++## ++## Execute iptables server in the iptables domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`iptables_systemctl',` ++ gen_require(` ++ type iptables_unit_file_t; ++ type iptables_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 iptables_unit_file_t:file read_file_perms; ++ allow $1 iptables_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, iptables_t) ++') ++ + ##################################### + ## + ## Set the attributes of iptables config files. +@@ -163,3 +184,40 @@ interface(`iptables_manage_config',` + files_search_etc($1) + manage_files_pattern($1, iptables_conf_t, iptables_conf_t) + ') ++ ++######################################## ++## ++## Transition to iptables named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`iptables_filetrans_named_content',` ++ gen_require(` ++ type iptables_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, iptables_var_run_t, file, "xtables.lock") ++') ++ ++##################################### ++## ++## Read iptables run files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`iptables_read_var_run',` ++ gen_require(` ++ type iptables_var_run_t; ++ ') ++ ++ allow $1 iptables_var_run_t:dir list_dir_perms; ++ read_files_pattern($1, iptables_var_run_t, iptables_var_run_t) ++') +diff --git a/policy/modules/system/iptables.te b/policy/modules/system/iptables.te +index be8ed1e6c4..a9e54e32e1 100644 +--- a/policy/modules/system/iptables.te ++++ b/policy/modules/system/iptables.te +@@ -16,15 +16,21 @@ role iptables_roles types iptables_t; + type iptables_initrc_exec_t; + init_script_file(iptables_initrc_exec_t) + +-type iptables_conf_t; +-files_config_file(iptables_conf_t) +- + type iptables_tmp_t; + files_tmp_file(iptables_tmp_t) + + type iptables_var_run_t; + files_pid_file(iptables_var_run_t) + ++type iptables_var_lib_t; ++files_pid_file(iptables_var_lib_t) ++ ++type iptables_lock_t; ++files_lock_file(iptables_lock_t) ++ ++type iptables_unit_file_t; ++systemd_unit_file(iptables_unit_file_t) ++ + ######################################## + # + # Iptables local policy +@@ -32,29 +38,45 @@ files_pid_file(iptables_var_run_t) + + allow iptables_t self:capability { dac_read_search dac_override net_admin net_raw }; + dontaudit iptables_t self:capability sys_tty_config; ++dontaudit iptables_t self:capability2 block_suspend; + allow iptables_t self:fifo_file rw_fifo_file_perms; + allow iptables_t self:process { sigchld sigkill sigstop signull signal }; + allow iptables_t self:netlink_socket create_socket_perms; ++allow iptables_t self:netlink_generic_socket create_socket_perms; ++allow iptables_t self:netlink_netfilter_socket create_socket_perms; + allow iptables_t self:rawip_socket create_socket_perms; + +-manage_files_pattern(iptables_t, iptables_conf_t, iptables_conf_t) +-files_etc_filetrans(iptables_t, iptables_conf_t, file) ++files_manage_system_conf_files(iptables_t) ++files_etc_filetrans_system_conf(iptables_t) ++files_etc_filetrans(iptables_t, system_conf_t, dir) + + manage_files_pattern(iptables_t, iptables_var_run_t, iptables_var_run_t) + files_pid_filetrans(iptables_t, iptables_var_run_t, file) + ++manage_dirs_pattern(iptables_t, iptables_var_lib_t, iptables_var_lib_t) ++manage_files_pattern(iptables_t, iptables_var_lib_t, iptables_var_lib_t) ++manage_lnk_files_pattern(iptables_t, iptables_var_lib_t, iptables_var_lib_t) ++files_var_lib_filetrans(iptables_t, iptables_var_lib_t, { file dir lnk_file }) ++ + can_exec(iptables_t, iptables_exec_t) + ++manage_files_pattern(iptables_t, iptables_lock_t, iptables_lock_t) ++files_lock_filetrans(iptables_t, iptables_lock_t, file) ++ + allow iptables_t iptables_tmp_t:dir manage_dir_perms; + allow iptables_t iptables_tmp_t:file manage_file_perms; + files_tmp_filetrans(iptables_t, iptables_tmp_t, { file dir }) + ++kernel_getattr_proc(iptables_t) + kernel_request_load_module(iptables_t) + kernel_read_system_state(iptables_t) + kernel_read_network_state(iptables_t) + kernel_read_kernel_sysctls(iptables_t) +-kernel_read_modprobe_sysctls(iptables_t) ++kernel_read_usermodehelper_state(iptables_t) + kernel_use_fds(iptables_t) ++kernel_rw_net_sysctls(iptables_t) ++kernel_search_network_sysctl(iptables_t) ++ + + # needed by ipvsadm + corecmd_exec_bin(iptables_t) +@@ -64,19 +86,24 @@ corenet_relabelto_all_packets(iptables_t) + corenet_dontaudit_rw_tun_tap_dev(iptables_t) + + dev_read_sysfs(iptables_t) ++dev_read_urand(iptables_t) ++dev_read_rand(iptables_t) + + fs_getattr_xattr_fs(iptables_t) + fs_search_auto_mountpoints(iptables_t) + fs_list_inotifyfs(iptables_t) ++fs_read_nsfs_files(iptables_t) + + mls_file_read_all_levels(iptables_t) + + term_dontaudit_use_console(iptables_t) ++term_use_all_inherited_terms(iptables_t) + + domain_use_interactive_fds(iptables_t) + +-files_read_etc_files(iptables_t) +-files_read_etc_runtime_files(iptables_t) ++files_rw_etc_runtime_files(iptables_t) ++files_rw_inherited_tmp_file(iptables_t) ++files_read_kernel_modules(iptables_t) + + auth_use_nsswitch(iptables_t) + +@@ -85,15 +112,14 @@ init_use_script_ptys(iptables_t) + # to allow rules to be saved on reboot: + init_rw_script_tmp_files(iptables_t) + init_rw_script_stream_sockets(iptables_t) ++init_dontaudit_script_leaks(iptables_t) + + logging_send_syslog_msg(iptables_t) + +-miscfiles_read_localization(iptables_t) +- + sysnet_run_ifconfig(iptables_t, iptables_roles) + sysnet_dns_name_resolve(iptables_t) + +-userdom_use_user_terminals(iptables_t) ++userdom_use_inherited_user_terminals(iptables_t) + userdom_use_all_users_fds(iptables_t) + + ifdef(`hide_broken_symptoms',` +@@ -102,6 +128,9 @@ ifdef(`hide_broken_symptoms',` + + optional_policy(` + fail2ban_append_log(iptables_t) ++ fail2ban_read_log(iptables_t) ++ fail2ban_dontaudit_leaks(iptables_t) ++ fail2ban_rw_inherited_tmp_files(iptables_t) + ') + + optional_policy(` +@@ -109,8 +138,16 @@ optional_policy(` + firstboot_rw_pipes(iptables_t) + ') + ++optional_policy(` ++ firewalld_read_config(iptables_t) ++ firewalld_read_pid_files(iptables_t) ++ firewalld_dontaudit_write_tmp_files(iptables_t) ++') ++ + optional_policy(` + modutils_run_insmod(iptables_t, iptables_roles) ++ modutils_list_module_config(iptables_t) ++ modutils_read_module_config(iptables_t) + ') + + optional_policy(` +@@ -118,12 +155,26 @@ optional_policy(` + nis_use_ypbind(iptables_t) + ') + ++optional_policy(` ++ plymouthd_exec_plymouth(iptables_t) ++') ++ + optional_policy(` + ppp_dontaudit_use_fds(iptables_t) + ') + + optional_policy(` + psad_rw_tmp_files(iptables_t) ++ psad_write_log(iptables_t) ++') ++ ++optional_policy(` ++ ctdbd_read_lib_files(iptables_t) ++') ++ ++optional_policy(` ++ neutron_rw_inherited_pipes(iptables_t) ++ neutron_sigchld(iptables_t) + ') + + optional_policy(` +@@ -132,12 +183,13 @@ optional_policy(` + + optional_policy(` + seutil_sigchld_newrole(iptables_t) ++ seutil_run_setfiles(iptables_t, iptables_roles) + ') + + optional_policy(` ++ shorewall_read_config(iptables_t) + shorewall_read_tmp_files(iptables_t) + shorewall_rw_lib_files(iptables_t) +- shorewall_read_config(iptables_t) + ') + + optional_policy(` +diff --git a/policy/modules/system/libraries.fc b/policy/modules/system/libraries.fc +index 73bb3c00cc..354e282d6d 100644 +--- a/policy/modules/system/libraries.fc ++++ b/policy/modules/system/libraries.fc +@@ -1,3 +1,4 @@ ++ + # + # /emul + # +@@ -28,14 +29,17 @@ ifdef(`distro_redhat',` + # /etc + # + /etc/ld\.so\.cache -- gen_context(system_u:object_r:ld_so_cache_t,s0) ++/etc/ld\.so\.cache~ -- gen_context(system_u:object_r:ld_so_cache_t,s0) + /etc/ld\.so\.preload -- gen_context(system_u:object_r:ld_so_cache_t,s0) ++/etc/ld\.so\.preload~ -- gen_context(system_u:object_r:ld_so_cache_t,s0) + + /etc/ppp/plugins/rp-pppoe\.so -- gen_context(system_u:object_r:lib_t,s0) + + # + # /lib(64)? + # +-/lib -d gen_context(system_u:object_r:lib_t,s0) ++/lib gen_context(system_u:object_r:lib_t,s0) ++/lib64 gen_context(system_u:object_r:lib_t,s0) + /lib/.* gen_context(system_u:object_r:lib_t,s0) + /lib/ld-[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:ld_so_t,s0) + +@@ -52,9 +56,8 @@ ifdef(`distro_gentoo',` + # + # /opt + # +-/opt/.*\.so gen_context(system_u:object_r:lib_t,s0) ++/opt/.*\.so(\.[^/]*)* gen_context(system_u:object_r:lib_t,s0) + /opt/(.*/)?lib(/.*)? gen_context(system_u:object_r:lib_t,s0) +-/opt/(.*/)?lib64(/.*)? gen_context(system_u:object_r:lib_t,s0) + /opt/(.*/)?java/.+\.jar -- gen_context(system_u:object_r:lib_t,s0) + /opt/(.*/)?jre.*/.+\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /opt/(.*/)?jre/.+\.jar -- gen_context(system_u:object_r:lib_t,s0) +@@ -103,6 +106,12 @@ ifdef(`distro_redhat',` + # + # /usr + # ++/usr/lib -d gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/.* gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/ld-[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:ld_so_t,s0) ++/usr/lib/gvfs/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/security/pam_poldi\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ + /usr/(.*/)?/HelixPlayer/.+\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/(.*/)?/RealPlayer/.+\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +@@ -111,12 +120,12 @@ ifdef(`distro_redhat',` + /usr/(.*/)?java/.+\.jsa -- gen_context(system_u:object_r:lib_t,s0) + + /usr/(.*/)?lib(/.*)? gen_context(system_u:object_r:lib_t,s0) +-/usr/(.*/)?lib64(/.*)? gen_context(system_u:object_r:lib_t,s0) + +-/usr/(.*/)?lib(64)?(/.*)?/ld-[^/]*\.so(\.[^/]*)* gen_context(system_u:object_r:ld_so_t,s0) ++/usr/(.*/)?lib(/.*)?/ld-[^/]*\.so(\.[^/]*)* gen_context(system_u:object_r:ld_so_t,s0) + + /usr/(.*/)?nvidia/.+\.so(\..*)? -- gen_context(system_u:object_r:textrel_shlib_t,s0) + ++/usr/lib/(sse2/)?libfame-.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/altivec/libavcodec\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/cedega/.+\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/dovecot/(.*/)?lib.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) +@@ -125,10 +134,12 @@ ifdef(`distro_redhat',` + /usr/lib/vlc/codec/libdmo_plugin\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/vlc/codec/librealaudio_plugin\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libtfmessbsp\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/sasl2/libsasldb\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/xorg/libGL\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/X11R6/lib/libGL\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libGL\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/catalyst/libGL\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/catalyst/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libADM5.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libatiadlxx\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/win32/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +@@ -141,19 +152,22 @@ ifdef(`distro_redhat',` + /usr/lib/ati-fglrx/.+\.so(\..*)? -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/fglrx/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libjs\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libjavascriptcoregtk[^/]*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libzvbi\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/sse2/libx264\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/lib(/.*)?/libnvidia.+\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libnvidia\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libcuda\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib.*/libnvidia\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib(/.*)?/nvidia_drv.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/nero/plug-ins/libMP3\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/nvidia-graphics(-[^/]*/)?libGL(core)?\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/nvidia-graphics(-[^/]*/)?libnvidia.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/nvidia-graphics(-[^/]*/)?libXvMCNVIDIA\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/lib/nvidia/libGL(core)?\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/nvidia.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/xorg/modules/glesx\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +-/usr/(local/)?.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:lib_t,s0) +-/usr/(local/)?lib(64)?/wine/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?lib(64)?/(sse2/)?libfame-.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/wine/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/NX/lib/libXcomp\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/NX/lib/libjpeg\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +@@ -182,11 +196,13 @@ ifdef(`distro_redhat',` + # Fedora Core packages: gstreamer-plugins, compat-libstdc++, Glide3, libdv + # HelixPlayer, SDL, xorg-x11, xorg-x11-libs, Hermes, valgrind, openoffice.org-libs, httpd - php + HOME_DIR/.*/plugins/nppdf\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/(.*/)?nprhapengine\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/allegro/(.*/)?alleg-vga\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/firefox-[^/]*/extensions(/.*)?/libqfaservices.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/firefox-[^/]*/plugins/nppdf.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/firefox/plugins/libractrl\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libFLAC\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/dri/fglrx_dri.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/libfglrx_gamma\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/mozilla/plugins/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/mozilla/plugins/libvlcplugin\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +@@ -241,13 +257,11 @@ HOME_DIR/.*/plugins/nppdf\.so.* -- gen_context(system_u:object_r:textrel_shlib_ + + # Livna.org packages: xmms-mp3, ffmpeg, xvidcore, xine-lib, gsm, lame + /usr/lib.*/libmpg123\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/local(/.*)?/libmpg123\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libmpg123\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/libmpg123\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/codecs/drv[1-9c]\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +-HOME_DIR/.*/plugins/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-HOME_DIR/.mozilla/plugins/nprhapengine\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/.*/nprhapengine\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/local/(.*/)?nprhapengine\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + + # Jai, Sun Microsystems (Jpackage SPRM) + /usr/lib/libmlib_jai\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +@@ -269,20 +283,19 @@ HOME_DIR/.mozilla/plugins/nprhapengine\.so.* -- gen_context(system_u:object_r:te + + # Java, Sun Microsystems (JPackage SRPM) + /usr/(.*/)?jre.*/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/local/(.*/)?jre.*/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + /usr/lib/(.*/)?jre.*/.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +-/usr/(local/)?Adobe/(.*/)?intellinux/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?Adobe/(.*/)?intellinux/sidecars/* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/Adobe/(.*/)?intellinux/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/Adobe/(.*/)?intellinux/sidecars/* -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +-/usr/(local/)?acroread/(.*/)?intellinux/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?Adobe/(.*/)?lib/[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?acroread/(.*/)?lib/[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?Adobe/.*\.api -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?lib/xchat/plugins/systray\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?matlab.*/bin/glnx86/libmwlapack\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?matlab.*/bin/glnx86/(libmw(lapack|mathutil|services)|lapack|libmkl)\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) +-/usr/(local/)?matlab.*/sys/os/glnx86/libtermcap\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/acroread/(.*/)?intellinux/nppdf\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/Adobe/(.*/)?lib/[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/acroread/(.*/)?lib/[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/Adobe/.*\.api -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/xchat/plugins/systray\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/matlab.*/bin/glnx86/libmwlapack\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/matlab.*/bin/glnx86/(libmw(lapack|mathutil|services)|lapack|libmkl)\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/matlab.*/sys/os/glnx86/libtermcap\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) + + /usr/(.*/)?intellinux/SPPlugins/ADMPlugin\.apl -- gen_context(system_u:object_r:textrel_shlib_t,s0) + +@@ -299,17 +312,157 @@ HOME_DIR/.mozilla/plugins/nprhapengine\.so.* -- gen_context(system_u:object_r:te + # + /var/cache/ldconfig(/.*)? gen_context(system_u:object_r:ldconfig_cache_t,s0) + +-/var/ftp/lib(64)?(/.*)? gen_context(system_u:object_r:lib_t,s0) +-/var/ftp/lib(64)?/ld[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:ld_so_t,s0) +- +-/var/lib/spamassassin/compiled/.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) ++/var/ftp/lib(/.*)? gen_context(system_u:object_r:lib_t,s0) ++/var/ftp/lib/ld[^/]*\.so(\.[^/]*)* -- gen_context(system_u:object_r:ld_so_t,s0) + + /var/mailman/pythonlib(/.*)?/.+\.so(\..*)? -- gen_context(system_u:object_r:lib_t,s0) + ++/var/named/chroot/lib(/.*)? gen_context(system_u:object_r:lib_t,s0) ++/var/named/chroot/usr/lib(/.*)? gen_context(system_u:object_r:lib_t,s0) ++ ++/usr/lib/pgsql/.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/pgsql/test/regress/.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) ++/var/lib/spamassassin/compiled/.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) ++/usr/lib/xfce4/.*\.so.* -- gen_context(system_u:object_r:lib_t,s0) ++ + ifdef(`distro_suse',` + /var/lib/samba/bin/.+\.so(\.[^/]*)* -l gen_context(system_u:object_r:lib_t,s0) + ') + +-/var/spool/postfix/lib(64)?(/.*)? gen_context(system_u:object_r:lib_t,s0) ++/usr/share/hplip/prnt/plugins(/.*)? gen_context(system_u:object_r:lib_t,s0) ++/usr/share/squeezeboxserver/CPAN/arch/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/var/spool/postfix/lib(/.*)? gen_context(system_u:object_r:lib_t,s0) ++/var/spool/postfix/lib64(/.*)? gen_context(system_u:object_r:lib_t,s0) + /var/spool/postfix/usr(/.*)? gen_context(system_u:object_r:lib_t,s0) +-/var/spool/postfix/lib(64)?/ld.*\.so.* -- gen_context(system_u:object_r:ld_so_t,s0) ++/var/spool/postfix/lib/ld.*\.so.* -- gen_context(system_u:object_r:ld_so_t,s0) ++ ++/usr/lib/libbcm_host\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libmyth[^/]+\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/mythtv/filters/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/jvm/java(.*/)bin(/.*)?/.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/oracle/.*/lib/libnnz10\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/altera9.1/quartus/linux/libccl_err\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/novell/groupwise/client/lib/libgwapijni\.so\.1 -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/sse2/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/i686/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/google-earth/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/googleearth/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/google-earth/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google-earth/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/nspluginwrapper/np.*\.so -- gen_context(system_u:object_r:lib_t,s0) ++ ++/usr/lib/oracle/.*/lib/libnnz.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/oracle/.*/lib/libclntsh\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/(.*/)?oracle/(.*/)?libnnz.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libnnz11.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libxvidcore\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++ ++/opt/matlab.*\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/matlab.*\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/local/matlab.*\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/Zend/lib/ZendExtensionManager\.so gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libcncpmslld328\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/ICAClient/.*\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/midori/.*\.so(\.[^/]*)* gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libav.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/xine/plugins/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/yafaray/libDarkSky.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libpostproc\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libswscale\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libADM.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/gstreamer-.*/[^/]*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libx264\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libmp3lame\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libmpeg2\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/.*/libflashplayer\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/xorg/modules/dri/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/X11R6/lib/modules/dri/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/dri/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++ifdef(`fixed',` ++/usr/lib/libavfilter\.so(\..*)? -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libavdevice\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libavformat.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libavcodec.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libavutil.*\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libdv\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libGLU\.so(\.[^/]*)* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libgsm\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libImlib2\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libjackserver\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/X11R6/lib/libOSMesa.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libOSMesa.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/libSDL-.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/xulrunner-[^/]*/libgtkembedmoz\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/xulrunner-[^/]*/libxul\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++# Flash plugin, Macromedia ++/usr/lib/php/modules/.+\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/lib/httpd/modules/libphp5\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++') ++/opt/VBoxGuestAdditions.*/lib/VBox.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/nmm/liba52\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/lampp/lib/libct\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/lampp/lib/.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/VirtualBox(/.*)?/VBox.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/chromium-browser/.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/zend/lib/apache2/libphp5\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/python.*/site-packages/pymedia/muxer\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/usr/games/darwinia/lib/libSDL.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/octagaplayer/libapplication\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/AutoScan/usr/lib/libvte\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/bin/bsnes -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libGLcore\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libkmplayercommon\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/Unify/SQLBase/libgptsblmsui11\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/real/RealPlayer/plugins(/.*)? -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/opt/real/RealPlayer/codecs(/.*)? -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/vdpau/libvdpau_nvidia\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/libGTL.*\.so.* -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/lib/erlang/erts-[^/]*/bin/epmd -- gen_context(system_u:object_r:lib_t,s0) ++ ++/usr/lib/nsr/(.*/)?.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/lgtonmc/bin/.*\.so(\.[0-9])? -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google/picasa/.*\.dll -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google/picasa/.*\.yti -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google/chrome/.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google/talkplugin/.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++/opt/google/[^/]*/.*\.so -- gen_context(system_u:object_r:textrel_shlib_t,s0) ++ ++/usr/sbin/ldconfig -- gen_context(system_u:object_r:ldconfig_exec_t,s0) +diff --git a/policy/modules/system/libraries.if b/policy/modules/system/libraries.if +index 808ba93ebd..cc985cfbef 100644 +--- a/policy/modules/system/libraries.if ++++ b/policy/modules/system/libraries.if +@@ -64,6 +64,25 @@ interface(`libs_exec_ldconfig',` + can_exec($1, ldconfig_exec_t) + ') + ++######################################## ++## ++## Make ldconfig_exec_t entrypoint for ++## the specified domain. ++## ++## ++## ++## The domain for which bin_t is an entrypoint. ++## ++## ++# ++interface(`libs_ldconfig_exec_entry_type',` ++ gen_require(` ++ type ldconfig_exec_t; ++ ') ++ ++ domain_entry_file($1, ldconfig_exec_t) ++') ++ + ######################################## + ## + ## Use the dynamic link/loader for automatic loading +@@ -84,9 +103,9 @@ interface(`libs_use_ld_so',` + allow $1 lib_t:dir list_dir_perms; + + read_lnk_files_pattern($1, lib_t, { lib_t ld_so_t }) +- mmap_files_pattern($1, lib_t, ld_so_t) ++ mmap_exec_files_pattern($1, lib_t, { lib_t ld_so_t }) + +- allow $1 ld_so_cache_t:file read_file_perms; ++ allow $1 ld_so_cache_t:file { map read_file_perms }; + ') + + ######################################## +@@ -147,6 +166,7 @@ interface(`libs_manage_ld_so',` + type lib_t, ld_so_t; + ') + ++ read_lnk_files_pattern($1, lib_t, lib_t) + manage_files_pattern($1, lib_t, ld_so_t) + ') + +@@ -205,8 +225,26 @@ interface(`libs_search_lib',` + type lib_t; + ') + ++ read_lnk_files_pattern($1, lib_t, lib_t) + allow $1 lib_t:dir search_dir_perms; + ') ++######################################## ++## ++## dontaudit attempts to setattr on library files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`libs_dontaudit_setattr_lib_files',` ++ gen_require(` ++ type lib_t; ++ ') ++ ++ dontaudit $1 lib_t:file setattr; ++') + + ######################################## + ## +@@ -248,27 +286,10 @@ interface(`libs_manage_lib_dirs',` + type lib_t; + ') + ++ read_lnk_files_pattern($1, lib_t, lib_t) + allow $1 lib_t:dir manage_dir_perms; + ') + +-######################################## +-## +-## dontaudit attempts to setattr on library files +-## +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`libs_dontaudit_setattr_lib_files',` +- gen_require(` +- type lib_t; +- ') +- +- dontaudit $1 lib_t:file setattr; +-') +- + ######################################## + ## + ## Read files in the library directories, such +@@ -345,6 +366,7 @@ interface(`libs_manage_lib_files',` + type lib_t; + ') + ++ read_lnk_files_pattern($1, lib_t, lib_t) + manage_files_pattern($1, lib_t, lib_t) + ') + +@@ -421,7 +443,8 @@ interface(`libs_manage_shared_libs',` + type lib_t, textrel_shlib_t; + ') + +- manage_files_pattern($1, lib_t, { lib_t textrel_shlib_t }) ++ read_lnk_files_pattern($1, lib_t, lib_t) ++ manage_files_pattern($1, { textrel_shlib_t lib_t }, { lib_t textrel_shlib_t }) + ') + + ######################################## +@@ -440,9 +463,10 @@ interface(`libs_use_shared_libs',` + ') + + files_search_usr($1) +- allow $1 lib_t:dir list_dir_perms; +- read_lnk_files_pattern($1, lib_t, { lib_t textrel_shlib_t }) +- mmap_files_pattern($1, lib_t, { lib_t textrel_shlib_t }) ++ allow $1 { textrel_shlib_t lib_t }:dir list_dir_perms; ++ read_lnk_files_pattern($1, { textrel_shlib_t lib_t }, { lib_t textrel_shlib_t }) ++ mmap_exec_files_pattern($1, { textrel_shlib_t lib_t }, { lib_t textrel_shlib_t }) ++# allow $1 lib_t:file execmod; + allow $1 textrel_shlib_t:file execmod; + ') + +@@ -483,7 +507,7 @@ interface(`libs_relabel_shared_libs',` + type lib_t, textrel_shlib_t; + ') + +- relabel_files_pattern($1, lib_t, { lib_t textrel_shlib_t }) ++ relabel_files_pattern($1, { textrel_shlib_t lib_t }, { lib_t textrel_shlib_t }) + ') + + ######################################## +@@ -534,3 +558,28 @@ interface(`lib_filetrans_shared_lib',` + interface(`files_lib_filetrans_shared_lib',` + refpolicywarn(`$0($*) has been deprecated.') + ') ++ ++######################################## ++## ++## Transition to lib named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`libs_filetrans_named_content',` ++ gen_require(` ++ type lib_t; ++ type ld_so_cache_t; ++ type ldconfig_cache_t; ++ ') ++ ++ files_var_lib_filetrans($1,ldconfig_cache_t, dir, "debug") ++ files_var_filetrans($1, ldconfig_cache_t, dir, "ldconfig") ++ files_etc_filetrans($1, ld_so_cache_t, file, "ld.so.cache") ++ files_etc_filetrans($1, ld_so_cache_t, file, "ld.so.cache~") ++ files_etc_filetrans($1, ld_so_cache_t, file, "ld.so.preload") ++ files_etc_filetrans($1, ld_so_cache_t, file, "ld.so.preload~") ++') +diff --git a/policy/modules/system/libraries.te b/policy/modules/system/libraries.te +index 54f8fa5c84..e14ec857c7 100644 +--- a/policy/modules/system/libraries.te ++++ b/policy/modules/system/libraries.te +@@ -32,14 +32,14 @@ files_tmp_file(ldconfig_tmp_t) + # lib_t is the type of files in the system lib directories. + # + type lib_t alias shlib_t; +-files_type(lib_t) ++files_ro_base_file(lib_t) + + # + # textrel_shlib_t is the type of shared objects in the system lib + # directories, which require text relocation. + # + type textrel_shlib_t alias texrel_shlib_t; +-files_type(textrel_shlib_t) ++files_ro_base_file(textrel_shlib_t) + + ifdef(`distro_gentoo',` + # openrc unfortunately mounts a tmpfs +@@ -57,11 +57,14 @@ optional_policy(` + # ldconfig local policy + # + +-allow ldconfig_t self:capability { dac_override sys_chroot }; ++allow ldconfig_t self:capability { dac_read_search dac_override sys_chroot }; + ++manage_dirs_pattern(ldconfig_t, ldconfig_cache_t, ldconfig_cache_t) + manage_files_pattern(ldconfig_t, ldconfig_cache_t, ldconfig_cache_t) ++files_var_filetrans(ldconfig_t, ldconfig_cache_t, dir, "ldconfig") ++allow ldconfig_t ldconfig_cache_t:file map; + +-allow ldconfig_t ld_so_cache_t:file manage_file_perms; ++manage_files_pattern(ldconfig_t, ld_so_cache_t, ld_so_cache_t) + files_etc_filetrans(ldconfig_t, ld_so_cache_t, file) + + manage_dirs_pattern(ldconfig_t, ldconfig_tmp_t, ldconfig_tmp_t) +@@ -72,14 +75,19 @@ files_tmp_filetrans(ldconfig_t, ldconfig_tmp_t, { file dir lnk_file }) + manage_lnk_files_pattern(ldconfig_t, lib_t, lib_t) + + kernel_read_system_state(ldconfig_t) ++kernel_read_network_state(ldconfig_t) + + fs_getattr_xattr_fs(ldconfig_t) + ++files_list_var_lib(ldconfig_t) ++files_dontaudit_leaks(ldconfig_t) ++files_manage_var_lib_symlinks(ldconfig_t) ++ + corecmd_search_bin(ldconfig_t) + + domain_use_interactive_fds(ldconfig_t) + +-files_search_var_lib(ldconfig_t) ++files_search_home(ldconfig_t) + files_read_etc_files(ldconfig_t) + files_read_usr_files(ldconfig_t) + files_search_tmp(ldconfig_t) +@@ -90,11 +98,11 @@ files_delete_etc_files(ldconfig_t) + init_use_script_ptys(ldconfig_t) + init_read_script_tmp_files(ldconfig_t) + +-miscfiles_read_localization(ldconfig_t) + + logging_send_syslog_msg(ldconfig_t) + +-userdom_use_user_terminals(ldconfig_t) ++term_use_console(ldconfig_t) ++userdom_use_inherited_user_terminals(ldconfig_t) + userdom_use_all_users_fds(ldconfig_t) + + ifdef(`distro_ubuntu',` +@@ -103,6 +111,13 @@ ifdef(`distro_ubuntu',` + ') + ') + ++userdom_dontaudit_list_admin_dir(ldconfig_t) ++userdom_list_user_home_dirs(ldconfig_t) ++userdom_manage_user_home_content_files(ldconfig_t) ++userdom_manage_user_tmp_files(ldconfig_t) ++userdom_manage_user_tmp_symlinks(ldconfig_t) ++userdom_rw_inherited_user_tmp_pipes(ldconfig_t) ++ + ifdef(`hide_broken_symptoms',` + ifdef(`distro_gentoo',` + # leaked fds from portage +@@ -114,6 +129,11 @@ ifdef(`hide_broken_symptoms',` + ') + ') + ++ dev_dontaudit_rw_lvm_control(ldconfig_t) ++ dev_dontaudit_read_all_chr_files(ldconfig_t) ++ dev_dontaudit_read_all_blk_files(ldconfig_t) ++ term_dontaudit_use_unallocated_ttys(ldconfig_t) ++ + optional_policy(` + unconfined_dontaudit_rw_tcp_sockets(ldconfig_t) + ') +@@ -130,6 +150,18 @@ optional_policy(` + apt_use_ptys(ldconfig_t) + ') + ++optional_policy(` ++ glusterd_dontaudit_read_lib_dirs(ldconfig_t) ++') ++ ++optional_policy(` ++ gnome_append_generic_cache_files(ldconfig_t) ++') ++ ++optional_policy(` ++ kdump_manage_kdumpctl_tmp_files(ldconfig_t) ++') ++ + optional_policy(` + puppet_rw_tmp(ldconfig_t) + ') +@@ -141,6 +173,3 @@ optional_policy(` + rpm_manage_script_tmp_files(ldconfig_t) + ') + +-optional_policy(` +- unconfined_domain(ldconfig_t) +-') +diff --git a/policy/modules/system/locallogin.fc b/policy/modules/system/locallogin.fc +index be6a81b80d..a5303e9202 100644 +--- a/policy/modules/system/locallogin.fc ++++ b/policy/modules/system/locallogin.fc +@@ -1,3 +1,8 @@ ++HOME_DIR/\.hushlogin -- gen_context(system_u:object_r:local_login_home_t,s0) ++/root/\.hushlogin -- gen_context(system_u:object_r:local_login_home_t,s0) + + /sbin/sulogin -- gen_context(system_u:object_r:sulogin_exec_t,s0) + /sbin/sushell -- gen_context(system_u:object_r:sulogin_exec_t,s0) ++ ++/usr/sbin/sulogin -- gen_context(system_u:object_r:sulogin_exec_t,s0) ++/usr/sbin/sushell -- gen_context(system_u:object_r:sulogin_exec_t,s0) +diff --git a/policy/modules/system/locallogin.if b/policy/modules/system/locallogin.if +index 0e3c2a9777..ea9bd57dcd 100644 +--- a/policy/modules/system/locallogin.if ++++ b/policy/modules/system/locallogin.if +@@ -129,3 +129,59 @@ interface(`locallogin_domtrans_sulogin',` + + domtrans_pattern($1, sulogin_exec_t, sulogin_t) + ') ++ ++####################################### ++## ++## Allow domain to gettatr local login home content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`locallogin_getattr_home_content',` ++ gen_require(` ++ type local_login_home_t; ++ ') ++ ++ getattr_files_pattern($1, local_login_home_t, local_login_home_t) ++') ++ ++######################################## ++## ++## create local login content in the in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`locallogin_filetrans_admin_home_content',` ++ gen_require(` ++ type local_login_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, local_login_home_t, file, ".hushlogin") ++') ++ ++######################################## ++## ++## Transition to local login named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`locallogin_filetrans_home_content',` ++ gen_require(` ++ type local_login_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, local_login_home_t, file, ".hushlogin") ++ userdom_admin_home_dir_filetrans($1, local_login_home_t, file, ".hushlogin") ++') +diff --git a/policy/modules/system/locallogin.te b/policy/modules/system/locallogin.te +index 446fa9908b..6e1a05a68a 100644 +--- a/policy/modules/system/locallogin.te ++++ b/policy/modules/system/locallogin.te +@@ -13,9 +13,8 @@ auth_login_entry_type(local_login_t) + type local_login_lock_t; + files_lock_file(local_login_lock_t) + +-type local_login_tmp_t; +-files_tmp_file(local_login_tmp_t) +-files_poly_parent(local_login_tmp_t) ++type local_login_home_t; ++userdom_user_home_content(local_login_home_t) + + type sulogin_t; + type sulogin_exec_t; +@@ -27,14 +26,21 @@ init_domain(sulogin_t, sulogin_exec_t) + init_system_domain(sulogin_t, sulogin_exec_t) + role system_r types sulogin_t; + ++ifdef(`enable_mcs',` ++ init_ranged_daemon_domain(sulogin_t, sulogin_exec_t, s0 - mcs_systemhigh) ++') ++ ++ifdef(`enable_mls',` ++ init_ranged_daemon_domain(sulogin_t, sulogin_exec_t, s0 - mls_systemhigh) ++') ++ + ######################################## + # + # Local login local policy + # + +-allow local_login_t self:capability { dac_override chown fowner fsetid kill setgid setuid sys_nice sys_resource sys_tty_config }; +-allow local_login_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; +-allow local_login_t self:process { setrlimit setexec }; ++allow local_login_t self:capability { dac_read_search dac_override chown fowner fsetid kill setgid setuid sys_admin sys_nice sys_resource sys_tty_config }; ++allow local_login_t self:process ~{ ptrace setcurrent setfscreate execmem execstack execheap }; + allow local_login_t self:fd use; + allow local_login_t self:fifo_file rw_fifo_file_perms; + allow local_login_t self:sock_file read_sock_file_perms; +@@ -51,9 +57,7 @@ allow local_login_t self:key { search write link }; + allow local_login_t local_login_lock_t:file manage_file_perms; + files_lock_filetrans(local_login_t, local_login_lock_t, file) + +-allow local_login_t local_login_tmp_t:dir manage_dir_perms; +-allow local_login_t local_login_tmp_t:file manage_file_perms; +-files_tmp_filetrans(local_login_t, local_login_tmp_t, { file dir }) ++allow local_login_t local_login_home_t:file read_file_perms; + + kernel_read_system_state(local_login_t) + kernel_read_kernel_sysctls(local_login_t) +@@ -73,6 +77,8 @@ dev_getattr_power_mgmt_dev(local_login_t) + dev_setattr_power_mgmt_dev(local_login_t) + dev_getattr_sound_dev(local_login_t) + dev_setattr_sound_dev(local_login_t) ++dev_rw_generic_usb_dev(local_login_t) ++dev_read_video_dev(local_login_t) + dev_dontaudit_getattr_apm_bios_dev(local_login_t) + dev_dontaudit_setattr_apm_bios_dev(local_login_t) + dev_dontaudit_read_framebuffer(local_login_t) +@@ -103,6 +109,7 @@ files_read_world_readable_pipes(local_login_t) + files_read_world_readable_sockets(local_login_t) + # for when /var/mail is a symlink + files_read_var_symlinks(local_login_t) ++files_create_home_dir(local_login_t) + + fs_search_auto_mountpoints(local_login_t) + +@@ -117,16 +124,18 @@ term_relabel_unallocated_ttys(local_login_t) + term_relabel_all_ttys(local_login_t) + term_setattr_all_ttys(local_login_t) + term_setattr_unallocated_ttys(local_login_t) ++term_relabel_all_ptys(local_login_t) ++term_setattr_generic_ptys(local_login_t) + + auth_rw_login_records(local_login_t) + auth_rw_faillog(local_login_t) +-auth_manage_pam_pid(local_login_t) + auth_manage_pam_console_data(local_login_t) + auth_domtrans_pam_console(local_login_t) ++auth_use_nsswitch(local_login_t) + + init_dontaudit_use_fds(local_login_t) ++init_stream_connect(local_login_t) + +-miscfiles_read_localization(local_login_t) + + userdom_spec_domtrans_all_users(local_login_t) + userdom_signal_all_users(local_login_t) +@@ -141,19 +150,15 @@ ifdef(`distro_ubuntu',` + ') + ') + +-tunable_policy(`console_login',` +- # Able to relabel /dev/console to user tty types. +- term_relabel_console(local_login_t) +-') ++userdom_home_reader(local_login_t) ++userdom_manage_tmp_files(local_login_t) ++userdom_tmp_filetrans_user_tmp(local_login_t, file) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(local_login_t) +- fs_read_nfs_symlinks(local_login_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(local_login_t) +- fs_read_cifs_symlinks(local_login_t) ++tunable_policy(`login_console_enabled',` ++ term_use_console(local_login_t) ++ # Able to relabel /dev/console to user tty types. ++ term_relabel_console(local_login_t) ++ term_setattr_console(local_login_t) + ') + + optional_policy(` +@@ -176,14 +181,6 @@ optional_policy(` + mta_getattr_spool(local_login_t) + ') + +-optional_policy(` +- nis_use_ypbind(local_login_t) +-') +- +-optional_policy(` +- nscd_use(local_login_t) +-') +- + optional_policy(` + unconfined_shell_domtrans(local_login_t) + ') +@@ -195,6 +192,7 @@ optional_policy(` + optional_policy(` + xserver_read_xdm_tmp_files(local_login_t) + xserver_rw_xdm_tmp_files(local_login_t) ++ xserver_rw_xdm_keys(local_login_t) + ') + + ################################# +@@ -202,7 +200,7 @@ optional_policy(` + # Sulogin local policy + # + +-allow sulogin_t self:capability dac_override; ++allow sulogin_t self:capability { dac_read_search dac_override sys_admin }; + allow sulogin_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow sulogin_t self:fd use; + allow sulogin_t self:fifo_file rw_fifo_file_perms; +@@ -215,18 +213,30 @@ allow sulogin_t self:sem create_sem_perms; + allow sulogin_t self:msgq create_msgq_perms; + allow sulogin_t self:msg { send receive }; + ++kernel_getattr_core_if(sulogin_t) ++kernel_read_crypto_sysctls(sulogin_t) + kernel_read_system_state(sulogin_t) + ++dev_getattr_all_chr_files(sulogin_t) ++dev_getattr_all_blk_files(sulogin_t) ++ ++dev_read_urand(sulogin_t) ++dev_read_rand(sulogin_t) ++ + fs_search_auto_mountpoints(sulogin_t) + fs_rw_tmpfs_chr_files(sulogin_t) + + files_read_etc_files(sulogin_t) + # because file systems are not mounted: + files_dontaudit_search_isid_type_dirs(sulogin_t) ++files_search_pids(sulogin_t) + + auth_read_shadow(sulogin_t) ++auth_use_nsswitch(sulogin_t) + + init_getpgid_script(sulogin_t) ++init_getpgid(sulogin_t) ++init_getattr_initctl(sulogin_t) + + logging_send_syslog_msg(sulogin_t) + +@@ -235,17 +245,28 @@ seutil_read_default_contexts(sulogin_t) + + userdom_use_unpriv_users_fds(sulogin_t) + ++userdom_search_admin_dir(sulogin_t) + userdom_search_user_home_dirs(sulogin_t) + userdom_use_user_ptys(sulogin_t) + +-sysadm_shell_domtrans(sulogin_t) ++term_use_console(sulogin_t) ++term_use_unallocated_ttys(sulogin_t) ++term_use_generic_ptys(sulogin_t) ++ ++ifdef(`enable_mls',` ++ sysadm_shell_domtrans(sulogin_t) ++',` ++ optional_policy(` ++ unconfined_shell_domtrans(sulogin_t) ++ ') ++') + + # suse and debian do not use pam with sulogin... + ifdef(`distro_suse', `define(`sulogin_no_pam')') + ifdef(`distro_debian', `define(`sulogin_no_pam')') + ++allow sulogin_t self:capability sys_tty_config; + ifdef(`sulogin_no_pam', ` +- allow sulogin_t self:capability sys_tty_config; + init_getpgid(sulogin_t) + ', ` + allow sulogin_t self:process setexec; +@@ -258,9 +279,5 @@ ifdef(`sulogin_no_pam', ` + ') + + optional_policy(` +- nis_use_ypbind(sulogin_t) +-') +- +-optional_policy(` +- nscd_use(sulogin_t) ++ plymouthd_exec_plymouth(sulogin_t) + ') +diff --git a/policy/modules/system/logging.fc b/policy/modules/system/logging.fc +index b50c5fe81f..e55a556413 100644 +--- a/policy/modules/system/logging.fc ++++ b/policy/modules/system/logging.fc +@@ -2,10 +2,13 @@ + + /etc/rsyslog.conf gen_context(system_u:object_r:syslog_conf_t,s0) + /etc/syslog.conf gen_context(system_u:object_r:syslog_conf_t,s0) ++/etc/rsyslog.d(/.*)? gen_context(system_u:object_r:syslog_conf_t,s0) + /etc/audit(/.*)? gen_context(system_u:object_r:auditd_etc_t,mls_systemhigh) + /etc/rc\.d/init\.d/auditd -- gen_context(system_u:object_r:auditd_initrc_exec_t,s0) + /etc/rc\.d/init\.d/rsyslog -- gen_context(system_u:object_r:syslogd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/auditd.* -- gen_context(system_u:object_r:auditd_unit_file_t,s0) ++ + /sbin/audispd -- gen_context(system_u:object_r:audisp_exec_t,s0) + /sbin/audisp-remote -- gen_context(system_u:object_r:audisp_remote_exec_t,s0) + /sbin/auditctl -- gen_context(system_u:object_r:auditctl_exec_t,s0) +@@ -17,12 +20,25 @@ + /sbin/syslogd -- gen_context(system_u:object_r:syslogd_exec_t,s0) + /sbin/syslog-ng -- gen_context(system_u:object_r:syslogd_exec_t,s0) + ++/opt/zimbra/log(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++/opt/Symantec/scspagent/IDS/system(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ ++/usr/lib/systemd/systemd-journald -- gen_context(system_u:object_r:syslogd_exec_t,s0) ++/usr/lib/systemd/systemd-kmsg-syslogd -- gen_context(system_u:object_r:syslogd_exec_t,s0) ++ ++/usr/centreon/log(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ ++/usr/sbin/audispd -- gen_context(system_u:object_r:audisp_exec_t,s0) ++/usr/sbin/audisp-remote -- gen_context(system_u:object_r:audisp_remote_exec_t,s0) ++/usr/sbin/auditctl -- gen_context(system_u:object_r:auditctl_exec_t,s0) ++/usr/sbin/auditd -- gen_context(system_u:object_r:auditd_exec_t,s0) + /usr/sbin/klogd -- gen_context(system_u:object_r:klogd_exec_t,s0) + /usr/sbin/metalog -- gen_context(system_u:object_r:syslogd_exec_t,s0) ++/usr/sbin/minilogd -- gen_context(system_u:object_r:syslogd_exec_t,s0) + /usr/sbin/rklogd -- gen_context(system_u:object_r:klogd_exec_t,s0) + /usr/sbin/rsyslogd -- gen_context(system_u:object_r:syslogd_exec_t,s0) +-/usr/sbin/syslog-ng -- gen_context(system_u:object_r:syslogd_exec_t,s0) + /usr/sbin/syslogd -- gen_context(system_u:object_r:syslogd_exec_t,s0) ++/usr/sbin/syslog-ng -- gen_context(system_u:object_r:syslogd_exec_t,s0) + + /var/lib/misc/syslog-ng.persist-? -- gen_context(system_u:object_r:syslogd_var_lib_t,s0) + /var/lib/syslog-ng(/.*)? gen_context(system_u:object_r:syslogd_var_lib_t,s0) +@@ -38,21 +54,22 @@ ifdef(`distro_suse', ` + + /var/log -d gen_context(system_u:object_r:var_log_t,s0-mls_systemhigh) + /var/log/.* gen_context(system_u:object_r:var_log_t,s0) +-/var/log/boot\.log -- gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/log/messages[^/]* gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/log/secure[^/]* gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/log/maillog[^/]* gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/log/spooler[^/]* gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/log/audit(/.*)? gen_context(system_u:object_r:auditd_log_t,mls_systemhigh) +-/var/log/syslog-ng(/.*)? gen_context(system_u:object_r:syslogd_var_run_t,mls_systemhigh) ++/var/run/log(/.*)? gen_context(system_u:object_r:syslogd_var_run_t,mls_systemhigh) ++/var/run/systemd/journal(/.*)? gen_context(system_u:object_r:syslogd_var_run_t,mls_systemhigh) + + ifndef(`distro_gentoo',` +-/var/log/audit\.log -- gen_context(system_u:object_r:auditd_log_t,mls_systemhigh) ++/var/log/audit\.log.* -- gen_context(system_u:object_r:auditd_log_t,mls_systemhigh) + ') + + ifdef(`distro_redhat',` + /var/named/chroot/var/log -d gen_context(system_u:object_r:var_log_t,s0) + /var/named/chroot/dev/log -s gen_context(system_u:object_r:devlog_t,s0) ++/var/spool/postfix/dev/log -s gen_context(system_u:object_r:devlog_t,s0) + ') + + /var/run/audit_events -s gen_context(system_u:object_r:auditd_var_run_t,mls_systemhigh) +@@ -65,11 +82,16 @@ ifdef(`distro_redhat',` + /var/run/syslogd\.pid -- gen_context(system_u:object_r:syslogd_var_run_t,mls_systemhigh) + /var/run/syslog-ng.ctl -- gen_context(system_u:object_r:syslogd_var_run_t,s0) + /var/run/syslog-ng(/.*)? gen_context(system_u:object_r:syslogd_var_run_t,s0) ++/var/run/systemd/journal/syslog -s gen_context(system_u:object_r:devlog_t,mls_systemhigh) + + /var/spool/audit(/.*)? gen_context(system_u:object_r:audit_spool_t,mls_systemhigh) + /var/spool/bacula/log(/.*)? gen_context(system_u:object_r:var_log_t,s0) + /var/spool/postfix/pid -d gen_context(system_u:object_r:var_run_t,s0) +-/var/spool/plymouth/boot\.log gen_context(system_u:object_r:var_log_t,mls_systemhigh) + /var/spool/rsyslog(/.*)? gen_context(system_u:object_r:var_log_t,s0) + ++/var/stockmaniac/templates_cache(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ + /var/tinydns/log/main(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ ++/var/webmin(/.*)? gen_context(system_u:object_r:var_log_t,s0) ++ +diff --git a/policy/modules/system/logging.if b/policy/modules/system/logging.if +index 4e94884637..c083de88e7 100644 +--- a/policy/modules/system/logging.if ++++ b/policy/modules/system/logging.if +@@ -61,7 +61,7 @@ interface(`logging_log_file',` + # + interface(`logging_send_audit_msgs',` + allow $1 self:capability audit_write; +- allow $1 self:netlink_audit_socket { r_netlink_socket_perms nlmsg_relay }; ++ allow $1 self:netlink_audit_socket { r_netlink_socket_perms nlmsg_relay nlmsg_tty_audit }; + ') + + ####################################### +@@ -144,6 +144,24 @@ interface(`logging_read_audit_log',` + allow $1 auditd_log_t:dir list_dir_perms; + ') + ++######################################## ++## ++## Map the audit log. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_map_audit_log',` ++ gen_require(` ++ type auditd_log_t; ++ ') ++ ++ allow $1 auditd_log_t:file map; ++') + ######################################## + ## + ## Execute auditctl in the auditctl domain. +@@ -233,7 +251,7 @@ interface(`logging_run_auditd',` + + ######################################## + ## +-## Connect to auditdstored over an unix stream socket. ++## Connect to auditdstored over a unix stream socket. + ## + ## + ## +@@ -262,6 +280,7 @@ interface(`logging_domtrans_dispatcher',` + ') + + domtrans_pattern($1, audisp_exec_t, audisp_t) ++ allow $1 audisp_exec_t:file map; + ') + + ######################################## +@@ -318,7 +337,7 @@ interface(`logging_dispatcher_domain',` + + ######################################## + ## +-## Connect to the audit dispatcher over an unix stream socket. ++## Connect to the audit dispatcher over a unix stream socket. + ## + ## + ## +@@ -496,6 +515,68 @@ interface(`logging_log_filetrans',` + filetrans_pattern($1, var_log_t, $2, $3, $4) + ') + ++####################################### ++## ++## Create an object in the log directory, with a private type. ++## ++## ++##

      ++## Allow the specified domain to create an object ++## in the general system log directories (e.g., /var/log) ++## with a private type. Typically this is used for creating ++## private log files in /var/log with the private type instead ++## of the general system log type. To accomplish this goal, ++## either the program must be SELinux-aware, or use this interface. ++##

      ++##

      ++## Related interfaces: ++##

      ++##
        ++##
      • logging_log_file()
      • ++##
      ++##

      ++## Example usage with a domain that can create ++## and append to a private log file stored in the ++## general directories (e.g., /var/log): ++##

      ++##

      ++## type mylogfile_t; ++## logging_log_file(mylogfile_t) ++## allow mydomain_t mylogfile_t:file { create_file_perms append_file_perms }; ++## logging_log_filetrans(mydomain_t, mylogfile_t, file) ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++## ++# ++interface(`logging_log_named_filetrans',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ files_search_var($1) ++ filetrans_pattern($1, var_log_t, $2, $3, $4) ++') ++ + ######################################## + ## + ## Send system log messages. +@@ -530,22 +611,105 @@ interface(`logging_log_filetrans',` + # + interface(`logging_send_syslog_msg',` + gen_require(` +- type syslogd_t, devlog_t; ++ attribute syslog_client_type; ++ ') ++ ++ typeattribute $1 syslog_client_type; ++') ++ ++######################################## ++## ++## Connect to the syslog control unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_create_devlog_dev',` ++ gen_require(` ++ type devlog_t; ++ ') ++ ++ allow $1 devlog_t:sock_file manage_sock_file_perms; ++ dev_filetrans($1, devlog_t, sock_file) ++ init_pid_filetrans($1, devlog_t, sock_file, "syslog") ++ logging_syslogd_pid_filetrans($1, devlog_t, sock_file, "dev-log") ++') ++ ++######################################## ++## ++## Relabel the devlog sock_file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_relabel_devlog_dev',` ++ gen_require(` ++ type devlog_t; ++ ') ++ ++ allow $1 devlog_t:sock_file relabel_sock_file_perms; ++') ++ ++######################################## ++## ++## Allow domain to read the syslog pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_read_syslog_pid',` ++ gen_require(` ++ type syslogd_var_run_t; ++ ') ++ ++ read_files_pattern($1, syslogd_var_run_t, syslogd_var_run_t) ++ list_dirs_pattern($1, syslogd_var_run_t, syslogd_var_run_t) ++') ++ ++######################################## ++## ++## Relabel the syslog pid sock_file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_relabel_syslog_pid_socket',` ++ gen_require(` ++ type syslogd_var_run_t; + ') + +- allow $1 devlog_t:lnk_file read_lnk_file_perms; +- allow $1 devlog_t:sock_file write_sock_file_perms; ++ allow $1 syslogd_var_run_t:sock_file relabel_sock_file_perms; ++') + +- # the type of socket depends on the syslog daemon +- allow $1 syslogd_t:unix_dgram_socket sendto; +- allow $1 syslogd_t:unix_stream_socket connectto; +- allow $1 self:unix_dgram_socket create_socket_perms; +- allow $1 self:unix_stream_socket create_socket_perms; ++######################################## ++## ++## Connect to the syslog control unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_stream_connect_syslog',` ++ gen_require(` ++ type syslogd_t, syslogd_var_run_t; ++ ') + +- # If syslog is down, the glibc syslog() function +- # will write to the console. +- term_write_console($1) +- term_dontaudit_read_console($1) ++ files_search_pids($1) ++ stream_connect_pattern($1, syslogd_var_run_t, syslogd_var_run_t, syslogd_t) + ') + + ######################################## +@@ -569,6 +733,44 @@ interface(`logging_read_audit_config',` + allow $1 auditd_etc_t:dir list_dir_perms; + ') + ++######################################## ++## ++## Map the auditd configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_map_audit_config',` ++ gen_require(` ++ type auditd_etc_t; ++ ') ++ ++ allow $1 auditd_etc_t:file map; ++') ++ ++######################################## ++## ++## dontaudit search of auditd log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++## ++# ++interface(`logging_dontaudit_search_audit_logs',` ++ gen_require(` ++ type auditd_log_t; ++ ') ++ ++ dontaudit $1 auditd_log_t:dir search_dir_perms; ++') ++ + ######################################## + ## + ## dontaudit search of auditd configuration files. +@@ -607,6 +809,25 @@ interface(`logging_read_syslog_config',` + allow $1 syslog_conf_t:file read_file_perms; + ') + ++######################################## ++## ++## Manage syslog configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_manage_syslog_config',` ++ gen_require(` ++ type syslog_conf_t; ++ ') ++ ++ manage_files_pattern($1, syslog_conf_t, syslog_conf_t) ++') ++ + ######################################## + ## + ## Allows the domain to open a file in the +@@ -722,6 +943,25 @@ interface(`logging_setattr_all_log_dirs',` + allow $1 logfile:dir setattr; + ') + ++####################################### ++## ++## Relabel on all log dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_relabel_all_log_dirs',` ++ gen_require(` ++ attribute logfile; ++ ') ++ ++ relabel_dirs_pattern($1, logfile, logfile) ++') ++ + ######################################## + ## + ## Do not audit attempts to get the attributes +@@ -776,7 +1016,25 @@ interface(`logging_append_all_logs',` + ') + + files_search_var($1) +- append_files_pattern($1, var_log_t, logfile) ++ append_files_pattern($1, logfile, logfile) ++') ++ ++######################################## ++## ++## Append to all log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_inherit_append_all_logs',` ++ gen_require(` ++ attribute logfile; ++ ') ++ ++ allow $1 logfile:file { getattr append ioctl lock }; + ') + + ######################################## +@@ -797,6 +1055,7 @@ interface(`logging_read_all_logs',` + + files_search_var($1) + allow $1 logfile:dir list_dir_perms; ++ allow $1 logfile:file map; + read_files_pattern($1, logfile, logfile) + ') + +@@ -858,8 +1117,10 @@ interface(`logging_manage_all_logs',` + ') + + files_search_var($1) ++ manage_dirs_pattern($1, logfile, logfile) + manage_files_pattern($1, logfile, logfile) +- read_lnk_files_pattern($1, logfile, logfile) ++ manage_lnk_files_pattern($1, logfile, logfile) ++ allow $1 logfile:file map; + ') + + ######################################## +@@ -880,9 +1141,67 @@ interface(`logging_read_generic_logs',` + + files_search_var($1) + allow $1 var_log_t:dir list_dir_perms; ++ allow $1 var_log_t:file map; + read_files_pattern($1, var_log_t, var_log_t) + ') + ++######################################## ++## ++## Link generic log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_link_generic_logs',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ allow $1 var_log_t:file link; ++') ++ ++######################################## ++## ++## Delete generic log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_delete_generic_logs',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ allow $1 var_log_t:file unlink; ++') ++ ++######################################## ++## ++## Map generic log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`logging_mmap_generic_logs',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ allow $1 var_log_t:file map; ++') ++ + ######################################## + ## + ## Write generic log files. +@@ -903,6 +1222,24 @@ interface(`logging_write_generic_logs',` + write_files_pattern($1, var_log_t, var_log_t) + ') + ++######################################## ++## ++## Dontaudit read/Write inherited generic log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`logging_dontaudit_rw_inherited_generic_logs',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ dontaudit $1 var_log_t:file rw_inherited_file_perms; ++') ++ + ######################################## + ## + ## Dontaudit Write generic log files. +@@ -984,11 +1321,16 @@ interface(`logging_admin_audit',` + type auditd_t, auditd_etc_t, auditd_log_t; + type auditd_var_run_t; + type auditd_initrc_exec_t; ++ type auditd_unit_file_t; + ') + +- allow $1 auditd_t:process { ptrace signal_perms }; ++ allow $1 auditd_t:process signal_perms; + ps_process_pattern($1, auditd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 auditd_t:process ptrace; ++ ') ++ + manage_dirs_pattern($1, auditd_etc_t, auditd_etc_t) + manage_files_pattern($1, auditd_etc_t, auditd_etc_t) + +@@ -1004,6 +1346,33 @@ interface(`logging_admin_audit',` + domain_system_change_exemption($1) + role_transition $2 auditd_initrc_exec_t system_r; + allow $2 system_r; ++ ++ logging_systemctl_audit($1) ++ admin_pattern($1, auditd_unit_file_t) ++ allow $1 auditd_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Execute auditd server in the auditd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`logging_systemctl_audit',` ++ gen_require(` ++ type auditd_t; ++ type auditd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 auditd_unit_file_t:file read_file_perms; ++ allow $1 auditd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, auditd_t) + ') + + ######################################## +@@ -1032,10 +1401,15 @@ interface(`logging_admin_syslog',` + type syslogd_initrc_exec_t; + ') + +- allow $1 syslogd_t:process { ptrace signal_perms }; +- allow $1 klogd_t:process { ptrace signal_perms }; ++ allow $1 self:capability2 syslog; ++ allow $1 syslogd_t:process signal_perms; ++ allow $1 klogd_t:process signal_perms; + ps_process_pattern($1, syslogd_t) + ps_process_pattern($1, klogd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 syslogd_t:process ptrace; ++ allow $1 klogd_t:process ptrace; ++ ') + + manage_dirs_pattern($1, klogd_var_run_t, klogd_var_run_t) + manage_files_pattern($1, klogd_var_run_t, klogd_var_run_t) +@@ -1057,6 +1431,8 @@ interface(`logging_admin_syslog',` + manage_files_pattern($1, syslogd_var_run_t, syslogd_var_run_t) + + logging_manage_all_logs($1) ++ allow $1 logfile:dir relabel_dir_perms; ++ allow $1 logfile:file relabel_file_perms; + + init_labeled_script_domtrans($1, syslogd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -1085,3 +1461,108 @@ interface(`logging_admin',` + logging_admin_audit($1, $2) + logging_admin_syslog($1, $2) + ') ++ ++######################################## ++## ++## Transition to syslog.conf ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_filetrans_named_conf',` ++ gen_require(` ++ type syslog_conf_t; ++ ') ++ ++ files_etc_filetrans($1, syslog_conf_t, file, "syslog.conf") ++ files_etc_filetrans($1, syslog_conf_t, file, "rsyslog.conf") ++') ++ ++######################################## ++## ++## Transition to logging named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_filetrans_named_content',` ++ gen_require(` ++ type var_log_t; ++ type audit_spool_t; ++ type syslogd_var_run_t; ++ type syslog_conf_t; ++ ') ++ ++ files_pid_filetrans($1, syslogd_var_run_t, dir, "log") ++ files_spool_filetrans($1, var_log_t, dir, "rsyslog") ++ files_spool_filetrans($1, var_log_t, dir, "log") ++ files_spool_filetrans($1, audit_spool_t, dir, "audit") ++ files_var_filetrans($1, var_log_t, dir, "webmin") ++ ++ files_etc_filetrans($1, syslog_conf_t, file, "syslog.conf") ++ files_etc_filetrans($1, syslog_conf_t, file, "rsyslog.conf") ++ ++ init_named_pid_filetrans($1, syslogd_var_run_t, dir, "journal") ++ ++ logging_log_filetrans($1, var_log_t, dir, "anaconda") ++') ++ ++####################################### ++## ++## Create objects in /run/systemd/journal/ directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`logging_syslogd_pid_filetrans',` ++ gen_require(` ++ type syslogd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ filetrans_pattern($1, syslogd_var_run_t, $2, $3, $4) ++') ++ ++####################################### ++## ++## Map files in /run/log/journal/ directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logging_mmap_journal',` ++ gen_require(` ++ type syslogd_var_run_t; ++ ') ++ ++ allow $1 syslogd_var_run_t:file map; ++') +diff --git a/policy/modules/system/logging.te b/policy/modules/system/logging.te +index 59b04c1a28..72a2857b1e 100644 +--- a/policy/modules/system/logging.te ++++ b/policy/modules/system/logging.te +@@ -4,6 +4,29 @@ policy_module(logging, 1.20.1) + # + # Declarations + # ++attribute syslog_client_type; ++ ++## ++##

      ++## Allow syslogd daemon to send mail ++##

      ++##
      ++gen_tunable(logging_syslogd_can_sendmail, false) ++ ++## ++##

      ++## Allow syslogd the ability to read/write terminals ++##

      ++##
      ++gen_tunable(logging_syslogd_use_tty, true) ++ ++## ++##

      ++## Allow syslogd the ability to call nagios plugins. It is ++## turned on by omprog rsyslog plugin. ++##

      ++##
      ++gen_tunable(logging_syslogd_run_nagios_plugins, false) + + attribute logfile; + +@@ -20,6 +43,7 @@ files_security_file(auditd_log_t) + files_security_mountpoint(auditd_log_t) + + type audit_spool_t; ++files_spool_file(audit_spool_t) + files_security_file(audit_spool_t) + files_security_mountpoint(audit_spool_t) + +@@ -33,6 +57,9 @@ init_script_file(auditd_initrc_exec_t) + type auditd_var_run_t; + files_pid_file(auditd_var_run_t) + ++type auditd_unit_file_t; ++systemd_unit_file(auditd_unit_file_t) ++ + type audisp_t; + type audisp_exec_t; + init_system_domain(audisp_t, audisp_exec_t) +@@ -64,6 +91,7 @@ files_config_file(syslog_conf_t) + type syslogd_t; + type syslogd_exec_t; + init_daemon_domain(syslogd_t, syslogd_exec_t) ++mls_trusted_object(syslogd_t) + + type syslogd_initrc_exec_t; + init_script_file(syslogd_initrc_exec_t) +@@ -71,11 +99,15 @@ init_script_file(syslogd_initrc_exec_t) + type syslogd_tmp_t; + files_tmp_file(syslogd_tmp_t) + ++type syslogd_tmpfs_t; ++files_tmpfs_file(syslogd_tmpfs_t) ++ + type syslogd_var_lib_t; + files_type(syslogd_var_lib_t) + + type syslogd_var_run_t; + files_pid_file(syslogd_var_run_t) ++mls_trusted_object(syslogd_var_run_t) + + type var_log_t; + logging_log_file(var_log_t) +@@ -94,8 +126,11 @@ ifdef(`enable_mls',` + allow auditctl_t self:capability { fsetid dac_read_search dac_override }; + allow auditctl_t self:netlink_audit_socket nlmsg_readpriv; + ++allow auditctl_t self:process getcap; ++ + read_files_pattern(auditctl_t, auditd_etc_t, auditd_etc_t) + allow auditctl_t auditd_etc_t:dir list_dir_perms; ++allow auditctl_t auditd_etc_t:file map; + + # Needed for adding watches + files_getattr_all_dirs(auditctl_t) +@@ -111,7 +146,9 @@ domain_use_interactive_fds(auditctl_t) + + mls_file_read_all_levels(auditctl_t) + +-term_use_all_terms(auditctl_t) ++storage_getattr_removable_dev(auditctl_t) ++ ++term_use_all_inherited_terms(auditctl_t) + + init_dontaudit_use_fds(auditctl_t) + +@@ -134,11 +171,12 @@ allow auditd_t self:fifo_file rw_fifo_file_perms; + allow auditd_t self:tcp_socket create_stream_socket_perms; + + allow auditd_t auditd_etc_t:dir list_dir_perms; +-allow auditd_t auditd_etc_t:file read_file_perms; ++allow auditd_t auditd_etc_t:file { read_file_perms map }; + ++manage_dirs_pattern(auditd_t, auditd_log_t, auditd_log_t) + manage_files_pattern(auditd_t, auditd_log_t, auditd_log_t) + manage_lnk_files_pattern(auditd_t, auditd_log_t, auditd_log_t) +-allow auditd_t var_log_t:dir search_dir_perms; ++logging_log_filetrans(auditd_t, auditd_log_t, dir, "audit") + + manage_files_pattern(auditd_t, auditd_var_run_t, auditd_var_run_t) + manage_sock_files_pattern(auditd_t, auditd_var_run_t, auditd_var_run_t) +@@ -148,6 +186,7 @@ kernel_read_kernel_sysctls(auditd_t) + # Needs to be able to run dispatcher. see /etc/audit/auditd.conf + # Probably want a transition, and a new auditd_helper app + kernel_read_system_state(auditd_t) ++kernel_read_network_state(auditd_t) + + dev_read_sysfs(auditd_t) + +@@ -155,9 +194,6 @@ fs_getattr_all_fs(auditd_t) + fs_search_auto_mountpoints(auditd_t) + fs_rw_anon_inodefs_files(auditd_t) + +-selinux_search_fs(auditctl_t) +- +-corenet_all_recvfrom_unlabeled(auditd_t) + corenet_all_recvfrom_netlabel(auditd_t) + corenet_tcp_sendrecv_generic_if(auditd_t) + corenet_tcp_sendrecv_generic_node(auditd_t) +@@ -176,6 +212,7 @@ domain_use_interactive_fds(auditd_t) + files_read_etc_files(auditd_t) + files_list_usr(auditd_t) + ++init_read_utmp(auditd_t) + init_telinit(auditd_t) + + logging_set_audit_parameters(auditd_t) +@@ -183,16 +220,19 @@ logging_send_syslog_msg(auditd_t) + logging_domtrans_dispatcher(auditd_t) + logging_signal_dispatcher(auditd_t) + +-miscfiles_read_localization(auditd_t) ++auth_use_nsswitch(auditd_t) + + mls_file_read_all_levels(auditd_t) + mls_file_write_all_levels(auditd_t) # Need to be able to write to /var/run/ directory +- +-seutil_dontaudit_read_config(auditd_t) ++mls_socket_write_all_levels(auditd_t) + + sysnet_dns_name_resolve(auditd_t) + +-userdom_use_user_terminals(auditd_t) ++systemd_start_systemd_services(auditd_t) ++systemd_start_power_services(auditd_t) ++systemd_status_power_services(auditd_t) ++ ++userdom_use_inherited_user_terminals(auditd_t) + userdom_dontaudit_use_unpriv_user_fds(auditd_t) + userdom_dontaudit_search_user_home_dirs(auditd_t) + +@@ -219,7 +259,7 @@ optional_policy(` + # audit dispatcher local policy + # + +-allow audisp_t self:capability { dac_override setpcap sys_nice }; ++allow audisp_t self:capability { dac_read_search dac_override setpcap sys_nice }; + allow audisp_t self:process { getcap signal_perms setcap setsched }; + allow audisp_t self:fifo_file rw_fifo_file_perms; + allow audisp_t self:unix_stream_socket create_stream_socket_perms; +@@ -227,6 +267,8 @@ allow audisp_t self:unix_dgram_socket create_socket_perms; + + allow audisp_t auditd_t:unix_stream_socket rw_socket_perms; + ++allow audisp_t audisp_exec_t:file map; ++ + manage_sock_files_pattern(audisp_t, audisp_var_run_t, audisp_var_run_t) + files_pid_filetrans(audisp_t, audisp_var_run_t, sock_file) + +@@ -237,19 +279,29 @@ corecmd_exec_shell(audisp_t) + + domain_use_interactive_fds(audisp_t) + ++fs_getattr_all_fs(audisp_t) ++ + files_read_etc_files(audisp_t) + files_read_etc_runtime_files(audisp_t) + ++mls_file_read_all_levels(audisp_t) + mls_file_write_all_levels(audisp_t) ++mls_socket_write_all_levels(audisp_t) ++mls_dbus_send_all_levels(audisp_t) + +-logging_send_syslog_msg(audisp_t) ++auth_use_nsswitch(audisp_t) + +-miscfiles_read_localization(audisp_t) ++logging_send_syslog_msg(audisp_t) + + sysnet_dns_name_resolve(audisp_t) + + optional_policy(` + dbus_system_bus_client(audisp_t) ++ dbus_connect_system_bus(audisp_t) ++ ++ optional_policy(` ++ setroubleshoot_dbus_chat(audisp_t) ++ ') + ') + + ######################################## +@@ -266,9 +318,10 @@ manage_dirs_pattern(audisp_remote_t, audit_spool_t, audit_spool_t) + manage_files_pattern(audisp_remote_t, audit_spool_t, audit_spool_t) + files_spool_filetrans(audisp_remote_t, audit_spool_t, { dir file }) + ++kernel_read_system_state(audisp_remote_t) ++ + corecmd_exec_bin(audisp_remote_t) + +-corenet_all_recvfrom_unlabeled(audisp_remote_t) + corenet_all_recvfrom_netlabel(audisp_remote_t) + corenet_tcp_sendrecv_generic_if(audisp_remote_t) + corenet_tcp_sendrecv_generic_node(audisp_remote_t) +@@ -280,13 +333,28 @@ corenet_sendrecv_audit_client_packets(audisp_remote_t) + + files_read_etc_files(audisp_remote_t) + ++mls_socket_write_all_levels(audisp_remote_t) ++ + logging_send_syslog_msg(audisp_remote_t) + logging_send_audit_msgs(audisp_remote_t) + +-miscfiles_read_localization(audisp_remote_t) ++auth_use_nsswitch(audisp_remote_t) ++auth_append_login_records(audisp_remote_t) ++ ++mls_file_write_all_levels(audisp_remote_t) ++ ++init_telinit(audisp_remote_t) ++init_read_utmp(audisp_remote_t) ++init_dontaudit_write_utmp(audisp_remote_t) + + sysnet_dns_name_resolve(audisp_remote_t) + ++systemd_start_power_services(audisp_remote_t) ++ ++term_search_ptys(audisp_remote_t) ++ ++userdom_use_user_ptys(audisp_remote_t) ++ + ######################################## + # + # klogd local policy +@@ -326,7 +394,6 @@ files_read_etc_files(klogd_t) + + logging_send_syslog_msg(klogd_t) + +-miscfiles_read_localization(klogd_t) + + mls_file_read_all_levels(klogd_t) + +@@ -355,13 +422,12 @@ optional_policy(` + # sys_admin for the integrated klog of syslog-ng and metalog + # sys_nice for rsyslog + # cjp: why net_admin! +-allow syslogd_t self:capability { dac_override sys_resource sys_tty_config net_admin sys_admin sys_nice chown fsetid }; ++allow syslogd_t self:capability { sys_ptrace dac_read_search dac_override sys_resource sys_tty_config ipc_lock net_admin setgid setuid sys_admin sys_nice chown fsetid setuid setgid net_raw }; + dontaudit syslogd_t self:capability sys_tty_config; ++allow syslogd_t self:capability2 { syslog block_suspend }; + # setpgid for metalog + # setrlimit for syslog-ng +-# getsched for syslog-ng +-# setsched for rsyslog +-allow syslogd_t self:process { signal_perms setpgid setrlimit getsched setsched }; ++allow syslogd_t self:process { signal_perms getcap setcap setpgid getsched setsched setrlimit }; + # receive messages to be logged + allow syslogd_t self:unix_dgram_socket create_socket_perms; + allow syslogd_t self:unix_stream_socket create_stream_socket_perms; +@@ -369,15 +435,20 @@ allow syslogd_t self:unix_dgram_socket sendto; + allow syslogd_t self:fifo_file rw_fifo_file_perms; + allow syslogd_t self:udp_socket create_socket_perms; + allow syslogd_t self:tcp_socket create_stream_socket_perms; +- ++allow syslogd_t self:rawip_socket create_socket_perms; ++allow syslogd_t self:netlink_audit_socket { r_netlink_socket_perms nlmsg_write }; + allow syslogd_t syslog_conf_t:file read_file_perms; ++allow syslogd_t syslog_conf_t:dir list_dir_perms; + + # Create and bind to /dev/log or /var/run/log. + allow syslogd_t devlog_t:sock_file manage_sock_file_perms; ++# now is /dev/log lnk_file ++allow syslogd_t devlog_t:lnk_file manage_lnk_file_perms; + files_pid_filetrans(syslogd_t, devlog_t, sock_file) + + # create/append log files. + manage_files_pattern(syslogd_t, var_log_t, var_log_t) ++allow syslogd_t var_log_t:file map; + rw_fifo_files_pattern(syslogd_t, var_log_t, var_log_t) + files_search_spool(syslogd_t) + +@@ -389,30 +460,49 @@ manage_dirs_pattern(syslogd_t, syslogd_tmp_t, syslogd_tmp_t) + manage_files_pattern(syslogd_t, syslogd_tmp_t, syslogd_tmp_t) + files_tmp_filetrans(syslogd_t, syslogd_tmp_t, { dir file }) + ++manage_dirs_pattern(syslogd_t, syslogd_tmpfs_t, syslogd_tmpfs_t) ++manage_files_pattern(syslogd_t, syslogd_tmpfs_t, syslogd_tmpfs_t) ++fs_tmpfs_filetrans(syslogd_t, syslogd_tmpfs_t, { dir file }) ++ ++manage_sock_files_pattern(syslogd_t, syslogd_var_lib_t, syslogd_var_lib_t) + manage_files_pattern(syslogd_t, syslogd_var_lib_t, syslogd_var_lib_t) ++allow syslogd_t syslogd_var_lib_t:file map; + files_search_var_lib(syslogd_t) + +-# manage pid file ++manage_dirs_pattern(syslogd_t, syslogd_var_run_t, syslogd_var_run_t) + manage_files_pattern(syslogd_t, syslogd_var_run_t, syslogd_var_run_t) +-files_pid_filetrans(syslogd_t, syslogd_var_run_t, file) ++manage_sock_files_pattern(syslogd_t, syslogd_var_run_t, syslogd_var_run_t) ++mmap_files_pattern(syslogd_t, syslogd_var_run_t, syslogd_var_run_t) ++files_pid_filetrans(syslogd_t, syslogd_var_run_t, { file dir }) + ++kernel_rw_stream_socket_perms(syslogd_t) + kernel_read_system_state(syslogd_t) + kernel_read_network_state(syslogd_t) + kernel_read_kernel_sysctls(syslogd_t) ++kernel_read_netlink_audit_socket(syslogd_t) + kernel_read_proc_symlinks(syslogd_t) + # Allow access to /proc/kmsg for syslog-ng + kernel_read_messages(syslogd_t) ++kernel_request_load_module(syslogd_t) + kernel_read_vm_sysctls(syslogd_t) + kernel_clear_ring_buffer(syslogd_t) + kernel_change_ring_buffer_level(syslogd_t) ++kernel_read_ring_buffer(syslogd_t) ++ ++ifdef(`hide_broken_symptoms',` ++ kernel_rw_unix_dgram_sockets(syslogd_t) ++') ++ ++corecmd_exec_bin(syslogd_t) ++corecmd_exec_shell(syslogd_t) + +-corenet_all_recvfrom_unlabeled(syslogd_t) + corenet_all_recvfrom_netlabel(syslogd_t) + corenet_udp_sendrecv_generic_if(syslogd_t) + corenet_udp_sendrecv_generic_node(syslogd_t) + corenet_udp_sendrecv_all_ports(syslogd_t) + corenet_udp_bind_generic_node(syslogd_t) + corenet_udp_bind_syslogd_port(syslogd_t) ++corenet_udp_bind_syslog_tls_port(syslogd_t) + # syslog-ng can listen and connect on tcp port 514 (rsh) + corenet_tcp_sendrecv_generic_if(syslogd_t) + corenet_tcp_sendrecv_generic_node(syslogd_t) +@@ -422,9 +512,13 @@ corenet_tcp_bind_rsh_port(syslogd_t) + corenet_tcp_connect_rsh_port(syslogd_t) + # Allow users to define additional syslog ports to connect to + corenet_tcp_bind_syslogd_port(syslogd_t) ++corenet_tcp_bind_syslog_tls_port(syslogd_t) ++corenet_tcp_connect_syslog_tls_port(syslogd_t) + corenet_tcp_connect_syslogd_port(syslogd_t) + corenet_tcp_connect_postgresql_port(syslogd_t) + corenet_tcp_connect_mysqld_port(syslogd_t) ++corenet_tcp_connect_http_port(syslogd_t) ++corenet_tcp_connect_wap_wsp_port(syslogd_t) + + # syslog-ng can send or receive logs + corenet_sendrecv_syslogd_client_packets(syslogd_t) +@@ -432,9 +526,33 @@ corenet_sendrecv_syslogd_server_packets(syslogd_t) + corenet_sendrecv_postgresql_client_packets(syslogd_t) + corenet_sendrecv_mysqld_client_packets(syslogd_t) + ++tunable_policy(`logging_syslogd_use_tty',` ++ term_use_all_ttys(syslogd_t) ++ term_use_all_ptys(syslogd_t) ++') ++ ++tunable_policy(`logging_syslogd_can_sendmail',` ++ # support for ommail module to send logs via mail ++ corenet_tcp_connect_smtp_port(syslogd_t) ++') ++ ++optional_policy(` ++ tunable_policy(`logging_syslogd_run_nagios_plugins',` ++ nagios_domtrans_unconfined_plugins(syslogd_t) ++ nagios_unconfined_signull(syslogd_t) ++ ') ++') ++ + dev_filetrans(syslogd_t, devlog_t, sock_file) + dev_read_sysfs(syslogd_t) +- ++dev_read_rand(syslogd_t) ++dev_read_urand(syslogd_t) ++# relating to systemd-kmsg-syslogd ++dev_write_kmsg(syslogd_t) ++dev_read_kmsg(syslogd_t) ++ ++domain_read_all_domains_state(syslogd_t) ++domain_getattr_all_domains(syslogd_t) + domain_use_interactive_fds(syslogd_t) + + files_read_etc_files(syslogd_t) +@@ -443,18 +561,25 @@ files_read_var_files(syslogd_t) + files_read_etc_runtime_files(syslogd_t) + # /initrd is not umounted before minilog starts + files_dontaudit_search_isid_type_dirs(syslogd_t) ++files_dontaudit_list_var(syslogd_t) + files_read_kernel_symbol_table(syslogd_t) + files_var_lib_filetrans(syslogd_t, syslogd_var_lib_t, { file dir }) + + fs_getattr_all_fs(syslogd_t) + fs_search_auto_mountpoints(syslogd_t) ++fs_search_cgroup_dirs(syslogd_t) ++ ++miscfiles_manage_generic_cert_files(syslogd_t) + + mls_file_write_all_levels(syslogd_t) # Need to be able to write to /var/run/ and /var/log directories ++mls_socket_write_all_levels(syslogd_t) # Neet to be able to sendto dgram + + term_write_console(syslogd_t) + # Allow syslog to a terminal + term_write_unallocated_ttys(syslogd_t) ++term_use_generic_ptys(syslogd_t) + ++init_stream_connect(syslogd_t) + # for sending messages to logged in users + init_read_utmp(syslogd_t) + init_dontaudit_write_utmp(syslogd_t) +@@ -466,11 +591,12 @@ init_use_fds(syslogd_t) + + # cjp: this doesnt make sense + logging_send_syslog_msg(syslogd_t) +- +-miscfiles_read_localization(syslogd_t) ++logging_manage_all_logs(syslogd_t) ++logging_set_loginuid(syslogd_t) + + userdom_dontaudit_use_unpriv_user_fds(syslogd_t) +-userdom_dontaudit_search_user_home_dirs(syslogd_t) ++userdom_search_user_home_dirs(syslogd_t) ++userdom_rw_inherited_user_tmp_files(syslogd_t) + + ifdef(`distro_gentoo',` + # default gentoo syslog-ng config appends kernel +@@ -494,9 +620,14 @@ optional_policy(` + bind_search_cache(syslogd_t) + ') + ++optional_policy(` ++ container_read_lib_files(syslogd_t) ++') ++ + optional_policy(` + cron_manage_log_files(syslogd_t) + cron_generic_log_filetrans_log(syslogd_t, file, "cron.log") ++ cron_generic_log_filetrans_log(syslogd_t, file, "cron") + ') + + optional_policy(` +@@ -507,15 +638,40 @@ optional_policy(` + ') + + optional_policy(` ++ kerberos_keytab_template(syslogd, syslogd_t) ++ kerberos_manage_host_rcache(syslogd_t) ++ kerberos_read_config(syslogd_t) ++') ++ ++optional_policy(` ++ mysql_read_config(syslogd_t) + mysql_stream_connect(syslogd_t) + ') + ++optional_policy(` ++ plymouthd_manage_log(syslogd_t) ++') ++ ++optional_policy(` ++ postfix_search_spool(syslogd_t) ++') ++ + optional_policy(` + postgresql_stream_connect(syslogd_t) + ') + ++optional_policy(` ++ psad_search_lib_files(syslogd_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(syslogd_t) ++ snmp_read_snmp_var_lib_files(syslogd_t) ++ snmp_dontaudit_write_snmp_var_lib_files(syslogd_t) ++') ++ ++optional_policy(` ++ daemontools_search_svc_dir(syslogd_t) + ') + + optional_policy(` +@@ -526,3 +682,26 @@ optional_policy(` + # log to the xconsole + xserver_rw_console(syslogd_t) + ') ++ ++##################################################### ++# ++# syslog client rules ++# ++allow syslog_client_type devlog_t:lnk_file read_lnk_file_perms; ++allow syslog_client_type devlog_t:sock_file write_sock_file_perms; ++ ++# the type of socket depends on the syslog daemon ++allow syslog_client_type syslogd_t:unix_dgram_socket sendto; ++allow syslog_client_type syslogd_t:unix_stream_socket connectto; ++allow syslog_client_type self:unix_dgram_socket create_socket_perms; ++allow syslog_client_type self:unix_stream_socket create_socket_perms; ++ ++# If syslog is down, the glibc syslog() function ++# will write to the console. ++term_write_console(syslog_client_type) ++term_dontaudit_read_console(syslog_client_type) ++ifdef(`hide_broken_symptoms',` ++ kernel_dgram_send(syslog_client_type) ++') ++ ++logging_stream_connect_syslog(syslog_client_type) +diff --git a/policy/modules/system/lvm.fc b/policy/modules/system/lvm.fc +index 6b917403ee..7724116089 100644 +--- a/policy/modules/system/lvm.fc ++++ b/policy/modules/system/lvm.fc +@@ -23,6 +23,8 @@ ifdef(`distro_gentoo',` + /etc/lvmtab(/.*)? gen_context(system_u:object_r:lvm_metadata_t,s0) + /etc/lvmtab\.d(/.*)? gen_context(system_u:object_r:lvm_metadata_t,s0) + ++/etc/multipath(/.*)? gen_context(system_u:object_r:lvm_metadata_t,s0) ++ + # + # /lib + # +@@ -33,22 +35,27 @@ ifdef(`distro_gentoo',` + # + # /sbin + # ++/sbin/mount\.crypt -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/sbin/umount\.crypt -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/cryptsetup -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/dmraid -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/dmsetup -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/dmsetup\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/e2fsadm -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/sbin/kpartx -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvchange -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvcreate -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvdisplay -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvextend -- gen_context(system_u:object_r:lvm_exec_t,s0) +-/sbin/lvm -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/sbin/lvm -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvm\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvmchange -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvmdiskscan -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/sbin/lvmetad -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvmiopversion -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvmsadc -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvmsar -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/sbin/lvmpolld -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvreduce -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvremove -- gen_context(system_u:object_r:lvm_exec_t,s0) + /sbin/lvrename -- gen_context(system_u:object_r:lvm_exec_t,s0) +@@ -89,8 +96,77 @@ ifdef(`distro_gentoo',` + # + # /usr + # +-/usr/sbin/clvmd -- gen_context(system_u:object_r:clvmd_exec_t,s0) +-/usr/sbin/lvm -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/systemd/generator/lvm.* gen_context(system_u:object_r:lvm_unit_file_t,s0) ++/usr/lib/systemd/system/lvm2.*\.service gen_context(system_u:object_r:lvm_unit_file_t,s0) ++ ++/usr/sbin/clvmd -- gen_context(system_u:object_r:clvmd_exec_t,s0) ++/usr/sbin/cryptsetup -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/dmeventd -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/dmraid -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/dmsetup -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/dmsetup\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/e2fsadm -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/kpartx -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvchange -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvcreate -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvdisplay -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvextend -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvm -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvm\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmchange -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmdiskscan -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmetad -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmiopversion -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmsadc -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmsar -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmpolld -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvmlockd -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvreduce -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvremove -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvrename -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvresize -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvs -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/lvscan -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/mount\.crypt -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/multipathd -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/multipath\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvchange -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvcreate -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvdata -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvdisplay -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvmove -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvremove -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvs -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/pvscan -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgcfgbackup -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgcfgrestore -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgchange -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgchange\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgck -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgcreate -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgdisplay -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgexport -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgextend -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgimport -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgmerge -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgmknodes -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgreduce -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgremove -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgrename -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgs -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgscan -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgscan\.static -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgsplit -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/sbin/vgwrapper -- gen_context(system_u:object_r:lvm_exec_t,s0) ++ ++/usr/lib/lvm-10/.* -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/lvm-200/.* -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/systemd/systemd-cryptsetup -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/systemd/system-generators/lvm2.* -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/storaged/storaged -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/libexec/storaged/storaged -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/storaged/storaged-lvm-helper -- gen_context(system_u:object_r:lvm_exec_t,s0) ++/usr/lib/udev/udisks-lvm-pv-export -- gen_context(system_u:object_r:lvm_exec_t,s0) + + # + # /var +@@ -98,5 +174,11 @@ ifdef(`distro_gentoo',` + /var/cache/multipathd(/.*)? gen_context(system_u:object_r:lvm_metadata_t,s0) + /var/lib/multipath(/.*)? gen_context(system_u:object_r:lvm_var_lib_t,s0) + /var/lock/lvm(/.*)? gen_context(system_u:object_r:lvm_lock_t,s0) ++/var/lock/dmraid(/.*)? gen_context(system_u:object_r:lvm_lock_t,s0) ++/var/run/lvm(/.*)? gen_context(system_u:object_r:lvm_var_run_t,s0) ++/var/run/multipathd(/.*)? gen_context(system_u:object_r:lvm_var_run_t,s0) + /var/run/multipathd\.sock -s gen_context(system_u:object_r:lvm_var_run_t,s0) ++/var/run/clvmd\.pid -- gen_context(system_u:object_r:clvmd_var_run_t,s0) + /var/run/dmevent.* gen_context(system_u:object_r:lvm_var_run_t,s0) ++ ++/var/run/storaged(/.*)? gen_context(system_u:object_r:lvm_var_run_t,s0) +diff --git a/policy/modules/system/lvm.if b/policy/modules/system/lvm.if +index 58bc27f227..d12c44ecd2 100644 +--- a/policy/modules/system/lvm.if ++++ b/policy/modules/system/lvm.if +@@ -1,5 +1,24 @@ + ## Policy for logical volume management programs. + ++######################################## ++## ++## Get the attribute of lvm entrypoint files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_getattr_exec_files',` ++ gen_require(` ++ type lvm_exec_t; ++ ') ++ ++ files_list_etc($1) ++ allow $1 lvm_exec_t:file getattr; ++') ++ + ######################################## + ## + ## Execute lvm programs in the lvm domain. +@@ -84,6 +103,90 @@ interface(`lvm_read_config',` + read_files_pattern($1, lvm_etc_t, lvm_etc_t) + ') + ++######################################## ++## ++## Mmap LVM configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`lvm_map_config',` ++ gen_require(` ++ type lvm_etc_t; ++ ') ++ ++ allow $1 lvm_etc_t:file map; ++') ++ ++######################################## ++## ++## Read LVM configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`lvm_read_metadata',` ++ gen_require(` ++ type lvm_etc_t; ++ type lvm_metadata_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 lvm_etc_t:dir list_dir_perms; ++ read_files_pattern($1,lvm_metadata_t ,lvm_metadata_t) ++') ++ ++######################################## ++## ++## Read LVM configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`lvm_write_metadata',` ++ gen_require(` ++ type lvm_etc_t; ++ type lvm_metadata_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 lvm_etc_t:dir list_dir_perms; ++ write_files_pattern($1,lvm_metadata_t ,lvm_metadata_t) ++') ++ ++######################################## ++## ++## Manage LVM metadata files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`lvm_manage_metadata',` ++ gen_require(` ++ type lvm_metadata_t; ++ ') ++ ++ allow $1 lvm_metadata_t:dir list_dir_perms; ++ manage_dirs_pattern($1, lvm_metadata_t, lvm_metadata_t) ++ manage_files_pattern($1, lvm_metadata_t, lvm_metadata_t) ++') ++ + ######################################## + ## + ## Manage LVM configuration files. +@@ -105,6 +208,25 @@ interface(`lvm_manage_config',` + manage_files_pattern($1, lvm_etc_t, lvm_etc_t) + ') + ++######################################## ++## ++## Connect to lvm using a unix domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_stream_connect',` ++ gen_require(` ++ type lvm_t, lvm_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, lvm_var_run_t, lvm_var_run_t, lvm_t) ++') ++ + ###################################### + ## + ## Execute a domain transition to run clvmd. +@@ -123,3 +245,154 @@ interface(`lvm_domtrans_clvmd',` + corecmd_search_bin($1) + domtrans_pattern($1, clvmd_exec_t, clvmd_t) + ') ++ ++######################################## ++## ++## Read and write to lvm temporary file system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_rw_clvmd_tmpfs_files',` ++ gen_require(` ++ type clvmd_tmpfs_t; ++ ') ++ ++ allow $1 clvmd_tmpfs_t:file rw_file_perms; ++') ++ ++######################################## ++## ++## Delete lvm temporary file system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_delete_clvmd_tmpfs_files',` ++ gen_require(` ++ type clvmd_tmpfs_t; ++ ') ++ ++ allow $1 clvmd_tmpfs_t:file unlink; ++') ++ ++######################################## ++## ++## Send lvm a null signal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_signull',` ++ gen_require(` ++ type lvm_t; ++ ') ++ ++ allow $1 lvm_t:process signull; ++') ++ ++######################################## ++## ++## Send a message to lvm over the ++## datagram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_dgram_send',` ++ gen_require(` ++ type lvm_t; ++ ') ++ ++ allow $1 lvm_t:unix_dgram_socket sendto; ++') ++ ++######################################## ++## ++## Read and write a lvm unnamed pipe. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_rw_pipes',` ++ gen_require(` ++ type lvm_var_run_t; ++ ') ++ ++ allow $1 lvm_var_run_t:fifo_file rw_fifo_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to access check cert dirs/files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`lvm_dontaudit_access_check_lock',` ++ gen_require(` ++ type lvm_lock_t; ++ ') ++ ++ dontaudit $1 lvm_lock_t:dir audit_access; ++') ++ ++######################################## ++## ++## Read the process state (/proc/pid) of lvm. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_read_state',` ++ gen_require(` ++ type lvm_t; ++ ') ++ ++ ps_process_pattern($1, lvm_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## lvm lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lvm_manage_lock',` ++ gen_require(` ++ type lvm_lock_t; ++ ') ++ ++ files_search_locks($1) ++ manage_files_pattern($1, lvm_lock_t, lvm_lock_t) ++ manage_dirs_pattern($1, lvm_lock_t, lvm_lock_t) ++') ++ ++ ++ +diff --git a/policy/modules/system/lvm.te b/policy/modules/system/lvm.te +index 79048c4108..26e560e793 100644 +--- a/policy/modules/system/lvm.te ++++ b/policy/modules/system/lvm.te +@@ -12,6 +12,9 @@ init_daemon_domain(clvmd_t, clvmd_exec_t) + type clvmd_initrc_exec_t; + init_script_file(clvmd_initrc_exec_t) + ++type clvmd_tmpfs_t alias clmvd_tmpfs_t; ++files_tmpfs_file(clvmd_tmpfs_t) ++ + type clvmd_var_run_t; + files_pid_file(clvmd_var_run_t) + +@@ -24,7 +27,7 @@ domain_obj_id_change_exemption(lvm_t) + role system_r types lvm_t; + + type lvm_etc_t; +-files_type(lvm_etc_t) ++files_config_file(lvm_etc_t) + + type lvm_lock_t; + files_lock_file(lvm_lock_t) +@@ -41,6 +44,9 @@ files_pid_file(lvm_var_run_t) + type lvm_tmp_t; + files_tmp_file(lvm_tmp_t) + ++type lvm_unit_file_t; ++systemd_unit_file(lvm_unit_file_t) ++ + ######################################## + # + # Cluster LVM daemon local policy +@@ -49,15 +55,19 @@ files_tmp_file(lvm_tmp_t) + allow clvmd_t self:capability { sys_nice chown ipc_lock sys_admin mknod }; + dontaudit clvmd_t self:capability sys_tty_config; + allow clvmd_t self:process { signal_perms setsched }; +-dontaudit clvmd_t self:process ptrace; + allow clvmd_t self:socket create_socket_perms; + allow clvmd_t self:fifo_file rw_fifo_file_perms; + allow clvmd_t self:unix_stream_socket { connectto create_stream_socket_perms }; + allow clvmd_t self:tcp_socket create_stream_socket_perms; + allow clvmd_t self:udp_socket create_socket_perms; + ++manage_dirs_pattern(clvmd_t, clvmd_tmpfs_t, clvmd_tmpfs_t) ++manage_files_pattern(clvmd_t, clvmd_tmpfs_t,clvmd_tmpfs_t) ++fs_tmpfs_filetrans(clvmd_t, clvmd_tmpfs_t, { dir file }) ++ ++manage_dirs_pattern(clvmd_t, clvmd_var_run_t, clvmd_var_run_t) + manage_files_pattern(clvmd_t, clvmd_var_run_t, clvmd_var_run_t) +-files_pid_filetrans(clvmd_t, clvmd_var_run_t, file) ++files_pid_filetrans(clvmd_t, clvmd_var_run_t, { file dir }) + + read_files_pattern(clvmd_t, lvm_metadata_t, lvm_metadata_t) + +@@ -71,7 +81,6 @@ kernel_dontaudit_getattr_core_if(clvmd_t) + corecmd_exec_shell(clvmd_t) + corecmd_getattr_bin_files(clvmd_t) + +-corenet_all_recvfrom_unlabeled(clvmd_t) + corenet_all_recvfrom_netlabel(clvmd_t) + corenet_tcp_sendrecv_generic_if(clvmd_t) + corenet_udp_sendrecv_generic_if(clvmd_t) +@@ -120,9 +129,6 @@ init_dontaudit_getattr_initctl(clvmd_t) + + logging_send_syslog_msg(clvmd_t) + +-miscfiles_read_localization(clvmd_t) +- +-seutil_dontaudit_search_config(clvmd_t) + seutil_sigchld_newrole(clvmd_t) + seutil_read_config(clvmd_t) + seutil_read_file_contexts(clvmd_t) +@@ -140,6 +146,11 @@ ifdef(`distro_redhat',` + ') + ') + ++optional_policy(` ++ aisexec_stream_connect(clvmd_t) ++ corosync_stream_connect(clvmd_t) ++') ++ + optional_policy(` + ccs_stream_connect(clvmd_t) + ') +@@ -165,20 +176,27 @@ optional_policy(` + # DAC overrides and mknod for modifying /dev entries (vgmknodes) + # rawio needed for dmraid + # net_admin for multipath +-allow lvm_t self:capability { dac_override fowner ipc_lock sys_admin sys_nice mknod chown sys_resource sys_rawio net_admin }; ++allow lvm_t self:capability { dac_read_search dac_override fowner ipc_lock sys_admin sys_nice mknod chown sys_resource sys_rawio net_admin }; + dontaudit lvm_t self:capability sys_tty_config; + allow lvm_t self:process { sigchld sigkill sigstop signull signal setfscreate }; + # LVM will complain a lot if it cannot set its priority. + allow lvm_t self:process setsched; ++allow lvm_t self:sem create_sem_perms; + allow lvm_t self:file rw_file_perms; + allow lvm_t self:fifo_file manage_fifo_file_perms; + allow lvm_t self:unix_dgram_socket create_socket_perms; ++allow lvm_t self:socket create_stream_socket_perms; + allow lvm_t self:netlink_kobject_uevent_socket create_socket_perms; + allow lvm_t self:sem create_sem_perms; + + allow lvm_t self:unix_stream_socket { connectto create_stream_socket_perms }; + allow lvm_t clvmd_t:unix_stream_socket { connectto rw_socket_perms }; + ++allow lvm_t lvm_unit_file_t:file manage_file_perms; ++systemd_unit_file_filetrans(lvm_t, lvm_unit_file_t, file) ++systemd_create_unit_file_dirs(lvm_t) ++systemd_create_unit_file_lnk(lvm_t) ++ + manage_dirs_pattern(lvm_t, lvm_tmp_t, lvm_tmp_t) + manage_files_pattern(lvm_t, lvm_tmp_t, lvm_tmp_t) + files_tmp_filetrans(lvm_t, lvm_tmp_t, { file dir }) +@@ -191,10 +209,12 @@ read_lnk_files_pattern(lvm_t, lvm_exec_t, lvm_exec_t) + can_exec(lvm_t, lvm_exec_t) + + # Creating lock files ++manage_dirs_pattern(lvm_t, lvm_lock_t, lvm_lock_t) + manage_files_pattern(lvm_t, lvm_lock_t, lvm_lock_t) + create_dirs_pattern(lvm_t, lvm_lock_t, lvm_lock_t) + files_lock_filetrans(lvm_t, lvm_lock_t, file) + files_lock_filetrans(lvm_t, lvm_lock_t, dir, "lvm") ++files_lock_filetrans(lvm_t, lvm_lock_t, dir, "dmraid") + + manage_dirs_pattern(lvm_t, lvm_var_lib_t, lvm_var_lib_t) + manage_files_pattern(lvm_t, lvm_var_lib_t, lvm_var_lib_t) +@@ -202,10 +222,13 @@ files_var_lib_filetrans(lvm_t, lvm_var_lib_t, { dir file }) + + manage_dirs_pattern(lvm_t, lvm_var_run_t, lvm_var_run_t) + manage_files_pattern(lvm_t, lvm_var_run_t, lvm_var_run_t) ++manage_fifo_files_pattern(lvm_t, lvm_var_run_t, lvm_var_run_t) + manage_sock_files_pattern(lvm_t, lvm_var_run_t, lvm_var_run_t) +-files_pid_filetrans(lvm_t, lvm_var_run_t, { file sock_file }) ++files_pid_filetrans(lvm_t, lvm_var_run_t, { dir file fifo_file sock_file }) ++init_pid_filetrans(lvm_t, lvm_var_run_t, { dir file fifo_file sock_file }) + + read_files_pattern(lvm_t, lvm_etc_t, lvm_etc_t) ++allow lvm_t lvm_etc_t:file map; + read_lnk_files_pattern(lvm_t, lvm_etc_t, lvm_etc_t) + # Write to /etc/lvm, /etc/lvmtab, /etc/lvmtab.d + manage_files_pattern(lvm_t, lvm_metadata_t, lvm_metadata_t) +@@ -220,6 +243,7 @@ kernel_read_kernel_sysctls(lvm_t) + # it has no reason to need this + kernel_dontaudit_getattr_core_if(lvm_t) + kernel_use_fds(lvm_t) ++kernel_request_load_module(lvm_t) + kernel_search_debugfs(lvm_t) + + corecmd_exec_bin(lvm_t) +@@ -230,11 +254,13 @@ dev_delete_generic_dirs(lvm_t) + dev_read_rand(lvm_t) + dev_read_urand(lvm_t) + dev_rw_lvm_control(lvm_t) ++dev_write_kmsg(lvm_t) + dev_manage_generic_symlinks(lvm_t) + dev_relabel_generic_dev_dirs(lvm_t) + dev_manage_generic_blk_files(lvm_t) + # Read /sys/block. Device mapper metadata is kept there. +-dev_read_sysfs(lvm_t) ++# cryptsetup writes read_ahead_kb ++dev_rw_sysfs(lvm_t) + # cjp: this has no effect since LVM does not + # have lnk_file relabelto for anything else. + # perhaps this should be blk_files? +@@ -246,6 +272,7 @@ dev_dontaudit_getattr_generic_chr_files(lvm_t) + dev_dontaudit_getattr_generic_blk_files(lvm_t) + dev_dontaudit_getattr_generic_pipes(lvm_t) + dev_create_generic_dirs(lvm_t) ++dev_rw_generic_files(lvm_t) + + domain_use_interactive_fds(lvm_t) + domain_read_all_domains_state(lvm_t) +@@ -255,17 +282,21 @@ files_read_etc_files(lvm_t) + files_read_etc_runtime_files(lvm_t) + # for when /usr is not mounted: + files_dontaudit_search_isid_type_dirs(lvm_t) ++fs_rw_inherited_tmpfs_files(lvm_t) + +-fs_getattr_xattr_fs(lvm_t) ++fs_getattr_all_fs(lvm_t) + fs_search_auto_mountpoints(lvm_t) + fs_list_tmpfs(lvm_t) + fs_read_tmpfs_symlinks(lvm_t) + fs_dontaudit_read_removable_files(lvm_t) + fs_dontaudit_getattr_tmpfs_files(lvm_t) + fs_rw_anon_inodefs_files(lvm_t) ++fs_list_auto_mountpoints(lvm_t) ++fs_list_hugetlbfs(lvm_t) + + mls_file_read_all_levels(lvm_t) + mls_file_write_to_clearance(lvm_t) ++mls_file_upgrade(lvm_t) + + selinux_get_fs_mount(lvm_t) + selinux_validate_context(lvm_t) +@@ -285,7 +316,7 @@ storage_dev_filetrans_fixed_disk(lvm_t) + # Access raw devices and old /dev/lvm (c 109,0). Is this needed? + storage_manage_fixed_disk(lvm_t) + +-term_use_all_terms(lvm_t) ++term_use_all_inherited_terms(lvm_t) + + init_use_fds(lvm_t) + init_dontaudit_getattr_initctl(lvm_t) +@@ -293,15 +324,23 @@ init_use_script_ptys(lvm_t) + init_read_script_state(lvm_t) + + logging_send_syslog_msg(lvm_t) ++logging_stream_connect_syslog(lvm_t) + +-miscfiles_read_localization(lvm_t) ++authlogin_rw_pipes(lvm_t) ++auth_use_nsswitch(lvm_t) + + seutil_read_config(lvm_t) + seutil_read_file_contexts(lvm_t) + seutil_search_default_contexts(lvm_t) + seutil_sigchld_newrole(lvm_t) + ++userdom_use_inherited_user_terminals(lvm_t) + userdom_use_user_terminals(lvm_t) ++userdom_rw_inherited_user_tmp_pipes(lvm_t) ++userdom_rw_semaphores(lvm_t) ++userdom_search_user_home_dirs(lvm_t) ++ ++usermanage_read_crack_db(lvm_t) + + ifdef(`distro_redhat',` + # this is from the initrd: +@@ -312,6 +351,11 @@ ifdef(`distro_redhat',` + ') + ') + ++optional_policy(` ++ aisexec_stream_connect(lvm_t) ++ corosync_stream_connect(lvm_t) ++') ++ + optional_policy(` + bootloader_rw_tmp_files(lvm_t) + ') +@@ -332,14 +376,38 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ container_rw_sem(lvm_t) ++') ++ ++optional_policy(` ++ kdump_rw_inherited_kdumpctl_tmp_pipes(lvm_t) ++') ++ ++optional_policy(` ++ livecd_rw_semaphores(lvm_t) ++') ++ + optional_policy(` + modutils_domtrans_insmod(lvm_t) + ') + ++optional_policy(` ++ raid_read_mdadm_pid(lvm_t) ++') ++ + optional_policy(` + rpm_manage_script_tmp_files(lvm_t) + ') + ++optional_policy(` ++ policykit_dbus_chat(lvm_t) ++') ++ ++optional_policy(` ++ systemd_manage_passwd_run(lvm_t) ++') ++ + optional_policy(` + udev_read_db(lvm_t) + udev_read_pid_files(lvm_t) +diff --git a/policy/modules/system/miscfiles.fc b/policy/modules/system/miscfiles.fc +index 9fe8e01e3b..5cee43ebb7 100644 +--- a/policy/modules/system/miscfiles.fc ++++ b/policy/modules/system/miscfiles.fc +@@ -9,11 +9,15 @@ ifdef(`distro_gentoo',` + # /etc + # + /etc/avahi/etc/localtime -- gen_context(system_u:object_r:locale_t,s0) +-/etc/httpd/alias/[^/]*\.db(\.[^/]*)* -- gen_context(system_u:object_r:cert_t,s0) +-/etc/localtime -- gen_context(system_u:object_r:locale_t,s0) ++/etc/docker/certs\.d(/.*)? gen_context(system_u:object_r:cert_t,s0) ++/etc/httpd/alias(/.*)? gen_context(system_u:object_r:cert_t,s0) ++/etc/localtime -l gen_context(system_u:object_r:locale_t,s0) ++/etc/locale.conf -- gen_context(system_u:object_r:locale_t,s0) + /etc/pki(/.*)? gen_context(system_u:object_r:cert_t,s0) + /etc/ssl(/.*)? gen_context(system_u:object_r:cert_t,s0) ++/etc/ipa/nssdb(/.*)? gen_context(system_u:object_r:cert_t,s0) + /etc/timezone -- gen_context(system_u:object_r:locale_t,s0) ++/etc/vconsole.conf -- gen_context(system_u:object_r:locale_t,s0) + + ifdef(`distro_redhat',` + /etc/sysconfig/clock -- gen_context(system_u:object_r:locale_t,s0) +@@ -37,24 +41,20 @@ ifdef(`distro_redhat',` + + /usr/lib/perl5/man(/.*)? gen_context(system_u:object_r:man_t,s0) + +-/usr/local/man(/.*)? gen_context(system_u:object_r:man_t,s0) +-/usr/local/share/man(/.*)? gen_context(system_u:object_r:man_t,s0) +- +-/usr/local/share/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) +- + /usr/man(/.*)? gen_context(system_u:object_r:man_t,s0) + + /usr/share/ca-certificates(/.*)? gen_context(system_u:object_r:cert_t,s0) + /usr/share/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) +-/usr/share/X11/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) + /usr/share/ghostscript/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) + /usr/share/locale(/.*)? gen_context(system_u:object_r:locale_t,s0) + /usr/share/man(/.*)? gen_context(system_u:object_r:man_t,s0) +-/usr/share/X11/locale(/.*)? gen_context(system_u:object_r:locale_t,s0) +-/usr/share/zoneinfo(/.*)? gen_context(system_u:object_r:locale_t,s0) +- ++/usr/share/pki/ca-certificates(/.*)? gen_context(system_u:object_r:cert_t,s0) ++/usr/share/pki/ca-trust-source(/.*)? gen_context(system_u:object_r:cert_t,s0) + /usr/share/ssl/certs(/.*)? gen_context(system_u:object_r:cert_t,s0) + /usr/share/ssl/private(/.*)? gen_context(system_u:object_r:cert_t,s0) ++/usr/share/X11/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) ++/usr/share/X11/locale(/.*)? gen_context(system_u:object_r:locale_t,s0) ++/usr/share/zoneinfo(/.*)? gen_context(system_u:object_r:locale_t,s0) + + /usr/X11R6/lib/X11/fonts(/.*)? gen_context(system_u:object_r:fonts_t,s0) + +@@ -77,7 +77,7 @@ ifdef(`distro_redhat',` + + /var/cache/fontconfig(/.*)? gen_context(system_u:object_r:fonts_cache_t,s0) + /var/cache/fonts(/.*)? gen_context(system_u:object_r:tetex_data_t,s0) +-/var/cache/man(/.*)? gen_context(system_u:object_r:man_cache_t,s0) ++ + + /var/named/chroot/etc/pki(/.*)? gen_context(system_u:object_r:cert_t,s0) + +@@ -89,7 +89,10 @@ ifdef(`distro_debian',` + /var/lib/usbutils(/.*)? gen_context(system_u:object_r:hwdata_t,s0) + ') + ++/var/lib/letsencrypt(/.*)? gen_context(system_u:object_r:cert_t,s0) ++ + ifdef(`distro_redhat',` ++/var/named/chroot/etc/localtime -- gen_context(system_u:object_r:locale_t,s0) + /var/empty/sshd/etc/localtime -- gen_context(system_u:object_r:locale_t,s0) + /var/spool/postfix/etc/localtime -- gen_context(system_u:object_r:locale_t,s0) + ') +diff --git a/policy/modules/system/miscfiles.if b/policy/modules/system/miscfiles.if +index fc28bc31b0..e229517afa 100644 +--- a/policy/modules/system/miscfiles.if ++++ b/policy/modules/system/miscfiles.if +@@ -65,6 +65,27 @@ interface(`miscfiles_read_all_certs',` + read_lnk_files_pattern($1, cert_type, cert_type) + ') + ++######################################## ++## ++## Read all SSL certificates. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`miscfiles_manage_all_certs',` ++ gen_require(` ++ attribute cert_type; ++ ') ++ ++ allow $1 cert_type:dir list_dir_perms; ++ manage_files_pattern($1, cert_type, cert_type) ++ manage_lnk_files_pattern($1, cert_type, cert_type) ++') ++ + ######################################## + ## + ## Read generic SSL certificates. +@@ -86,6 +107,25 @@ interface(`miscfiles_read_generic_certs',` + read_lnk_files_pattern($1, cert_t, cert_t) + ') + ++######################################## ++## ++## mmap generic SSL certificates. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`miscfiles_map_generic_certs',` ++ gen_require(` ++ type cert_t; ++ ') ++ ++ allow $1 cert_t:file map; ++') ++ + ######################################## + ## + ## Manage generic SSL certificates. +@@ -104,6 +144,24 @@ interface(`miscfiles_manage_generic_cert_dirs',` + manage_dirs_pattern($1, cert_t, cert_t) + ') + ++######################################## ++## ++## Dontaudit attempts to write generic SSL certificates. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_dontaudit_write_generic_cert_files',` ++ gen_require(` ++ type cert_t; ++ ') ++ ++ dontaudit $1 cert_t:file write; ++') ++ + ######################################## + ## + ## Manage generic SSL certificates. +@@ -121,7 +179,7 @@ interface(`miscfiles_manage_generic_cert_files',` + ') + + manage_files_pattern($1, cert_t, cert_t) +- read_lnk_files_pattern($1, cert_t, cert_t) ++ manage_lnk_files_pattern($1, cert_t, cert_t) + ') + + ######################################## +@@ -154,6 +212,26 @@ interface(`miscfiles_manage_cert_dirs',` + refpolicywarn(`$0() has been deprecated, please use miscfiles_manage_generic_cert_dirs() instead.') + ') + ++######################################## ++## ++## Do not audit attempts to access check cert dirs/files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`miscfiles_dontaudit_access_check_cert',` ++ gen_require(` ++ type cert_t; ++ ') ++ ++ dontaudit $1 cert_t:file audit_access; ++ dontaudit $1 cert_t:dir audit_access; ++') ++ ++ + ######################################## + ## + ## Manage SSL certificates. +@@ -191,11 +269,13 @@ interface(`miscfiles_read_fonts',` + + allow $1 fonts_t:dir list_dir_perms; + read_files_pattern($1, fonts_t, fonts_t) ++ allow $1 fonts_t:file map; + read_lnk_files_pattern($1, fonts_t, fonts_t) + + allow $1 fonts_cache_t:dir list_dir_perms; + read_files_pattern($1, fonts_cache_t, fonts_cache_t) + read_lnk_files_pattern($1, fonts_cache_t, fonts_cache_t) ++ allow $1 fonts_cache_t:file map; + ') + + ######################################## +@@ -414,6 +494,7 @@ interface(`miscfiles_read_localization',` + allow $1 locale_t:dir list_dir_perms; + read_files_pattern($1, locale_t, locale_t) + read_lnk_files_pattern($1, locale_t, locale_t) ++ allow $1 locale_t:file map; + ') + + ######################################## +@@ -434,6 +515,7 @@ interface(`miscfiles_rw_localization',` + files_search_usr($1) + allow $1 locale_t:dir list_dir_perms; + rw_files_pattern($1, locale_t, locale_t) ++ manage_lnk_files_pattern($1, locale_t, locale_t) + ') + + ######################################## +@@ -453,6 +535,7 @@ interface(`miscfiles_relabel_localization',` + + files_search_usr($1) + relabel_files_pattern($1, locale_t, locale_t) ++ relabel_lnk_files_pattern($1, locale_t, locale_t) + ') + + ######################################## +@@ -470,7 +553,6 @@ interface(`miscfiles_legacy_read_localization',` + type locale_t; + ') + +- miscfiles_read_localization($1) + allow $1 locale_t:file execute; + ') + +@@ -531,6 +613,10 @@ interface(`miscfiles_read_man_pages',` + allow $1 { man_cache_t man_t }:dir list_dir_perms; + read_files_pattern($1, { man_cache_t man_t }, { man_cache_t man_t }) + read_lnk_files_pattern($1, { man_cache_t man_t }, { man_cache_t man_t }) ++ ++ optional_policy(` ++ mandb_read_cache_files($1) ++ ') + ') + + ######################################## +@@ -554,6 +640,29 @@ interface(`miscfiles_delete_man_pages',` + delete_dirs_pattern($1, { man_cache_t man_t }, { man_cache_t man_t }) + delete_files_pattern($1, { man_cache_t man_t }, { man_cache_t man_t }) + delete_lnk_files_pattern($1, { man_cache_t man_t }, { man_cache_t man_t }) ++ optional_policy(` ++ mandb_setattr_cache_dirs($1) ++ mandb_delete_cache($1) ++ ') ++') ++####################################### ++## ++## Create, read, write, and delete man pages ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_setattr_man_pages',` ++ gen_require(` ++ type man_t; ++ ') ++ ++ files_search_usr($1) ++ ++ allow $1 man_t:dir setattr; + ') + + ######################################## +@@ -620,6 +729,30 @@ interface(`miscfiles_manage_man_cache',` + allow $1 man_cache_t:lnk_file manage_lnk_file_perms; + ') + ++######################################## ++## ++## Allow process to relabel man_pages info ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_relabel_man_pages',` ++ gen_require(` ++ type man_t; ++ ') ++ ++ files_search_usr($1) ++ relabel_dirs_pattern($1, man_t, man_t) ++ relabel_files_pattern($1, man_t, man_t) ++ ++ optional_policy(` ++ mandb_relabel_cache($1) ++ ') ++') ++ + ######################################## + ## + ## Read public files used for file +@@ -784,8 +917,11 @@ interface(`miscfiles_etc_filetrans_localization',` + type locale_t; + ') + +- files_etc_filetrans($1, locale_t, file) +- ++ files_etc_filetrans($1, locale_t, lnk_file) ++ files_etc_filetrans($1, locale_t, {lnk_file file}, "localtime" ) ++ files_etc_filetrans($1, locale_t, file, "locale.conf" ) ++ files_etc_filetrans($1, locale_t, file, "timezone" ) ++ files_etc_filetrans($1, locale_t, file, "vconsole.conf" ) + ') + + ######################################## +@@ -809,3 +945,81 @@ interface(`miscfiles_manage_localization',` + manage_lnk_files_pattern($1, locale_t, locale_t) + ') + ++######################################## ++## ++## Transition to miscfiles locale named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_filetrans_locale_named_content',` ++ gen_require(` ++ type locale_t; ++ ') ++ ++ files_etc_filetrans($1, locale_t, { lnk_file file }, "localtime") ++ files_etc_filetrans($1, locale_t, file, "locale.conf") ++ files_etc_filetrans($1, locale_t, file, "vconsole.conf") ++ files_etc_filetrans($1, locale_t, file, "locale.conf.new") ++ files_etc_filetrans($1, locale_t, file, "timezone") ++ files_etc_filetrans($1, locale_t, file, "clock") ++ files_usr_filetrans($1, locale_t, dir, "locale") ++ files_usr_filetrans($1, locale_t, dir, "zoneinfo") ++') ++ ++######################################## ++## ++## Transition to miscfiles named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_filetrans_named_content',` ++ gen_require(` ++ type man_t; ++ type cert_t; ++ type fonts_t; ++ type fonts_cache_t; ++ type hwdata_t; ++ type tetex_data_t; ++ type public_content_t; ++ ') ++ ++ miscfiles_filetrans_locale_named_content($1) ++ files_var_filetrans($1, man_t, dir, "man") ++ files_etc_filetrans($1, cert_t, dir, "pki") ++ files_usr_filetrans($1, cert_t, dir, "certs") ++ files_var_lib_filetrans($1, cert_t, dir, "letsencrypt") ++ files_usr_filetrans($1, fonts_t, dir, "fonts") ++ files_usr_filetrans($1, hwdata_t, dir, "hwdata") ++ files_var_filetrans($1, fonts_cache_t, dir, "fontconfig") ++ files_var_filetrans($1, tetex_data_t, dir, "fonts") ++ files_spool_filetrans($1, tetex_data_t, dir, "texmf") ++ files_var_lib_filetrans($1, tetex_data_t, dir, "texmf") ++ files_var_filetrans($1, public_content_t, dir, "ftp") ++') ++ ++ ++######################################## ++## ++## Transition to miscfiles named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`miscfiles_filetrans_named_content_letsencrypt',` ++ gen_require(` ++ type cert_t; ++ ') ++ ++ files_var_lib_filetrans($1, cert_t, dir, "letsencrypt") ++') +diff --git a/policy/modules/system/miscfiles.te b/policy/modules/system/miscfiles.te +index 1361961d00..be6b7fc804 100644 +--- a/policy/modules/system/miscfiles.te ++++ b/policy/modules/system/miscfiles.te +@@ -4,7 +4,6 @@ policy_module(miscfiles, 1.11.0) + # + # Declarations + # +- + attribute cert_type; + + # +@@ -48,10 +47,10 @@ files_type(man_cache_t) + # Types for public content + # + type public_content_t; #, customizable; +-files_type(public_content_t) ++files_mountpoint(public_content_t) + + type public_content_rw_t; #, customizable; +-files_type(public_content_rw_t) ++files_mountpoint(public_content_rw_t) + + # + # Base type for the tests directory. +diff --git a/policy/modules/system/modutils.fc b/policy/modules/system/modutils.fc +index 993367709b..7875b79fa7 100644 +--- a/policy/modules/system/modutils.fc ++++ b/policy/modules/system/modutils.fc +@@ -10,8 +10,6 @@ ifdef(`distro_gentoo',` + /etc/modprobe.devfs.* -- gen_context(system_u:object_r:modules_conf_t,s0) + ') + +-/lib/modules/[^/]+/modules\..+ -- gen_context(system_u:object_r:modules_dep_t,s0) +- + /lib/modules/modprobe\.conf -- gen_context(system_u:object_r:modules_conf_t,s0) + + /sbin/depmod.* -- gen_context(system_u:object_r:depmod_exec_t,s0) +@@ -23,3 +21,15 @@ ifdef(`distro_gentoo',` + /sbin/update-modules -- gen_context(system_u:object_r:update_modules_exec_t,s0) + + /usr/bin/kmod -- gen_context(system_u:object_r:insmod_exec_t,s0) ++ ++/usr/sbin/depmod.* -- gen_context(system_u:object_r:depmod_exec_t,s0) ++/usr/sbin/generate-modprobe\.conf -- gen_context(system_u:object_r:update_modules_exec_t,s0) ++/usr/sbin/insmod.* -- gen_context(system_u:object_r:insmod_exec_t,s0) ++/usr/sbin/modprobe.* -- gen_context(system_u:object_r:insmod_exec_t,s0) ++/usr/sbin/modules-update -- gen_context(system_u:object_r:update_modules_exec_t,s0) ++/usr/sbin/rmmod.* -- gen_context(system_u:object_r:insmod_exec_t,s0) ++/usr/sbin/update-modules -- gen_context(system_u:object_r:update_modules_exec_t,s0) ++ ++/usr/lib/modules/modprobe\.conf -- gen_context(system_u:object_r:modules_conf_t,s0) ++ ++/var/run/tmpfiles.d/kmod.conf -- gen_context(system_u:object_r:insmod_var_run_t,s0) +diff --git a/policy/modules/system/modutils.if b/policy/modules/system/modutils.if +index 7449974f67..c19559d3b5 100644 +--- a/policy/modules/system/modutils.if ++++ b/policy/modules/system/modutils.if +@@ -12,11 +12,28 @@ + # + interface(`modutils_getattr_module_deps',` + gen_require(` +- type modules_dep_t; ++ type modules_dep_t, modules_object_t; + ') + + getattr_files_pattern($1, modules_object_t, modules_dep_t) + ') ++######################################## ++## ++## Read the dependencies of kernel modules. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`modutils_read_module_deps_files',` ++ gen_require(` ++ type modules_dep_t; ++ ') ++ ++ allow $1 modules_dep_t:file read_file_perms; ++') + + ######################################## + ## +@@ -34,9 +51,48 @@ interface(`modutils_read_module_deps',` + ') + + files_list_kernel_modules($1) ++ files_read_kernel_modules($1) + allow $1 modules_dep_t:file read_file_perms; + ') + ++######################################## ++## ++## Read the dependencies of kernel modules. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`modutils_delete_module_deps',` ++ gen_require(` ++ type modules_dep_t; ++ ') ++ ++ delete_files_pattern($1, modules_dep_t, modules_dep_t) ++') ++ ++######################################## ++## ++## list the configuration options used when ++## loading modules. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`modutils_list_module_config',` ++ gen_require(` ++ type modules_conf_t; ++ ') ++ ++ list_dirs_pattern($1, modules_conf_t, modules_conf_t) ++') ++ + ######################################## + ## + ## Read the configuration options used when +@@ -159,6 +215,26 @@ interface(`modutils_domtrans_insmod',` + + corecmd_search_bin($1) + domtrans_pattern($1, insmod_exec_t, insmod_t) ++ ++ allow $1 insmod_exec_t:file map; ++') ++ ++######################################## ++## ++## Allow send signal to insmod. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`modutils_signal_insmod',` ++ gen_require(` ++ type insmod_t; ++ ') ++ ++ allow $1 insmod_t:process signal; + ') + + ######################################## +@@ -208,6 +284,24 @@ interface(`modutils_exec_insmod',` + can_exec($1, insmod_exec_t) + ') + ++####################################### ++## ++## Don't audit execute insmod in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`modutils_dontaudit_exec_insmod',` ++ gen_require(` ++ type insmod_exec_t; ++ ') ++ ++ dontaudit $1 insmod_exec_t:file exec_file_perms; ++') ++ + ######################################## + ## + ## Execute depmod in the depmod domain. +@@ -308,11 +402,18 @@ interface(`modutils_domtrans_update_mods',` + # + interface(`modutils_run_update_mods',` + gen_require(` +- attribute_role update_modules_roles; ++ #attribute_role update_modules_roles; ++ type update_modules_t; + ') + ++ #modutils_domtrans_update_mods($1) ++ #roleattribute $2 update_modules_roles; ++ + modutils_domtrans_update_mods($1) +- roleattribute $2 update_modules_roles; ++ role $2 types update_modules_t; ++ ++ modutils_run_insmod(update_modules_t, $2) ++ + ') + + ######################################## +@@ -333,3 +434,39 @@ interface(`modutils_exec_update_mods',` + corecmd_search_bin($1) + can_exec($1, update_modules_exec_t) + ') ++ ++######################################## ++## ++## Transition to modutils named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`modules_filetrans_named_content',` ++ gen_require(` ++ type modules_dep_t; ++ type modules_conf_t; ++ ') ++ ++ files_etc_filetrans($1, modules_conf_t, file, "modprobe.conf") ++ files_etc_filetrans($1, modules_conf_t, file, "modules.conf") ++ ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.alias") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.alias.bin") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.block") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.builtin") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.builtin.bin") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.dep") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.dep.bin") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.devname") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.drm") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.modesetting") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.networking") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.order") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.softdep") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.symbols") ++ #files_kernel_modules_filetrans($1, modules_dep_t, file, "modules.symbols.bin") ++') +diff --git a/policy/modules/system/modutils.te b/policy/modules/system/modutils.te +index 7a363b8b21..4724b5550d 100644 +--- a/policy/modules/system/modutils.te ++++ b/policy/modules/system/modutils.te +@@ -5,7 +5,7 @@ policy_module(modutils, 1.14.0) + # Declarations + # + +-attribute_role update_modules_roles; ++#attribute_role update_modules_roles; + + type depmod_t; + type depmod_exec_t; +@@ -16,11 +16,15 @@ type insmod_t; + type insmod_exec_t; + application_domain(insmod_t, insmod_exec_t) + mls_file_write_all_levels(insmod_t) ++mls_process_write_down(insmod_t) + role system_r types insmod_t; + ++type insmod_var_run_t; ++files_pid_file(insmod_var_run_t) ++ + # module loading config + type modules_conf_t; +-files_type(modules_conf_t) ++files_config_file(modules_conf_t) + + # module dependencies + type modules_dep_t; +@@ -29,12 +33,16 @@ files_type(modules_dep_t) + type update_modules_t; + type update_modules_exec_t; + init_system_domain(update_modules_t, update_modules_exec_t) +-roleattribute system_r update_modules_roles; +-role update_modules_roles types update_modules_t; ++#roleattribute system_r update_modules_roles; ++#role update_modules_roles types update_modules_t; ++role system_r types update_modules_t; + + type update_modules_tmp_t; + files_tmp_file(update_modules_tmp_t) + ++type insmod_tmpfs_t; ++files_tmpfs_file(insmod_tmpfs_t) ++ + ######################################## + # + # depmod local policy +@@ -54,12 +62,15 @@ corecmd_search_bin(depmod_t) + + domain_use_interactive_fds(depmod_t) + ++files_delete_kernel_modules(depmod_t) + files_read_kernel_symbol_table(depmod_t) + files_read_kernel_modules(depmod_t) + files_read_etc_runtime_files(depmod_t) + files_read_etc_files(depmod_t) + files_read_usr_src_files(depmod_t) + files_list_usr(depmod_t) ++files_append_var_files(depmod_t) ++files_read_boot_files(depmod_t) + + fs_getattr_xattr_fs(depmod_t) + +@@ -69,10 +80,12 @@ init_use_fds(depmod_t) + init_use_script_fds(depmod_t) + init_use_script_ptys(depmod_t) + +-userdom_use_user_terminals(depmod_t) ++userdom_use_inherited_user_terminals(depmod_t) + # Read System.map from home directories. + files_list_home(depmod_t) + userdom_read_user_home_content_files(depmod_t) ++userdom_manage_user_tmp_files(depmod_t) ++userdom_home_reader(depmod_t) + + ifdef(`distro_ubuntu',` + optional_policy(` +@@ -80,12 +93,8 @@ ifdef(`distro_ubuntu',` + ') + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(depmod_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(depmod_t) ++optional_policy(` ++ bootloader_rw_tmp_files(insmod_t) + ') + + optional_policy(` +@@ -94,7 +103,6 @@ optional_policy(` + ') + + optional_policy(` +- # Read System.map from home directories. + unconfined_domain(depmod_t) + ') + +@@ -103,11 +111,12 @@ optional_policy(` + # insmod local policy + # + +-allow insmod_t self:capability { dac_override net_raw sys_nice sys_tty_config }; ++allow insmod_t self:capability { dac_read_search dac_override mknod net_raw sys_nice sys_tty_config }; + allow insmod_t self:process { execmem sigchld sigkill sigstop signull signal }; + + allow insmod_t self:udp_socket create_socket_perms; + allow insmod_t self:rawip_socket create_socket_perms; ++allow insmod_t self:shm create_shm_perms; + + # Read module config and dependency information + list_dirs_pattern(insmod_t, modules_conf_t, modules_conf_t) +@@ -115,20 +124,29 @@ read_files_pattern(insmod_t, modules_conf_t, modules_conf_t) + list_dirs_pattern(insmod_t, modules_dep_t, modules_dep_t) + read_files_pattern(insmod_t, modules_dep_t, modules_dep_t) + ++manage_dirs_pattern(insmod_t, insmod_var_run_t, insmod_var_run_t) ++manage_files_pattern(insmod_t, insmod_var_run_t, insmod_var_run_t) ++files_pid_filetrans(insmod_t, insmod_var_run_t, {dir file }) ++ + can_exec(insmod_t, insmod_exec_t) + ++manage_files_pattern(insmod_t,insmod_tmpfs_t,insmod_tmpfs_t) ++fs_tmpfs_filetrans(insmod_t,insmod_tmpfs_t,file) ++ + kernel_load_module(insmod_t) +-kernel_request_load_module(insmod_t) ++files_manage_kernel_modules(insmod_t) ++files_map_kernel_modules(insmod_t) + kernel_read_system_state(insmod_t) + kernel_read_network_state(insmod_t) + kernel_write_proc_files(insmod_t) + kernel_mount_debugfs(insmod_t) + kernel_mount_kvmfs(insmod_t) + kernel_read_debugfs(insmod_t) ++kernel_request_load_module(insmod_t) + # Rules for /proc/sys/kernel/tainted + kernel_read_kernel_sysctls(insmod_t) + kernel_rw_kernel_sysctl(insmod_t) +-kernel_read_hotplug_sysctls(insmod_t) ++kernel_read_usermodehelper_state(insmod_t) + kernel_setsched(insmod_t) + + corecmd_exec_bin(insmod_t) +@@ -142,40 +160,55 @@ dev_rw_agp(insmod_t) + dev_read_sound(insmod_t) + dev_write_sound(insmod_t) + dev_rw_apm_bios(insmod_t) ++dev_create_generic_chr_files(insmod_t) + + domain_signal_all_domains(insmod_t) + domain_use_interactive_fds(insmod_t) + + files_read_kernel_modules(insmod_t) ++files_load_kernel_modules(insmod_t) + files_read_etc_runtime_files(insmod_t) + files_read_etc_files(insmod_t) + files_read_usr_files(insmod_t) + files_exec_etc_files(insmod_t) ++# users installing vbox put kernel modules in /var/lib ++files_read_var_lib_files(insmod_t) ++files_read_kernel_symbol_table(insmod_t) + # for nscd: + files_dontaudit_search_pids(insmod_t) + # for when /var is not mounted early in the boot: + files_dontaudit_search_isid_type_dirs(insmod_t) + # for locking: (cjp: ????) + files_write_kernel_modules(insmod_t) ++allow insmod_t modules_dep_t:file manage_file_perms; + + fs_getattr_xattr_fs(insmod_t) + fs_dontaudit_use_tmpfs_chr_dev(insmod_t) ++fs_mount_rpc_pipefs(insmod_t) ++fs_search_rpc(insmod_t) ++ ++auth_use_nsswitch(insmod_t) + + init_rw_initctl(insmod_t) + init_use_fds(insmod_t) + init_use_script_fds(insmod_t) + init_use_script_ptys(insmod_t) ++init_spec_domtrans_script(insmod_t) ++init_rw_script_tmp_files(insmod_t) ++init_dontaudit_getattr_stream_socket(insmod_t) + + logging_send_syslog_msg(insmod_t) + logging_search_logs(insmod_t) + +-miscfiles_read_localization(insmod_t) +- + seutil_read_file_contexts(insmod_t) + +-userdom_use_user_terminals(insmod_t) +- ++term_use_all_inherited_terms(insmod_t) + userdom_dontaudit_search_user_home_dirs(insmod_t) ++# needed by depmod in MLS ++userdom_manage_user_tmp_files(insmod_t) ++userdom_manage_user_tmp_pipes(insmod_t) ++userdom_manage_user_tmp_symlinks(insmod_t) ++userdom_manage_user_tmp_dirs(insmod_t) + + kernel_domtrans_to(insmod_t, insmod_exec_t) + +@@ -184,28 +217,37 @@ optional_policy(` + ') + + optional_policy(` +- firstboot_dontaudit_rw_pipes(insmod_t) +- firstboot_dontaudit_rw_stream_sockets(insmod_t) ++ devicekit_use_fds_disk(insmod_t) ++ devicekit_dontaudit_read_pid_files(insmod_t) + ') + + optional_policy(` +- hal_write_log(insmod_t) ++ firstboot_dontaudit_leaks(insmod_t) + ') + + optional_policy(` +- hotplug_search_config(insmod_t) ++ firewalld_dontaudit_write_tmp_files(insmod_t) ++ firewallgui_dontaudit_rw_pipes(insmod_t) + ') + + optional_policy(` +- mount_domtrans(insmod_t) ++ iptables_read_var_run(insmod_t) + ') + + optional_policy(` +- nis_use_ypbind(insmod_t) ++ hal_write_log(insmod_t) + ') + + optional_policy(` +- nscd_use(insmod_t) ++ hotplug_search_config(insmod_t) ++') ++ ++optional_policy(` ++ kdump_manage_kdumpctl_tmp_files(insmod_t) ++') ++ ++optional_policy(` ++ mount_domtrans(insmod_t) + ') + + optional_policy(` +@@ -225,6 +267,7 @@ optional_policy(` + + optional_policy(` + rpm_rw_pipes(insmod_t) ++ rpm_manage_script_tmp_files(insmod_t) + ') + + optional_policy(` +@@ -232,6 +275,10 @@ optional_policy(` + unconfined_dontaudit_rw_pipes(insmod_t) + ') + ++optional_policy(` ++ virt_dontaudit_write_pipes(insmod_t) ++') ++ + optional_policy(` + # cjp: why is this needed: + dev_rw_xserver_misc(insmod_t) +@@ -291,11 +338,10 @@ init_use_script_ptys(update_modules_t) + + logging_send_syslog_msg(update_modules_t) + +-miscfiles_read_localization(update_modules_t) + +-modutils_run_insmod(update_modules_t, update_modules_roles) ++#modutils_run_insmod(update_modules_t, update_modules_roles) + +-userdom_use_user_terminals(update_modules_t) ++userdom_use_inherited_user_terminals(update_modules_t) + userdom_dontaudit_search_user_home_dirs(update_modules_t) + + ifdef(`distro_gentoo',` +diff --git a/policy/modules/system/mount.fc b/policy/modules/system/mount.fc +index a38605e503..f035d9fbb8 100644 +--- a/policy/modules/system/mount.fc ++++ b/policy/modules/system/mount.fc +@@ -1,6 +1,26 @@ ++/bin/fusermount -- gen_context(system_u:object_r:fusermount_exec_t,s0) + /bin/mount.* -- gen_context(system_u:object_r:mount_exec_t,s0) + /bin/umount.* -- gen_context(system_u:object_r:mount_exec_t,s0) + +-/usr/bin/fusermount -- gen_context(system_u:object_r:mount_exec_t,s0) ++/dev/\.mount(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) ++/run/mount(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) + +-/var/run/mount(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) ++/sbin/mount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++/sbin/umount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++ ++/usr/bin/fusermount -- gen_context(system_u:object_r:fusermount_exec_t,s0) ++/usr/bin/mount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++/usr/bin/umount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++ ++/usr/sbin/mount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++/usr/sbin/umount.* -- gen_context(system_u:object_r:mount_exec_t,s0) ++/usr/sbin/showmount -- gen_context(system_u:object_r:showmount_exec_t,s0) ++ ++/var/cache/davfs2(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) ++/var/run/davfs2(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) ++/var/run/mount(/.*)? gen_context(system_u:object_r:mount_var_run_t,s0) ++ ++/usr/sbin/mount\.ecryptfs_private -- gen_context(system_u:object_r:mount_ecryptfs_exec_t,s0) ++/usr/sbin/mount\.ecryptfs -- gen_context(system_u:object_r:mount_ecryptfs_exec_t,s0) ++/usr/sbin/umount\.ecryptfs_private -- gen_context(system_u:object_r:mount_ecryptfs_exec_t,s0) ++/usr/sbin/umount\.ecryptfs -- gen_context(system_u:object_r:mount_ecryptfs_exec_t,s0) +diff --git a/policy/modules/system/mount.if b/policy/modules/system/mount.if +index 4584457b18..9a4014c9a8 100644 +--- a/policy/modules/system/mount.if ++++ b/policy/modules/system/mount.if +@@ -16,6 +16,14 @@ interface(`mount_domtrans',` + ') + + domtrans_pattern($1, mount_exec_t, mount_t) ++ mount_domtrans_fusermount($1) ++ allow $1 mount_exec_t:file map; ++ ++ allow $1 mount_t:fd use; ++ ps_process_pattern(mount_t, $1) ++ ++ allow mount_t $1:key write; ++ allow mount_t $1:unix_stream_socket { read write }; + ') + + ######################################## +@@ -39,12 +47,117 @@ interface(`mount_domtrans',` + interface(`mount_run',` + gen_require(` + attribute_role mount_roles; ++ type mount_t; + ') + + mount_domtrans($1) + roleattribute $2 mount_roles; + ') + ++######################################## ++## ++## Execute fusermount in the mount domain, and ++## allow the specified role the mount domain, ++## and use the caller's terminal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed the mount domain. ++## ++## ++## ++# ++interface(`mount_run_fusermount',` ++ gen_require(` ++ type mount_t; ++ ') ++ ++ mount_domtrans_fusermount($1) ++ role $2 types mount_t; ++ ++ fstools_run(mount_t, $2) ++') ++ ++######################################## ++## ++## Read mount PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mount_read_pid_files',` ++ gen_require(` ++ type mount_var_run_t; ++ ') ++ ++ read_files_pattern($1, mount_var_run_t, mount_var_run_t) ++ files_search_pids($1) ++') ++ ++######################################## ++## ++## Read/write mount PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mount_rw_pid_files',` ++ gen_require(` ++ type mount_var_run_t; ++ ') ++ ++ rw_files_pattern($1, mount_var_run_t, mount_var_run_t) ++ files_search_pids($1) ++') ++ ++####################################### ++## ++## Do not audit attemps to write mount PID files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mount_dontaudit_write_mount_pid',` ++ gen_require(` ++ type mount_var_run_t; ++ ') ++ ++ dontaudit $1 mount_var_run_t:file write; ++') ++ ++######################################## ++## ++## Manage mount PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mount_manage_pid_files',` ++ gen_require(` ++ type mount_var_run_t; ++ ') ++ ++ allow $1 mount_var_run_t:file manage_file_perms; ++ files_search_pids($1) ++') ++ + ######################################## + ## + ## Execute mount in the caller domain. +@@ -91,7 +204,7 @@ interface(`mount_signal',` + ## + ## + ## +-## The type of the process performing this action. ++## Domain allowed access. + ## + ## + # +@@ -131,45 +244,205 @@ interface(`mount_send_nfs_client_request',` + + ######################################## + ## +-## Execute mount in the unconfined mount domain. ++## Read the mount tmp directory + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`mount_domtrans_unconfined',` ++interface(`mount_list_tmp',` + gen_require(` +- type unconfined_mount_t, mount_exec_t; ++ type mount_tmp_t; + ') + +- domtrans_pattern($1, mount_exec_t, unconfined_mount_t) ++ allow $1 mount_tmp_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Execute mount in the unconfined mount domain, and +-## allow the specified role the unconfined mount domain, +-## and use the caller's terminal. ++## Execute fusermount in the mount domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`mount_domtrans_fusermount',` ++ gen_require(` ++ type mount_t, fusermount_exec_t; ++ ') ++ ++ domtrans_pattern($1, fusermount_exec_t, mount_t) ++ ps_process_pattern(mount_t, $1) ++ ++ allow mount_t $1:unix_stream_socket { read write }; ++ allow $1 mount_t:fd use; ++') ++ ++######################################## ++## ++## Execute fusermount. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## ++# ++interface(`mount_exec_fusermount',` ++ gen_require(` ++ type fusermount_exec_t; ++ ') ++ ++ can_exec($1, fusermount_exec_t) ++') ++ ++######################################## ++## ++## dontaudit Execute fusermount. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mount_dontaudit_exec_fusermount',` ++ gen_require(` ++ type fusermount_exec_t; ++ ') ++ ++ dontaudit $1 fusermount_exec_t:file exec_file_perms; ++') ++ ++###################################### ++## ++## Execute a domain transition to run showmount. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mount_domtrans_showmount',` ++ gen_require(` ++ type showmount_t, showmount_exec_t; ++ ') ++ ++ domtrans_pattern($1, showmount_exec_t, showmount_t) ++') ++ ++###################################### ++## ++## Execute showmount in the showmount domain, and ++## allow the specified role the showmount domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the showmount domain. ++## ++## ++# ++interface(`mount_run_showmount',` ++ gen_require(` ++ type showmount_t; ++ ') ++ ++ mount_domtrans_showmount($1) ++ role $2 types showmount_t; ++') ++ ++####################################### ++## ++## Transition to ecryptmount. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mount_domtrans_ecryptmount',` ++ gen_require(` ++ type mount_ecryptfs_t, mount_ecryptfs_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mount_ecryptfs_exec_t, mount_ecryptfs_t) ++') ++ ++####################################### ++## ++## Execute mount in the unconfined mount domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mount_domtrans_unconfined',` ++ gen_require(` ++ type unconfined_mount_t, mount_exec_t; ++ ') ++ ++ domtrans_pattern($1, mount_exec_t, unconfined_mount_t) ++') ++ ++####################################### ++## ++## Execute mount in the unconfined mount domain, and ++## allow the specified role the unconfined mount domain, ++## and use the caller's terminal. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## + ## + # + interface(`mount_run_unconfined',` ++ gen_require(` ++ type unconfined_mount_t; ++ ') ++ ++ mount_domtrans_unconfined($1) ++ role $2 types unconfined_mount_t; ++') ++ ++######################################## ++## ++## Allow mount programs to be an entrypoint for ++## the specified domain. ++## ++## ++## ++## The domain for which mount programs is an entrypoint. ++## ++## ++# ++interface(`mount_entry_type',` + gen_require(` +- type unconfined_mount_t; ++ type mount_ecryptfs_exec_t; ++ type mount_exec_t; + ') + +- mount_domtrans_unconfined($1) +- role $2 types unconfined_mount_t; ++ domain_entry_file($1, mount_ecryptfs_exec_t) ++ domain_entry_file($1, mount_exec_t) + ') ++ +diff --git a/policy/modules/system/mount.te b/policy/modules/system/mount.te +index 459a0efbc8..ed4756edc3 100644 +--- a/policy/modules/system/mount.te ++++ b/policy/modules/system/mount.te +@@ -5,13 +5,6 @@ policy_module(mount, 1.16.1) + # Declarations + # + +-## +-##

      +-## Allow the mount command to mount any directory or file. +-##

      +-##
      +-gen_tunable(allow_mount_anyfile, false) +- + attribute_role mount_roles; + roleattribute system_r mount_roles; + +@@ -20,14 +13,37 @@ type mount_exec_t; + init_system_domain(mount_t, mount_exec_t) + role mount_roles types mount_t; + ++type fusermount_exec_t; ++domain_entry_file(mount_t, fusermount_exec_t) ++ ++typealias mount_t alias mount_ntfs_t; ++typealias mount_exec_t alias mount_ntfs_exec_t; ++ + type mount_loopback_t; # customizable + files_type(mount_loopback_t) ++typealias mount_loopback_t alias mount_loop_t; + + type mount_tmp_t; + files_tmp_file(mount_tmp_t) + + type mount_var_run_t; + files_pid_file(mount_var_run_t) ++dev_associate(mount_var_run_t) ++ ++# showmount - show mount information for an NFS server ++ ++type showmount_t; ++type showmount_exec_t; ++application_domain(showmount_t, showmount_exec_t) ++role system_r types showmount_t; ++ ++type mount_ecryptfs_t; ++type mount_ecryptfs_exec_t; ++application_domain(mount_ecryptfs_t, mount_ecryptfs_exec_t) ++role system_r types mount_ecryptfs_t; ++ ++type mount_ecryptfs_tmpfs_t; ++files_tmpfs_file(mount_ecryptfs_tmpfs_t) + + # causes problems with interfaces when + # this is optionally declared in monolithic +@@ -40,8 +56,12 @@ application_domain(unconfined_mount_t, mount_exec_t) + # mount local policy + # + +-# setuid/setgid needed to mount cifs +-allow mount_t self:capability { ipc_lock sys_rawio sys_admin dac_override chown sys_tty_config setuid setgid }; ++# setuid/setgid needed to mount cifs ++allow mount_t self:capability { fsetid fowner ipc_lock setpcap sys_rawio sys_resource sys_admin dac_override dac_read_search chown sys_tty_config setuid setgid sys_nice }; ++allow mount_t self:process { getcap getsched setsched setcap setrlimit signal }; ++allow mount_t self:fifo_file rw_fifo_file_perms; ++allow mount_t self:unix_stream_socket create_stream_socket_perms; ++allow mount_t self:unix_dgram_socket create_socket_perms; + + allow mount_t mount_loopback_t:file read_file_perms; + +@@ -52,13 +72,20 @@ can_exec(mount_t, mount_exec_t) + + files_tmp_filetrans(mount_t, mount_tmp_t, { file dir }) + +-create_dirs_pattern(mount_t, mount_var_run_t, mount_var_run_t) +-create_files_pattern(mount_t, mount_var_run_t, mount_var_run_t) +-rw_files_pattern(mount_t, mount_var_run_t, mount_var_run_t) ++manage_dirs_pattern(mount_t,mount_var_run_t,mount_var_run_t) ++manage_files_pattern(mount_t,mount_var_run_t,mount_var_run_t) + files_pid_filetrans(mount_t, mount_var_run_t, dir, "mount") ++dev_filetrans(mount_t, mount_var_run_t, dir) + + kernel_read_system_state(mount_t) ++kernel_read_network_state(mount_t) + kernel_read_kernel_sysctls(mount_t) ++kernel_relabelfrom_unlabeled_fs(mount_t) ++kernel_list_unlabeled(mount_t) ++kernel_manage_debugfs(mount_t) ++kernel_mount_unlabeled(mount_t) ++kernel_unmount_unlabeled(mount_t) ++kernel_use_fds(mount_t) + kernel_setsched(mount_t) + kernel_dontaudit_getattr_core_if(mount_t) + kernel_dontaudit_write_debugfs_dirs(mount_t) +@@ -69,31 +96,47 @@ kernel_request_load_module(mount_t) + # required for mount.smbfs + corecmd_exec_bin(mount_t) + ++dev_getattr_generic_blk_files(mount_t) + dev_getattr_all_blk_files(mount_t) + dev_list_all_dev_nodes(mount_t) ++dev_read_usbfs(mount_t) ++dev_read_rand(mount_t) ++dev_read_urand(mount_t) + dev_read_sysfs(mount_t) + dev_dontaudit_write_sysfs_dirs(mount_t) + dev_rw_lvm_control(mount_t) + dev_dontaudit_getattr_all_chr_files(mount_t) + dev_dontaudit_getattr_memory_dev(mount_t) + dev_getattr_sound_dev(mount_t) ++dev_rw_loop_control(mount_t) ++ ++ifdef(`hide_broken_symptoms',` ++ dev_rw_generic_blk_files(mount_t) ++') ++ + # Early devtmpfs, before udev relabel + dev_dontaudit_rw_generic_chr_files(mount_t) + + domain_use_interactive_fds(mount_t) ++domain_read_all_domains_state(mount_t) + + files_search_all(mount_t) + files_read_etc_files(mount_t) ++files_read_etc_runtime_files(mount_t) + files_manage_etc_runtime_files(mount_t) + files_etc_filetrans_etc_runtime(mount_t, file) ++# for when /etc/mtab loses its type ++files_delete_etc_files(mount_t) + files_mounton_all_mountpoints(mount_t) ++files_setattr_all_mountpoints(mount_t) ++# ntfs-3g checks whether the mountpoint is writable before mounting ++files_write_all_mountpoints(mount_t) + files_unmount_rootfs(mount_t) ++ + # These rules need to be generalized. Only admin, initrc should have it: +-files_relabelto_all_file_type_fs(mount_t) ++files_relabel_all_file_type_fs(mount_t) + files_mount_all_file_type_fs(mount_t) + files_unmount_all_file_type_fs(mount_t) +-# for when /etc/mtab loses its type +-# cjp: this seems wrong, the type should probably be etc + files_read_isid_type_files(mount_t) + # For reading cert files + files_read_usr_files(mount_t) +@@ -101,28 +144,39 @@ files_list_all_mountpoints(mount_t) + files_dontaudit_write_all_mountpoints(mount_t) + files_dontaudit_setattr_all_mountpoints(mount_t) + +-fs_getattr_xattr_fs(mount_t) +-fs_getattr_cifs(mount_t) ++fs_list_all(mount_t) ++fs_getattr_all_fs(mount_t) + fs_mount_all_fs(mount_t) + fs_unmount_all_fs(mount_t) + fs_remount_all_fs(mount_t) + fs_relabelfrom_all_fs(mount_t) +-fs_list_auto_mountpoints(mount_t) ++fs_rw_anon_inodefs_files(mount_t) + fs_rw_tmpfs_chr_files(mount_t) ++fs_rw_nfsd_fs(mount_t) ++fs_rw_removable_blk_files(mount_t) ++#fs_manage_tmpfs_dirs(mount_t) + fs_read_tmpfs_symlinks(mount_t) ++fs_read_fusefs_files(mount_t) ++fs_manage_nfs_dirs(mount_t) ++fs_read_nfs_symlinks(mount_t) ++fs_manage_cgroup_dirs(mount_t) ++fs_manage_cgroup_files(mount_t) + fs_dontaudit_write_tmpfs_dirs(mount_t) + +-mls_file_read_all_levels(mount_t) +-mls_file_write_all_levels(mount_t) ++mls_file_read_to_clearance(mount_t) ++mls_file_write_to_clearance(mount_t) ++mls_process_write_to_clearance(mount_t) + + selinux_get_enforce_mode(mount_t) ++selinux_mounton_fs(mount_t) + + storage_raw_read_fixed_disk(mount_t) + storage_raw_write_fixed_disk(mount_t) + storage_raw_read_removable_device(mount_t) + storage_raw_write_removable_device(mount_t) ++storage_rw_fuse(mount_t) + +-term_use_all_terms(mount_t) ++term_use_all_inherited_terms(mount_t) + term_dontaudit_manage_pty_dirs(mount_t) + + auth_use_nsswitch(mount_t) +@@ -130,16 +184,21 @@ auth_use_nsswitch(mount_t) + init_use_fds(mount_t) + init_use_script_ptys(mount_t) + init_dontaudit_getattr_initctl(mount_t) ++init_stream_connect_script(mount_t) ++init_rw_script_stream_sockets(mount_t) + + logging_send_syslog_msg(mount_t) + +-miscfiles_read_localization(mount_t) +- + sysnet_use_portmap(mount_t) + + seutil_read_config(mount_t) + ++systemd_passwd_agent_domtrans(mount_t) ++ + userdom_use_all_users_fds(mount_t) ++userdom_manage_user_home_content_dirs(mount_t) ++userdom_read_user_home_content_symlinks(mount_t) ++userdom_list_user_tmp(mount_t) + + ifdef(`distro_redhat',` + optional_policy(` +@@ -155,26 +214,27 @@ ifdef(`distro_ubuntu',` + ') + ') + +-tunable_policy(`allow_mount_anyfile',` +- files_list_non_auth_dirs(mount_t) +- files_read_non_auth_files(mount_t) ++corecmd_exec_shell(mount_t) ++ ++tunable_policy(`mount_anyfile',` ++ files_read_non_security_files(mount_t) + files_mounton_non_security(mount_t) ++ files_rw_inherited_non_security_files(mount_t) + ') + + optional_policy(` + # for nfs +- corenet_all_recvfrom_unlabeled(mount_t) + corenet_all_recvfrom_netlabel(mount_t) +- corenet_tcp_sendrecv_all_if(mount_t) +- corenet_raw_sendrecv_all_if(mount_t) +- corenet_udp_sendrecv_all_if(mount_t) +- corenet_tcp_sendrecv_all_nodes(mount_t) +- corenet_raw_sendrecv_all_nodes(mount_t) +- corenet_udp_sendrecv_all_nodes(mount_t) ++ corenet_tcp_sendrecv_generic_if(mount_t) ++ corenet_raw_sendrecv_generic_if(mount_t) ++ corenet_udp_sendrecv_generic_if(mount_t) ++ corenet_tcp_sendrecv_generic_node(mount_t) ++ corenet_raw_sendrecv_generic_node(mount_t) ++ corenet_udp_sendrecv_generic_node(mount_t) + corenet_tcp_sendrecv_all_ports(mount_t) + corenet_udp_sendrecv_all_ports(mount_t) +- corenet_tcp_bind_all_nodes(mount_t) +- corenet_udp_bind_all_nodes(mount_t) ++ corenet_tcp_bind_generic_node(mount_t) ++ corenet_udp_bind_generic_node(mount_t) + corenet_tcp_bind_generic_port(mount_t) + corenet_udp_bind_generic_port(mount_t) + corenet_tcp_bind_reserved_port(mount_t) +@@ -188,12 +248,49 @@ optional_policy(` + fs_search_rpc(mount_t) + + rpc_stub(mount_t) ++ ++ rpc_domtrans_rpcd(mount_t) ++ rpcbind_stream_connect(mount_t) + ') + + optional_policy(` + apm_use_fds(mount_t) + ') + ++optional_policy(` ++ cron_system_entry(mount_t, mount_exec_t) ++') ++ ++optional_policy(` ++ devicekit_read_state_power(mount_t) ++') ++ ++optional_policy(` ++ fsadm_manage_pid(mount_t) ++') ++ ++optional_policy(` ++ glusterd_domtrans(mount_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(mount_t) ++ ++ optional_policy(` ++ hal_dbus_chat(mount_t) ++ ') ++') ++ ++optional_policy(` ++ glusterd_domtrans(mount_t) ++') ++ ++optional_policy(` ++ hal_write_log(mount_t) ++ hal_use_fds(mount_t) ++ hal_dontaudit_rw_pipes(mount_t) ++') ++ + optional_policy(` + ifdef(`hide_broken_symptoms',` + # for a bug in the X server +@@ -203,9 +300,31 @@ optional_policy(` + ') + + optional_policy(` ++ livecd_rw_tmp_files(mount_t) ++') ++ ++# Needed for mount crypt https://bugzilla.redhat.com/show_bug.cgi?id=418711 ++optional_policy(` ++ lvm_run(mount_t, mount_roles) ++') ++ ++optional_policy(` ++ modutils_run_insmod(mount_t, mount_roles) + modutils_read_module_deps(mount_t) + ') + ++optional_policy(` ++ fstools_run(mount_t, mount_roles) ++') ++ ++optional_policy(` ++ rhcs_stream_connect_gfs_controld(mount_t) ++') ++ ++optional_policy(` ++ rpc_run_rpcd(mount_t, mount_roles) ++') ++ + optional_policy(` + puppet_rw_tmp(mount_t) + ') +@@ -213,18 +332,105 @@ optional_policy(` + # for kernel package installation + optional_policy(` + rpm_rw_pipes(mount_t) ++ rpm_dontaudit_leaks(mount_t) + ') + + optional_policy(` ++ samba_read_config(mount_t) + samba_run_smbmount(mount_t, mount_roles) + ') + ++optional_policy(` ++ ssh_exec(mount_t) ++ ssh_append_home_files(mount_t) ++') ++ ++optional_policy(` ++ usbmuxd_stream_connect(mount_t) ++') ++ ++optional_policy(` ++ userhelper_exec_consolehelper(mount_t) ++') ++ ++optional_policy(` ++ unconfined_write_keys(mount_t) ++') ++ ++optional_policy(` ++ virt_read_blk_images(mount_t) ++') ++ ++optional_policy(` ++ vmware_exec_host(mount_t) ++') ++ ++optional_policy(` ++ unconfined_domain(mount_t) ++') ++ ++###################################### ++# ++# showmount local policy ++# ++ ++allow showmount_t self:tcp_socket create_stream_socket_perms; ++allow showmount_t self:udp_socket create_socket_perms; ++ ++kernel_read_system_state(showmount_t) ++ ++corenet_all_recvfrom_netlabel(showmount_t) ++corenet_tcp_sendrecv_generic_if(showmount_t) ++corenet_udp_sendrecv_generic_if(showmount_t) ++corenet_tcp_sendrecv_generic_node(showmount_t) ++corenet_udp_sendrecv_generic_node(showmount_t) ++corenet_tcp_sendrecv_all_ports(showmount_t) ++corenet_udp_sendrecv_all_ports(showmount_t) ++corenet_tcp_bind_generic_node(showmount_t) ++corenet_udp_bind_generic_node(showmount_t) ++corenet_tcp_bind_all_rpc_ports(showmount_t) ++corenet_udp_bind_all_rpc_ports(showmount_t) ++corenet_tcp_connect_all_ports(showmount_t) ++ ++files_read_etc_runtime_files(showmount_t) ++ ++sysnet_dns_name_resolve(showmount_t) ++ ++userdom_use_inherited_user_terminals(showmount_t) ++ ++####################################### ++# ++# mount_ecryptfs local policy ++# ++ ++domtrans_pattern(mount_ecryptfs_t, mount_exec_t, mount_t) ++ ++allow mount_ecryptfs_t self:capability setgid; ++allow mount_ecryptfs_t self:capability { setuid sys_admin }; ++allow mount_ecryptfs_t self:fifo_file rw_fifo_file_perms; ++allow mount_ecryptfs_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(mount_ecryptfs_t, mount_ecryptfs_tmpfs_t, mount_ecryptfs_tmpfs_t) ++manage_files_pattern(mount_ecryptfs_t, mount_ecryptfs_tmpfs_t, mount_ecryptfs_tmpfs_t) ++fs_tmpfs_filetrans(mount_ecryptfs_t, mount_ecryptfs_tmpfs_t, { dir file }) ++userdom_rw_user_tmp_files(mount_ecryptfs_t) ++ ++domain_use_interactive_fds(mount_ecryptfs_t) ++ ++files_read_etc_files(mount_ecryptfs_t) ++ ++fs_read_ecryptfs_symlinks(mount_ecryptfs_t) ++fs_read_ecryptfs_files(mount_ecryptfs_t) ++ ++auth_use_nsswitch(mount_ecryptfs_t) ++auth_manage_pam_console_data(mount_ecryptfs_t) ++ + ######################################## + # + # Unconfined mount local policy + # + + optional_policy(` +- files_etc_filetrans_etc_runtime(unconfined_mount_t, file) +- unconfined_domain(unconfined_mount_t) ++ files_etc_filetrans_etc_runtime(unconfined_mount_t, file) ++ unconfined_domain(unconfined_mount_t) + ') +diff --git a/policy/modules/system/netlabel.fc b/policy/modules/system/netlabel.fc +index b263a8af58..15576ab83f 100644 +--- a/policy/modules/system/netlabel.fc ++++ b/policy/modules/system/netlabel.fc +@@ -1 +1,6 @@ + /sbin/netlabelctl -- gen_context(system_u:object_r:netlabel_mgmt_exec_t,s0) ++ ++/usr/lib/systemd/system/netlabel.* -- gen_context(system_u:object_r:netlabel_mgmt_unit_file_t,s0) ++ ++/usr/sbin/netlabelctl -- gen_context(system_u:object_r:netlabel_mgmt_exec_t,s0) ++/usr/sbin/netlabel-config -- gen_context(system_u:object_r:netlabel_mgmt_exec_t,s0) +diff --git a/policy/modules/system/netlabel.te b/policy/modules/system/netlabel.te +index cbbda4a3e1..2f59c4b981 100644 +--- a/policy/modules/system/netlabel.te ++++ b/policy/modules/system/netlabel.te +@@ -7,9 +7,13 @@ policy_module(netlabel, 1.3.0) + + type netlabel_mgmt_t; + type netlabel_mgmt_exec_t; ++init_daemon_domain(netlabel_mgmt_t, netlabel_mgmt_exec_t) + application_domain(netlabel_mgmt_t, netlabel_mgmt_exec_t) + role system_r types netlabel_mgmt_t; + ++type netlabel_mgmt_unit_file_t; ++systemd_unit_file(netlabel_mgmt_unit_file_t) ++ + ######################################## + # + # NetLabel Management Tools Local policy +@@ -18,11 +22,28 @@ role system_r types netlabel_mgmt_t; + # modify the network subsystem configuration + allow netlabel_mgmt_t self:capability net_admin; + allow netlabel_mgmt_t self:netlink_socket create_socket_perms; ++allow netlabel_mgmt_t self:netlink_generic_socket create_socket_perms; ++ ++can_exec(netlabel_mgmt_t, netlabel_mgmt_exec_t) + + kernel_read_network_state(netlabel_mgmt_t) ++kernel_read_system_state(netlabel_mgmt_t) ++ ++corecmd_exec_bin(netlabel_mgmt_t) ++corecmd_exec_shell(netlabel_mgmt_t) + + files_read_etc_files(netlabel_mgmt_t) + ++term_use_all_inherited_terms(netlabel_mgmt_t) ++ + seutil_use_newrole_fds(netlabel_mgmt_t) + +-userdom_use_user_terminals(netlabel_mgmt_t) ++auth_read_passwd(netlabel_mgmt_t) ++ ++userdom_use_inherited_user_terminals(netlabel_mgmt_t) ++ ++optional_policy(` ++ sssd_stream_connect(netlabel_mgmt_t) ++ sssd_read_public_files(netlabel_mgmt_t) ++') ++ +diff --git a/policy/modules/system/selinuxutil.fc b/policy/modules/system/selinuxutil.fc +index d43f3b1945..c5053dbbd0 100644 +--- a/policy/modules/system/selinuxutil.fc ++++ b/policy/modules/system/selinuxutil.fc +@@ -6,13 +6,15 @@ + /etc/selinux(/.*)? gen_context(system_u:object_r:selinux_config_t,s0) + /etc/selinux/([^/]*/)?contexts(/.*)? gen_context(system_u:object_r:default_context_t,s0) + /etc/selinux/([^/]*/)?contexts/files(/.*)? gen_context(system_u:object_r:file_context_t,s0) +-/etc/selinux/([^/]*/)?policy(/.*)? gen_context(system_u:object_r:policy_config_t,mls_systemhigh) ++/etc/selinux/([^/]*/)?logins(/.*)? gen_context(system_u:object_r:selinux_login_config_t,s0) ++/etc/selinux/([^/]*/)?policy(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) + /etc/selinux/([^/]*/)?setrans\.conf -- gen_context(system_u:object_r:selinux_config_t,mls_systemhigh) +-/etc/selinux/([^/]*/)?seusers -- gen_context(system_u:object_r:selinux_config_t,mls_systemhigh) ++/etc/selinux/([^/]*/)?seusers -- gen_context(system_u:object_r:selinux_config_t,s0) + /etc/selinux/([^/]*/)?modules/(active|tmp|previous)(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) ++/etc/selinux/(minimum|mls|targeted)/active(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) + /etc/selinux/([^/]*/)?modules/semanage\.read\.LOCK -- gen_context(system_u:object_r:semanage_read_lock_t,s0) + /etc/selinux/([^/]*/)?modules/semanage\.trans\.LOCK -- gen_context(system_u:object_r:semanage_trans_lock_t,s0) +-/etc/selinux/([^/]*/)?users(/.*)? -- gen_context(system_u:object_r:selinux_config_t,mls_systemhigh) ++/etc/selinux/([^/]*/)?users(/.*)? -- gen_context(system_u:object_r:selinux_config_t,s0) + + # + # /root +@@ -35,19 +37,30 @@ + /usr/lib/selinux(/.*)? gen_context(system_u:object_r:policy_src_t,s0) + + /usr/sbin/load_policy -- gen_context(system_u:object_r:load_policy_exec_t,s0) ++/usr/sbin/restorecon -- gen_context(system_u:object_r:setfiles_exec_t,s0) + /usr/sbin/restorecond -- gen_context(system_u:object_r:restorecond_exec_t,s0) + /usr/sbin/run_init -- gen_context(system_u:object_r:run_init_exec_t,s0) + /usr/sbin/setfiles.* -- gen_context(system_u:object_r:setfiles_exec_t,s0) +-/usr/sbin/setsebool -- gen_context(system_u:object_r:semanage_exec_t,s0) ++/usr/sbin/setsebool -- gen_context(system_u:object_r:setsebool_exec_t,s0) + /usr/sbin/semanage -- gen_context(system_u:object_r:semanage_exec_t,s0) + /usr/sbin/semodule -- gen_context(system_u:object_r:semanage_exec_t,s0) ++/usr/libexec/selinux/semanage_migrate_store -- gen_context(system_u:object_r:semanage_exec_t,s0) ++/usr/share/system-config-selinux/system-config-selinux-dbus\.py -- gen_context(system_u:object_r:semanage_exec_t,s0) ++/usr/share/system-config-selinux/selinux_server\.py -- gen_context(system_u:object_r:semanage_exec_t,s0) + + # + # /var/lib + # +-/var/lib/selinux(/.*)? gen_context(system_u:object_r:semanage_var_lib_t,s0) ++/var/lib/selinux(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) ++/var/lib/selinux/[^/]+/semanage\.read\.LOCK -- gen_context(system_u:object_r:semanage_read_lock_t,s0) ++/var/lib/selinux/[^/]+/semanage\.trans\.LOCK -- gen_context(system_u:object_r:semanage_trans_lock_t,s0) ++/var/lib/sepolgen(/.*)? gen_context(system_u:object_r:selinux_config_t,s0) + + # + # /var/run + # + /var/run/restorecond\.pid -- gen_context(system_u:object_r:restorecond_var_run_t,s0) ++ ++ ++/etc/share/selinux/targeted(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) ++/etc/share/selinux/mls(/.*)? gen_context(system_u:object_r:semanage_store_t,s0) +diff --git a/policy/modules/system/selinuxutil.if b/policy/modules/system/selinuxutil.if +index 38220721d9..a67ee36d25 100644 +--- a/policy/modules/system/selinuxutil.if ++++ b/policy/modules/system/selinuxutil.if +@@ -85,6 +85,7 @@ interface(`seutil_domtrans_loadpolicy',` + + corecmd_search_bin($1) + domtrans_pattern($1, load_policy_exec_t, load_policy_t) ++ allow $1 load_policy_exec_t:file map; + ') + + ######################################## +@@ -131,6 +132,43 @@ interface(`seutil_exec_loadpolicy',` + + corecmd_search_bin($1) + can_exec($1, load_policy_exec_t) ++ allow $1 load_policy_exec_t:file map; ++') ++ ++######################################## ++## ++## Allow access check on load_policy. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_access_check_load_policy',` ++ gen_require(` ++ type load_policy_exec_t; ++ ') ++ ++ allow $1 load_policy_exec_t:file execute; ++') ++ ++######################################## ++## ++## Dontaudit access check on load_policy. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dontaudit_access_check_load_policy',` ++ gen_require(` ++ type load_policy_exec_t; ++ ') ++ ++ dontaudit $1 load_policy_exec_t:file audit_access; + ') + + ######################################## +@@ -192,11 +230,22 @@ interface(`seutil_domtrans_newrole',` + # + interface(`seutil_run_newrole',` + gen_require(` +- attribute_role newrole_roles; ++ type newrole_t; ++ #attribute_role newrole_roles; + ') + ++ #seutil_domtrans_newrole($1) ++ #roleattribute $2 newrole_roles; ++ + seutil_domtrans_newrole($1) +- roleattribute $2 newrole_roles; ++ role $2 types newrole_t; ++ ++ auth_run_upd_passwd(newrole_t, $2) ++ ++ optional_policy(` ++ namespace_init_run(newrole_t, $2) ++ ') ++ + ') + + ######################################## +@@ -357,6 +406,27 @@ interface(`seutil_exec_restorecon',` + seutil_exec_setfiles($1) + ') + ++######################################## ++## ++## Execute restorecond in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`seutil_exec_restorecond',` ++ gen_require(` ++ type restorecond_exec_t; ++ ') ++ ++ files_search_usr($1) ++ corecmd_search_bin($1) ++ can_exec($1, restorecond_exec_t) ++') ++ + ######################################## + ## + ## Execute run_init in the run_init domain. +@@ -425,11 +495,20 @@ interface(`seutil_init_script_domtrans_runinit',` + # + interface(`seutil_run_runinit',` + gen_require(` +- attribute_role run_init_roles; ++ #attribute_role run_init_roles; ++ type run_init_t; ++ role system_r; + ') + +- seutil_domtrans_runinit($1) +- roleattribute $2 run_init_roles; ++ #seutil_domtrans_runinit($1) ++ #roleattribute $2 run_init_roles; ++ ++ auth_run_chk_passwd(run_init_t, $2) ++ seutil_domtrans_runinit($1) ++ role $2 types run_init_t; ++ ++ allow $2 system_r; ++ + ') + + ######################################## +@@ -461,11 +540,19 @@ interface(`seutil_run_runinit',` + # + interface(`seutil_init_script_run_runinit',` + gen_require(` +- attribute_role run_init_roles; ++ #attribute_role run_init_roles; ++ type run_init_t; ++ role system_r; + ') + +- seutil_init_script_domtrans_runinit($1) +- roleattribute $2 run_init_roles; ++ #seutil_init_script_domtrans_runinit($1) ++ #roleattribute $2 run_init_roles; ++ auth_run_chk_passwd(run_init_t, $2) ++ seutil_init_script_domtrans_runinit($1) ++ role $2 types run_init_t; ++ ++ allow $2 system_r; ++ + ') + + ######################################## +@@ -504,6 +591,7 @@ interface(`seutil_domtrans_setfiles',` + files_search_usr($1) + corecmd_search_bin($1) + domtrans_pattern($1, setfiles_exec_t, setfiles_t) ++ allow $1 setfiles_exec_t:file map; + ') + + ######################################## +@@ -533,6 +621,53 @@ interface(`seutil_run_setfiles',` + role $2 types setfiles_t; + ') + ++######################################## ++## ++## Execute setfiles in the setfiles domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_domtrans_setfiles_mac',` ++ gen_require(` ++ type setfiles_mac_t, setfiles_exec_t; ++ ') ++ ++ files_search_usr($1) ++ corecmd_search_bin($1) ++ domtrans_pattern($1, setfiles_exec_t, setfiles_mac_t) ++') ++ ++######################################## ++## ++## Execute setfiles in the setfiles_mac domain, and ++## allow the specified role the setfiles_mac domain, ++## and use the caller's terminal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed the setfiles_mac domain. ++## ++## ++## ++# ++interface(`seutil_run_setfiles_mac',` ++ gen_require(` ++ type setfiles_mac_t; ++ ') ++ ++ seutil_domtrans_setfiles_mac($1) ++ role $2 types setfiles_mac_t; ++') ++ + ######################################## + ## + ## Execute setfiles in the caller domain. +@@ -553,6 +688,42 @@ interface(`seutil_exec_setfiles',` + can_exec($1, setfiles_exec_t) + ') + ++######################################## ++## ++## Allow access check on setfiles. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_access_check_setfiles',` ++ gen_require(` ++ type setfiles_exec_t; ++ ') ++ ++ allow $1 setfiles_exec_t:file execute; ++') ++ ++######################################## ++## ++## Dontaudit access check on setfiles. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dontaudit_access_check_setfiles',` ++ gen_require(` ++ type setfiles_exec_t; ++ ') ++ ++ dontaudit $1 setfiles_exec_t:file audit_access; ++') ++ + ######################################## + ## + ## Do not audit attempts to search the SELinux +@@ -572,6 +743,25 @@ interface(`seutil_dontaudit_search_config',` + dontaudit $1 selinux_config_t:dir search_dir_perms; + ') + ++######################################## ++## ++## Allow attempts to search the SELinux ++## configuration directory (/etc/selinux). ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_search_config',` ++ gen_require(` ++ type selinux_config_t; ++ ') ++ ++ allow $1 selinux_config_t:dir search_dir_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to read the SELinux +@@ -680,8 +870,113 @@ interface(`seutil_manage_config',` + ') + + files_search_etc($1) ++ manage_dirs_pattern($1, selinux_config_t, selinux_config_t) + manage_files_pattern($1, selinux_config_t, selinux_config_t) +- read_lnk_files_pattern($1, selinux_config_t, selinux_config_t) ++ manage_lnk_files_pattern($1, selinux_config_t, selinux_config_t) ++') ++ ++###################################### ++## ++## Create, read, write, and delete ++## the general selinux configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`seutil_manage_config_dirs',` ++ gen_require(` ++ type selinux_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to search the SELinux ++## login configuration directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`seutil_dontaudit_search_login_config',` ++ gen_require(` ++ type selinux_login_config_t; ++ ') ++ ++ dontaudit $1 selinux_login_config_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read the SELinux ++## login configuration. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`seutil_dontaudit_read_login_config',` ++ gen_require(` ++ type selinux_login_config_t; ++ ') ++ dontaudit $1 selinux_login_config_t:dir search_dir_perms; ++ dontaudit $1 selinux_login_config_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Read the SELinux login configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_read_login_config',` ++ gen_require(` ++ type selinux_config_t; ++ type selinux_login_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir search_dir_perms; ++ allow $1 selinux_login_config_t:dir list_dir_perms; ++ read_files_pattern($1, selinux_login_config_t, selinux_login_config_t) ++ read_lnk_files_pattern($1, selinux_login_config_t, selinux_login_config_t) ++') ++ ++######################################## ++## ++## Read and write the SELinux login configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_rw_login_config',` ++ gen_require(` ++ type selinux_config_t; ++ type selinux_login_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir search_dir_perms; ++ allow $1 selinux_login_config_t:dir list_dir_perms; ++ rw_files_pattern($1, selinux_login_config_t, selinux_login_config_t) + ') + + ####################################### +@@ -694,15 +989,62 @@ interface(`seutil_manage_config',` + ## Domain allowed access. + ## + ## +-## + # +-interface(`seutil_manage_config_dirs',` ++interface(`seutil_rw_login_config_dirs',` + gen_require(` + type selinux_config_t; ++ type selinux_login_config_t; + ') + + files_search_etc($1) +- allow $1 selinux_config_t:dir manage_dir_perms; ++ allow $1 selinux_config_t:dir search_dir_perms; ++ allow $1 selinux_login_config_t:dir rw_dir_perms; ++') ++ ++###################################### ++## ++## Create, read, write, and delete ++## the general selinux configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_manage_login_config',` ++ gen_require(` ++ type selinux_config_t; ++ type selinux_login_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir search_dir_perms; ++ manage_dirs_pattern($1, selinux_login_config_t, selinux_login_config_t) ++ manage_files_pattern($1, selinux_login_config_t, selinux_login_config_t) ++ read_lnk_files_pattern($1, selinux_login_config_t, selinux_login_config_t) ++') ++ ++###################################### ++## ++## manage the login selinux configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_manage_login_config_files',` ++ gen_require(` ++ type selinux_config_t; ++ type selinux_login_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir search_dir_perms; ++ manage_files_pattern($1, selinux_login_config_t, selinux_login_config_t) ++ read_lnk_files_pattern($1, selinux_login_config_t, selinux_login_config_t) + ') + + ######################################## +@@ -746,6 +1088,29 @@ interface(`seutil_read_default_contexts',` + read_files_pattern($1, default_context_t, default_context_t) + ') + ++####################################### ++## ++## Read and write the default_contexts files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`seutil_rw_default_contexts',` ++ gen_require(` ++ type default_context_t; ++ type selinux_config_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 selinux_config_t:dir list_dir_perms; ++ allow $1 default_context_t:dir list_dir_perms; ++ rw_files_pattern($1, default_context_t, default_context_t) ++') ++ + ######################################## + ## + ## Create, read, write, and delete the default_contexts files. +@@ -766,6 +1131,25 @@ interface(`seutil_manage_default_contexts',` + manage_files_pattern($1, default_context_t, default_context_t) + ') + ++######################################## ++## ++## Create, read, write, and delete the default_contexts dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_manage_default_contexts_dirs',` ++ gen_require(` ++ type selinux_config_t, default_context_t; ++ ') ++ ++ files_search_etc($1) ++ manage_dirs_pattern($1, default_context_t, default_context_t) ++') ++ + ######################################## + ## + ## Read the file_contexts files. +@@ -784,7 +1168,10 @@ interface(`seutil_read_file_contexts',` + + files_search_etc($1) + allow $1 { selinux_config_t default_context_t }:dir search_dir_perms; ++ list_dirs_pattern($1, file_context_t, file_context_t) + read_files_pattern($1, file_context_t, file_context_t) ++ read_lnk_files_pattern($1, file_context_t, file_context_t) ++ allow $1 file_context_t:file map; + ') + + ######################################## +@@ -805,6 +1192,7 @@ interface(`seutil_dontaudit_read_file_contexts',` + + dontaudit $1 { selinux_config_t default_context_t file_context_t }:dir search_dir_perms; + dontaudit $1 file_context_t:file read_file_perms; ++ dontaudit $1 file_context_t:file map; + ') + + ######################################## +@@ -825,6 +1213,7 @@ interface(`seutil_rw_file_contexts',` + files_search_etc($1) + allow $1 { selinux_config_t default_context_t }:dir search_dir_perms; + rw_files_pattern($1, file_context_t, file_context_t) ++ allow $1 file_context_t:file map; + ') + + ######################################## +@@ -846,6 +1235,8 @@ interface(`seutil_manage_file_contexts',` + files_search_etc($1) + allow $1 { selinux_config_t default_context_t }:dir search_dir_perms; + manage_files_pattern($1, file_context_t, file_context_t) ++ manage_dirs_pattern($1, file_context_t, file_context_t) ++ allow $1 file_context_t:file map; + ') + + ######################################## +@@ -866,6 +1257,7 @@ interface(`seutil_read_bin_policy',` + files_search_etc($1) + allow $1 selinux_config_t:dir search_dir_perms; + read_files_pattern($1, policy_config_t, policy_config_t) ++ allow $1 policy_config_t:file map; + ') + + ######################################## +@@ -997,6 +1389,26 @@ interface(`seutil_domtrans_semanage',` + domtrans_pattern($1, semanage_exec_t, semanage_t) + ') + ++######################################## ++## ++## Execute a domain transition to run setsebool. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`seutil_domtrans_setsebool',` ++ gen_require(` ++ type setsebool_t, setsebool_exec_t; ++ ') ++ ++ files_search_usr($1) ++ corecmd_search_bin($1) ++ domtrans_pattern($1, setsebool_exec_t, setsebool_t) ++') ++ + ######################################## + ## + ## Execute semanage in the semanage domain, and +@@ -1017,11 +1429,125 @@ interface(`seutil_domtrans_semanage',` + # + interface(`seutil_run_semanage',` + gen_require(` +- attribute_role semanage_roles; ++ #attribute_role semanage_roles; ++ type semanage_t; + ') + ++ #seutil_domtrans_semanage($1) ++ #roleattribute $2 semanage_roles; ++ + seutil_domtrans_semanage($1) +- roleattribute $2 semanage_roles; ++ seutil_run_setfiles(semanage_t, $2) ++ seutil_run_loadpolicy(semanage_t, $2) ++ role $2 types semanage_t; ++ ++') ++ ++######################################## ++## ++## Execute setsebool in the semanage domain, and ++## allow the specified role the semanage domain, ++## and use the caller's terminal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed the setsebool domain. ++## ++## ++## ++# ++interface(`seutil_run_setsebool',` ++ gen_require(` ++ type semanage_t; ++ ') ++ ++ seutil_domtrans_setsebool($1) ++ role $2 types setsebool_t; ++') ++ ++######################################## ++## ++## List of the semanage ++## module store. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_access_check_module_store',` ++ gen_require(` ++ type semanage_store_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 semanage_store_t:dir_file_class_set audit_access; ++') ++ ++######################################## ++## ++## Full management of the semanage ++## module store. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_read_module_store',` ++ gen_require(` ++ type selinux_config_t, semanage_store_t; ++ ') ++ ++ files_search_etc($1) ++ list_dirs_pattern($1, selinux_config_t, semanage_store_t) ++ read_files_pattern($1, semanage_store_t, semanage_store_t) ++ read_lnk_files_pattern($1, semanage_store_t, semanage_store_t) ++') ++ ++######################################## ++## ++## Dontaudit read selinux module store ++## module store. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dontaudit_read_module_store',` ++ gen_require(` ++ type semanage_store_t; ++ ') ++ ++dontaudit $1 semanage_store_t:dir list_dir_perms; ++dontaudit $1 semanage_store_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Dontaudit access check on module store ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dontaudit_access_check_semanage_module_store',` ++ gen_require(` ++ type semanage_store_t; ++ ') ++ ++ dontaudit $1 semanage_store_t:dir_file_class_set audit_access; + ') + + ######################################## +@@ -1041,9 +1567,15 @@ interface(`seutil_manage_module_store',` + ') + + files_search_etc($1) ++ files_search_var($1) + manage_dirs_pattern($1, selinux_config_t, semanage_store_t) ++ manage_dirs_pattern($1, semanage_store_t, semanage_store_t) + manage_files_pattern($1, semanage_store_t, semanage_store_t) ++ manage_lnk_files_pattern($1, semanage_store_t, semanage_store_t) + filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "modules") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "active") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "previous") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "tmp") + ') + + ####################################### +@@ -1065,6 +1597,24 @@ interface(`seutil_get_semanage_read_lock',` + rw_files_pattern($1, selinux_config_t, semanage_read_lock_t) + ') + ++####################################### ++## ++## Dontaudit access check on module store ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dontaudit_access_check_semanage_read_lock',` ++ gen_require(` ++ type semanage_read_lock_t; ++ ') ++ ++ dontaudit $1 semanage_read_lock_t:dir_file_class_set audit_access; ++') ++ + ####################################### + ## + ## Get trans lock on module store +@@ -1137,3 +1687,121 @@ interface(`seutil_dontaudit_libselinux_linked',` + selinux_dontaudit_get_fs_mount($1) + seutil_dontaudit_read_config($1) + ') ++ ++####################################### ++## ++## All rules necessary to run semanage command ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_semanage_policy',` ++ gen_require(` ++ type semanage_tmp_t; ++ type policy_config_t; ++ attribute policy_manager_domain; ++ ') ++ typeattribute $1 policy_manager_domain; ++ ++ kernel_read_system_state($1) ++ ++ # Running genhomedircon requires this for finding all users ++ auth_use_nsswitch($1) ++ ++ mls_file_write_all_levels($1) ++ mls_file_read_all_levels($1) ++ ++ selinux_get_enforce_mode($1) ++ ++ seutil_manage_bin_policy($1) ++ ++ logging_send_syslog_msg($1) ++') ++ ++####################################### ++## ++## All rules necessary to run setfiles command ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_setfiles',` ++ ++ gen_require(` ++ attribute setfiles_domain; ++ ') ++ typeattribute $1 setfiles_domain; ++ ++ kernel_read_system_state($1) ++ seutil_libselinux_linked($1) ++ ++ files_relabel_all_files($1) ++ ++ mls_file_read_all_levels($1) ++ mls_file_write_all_levels($1) ++ mls_file_upgrade($1) ++ mls_file_downgrade($1) ++ ++ # this is to satisfy the assertion: ++ auth_relabelto_shadow($1) ++ ++ logging_send_syslog_msg($1) ++') ++ ++##################################### ++## ++## File name transition for selinux utility content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_filetrans_named_content',` ++ gen_require(` ++ type default_context_t, semanage_store_t; ++ type selinux_config_t, semanage_trans_lock_t; ++ type file_context_t, selinux_login_config_t; ++ ') ++ ++ filetrans_pattern($1, selinux_config_t, default_context_t, dir, "contexts") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "policy") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "active") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "tmp") ++ filetrans_pattern($1, selinux_config_t, semanage_store_t, dir, "previous") ++ filetrans_pattern($1, selinux_config_t, semanage_trans_lock_t, file, "semanage.read.LOCK") ++ filetrans_pattern($1, selinux_config_t, semanage_trans_lock_t, file, "semanage.trans.LOCK") ++ filetrans_pattern($1, selinux_config_t, selinux_login_config_t, dir, "logins") ++ filetrans_pattern($1, default_context_t, file_context_t, dir, "files") ++ userdom_admin_home_dir_filetrans($1, default_context_t, file, ".default_context") ++') ++ ++######################################## ++## ++## Send and receive messages from ++## semanage dbus server over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`seutil_dbus_chat_semanage',` ++ gen_require(` ++ type semanage_t; ++ class dbus send_msg; ++ ') ++ ++ ps_process_pattern(semanage_t, $1) ++ ++ allow $1 semanage_t:dbus send_msg; ++ allow semanage_t $1:dbus send_msg; ++') +diff --git a/policy/modules/system/selinuxutil.te b/policy/modules/system/selinuxutil.te +index dc46420229..87680f1572 100644 +--- a/policy/modules/system/selinuxutil.te ++++ b/policy/modules/system/selinuxutil.te +@@ -11,14 +11,16 @@ gen_require(` + + attribute can_write_binary_policy; + attribute can_relabelto_binary_policy; ++attribute setfiles_domain; ++attribute policy_manager_domain; + +-attribute_role newrole_roles; ++#attribute_role newrole_roles; + +-attribute_role run_init_roles; +-role system_r types run_init_t; ++#attribute_role run_init_roles; ++#role system_r types run_init_t; + +-attribute_role semanage_roles; +-roleattribute system_r semanage_roles; ++#attribute_role semanage_roles; ++#roleattribute system_r semanage_roles; + + # + # selinux_config_t is the type applied to +@@ -28,7 +30,13 @@ roleattribute system_r semanage_roles; + # in the domain_type interface + # (fix dup decl) + type selinux_config_t; +-files_type(selinux_config_t) ++files_security_file(selinux_config_t) ++ ++type selinux_login_config_t; ++files_security_file(selinux_login_config_t) ++ ++type selinux_var_lib_t; ++files_type(selinux_var_lib_t) + + type checkpolicy_t, can_write_binary_policy; + type checkpolicy_exec_t; +@@ -40,14 +48,14 @@ role system_r types checkpolicy_t; + # /etc/selinux/*/contexts/* + # + type default_context_t; +-files_type(default_context_t) ++files_security_file(default_context_t) + + # + # file_context_t is the type applied to + # /etc/selinux/*/contexts/files + # + type file_context_t; +-files_type(file_context_t) ++files_security_file(file_context_t) + + type load_policy_t; + type load_policy_exec_t; +@@ -60,14 +68,20 @@ application_domain(newrole_t, newrole_exec_t) + domain_role_change_exemption(newrole_t) + domain_obj_id_change_exemption(newrole_t) + domain_interactive_fd(newrole_t) +-role newrole_roles types newrole_t; ++#role newrole_roles types newrole_t; ++role system_r types newrole_t; + + # + # policy_config_t is the type of /etc/security/selinux/* + # the security server policy configuration. + # +-type policy_config_t; +-files_type(policy_config_t) ++#type policy_config_t; ++#files_type(policy_config_t) ++gen_require(` ++ type semanage_store_t; ++') ++ ++typealias semanage_store_t alias { policy_config_t semanage_var_lib_t }; + + neverallow ~can_relabelto_binary_policy policy_config_t:file relabelto; + #neverallow ~can_write_binary_policy policy_config_t:file { write append }; +@@ -83,7 +97,6 @@ type restorecond_t; + type restorecond_exec_t; + init_daemon_domain(restorecond_t, restorecond_exec_t) + domain_obj_id_change_exemption(restorecond_t) +-role system_r types restorecond_t; + + type restorecond_var_run_t; + files_pid_file(restorecond_var_run_t) +@@ -92,40 +105,49 @@ type run_init_t; + type run_init_exec_t; + application_domain(run_init_t, run_init_exec_t) + domain_system_change_exemption(run_init_t) +-role run_init_roles types run_init_t; ++#role run_init_roles types run_init_t; ++role system_r types run_init_t; + + type semanage_t; + type semanage_exec_t; + application_domain(semanage_t, semanage_exec_t) ++init_daemon_domain(semanage_t, semanage_exec_t) + domain_interactive_fd(semanage_t) +-role semanage_roles types semanage_t; ++#role semanage_roles types semanage_t; ++role system_r types semanage_t; ++ ++type setsebool_t; ++type setsebool_exec_t; ++init_system_domain(setsebool_t, setsebool_exec_t) + + type semanage_store_t; +-files_type(semanage_store_t) ++files_security_file(semanage_store_t) + + type semanage_read_lock_t; +-files_type(semanage_read_lock_t) ++files_lock_file(semanage_read_lock_t) + + type semanage_tmp_t; + files_tmp_file(semanage_tmp_t) + +-type semanage_trans_lock_t; +-files_type(semanage_trans_lock_t) +- +-type semanage_var_lib_t; +-files_type(semanage_var_lib_t) ++type semanage_trans_lock_t; ++files_lock_file(semanage_trans_lock_t) + + type setfiles_t alias restorecon_t, can_relabelto_binary_policy; + type setfiles_exec_t alias restorecon_exec_t; + init_system_domain(setfiles_t, setfiles_exec_t) + domain_obj_id_change_exemption(setfiles_t) + ++type setfiles_mac_t; ++domain_type(setfiles_mac_t) ++domain_entry_file(setfiles_mac_t, setfiles_exec_t) ++domain_obj_id_change_exemption(setfiles_mac_t) ++ + ######################################## + # + # Checkpolicy local policy + # + +-allow checkpolicy_t self:capability dac_override; ++allow checkpolicy_t self:capability { dac_read_search dac_override }; + + # able to create and modify binary policy files + manage_files_pattern(checkpolicy_t, policy_config_t, policy_config_t) +@@ -137,6 +159,7 @@ filetrans_add_pattern(checkpolicy_t, policy_src_t, policy_config_t, file) + read_files_pattern(checkpolicy_t, policy_src_t, policy_src_t) + read_lnk_files_pattern(checkpolicy_t, policy_src_t, policy_src_t) + allow checkpolicy_t selinux_config_t:dir search_dir_perms; ++allow checkpolicy_t selinux_login_config_t:dir search_dir_perms; + + domain_use_interactive_fds(checkpolicy_t) + +@@ -151,7 +174,7 @@ term_use_console(checkpolicy_t) + init_use_fds(checkpolicy_t) + init_use_script_ptys(checkpolicy_t) + +-userdom_use_user_terminals(checkpolicy_t) ++userdom_use_inherited_user_terminals(checkpolicy_t) + userdom_use_all_users_fds(checkpolicy_t) + + ifdef(`distro_ubuntu',` +@@ -165,10 +188,11 @@ ifdef(`distro_ubuntu',` + # Load_policy local policy + # + +-allow load_policy_t self:capability dac_override; ++allow load_policy_t self:capability { dac_read_search dac_override }; + + # only allow read of policy config files + read_files_pattern(load_policy_t, { policy_src_t policy_config_t }, policy_config_t) ++allow load_policy_t policy_config_t:file map; + + domain_use_interactive_fds(load_policy_t) + +@@ -188,13 +212,13 @@ term_list_ptys(load_policy_t) + + init_use_script_fds(load_policy_t) + init_use_script_ptys(load_policy_t) +- +-miscfiles_read_localization(load_policy_t) ++init_write_script_pipes(load_policy_t) + + seutil_libselinux_linked(load_policy_t) + +-userdom_use_user_terminals(load_policy_t) ++userdom_use_inherited_user_terminals(load_policy_t) + userdom_use_all_users_fds(load_policy_t) ++userdom_dontaudit_read_user_tmp_files(load_policy_t) + + ifdef(`distro_ubuntu',` + optional_policy(` +@@ -205,6 +229,7 @@ ifdef(`distro_ubuntu',` + ifdef(`hide_broken_symptoms',` + # cjp: cover up stray file descriptors. + dontaudit load_policy_t selinux_config_t:file write; ++ dontaudit load_policy_t selinux_login_config_t:file write; + + optional_policy(` + unconfined_dontaudit_read_pipes(load_policy_t) +@@ -215,12 +240,21 @@ optional_policy(` + portage_dontaudit_use_fds(load_policy_t) + ') + ++optional_policy(` ++ sssd_rw_inherited_pipes(load_policy_t) ++') ++ ++optional_policy(` ++ # pki is leaking ++ pki_dontaudit_write_log(load_policy_t) ++') ++ + ######################################## + # + # Newrole local policy + # + +-allow newrole_t self:capability { fowner setuid setgid dac_override }; ++allow newrole_t self:capability { fowner setpcap setuid setgid dac_read_search dac_override }; + allow newrole_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execheap execstack }; + allow newrole_t self:process setexec; + allow newrole_t self:fd use; +@@ -232,7 +266,7 @@ allow newrole_t self:msgq create_msgq_perms; + allow newrole_t self:msg { send receive }; + allow newrole_t self:unix_dgram_socket sendto; + allow newrole_t self:unix_stream_socket { create_stream_socket_perms connectto }; +-allow newrole_t self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; ++logging_send_audit_msgs(newrole_t) + + read_files_pattern(newrole_t, default_context_t, default_context_t) + read_lnk_files_pattern(newrole_t, default_context_t, default_context_t) +@@ -249,6 +283,7 @@ domain_use_interactive_fds(newrole_t) + # for when the user types "exec newrole" at the command line: + domain_sigchld_interactive_fds(newrole_t) + ++files_list_var(newrole_t) + files_read_etc_files(newrole_t) + files_read_var_files(newrole_t) + files_read_var_symlinks(newrole_t) +@@ -276,25 +311,34 @@ term_relabel_all_ptys(newrole_t) + term_getattr_unallocated_ttys(newrole_t) + term_dontaudit_use_unallocated_ttys(newrole_t) + +-auth_use_nsswitch(newrole_t) +-auth_run_chk_passwd(newrole_t, newrole_roles) +-auth_run_upd_passwd(newrole_t, newrole_roles) +-auth_rw_faillog(newrole_t) ++auth_use_pam(newrole_t) + + # Write to utmp. + init_rw_utmp(newrole_t) + init_use_fds(newrole_t) + +-logging_send_syslog_msg(newrole_t) +- +-miscfiles_read_localization(newrole_t) + + seutil_libselinux_linked(newrole_t) + ++userdom_use_unpriv_users_fds(newrole_t) + # for some PAM modules and for cwd + userdom_dontaudit_search_user_home_content(newrole_t) + userdom_search_user_home_dirs(newrole_t) + ++# need to talk with dbus ++optional_policy(` ++ dbus_system_bus_client(newrole_t) ++') ++ ++#optional_policy(` ++# namespace_init_run(newrole_t, newrole_roles) ++#') ++ ++ ++optional_policy(` ++ xserver_dontaudit_exec_xauth(newrole_t) ++') ++ + ifdef(`distro_ubuntu',` + optional_policy(` + unconfined_domain(newrole_t) +@@ -309,7 +353,7 @@ if(secure_mode) { + userdom_spec_domtrans_all_users(newrole_t) + } + +-tunable_policy(`allow_polyinstantiation',` ++tunable_policy(`polyinstantiation_enabled',` + files_polyinstantiate_all(newrole_t) + ') + +@@ -328,9 +372,13 @@ kernel_use_fds(restorecond_t) + kernel_rw_pipes(restorecond_t) + kernel_read_system_state(restorecond_t) + ++dev_relabel_all_dev_nodes(restorecond_t) ++ ++files_dontaudit_read_all_symlinks(restorecond_t) ++ + fs_relabelfrom_noxattr_fs(restorecond_t) + fs_dontaudit_list_nfs(restorecond_t) +-fs_getattr_xattr_fs(restorecond_t) ++fs_getattr_all_fs(restorecond_t) + fs_list_inotifyfs(restorecond_t) + + selinux_validate_context(restorecond_t) +@@ -341,16 +389,17 @@ selinux_compute_user_contexts(restorecond_t) + + files_relabel_non_auth_files(restorecond_t ) + files_read_non_auth_files(restorecond_t) ++ + auth_use_nsswitch(restorecond_t) + + locallogin_dontaudit_use_fds(restorecond_t) + + logging_send_syslog_msg(restorecond_t) + +-miscfiles_read_localization(restorecond_t) +- + seutil_libselinux_linked(restorecond_t) + ++userdom_read_user_home_content_symlinks(restorecond_t) ++ + ifdef(`distro_ubuntu',` + optional_policy(` + unconfined_domain(restorecond_t) +@@ -366,21 +415,24 @@ optional_policy(` + # Run_init local policy + # + +-allow run_init_roles system_r; ++#allow run_init_roles system_r; + + allow run_init_t self:process setexec; + allow run_init_t self:capability setuid; + allow run_init_t self:fifo_file rw_file_perms; +-allow run_init_t self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; ++logging_send_audit_msgs(run_init_t) + + # often the administrator runs such programs from a directory that is owned + # by a different user or has restrictive SE permissions, do not want to audit + # the failed access to the current directory + dontaudit run_init_t self:capability { dac_override dac_read_search }; + ++kernel_dontaudit_getattr_core_if(run_init_t) ++ + corecmd_exec_bin(run_init_t) + corecmd_exec_shell(run_init_t) + ++dev_dontaudit_getattr_all(run_init_t) + dev_dontaudit_list_all_dev_nodes(run_init_t) + + domain_use_interactive_fds(run_init_t) +@@ -398,23 +450,30 @@ selinux_compute_create_context(run_init_t) + selinux_compute_relabel_context(run_init_t) + selinux_compute_user_contexts(run_init_t) + ++term_use_console(run_init_t) ++ ++#auth_use_nsswitch(run_init_t) ++#auth_run_chk_passwd(run_init_t, run_init_roles) ++#auth_run_upd_passwd(run_init_t, run_init_roles) ++#auth_dontaudit_read_shadow(run_init_t) ++ + auth_use_nsswitch(run_init_t) +-auth_run_chk_passwd(run_init_t, run_init_roles) +-auth_run_upd_passwd(run_init_t, run_init_roles) ++auth_domtrans_chk_passwd(run_init_t) ++auth_domtrans_upd_passwd(run_init_t) + auth_dontaudit_read_shadow(run_init_t) + ++ + init_spec_domtrans_script(run_init_t) + # for utmp + init_rw_utmp(run_init_t) ++init_dontaudit_getattr_initctl(run_init_t) + + logging_send_syslog_msg(run_init_t) + +-miscfiles_read_localization(run_init_t) +- + seutil_libselinux_linked(run_init_t) + seutil_read_default_contexts(run_init_t) + +-userdom_use_user_terminals(run_init_t) ++userdom_use_inherited_user_terminals(run_init_t) + + ifndef(`direct_sysadm_daemon',` + ifdef(`distro_gentoo',` +@@ -425,6 +484,19 @@ ifndef(`direct_sysadm_daemon',` + ') + ') + ++# need to talk with dbus ++optional_policy(` ++ dbus_system_bus_client(run_init_t) ++') ++ ++optional_policy(` ++ gpm_dontaudit_getattr_gpmctl(run_init_t) ++') ++ ++optional_policy(` ++ rpm_domtrans(run_init_t) ++') ++ + ifdef(`distro_ubuntu',` + optional_policy(` + unconfined_domain(run_init_t) +@@ -440,81 +512,86 @@ optional_policy(` + # semodule local policy + # + +-allow semanage_t self:capability { dac_override audit_write }; +-allow semanage_t self:unix_stream_socket create_stream_socket_perms; +-allow semanage_t self:unix_dgram_socket create_socket_perms; + allow semanage_t self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; +-allow semanage_t self:fifo_file rw_fifo_file_perms; +- +-allow semanage_t policy_config_t:file rw_file_perms; +- +-allow semanage_t semanage_tmp_t:dir manage_dir_perms; +-allow semanage_t semanage_tmp_t:file manage_file_perms; +-files_tmp_filetrans(semanage_t, semanage_tmp_t, { file dir }) +- +-manage_dirs_pattern(semanage_t, semanage_var_lib_t, semanage_var_lib_t) +-manage_files_pattern(semanage_t, semanage_var_lib_t, semanage_var_lib_t) +- +-kernel_read_system_state(semanage_t) +-kernel_read_kernel_sysctls(semanage_t) +- +-corecmd_exec_bin(semanage_t) +- +-dev_read_urand(semanage_t) + +-domain_use_interactive_fds(semanage_t) +- +-files_read_etc_files(semanage_t) +-files_read_etc_runtime_files(semanage_t) +-files_read_usr_files(semanage_t) +-files_list_pids(semanage_t) +- +-mls_file_write_all_levels(semanage_t) +-mls_file_read_all_levels(semanage_t) +- +-selinux_validate_context(semanage_t) +-selinux_get_enforce_mode(semanage_t) +-selinux_getattr_fs(semanage_t) +-# for setsebool: ++selinux_set_enforce_mode(semanage_t) + selinux_set_all_booleans(semanage_t) ++can_exec(semanage_t, semanage_exec_t) + +-term_use_all_terms(semanage_t) +- +-# Running genhomedircon requires this for finding all users +-auth_use_nsswitch(semanage_t) +- +-locallogin_use_fds(semanage_t) ++# Admins are creating pp files in random locations ++files_read_non_security_files(semanage_t) + +-logging_send_syslog_msg(semanage_t) +- +-miscfiles_read_localization(semanage_t) +- +-seutil_libselinux_linked(semanage_t) ++seutil_semanage_policy(semanage_t) + seutil_manage_file_contexts(semanage_t) + seutil_manage_config(semanage_t) +-seutil_run_setfiles(semanage_t, semanage_roles) +-seutil_run_loadpolicy(semanage_t, semanage_roles) +-seutil_manage_bin_policy(semanage_t) +-seutil_use_newrole_fds(semanage_t) +-seutil_manage_module_store(semanage_t) +-seutil_get_semanage_trans_lock(semanage_t) +-seutil_get_semanage_read_lock(semanage_t) ++seutil_domtrans_setfiles(semanage_t) ++ ++#seutil_run_setfiles(semanage_t, semanage_roles) ++#seutil_run_loadpolicy(semanage_t, semanage_roles) ++#seutil_manage_bin_policy(semanage_t) ++#seutil_use_newrole_fds(semanage_t) ++#seutil_manage_module_store(semanage_t) ++#seutil_get_semanage_trans_lock(semanage_t) ++#seutil_get_semanage_read_lock(semanage_t) + # netfilter_contexts: + seutil_manage_default_contexts(semanage_t) + + # Handle pp files created in homedir and /tmp + userdom_read_user_home_content_files(semanage_t) + userdom_read_user_tmp_files(semanage_t) ++userdom_home_reader(semanage_t) ++userdom_map_tmp_files(semanage_t) + + ifdef(`distro_debian',` + files_read_var_lib_files(semanage_t) + files_read_var_lib_symlinks(semanage_t) + ') + +-ifdef(`distro_ubuntu',` +- optional_policy(` +- unconfined_domain(semanage_t) +- ') ++optional_policy(` ++ dbus_system_domain(semanage_t, semanage_exec_t) ++') ++ ++optional_policy(` ++ mock_manage_lib_files(semanage_t) ++ mock_manage_lib_dirs(semanage_t) ++') ++ ++optional_policy(` ++ unconfined_domain(semanage_t) ++') ++ ++####################################n#### ++# ++# setsebool local policy ++# ++seutil_semanage_policy(setsebool_t) ++selinux_set_all_booleans(setsebool_t) ++ ++init_dontaudit_use_fds(setsebool_t) ++ ++# Bug in semanage ++seutil_domtrans_setfiles(setsebool_t) ++seutil_manage_file_contexts(setsebool_t) ++seutil_manage_default_contexts(setsebool_t) ++seutil_manage_config(setsebool_t) ++ ++######################################## ++# ++# Setfiles mac local policy ++# ++seutil_setfiles(setfiles_mac_t) ++allow setfiles_mac_t self:capability2 mac_admin; ++kernel_relabelto_unlabeled(setfiles_mac_t) ++ ++optional_policy(` ++ files_dontaudit_write_isid_chr_files(setfiles_mac_t) ++ livecd_dontaudit_leaks(setfiles_mac_t) ++ livecd_rw_tmp_files(setfiles_mac_t) ++ dev_dontaudit_write_all_chr_files(setfiles_mac_t) ++') ++ ++optional_policy(` ++ unconfined_domain(setfiles_mac_t) + ') + + ######################################## +@@ -522,111 +599,201 @@ ifdef(`distro_ubuntu',` + # Setfiles local policy + # + +-allow setfiles_t self:capability { dac_override dac_read_search fowner }; +-dontaudit setfiles_t self:capability sys_tty_config; +-allow setfiles_t self:fifo_file rw_file_perms; +- +-allow setfiles_t { policy_src_t policy_config_t file_context_t default_context_t }:dir list_dir_perms; +-allow setfiles_t { policy_src_t policy_config_t file_context_t default_context_t }:file read_file_perms; +-allow setfiles_t { policy_src_t policy_config_t file_context_t default_context_t }:lnk_file { read_lnk_file_perms ioctl lock }; +- +-kernel_read_system_state(setfiles_t) +-kernel_relabelfrom_unlabeled_dirs(setfiles_t) +-kernel_relabelfrom_unlabeled_files(setfiles_t) +-kernel_relabelfrom_unlabeled_symlinks(setfiles_t) +-kernel_relabelfrom_unlabeled_pipes(setfiles_t) +-kernel_relabelfrom_unlabeled_sockets(setfiles_t) +-kernel_use_fds(setfiles_t) +-kernel_rw_pipes(setfiles_t) +-kernel_rw_unix_dgram_sockets(setfiles_t) +-kernel_dontaudit_list_all_proc(setfiles_t) +-kernel_dontaudit_list_all_sysctls(setfiles_t) +- +-dev_relabel_all_dev_nodes(setfiles_t) +-# to handle when /dev/console needs to be relabeled +-dev_rw_generic_chr_files(setfiles_t) +- +-domain_use_interactive_fds(setfiles_t) +-domain_dontaudit_search_all_domains_state(setfiles_t) +- +-files_read_etc_runtime_files(setfiles_t) +-files_read_etc_files(setfiles_t) +-files_list_all(setfiles_t) +-files_relabel_all_files(setfiles_t) +-files_read_usr_symlinks(setfiles_t) +-files_dontaudit_read_all_symlinks(setfiles_t) +- +-fs_getattr_xattr_fs(setfiles_t) +-fs_list_all(setfiles_t) +-fs_search_auto_mountpoints(setfiles_t) +-fs_relabelfrom_noxattr_fs(setfiles_t) +- +-mls_file_read_all_levels(setfiles_t) +-mls_file_write_all_levels(setfiles_t) +-mls_file_upgrade(setfiles_t) +-mls_file_downgrade(setfiles_t) +- +-selinux_validate_context(setfiles_t) +-selinux_compute_access_vector(setfiles_t) +-selinux_compute_create_context(setfiles_t) +-selinux_compute_relabel_context(setfiles_t) +-selinux_compute_user_contexts(setfiles_t) +- +-term_use_all_ttys(setfiles_t) +-term_use_all_ptys(setfiles_t) +-term_use_unallocated_ttys(setfiles_t) +- +-# this is to satisfy the assertion: +-auth_relabelto_shadow(setfiles_t) +- +-init_use_fds(setfiles_t) +-init_use_script_fds(setfiles_t) +-init_use_script_ptys(setfiles_t) +-init_exec_script_files(setfiles_t) ++seutil_setfiles(setfiles_t) ++# During boot in Rawhide ++term_use_generic_ptys(setfiles_t) ++ ++# needs to be able to read symlinks to make restorecon on symlink working ++files_read_all_symlinks(setfiles_t) ++allow setfiles_t file_context_t:file map; ++ ++fs_mount_tracefs(setfiles_t) + + logging_send_audit_msgs(setfiles_t) + logging_send_syslog_msg(setfiles_t) + +-miscfiles_read_localization(setfiles_t) ++optional_policy(` ++ cloudform_dontaudit_write_cloud_log(setfiles_t) ++') ++ ++optional_policy(` ++ devicekit_dontaudit_read_pid_files(setfiles_t) ++ devicekit_dontaudit_rw_log(setfiles_t) ++') + +-seutil_libselinux_linked(setfiles_t) ++optional_policy(` ++ # pki is leaking ++ pki_dontaudit_write_log(setfiles_t) ++') ++ ++optional_policy(` ++ xserver_append_xdm_tmp_files(setfiles_t) ++') ++ ++ifdef(`hide_broken_symptoms',` ++ ++ optional_policy(` ++ setroubleshoot_fixit_dontaudit_leaks(setfiles_t) ++ setroubleshoot_fixit_dontaudit_leaks(setsebool_t) ++ setroubleshoot_fixit_dontaudit_leaks(load_policy_t) ++ ') ++') ++ifdef(`distro_ubuntu',` ++ optional_policy(` ++ unconfined_domain(setfiles_t) ++ ') ++') + +-userdom_use_all_users_fds(setfiles_t) ++######################################## ++# ++# Setfiles common policy ++# ++allow setfiles_domain self:capability { dac_override dac_read_search fowner }; ++dontaudit setfiles_domain self:capability sys_tty_config; ++allow setfiles_domain self:fifo_file rw_file_perms; ++dontaudit setfiles_domain self:dir relabelfrom; ++dontaudit setfiles_domain self:file relabelfrom; ++dontaudit setfiles_domain self:lnk_file relabelfrom; ++ ++domain_relabelfrom(setfiles_domain) ++ ++allow setfiles_domain { policy_src_t policy_config_t file_context_t default_context_t }:dir list_dir_perms; ++allow setfiles_domain { policy_src_t policy_config_t file_context_t default_context_t }:file read_file_perms; ++allow setfiles_domain { policy_src_t policy_config_t file_context_t default_context_t }:lnk_file { read_lnk_file_perms ioctl lock }; ++ ++logging_send_audit_msgs(setfiles_domain) ++ ++kernel_relabelfrom_unlabeled_dirs(setfiles_domain) ++kernel_relabelfrom_unlabeled_files(setfiles_domain) ++kernel_relabelfrom_unlabeled_symlinks(setfiles_domain) ++kernel_relabelfrom_unlabeled_pipes(setfiles_domain) ++kernel_relabelfrom_unlabeled_sockets(setfiles_domain) ++kernel_use_fds(setfiles_domain) ++kernel_rw_pipes(setfiles_domain) ++kernel_rw_unix_dgram_sockets(setfiles_domain) ++kernel_dontaudit_list_all_proc(setfiles_domain) ++kernel_read_all_sysctls(setfiles_domain) ++kernel_read_network_state_symlinks(setfiles_domain) ++ ++dev_relabel_all_dev_nodes(setfiles_domain) ++dev_dontaudit_rw_lvm_control(setfiles_domain) ++dev_dontaudit_read_rand(setfiles_domain) ++dev_dontaudit_read_urand(setfiles_domain) ++ ++domain_use_interactive_fds(setfiles_domain) ++domain_read_all_domains_state(setfiles_domain) ++ ++files_read_etc_runtime_files(setfiles_domain) ++files_read_etc_files(setfiles_domain) ++files_list_all(setfiles_domain) ++files_list_isid_type_dirs(setfiles_domain) ++files_read_isid_type_files(setfiles_domain) ++files_dontaudit_read_all_symlinks(setfiles_domain) ++ ++fs_getattr_all_fs(setfiles_domain) ++fs_list_all(setfiles_domain) ++fs_getattr_all_files(setfiles_domain) ++fs_search_auto_mountpoints(setfiles_domain) ++fs_relabelfrom_noxattr_fs(setfiles_domain) ++ ++selinux_validate_context(setfiles_domain) ++selinux_compute_access_vector(setfiles_domain) ++selinux_compute_create_context(setfiles_domain) ++selinux_compute_relabel_context(setfiles_domain) ++selinux_compute_user_contexts(setfiles_domain) ++ ++term_use_all_inherited_terms(setfiles_domain) ++ ++init_use_fds(setfiles_domain) ++init_use_script_fds(setfiles_domain) ++init_use_script_ptys(setfiles_domain) ++init_exec_script_files(setfiles_domain) ++ ++userdom_use_all_users_fds(setfiles_domain) + # for config files in a home directory +-userdom_read_user_home_content_files(setfiles_t) ++userdom_read_user_home_content_files(setfiles_domain) ++userdom_read_admin_home_files(setfiles_domain) ++userdom_rw_inherited_user_home_content_files(setfiles_domain) + + ifdef(`distro_debian',` + # udev tmpfs is populated with static device nodes + # and then relabeled afterwards; thus + # /dev/console has the tmpfs type +- fs_rw_tmpfs_chr_files(setfiles_t) ++ fs_rw_tmpfs_chr_files(setfiles_domain) + ') + +-ifdef(`distro_redhat', ` +- fs_rw_tmpfs_chr_files(setfiles_t) +- fs_rw_tmpfs_blk_files(setfiles_t) +- fs_relabel_tmpfs_blk_file(setfiles_t) +- fs_relabel_tmpfs_chr_file(setfiles_t) ++ifdef(`distro_redhat',` ++ fs_rw_tmpfs_chr_files(setfiles_domain) ++ fs_rw_tmpfs_blk_files(setfiles_domain) ++ fs_relabel_tmpfs_blk_file(setfiles_domain) ++ fs_relabel_tmpfs_chr_file(setfiles_domain) + ') + +-ifdef(`distro_ubuntu',` +- optional_policy(` +- unconfined_domain(setfiles_t) +- ') ++optional_policy(` ++ hotplug_use_fds(setfiles_domain) + ') + +-ifdef(`hide_broken_symptoms',` +- optional_policy(` +- udev_dontaudit_rw_dgram_sockets(setfiles_t) +- ') +- +- # cjp: cover up stray file descriptors. +- optional_policy(` +- unconfined_dontaudit_read_pipes(setfiles_t) +- unconfined_dontaudit_rw_tcp_sockets(setfiles_t) +- ') ++optional_policy(` ++ dbus_read_pid_files(setfiles_domain) + ') + ++allow policy_manager_domain self:capability { dac_read_search dac_override sys_nice sys_resource }; ++dontaudit policy_manager_domain self:capability sys_tty_config; ++allow policy_manager_domain self:process { signal setsched }; ++allow policy_manager_domain self:unix_stream_socket create_stream_socket_perms; ++allow policy_manager_domain self:unix_dgram_socket create_socket_perms; ++allow policy_manager_domain self:fifo_file rw_fifo_file_perms; ++ ++dev_read_rand(policy_manager_domain) ++dev_read_urand(policy_manager_domain) ++ ++logging_send_audit_msgs(policy_manager_domain) ++ ++# Domains that will manage policy ++allow policy_manager_domain policy_config_t:file rw_file_perms; ++ ++allow policy_manager_domain semanage_tmp_t:dir manage_dir_perms; ++allow policy_manager_domain semanage_tmp_t:file manage_file_perms; ++files_tmp_filetrans(policy_manager_domain, semanage_tmp_t, { file dir }) ++ ++kernel_read_kernel_sysctls(policy_manager_domain) ++ ++corecmd_exec_bin(policy_manager_domain) ++corecmd_exec_shell(policy_manager_domain) ++ ++domain_use_interactive_fds(policy_manager_domain) ++ ++files_read_etc_files(policy_manager_domain) ++files_read_etc_runtime_files(policy_manager_domain) ++files_read_usr_files(policy_manager_domain) ++files_mmap_usr_files(policy_manager_domain) ++files_list_pids(policy_manager_domain) ++fs_list_inotifyfs(policy_manager_domain) ++fs_getattr_all_fs(policy_manager_domain) ++ ++selinux_validate_context(policy_manager_domain) ++selinux_read_policy(policy_manager_domain) ++ ++term_use_all_inherited_terms(policy_manager_domain) ++ ++locallogin_use_fds(policy_manager_domain) ++ ++seutil_search_default_contexts(policy_manager_domain) ++seutil_domtrans_loadpolicy(policy_manager_domain) ++seutil_read_config(policy_manager_domain) ++seutil_use_newrole_fds(policy_manager_domain) ++seutil_manage_module_store(policy_manager_domain) ++seutil_get_semanage_trans_lock(policy_manager_domain) ++seutil_get_semanage_read_lock(policy_manager_domain) ++ ++userdom_dontaudit_write_user_home_content_files(policy_manager_domain) ++userdom_use_user_ptys(policy_manager_domain) ++ ++files_rw_inherited_generic_pid_files(setfiles_domain) ++files_rw_inherited_generic_pid_files(policy_manager_domain) ++files_create_boot_flag(policy_manager_domain, ".autorelabel") ++files_delete_boot_flag(policy_manager_domain) ++ + optional_policy(` +- hotplug_use_fds(setfiles_t) ++ policykit_dbus_chat(policy_manager_domain) + ') +diff --git a/policy/modules/system/setrans.fc b/policy/modules/system/setrans.fc +index bea462999f..06e2834f7e 100644 +--- a/policy/modules/system/setrans.fc ++++ b/policy/modules/system/setrans.fc +@@ -2,4 +2,7 @@ + + /sbin/mcstransd -- gen_context(system_u:object_r:setrans_exec_t,s0) + ++/usr/sbin/mcstransd -- gen_context(system_u:object_r:setrans_exec_t,s0) ++ + /var/run/setrans(/.*)? gen_context(system_u:object_r:setrans_var_run_t,mls_systemhigh) ++/var/run/mcstransd\.pid gen_context(system_u:object_r:setrans_var_run_t,mls_systemhigh) +diff --git a/policy/modules/system/setrans.if b/policy/modules/system/setrans.if +index efa9c27f67..536a514fcf 100644 +--- a/policy/modules/system/setrans.if ++++ b/policy/modules/system/setrans.if +@@ -40,3 +40,21 @@ interface(`setrans_translate_context',` + stream_connect_pattern($1, setrans_var_run_t, setrans_var_run_t, setrans_t) + files_list_pids($1) + ') ++####################################### ++## ++## Allow a domain to manage pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`setrans_manage_pid_files',` ++ gen_require(` ++ type setrans_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, setrans_var_run_t, setrans_var_run_t) ++') +diff --git a/policy/modules/system/setrans.te b/policy/modules/system/setrans.te +index 1447687d57..0b1da4d3e3 100644 +--- a/policy/modules/system/setrans.te ++++ b/policy/modules/system/setrans.te +@@ -12,6 +12,7 @@ gen_require(` + type setrans_t; + type setrans_exec_t; + init_daemon_domain(setrans_t, setrans_exec_t) ++mls_trusted_object(setrans_t) + + type setrans_initrc_exec_t; + init_script_file(setrans_initrc_exec_t) +@@ -49,6 +50,7 @@ manage_files_pattern(setrans_t, setrans_var_run_t, setrans_var_run_t) + manage_sock_files_pattern(setrans_t, setrans_var_run_t, setrans_var_run_t) + files_pid_filetrans(setrans_t, setrans_var_run_t, { file dir }) + ++kernel_read_system_state(setrans_t) + kernel_read_kernel_sysctls(setrans_t) + kernel_read_proc_symlinks(setrans_t) + +@@ -78,7 +80,6 @@ locallogin_dontaudit_use_fds(setrans_t) + + logging_send_syslog_msg(setrans_t) + +-miscfiles_read_localization(setrans_t) + + seutil_read_config(setrans_t) + +diff --git a/policy/modules/system/sysnetwork.fc b/policy/modules/system/sysnetwork.fc +index 40edc18abe..95f4458d23 100644 +--- a/policy/modules/system/sysnetwork.fc ++++ b/policy/modules/system/sysnetwork.fc +@@ -17,23 +17,29 @@ ifdef(`distro_debian',` + /etc/dhclient.*conf -- gen_context(system_u:object_r:dhcp_etc_t,s0) + /etc/dhclient-script -- gen_context(system_u:object_r:dhcp_etc_t,s0) + /etc/dhcpc.* gen_context(system_u:object_r:dhcp_etc_t,s0) +-/etc/dhcpd\.conf -- gen_context(system_u:object_r:dhcp_etc_t,s0) +-/etc/dhcp/dhcpd\.conf -- gen_context(system_u:object_r:dhcp_etc_t,s0) ++/etc/dhcpd(6)?\.conf -- gen_context(system_u:object_r:dhcp_etc_t,s0) ++/etc/dhcp/dhcpd(6)?\.conf -- gen_context(system_u:object_r:dhcp_etc_t,s0) + /etc/ethers -- gen_context(system_u:object_r:net_conf_t,s0) +-/etc/hosts -- gen_context(system_u:object_r:net_conf_t,s0) ++/etc/hosts[^/]* -- gen_context(system_u:object_r:net_conf_t,s0) + /etc/hosts\.deny.* -- gen_context(system_u:object_r:net_conf_t,s0) + /etc/denyhosts.* -- gen_context(system_u:object_r:net_conf_t,s0) +-/etc/resolv\.conf.* -- gen_context(system_u:object_r:net_conf_t,s0) ++/etc/resolv\.conf.* gen_context(system_u:object_r:net_conf_t,s0) ++/etc/resolv-secure.conf.* gen_context(system_u:object_r:net_conf_t,s0) ++/etc/\.resolv\.conf.* gen_context(system_u:object_r:net_conf_t,s0) + /etc/yp\.conf.* -- gen_context(system_u:object_r:net_conf_t,s0) ++/etc/ntp\.conf -- gen_context(system_u:object_r:net_conf_t,s0) + +-/etc/dhcp3(/.*)? gen_context(system_u:object_r:dhcp_etc_t,s0) ++/etc/dhcp3?(/.*)? gen_context(system_u:object_r:dhcp_etc_t,s0) + /etc/dhcp3?/dhclient.* gen_context(system_u:object_r:dhcp_etc_t,s0) + + ifdef(`distro_redhat',` + /etc/sysconfig/network-scripts/.*resolv\.conf -- gen_context(system_u:object_r:net_conf_t,s0) + /etc/sysconfig/networking(/.*)? gen_context(system_u:object_r:net_conf_t,s0) + /etc/sysconfig/network-scripts(/.*)? gen_context(system_u:object_r:net_conf_t,s0) ++/var/run/systemd/network(/.*)? gen_context(system_u:object_r:net_conf_t,s0) ++/var/run/systemd/resolve/resolv\.conf -- gen_context(system_u:object_r:net_conf_t,s0) + ') ++/var/run/NetworkManager/resolv\.conf.* -- gen_context(system_u:object_r:net_conf_t,s0) + + # + # /sbin +@@ -44,6 +50,7 @@ ifdef(`distro_redhat',` + /sbin/ethtool -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + /sbin/ifconfig -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + /sbin/ip -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/sbin/iw -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + /sbin/ipx_configure -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + /sbin/ipx_interface -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + /sbin/ipx_internal_net -- gen_context(system_u:object_r:ifconfig_exec_t,s0) +@@ -55,6 +62,21 @@ ifdef(`distro_redhat',` + # + # /usr + # ++/usr/bin/ip -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++ ++/usr/sbin/dhclient.* -- gen_context(system_u:object_r:dhcpc_exec_t,s0) ++/usr/sbin/dhcdbd -- gen_context(system_u:object_r:dhcpc_exec_t,s0) ++/usr/sbin/dhcpcd -- gen_context(system_u:object_r:dhcpc_exec_t,s0) ++/usr/sbin/ethtool -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/ifconfig -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/ip -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/iw -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/ipx_configure -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/ipx_interface -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/ipx_internal_net -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/iwconfig -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/mii-tool -- gen_context(system_u:object_r:ifconfig_exec_t,s0) ++/usr/sbin/pump -- gen_context(system_u:object_r:dhcpc_exec_t,s0) + /usr/sbin/tc -- gen_context(system_u:object_r:ifconfig_exec_t,s0) + + # +@@ -77,3 +99,6 @@ ifdef(`distro_debian',` + /var/run/network(/.*)? gen_context(system_u:object_r:net_conf_t,s0) + ') + ++/var/run/netns(/.*)? gen_context(system_u:object_r:ifconfig_var_run_t,s0) ++/etc/firestarter/firestarter\.sh gen_context(system_u:object_r:dhcpc_helper_exec_t,s0) ++ +diff --git a/policy/modules/system/sysnetwork.if b/policy/modules/system/sysnetwork.if +index 2cea692c01..1fb3ada181 100644 +--- a/policy/modules/system/sysnetwork.if ++++ b/policy/modules/system/sysnetwork.if +@@ -17,6 +17,7 @@ interface(`sysnet_domtrans_dhcpc',` + + corecmd_search_bin($1) + domtrans_pattern($1, dhcpc_exec_t, dhcpc_t) ++ allow $1 dhcpc_exec_t:file map; + ') + + ######################################## +@@ -38,11 +39,30 @@ interface(`sysnet_domtrans_dhcpc',` + # + interface(`sysnet_run_dhcpc',` + gen_require(` ++ type dhcpc_t; + attribute_role dhcpc_roles; + ') + + sysnet_domtrans_dhcpc($1) + roleattribute $2 dhcpc_roles; ++ ++ optional_policy(` ++ networkmanager_run(dhcpc_t, $2) ++ ') ++ ++ optional_policy(` ++ nis_run_ypbind(dhcpc_t, $2) ++ ') ++ ++ optional_policy(` ++ nscd_run(dhcpc_t, $2) ++ ') ++ ++ optional_policy(` ++ ntp_run(dhcpc_t, $2) ++ ') ++ ++ seutil_run_setfiles(dhcpc_t, $2) + ') + + ######################################## +@@ -231,7 +251,7 @@ interface(`sysnet_rw_dhcp_config',` + ') + + files_search_etc($1) +- allow $1 dhcp_etc_t:file rw_file_perms; ++ rw_files_pattern($1, dhcp_etc_t, dhcp_etc_t) + ') + + ######################################## +@@ -269,6 +289,7 @@ interface(`sysnet_read_dhcpc_state',` + type dhcpc_state_t; + ') + ++ list_dirs_pattern($1, dhcpc_state_t, dhcpc_state_t) + read_files_pattern($1, dhcpc_state_t, dhcpc_state_t) + ') + +@@ -290,6 +311,43 @@ interface(`sysnet_delete_dhcpc_state',` + delete_files_pattern($1, dhcpc_state_t, dhcpc_state_t) + ') + ++######################################## ++## ++## Allow caller to relabel dhcpc_state files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_relabelfrom_dhcpc_state',` ++ ++ gen_require(` ++ type dhcpc_state_t; ++ ') ++ ++ allow $1 dhcpc_state_t:file relabelfrom; ++') ++ ++####################################### ++## ++## Manage the dhcp client state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_manage_dhcpc_state',` ++ gen_require(` ++ type dhcpc_state_t; ++ ') ++ ++ manage_files_pattern($1, dhcpc_state_t, dhcpc_state_t) ++') ++ + ####################################### + ## + ## Set the attributes of network config files. +@@ -309,6 +367,44 @@ interface(`sysnet_setattr_config',` + allow $1 net_conf_t:file setattr_file_perms; + ') + ++####################################### ++## ++## Allow caller to relabel net_conf files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_relabelfrom_net_conf',` ++ ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ allow $1 net_conf_t:file relabelfrom; ++') ++ ++###################################### ++## ++## Allow caller to relabel net_conf files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_relabelto_net_conf',` ++ ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ allow $1 net_conf_t:file relabelto; ++') ++ + ####################################### + ## + ## Read network config files. +@@ -355,7 +451,10 @@ interface(`sysnet_read_config',` + ') + + ifdef(`distro_redhat',` ++ files_search_all_pids($1) ++ init_search_pid_dirs($1) + allow $1 net_conf_t:dir list_dir_perms; ++ allow $1 net_conf_t:lnk_file read_lnk_file_perms; + read_files_pattern($1, net_conf_t, net_conf_t) + ') + ') +@@ -438,6 +537,42 @@ interface(`sysnet_etc_filetrans_config',` + ') + + files_etc_filetrans($1, net_conf_t, file, $2) ++ files_etc_filetrans($1, net_conf_t, lnk_file, $2) ++ ++') ++ ++######################################## ++## ++## Transition content to the type used for ++## the network config files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the directory to which the object will be created. ++## ++## ++## ++## ++## The object class. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`sysnet_filetrans_config_fromdir',` ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ filetrans_pattern($1, $2, net_conf_t, $3, $4) + ') + + ####################################### +@@ -453,7 +588,7 @@ interface(`sysnet_etc_filetrans_config',` + interface(`sysnet_manage_config',` + gen_require(` + type net_conf_t; +- ') ++ ') + + allow $1 net_conf_t:file manage_file_perms; + +@@ -463,7 +598,41 @@ interface(`sysnet_manage_config',` + ') + + ifdef(`distro_redhat',` ++ files_search_all_pids($1) ++ init_search_pid_dirs($1) ++ allow $1 net_conf_t:dir list_dir_perms; + manage_files_pattern($1, net_conf_t, net_conf_t) ++ manage_lnk_files_pattern($1, net_conf_t, net_conf_t) ++ ') ++') ++ ++####################################### ++## ++## Create, read, write, and delete network config dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_manage_config_dirs',` ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ allow $1 net_conf_t:dir manage_dir_perms; ++ ++ ifdef(`distro_debian',` ++ files_search_pids($1) ++ manage_dirs_pattern($1, net_conf_t, net_conf_t) ++ ') ++ ++ ifdef(`distro_redhat',` ++ files_search_all_pids($1) ++ init_search_pid_dirs($1) ++ allow $1 net_conf_t:dir list_dir_perms; ++ manage_dirs_pattern($1, net_conf_t, net_conf_t) + ') + ') + +@@ -501,9 +670,29 @@ interface(`sysnet_delete_dhcpc_pid',` + type dhcpc_var_run_t; + ') + ++ files_rw_pid_dirs($1) + allow $1 dhcpc_var_run_t:file unlink; + ') + ++####################################### ++## ++## Manage the dhcp client pid file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_manage_dhcpc_pid',` ++ gen_require(` ++ type dhcpc_var_run_t; ++ ') ++ ++ files_rw_pid_dirs($1) ++ manage_files_pattern($1, dhcpc_var_run_t, dhcpc_var_run_t) ++') ++ + ####################################### + ## + ## Execute ifconfig in the ifconfig domain. +@@ -523,6 +712,24 @@ interface(`sysnet_domtrans_ifconfig',` + domtrans_pattern($1, ifconfig_exec_t, ifconfig_t) + ') + ++######################################## ++## ++## NNP Transition to ifconfig_t. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sysnet_nnp_domtrans_ifconfig',` ++ gen_require(` ++ type ifconfig_t; ++ ') ++ ++ allow $1 ifconfig_t:process2 { nnp_transition nosuid_transition }; ++') ++ + ######################################## + ## + ## Execute ifconfig in the ifconfig domain, and +@@ -608,6 +815,25 @@ interface(`sysnet_signull_ifconfig',` + allow $1 ifconfig_t:process signull; + ') + ++######################################## ++## ++## Send a kill signal to iconfig. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`sysnet_kill_ifconfig',` ++ gen_require(` ++ type ifconfig_t; ++ ') ++ ++ allow $1 ifconfig_t:process sigkill; ++') ++ + ######################################## + ## + ## Read the DHCP configuration files. +@@ -626,6 +852,7 @@ interface(`sysnet_read_dhcp_config',` + files_search_etc($1) + allow $1 dhcp_etc_t:dir list_dir_perms; + read_files_pattern($1, dhcp_etc_t, dhcp_etc_t) ++ allow $1 dhcp_etc_t:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -647,6 +874,26 @@ interface(`sysnet_search_dhcp_state',` + allow $1 dhcp_state_t:dir search_dir_perms; + ') + ++####################################### ++## ++## Set the attributes of network config files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_setattr_dhcp_state',` ++ gen_require(` ++ type dhcp_state_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 dhcp_state_t:file setattr_file_perms; ++') ++ ++ + ######################################## + ## + ## Create DHCP state data. +@@ -711,8 +958,6 @@ interface(`sysnet_dns_name_resolve',` + allow $1 self:udp_socket create_socket_perms; + allow $1 self:netlink_route_socket r_netlink_socket_perms; + +- corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) + corenet_tcp_sendrecv_generic_if($1) + corenet_udp_sendrecv_generic_if($1) + corenet_tcp_sendrecv_generic_node($1) +@@ -720,8 +965,13 @@ interface(`sysnet_dns_name_resolve',` + corenet_tcp_sendrecv_dns_port($1) + corenet_udp_sendrecv_dns_port($1) + corenet_tcp_connect_dns_port($1) ++ corenet_tcp_connect_dnssec_port($1) + corenet_sendrecv_dns_client_packets($1) + ++ files_search_all_pids($1) ++ ++ miscfiles_read_generic_certs($1) ++ + sysnet_read_config($1) + + optional_policy(` +@@ -750,8 +1000,6 @@ interface(`sysnet_use_ldap',` + + allow $1 self:tcp_socket create_socket_perms; + +- corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) + corenet_tcp_sendrecv_generic_if($1) + corenet_tcp_sendrecv_generic_node($1) + corenet_tcp_sendrecv_ldap_port($1) +@@ -760,9 +1008,14 @@ interface(`sysnet_use_ldap',` + + # Support for LDAPS + dev_read_rand($1) ++ # LDAP Configuration using encrypted requires + dev_read_urand($1) + + sysnet_read_config($1) ++ ++ optional_policy(` ++ ldap_read_certs($1) ++ ') + ') + + ######################################## +@@ -784,7 +1037,6 @@ interface(`sysnet_use_portmap',` + allow $1 self:udp_socket create_socket_perms; + + corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) + corenet_tcp_sendrecv_generic_if($1) + corenet_udp_sendrecv_generic_if($1) + corenet_tcp_sendrecv_generic_node($1) +@@ -796,3 +1048,143 @@ interface(`sysnet_use_portmap',` + + sysnet_read_config($1) + ') ++ ++######################################## ++## ++## Do not audit attempts to use ++## the dhcp file descriptors. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`sysnet_dontaudit_dhcpc_use_fds',` ++ gen_require(` ++ type dhcpc_t; ++ ') ++ ++ dontaudit $1 dhcpc_t:fd use; ++') ++ ++######################################## ++## ++## Transition to system_r when execute an dhclient script ++## ++## ++##

      ++## Execute dhclient script in a specified role ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Role to transition from. ++## ++## ++interface(`sysnet_role_transition_dhcpc',` ++ gen_require(` ++ type dhcpc_exec_t; ++ ') ++ ++ role_transition $1 dhcpc_exec_t system_r; ++') ++ ++######################################## ++## ++## Transition to sysnet named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_filetrans_named_content',` ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ files_etc_filetrans($1, net_conf_t, file, "resolv.conf") ++ files_etc_filetrans($1, net_conf_t, file, "resolv.conf.tmp") ++ files_etc_filetrans($1, net_conf_t, file, "resolv.conf.fp-tmp") ++ files_etc_filetrans($1, net_conf_t, file, "resolv.conf.fp-saved") ++ files_etc_filetrans($1, net_conf_t, file, "resolv-secure.conf") ++ files_etc_filetrans($1, net_conf_t, file, ".resolv.conf.dnssec-trigger") ++ files_etc_filetrans($1, net_conf_t, file, ".resolv-secure.conf.dnssec-trigger") ++ files_etc_filetrans($1, net_conf_t, lnk_file, ".resolv.conf") ++ files_etc_filetrans($1, net_conf_t, lnk_file, ".resolv.conf.NetworkManager") ++ files_etc_filetrans($1, net_conf_t, file, "denyhosts") ++ files_etc_filetrans($1, net_conf_t, file, "hosts") ++ files_etc_filetrans($1, net_conf_t, file, "hosts.deny") ++ files_etc_filetrans($1, net_conf_t, file, "ethers") ++ files_etc_filetrans($1, net_conf_t, file, "yp.conf") ++ files_etc_filetrans($1, net_conf_t, file, "ntp.conf") ++ init_pid_filetrans($1, net_conf_t, dir, "network") ++ ++ optional_policy(` ++ networkmanager_pid_filetrans($1, net_conf_t, file, "resolv.conf") ++ networkmanager_pid_filetrans($1, net_conf_t, file, "resolv.conf.tmp") ++ ') ++') ++ ++######################################## ++## ++## Transition to sysnet ifconfig named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_manage_ifconfig_run',` ++ gen_require(` ++ type ifconfig_var_run_t; ++ ') ++ ++ manage_files_pattern($1, ifconfig_var_run_t, ifconfig_var_run_t) ++ manage_dirs_pattern($1, ifconfig_var_run_t, ifconfig_var_run_t) ++ manage_lnk_files_pattern($1, ifconfig_var_run_t, ifconfig_var_run_t) ++') ++ ++######################################## ++## ++## Transition to sysnet ifconfig named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_filetrans_named_content_ifconfig',` ++ gen_require(` ++ type ifconfig_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, ifconfig_var_run_t, dir, "netns") ++') ++ ++######################################## ++## ++## Transition to sysnet ifconfig named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sysnet_filetrans_net_conf',` ++ gen_require(` ++ type net_conf_t; ++ ') ++ ++ files_etc_filetrans($1, net_conf_t, file) ++') +diff --git a/policy/modules/system/sysnetwork.te b/policy/modules/system/sysnetwork.te +index a392fc4bcc..4b8dc56309 100644 +--- a/policy/modules/system/sysnetwork.te ++++ b/policy/modules/system/sysnetwork.te +@@ -5,6 +5,13 @@ policy_module(sysnetwork, 1.15.4) + # Declarations + # + ++## ++##

      ++## Allow dhcpc client applications to execute iptables commands ++##

      ++##
      ++gen_tunable(dhcpc_exec_iptables, false) ++ + attribute_role dhcpc_roles; + roleattribute system_r dhcpc_roles; + +@@ -20,7 +27,9 @@ files_type(dhcp_state_t) + type dhcpc_t; + type dhcpc_exec_t; + init_daemon_domain(dhcpc_t, dhcpc_exec_t) +-role dhcpc_roles types dhcpc_t; ++ ++type dhcpc_helper_exec_t; ++init_script_file(dhcpc_helper_exec_t) + + type dhcpc_state_t; + files_type(dhcpc_state_t) +@@ -36,8 +45,12 @@ type ifconfig_exec_t; + init_system_domain(ifconfig_t, ifconfig_exec_t) + role system_r types ifconfig_t; + ++type ifconfig_var_run_t; ++files_pid_file(ifconfig_var_run_t) ++files_mountpoint(ifconfig_var_run_t) ++ + type net_conf_t alias resolv_conf_t; +-files_type(net_conf_t) ++files_config_file(net_conf_t) + + ifdef(`distro_debian',` + init_daemon_run_dir(net_conf_t, "network") +@@ -47,11 +60,11 @@ ifdef(`distro_debian',` + # + # DHCP client local policy + # +-allow dhcpc_t self:capability { dac_override fsetid net_admin net_raw net_bind_service setpcap sys_nice sys_resource sys_tty_config }; +-dontaudit dhcpc_t self:capability { sys_tty_config sys_ptrace }; ++allow dhcpc_t self:capability { dac_read_search dac_override fsetid net_admin net_raw net_bind_service setpcap sys_nice sys_resource sys_tty_config }; ++dontaudit dhcpc_t self:capability sys_tty_config; + # for access("/etc/bashrc", X_OK) on Red Hat + dontaudit dhcpc_t self:capability { dac_read_search sys_module }; +-allow dhcpc_t self:process { getsched getcap setcap setfscreate ptrace signal_perms }; ++allow dhcpc_t self:process { getsched setsched getcap setcap setfscreate signal_perms }; + + allow dhcpc_t self:fifo_file rw_fifo_file_perms; + allow dhcpc_t self:tcp_socket create_stream_socket_perms; +@@ -64,8 +77,11 @@ read_lnk_files_pattern(dhcpc_t, dhcp_etc_t, dhcp_etc_t) + exec_files_pattern(dhcpc_t, dhcp_etc_t, dhcp_etc_t) + + allow dhcpc_t dhcp_state_t:file read_file_perms; ++allow dhcpc_t dhcp_state_t:file relabel_file_perms; ++ + manage_files_pattern(dhcpc_t, dhcpc_state_t, dhcpc_state_t) + filetrans_pattern(dhcpc_t, dhcp_state_t, dhcpc_state_t, file) ++allow dhcpc_t dhcpc_state_t:file { map relabel_file_perms }; + + # create pid file + manage_files_pattern(dhcpc_t, dhcpc_var_run_t, dhcpc_var_run_t) +@@ -74,6 +90,8 @@ files_pid_filetrans(dhcpc_t, dhcpc_var_run_t, { file dir }) + + # Allow read/write to /etc/resolv.conf and /etc/ntp.conf. Note that any files + # in /etc created by dhcpcd will be labelled net_conf_t. ++allow dhcpc_t net_conf_t:file manage_file_perms; ++allow dhcpc_t net_conf_t:file relabel_file_perms; + sysnet_manage_config(dhcpc_t) + files_etc_filetrans(dhcpc_t, net_conf_t, file) + +@@ -95,14 +113,13 @@ kernel_rw_net_sysctls(dhcpc_t) + corecmd_exec_bin(dhcpc_t) + corecmd_exec_shell(dhcpc_t) + +-corenet_all_recvfrom_unlabeled(dhcpc_t) + corenet_all_recvfrom_netlabel(dhcpc_t) +-corenet_tcp_sendrecv_all_if(dhcpc_t) +-corenet_raw_sendrecv_all_if(dhcpc_t) +-corenet_udp_sendrecv_all_if(dhcpc_t) +-corenet_tcp_sendrecv_all_nodes(dhcpc_t) +-corenet_raw_sendrecv_all_nodes(dhcpc_t) +-corenet_udp_sendrecv_all_nodes(dhcpc_t) ++corenet_tcp_sendrecv_generic_if(dhcpc_t) ++corenet_raw_sendrecv_generic_if(dhcpc_t) ++corenet_udp_sendrecv_generic_if(dhcpc_t) ++corenet_tcp_sendrecv_generic_node(dhcpc_t) ++corenet_raw_sendrecv_generic_node(dhcpc_t) ++corenet_udp_sendrecv_generic_node(dhcpc_t) + corenet_tcp_sendrecv_all_ports(dhcpc_t) + corenet_udp_sendrecv_all_ports(dhcpc_t) + corenet_tcp_bind_all_nodes(dhcpc_t) +@@ -112,22 +129,25 @@ corenet_udp_bind_dhcpc_port(dhcpc_t) + corenet_udp_bind_all_unreserved_ports(dhcpc_t) + corenet_tcp_connect_all_ports(dhcpc_t) + corenet_sendrecv_dhcpd_client_packets(dhcpc_t) ++corenet_sendrecv_dhcpc_server_packets(dhcpc_t) + corenet_sendrecv_all_server_packets(dhcpc_t) ++corenet_dontaudit_udp_bind_all_reserved_ports(dhcpc_t) + + dev_read_sysfs(dhcpc_t) + # for SSP: + dev_read_urand(dhcpc_t) + ++domain_obj_id_change_exemption(dhcpc_t) + domain_use_interactive_fds(dhcpc_t) + domain_dontaudit_read_all_domains_state(dhcpc_t) + +-files_read_etc_files(dhcpc_t) + files_read_etc_runtime_files(dhcpc_t) +-files_read_usr_files(dhcpc_t) + files_search_home(dhcpc_t) + files_search_var_lib(dhcpc_t) + files_dontaudit_search_locks(dhcpc_t) + files_getattr_generic_locks(dhcpc_t) ++files_rw_inherited_tmp_file(dhcpc_t) ++files_dontaudit_rw_inherited_locks(dhcpc_t) + + fs_getattr_all_fs(dhcpc_t) + fs_search_auto_mountpoints(dhcpc_t) +@@ -137,15 +157,22 @@ term_dontaudit_use_all_ptys(dhcpc_t) + term_dontaudit_use_unallocated_ttys(dhcpc_t) + term_dontaudit_use_generic_ptys(dhcpc_t) + ++auth_use_nsswitch(dhcpc_t) ++ + init_rw_utmp(dhcpc_t) ++init_stream_connect(dhcpc_t) ++init_stream_send(dhcpc_t) ++ ++libs_exec_ldconfig(dhcpc_t) + + logging_send_syslog_msg(dhcpc_t) + +-miscfiles_read_localization(dhcpc_t) ++miscfiles_read_generic_certs(dhcpc_t) + + modutils_run_insmod(dhcpc_t, dhcpc_roles) + + sysnet_run_ifconfig(dhcpc_t, dhcpc_roles) ++allow dhcpc_t ifconfig_exec_t:file map; + + userdom_use_user_terminals(dhcpc_t) + userdom_dontaudit_search_user_home_dirs(dhcpc_t) +@@ -161,7 +188,21 @@ ifdef(`distro_ubuntu',` + ') + + optional_policy(` +- consoletype_run(dhcpc_t, dhcpc_roles) ++ chronyd_initrc_domtrans(dhcpc_t) ++ chronyd_systemctl(dhcpc_t) ++ chronyd_domtrans(dhcpc_t) ++ chronyd_read_keys(dhcpc_t) ++') ++ ++optional_policy(` ++ cloudform_init_domtrans(dhcpc_t) ++ cloudform_read_lib_files(dhcpc_t) ++ cloudform_read_lib_lnk_files(dhcpc_t) ++') ++ ++optional_policy(` ++ devicekit_dontaudit_rw_log(dhcpc_t) ++ devicekit_dontaudit_read_pid_files(dhcpc_t) + ') + + optional_policy(` +@@ -176,10 +217,7 @@ optional_policy(` + + optional_policy(` + hostname_run(dhcpc_t, dhcpc_roles) +-') +- +-optional_policy(` +- hal_dontaudit_rw_dgram_sockets(dhcpc_t) ++ allow dhcpc_t hostname_exec_t:file map; + ') + + optional_policy(` +@@ -195,23 +233,32 @@ optional_policy(` + optional_policy(` + netutils_run_ping(dhcpc_t, dhcpc_roles) + netutils_run(dhcpc_t, dhcpc_roles) +-',` +- allow dhcpc_t self:capability setuid; +- allow dhcpc_t self:rawip_socket create_socket_perms; ++ allow dhcpc_t netutils_exec_t:file map; + ') + + optional_policy(` ++ networkmanager_domtrans(dhcpc_t) ++ networkmanager_read_pid_files(dhcpc_t) ++ networkmanager_manage_lib(dhcpc_t) ++ networkmanager_stream_connect(dhcpc_t) ++') ++ ++optional_policy(` ++ nis_initrc_domtrans_ypbind(dhcpc_t) + nis_read_ypbind_pid(dhcpc_t) ++ nis_systemctl_ypbind(dhcpc_t) + ') + + optional_policy(` + nscd_initrc_domtrans(dhcpc_t) ++ nscd_systemctl(dhcpc_t) + nscd_domtrans(dhcpc_t) + nscd_read_pid(dhcpc_t) + ') + + optional_policy(` + ntp_initrc_domtrans(dhcpc_t) ++ ntp_systemctl(dhcpc_t) + ') + + optional_policy(` +@@ -221,7 +268,11 @@ optional_policy(` + + optional_policy(` + seutil_sigchld_newrole(dhcpc_t) +- seutil_dontaudit_search_config(dhcpc_t) ++ seutil_domtrans_setfiles(dhcpc_t) ++') ++optional_policy(` ++ systemd_passwd_agent_domtrans(dhcpc_t) ++ systemd_signal_passwd_agent(dhcpc_t) + ') + + optional_policy(` +@@ -232,6 +283,10 @@ optional_policy(` + userdom_use_all_users_fds(dhcpc_t) + ') + ++optional_policy(` ++ virt_manage_pid_files(dhcpc_t) ++') ++ + optional_policy(` + vmware_append_log(dhcpc_t) + ') +@@ -264,32 +319,73 @@ allow ifconfig_t self:msgq create_msgq_perms; + allow ifconfig_t self:msg { send receive }; + # Create UDP sockets, necessary when called from dhcpc + allow ifconfig_t self:udp_socket create_socket_perms; ++allow ifconfig_t self:appletalk_socket create_socket_perms; + # for /sbin/ip + allow ifconfig_t self:packet_socket create_socket_perms; ++allow ifconfig_t self:netlink_socket create_socket_perms; ++allow ifconfig_t self:netlink_generic_socket create_socket_perms; + allow ifconfig_t self:netlink_route_socket create_netlink_socket_perms; + allow ifconfig_t self:netlink_xfrm_socket { create_netlink_socket_perms nlmsg_read }; ++allow ifconfig_t self:tun_socket { relabelfrom relabelto create_socket_perms }; ++ + allow ifconfig_t self:tcp_socket { create ioctl }; + ++can_exec(ifconfig_t, ifconfig_exec_t) ++ ++manage_files_pattern(ifconfig_t, ifconfig_var_run_t, ifconfig_var_run_t) ++manage_lnk_files_pattern(ifconfig_t, ifconfig_var_run_t, ifconfig_var_run_t) ++create_dirs_pattern(ifconfig_t, ifconfig_var_run_t, ifconfig_var_run_t) ++files_pid_filetrans(ifconfig_t, ifconfig_var_run_t, { file dir }) ++allow ifconfig_t ifconfig_var_run_t:file mounton; ++allow ifconfig_t ifconfig_var_run_t:dir mounton; ++ + kernel_use_fds(ifconfig_t) + kernel_read_system_state(ifconfig_t) + kernel_read_network_state(ifconfig_t) + kernel_request_load_module(ifconfig_t) + kernel_search_network_sysctl(ifconfig_t) + kernel_rw_net_sysctls(ifconfig_t) ++kernel_getattr_proc(ifconfig_t) ++kernel_unmount_proc(ifconfig_t) + + corenet_rw_tun_tap_dev(ifconfig_t) + ++corecmd_exec_bin(ifconfig_t) ++corecmd_exec_shell(ifconfig_t) ++ + dev_read_sysfs(ifconfig_t) + # for IPSEC setup: + dev_read_urand(ifconfig_t) ++# needed by tuned ++dev_rw_netcontrol(ifconfig_t) ++dev_mounton_sysfs(ifconfig_t) ++dev_mount_sysfs_fs(ifconfig_t) ++dev_unmount_sysfs_fs(ifconfig_t) ++dev_getattr_sysfs_fs(ifconfig_t) + + domain_use_interactive_fds(ifconfig_t) ++domain_read_all_domains_state(ifconfig_t) ++ ++read_files_pattern(ifconfig_t, dhcpc_state_t, dhcpc_state_t) ++ ++files_dontaudit_rw_inherited_pipes(ifconfig_t) ++files_dontaudit_rw_inherited_locks(ifconfig_t) ++files_dontaudit_read_root_files(ifconfig_t) ++files_rw_inherited_tmp_file(ifconfig_t) ++files_dontaudit_rw_var_files(ifconfig_t) ++ ++files_mounton_rootfs(ifconfig_t) + + files_read_etc_files(ifconfig_t) + files_read_etc_runtime_files(ifconfig_t) ++files_read_usr_files(ifconfig_t) + + fs_getattr_xattr_fs(ifconfig_t) ++fs_unmount_xattr_fs(ifconfig_t) + fs_search_auto_mountpoints(ifconfig_t) ++fs_read_nsfs_files(ifconfig_t) ++fs_mount_nsfs(ifconfig_t) ++fs_unmount_nsfs(ifconfig_t) + + selinux_dontaudit_getattr_fs(ifconfig_t) + +@@ -299,33 +395,51 @@ term_dontaudit_use_all_ptys(ifconfig_t) + term_dontaudit_use_ptmx(ifconfig_t) + term_dontaudit_use_generic_ptys(ifconfig_t) + +-files_dontaudit_read_root_files(ifconfig_t) ++auth_use_nsswitch(ifconfig_t) + + init_use_fds(ifconfig_t) + init_use_script_ptys(ifconfig_t) ++init_rw_inherited_script_tmp_files(ifconfig_t) + + libs_read_lib_files(ifconfig_t) + + logging_send_syslog_msg(ifconfig_t) + +-miscfiles_read_localization(ifconfig_t) +- +-modutils_domtrans_insmod(ifconfig_t) +- + seutil_use_runinit_fds(ifconfig_t) + ++sysnet_dns_name_resolve(ifconfig_t) + sysnet_dontaudit_rw_dhcpc_udp_sockets(ifconfig_t) ++sysnet_filetrans_named_content_ifconfig(ifconfig_t) + +-userdom_use_user_terminals(ifconfig_t) ++userdom_use_inherited_user_terminals(ifconfig_t) + userdom_use_all_users_fds(ifconfig_t) + ++optional_policy(` ++ hostname_exec(ifconfig_t) ++') ++ + ifdef(`distro_ubuntu',` + optional_policy(` + unconfined_domain(ifconfig_t) + ') + ') + ++optional_policy(` ++ brctl_domtrans(ifconfig_t) ++') ++ ++optional_policy(` ++ cfengine_dontaudit_write_log(ifconfig_t) ++') ++ ++optional_policy(` ++ ctdbd_read_lib_files(ifconfig_t) ++') ++ + ifdef(`hide_broken_symptoms',` ++ # caused by some bogus kernel code ++ dontaudit ifconfig_t self:capability sys_module; ++ + optional_policy(` + dev_dontaudit_rw_cardmgr(ifconfig_t) + ') +@@ -336,7 +450,11 @@ ifdef(`hide_broken_symptoms',` + ') + + optional_policy(` +- devicekit_read_pid_files(ifconfig_t) ++ dnsmasq_domtrans(ifconfig_t) ++') ++ ++optional_policy(` ++ devicekit_dontaudit_read_pid_files(ifconfig_t) + ') + + optional_policy(` +@@ -347,10 +465,20 @@ optional_policy(` + optional_policy(` + ipsec_write_pid(ifconfig_t) + ipsec_setcontext_default_spd(ifconfig_t) ++ ipsec_dontaudit_write_log(ifconfig_t) + ') + + optional_policy(` +- nis_use_ypbind(ifconfig_t) ++ kdump_dontaudit_read_config(ifconfig_t) ++ kdump_rw_inherited_kdumpctl_tmp_pipes(ifconfig_t) ++') ++ ++optional_policy(` ++ libs_exec_ldconfig(ifconfig_t) ++') ++ ++optional_policy(` ++ modutils_domtrans_insmod(ifconfig_t) + ') + + optional_policy(` +@@ -371,3 +499,17 @@ optional_policy(` + xen_append_log(ifconfig_t) + xen_dontaudit_rw_unix_stream_sockets(ifconfig_t) + ') ++ ++optional_policy(` ++ iptables_domtrans(ifconfig_t) ++') ++ ++optional_policy(` ++ tlp_manage_pid_files(ifconfig_t) ++') ++ ++optional_policy(` ++ tunable_policy(`dhcpc_exec_iptables',` ++ iptables_domtrans(dhcpc_t) ++ ') ++') +diff --git a/policy/modules/system/systemd.fc b/policy/modules/system/systemd.fc +new file mode 100644 +index 0000000000..67ab548ba0 +--- /dev/null ++++ b/policy/modules/system/systemd.fc +@@ -0,0 +1,71 @@ ++HOME_DIR/\.local/share/systemd(/.*)? gen_context(system_u:object_r:systemd_home_t,s0) ++/root/\.local/share/systemd(/.*)? gen_context(system_u:object_r:systemd_home_t,s0) ++ ++/etc/hostname -- gen_context(system_u:object_r:hostname_etc_t,s0) ++/etc/machine-info -- gen_context(system_u:object_r:hostname_etc_t,s0) ++/etc/udev/.*hwdb.* -- gen_context(system_u:object_r:systemd_hwdb_etc_t,s0) ++ ++/bin/systemd-notify -- gen_context(system_u:object_r:systemd_notify_exec_t,s0) ++/bin/systemctl -- gen_context(system_u:object_r:systemd_systemctl_exec_t,s0) ++/bin/systemd-tty-ask-password-agent -- gen_context(system_u:object_r:systemd_passwd_agent_exec_t,s0) ++/bin/systemd-tmpfiles -- gen_context(system_u:object_r:systemd_tmpfiles_exec_t,s0) ++ ++/usr/bin/systemctl -- gen_context(system_u:object_r:systemd_systemctl_exec_t,s0) ++/usr/bin/systemd-gnome-ask-password-agent -- gen_context(system_u:object_r:systemd_passwd_agent_exec_t,s0) ++/usr/bin/systemd-notify -- gen_context(system_u:object_r:systemd_notify_exec_t,s0) ++/usr/bin/systemd-tmpfiles -- gen_context(system_u:object_r:systemd_tmpfiles_exec_t,s0) ++/usr/bin/systemd-tty-ask-password-agent -- gen_context(system_u:object_r:systemd_passwd_agent_exec_t,s0) ++/usr/bin/systemd-hwdb -- gen_context(system_u:object_r:systemd_hwdb_exec_t,s0) ++ ++/usr/lib/systemd/systemd-bootchart -- gen_context(system_u:object_r:systemd_bootchart_exec_t,s0) ++ ++/usr/lib/systemd/systemd-initctl -- gen_context(system_u:object_r:systemd_initctl_exec_t,s0) ++ ++/usr/lib/systemd/system/systemd-resolved\.service gen_context(system_u:object_r:systemd_resolved_unit_file_t,s0) ++ ++/usr/lib/dracut/modules.d/.*\.service gen_context(system_u:object_r:systemd_unit_file_t,s0) ++/usr/lib/systemd/system(/.*)? gen_context(system_u:object_r:systemd_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-machined\.service gen_context(system_u:object_r:systemd_machined_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-networkd\.service gen_context(system_u:object_r:systemd_networkd_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-vconsole-setup\.service gen_context(system_u:object_r:systemd_vconsole_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-time.*\.service -- gen_context(system_u:object_r:systemd_timedated_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-hwdb.*\.service -- gen_context(system_u:object_r:systemd_hwdb_unit_file_t,s0) ++/usr/lib/systemd/system/systemd-bootchart.*\.service -- gen_context(system_u:object_r:systemd_bootchart_unit_file_t,s0) ++ ++/usr/lib/systemd/system/.*halt.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*hibernate.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*power.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*reboot.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*sleep.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*shutdown.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/system/.*suspend.*\.(service|target) -- gen_context(system_u:object_r:power_unit_file_t,s0) ++/usr/lib/systemd/systemd-hostnamed -- gen_context(system_u:object_r:systemd_hostnamed_exec_t,s0) ++/usr/lib/systemd/systemd-machined -- gen_context(system_u:object_r:systemd_machined_exec_t,s0) ++/usr/lib/systemd/systemd-sysctl -- gen_context(system_u:object_r:systemd_sysctl_exec_t,s0) ++/usr/lib/systemd/systemd-timedated -- gen_context(system_u:object_r:systemd_timedated_exec_t,s0) ++/usr/lib/systemd/systemd-logind -- gen_context(system_u:object_r:systemd_logind_exec_t,s0) ++/usr/lib/systemd/systemd-localed -- gen_context(system_u:object_r:systemd_localed_exec_t,s0) ++/usr/lib/systemd/systemd-logger -- gen_context(system_u:object_r:systemd_logger_exec_t,s0) ++/usr/lib/systemd/systemd-networkd -- gen_context(system_u:object_r:systemd_networkd_exec_t,s0) ++/usr/lib/systemd/systemd-tmpfiles -- gen_context(system_u:object_r:systemd_tmpfiles_exec_t,s0) ++/usr/lib/systemd/systemd-resolve(d|-host) gen_context(system_u:object_r:systemd_resolved_exec_t,s0) ++/var/lib/machines(/.*)? gen_context(system_u:object_r:systemd_machined_var_lib_t,s0) ++ ++/var/lib/systemd/linger(/.*)? gen_context(system_u:object_r:systemd_logind_var_lib_t,mls_systemhigh) ++/var/lib/random-seed gen_context(system_u:object_r:random_seed_t,mls_systemhigh) ++/usr/var/lib/random-seed gen_context(system_u:object_r:random_seed_t,mls_systemhigh) ++ ++/var/run/nologin gen_context(system_u:object_r:systemd_logind_var_run_t,s0) ++/var/run/systemd/seats(/.*)? gen_context(system_u:object_r:systemd_logind_var_run_t,s0) ++/var/run/systemd/sessions(/.*)? gen_context(system_u:object_r:systemd_logind_sessions_t,s0) ++/var/run/systemd/users(/.*)? gen_context(system_u:object_r:systemd_logind_var_run_t,s0) ++/var/run/systemd/inhibit(/.*)? gen_context(system_u:object_r:systemd_logind_inhibit_var_run_t,s0) ++/var/run/systemd/ask-password-block(/.*)? gen_context(system_u:object_r:systemd_passwd_var_run_t,s0) ++/var/run/systemd/ask-password(/.*)? gen_context(system_u:object_r:systemd_passwd_var_run_t,s0) ++/var/run/systemd/machines(/.*)? gen_context(system_u:object_r:systemd_machined_var_run_t,s0) ++/var/run/systemd/netif(/.*)? gen_context(system_u:object_r:systemd_networkd_var_run_t,s0) ++/var/run/systemd/resolve(/.*)? gen_context(system_u:object_r:systemd_resolved_var_run_t,s0) ++ ++/var/run/log/bootchart.* -- gen_context(system_u:object_r:systemd_bootchart_var_run_t,s0) ++ ++/var/run/initramfs(/.*)? <> +diff --git a/policy/modules/system/systemd.if b/policy/modules/system/systemd.if +new file mode 100644 +index 0000000000..d5f2f5b4a9 +--- /dev/null ++++ b/policy/modules/system/systemd.if +@@ -0,0 +1,1803 @@ ++## SELinux policy for systemd components ++ ++###################################### ++## ++## Creates types and rules for a basic ++## systemd domains. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`systemd_domain_template',` ++ gen_require(` ++ attribute systemd_domain; ++ ') ++ ++ type $1_t, systemd_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ kernel_read_system_state($1_t) ++ ++ auth_use_nsswitch($1_t) ++') ++ ++###################################### ++## ++## Create a domain for processes which are started ++## exuting systemctl. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_stub_unit_file',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++') ++ ++####################################### ++## ++## Create a domain for processes which are started ++## exuting systemctl. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_systemctl_domain',` ++ gen_require(` ++ type systemd_systemctl_exec_t; ++ role system_r; ++ attribute systemctl_domain; ++ ') ++ ++ type $1_systemctl_t, systemctl_domain; ++ domain_type($1_systemctl_t) ++ domain_entry_file($1_systemctl_t, systemd_systemctl_exec_t) ++ ++ role system_r types $1_systemctl_t; ++ ++ domtrans_pattern($1_t, systemd_systemctl_exec_t , $1_systemctl_t) ++') ++ ++######################################## ++## ++## Execute systemctl in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_exec_systemctl',` ++ gen_require(` ++ type systemd_systemctl_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, systemd_systemctl_exec_t) ++ ++ fs_list_cgroup_dirs($1) ++ fs_read_cgroup_files($1) ++ systemd_list_unit_dirs($1) ++ init_list_pid_dirs($1) ++ init_read_state($1) ++ init_stream_send($1) ++ init_stream_connect($1) ++ ++ systemd_login_list_pid_dirs($1) ++ systemd_login_read_pid_files($1) ++ systemd_passwd_agent_exec($1) ++ ++ dontaudit $1 self:capability net_admin; ++') ++ ++####################################### ++## ++## Create a file type used for systemd unit files. ++## ++## ++## ++## Type to be used for an unit file. ++## ++## ++# ++interface(`systemd_unit_file',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ typeattribute $1 systemd_unit_file_type; ++ files_type($1) ++') ++ ++###################################### ++## ++## Allow domain to search systemd unit dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_search_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 systemd_unit_file_type:dir search_dir_perms; ++') ++ ++###################################### ++## ++## Allow domain to list systemd unit dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_list_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 systemd_unit_file_type:dir list_dir_perms; ++') ++ ++###################################### ++## ++## Allow domain to list systemd unit dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_create_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 systemd_unit_file_type:dir create; ++') ++ ++##################################### ++## ++## Allow domain to getattr all systemd unit files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_getattr_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ getattr_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++##################################### ++## ++## Allow domain to getattr all systemd unit directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_getattr_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ allow $1 systemd_unit_file_type:dir getattr; ++') ++ ++###################################### ++## ++## Allow domain to read all systemd unit files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_read_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 systemd_unit_file_type:file read_file_perms; ++ allow $1 systemd_unit_file_type:lnk_file read_lnk_file_perms; ++ allow $1 systemd_unit_file_type:dir list_dir_perms; ++') ++ ++##################################### ++## ++## Dontaudit domain to read all systemd unit files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`systemd_dontaudit_read_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ dontaudit $1 systemd_unit_file_type:file read_file_perms; ++') ++ ++###################################### ++## ++## Read systemd_login PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_read_pid_files',` ++ gen_require(` ++ type systemd_logind_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, systemd_logind_var_run_t, systemd_logind_var_run_t) ++') ++ ++###################################### ++## ++## Read systemd_resolved PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_resolved_read_pid',` ++ gen_require(` ++ type systemd_resolved_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, systemd_resolved_var_run_t, systemd_resolved_var_run_t) ++ read_files_pattern($1, systemd_resolved_var_run_t, systemd_resolved_var_run_t) ++') ++ ++###################################### ++## ++## Read systemd_login PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_manage_pid_files',` ++ gen_require(` ++ type systemd_logind_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, systemd_logind_var_run_t, systemd_logind_var_run_t) ++ files_pid_filetrans($1, systemd_logind_var_run_t, file, "nologin") ++') ++ ++###################################### ++## ++## Read systemd_login PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_list_pid_dirs',` ++ gen_require(` ++ type systemd_logind_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, systemd_logind_var_run_t, systemd_logind_var_run_t) ++') ++ ++###################################### ++## ++## Use and and inherited systemd ++## logind file descriptors. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_use_fds_logind',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:fd use; ++') ++ ++######################################## ++## ++## Read the process state (/proc/pid) of systemd_logind_t. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_logind_read_state',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:dir search_dir_perms; ++ allow $1 systemd_logind_t:file read_file_perms; ++ allow $1 systemd_logind_t:lnk_file read_lnk_file_perms; ++') ++ ++###################################### ++## ++## Read logind sessions files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_read_logind_sessions_files',` ++ gen_require(` ++ type systemd_logind_sessions_t; ++ ') ++ ++ init_search_pid_dirs($1) ++ allow $1 systemd_logind_sessions_t:dir list_dir_perms; ++ read_files_pattern($1, systemd_logind_sessions_t, systemd_logind_sessions_t) ++') ++ ++###################################### ++## ++## Write inherited logind sessions pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_write_inherited_logind_sessions_pipes',` ++ gen_require(` ++ type systemd_logind_sessions_t; ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:fd use; ++ allow $1 systemd_logind_sessions_t:fifo_file write; ++') ++ ++###################################### ++## ++## Dontaudit attempts to write inherited logind sessions pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`systemd_dontaudit_write_inherited_logind_sessions_pipes',` ++ gen_require(` ++ type systemd_logind_sessions_t; ++ ') ++ ++ dontaudit $1 systemd_logind_sessions_t:fifo_file write; ++') ++ ++###################################### ++## ++## Write systemd inhibit pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_write_inhibit_pipes',` ++ gen_require(` ++ type systemd_logind_inhibit_var_run_t; ++ ') ++ ++ allow $1 systemd_logind_inhibit_var_run_t:fifo_file write; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## systemd logind over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_dbus_chat_logind',` ++ gen_require(` ++ type systemd_logind_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 systemd_logind_t:dbus send_msg; ++ allow systemd_logind_t $1:dbus send_msg; ++ ps_process_pattern(systemd_logind_t, $1) ++ allow systemd_logind_t $1:process signal; ++ allow $1 systemd_logind_t:fd use; ++') ++ ++####################################### ++## ++## Execute a domain transition to run systemd-sysctl. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_domtrans_sysctl',` ++ gen_require(` ++ type systemd_sysctl_t, systemd_sysctl_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_sysctl_exec_t, systemd_sysctl_t) ++') ++ ++####################################### ++## ++## Allow a domain to execute systemd-sysctl in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_exec_sysctl',` ++ gen_require(` ++ type systemd_sysctl_exec_t; ++ ') ++ ++ can_exec($1,systemd_sysctl_exec_t) ++ ++') ++ ++####################################### ++## ++## Execute a domain transition to run systemd-tmpfiles. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_tmpfiles_domtrans',` ++ gen_require(` ++ type systemd_tmpfiles_t, systemd_tmpfiles_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_tmpfiles_exec_t, systemd_tmpfiles_t) ++') ++ ++####################################### ++## ++## Execute a domain transition to run systemd-localed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_localed_domtrans',` ++ gen_require(` ++ type systemd_localed_t, systemd_localed_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_localed_exec_t, systemd_localed_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run systemd-tty-ask-password-agent. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_passwd_agent_domtrans',` ++ gen_require(` ++ type systemd_passwd_agent_t, systemd_passwd_agent_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_passwd_agent_exec_t, systemd_passwd_agent_t) ++') ++ ++####################################### ++## ++## Execute systemd-tty-ask-password-agent in the caller domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_passwd_agent_exec',` ++ gen_require(` ++ type systemd_passwd_agent_t, systemd_passwd_agent_exec_t; ++ ') ++ ++ can_exec($1, systemd_passwd_agent_exec_t) ++ systemd_manage_passwd_run($1) ++') ++ ++######################################## ++## ++## Execute a domain transition to run systemd_rfkill. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_rfkill_domtrans',` ++ gen_require(` ++ type systemd_rfkill_t, systemd_rfkill_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_rfkill_exec_t, systemd_rfkill_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run systemd_notify. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_notify_domtrans',` ++ gen_require(` ++ type systemd_notify_t, systemd_notify_exec_t; ++ ') ++ ++ domtrans_pattern($1, systemd_notify_exec_t, systemd_notify_t) ++') ++ ++######################################## ++## ++## Execute systemd-tty-ask-password-agent in the systemd_passwd_agent domain, and ++## allow the specified role the systemd_passwd_agent domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the systemd_passwd_agent domain. ++## ++## ++# ++interface(`systemd_passwd_agent_run',` ++ gen_require(` ++ type systemd_passwd_agent_t; ++ ') ++ ++ systemd_passwd_agent_domtrans($1) ++ role $2 types systemd_passwd_agent_t; ++') ++ ++######################################## ++## ++## Execute systemd-tmpfiles in the systemd_tmpfiles_t domain, and ++## allow the specified role the systemd_tmpfiles domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the systemd_tmpfiles domain. ++## ++## ++# ++interface(`systemd_tmpfiles_run',` ++ gen_require(` ++ type systemd_tmpfiles_t; ++ ') ++ ++ systemd_tmpfiles_domtrans($1) ++ role $2 types systemd_tmpfiles_t; ++') ++ ++######################################## ++## ++## Role access for systemd_passwd_agent ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`systemd_passwd_agent_role',` ++ gen_require(` ++ type systemd_passwd_agent_t; ++ ') ++ ++ role $1 types systemd_passwd_agent_t; ++ ++ systemd_passwd_agent_domtrans($2) ++ ++ ps_process_pattern($2, systemd_passwd_agent_t) ++ allow $2 systemd_passwd_agent_t:process signal; ++') ++ ++######################################## ++## ++## Send generic signals to systemd_passwd_agent processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_signal_passwd_agent',` ++ gen_require(` ++ type systemd_passwd_agent_t; ++ ') ++ ++ allow $1 systemd_passwd_agent_t:process signal; ++') ++ ++###################################### ++## ++## Allow to domain to read systemd-passwd pipe ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_read_fifo_file_passwd_run',` ++ gen_require(` ++ type systemd_passwd_var_run_t; ++ ') ++ ++ init_search_pid_dirs($1) ++ read_sock_files_pattern($1, systemd_passwd_var_run_t, systemd_passwd_var_run_t) ++') ++ ++######################################## ++## ++## Relabel to user home directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_relabelto_fifo_file_passwd_run',` ++ gen_require(` ++ type systemd_passwd_var_run_t; ++ ') ++ ++ allow $1 systemd_passwd_var_run_t:fifo_file relabelto; ++') ++ ++####################################### ++## ++## Relabel systemd unit directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_relabel_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ relabel_dirs_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++####################################### ++## ++## Relabel systemd unit files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_relabel_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ relabel_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++####################################### ++## ++## Send generic signals to systemd_passwd_agent processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_passwd_run',` ++ gen_require(` ++ type systemd_passwd_agent_t; ++ type systemd_passwd_var_run_t; ++ ') ++ ++ init_search_pid_dirs($1) ++ manage_files_pattern($1, systemd_passwd_var_run_t, systemd_passwd_var_run_t) ++ manage_sock_files_pattern($1, systemd_passwd_var_run_t, systemd_passwd_var_run_t) ++ manage_fifo_files_pattern($1, systemd_passwd_var_run_t, systemd_passwd_var_run_t) ++ ++ allow systemd_passwd_agent_t $1:process signull; ++ allow systemd_passwd_agent_t $1:unix_dgram_socket sendto; ++') ++ ++###################################### ++## ++## Template for temporary sockets and files in /dev/.systemd/ask-password ++## which are used by systemd-passwd-agent ++## ++## ++## ++## The prefix of the domain (e.g., user ++## is the prefix for user_t). ++## ++## ++# ++interface(`systemd_passwd_agent_dev_template',` ++ gen_require(` ++ type systemd_passwd_agent_t; ++ ') ++ ++ type systemd_$1_device_t; ++ files_type(systemd_$1_device_t) ++ dev_associate(systemd_$1_device_t) ++ ++ dev_filetrans($1_t, systemd_$1_device_t, { file sock_file }) ++ init_pid_filetrans($1_t, systemd_$1_device_t, { file sock_file }) ++ allow $1_t systemd_$1_device_t:file manage_file_perms; ++ allow $1_t systemd_$1_device_t:sock_file manage_sock_file_perms; ++ ++ allow systemd_passwd_agent_t $1_t:process signull; ++ allow systemd_passwd_agent_t $1_t:unix_dgram_socket sendto; ++ allow systemd_passwd_agent_t systemd_$1_device_t:sock_file write; ++ allow systemd_passwd_agent_t systemd_$1_device_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Allow the specified domain to connect to ++## systemd_logger with a unix socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_logger_stream_connect',` ++ gen_require(` ++ type systemd_logger_t; ++ ') ++ ++ allow $1 systemd_logger_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## manage systemd unit dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_unit_dirs',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ manage_dirs_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++######################################## ++## ++## manage systemd unit link files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_unit_symlinks',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ manage_lnk_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++######################################## ++## ++## manage all systemd unit files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_all_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ manage_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++ manage_lnk_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++######################################## ++## ++## manage all systemd unit lnk_files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_all_unit_lnk_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ manage_lnk_files_pattern($1, systemd_unit_file_type, systemd_unit_file_type) ++') ++ ++######################################## ++## ++## Allow the specified domain to start all systemd services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_start_all_services',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ allow $1 systemd_unit_file_type:service start; ++') ++ ++####################################### ++## ++## Allow the specified domain to reload all systemd services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_reload_all_services',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ allow $1 systemd_unit_file_type:service reload; ++') ++ ++######################################## ++## ++## Allow the specified domain to modify the systemd configuration of ++## all systemd services ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_config_all_services',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ allow $1 systemd_unit_file_type:service all_service_perms; ++ init_config_all_script_files($1) ++') ++ ++######################################## ++## ++## Allow the specified domain to start systemd services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_start_systemd_services',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ allow $1 systemd_unit_file_t:service start; ++') ++ ++####################################### ++## ++## Allow the specified domain to reload all systemd services. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_reload_systemd_services',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ allow $1 systemd_unit_file_t:service reload; ++') ++ ++######################################## ++## ++## Allow the specified domain to modify the systemd configuration of ++## all systemd services ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_config_systemd_services',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ allow $1 systemd_unit_file_t:service all_service_perms; ++ init_config_all_script_files($1) ++') ++ ++######################################## ++## ++## manage all systemd random seed file ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_random_seed',` ++ gen_require(` ++ type random_seed_t; ++ ') ++ ++ allow $1 random_seed_t:file manage_file_perms; ++ files_var_lib_filetrans($1, random_seed_t, file, "random_seed") ++') ++ ++######################################## ++## ++## Allow process to read hostname config file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`systemd_hostnamed_read_config',` ++ gen_require(` ++ type hostname_etc_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 hostname_etc_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Allow process to manage hostname config file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`systemd_hostnamed_manage_config',` ++ gen_require(` ++ type hostname_etc_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 hostname_etc_t:file manage_file_perms; ++ files_etc_filetrans($1, hostname_etc_t, file, "hostname") ++') ++ ++####################################### ++## ++## Create objects in /run/systemd/generator directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`systemd_unit_file_filetrans',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ files_search_pids($1) ++ filetrans_pattern($1, systemd_unit_file_t, $2, $3, $4) ++') ++ ++####################################### ++## ++## Create a directory in the /usr/lib/systemd/system directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_create_unit_file_dirs',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ create_dirs_pattern($1, systemd_unit_file_t, systemd_unit_file_t) ++') ++ ++####################################### ++## ++## Create a link in the /usr/lib/systemd/system directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_create_unit_file_lnk',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ create_lnk_files_pattern($1, systemd_unit_file_t, systemd_unit_file_t) ++') ++ ++######################################## ++## ++## Transition to systemd named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_filetrans_named_content',` ++ gen_require(` ++ type systemd_passwd_var_run_t; ++ type systemd_logind_var_run_t; ++ type hostname_etc_t; ++ type systemd_home_t; ++ ') ++ ++ files_pid_filetrans($1, systemd_logind_var_run_t, file, "nologin") ++ init_named_pid_filetrans($1, systemd_passwd_var_run_t, dir, "ask-password-block") ++ init_named_pid_filetrans($1, systemd_passwd_var_run_t, dir, "ask-password") ++ files_etc_filetrans($1, hostname_etc_t, file, "hostname" ) ++ files_etc_filetrans($1, hostname_etc_t, file, "machine-info" ) ++') ++ ++######################################## ++## ++## read systemd homedir content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_read_home_content',` ++ gen_require(` ++ type systemd_home_t; ++ ') ++ ++ optional_policy(` ++ gnome_search_gconf_data_dir($1) ++ ') ++ read_files_pattern($1, systemd_home_t, systemd_home_t) ++ read_lnk_files_pattern($1, systemd_home_t, systemd_home_t) ++') ++ ++######################################## ++## ++## Manage systemd homedir content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_manage_home_content',` ++ gen_require(` ++ type systemd_home_t; ++ ') ++ ++ optional_policy(` ++ gnome_search_gconf_data_dir($1) ++ ') ++ manage_dirs_pattern($1, systemd_home_t, systemd_home_t) ++ manage_files_pattern($1, systemd_home_t, systemd_home_t) ++ manage_lnk_files_pattern($1, systemd_home_t, systemd_home_t) ++ ++ systemd_filetrans_home_content($1) ++') ++ ++######################################## ++## ++## Transition to systemd named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_filetrans_home_content',` ++ gen_require(` ++ type systemd_home_t; ++ ') ++ ++ optional_policy(` ++ gnome_data_filetrans($1, systemd_home_t, dir, "systemd") ++ ') ++') ++ ++######################################## ++## ++## Transition to systemd named content for /etc/hostname ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_filetrans_named_hostname',` ++ gen_require(` ++ type hostname_etc_t; ++ ') ++ ++ files_etc_filetrans($1, hostname_etc_t, file, "hostname" ) ++ files_etc_filetrans($1, hostname_etc_t, file, "machine-info" ) ++') ++ ++######################################## ++## ++## Get the system status information from systemd_login ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_status',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:system status; ++') ++ ++######################################## ++## ++## Send systemd_login a null signal. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_signull',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:process signull; ++') ++ ++######################################## ++## ++## Tell systemd_login to reboot the system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_reboot',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:system reboot; ++') ++ ++######################################## ++## ++## Tell systemd_login to halt the system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_halt',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:system halt; ++') ++ ++######################################## ++## ++## Tell systemd_login to do an unknown access. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_login_undefined',` ++ gen_require(` ++ type systemd_logind_t; ++ ') ++ ++ allow $1 systemd_logind_t:system undefined; ++') ++ ++######################################## ++## ++## Configure generic unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_config_generic_services',` ++ gen_require(` ++ type systemd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 systemd_unit_file_t:file read_file_perms; ++ allow $1 systemd_unit_file_t:service manage_service_perms; ++') ++ ++######################################## ++## ++## Configure power unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_config_power_services',` ++ gen_require(` ++ type power_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 power_unit_file_t:file read_file_perms; ++ allow $1 power_unit_file_t:service manage_service_perms; ++') ++ ++######################################## ++## ++## Start power unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_start_power_services',` ++ gen_require(` ++ type power_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 power_unit_file_t:service start; ++') ++ ++######################################## ++## ++## Status power unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_status_power_services',` ++ gen_require(` ++ type power_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 power_unit_file_t:service status; ++') ++ ++####################################### ++## ++## Start power unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_start_all_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 systemd_unit_file_type:service start; ++') ++ ++####################################### ++## ++## Start power unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`systemd_status_all_unit_files',` ++ gen_require(` ++ attribute systemd_unit_file_type; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 systemd_unit_file_type:service status; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## systemd timedated over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_dbus_chat_timedated',` ++ gen_require(` ++ type systemd_timedated_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 systemd_timedated_t:dbus send_msg; ++ allow systemd_timedated_t $1:dbus send_msg; ++ ps_process_pattern(systemd_timedated_t, $1) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## systemd hostnamed over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_dbus_chat_hostnamed',` ++ gen_require(` ++ type systemd_hostnamed_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 systemd_hostnamed_t:dbus send_msg; ++ allow systemd_hostnamed_t $1:dbus send_msg; ++ ps_process_pattern(systemd_hostnamed_t, $1) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## systemd localed over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_dbus_chat_localed',` ++ gen_require(` ++ type systemd_localed_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 systemd_localed_t:dbus send_msg; ++ allow systemd_localed_t $1:dbus send_msg; ++ ps_process_pattern(systemd_localed_t, $1) ++') ++ ++######################################## ++## ++## Dontaudit attempts to send dbus domains chat messages ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`systemd_dontaudit_dbus_chat',` ++ gen_require(` ++ attribute systemd_domain; ++ class dbus send_msg; ++ ') ++ ++ dontaudit $1 systemd_domain:dbus send_msg; ++') ++ ++###################################### ++## ++## Read systemd-machined PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_read_pid_files',` ++ gen_require(` ++ type systemd_machined_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, systemd_machined_var_run_t, systemd_machined_var_run_t) ++ read_files_pattern($1, systemd_machined_var_run_t, systemd_machined_var_run_t) ++') ++ ++###################################### ++## ++## Manage systemd-machined PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_manage_pid_files',` ++ gen_require(` ++ type systemd_machined_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_dirs_pattern($1, systemd_machined_var_run_t, systemd_machined_var_run_t) ++ manage_files_pattern($1, systemd_machined_var_run_t, systemd_machined_var_run_t) ++') ++ ++###################################### ++## ++## List systemd-machined PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_list_pid_dirs',` ++ gen_require(` ++ type systemd_machined_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, systemd_machined_var_run_t, systemd_machined_var_run_t) ++') ++ ++ ++ ++######################################## ++## ++## Search systemd-machined lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_search_lib',` ++ gen_require(` ++ type systemd_machined_var_lib_t; ++ ') ++ ++ allow $1 systemd_machined_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read systemd-machined lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_read_lib_files',` ++ gen_require(` ++ type systemd_machined_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, systemd_machined_var_lib_t, systemd_machined_var_lib_t) ++') ++ ++######################################## ++## ++## Manage systemd-machined lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_machined_manage_lib_files',` ++ gen_require(` ++ type systemd_machined_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, systemd_machined_var_lib_t, systemd_machined_var_lib_t) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## systemd machined over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_dbus_chat_machined',` ++ gen_require(` ++ type systemd_machined_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 systemd_machined_t:dbus send_msg; ++ allow systemd_machined_t $1:dbus send_msg; ++ ps_process_pattern(systemd_machined_t, $1) ++') ++ ++ ++######################################## ++## ++## Allow process to mmap hwdb config file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`systemd_hwdb_mmap_config',` ++ gen_require(` ++ type systemd_hwdb_etc_t; ++ ') ++ ++ allow $1 systemd_hwdb_etc_t:file map; ++') ++ ++######################################## ++## ++## Allow process to manage hwdb config file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`systemd_hwdb_manage_config',` ++ gen_require(` ++ type systemd_hwdb_etc_t; ++ ') ++ ++ files_search_etc($1) ++ manage_files_pattern($1, systemd_hwdb_etc_t, systemd_hwdb_etc_t) ++ mmap_files_pattern($1, systemd_hwdb_etc_t, systemd_hwdb_etc_t) ++ allow $1 systemd_hwdb_etc_t:file {relabelfrom relabelto}; ++ files_etc_filetrans($1, systemd_hwdb_etc_t, file) ++') ++ ++######################################## ++## ++## Mmap systemd_networkd_exec_t files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`systemd_map_networkd_exec_files',` ++ gen_require(` ++ type systemd_networkd_exec_t; ++ ') ++ ++ allow $1 systemd_networkd_exec_t:file map; ++') ++ ++######################################## ++## ++## Allow process to read hwdb config file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`systemd_hwdb_read_config',` ++ gen_require(` ++ type systemd_hwdb_etc_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 systemd_hwdb_etc_t:file read_file_perms; ++') +\ No newline at end of file +diff --git a/policy/modules/system/systemd.te b/policy/modules/system/systemd.te +new file mode 100644 +index 0000000000..8f02ebe075 +--- /dev/null ++++ b/policy/modules/system/systemd.te +@@ -0,0 +1,925 @@ ++policy_module(systemd, 1.0.0) ++ ++####################################### ++# ++# Declarations ++# ++ ++attribute systemd_unit_file_type; ++attribute systemd_domain; ++attribute systemctl_domain; ++ ++systemd_domain_template(systemd_logger) ++systemd_domain_template(systemd_logind) ++ ++# /run/systemd/sessions ++type systemd_logind_sessions_t; ++files_pid_file(systemd_logind_sessions_t) ++ ++type systemd_logind_var_lib_t; ++files_type(systemd_logind_var_lib_t) ++ ++# /run/systemd/{seats, users} ++type systemd_logind_var_run_t; ++files_pid_file(systemd_logind_var_run_t) ++ ++type systemd_logind_inhibit_var_run_t; ++files_pid_file(systemd_logind_inhibit_var_run_t) ++ ++type systemd_home_t; ++userdom_user_home_content(systemd_home_t) ++ ++type random_seed_t; ++files_security_file(random_seed_t) ++files_mountpoint(random_seed_t) ++ ++systemd_domain_template(systemd_hwdb) ++ ++type systemd_hwdb_unit_file_t; ++systemd_unit_file(systemd_hwdb_unit_file_t) ++ ++systemd_domain_template(systemd_networkd) ++ ++type systemd_networkd_unit_file_t; ++systemd_unit_file(systemd_networkd_unit_file_t) ++ ++type systemd_networkd_var_run_t; ++files_pid_file(systemd_networkd_var_run_t) ++ ++systemd_domain_template(systemd_initctl) ++ ++systemd_domain_template(systemd_bootchart) ++ ++type systemd_bootchart_unit_file_t; ++systemd_unit_file(systemd_bootchart_unit_file_t) ++ ++type systemd_bootchart_var_run_t; ++files_pid_file(systemd_bootchart_var_run_t) ++ ++type systemd_bootchart_tmpfs_t; ++files_tmpfs_file(systemd_bootchart_tmpfs_t) ++ ++systemd_domain_template(systemd_resolved) ++ ++type systemd_resolved_var_run_t; ++files_pid_file(systemd_resolved_var_run_t) ++ ++type systemd_resolved_unit_file_t; ++systemd_unit_file(systemd_resolved_unit_file_t) ++ ++# domain for systemd-tty-ask-password-agent and systemd-gnome-ask-password-agent ++# systemd components ++ ++systemd_domain_template(systemd_passwd_agent) ++ ++type systemd_passwd_var_run_t alias systemd_device_t; ++files_pid_file(systemd_passwd_var_run_t) ++ ++# domain for systemd-tmpfiles component ++systemd_domain_template(systemd_tmpfiles) ++systemd_domain_template(systemd_notify) ++ ++# type for systemd unit files ++type systemd_unit_file_t; ++systemd_unit_file(systemd_unit_file_t) ++ ++type systemd_runtime_unit_file_t; ++systemd_unit_file(systemd_runtime_unit_file_t) ++ ++type power_unit_file_t; ++systemd_unit_file(power_unit_file_t) ++ ++type systemd_vconsole_unit_file_t; ++systemd_unit_file(systemd_vconsole_unit_file_t) ++ ++# executable for systemctl ++type systemd_systemctl_exec_t; ++corecmd_executable_file(systemd_systemctl_exec_t) ++ ++systemd_domain_template(systemd_localed) ++systemd_domain_template(systemd_hostnamed) ++ ++type hostname_etc_t; ++files_config_file(hostname_etc_t) ++ ++type systemd_hwdb_etc_t; ++files_config_file(systemd_hwdb_etc_t) ++ ++systemd_domain_template(systemd_timedated) ++typeattribute systemd_timedated_t systemd_domain; ++typealias systemd_timedated_t alias gnomeclock_t; ++ ++type systemd_timedated_unit_file_t; ++systemd_unit_file(systemd_timedated_unit_file_t) ++ ++systemd_domain_template(systemd_sysctl) ++ ++type systemd_gpt_generator_unit_file_t; ++systemd_unit_file(systemd_gpt_generator_unit_file_t) ++ ++#domain for systemd-machined ++systemd_domain_template(systemd_machined) ++ ++type systemd_machined_unit_file_t; ++systemd_unit_file(systemd_machined_unit_file_t) ++ ++# /run/systemd/machines ++type systemd_machined_var_run_t; ++files_pid_file(systemd_machined_var_run_t) ++ ++# /var/lib/machines ++type systemd_machined_var_lib_t; ++files_type(systemd_machined_var_lib_t) ++ ++####################################### ++# ++# Systemd_logind local policy ++# ++ ++# dac_override is for /run/user/$USER ($USER ownership is $USER:$USER) ++allow systemd_logind_t self:capability { chown kill dac_read_search dac_override fowner sys_tty_config sys_admin }; ++allow systemd_logind_t self:capability2 block_suspend; ++allow systemd_logind_t self:process getcap; ++allow systemd_logind_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow systemd_logind_t self:unix_dgram_socket create_socket_perms; ++ ++mls_file_read_all_levels(systemd_logind_t) ++mls_file_write_all_levels(systemd_logind_t) ++mls_dbus_send_all_levels(systemd_logind_t) ++ ++files_delete_tmpfs_files(systemd_logind_t) ++ ++fs_mount_tmpfs(systemd_logind_t) ++fs_unmount_tmpfs(systemd_logind_t) ++fs_list_tmpfs(systemd_logind_t) ++fs_manage_fusefs_dirs(systemd_logind_t) ++fs_manage_fusefs_files(systemd_logind_t) ++ ++manage_dirs_pattern(systemd_logind_t, systemd_logind_var_lib_t, systemd_logind_var_lib_t) ++manage_files_pattern(systemd_logind_t, systemd_logind_var_lib_t, systemd_logind_var_lib_t) ++init_var_lib_filetrans(systemd_logind_t, systemd_logind_var_lib_t, dir, "linger") ++ ++manage_dirs_pattern(systemd_logind_t, { systemd_logind_sessions_t systemd_logind_var_run_t }, { systemd_logind_sessions_t systemd_logind_var_run_t }) ++manage_files_pattern(systemd_logind_t, { systemd_logind_sessions_t systemd_logind_var_run_t }, { systemd_logind_var_run_t systemd_logind_sessions_t }) ++manage_fifo_files_pattern(systemd_logind_t, systemd_logind_sessions_t, { systemd_logind_sessions_t systemd_logind_var_run_t }) ++init_named_pid_filetrans(systemd_logind_t, systemd_logind_sessions_t, dir, "sessions") ++init_pid_filetrans(systemd_logind_t, systemd_logind_var_run_t, dir) ++files_pid_filetrans(systemd_logind_t, systemd_logind_var_run_t, file, "nologin") ++ ++manage_dirs_pattern(systemd_logind_t, systemd_logind_inhibit_var_run_t, systemd_logind_inhibit_var_run_t) ++manage_files_pattern(systemd_logind_t, systemd_logind_inhibit_var_run_t, systemd_logind_inhibit_var_run_t) ++manage_fifo_files_pattern(systemd_logind_t, systemd_logind_inhibit_var_run_t, systemd_logind_inhibit_var_run_t) ++manage_sock_files_pattern(systemd_logind_t, systemd_logind_inhibit_var_run_t, systemd_logind_inhibit_var_run_t) ++ ++corenet_tcp_bind_dhcpd_port(systemd_logind_t) ++corenet_tcp_bind_pki_ca_port(systemd_logind_t) ++corenet_tcp_bind_flash_port(systemd_logind_t) ++ ++dev_getattr_all_chr_files(systemd_logind_t) ++dev_getattr_all_blk_files(systemd_logind_t) ++dev_rw_sysfs(systemd_logind_t) ++dev_rw_input_dev(systemd_logind_t) ++dev_rw_dri(systemd_logind_t) ++dev_setattr_all_chr_files(systemd_logind_t) ++dev_setattr_dri_dev(systemd_logind_t) ++dev_setattr_generic_usb_dev(systemd_logind_t) ++dev_setattr_input_dev(systemd_logind_t) ++dev_setattr_kvm_dev(systemd_logind_t) ++dev_setattr_mouse_dev(systemd_logind_t) ++dev_setattr_sound_dev(systemd_logind_t) ++dev_setattr_video_dev(systemd_logind_t) ++dev_write_kmsg(systemd_logind_t) ++ ++domain_read_all_domains_state(systemd_logind_t) ++domain_signal_all_domains(systemd_logind_t) ++domain_signull_all_domains(systemd_logind_t) ++domain_kill_all_domains(systemd_logind_t) ++domain_destroy_all_semaphores(systemd_logind_t) ++ ++# /etc/udev/udev.conf should probably have a private type if only for confined administration ++# /etc/nsswitch.conf ++ ++# /sys/fs/cgroup/systemd/user ++fs_manage_cgroup_dirs(systemd_logind_t) ++# write getattr open setattr ++fs_manage_cgroup_files(systemd_logind_t) ++fs_getattr_tmpfs(systemd_logind_t) ++fs_read_tmpfs_symlinks(systemd_logind_t) ++fs_mount_tmpfs(systemd_logind_t) ++userdom_mounton_tmp_dirs(systemd_logind_t) ++ ++storage_setattr_removable_dev(systemd_logind_t) ++storage_setattr_scsi_generic_dev(systemd_logind_t) ++ ++term_use_unallocated_ttys(systemd_logind_t) ++ ++init_named_pid_filetrans(systemd_logind_t, systemd_logind_inhibit_var_run_t, dir, "inhibit") ++ ++init_status(systemd_logind_t) ++init_signal(systemd_logind_t) ++init_reboot(systemd_logind_t) ++init_halt(systemd_logind_t) ++init_undefined(systemd_logind_t) ++init_signal_script(systemd_logind_t) ++ ++getty_systemctl(systemd_logind_t) ++ ++systemd_config_generic_services(systemd_logind_t) ++ ++# /run/user/.* ++# Actually only have proof of it creating dirs and symlinks (/run/user/$USER/X11/display) ++auth_manage_var_auth(systemd_logind_t) ++auth_use_nsswitch(systemd_logind_t) ++ ++authlogin_read_state(systemd_logind_t) ++ ++init_dbus_chat(systemd_logind_t) ++init_dbus_chat_script(systemd_logind_t) ++init_read_script_state(systemd_logind_t) ++init_rw_stream_sockets(systemd_logind_t) ++ ++logging_send_syslog_msg(systemd_logind_t) ++ ++udev_read_db(systemd_logind_t) ++udev_manage_rules_files(systemd_logind_t) ++ ++userdom_destroy_unpriv_user_shared_mem(systemd_logind_t) ++userdom_read_all_users_state(systemd_logind_t) ++userdom_use_user_ttys(systemd_logind_t) ++userdom_manage_tmp_role(system_r, systemd_logind_t) ++userdom_manage_tmpfs_role(system_r, systemd_logind_t) ++ ++xserver_dbus_chat(systemd_logind_t) ++ ++optional_policy(` ++ apache_read_tmp_files(systemd_logind_t) ++') ++ ++optional_policy(` ++ cron_dbus_chat_crond(systemd_logind_t) ++ cron_read_state_crond(systemd_logind_t) ++') ++ ++optional_policy(` ++ dbus_connect_system_bus(systemd_logind_t) ++ dbus_system_bus_client(systemd_logind_t) ++') ++ ++optional_policy(` ++ devicekit_dbus_chat_power(systemd_logind_t) ++ devicekit_dbus_chat_disk(systemd_logind_t) ++') ++ ++optional_policy(` ++ # we label /run/user/$USER/dconf as config_home_t ++ gnome_manage_home_config_dirs(systemd_logind_t) ++ gnome_manage_home_config(systemd_logind_t) ++ gnome_manage_gkeyringd_tmp_dirs(systemd_logind_t) ++ gnome_manage_gstreamer_home_dirs(systemd_logind_t) ++') ++ ++optional_policy(` ++ nis_use_ypbind(systemd_logind_t) ++') ++ ++optional_policy(` ++ rpm_dbus_chat(systemd_logind_t) ++') ++ ++optional_policy(` ++ # It links /run/user/$USER/X11/display to /tmp/.X11-unix/X* sock_file ++ xserver_search_xdm_tmp_dirs(systemd_logind_t) ++') ++ ++######################################## ++# ++# systemd_machined local policy ++# ++ ++allow systemd_machined_t self:capability { dac_read_search dac_override setgid sys_admin sys_chroot sys_ptrace }; ++allow systemd_machined_t systemd_unit_file_t:service { status start }; ++allow systemd_machined_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) ++manage_files_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) ++manage_lnk_files_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) ++init_pid_filetrans(systemd_machined_t, systemd_machined_var_run_t, dir, "machines") ++ ++manage_dirs_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) ++manage_files_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) ++manage_lnk_files_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) ++init_var_lib_filetrans(systemd_machined_t, systemd_machined_var_lib_t, dir, "machines") ++ ++kernel_dgram_send(systemd_machined_t) ++# This is a bug, but need for now. ++kernel_read_unlabeled_state(systemd_machined_t) ++ ++init_dbus_chat(systemd_machined_t) ++init_status(systemd_machined_t) ++ ++userdom_dbus_send_all_users(systemd_machined_t) ++ ++term_use_ptmx(systemd_machined_t) ++ ++optional_policy(` ++ dbus_connect_system_bus(systemd_machined_t) ++ dbus_system_bus_client(systemd_machined_t) ++') ++ ++optional_policy(` ++ container_read_share_files(systemd_machined_t) ++ container_spc_read_state(systemd_machined_t) ++') ++ ++optional_policy(` ++ virt_dbus_chat(systemd_machined_t) ++ virt_sandbox_read_state(systemd_machined_t) ++ virt_signal_sandbox(systemd_machined_t) ++ virt_stream_connect_sandbox(systemd_machined_t) ++ virt_rw_svirt_dev(systemd_machined_t) ++ virt_getattr_sandbox_filesystem(systemd_machined_t) ++ virt_read_sandbox_files(systemd_machined_t) ++') ++ ++####################################### ++# ++# systemd-networkd local policy ++# ++ ++allow systemd_networkd_t self:capability { dac_read_search dac_override net_admin net_raw setuid fowner chown setgid setpcap }; ++allow systemd_networkd_t self:process { getcap setcap }; ++ ++allow systemd_networkd_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow systemd_networkd_t self:netlink_route_socket { create_socket_perms nlmsg_read nlmsg_write }; ++allow systemd_networkd_t self:unix_dgram_socket create_socket_perms; ++allow systemd_networkd_t self:packet_socket create_socket_perms; ++allow systemd_networkd_t self:udp_socket create_socket_perms; ++allow systemd_networkd_t self:rawip_socket create_socket_perms; ++allow systemd_networkd_t self:tun_socket { relabelfrom relabelto create_socket_perms }; ++ ++manage_files_pattern(systemd_networkd_t, systemd_networkd_var_run_t, systemd_networkd_var_run_t) ++manage_lnk_files_pattern(systemd_networkd_t, systemd_networkd_var_run_t, systemd_networkd_var_run_t) ++manage_dirs_pattern(systemd_networkd_t, systemd_networkd_var_run_t, systemd_networkd_var_run_t) ++ ++kernel_dgram_send(systemd_networkd_t) ++kernel_request_load_module(systemd_networkd_t) ++kernel_rw_net_sysctls(systemd_networkd_t) ++ ++corenet_rw_tun_tap_dev(systemd_networkd_t) ++corenet_tcp_bind_all_nodes(systemd_networkd_t) ++corenet_udp_bind_all_nodes(systemd_networkd_t) ++corenet_tcp_bind_dhcpc_port(systemd_networkd_t) ++corenet_udp_bind_dhcpc_port(systemd_networkd_t) ++ ++dev_read_sysfs(systemd_networkd_t) ++dev_write_kmsg(systemd_networkd_t) ++ ++auth_use_nsswitch(systemd_networkd_t) ++ ++logging_send_syslog_msg(systemd_networkd_t) ++ ++sysnet_manage_config(systemd_networkd_t) ++sysnet_manage_config_dirs(systemd_networkd_t) ++ ++init_named_pid_filetrans(systemd_logind_t, systemd_networkd_var_run_t, dir, "netif") ++ ++optional_policy(` ++ dbus_system_bus_client(systemd_networkd_t) ++ dbus_connect_system_bus(systemd_networkd_t) ++') ++ ++optional_policy(` ++ udev_read_db(systemd_networkd_t) ++') ++ ++optional_policy(` ++ unconfined_dbus_send(systemd_networkd_t) ++') ++ ++####################################### ++# ++# Local policy ++# ++ ++allow systemd_passwd_agent_t self:capability { chown sys_tty_config dac_read_search dac_override }; ++allow systemd_passwd_agent_t self:process { setsockcreate }; ++allow systemd_passwd_agent_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(systemd_passwd_agent_t, systemd_passwd_var_run_t, systemd_passwd_var_run_t); ++manage_files_pattern(systemd_passwd_agent_t, systemd_passwd_var_run_t, systemd_passwd_var_run_t); ++manage_sock_files_pattern(systemd_passwd_agent_t, systemd_passwd_var_run_t, systemd_passwd_var_run_t); ++manage_fifo_files_pattern(systemd_passwd_agent_t, systemd_passwd_var_run_t, systemd_passwd_var_run_t); ++init_pid_filetrans(systemd_passwd_agent_t, systemd_passwd_var_run_t, { dir fifo_file file }) ++ ++domain_read_all_domains_state(systemd_passwd_agent_t) ++ ++kernel_stream_connect(systemd_passwd_agent_t) ++ ++dev_create_generic_dirs(systemd_passwd_agent_t) ++dev_read_generic_files(systemd_passwd_agent_t) ++dev_write_generic_sock_files(systemd_passwd_agent_t) ++dev_write_kmsg(systemd_passwd_agent_t) ++ ++term_read_console(systemd_passwd_agent_t) ++ ++auth_use_nsswitch(systemd_passwd_agent_t) ++ ++init_create_pid_dirs(systemd_passwd_agent_t) ++init_rw_pipes(systemd_passwd_agent_t) ++init_read_utmp(systemd_passwd_agent_t) ++init_stream_connect(systemd_passwd_agent_t) ++ ++logging_send_syslog_msg(systemd_passwd_agent_t) ++ ++userdom_use_user_ptys(systemd_passwd_agent_t) ++userdom_use_user_ttys(systemd_passwd_agent_t) ++ ++optional_policy(` ++ lvm_signull(systemd_passwd_agent_t) ++') ++ ++optional_policy(` ++ plymouthd_stream_connect(systemd_passwd_agent_t) ++') ++ ++####################################### ++# ++# Local policy ++# ++ ++allow systemd_tmpfiles_t self:capability { chown dac_read_search dac_override fsetid fowner mknod }; ++allow systemd_tmpfiles_t self:process { setfscreate }; ++ ++allow systemd_tmpfiles_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_read_network_state(systemd_tmpfiles_t) ++kernel_request_load_module(systemd_tmpfiles_t) ++kernel_relabelto_usermodehelper(systemd_tmpfiles_t) ++kernel_relabelfrom_usermodehelper(systemd_tmpfiles_t) ++ ++ ++dev_write_kmsg(systemd_tmpfiles_t) ++dev_rw_sysfs(systemd_tmpfiles_t) ++dev_relabel_all_sysfs(systemd_tmpfiles_t) ++dev_relabel_cpu_online(systemd_tmpfiles_t) ++dev_read_cpu_online(systemd_tmpfiles_t) ++dev_manage_all_dev_nodes(systemd_tmpfiles_t) ++dev_relabel_all_dev_nodes(systemd_tmpfiles_t) ++ ++domain_obj_id_change_exemption(systemd_tmpfiles_t) ++ ++# systemd-tmpfiles relabel /run/lock and creates /run/lock/lockdev ++fs_manage_tmpfs_dirs(systemd_tmpfiles_t) ++fs_relabel_tmpfs_dirs(systemd_tmpfiles_t) ++fs_list_all(systemd_tmpfiles_t) ++ ++files_manage_non_auth_files(systemd_tmpfiles_t) ++files_relabel_non_auth_files(systemd_tmpfiles_t) ++files_list_lost_found(systemd_tmpfiles_t) ++files_map_system_db_files(systemd_tmpfiles_t) ++ ++mls_file_read_all_levels(systemd_tmpfiles_t) ++mls_file_write_all_levels(systemd_tmpfiles_t) ++mls_file_upgrade(systemd_tmpfiles_t) ++ ++selinux_get_enforce_mode(systemd_tmpfiles_t) ++selinux_setcheckreqprot(systemd_tmpfiles_t) ++ ++auth_manage_faillog(systemd_tmpfiles_t) ++auth_relabel_faillog(systemd_tmpfiles_t) ++auth_manage_var_auth(systemd_tmpfiles_t) ++auth_manage_login_records(systemd_tmpfiles_t) ++auth_relabel_var_auth_dirs(systemd_tmpfiles_t) ++auth_relabel_login_records(systemd_tmpfiles_t) ++auth_setattr_login_records(systemd_tmpfiles_t) ++auth_use_nsswitch(systemd_tmpfiles_t) ++ ++init_dgram_send(systemd_tmpfiles_t) ++init_rw_stream_sockets(systemd_tmpfiles_t) ++ ++logging_create_devlog_dev(systemd_tmpfiles_t) ++logging_send_syslog_msg(systemd_tmpfiles_t) ++logging_setattr_all_log_dirs(systemd_tmpfiles_t) ++logging_relabel_all_log_dirs(systemd_tmpfiles_t) ++ ++miscfiles_filetrans_named_content(systemd_tmpfiles_t) ++miscfiles_manage_man_pages(systemd_tmpfiles_t) ++miscfiles_relabel_man_pages(systemd_tmpfiles_t) ++miscfiles_delete_man_pages(systemd_tmpfiles_t) ++ ++ifdef(`distro_redhat',` ++ userdom_list_user_home_content(systemd_tmpfiles_t) ++ userdom_delete_all_user_home_content_dirs(systemd_tmpfiles_t) ++ userdom_delete_all_user_home_content_files(systemd_tmpfiles_t) ++ userdom_delete_all_user_home_content_sock_files(systemd_tmpfiles_t) ++ userdom_delete_all_user_home_content_symlinks(systemd_tmpfiles_t) ++ userdom_delete_admin_home_files(systemd_tmpfiles_t) ++') ++ ++optional_policy(` ++ apache_delete_sys_content_rw(systemd_tmpfiles_t) ++ apache_list_cache(systemd_tmpfiles_t) ++ apache_delete_cache_dirs(systemd_tmpfiles_t) ++ apache_delete_cache_files(systemd_tmpfiles_t) ++ apache_setattr_cache_dirs(systemd_tmpfiles_t) ++') ++ ++ ++optional_policy(` ++ auth_rw_login_records(systemd_tmpfiles_t) ++') ++ ++optional_policy(` ++ # we have /run/user/$USER/dconf ++ gnome_delete_home_config(systemd_tmpfiles_t) ++ gnome_delete_home_config_dirs(systemd_tmpfiles_t) ++ gnome_setattr_home_config_dirs(systemd_tmpfiles_t) ++') ++ ++optional_policy(` ++ lpd_manage_spool(systemd_tmpfiles_t) ++ lpd_relabel_spool(systemd_tmpfiles_t) ++') ++ ++optional_policy(` ++ rpm_read_db(systemd_tmpfiles_t) ++ rpm_delete_db(systemd_tmpfiles_t) ++') ++ ++optional_policy(` ++ sandbox_list(systemd_tmpfiles_t) ++ sandbox_delete_dirs(systemd_tmpfiles_t) ++ sandbox_delete_files(systemd_tmpfiles_t) ++ sandbox_delete_lnk_files(systemd_tmpfiles_t) ++ sandbox_delete_pipes(systemd_tmpfiles_t) ++ sandbox_delete_sock_files(systemd_tmpfiles_t) ++ sandbox_setattr_dirs(systemd_tmpfiles_t) ++') ++ ++######################################## ++# ++# systemd_notify local policy ++# ++allow systemd_notify_t self:capability chown; ++allow systemd_notify_t self:process { fork setfscreate setsockcreate }; ++ ++allow systemd_notify_t self:fifo_file rw_fifo_file_perms; ++allow systemd_notify_t self:unix_stream_socket create_stream_socket_perms; ++allow systemd_notify_t self:unix_dgram_socket create_socket_perms; ++ ++dev_write_kmsg(systemd_notify_t) ++ ++domain_use_interactive_fds(systemd_notify_t) ++ ++fs_getattr_cgroup_files(systemd_notify_t) ++ ++auth_use_nsswitch(systemd_notify_t) ++ ++init_rw_stream_sockets(systemd_notify_t) ++ ++optional_policy(` ++ rhcs_read_log_cluster(systemd_notify_t) ++') ++ ++optional_policy(` ++ readahead_manage_pid_files(systemd_notify_t) ++') ++ ++######################################## ++# ++# systemd_logger local policy ++# ++ ++allow systemd_logger_t self:capability { sys_admin chown kill }; ++allow systemd_logger_t self:process { fork setfscreate setsockcreate }; ++ ++allow systemd_logger_t self:fifo_file rw_fifo_file_perms; ++allow systemd_logger_t self:unix_stream_socket create_stream_socket_perms; ++ ++kernel_use_fds(systemd_logger_t) ++ ++dev_write_kmsg(systemd_logger_t) ++ ++domain_use_interactive_fds(systemd_logger_t) ++ ++# only needs write ++term_use_generic_ptys(systemd_logger_t) ++ ++auth_use_nsswitch(systemd_logger_t) ++ ++# /run/systemd/notify ++init_write_pid_socket(systemd_logger_t) ++ ++logging_send_syslog_msg(systemd_logger_t) ++ ++######################################## ++# ++# systemd_sysctl domains local policy ++# ++ ++allow systemctl_domain systemd_unit_file_type:dir search_dir_perms; ++ ++fs_list_cgroup_dirs(systemctl_domain) ++fs_read_cgroup_files(systemctl_domain) ++ ++# needed by systemctl ++init_dgram_send(systemctl_domain) ++init_stream_connect(systemctl_domain) ++init_read_state(systemctl_domain) ++init_list_pid_dirs(systemctl_domain) ++init_use_fds(systemctl_domain) ++ ++####################################### ++# ++# Localed policy ++# ++allow systemd_localed_t self:process setfscreate; ++allow systemd_localed_t self:fifo_file rw_fifo_file_perms; ++allow systemd_localed_t self:unix_stream_socket create_stream_socket_perms; ++allow systemd_localed_t self:unix_dgram_socket create_socket_perms; ++ ++dev_write_kmsg(systemd_localed_t) ++ ++init_dbus_chat(systemd_localed_t) ++init_reload_services(systemd_localed_t) ++ ++logging_stream_connect_syslog(systemd_localed_t) ++logging_send_syslog_msg(systemd_localed_t) ++ ++allow systemd_localed_t systemd_vconsole_unit_file_t:service start; ++ ++miscfiles_manage_localization(systemd_localed_t) ++miscfiles_etc_filetrans_localization(systemd_localed_t) ++ ++userdom_dbus_send_all_users(systemd_localed_t) ++ ++xserver_manage_config(systemd_localed_t) ++ ++optional_policy(` ++ dbus_connect_system_bus(systemd_localed_t) ++ dbus_system_bus_client(systemd_localed_t) ++') ++ ++####################################### ++# ++# Hostnamed policy ++# ++allow systemd_hostnamed_t self:capability sys_admin; ++dontaudit systemd_hostnamed_t self:capability sys_ptrace; ++ ++allow systemd_hostnamed_t self:fifo_file rw_fifo_file_perms; ++allow systemd_hostnamed_t self:unix_stream_socket create_stream_socket_perms; ++allow systemd_hostnamed_t self:unix_dgram_socket create_socket_perms; ++ ++manage_files_pattern(systemd_hostnamed_t, hostname_etc_t, hostname_etc_t) ++manage_lnk_files_pattern(systemd_hostnamed_t, hostname_etc_t, hostname_etc_t) ++files_etc_filetrans(systemd_hostnamed_t, hostname_etc_t, file, "hostname" ) ++files_etc_filetrans(systemd_hostnamed_t, hostname_etc_t, file, "machine-info" ) ++ ++kernel_dgram_send(systemd_hostnamed_t) ++kernel_read_xen_state(systemd_hostnamed_t) ++kernel_read_sysctl(systemd_hostnamed_t) ++ ++dev_write_kmsg(systemd_hostnamed_t) ++dev_read_sysfs(systemd_hostnamed_t) ++ ++init_status(systemd_hostnamed_t) ++init_stream_connect(systemd_hostnamed_t) ++ ++logging_send_syslog_msg(systemd_hostnamed_t) ++ ++userdom_read_all_users_state(systemd_hostnamed_t) ++userdom_dbus_send_all_users(systemd_hostnamed_t) ++ ++optional_policy(` ++ dbus_system_bus_client(systemd_hostnamed_t) ++ dbus_connect_system_bus(systemd_hostnamed_t) ++') ++ ++####################################### ++# ++# Timedated policy ++# ++ ++allow systemd_timedated_t self:capability { sys_nice sys_time dac_read_search dac_override }; ++allow systemd_timedated_t self:process { getattr getsched setfscreate }; ++allow systemd_timedated_t self:fifo_file rw_fifo_file_perms; ++allow systemd_timedated_t self:unix_stream_socket create_stream_socket_perms; ++allow systemd_timedated_t self:unix_dgram_socket create_socket_perms; ++ ++allow systemd_timedated_t systemd_timedated_unit_file_t:service manage_service_perms; ++ ++corecmd_exec_bin(systemd_timedated_t) ++corecmd_exec_shell(systemd_timedated_t) ++corecmd_dontaudit_access_check_bin(systemd_timedated_t) ++ ++corenet_tcp_connect_time_port(systemd_timedated_t) ++ ++dev_rw_realtime_clock(systemd_timedated_t) ++dev_write_kmsg(systemd_timedated_t) ++dev_read_sysfs(systemd_timedated_t) ++ ++fs_getattr_xattr_fs(systemd_timedated_t) ++ ++auth_use_nsswitch(systemd_timedated_t) ++ ++init_dbus_chat(systemd_timedated_t) ++init_status(systemd_timedated_t) ++ ++logging_send_syslog_msg(systemd_timedated_t) ++ ++miscfiles_manage_localization(systemd_timedated_t) ++miscfiles_etc_filetrans_localization(systemd_timedated_t) ++ ++userdom_read_all_users_state(systemd_timedated_t) ++ ++optional_policy(` ++ chronyd_systemctl(systemd_timedated_t) ++') ++ ++optional_policy(` ++ clock_manage_adjtime(systemd_timedated_t) ++ clock_filetrans_named_content(systemd_timedated_t) ++ clock_domtrans(systemd_timedated_t) ++') ++ ++optional_policy(` ++ consolekit_dbus_chat(systemd_timedated_t) ++') ++ ++optional_policy(` ++ consoletype_exec(systemd_timedated_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(systemd_timedated_t) ++ dbus_connect_system_bus(systemd_timedated_t) ++') ++ ++optional_policy(` ++ gnome_manage_usr_config(systemd_timedated_t) ++ gnome_manage_home_config(systemd_timedated_t) ++ gnome_manage_home_config_dirs(systemd_timedated_t) ++') ++ ++optional_policy(` ++ ntp_domtrans_ntpdate(systemd_timedated_t) ++ ntp_initrc_domtrans(systemd_timedated_t) ++ init_dontaudit_getattr_all_script_files(systemd_timedated_t) ++ init_dontaudit_getattr_exec(systemd_timedated_t) ++ ntp_systemctl(systemd_timedated_t) ++') ++ ++optional_policy(` ++ policykit_domtrans_auth(systemd_timedated_t) ++ policykit_read_lib(systemd_timedated_t) ++ policykit_read_reload(systemd_timedated_t) ++') ++ ++optional_policy(` ++ xserver_manage_config(systemd_timedated_t) ++ xserver_read_state_xdm(systemd_timedated_t) ++') ++ ++######################################## ++# ++# systemd_sysctl domains local policy ++# ++allow systemd_sysctl_t self:capability { net_admin sys_admin sys_ptrace sys_rawio sys_resource }; ++allow systemd_sysctl_t self:unix_dgram_socket create_socket_perms; ++kernel_dgram_send(systemd_sysctl_t) ++kernel_request_load_module(systemd_sysctl_t) ++kernel_rw_all_sysctls(systemd_sysctl_t) ++kernel_write_security_state(systemd_sysctl_t) ++ ++files_read_system_conf_files(systemd_sysctl_t) ++ ++dev_write_kmsg(systemd_sysctl_t) ++ ++domain_use_interactive_fds(systemd_sysctl_t) ++ ++init_stream_connect(systemd_sysctl_t) ++ ++logging_send_syslog_msg(systemd_sysctl_t) ++ ++ ++####################################### ++# ++# systemd_hwdb domain ++# ++ ++manage_files_pattern(systemd_hwdb_t, systemd_hwdb_etc_t, systemd_hwdb_etc_t) ++allow systemd_hwdb_t systemd_hwdb_etc_t:file {relabelfrom relabelto}; ++files_etc_filetrans(systemd_hwdb_t, systemd_hwdb_etc_t, file) ++ ++####################################### ++# ++# systemd_resolved domain ++# ++ ++allow systemd_resolved_t self:capability { chown setgid setpcap setuid }; ++allow systemd_resolved_t self:process setcap; ++allow systemd_resolved_t self:tcp_socket { accept listen }; ++allow systemd_resolved_t self:unix_dgram_socket create_socket_perms; ++allow systemd_resolved_t self:netlink_route_socket create_socket_perms; ++ ++manage_dirs_pattern(systemd_resolved_t, systemd_resolved_var_run_t, systemd_resolved_var_run_t) ++manage_files_pattern(systemd_resolved_t, systemd_resolved_var_run_t, systemd_resolved_var_run_t) ++init_pid_filetrans(systemd_resolved_t, systemd_resolved_var_run_t, dir) ++ ++list_dirs_pattern(systemd_resolved_t, systemd_networkd_var_run_t, systemd_networkd_var_run_t) ++read_files_pattern(systemd_resolved_t, systemd_networkd_var_run_t, systemd_networkd_var_run_t) ++ ++kernel_dgram_send(systemd_resolved_t) ++kernel_read_net_sysctls(systemd_resolved_t) ++ ++auth_read_passwd(systemd_resolved_t) ++ ++corenet_tcp_bind_llmnr_port(systemd_resolved_t) ++corenet_udp_bind_llmnr_port(systemd_resolved_t) ++ ++dev_write_kmsg(systemd_resolved_t) ++dev_read_sysfs(systemd_resolved_t) ++ ++sysnet_manage_config(systemd_resolved_t) ++ ++userdom_dbus_send_all_users(systemd_resolved_t) ++ ++optional_policy(` ++ dbus_system_bus_client(systemd_resolved_t) ++ dbus_connect_system_bus(systemd_resolved_t) ++') ++ ++optional_policy(` ++ networkmanager_dbus_chat(systemd_resolved_t) ++') ++ ++######################################## ++# ++# Common rules for systemd domains ++# ++allow systemd_domain self:process { setfscreate signal_perms }; ++dontaudit systemd_domain self:capability net_admin; ++ ++dev_read_urand(systemd_domain) ++ ++fs_search_all(systemd_domain) ++ ++files_read_etc_files(systemd_domain) ++files_read_etc_runtime_files(systemd_domain) ++files_read_usr_files(systemd_domain) ++ ++init_search_pid_dirs(systemd_domain) ++init_start_transient_unit(systemd_domain) ++init_stop_transient_unit(systemd_domain) ++init_status_transient_unit(systemd_domain) ++init_reload_transient_unit(systemd_domain) ++init_read_state(systemd_domain) ++ ++logging_stream_connect_syslog(systemd_domain) ++ ++seutil_read_config(systemd_domain) ++seutil_read_file_contexts(systemd_domain) ++ ++optional_policy(` ++ lvm_read_state(systemd_domain) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(systemd_domain) ++') ++ ++read_files_pattern(systemd_domain, systemd_home_t, systemd_home_t) ++read_lnk_files_pattern(systemd_domain, systemd_home_t, systemd_home_t) ++ ++ ++####################################### ++# ++# systemd_modules_load domain ++# ++ ++allow systemd_bootchart_t self:capability2 wake_alarm; ++allow systemd_bootchart_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_dgram_send(systemd_bootchart_t) ++kernel_rw_kernel_sysctl(systemd_bootchart_t) ++dev_list_sysfs(systemd_bootchart_t) ++ ++domain_read_all_domains_state(systemd_bootchart_t) ++ ++manage_files_pattern(systemd_bootchart_t, systemd_bootchart_var_run_t, systemd_bootchart_var_run_t) ++logging_syslogd_pid_filetrans(systemd_bootchart_t, systemd_bootchart_var_run_t, file) ++ ++manage_files_pattern(systemd_bootchart_t, systemd_bootchart_tmpfs_t, systemd_bootchart_tmpfs_t) ++fs_tmpfs_filetrans(systemd_bootchart_t, systemd_bootchart_tmpfs_t, file ) ++ ++####################################### ++# ++# systemd_modules_load domain ++# ++allow systemd_initctl_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_dgram_send(systemd_initctl_t) ++ ++init_rw_initctl(systemd_initctl_t) ++init_stream_connectto(systemd_initctl_t) +diff --git a/policy/modules/system/udev.fc b/policy/modules/system/udev.fc +index f41857e09b..49fd32e17b 100644 +--- a/policy/modules/system/udev.fc ++++ b/policy/modules/system/udev.fc +@@ -1,6 +1,8 @@ +-/dev/\.udev(/.*)? -- gen_context(system_u:object_r:udev_tbl_t,s0) +-/dev/\.udevdb -- gen_context(system_u:object_r:udev_tbl_t,s0) +-/dev/udev\.tbl -- gen_context(system_u:object_r:udev_tbl_t,s0) ++/bin/udevadm -- gen_context(system_u:object_r:udev_exec_t,s0) ++ ++/dev/\.udev(/.*)? -- gen_context(system_u:object_r:udev_var_run_t,s0) ++/dev/\.udevdb -- gen_context(system_u:object_r:udev_var_run_t,s0) ++/dev/udev\.tbl -- gen_context(system_u:object_r:udev_var_run_t,s0) + + /etc/dev\.d/.+ -- gen_context(system_u:object_r:udev_helper_exec_t,s0) + +@@ -10,6 +12,7 @@ + /etc/udev/scripts/.+ -- gen_context(system_u:object_r:udev_helper_exec_t,s0) + + /lib/udev/udev-acl -- gen_context(system_u:object_r:udev_exec_t,s0) ++/lib/udev/udevd -- gen_context(system_u:object_r:udev_exec_t,s0) + + ifdef(`distro_debian',` + /lib/udev/create_static_nodes -- gen_context(system_u:object_r:udev_exec_t,s0) +@@ -27,11 +30,23 @@ ifdef(`distro_redhat',` + ') + + /usr/bin/udevinfo -- gen_context(system_u:object_r:udev_exec_t,s0) +- +-/usr/lib/systemd/systemd-udevd -- gen_context(system_u:object_r:udev_exec_t,s0) +- +-/var/run/PackageKit/udev(/.*)? gen_context(system_u:object_r:udev_var_run_t,s0) +-/var/run/udev(/.*)? gen_context(system_u:object_r:udev_var_run_t,s0) ++/usr/bin/udevadm -- gen_context(system_u:object_r:udev_exec_t,s0) ++ ++/usr/sbin/start_udev -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/udev -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/udevadm -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/udevd -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/udevsend -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/udevstart -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/sbin/wait_for_sysfs -- gen_context(system_u:object_r:udev_exec_t,s0) ++ ++/usr/lib/systemd/systemd-udevd -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/lib/udev/udev-acl -- gen_context(system_u:object_r:udev_exec_t,s0) ++/usr/lib/udev/udevd -- gen_context(system_u:object_r:udev_exec_t,s0) ++ ++/var/run/PackageKit/udev(/.*)? gen_context(system_u:object_r:udev_var_run_t,s0) ++/var/run/libgpod(/.*)? gen_context(system_u:object_r:udev_var_run_t,s0) ++/var/run/udev(/.*)? gen_context(system_u:object_r:udev_var_run_t,s0) + + ifdef(`distro_debian',` + /var/run/xen-hotplug -d gen_context(system_u:object_r:udev_var_run_t,s0) +diff --git a/policy/modules/system/udev.if b/policy/modules/system/udev.if +index 9a1650d37b..d7e8a01932 100644 +--- a/policy/modules/system/udev.if ++++ b/policy/modules/system/udev.if +@@ -34,6 +34,7 @@ interface(`udev_domtrans',` + ') + + domtrans_pattern($1, udev_exec_t, udev_t) ++ allow $1 udev_t:process noatsecure; + ') + + ######################################## +@@ -88,8 +89,7 @@ interface(`udev_read_state',` + ') + + kernel_search_proc($1) +- allow $1 udev_t:file read_file_perms; +- allow $1 udev_t:lnk_file read_lnk_file_perms; ++ ps_process_pattern($1, udev_t) + ') + + ######################################## +@@ -164,10 +164,10 @@ interface(`udev_manage_rules_files',` + # + interface(`udev_dontaudit_search_db',` + gen_require(` +- type udev_tbl_t; ++ type udev_var_run_t; + ') + +- dontaudit $1 udev_tbl_t:dir search_dir_perms; ++ dontaudit $1 udev_var_run_t:dir search_dir_perms; + ') + + ######################################## +@@ -187,25 +187,70 @@ interface(`udev_dontaudit_search_db',` + ## + # + interface(`udev_read_db',` ++ udev_read_pid_files($1) ++') ++ ++######################################## ++## ++## Allow process to modify list of devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`udev_rw_db',` + gen_require(` +- type udev_tbl_t; ++ type udev_var_run_t; + ') + +- allow $1 udev_tbl_t:dir list_dir_perms; ++ files_search_pids($1) ++ dev_list_all_dev_nodes($1) ++ rw_files_pattern($1, udev_var_run_t, udev_var_run_t) ++') + +- read_files_pattern($1, udev_tbl_t, udev_tbl_t) +- read_lnk_files_pattern($1, udev_tbl_t, udev_tbl_t) ++######################################## ++## ++## Allow process to modify relabelto udev database ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`udev_relabelto_db',` ++ gen_require(` ++ type udev_var_run_t; ++ ') + +- dev_list_all_dev_nodes($1) ++ files_search_pids($1) ++ allow $1 udev_var_run_t:file relabelto_file_perms; ++') + +- files_search_etc($1) ++######################################## ++## ++## Relabel the udev sock_file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`udev_relabel_pid_sockfile',` ++ gen_require(` ++ type udev_var_run_t; ++ ') + +- udev_search_pids($1) ++ allow $1 udev_var_run_t:sock_file relabel_sock_file_perms; + ') + + ######################################## + ## +-## Allow process to modify list of devices. ++## Create, read, write, and delete ++## udev pid files. + ## + ## + ## +@@ -213,13 +258,16 @@ interface(`udev_read_db',` + ## + ## + # +-interface(`udev_rw_db',` ++interface(`udev_read_pid_files',` + gen_require(` +- type udev_tbl_t; ++ type udev_var_run_t; + ') + + dev_list_all_dev_nodes($1) +- allow $1 udev_tbl_t:file rw_file_perms; ++ files_search_pids($1) ++ allow $1 udev_var_run_t:dir list_dir_perms; ++ read_files_pattern($1, udev_var_run_t, udev_var_run_t) ++ read_lnk_files_pattern($1, udev_var_run_t, udev_var_run_t) + ') + + ######################################## +@@ -263,7 +311,8 @@ interface(`udev_manage_pid_dirs',` + + ######################################## + ## +-## Read udev pid files. ++## Create, read, write, and delete ++## udev pid files. + ## + ## + ## +@@ -271,19 +320,44 @@ interface(`udev_manage_pid_dirs',` + ## + ## + # +-interface(`udev_read_pid_files',` ++interface(`udev_manage_pid_files',` + gen_require(` + type udev_var_run_t; + ') + + files_search_pids($1) +- read_files_pattern($1, udev_var_run_t, udev_var_run_t) ++ manage_files_pattern($1, udev_var_run_t, udev_var_run_t) + ') + +-######################################## ++####################################### + ## +-## Create, read, write, and delete +-## udev pid files. ++## Execute udev in the udev domain, and ++## allow the specified role the udev domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed the iptables domain. ++## ++## ++## ++# ++interface(`udev_run',` ++ gen_require(` ++ type udev_t; ++ ') ++ ++ udev_domtrans($1) ++ role $2 types udev_t; ++') ++ ++####################################### ++## ++## Allow caller to create kobject uevent socket for udev + ## + ## + ## +@@ -291,13 +365,45 @@ interface(`udev_read_pid_files',` + ## + ## + # +-interface(`udev_manage_pid_files',` ++interface(`udev_create_kobject_uevent_socket',` + gen_require(` +- type udev_var_run_t; ++ type udev_t; ++ role system_r; + ') + +- files_search_pids($1) +- manage_files_pattern($1, udev_var_run_t, udev_var_run_t) ++ allow $1 udev_t:netlink_kobject_uevent_socket create_socket_perms; ++') ++ ++######################################## ++## ++## Create a domain for processes ++## which can be started by udev. ++## ++## ++## ++## Type to be used as a domain. ++## ++## ++## ++## ++## Type of the program to be used as an entry point to this domain. ++## ++## ++# ++interface(`udev_system_domain',` ++ gen_require(` ++ type udev_t; ++ role system_r; ++ ') ++ ++ domain_type($1) ++ domain_entry_file($1, $2) ++ ++ role system_r types $1; ++ ++ domtrans_pattern(udev_t, $2, $1) ++ ++ dontaudit $1 udev_t:unix_dgram_socket { read write }; + ') + + ######################################## +diff --git a/policy/modules/system/udev.te b/policy/modules/system/udev.te +index 39f185f68c..fb61dca9a4 100644 +--- a/policy/modules/system/udev.te ++++ b/policy/modules/system/udev.te +@@ -17,16 +17,17 @@ init_daemon_domain(udev_t, udev_exec_t) + type udev_etc_t alias etc_udev_t; + files_config_file(udev_etc_t) + +-type udev_tbl_t alias udev_tdb_t; +-files_type(udev_tbl_t) +- + type udev_rules_t; + files_type(udev_rules_t) + + type udev_var_run_t; + files_pid_file(udev_var_run_t) ++typealias udev_var_run_t alias udev_tbl_t; + init_daemon_run_dir(udev_var_run_t, "udev") + ++type udev_tmp_t; ++files_tmp_file(udev_tmp_t) ++ + ifdef(`enable_mcs',` + kernel_ranged_domtrans_to(udev_t, udev_exec_t, s0 - mcs_systemhigh) + init_ranged_daemon_domain(udev_t, udev_exec_t, s0 - mcs_systemhigh) +@@ -37,10 +38,10 @@ ifdef(`enable_mcs',` + # Local policy + # + +-allow udev_t self:capability { chown dac_override dac_read_search fowner fsetid sys_admin mknod net_raw net_admin sys_nice sys_rawio sys_resource setuid setgid sys_nice sys_ptrace }; ++allow udev_t self:capability { chown dac_override dac_read_search fowner fsetid sys_admin mknod net_raw net_admin sys_nice sys_rawio sys_resource setuid setgid sys_nice }; ++allow udev_t self:capability2 { block_suspend compromise_kernel }; + dontaudit udev_t self:capability sys_tty_config; +-allow udev_t self:capability2 block_suspend; +-allow udev_t self:process ~{ setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++allow udev_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow udev_t self:process { execmem setfscreate }; + allow udev_t self:fd use; + allow udev_t self:fifo_file rw_fifo_file_perms; +@@ -53,7 +54,10 @@ allow udev_t self:unix_stream_socket { listen accept }; + allow udev_t self:unix_dgram_socket sendto; + allow udev_t self:unix_stream_socket connectto; + allow udev_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow udev_t self:netlink_generic_socket create_socket_perms; + allow udev_t self:rawip_socket create_socket_perms; ++allow udev_t self:netlink_socket create_socket_perms; ++allow udev_t self:netlink_route_socket { create_socket_perms nlmsg_read nlmsg_write }; + + allow udev_t udev_exec_t:file write; + can_exec(udev_t, udev_exec_t) +@@ -64,31 +68,40 @@ can_exec(udev_t, udev_helper_exec_t) + # read udev config + allow udev_t udev_etc_t:file read_file_perms; + +-allow udev_t udev_tbl_t:file manage_file_perms; +-dev_filetrans(udev_t, udev_tbl_t, file) ++allow udev_t udev_tmp_t:dir manage_dir_perms; ++allow udev_t udev_tmp_t:file manage_file_perms; ++files_tmp_filetrans(udev_t, udev_tmp_t, { file dir }) + + list_dirs_pattern(udev_t, udev_rules_t, udev_rules_t) +-read_files_pattern(udev_t, udev_rules_t, udev_rules_t) ++manage_files_pattern(udev_t, udev_rules_t, udev_rules_t) ++manage_lnk_files_pattern(udev_t, udev_rules_t, udev_rules_t) ++manage_chr_files_pattern(udev_t, udev_rules_t, udev_rules_t) + + manage_dirs_pattern(udev_t, udev_var_run_t, udev_var_run_t) + manage_files_pattern(udev_t, udev_var_run_t, udev_var_run_t) + manage_lnk_files_pattern(udev_t, udev_var_run_t, udev_var_run_t) + manage_sock_files_pattern(udev_t, udev_var_run_t, udev_var_run_t) + files_pid_filetrans(udev_t, udev_var_run_t, dir, "udev") ++allow udev_t udev_var_run_t:file mounton; ++allow udev_t udev_var_run_t:dir mounton; ++allow udev_t udev_var_run_t:lnk_file relabel_lnk_file_perms; ++dev_filetrans(udev_t, udev_var_run_t, { file lnk_file } ) + ++kernel_load_module(udev_t) + kernel_read_system_state(udev_t) + kernel_request_load_module(udev_t) + kernel_getattr_core_if(udev_t) + kernel_use_fds(udev_t) + kernel_read_device_sysctls(udev_t) +-kernel_read_hotplug_sysctls(udev_t) +-kernel_read_modprobe_sysctls(udev_t) ++kernel_read_fs_sysctls(udev_t) + kernel_read_kernel_sysctls(udev_t) +-kernel_rw_hotplug_sysctls(udev_t) ++kernel_rw_usermodehelper_state(udev_t) + kernel_rw_unix_dgram_sockets(udev_t) + kernel_dgram_send(udev_t) +-kernel_signal(udev_t) + kernel_search_debugfs(udev_t) ++kernel_setsched(udev_t) ++kernel_stream_connect(udev_t) ++kernel_signal(udev_t) + + #https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=235182 + kernel_rw_net_sysctls(udev_t) +@@ -99,6 +112,7 @@ corecmd_exec_all_executables(udev_t) + + dev_rw_sysfs(udev_t) + dev_manage_all_dev_nodes(udev_t) ++dev_rw_generic_usb_dev(udev_t) + dev_rw_generic_files(udev_t) + dev_delete_generic_files(udev_t) + dev_search_usbfs(udev_t) +@@ -107,23 +121,31 @@ dev_relabel_all_dev_nodes(udev_t) + # preserved, instead of short circuiting the relabel + dev_relabel_generic_symlinks(udev_t) + dev_manage_generic_symlinks(udev_t) ++dev_filetrans_all_named_dev(udev_t) + + domain_read_all_domains_state(udev_t) +-domain_dontaudit_ptrace_all_domains(udev_t) #pidof triggers these + + files_read_usr_files(udev_t) + files_read_etc_runtime_files(udev_t) +-files_read_etc_files(udev_t) ++files_read_kernel_modules(udev_t) ++files_read_system_conf_files(udev_t) ++ ++ ++# console_init manages files in /etc/sysconfig ++files_manage_etc_files(udev_t) + files_exec_etc_files(udev_t) ++files_exec_usr_files(udev_t) + files_dontaudit_search_isid_type_dirs(udev_t) + files_getattr_generic_locks(udev_t) + files_search_mnt(udev_t) ++files_list_tmp(udev_t) + + fs_getattr_all_fs(udev_t) + fs_list_inotifyfs(udev_t) + fs_rw_anon_inodefs_files(udev_t) +- +-mcs_ptrace_all(udev_t) ++fs_list_auto_mountpoints(udev_t) ++fs_list_hugetlbfs(udev_t) ++fs_read_cgroup_files(udev_t) + + mls_file_read_all_levels(udev_t) + mls_file_write_all_levels(udev_t) +@@ -145,17 +167,20 @@ auth_use_nsswitch(udev_t) + init_read_utmp(udev_t) + init_dontaudit_write_utmp(udev_t) + init_getattr_initctl(udev_t) ++init_stream_connect(udev_t) + + logging_search_logs(udev_t) + logging_send_syslog_msg(udev_t) + logging_send_audit_msgs(udev_t) ++logging_stream_connect_syslog(udev_t) + +-miscfiles_read_localization(udev_t) + miscfiles_read_hwdata(udev_t) + + modutils_domtrans_insmod(udev_t) + # read modules.inputmap: + modutils_read_module_deps(udev_t) ++modutils_list_module_config(udev_t) ++modutils_read_module_config(udev_t) + + seutil_read_config(udev_t) + seutil_read_default_contexts(udev_t) +@@ -169,9 +194,14 @@ sysnet_read_dhcpc_pid(udev_t) + sysnet_delete_dhcpc_pid(udev_t) + sysnet_signal_dhcpc(udev_t) + sysnet_manage_config(udev_t) +-sysnet_etc_filetrans_config(udev_t) ++#sysnet_etc_filetrans_config(udev_t) ++ ++systemd_login_read_pid_files(udev_t) ++systemd_getattr_unit_files(udev_t) ++systemd_hwdb_manage_config(udev_t) + + userdom_dontaudit_search_user_home_content(udev_t) ++userdom_rw_inherited_user_tmp_pipes(udev_t) + + ifdef(`distro_debian',` + files_pid_filetrans(udev_t, udev_var_run_t, dir, "xen-hotplug") +@@ -195,16 +225,9 @@ ifdef(`distro_gentoo',` + ') + + ifdef(`distro_redhat',` +- fs_manage_tmpfs_dirs(udev_t) +- fs_manage_tmpfs_files(udev_t) +- fs_manage_tmpfs_symlinks(udev_t) +- fs_manage_tmpfs_sockets(udev_t) +- fs_manage_tmpfs_blk_files(udev_t) +- fs_manage_tmpfs_chr_files(udev_t) +- fs_relabel_tmpfs_blk_file(udev_t) +- fs_relabel_tmpfs_chr_file(udev_t) ++ fs_manage_hugetlbfs_dirs(udev_t) + +- term_search_ptys(udev_t) ++ term_use_generic_ptys(udev_t) + + # for arping used for static IP addresses on PCMCIA ethernet + netutils_domtrans(udev_t) +@@ -242,6 +265,7 @@ optional_policy(` + + optional_policy(` + cups_domtrans_config(udev_t) ++ cups_read_config(udev_t) + ') + + optional_policy(` +@@ -249,17 +273,31 @@ optional_policy(` + dbus_use_system_bus_fds(udev_t) + + optional_policy(` +- consolekit_dbus_chat(udev_t) +- ') ++ systemd_dbus_chat_logind(udev_t) ++ ') + ') + + optional_policy(` + devicekit_read_pid_files(udev_t) + devicekit_dgram_send(udev_t) ++ devicekit_domtrans_disk(udev_t) ++') ++ ++optional_policy(` ++ gnome_read_home_config(udev_t) ++') ++ ++optional_policy(` ++ gpsd_domtrans(udev_t) ++') ++ ++optional_policy(` ++ kdump_systemctl(udev_t) + ') + + optional_policy(` + lvm_domtrans(udev_t) ++ lvm_dgram_send(udev_t) + ') + + optional_policy(` +@@ -280,6 +318,10 @@ optional_policy(` + hotplug_search_pids(udev_t) + ') + ++optional_policy(` ++ kdump_rw_inherited_kdumpctl_tmp_pipes(udev_t) ++') ++ + optional_policy(` + lvm_domtrans(udev_t) + ') +@@ -288,6 +330,10 @@ optional_policy(` + mount_domtrans(udev_t) + ') + ++optional_policy(` ++ networkmanager_dbus_chat(udev_t) ++') ++ + optional_policy(` + openct_read_pid_files(udev_t) + openct_domtrans(udev_t) +@@ -302,6 +348,15 @@ optional_policy(` + raid_domtrans_mdadm(udev_t) + ') + ++optional_policy(` ++ radvd_read_pid_files(udev_t) ++') ++ ++optional_policy(` ++ usbmuxd_domtrans(udev_t) ++ usbmuxd_stream_connect(udev_t) ++') ++ + optional_policy(` + unconfined_signal(udev_t) + ') +@@ -315,6 +370,7 @@ optional_policy(` + kernel_read_xen_state(udev_t) + xen_manage_log(udev_t) + xen_read_image_files(udev_t) ++ xen_stream_connect_xenstore(udev_t) + ') + + optional_policy(` +diff --git a/policy/modules/system/unconfined.fc b/policy/modules/system/unconfined.fc +index 0abaf84321..8b34dbc095 100644 +--- a/policy/modules/system/unconfined.fc ++++ b/policy/modules/system/unconfined.fc +@@ -1,21 +1 @@ + # Add programs here which should not be confined by SELinux +-# e.g.: +-# /usr/local/bin/appsrv -- gen_context(system_u:object_r:unconfined_exec_t,s0) +-# For the time being until someone writes a sane policy, we need initrc to transition to unconfined_t +-/usr/bin/valgrind -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-/usr/bin/vncserver -- gen_context(system_u:object_r:unconfined_exec_t,s0) +- +-/usr/lib/ia32el/ia32x_loader -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-/usr/lib/openoffice\.org.*/program/.+\.bin -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +- +-/usr/local/RealPlayer/realplay\.bin -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +- +-ifdef(`distro_debian',` +-/usr/bin/gcj-dbtool-4\.1 -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-/usr/bin/gij-4\.1 -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-/usr/lib/openoffice/program/soffice\.bin -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-') +- +-ifdef(`distro_gentoo',` +-/usr/lib/openoffice/program/[^/]+\.bin -- gen_context(system_u:object_r:unconfined_execmem_exec_t,s0) +-') +diff --git a/policy/modules/system/unconfined.if b/policy/modules/system/unconfined.if +index 5ca20a97d1..99a38b0175 100644 +--- a/policy/modules/system/unconfined.if ++++ b/policy/modules/system/unconfined.if +@@ -12,53 +12,57 @@ + # + interface(`unconfined_domain_noaudit',` + gen_require(` +- type unconfined_t; + class dbus all_dbus_perms; + class nscd all_nscd_perms; + class passwd all_passwd_perms; + ') + +- # Use most Linux capabilities +- allow $1 self:capability ~sys_module; +- allow $1 self:fifo_file manage_fifo_file_perms; ++ # Use any Linux capability. ++ ++ allow $1 self:capability ~{ sys_module }; ++ allow $1 self:capability2 ~{ mac_admin mac_override }; ++ allow $1 self:fifo_file { manage_fifo_file_perms relabelfrom relabelto }; + + # Transition to myself, to make get_ordered_context_list happy. +- allow $1 self:process transition; ++ allow $1 self:process { dyntransition transition }; + + # Write access is for setting attributes under /proc/self/attr. + allow $1 self:file rw_file_perms; ++ allow $1 self:dir rw_dir_perms; + + # Userland object managers +- allow $1 self:nscd *; +- allow $1 self:dbus *; +- allow $1 self:passwd *; +- allow $1 self:association *; ++ allow $1 self:nscd all_nscd_perms; ++ allow $1 self:dbus all_dbus_perms; ++ allow $1 self:passwd all_passwd_perms; ++ allow $1 self:association all_association_perms; ++ allow $1 self:socket_class_set create_socket_perms; + + kernel_unconfined($1) + corenet_unconfined($1) + dev_unconfined($1) + domain_unconfined($1) +- domain_dontaudit_read_all_domains_state($1) +- domain_dontaudit_ptrace_all_domains($1) + files_unconfined($1) + fs_unconfined($1) + selinux_unconfined($1) ++ systemd_config_all_services($1) ++ ++ domain_mmap_low($1) + +- tunable_policy(`allow_execheap',` ++ ubac_process_exempt($1) ++ ++ tunable_policy(`selinuxuser_execheap',` + # Allow making the stack executable via mprotect. + allow $1 self:process execheap; + ') + +- tunable_policy(`allow_execmem',` ++ tunable_policy(`deny_execmem',`',` + # Allow making anonymous memory executable, e.g. + # for runtime-code generation or executable stack. + allow $1 self:process execmem; + ') + +- tunable_policy(`allow_execstack',` +- # Allow making the stack executable via mprotect; +- # execstack implies execmem; +- allow $1 self:process { execstack execmem }; ++ tunable_policy(`selinuxuser_execstack',` ++ allow $1 self:process execstack; + # auditallow $1 self:process execstack; + ') + +@@ -67,6 +71,8 @@ interface(`unconfined_domain_noaudit',` + ') + + optional_policy(` ++ # Communicate via dbusd. ++ dbus_system_bus_unconfined($1) + dbus_unconfined($1) + ') + +@@ -121,9 +127,13 @@ interface(`unconfined_domain_noaudit',` + ## + # + interface(`unconfined_domain',` ++ gen_require(` ++ attribute unconfined_services; ++ ') ++ + unconfined_domain_noaudit($1) + +- tunable_policy(`allow_execheap',` ++ tunable_policy(`selinuxuser_execheap',` + auditallow $1 self:process execheap; + ') + ') +@@ -149,7 +159,7 @@ interface(`unconfined_domain',` + ## + # + interface(`unconfined_alias_domain',` +- refpolicywarn(`$0($1) has been deprecated.') ++ refpolicywarn(`$0() has been deprecated.') + ') + + ######################################## +@@ -175,343 +185,12 @@ interface(`unconfined_alias_domain',` + ## + # + interface(`unconfined_execmem_alias_program',` +- refpolicywarn(`$0($1) has been deprecated.') +-') +- +-######################################## +-## +-## Transition to the unconfined domain. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-# +-interface(`unconfined_domtrans',` +- gen_require(` +- type unconfined_t, unconfined_exec_t; +- ') +- +- domtrans_pattern($1, unconfined_exec_t, unconfined_t) +-') +- +-######################################## +-## +-## Execute specified programs in the unconfined domain. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-## +-## +-## The role to allow the unconfined domain. +-## +-## +-# +-interface(`unconfined_run',` +- gen_require(` +- type unconfined_t; +- ') +- +- unconfined_domtrans($1) +- role $2 types unconfined_t; +-') +- +-######################################## +-## +-## Transition to the unconfined domain by executing a shell. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-# +-interface(`unconfined_shell_domtrans',` +- gen_require(` +- type unconfined_t; +- ') +- +- corecmd_shell_domtrans($1, unconfined_t) +- allow unconfined_t $1:fd use; +- allow unconfined_t $1:fifo_file rw_file_perms; +- allow unconfined_t $1:process sigchld; +-') +- +-######################################## +-## +-## Allow unconfined to execute the specified program in +-## the specified domain. +-## +-## +-##

      +-## Allow unconfined to execute the specified program in +-## the specified domain. +-##

      +-##

      +-## This is a interface to support third party modules +-## and its use is not allowed in upstream reference +-## policy. +-##

      +-##
      +-## +-## +-## Domain to execute in. +-## +-## +-## +-## +-## Domain entry point file. +-## +-## +-# +-interface(`unconfined_domtrans_to',` +- gen_require(` +- type unconfined_t; +- ') +- +- domtrans_pattern(unconfined_t,$2,$1) +-') +- +-######################################## +-## +-## Allow unconfined to execute the specified program in +-## the specified domain. Allow the specified domain the +-## unconfined role and use of unconfined user terminals. +-## +-## +-##

      +-## Allow unconfined to execute the specified program in +-## the specified domain. Allow the specified domain the +-## unconfined role and use of unconfined user terminals. +-##

      +-##

      +-## This is a interface to support third party modules +-## and its use is not allowed in upstream reference +-## policy. +-##

      +-##
      +-## +-## +-## Domain to execute in. +-## +-## +-## +-## +-## Domain entry point file. +-## +-## +-# +-interface(`unconfined_run_to',` +- gen_require(` +- type unconfined_t; +- role unconfined_r; +- ') +- +- domtrans_pattern(unconfined_t,$2,$1) +- role unconfined_r types $1; +- userdom_use_user_terminals($1) +-') +- +-######################################## +-## +-## Inherit file descriptors from the unconfined domain. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_use_fds',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:fd use; +-') +- +-######################################## +-## +-## Send a SIGCHLD signal to the unconfined domain. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_sigchld',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:process sigchld; +-') +- +-######################################## +-## +-## Send a SIGNULL signal to the unconfined domain. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_signull',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:process signull; +-') +- +-######################################## +-## +-## Send generic signals to the unconfined domain. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_signal',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:process signal; +-') +- +-######################################## +-## +-## Read unconfined domain unnamed pipes. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_read_pipes',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:fifo_file read_fifo_file_perms; +-') +- +-######################################## +-## +-## Do not audit attempts to read unconfined domain unnamed pipes. +-## +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`unconfined_dontaudit_read_pipes',` +- gen_require(` +- type unconfined_t; +- ') +- +- dontaudit $1 unconfined_t:fifo_file read; +-') +- +-######################################## +-## +-## Read and write unconfined domain unnamed pipes. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_rw_pipes',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:fifo_file rw_fifo_file_perms; +-') +- +-######################################## +-## +-## Do not audit attempts to read and write +-## unconfined domain unnamed pipes. +-## +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`unconfined_dontaudit_rw_pipes',` +- gen_require(` +- type unconfined_t; +- ') +- +- dontaudit $1 unconfined_t:fifo_file rw_file_perms; +-') +- +-######################################## +-## +-## Connect to the unconfined domain using +-## a unix domain stream socket. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`unconfined_stream_connect',` +- gen_require(` +- type unconfined_t; +- ') +- +- allow $1 unconfined_t:unix_stream_socket connectto; +-') +- +-######################################## +-## +-## Do not audit attempts to read or write +-## unconfined domain tcp sockets. +-## +-## +-##

      +-## Do not audit attempts to read or write +-## unconfined domain tcp sockets. +-##

      +-##

      +-## This interface was added due to a broken +-## symptom in ldconfig. +-##

      +-##
      +-## +-## +-## Domain to not audit. +-## +-## +-# +-interface(`unconfined_dontaudit_rw_tcp_sockets',` +- gen_require(` +- type unconfined_t; +- ') +- +- dontaudit $1 unconfined_t:tcp_socket { read write }; ++ refpolicywarn(`$0() has been deprecated.') + ') + + ######################################## + ## +-## Create keys for the unconfined domain. ++## Connect to unconfined_server with a unix socket. + ## + ## + ## +@@ -519,17 +198,19 @@ interface(`unconfined_dontaudit_rw_tcp_sockets',` + ## + ## + # +-interface(`unconfined_create_keys',` ++interface(`unconfined_server_stream_connect',` + gen_require(` +- type unconfined_t; ++ type unconfined_service_t; + ') + +- allow $1 unconfined_t:key create; ++ files_search_pids($1) ++ files_write_generic_pid_pipes($1) ++ allow $1 unconfined_service_t:unix_stream_socket { getattr connectto }; + ') + + ######################################## + ## +-## Send messages to the unconfined domain over dbus. ++## Connect to unconfined_server with a unix socket. + ## + ## + ## +@@ -537,19 +218,17 @@ interface(`unconfined_create_keys',` + ## + ## + # +-interface(`unconfined_dbus_send',` ++interface(`unconfined_server_domtrans',` + gen_require(` +- type unconfined_t; +- class dbus send_msg; ++ type unconfined_service_t; + ') + +- allow $1 unconfined_t:dbus send_msg; ++ corecmd_bin_domtrans($1, unconfined_service_t) + ') + + ######################################## + ## +-## Send and receive messages from +-## unconfined_t over dbus. ++## Allow caller domain to dbus chat unconfined_server. + ## + ## + ## +@@ -557,20 +236,19 @@ interface(`unconfined_dbus_send',` + ## + ## + # +-interface(`unconfined_dbus_chat',` ++interface(`unconfined_server_dbus_chat',` + gen_require(` +- type unconfined_t; +- class dbus send_msg; ++ type unconfined_service_t; ++ class dbus send_msg; + ') + +- allow $1 unconfined_t:dbus send_msg; +- allow unconfined_t $1:dbus send_msg; ++ allow $1 unconfined_service_t:dbus send_msg; ++ allow unconfined_service_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Connect to the the unconfined DBUS +-## for service (acquire_svc). ++## Send signull to unconfined_service_t. + ## + ## + ## +@@ -578,11 +256,10 @@ interface(`unconfined_dbus_chat',` + ## + ## + # +-interface(`unconfined_dbus_connect',` ++interface(`unconfined_server_signull',` + gen_require(` +- type unconfined_t; +- class dbus acquire_svc; ++ type unconfined_service_t; + ') + +- allow $1 unconfined_t:dbus acquire_svc; ++ allow $1 unconfined_service_t:process signull; + ') +diff --git a/policy/modules/system/unconfined.te b/policy/modules/system/unconfined.te +index 5fe902db3f..fe649d9085 100644 +--- a/policy/modules/system/unconfined.te ++++ b/policy/modules/system/unconfined.te +@@ -1,207 +1,33 @@ +-policy_module(unconfined, 3.5.1) ++policy_module(unconfined, 3.5.0) + + ######################################## + # + # Declarations + # ++attribute unconfined_services; + +-# usage in this module of types created by these +-# calls is not correct, however we dont currently +-# have another method to add access to these types +-userdom_base_user_template(unconfined) +-userdom_manage_home_role(unconfined_r, unconfined_t) +-userdom_manage_tmp_role(unconfined_r, unconfined_t) +-userdom_manage_tmpfs_role(unconfined_r, unconfined_t) ++type unconfined_service_t; ++domain_type(unconfined_service_t) ++role system_r types unconfined_service_t; ++init_nnp_daemon_domain(unconfined_service_t) + +-type unconfined_exec_t; +-init_system_domain(unconfined_t, unconfined_exec_t) ++unconfined_domain(unconfined_service_t) + +-type unconfined_execmem_t; +-type unconfined_execmem_exec_t; +-init_system_domain(unconfined_execmem_t, unconfined_execmem_exec_t) +-role unconfined_r types unconfined_execmem_t; ++unconfined_stub_role() + +-######################################## +-# +-# Local policy +-# +- +-domtrans_pattern(unconfined_t, unconfined_execmem_exec_t, unconfined_execmem_t) +- +-files_create_boot_flag(unconfined_t) +- +-mcs_killall(unconfined_t) +-mcs_ptrace_all(unconfined_t) +- +-init_run_daemon(unconfined_t, unconfined_r) +- +-libs_run_ldconfig(unconfined_t, unconfined_r) +- +-logging_send_syslog_msg(unconfined_t) +-logging_run_auditctl(unconfined_t, unconfined_r) +- +-mount_run_unconfined(unconfined_t, unconfined_r) +- +-seutil_run_setfiles(unconfined_t, unconfined_r) +-seutil_run_semanage(unconfined_t, unconfined_r) +- +-unconfined_domain(unconfined_t) +- +-userdom_user_home_dir_filetrans_user_home_content(unconfined_t, { dir file lnk_file fifo_file sock_file }) +- +-ifdef(`distro_gentoo',` +- seutil_run_runinit(unconfined_t, unconfined_r) +- seutil_init_script_run_runinit(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- ada_domtrans(unconfined_t) +-') +- +-optional_policy(` +- apache_run_helper(unconfined_t, unconfined_r) +- apache_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- bind_run_ndc(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- bootloader_run(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- cron_unconfined_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- firstboot_run(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- ftp_run_ftpdctl(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- hadoop_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- inn_domtrans(unconfined_t) +-') +- +-optional_policy(` +- java_run_unconfined(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- lpd_run_checkpc(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- modutils_run_update_mods(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- mono_domtrans(unconfined_t) +-') +- +-optional_policy(` +- mta_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- oddjob_domtrans_mkhomedir(unconfined_t) +-') +- +-optional_policy(` +- portage_run(unconfined_t, unconfined_r) +- portage_run_fetch(unconfined_t, unconfined_r) +- portage_run_gcc_config(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- prelink_run(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- portmap_run_helper(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- postfix_run_map(unconfined_t, unconfined_r) +- # cjp: this should probably be removed: +- postfix_domtrans_master(unconfined_t) +-') +- +-optional_policy(` +- pyzor_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- # cjp: this should probably be removed: +- rpc_domtrans_nfsd(unconfined_t) +-') +- +-optional_policy(` +- rtkit_scheduled(unconfined_t) +-') +- +-optional_policy(` +- rpm_run(unconfined_t, unconfined_r) +-') ++role unconfined_r types unconfined_service_t; + +-optional_policy(` +- samba_run_net(unconfined_t, unconfined_r) +- samba_run_winbind_helper(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- spamassassin_role(unconfined_r, unconfined_t) +-') +- +-optional_policy(` +- sysnet_run_dhcpc(unconfined_t, unconfined_r) +- sysnet_dbus_chat_dhcpc(unconfined_t) +-') +- +-optional_policy(` +- tzdata_run(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- unconfined_dbus_chat(unconfined_t) +-') ++corecmd_bin_entry_type(unconfined_service_t) ++corecmd_shell_entry_type(unconfined_service_t) + + optional_policy(` +- usermanage_run_admin_passwd(unconfined_t, unconfined_r) ++ rpm_transition_script(unconfined_service_t, system_r) + ') + + optional_policy(` +- vpn_run(unconfined_t, unconfined_r) ++ chronyd_run_chronyc(unconfined_service_t, system_r) + ') + + optional_policy(` +- webalizer_run(unconfined_t, unconfined_r) +-') +- +-optional_policy(` +- wine_domtrans(unconfined_t) +-') +- +-optional_policy(` +- xserver_domtrans(unconfined_t) +-') +- +-######################################## +-# +-# Unconfined Execmem Local policy +-# +- +-allow unconfined_execmem_t self:process { execstack execmem }; +-unconfined_domain_noaudit(unconfined_execmem_t) +- +-optional_policy(` +- unconfined_dbus_chat(unconfined_execmem_t) ++ dbus_chat_system_bus(unconfined_service_t) + ') +diff --git a/policy/modules/system/userdomain.fc b/policy/modules/system/userdomain.fc +index db7597682d..c54480a1da 100644 +--- a/policy/modules/system/userdomain.fc ++++ b/policy/modules/system/userdomain.fc +@@ -1,4 +1,37 @@ + HOME_DIR -d gen_context(system_u:object_r:user_home_dir_t,s0-mls_systemhigh) ++HOME_DIR -l gen_context(system_u:object_r:user_home_dir_t,s0-mls_systemhigh) + HOME_DIR/.+ gen_context(system_u:object_r:user_home_t,s0) +- + /tmp/gconfd-USER -d gen_context(system_u:object_r:user_tmp_t,s0) ++/root(/.*)? gen_context(system_u:object_r:admin_home_t,s0) ++/root/\.cert(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++/root/\.pki(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++/root/\.debug(/.*)? <> ++/dev/shm/pulse-shm.* gen_context(system_u:object_r:user_tmpfs_t,s0) ++/dev/shm/mono.* gen_context(system_u:object_r:user_tmpfs_t,s0) ++HOME_DIR/bin(/.*)? gen_context(system_u:object_r:home_bin_t,s0) ++HOME_DIR/\.local/bin(/.*)? gen_context(system_u:object_r:home_bin_t,s0) ++HOME_DIR/Audio(/.*)? gen_context(system_u:object_r:audio_home_t,s0) ++HOME_DIR/Music(/.*)? gen_context(system_u:object_r:audio_home_t,s0) ++HOME_DIR/\.cert(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++HOME_DIR/\.local/share/networkmanagement/certificates(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++HOME_DIR/\.kde/share/apps/networkmanagement/certificates(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++HOME_DIR/\.pki(/.*)? gen_context(system_u:object_r:home_cert_t,s0) ++HOME_DIR/\.gvfs/.* <> ++HOME_DIR/\.debug(/.*)? <> ++HOME_DIR/\.texlive2012(/.*)? gen_context(system_u:object_r:texlive_home_t,s0) ++HOME_DIR/\.texlive2013(/.*)? gen_context(system_u:object_r:texlive_home_t,s0) ++HOME_DIR/\.texlive2014(/.*)? gen_context(system_u:object_r:texlive_home_t,s0) ++HOME_DIR/\.tmp -d gen_context(system_u:object_r:user_tmp_t,s0) ++HOME_DIR/tmp -d gen_context(system_u:object_r:user_tmp_t,s0) ++ ++/tmp/\.X0-lock -- gen_context(system_u:object_r:user_tmp_t,s0) ++/tmp/\.X11-unix(/.*)? gen_context(system_u:object_r:user_tmp_t,s0) ++/tmp/\.ICE-unix(/.*)? gen_context(system_u:object_r:user_tmp_t,s0) ++ ++ ++ ++/var/run/user(/.*)? gen_context(system_u:object_r:user_tmp_t,s0) ++ ++/tmp/hsperfdata_root gen_context(system_u:object_r:user_tmp_t,s0) ++/var/tmp/hsperfdata_root gen_context(system_u:object_r:user_tmp_t,s0) ++ +diff --git a/policy/modules/system/userdomain.if b/policy/modules/system/userdomain.if +index 9dc60c6c04..9e1a6895d2 100644 +--- a/policy/modules/system/userdomain.if ++++ b/policy/modules/system/userdomain.if +@@ -30,9 +30,11 @@ template(`userdom_base_user_template',` + ') + + attribute $1_file_type; ++ attribute $1_usertype; + +- type $1_t, userdomain; ++ type $1_t, userdomain, $1_usertype; + domain_type($1_t) ++ role $1_r; + corecmd_shell_entry_type($1_t) + corecmd_bin_entry_type($1_t) + domain_user_exemption_target($1_t) +@@ -44,79 +46,133 @@ template(`userdom_base_user_template',` + term_user_pty($1_t, user_devpts_t) + + term_user_tty($1_t, user_tty_device_t) +- +- allow $1_t self:process { signal_perms getsched setsched share getpgid setpgid setcap getsession getattr }; +- allow $1_t self:fd use; +- allow $1_t self:fifo_file rw_fifo_file_perms; +- allow $1_t self:unix_dgram_socket { create_socket_perms sendto }; +- allow $1_t self:unix_stream_socket { create_stream_socket_perms connectto }; +- allow $1_t self:shm create_shm_perms; +- allow $1_t self:sem create_sem_perms; +- allow $1_t self:msgq create_msgq_perms; +- allow $1_t self:msg { send receive }; +- allow $1_t self:context contains; +- dontaudit $1_t self:socket create; +- +- allow $1_t user_devpts_t:chr_file { setattr rw_chr_file_perms }; +- term_create_pty($1_t, user_devpts_t) ++ term_dontaudit_getattr_generic_ptys($1_t) ++ ++ allow $1_usertype $1_usertype:process { signal_perms getsched setsched share getpgid setpgid getcap setcap getsession getattr }; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1_usertype $1_usertype:process ptrace; ++ ') ++ allow $1_usertype $1_usertype:fd use; ++ allow $1_usertype $1_t:key { create view read write search link setattr }; ++ ++ allow $1_usertype $1_usertype:fifo_file rw_fifo_file_perms; ++ allow $1_usertype $1_usertype:unix_dgram_socket { create_socket_perms sendto }; ++ allow $1_usertype $1_usertype:unix_stream_socket { create_stream_socket_perms connectto }; ++ allow $1_usertype $1_usertype:shm create_shm_perms; ++ allow $1_usertype $1_usertype:sem create_sem_perms; ++ allow $1_usertype $1_usertype:msgq create_msgq_perms; ++ allow $1_usertype $1_usertype:msg { send receive }; ++ allow $1_usertype $1_usertype:context contains; ++ dontaudit $1_usertype $1_usertype:socket create; ++ ++ allow $1_usertype user_devpts_t:chr_file { setattr rw_chr_file_perms }; ++ term_create_pty($1_usertype, user_devpts_t) + # avoid annoying messages on terminal hangup on role change +- dontaudit $1_t user_devpts_t:chr_file ioctl; ++ dontaudit $1_usertype user_devpts_t:chr_file ioctl; + +- allow $1_t user_tty_device_t:chr_file { setattr rw_chr_file_perms }; ++ allow $1_usertype user_tty_device_t:chr_file { setattr rw_chr_file_perms }; + # avoid annoying messages on terminal hangup on role change +- dontaudit $1_t user_tty_device_t:chr_file ioctl; +- +- kernel_read_kernel_sysctls($1_t) +- kernel_dontaudit_list_unlabeled($1_t) +- kernel_dontaudit_getattr_unlabeled_files($1_t) +- kernel_dontaudit_getattr_unlabeled_symlinks($1_t) +- kernel_dontaudit_getattr_unlabeled_pipes($1_t) +- kernel_dontaudit_getattr_unlabeled_sockets($1_t) +- kernel_dontaudit_getattr_unlabeled_blk_files($1_t) +- kernel_dontaudit_getattr_unlabeled_chr_files($1_t) +- +- dev_dontaudit_getattr_all_blk_files($1_t) +- dev_dontaudit_getattr_all_chr_files($1_t) ++ dontaudit $1_usertype user_tty_device_t:chr_file ioctl; ++ ++ application_exec_all($1_usertype) ++ ++ kernel_read_kernel_sysctls($1_usertype) ++ kernel_read_all_sysctls($1_usertype) ++ kernel_dontaudit_list_unlabeled($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_files($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_symlinks($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_pipes($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_sockets($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_blk_files($1_usertype) ++ kernel_dontaudit_getattr_unlabeled_chr_files($1_usertype) ++ kernel_dontaudit_list_proc($1_usertype) ++ ++ dev_dontaudit_getattr_all_blk_files($1_usertype) ++ dev_dontaudit_getattr_all_chr_files($1_usertype) ++ dev_getattr_mtrr_dev($1_t) + + # When the user domain runs ps, there will be a number of access + # denials when ps tries to search /proc. Do not audit these denials. +- domain_dontaudit_read_all_domains_state($1_t) +- domain_dontaudit_getattr_all_domains($1_t) +- domain_dontaudit_getsession_all_domains($1_t) +- +- files_read_etc_files($1_t) +- files_read_etc_runtime_files($1_t) +- files_read_usr_files($1_t) ++ domain_dontaudit_read_all_domains_state($1_usertype) ++ domain_dontaudit_getattr_all_domains($1_usertype) ++ domain_dontaudit_getsession_all_domains($1_usertype) ++ dev_dontaudit_all_access_check($1_usertype) ++ ++ files_read_etc_files($1_usertype) ++ files_list_mnt($1_usertype) ++ files_list_var($1_usertype) ++ files_read_mnt_files($1_usertype) ++ files_dontaudit_all_access_check($1_usertype) ++ files_read_etc_runtime_files($1_usertype) ++ files_read_usr_files($1_usertype) ++ files_read_usr_src_files($1_usertype) + # Read directories and files with the readable_t type. + # This type is a general type for "world"-readable files. +- files_list_world_readable($1_t) +- files_read_world_readable_files($1_t) +- files_read_world_readable_symlinks($1_t) +- files_read_world_readable_pipes($1_t) +- files_read_world_readable_sockets($1_t) ++ files_list_world_readable($1_usertype) ++ files_read_world_readable_files($1_usertype) ++ files_read_world_readable_symlinks($1_usertype) ++ files_read_world_readable_pipes($1_usertype) ++ files_read_world_readable_sockets($1_usertype) + # old broswer_domain(): +- files_dontaudit_list_non_security($1_t) +- files_dontaudit_getattr_non_security_files($1_t) +- files_dontaudit_getattr_non_security_symlinks($1_t) +- files_dontaudit_getattr_non_security_pipes($1_t) +- files_dontaudit_getattr_non_security_sockets($1_t) ++ files_dontaudit_getattr_all_dirs($1_usertype) ++ files_dontaudit_list_non_security($1_usertype) ++ files_dontaudit_getattr_all_files($1_usertype) ++ files_dontaudit_getattr_non_security_symlinks($1_usertype) ++ files_dontaudit_getattr_non_security_pipes($1_usertype) ++ files_dontaudit_getattr_non_security_sockets($1_usertype) ++ files_dontaudit_setattr_etc_runtime_files($1_usertype) ++ ++ files_exec_usr_files($1_t) ++ ++ fs_list_cgroup_dirs($1_usertype) ++ fs_dontaudit_rw_cgroup_files($1_usertype) ++ ++ storage_rw_fuse($1_usertype) ++ ++ auth_use_nsswitch($1_t) ++ ++ init_stream_connect($1_usertype) ++ # The library functions always try to open read-write first, ++ # then fall back to read-only if it fails. ++ init_dontaudit_rw_utmp($1_usertype) + +- libs_exec_ld_so($1_t) ++ libs_exec_ld_so($1_usertype) + +- miscfiles_read_localization($1_t) + miscfiles_read_generic_certs($1_t) + +- sysnet_read_config($1_t) ++ miscfiles_read_all_certs($1_usertype) ++ miscfiles_read_public_files($1_usertype) + +- tunable_policy(`allow_execmem',` ++ systemd_dbus_chat_logind($1_usertype) ++ systemd_read_logind_sessions_files($1_usertype) ++ systemd_write_inhibit_pipes($1_usertype) ++ systemd_write_inherited_logind_sessions_pipes($1_usertype) ++ systemd_login_read_pid_files($1_usertype) ++ ++ tunable_policy(`deny_execmem',`', ` + # Allow loading DSOs that require executable stack. + allow $1_t self:process execmem; + ') + +- tunable_policy(`allow_execmem && allow_execstack',` ++ tunable_policy(`selinuxuser_execstack',` + # Allow making the stack executable via mprotect. + allow $1_t self:process execstack; + ') ++ ++ optional_policy(` ++ abrt_stream_connect($1_usertype) ++ ') ++ ++ optional_policy(` ++ fs_list_cgroup_dirs($1_usertype) ++ ') ++ ++ optional_policy(` ++ ssh_rw_stream_sockets($1_usertype) ++ ssh_rw_dgram_sockets($1_usertype) ++ ssh_delete_tmp($1_t) ++ ssh_signal($1_t) ++ ') + ') + + ####################################### +@@ -150,6 +206,8 @@ interface(`userdom_ro_home_role',` + type user_home_t, user_home_dir_t; + ') + ++ role $1 types { user_home_t user_home_dir_t }; ++ + ############################## + # + # Domain access to home dir +@@ -167,27 +225,6 @@ interface(`userdom_ro_home_role',` + read_sock_files_pattern($2, { user_home_t user_home_dir_t }, user_home_t) + files_list_home($2) + +- tunable_policy(`use_nfs_home_dirs',` +- fs_list_nfs($2) +- fs_read_nfs_files($2) +- fs_read_nfs_symlinks($2) +- fs_read_nfs_named_sockets($2) +- fs_read_nfs_named_pipes($2) +- ',` +- fs_dontaudit_list_nfs($2) +- fs_dontaudit_read_nfs_files($2) +- ') +- +- tunable_policy(`use_samba_home_dirs',` +- fs_list_cifs($2) +- fs_read_cifs_files($2) +- fs_read_cifs_symlinks($2) +- fs_read_cifs_named_sockets($2) +- fs_read_cifs_named_pipes($2) +- ',` +- fs_dontaudit_list_cifs($2) +- fs_dontaudit_read_cifs_files($2) +- ') + ') + + ####################################### +@@ -219,8 +256,11 @@ interface(`userdom_ro_home_role',` + interface(`userdom_manage_home_role',` + gen_require(` + type user_home_t, user_home_dir_t; ++ attribute user_home_type; + ') + ++ role $1 types { user_home_type user_home_dir_t }; ++ + ############################## + # + # Domain access to home dir +@@ -229,46 +269,144 @@ interface(`userdom_manage_home_role',` + type_member $2 user_home_dir_t:dir user_home_dir_t; + + # full control of the home directory ++ allow $2 user_home_t:dir mounton; + allow $2 user_home_t:file entrypoint; +- manage_dirs_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- manage_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- manage_lnk_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- manage_sock_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- manage_fifo_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- relabel_dirs_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- relabel_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- relabel_lnk_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- relabel_sock_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- relabel_fifo_files_pattern($2, { user_home_dir_t user_home_t }, user_home_t) +- filetrans_pattern($2, user_home_dir_t, user_home_t, { dir file lnk_file sock_file fifo_file }) ++ ++ allow $2 user_home_type:dir_file_class_set { relabelto relabelfrom }; ++ allow $2 user_home_dir_t:lnk_file read_lnk_file_perms; ++ manage_dirs_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ manage_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ manage_lnk_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ manage_sock_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ manage_fifo_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ relabel_dirs_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ relabel_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ relabel_lnk_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ relabel_sock_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ relabel_fifo_files_pattern($2, { user_home_dir_t user_home_type }, user_home_type) ++ userdom_filetrans_home_content($2) ++ + files_list_home($2) + + # cjp: this should probably be removed: + allow $2 user_home_dir_t:dir { manage_dir_perms relabel_dir_perms }; + + tunable_policy(`use_nfs_home_dirs',` ++ fs_mount_nfs($2) ++ fs_mounton_nfs($2) + fs_manage_nfs_dirs($2) + fs_manage_nfs_files($2) + fs_manage_nfs_symlinks($2) + fs_manage_nfs_named_sockets($2) + fs_manage_nfs_named_pipes($2) +- ',` +- fs_dontaudit_manage_nfs_dirs($2) +- fs_dontaudit_manage_nfs_files($2) + ') + + tunable_policy(`use_samba_home_dirs',` ++ fs_mount_cifs($2) ++ fs_mounton_cifs($2) + fs_manage_cifs_dirs($2) + fs_manage_cifs_files($2) + fs_manage_cifs_symlinks($2) + fs_manage_cifs_named_sockets($2) + fs_manage_cifs_named_pipes($2) +- ',` +- fs_dontaudit_manage_cifs_dirs($2) +- fs_dontaudit_manage_cifs_files($2) + ') + ') + ++####################################### ++## ++## Manage user temporary files ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_manage_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_files_pattern($1, user_tmp_t, user_tmp_t) ++') ++ ++####################################### ++## ++## Mmap user temporary files ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_map_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file map; ++') ++ ++####################################### ++## ++## Manage user temporary sockets ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_manage_tmp_sockets',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_sock_files_pattern($1, user_tmp_t, user_tmp_t) ++') ++ ++####################################### ++## ++## Manage user temporary directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_manage_tmp_dirs',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_dirs_pattern($1, user_tmp_t, user_tmp_t) ++') ++ ++####################################### ++## ++## Manage user temporary directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_mounton_tmp_dirs',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:dir mounton; ++') ++ + ####################################### + ## + ## Manage user temporary files +@@ -287,17 +425,65 @@ interface(`userdom_manage_home_role',` + # + interface(`userdom_manage_tmp_role',` + gen_require(` ++ attribute user_tmp_type; + type user_tmp_t; + ') + ++ role $1 types user_tmp_t; ++ + files_poly_member_tmp($2, user_tmp_t) + +- manage_dirs_pattern($2, user_tmp_t, user_tmp_t) +- manage_files_pattern($2, user_tmp_t, user_tmp_t) +- manage_lnk_files_pattern($2, user_tmp_t, user_tmp_t) +- manage_sock_files_pattern($2, user_tmp_t, user_tmp_t) +- manage_fifo_files_pattern($2, user_tmp_t, user_tmp_t) ++ allow $2 user_tmp_type:dir mounton; ++ manage_dirs_pattern($2, user_tmp_type, user_tmp_type) ++ manage_files_pattern($2, user_tmp_type, user_tmp_type) ++ manage_lnk_files_pattern($2, user_tmp_type, user_tmp_type) ++ manage_sock_files_pattern($2, user_tmp_type, user_tmp_type) ++ manage_fifo_files_pattern($2, user_tmp_type, user_tmp_type) + files_tmp_filetrans($2, user_tmp_t, { dir file lnk_file sock_file fifo_file }) ++ fs_tmpfs_filetrans($2, user_tmp_t, { dir file lnk_file sock_file fifo_file }) ++ relabel_dirs_pattern($2, user_tmp_type, user_tmp_type) ++ relabel_files_pattern($2, user_tmp_type, user_tmp_type) ++ relabel_lnk_files_pattern($2, user_tmp_type, user_tmp_type) ++ relabel_sock_files_pattern($2, user_tmp_type, user_tmp_type) ++ relabel_fifo_files_pattern($2, user_tmp_type, user_tmp_type) ++') ++ ++####################################### ++## ++## Dontaudit search of user bin dirs. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_search_user_bin_dirs',` ++ gen_require(` ++ type home_bin_t; ++ ') ++ ++ dontaudit $1 home_bin_t:dir search_dir_perms; ++') ++ ++####################################### ++## ++## Execute user bin files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_exec_user_bin_files',` ++ gen_require(` ++ attribute user_home_type; ++ type home_bin_t, user_home_dir_t; ++ ') ++ ++ exec_files_pattern($1, { user_home_dir_t user_home_type }, home_bin_t) ++ files_search_home($1) + ') + + ####################################### +@@ -317,9 +503,29 @@ interface(`userdom_exec_user_tmp_files',` + ') + + exec_files_pattern($1, user_tmp_t, user_tmp_t) ++ dontaudit $1 user_tmp_t:sock_file execute; + files_search_tmp($1) + ') + ++####################################### ++## ++## Manage user temporary file system files ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_manage_tmpfs_files',` ++ gen_require(` ++ type user_tmpfs_t; ++ ') ++ ++ manage_files_pattern($1, user_tmpfs_t, user_tmpfs_t) ++') ++ + ####################################### + ## + ## Role access for the user tmpfs type +@@ -347,60 +553,45 @@ interface(`userdom_exec_user_tmp_files',` + ## + # + interface(`userdom_manage_tmpfs_role',` +- gen_require(` +- type user_tmpfs_t; +- ') +- +- manage_dirs_pattern($2, user_tmpfs_t, user_tmpfs_t) +- manage_files_pattern($2, user_tmpfs_t, user_tmpfs_t) +- manage_lnk_files_pattern($2, user_tmpfs_t, user_tmpfs_t) +- manage_sock_files_pattern($2, user_tmpfs_t, user_tmpfs_t) +- manage_fifo_files_pattern($2, user_tmpfs_t, user_tmpfs_t) +- fs_tmpfs_filetrans($2, user_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++ refpolicywarn(`$0($*) has been deprecated, use userdom_manage_tmp_role() instead.') ++ userdom_manage_tmp_role($1,$2) + ') + + ####################################### + ## +-## The template allowing the user basic ++## The interface allowing the user basic + ## network permissions + ## +-## ++## + ## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). ++## The user domain + ## + ## + ## + # +-template(`userdom_basic_networking_template',` +- gen_require(` +- type $1_t; +- ') ++interface(`userdom_basic_networking',` + +- allow $1_t self:tcp_socket create_stream_socket_perms; +- allow $1_t self:udp_socket create_socket_perms; ++ allow $1 self:tcp_socket create_stream_socket_perms; ++ allow $1 self:udp_socket create_socket_perms; + +- corenet_all_recvfrom_unlabeled($1_t) +- corenet_all_recvfrom_netlabel($1_t) +- corenet_tcp_sendrecv_generic_if($1_t) +- corenet_udp_sendrecv_generic_if($1_t) +- corenet_tcp_sendrecv_generic_node($1_t) +- corenet_udp_sendrecv_generic_node($1_t) +- corenet_tcp_sendrecv_all_ports($1_t) +- corenet_udp_sendrecv_all_ports($1_t) +- corenet_tcp_connect_all_ports($1_t) +- corenet_sendrecv_all_client_packets($1_t) +- +- corenet_all_recvfrom_labeled($1_t, $1_t) ++ corenet_tcp_sendrecv_generic_if($1) ++ corenet_udp_sendrecv_generic_if($1) ++ corenet_tcp_sendrecv_generic_node($1) ++ corenet_udp_sendrecv_generic_node($1) ++ corenet_tcp_sendrecv_all_ports($1) ++ corenet_udp_sendrecv_all_ports($1) ++ corenet_tcp_connect_all_ports($1) ++ corenet_sendrecv_all_client_packets($1) + + optional_policy(` +- init_tcp_recvfrom_all_daemons($1_t) +- init_udp_recvfrom_all_daemons($1_t) ++ init_tcp_recvfrom_all_daemons($1) ++ init_udp_recvfrom_all_daemons($1) + ') + + optional_policy(` +- ipsec_match_default_spd($1_t) ++ ipsec_match_default_spd($1) + ') ++ + ') + + ####################################### +@@ -431,6 +622,7 @@ template(`userdom_xwindows_client_template',` + dev_dontaudit_rw_dri($1_t) + # GNOME checks for usb and other devices: + dev_rw_usbfs($1_t) ++ dev_rw_generic_usb_dev($1_t) + + xserver_user_x_domain_template($1, $1_t, user_tmpfs_t) + xserver_xsession_entry_type($1_t) +@@ -463,8 +655,8 @@ template(`userdom_change_password_template',` + ') + + optional_policy(` +- usermanage_run_chfn($1_t, $1_r) +- usermanage_run_passwd($1_t, $1_r) ++ usermanage_run_chfn($1_t,$1_r) ++ usermanage_run_passwd($1_t,$1_r) + ') + ') + +@@ -491,51 +683,69 @@ template(`userdom_common_user_template',` + attribute unpriv_userdomain; + ') + +- userdom_basic_networking_template($1) ++ userdom_basic_networking($1_usertype) ++ corenet_all_recvfrom_netlabel($1_t) + + ############################## + # + # User domain Local policy + # ++ allow $1_t self:packet_socket create_socket_perms; + + # evolution and gnome-session try to create a netlink socket + dontaudit $1_t self:netlink_socket { create ioctl read getattr write setattr append bind connect getopt setopt shutdown }; + dontaudit $1_t self:netlink_route_socket { create ioctl read getattr write setattr append bind connect getopt setopt shutdown nlmsg_read nlmsg_write }; ++ allow $1_t self:netlink_kobject_uevent_socket create_socket_perms; ++ allow $1_t self:socket create_socket_perms; + +- allow $1_t unpriv_userdomain:fd use; ++ allow $1_usertype unpriv_userdomain:fd use; + + kernel_read_system_state($1_t) +- kernel_read_network_state($1_t) +- kernel_read_net_sysctls($1_t) ++ kernel_read_network_state($1_usertype) ++ kernel_read_software_raid_state($1_usertype) ++ kernel_read_net_sysctls($1_usertype) ++ kernel_read_afs_state($1_usertype) + # Very permissive allowing every domain to see every type: +- kernel_get_sysvipc_info($1_t) ++ kernel_get_sysvipc_info($1_usertype) + # Find CDROM devices: +- kernel_read_device_sysctls($1_t) +- +- corecmd_exec_bin($1_t) ++ kernel_read_device_sysctls($1_usertype) ++ kernel_request_load_module($1_usertype) + +- corenet_udp_bind_generic_node($1_t) +- corenet_udp_bind_generic_port($1_t) ++ corenet_udp_bind_generic_node($1_usertype) ++ corenet_udp_bind_generic_port($1_usertype) + +- dev_read_rand($1_t) +- dev_write_sound($1_t) +- dev_read_sound($1_t) +- dev_read_sound_mixer($1_t) +- dev_write_sound_mixer($1_t) ++ dev_read_rand($1_usertype) ++ dev_write_sound($1_usertype) ++ dev_read_sound($1_usertype) ++ dev_read_sound_mixer($1_usertype) ++ dev_write_sound_mixer($1_usertype) + +- files_exec_etc_files($1_t) +- files_search_locks($1_t) ++ files_exec_etc_files($1_usertype) ++ files_search_locks($1_usertype) + # Check to see if cdrom is mounted +- files_search_mnt($1_t) ++ files_search_mnt($1_usertype) + # cjp: perhaps should cut back on file reads: +- files_read_var_files($1_t) +- files_read_var_symlinks($1_t) +- files_read_generic_spool($1_t) +- files_read_var_lib_files($1_t) ++ files_read_var_files($1_usertype) ++ files_read_var_symlinks($1_usertype) ++ files_read_generic_spool($1_usertype) ++ files_read_var_lib_files($1_usertype) + # Stat lost+found. +- files_getattr_lost_found_dirs($1_t) ++ files_getattr_lost_found_dirs($1_usertype) ++ files_read_config_files($1_usertype) ++ fs_read_noxattr_fs_files($1_usertype) ++ fs_read_noxattr_fs_symlinks($1_usertype) ++ fs_rw_cgroup_files($1_usertype) ++ ++ application_getattr_socket($1_usertype) ++ + +- fs_rw_cgroup_files($1_t) ++ ifdef(`enable_mls',` ++ init_rw_tcp_sockets($1_t) ++ ') ++ ++ logging_send_syslog_msg($1_t) ++ ++ selinux_get_enforce_mode($1_t) + + # cjp: some of this probably can be removed + selinux_get_fs_mount($1_t) +@@ -546,93 +756,141 @@ template(`userdom_common_user_template',` + selinux_compute_user_contexts($1_t) + + # for eject +- storage_getattr_fixed_disk_dev($1_t) ++ storage_getattr_fixed_disk_dev($1_usertype) + +- auth_use_nsswitch($1_t) +- auth_read_login_records($1_t) +- auth_search_pam_console_data($1_t) +- auth_run_pam($1_t, $1_r) +- auth_run_utempter($1_t, $1_r) ++ auth_read_login_records($1_usertype) ++ auth_run_pam_timestamp($1_t,$1_r) ++ auth_run_utempter($1_t,$1_r) ++ auth_filetrans_admin_home_content($1_t) + +- init_read_utmp($1_t) ++ init_read_utmp($1_usertype) + +- seutil_read_file_contexts($1_t) +- seutil_read_default_contexts($1_t) +- seutil_run_newrole($1_t, $1_r) ++ seutil_read_file_contexts($1_usertype) ++ seutil_read_default_contexts($1_usertype) ++ seutil_run_newrole($1_t,$1_r) + seutil_exec_checkpolicy($1_t) +- seutil_exec_setfiles($1_t) ++ seutil_exec_setfiles($1_usertype) + # for when the network connection is killed + # this is needed when a login role can change + # to this one. + seutil_dontaudit_signal_newrole($1_t) + +- tunable_policy(`user_direct_mouse',` +- dev_read_mouse($1_t) +- ') ++ term_getattr_all_ttys($1_t) ++ ++ optional_policy(` ++ afs_read_config($1_t) ++ ') + +- tunable_policy(`user_ttyfile_stat',` +- term_getattr_all_ttys($1_t) ++ optional_policy(` ++ # Allow graphical boot to check battery lifespan ++ apm_stream_connect($1_usertype) + ') + + optional_policy(` +- alsa_home_filetrans_alsa_home($1_t, file, ".asoundrc") +- alsa_manage_home_files($1_t) +- alsa_read_rw_config($1_t) +- alsa_relabel_home_files($1_t) ++ chrome_role($1_r, $1_usertype) + ') + + optional_policy(` +- # Allow graphical boot to check battery lifespan +- apm_stream_connect($1_t) ++ canna_stream_connect($1_usertype) + ') + + optional_policy(` +- canna_stream_connect($1_t) ++ colord_read_lib_files($1_usertype) + ') + + optional_policy(` +- dbus_system_bus_client($1_t) ++ dbus_system_bus_client($1_usertype) ++ ++ allow $1_usertype $1_usertype:dbus send_msg; ++ ++ optional_policy(` ++ avahi_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ bluetooth_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ consolekit_dbus_chat($1_usertype) ++ consolekit_read_log($1_usertype) ++ ') ++ ++ optional_policy(` ++ devicekit_dbus_chat($1_usertype) ++ devicekit_dbus_chat_power($1_usertype) ++ devicekit_dbus_chat_disk($1_usertype) ++ ') ++ ++ optional_policy(` ++ evolution_dbus_chat($1_usertype) ++ evolution_alarm_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ firewalld_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ geoclue_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ gnome_dbus_chat_gconfdefault($1_usertype) ++ ') + + optional_policy(` +- bluetooth_dbus_chat($1_t) ++ hal_dbus_chat($1_usertype) + ') + + optional_policy(` +- consolekit_dbus_chat($1_t) ++ hwloc_exec_dhwd($1_t) ++ hwloc_read_runtime_files($1_t) ++ ') ++ ++ optional_policy(` ++ kde_dbus_chat_backlighthelper($1_usertype) + ') + ++ optional_policy(` ++ memcached_stream_connect($1_usertype) ++ ') ++ + optional_policy(` +- cups_dbus_chat_config($1_t) ++ modemmanager_dbus_chat($1_usertype) + ') + + optional_policy(` +- hal_dbus_chat($1_t) ++ networkmanager_dbus_chat($1_usertype) ++ networkmanager_read_lib_files($1_usertype) + ') + + optional_policy(` +- networkmanager_dbus_chat($1_t) ++ policykit_dbus_chat($1_usertype) + ') + + optional_policy(` +- policykit_dbus_chat($1_t) ++ vpn_dbus_chat($1_usertype) + ') + ') + + optional_policy(` +- inetd_use_fds($1_t) +- inetd_rw_tcp_sockets($1_t) ++ git_role($1_r, $1_t) + ') + + optional_policy(` +- inn_read_config($1_t) +- inn_read_news_lib($1_t) +- inn_read_news_spool($1_t) ++ inetd_use_fds($1_usertype) ++ inetd_rw_tcp_sockets($1_usertype) + ') + + optional_policy(` +- kerberos_manage_krb5_home_files($1_t) +- kerberos_relabel_krb5_home_files($1_t) +- kerberos_home_filetrans_krb5_home($1_t, file, ".k5login") ++ inn_read_config($1_usertype) ++ inn_read_news_lib($1_usertype) ++ inn_read_news_spool($1_usertype) ++ ') ++ ++ optional_policy(` ++ lircd_stream_connect($1_usertype) + ') + + optional_policy(` +@@ -642,23 +900,21 @@ template(`userdom_common_user_template',` + optional_policy(` + mpd_manage_user_data_content($1_t) + mpd_relabel_user_data_content($1_t) ++ mpd_stream_connect($1_t) + ') + + # for running depmod as part of the kernel packaging process + optional_policy(` +- modutils_read_module_config($1_t) ++ modutils_read_module_config($1_usertype) + ') + + optional_policy(` +- mta_rw_spool($1_t) ++ mta_rw_spool($1_usertype) ++ mta_manage_queue($1_usertype) + ') + + optional_policy(` +- mysql_manage_mysqld_home_files($1_t) +- mysql_relabel_mysqld_home_files($1_t) +- mysql_home_filetrans_mysqld_home($1_t, file, ".my.cnf") +- +- tunable_policy(`allow_user_mysql_connect',` ++ tunable_policy(`selinuxuser_mysql_connect_enabled',` + mysql_stream_connect($1_t) + ') + ') +@@ -671,7 +927,7 @@ template(`userdom_common_user_template',` + + optional_policy(` + # to allow monitoring of pcmcia status +- pcmcia_read_pid($1_t) ++ pcmcia_read_pid($1_usertype) + ') + + optional_policy(` +@@ -680,9 +936,9 @@ template(`userdom_common_user_template',` + ') + + optional_policy(` +- tunable_policy(`allow_user_postgresql_connect',` +- postgresql_stream_connect($1_t) +- postgresql_tcp_connect($1_t) ++ tunable_policy(`selinuxuser_postgresql_connect_enabled',` ++ postgresql_stream_connect($1_usertype) ++ postgresql_tcp_connect($1_usertype) + ') + ') + +@@ -693,32 +949,35 @@ template(`userdom_common_user_template',` + ') + + optional_policy(` +- resmgr_stream_connect($1_t) ++ resmgr_stream_connect($1_usertype) + ') + + optional_policy(` +- rpc_dontaudit_getattr_exports($1_t) +- rpc_manage_nfs_rw_content($1_t) ++ rpc_dontaudit_getattr_exports($1_usertype) + ') + + optional_policy(` +- samba_stream_connect_winbind($1_t) ++ rpcbind_stream_connect($1_usertype) + ') + + optional_policy(` +- slrnpull_search_spool($1_t) ++ samba_stream_connect_winbind($1_usertype) + ') + + optional_policy(` +- usernetctl_run($1_t, $1_r) ++ sandbox_transition($1_usertype, $1_r) + ') + + optional_policy(` +- virt_home_filetrans_virt_home($1_t, dir, ".libvirt") +- virt_home_filetrans_virt_home($1_t, dir, ".virtinst") +- virt_home_filetrans_virt_content($1_t, dir, "isos") +- virt_home_filetrans_svirt_home($1_t, dir, "qemu") +- virt_home_filetrans_virt_home($1_t, dir, "VirtualMachines") ++ seunshare_role_template($1, $1_r, $1_t) ++ ') ++ ++ optional_policy(` ++ slrnpull_search_spool($1_usertype) ++ ') ++ ++ optional_policy(` ++ thumb_role($1_r, $1_usertype) + ') + ') + +@@ -743,17 +1002,32 @@ template(`userdom_common_user_template',` + template(`userdom_login_user_template', ` + gen_require(` + class context contains; ++ attribute login_userdomain; + ') + + userdom_base_user_template($1) + ++ typeattribute $1_t login_userdomain; ++ + userdom_manage_home_role($1_r, $1_t) + +- userdom_manage_tmp_role($1_r, $1_t) +- userdom_manage_tmpfs_role($1_r, $1_t) ++ userdom_manage_tmp_role($1_r, $1_usertype) ++ ++ ifelse(`$1',`unconfined',`',` ++ gen_tunable($1_exec_content, true) + +- userdom_exec_user_tmp_files($1_t) +- userdom_exec_user_home_content_files($1_t) ++ tunable_policy(`$1_exec_content',` ++ userdom_exec_user_tmp_files($1_usertype) ++ userdom_exec_user_home_content_files($1_usertype) ++ ') ++ tunable_policy(`$1_exec_content && use_nfs_home_dirs',` ++ fs_exec_nfs_files($1_usertype) ++ ') ++ ++ tunable_policy(`$1_exec_content && use_samba_home_dirs',` ++ fs_exec_cifs_files($1_usertype) ++ ') ++ ') + + userdom_change_password_template($1) + +@@ -761,86 +1035,118 @@ template(`userdom_login_user_template', ` + # + # User domain Local policy + # +- +- allow $1_t self:capability { setgid chown fowner }; + dontaudit $1_t self:capability { sys_nice fsetid }; ++ allow $1_t self:process ~{ ptrace execmem execstack execheap }; ++ ++ tunable_policy(`selinuxuser_use_ssh_chroot',` ++ allow $1_t self:capability { setuid setgid sys_chroot }; ++ ') + +- allow $1_t self:process ~{ setcurrent setexec setrlimit execmem execstack execheap }; + dontaudit $1_t self:process setrlimit; + dontaudit $1_t self:netlink_route_socket { create ioctl read getattr write setattr append bind connect getopt setopt shutdown nlmsg_read nlmsg_write }; ++ domain_dyntrans_type($1_t) + + allow $1_t self:context contains; + +- kernel_dontaudit_read_system_state($1_t) ++ kernel_dontaudit_read_system_state($1_usertype) ++ kernel_dontaudit_list_all_proc($1_usertype) + +- dev_read_sysfs($1_t) +- dev_read_urand($1_t) ++ dev_read_sysfs($1_usertype) ++ dev_read_rand($1_usertype) ++ dev_read_urand($1_usertype) + +- domain_use_interactive_fds($1_t) ++ domain_use_interactive_fds($1_usertype) + # Command completion can fire hundreds of denials +- domain_dontaudit_exec_all_entry_files($1_t) ++ domain_dontaudit_exec_all_entry_files($1_usertype) + +- files_dontaudit_list_default($1_t) +- files_dontaudit_read_default_files($1_t) ++ files_dontaudit_list_default($1_usertype) ++ files_dontaudit_read_default_files($1_usertype) + # Stat lost+found. +- files_getattr_lost_found_dirs($1_t) ++ files_getattr_lost_found_dirs($1_usertype) + +- fs_get_all_fs_quotas($1_t) +- fs_getattr_all_fs($1_t) +- fs_getattr_all_dirs($1_t) +- fs_search_auto_mountpoints($1_t) +- fs_list_cgroup_dirs($1_t) +- fs_list_inotifyfs($1_t) +- fs_rw_anon_inodefs_files($1_t) +- fs_dontaudit_rw_cgroup_files($1_t) ++ fs_get_all_fs_quotas($1_usertype) ++ fs_getattr_all_fs($1_usertype) ++ fs_search_all($1_usertype) ++ fs_list_inotifyfs($1_usertype) ++ fs_rw_anon_inodefs_files($1_usertype) + ++ auth_role($1_r, $1_t) ++ auth_create_cache($1_t) ++ auth_rw_cache($1_t) ++ auth_search_pam_console_data($1_t) ++ auth_dontaudit_read_login_records($1_t) + auth_dontaudit_write_login_records($1_t) + + application_exec_all($1_t) +- + # The library functions always try to open read-write first, + # then fall back to read-only if it fails. + init_dontaudit_rw_utmp($1_t) ++ + # Stop warnings about access to /dev/console +- init_dontaudit_use_fds($1_t) +- init_dontaudit_use_script_fds($1_t) ++ init_dontaudit_use_fds($1_usertype) ++ init_dontaudit_use_script_fds($1_usertype) + +- libs_exec_lib_files($1_t) ++ libs_exec_lib_files($1_usertype) + +- logging_dontaudit_getattr_all_logs($1_t) ++ logging_dontaudit_getattr_all_logs($1_usertype) + +- miscfiles_read_man_pages($1_t) + # for running TeX programs +- miscfiles_read_tetex_data($1_t) +- miscfiles_exec_tetex_data($1_t) ++ miscfiles_read_tetex_data($1_usertype) ++ miscfiles_exec_tetex_data($1_usertype) + +- seutil_read_config($1_t) ++ seutil_read_config($1_usertype) ++ seutil_read_file_contexts($1_usertype) ++ seutil_read_default_contexts($1_usertype) ++ seutil_exec_setfiles($1_usertype) + + optional_policy(` +- cups_read_config($1_t) +- cups_stream_connect($1_t) +- cups_stream_connect_ptal($1_t) ++ cups_read_config($1_usertype) ++ cups_stream_connect($1_usertype) ++ cups_stream_connect_ptal($1_usertype) + ') + + optional_policy(` +- kerberos_use($1_t) ++ kerberos_use($1_usertype) ++ init_write_key($1_usertype) + ') + + optional_policy(` +- mta_dontaudit_read_spool_symlinks($1_t) ++ mysql_filetrans_named_content($1_usertype) + ') + + optional_policy(` +- quota_dontaudit_getattr_db($1_t) ++ mta_dontaudit_read_spool_symlinks($1_usertype) + ') + + optional_policy(` +- rpm_read_db($1_t) +- rpm_dontaudit_manage_db($1_t) ++ quota_dontaudit_getattr_db($1_usertype) + ') +-') + +-####################################### ++ optional_policy(` ++ rpm_read_db($1_usertype) ++ rpm_dontaudit_manage_db($1_usertype) ++ rpm_read_cache($1_usertype) ++ ') ++ ++ optional_policy(` ++ oddjob_run_mkhomedir($1_t, $1_r) ++ oddjob_run($1_t, $1_r) ++ ') ++ ++ optional_policy(` ++ chronyd_run_chronyc($1_t, $1_r) ++ ') ++ ++ optional_policy(` ++ ipa_run_helper($1_t, $1_r) ++ ') ++ ++ optional_policy(` ++ wine_filetrans_named_content($1_usertype) ++ ') ++') ++ ++####################################### + ## + ## The template for creating a unprivileged login user. + ## +@@ -868,6 +1174,12 @@ template(`userdom_restricted_user_template',` + typeattribute $1_t unpriv_userdomain; + domain_interactive_fd($1_t) + ++ allow $1_usertype self:netlink_kobject_uevent_socket create_socket_perms; ++ dontaudit $1_usertype self:netlink_audit_socket create_socket_perms; ++ ++ seutil_read_file_contexts($1_t) ++ seutil_read_default_contexts($1_t) ++ + ############################## + # + # Local policy +@@ -907,53 +1219,137 @@ template(`userdom_restricted_xwindows_user_template',` + # + # Local policy + # ++ kernel_stream_connect($1_usertype) + +- auth_role($1_r, $1_t) +- auth_search_pam_console_data($1_t) +- +- dev_read_sound($1_t) +- dev_write_sound($1_t) ++ dev_read_sound($1_usertype) ++ dev_write_sound($1_usertype) + # gnome keyring wants to read this. +- dev_dontaudit_read_rand($1_t) ++ dev_dontaudit_read_rand($1_usertype) ++ # temporarily allow since openoffice requires this ++ dev_read_rand($1_usertype) ++ ++ dev_read_video_dev($1_usertype) ++ dev_write_video_dev($1_usertype) ++ dev_rw_wireless($1_usertype) ++ ++ libs_dontaudit_setattr_lib_files($1_usertype) ++ ++ init_read_state($1_usertype) ++ ++ tunable_policy(`selinuxuser_rw_noexattrfile',` ++ dev_rw_usbfs($1_t) ++ dev_rw_generic_usb_dev($1_usertype) ++ ++ fs_manage_noxattr_fs_files($1_usertype) ++ fs_manage_noxattr_fs_dirs($1_usertype) ++ fs_manage_dos_dirs($1_usertype) ++ fs_manage_dos_files($1_usertype) ++ storage_raw_read_removable_device($1_usertype) ++ storage_raw_write_removable_device($1_usertype) ++ ') + + logging_send_syslog_msg($1_t) + logging_dontaudit_send_audit_msgs($1_t) + + # Need to to this just so screensaver will work. Should be moved to screensaver domain +- logging_send_audit_msgs($1_t) + selinux_get_enforce_mode($1_t) ++ seutil_exec_restorecond($1_t) ++ seutil_read_file_contexts($1_t) ++ seutil_read_default_contexts($1_t) + + xserver_restricted_role($1_r, $1_t) + + optional_policy(` +- alsa_read_rw_config($1_t) ++ alsa_read_rw_config($1_usertype) ++ ') ++ ++ # cjp: needed by KDE apps ++ # bug: #682499 ++ optional_policy(` ++ gnome_read_usr_config($1_usertype) ++ # cjp: telepathy F15 bugs ++ telepathy_role($1_r, $1_t, $1) ++ ') ++ ++ optional_policy(` ++ obex_role($1_r, $1_t, $1) + ') + + optional_policy(` +- dbus_role_template($1, $1_r, $1_t) +- dbus_system_bus_client($1_t) ++ dbus_role_template($1, $1_r, $1_usertype) ++ dbus_system_bus_client($1_usertype) ++ allow $1_usertype $1_usertype:dbus send_msg; ++ ++ optional_policy(` ++ abrt_dbus_chat($1_usertype) ++ abrt_run_helper($1_usertype, $1_r) ++ ') ++ ++ optional_policy(` ++ accountsd_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ consolekit_dontaudit_read_log($1_usertype) ++ consolekit_dbus_chat($1_usertype) ++ ') ++ ++ optional_policy(` ++ cups_dbus_chat($1_usertype) ++ cups_dbus_chat_config($1_usertype) ++ ') ++ ++ optional_policy(` ++ devicekit_dbus_chat($1_usertype) ++ devicekit_dbus_chat_disk($1_usertype) ++ devicekit_dbus_chat_power($1_usertype) ++ ') + + optional_policy(` +- consolekit_dbus_chat($1_t) ++ fprintd_dbus_chat($1_t) + ') + + optional_policy(` +- cups_dbus_chat($1_t) ++ realmd_dbus_chat($1_t) + ') + + optional_policy(` + gnome_role_template($1, $1_r, $1_t) ++ ') ++ ++ optional_policy(` + wm_role_template($1, $1_r, $1_t) + ') + ') + + optional_policy(` +- java_role($1_r, $1_t) ++ policykit_role($1_r, $1_usertype) ++ ') ++ ++ optional_policy(` ++ pulseaudio_role($1_r, $1_usertype) ++ pulseaudio_filetrans_admin_home_content($1_usertype) ++ ') ++ ++ optional_policy(` ++ rtkit_scheduled($1_usertype) ++ ') ++ ++ optional_policy(` ++ systemd_filetrans_home_content($1_usertype) + ') + + optional_policy(` + setroubleshoot_dontaudit_stream_connect($1_t) + ') ++ ++ optional_policy(` ++ udev_read_db($1_usertype) ++ ') ++ ++ optional_policy(` ++ xserver_xdm_ioctl_log($1_t) ++ ') + ') + + ####################################### +@@ -987,27 +1383,39 @@ template(`userdom_unpriv_user_template', ` + # + + # Inherit rules for ordinary users. +- userdom_restricted_user_template($1) ++ userdom_restricted_xwindows_user_template($1) + userdom_common_user_template($1) + + ############################## + # + # Local policy + # ++ allow $1_t self:capability { setgid chown fowner }; ++ allow $1_t self:bluetooth_socket create_socket_perms; ++ allow $1_t self:alg_socket create_socket_perms; ++ allow $1_t self:dccp_socket create_socket_perms; ++ allow $1_t self:netlink_tcpdiag_socket create_netlink_socket_perms; ++ dontaudit $1_t self:capability { setuid }; ++ dontaudit $1_t self:netlink_selinux_socket create_socket_perms; ++ ++ corecmd_exec_chroot($1_t) + + # port access is audited even if dac would not have allowed it, so dontaudit it here +- corenet_dontaudit_tcp_bind_all_reserved_ports($1_t) ++# corenet_dontaudit_tcp_bind_all_reserved_ports($1_t) + # Need the following rule to allow users to run vpnc + corenet_tcp_bind_xserver_port($1_t) ++ corenet_tcp_bind_generic_node($1_usertype) ++ ++ storage_rw_fuse($1_t) + + files_exec_usr_files($1_t) +- # cjp: why? ++ # cjp: why? + files_read_kernel_symbol_table($1_t) + + ifndef(`enable_mls',` + fs_exec_noxattr($1_t) + +- tunable_policy(`user_rw_noexattrfile',` ++ tunable_policy(`selinuxuser_rw_noexattrfile',` + fs_manage_noxattr_fs_files($1_t) + fs_manage_noxattr_fs_dirs($1_t) + # Write floppies +@@ -1018,23 +1426,63 @@ template(`userdom_unpriv_user_template', ` + ') + ') + +- tunable_policy(`user_dmesg',` +- kernel_read_ring_buffer($1_t) +- ',` +- kernel_dontaudit_read_ring_buffer($1_t) +- ') ++ miscfiles_read_hwdata($1_usertype) ++ ++ fs_mounton_fusefs($1_usertype) + + # Allow users to run TCP servers (bind to ports and accept connection from + # the same domain and outside users) disabling this forces FTP passive mode + # and may change other protocols +- tunable_policy(`user_tcp_server',` +- corenet_tcp_bind_generic_node($1_t) +- corenet_tcp_bind_generic_port($1_t) ++ ++ tunable_policy(`selinuxuser_share_music',` ++ corenet_tcp_bind_daap_port($1_usertype) ++ ') ++ ++ tunable_policy(`selinuxuser_tcp_server',` ++ corenet_tcp_bind_all_unreserved_ports($1_usertype) ++ ') ++ ++ tunable_policy(`selinuxuser_udp_server',` ++ corenet_udp_bind_all_unreserved_ports($1_usertype) ++ ') ++ optional_policy(` ++ cdrecord_role($1_r, $1_t) ++ ') ++ ++ optional_policy(` ++ cron_role($1_r, $1_t) ++ ') ++ ++ optional_policy(` ++ games_manage_data_files($1_usertype) ++ ') ++ ++ optional_policy(` ++ gpg_role($1_r, $1_usertype) ++ ') ++ ++ optional_policy(` ++ systemd_dbus_chat_timedated($1_t) ++ systemd_dbus_chat_hostnamed($1_t) ++ systemd_dbus_chat_localed($1_t) ++ ') ++ ++ optional_policy(` ++ gpm_stream_connect($1_usertype) ++ ') ++ ++ optional_policy(` ++ mount_run_fusermount($1_t, $1_r) ++ mount_read_pid_files($1_t) + ') + + optional_policy(` +- netutils_run_ping_cond($1_t, $1_r) +- netutils_run_traceroute_cond($1_t, $1_r) ++ wine_role_template($1, $1_r, $1_t) ++ ') ++ ++ optional_policy(` ++ postfix_run_postdrop($1_t, $1_r) ++ postfix_search_spool($1_t) + ') + + # Run pppd in pppd_t by default for user +@@ -1043,7 +1491,9 @@ template(`userdom_unpriv_user_template', ` + ') + + optional_policy(` +- setroubleshoot_stream_connect($1_t) ++ vdagent_getattr_log($1_t) ++ vdagent_getattr_exec_files($1_t) ++ vdagent_stream_connect($1_t) + ') + ') + +@@ -1079,7 +1529,9 @@ template(`userdom_unpriv_user_template', ` + template(`userdom_admin_user_template',` + gen_require(` + attribute admindomain; +- class passwd { passwd chfn chsh rootok }; ++ attribute confined_admindomain; ++ ++ class passwd { passwd chfn chsh rootok crontab }; + ') + + ############################## +@@ -1095,6 +1547,7 @@ template(`userdom_admin_user_template',` + role system_r types $1_t; + + typeattribute $1_t admindomain; ++ typeattribute $1_t confined_admindomain; + + ifdef(`direct_sysadm_daemon',` + domain_system_change_exemption($1_t) +@@ -1105,14 +1558,18 @@ template(`userdom_admin_user_template',` + # $1_t local policy + # + +- allow $1_t self:capability ~{ sys_module audit_control audit_write }; +- allow $1_t self:process { setexec setfscreate }; +- allow $1_t self:netlink_audit_socket nlmsg_readpriv; +- allow $1_t self:tun_socket create; +- # Set password information for other users. +- allow $1_t self:passwd { passwd chfn chsh }; +- # Skip authentication when pam_rootok is specified. +- allow $1_t self:passwd rootok; ++ # Manipulate other users crontab. ++ allow $1_t self:passwd crontab; ++ ++ allow $1_t self:bpf { map_create map_read map_write prog_load prog_run }; ++ ++ ++ allow $1_t self:bluetooth_socket create_stream_socket_perms; ++ allow $1_t self:alg_socket create_socket_perms; ++ ++ allow $1_t self:bluetooth_socket create_socket_perms; ++ allow $1_t self:alg_socket create_socket_perms; ++ allow $1_t self:dccp_socket create_socket_perms; + + kernel_read_software_raid_state($1_t) + kernel_getattr_core_if($1_t) +@@ -1120,6 +1577,7 @@ template(`userdom_admin_user_template',` + kernel_change_ring_buffer_level($1_t) + kernel_clear_ring_buffer($1_t) + kernel_read_ring_buffer($1_t) ++ kernel_read_afs_state($1_t) + kernel_get_sysvipc_info($1_t) + kernel_rw_all_sysctls($1_t) + # signal unlabeled processes: +@@ -1128,6 +1586,8 @@ template(`userdom_admin_user_template',` + kernel_sigstop_unlabeled($1_t) + kernel_signull_unlabeled($1_t) + kernel_sigchld_unlabeled($1_t) ++ kernel_signal($1_t) ++ kernel_stream_connect($1_t) + + corenet_tcp_bind_generic_port($1_t) + # allow setting up tunnels +@@ -1145,10 +1605,15 @@ template(`userdom_admin_user_template',` + dev_rename_all_blk_files($1_t) + dev_rename_all_chr_files($1_t) + dev_create_generic_symlinks($1_t) ++ dev_rw_generic_usb_dev($1_t) ++ dev_rw_usbfs($1_t) ++ dev_read_kmsg($1_t) ++ dev_read_cpuid($1_t) + + domain_setpriority_all_domains($1_t) + domain_read_all_domains_state($1_t) + domain_getattr_all_domains($1_t) ++ domain_getcap_all_domains($1_t) + domain_dontaudit_ptrace_all_domains($1_t) + # signal all domains: + domain_kill_all_domains($1_t) +@@ -1159,29 +1624,40 @@ template(`userdom_admin_user_template',` + domain_sigchld_all_domains($1_t) + # for lsof + domain_getattr_all_sockets($1_t) ++ domain_dontaudit_getattr_all_sockets($1_t) + + files_exec_usr_src_files($1_t) + + fs_getattr_all_fs($1_t) ++ fs_getattr_all_files($1_t) ++ fs_list_all($1_t) + fs_set_all_quotas($1_t) + fs_exec_noxattr($1_t) + + storage_raw_read_removable_device($1_t) + storage_raw_write_removable_device($1_t) ++ storage_dontaudit_read_fixed_disk($1_t) + +- term_use_all_terms($1_t) ++ term_use_all_inherited_terms($1_t) ++ term_use_unallocated_ttys($1_t) + + auth_getattr_shadow($1_t) + # Manage almost all files +- files_manage_non_auth_files($1_t) ++ files_manage_non_security_dirs($1_t) ++ files_manage_non_security_files($1_t) + # Relabel almost all files +- files_relabel_non_auth_files($1_t) ++ files_relabel_non_security_files($1_t) ++ ++ files_mounton_rootfs($1_t) + + init_telinit($1_t) + + logging_send_syslog_msg($1_t) + +- modutils_domtrans_insmod($1_t) ++ optional_policy(` ++ modutils_domtrans_insmod($1_t) ++ modutils_domtrans_depmod($1_t) ++ ') + + # The following rule is temporary until such time that a complete + # policy management infrastructure is in place so that an administrator +@@ -1191,6 +1667,8 @@ template(`userdom_admin_user_template',` + # But presently necessary for installing the file_contexts file. + seutil_manage_bin_policy($1_t) + ++ systemd_config_all_services($1_t) ++ + userdom_manage_user_home_content_dirs($1_t) + userdom_manage_user_home_content_files($1_t) + userdom_manage_user_home_content_symlinks($1_t) +@@ -1198,13 +1676,30 @@ template(`userdom_admin_user_template',` + userdom_manage_user_home_content_sockets($1_t) + userdom_user_home_dir_filetrans_user_home_content($1_t, { dir file lnk_file fifo_file sock_file }) + +- tunable_policy(`user_rw_noexattrfile',` ++ tunable_policy(`selinuxuser_rw_noexattrfile',` + fs_manage_noxattr_fs_files($1_t) + fs_manage_noxattr_fs_dirs($1_t) + ',` + fs_read_noxattr_fs_files($1_t) + ') + ++ tunable_policy(`selinuxuser_tcp_server',` ++ corenet_tcp_bind_all_unreserved_ports($1_t) ++ ') ++ ++ tunable_policy(`selinuxuser_udp_server',` ++ corenet_udp_bind_all_unreserved_ports($1_t) ++ ') ++ ++ optional_policy(` ++ afs_read_config($1_t) ++ ') ++ ++ optional_policy(` ++ abrt_dbus_chat($1_t) ++ abrt_run_helper($1_t, $1_r) ++ ') ++ + optional_policy(` + postgresql_unconfined($1_t) + ') +@@ -1212,6 +1707,12 @@ template(`userdom_admin_user_template',` + optional_policy(` + userhelper_exec($1_t) + ') ++ ++ optional_policy(` ++ vdagent_getattr_log($1_t) ++ vdagent_getattr_exec_files($1_t) ++ vdagent_stream_connect($1_t) ++ ') + ') + + ######################################## +@@ -1240,8 +1741,10 @@ template(`userdom_admin_user_template',` + ## + ## + # +-template(`userdom_security_admin_template',` +- allow $1 self:capability { dac_read_search dac_override }; ++template(`userdom_security_admin',` ++ allow $1 self:capability { audit_control dac_read_search dac_override }; ++ ++ allow $1 self:netlink_audit_socket { nlmsg_write create_netlink_socket_perms }; + + corecmd_exec_shell($1) + +@@ -1250,6 +1753,8 @@ template(`userdom_security_admin_template',` + dev_relabel_all_dev_nodes($1) + + files_create_boot_flag($1) ++ files_create_default_dir($1) ++ files_root_filetrans_default($1, dir) + + # Necessary for managing /boot/efi + fs_manage_dos_files($1) +@@ -1262,8 +1767,10 @@ template(`userdom_security_admin_template',` + selinux_set_enforce_mode($1) + selinux_set_all_booleans($1) + selinux_set_parameters($1) ++ selinux_read_policy($1) ++ ++ files_relabel_all_files($1) + +- files_relabel_non_auth_files($1) + auth_relabel_shadow($1) + + init_exec($1) +@@ -1274,29 +1781,31 @@ template(`userdom_security_admin_template',` + logging_read_audit_config($1) + + seutil_manage_bin_policy($1) +- seutil_run_checkpolicy($1, $2) +- seutil_run_loadpolicy($1, $2) +- seutil_run_semanage($1, $2) ++ seutil_manage_default_contexts($1) ++ seutil_manage_file_contexts($1) ++ seutil_manage_module_store($1) ++ seutil_manage_config($1) ++ seutil_manage_login_config($1) ++ seutil_run_checkpolicy($1,$2) ++ seutil_run_loadpolicy($1,$2) ++ seutil_run_semanage($1,$2) ++ seutil_run_setsebool($1,$2) + seutil_run_setfiles($1, $2) + + optional_policy(` +- aide_run($1, $2) ++ aide_run($1,$2) + ') + + optional_policy(` + consoletype_exec($1) + ') + +- optional_policy(` +- dmesg_exec($1) +- ') +- +- optional_policy(` +- ipsec_run_setkey($1, $2) ++ optional_policy(` ++ ipsec_run_setkey($1,$2) + ') + + optional_policy(` +- netlabel_run_mgmt($1, $2) ++ netlabel_run_mgmt($1,$2) + ') + + optional_policy(` +@@ -1357,14 +1866,17 @@ interface(`userdom_user_home_content',` + gen_require(` + attribute user_home_content_type; + type user_home_t; ++ attribute user_home_type; + ') + + typeattribute $1 user_home_content_type; + + allow $1 user_home_t:filesystem associate; + files_type($1) +- files_poly_member($1) + ubac_constrained($1) ++ ++ files_poly_member($1) ++ typeattribute $1 user_home_type; + ') + + ######################################## +@@ -1397,10 +1909,49 @@ interface(`userdom_user_tmp_file',` + ## + # + interface(`userdom_user_tmpfs_file',` +- files_tmpfs_file($1) ++ refpolicywarn(`$0($*) has been deprecated, use userdom_user_tmp_file() instead.') ++ userdom_user_tmp_file($1) ++') ++ ++######################################## ++## ++## Allow domain to attach to TUN devices created by administrative users. ++## ++## ++## ++## Type to be used as a file in the ++## generic temporary directory. ++## ++## ++# ++interface(`userdom_user_tmp_content',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ typeattribute $1 user_tmp_type; ++ ++ files_tmp_file($1) + ubac_constrained($1) + ') + ++######################################## ++## ++## Make the specified type usable in a ++## generic tmpfs_t directory. ++## ++## ++## ++## Type to be used as a file in the ++## generic temporary directory. ++## ++## ++# ++interface(`userdom_user_tmpfs_content',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_user_tmp_content() instead.') ++ userdom_user_tmp_content($1) ++') ++ + ######################################## + ## + ## Allow domain to attach to TUN devices created by administrative users. +@@ -1509,9 +2060,29 @@ interface(`userdom_search_user_home_dirs',` + ') + + allow $1 user_home_dir_t:dir search_dir_perms; ++ allow $1 user_home_dir_t:lnk_file read_lnk_file_perms; + files_search_home($1) + ') + ++######################################## ++## ++## Search user tmp directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_search_user_tmp_dirs',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 user_tmp_t:dir search_dir_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to search user home directories. +@@ -1555,6 +2126,14 @@ interface(`userdom_list_user_home_dirs',` + + allow $1 user_home_dir_t:dir list_dir_perms; + files_search_home($1) ++ ++ tunable_policy(`use_nfs_home_dirs',` ++ fs_list_nfs($1) ++ ') ++ ++ tunable_policy(`use_samba_home_dirs',` ++ fs_list_cifs($1) ++ ') + ') + + ######################################## +@@ -1570,9 +2149,11 @@ interface(`userdom_list_user_home_dirs',` + interface(`userdom_dontaudit_list_user_home_dirs',` + gen_require(` + type user_home_dir_t; ++ type user_home_t; + ') + + dontaudit $1 user_home_dir_t:dir list_dir_perms; ++ dontaudit $1 user_home_t:dir list_dir_perms; + ') + + ######################################## +@@ -1611,6 +2192,24 @@ interface(`userdom_manage_user_home_dirs',` + allow $1 user_home_dir_t:dir manage_dir_perms; + ') + ++######################################## ++## ++## Create user home directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_dontaudit_manage_user_home_dirs',` ++ gen_require(` ++ type user_home_dir_t; ++ ') ++ ++ dontaudit $1 user_home_dir_t:dir manage_dir_perms; ++') ++ + ######################################## + ## + ## Relabel to user home directories. +@@ -1629,6 +2228,59 @@ interface(`userdom_relabelto_user_home_dirs',` + allow $1 user_home_dir_t:dir relabelto; + ') + ++######################################## ++## ++## Relabel to user home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_relabelto_user_home_files',` ++ gen_require(` ++ type user_home_t; ++ ') ++ ++ allow $1 user_home_t:file relabelto; ++') ++######################################## ++## ++## Relabel user home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_relabel_user_home_files',` ++ gen_require(` ++ type user_home_t; ++ ') ++ ++ allow $1 user_home_t:file relabel_file_perms; ++') ++ ++######################################## ++## ++## Relabel user home directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_relabel_user_home_dirs',` ++ gen_require(` ++ type user_home_dir_t; ++ ') ++ ++ allow $1 user_home_t:dir relabel_file_perms; ++') ++ + ######################################## + ## + ## Create directories in the home dir root with +@@ -1704,10 +2356,12 @@ interface(`userdom_user_home_domtrans',` + # + interface(`userdom_dontaudit_search_user_home_content',` + gen_require(` +- type user_home_t; ++ attribute user_home_type; + ') + +- dontaudit $1 user_home_t:dir search_dir_perms; ++ dontaudit $1 user_home_type:dir search_dir_perms; ++ fs_dontaudit_list_nfs($1) ++ fs_dontaudit_list_cifs($1) + ') + + ######################################## +@@ -1741,10 +2395,12 @@ interface(`userdom_list_all_user_home_content',` + # + interface(`userdom_list_user_home_content',` + gen_require(` +- type user_home_t; ++ type user_home_dir_t; ++ attribute user_home_type; + ') + +- allow $1 user_home_t:dir list_dir_perms; ++ files_list_home($1) ++ allow $1 { user_home_dir_t user_home_type }:dir list_dir_perms; + ') + + ######################################## +@@ -1769,7 +2425,7 @@ interface(`userdom_manage_user_home_content_dirs',` + + ######################################## + ## +-## Delete all user home content directories. ++## Delete directories in a user home subdirectory. + ## + ## + ## +@@ -1777,19 +2433,17 @@ interface(`userdom_manage_user_home_content_dirs',` + ## + ## + # +-interface(`userdom_delete_all_user_home_content_dirs',` ++interface(`userdom_delete_user_home_content_dirs',` + gen_require(` +- attribute user_home_content_type; +- type user_home_dir_t; ++ type user_home_t; + ') + +- userdom_search_user_home_dirs($1) +- delete_files_pattern($1, { user_home_dir_t user_home_content_type }, user_home_content_type) ++ allow $1 user_home_t:dir delete_dir_perms; + ') + + ######################################## + ## +-## Delete directories in a user home subdirectory. ++## Delete all directories in a user home subdirectory. + ## + ## + ## +@@ -1797,31 +2451,125 @@ interface(`userdom_delete_all_user_home_content_dirs',` + ## + ## + # +-interface(`userdom_delete_user_home_content_dirs',` ++interface(`userdom_delete_all_user_home_content_dirs',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:dir delete_dir_perms; ++') ++ ++######################################## ++## ++## Set the attributes of user home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_setattr_user_home_content_files',` + gen_require(` + type user_home_t; + ') + +- allow $1 user_home_t:dir delete_dir_perms; ++ allow $1 user_home_t:file setattr; + ') + + ######################################## + ## +-## Set attributes of all user home content directories. ++## Set the attributes of user tmp files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`userdom_setattr_all_user_home_content_dirs',` ++interface(`userdom_setattr_user_tmp_files',` + gen_require(` +- attribute user_home_content_type; ++ type user_tmp_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 user_home_content_type:dir setattr_dir_perms; ++ allow $1 user_tmp_t:file setattr; ++') ++ ++######################################## ++## ++## Create a user tmp sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_create_user_tmp_sockets',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 user_tmp_t:dir list_dir_perms; ++ create_sock_files_pattern($1, user_tmp_t, user_tmp_t) ++') ++ ++######################################## ++## ++## Dontaudit getattr on user tmp sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`usedom_dontaudit_user_getattr_tmp_sockets',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ dontaudit $1 user_tmp_t:sock_file getattr_sock_file_perms; ++') ++ ++######################################## ++## ++## Relabel user tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_relabel_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file relabel_file_perms; ++') ++ ++######################################## ++## ++## Relabel user tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_relabel_user_tmp_dirs',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:dir relabel_dir_perms; + ') + + ######################################## +@@ -1843,6 +2591,25 @@ interface(`userdom_dontaudit_setattr_user_home_content_files',` + dontaudit $1 user_home_t:file setattr_file_perms; + ') + ++######################################## ++## ++## Set the attributes of all user home directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_setattr_all_user_home_content_dirs',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:dir setattr_dir_perms; ++') ++ + ######################################## + ## + ## Mmap user home files. +@@ -1858,10 +2625,28 @@ interface(`userdom_mmap_user_home_content_files',` + type user_home_dir_t, user_home_t; + ') + +- mmap_files_pattern($1, { user_home_dir_t user_home_t }, user_home_t) ++ mmap_exec_files_pattern($1, { user_home_dir_t user_home_t }, user_home_t) + files_search_home($1) + ') + ++######################################## ++## ++## map user home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_map_user_home_files',` ++ gen_require(` ++ type user_home_t; ++ ') ++ ++ allow $1 user_home_t:file map; ++') ++ + ######################################## + ## + ## Read user home files. +@@ -1875,12 +2660,34 @@ interface(`userdom_mmap_user_home_content_files',` + interface(`userdom_read_user_home_content_files',` + gen_require(` + type user_home_dir_t, user_home_t; ++ attribute user_home_type; + ') + +- read_files_pattern($1, { user_home_dir_t user_home_t }, user_home_t) ++ allow $1 user_home_dir_t:lnk_file read_lnk_file_perms; ++ list_dirs_pattern($1, { user_home_dir_t user_home_type }, { user_home_dir_t user_home_type }) ++ read_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) + files_search_home($1) + ') + ++######################################## ++## ++## Do not audit attempts to getattr user home files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_getattr_user_home_content',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ dontaudit $1 user_home_type:dir getattr; ++ dontaudit $1 user_home_type:file getattr; ++') ++ + ######################################## + ## + ## Do not audit attempts to read user home files. +@@ -1893,11 +2700,14 @@ interface(`userdom_read_user_home_content_files',` + # + interface(`userdom_dontaudit_read_user_home_content_files',` + gen_require(` +- type user_home_t; ++ attribute user_home_type; ++ type user_home_dir_t; + ') + +- dontaudit $1 user_home_t:dir list_dir_perms; +- dontaudit $1 user_home_t:file read_file_perms; ++ dontaudit $1 user_home_dir_t:dir list_dir_perms; ++ dontaudit $1 user_home_type:dir list_dir_perms; ++ dontaudit $1 user_home_type:file read_file_perms; ++ dontaudit $1 user_home_type:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -1938,7 +2748,7 @@ interface(`userdom_dontaudit_write_user_home_content_files',` + + ######################################## + ## +-## Delete all user home content files. ++## Delete files in a user home subdirectory. + ## + ## + ## +@@ -1946,10 +2756,9 @@ interface(`userdom_dontaudit_write_user_home_content_files',` + ## + ## + # +-interface(`userdom_delete_all_user_home_content_files',` ++interface(`userdom_delete_user_home_content_files',` + gen_require(` +- attribute user_home_content_type; +- type user_home_dir_t; ++ type user_home_t; + ') + + userdom_search_user_home_content($1) +@@ -1958,7 +2767,7 @@ interface(`userdom_delete_all_user_home_content_files',` + + ######################################## + ## +-## Delete files in a user home subdirectory. ++## Delete all files in a user home subdirectory. + ## + ## + ## +@@ -1966,12 +2775,66 @@ interface(`userdom_delete_all_user_home_content_files',` + ## + ## + # +-interface(`userdom_delete_user_home_content_files',` ++interface(`userdom_delete_all_user_home_content_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:file delete_file_perms; ++') ++ ++######################################## ++## ++## Delete sock files in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_user_home_content_sock_files',` + gen_require(` + type user_home_t; + ') + +- allow $1 user_home_t:file delete_file_perms; ++ allow $1 user_home_t:sock_file delete_file_perms; ++') ++ ++######################################## ++## ++## Delete all sock files in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_all_user_home_content_sock_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:sock_file delete_file_perms; ++') ++ ++######################################## ++## ++## Delete all files in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_all_user_home_content',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:dir_file_class_set delete_file_perms; + ') + + ######################################## +@@ -2007,8 +2870,7 @@ interface(`userdom_read_user_home_content_symlinks',` + type user_home_dir_t, user_home_t; + ') + +- read_lnk_files_pattern($1, { user_home_dir_t user_home_t }, user_home_t) +- files_search_home($1) ++ allow $1 { user_home_dir_t user_home_t }:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -2024,21 +2886,15 @@ interface(`userdom_read_user_home_content_symlinks',` + # + interface(`userdom_exec_user_home_content_files',` + gen_require(` +- type user_home_dir_t, user_home_t; ++ type user_home_dir_t; ++ attribute user_home_type; + ') + + files_search_home($1) +- exec_files_pattern($1, { user_home_dir_t user_home_t }, user_home_t) +- +- tunable_policy(`use_nfs_home_dirs',` +- fs_exec_nfs_files($1) ++ exec_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ dontaudit $1 user_home_type:sock_file execute; + ') + +- tunable_policy(`use_samba_home_dirs',` +- fs_exec_cifs_files($1) +- ') +-') +- + ######################################## + ## + ## Do not audit attempts to execute user home files. +@@ -2075,6 +2931,7 @@ interface(`userdom_manage_user_home_content_files',` + + manage_files_pattern($1, user_home_t, user_home_t) + allow $1 user_home_dir_t:dir search_dir_perms; ++ allow $1 user_home_t:file map; + files_search_home($1) + ') + +@@ -2120,7 +2977,7 @@ interface(`userdom_manage_user_home_content_symlinks',` + + ######################################## + ## +-## Delete all user home content symbolic links. ++## Delete symbolic links in a user home directory. + ## + ## + ## +@@ -2128,19 +2985,17 @@ interface(`userdom_manage_user_home_content_symlinks',` + ## + ## + # +-interface(`userdom_delete_all_user_home_content_symlinks',` ++interface(`userdom_delete_user_home_content_symlinks',` + gen_require(` +- attribute user_home_content_type; +- type user_home_dir_t; ++ type user_home_t; + ') + +- userdom_search_user_home_dirs($1) +- delete_lnk_files_pattern($1, { user_home_dir_t user_home_content_type }, user_home_content_type) ++ allow $1 user_home_t:lnk_file delete_lnk_file_perms; + ') + + ######################################## + ## +-## Delete symbolic links in a user home directory. ++## Delete all symbolic links in a user home directory. + ## + ## + ## +@@ -2148,12 +3003,12 @@ interface(`userdom_delete_all_user_home_content_symlinks',` + ## + ## + # +-interface(`userdom_delete_user_home_content_symlinks',` ++interface(`userdom_delete_all_user_home_content_symlinks',` + gen_require(` +- type user_home_t; ++ attribute user_home_type; + ') + +- allow $1 user_home_t:lnk_file delete_lnk_file_perms; ++ allow $1 user_home_type:lnk_file delete_lnk_file_perms; + ') + + ######################################## +@@ -2378,6 +3233,25 @@ interface(`userdom_dontaudit_manage_user_tmp_dirs',` + dontaudit $1 user_tmp_t:dir manage_dir_perms; + ') + ++######################################## ++## ++## Read user temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_getattr_user_tmp_files',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ getattr_files_pattern($1, user_tmp_type, user_tmp_type) ++ files_search_tmp($1) ++') ++ + ######################################## + ## + ## Read user temporary files. +@@ -2390,14 +3264,31 @@ interface(`userdom_dontaudit_manage_user_tmp_dirs',` + # + interface(`userdom_read_user_tmp_files',` + gen_require(` +- type user_tmp_t; ++ attribute user_tmp_type; + ') + +- read_files_pattern($1, user_tmp_t, user_tmp_t) +- allow $1 user_tmp_t:dir list_dir_perms; ++ read_files_pattern($1, user_tmp_type, user_tmp_type) ++ allow $1 user_tmp_type:dir list_dir_perms; + files_search_tmp($1) + ') + ++######################################## ++## ++## Read user temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_append_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ allow $1 user_tmp_t:file append_inherited_file_perms; ++') ++ + ######################################## + ## + ## Do not audit attempts to read users +@@ -2414,7 +3305,7 @@ interface(`userdom_dontaudit_read_user_tmp_files',` + type user_tmp_t; + ') + +- dontaudit $1 user_tmp_t:file read_file_perms; ++ dontaudit $1 user_tmp_t:file read_inherited_file_perms; + ') + + ######################################## +@@ -2455,6 +3346,25 @@ interface(`userdom_rw_user_tmp_files',` + rw_files_pattern($1, user_tmp_t, user_tmp_t) + files_search_tmp($1) + ') ++######################################## ++## ++## Read and write user temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_user_tmp_sock_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:dir list_dir_perms; ++ allow $1 user_tmp_t:sock_file rw_inherited_sock_file_perms; ++ files_search_tmp($1) ++') + + ######################################## + ## +@@ -2538,7 +3448,7 @@ interface(`userdom_manage_user_tmp_files',` + ######################################## + ## + ## Create, read, write, and delete user +-## temporary symbolic links. ++## temporary files. + ## + ## + ## +@@ -2546,19 +3456,19 @@ interface(`userdom_manage_user_tmp_files',` + ## + ## + # +-interface(`userdom_manage_user_tmp_symlinks',` ++interface(`userdom_filetrans_named_user_tmp_files',` + gen_require(` + type user_tmp_t; + ') + +- manage_lnk_files_pattern($1, user_tmp_t, user_tmp_t) ++ files_tmp_filetrans($1, user_tmp_t, dir, "hsperfdata_root") + files_search_tmp($1) + ') + + ######################################## + ## + ## Create, read, write, and delete user +-## temporary named pipes. ++## temporary symbolic links. + ## + ## + ## +@@ -2566,19 +3476,60 @@ interface(`userdom_manage_user_tmp_symlinks',` + ## + ## + # +-interface(`userdom_manage_user_tmp_pipes',` ++interface(`userdom_manage_user_tmp_symlinks',` + gen_require(` + type user_tmp_t; + ') + +- manage_fifo_files_pattern($1, user_tmp_t, user_tmp_t) ++ manage_lnk_files_pattern($1, user_tmp_t, user_tmp_t) + files_search_tmp($1) + ') + + ######################################## + ## + ## Create, read, write, and delete user +-## temporary named sockets. ++## temporary named pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_inherited_user_tmp_pipes',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:fifo_file rw_inherited_fifo_file_perms; ++ files_search_tmp($1) ++') ++ ++ ++######################################## ++## ++## Create, read, write, and delete user ++## temporary named pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_user_tmp_pipes',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_fifo_files_pattern($1, user_tmp_t, user_tmp_t) ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Create, read, write, and delete user ++## temporary named sockets. + ## + ## + ## +@@ -2661,6 +3612,21 @@ interface(`userdom_tmp_filetrans_user_tmp',` + files_tmp_filetrans($1, user_tmp_t, $2, $3) + ') + ++####################################### ++## ++## Getattr user tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_getattr_user_tmpfs_files',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_getattr_user_tmp_files() instead.') ++ userdom_getattr_user_tmp_files($1) ++') ++ + ######################################## + ## + ## Read user tmpfs files. +@@ -2672,18 +3638,13 @@ interface(`userdom_tmp_filetrans_user_tmp',` + ## + # + interface(`userdom_read_user_tmpfs_files',` +- gen_require(` +- type user_tmpfs_t; +- ') +- +- read_files_pattern($1, user_tmpfs_t, user_tmpfs_t) +- allow $1 user_tmpfs_t:dir list_dir_perms; +- fs_search_tmpfs($1) ++ refpolicywarn(`$0($*) has been deprecated, use userdom_read_user_tmp_files() instead.') ++ userdom_read_user_tmp_files($1) + ') + + ######################################## + ## +-## Read user tmpfs files. ++## Read/Write user tmpfs files. + ## + ## + ## +@@ -2692,19 +3653,13 @@ interface(`userdom_read_user_tmpfs_files',` + ## + # + interface(`userdom_rw_user_tmpfs_files',` +- gen_require(` +- type user_tmpfs_t; +- ') +- +- rw_files_pattern($1, user_tmpfs_t, user_tmpfs_t) +- read_lnk_files_pattern($1, user_tmpfs_t, user_tmpfs_t) +- allow $1 user_tmpfs_t:dir list_dir_perms; +- fs_search_tmpfs($1) ++ refpolicywarn(`$0($*) has been deprecated, use userdom_rw_user_tmp_files() instead.') ++ userdom_rw_user_tmp_files($1) + ') + + ######################################## + ## +-## Create, read, write, and delete user tmpfs files. ++## Manage user tmpfs files. + ## + ## + ## +@@ -2713,13 +3668,56 @@ interface(`userdom_rw_user_tmpfs_files',` + ## + # + interface(`userdom_manage_user_tmpfs_files',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_manage_user_tmp_files() instead.') ++ userdom_manage_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Read/Write inherited user tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_inherited_user_tmpfs_files',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_rw_inherited_user_tmp_files instead.') ++ userdom_rw_inherited_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Execute user tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_execute_user_tmpfs_files',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_execute_user_tmp_files instead.') ++ userdom_execute_user_tmp_files($1) ++') ++ ++######################################## ++## ++## Execute user tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_execute_user_tmp_files',` + gen_require(` +- type user_tmpfs_t; ++ type user_tmp_t; + ') + +- manage_files_pattern($1, user_tmpfs_t, user_tmpfs_t) +- allow $1 user_tmpfs_t:dir list_dir_perms; +- fs_search_tmpfs($1) ++ allow $1 user_tmp_t:file execute; + ') + + ######################################## +@@ -2812,6 +3810,24 @@ interface(`userdom_use_user_ttys',` + allow $1 user_tty_device_t:chr_file rw_term_perms; + ') + ++######################################## ++## ++## Read and write a inherited user domain tty. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_use_inherited_user_ttys',` ++ gen_require(` ++ type user_tty_device_t; ++ ') ++ ++ allow $1 user_tty_device_t:chr_file rw_inherited_term_perms; ++') ++ + ######################################## + ## + ## Read and write a user domain pty. +@@ -2832,22 +3848,34 @@ interface(`userdom_use_user_ptys',` + + ######################################## + ## +-## Read and write a user TTYs and PTYs. ++## Read and write a inherited user domain pty. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_use_inherited_user_ptys',` ++ gen_require(` ++ type user_devpts_t; ++ ') ++ ++ allow $1 user_devpts_t:chr_file rw_inherited_term_perms; ++') ++ ++######################################## ++## ++## Read and write a inherited user TTYs and PTYs. + ## + ## + ##

      +-## Allow the specified domain to read and write user ++## Allow the specified domain to read and write inherited user + ## TTYs and PTYs. This will allow the domain to + ## interact with the user via the terminal. Typically + ## all interactive applications will require this + ## access. + ##

      +-##

      +-## However, this also allows the applications to spy +-## on user sessions or inject information into the +-## user session. Thus, this access should likely +-## not be allowed for non-interactive domains. +-##

      + ##
      + ## + ## +@@ -2856,14 +3884,33 @@ interface(`userdom_use_user_ptys',` + ## + ## + # +-interface(`userdom_use_user_terminals',` ++interface(`userdom_use_inherited_user_terminals',` + gen_require(` + type user_tty_device_t, user_devpts_t; + ') + +- allow $1 user_tty_device_t:chr_file rw_term_perms; +- allow $1 user_devpts_t:chr_file rw_term_perms; +- term_list_ptys($1) ++ allow $1 user_tty_device_t:chr_file rw_inherited_term_perms; ++ allow $1 user_devpts_t:chr_file rw_inherited_term_perms; ++') ++ ++####################################### ++## ++## Allow attempts to read and write ++## a user domain tty and pty. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_use_user_terminals',` ++ gen_require(` ++ type user_tty_device_t, user_devpts_t; ++ ') ++ ++ allow $1 user_tty_device_t:chr_file rw_term_perms; ++ allow $1 user_devpts_t:chr_file rw_term_perms; + ') + + ######################################## +@@ -2882,8 +3929,27 @@ interface(`userdom_dontaudit_use_user_terminals',` + type user_tty_device_t, user_devpts_t; + ') + +- dontaudit $1 user_tty_device_t:chr_file rw_term_perms; +- dontaudit $1 user_devpts_t:chr_file rw_term_perms; ++ dontaudit $1 user_tty_device_t:chr_file rw_inherited_term_perms; ++ dontaudit $1 user_devpts_t:chr_file rw_inherited_term_perms; ++') ++ ++ ++######################################## ++## ++## Get attributes of user domain tty and pty. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_getattr_user_terminals',` ++ gen_require(` ++ type user_tty_device_t, user_devpts_t; ++ ') ++ ++ allow $1 { user_tty_device_t user_devpts_t }:chr_file getattr_chr_file_perms; + ') + + ######################################## +@@ -2955,6 +4021,42 @@ interface(`userdom_spec_domtrans_unpriv_users',` + allow unpriv_userdomain $1:process sigchld; + ') + ++##################################### ++## ++## Allow domain dyntrans to unpriv userdomain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_dyntransition_unpriv_users',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:process dyntransition; ++') ++ ++#################################### ++## ++## Allow domain dyntrans to admin userdomain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_dyntransition_admin_users',` ++ gen_require(` ++ attribute admindomain; ++ ') ++ ++ allow $1 admindomain:process dyntransition; ++') ++ + ######################################## + ## + ## Execute an Xserver session in all unprivileged user domains. This +@@ -2978,24 +4080,6 @@ interface(`userdom_xsession_spec_domtrans_unpriv_users',` + allow unpriv_userdomain $1:process sigchld; + ') + +-####################################### +-## +-## Read and write unpriviledged user SysV sempaphores. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`userdom_rw_unpriv_user_semaphores',` +- gen_require(` +- attribute unpriv_userdomain; +- ') +- +- allow $1 unpriv_userdomain:sem rw_sem_perms; +-') +- + ######################################## + ## + ## Manage unpriviledged user SysV sempaphores. +@@ -3014,9 +4098,9 @@ interface(`userdom_manage_unpriv_user_semaphores',` + allow $1 unpriv_userdomain:sem create_sem_perms; + ') + +-####################################### ++######################################## + ## +-## Read and write unpriviledged user SysV shared ++## Manage unpriviledged user SysV shared + ## memory segments. + ## + ## +@@ -3025,17 +4109,17 @@ interface(`userdom_manage_unpriv_user_semaphores',` + ## + ## + # +-interface(`userdom_rw_unpriv_user_shared_mem',` ++interface(`userdom_manage_unpriv_user_shared_mem',` + gen_require(` + attribute unpriv_userdomain; + ') + +- allow $1 unpriv_userdomain:shm rw_shm_perms; ++ allow $1 unpriv_userdomain:shm create_shm_perms; + ') + + ######################################## + ## +-## Manage unpriviledged user SysV shared ++## Destroy unpriviledged user SysV shared + ## memory segments. + ## + ## +@@ -3044,12 +4128,12 @@ interface(`userdom_rw_unpriv_user_shared_mem',` + ## + ## + # +-interface(`userdom_manage_unpriv_user_shared_mem',` ++interface(`userdom_destroy_unpriv_user_shared_mem',` + gen_require(` + attribute unpriv_userdomain; + ') + +- allow $1 unpriv_userdomain:shm create_shm_perms; ++ allow $1 unpriv_userdomain:shm destroy; + ') + + ######################################## +@@ -3094,7 +4178,7 @@ interface(`userdom_entry_spec_domtrans_unpriv_users',` + + domain_entry_file_spec_domtrans($1, unpriv_userdomain) + allow unpriv_userdomain $1:fd use; +- allow unpriv_userdomain $1:fifo_file rw_file_perms; ++ allow unpriv_userdomain $1:fifo_file rw_fifo_file_perms; + allow unpriv_userdomain $1:process sigchld; + ') + +@@ -3110,29 +4194,13 @@ interface(`userdom_entry_spec_domtrans_unpriv_users',` + # + interface(`userdom_search_user_home_content',` + gen_require(` +- type user_home_dir_t, user_home_t; ++ type user_home_dir_t; ++ attribute user_home_type; + ') + + files_list_home($1) +- allow $1 { user_home_dir_t user_home_t }:dir search_dir_perms; +-') +- +-######################################## +-## +-## Send signull to unprivileged user domains. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`userdom_signull_unpriv_users',` +- gen_require(` +- attribute unpriv_userdomain; +- ') +- +- allow $1 unpriv_userdomain:process signull; ++ allow $1 { user_home_dir_t user_home_type }:dir search_dir_perms; ++ allow $1 { user_home_dir_t user_home_type }:lnk_file read_lnk_file_perms; + ') + + ######################################## +@@ -3214,7 +4282,25 @@ interface(`userdom_dontaudit_use_user_ptys',` + type user_devpts_t; + ') + +- dontaudit $1 user_devpts_t:chr_file rw_file_perms; ++ dontaudit $1 user_devpts_t:chr_file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to open user ptys. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_open_user_ptys',` ++ gen_require(` ++ type user_devpts_t; ++ ') ++ ++ dontaudit $1 user_devpts_t:chr_file open; + ') + + ######################################## +@@ -3269,12 +4355,13 @@ interface(`userdom_write_user_tmp_files',` + type user_tmp_t; + ') + +- allow $1 user_tmp_t:file write_file_perms; ++ write_files_pattern($1, user_tmp_t, user_tmp_t) + ') + + ######################################## + ## +-## Do not audit attempts to use user ttys. ++## Do not audit attempts to write users ++## temporary files. + ## + ## + ## +@@ -3282,54 +4369,56 @@ interface(`userdom_write_user_tmp_files',` + ## + ## + # +-interface(`userdom_dontaudit_use_user_ttys',` ++interface(`userdom_dontaudit_write_user_tmp_files',` + gen_require(` +- type user_tty_device_t; ++ type user_tmp_t; + ') + +- dontaudit $1 user_tty_device_t:chr_file rw_file_perms; ++ dontaudit $1 user_tmp_t:file write; + ') + + ######################################## + ## +-## Read the process state of all user domains. ++## Do not audit attempts to delete users ++## temporary files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`userdom_read_all_users_state',` ++interface(`userdom_dontaudit_delete_user_tmp_files',` + gen_require(` +- attribute userdomain; ++ type user_tmp_t; + ') + +- read_files_pattern($1, userdomain, userdomain) +- kernel_search_proc($1) ++ dontaudit $1 user_tmp_t:file delete_file_perms; + ') + + ######################################## + ## +-## Get the attributes of all user domains. ++## Do not audit attempts to read/write users ++## temporary fifo files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`userdom_getattr_all_users',` ++interface(`userdom_dontaudit_rw_user_tmp_pipes',` + gen_require(` +- attribute userdomain; ++ type user_tmp_t; + ') + +- allow $1 userdomain:process getattr; ++ dontaudit $1 user_tmp_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Inherit the file descriptors from all user domains ++## Allow domain to read/write inherited users ++## fifo files. + ## + ## + ## +@@ -3337,12 +4426,86 @@ interface(`userdom_getattr_all_users',` + ## + ## + # +-interface(`userdom_use_all_users_fds',` ++interface(`userdom_rw_inherited_user_pipes',` + gen_require(` + attribute userdomain; + ') + +- allow $1 userdomain:fd use; ++ allow $1 userdomain:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to use user ttys. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_use_user_ttys',` ++ gen_require(` ++ type user_tty_device_t; ++ ') ++ ++ dontaudit $1 user_tty_device_t:chr_file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read the process state of all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_read_all_users_state',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ read_files_pattern($1, userdomain, userdomain) ++ read_lnk_files_pattern($1,userdomain,userdomain) ++ kernel_search_proc($1) ++') ++ ++######################################## ++## ++## Get the attributes of all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_getattr_all_users',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:process getattr; ++') ++ ++######################################## ++## ++## Inherit the file descriptors from all user domains ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_use_all_users_fds',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:fd use; + ') + + ######################################## +@@ -3382,6 +4545,42 @@ interface(`userdom_signal_all_users',` + allow $1 userdomain:process signal; + ') + ++####################################### ++## ++## Send signull to all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_signull_all_users',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:process signull; ++') ++ ++######################################## ++## ++## Send kill signals to all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_kill_all_users',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:process sigkill; ++') ++ + ######################################## + ## + ## Send a SIGCHLD signal to all user domains. +@@ -3400,6 +4599,60 @@ interface(`userdom_sigchld_all_users',` + allow $1 userdomain:process sigchld; + ') + ++######################################## ++## ++## Read keys for all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_read_all_users_keys',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:key read; ++') ++ ++######################################## ++## ++## Write keys for all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_write_all_users_keys',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:key write; ++') ++ ++######################################## ++## ++## Read and write keys for all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_all_users_keys',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:key { read view write }; ++') ++ + ######################################## + ## + ## Create keys for all user domains. +@@ -3435,4 +4688,1820 @@ interface(`userdom_dbus_send_all_users',` + ') + + allow $1 userdomain:dbus send_msg; ++ ps_process_pattern($1, userdomain) ++') ++ ++######################################## ++## ++## Allow apps to set rlimits on userdomain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_set_rlimitnh',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:process rlimitinh; ++') ++ ++######################################## ++## ++## Define this type as a Allow apps to set rlimits on userdomain ++## ++## ++## ++## The prefix of the user domain (e.g., user ++## is the prefix for user_t). ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++template(`userdom_unpriv_usertype',` ++ gen_require(` ++ attribute unpriv_userdomain, userdomain; ++ attribute $1_usertype; ++ ') ++ typeattribute $2 $1_usertype; ++ typeattribute $2 unpriv_userdomain; ++ typeattribute $2 userdomain; ++ ++ auth_use_nsswitch($2) ++ ubac_constrained($2) ++') ++ ++####################################### ++## ++## Define this type as a Allow apps to set rlimits on userdomain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++template(`userdom_unpriv_type',` ++ gen_require(` ++ attribute unpriv_userdomain, userdomain; ++ ') ++ typeattribute $1 unpriv_userdomain; ++ typeattribute $1 userdomain; ++ ++ auth_use_nsswitch($1) ++ ubac_constrained($1) ++') ++ ++######################################## ++## ++## Connect to users over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_stream_connect',` ++ gen_require(` ++ type user_tmp_t; ++ attribute userdomain; ++ ') ++ ++ stream_connect_pattern($1, user_tmp_t, user_tmp_t, userdomain) ++') ++ ++######################################## ++## ++## Ptrace user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_ptrace_all_users',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 userdomain:process ptrace; ++ ') ++') ++ ++######################################## ++## ++## dontaudit Search /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_search_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 admin_home_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## dontaudit list /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_list_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 admin_home_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Allow domain to list /root ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_list_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ allow $1 admin_home_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Allow Search /root ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_search_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ allow $1 admin_home_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## dontaudit create dirs /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_create_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:dir create_dir_perms; ++') ++ ++ ++######################################## ++## ++## allow manage dirs /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_manage_admin_dirs',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## allow manage files /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_manage_admin_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## dontaudit manage dirs /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_manage_admin_dir',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## dontaudit manage files /root ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_manage_admin_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## RW unpriviledged user SysV sempaphores. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_semaphores',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:sem rw_sem_perms; ++') ++ ++######################################## ++## ++## Send a message to unpriv users over a unix domain ++## datagram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_dgram_send',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:unix_dgram_socket sendto; ++') ++ ++###################################### ++## ++## Send a message to users over a unix domain ++## datagram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_users_dgram_send',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:unix_dgram_socket sendto; ++') ++ ++####################################### ++## ++## Allow execmod on files in homedirectory ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_execmod_user_home_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:file execmod; ++') ++ ++######################################## ++## ++## Read admin home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_read_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ read_files_pattern($1, admin_home_t, admin_home_t) ++') ++ ++######################################## ++## ++## Delete admin home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_delete_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ allow $1 admin_home_t:file delete_file_perms; ++') ++ ++######################################## ++## ++## Execute admin home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_exec_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ exec_files_pattern($1, admin_home_t, admin_home_t) ++') ++ ++######################################## ++## ++## Append files inherited ++## in the /root directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_inherit_append_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:file { getattr append }; ++') ++ ++ ++####################################### ++## ++## Manage all files/directories in the homedir ++## ++## ++## ++## The user domain ++## ++## ++## ++# ++interface(`userdom_manage_user_home_content',` ++ gen_require(` ++ type user_home_dir_t, user_home_t; ++ attribute user_home_type; ++ ') ++ ++ files_list_home($1) ++ manage_dirs_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ manage_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ manage_lnk_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ manage_sock_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ manage_fifo_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ filetrans_pattern($1, user_home_dir_t, user_home_t, { dir file lnk_file sock_file fifo_file }) ++ ++') ++ ++###################################### ++## ++## Manage all dirs in the homedir ++## ++## ++## ++## The user domain ++## ++## ++# ++interface(`userdom_manage_all_user_home_type_dirs',` ++ gen_require(` ++ type user_home_dir_t, user_home_t; ++ attribute user_home_type; ++ ') ++ ++ files_list_home($1) ++ manage_dirs_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++') ++ ++###################################### ++## ++## Manage all files in the homedir ++## ++## ++## ++## The user domain ++## ++## ++# ++interface(`userdom_manage_all_user_home_type_files',` ++ gen_require(` ++ type user_home_dir_t, user_home_t; ++ attribute user_home_type; ++ ') ++ ++ files_list_home($1) ++ manage_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++ manage_lnk_files_pattern($1, { user_home_dir_t user_home_type }, user_home_type) ++') ++ ++######################################## ++## ++## Create objects in a user home directory ++## with an automatic type transition to ++## the user home file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++# ++interface(`userdom_user_home_dir_filetrans_pattern',` ++ gen_require(` ++ type user_home_dir_t, user_home_t; ++ ') ++ ++ type_transition $1 user_home_dir_t:$2 user_home_t; ++') ++ ++######################################## ++## ++## Create objects in the /root directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`userdom_admin_home_dir_filetrans',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ allow $1 admin_home_t:lnk_file read_lnk_file_perms; ++ filetrans_pattern($1, admin_home_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Send signull to unprivileged user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_signull_unpriv_users',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:process signull; ++') ++ ++######################################## ++## ++## Write all users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_write_user_tmp_dirs',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ write_files_pattern($1, user_tmp_t, user_tmp_t) ++') ++ ++######################################## ++## ++## Manage keys for all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_all_users_keys',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:key manage_key_perms; ++') ++ ++ ++######################################## ++## ++## Do not audit attempts to read and write ++## userdomain stream. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_rw_stream',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ dontaudit $1 userdomain:unix_stream_socket rw_socket_perms; ++') ++ ++######################################## ++## ++## Read and write userdomain stream. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_stream',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:unix_stream_socket rw_socket_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read and write ++## unserdomain datagram socket. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_rw_dgram_socket',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ dontaudit $1 userdomain:unix_dgram_socket { read write }; ++') ++ ++######################################## ++## ++## Append files ++## in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_append_user_home_content_files',` ++ gen_require(` ++ type user_home_dir_t, user_home_t; ++ ') ++ ++ append_files_pattern($1, user_home_t, user_home_t) ++ allow $1 user_home_dir_t:dir search_dir_perms; ++ files_search_home($1) ++') ++ ++######################################## ++## ++## Read files inherited ++## in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_read_inherited_user_home_content_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:file { getattr read }; ++') ++ ++######################################## ++## ++## Dontaudit Read files inherited from the admin home dir. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_read_inherited_admin_home_files',` ++ gen_require(` ++ attribute admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## Dontaudit append files inherited from the admin home dir. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_append_inherited_admin_home_file',` ++ gen_require(` ++ attribute admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:file append_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read/Write files inherited ++## in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_inherited_user_home_content_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Append files inherited ++## in a user home subdirectory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_inherit_append_user_home_content_files',` ++ gen_require(` ++ type user_home_t; ++ ') ++ ++ allow $1 user_home_t:file { getattr append }; ++') ++ ++######################################## ++## ++## Append files inherited ++## in a user tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_inherit_append_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file { getattr append }; ++') ++ ++###################################### ++## ++## Read audio files in the users homedir. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_read_home_audio_files',` ++ gen_require(` ++ type audio_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ allow $1 audio_home_t:dir list_dir_perms; ++ read_files_pattern($1, audio_home_t, audio_home_t) ++ read_lnk_files_pattern($1, audio_home_t, audio_home_t) ++') ++ ++###################################### ++## ++## Manage texlive content in the users homedir. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`userdom_manage_home_texlive',` ++ gen_require(` ++ type texlive_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ userdom_user_home_dir_filetrans($1, texlive_home_t, dir, ".texlive2012") ++ userdom_user_home_dir_filetrans($1, texlive_home_t, dir, ".texlive2013") ++ userdom_user_home_dir_filetrans($1, texlive_home_t, dir, ".texlive2014") ++ manage_dirs_pattern($1, texlive_home_t, texlive_home_t) ++ manage_files_pattern($1, texlive_home_t, texlive_home_t) ++ manage_lnk_files_pattern($1, texlive_home_t, texlive_home_t) ++ allow $1 texlive_home_t:file relabelfrom; ++') ++ ++######################################## ++## ++## Do not audit attempts to write all user home content files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_write_all_user_home_content_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ dontaudit $1 user_home_type:file write_inherited_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to write all user tmp content files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_write_all_user_tmp_content_files',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ dontaudit $1 user_tmp_type:file write_inherited_file_perms; ++') ++ ++######################################## ++## ++## Manage all user temporary content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_all_user_tmp_content',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ manage_dirs_pattern($1, user_tmp_type, user_tmp_type) ++ manage_files_pattern($1, user_tmp_type, user_tmp_type) ++ manage_lnk_files_pattern($1, user_tmp_type, user_tmp_type) ++ manage_sock_files_pattern($1, user_tmp_type, user_tmp_type) ++ manage_fifo_files_pattern($1, user_tmp_type, user_tmp_type) ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## List all user temporary content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_list_all_user_tmp_content',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ list_dirs_pattern($1, user_tmp_type, user_tmp_type) ++ getattr_files_pattern($1, user_tmp_type, user_tmp_type) ++ read_lnk_files_pattern($1, user_tmp_type, user_tmp_type) ++ getattr_sock_files_pattern($1, user_tmp_type, user_tmp_type) ++ getattr_fifo_files_pattern($1, user_tmp_type, user_tmp_type) ++ files_search_var($1) ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Manage all user tmpfs content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_all_user_tmpfs_content',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_manage_all_user_tmp_content instead.') ++ userdom_manage_all_user_tmp_content($1) ++') ++ ++######################################## ++## ++## Delete all user temporary content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_all_user_tmp_content',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ delete_dirs_pattern($1, user_tmp_type, user_tmp_type) ++ delete_files_pattern($1, user_tmp_type, user_tmp_type) ++ delete_lnk_files_pattern($1, user_tmp_type, user_tmp_type) ++ delete_sock_files_pattern($1, user_tmp_type, user_tmp_type) ++ delete_fifo_files_pattern($1, user_tmp_type, user_tmp_type) ++ # /var/tmp ++ files_search_var($1) ++ files_delete_tmp_dir_entry($1) ++') ++ ++######################################## ++## ++## Read system SSL certificates in the users homedir. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_read_home_certs',` ++ gen_require(` ++ attribute userdom_home_reader_certs_type; ++ ') ++ ++ typeattribute $1 userdom_home_reader_certs_type; ++') ++ ++######################################## ++## ++## mmap system SSL certificates in the users homedir. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_map_home_certs',` ++ gen_require(` ++ type home_cert_t; ++ ') ++ ++ allow $1 home_cert_t:file map; ++') ++ ++######################################## ++## ++## Manage system SSL certificates in the users homedir. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_home_certs',` ++ gen_require(` ++ type home_cert_t; ++ ') ++ ++ allow $1 home_cert_t:dir list_dir_perms; ++ manage_dirs_pattern($1, home_cert_t, home_cert_t) ++ manage_files_pattern($1, home_cert_t, home_cert_t) ++ manage_lnk_files_pattern($1, home_cert_t, home_cert_t) ++ ++ userdom_user_home_dir_filetrans($1, home_cert_t, dir, ".cert") ++ userdom_user_home_dir_filetrans($1, home_cert_t, dir, ".pki") ++ userdom_admin_home_dir_filetrans($1, home_cert_t, dir, ".pki") ++ userdom_admin_home_dir_filetrans($1, home_cert_t, dir, ".cert") ++') ++ ++####################################### ++## ++## Dontaudit Write system SSL certificates in the users homedir. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_write_home_certs',` ++ gen_require(` ++ type home_cert_t; ++ ') ++ ++ dontaudit $1 home_cert_t:file write; ++') ++ ++######################################## ++## ++## dontaudit Search getatrr /root files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_getattr_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:file getattr; ++') ++ ++######################################## ++## ++## dontaudit read /root lnk files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_read_admin_home_lnk_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:lnk_file read; ++') ++ ++######################################## ++## ++## dontaudit read /root files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_read_admin_home_files',` ++ gen_require(` ++ type admin_home_t; ++ ') ++ ++ dontaudit $1 admin_home_t:lnk_file read_lnk_file_perms; ++ dontaudit $1 admin_home_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete user ++## temporary chr files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_user_tmp_chr_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_chr_files_pattern($1, user_tmp_t, user_tmp_t) ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Create, read, write, and delete user ++## temporary blk files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_manage_user_tmp_blk_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ manage_blk_files_pattern($1, user_tmp_t, user_tmp_t) ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Dontaudit attempt to set attributes on user temporary directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_setattr_user_tmp',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ dontaudit $1 user_tmp_t:dir setattr; ++') ++ ++######################################## ++## ++## Dontaudit attempt to set attributes on user temporary file system files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_setattr_user_tmpfs',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_dontaudit_setattr_user_tmp() instead.') ++ userdom_dontaudit_setattr_user_tmp($1) ++') ++ ++######################################## ++## ++## Read all inherited users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_read_inherited_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read/write/mmap all inherited users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_mmap_rw_inherited_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file mmap_rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read/write all inherited users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_inherited_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Write all inherited users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_write_inherited_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file write; ++') ++ ++######################################## ++## ++## Write all inherited users home files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_inherited_user_home_sock_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ allow $1 user_home_type:sock_file write; ++') ++ ++######################################## ++## ++## Delete all users files in /tmp ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_user_tmp_files',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ allow $1 user_tmp_t:file delete_file_perms; ++') ++ ++######################################## ++## ++## Delete user tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_delete_user_tmpfs_files',` ++ refpolicywarn(`$0($*) has been deprecated, use userdom_delete_user_tmpfs_files instead.') ++ userdom_delete_user_tmpfs_files($1) ++') ++ ++######################################## ++## ++## Read/Write unpriviledged user SysV shared ++## memory segments. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_unpriv_user_shared_mem',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:shm rw_shm_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to search user ++## temporary directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_search_user_tmp',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ dontaudit $1 user_tmp_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Execute a file in a user home directory ++## in the specified domain. ++## ++## ++##

      ++## Execute a file in a user home directory ++## in the specified domain. ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`userdom_domtrans_user_home',` ++ gen_require(` ++ type user_home_t; ++ ') ++ ++ read_lnk_files_pattern($1, user_home_t, user_home_t) ++ domain_transition_pattern($1, user_home_t, $2) ++ type_transition $1 user_home_t:process $2; ++') ++ ++######################################## ++## ++## Execute a file in a user tmp directory ++## in the specified domain. ++## ++## ++##

      ++## Execute a file in a user tmp directory ++## in the specified domain. ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`userdom_domtrans_user_tmp',` ++ gen_require(` ++ type user_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ read_lnk_files_pattern($1, user_tmp_t, user_tmp_t) ++ domain_transition_pattern($1, user_tmp_t, $2) ++ type_transition $1 user_tmp_t:process $2; ++') ++ ++######################################## ++## ++## Do not audit attempts to read all user home content files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_read_all_user_home_content_files',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ dontaudit $1 user_home_type:file read_file_perms; ++') ++ ++######################################## ++## ++## Do not audit attempts to read all user tmp content files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_read_all_user_tmp_content_files',` ++ gen_require(` ++ attribute user_tmp_type; ++ ') ++ ++ dontaudit $1 user_tmp_type:file read_file_perms; ++') ++ ++####################################### ++## ++## Read and write unpriviledged user SysV sempaphores. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_rw_unpriv_user_semaphores',` ++ gen_require(` ++ attribute unpriv_userdomain; ++ ') ++ ++ allow $1 unpriv_userdomain:sem rw_sem_perms; ++') ++ ++######################################## ++## ++## Transition to userdom named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_filetrans_home_content',` ++ gen_require(` ++ attribute userdom_filetrans_type; ++ ') ++ ++ typeattribute $1 userdom_filetrans_type; ++') ++ ++######################################## ++## ++## Make the specified type able to read content in user home dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_home_reader',` ++ gen_require(` ++ attribute userdom_home_reader_type; ++ ') ++ ++ typeattribute $1 userdom_home_reader_type; ++') ++ ++ ++######################################## ++## ++## Make the specified type able to manage content in user home dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_home_manager',` ++ gen_require(` ++ attribute userdom_home_manager_type; ++ ') ++ ++ typeattribute $1 userdom_home_manager_type; ++') ++ ++######################################## ++## ++## Create objects in the temporary filesystem directory ++## with an automatic type transition to ++## the user temporary filesystem type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`userdom_tmpfs_filetrans',` ++ gen_require(` ++ type user_tmpfs_t; ++ ') ++ ++ fs_tmpfs_filetrans($1, user_tmpfs_t, $2, $3) ++') ++ ++ ++####################################### ++## ++## Create objects in the temporary filesystem directory ++## with an automatic type transition to ++## the user temporary filesystem type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`userdom_tmpfs_filetrans_to',` ++ gen_require(` ++ type user_tmpfs_t; ++ ') ++ ++ filetrans_pattern($1, user_tmpfs_t, $2, $3, $4) ++') ++ ++###################################### ++## ++## File name transition for generic home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_filetrans_generic_home_content',` ++ gen_require(` ++ type home_bin_t; ++ type audio_home_t; ++ type home_cert_t; ++ type user_tmp_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, home_bin_t, dir, "bin") ++ userdom_user_home_dir_filetrans($1, audio_home_t, dir, "Audio") ++ userdom_user_home_dir_filetrans($1, audio_home_t, dir, "Music") ++ userdom_user_home_dir_filetrans($1, home_cert_t, dir, ".cert") ++ userdom_user_home_dir_filetrans($1, home_cert_t, dir, ".pki") ++ userdom_user_home_dir_filetrans($1, home_cert_t, dir, "certificates") ++ userdom_user_home_dir_filetrans($1, user_tmp_t, dir, "tmp") ++ userdom_user_home_dir_filetrans($1, user_tmp_t, dir, ".tmp") ++ ++ optional_policy(` ++ gnome_data_filetrans($1, home_cert_t, dir, "certificates") ++ ') ++') ++ ++######################################## ++## ++## Allow caller to transition to any userdomain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`userdom_transition',` ++ gen_require(` ++ attribute userdomain; ++ ') ++ ++ allow $1 userdomain:process transition; ++') ++ ++######################################## ++## ++## Do not audit attempts to check the ++## access on user content files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`userdom_dontaudit_access_check_user_content',` ++ gen_require(` ++ attribute user_home_type; ++ ') ++ ++ dontaudit $1 user_home_type:dir_file_class_set audit_access; ++') ++ ++####################################### ++## ++## The template containing the most basic rules common to confined admin. ++## ++## ++##

      ++## The template containing the most basic rules common to all users. ++##

      ++##

      ++## This template creates a user domain, types, and ++## rules for the user's tty and pty. ++##

      ++##
      ++## ++## ++## The prefix of the user domain (e.g., user ++## is the prefix for user_t). ++## ++## ++## ++# ++template(`userdom_confined_admin_template',` ++ ++ gen_require(` ++ attribute confined_admindomain; ++ attribute userdomain; ++ type user_devpts_t, user_tty_device_t; ++ class context contains; ++ ') ++ ++ type $1_t, userdomain, confined_admindomain; ++ role $1_r; ++ role $1_r types $1_t; ++ domain_type($1_t) ++ domain_user_exemption_target($1_t) ++ ubac_constrained($1_t) ++ ++ auth_use_nsswitch($1_t) ++ ++ ifelse(`$1',`unconfined',`',` ++ gen_tunable($1_exec_content, true) ++ ++ tunable_policy(`$1_exec_content',` ++ userdom_exec_user_tmp_files($1_t) ++ userdom_exec_user_home_content_files($1_t) ++ ') ++ tunable_policy(`$1_exec_content && use_nfs_home_dirs',` ++ fs_exec_nfs_files($1_t) ++ ') ++ ++ tunable_policy(`$1_exec_content && use_samba_home_dirs',` ++ fs_exec_cifs_files($1_t) ++ ') ++ ') ++') ++ ++######################################## ++## ++## Allow user to run as a secadm ++## ++## ++##

      ++## Create objects in a user home directory ++## with an automatic type transition to ++## a specified private type. ++##

      ++##

      ++## This is a templated interface, and should only ++## be called from a per-userdomain template. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role of the object to create. ++## ++## ++# ++template(`userdom_security_admin_template',` ++ allow $1 self:capability { audit_control dac_read_search dac_override }; ++ ++ allow $1 self:netlink_audit_socket { nlmsg_write create_netlink_socket_perms }; ++ ++ corecmd_exec_shell($1) ++ ++ domain_obj_id_change_exemption($1) ++ ++ dev_relabel_all_dev_nodes($1) ++ ++ files_create_boot_flag($1) ++ files_create_default_dir($1) ++ files_root_filetrans_default($1, dir) ++ ++ # Necessary for managing /boot/efi ++ fs_manage_dos_files($1) ++ ++ mls_process_read_up($1) ++ mls_file_read_all_levels($1) ++ mls_file_upgrade($1) ++ mls_file_downgrade($1) ++ ++ selinux_set_enforce_mode($1) ++ selinux_set_all_booleans($1) ++ selinux_set_parameters($1) ++ selinux_read_policy($1) ++ ++ files_relabel_all_files($1) ++ ++ auth_relabel_shadow($1) ++ ++ init_exec($1) ++ ++ logging_send_syslog_msg($1) ++ logging_read_audit_log($1) ++ logging_read_generic_logs($1) ++ logging_read_audit_config($1) ++ ++ seutil_manage_bin_policy($1) ++ seutil_manage_default_contexts($1) ++ seutil_manage_file_contexts($1) ++ seutil_manage_module_store($1) ++ seutil_manage_config($1) ++ seutil_manage_login_config($1) ++ seutil_run_checkpolicy($1,$2) ++ seutil_run_loadpolicy($1,$2) ++ seutil_run_semanage($1,$2) ++ seutil_run_setsebool($1,$2) ++ seutil_run_setfiles($1, $2) ++ ++ optional_policy(` ++ aide_run($1,$2) ++ ') ++ ++ optional_policy(` ++ consoletype_exec($1) ++ ') ++ ++ optional_policy(` ++ ipsec_run_setkey($1,$2) ++ ') ++ ++ optional_policy(` ++ netlabel_run_mgmt($1,$2) ++ ') ++ ++ optional_policy(` ++ samhain_run($1, $2) ++ ') + ') +diff --git a/policy/modules/system/userdomain.te b/policy/modules/system/userdomain.te +index f4ac38dc76..93a69a8456 100644 +--- a/policy/modules/system/userdomain.te ++++ b/policy/modules/system/userdomain.te +@@ -7,48 +7,43 @@ policy_module(userdomain, 4.9.1) + + ## + ##

      +-## Allow users to connect to mysql ++## Allow users to connect to the local mysql server + ##

      + ##
      +-gen_tunable(allow_user_mysql_connect, false) ++gen_tunable(selinuxuser_mysql_connect_enabled, false) + + ## + ##

      + ## Allow users to connect to PostgreSQL + ##

      + ##
      +-gen_tunable(allow_user_postgresql_connect, false) ++gen_tunable(selinuxuser_postgresql_connect_enabled, false) + + ## + ##

      +-## Allow regular users direct mouse access +-##

      +-##
      +-gen_tunable(user_direct_mouse, false) +- +-## +-##

      +-## Allow users to read system messages. ++## Allow user to r/w files on filesystems ++## that do not have extended attributes (FAT, CDROM, FLOPPY) + ##

      + ##
      +-gen_tunable(user_dmesg, false) ++gen_tunable(selinuxuser_rw_noexattrfile, false) + + ## + ##

      +-## Allow user to r/w files on filesystems +-## that do not have extended attributes (FAT, CDROM, FLOPPY) ++## Allow user music sharing + ##

      + ##
      +-gen_tunable(user_rw_noexattrfile, false) ++gen_tunable(selinuxuser_share_music, false) + + ## + ##

      +-## Allow w to display everyone ++## Allow user to use ssh chroot environment. + ##

      + ##
      +-gen_tunable(user_ttyfile_stat, false) ++gen_tunable(selinuxuser_use_ssh_chroot, false) + + attribute admindomain; ++attribute login_userdomain; ++attribute confined_admindomain; + + # all user domains + attribute userdomain; +@@ -58,6 +53,24 @@ attribute unpriv_userdomain; + + attribute user_home_content_type; + ++attribute userdom_home_reader_certs_type; ++attribute userdom_home_reader_type; ++attribute userdom_home_manager_type; ++attribute userdom_filetrans_type; ++ ++# unprivileged user domains ++attribute user_home_type; ++attribute user_tmp_type; ++attribute user_tmpfs_type; ++ ++type admin_home_t; ++files_type(admin_home_t) ++files_associate_tmp(admin_home_t) ++fs_associate_tmpfs(admin_home_t) ++files_mountpoint(admin_home_t) ++files_poly_member(admin_home_t) ++files_poly_parent(admin_home_t) ++ + type user_home_dir_t alias { staff_home_dir_t sysadm_home_dir_t secadm_home_dir_t auditadm_home_dir_t unconfined_home_dir_t }; + fs_associate_tmpfs(user_home_dir_t) + files_type(user_home_dir_t) +@@ -70,26 +83,408 @@ ubac_constrained(user_home_dir_t) + + type user_home_t alias { staff_home_t sysadm_home_t secadm_home_t auditadm_home_t unconfined_home_t }; + typealias user_home_t alias { staff_untrusted_content_t sysadm_untrusted_content_t secadm_untrusted_content_t auditadm_untrusted_content_t unconfined_untrusted_content_t }; ++typeattribute user_home_t user_home_type; + userdom_user_home_content(user_home_t) + fs_associate_tmpfs(user_home_t) + files_associate_tmp(user_home_t) ++files_poly_member(user_home_t) + files_poly_parent(user_home_t) + files_mountpoint(user_home_t) ++ubac_constrained(user_home_t) + + type user_devpts_t alias { staff_devpts_t sysadm_devpts_t secadm_devpts_t auditadm_devpts_t unconfined_devpts_t }; + dev_node(user_devpts_t) + files_type(user_devpts_t) + ubac_constrained(user_devpts_t) + +-type user_tmp_t alias { staff_tmp_t sysadm_tmp_t secadm_tmp_t auditadm_tmp_t unconfined_tmp_t }; ++type user_tmp_t, user_tmp_type, user_tmpfs_type; ++typealias user_tmp_t alias { screen_tmp_t winbind_tmp_t wine_tmp_t sshd_tmp_t staff_tmp_t sysadm_tmp_t secadm_tmp_t auditadm_tmp_t unconfined_tmp_t }; + typealias user_tmp_t alias { staff_untrusted_content_tmp_t sysadm_untrusted_content_tmp_t secadm_untrusted_content_tmp_t auditadm_untrusted_content_tmp_t unconfined_untrusted_content_tmp_t }; ++typealias user_tmp_t alias { user_tmpfs_t staff_tmpfs_t sysadm_tmpfs_t secadm_tmpfs_t auditadm_tmpfs_t unconfined_tmpfs_t }; ++typealias user_tmp_t alias xdm_tmp_t; ++typealias user_tmp_t alias { xserver_tmp_t user_xserver_tmp_t staff_xserver_tmp_t sysadm_xserver_tmp_t ice_tmp_t }; + files_tmp_file(user_tmp_t) ++files_tmpfs_file(user_tmp_t) + userdom_user_home_content(user_tmp_t) +- +-type user_tmpfs_t alias { staff_tmpfs_t sysadm_tmpfs_t secadm_tmpfs_t auditadm_tmpfs_t unconfined_tmpfs_t }; +-files_tmpfs_file(user_tmpfs_t) +-userdom_user_home_content(user_tmpfs_t) ++files_poly_parent(user_tmp_t) ++files_mountpoint(user_tmp_t) + + type user_tty_device_t alias { staff_tty_device_t sysadm_tty_device_t secadm_tty_device_t auditadm_tty_device_t unconfined_tty_device_t }; + dev_node(user_tty_device_t) + ubac_constrained(user_tty_device_t) ++ ++type audio_home_t; ++userdom_user_home_content(audio_home_t) ++ubac_constrained(audio_home_t) ++ ++type texlive_home_t; ++userdom_user_home_content(texlive_home_t) ++ubac_constrained(texlive_home_t) ++ ++type home_bin_t; ++userdom_user_home_content(home_bin_t) ++ubac_constrained(home_bin_t) ++ ++type home_cert_t; ++miscfiles_cert_type(home_cert_t) ++userdom_user_home_content(home_cert_t) ++ubac_constrained(home_cert_t) ++ ++tunable_policy(`login_console_enabled',` ++ term_use_console(userdomain) ++') ++ ++allow userdomain userdomain:process signull; ++allow userdomain userdomain:fifo_file { map rw_inherited_fifo_file_perms }; ++dontaudit unpriv_userdomain self:rawip_socket create_socket_perms; ++ ++# Nautilus causes this avc ++domain_dontaudit_access_check(unpriv_userdomain) ++dontaudit unpriv_userdomain self:dir setattr; ++allow unpriv_userdomain self:key manage_key_perms; ++ ++mount_dontaudit_write_mount_pid(unpriv_userdomain) ++mount_entry_type(unpriv_userdomain) ++ ++optional_policy(` ++ alsa_read_rw_config(unpriv_userdomain) ++ alsa_manage_home_files(unpriv_userdomain) ++ alsa_relabel_home_files(unpriv_userdomain) ++') ++ ++optional_policy(` ++ gssproxy_stream_connect(userdomain) ++') ++ ++optional_policy(` ++ gnome_filetrans_home_content(userdomain) ++') ++ ++optional_policy(` ++ gpg_noatsecure(userdomain) ++') ++ ++optional_policy(` ++ locallogin_filetrans_home_content(userdomain) ++') ++ ++optional_policy(` ++ pcscd_stream_connect(userdomain) ++') ++ ++optional_policy(` ++ realmd_read_var_lib(userdomain) ++') ++ ++optional_policy(` ++ ssh_filetrans_home_content(userdomain) ++ ssh_rw_tcp_sockets(userdomain) ++') ++ ++optional_policy(` ++ telepathy_filetrans_home_content(userdomain) ++') ++ ++optional_policy(` ++ xserver_filetrans_home_content(userdomain) ++') ++ ++# rules for types which can read home certs ++allow userdom_home_reader_certs_type home_cert_t:dir list_dir_perms; ++read_files_pattern(userdom_home_reader_certs_type, home_cert_t, home_cert_t) ++read_lnk_files_pattern(userdom_home_reader_certs_type, home_cert_t, home_cert_t) ++userdom_search_user_home_content(userdom_home_reader_certs_type) ++allow userdom_home_reader_certs_type home_cert_t:file map; ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_read_ecryptfs_files(userdom_home_reader_certs_type) ++ fs_read_ecryptfs_symlinks(userdom_home_reader_certs_type) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_list_auto_mountpoints(userdom_home_reader_type) ++ fs_read_nfs_files(userdom_home_reader_type) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_read_cifs_files(userdom_home_reader_type) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_read_fusefs_files(userdom_home_reader_type) ++') ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_read_ecryptfs_files(userdom_home_reader_type) ++ fs_read_ecryptfs_symlinks(userdom_home_reader_type) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_list_auto_mountpoints(userdom_home_manager_type) ++ fs_manage_nfs_dirs(userdom_home_manager_type) ++ fs_manage_nfs_files(userdom_home_manager_type) ++ fs_manage_nfs_symlinks(userdom_home_manager_type) ++ fs_mmap_nfs_files(userdom_home_manager_type) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_manage_cifs_dirs(userdom_home_manager_type) ++ fs_manage_cifs_files(userdom_home_manager_type) ++ fs_manage_cifs_symlinks(userdom_home_manager_type) ++ fs_map_cifs_files(userdom_home_manager_type) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_manage_fusefs_dirs(userdom_home_manager_type) ++ fs_manage_fusefs_files(userdom_home_manager_type) ++ fs_manage_fusefs_symlinks(userdom_home_manager_type) ++ fs_mmap_fusefs_files(userdom_home_manager_type) ++') ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_manage_ecryptfs_dirs(userdom_home_manager_type) ++ fs_manage_ecryptfs_files(userdom_home_manager_type) ++ fs_manage_ecryptfs_symlinks(userdom_home_manager_type) ++') ++ ++# vi /etc/mtab can cause an avc trying to relabel to self. ++dontaudit userdomain self:file relabelto; ++ ++userdom_user_home_dir_filetrans_user_home_content(userdom_filetrans_type, { dir file lnk_file fifo_file sock_file }) ++userdom_user_home_dir_filetrans(userdom_filetrans_type, home_bin_t, dir, "bin") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, audio_home_t, dir, "Audio") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, audio_home_t, dir, "Music") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, home_cert_t, dir, ".cert") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, home_cert_t, dir, ".pki") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, home_cert_t, dir, "certificates") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, texlive_home_t, dir, ".texlive2012") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, texlive_home_t, dir, ".texlive2013") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, texlive_home_t, dir, ".texlive2014") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, user_tmp_t, dir, ".tmp") ++userdom_user_home_dir_filetrans(userdom_filetrans_type, user_tmp_t, dir, "tmp") ++ ++optional_policy(` ++ gnome_config_filetrans(userdom_filetrans_type, home_cert_t, dir, "certificates") ++ #gnome_admin_home_gconf_filetrans(userdom_filetrans_type, home_bin_t, dir, "bin") ++') ++ ++optional_policy(` ++ alsa_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ apache_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ auth_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ cvs_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ gnome_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ gpg_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ irc_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ kerberos_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ mozilla_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ mta_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ pulseaudio_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ spamassassin_filetrans_home_content(userdom_filetrans_type) ++ spamassassin_filetrans_admin_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ ssh_filetrans_admin_home_content(userdom_filetrans_type) ++ ssh_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ telepathy_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ thumb_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ tvtime_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ virt_filetrans_home_content(userdom_filetrans_type) ++') ++ ++optional_policy(` ++ xserver_filetrans_home_content(userdom_filetrans_type) ++ xserver_filetrans_admin_home_content(userdom_filetrans_type) ++') ++ ++############################################################ ++# Local Policy Confined Admin ++# ++gen_require(` ++ class context contains; ++ class passwd { passwd chfn chsh rootok }; ++') ++ ++allow confined_admindomain self:capability ~{ sys_module audit_control audit_write }; ++allow confined_admindomain self:capability2 { block_suspend syslog }; ++allow confined_admindomain self:process { setexec setfscreate }; ++allow confined_admindomain self:netlink_audit_socket nlmsg_readpriv; ++allow confined_admindomain self:tun_socket create_socket_perms; ++allow confined_admindomain self:packet_socket create_socket_perms; ++ ++# Set password information for other users. ++allow confined_admindomain self:passwd { passwd chfn chsh }; ++# Skip authentication when pam_rootok is specified. ++allow confined_admindomain self:passwd rootok; ++ ++corecmd_shell_entry_type(confined_admindomain) ++corecmd_bin_entry_type(confined_admindomain) ++ ++term_user_pty(confined_admindomain, user_devpts_t) ++term_user_tty(confined_admindomain, user_tty_device_t) ++term_dontaudit_getattr_generic_ptys(confined_admindomain) ++ ++allow confined_admindomain self:process { signal_perms getsched setsched share getpgid setpgid getcap setcap getsession getattr }; ++tunable_policy(`deny_ptrace',`',` ++ allow confined_admindomain self:process ptrace; ++') ++allow confined_admindomain self:fd use; ++allow confined_admindomain self:key manage_key_perms; ++ ++allow confined_admindomain self:fifo_file rw_fifo_file_perms; ++allow confined_admindomain self:unix_dgram_socket { create_socket_perms sendto }; ++allow confined_admindomain self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow confined_admindomain self:shm create_shm_perms; ++allow confined_admindomain self:sem create_sem_perms; ++allow confined_admindomain self:msgq create_msgq_perms; ++allow confined_admindomain self:msg { send receive }; ++allow confined_admindomain self:context contains; ++dontaudit confined_admindomain self:socket create; ++ ++allow confined_admindomain user_devpts_t:chr_file { setattr rw_chr_file_perms }; ++term_create_pty(confined_admindomain, user_devpts_t) ++term_use_generic_ptys(confined_admindomain) ++# avoid annoying messages on terminal hangup on role change ++dontaudit confined_admindomain user_devpts_t:chr_file ioctl; ++ ++allow confined_admindomain user_tty_device_t:chr_file { setattr rw_chr_file_perms }; ++# avoid annoying messages on terminal hangup on role change ++dontaudit confined_admindomain user_tty_device_t:chr_file ioctl; ++ ++application_exec_all(confined_admindomain) ++ ++kernel_read_kernel_sysctls(confined_admindomain) ++kernel_read_all_sysctls(confined_admindomain) ++kernel_dontaudit_list_unlabeled(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_files(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_symlinks(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_pipes(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_sockets(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_blk_files(confined_admindomain) ++kernel_dontaudit_getattr_unlabeled_chr_files(confined_admindomain) ++kernel_dontaudit_list_proc(confined_admindomain) ++ ++dev_dontaudit_getattr_all_blk_files(confined_admindomain) ++dev_dontaudit_getattr_all_chr_files(confined_admindomain) ++dev_getattr_mtrr_dev(confined_admindomain) ++ ++# When the user domain runs ps, there will be a number of access ++# denials when ps tries to search /proc. Do not audit these denials. ++domain_dontaudit_read_all_domains_state(confined_admindomain) ++domain_dontaudit_getattr_all_domains(confined_admindomain) ++domain_dontaudit_getsession_all_domains(confined_admindomain) ++dev_dontaudit_all_access_check(confined_admindomain) ++ ++files_read_etc_files(confined_admindomain) ++files_list_mnt(confined_admindomain) ++files_list_var(confined_admindomain) ++files_read_mnt_files(confined_admindomain) ++files_dontaudit_all_access_check(confined_admindomain) ++files_read_etc_runtime_files(confined_admindomain) ++files_read_usr_files(confined_admindomain) ++files_read_usr_src_files(confined_admindomain) ++# Read directories and files with the readable_t type. ++# This type is a general type for "world"-readable files. ++files_list_world_readable(confined_admindomain) ++files_read_world_readable_files(confined_admindomain) ++files_read_world_readable_symlinks(confined_admindomain) ++files_read_world_readable_pipes(confined_admindomain) ++files_read_world_readable_sockets(confined_admindomain) ++# old broswer_domain(): ++files_dontaudit_getattr_all_dirs(confined_admindomain) ++files_dontaudit_list_non_security(confined_admindomain) ++files_dontaudit_getattr_all_files(confined_admindomain) ++files_dontaudit_getattr_non_security_symlinks(confined_admindomain) ++files_dontaudit_getattr_non_security_pipes(confined_admindomain) ++files_dontaudit_getattr_non_security_sockets(confined_admindomain) ++files_dontaudit_setattr_etc_runtime_files(confined_admindomain) ++ ++files_exec_usr_files(confined_admindomain) ++ ++fs_list_cgroup_dirs(confined_admindomain) ++fs_dontaudit_rw_cgroup_files(confined_admindomain) ++ ++storage_rw_fuse(confined_admindomain) ++ ++init_stream_connect(confined_admindomain) ++# The library functions always try to open read-write first, ++# then fall back to read-only if it fails. ++init_dontaudit_rw_utmp(confined_admindomain) ++ ++libs_exec_ld_so(confined_admindomain) ++ ++miscfiles_read_generic_certs(confined_admindomain) ++ ++miscfiles_read_all_certs(confined_admindomain) ++miscfiles_read_public_files(confined_admindomain) ++ ++systemd_dbus_chat_logind(confined_admindomain) ++systemd_read_logind_sessions_files(confined_admindomain) ++systemd_write_inhibit_pipes(confined_admindomain) ++systemd_write_inherited_logind_sessions_pipes(confined_admindomain) ++systemd_login_read_pid_files(confined_admindomain) ++tunable_policy(`deny_execmem',`', ` ++ # Allow loading DSOs that require executable stack. ++ allow confined_admindomain self:process execmem; ++') ++ ++tunable_policy(`selinuxuser_execstack',` ++ # Allow making the stack executable via mprotect. ++ allow confined_admindomain self:process execstack; ++') ++ ++optional_policy(` ++ fs_list_cgroup_dirs(confined_admindomain) ++') ++ ++optional_policy(` ++ ssh_rw_stream_sockets(confined_admindomain) ++ ssh_delete_tmp(confined_admindomain) ++ ssh_signal(confined_admindomain) ++') +diff --git a/policy/policy_capabilities b/policy/policy_capabilities +index db3cbca45d..2e47100cf3 100644 +--- a/policy/policy_capabilities ++++ b/policy/policy_capabilities +@@ -31,3 +31,65 @@ policycap network_peer_controls; + # blk_file: open + # + policycap open_perms; ++ ++ ++# Enable fine-grained labeling of cgroup and cgroup2 filesystems. ++# Requires Linux v4.11 and later. ++# ++# Added checks: ++# (none) ++policycap cgroup_seclabel; ++ ++ ++# Enable NoNewPrivileges support. Requires libsepol 2.7+ ++# and kernel 4.14 (estimated). ++# ++# Checks enabled; ++# process2: nnp_transition, nosuid_transition ++# ++policycap nnp_nosuid_transition; ++ ++# Enable separate security classes for ++# all network address families previously ++# mapped to the socket class and for ++# ICMP and SCTP sockets previously mapped ++# to the rawip_socket class. ++# ++# Classes enabled: ++# sctp_socket ++# icmp_socket ++# ax25_socket ++# ipx_socket ++# netrom_socket ++# bridge_socket ++# atmpvc_socket ++# x25_socket ++# rose_socket ++# decnet_socket ++# atmsvc_socket ++# rds_socket ++# irda_socket ++# pppox_socket ++# llc_socket ++# ib_socket ++# mpls_socket ++# can_socket ++# tipc_socket ++# bluetooth_socket ++# iucv_socket ++# rxrpc_socket ++# isdn_socket ++# phonet_socket ++# ieee802154_socket ++# caif_socket ++# alg_socket ++# nfc_socket ++# vsock_socket ++# kcm_socket ++# qipcrtr_socket ++# smc_socket ++# ++# Available in kernel 4.11+. ++# Requires libsepol 2.7+ to build policy with this enabled. ++# ++policycap extended_socket_class; +diff --git a/policy/support/file_patterns.spt b/policy/support/file_patterns.spt +index 8b785c9a30..8aa8c36109 100644 +--- a/policy/support/file_patterns.spt ++++ b/policy/support/file_patterns.spt +@@ -99,9 +99,21 @@ define(`read_files_pattern',` + allow $1 $3:file read_file_perms; + ') + ++define(`mmap_read_files_pattern',` ++ allow $1 $2:dir search_dir_perms; ++ allow $1 $3:file mmap_read_file_perms; ++') ++ + define(`mmap_files_pattern',` ++ # deprecated 20171213 ++ refpolicywarn(`mmap_files_pattern() is deprecated, please use mmap_exec_files_pattern() instead') + allow $1 $2:dir search_dir_perms; +- allow $1 $3:file mmap_file_perms; ++ allow $1 $3:file mmap_exec_file_perms; ++') ++ ++define(`mmap_exec_files_pattern',` ++ allow $1 $2:dir search_dir_perms; ++ allow $1 $3:file mmap_exec_file_perms; + ') + + define(`exec_files_pattern',` +@@ -124,6 +136,11 @@ define(`rw_files_pattern',` + allow $1 $3:file rw_file_perms; + ') + ++define(`mmap_rw_files_pattern',` ++ allow $1 $2:dir search_dir_perms; ++ allow $1 $3:file mmap_rw_file_perms; ++') ++ + define(`create_files_pattern',` + allow $1 $2:dir add_entry_dir_perms; + allow $1 $3:file create_file_perms; +diff --git a/policy/support/misc_macros.spt b/policy/support/misc_macros.spt +index 4ca5688c35..355ff953cd 100644 +--- a/policy/support/misc_macros.spt ++++ b/policy/support/misc_macros.spt +@@ -67,7 +67,7 @@ define(`gen_context',`$1`'ifdef(`enable_mls',`:$2')`'ifdef(`enable_mcs',`:s0`'if + # + # can_exec(domain,executable) + # +-define(`can_exec',`allow $1 $2:file { mmap_file_perms ioctl lock execute_no_trans };') ++define(`can_exec',`allow $1 $2:file { mmap_exec_file_perms ioctl lock execute_no_trans };') + + ######################################## + # +diff --git a/policy/support/misc_patterns.spt b/policy/support/misc_patterns.spt +index e79d545016..d2369e17fb 100644 +--- a/policy/support/misc_patterns.spt ++++ b/policy/support/misc_patterns.spt +@@ -2,9 +2,9 @@ + # Specified domain transition patterns + # + define(`domain_transition_pattern',` +- allow $1 $2:file { getattr open read execute }; ++ allow $1 $2:file mmap_exec_file_perms; + allow $1 $3:process transition; +- dontaudit $1 $3:process { noatsecure siginh rlimitinh }; ++# dontaudit $1 $3:process { noatsecure siginh rlimitinh }; + ') + + # compatibility: +@@ -15,7 +15,7 @@ define(`spec_domtrans_pattern',` + domain_transition_pattern($1,$2,$3) + + allow $3 $1:fd use; +- allow $3 $1:fifo_file rw_fifo_file_perms; ++ allow $3 $1:fifo_file rw_inherited_fifo_file_perms; + allow $3 $1:process sigchld; + ') + +@@ -34,7 +34,7 @@ define(`domtrans_pattern',` + domain_auto_transition_pattern($1,$2,$3) + + allow $3 $1:fd use; +- allow $3 $1:fifo_file rw_fifo_file_perms; ++ allow $3 $1:fifo_file rw_inherited_fifo_file_perms; + allow $3 $1:process sigchld; + ') + +diff --git a/policy/support/obj_perm_sets.spt b/policy/support/obj_perm_sets.spt +index 6e9131723c..4b5b81f407 100644 +--- a/policy/support/obj_perm_sets.spt ++++ b/policy/support/obj_perm_sets.spt +@@ -28,8 +28,7 @@ define(`devfile_class_set', `{ chr_file blk_file }') + # + # All socket classes. + # +-define(`socket_class_set', `{ tcp_socket udp_socket rawip_socket netlink_socket packet_socket unix_stream_socket unix_dgram_socket appletalk_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket netlink_kobject_uevent_socket tun_socket }') +- ++define(`socket_class_set', `{ tcp_socket udp_socket rawip_socket netlink_socket packet_socket unix_stream_socket unix_dgram_socket appletalk_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket netlink_kobject_uevent_socket tun_socket netlink_iscsi_socket netlink_fib_lookup_socket netlink_connector_socket netlink_netfilter_socket netlink_generic_socket netlink_scsitransport_socket netlink_rdma_socket netlink_crypto_socket sctp_socket icmp_socket ax25_socket ipx_socket netrom_socket atmpvc_socket x25_socket rose_socket decnet_socket atmsvc_socket rds_socket irda_socket pppox_socket llc_socket can_socket tipc_socket bluetooth_socket iucv_socket rxrpc_socket isdn_socket phonet_socket ieee802154_socket caif_socket alg_socket nfc_socket vsock_socket kcm_socket qipcrtr_socket smc_socket bridge_socket dccp_socket ib_socket mpls_socket }') + + # + # Datagram socket classes. +@@ -39,12 +38,12 @@ define(`dgram_socket_class_set', `{ udp_socket unix_dgram_socket }') + # + # Stream socket classes. + # +-define(`stream_socket_class_set', `{ tcp_socket unix_stream_socket }') ++define(`stream_socket_class_set', `{ tcp_socket unix_stream_socket sctp_socket }') + + # + # Unprivileged socket classes (exclude rawip, netlink, packet). + # +-define(`unpriv_socket_class_set', `{ tcp_socket udp_socket unix_stream_socket unix_dgram_socket }') ++define(`unpriv_socket_class_set', `{ tcp_socket udp_socket unix_stream_socket unix_dgram_socket sctp_socket }') + + ######################################## + # +@@ -59,7 +58,7 @@ define(`mount_fs_perms', `{ mount remount unmount getattr }') + # + # Permissions for using sockets. + # +-define(`rw_socket_perms', `{ ioctl read getattr write setattr append bind connect getopt setopt shutdown }') ++define(`rw_socket_perms', `{ ioctl read getattr lock write setattr append bind connect getopt setopt shutdown }') + + # + # Permissions for creating and using sockets. +@@ -153,12 +152,22 @@ define(`relabel_dir_perms',`{ getattr relabelfrom relabelto }') + # + define(`getattr_file_perms',`{ getattr }') + define(`setattr_file_perms',`{ setattr }') +-define(`read_file_perms',`{ getattr open read lock ioctl }') +-define(`mmap_file_perms',`{ getattr open read execute ioctl }') +-define(`exec_file_perms',`{ getattr open read execute ioctl execute_no_trans }') +-define(`append_file_perms',`{ getattr open append lock ioctl }') +-define(`write_file_perms',`{ getattr open write append lock ioctl }') +-define(`rw_file_perms',`{ getattr open read write append ioctl lock }') ++define(`read_inherited_file_perms',`{ getattr read ioctl lock }') ++define(`read_file_perms',`{ open read_inherited_file_perms }') ++define(`mmap_file_perms',`{ getattr open map read execute ioctl }') ++define(`mmap_read_inherited_file_perms',`{ getattr map read ioctl }') ++define(`mmap_read_file_perms',`{ getattr open map read ioctl }') ++define(`mmap_exec_inherited_file_perms',`{ getattr map read execute ioctl }') ++define(`mmap_exec_file_perms',`{ getattr open map read execute ioctl execute_no_trans }') ++define(`exec_file_perms',`{ getattr open map read execute ioctl execute_no_trans }') ++define(`append_inherited_file_perms',`{ getattr append }') ++define(`append_file_perms',`{ open lock ioctl append_inherited_file_perms }') ++define(`write_inherited_file_perms',`{ getattr write append lock ioctl }') ++define(`write_file_perms',`{ open write_inherited_file_perms }') ++define(`rw_inherited_file_perms',`{ getattr read write append ioctl lock }') ++define(`rw_file_perms',`{ open rw_inherited_file_perms }') ++define(`mmap_rw_inherited_file_perms',`{ getattr map read write ioctl }') ++define(`mmap_rw_file_perms',`{ getattr open map read write ioctl }') + define(`create_file_perms',`{ getattr create open }') + define(`rename_file_perms',`{ getattr rename }') + define(`delete_file_perms',`{ getattr unlink }') +@@ -179,7 +188,7 @@ define(`rw_lnk_file_perms',`{ getattr read write lock ioctl }') + define(`create_lnk_file_perms',`{ create getattr }') + define(`rename_lnk_file_perms',`{ getattr rename }') + define(`delete_lnk_file_perms',`{ getattr unlink }') +-define(`manage_lnk_file_perms',`{ create read write getattr setattr link unlink rename }') ++define(`manage_lnk_file_perms',`{ create getattr setattr read write append rename link unlink ioctl lock }') + define(`relabelfrom_lnk_file_perms',`{ getattr relabelfrom }') + define(`relabelto_lnk_file_perms',`{ getattr relabelto }') + define(`relabel_lnk_file_perms',`{ getattr relabelfrom relabelto }') +@@ -192,7 +201,8 @@ define(`setattr_fifo_file_perms',`{ setattr }') + define(`read_fifo_file_perms',`{ getattr open read lock ioctl }') + define(`append_fifo_file_perms',`{ getattr open append lock ioctl }') + define(`write_fifo_file_perms',`{ getattr open write append lock ioctl }') +-define(`rw_fifo_file_perms',`{ getattr open read write append ioctl lock }') ++define(`rw_inherited_fifo_file_perms',`{ getattr read write append ioctl lock }') ++define(`rw_fifo_file_perms',`{ open rw_inherited_fifo_file_perms }') + define(`create_fifo_file_perms',`{ getattr create open }') + define(`rename_fifo_file_perms',`{ getattr rename }') + define(`delete_fifo_file_perms',`{ getattr unlink }') +@@ -208,8 +218,9 @@ define(`getattr_sock_file_perms',`{ getattr }') + define(`setattr_sock_file_perms',`{ setattr }') + define(`read_sock_file_perms',`{ getattr open read }') + define(`write_sock_file_perms',`{ getattr write open append }') +-define(`rw_sock_file_perms',`{ getattr open read write append }') +-define(`create_sock_file_perms',`{ getattr create open }') ++define(`rw_inherited_sock_file_perms',`{ getattr read write append }') ++define(`rw_sock_file_perms',`{ open rw_inherited_sock_file_perms }') ++define(`create_sock_file_perms',`{ getattr setattr create open }') + define(`rename_sock_file_perms',`{ getattr rename }') + define(`delete_sock_file_perms',`{ getattr unlink }') + define(`manage_sock_file_perms',`{ create open getattr setattr read write rename link unlink ioctl lock append }') +@@ -225,7 +236,8 @@ define(`setattr_blk_file_perms',`{ setattr }') + define(`read_blk_file_perms',`{ getattr open read lock ioctl }') + define(`append_blk_file_perms',`{ getattr open append lock ioctl }') + define(`write_blk_file_perms',`{ getattr open write append lock ioctl }') +-define(`rw_blk_file_perms',`{ getattr open read write append ioctl lock }') ++define(`rw_inherited_blk_file_perms',`{ getattr read write append ioctl lock }') ++define(`rw_blk_file_perms',`{ open rw_inherited_blk_file_perms }') + define(`create_blk_file_perms',`{ getattr create }') + define(`rename_blk_file_perms',`{ getattr rename }') + define(`delete_blk_file_perms',`{ getattr unlink }') +@@ -242,7 +254,8 @@ define(`setattr_chr_file_perms',`{ setattr }') + define(`read_chr_file_perms',`{ getattr open read lock ioctl }') + define(`append_chr_file_perms',`{ getattr open append lock ioctl }') + define(`write_chr_file_perms',`{ getattr open write append lock ioctl }') +-define(`rw_chr_file_perms',`{ getattr open read write append ioctl lock }') ++define(`rw_inherited_chr_file_perms',`{ getattr read write append ioctl lock }') ++define(`rw_chr_file_perms',`{ open rw_inherited_chr_file_perms }') + define(`create_chr_file_perms',`{ getattr create }') + define(`rename_chr_file_perms',`{ getattr rename }') + define(`delete_chr_file_perms',`{ getattr unlink }') +@@ -259,7 +272,8 @@ define(`relabel_chr_file_perms',`{ getattr relabelfrom relabelto }') + # + # Use (read and write) terminals + # +-define(`rw_term_perms', `{ getattr open read write append ioctl }') ++define(`rw_inherited_term_perms', `{ getattr lock read write append ioctl }') ++define(`rw_term_perms', `{ rw_inherited_term_perms open }') + + # + # Sockets +@@ -271,3 +285,8 @@ define(`server_stream_socket_perms', `{ client_stream_socket_perms listen accept + # Keys + # + define(`manage_key_perms', `{ create link read search setattr view write } ') ++ ++# ++# Service ++# ++define(`manage_service_perms', `{ start stop status reload enable disable } ') +diff --git a/policy/users b/policy/users +index c4ebc7e430..30d6d7a71d 100644 +--- a/policy/users ++++ b/policy/users +@@ -15,7 +15,7 @@ + # and a user process should never be assigned the system user + # identity. + # +-gen_user(system_u,, system_r, s0, s0 - mls_systemhigh, mcs_allcats) ++gen_user(system_u,, system_r unconfined_r, s0, s0 - mls_systemhigh, mcs_allcats) + + # + # user_u is a generic user identity for Linux users who have no +@@ -24,12 +24,9 @@ gen_user(system_u,, system_r, s0, s0 - mls_systemhigh, mcs_allcats) + # SELinux user identity for a Linux user. If you do not want to + # permit any access to such users, then remove this entry. + # +-gen_user(user_u, user, user_r, s0, s0) +-gen_user(staff_u, staff, staff_r sysadm_r ifdef(`enable_mls',`secadm_r auditadm_r'), s0, s0 - mls_systemhigh, mcs_allcats) +-gen_user(sysadm_u, sysadm, sysadm_r, s0, s0 - mls_systemhigh, mcs_allcats) +- +-# Until order dependence is fixed for users: +-gen_user(unconfined_u, unconfined, unconfined_r, s0, s0 - mls_systemhigh, mcs_allcats) ++gen_user(user_u, user, user_r, s0, s0 - mls_systemhigh, mcs_allcats) ++gen_user(staff_u, user, staff_r system_r sysadm_r ifdef(`enable_mls',`secadm_r auditadm_r'), s0, s0 - mls_systemhigh, mcs_allcats) ++gen_user(sysadm_u, user, sysadm_r, s0, s0 - mls_systemhigh, mcs_allcats) + + # + # The following users correspond to Unix identities. +@@ -38,8 +35,4 @@ gen_user(unconfined_u, unconfined, unconfined_r, s0, s0 - mls_systemhigh, mcs_al + # role should use the staff_r role instead of the user_r role when + # not in the sysadm_r. + # +-ifdef(`direct_sysadm_daemon',` +- gen_user(root, sysadm, sysadm_r staff_r ifdef(`enable_mls',`secadm_r auditadm_r') system_r, s0, s0 - mls_systemhigh, mcs_allcats) +-',` +- gen_user(root, sysadm, sysadm_r staff_r ifdef(`enable_mls',`secadm_r auditadm_r'), s0, s0 - mls_systemhigh, mcs_allcats) +-') ++gen_user(root, user, unconfined_r sysadm_r staff_r ifdef(`enable_mls',`secadm_r auditadm_r') system_r, s0, s0 - mls_systemhigh, mcs_allcats) +diff --git a/support/Makefile.devel b/support/Makefile.devel +index b96e9b3d1c..ff7340fdb3 100644 +--- a/support/Makefile.devel ++++ b/support/Makefile.devel +@@ -26,7 +26,6 @@ XMLLINT := $(BINDIR)/xmllint + # set default build options if missing + TYPE ?= standard + DIRECT_INITRC ?= n +-POLY ?= n + QUIET ?= y + + genxml := $(PYTHON) $(HEADERDIR)/support/segenxml.py +diff --git a/support/comment_move_decl.sed b/support/comment_move_decl.sed +index 00b94b6add..90813480dd 100644 +--- a/support/comment_move_decl.sed ++++ b/support/comment_move_decl.sed +@@ -6,7 +6,7 @@ + /optional \{/,/} # end optional/b nextline + + /^[[:blank:]]*(attribute(_role)?|type(alias)?) /s/^/# this line was moved by the build process: &/ +-/^[[:blank:]]*(port|node|netif|genfs)con /s/^/# this line was moved by the build process: &/ ++/^[[:blank:]]*(port|node|netif|genfs|ibpkey|ibendport)con /s/^/# this line was moved by the build process: &/ + /^[[:blank:]]*fs_use_(xattr|task|trans) /s/^/# this line was moved by the build process: &/ + /^[[:blank:]]*sid /s/^/# this line was moved by the build process: &/ + /^[[:blank:]]*bool /s/^/# this line was moved by the build process: &/ diff --git a/SOURCES/policy-rhel-7.9-contrib.patch b/SOURCES/policy-rhel-7.9-contrib.patch new file mode 100644 index 00000000..ed688a0f --- /dev/null +++ b/SOURCES/policy-rhel-7.9-contrib.patch @@ -0,0 +1,124936 @@ +diff --git a/.gitignore b/.gitignore +new file mode 100644 +index 0000000000..bea5755230 +--- /dev/null ++++ b/.gitignore +@@ -0,0 +1 @@ ++TAGS +diff --git a/abrt.fc b/abrt.fc +index 1a93dc5781..e948aef597 100644 +--- a/abrt.fc ++++ b/abrt.fc +@@ -1,31 +1,47 @@ +-/etc/abrt(/.*)? gen_context(system_u:object_r:abrt_etc_t,s0) +-/etc/rc\.d/init\.d/abrt -- gen_context(system_u:object_r:abrt_initrc_exec_t,s0) ++/etc/abrt(/.*)? gen_context(system_u:object_r:abrt_etc_t,s0) ++/etc/rc\.d/init\.d/abrt -- gen_context(system_u:object_r:abrt_initrc_exec_t,s0) + +-/usr/bin/abrt-pyhook-helper -- gen_context(system_u:object_r:abrt_helper_exec_t,s0) +-/usr/bin/abrt-retrace-worker -- gen_context(system_u:object_r:abrt_retrace_worker_exec_t,s0) +-/usr/bin/coredump2packages -- gen_context(system_u:object_r:abrt_retrace_coredump_exec_t,s0) +-/usr/bin/retrace-server-worker -- gen_context(system_u:object_r:abrt_retrace_worker_exec_t,s0) ++/usr/lib/systemd/system/abrt.* -- gen_context(system_u:object_r:abrt_unit_file_t,s0) ++ ++/usr/bin/abrt-dump-.* -- gen_context(system_u:object_r:abrt_dump_oops_exec_t,s0) ++/usr/bin/abrt-uefioops-oops -- gen_context(system_u:object_r:abrt_dump_oops_exec_t,s0) ++/usr/bin/abrt-pyhook-helper -- gen_context(system_u:object_r:abrt_helper_exec_t,s0) ++/usr/bin/abrt-retrace-worker -- gen_context(system_u:object_r:abrt_retrace_worker_exec_t,s0) ++/usr/bin/abrt-watch-log -- gen_context(system_u:object_r:abrt_watch_log_exec_t,s0) ++/usr/bin/retrace-server-worker -- gen_context(system_u:object_r:abrt_retrace_worker_exec_t,s0) ++/usr/bin/coredump2packages -- gen_context(system_u:object_r:abrt_retrace_coredump_exec_t,s0) ++ ++/usr/sbin/abrtd -- gen_context(system_u:object_r:abrt_exec_t,s0) ++/usr/sbin/abrt-dbus -- gen_context(system_u:object_r:abrt_exec_t,s0) ++/usr/sbin/abrt-harvest.* -- gen_context(system_u:object_r:abrt_exec_t,s0) ++/usr/sbin/abrt-install-ccpp-hook -- gen_context(system_u:object_r:abrt_exec_t,s0) ++/usr/sbin/abrt-upload-watch -- gen_context(system_u:object_r:abrt_upload_watch_exec_t,s0) + +-/usr/libexec/abrt-pyhook-helper -- gen_context(system_u:object_r:abrt_helper_exec_t,s0) + /usr/libexec/abrt-handle-event -- gen_context(system_u:object_r:abrt_handle_event_exec_t,s0) +-/usr/libexec/abrt-hook-python -- gen_context(system_u:object_r:abrt_helper_exec_t,s0) ++/usr/libexec/abrt-hook-ccpp -- gen_context(system_u:object_r:abrt_dump_oops_exec_t,s0) ++ ++/var/cache/abrt(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) ++/var/cache/abrt-di(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) ++/var/cache/abrt-retrace(/.*)? gen_context(system_u:object_r:abrt_retrace_cache_t,s0) ++/var/cache/retrace-server(/.*)? gen_context(system_u:object_r:abrt_retrace_cache_t,s0) ++ ++/var/log/abrt-logger.* -- gen_context(system_u:object_r:abrt_var_log_t,s0) ++ ++/var/lib/abrt(/.*)? gen_context(system_u:object_r:abrt_var_lib_t,s0) ++ ++/var/run/abrt\.pid -- gen_context(system_u:object_r:abrt_var_run_t,s0) ++/var/run/abrtd?\.lock -- gen_context(system_u:object_r:abrt_var_run_t,s0) ++/var/run/abrtd?\.socket -- gen_context(system_u:object_r:abrt_var_run_t,s0) ++/var/run/abrt(/.*)? gen_context(system_u:object_r:abrt_var_run_t,s0) + +-/usr/sbin/abrtd -- gen_context(system_u:object_r:abrt_exec_t,s0) +-/usr/sbin/abrt-dbus -- gen_context(system_u:object_r:abrt_exec_t,s0) +-/usr/sbin/abrt-upload-watch -- gen_context(system_u:object_r:abrt_upload_watch_exec_t,s0) ++/var/spool/abrt(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) ++/var/spool/abrt-retrace(/.*)? gen_context(system_u:object_r:abrt_retrace_spool_t,s0) ++/var/spool/retrace-server(/.*)? gen_context(system_u:object_r:abrt_retrace_spool_t,s0) ++/var/spool/faf(/.*)? gen_context(system_u:object_r:abrt_retrace_spool_t,s0) ++/var/spool/debug(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) ++/var/spool/rhsm/debug(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) + +-/var/cache/abrt(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) +-/var/cache/abrt-di(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) +-/var/cache/abrt-retrace(/.*)? gen_context(system_u:object_r:abrt_retrace_cache_t,s0) +-/var/cache/retrace-server(/.*)? gen_context(system_u:object_r:abrt_retrace_cache_t,s0) ++/var/tmp/abrt(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) + +-/var/log/abrt-logger.* -- gen_context(system_u:object_r:abrt_var_log_t,s0) + +-/var/run/abrt\.pid -- gen_context(system_u:object_r:abrt_var_run_t,s0) +-/var/run/abrtd?\.lock -- gen_context(system_u:object_r:abrt_var_run_t,s0) +-/var/run/abrtd?\.socket -s gen_context(system_u:object_r:abrt_var_run_t,s0) +-/var/run/abrt(/.*)? gen_context(system_u:object_r:abrt_var_run_t,s0) + +-/var/spool/abrt(/.*)? gen_context(system_u:object_r:abrt_var_cache_t,s0) +-/var/spool/abrt-retrace(/.*)? gen_context(system_u:object_r:abrt_retrace_spool_t,s0) +-/var/spool/retrace-server(/.*)? gen_context(system_u:object_r:abrt_retrace_spool_t,s0) +diff --git a/abrt.if b/abrt.if +index 058d908e49..1b643bfb5d 100644 +--- a/abrt.if ++++ b/abrt.if +@@ -1,4 +1,26 @@ +-## Automated bug-reporting tool. ++## ABRT - automated bug-reporting tool ++ ++###################################### ++## ++## Creates types and rules for a basic ++## ABRT daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`abrt_basic_types_template',` ++ gen_require(` ++ attribute abrt_domain; ++ ') ++ ++ type $1_t, abrt_domain; ++ type $1_exec_t; ++ ++ kernel_read_system_state($1_t) ++') + + ###################################### + ## +@@ -17,6 +39,26 @@ interface(`abrt_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, abrt_exec_t, abrt_t) ++ allow $1 abrt_exec_t:file map; ++') ++ ++###################################### ++## ++## Execute abrt_dump_oops in the abrt_dump_oops_t domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`abrt_dump_oops_domtrans',` ++ gen_require(` ++ type abrt_dump_oops_t, abrt_dump_oops_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, abrt_dump_oops_exec_t, abrt_dump_oops_t) + ') + + ###################################### +@@ -36,11 +78,12 @@ interface(`abrt_exec',` + + corecmd_search_bin($1) + can_exec($1, abrt_exec_t) ++ allow $1 abrt_exec_t:file map; + ') + + ######################################## + ## +-## Send null signals to abrt. ++## Send a null signal to abrt. + ## + ## + ## +@@ -58,7 +101,7 @@ interface(`abrt_signull',` + + ######################################## + ## +-## Read process state of abrt. ++## Allow the domain to read abrt state files in /proc. + ## + ## + ## +@@ -71,12 +114,13 @@ interface(`abrt_read_state',` + type abrt_t; + ') + ++ kernel_search_proc($1) + ps_process_pattern($1, abrt_t) + ') + + ######################################## + ## +-## Connect to abrt over an unix stream socket. ++## Connect to abrt over a unix stream socket. + ## + ## + ## +@@ -116,8 +160,7 @@ interface(`abrt_dbus_chat',` + + ##################################### + ## +-## Execute abrt-helper in the abrt +-## helper domain. ++## Execute abrt-helper in the abrt-helper domain. + ## + ## + ## +@@ -130,15 +173,13 @@ interface(`abrt_domtrans_helper',` + type abrt_helper_t, abrt_helper_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, abrt_helper_exec_t, abrt_helper_t) + ') + + ######################################## + ## +-## Execute abrt helper in the abrt +-## helper domain, and allow the +-## specified role the abrt helper domain. ++## Execute abrt helper in the abrt_helper domain, and ++## allow the specified role the abrt_helper domain. + ## + ## + ## +@@ -163,8 +204,45 @@ interface(`abrt_run_helper',` + + ######################################## + ## +-## Create, read, write, and delete +-## abrt cache files. ++## Read abrt cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_read_cache',` ++ gen_require(` ++ type abrt_var_cache_t; ++ ') ++ ++ read_files_pattern($1, abrt_var_cache_t, abrt_var_cache_t) ++ read_lnk_files_pattern($1, abrt_var_cache_t, abrt_var_cache_t) ++') ++ ++######################################## ++## ++## Append abrt cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_append_cache',` ++ gen_require(` ++ type abrt_var_cache_t; ++ ') ++ ++ ++ allow $1 abrt_var_cache_t:file append_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read/Write inherited abrt cache + ## + ## + ## +@@ -172,15 +250,18 @@ interface(`abrt_run_helper',` + ## + ## + # +-interface(`abrt_cache_manage',` +- refpolicywarn(`$0($*) has been deprecated, use abrt_manage_cache() instead.') +- abrt_manage_cache($1) ++interface(`abrt_rw_inherited_cache',` ++ gen_require(` ++ type abrt_var_cache_t; ++ ') ++ ++ ++ allow $1 abrt_var_cache_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## abrt cache content. ++## Manage abrt cache + ## + ## + ## +@@ -193,7 +274,6 @@ interface(`abrt_manage_cache',` + type abrt_var_cache_t; + ') + +- files_search_var($1) + manage_files_pattern($1, abrt_var_cache_t, abrt_var_cache_t) + manage_lnk_files_pattern($1, abrt_var_cache_t, abrt_var_cache_t) + manage_dirs_pattern($1, abrt_var_cache_t, abrt_var_cache_t) +@@ -201,7 +281,7 @@ interface(`abrt_manage_cache',` + + #################################### + ## +-## Read abrt configuration files. ++## Read abrt configuration file. + ## + ## + ## +@@ -218,9 +298,29 @@ interface(`abrt_read_config',` + read_files_pattern($1, abrt_etc_t, abrt_etc_t) + ') + ++#################################### ++## ++## Dontaudit read abrt configuration file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_dontaudit_read_config',` ++ gen_require(` ++ type abrt_etc_t; ++ ') ++ ++ files_search_etc($1) ++ dontaudit $1 abrt_etc_t:dir list_dir_perms; ++ dontaudit $1 abrt_etc_t:file read_file_perms; ++') ++ + ###################################### + ## +-## Read abrt log files. ++## Read abrt logs. + ## + ## + ## +@@ -258,8 +358,7 @@ interface(`abrt_read_pid_files',` + + ###################################### + ## +-## Create, read, write, and delete +-## abrt PID files. ++## Create, read, write, and delete abrt PID files. + ## + ## + ## +@@ -276,10 +375,52 @@ interface(`abrt_manage_pid_files',` + manage_files_pattern($1, abrt_var_run_t, abrt_var_run_t) + ') + ++######################################## ++## ++## Read and write abrt fifo files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_rw_fifo_file',` ++ gen_require(` ++ type abrt_t; ++ ') ++ ++ allow $1 abrt_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Execute abrt server in the abrt domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`abrt_systemctl',` ++ gen_require(` ++ type abrt_t; ++ type abrt_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 abrt_unit_file_t:file manage_file_perms; ++ allow $1 abrt_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, abrt_t) ++') ++ + ##################################### + ## +-## All of the rules required to +-## administrate an abrt environment, ++## All of the rules required to administrate ++## an abrt environment + ## + ## + ## +@@ -288,39 +429,174 @@ interface(`abrt_manage_pid_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the abrt domain. + ## + ## + ## + # + interface(`abrt_admin',` + gen_require(` +- attribute abrt_domain; +- type abrt_t, abrt_etc_t, abrt_initrc_exec_t; +- type abrt_var_cache_t, abrt_var_log_t, abrt_retrace_cache_t; +- type abrt_var_run_t, abrt_tmp_t, abrt_retrace_spool_t; ++ type abrt_t, abrt_etc_t; ++ type abrt_var_cache_t, abrt_var_log_t; ++ type abrt_var_run_t, abrt_tmp_t; ++ type abrt_initrc_exec_t; ++ type abrt_unit_file_t; + ') + +- allow $1 abrt_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, abrt_domain) ++ allow $1 abrt_t:process { signal_perms }; ++ ps_process_pattern($1, abrt_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 abrt_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, abrt_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 abrt_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) ++ files_list_etc($1) + admin_pattern($1, abrt_etc_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, abrt_var_log_t) + +- files_search_var($1) +- admin_pattern($1, { abrt_retrace_cache_t abrt_var_cache_t abrt_retrace_spool_t }) ++ files_list_var($1) ++ admin_pattern($1, abrt_var_cache_t) + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, abrt_var_run_t) + +- files_search_tmp($1) ++ files_list_tmp($1) + admin_pattern($1, abrt_tmp_t) ++ ++ abrt_systemctl($1) ++ admin_pattern($1, abrt_unit_file_t) ++ allow $1 abrt_unit_file_t:service all_service_perms; ++') ++ ++#################################### ++## ++## Execute abrt-retrace in the abrt-retrace domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`abrt_domtrans_retrace_worker',` ++ gen_require(` ++ type abrt_retrace_worker_t, abrt_retrace_worker_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, abrt_retrace_worker_exec_t, abrt_retrace_worker_t) ++') ++ ++###################################### ++## ++## Manage abrt retrace server cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_manage_spool_retrace',` ++ gen_require(` ++ type abrt_retrace_spool_t; ++ ') ++ ++ manage_dirs_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++ manage_files_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++ manage_lnk_files_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++ manage_sock_files_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++') ++ ++##################################### ++## ++## Read abrt retrace server cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_read_spool_retrace',` ++ gen_require(` ++ type abrt_retrace_spool_t; ++ ') ++ ++ list_dirs_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++ read_files_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) ++ read_lnk_files_pattern($1, abrt_retrace_spool_t, abrt_retrace_spool_t) + ') ++ ++ ++##################################### ++## ++## Read abrt retrace server cache ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_read_cache_retrace',` ++ gen_require(` ++ type abrt_retrace_cache_t; ++ ') ++ ++ list_dirs_pattern($1, abrt_retrace_cache_t, abrt_retrace_cache_t) ++ read_files_pattern($1, abrt_retrace_cache_t, abrt_retrace_cache_t) ++ read_lnk_files_pattern($1, abrt_retrace_cache_t, abrt_retrace_cache_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to write abrt sock files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`abrt_dontaudit_write_sock_file',` ++ gen_require(` ++ type abrt_t; ++ ') ++ ++ dontaudit $1 abrt_t:sock_file write; ++') ++ ++######################################## ++## ++## Transition to abrt named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`abrt_filetrans_named_content',` ++ gen_require(` ++ type abrt_tmp_t; ++ type abrt_etc_t; ++ type abrt_var_cache_t; ++ type abrt_var_run_t; ++ ') ++ ++ files_tmp_filetrans($1, abrt_var_cache_t, dir, "abrt") ++ files_etc_filetrans($1, abrt_etc_t, dir, "abrt") ++ files_var_filetrans($1, abrt_var_cache_t, dir, "abrt") ++ files_var_filetrans($1, abrt_var_cache_t, dir, "abrt-dix") ++ files_var_filetrans($1, abrt_var_cache_t, dir, "debug") ++ files_pid_filetrans($1, abrt_var_run_t, dir, "abrt") ++') ++ +diff --git a/abrt.te b/abrt.te +index eb50f070fe..a006449032 100644 +--- a/abrt.te ++++ b/abrt.te +@@ -6,11 +6,10 @@ policy_module(abrt, 1.4.1) + # + + ## +-##

      +-## Determine whether ABRT can modify +-## public files used for public file +-## transfer services. +-##

      ++##

      ++## Allow ABRT to modify public files ++## used for public file transfer services. ++##

      + ##
      + gen_tunable(abrt_anon_write, false) + +@@ -37,87 +36,99 @@ attribute abrt_domain; + attribute_role abrt_helper_roles; + roleattribute system_r abrt_helper_roles; + +-type abrt_t, abrt_domain; +-type abrt_exec_t; ++abrt_basic_types_template(abrt) + init_daemon_domain(abrt_t, abrt_exec_t) + + type abrt_initrc_exec_t; + init_script_file(abrt_initrc_exec_t) + ++type abrt_unit_file_t; ++systemd_unit_file(abrt_unit_file_t) ++ + type abrt_etc_t; + files_config_file(abrt_etc_t) + + type abrt_var_log_t; + logging_log_file(abrt_var_log_t) + ++type abrt_var_lib_t; ++files_type(abrt_var_lib_t) ++ + type abrt_tmp_t; + files_tmp_file(abrt_tmp_t) + + type abrt_var_cache_t; + files_type(abrt_var_cache_t) ++files_tmp_file(abrt_var_cache_t) ++userdom_user_tmp_content(abrt_var_cache_t) + + type abrt_var_run_t; + files_pid_file(abrt_var_run_t) + +-type abrt_dump_oops_t, abrt_domain; +-type abrt_dump_oops_exec_t; ++abrt_basic_types_template(abrt_dump_oops) + init_system_domain(abrt_dump_oops_t, abrt_dump_oops_exec_t) ++domain_obj_id_change_exemption(abrt_dump_oops_t) + +-type abrt_handle_event_t, abrt_domain; +-type abrt_handle_event_exec_t; +-domain_type(abrt_handle_event_t) +-domain_entry_file(abrt_handle_event_t, abrt_handle_event_exec_t) ++abrt_basic_types_template(abrt_handle_event) ++application_domain(abrt_handle_event_t, abrt_handle_event_exec_t) + role system_r types abrt_handle_event_t; + +-type abrt_helper_t, abrt_domain; +-type abrt_helper_exec_t; ++# type needed to allow all domains ++# to handle /var/cache/abrt ++# type needed to allow all domains ++# to handle /var/cache/abrt ++abrt_basic_types_template(abrt_helper) + application_domain(abrt_helper_t, abrt_helper_exec_t) + role abrt_helper_roles types abrt_helper_t; + +-type abrt_retrace_coredump_t, abrt_domain; +-type abrt_retrace_coredump_exec_t; +-domain_type(abrt_retrace_coredump_t) +-domain_entry_file(abrt_retrace_coredump_t, abrt_retrace_coredump_exec_t) +-role system_r types abrt_retrace_coredump_t; +- +-type abrt_retrace_worker_t, abrt_domain; +-type abrt_retrace_worker_exec_t; +-domain_type(abrt_retrace_worker_t) +-domain_entry_file(abrt_retrace_worker_t, abrt_retrace_worker_exec_t) ++abrt_basic_types_template(abrt_retrace_worker) ++application_domain(abrt_retrace_worker_t, abrt_retrace_worker_exec_t) + role system_r types abrt_retrace_worker_t; + ++abrt_basic_types_template(abrt_retrace_coredump) ++application_domain(abrt_retrace_coredump_t, abrt_retrace_coredump_exec_t) ++role system_r types abrt_retrace_coredump_t; ++ + type abrt_retrace_cache_t; + files_type(abrt_retrace_cache_t) + + type abrt_retrace_spool_t; +-files_type(abrt_retrace_spool_t) ++files_spool_file(abrt_retrace_spool_t) + +-type abrt_watch_log_t, abrt_domain; +-type abrt_watch_log_exec_t; ++abrt_basic_types_template(abrt_watch_log) + init_daemon_domain(abrt_watch_log_t, abrt_watch_log_exec_t) + +-type abrt_upload_watch_t, abrt_domain; +-type abrt_upload_watch_exec_t; ++abrt_basic_types_template(abrt_upload_watch) + init_daemon_domain(abrt_upload_watch_t, abrt_upload_watch_exec_t) + ++type abrt_upload_watch_tmp_t; ++files_tmp_file(abrt_upload_watch_tmp_t) ++ ++ + ifdef(`enable_mcs',` + init_ranged_daemon_domain(abrt_t, abrt_exec_t, s0 - mcs_systemhigh) + ') + + ######################################## + # +-# Local policy ++# abrt local policy + # + +-allow abrt_t self:capability { chown dac_override fowner fsetid kill setgid setuid sys_nice }; +-dontaudit abrt_t self:capability sys_rawio; ++allow abrt_t self:capability { chown dac_read_search dac_override fowner fsetid ipc_lock kill setgid setuid sys_nice sys_ptrace }; ++dontaudit abrt_t self:capability { net_admin sys_rawio sys_ptrace }; + allow abrt_t self:process { setpgid sigkill signal signull setsched getsched }; ++ + allow abrt_t self:fifo_file rw_fifo_file_perms; +-allow abrt_t self:tcp_socket { accept listen }; ++allow abrt_t self:tcp_socket create_stream_socket_perms; ++allow abrt_t self:udp_socket create_socket_perms; ++allow abrt_t self:unix_dgram_socket create_socket_perms; ++allow abrt_t self:netlink_route_socket r_netlink_socket_perms; + +-allow abrt_t abrt_etc_t:dir list_dir_perms; ++# abrt etc files ++list_dirs_pattern(abrt_t, abrt_etc_t, abrt_etc_t) + rw_files_pattern(abrt_t, abrt_etc_t, abrt_etc_t) + ++# log file + manage_files_pattern(abrt_t, abrt_var_log_t, abrt_var_log_t) + logging_log_filetrans(abrt_t, abrt_var_log_t, file) + +@@ -125,48 +136,60 @@ manage_dirs_pattern(abrt_t, abrt_tmp_t, abrt_tmp_t) + manage_files_pattern(abrt_t, abrt_tmp_t, abrt_tmp_t) + manage_lnk_files_pattern(abrt_t, abrt_tmp_t, abrt_tmp_t) + files_tmp_filetrans(abrt_t, abrt_tmp_t, { file dir }) ++can_exec(abrt_t, abrt_tmp_t) + ++# abrt var/cache files + manage_files_pattern(abrt_t, abrt_var_cache_t, abrt_var_cache_t) + manage_dirs_pattern(abrt_t, abrt_var_cache_t, abrt_var_cache_t) + manage_lnk_files_pattern(abrt_t, abrt_var_cache_t, abrt_var_cache_t) + files_var_filetrans(abrt_t, abrt_var_cache_t, { file dir }) + files_spool_filetrans(abrt_t, abrt_var_cache_t, dir) ++files_tmp_filetrans(abrt_t, abrt_var_cache_t, dir, "abrt") ++allow abrt_t abrt_var_cache_t:file map; + ++# abrt pid files + manage_files_pattern(abrt_t, abrt_var_run_t, abrt_var_run_t) + manage_dirs_pattern(abrt_t, abrt_var_run_t, abrt_var_run_t) + manage_sock_files_pattern(abrt_t, abrt_var_run_t, abrt_var_run_t) + manage_lnk_files_pattern(abrt_t, abrt_var_run_t, abrt_var_run_t) + files_pid_filetrans(abrt_t, abrt_var_run_t, { file dir sock_file }) + +-can_exec(abrt_t, abrt_tmp_t) ++manage_files_pattern(abrt_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) ++manage_dirs_pattern(abrt_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) ++manage_lnk_files_pattern(abrt_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) + ++kernel_read_all_proc(abrt_t) + kernel_read_ring_buffer(abrt_t) +-kernel_read_system_state(abrt_t) ++kernel_read_network_state(abrt_t) ++kernel_read_software_raid_state(abrt_t) + kernel_request_load_module(abrt_t) ++kernel_rw_usermodehelper_state(abrt_t) + kernel_rw_kernel_sysctl(abrt_t) ++# needed by docker BZ #1194280 ++kernel_read_net_sysctls(abrt_t) ++kernel_rw_usermodehelper_state(abrt_t) + + corecmd_exec_bin(abrt_t) + corecmd_exec_shell(abrt_t) + corecmd_read_all_executables(abrt_t) + + corenet_all_recvfrom_netlabel(abrt_t) +-corenet_all_recvfrom_unlabeled(abrt_t) + corenet_tcp_sendrecv_generic_if(abrt_t) + corenet_tcp_sendrecv_generic_node(abrt_t) +-corenet_tcp_sendrecv_all_ports(abrt_t) ++corenet_tcp_sendrecv_generic_port(abrt_t) + corenet_tcp_bind_generic_node(abrt_t) +- +-corenet_sendrecv_all_client_packets(abrt_t) + corenet_tcp_connect_http_port(abrt_t) + corenet_tcp_connect_ftp_port(abrt_t) + corenet_tcp_connect_all_ports(abrt_t) ++corenet_sendrecv_http_client_packets(abrt_t) + + dev_getattr_all_chr_files(abrt_t) + dev_getattr_all_blk_files(abrt_t) + dev_read_rand(abrt_t) + dev_read_urand(abrt_t) + dev_rw_sysfs(abrt_t) +-dev_dontaudit_read_raw_memory(abrt_t) ++dev_read_raw_memory(abrt_t) ++dev_write_kmsg(abrt_t) + + domain_getattr_all_domains(abrt_t) + domain_read_all_domains_state(abrt_t) +@@ -176,29 +199,45 @@ files_getattr_all_files(abrt_t) + files_read_config_files(abrt_t) + files_read_etc_runtime_files(abrt_t) + files_read_var_symlinks(abrt_t) +-files_read_usr_files(abrt_t) ++files_read_var_lib_files(abrt_t) ++files_read_generic_tmp_files(abrt_t) + files_read_kernel_modules(abrt_t) ++files_dontaudit_list_default(abrt_t) + files_dontaudit_read_default_files(abrt_t) + files_dontaudit_read_all_symlinks(abrt_t) + files_dontaudit_getattr_all_sockets(abrt_t) + files_list_mnt(abrt_t) ++fs_list_all(abrt_t) + ++fs_list_inotifyfs(abrt_t) + fs_getattr_all_fs(abrt_t) + fs_getattr_all_dirs(abrt_t) +-fs_list_inotifyfs(abrt_t) + fs_read_fusefs_files(abrt_t) + fs_read_noxattr_fs_files(abrt_t) + fs_read_nfs_files(abrt_t) + fs_read_nfs_symlinks(abrt_t) + fs_search_all(abrt_t) + +-auth_use_nsswitch(abrt_t) ++storage_dontaudit_read_fixed_disk(abrt_t) + + logging_read_generic_logs(abrt_t) ++logging_mmap_journal(abrt_t) ++logging_send_syslog_msg(abrt_t) ++logging_stream_connect_syslog(abrt_t) ++logging_read_syslog_pid(abrt_t) + ++auth_use_nsswitch(abrt_t) ++auth_map_passwd(abrt_t) ++ ++init_read_utmp(abrt_t) ++ ++miscfiles_read_generic_certs(abrt_t) + miscfiles_read_public_files(abrt_t) ++miscfiles_dontaudit_access_check_cert(abrt_t) ++miscfiles_dontaudit_write_generic_cert_files(abrt_t) + + userdom_dontaudit_read_user_home_content_files(abrt_t) ++userdom_dontaudit_read_admin_home_files(abrt_t) + + tunable_policy(`abrt_anon_write',` + miscfiles_manage_public_files(abrt_t) +@@ -206,15 +245,11 @@ tunable_policy(`abrt_anon_write',` + + optional_policy(` + apache_list_modules(abrt_t) +- apache_read_module_files(abrt_t) ++ apache_read_modules(abrt_t) + ') + + optional_policy(` + dbus_system_domain(abrt_t, abrt_exec_t) +- +- optional_policy(` +- policykit_dbus_chat(abrt_t) +- ') + ') + + optional_policy(` +@@ -222,6 +257,28 @@ optional_policy(` + ') + + optional_policy(` ++ container_stream_connect(abrt_t) ++') ++ ++optional_policy(` ++ kdump_manage_crash(abrt_t) ++') ++ ++optional_policy(` ++ mcelog_read_log(abrt_t) ++') ++ ++optional_policy(` ++ mozilla_plugin_dontaudit_rw_tmp_files(abrt_t) ++ mozilla_plugin_read_rw_files(abrt_t) ++') ++ ++optional_policy(` ++ pcp_read_lib_files(abrt_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(abrt_t) + policykit_domtrans_auth(abrt_t) + policykit_read_lib(abrt_t) + policykit_read_reload(abrt_t) +@@ -233,6 +290,11 @@ optional_policy(` + corecmd_exec_all_executables(abrt_t) + ') + ++optional_policy(` ++ puppet_read_lib(abrt_t) ++') ++ ++# to install debuginfo packages + optional_policy(` + rpm_exec(abrt_t) + rpm_dontaudit_manage_db(abrt_t) +@@ -243,6 +305,14 @@ optional_policy(` + rpm_signull(abrt_t) + ') + ++optional_policy(` ++ rhsmcertd_manage_pid_files(abrt_t) ++ rhsmcertd_read_log(abrt_t) ++ rhsmcertd_read_lib_files(abrt_t) ++ ++') ++ ++# to run mailx plugin + optional_policy(` + sendmail_domtrans(abrt_t) + ') +@@ -253,9 +323,21 @@ optional_policy(` + sosreport_delete_tmp_files(abrt_t) + ') + ++optional_policy(` ++ sssd_stream_connect(abrt_t) ++') ++ ++optional_policy(` ++ xserver_read_log(abrt_t) ++') ++ ++optional_policy(` ++ udev_read_db(abrt_t) ++') ++ + ####################################### + # +-# Handle-event local policy ++# abrt-handle-event local policy + # + + allow abrt_handle_event_t self:fifo_file rw_fifo_file_perms; +@@ -266,9 +348,13 @@ tunable_policy(`abrt_handle_event',` + can_exec(abrt_t, abrt_handle_event_exec_t) + ') + ++optional_policy(` ++ unconfined_domain(abrt_handle_event_t) ++') ++ + ######################################## + # +-# Helper local policy ++# abrt--helper local policy + # + + allow abrt_helper_t self:capability { chown setgid sys_nice }; +@@ -281,6 +367,7 @@ manage_dirs_pattern(abrt_helper_t, abrt_var_cache_t, abrt_var_cache_t) + manage_files_pattern(abrt_helper_t, abrt_var_cache_t, abrt_var_cache_t) + manage_lnk_files_pattern(abrt_helper_t, abrt_var_cache_t, abrt_var_cache_t) + files_var_filetrans(abrt_helper_t, abrt_var_cache_t, { file dir }) ++files_tmp_filetrans(abrt_helper_t, abrt_var_cache_t, dir, "abrt") + + read_files_pattern(abrt_helper_t, abrt_var_run_t, abrt_var_run_t) + read_lnk_files_pattern(abrt_helper_t, abrt_var_run_t, abrt_var_run_t) +@@ -289,15 +376,20 @@ corecmd_read_all_executables(abrt_helper_t) + + domain_read_all_domains_state(abrt_helper_t) + ++files_dontaudit_all_non_security_leaks(abrt_helper_t) ++ + fs_list_inotifyfs(abrt_helper_t) + fs_getattr_all_fs(abrt_helper_t) + + auth_use_nsswitch(abrt_helper_t) + ++logging_send_syslog_msg(abrt_helper_t) ++ + term_dontaudit_use_all_ttys(abrt_helper_t) + term_dontaudit_use_all_ptys(abrt_helper_t) + + ifdef(`hide_broken_symptoms',` ++ domain_dontaudit_leaks(abrt_helper_t) + userdom_dontaudit_read_user_home_content_files(abrt_helper_t) + userdom_dontaudit_read_user_tmp_files(abrt_helper_t) + dev_dontaudit_read_all_blk_files(abrt_helper_t) +@@ -305,11 +397,25 @@ ifdef(`hide_broken_symptoms',` + dev_dontaudit_write_all_chr_files(abrt_helper_t) + dev_dontaudit_write_all_blk_files(abrt_helper_t) + fs_dontaudit_rw_anon_inodefs_files(abrt_helper_t) ++ ++ optional_policy(` ++ rpm_dontaudit_leaks(abrt_helper_t) ++ ') ++') ++ ++ifdef(`hide_broken_symptoms',` ++ gen_require(` ++ attribute domain; ++ ') ++ ++ allow abrt_t self:capability sys_resource; ++ allow abrt_t domain:file write; ++ allow abrt_t domain:process setrlimit; + ') + + ####################################### + # +-# Retrace coredump policy ++# abrt retrace coredump policy + # + + allow abrt_retrace_coredump_t self:fifo_file rw_fifo_file_perms; +@@ -327,10 +433,12 @@ corecmd_exec_shell(abrt_retrace_coredump_t) + + dev_read_urand(abrt_retrace_coredump_t) + +-files_read_usr_files(abrt_retrace_coredump_t) ++ ++logging_send_syslog_msg(abrt_retrace_coredump_t) + + sysnet_dns_name_resolve(abrt_retrace_coredump_t) + ++# to install debuginfo packages + optional_policy(` + rpm_exec(abrt_retrace_coredump_t) + rpm_dontaudit_manage_db(abrt_retrace_coredump_t) +@@ -343,10 +451,11 @@ optional_policy(` + + ####################################### + # +-# Retrace worker policy ++# abrt retrace worker policy + # + +-allow abrt_retrace_worker_t self:capability setuid; ++allow abrt_retrace_worker_t self:capability { setuid }; ++ + allow abrt_retrace_worker_t self:fifo_file rw_fifo_file_perms; + + domtrans_pattern(abrt_retrace_worker_t, abrt_retrace_coredump_exec_t, abrt_retrace_coredump_t) +@@ -365,38 +474,83 @@ corecmd_exec_shell(abrt_retrace_worker_t) + + dev_read_urand(abrt_retrace_worker_t) + +-files_read_usr_files(abrt_retrace_worker_t) ++ ++logging_send_syslog_msg(abrt_retrace_worker_t) + + sysnet_dns_name_resolve(abrt_retrace_worker_t) + ++optional_policy(` ++ mock_domtrans(abrt_retrace_worker_t) ++ mock_manage_lib_files(abrt_t) ++') ++ + ######################################## + # +-# Dump oops local policy ++# abrt_dump_oops local policy + # + +-allow abrt_dump_oops_t self:capability dac_override; ++allow abrt_dump_oops_t self:capability { kill net_admin sys_ptrace ipc_lock fowner chown fsetid dac_read_search dac_override setuid setgid }; ++allow abrt_dump_oops_t self:process setfscreate; + allow abrt_dump_oops_t self:fifo_file rw_fifo_file_perms; +-allow abrt_dump_oops_t self:unix_stream_socket { accept listen }; ++allow abrt_dump_oops_t self:unix_stream_socket create_stream_socket_perms; + + files_search_spool(abrt_dump_oops_t) + manage_dirs_pattern(abrt_dump_oops_t, abrt_var_cache_t, abrt_var_cache_t) + manage_files_pattern(abrt_dump_oops_t, abrt_var_cache_t, abrt_var_cache_t) + manage_lnk_files_pattern(abrt_dump_oops_t, abrt_var_cache_t, abrt_var_cache_t) + files_var_filetrans(abrt_dump_oops_t, abrt_var_cache_t, { file dir }) ++files_tmp_filetrans(abrt_dump_oops_t, abrt_var_cache_t, dir, "abrt") ++ ++manage_dirs_pattern(abrt_dump_oops_t, abrt_var_lib_t, abrt_var_lib_t) ++manage_files_pattern(abrt_dump_oops_t, abrt_var_lib_t, abrt_var_lib_t) + + read_files_pattern(abrt_dump_oops_t, abrt_var_run_t, abrt_var_run_t) + read_lnk_files_pattern(abrt_dump_oops_t, abrt_var_run_t, abrt_var_run_t) + + read_files_pattern(abrt_dump_oops_t, abrt_etc_t, abrt_etc_t) + ++kernel_read_debugfs(abrt_dump_oops_t) + kernel_read_kernel_sysctls(abrt_dump_oops_t) + kernel_read_ring_buffer(abrt_dump_oops_t) ++kernel_read_security_state(abrt_dump_oops_t) ++ ++auth_read_passwd(abrt_dump_oops_t) ++ ++corecmd_getattr_all_executables(abrt_dump_oops_t) ++ ++dev_read_urand(abrt_dump_oops_t) ++dev_read_rand(abrt_dump_oops_t) + + domain_use_interactive_fds(abrt_dump_oops_t) ++domain_signull_all_domains(abrt_dump_oops_t) ++domain_read_all_domains_state(abrt_dump_oops_t) ++domain_getattr_all_domains(abrt_dump_oops_t) ++ ++tunable_policy(`deny_ptrace',`',` ++ domain_ptrace_all_domains(abrt_dump_oops_t) ++') ++ ++files_manage_non_security_dirs(abrt_dump_oops_t) ++files_manage_non_security_files(abrt_dump_oops_t) ++files_map_non_security_files(abrt_dump_oops_t) + ++fs_getattr_all_fs(abrt_dump_oops_t) + fs_list_inotifyfs(abrt_dump_oops_t) ++fs_list_pstorefs(abrt_dump_oops_t) ++ ++selinux_compute_create_context(abrt_dump_oops_t) + + logging_read_generic_logs(abrt_dump_oops_t) ++logging_read_syslog_pid(abrt_dump_oops_t) ++logging_send_syslog_msg(abrt_dump_oops_t) ++logging_mmap_generic_logs(abrt_dump_oops_t) ++logging_mmap_journal(abrt_dump_oops_t) ++ ++init_read_var_lib_files(abrt_dump_oops_t) ++ ++optional_policy(` ++ nscd_dontaudit_write_sock_file(abrt_dump_oops_t) ++') + + ####################################### + # +@@ -404,25 +558,63 @@ logging_read_generic_logs(abrt_dump_oops_t) + # + + allow abrt_watch_log_t self:fifo_file rw_fifo_file_perms; +-allow abrt_watch_log_t self:unix_stream_socket { accept listen }; ++allow abrt_watch_log_t self:unix_stream_socket create_stream_socket_perms; + + read_files_pattern(abrt_watch_log_t, abrt_etc_t, abrt_etc_t) + ++auth_read_passwd(abrt_watch_log_t) ++auth_use_nsswitch(abrt_watch_log_t) ++ + domtrans_pattern(abrt_watch_log_t, abrt_dump_oops_exec_t, abrt_dump_oops_t) ++allow abrt_watch_log_t abrt_dump_oops_exec_t:file map; + + corecmd_exec_bin(abrt_watch_log_t) + + logging_read_all_logs(abrt_watch_log_t) ++logging_send_syslog_msg(abrt_watch_log_t) ++ ++optional_policy(` ++ gnome_list_home_config(abrt_watch_log_t) ++') ++ ++tunable_policy(`abrt_upload_watch_anon_write',` ++ miscfiles_manage_public_files(abrt_upload_watch_t) ++') + + ####################################### + # + # Upload watch local policy + # + ++allow abrt_upload_watch_t self:capability { dac_read_search dac_override chown fsetid }; ++ ++manage_files_pattern(abrt_upload_watch_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) ++manage_dirs_pattern(abrt_upload_watch_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) ++manage_lnk_files_pattern(abrt_upload_watch_t, abrt_upload_watch_tmp_t, abrt_upload_watch_tmp_t) ++files_tmp_filetrans(abrt_upload_watch_t, abrt_upload_watch_tmp_t, {file dir}) ++ ++read_files_pattern(abrt_upload_watch_t, abrt_etc_t, abrt_etc_t) ++ ++manage_dirs_pattern(abrt_upload_watch_t, abrt_var_cache_t, abrt_var_cache_t) ++ ++abrt_dbus_chat(abrt_upload_watch_t) ++ + corecmd_exec_bin(abrt_upload_watch_t) + ++dev_read_urand(abrt_upload_watch_t) ++ ++files_search_spool(abrt_upload_watch_t) ++ ++auth_read_passwd(abrt_upload_watch_t) ++ ++miscfiles_read_certs(abrt_upload_watch_t) ++ + tunable_policy(`abrt_upload_watch_anon_write',` +- miscfiles_manage_public_files(abrt_upload_watch_t) ++ miscfiles_manage_public_files(abrt_upload_watch_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(abrt_upload_watch_t) + ') + + ####################################### +@@ -430,10 +622,7 @@ tunable_policy(`abrt_upload_watch_anon_write',` + # Global local policy + # + +-kernel_read_system_state(abrt_domain) ++allow abrt_domain abrt_var_run_t:sock_file write_sock_file_perms; ++allow abrt_domain abrt_var_run_t:unix_stream_socket connectto; + + files_read_etc_files(abrt_domain) +- +-logging_send_syslog_msg(abrt_domain) +- +-miscfiles_read_localization(abrt_domain) +diff --git a/accountsd.fc b/accountsd.fc +index f9d8d7a929..0682710306 100644 +--- a/accountsd.fc ++++ b/accountsd.fc +@@ -1,3 +1,5 @@ ++/usr/lib/systemd/system/accountsd.* -- gen_context(system_u:object_r:accountsd_unit_file_t,s0) ++ + /usr/libexec/accounts-daemon -- gen_context(system_u:object_r:accountsd_exec_t,s0) + + /usr/lib/accountsservice/accounts-daemon -- gen_context(system_u:object_r:accountsd_exec_t,s0) +diff --git a/accountsd.if b/accountsd.if +index bd5ec9ab08..554177cd29 100644 +--- a/accountsd.if ++++ b/accountsd.if +@@ -126,23 +126,51 @@ interface(`accountsd_manage_lib_files',` + ##
      + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## ++# ++interface(`accountsd_systemctl',` ++ gen_require(` ++ type accountsd_t; ++ type accountsd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 accountsd_unit_file_t:file read_file_perms; ++ allow $1 accountsd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, accountsd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an accountsd environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # + interface(`accountsd_admin',` + gen_require(` + type accountsd_t; ++ type accountsd_unit_file_t; + ') + +- allow $1 accountsd_t:process { ptrace signal_perms }; ++ allow $1 accountsd_t:process signal_perms; + ps_process_pattern($1, accountsd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 accountsd_t:process ptrace; ++ ') ++ + accountsd_manage_lib_files($1) ++ ++ accountsd_systemctl($1) ++ admin_pattern($1, accountsd_unit_file_t) ++ allow $1 accountsd_unit_file_t:service all_service_perms; + ') +diff --git a/accountsd.te b/accountsd.te +index 3593510d8e..7c13845fd0 100644 +--- a/accountsd.te ++++ b/accountsd.te +@@ -4,6 +4,10 @@ gen_require(` + class passwd all_passwd_perms; + ') + ++gen_require(` ++ class passwd { passwd chfn chsh rootok crontab }; ++') ++ + ######################################## + # + # Declarations +@@ -11,17 +15,21 @@ gen_require(` + + type accountsd_t; + type accountsd_exec_t; +-dbus_system_domain(accountsd_t, accountsd_exec_t) ++init_daemon_domain(accountsd_t, accountsd_exec_t) ++role system_r types accountsd_t; + + type accountsd_var_lib_t; + files_type(accountsd_var_lib_t) + ++type accountsd_unit_file_t; ++systemd_unit_file(accountsd_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow accountsd_t self:capability { chown dac_override setuid setgid sys_ptrace }; ++allow accountsd_t self:capability { chown dac_read_search dac_override setuid setgid sys_ptrace }; + allow accountsd_t self:process signal; + allow accountsd_t self:fifo_file rw_fifo_file_perms; + allow accountsd_t self:passwd { rootok passwd chfn chsh }; +@@ -38,7 +46,6 @@ corecmd_exec_bin(accountsd_t) + dev_read_sysfs(accountsd_t) + + files_read_mnt_files(accountsd_t) +-files_read_usr_files(accountsd_t) + + fs_getattr_xattr_fs(accountsd_t) + fs_list_inotifyfs(accountsd_t) +@@ -48,12 +55,15 @@ auth_use_nsswitch(accountsd_t) + auth_read_login_records(accountsd_t) + auth_read_shadow(accountsd_t) + +-miscfiles_read_localization(accountsd_t) ++init_dbus_chat(accountsd_t) + + logging_list_logs(accountsd_t) + logging_send_syslog_msg(accountsd_t) + logging_set_loginuid(accountsd_t) + ++userdom_dontaudit_create_admin_dir(accountsd_t) ++userdom_dontaudit_manage_admin_dir(accountsd_t) ++ + userdom_read_user_tmp_files(accountsd_t) + userdom_read_user_home_content_files(accountsd_t) + +@@ -65,10 +75,17 @@ optional_policy(` + consolekit_read_log(accountsd_t) + ') + ++optional_policy(` ++ dbus_system_domain(accountsd_t, accountsd_exec_t) ++') ++ + optional_policy(` + policykit_dbus_chat(accountsd_t) + ') + + optional_policy(` + xserver_read_xdm_tmp_files(accountsd_t) ++ xserver_read_state_xdm(accountsd_t) ++ xserver_dbus_chat_xdm(accountsd_t) ++ xserver_manage_xdm_etc_files(accountsd_t) + ') +diff --git a/acct.if b/acct.if +index 81280d0086..bc4038b45e 100644 +--- a/acct.if ++++ b/acct.if +@@ -83,6 +83,24 @@ interface(`acct_manage_data',` + + ######################################## + ## ++## Dontaudit Attempts to list acct_data directory ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`acct_dontaudit_list_data',` ++ gen_require(` ++ type acct_data_t; ++ ') ++ ++ dontaudit $1 acct_data_t:dir list_dir_perms; ++') ++ ++####################################### ++## + ## All of the rules required to + ## administrate an acct environment. + ## +@@ -103,9 +121,13 @@ interface(`acct_admin',` + type acct_t, acct_initrc_exec_t, acct_data_t; + ') + +- allow $1 acct_t:process { ptrace signal_perms }; ++ allow $1 acct_t:process { signal_perms }; + ps_process_pattern($1, acct_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 acct_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, acct_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 acct_initrc_exec_t system_r; +diff --git a/acct.te b/acct.te +index 8b9ad83c5b..f4f24864b1 100644 +--- a/acct.te ++++ b/acct.te +@@ -40,8 +40,6 @@ corecmd_exec_shell(acct_t) + dev_read_sysfs(acct_t) + dev_read_urand(acct_t) + +-domain_use_interactive_fds(acct_t) +- + fs_search_auto_mountpoints(acct_t) + fs_getattr_xattr_fs(acct_t) + +@@ -49,7 +47,6 @@ term_dontaudit_use_console(acct_t) + term_dontaudit_use_generic_ptys(acct_t) + + files_read_etc_runtime_files(acct_t) +-files_list_usr(acct_t) + + auth_use_nsswitch(acct_t) + +@@ -59,8 +56,6 @@ init_exec_script_files(acct_t) + + logging_send_syslog_msg(acct_t) + +-miscfiles_read_localization(acct_t) +- + userdom_dontaudit_search_user_home_dirs(acct_t) + userdom_dontaudit_use_unpriv_user_fds(acct_t) + +diff --git a/ada.te b/ada.te +index 8d42c97ae9..2377f8f826 100644 +--- a/ada.te ++++ b/ada.te +@@ -20,7 +20,7 @@ role ada_roles types ada_t; + + allow ada_t self:process { execstack execmem }; + +-userdom_use_user_terminals(ada_t) ++userdom_use_inherited_user_terminals(ada_t) + + optional_policy(` + unconfined_domain(ada_t) +diff --git a/afs.fc b/afs.fc +index 8926c1696e..206ea16fd5 100644 +--- a/afs.fc ++++ b/afs.fc +@@ -3,6 +3,8 @@ + /etc/rc\.d/init\.d/openafs-client -- gen_context(system_u:object_r:afs_initrc_exec_t,s0) + /etc/rc\.d/init\.d/(open)?afs -- gen_context(system_u:object_r:afs_initrc_exec_t,s0) + ++/usr/afs(/.*)? gen_context(system_u:object_r:afs_files_t,s0) ++ + /usr/afs/bin/bosserver -- gen_context(system_u:object_r:afs_bosserver_exec_t,s0) + /usr/afs/bin/fileserver -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) + /usr/afs/bin/kaserver -- gen_context(system_u:object_r:afs_kaserver_exec_t,s0) +@@ -10,6 +12,10 @@ + /usr/afs/bin/salvager -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) + /usr/afs/bin/volserver -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) + /usr/afs/bin/vlserver -- gen_context(system_u:object_r:afs_vlserver_exec_t,s0) ++/usr/afs/bin/dafileserver -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) ++/usr/afs/bin/davolserver -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) ++/usr/afs/bin/salvageserver -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) ++/usr/afs/bin/dasalvager -- gen_context(system_u:object_r:afs_fsserver_exec_t,s0) + + /usr/afs/db -d gen_context(system_u:object_r:afs_dbdir_t,s0) + /usr/afs/db/pr.* -- gen_context(system_u:object_r:afs_pt_db_t,s0) +diff --git a/afs.if b/afs.if +index 3b41be6994..97d99f979f 100644 +--- a/afs.if ++++ b/afs.if +@@ -38,6 +38,24 @@ interface(`afs_rw_udp_sockets',` + allow $1 afs_t:udp_socket { read write }; + ') + ++######################################## ++## ++## Read AFS config data ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`afs_read_config',` ++ gen_require(` ++ type afs_config_t; ++ ') ++ ++ read_files_pattern($1, afs_config_t, afs_config_t) ++') ++ + ######################################## + ## + ## Read and write afs cache files. +@@ -95,13 +113,17 @@ interface(`afs_initrc_domtrans',` + interface(`afs_admin',` + gen_require(` + attribute afs_domain; +- type afs_initrc_exec_t, afs_dbdir_t, afs_pt_db_t; ++ type afs_t, afs_initrc_exec_t, afs_dbdir_t, afs_pt_db_t; + type afs_ka_db_t, afs_vl_db_t, afs_config_t; + type afs_logfile_t, afs_cache_t, afs_files_t; + ') + +- allow $1 afs_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, afs_domain) ++ allow $1 afs_t:process signal_perms; ++ ps_process_pattern($1, afs_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 afs_t:process ptrace; ++ ') + + afs_initrc_domtrans($1) + domain_system_change_exemption($1) +diff --git a/afs.te b/afs.te +index 90ce63748d..8cf712d15b 100644 +--- a/afs.te ++++ b/afs.te +@@ -72,7 +72,7 @@ role system_r types afs_vlserver_t; + # afs client local policy + # + +-allow afs_t self:capability { dac_override sys_admin sys_nice sys_tty_config }; ++allow afs_t self:capability { dac_read_search dac_override sys_admin sys_nice sys_tty_config }; + allow afs_t self:process { setsched signal }; + allow afs_t self:fifo_file rw_file_perms; + allow afs_t self:unix_stream_socket { accept listen }; +@@ -83,8 +83,16 @@ files_var_filetrans(afs_t, afs_cache_t, { file dir }) + + kernel_rw_afs_state(afs_t) + ++corenet_all_recvfrom_netlabel(afs_t) ++corenet_tcp_sendrecv_generic_if(afs_t) ++corenet_udp_sendrecv_generic_if(afs_t) ++corenet_tcp_sendrecv_generic_node(afs_t) ++corenet_udp_sendrecv_generic_node(afs_t) ++corenet_tcp_sendrecv_all_ports(afs_t) ++corenet_udp_sendrecv_all_ports(afs_t) ++corenet_udp_bind_generic_node(afs_t) ++ + files_mounton_mnt(afs_t) +-files_read_usr_files(afs_t) + files_rw_etc_runtime_files(afs_t) + + fs_getattr_xattr_fs(afs_t) +@@ -93,6 +101,12 @@ fs_read_nfs_symlinks(afs_t) + + logging_send_syslog_msg(afs_t) + ++sysnet_dns_name_resolve(afs_t) ++ ++ifdef(`hide_broken_symptoms',` ++ kernel_rw_unlabeled_files(afs_t) ++') ++ + ######################################## + # + # AFS bossserver local policy +@@ -105,8 +119,11 @@ can_exec(afs_bosserver_t, afs_bosserver_exec_t) + + manage_dirs_pattern(afs_bosserver_t, afs_config_t, afs_config_t) + manage_files_pattern(afs_bosserver_t, afs_config_t, afs_config_t) ++filetrans_pattern(afs_bosserver_t, afs_files_t, afs_config_t, dir, "local") + +-allow afs_bosserver_t afs_dbdir_t:dir list_dir_perms; ++manage_files_pattern(afs_bosserver_t, afs_dbdir_t, afs_dbdir_t) ++manage_dirs_pattern(afs_bosserver_t, afs_dbdir_t, afs_dbdir_t) ++filetrans_pattern(afs_bosserver_t, afs_files_t, afs_dbdir_t, dir, "db") + + allow afs_bosserver_t afs_fsserver_t:process signal_perms; + domtrans_pattern(afs_bosserver_t, afs_fsserver_exec_t, afs_fsserver_t) +@@ -125,7 +142,6 @@ domtrans_pattern(afs_bosserver_t, afs_vlserver_exec_t, afs_vlserver_t) + + kernel_read_kernel_sysctls(afs_bosserver_t) + +-corenet_all_recvfrom_unlabeled(afs_bosserver_t) + corenet_all_recvfrom_netlabel(afs_bosserver_t) + corenet_udp_sendrecv_generic_if(afs_bosserver_t) + corenet_udp_sendrecv_generic_node(afs_bosserver_t) +@@ -136,24 +152,24 @@ corenet_sendrecv_afs_bos_server_packets(afs_bosserver_t) + corenet_udp_sendrecv_afs_bos_port(afs_bosserver_t) + + files_list_home(afs_bosserver_t) +-files_read_usr_files(afs_bosserver_t) + + seutil_read_config(afs_bosserver_t) + ++optional_policy(` ++ kerberos_read_config(afs_bosserver_t) ++') ++ + ######################################## + # + # fileserver local policy + # + +-allow afs_fsserver_t self:capability { kill dac_override chown fowner sys_nice }; ++allow afs_fsserver_t self:capability { kill dac_read_search dac_override chown fowner sys_nice }; + dontaudit afs_fsserver_t self:capability fsetid; + allow afs_fsserver_t self:process { setsched signal_perms }; + allow afs_fsserver_t self:fifo_file rw_fifo_file_perms; + allow afs_fsserver_t self:tcp_socket create_stream_socket_perms; + +-read_files_pattern(afs_fsserver_t, afs_config_t, afs_config_t) +-allow afs_fsserver_t afs_config_t:dir list_dir_perms; +- + manage_dirs_pattern(afs_fsserver_t, afs_config_t, afs_config_t) + manage_files_pattern(afs_fsserver_t, afs_config_t, afs_config_t) + +@@ -175,12 +191,14 @@ kernel_read_kernel_sysctls(afs_fsserver_t) + + corenet_all_recvfrom_unlabeled(afs_fsserver_t) + corenet_all_recvfrom_netlabel(afs_fsserver_t) ++corenet_tcp_bind_generic_node(afs_fsserver_t) ++corenet_udp_bind_generic_node(afs_fsserver_t) + corenet_tcp_sendrecv_generic_if(afs_fsserver_t) + corenet_udp_sendrecv_generic_if(afs_fsserver_t) + corenet_tcp_sendrecv_generic_node(afs_fsserver_t) + corenet_udp_sendrecv_generic_node(afs_fsserver_t) +-corenet_tcp_bind_generic_node(afs_fsserver_t) +-corenet_udp_bind_generic_node(afs_fsserver_t) ++corenet_tcp_sendrecv_all_ports(afs_fsserver_t) ++corenet_udp_sendrecv_all_ports(afs_fsserver_t) + + corenet_sendrecv_afs_fs_server_packets(afs_fsserver_t) + corenet_tcp_bind_afs_fs_port(afs_fsserver_t) +@@ -190,7 +208,6 @@ corenet_udp_sendrecv_afs_fs_port(afs_fsserver_t) + + files_read_etc_runtime_files(afs_fsserver_t) + files_list_home(afs_fsserver_t) +-files_read_usr_files(afs_fsserver_t) + files_list_pids(afs_fsserver_t) + files_dontaudit_search_mnt(afs_fsserver_t) + +@@ -224,7 +241,6 @@ manage_files_pattern(afs_kaserver_t, afs_logfile_t, afs_logfile_t) + + kernel_read_kernel_sysctls(afs_kaserver_t) + +-corenet_all_recvfrom_unlabeled(afs_kaserver_t) + corenet_all_recvfrom_netlabel(afs_kaserver_t) + corenet_udp_sendrecv_generic_if(afs_kaserver_t) + corenet_udp_sendrecv_generic_node(afs_kaserver_t) +@@ -239,7 +255,6 @@ corenet_udp_bind_kerberos_port(afs_kaserver_t) + corenet_udp_sendrecv_kerberos_port(afs_kaserver_t) + + files_list_home(afs_kaserver_t) +-files_read_usr_files(afs_kaserver_t) + + seutil_read_config(afs_kaserver_t) + +@@ -253,16 +268,12 @@ userdom_dontaudit_use_user_terminals(afs_kaserver_t) + allow afs_ptserver_t self:unix_stream_socket create_stream_socket_perms; + allow afs_ptserver_t self:tcp_socket create_stream_socket_perms; + +-read_files_pattern(afs_ptserver_t, afs_config_t, afs_config_t) +-allow afs_ptserver_t afs_config_t:dir list_dir_perms; +- + manage_dirs_pattern(afs_ptserver_t, afs_logfile_t, afs_logfile_t) + manage_files_pattern(afs_ptserver_t, afs_logfile_t, afs_logfile_t) + + manage_files_pattern(afs_ptserver_t, afs_dbdir_t, afs_pt_db_t) + filetrans_pattern(afs_ptserver_t, afs_dbdir_t, afs_pt_db_t, file) + +-corenet_all_recvfrom_unlabeled(afs_ptserver_t) + corenet_all_recvfrom_netlabel(afs_ptserver_t) + corenet_tcp_sendrecv_generic_if(afs_ptserver_t) + corenet_udp_sendrecv_generic_if(afs_ptserver_t) +@@ -274,6 +285,8 @@ corenet_udp_bind_generic_node(afs_ptserver_t) + corenet_udp_bind_afs_pt_port(afs_ptserver_t) + corenet_sendrecv_afs_pt_server_packets(afs_ptserver_t) + ++sysnet_read_config(afs_ptserver_t) ++ + userdom_dontaudit_use_user_terminals(afs_ptserver_t) + + ######################################## +@@ -284,16 +297,12 @@ userdom_dontaudit_use_user_terminals(afs_ptserver_t) + allow afs_vlserver_t self:unix_stream_socket create_stream_socket_perms; + allow afs_vlserver_t self:tcp_socket create_stream_socket_perms; + +-read_files_pattern(afs_vlserver_t, afs_config_t, afs_config_t) +-allow afs_vlserver_t afs_config_t:dir list_dir_perms; +- + manage_dirs_pattern(afs_vlserver_t, afs_logfile_t, afs_logfile_t) + manage_files_pattern(afs_vlserver_t, afs_logfile_t, afs_logfile_t) + + manage_files_pattern(afs_vlserver_t, afs_dbdir_t, afs_vl_db_t) + filetrans_pattern(afs_vlserver_t, afs_dbdir_t, afs_vl_db_t, file) + +-corenet_all_recvfrom_unlabeled(afs_vlserver_t) + corenet_all_recvfrom_netlabel(afs_vlserver_t) + corenet_tcp_sendrecv_generic_if(afs_vlserver_t) + corenet_udp_sendrecv_generic_if(afs_vlserver_t) +@@ -314,8 +323,8 @@ userdom_dontaudit_use_user_terminals(afs_vlserver_t) + + allow afs_domain self:udp_socket create_socket_perms; + +-files_read_etc_files(afs_domain) +- +-miscfiles_read_localization(afs_domain) ++read_files_pattern(afs_domain, afs_config_t, afs_config_t) ++allow afs_domain afs_config_t:dir list_dir_perms; + + sysnet_read_config(afs_domain) ++ +diff --git a/aiccu.if b/aiccu.if +index 3b5dcb9470..fbe187fe1e 100644 +--- a/aiccu.if ++++ b/aiccu.if +@@ -79,9 +79,13 @@ interface(`aiccu_admin',` + type aiccu_var_run_t; + ') + +- allow $1 aiccu_t:process { ptrace signal_perms }; ++ allow $1 aiccu_t:process signal_perms; + ps_process_pattern($1, aiccu_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 aiccu_t:process ptrace; ++ ') ++ + aiccu_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 aiccu_initrc_exec_t system_r; +diff --git a/aiccu.te b/aiccu.te +index 5d2b90e04c..7374df0b9c 100644 +--- a/aiccu.te ++++ b/aiccu.te +@@ -48,7 +48,6 @@ corenet_all_recvfrom_unlabeled(aiccu_t) + corenet_tcp_bind_generic_node(aiccu_t) + corenet_tcp_sendrecv_generic_if(aiccu_t) + corenet_tcp_sendrecv_generic_node(aiccu_t) +- + corenet_sendrecv_sixxsconfig_client_packets(aiccu_t) + corenet_tcp_connect_sixxsconfig_port(aiccu_t) + corenet_tcp_sendrecv_sixxsconfig_port(aiccu_t) +@@ -60,16 +59,23 @@ domain_use_interactive_fds(aiccu_t) + dev_read_rand(aiccu_t) + dev_read_urand(aiccu_t) + +-files_read_etc_files(aiccu_t) ++ ++auth_read_passwd(aiccu_t) + + logging_send_syslog_msg(aiccu_t) + +-miscfiles_read_localization(aiccu_t) ++optional_policy(` ++ gnome_dontaudit_search_config(aiccu_t) ++') + + optional_policy(` + modutils_domtrans_insmod(aiccu_t) + ') + ++optional_policy(` ++ pcscd_stream_connect(aiccu_t) ++') ++ + optional_policy(` + sysnet_dns_name_resolve(aiccu_t) + sysnet_domtrans_ifconfig(aiccu_t) +diff --git a/aide.if b/aide.if +index 01cbb67df8..94a4a24062 100644 +--- a/aide.if ++++ b/aide.if +@@ -67,9 +67,13 @@ interface(`aide_admin',` + type aide_t, aide_db_t, aide_log_t; + ') + +- allow $1 aide_t:process { ptrace signal_perms }; ++ allow $1 aide_t:process signal_perms; + ps_process_pattern($1, aide_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 aide_t:process ptrace; ++ ') ++ + aide_run($1, $2) + + files_list_etc($1) +diff --git a/aide.te b/aide.te +index 03831e6e52..e7d9dd97e6 100644 +--- a/aide.te ++++ b/aide.te +@@ -10,6 +10,7 @@ attribute_role aide_roles; + type aide_t; + type aide_exec_t; + application_domain(aide_t, aide_exec_t) ++cron_system_entry(aide_t, aide_exec_t) + role aide_roles types aide_t; + + type aide_log_t; +@@ -23,22 +24,35 @@ files_type(aide_db_t) + # Local policy + # + +-allow aide_t self:capability { dac_override fowner }; ++allow aide_t self:capability { dac_read_search dac_override fowner ipc_lock sys_admin }; ++allow aide_t self:process signal; + + manage_files_pattern(aide_t, aide_db_t, aide_db_t) ++files_var_lib_filetrans(aide_t, aide_db_t, { dir file }) + +-create_files_pattern(aide_t, aide_log_t, aide_log_t) +-append_files_pattern(aide_t, aide_log_t, aide_log_t) +-setattr_files_pattern(aide_t, aide_log_t, aide_log_t) ++manage_files_pattern(aide_t, aide_log_t, aide_log_t) + logging_log_filetrans(aide_t, aide_log_t, file) + ++dev_read_rand(aide_t) ++dev_read_urand(aide_t) ++ + files_read_all_files(aide_t) + files_read_all_symlinks(aide_t) ++files_getattr_all_pipes(aide_t) ++files_getattr_all_sockets(aide_t) ++files_mmap_usr_files(aide_t) ++ ++mls_file_read_to_clearance(aide_t) ++mls_file_write_to_clearance(aide_t) + + logging_send_audit_msgs(aide_t) + logging_send_syslog_msg(aide_t) + +-userdom_use_user_terminals(aide_t) ++userdom_use_inherited_user_terminals(aide_t) ++ ++optional_policy(` ++ prelink_domtrans(aide_t) ++') + + optional_policy(` + seutil_use_newrole_fds(aide_t) +diff --git a/aisexec.if b/aisexec.if +index a2997fa57a..861cebdf90 100644 +--- a/aisexec.if ++++ b/aisexec.if +@@ -83,9 +83,13 @@ interface(`aisexecd_admin',` + type aisexec_initrc_exec_t; + ') + +- allow $1 aisexec_t:process { ptrace signal_perms }; ++ allow $1 aisexec_t:process signal_perms; + ps_process_pattern($1, aisexec_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 aisexec_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, aisexec_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 aisexec_initrc_exec_t system_r; +diff --git a/aisexec.te b/aisexec.te +index 4e4f063649..808e067e82 100644 +--- a/aisexec.te ++++ b/aisexec.te +@@ -63,6 +63,7 @@ files_pid_filetrans(aisexec_t, aisexec_var_run_t, { file sock_file }) + kernel_read_system_state(aisexec_t) + + corecmd_exec_bin(aisexec_t) ++corecmd_exec_shell(aisexec_t) + + corenet_all_recvfrom_unlabeled(aisexec_t) + corenet_all_recvfrom_netlabel(aisexec_t) +@@ -95,8 +96,6 @@ init_rw_script_tmp_files(aisexec_t) + + logging_send_syslog_msg(aisexec_t) + +-miscfiles_read_localization(aisexec_t) +- + userdom_rw_unpriv_user_semaphores(aisexec_t) + userdom_rw_unpriv_user_shared_mem(aisexec_t) + +@@ -105,6 +104,11 @@ optional_policy(` + ') + + optional_policy(` ++ corosync_domtrans(aisexec_t) ++') ++ ++optional_policy(` ++ # to communication with RHCS + rhcs_rw_dlm_controld_semaphores(aisexec_t) + + rhcs_rw_fenced_semaphores(aisexec_t) +diff --git a/ajaxterm.fc b/ajaxterm.fc +new file mode 100644 +index 0000000000..aeb1888a78 +--- /dev/null ++++ b/ajaxterm.fc +@@ -0,0 +1,6 @@ ++ ++/etc/rc\.d/init\.d/ajaxterm -- gen_context(system_u:object_r:ajaxterm_initrc_exec_t,s0) ++ ++/usr/share/ajaxterm/ajaxterm\.py -- gen_context(system_u:object_r:ajaxterm_exec_t,s0) ++ ++/var/run/ajaxterm\.pid -- gen_context(system_u:object_r:ajaxterm_var_run_t,s0) +diff --git a/ajaxterm.if b/ajaxterm.if +new file mode 100644 +index 0000000000..7abe946d42 +--- /dev/null ++++ b/ajaxterm.if +@@ -0,0 +1,90 @@ ++## policy for ajaxterm ++ ++######################################## ++## ++## Execute a domain transition to run ajaxterm. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ajaxterm_domtrans',` ++ gen_require(` ++ type ajaxterm_t, ajaxterm_exec_t; ++ ') ++ ++ domtrans_pattern($1, ajaxterm_exec_t, ajaxterm_t) ++') ++ ++######################################## ++## ++## Execute ajaxterm server in the ajaxterm domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ajaxterm_initrc_domtrans',` ++ gen_require(` ++ type ajaxterm_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, ajaxterm_initrc_exec_t) ++') ++ ++####################################### ++## ++## Read and write the ajaxterm pty type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ajaxterm_rw_ptys',` ++ gen_require(` ++ type ajaxterm_devpts_t; ++ ') ++ ++ allow $1 ajaxterm_devpts_t:chr_file rw_inherited_term_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ajaxterm environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`ajaxterm_admin',` ++ gen_require(` ++ type ajaxterm_t, ajaxterm_initrc_exec_t; ++ ') ++ ++ allow $1 ajaxterm_t:process signal_perms; ++ ps_process_pattern($1, ajaxterm_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ajaxterm_t:process ptrace; ++ ') ++ ++ ajaxterm_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 ajaxterm_initrc_exec_t system_r; ++ allow $2 system_r; ++') +diff --git a/ajaxterm.te b/ajaxterm.te +new file mode 100644 +index 0000000000..a95a4adf3b +--- /dev/null ++++ b/ajaxterm.te +@@ -0,0 +1,60 @@ ++policy_module(ajaxterm, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type ajaxterm_t; ++type ajaxterm_exec_t; ++init_daemon_domain(ajaxterm_t, ajaxterm_exec_t) ++ ++type ajaxterm_initrc_exec_t; ++init_script_file(ajaxterm_initrc_exec_t) ++ ++type ajaxterm_var_run_t; ++files_pid_file(ajaxterm_var_run_t) ++ ++type ajaxterm_devpts_t; ++term_login_pty(ajaxterm_devpts_t) ++ ++######################################## ++# ++# ajaxterm local policy ++# ++allow ajaxterm_t self:capability setuid; ++allow ajaxterm_t self:process { setpgid signal }; ++allow ajaxterm_t self:fifo_file rw_fifo_file_perms; ++allow ajaxterm_t self:unix_stream_socket create_stream_socket_perms; ++allow ajaxterm_t self:tcp_socket create_stream_socket_perms; ++ ++allow ajaxterm_t ajaxterm_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms relabelfrom }; ++term_create_pty(ajaxterm_t, ajaxterm_devpts_t) ++ ++manage_dirs_pattern(ajaxterm_t, ajaxterm_var_run_t, ajaxterm_var_run_t) ++manage_files_pattern(ajaxterm_t, ajaxterm_var_run_t, ajaxterm_var_run_t) ++files_pid_filetrans(ajaxterm_t, ajaxterm_var_run_t, { file dir }) ++ ++kernel_read_system_state(ajaxterm_t) ++ ++corecmd_exec_bin(ajaxterm_t) ++ ++corenet_tcp_bind_generic_node(ajaxterm_t) ++corenet_tcp_bind_oa_system_port(ajaxterm_t) ++ ++dev_read_urand(ajaxterm_t) ++ ++domain_use_interactive_fds(ajaxterm_t) ++ ++ ++sysnet_dns_name_resolve(ajaxterm_t) ++ ++####################################### ++# ++# SSH component local policy ++# ++ ++optional_policy(` ++ ssh_basic_client_template(ajaxterm, ajaxterm_t, system_r) ++') ++ +diff --git a/alsa.fc b/alsa.fc +index 33d9d31116..58bf1829ac 100644 +--- a/alsa.fc ++++ b/alsa.fc +@@ -23,4 +23,10 @@ ifdef(`distro_debian',` + /usr/share/alsa/alsa\.conf gen_context(system_u:object_r:alsa_etc_rw_t,s0) + /usr/share/alsa/pcm(/.*)? gen_context(system_u:object_r:alsa_etc_rw_t,s0) + +-/var/lib/alsa(/.*)? gen_context(system_u:object_r:alsa_var_lib_t,s0) ++/var/lib/alsa(/.*)? gen_context(system_u:object_r:alsa_var_lib_t,s0) ++ ++/var/lock/asound\.state\.lock -- gen_context(system_u:object_r:alsa_lock_t,s0) ++ ++/usr/lib/systemd/system/alsa.* -- gen_context(system_u:object_r:alsa_unit_file_t,s0) ++ ++/var/run/alsactl\.pid -- gen_context(system_u:object_r:alsa_var_run_t,s0) +diff --git a/alsa.if b/alsa.if +index ca8d8cf3b5..053a30ad41 100644 +--- a/alsa.if ++++ b/alsa.if +@@ -168,6 +168,7 @@ interface(`alsa_manage_home_files',` + + userdom_search_user_home_dirs($1) + allow $1 alsa_home_t:file manage_file_perms; ++ alsa_filetrans_home_content($1) + ') + + ######################################## +@@ -210,51 +211,88 @@ interface(`alsa_relabel_home_files',` + + ######################################## + ## +-## Create objects in user home +-## directories with the generic alsa +-## home type. ++## Read Alsa lib files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`alsa_read_lib',` ++ gen_require(` ++ type alsa_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, alsa_var_lib_t, alsa_var_lib_t) ++') ++ ++######################################## ++## ++## Transition to alsa named content ++## ++## + ## +-## Class of the object being created. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`alsa_filetrans_home_content',` ++ gen_require(` ++ type alsa_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, alsa_home_t, file, ".asoundrc") ++') ++ ++######################################## ++## ++## Transition to alsa named content ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## + # +-interface(`alsa_home_filetrans_alsa_home',` ++interface(`alsa_filetrans_named_content',` + gen_require(` + type alsa_home_t; ++ type alsa_etc_rw_t; ++ type alsa_var_lib_t; + ') + +- userdom_user_home_dir_filetrans($1, alsa_home_t, $2, $3) ++ files_etc_filetrans($1, alsa_etc_rw_t, file, "asound.state") ++ files_etc_filetrans($1, alsa_etc_rw_t, dir, "pcm") ++ files_etc_filetrans($1, alsa_etc_rw_t, dir, "asound") ++ files_usr_filetrans($1, alsa_etc_rw_t, file, "alsa.conf") ++ files_usr_filetrans($1, alsa_etc_rw_t, dir, "pcm") ++ files_var_lib_filetrans($1, alsa_var_lib_t, dir, "alsa") + ') + + ######################################## + ## +-## Read Alsa lib files. ++## Execute alsa server in the alsa domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`alsa_read_lib',` ++interface(`alsa_systemctl',` + gen_require(` +- type alsa_var_lib_t; ++ type alsa_t; ++ type alsa_unit_file_t; + ') + +- files_search_var_lib($1) +- read_files_pattern($1, alsa_var_lib_t, alsa_var_lib_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 alsa_unit_file_t:file read_file_perms; ++ allow $1 alsa_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, alsa_t) + ') + + ######################################### +diff --git a/alsa.te b/alsa.te +index 4b153f1797..a799cd3947 100644 +--- a/alsa.te ++++ b/alsa.te +@@ -15,6 +15,9 @@ role alsa_roles types alsa_t; + type alsa_etc_rw_t; + files_config_file(alsa_etc_rw_t) + ++type alsa_lock_t; ++files_lock_file(alsa_lock_t) ++ + type alsa_tmp_t; + files_tmp_file(alsa_tmp_t) + +@@ -24,16 +27,23 @@ files_tmpfs_file(alsa_tmpfs_t) + type alsa_var_lib_t; + files_type(alsa_var_lib_t) + ++type alsa_var_run_t; ++files_pid_file(alsa_var_run_t) ++ + type alsa_home_t; + userdom_user_home_content(alsa_home_t) + ++type alsa_unit_file_t; ++systemd_unit_file(alsa_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow alsa_t self:capability { dac_read_search dac_override setgid setuid ipc_owner }; +-dontaudit alsa_t self:capability sys_admin; ++allow alsa_t self:capability { dac_read_search dac_override setgid setuid ipc_owner sys_nice }; ++dontaudit alsa_t self:capability { sys_tty_config sys_admin }; ++allow alsa_t self:process { getsched setsched signal_perms }; + allow alsa_t self:sem create_sem_perms; + allow alsa_t self:shm create_shm_perms; + allow alsa_t self:unix_stream_socket { accept listen }; +@@ -46,6 +56,9 @@ files_etc_filetrans(alsa_t, alsa_etc_rw_t, file) + + can_exec(alsa_t, alsa_exec_t) + ++manage_files_pattern(alsa_t, alsa_lock_t, alsa_lock_t) ++files_lock_filetrans(alsa_t, alsa_lock_t, file) ++ + manage_dirs_pattern(alsa_t, alsa_tmp_t, alsa_tmp_t) + manage_files_pattern(alsa_t, alsa_tmp_t, alsa_tmp_t) + files_tmp_filetrans(alsa_t, alsa_tmp_t, { dir file }) +@@ -57,7 +70,13 @@ fs_tmpfs_filetrans(alsa_t, alsa_tmpfs_t, file) + manage_dirs_pattern(alsa_t, alsa_var_lib_t, alsa_var_lib_t) + manage_files_pattern(alsa_t, alsa_var_lib_t, alsa_var_lib_t) + ++manage_files_pattern(alsa_t, alsa_var_run_t, alsa_var_run_t) ++manage_dirs_pattern(alsa_t, alsa_var_run_t, alsa_var_run_t) ++manage_lnk_files_pattern(alsa_t, alsa_var_run_t, alsa_var_run_t) ++files_pid_filetrans(alsa_t, alsa_var_run_t, { file dir }) ++ + kernel_read_system_state(alsa_t) ++kernel_signal(alsa_t) + + corecmd_exec_bin(alsa_t) + +@@ -67,7 +86,6 @@ dev_read_sysfs(alsa_t) + dev_read_urand(alsa_t) + dev_write_sound(alsa_t) + +-files_read_usr_files(alsa_t) + files_search_var_lib(alsa_t) + + term_dontaudit_use_console(alsa_t) +@@ -80,8 +98,6 @@ init_use_fds(alsa_t) + + logging_send_syslog_msg(alsa_t) + +-miscfiles_read_localization(alsa_t) +- + userdom_manage_unpriv_user_semaphores(alsa_t) + userdom_manage_unpriv_user_shared_mem(alsa_t) + userdom_search_user_home_dirs(alsa_t) +diff --git a/amanda.fc b/amanda.fc +index 7f4dfbca3c..e5c9f45b83 100644 +--- a/amanda.fc ++++ b/amanda.fc +@@ -1,5 +1,6 @@ + /etc/amanda(/.*)? gen_context(system_u:object_r:amanda_config_t,s0) + /etc/amanda/.*/tapelist(/.*)? gen_context(system_u:object_r:amanda_data_t,s0) ++/etc/amanda/DailySet1(/.*)? gen_context(system_u:object_r:amanda_data_t,s0) + /etc/amandates gen_context(system_u:object_r:amanda_amandates_t,s0) + /etc/dumpdates gen_context(system_u:object_r:amanda_dumpdates_t,s0) + # empty m4 string so the index macro is not invoked +@@ -13,6 +14,8 @@ + /usr/lib/amanda/amidxtaped -- gen_context(system_u:object_r:amanda_inetd_exec_t,s0) + /usr/lib/amanda/amindexd -- gen_context(system_u:object_r:amanda_inetd_exec_t,s0) + ++/usr/lib/systemd/system/amanda.* -- gen_context(system_u:object_r:amanda_unit_file_t,s0) ++ + /usr/sbin/amandad -- gen_context(system_u:object_r:amanda_inetd_exec_t,s0) + /usr/sbin/amrecover -- gen_context(system_u:object_r:amanda_recover_exec_t,s0) + +diff --git a/amanda.te b/amanda.te +index 519051c7db..5f838c4dd9 100644 +--- a/amanda.te ++++ b/amanda.te +@@ -9,11 +9,14 @@ attribute_role amanda_recover_roles; + roleattribute system_r amanda_recover_roles; + + type amanda_t; ++type amanda_exec_t; + type amanda_inetd_exec_t; +-inetd_service_domain(amanda_t, amanda_inetd_exec_t) ++application_executable_file(amanda_exec_t) ++init_daemon_domain(amanda_t, amanda_inetd_exec_t) ++role system_r types amanda_t; + +-type amanda_exec_t; +-domain_entry_file(amanda_t, amanda_exec_t) ++type amanda_unit_file_t; ++systemd_unit_file(amanda_unit_file_t) + + type amanda_log_t; + logging_log_file(amanda_log_t) +@@ -33,6 +36,9 @@ files_type(amanda_gnutarlists_t) + type amanda_tmp_t; + files_tmp_file(amanda_tmp_t) + ++type amanda_tmpfs_t; ++files_tmpfs_file(amanda_tmpfs_t) ++ + type amanda_amandates_t; + files_type(amanda_amandates_t) + +@@ -59,8 +65,8 @@ optional_policy(` + # Local policy + # + +-allow amanda_t self:capability { chown dac_override setuid kill }; +-allow amanda_t self:process { setpgid signal }; ++allow amanda_t self:capability { chown dac_read_search dac_override setuid setgid kill sys_admin }; ++allow amanda_t self:process { getsched setsched setpgid signal }; + allow amanda_t self:fifo_file rw_fifo_file_perms; + allow amanda_t self:unix_stream_socket { accept listen }; + allow amanda_t self:tcp_socket { accept listen }; +@@ -71,6 +77,7 @@ allow amanda_t amanda_config_t:file read_file_perms; + + manage_dirs_pattern(amanda_t, amanda_data_t, amanda_data_t) + manage_files_pattern(amanda_t, amanda_data_t, amanda_data_t) ++manage_lnk_files_pattern(amanda_t, amanda_data_t, amanda_data_t) + filetrans_pattern(amanda_t, amanda_config_t, amanda_data_t, { file dir }) + + allow amanda_t amanda_dumpdates_t:file rw_file_perms; +@@ -81,6 +88,7 @@ allow amanda_t amanda_gnutarlists_t:lnk_file manage_lnk_file_perms; + + manage_dirs_pattern(amanda_t, amanda_var_lib_t, amanda_var_lib_t) + manage_files_pattern(amanda_t, amanda_var_lib_t, amanda_var_lib_t) ++files_var_lib_filetrans(amanda_t, amanda_var_lib_t, dir) + + manage_files_pattern(amanda_t, amanda_log_t, amanda_log_t) + manage_dirs_pattern(amanda_t, amanda_log_t, amanda_log_t) +@@ -90,23 +98,30 @@ manage_files_pattern(amanda_t, amanda_tmp_t, amanda_tmp_t) + manage_dirs_pattern(amanda_t, amanda_tmp_t, amanda_tmp_t) + files_tmp_filetrans(amanda_t, amanda_tmp_t, { file dir }) + ++manage_files_pattern(amanda_t, amanda_tmpfs_t, amanda_tmpfs_t) ++manage_dirs_pattern(amanda_t, amanda_tmpfs_t, amanda_tmpfs_t) ++fs_tmpfs_filetrans(amanda_t, amanda_tmpfs_t, { dir file }) ++ + can_exec(amanda_t, { amanda_exec_t amanda_inetd_exec_t }) + + kernel_read_kernel_sysctls(amanda_t) + kernel_read_system_state(amanda_t) ++kernel_read_network_state(amanda_t) + kernel_dontaudit_getattr_unlabeled_files(amanda_t) + kernel_dontaudit_read_proc_symlinks(amanda_t) + + corecmd_exec_shell(amanda_t) + corecmd_exec_bin(amanda_t) + +-corenet_all_recvfrom_unlabeled(amanda_t) + corenet_all_recvfrom_netlabel(amanda_t) + corenet_tcp_sendrecv_generic_if(amanda_t) + corenet_tcp_sendrecv_generic_node(amanda_t) + corenet_tcp_sendrecv_all_ports(amanda_t) + corenet_tcp_bind_generic_node(amanda_t) + ++corenet_tcp_bind_amanda_port(amanda_t) ++corenet_udp_bind_amanda_port(amanda_t) ++ + corenet_sendrecv_all_server_packets(amanda_t) + corenet_tcp_bind_all_rpc_ports(amanda_t) + corenet_tcp_bind_generic_port(amanda_t) +@@ -114,6 +129,7 @@ corenet_dontaudit_tcp_bind_all_ports(amanda_t) + + dev_getattr_all_blk_files(amanda_t) + dev_getattr_all_chr_files(amanda_t) ++dev_read_urand(amanda_t) + + files_read_etc_runtime_files(amanda_t) + files_list_all(amanda_t) +@@ -126,6 +142,7 @@ files_getattr_all_sockets(amanda_t) + + fs_getattr_xattr_fs(amanda_t) + fs_list_all(amanda_t) ++fs_getattr_tmpfs(amanda_t) + + storage_raw_read_fixed_disk(amanda_t) + storage_read_tape(amanda_t) +@@ -141,7 +158,7 @@ logging_send_syslog_msg(amanda_t) + # Recover local policy + # + +-allow amanda_recover_t self:capability { fowner fsetid kill setgid setuid chown dac_override }; ++allow amanda_recover_t self:capability { fowner fsetid kill setgid setuid chown dac_read_search dac_override }; + allow amanda_recover_t self:process { sigkill sigstop signal }; + allow amanda_recover_t self:fifo_file rw_fifo_file_perms; + allow amanda_recover_t self:unix_stream_socket create_socket_perms; +@@ -170,7 +187,6 @@ kernel_read_system_state(amanda_recover_t) + corecmd_exec_shell(amanda_recover_t) + corecmd_exec_bin(amanda_recover_t) + +-corenet_all_recvfrom_unlabeled(amanda_recover_t) + corenet_all_recvfrom_netlabel(amanda_recover_t) + corenet_tcp_sendrecv_generic_if(amanda_recover_t) + corenet_udp_sendrecv_generic_if(amanda_recover_t) +@@ -195,12 +211,16 @@ files_search_tmp(amanda_recover_t) + + auth_use_nsswitch(amanda_recover_t) + +-fstools_domtrans(amanda_t) +-fstools_signal(amanda_t) +- + logging_search_logs(amanda_recover_t) + +-miscfiles_read_localization(amanda_recover_t) +- +-userdom_use_user_terminals(amanda_recover_t) ++userdom_use_inherited_user_terminals(amanda_recover_t) + userdom_search_user_home_content(amanda_recover_t) ++ ++optional_policy(` ++ inetd_service_domain(amanda_t, amanda_inetd_exec_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(amanda_t) ++ fstools_signal(amanda_t) ++') +diff --git a/amavis.fc b/amavis.fc +index 17689a7071..8aa684917e 100644 +--- a/amavis.fc ++++ b/amavis.fc +@@ -12,8 +12,6 @@ ifdef(`distro_debian',` + /usr/sbin/amavisd-new-cronjob -- gen_context(system_u:object_r:amavis_exec_t,s0) + ') + +-/var/opt/f-secure(/.*)? gen_context(system_u:object_r:amavis_var_lib_t,s0) +- + /var/amavis(/.*)? gen_context(system_u:object_r:amavis_var_lib_t,s0) + + /var/lib/amavis(/.*)? gen_context(system_u:object_r:amavis_var_lib_t,s0) +diff --git a/amavis.if b/amavis.if +index 60d4f8c90c..18ef0772c3 100644 +--- a/amavis.if ++++ b/amavis.if +@@ -54,6 +54,7 @@ interface(`amavis_read_spool_files',` + + files_search_spool($1) + read_files_pattern($1, amavis_spool_t, amavis_spool_t) ++ allow $1 amavis_spool_t:dir list_dir_perms; + ') + + ######################################## +@@ -151,6 +152,26 @@ interface(`amavis_read_lib_files',` + files_search_var_lib($1) + ') + ++######################################## ++## ++## Read and write amavis lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`amavis_rw_lib_files',` ++ gen_require(` ++ type amavis_var_lib_t; ++ ') ++ ++ rw_files_pattern($1, amavis_var_lib_t, amavis_var_lib_t) ++ allow $1 amavis_var_lib_t:dir list_dir_perms; ++ files_search_var_lib($1) ++') ++ + ######################################## + ## + ## Create, read, write, and delete +@@ -234,9 +255,13 @@ interface(`amavis_admin',` + type amavis_etc_t, amavis_quarantine_t, amavis_initrc_exec_t; + ') + +- allow $1 amavis_t:process { ptrace signal_perms }; ++ allow $1 amavis_t:process signal_perms; + ps_process_pattern($1, amavis_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 amavis_t:process ptrace; ++ ') ++ + amavis_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 amavis_initrc_exec_t system_r; +diff --git a/amavis.te b/amavis.te +index 91fa72ae12..be1f9677d8 100644 +--- a/amavis.te ++++ b/amavis.te +@@ -16,6 +16,7 @@ gen_tunable(amavis_use_jit, false) + type amavis_t; + type amavis_exec_t; + init_daemon_domain(amavis_t, amavis_exec_t) ++init_nnp_daemon_domain(amavis_t) + + type amavis_etc_t; + files_config_file(amavis_etc_t) +@@ -39,14 +40,14 @@ type amavis_quarantine_t; + files_type(amavis_quarantine_t) + + type amavis_spool_t; +-files_type(amavis_spool_t) ++files_spool_file(amavis_spool_t) + + ######################################## + # + # Local policy + # + +-allow amavis_t self:capability { kill chown dac_override setgid setuid }; ++allow amavis_t self:capability { kill chown dac_read_search dac_override setgid setuid }; + dontaudit amavis_t self:capability sys_tty_config; + allow amavis_t self:process signal_perms; + allow amavis_t self:fifo_file rw_fifo_file_perms; +@@ -67,9 +68,12 @@ manage_lnk_files_pattern(amavis_t, amavis_spool_t, amavis_spool_t) + manage_sock_files_pattern(amavis_t, amavis_spool_t, amavis_spool_t) + filetrans_pattern(amavis_t, amavis_spool_t, amavis_var_run_t, sock_file) + ++# tmp files ++manage_dirs_pattern(amavis_t, amavis_tmp_t, amavis_tmp_t) + manage_files_pattern(amavis_t, amavis_tmp_t, amavis_tmp_t) ++manage_sock_files_pattern(amavis_t, amavis_tmp_t, amavis_tmp_t) + allow amavis_t amavis_tmp_t:dir setattr_dir_perms; +-files_tmp_filetrans(amavis_t, amavis_tmp_t, file) ++files_tmp_filetrans(amavis_t, amavis_tmp_t, { file dir sock_file } ) + + manage_dirs_pattern(amavis_t, amavis_var_lib_t, amavis_var_lib_t) + manage_files_pattern(amavis_t, amavis_var_lib_t, amavis_var_lib_t) +@@ -95,7 +99,6 @@ kernel_dontaudit_read_proc_symlinks(amavis_t) + corecmd_exec_bin(amavis_t) + corecmd_exec_shell(amavis_t) + +-corenet_all_recvfrom_unlabeled(amavis_t) + corenet_all_recvfrom_netlabel(amavis_t) + corenet_tcp_sendrecv_generic_if(amavis_t) + corenet_udp_sendrecv_generic_if(amavis_t) +@@ -118,6 +121,7 @@ corenet_dontaudit_udp_bind_all_ports(amavis_t) + + corenet_sendrecv_razor_client_packets(amavis_t) + corenet_tcp_connect_razor_port(amavis_t) ++corenet_tcp_connect_agentx_port(amavis_t) + + dev_read_rand(amavis_t) + dev_read_sysfs(amavis_t) +@@ -127,7 +131,6 @@ domain_use_interactive_fds(amavis_t) + domain_dontaudit_read_all_domains_state(amavis_t) + + files_read_etc_runtime_files(amavis_t) +-files_read_usr_files(amavis_t) + files_search_spool(amavis_t) + + fs_getattr_xattr_fs(amavis_t) +@@ -141,14 +144,20 @@ init_stream_connect_script(amavis_t) + + logging_send_syslog_msg(amavis_t) + +-miscfiles_read_localization(amavis_t) ++miscfiles_read_generic_certs(amavis_t) ++ ++sysnet_use_ldap(amavis_t) + + userdom_dontaudit_search_user_home_dirs(amavis_t) + + tunable_policy(`amavis_use_jit',` +- allow amavis_t self:process execmem; ++ allow amavis_t self:process execmem; + ',` +- dontaudit amavis_t self:process execmem; ++ dontaudit amavis_t self:process execmem; ++') ++ ++optional_policy(` ++ antivirus_domain_template(amavis_t) + ') + + optional_policy(` +@@ -172,6 +181,10 @@ optional_policy(` + mta_read_config(amavis_t) + ') + ++optional_policy(` ++ nslcd_stream_connect(amavis_t) ++') ++ + optional_policy(` + postfix_read_config(amavis_t) + postfix_list_spool(amavis_t) +diff --git a/amtu.te b/amtu.te +index 16d0d66eba..60abfd080e 100644 +--- a/amtu.te ++++ b/amtu.te +@@ -24,11 +24,10 @@ kernel_read_system_state(amtu_t) + + files_manage_boot_files(amtu_t) + files_read_etc_runtime_files(amtu_t) +-files_read_etc_files(amtu_t) + + logging_send_audit_msgs(amtu_t) + +-userdom_use_user_terminals(amtu_t) ++userdom_use_inherited_user_terminals(amtu_t) + + optional_policy(` + nscd_dontaudit_search_pid(amtu_t) +diff --git a/anaconda.fc b/anaconda.fc +index b098089d08..fe35bebfd2 100644 +--- a/anaconda.fc ++++ b/anaconda.fc +@@ -1 +1,13 @@ + # No file context specifications. ++ ++/usr/libexec/anaconda/anaconda-yum -- gen_context(system_u:object_r:install_exec_t,s0) ++/usr/sbin/anaconda -- gen_context(system_u:object_r:install_exec_t,s0) ++ ++/usr/bin/initial-setup -- gen_context(system_u:object_r:install_exec_t,s0) ++/usr/bin/ostree -- gen_context(system_u:object_r:install_exec_t,s0) ++/usr/bin/rpm-ostree -- gen_context(system_u:object_r:install_exec_t,s0) ++/usr/libexec/rpm-ostreed -- gen_context(system_u:object_r:install_exec_t,s0) ++ ++/usr/bin/preupg.* -- gen_context(system_u:object_r:preupgrade_exec_t,s0) ++/var/lib/preupgrade(/.*)? gen_context(system_u:object_r:preupgrade_data_t,s0) ++/var/log/preupgrade(/.*)? gen_context(system_u:object_r:preupgrade_data_t,s0) +diff --git a/anaconda.if b/anaconda.if +index 14a61b7e11..76d93294de 100644 +--- a/anaconda.if ++++ b/anaconda.if +@@ -1 +1,132 @@ + ## Anaconda installer. ++ ++######################################## ++## ++## Execute a domain transition to run install. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`anaconda_domtrans_install',` ++ gen_require(` ++ type install_t, install_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, install_exec_t, install_t) ++') ++ ++######################################## ++## ++## Execute install in the install ++## domain, and allow the specified ++## role the install domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`anaconda_run_install',` ++ gen_require(` ++ type install_t; ++ type install_exec_t; ++ attribute_role install_roles; ++ ') ++ ++ anaconda_domtrans_install($1) ++ roleattribute $2 install_roles; ++ role_transition $2 install_exec_t system_r; ++ ++ optional_policy(` ++ rpm_transition_script(install_t, $2) ++ ') ++') ++ ++######################################## ++## ++## Execute preupgrade in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`anaconda_exec_preupgrade',` ++ gen_require(` ++ type preupgrade_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, preupgrade_exec_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run preupgrade. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`anaconda_domtrans_preupgrade',` ++ gen_require(` ++ type preupgrade_t, preupgrade_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, preupgrade_exec_t, preupgrade_t) ++') ++ ++######################################## ++## ++## Read preupgrade lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`anaconda_read_lib_files_preupgrade',` ++ gen_require(` ++ type preupgrade_data_t; ++ ') ++ ++ read_files_pattern($1, preupgrade_data_t, preupgrade_data_t) ++ read_lnk_files_pattern($1, preupgrade_data_t, preupgrade_data_t) ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Manage preupgrade lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`anaconda_manage_lib_files_preupgrade',` ++ gen_require(` ++ type preupgrade_data_t; ++ ') ++ ++ manage_dirs_pattern($1, preupgrade_data_t, preupgrade_data_t) ++ manage_files_pattern($1, preupgrade_data_t, preupgrade_data_t) ++ manage_lnk_files_pattern($1, preupgrade_data_t, preupgrade_data_t) ++ files_search_var_lib($1) ++') +diff --git a/anaconda.te b/anaconda.te +index aa44abfe4d..9efa1f20b1 100644 +--- a/anaconda.te ++++ b/anaconda.te +@@ -4,6 +4,10 @@ gen_require(` + class passwd all_passwd_perms; + ') + ++gen_require(` ++ class passwd { passwd chfn chsh rootok crontab }; ++') ++ + ######################################## + # + # Declarations +@@ -16,6 +20,22 @@ domain_entry_file(anaconda_t, anaconda_exec_t) + domain_obj_id_change_exemption(anaconda_t) + role system_r types anaconda_t; + ++attribute_role install_roles; ++roleattribute system_r install_roles; ++ ++type install_t; ++type install_exec_t; ++application_domain(install_t, install_exec_t) ++role install_roles types install_t; ++ ++type preupgrade_t; ++type preupgrade_exec_t; ++application_domain(preupgrade_t, preupgrade_exec_t) ++role system_r types preupgrade_t; ++ ++type preupgrade_data_t; ++files_type(preupgrade_data_t) ++ + ######################################## + # + # Local policy +@@ -34,8 +54,9 @@ modutils_domtrans_insmod(anaconda_t) + modutils_domtrans_depmod(anaconda_t) + + seutil_domtrans_semanage(anaconda_t) ++seutil_domtrans_setsebool(anaconda_t) + +-userdom_user_home_dir_filetrans_user_home_content(anaconda_t, { dir file lnk_file fifo_file sock_file }) ++userdom_filetrans_home_content(anaconda_t) + + optional_policy(` + rpm_domtrans(anaconda_t) +@@ -53,3 +74,54 @@ optional_policy(` + optional_policy(` + unconfined_domain_noaudit(anaconda_t) + ') ++ ++######################################## ++# ++# Local policy ++# ++ ++allow install_t self:capability2 mac_admin; ++ ++systemd_dbus_chat_localed(install_t) ++ ++tunable_policy(`deny_ptrace',`',` ++ domain_ptrace_all_domains(install_t) ++') ++ ++optional_policy(` ++ iscsid_run(install_t, install_roles) ++') ++ ++optional_policy(` ++ mount_run(install_t, install_roles) ++') ++ ++optional_policy(` ++ networkmanager_dbus_chat(install_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(install_t) ++') ++ ++optional_policy(` ++ seutil_run_setfiles_mac(install_t, install_roles) ++') ++ ++optional_policy(` ++ unconfined_domain_noaudit(install_t) ++') ++ ++ ++######################################## ++# ++# Local policy ++# ++ ++manage_files_pattern(preupgrade_t, preupgrade_data_t, preupgrade_data_t) ++manage_dirs_pattern(preupgrade_t, preupgrade_data_t, preupgrade_data_t) ++manage_lnk_files_pattern(preupgrade_t, preupgrade_data_t, preupgrade_data_t) ++ ++optional_policy(` ++ unconfined_domain_noaudit(preupgrade_t) ++') +diff --git a/antivirus.fc b/antivirus.fc +new file mode 100644 +index 0000000000..219f32db00 +--- /dev/null ++++ b/antivirus.fc +@@ -0,0 +1,44 @@ ++/etc/amavis(d)?\.conf -- gen_context(system_u:object_r:antivirus_conf_t,s0) ++/etc/amavisd(/.*)? gen_context(system_u:object_r:antivirus_conf_t,s0) ++ ++/etc/rc\.d/init\.d/amavis -- gen_context(system_u:object_r:antivirus_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/amavisd-snmp -- gen_context(system_u:object_r:antivirus_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/clamd.* -- gen_context(system_u:object_r:antivirus_initrc_exec_t,s0) ++ ++/usr/lib/systemd/system/clamd.* -- gen_context(system_u:object_r:antivirus_unit_file_t,s0) ++ ++/usr/lib/AntiVir/antivir -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++ ++/usr/sbin/amavi -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++/usr/sbin/amavisd.* -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++/usr/bin/clamscan -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++/usr/bin/clamdscan -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++/usr/bin/freshclam -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++ ++/usr/sbin/clamd -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++/usr/sbin/clamav-milter -- gen_context(system_u:object_r:antivirus_exec_t,s0) ++ ++/var/clamav(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++ ++/var/amavis(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/lib/amavis(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/lib/clamav(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/lib/clamav-unofficial-sigs(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/lib/clamd.* gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/opt/f-secure(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/spool/amavisd(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++/var/virusmails(/.*)? gen_context(system_u:object_r:antivirus_db_t,s0) ++ ++/var/log/amavisd\.log.* -- gen_context(system_u:object_r:antivirus_log_t,s0) ++/var/log/clamav.* gen_context(system_u:object_r:antivirus_log_t,s0) ++/var/log/freshclam.* -- gen_context(system_u:object_r:antivirus_log_t,s0) ++/var/log/clamav/freshclam.* -- gen_context(system_u:object_r:antivirus_log_t,s0) ++/var/log/clamd.* gen_context(system_u:object_r:antivirus_log_t,s0) ++ ++/var/run/amavis(d)?(/.*)? gen_context(system_u:object_r:antivirus_var_run_t,s0) ++/var/run/amavisd-snmp-subagent\.pid -- gen_context(system_u:object_r:antivirus_var_run_t,s0) ++ ++/var/run/amavis(d)?/clamd\.pid -- gen_context(system_u:object_r:antivirus_var_run_t,s0) ++/var/run/clamav.* gen_context(system_u:object_r:antivirus_var_run_t,s0) ++/var/run/clamd.* gen_context(system_u:object_r:antivirus_var_run_t,s0) ++ +diff --git a/antivirus.if b/antivirus.if +new file mode 100644 +index 0000000000..36251b9266 +--- /dev/null ++++ b/antivirus.if +@@ -0,0 +1,325 @@ ++## SELinux policy for antivirus programs - amavis, clamd, freshclam and clamscan ++ ++###################################### ++## ++## Creates types and rules for a basic ++## antivirus domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++interface(`antivirus_domain_template',` ++ gen_require(` ++ attribute antivirus_domain; ++ ') ++ ++ typeattribute $1 antivirus_domain; ++ ++ kernel_read_system_state($1) ++') ++ ++####################################### ++## ++## Execute a domain transition to run antivirus program. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`antivirus_domtrans',` ++ gen_require(` ++ type antivirus_t, antivirus_exec_t; ++ ') ++ ++ domtrans_pattern($1, antivirus_exec_t, antivirus_t) ++') ++ ++####################################### ++## ++## Execute antivirus program without a transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_exec',` ++ gen_require(` ++ type antivirus_exec_t; ++ ') ++ ++ can_exec($1, antivirus_exec_t) ++') ++ ++####################################### ++## ++## Connect to run antivirus program. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_stream_connect',` ++ gen_require(` ++ type antivirus_t, antivirus_db_t, antivirus_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, antivirus_var_run_t, antivirus_var_run_t, antivirus_t) ++ stream_connect_pattern($1, antivirus_db_t, antivirus_db_t, antivirus_t) ++') ++ ++####################################### ++## ++## Allow the specified domain to append ++## to antivirus log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_append_log',` ++ gen_require(` ++ type antivirus_log_t; ++ ') ++ ++ logging_search_logs($1) ++ allow $1 antivirus_log_t:dir list_dir_perms; ++ append_files_pattern($1, antivirus_log_t, antivirus_log_t) ++') ++ ++####################################### ++## ++## Read antivirus configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_read_config',` ++ gen_require(` ++ type antivirus_conf_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 antivirus_conf_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Search antivirus db content directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_search_db',` ++ gen_require(` ++ type antivirus_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ files_search_spool($1) ++ allow $1 antivirus_db_t:dir search_dir_perms; ++') ++ ++###################################### ++## ++## Read antivirus db content directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_read_db',` ++ gen_require(` ++ type antivirus_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ files_search_spool($1) ++ read_files_pattern($1, antivirus_db_t, antivirus_db_t) ++ read_lnk_files_pattern($1, antivirus_db_t, antivirus_db_t) ++') ++ ++##################################### ++## ++## Read and write antivirus db content directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_rw_db',` ++ gen_require(` ++ type antivirus_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ files_search_spool($1) ++ write_files_pattern($1, antivirus_db_t, antivirus_db_t) ++') ++ ++#################################### ++## ++## Manage antivirus db content directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_manage_db',` ++ gen_require(` ++ type antivirus_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ files_search_spool($1) ++ manage_files_pattern($1, antivirus_db_t, antivirus_db_t) ++ manage_dirs_pattern($1, antivirus_db_t, antivirus_db_t) ++') ++ ++####################################### ++## ++## Manage antivirus pid content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_manage_pid',` ++ gen_require(` ++ type antivirus_var_run_t; ++ ') ++ ++ manage_dirs_pattern($1, antivirus_var_run_t, antivirus_var_run_t) ++ manage_files_pattern($1, antivirus_var_run_t, antivirus_var_run_t) ++') ++ ++###################################### ++## ++## Read antivirus state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`antivirus_read_state_clamd',` ++ gen_require(` ++ type antivirus_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, antivirus_t) ++') ++ ++###################################### ++## ++## Execute antivirus server in the antivirus domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`antivirus_systemctl',` ++ gen_require(` ++ type antivirus_t; ++ type antivirus_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 antivirus_unit_file_t:file read_file_perms; ++ allow $1 antivirus_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, antivirus_t) ++') ++ ++####################################### ++## ++## All of the rules required to administrate ++## an antivirus programs environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed to manage the clamav domain. ++## ++## ++## ++# ++interface(`antivirus_admin',` ++ gen_require(` ++ attribute antivirus_domain; ++ type antivirus_t, antivirus_conf_t, antivirus_tmp_t; ++ type antivirus_log_t, antivirus_db_t, antivirus_var_run_t; ++ type antivirus_initrc_exec_t, antivirus_unit_file_t; ++ ') ++ ++ allow $1 antivirus_t:process signal_perms; ++ ps_process_pattern($1, antivirus_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 antivirus_t:process ptrace; ++ ') ++ ++ init_labeled_script_domtrans($1, antivirus_initrc_exec_t) ++ domain_system_change_exemption($1) ++ role_transition $2 antivirus_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ antivirus_systemctl($1) ++ admin_pattern($1, antivirus_unit_file_t) ++ allow $1 antivirus_unit_file_t:service all_service_perms; ++ ++ files_list_etc($1) ++ admin_pattern($1, antivirus_conf_t) ++ ++ files_list_var_lib($1) ++ admin_pattern($1, antivirus_db_t) ++ ++ logging_list_logs($1) ++ admin_pattern($1, antivirus_log_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, antivirus_var_run_t) ++ ++ files_list_tmp($1) ++ admin_pattern($1, antivirus_tmp_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/antivirus.te b/antivirus.te +new file mode 100644 +index 0000000000..784eeb11a8 +--- /dev/null ++++ b/antivirus.te +@@ -0,0 +1,272 @@ ++policy_module(antivirus, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow antivirus programs to read non security files on a system ++##

      ++##
      ++gen_tunable(antivirus_can_scan_system, false) ++ ++## ++##

      ++## Determine whether can antivirus programs use JIT compiler. ++##

      ++##
      ++gen_tunable(antivirus_use_jit, false) ++ ++attribute antivirus_domain; ++ ++type antivirus_t; ++type antivirus_exec_t; ++typeattribute antivirus_t antivirus_domain; ++typealias antivirus_t alias { amavis_t clamd_t clamscan_t freshclam_t } ; ++typealias antivirus_exec_t alias { amavis_exec_t clamd_exec_t clamscan_exec_t freshclam_exec_t }; ++init_daemon_domain(antivirus_t, antivirus_exec_t) ++ ++type antivirus_initrc_exec_t; ++typealias antivirus_initrc_exec_t alias { clamd_initrc_exec_t amavis_initrc_exec_t }; ++init_script_file(antivirus_initrc_exec_t) ++ ++type antivirus_unit_file_t; ++typealias antivirus_unit_file_t alias { clamd_unit_file_t }; ++systemd_unit_file(antivirus_unit_file_t) ++ ++type antivirus_conf_t; ++typealias antivirus_conf_t alias { clamd_etc_t amavis_etc_t }; ++files_config_file(antivirus_conf_t) ++ ++type antivirus_var_run_t; ++typealias antivirus_var_run_t alias { amavis_var_run_t clamd_var_run_t clamd_sock_t }; ++files_pid_file(antivirus_var_run_t) ++ ++type antivirus_log_t; ++typealias antivirus_log_t alias { amavis_var_log_t clamd_var_log_t freshclam_var_log_t }; ++logging_log_file(antivirus_log_t) ++ ++type antivirus_db_t; ++typealias antivirus_db_t alias { amavis_var_lib_t amavis_quarantine_t amavis_spool_t clamd_var_lib_t }; ++files_type(antivirus_db_t) ++ ++type antivirus_home_t; ++userdom_user_home_content(antivirus_home_t) ++ ++type antivirus_tmp_t; ++typealias antivirus_tmp_t alias { amavis_tmp_t clamd_tmp_t clamscan_tmp_t }; ++files_tmp_file(antivirus_tmp_t) ++ ++######################################## ++# ++# antivirus domain local policy ++# ++ ++allow antivirus_domain self:capability { dac_read_search dac_override chown kill fsetid setgid setuid sys_admin }; ++dontaudit antivirus_domain self:capability sys_tty_config; ++allow antivirus_domain self:process signal_perms; ++ ++allow antivirus_domain self:fifo_file rw_fifo_file_perms; ++allow antivirus_domain self:unix_stream_socket { accept connectto listen }; ++allow antivirus_domain self:tcp_socket { listen accept }; ++ ++allow antivirus_domain antivirus_conf_t:dir list_dir_perms; ++read_files_pattern(antivirus_domain, antivirus_conf_t, antivirus_conf_t) ++read_lnk_files_pattern(antivirus_domain, antivirus_conf_t, antivirus_conf_t) ++ ++manage_files_pattern(antivirus_domain, antivirus_db_t, antivirus_db_t) ++manage_dirs_pattern(antivirus_domain, antivirus_db_t, antivirus_db_t) ++manage_lnk_files_pattern(antivirus_domain, antivirus_db_t, antivirus_db_t) ++manage_sock_files_pattern(antivirus_domain, antivirus_db_t, antivirus_db_t) ++allow antivirus_t antivirus_db_t:file map; ++ ++manage_files_pattern(antivirus_domain, antivirus_home_t, antivirus_home_t) ++manage_dirs_pattern(antivirus_domain, antivirus_home_t, antivirus_home_t) ++manage_lnk_files_pattern(antivirus_domain, antivirus_home_t, antivirus_home_t) ++manage_sock_files_pattern(antivirus_domain, antivirus_home_t, antivirus_home_t) ++ ++manage_dirs_pattern(antivirus_domain, antivirus_tmp_t, antivirus_tmp_t) ++manage_files_pattern(antivirus_domain, antivirus_tmp_t, antivirus_tmp_t) ++manage_sock_files_pattern(antivirus_domain, antivirus_tmp_t, antivirus_tmp_t) ++files_tmp_filetrans(antivirus_domain, antivirus_tmp_t, { file dir sock_file } ) ++ ++manage_dirs_pattern(antivirus_domain, antivirus_log_t, antivirus_log_t) ++manage_files_pattern(antivirus_domain, antivirus_log_t, antivirus_log_t) ++manage_sock_files_pattern(antivirus_domain, antivirus_log_t, antivirus_log_t) ++logging_log_filetrans(antivirus_domain, antivirus_log_t, { sock_file file dir }) ++ ++manage_dirs_pattern(antivirus_domain, antivirus_var_run_t, antivirus_var_run_t) ++manage_files_pattern(antivirus_domain, antivirus_var_run_t, antivirus_var_run_t) ++manage_sock_files_pattern(antivirus_domain, antivirus_var_run_t, antivirus_var_run_t) ++files_pid_filetrans(antivirus_domain, antivirus_var_run_t, {file}) ++ ++can_exec(antivirus_domain, antivirus_exec_t) ++ ++kernel_read_system_state(antivirus_t) ++kernel_read_network_state(antivirus_domain) ++kernel_read_all_sysctls(antivirus_domain) ++ ++corecmd_exec_bin(antivirus_domain) ++corecmd_exec_shell(antivirus_domain) ++ ++corenet_all_recvfrom_netlabel(antivirus_t) ++corenet_tcp_sendrecv_generic_if(antivirus_t) ++corenet_udp_sendrecv_generic_if(antivirus_t) ++corenet_tcp_sendrecv_generic_node(antivirus_domain) ++corenet_udp_sendrecv_generic_node(antivirus_domain) ++corenet_tcp_sendrecv_all_ports(antivirus_domain) ++corenet_udp_sendrecv_all_ports(antivirus_domain) ++corenet_tcp_bind_generic_node(antivirus_domain) ++corenet_udp_bind_generic_node(antivirus_domain) ++ ++corenet_sendrecv_amavisd_send_client_packets(antivirus_domain) ++corenet_tcp_connect_amavisd_send_port(antivirus_domain) ++ ++corenet_sendrecv_amavisd_recv_server_packets(antivirus_domain) ++corenet_tcp_bind_amavisd_recv_port(antivirus_domain) ++ ++corenet_sendrecv_generic_server_packets(antivirus_domain) ++corenet_udp_bind_generic_port(antivirus_domain) ++corenet_dontaudit_udp_bind_all_ports(antivirus_domain) ++ ++corenet_sendrecv_razor_client_packets(antivirus_domain) ++corenet_tcp_connect_razor_port(antivirus_domain) ++corenet_tcp_connect_agentx_port(antivirus_domain) ++ ++corenet_tcp_connect_clamd_port(antivirus_domain) ++ ++corenet_sendrecv_clamd_server_packets(antivirus_domain) ++corenet_tcp_bind_clamd_port(antivirus_domain) ++ ++corenet_sendrecv_http_client_packets(antivirus_domain) ++corenet_tcp_connect_http_port(antivirus_domain) ++corenet_tcp_sendrecv_http_port(antivirus_domain) ++ ++corenet_sendrecv_http_cache_client_packets(antivirus_domain) ++corenet_tcp_connect_http_cache_port(antivirus_domain) ++corenet_tcp_sendrecv_http_cache_port(antivirus_domain) ++ ++#support for MySQL/PostgreSQL ++corenet_tcp_connect_mysqld_port(antivirus_domain) ++corenet_tcp_connect_postgresql_port(antivirus_domain) ++ ++corenet_sendrecv_snmp_client_packets(antivirus_domain) ++corenet_tcp_connect_snmp_port(antivirus_domain) ++ ++corenet_sendrecv_squid_client_packets(antivirus_domain) ++corenet_tcp_connect_squid_port(antivirus_domain) ++corenet_tcp_sendrecv_squid_port(antivirus_domain) ++ ++dev_read_rand(antivirus_domain) ++dev_read_sysfs(antivirus_domain) ++dev_read_urand(antivirus_domain) ++ ++domain_read_all_domains_state(antivirus_domain) ++ ++files_dontaudit_read_security_files(antivirus_domain) ++files_read_etc_runtime_files(antivirus_domain) ++files_search_spool(antivirus_domain) ++ ++fs_getattr_xattr_fs(antivirus_domain) ++ ++auth_use_nsswitch(antivirus_t) ++auth_dontaudit_read_shadow(antivirus_domain) ++ ++init_read_state(antivirus_domain) ++init_read_utmp(antivirus_domain) ++init_stream_connect_script(antivirus_domain) ++init_dontaudit_write_utmp(antivirus_domain) ++ ++logging_send_syslog_msg(antivirus_t) ++ ++miscfiles_read_generic_certs(antivirus_domain) ++ ++sysnet_use_ldap(antivirus_domain) ++ ++userdom_stream_connect(antivirus_domain) ++userdom_dontaudit_search_user_home_dirs(antivirus_domain) ++ ++tunable_policy(`antivirus_can_scan_system',` ++ files_read_non_security_files(antivirus_domain) ++ files_getattr_all_pipes(antivirus_domain) ++ files_getattr_all_sockets(antivirus_domain) ++ dev_getattr_all_blk_files(antivirus_domain) ++ dev_getattr_all_chr_files(antivirus_domain) ++') ++ ++tunable_policy(`antivirus_use_jit',` ++ allow antivirus_domain self:process execmem; ++ allow antivirus_domain self:process execmem; ++',` ++ dontaudit antivirus_domain self:process execmem; ++ dontaudit antivirus_domain self:process execmem; ++') ++ ++optional_policy(` ++ apache_read_sys_content(antivirus_domain) ++') ++ ++optional_policy(` ++ antivirus_systemctl(antivirus_domain) ++') ++ ++optional_policy(` ++ cron_system_entry(antivirus_t, antivirus_exec_t) ++ cron_use_fds(antivirus_domain) ++ cron_use_system_job_fds(antivirus_domain) ++ cron_rw_pipes(antivirus_domain) ++') ++ ++optional_policy(` ++ dcc_domtrans_client(antivirus_domain) ++ dcc_stream_connect_dccifd(antivirus_domain) ++') ++ ++optional_policy(` ++ exim_read_spool_files(antivirus_domain) ++') ++ ++optional_policy(` ++ mta_read_config(antivirus_domain) ++ mta_read_queue(antivirus_domain) ++ mta_send_mail(antivirus_domain) ++') ++ ++optional_policy(` ++ nslcd_stream_connect(antivirus_domain) ++') ++ ++optional_policy(` ++ mysql_stream_connect(antivirus_domain) ++ corenet_tcp_connect_mysqld_port(antivirus_domain) ++') ++ ++optional_policy(` ++ postfix_read_config(antivirus_domain) ++ postfix_list_spool(antivirus_domain) ++') ++ ++optional_policy(` ++ pyzor_domtrans(antivirus_domain) ++ pyzor_signal(antivirus_domain) ++') ++ ++optional_policy(` ++ razor_domtrans(antivirus_domain) ++') ++ ++optional_policy(` ++ snmp_manage_var_lib_dirs(antivirus_domain) ++ snmp_manage_var_lib_files(antivirus_domain) ++ snmp_stream_connect(antivirus_domain) ++') ++ ++optional_policy(` ++ spamd_stream_connect(clamd_t) ++ spamassassin_exec(antivirus_domain) ++ spamassassin_exec_client(antivirus_domain) ++ spamassassin_read_lib_files(antivirus_domain) ++ spamassassin_read_pid_files(antivirus_domain) ++') +diff --git a/apache.fc b/apache.fc +index 7caefc3538..1edf14e25c 100644 +--- a/apache.fc ++++ b/apache.fc +@@ -1,162 +1,219 @@ +-HOME_DIR/((www)|(web)|(public_html))(/.+)? gen_context(system_u:object_r:httpd_user_content_t,s0) +-HOME_DIR/((www)|(web)|(public_html))/cgi-bin(/.+)? gen_context(system_u:object_r:httpd_user_script_exec_t,s0) ++HOME_DIR/((www)|(web)|(public_html))(/.+)? gen_context(system_u:object_r:httpd_user_content_t,s0) ++HOME_DIR/((www)|(web)|(public_html))/cgi-bin(/.+)? gen_context(system_u:object_r:httpd_user_script_exec_t,s0) + HOME_DIR/((www)|(web)|(public_html))(/.*)?/\.htaccess -- gen_context(system_u:object_r:httpd_user_htaccess_t,s0) + HOME_DIR/((www)|(web)|(public_html))(/.*)?/logs(/.*)? gen_context(system_u:object_r:httpd_user_ra_content_t,s0) + +-/etc/apache(2)?(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/apache-ssl(2)?(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/cherokee(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/drupal.* gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/etc/horde(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/etc/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/etc/httpd(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/httpd/conf/keytab -- gen_context(system_u:object_r:httpd_keytab_t,s0) +-/etc/httpd/logs gen_context(system_u:object_r:httpd_log_t,s0) +-/etc/httpd/modules gen_context(system_u:object_r:httpd_modules_t,s0) +-/etc/lighttpd(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/mock/koji(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/etc/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +- +-/etc/rc\.d/init\.d/cherokee -- gen_context(system_u:object_r:httpd_initrc_exec_t,s0) ++/etc/apache(2)?(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/apache-ssl(2)?(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/cherokee(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/drupal.* gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/glpi(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/owncloud(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/nextcloud(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/horde(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/etc/httpd(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/httpd/conf/keytab -- gen_context(system_u:object_r:httpd_keytab_t,s0) ++/etc/httpd/logs gen_context(system_u:object_r:httpd_log_t,s0) ++/etc/httpd/modules gen_context(system_u:object_r:httpd_modules_t,s0) ++/etc/init\.d/cherokee -- gen_context(system_u:object_r:httpd_initrc_exec_t,s0) ++/etc/lighttpd(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/mock/koji(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/nginx(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/opt/rh/rh-nginx18/nginx(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) + /etc/rc\.d/init\.d/httpd -- gen_context(system_u:object_r:httpd_initrc_exec_t,s0) + /etc/rc\.d/init\.d/lighttpd -- gen_context(system_u:object_r:httpd_initrc_exec_t,s0) + +-/etc/vhosts -- gen_context(system_u:object_r:httpd_config_t,s0) +-/etc/WebCalendar(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/etc/zabbix/web(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/thttpd\.conf -- gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/vhosts -- gen_context(system_u:object_r:httpd_config_t,s0) ++/etc/WebCalendar(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/zabbix/web(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/etc/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) + +-/opt/.*\.cgi -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/opt/dirsrv/var/run/dirsrv/dsgw/cookies(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/usr/.*\.cgi -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/opt/.*\.cgi -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/lib/systemd/system/httpd.* -- gen_context(system_u:object_r:httpd_unit_file_t,s0) ++/usr/lib/systemd/system/thttpd.* -- gen_context(system_u:object_r:httpd_unit_file_t,s0) ++/usr/lib/systemd/system/jetty.* -- gen_context(system_u:object_r:httpd_unit_file_t,s0) ++/usr/lib/systemd/system/php-fpm.* -- gen_context(system_u:object_r:httpd_unit_file_t,s0) ++/usr/lib/systemd/system/nginx.* -- gen_context(system_u:object_r:httpd_unit_file_t,s0) + +-/srv/([^/]*/)?www(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/srv/gallery2(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/libexec/httpd-ssl-pass-dialog -- gen_context(system_u:object_r:httpd_passwd_exec_t,s0) + +-/usr/.*\.cgi -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/srv/([^/]*/)?www(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/srv/([^/]*/)?www/logs(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/srv/gallery2(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/srv/gallery2/smarty(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) + +-/usr/bin/htsslpass -- gen_context(system_u:object_r:httpd_helper_exec_t,s0) +-/usr/bin/mongrel_rails -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/bin/htsslpass -- gen_context(system_u:object_r:httpd_helper_exec_t,s0) ++/usr/bin/mongrel_rails -- gen_context(system_u:object_r:httpd_exec_t,s0) + +-/usr/lib/apache-ssl/.+ -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/lib/apache(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) +-/usr/lib/apache2/modules(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) +-/usr/lib/apache(2)?/suexec(2)? -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) +-/usr/lib/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/lib/cgi-bin/(nph-)?cgiwrap(d)? -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) +-/usr/lib/cherokee(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) +-/usr/lib/dirsrv/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/lib/httpd(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) +-/usr/lib/lighttpd(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) ++/usr/share/jetty/bin/jetty.sh -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/share/joomla(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) + +-/usr/libexec/httpd-ssl-pass-dialog -- gen_context(system_u:object_r:httpd_passwd_exec_t,s0) ++/usr/lib/apache-ssl/.+ -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/lib/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/lib/apache(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) ++/usr/lib/apache2/modules(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) ++/usr/lib/apache(2)?/suexec(2)? -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) ++/usr/lib/cgi-bin/(nph-)?cgiwrap(d)? -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) ++/usr/lib/cherokee(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) ++/usr/lib/httpd(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) ++/usr/lib/lighttpd(/.*)? gen_context(system_u:object_r:httpd_modules_t,s0) + +-/usr/sbin/apache(2)? -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/apache(2)? -- gen_context(system_u:object_r:httpd_exec_t,s0) + /usr/sbin/apache-ssl(2)? -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/sbin/cherokee -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/sbin/httpd\.event -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/cherokee -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/httpd\.event -- gen_context(system_u:object_r:httpd_exec_t,s0) + /usr/sbin/httpd(\.worker)? -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/sbin/lighttpd -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/sbin/rotatelogs -- gen_context(system_u:object_r:httpd_rotatelogs_exec_t,s0) +-/usr/sbin/suexec -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) +- +-ifdef(`distro_suse',` +-/usr/sbin/httpd2-.* -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/htcacheclean -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/lighttpd -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/nginx -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/php-fpm -- gen_context(system_u:object_r:httpd_exec_t,s0) ++/usr/sbin/rotatelogs -- gen_context(system_u:object_r:httpd_rotatelogs_exec_t,s0) ++/usr/sbin/suexec -- gen_context(system_u:object_r:httpd_suexec_exec_t,s0) ++/usr/sbin/thttpd -- gen_context(system_u:object_r:httpd_exec_t,s0) ++ ++ifdef(`distro_suse', ` ++/usr/sbin/httpd2-.* -- gen_context(system_u:object_r:httpd_exec_t,s0) + ') + +-/usr/share/dirsrv(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/doc/ghc/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/drupal.* gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/icecast(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/jetty/bin/jetty\.sh -- gen_context(system_u:object_r:httpd_exec_t,s0) +-/usr/share/mythweb(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/mythweb/mythweb\.pl gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/share/mythtv/mythweather/scripts(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/share/mythtv/data(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/ntop/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/openca/htdocs(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/selinux-policy[^/]*/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/usr/share/wordpress/.*\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/share/wordpress-mu/wp-config\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/usr/share/wordpress-mu/wp-content(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/usr/share/wordpress/wp-content/uploads(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/usr/share/wordpress/wp-content/upgrade(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/usr/share/wordpress/wp-includes/.*\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +- +-/var/cache/apache2(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/httpd(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/lighttpd(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mason(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mediawiki(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mod_.* gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mod_gnutls(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mod_proxy(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/mod_ssl(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/php-.* gen_context(system_u:object_r:httpd_cache_t,s0) ++/usr/share/drupal.* gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/doc/ghc/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++ ++/usr/share/glpi(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/icecast(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/nginx/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/ntop/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/openca/htdocs(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/selinux-policy[^/]*/html(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/usr/share/wordpress/.*\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/share/wordpress-mu/wp-config\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/share/wordpress-mu/wp-content(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/usr/share/wordpress/wp-content/uploads(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/usr/share/wordpress/wp-content/upgrade(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/usr/share/wordpress/wp-includes/.*\.php -- gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/local/nagios/sbin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/usr/share/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++ ++/var/cache/httpd(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/lighttpd(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mason(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mediawiki(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mod_.* gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mod_gnutls(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mod_proxy(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/mod_ssl(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/php-.* gen_context(system_u:object_r:httpd_cache_t,s0) + /var/cache/php-eaccelerator(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/php-mmcache(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/rt3(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) +-/var/cache/ssl.*\.sem -- gen_context(system_u:object_r:httpd_cache_t,s0) +- +-/var/lib/cacti/rra(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/lib/cherokee(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) +-/var/lib/dav(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) +-/var/lib/php(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) +-/var/lib/dokuwiki(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/lib/drupal.* gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/lib/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/lib/httpd(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) +-/var/lib/lighttpd(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) +-/var/lib/php/session(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/lib/pootle/po(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/lib/rt3/data/RT-Shredder(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/cache/php-mmcache(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/rt(3|4)(/.*)? gen_context(system_u:object_r:httpd_cache_t,s0) ++/var/cache/ssl.*\.sem -- gen_context(system_u:object_r:httpd_cache_t,s0) ++ ++/var/lib/cacti/rra(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/var/lib/cherokee(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/dav(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/ganglia(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/glpi(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/php(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/graphite-web(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/dokuwiki(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/drupal.* gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/htdig(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/var/lib/httpd(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/ipsilon(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/lighttpd(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/moodle(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/mod_security(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/nginx(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/opt/rh/rh-nginx18/lib/nginx(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/php/session(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/lib/php/wsdlcache(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++ + /var/lib/squirrelmail/prefs(/.*)? gen_context(system_u:object_r:httpd_squirrelmail_t,s0) +-/var/lib/stickshift/.httpd.d(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) +-/var/lib/svn(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/lib/trac(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/lib/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +- +-/var/log/apache(2)?(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/apache-ssl(2)?(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/cacti(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/cgiwrap\.log.* -- gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/cherokee(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/dirsrv/admin-serv(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/httpd(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/horde2(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/lighttpd(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/piranha(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/lib/openshift/\.httpd\.d(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/var/lib/openshift/\.log/httpd(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/lib/owncloud(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/nextcloud(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/pootle/po(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/roundcubemail(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/rt(3|4)/data/RT-Shredder(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++/var/lib/stickshift/\.httpd\.d(/.*)? gen_context(system_u:object_r:httpd_config_t,s0) ++/var/lib/svn(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/lib/trac(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/var/lib/z-push(/.*)? gen_context(system_u:object_r:httpd_var_lib_t,s0) ++ ++/var/log/apache(2)?(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/apache-ssl(2)?(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/glpi(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/horizon(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/cacti(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/cgiwrap\.log.* -- gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/cherokee(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/httpd(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/lighttpd(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/graphite-web(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/nginx(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/opt/rh/rh-nginx18/log(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/php-fpm(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) + /var/log/roundcubemail(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) + /var/log/suphp\.log.* -- gen_context(system_u:object_r:httpd_log_t,s0) +-/var/log/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/log/thttpd\.log.* -- gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/php_errors\.log.* -- gen_context(system_u:object_r:httpd_log_t,s0) ++/var/log/z-push(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/log/shibboleth-www(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++ifdef(`distro_debian', ` ++/var/log/horde2(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++') + +-/var/run/apache.* gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/cherokee\.pid -- gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/dirsrv/admin-serv.* gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/gcache_port -s gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/httpd.* gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/lighttpd(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/mod_.* gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/wsgi.* -s gen_context(system_u:object_r:httpd_var_run_t,s0) +-/var/run/user/apache(/.*)? gen_context(system_u:object_r:httpd_tmp_t,s0) +- +-/var/spool/gosa(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/spool/squirrelmail(/.*)? gen_context(system_u:object_r:squirrelmail_spool_t,s0) +-/var/spool/viewvc(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) +- +-/var/www(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/www(/.*)?/logs(/.*)? gen_context(system_u:object_r:httpd_sys_ra_content_t,s0) +-/var/www/[^/]*/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/var/www/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/var/www/gallery/albums(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/run/apache.* gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/cherokee\.pid -- gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/gcache_port -s gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/httpd.* gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/lighttpd(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/mod_.* gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/nginx.* gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/opt/rh/rh-nginx18/run/nginx(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/php-fpm(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/thttpd\.pid -- gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/wsgi.* -s gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/run/user/apache(/.*)? gen_context(system_u:object_r:httpd_tmp_t,s0) ++ ++/var/spool/gosa(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/spool/squirrelmail(/.*)? gen_context(system_u:object_r:squirrelmail_spool_t,s0) ++/var/spool/viewvc(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) ++ ++/var/www(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/var/www(/.*)?/logs(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/[^/]*/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/var/www/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) + /var/www/html/[^/]*/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/var/www/html/[^/]*/sites/default/settings\.php -- gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) +-/var/www/html/[^/]*/sites/default/files(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) +-/var/www/html/configuration\.php gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/www/html/wp-content(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/www/icons(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/www/miq/vmdb/log(/.*)? gen_context(system_u:object_r:httpd_sys_ra_content_t,s0) +-/var/www/moodledata(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/www/perl(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) +-/var/www/svn(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) +-/var/www/svn/conf(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) +-/var/www/svn/hooks(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/var/www/html(/.*)?/sites/default/settings\.php -- gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) ++/var/www/html(/.*)?/sites/default/files(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t, s0) ++/var/www/html/configuration\.php gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/html(/.*)?/wp-content(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/html(/.*)?/wp_backups(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/html(/.*)?/uploads(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/html/owncloud/data(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/html/nextcloud/data(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/gallery/albums(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/icons(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++/var/www/miq/vmdb/log(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/moodledata(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/moodle/data(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/openshift/console/tmp(/.*)? gen_context(system_u:object_r:httpd_tmp_t,s0) ++/var/www/openshift/console/log(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/openshift/broker/httpd/logs(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/openshift/console/httpd/logs(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/openshift/broker/httpd/run(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/www/openshift/console/httpd/run(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) ++/var/www/perl(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/var/www/stickshift/[^/]*/log(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/www/svn(/.*)? gen_context(system_u:object_r:httpd_sys_rw_content_t,s0) ++/var/www/svn/hooks(/.*)? gen_context(system_u:object_r:httpd_sys_script_exec_t,s0) ++/var/www/svn/conf(/.*)? gen_context(system_u:object_r:httpd_sys_content_t,s0) ++ ++/var/log/dirsrv/admin-serv(/.*)? gen_context(system_u:object_r:httpd_log_t,s0) ++/var/run/dirsrv/admin-serv.* gen_context(system_u:object_r:httpd_var_run_t,s0) ++/opt/dirsrv/var/run/dirsrv/dsgw/cookies(/.*)? gen_context(system_u:object_r:httpd_var_run_t,s0) +diff --git a/apache.if b/apache.if +index f6eb4851f1..94c92bab0f 100644 +--- a/apache.if ++++ b/apache.if +@@ -1,9 +1,9 @@ +-## Various web servers. ++## Apache web server + + ######################################## + ## +-## Create a set of derived types for +-## httpd web content. ++## Create a set of derived types for apache ++## web content. + ## + ## + ## +@@ -11,120 +11,237 @@ + ## + ## + # +-template(`apache_content_template',` ++template(`apache_user_content_template',` + gen_require(` +- attribute httpdcontent, httpd_exec_scripts, httpd_script_exec_type; +- attribute httpd_script_domains, httpd_htaccess_type; ++ attribute httpd_exec_scripts, httpd_script_exec_type; + type httpd_t, httpd_suexec_t; ++ attribute httpd_script_type, httpd_user_content_type; + ') + +- ######################################## +- # +- # Declarations +- # +- +- ## +- ##

      +- ## Determine whether the script domain can +- ## modify public files used for public file +- ## transfer services. Directories/Files must +- ## be labeled public_content_rw_t. +- ##

      +- ##
      +- gen_tunable(allow_httpd_$1_script_anon_write, false) +- +- type httpd_$1_content_t, httpdcontent; # customizable +- typealias httpd_$1_content_t alias httpd_$1_script_ro_t; +- files_type(httpd_$1_content_t) +- +- type httpd_$1_htaccess_t, httpd_htaccess_type; # customizable; +- files_type(httpd_$1_htaccess_t) +- +- type httpd_$1_script_t, httpd_script_domains; +- domain_type(httpd_$1_script_t) +- role system_r types httpd_$1_script_t; +- +- type httpd_$1_script_exec_t, httpd_script_exec_type; # customizable; +- corecmd_shell_entry_type(httpd_$1_script_t) +- domain_entry_file(httpd_$1_script_t, httpd_$1_script_exec_t) +- +- type httpd_$1_rw_content_t, httpdcontent; # customizable +- typealias httpd_$1_rw_content_t alias { httpd_$1_script_rw_t httpd_$1_content_rw_t }; +- files_type(httpd_$1_rw_content_t) ++ #This type is for webpages ++ type $1_content_t; # customizable; ++ typeattribute $1_content_t httpd_user_content_type; ++ typealias $1_content_t alias { httpd_$1_content_t httpd_$1_script_ro_t }; ++ files_type($1_content_t) ++ ++ # This type is used for .htaccess files ++ type $1_htaccess_t, httpd_content_type; # customizable; ++ typeattribute $1_htaccess_t httpd_user_content_type; ++ typealias $1_htaccess_t alias {httpd_$1_htaccess_t }; ++ files_type($1_htaccess_t) ++ ++ # Type that CGI scripts run as ++ type $1_script_t, httpd_script_type; ++ typealias $1_script_t alias { httpd_$1_script_t }; ++ domain_type($1_script_t) ++ role system_r types $1_script_t; ++ ++ kernel_read_system_state($1_script_t) ++ ++ # This type is used for executable scripts files ++ type $1_script_exec_t, httpd_script_exec_type; # customizable; ++ typeattribute $1_script_exec_t httpd_user_content_type; ++ typealias $1_script_exec_t alias { httpd_$1_script_exec_t }; ++ domain_entry_file($1_script_t, $1_script_exec_t) ++ ++ type $1_rw_content_t; # customizable ++ typeattribute $1_rw_content_t httpd_user_content_type; ++ typealias $1_rw_content_t alias { httpd_$1_rw_content_t $1_script_rw_t $1_content_rw_t }; ++ files_type($1_rw_content_t) ++ ++ type $1_ra_content_t, httpd_content_type; # customizable ++ typeattribute $1_ra_content_t httpd_user_content_type; ++ typealias $1_ra_content_t alias { httpd_$1_ra_content_t $1_script_ra_t $1_content_ra_t }; ++ files_type($1_ra_content_t) ++ ++ # Allow the script process to search the cgi directory, and users directory ++ allow $1_script_t $1_content_t:dir search_dir_perms; ++ ++ can_exec($1_script_t, $1_script_exec_t) ++ allow $1_script_t $1_script_exec_t:dir list_dir_perms; ++ allow $1_script_t $1_ra_content_t:dir { list_dir_perms add_entry_dir_perms }; ++ read_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ append_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ create_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ read_lnk_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ ++ allow $1_script_t $1_content_t:dir list_dir_perms; ++ read_files_pattern($1_script_t, $1_content_t, $1_content_t) ++ read_lnk_files_pattern($1_script_t, $1_content_t, $1_content_t) ++ ++ manage_dirs_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_lnk_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_fifo_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_sock_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ ++ allow $1_script_t httpd_t:unix_stream_socket { ioctl accept getattr read write }; ++ ++ # Allow the web server to run scripts and serve pages ++ tunable_policy(`httpd_builtin_scripting',` ++ manage_dirs_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ manage_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ manage_lnk_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ rw_sock_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) + +- type httpd_$1_ra_content_t, httpdcontent; # customizable +- typealias httpd_$1_ra_content_t alias { httpd_$1_script_ra_t httpd_$1_content_ra_t }; +- files_type(httpd_$1_ra_content_t) ++ allow httpd_t $1_ra_content_t:dir { add_entry_dir_perms }; ++ read_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ append_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ create_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ read_lnk_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) + +- ######################################## +- # +- # Policy +- # ++ ') + +- can_exec(httpd_$1_script_t, httpd_$1_script_exec_t) ++ tunable_policy(`httpd_enable_cgi',` ++ allow $1_script_t $1_script_exec_t:file entrypoint; + +- allow httpd_$1_script_t httpd_$1_ra_content_t:dir { list_dir_perms add_entry_dir_perms setattr_dir_perms }; +- allow httpd_$1_script_t httpd_$1_ra_content_t:file { append_file_perms read_file_perms create_file_perms setattr_file_perms }; +- allow httpd_$1_script_t httpd_$1_ra_content_t:lnk_file read_lnk_file_perms; ++ domtrans_pattern(httpd_suexec_t, $1_script_exec_t, $1_script_t) + +- allow httpd_$1_script_t { httpd_$1_content_t httpd_$1_script_exec_t }:dir list_dir_perms; +- allow httpd_$1_script_t httpd_$1_content_t:file read_file_perms; +- allow httpd_$1_script_t { httpd_$1_content_t httpd_$1_script_exec_t }:lnk_file read_lnk_file_perms; ++ # privileged users run the script: ++ domtrans_pattern(httpd_exec_scripts, $1_script_exec_t, $1_script_t) + +- manage_dirs_pattern(httpd_$1_script_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_files_pattern(httpd_$1_script_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_lnk_files_pattern(httpd_$1_script_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_fifo_files_pattern(httpd_$1_script_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_sock_files_pattern(httpd_$1_script_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- files_tmp_filetrans(httpd_$1_script_t, httpd_$1_rw_content_t, { dir file lnk_file sock_file fifo_file }) ++ allow httpd_exec_scripts $1_script_exec_t:file read_file_perms; + +- allow { httpd_t httpd_suexec_t } httpd_$1_content_t:dir list_dir_perms; +- allow { httpd_t httpd_suexec_t } { httpd_$1_content_t httpd_$1_htaccess_t }:file read_file_perms; +- allow { httpd_t httpd_suexec_t } httpd_$1_content_t:lnk_file read_lnk_file_perms; ++ # apache runs the script: ++ domtrans_pattern(httpd_t, $1_script_exec_t, $1_script_t) ++ allow httpd_t $1_script_t:unix_dgram_socket sendto; ++ ') ++') + +- tunable_policy(`allow_httpd_$1_script_anon_write',` +- miscfiles_manage_public_files(httpd_$1_script_t) ++######################################## ++## ++## Create a set of derived types for apache ++## web content. ++## ++## ++## ++## The prefix to be used for deriving type names. ++## ++## ++# ++template(`apache_content_template',` ++ gen_require(` ++ attribute httpd_exec_scripts, httpd_script_exec_type; ++ type httpd_t, httpd_suexec_t; ++ attribute httpd_script_type, httpd_content_type; + ') + ++ #This type is for webpages ++ type $1_content_t; # customizable; ++ typeattribute $1_content_t httpd_content_type; ++ typealias $1_content_t alias httpd_$1_script_ro_t; ++ files_type($1_content_t) ++ ++ # This type is used for .htaccess files ++ type $1_htaccess_t, httpd_content_type; # customizable; ++ typeattribute $1_htaccess_t httpd_content_type; ++ files_type($1_htaccess_t) ++ ++ # Type that CGI scripts run as ++ type $1_script_t, httpd_script_type; ++ typealias $1_script_t alias { httpd_$1_script_t }; ++ domain_type($1_script_t) ++ role system_r types $1_script_t; ++ ++ kernel_read_system_state($1_script_t) ++ ++ # This type is used for executable scripts files ++ type $1_script_exec_t, httpd_script_exec_type; # customizable; ++ typeattribute $1_script_exec_t httpd_content_type; ++ domain_entry_file($1_script_t, $1_script_exec_t) ++ ++ type $1_rw_content_t; # customizable ++ typeattribute $1_rw_content_t httpd_content_type; ++ typealias $1_rw_content_t alias { $1_script_rw_t $1_content_rw_t }; ++ files_type($1_rw_content_t) ++ ++ type $1_ra_content_t, httpd_content_type; # customizable ++ typeattribute $1_ra_content_t httpd_content_type; ++ typealias $1_ra_content_t alias { $1_script_ra_t $1_content_ra_t }; ++ files_type($1_ra_content_t) ++ ++ # Allow the script process to search the cgi directory, and users directory ++ allow $1_script_t $1_content_t:dir search_dir_perms; ++ ++ can_exec($1_script_t, $1_script_exec_t) ++ allow $1_script_t $1_script_exec_t:dir list_dir_perms; ++ allow $1_script_t $1_ra_content_t:dir { list_dir_perms add_entry_dir_perms }; ++ read_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ append_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ create_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ read_lnk_files_pattern($1_script_t, $1_ra_content_t, $1_ra_content_t) ++ ++ allow $1_script_t $1_content_t:dir list_dir_perms; ++ read_files_pattern($1_script_t, $1_content_t, $1_content_t) ++ read_lnk_files_pattern($1_script_t, $1_content_t, $1_content_t) ++ ++ manage_dirs_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_lnk_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_fifo_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ manage_sock_files_pattern($1_script_t, $1_rw_content_t, $1_rw_content_t) ++ ++ allow $1_script_t httpd_t:unix_stream_socket { ioctl accept getattr read write }; ++ ++ # Allow the web server to run scripts and serve pages + tunable_policy(`httpd_builtin_scripting',` +- manage_dirs_pattern(httpd_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_files_pattern(httpd_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_fifo_files_pattern(httpd_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_lnk_files_pattern(httpd_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) +- manage_sock_files_pattern(httpd_t, httpd_$1_rw_content_t, httpd_$1_rw_content_t) ++ manage_dirs_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ manage_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ manage_lnk_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) ++ rw_sock_files_pattern(httpd_t, $1_rw_content_t, $1_rw_content_t) + +- allow httpd_t httpd_$1_ra_content_t:dir { list_dir_perms add_entry_dir_perms setattr_dir_perms }; +- allow httpd_t httpd_$1_ra_content_t:file { append_file_perms read_file_perms create_file_perms setattr_file_perms }; +- allow httpd_t httpd_$1_ra_content_t:lnk_file read_lnk_file_perms; +- ') ++ allow httpd_t $1_ra_content_t:dir { add_entry_dir_perms }; ++ read_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ append_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ create_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) ++ read_lnk_files_pattern(httpd_t, $1_ra_content_t, $1_ra_content_t) + +- tunable_policy(`httpd_builtin_scripting && httpd_tmp_exec',` +- can_exec(httpd_t, httpd_$1_rw_content_t) + ') + + tunable_policy(`httpd_enable_cgi',` +- allow httpd_$1_script_t httpd_$1_script_exec_t:file entrypoint; +- domtrans_pattern({ httpd_t httpd_suexec_t httpd_exec_scripts }, httpd_$1_script_exec_t, httpd_$1_script_t) +- ') ++ allow $1_script_t $1_script_exec_t:file entrypoint; + +- tunable_policy(`httpd_enable_cgi && httpd_tmp_exec',` +- can_exec(httpd_$1_script_t, httpd_$1_rw_content_t) +- ') ++ domtrans_pattern(httpd_suexec_t, $1_script_exec_t, $1_script_t) + +- tunable_policy(`httpd_enable_cgi && httpd_unified',` +- allow httpd_$1_script_t { httpd_$1_content_t httpd_$1_ra_content_t }:file entrypoint; +- allow httpd_$1_script_t { httpd_$1_content_t httpd_$1_ra_content_t }:dir manage_dir_perms; +- allow httpd_$1_script_t { httpd_$1_content_t httpd_$1_ra_content_t }:file manage_file_perms; +- ') ++ # privileged users run the script: ++ domtrans_pattern(httpd_exec_scripts, $1_script_exec_t, $1_script_t) + +- tunable_policy(`httpd_enable_cgi && httpd_unified && httpd_builtin_scripting',` +- filetrans_pattern(httpd_t, httpd_$1_content_t, httpd_$1_rw_content_t, { file dir fifo_file lnk_file sock_file }) ++ allow httpd_exec_scripts $1_script_exec_t:file read_file_perms; ++ ++ # apache runs the script: ++ domtrans_pattern(httpd_t, $1_script_exec_t, $1_script_t) ++ allow httpd_t $1_script_t:unix_dgram_socket sendto; + ') + ') + + ######################################## + ## +-## Role access for apache. ++## Create a set of derived types for apache ++## web content. ++## ++## ++## ++## The prefix to be used for deriving new type names. ++## ++## ++## ++## ++## The prefix to be used for deriving old type names. ++## ++## ++# ++template(`apache_content_alias_template',` ++ typealias $1_htaccess_t alias httpd_$2_htaccess_t; ++ #typealias $1_script_t alias httpd_$2_script_t; ++ typealias $1_script_exec_t alias httpd_$2_script_exec_t; ++ typealias $1_content_t alias httpd_$2_content_t; ++ typealias $1_rw_content_t alias httpd_$2_script_rw_content_t; ++ typealias $1_ra_content_t alias httpd_$2_script_ra_content_t; ++') ++ ++######################################## ++## ++## Role access for apache + ## + ## + ## +@@ -133,47 +250,61 @@ template(`apache_content_template',` + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + # + interface(`apache_role',` + gen_require(` + attribute httpdcontent; +- type httpd_user_content_t, httpd_user_htaccess_t; +- type httpd_user_script_t, httpd_user_script_exec_t; +- type httpd_user_ra_content_t, httpd_user_rw_content_t; ++ type httpd_user_content_t, httpd_user_htaccess_t, httpd_user_script_t; ++ type httpd_user_ra_content_t, httpd_user_rw_content_t, httpd_user_script_exec_t; + ') + + role $1 types httpd_user_script_t; + +- allow $2 httpd_user_htaccess_t:file { manage_file_perms relabel_file_perms }; +- +- allow $2 httpd_user_content_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 httpd_user_content_t:file { manage_file_perms relabel_file_perms }; +- allow $2 httpd_user_content_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- +- allow $2 httpd_user_ra_content_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 httpd_user_ra_content_t:file { manage_file_perms relabel_file_perms }; +- allow $2 httpd_user_ra_content_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- +- allow $2 httpd_user_rw_content_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 httpd_user_rw_content_t:file { manage_file_perms relabel_file_perms }; +- allow $2 httpd_user_rw_content_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- +- allow $2 httpd_user_script_exec_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 httpd_user_script_exec_t:file { manage_file_perms relabel_file_perms }; +- allow $2 httpd_user_script_exec_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- +- userdom_user_home_dir_filetrans($2, httpd_user_content_t, dir, "public_html") +- userdom_user_home_dir_filetrans($2, httpd_user_content_t, dir, "web") +- userdom_user_home_dir_filetrans($2, httpd_user_content_t, dir, "www") +- +- filetrans_pattern($2, httpd_user_content_t, httpd_user_htaccess_t, file, ".htaccess") +- filetrans_pattern($2, httpd_user_content_t, httpd_user_script_exec_t, dir, "cgi-bin") +- filetrans_pattern($2, httpd_user_content_t, httpd_user_ra_content_t, dir, "logs") ++ allow $2 httpd_user_htaccess_t:file { manage_file_perms relabelto relabelfrom }; ++ ++ manage_dirs_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ manage_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ manage_lnk_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_dirs_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_lnk_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ ++ manage_dirs_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ manage_files_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ manage_lnk_files_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ relabel_dirs_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ relabel_files_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ relabel_lnk_files_pattern($2, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ ++ manage_dirs_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ manage_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ manage_lnk_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_dirs_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ relabel_lnk_files_pattern($2, httpd_user_content_t, httpd_user_content_t) ++ ++ manage_dirs_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ manage_files_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ manage_lnk_files_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ relabel_dirs_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ relabel_files_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ relabel_lnk_files_pattern($2, httpd_user_rw_content_t, httpd_user_rw_content_t) ++ ++ manage_dirs_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ manage_files_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ manage_lnk_files_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ relabel_dirs_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ relabel_files_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ relabel_lnk_files_pattern($2, httpd_user_script_exec_t, httpd_user_script_exec_t) ++ ++ apache_exec_modules($2) ++ apache_filetrans_home_content($2) + + tunable_policy(`httpd_enable_cgi',` ++ # If a user starts a script by hand it gets the proper context + domtrans_pattern($2, httpd_user_script_exec_t, httpd_user_script_t) + ') + +@@ -184,7 +315,7 @@ interface(`apache_role',` + + ######################################## + ## +-## Read user httpd script executable files. ++## Read httpd user scripts executables. + ## + ## + ## +@@ -204,7 +335,7 @@ interface(`apache_read_user_scripts',` + + ######################################## + ## +-## Read user httpd content. ++## Read user web content. + ## + ## + ## +@@ -224,7 +355,27 @@ interface(`apache_read_user_content',` + + ######################################## + ## +-## Execute httpd with a domain transition. ++## Manage user web content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_manage_user_content',` ++ gen_require(` ++ type httpd_user_content_t; ++ ') ++ ++ allow $1 httpd_user_content_t:dir manage_dir_perms; ++ manage_files_pattern($1, httpd_user_content_t, httpd_user_content_t) ++ manage_lnk_files_pattern($1, httpd_user_content_t, httpd_user_content_t) ++') ++ ++######################################## ++## ++## Transition to apache. + ## + ## + ## +@@ -241,27 +392,47 @@ interface(`apache_domtrans',` + domtrans_pattern($1, httpd_exec_t, httpd_t) + ') + +-######################################## ++###################################### + ## +-## Execute httpd server in the httpd domain. ++## Allow the specified domain to execute apache ++## in the caller domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`apache_initrc_domtrans',` ++interface(`apache_exec',` + gen_require(` +- type httpd_initrc_exec_t; ++ type httpd_exec_t; + ') + +- init_labeled_script_domtrans($1, httpd_initrc_exec_t) ++ can_exec($1, httpd_exec_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to execute apache suexec ++## in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_exec_suexec',` ++ gen_require(` ++ type httpd_suexec_exec_t; ++ ') ++ ++ can_exec($1, httpd_suexec_exec_t) + ') + + ####################################### + ## +-## Send generic signals to httpd. ++## Send a generic signal to apache. + ## + ## + ## +@@ -279,7 +450,7 @@ interface(`apache_signal',` + + ######################################## + ## +-## Send null signals to httpd. ++## Send a null signal to apache. + ## + ## + ## +@@ -297,7 +468,7 @@ interface(`apache_signull',` + + ######################################## + ## +-## Send child terminated signals to httpd. ++## Send a SIGCHLD signal to apache. + ## + ## + ## +@@ -315,8 +486,7 @@ interface(`apache_sigchld',` + + ######################################## + ## +-## Inherit and use file descriptors +-## from httpd. ++## Inherit and use file descriptors from Apache. + ## + ## + ## +@@ -334,8 +504,8 @@ interface(`apache_use_fds',` + + ######################################## + ## +-## Do not audit attempts to read and +-## write httpd unnamed pipes. ++## Do not audit attempts to read and write Apache ++## unnamed pipes. + ## + ## + ## +@@ -348,13 +518,32 @@ interface(`apache_dontaudit_rw_fifo_file',` + type httpd_t; + ') + +- dontaudit $1 httpd_t:fifo_file rw_fifo_file_perms; ++ dontaudit $1 httpd_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Allow attempts to read and write Apache ++## unix domain stream sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`apache_rw_stream_sockets',` ++ gen_require(` ++ type httpd_t; ++ ') ++ ++ allow $1 httpd_t:unix_stream_socket { getattr read write }; + ') + + ######################################## + ## +-## Do not audit attempts to read and +-## write httpd unix domain stream sockets. ++## Do not audit attempts to read and write Apache ++## unix domain stream sockets. + ## + ## + ## +@@ -367,13 +556,13 @@ interface(`apache_dontaudit_rw_stream_sockets',` + type httpd_t; + ') + +- dontaudit $1 httpd_t:unix_stream_socket { read write }; ++ dontaudit $1 httpd_t:unix_stream_socket { getattr read write }; + ') + + ######################################## + ## +-## Do not audit attempts to read and +-## write httpd TCP sockets. ++## Do not audit attempts to read and write Apache ++## TCP sockets. + ## + ## + ## +@@ -391,8 +580,7 @@ interface(`apache_dontaudit_rw_tcp_sockets',` + + ######################################## + ## +-## Create, read, write, and delete +-## all httpd content. ++## Create, read, write, and delete all web content. + ## + ## + ## +@@ -417,7 +605,8 @@ interface(`apache_manage_all_content',` + + ######################################## + ## +-## Set attributes httpd cache directories. ++## Allow domain to set the attributes ++## of the APACHE cache directory. + ## + ## + ## +@@ -435,7 +624,8 @@ interface(`apache_setattr_cache_dirs',` + + ######################################## + ## +-## List httpd cache directories. ++## Allow the specified domain to list ++## Apache cache. + ## + ## + ## +@@ -453,7 +643,8 @@ interface(`apache_list_cache',` + + ######################################## + ## +-## Read and write httpd cache files. ++## Allow the specified domain to read ++## and write Apache cache files. + ## + ## + ## +@@ -471,7 +662,8 @@ interface(`apache_rw_cache_files',` + + ######################################## + ## +-## Delete httpd cache directories. ++## Allow the specified domain to delete ++## Apache cache dirs. + ## + ## + ## +@@ -489,7 +681,8 @@ interface(`apache_delete_cache_dirs',` + + ######################################## + ## +-## Delete httpd cache files. ++## Allow the specified domain to delete ++## Apache cache. + ## + ## + ## +@@ -507,49 +700,51 @@ interface(`apache_delete_cache_files',` + + ######################################## + ## +-## Read httpd configuration files. ++## Allow the specified domain to search ++## apache configuration dirs. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`apache_read_config',` ++interface(`apache_search_config',` + gen_require(` + type httpd_config_t; + ') + + files_search_etc($1) +- allow $1 httpd_config_t:dir list_dir_perms; +- read_files_pattern($1, httpd_config_t, httpd_config_t) +- read_lnk_files_pattern($1, httpd_config_t, httpd_config_t) ++ allow $1 httpd_config_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Search httpd configuration directories. ++## Allow the specified domain to read ++## apache configuration files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`apache_search_config',` ++interface(`apache_read_config',` + gen_require(` + type httpd_config_t; + ') + + files_search_etc($1) +- allow $1 httpd_config_t:dir search_dir_perms; ++ allow $1 httpd_config_t:dir list_dir_perms; ++ read_files_pattern($1, httpd_config_t, httpd_config_t) ++ read_lnk_files_pattern($1, httpd_config_t, httpd_config_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## httpd configuration files. ++## Allow the specified domain to manage ++## apache configuration files. + ## + ## + ## +@@ -570,8 +765,8 @@ interface(`apache_manage_config',` + + ######################################## + ## +-## Execute the Apache helper program +-## with a domain transition. ++## Execute the Apache helper program with ++## a domain transition. + ## + ## + ## +@@ -608,16 +803,38 @@ interface(`apache_domtrans_helper',` + # + interface(`apache_run_helper',` + gen_require(` +- attribute_role httpd_helper_roles; ++ type httpd_helper_t; + ') + + apache_domtrans_helper($1) +- roleattribute $2 httpd_helper_roles; ++ role $2 types httpd_helper_t; ++') ++ ++######################################## ++## ++## dontaudit attempts to read ++## apache log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`apache_dontaudit_read_log',` ++ gen_require(` ++ type httpd_log_t; ++ ') ++ ++ dontaudit $1 httpd_log_t:file read_file_perms; ++ dontaudit $1 httpd_log_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## +-## Read httpd log files. ++## Allow the specified domain to read ++## apache log files. + ## + ## + ## +@@ -639,7 +856,8 @@ interface(`apache_read_log',` + + ######################################## + ## +-## Append httpd log files. ++## Allow the specified domain to append ++## to apache log files. + ## + ## + ## +@@ -657,10 +875,29 @@ interface(`apache_append_log',` + append_files_pattern($1, httpd_log_t, httpd_log_t) + ') + ++####################################### ++## ++## Allow the specified domain to write ++## to apache log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_write_log',` ++ gen_require(` ++ type httpd_log_t; ++ ') ++ ++ allow $1 httpd_log_t:file write; ++') ++ + ######################################## + ## +-## Do not audit attempts to append +-## httpd log files. ++## Do not audit attempts to append to the ++## Apache logs. + ## + ## + ## +@@ -678,8 +915,8 @@ interface(`apache_dontaudit_append_log',` + + ######################################## + ## +-## Create, read, write, and delete +-## httpd log files. ++## Allow the specified domain to manage ++## to apache var lib files. + ## + ## + ## +@@ -687,20 +924,21 @@ interface(`apache_dontaudit_append_log',` + ## + ## + # +-interface(`apache_manage_log',` ++interface(`apache_manage_lib',` + gen_require(` +- type httpd_log_t; ++ type httpd_var_lib_t; + ') + +- logging_search_logs($1) +- manage_dirs_pattern($1, httpd_log_t, httpd_log_t) +- manage_files_pattern($1, httpd_log_t, httpd_log_t) +- read_lnk_files_pattern($1, httpd_log_t, httpd_log_t) ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, httpd_var_lib_t, httpd_var_lib_t) ++ manage_files_pattern($1, httpd_var_lib_t, httpd_var_lib_t) ++ read_lnk_files_pattern($1, httpd_var_lib_t, httpd_var_lib_t) + ') + +-####################################### ++######################################## + ## +-## Write apache log files. ++## Allow the specified domain to manage ++## to apache log files. + ## + ## + ## +@@ -708,19 +946,21 @@ interface(`apache_manage_log',` + ## + ## + # +-interface(`apache_write_log',` ++interface(`apache_manage_log',` + gen_require(` + type httpd_log_t; + ') + + logging_search_logs($1) +- write_files_pattern($1, httpd_log_t, httpd_log_t) ++ manage_dirs_pattern($1, httpd_log_t, httpd_log_t) ++ manage_files_pattern($1, httpd_log_t, httpd_log_t) ++ read_lnk_files_pattern($1, httpd_log_t, httpd_log_t) + ') + + ######################################## + ## +-## Do not audit attempts to search +-## httpd module directories. ++## Do not audit attempts to search Apache ++## module directories. + ## + ## + ## +@@ -738,7 +978,8 @@ interface(`apache_dontaudit_search_modules',` + + ######################################## + ## +-## List httpd module directories. ++## Allow the specified domain to read ++## the apache module directories. + ## + ## + ## +@@ -746,17 +987,19 @@ interface(`apache_dontaudit_search_modules',` + ## + ## + # +-interface(`apache_list_modules',` ++interface(`apache_read_modules',` + gen_require(` + type httpd_modules_t; + ') + +- allow $1 httpd_modules_t:dir list_dir_perms; ++ read_files_pattern($1, httpd_modules_t, httpd_modules_t) + ') + + ######################################## + ## +-## Execute httpd module files. ++## Allow the specified domain to list ++## the contents of the apache modules ++## directory. + ## + ## + ## +@@ -764,19 +1007,19 @@ interface(`apache_list_modules',` + ## + ## + # +-interface(`apache_exec_modules',` ++interface(`apache_list_modules',` + gen_require(` + type httpd_modules_t; + ') + + allow $1 httpd_modules_t:dir list_dir_perms; +- allow $1 httpd_modules_t:lnk_file read_lnk_file_perms; +- can_exec($1, httpd_modules_t) ++ read_lnk_files_pattern($1, httpd_modules_t, httpd_modules_t) + ') + + ######################################## + ## +-## Read httpd module files. ++## Allow the specified domain to execute ++## apache modules. + ## + ## + ## +@@ -784,19 +1027,19 @@ interface(`apache_exec_modules',` + ## + ## + # +-interface(`apache_read_module_files',` ++interface(`apache_exec_modules',` + gen_require(` + type httpd_modules_t; + ') + +- libs_search_lib($1) +- read_files_pattern($1, httpd_modules_t, httpd_modules_t) ++ allow $1 httpd_modules_t:dir list_dir_perms; ++ allow $1 httpd_modules_t:lnk_file read_lnk_file_perms; ++ can_exec($1, httpd_modules_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run httpd_rotatelogs. ++## Execute a domain transition to run httpd_rotatelogs. + ## + ## + ## +@@ -809,13 +1052,50 @@ interface(`apache_domtrans_rotatelogs',` + type httpd_rotatelogs_t, httpd_rotatelogs_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, httpd_rotatelogs_exec_t, httpd_rotatelogs_t) + ') + ++####################################### ++## ++## Execute httpd_rotatelogs in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`apache_exec_rotatelogs',` ++ gen_require(` ++ type httpd_rotatelogs_exec_t; ++ ') ++ ++ can_exec($1, httpd_rotatelogs_exec_t) ++') ++ ++####################################### ++## ++## Execute httpd system scripts in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`apache_exec_sys_script',` ++ gen_require(` ++ type httpd_sys_script_exec_t; ++ ') ++ ++ allow $1 httpd_sys_script_exec_t:dir search_dir_perms; ++ can_exec($1, httpd_sys_script_exec_t) ++') ++ + ######################################## + ## +-## List httpd system content directories. ++## Allow the specified domain to list ++## apache system content files. + ## + ## + ## +@@ -829,13 +1109,14 @@ interface(`apache_list_sys_content',` + ') + + list_dirs_pattern($1, httpd_sys_content_t, httpd_sys_content_t) ++ read_lnk_files_pattern($1, httpd_sys_content_t, httpd_sys_content_t) + files_search_var($1) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## httpd system content files. ++## Allow the specified domain to manage ++## apache system content files. + ## + ## + ## +@@ -844,6 +1125,7 @@ interface(`apache_list_sys_content',` + ## + ## + # ++# Note that httpd_sys_content_t is found in /var, /etc, /srv and /usr + interface(`apache_manage_sys_content',` + gen_require(` + type httpd_sys_content_t; +@@ -855,32 +1137,98 @@ interface(`apache_manage_sys_content',` + manage_lnk_files_pattern($1, httpd_sys_content_t, httpd_sys_content_t) + ') + +-######################################## ++###################################### ++## ++## Allow the specified domain to read ++## apache system content rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`apache_read_sys_content_rw_files',` ++ gen_require(` ++ type httpd_sys_rw_content_t; ++ ') ++ ++ read_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to read ++## apache system content rw dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`apache_read_sys_content_rw_dirs',` ++ gen_require(` ++ type httpd_sys_rw_content_t; ++ ') ++ ++ list_dirs_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++') ++ ++###################################### + ## +-## Create, read, write, and delete +-## httpd system rw content. ++## Allow the specified domain to manage ++## apache system content rw files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`apache_manage_sys_rw_content',` ++interface(`apache_manage_sys_content_rw',` + gen_require(` + type httpd_sys_rw_content_t; + ') + +- apache_search_sys_content($1) ++ files_search_var($1) + manage_dirs_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) +- manage_files_pattern($1,httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++ manage_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) + manage_lnk_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) + ') + + ######################################## + ## +-## Execute all httpd scripts in the +-## system script domain. ++## Allow the specified domain to delete ++## apache system content rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`apache_delete_sys_content_rw',` ++ gen_require(` ++ type httpd_sys_rw_content_t; ++ ') ++ ++ files_search_tmp($1) ++ delete_dirs_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++ delete_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++ delete_lnk_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++ delete_fifo_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++ delete_sock_files_pattern($1, httpd_sys_rw_content_t, httpd_sys_rw_content_t) ++') ++ ++######################################## ++## ++## Execute all web scripts in the system ++## script domain. + ## + ## + ## +@@ -888,10 +1236,17 @@ interface(`apache_manage_sys_rw_content',` + ## + ## + # ++# cjp: this interface specifically added to allow ++# sysadm_t to run scripts + interface(`apache_domtrans_sys_script',` + gen_require(` + attribute httpdcontent; +- type httpd_sys_script_t; ++ type httpd_sys_script_exec_t; ++ type httpd_sys_script_t, httpd_sys_content_t; ++ ') ++ ++ tunable_policy(`httpd_enable_cgi',` ++ domtrans_pattern($1, httpd_sys_script_exec_t, httpd_sys_script_t) + ') + + tunable_policy(`httpd_enable_cgi && httpd_unified',` +@@ -901,9 +1256,8 @@ interface(`apache_domtrans_sys_script',` + + ######################################## + ## +-## Do not audit attempts to read and +-## write httpd system script unix +-## domain stream sockets. ++## Do not audit attempts to read and write Apache ++## system script unix domain stream sockets. + ## + ## + ## +@@ -916,7 +1270,7 @@ interface(`apache_dontaudit_rw_sys_script_stream_sockets',` + type httpd_sys_script_t; + ') + +- dontaudit $1 httpd_sys_script_t:unix_stream_socket { read write }; ++ dontaudit $1 httpd_sys_script_t:unix_stream_socket { getattr read write }; + ') + + ######################################## +@@ -941,7 +1295,7 @@ interface(`apache_domtrans_all_scripts',` + ######################################## + ## + ## Execute all user scripts in the user +-## script domain. Add user script domains ++## script domain. Add user script domains + ## to the specified role. + ## + ## +@@ -954,6 +1308,7 @@ interface(`apache_domtrans_all_scripts',` + ## Role allowed access. + ## + ## ++## + # + interface(`apache_run_all_scripts',` + gen_require(` +@@ -966,7 +1321,8 @@ interface(`apache_run_all_scripts',` + + ######################################## + ## +-## Read httpd squirrelmail data files. ++## Allow the specified domain to read ++## apache squirrelmail data. + ## + ## + ## +@@ -979,12 +1335,13 @@ interface(`apache_read_squirrelmail_data',` + type httpd_squirrelmail_t; + ') + +- allow $1 httpd_squirrelmail_t:file read_file_perms; ++ read_files_pattern($1, httpd_squirrelmail_t, httpd_squirrelmail_t) + ') + + ######################################## + ## +-## Append httpd squirrelmail data files. ++## Allow the specified domain to append ++## apache squirrelmail data. + ## + ## + ## +@@ -1002,7 +1359,7 @@ interface(`apache_append_squirrelmail_data',` + + ######################################## + ## +-## Search httpd system content. ++## Search apache system content. + ## + ## + ## +@@ -1015,13 +1372,12 @@ interface(`apache_search_sys_content',` + type httpd_sys_content_t; + ') + +- files_search_var($1) + allow $1 httpd_sys_content_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Read httpd system content. ++## Read apache system content. + ## + ## + ## +@@ -1041,7 +1397,7 @@ interface(`apache_read_sys_content',` + + ######################################## + ## +-## Search httpd system CGI directories. ++## Search apache system CGI directories. + ## + ## + ## +@@ -1059,8 +1415,7 @@ interface(`apache_search_sys_scripts',` + + ######################################## + ## +-## Create, read, write, and delete all +-## user httpd content. ++## Create, read, write, and delete all user web content. + ## + ## + ## +@@ -1071,18 +1426,21 @@ interface(`apache_search_sys_scripts',` + # + interface(`apache_manage_all_user_content',` + gen_require(` +- type httpd_user_content_t, httpd_user_content_rw_t, httpd_user_content_ra_t; +- type httpd_user_htaccess_t, httpd_user_script_exec_t; ++ attribute httpd_user_content_type, httpd_user_script_exec_type; + ') + +- manage_dirs_pattern($1, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t }, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t }) +- manage_files_pattern($1, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t httpd_user_htaccess_t }, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t httpd_user_htaccess_t }) +- manage_lnk_files_pattern($1, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t }, { httpd_user_content_t httpd_user_content_rw_t httpd_user_content_ra_t httpd_user_script_exec_t }) ++ manage_dirs_pattern($1, httpd_user_content_type, httpd_user_content_type) ++ manage_files_pattern($1, httpd_user_content_type, httpd_user_content_type) ++ manage_lnk_files_pattern($1, httpd_user_content_type, httpd_user_content_type) ++ ++ manage_dirs_pattern($1, httpd_user_script_exec_type, httpd_user_script_exec_type) ++ manage_files_pattern($1, httpd_user_script_exec_type, httpd_user_script_exec_type) ++ manage_lnk_files_pattern($1, httpd_user_script_exec_type, httpd_user_script_exec_type) + ') + + ######################################## + ## +-## Search system script state directories. ++## Search system script state directory. + ## + ## + ## +@@ -1100,7 +1458,48 @@ interface(`apache_search_sys_script_state',` + + ######################################## + ## +-## Read httpd tmp files. ++## Allow the specified domain to read ++## apache pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_read_pid_files',` ++ gen_require(` ++ type httpd_var_run_t; ++ ') ++ ++ files_search_tmp($1) ++ read_files_pattern($1, httpd_var_run_t, httpd_var_run_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read ++## apache tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_read_tmp_dirs',` ++ gen_require(` ++ type httpd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ list_dirs_pattern($1, httpd_tmp_t, httpd_tmp_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read ++## apache tmp files. + ## + ## + ## +@@ -1119,8 +1518,47 @@ interface(`apache_read_tmp_files',` + + ######################################## + ## +-## Do not audit attempts to write +-## httpd tmp files. ++## Allow the specified domain to read ++## apache tmp lnk files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_read_tmp_symlinks',` ++ gen_require(` ++ type httpd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ read_lnk_files_pattern($1, httpd_tmp_t, httpd_tmp_t) ++') ++ ++###################################### ++## ++## Dontaudit attempts to read and write ++## apache tmp files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`apache_dontaudit_rw_tmp_files',` ++ gen_require(` ++ type httpd_tmp_t; ++ ') ++ ++ dontaudit $1 httpd_tmp_t:file { read write }; ++') ++ ++######################################## ++## ++## Dontaudit attempts to write ++## apache tmp files. + ## + ## + ## +@@ -1133,7 +1571,7 @@ interface(`apache_dontaudit_write_tmp_files',` + type httpd_tmp_t; + ') + +- dontaudit $1 httpd_tmp_t:file write_file_perms; ++ dontaudit $1 httpd_tmp_t:file write; + ') + + ######################################## +@@ -1142,6 +1580,9 @@ interface(`apache_dontaudit_write_tmp_files',` + ## + ## + ##

      ++## Execute CGI in the specified domain. ++##

      ++##

      + ## This is an interface to support third party modules + ## and its use is not allowed in upstream reference + ## policy. +@@ -1171,8 +1612,31 @@ interface(`apache_cgi_domain',` + + ######################################## + ##

      +-## All of the rules required to +-## administrate an apache environment. ++## Execute httpd server in the httpd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`apache_systemctl',` ++ gen_require(` ++ type httpd_t; ++ type httpd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 httpd_unit_file_t:file read_file_perms; ++ allow $1 httpd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, httpd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate an apache environment + ## + ## + ## +@@ -1189,18 +1653,19 @@ interface(`apache_cgi_domain',` + interface(`apache_admin',` + gen_require(` + attribute httpdcontent, httpd_script_exec_type; +- attribute httpd_script_domains, httpd_htaccess_type; + type httpd_t, httpd_config_t, httpd_log_t; +- type httpd_modules_t, httpd_lock_t, httpd_helper_t; +- type httpd_var_run_t, httpd_passwd_t, httpd_suexec_t; +- type httpd_suexec_tmp_t, httpd_tmp_t, httpd_rotatelogs_t; +- type httpd_initrc_exec_t, httpd_keytab_t; ++ type httpd_modules_t, httpd_lock_t, httpd_bool_t; ++ type httpd_var_run_t, httpd_php_tmp_t, httpd_initrc_exec_t; ++ type httpd_suexec_tmp_t, httpd_tmp_t; ++ type httpd_unit_file_t; + ') + +- allow $1 { httpd_script_domains httpd_t httpd_helper_t }:process { ptrace signal_perms }; +- allow $1 { httpd_rotatelogs_t httpd_suexec_t httpd_passwd_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { httpd_script_domains httpd_t httpd_helper_t }) +- ps_process_pattern($1, { httpd_rotatelogs_t httpd_suexec_t httpd_passwd_t }) ++ allow $1 httpd_t:process signal_perms; ++ ps_process_pattern($1, httpd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 httpd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, httpd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -1210,10 +1675,10 @@ interface(`apache_admin',` + apache_manage_all_content($1) + miscfiles_manage_public_files($1) + +- files_search_etc($1) +- admin_pattern($1, { httpd_keytab_t httpd_config_t }) ++ files_list_etc($1) ++ admin_pattern($1, httpd_config_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, httpd_log_t) + + admin_pattern($1, httpd_modules_t) +@@ -1224,9 +1689,165 @@ interface(`apache_admin',` + admin_pattern($1, httpd_var_run_t) + files_pid_filetrans($1, httpd_var_run_t, file) + +- admin_pattern($1, { httpdcontent httpd_script_exec_type httpd_htaccess_type }) +- admin_pattern($1, { httpd_tmp_t httpd_suexec_tmp_t }) ++ admin_pattern($1, httpdcontent) ++ admin_pattern($1, httpd_script_exec_type) ++ ++ seutil_domtrans_setfiles($1) ++ ++ files_list_tmp($1) ++ admin_pattern($1, httpd_tmp_t) ++ admin_pattern($1, httpd_php_tmp_t) ++ admin_pattern($1, httpd_suexec_tmp_t) ++ ++ apache_systemctl($1) ++ admin_pattern($1, httpd_unit_file_t) ++ allow $1 httpd_unit_file_t:service all_service_perms; ++ ++ apache_filetrans_named_content($1) ++') ++ ++######################################## ++## ++## dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`apache_dontaudit_leaks',` ++ gen_require(` ++ type httpd_t; ++ type httpd_tmp_t; ++ ') ++ ++ dontaudit $1 httpd_t:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit $1 httpd_t:tcp_socket { read write }; ++ dontaudit $1 httpd_t:unix_dgram_socket { read write }; ++ dontaudit $1 httpd_t:unix_stream_socket { getattr read write }; ++ dontaudit $1 httpd_tmp_t:file { read write }; ++') ++ ++######################################## ++## ++## Transition to apache named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_filetrans_named_content',` ++ gen_require(` ++ type httpd_sys_content_t, httpd_sys_rw_content_t; ++ type httpd_tmp_t; ++ ') ++ ++ ++ apache_filetrans_home_content($1) ++ files_usr_filetrans($1, httpd_sys_content_t, dir, "gallery2") ++ files_usr_filetrans($1, httpd_sys_content_t, dir, "z-push") ++ files_etc_filetrans($1, httpd_sys_content_t, dir, "z-push") ++ files_etc_filetrans($1, httpd_sys_content_t, dir, "web") ++ files_etc_filetrans($1, httpd_sys_content_t, dir, "WebCalendar") ++ files_etc_filetrans($1, httpd_sys_content_t, dir, "htdig") ++ files_etc_filetrans($1, httpd_sys_rw_content_t, dir, "horde") ++ files_etc_filetrans($1, httpd_sys_rw_content_t, dir, "owncloud") ++ files_etc_filetrans($1, httpd_sys_rw_content_t, dir, "nextcloud") ++ filetrans_pattern($1, httpd_sys_content_t, httpd_sys_rw_content_t, file, "settings.php") ++ filetrans_pattern($1, httpd_sys_content_t, httpd_sys_rw_content_t, dir, "smarty") ++ filetrans_pattern($1, httpd_sys_content_t, httpd_sys_rw_content_t, dir, "uploads") ++ filetrans_pattern($1, httpd_sys_content_t, httpd_sys_rw_content_t, dir, "wp-content") ++ filetrans_pattern($1, httpd_sys_content_t, httpd_sys_rw_content_t, dir, "upgrade") ++ userdom_user_tmp_filetrans($1, httpd_tmp_t, dir, "apache") ++') ++ ++######################################## ++## ++## Allow any httpd_exec_t to be an entrypoint of this domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`apache_entrypoint',` ++ gen_require(` ++ type httpd_exec_t; ++ ') ++ allow $1 httpd_exec_t:file entrypoint; ++') ++ ++######################################## ++## ++## Execute a httpd_exec_t in the specified domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`apache_exec_domtrans',` ++ gen_require(` ++ type httpd_exec_t; ++ ') ++ ++ domtrans_pattern($1, httpd_exec_t, $2) ++') ++ ++######################################## ++## ++## Transition to apache home content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_filetrans_home_content',` ++ gen_require(` ++ type httpd_user_content_t, httpd_user_script_exec_t, httpd_user_htaccess_t; ++ type httpd_user_content_ra_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, httpd_user_content_t, dir, "public_html") ++ userdom_user_home_dir_filetrans($1, httpd_user_content_t, dir, "www") ++ userdom_user_home_dir_filetrans($1, httpd_user_content_t, dir, "web") ++ filetrans_pattern($1, httpd_user_content_t, httpd_user_script_exec_t, dir, "cgi-bin") ++ filetrans_pattern($1, httpd_user_content_t, httpd_user_content_ra_t, dir, "logs") ++ filetrans_pattern($1, { httpd_user_content_t httpd_user_script_exec_t }, httpd_user_htaccess_t, file, ".htaccess") ++') ++ + +- apache_run_all_scripts($1, $2) +- apache_run_helper($1, $2) ++######################################## ++## ++## Send and receive messages from ++## httpd over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apache_dbus_chat',` ++ gen_require(` ++ type httpd_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 httpd_t:dbus send_msg; ++ allow httpd_t $1:dbus send_msg; ++ ps_process_pattern(httpd_t, $1) + ') +diff --git a/apache.te b/apache.te +index 6649962b6e..e51965af4b 100644 +--- a/apache.te ++++ b/apache.te +@@ -5,280 +5,346 @@ policy_module(apache, 2.7.2) + # Declarations + # + ++selinux_genbool(httpd_bool_t) ++ + ## +-##

      +-## Determine whether httpd can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      ++##

      ++## Allow Apache to modify public files ++## used for public file transfer services. Directories/Files must ++## be labeled public_content_rw_t. ++##

      + ##
      +-gen_tunable(allow_httpd_anon_write, false) ++gen_tunable(httpd_anon_write, false) + + ## +-##

      +-## Determine whether httpd can use mod_auth_pam. +-##

      ++##

      ++## Dontaudit Apache to search dirs. ++##

      + ##
      +-gen_tunable(allow_httpd_mod_auth_pam, false) ++gen_tunable(httpd_dontaudit_search_dirs, false) + + ## +-##

      +-## Determine whether httpd can use built in scripting. +-##

      ++##

      ++## Allow Apache to use mod_auth_pam ++##

      + ##
      +-gen_tunable(httpd_builtin_scripting, false) ++gen_tunable(httpd_mod_auth_pam, false) + + ## +-##

      +-## Determine whether httpd can check spam. +-##

      ++##

      ++## Allow Apache to use mod_auth_ntlm_winbind ++##

      + ##
      +-gen_tunable(httpd_can_check_spam, false) ++gen_tunable(httpd_mod_auth_ntlm_winbind, false) + + ## +-##

      +-## Determine whether httpd scripts and modules +-## can connect to the network using TCP. +-##

      ++##

      ++## Allow httpd scripts and modules execmem/execstack ++##

      ++##
      ++gen_tunable(httpd_execmem, false) ++ ++## ++##

      ++## Allow httpd processes to manage IPA content ++##

      ++##
      ++gen_tunable(httpd_manage_ipa, false) ++ ++## ++##

      ++## Allow httpd processes to run IPA helper. ++##

      ++##
      ++gen_tunable(httpd_run_ipa, false) ++ ++## ++##

      ++## Allow httpd to use built in scripting (usually php) ++##

      ++##
      ++gen_tunable(httpd_builtin_scripting, false) ++ ++## ++##

      ++## Allow HTTPD scripts and modules to connect to the network using TCP. ++##

      + ##
      + gen_tunable(httpd_can_network_connect, false) + + ## +-##

      +-## Determine whether httpd scripts and modules +-## can connect to cobbler over the network. +-##

      ++##

      ++## Allow HTTPD scripts and modules to connect to cobbler over the network. ++##

      + ##
      + gen_tunable(httpd_can_network_connect_cobbler, false) + + ## +-##

      +-## Determine whether scripts and modules can +-## connect to databases over the network. +-##

      ++##

      ++## Allow HTTPD scripts and modules to server cobbler files. ++##

      + ##
      +-gen_tunable(httpd_can_network_connect_db, false) ++gen_tunable(httpd_serve_cobbler_files, false) + + ## +-##

      +-## Determine whether httpd can connect to +-## ldap over the network. +-##

      ++##

      ++## Allow HTTPD to connect to port 80 for graceful shutdown ++##

      + ##
      +-gen_tunable(httpd_can_network_connect_ldap, false) ++gen_tunable(httpd_graceful_shutdown, false) + + ## +-##

      +-## Determine whether httpd can connect +-## to memcache server over the network. +-##

      ++##

      ++## Allow HTTPD scripts and modules to connect to databases over the network. ++##

      ++##
      ++gen_tunable(httpd_can_network_connect_db, false) ++ ++## ++##

      ++## Allow httpd to connect to memcache server ++##

      + ##
      +-gen_tunable(httpd_can_network_connect_memcache, false) ++gen_tunable(httpd_can_network_memcache, false) + + ## +-##

      +-## Determine whether httpd can act as a relay. +-##

      ++##

      ++## Allow httpd to act as a relay ++##

      + ##
      + gen_tunable(httpd_can_network_relay, false) + + ## +-##

      +-## Determine whether httpd daemon can +-## connect to zabbix over the network. +-##

      ++##

      ++## Allow http daemon to connect to zabbix ++##

      + ##
      +-gen_tunable(httpd_can_network_connect_zabbix, false) ++gen_tunable(httpd_can_connect_zabbix, false) + + ## +-##

      +-## Determine whether httpd can send mail. +-##

      ++##

      ++## Allow http daemon to connect to mythtv ++##

      ++##
      ++gen_tunable(httpd_can_connect_mythtv, false) ++ ++## ++##

      ++## Allow http daemon to check spam ++##

      ++##
      ++gen_tunable(httpd_can_check_spam, false) ++ ++## ++##

      ++## Allow http daemon to send mail ++##

      + ##
      + gen_tunable(httpd_can_sendmail, false) + + ## +-##

      +-## Determine whether httpd can communicate +-## with avahi service via dbus. +-##

      ++##

      ++## Allow Apache to communicate with avahi service via dbus ++##

      + ##
      + gen_tunable(httpd_dbus_avahi, false) + + ## +-##

      +-## Determine wether httpd can use support. +-##

      ++##

      ++## Allow Apache to communicate with sssd service via dbus ++##

      + ##
      +-gen_tunable(httpd_enable_cgi, false) ++gen_tunable(httpd_dbus_sssd, false) + + ## +-##

      +-## Determine whether httpd can act as a +-## FTP server by listening on the ftp port. +-##

      ++##

      ++## Allow httpd cgi support ++##

      + ##
      +-gen_tunable(httpd_enable_ftp_server, false) ++gen_tunable(httpd_enable_cgi, false) + + ## +-##

      +-## Determine whether httpd can traverse +-## user home directories. +-##

      ++##

      ++## Allow httpd to act as a FTP server by ++## listening on the ftp port. ++##

      + ##
      +-gen_tunable(httpd_enable_homedirs, false) ++gen_tunable(httpd_enable_ftp_server, false) + + ## +-##

      +-## Determine whether httpd gpg can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      ++##

      ++## Allow httpd to act as a FTP client ++## connecting to the ftp port and ephemeral ports ++##

      + ##
      +-gen_tunable(httpd_gpg_anon_write, false) ++gen_tunable(httpd_can_connect_ftp, false) + + ## +-##

      +-## Determine whether httpd can execute +-## its temporary content. +-##

      ++##

      ++## Allow httpd to connect to the ldap port ++##

      + ##
      +-gen_tunable(httpd_tmp_exec, false) ++gen_tunable(httpd_can_connect_ldap, false) + + ## +-##

      +-## Determine whether httpd scripts and +-## modules can use execmem and execstack. +-##

      ++##

      ++## Allow httpd to read home directories ++##

      + ##
      +-gen_tunable(httpd_execmem, false) ++gen_tunable(httpd_enable_homedirs, false) + + ## +-##

      +-## Determine whether httpd can connect +-## to port 80 for graceful shutdown. +-##

      ++##

      ++## Allow httpd to read user content ++##

      + ##
      +-gen_tunable(httpd_graceful_shutdown, false) ++gen_tunable(httpd_read_user_content, false) + + ## +-##

      +-## Determine whether httpd can +-## manage IPA content files. +-##

      ++##

      ++## Allow Apache to run in stickshift mode, not transition to passenger ++##

      + ##
      +-gen_tunable(httpd_manage_ipa, false) ++gen_tunable(httpd_run_stickshift, false) ++ + + ## +-##

      +-## Determine whether httpd can use mod_auth_ntlm_winbind. +-##

      ++##

      ++## Allow Apache to run preupgrade ++##

      + ##
      +-gen_tunable(httpd_mod_auth_ntlm_winbind, false) ++gen_tunable(httpd_run_preupgrade, false) + + ## +-##

      +-## Determine whether httpd can read +-## generic user home content files. +-##

      ++##

      ++## Allow Apache to query NS records ++##

      + ##
      +-gen_tunable(httpd_read_user_content, false) ++gen_tunable(httpd_verify_dns, false) + + ## +-##

      +-## Determine whether httpd can change +-## its resource limits. +-##

      ++##

      ++## Allow httpd daemon to change its resource limits ++##

      + ##
      + gen_tunable(httpd_setrlimit, false) + + ## +-##

      +-## Determine whether httpd can run +-## SSI executables in the same domain +-## as system CGI scripts. +-##

      ++##

      ++## Allow HTTPD to run SSI executables in the same domain as system CGI scripts. ++##

      + ##
      + gen_tunable(httpd_ssi_exec, false) + + ## +-##

      +-## Determine whether httpd can communicate +-## with the terminal. Needed for entering the +-## passphrase for certificates at the terminal. +-##

      ++##

      ++## Allow Apache to execute tmp content. ++##

      ++##
      ++gen_tunable(httpd_tmp_exec, false) ++ ++## ++##

      ++## Unify HTTPD to communicate with the terminal. ++## Needed for entering the passphrase for certificates at ++## the terminal. ++##

      + ##
      + gen_tunable(httpd_tty_comm, false) + + ## +-##

      +-## Determine whether httpd can have full access +-## to its content types. +-##

      ++##

      ++## Unify HTTPD handling of all content files. ++##

      + ##
      + gen_tunable(httpd_unified, false) + + ## +-##

      +-## Determine whether httpd can use +-## cifs file systems. +-##

      ++##

      ++## Allow httpd to access openstack ports ++##

      ++##
      ++gen_tunable(httpd_use_openstack, false) ++ ++## ++##

      ++## Allow httpd to access cifs file systems ++##

      + ##
      + gen_tunable(httpd_use_cifs, false) + + ## + ##

      +-## Determine whether httpd can +-## use fuse file systems. ++## Allow httpd to access FUSE file systems + ##

      + ##
      + gen_tunable(httpd_use_fusefs, false) + + ## +-##

      +-## Determine whether httpd can use gpg. +-##

      ++##

      ++## Allow httpd to run gpg ++##

      + ##
      + gen_tunable(httpd_use_gpg, false) + + ## +-##

      +-## Determine whether httpd can use +-## nfs file systems. +-##

      ++##

      ++## Allow httpd to connect to sasl ++##

      ++##
      ++gen_tunable(httpd_use_sasl, false) ++ ++## ++##

      ++## Allow httpd to access nfs file systems ++##

      + ##
      + gen_tunable(httpd_use_nfs, false) + ++## ++##

      ++## Allow apache scripts to write to public content, directories/files must be labeled public_rw_content_t. ++##

      ++##
      ++gen_tunable(httpd_sys_script_anon_write, false) ++ + attribute httpdcontent; +-attribute httpd_htaccess_type; ++attribute httpd_user_content_type; ++attribute httpd_content_type; + +-# domains that can exec all scripts ++# domains that can exec all users scripts + attribute httpd_exec_scripts; + ++attribute httpd_script_type; + attribute httpd_script_exec_type; ++attribute httpd_user_script_exec_type; + +-# all script domains ++# user script domains + attribute httpd_script_domains; + +-attribute_role httpd_helper_roles; +-roleattribute system_r httpd_helper_roles; +- + type httpd_t; + type httpd_exec_t; ++ifdef(`distro_redhat',` ++ typealias httpd_t alias phpfpm_t; ++ typealias httpd_exec_t alias phpfpm_exec_t; ++') + init_daemon_domain(httpd_t, httpd_exec_t) ++role system_r types httpd_t; + ++# httpd_cache_t is the type given to the /var/cache/httpd ++# directory and the files under that directory + type httpd_cache_t; + files_type(httpd_cache_t) + ++# httpd_config_t is the type given to the configuration files + type httpd_config_t; + files_config_file(httpd_config_t) + + type httpd_helper_t; + type httpd_helper_exec_t; +-application_domain(httpd_helper_t, httpd_helper_exec_t) +-role httpd_helper_roles types httpd_helper_t; ++domain_type(httpd_helper_t) ++domain_entry_file(httpd_helper_t, httpd_helper_exec_t) ++role system_r types httpd_helper_t; + + type httpd_initrc_exec_t; + init_script_file(httpd_initrc_exec_t) +@@ -286,15 +352,35 @@ init_script_file(httpd_initrc_exec_t) + type httpd_keytab_t; + files_type(httpd_keytab_t) + ++type httpd_unit_file_t; ++ifdef(`distro_redhat',` ++ typealias httpd_unit_file_t alias phpfpm_unit_file_t; ++') ++systemd_unit_file(httpd_unit_file_t) ++ + type httpd_lock_t; + files_lock_file(httpd_lock_t) + + type httpd_log_t; ++ifdef(`distro_redhat',` ++ typealias httpd_log_t alias phpfpm_log_t; ++') + logging_log_file(httpd_log_t) + ++# httpd_modules_t is the type given to module files (libraries) ++# that come with Apache /etc/httpd/modules and /usr/lib/apache + type httpd_modules_t; + files_type(httpd_modules_t) + ++type httpd_php_t; ++type httpd_php_exec_t; ++domain_type(httpd_php_t) ++domain_entry_file(httpd_php_t, httpd_php_exec_t) ++role system_r types httpd_php_t; ++ ++type httpd_php_tmp_t; ++files_tmp_file(httpd_php_tmp_t) ++ + type httpd_rotatelogs_t; + type httpd_rotatelogs_exec_t; + init_daemon_domain(httpd_rotatelogs_t, httpd_rotatelogs_exec_t) +@@ -302,10 +388,8 @@ init_daemon_domain(httpd_rotatelogs_t, httpd_rotatelogs_exec_t) + type httpd_squirrelmail_t; + files_type(httpd_squirrelmail_t) + +-type squirrelmail_spool_t; +-files_tmp_file(squirrelmail_spool_t) +- +-type httpd_suexec_t; ++# SUEXEC runs user scripts as their own user ID ++type httpd_suexec_t; #, daemon; + type httpd_suexec_exec_t; + domain_type(httpd_suexec_t) + domain_entry_file(httpd_suexec_t, httpd_suexec_exec_t) +@@ -314,9 +398,19 @@ role system_r types httpd_suexec_t; + type httpd_suexec_tmp_t; + files_tmp_file(httpd_suexec_tmp_t) + +-apache_content_template(sys) +-corecmd_shell_entry_type(httpd_sys_script_t) +-typealias httpd_sys_content_t alias ntop_http_content_t; ++# setup the system domain for system CGI scripts ++apache_content_template(httpd_sys) ++ ++typeattribute httpd_sys_content_t httpdcontent; # customizable ++typeattribute httpd_sys_rw_content_t httpdcontent; # customizable ++typeattribute httpd_sys_ra_content_t httpdcontent; # customizable ++ ++# Removal of fastcgi, will cause problems without the following ++typealias httpd_sys_script_exec_t alias httpd_fastcgi_script_exec_t; ++typealias httpd_sys_content_t alias { httpd_fastcgi_content_t httpd_fastcgi_script_ro_t }; ++typealias httpd_sys_rw_content_t alias { httpd_fastcgi_rw_content_t httpd_fastcgi_script_rw_t }; ++typealias httpd_sys_ra_content_t alias httpd_fastcgi_script_ra_t; ++typealias httpd_sys_script_t alias httpd_fastcgi_script_t; + + type httpd_tmp_t; + files_tmp_file(httpd_tmp_t) +@@ -324,14 +418,16 @@ files_tmp_file(httpd_tmp_t) + type httpd_tmpfs_t; + files_tmpfs_file(httpd_tmpfs_t) + +-apache_content_template(user) ++apache_user_content_template(httpd_user) + ubac_constrained(httpd_user_script_t) +-userdom_user_home_content(httpd_user_content_t) +-userdom_user_home_content(httpd_user_htaccess_t) +-userdom_user_home_content(httpd_user_script_exec_t) +-userdom_user_home_content(httpd_user_ra_content_t) +-userdom_user_home_content(httpd_user_rw_content_t) ++ ++typeattribute httpd_user_content_t httpdcontent; ++typeattribute httpd_user_rw_content_t httpdcontent; ++typeattribute httpd_user_ra_content_t httpdcontent; ++ ++typeattribute httpd_user_script_t httpd_script_domains; + typealias httpd_user_content_t alias { httpd_staff_content_t httpd_sysadm_content_t }; ++typealias httpd_user_content_t alias httpd_unconfined_content_t; + typealias httpd_user_content_t alias { httpd_auditadm_content_t httpd_secadm_content_t }; + typealias httpd_user_content_t alias { httpd_staff_script_ro_t httpd_sysadm_script_ro_t }; + typealias httpd_user_content_t alias { httpd_auditadm_script_ro_t httpd_secadm_script_ro_t }; +@@ -346,33 +442,40 @@ typealias httpd_user_rw_content_t alias { httpd_auditadm_script_rw_t httpd_secad + typealias httpd_user_ra_content_t alias { httpd_staff_script_ra_t httpd_sysadm_script_ra_t }; + typealias httpd_user_ra_content_t alias { httpd_auditadm_script_ra_t httpd_secadm_script_ra_t }; + ++# for apache2 memory mapped files + type httpd_var_lib_t; + files_type(httpd_var_lib_t) + + type httpd_var_run_t; ++ifdef(`distro_redhat',` ++ typealias httpd_var_run_t alias phpfpm_var_run_t; ++') + files_pid_file(httpd_var_run_t) + +-type httpd_passwd_t; +-type httpd_passwd_exec_t; +-domain_type(httpd_passwd_t) +-domain_entry_file(httpd_passwd_t, httpd_passwd_exec_t) +-role system_r types httpd_passwd_t; ++# Removal of fastcgi, will cause problems without the following ++typealias httpd_var_run_t alias httpd_fastcgi_var_run_t; + +-type httpd_gpg_t; +-domain_type(httpd_gpg_t) +-role system_r types httpd_gpg_t; ++# File Type of squirrelmail attachments ++type squirrelmail_spool_t; ++files_tmp_file(squirrelmail_spool_t) ++files_spool_file(squirrelmail_spool_t) + + optional_policy(` + prelink_object_file(httpd_modules_t) + ') + ++type httpd_passwd_t; ++type httpd_passwd_exec_t; ++application_domain(httpd_passwd_t, httpd_passwd_exec_t) ++role system_r types httpd_passwd_t; ++ + ######################################## + # +-# Local policy ++# Apache server local policy + # + +-allow httpd_t self:capability { chown dac_override kill setgid setuid sys_nice sys_tty_config }; +-dontaudit httpd_t self:capability net_admin; ++allow httpd_t self:capability { chown dac_read_search dac_override kill setgid setuid sys_nice sys_tty_config sys_chroot }; ++dontaudit httpd_t self:capability { net_admin sys_tty_config }; + allow httpd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow httpd_t self:fd use; + allow httpd_t self:sock_file read_sock_file_perms; +@@ -381,30 +484,41 @@ allow httpd_t self:shm create_shm_perms; + allow httpd_t self:sem create_sem_perms; + allow httpd_t self:msgq create_msgq_perms; + allow httpd_t self:msg { send receive }; +-allow httpd_t self:unix_dgram_socket sendto; +-allow httpd_t self:unix_stream_socket { accept connectto listen }; +-allow httpd_t self:tcp_socket { accept listen }; ++allow httpd_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow httpd_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow httpd_t self:tcp_socket create_stream_socket_perms; ++allow httpd_t self:udp_socket create_socket_perms; ++dontaudit httpd_t self:netlink_audit_socket create_socket_perms; + ++# Allow httpd_t to put files in /var/cache/httpd etc + manage_dirs_pattern(httpd_t, httpd_cache_t, httpd_cache_t) + manage_files_pattern(httpd_t, httpd_cache_t, httpd_cache_t) + manage_lnk_files_pattern(httpd_t, httpd_cache_t, httpd_cache_t) +-files_var_filetrans(httpd_t, httpd_cache_t, dir) ++files_var_filetrans(httpd_t, httpd_cache_t, { file dir }) ++allow httpd_t httpd_cache_t:file map; + ++# Allow the httpd_t to read the web servers config files + allow httpd_t httpd_config_t:dir list_dir_perms; + read_files_pattern(httpd_t, httpd_config_t, httpd_config_t) + read_lnk_files_pattern(httpd_t, httpd_config_t, httpd_config_t) ++allow httpd_t httpd_config_t:file map; ++ ++can_exec(httpd_t, httpd_exec_t) + + allow httpd_t httpd_keytab_t:file read_file_perms; + + allow httpd_t httpd_lock_t:file manage_file_perms; + files_lock_filetrans(httpd_t, httpd_lock_t, file) + +-allow httpd_t httpd_log_t:dir setattr_dir_perms; ++allow httpd_t httpd_log_t:dir setattr; + create_dirs_pattern(httpd_t, httpd_log_t, httpd_log_t) + create_files_pattern(httpd_t, httpd_log_t, httpd_log_t) + append_files_pattern(httpd_t, httpd_log_t, httpd_log_t) ++setattr_files_pattern(httpd_t, httpd_log_t, httpd_log_t) + read_files_pattern(httpd_t, httpd_log_t, httpd_log_t) + read_lnk_files_pattern(httpd_t, httpd_log_t, httpd_log_t) ++# cjp: need to refine create interfaces to ++# cut this back to add_name only + logging_log_filetrans(httpd_t, httpd_log_t, file) + + allow httpd_t httpd_modules_t:dir list_dir_perms; +@@ -412,13 +526,22 @@ mmap_files_pattern(httpd_t, httpd_modules_t, httpd_modules_t) + read_files_pattern(httpd_t, httpd_modules_t, httpd_modules_t) + read_lnk_files_pattern(httpd_t, httpd_modules_t, httpd_modules_t) + ++apache_domtrans_rotatelogs(httpd_t) ++# Apache-httpd needs to be able to send signals to the log rotate procs. + allow httpd_t httpd_rotatelogs_t:process signal_perms; + + manage_dirs_pattern(httpd_t, httpd_squirrelmail_t, httpd_squirrelmail_t) + manage_files_pattern(httpd_t, httpd_squirrelmail_t, httpd_squirrelmail_t) + manage_lnk_files_pattern(httpd_t, httpd_squirrelmail_t, httpd_squirrelmail_t) ++allow httpd_t httpd_squirrelmail_t:file map; ++ ++allow httpd_t httpd_suexec_t:process { signal signull }; ++allow httpd_t httpd_suexec_t:file read_file_perms; + +-allow httpd_t httpd_suexec_exec_t:file read_file_perms; ++allow httpd_t httpd_sys_content_t:dir list_dir_perms; ++read_files_pattern(httpd_t, httpd_sys_content_t, httpd_sys_content_t) ++read_lnk_files_pattern(httpd_t, httpd_sys_content_t, httpd_sys_content_t) ++allow httpd_t httpd_sys_content_t:file map; + + allow httpd_t httpd_sys_script_t:unix_stream_socket connectto; + +@@ -428,6 +551,7 @@ manage_sock_files_pattern(httpd_t, httpd_tmp_t, httpd_tmp_t) + manage_lnk_files_pattern(httpd_t, httpd_tmp_t, httpd_tmp_t) + files_tmp_filetrans(httpd_t, httpd_tmp_t, { file dir lnk_file sock_file }) + userdom_user_tmp_filetrans(httpd_t, httpd_tmp_t, dir) ++allow httpd_t httpd_tmp_t:file map; + + manage_dirs_pattern(httpd_t, httpd_tmpfs_t, httpd_tmpfs_t) + manage_files_pattern(httpd_t, httpd_tmpfs_t, httpd_tmpfs_t) +@@ -435,9 +559,11 @@ manage_lnk_files_pattern(httpd_t, httpd_tmpfs_t, httpd_tmpfs_t) + manage_fifo_files_pattern(httpd_t, httpd_tmpfs_t, httpd_tmpfs_t) + manage_sock_files_pattern(httpd_t, httpd_tmpfs_t, httpd_tmpfs_t) + fs_tmpfs_filetrans(httpd_t, httpd_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++allow httpd_t httpd_tmpfs_t:file map; + + manage_dirs_pattern(httpd_t, httpd_var_lib_t, httpd_var_lib_t) + manage_files_pattern(httpd_t, httpd_var_lib_t, httpd_var_lib_t) ++manage_lnk_files_pattern(httpd_t, httpd_var_lib_t, httpd_var_lib_t) + files_var_lib_filetrans(httpd_t, httpd_var_lib_t, { dir file }) + + setattr_dirs_pattern(httpd_t, httpd_var_run_t, httpd_var_run_t) +@@ -450,140 +576,178 @@ manage_dirs_pattern(httpd_t, squirrelmail_spool_t, squirrelmail_spool_t) + manage_files_pattern(httpd_t, squirrelmail_spool_t, squirrelmail_spool_t) + manage_lnk_files_pattern(httpd_t, squirrelmail_spool_t, squirrelmail_spool_t) + +-can_exec(httpd_t, httpd_exec_t) +- +-domtrans_pattern(httpd_t, httpd_helper_exec_t, httpd_helper_t) +-domtrans_pattern(httpd_t, httpd_passwd_exec_t, httpd_passwd_t) +-domtrans_pattern(httpd_t, httpd_rotatelogs_exec_t, httpd_rotatelogs_t) +-domtrans_pattern(httpd_t, httpd_suexec_exec_t, httpd_suexec_t) +- + kernel_read_kernel_sysctls(httpd_t) +-kernel_read_network_state(httpd_t) ++# for modules that want to access /proc/meminfo + kernel_read_system_state(httpd_t) ++kernel_read_network_state(httpd_t) + kernel_search_network_sysctl(httpd_t) + +-corenet_all_recvfrom_unlabeled(httpd_t) + corenet_all_recvfrom_netlabel(httpd_t) + corenet_tcp_sendrecv_generic_if(httpd_t) ++corenet_udp_sendrecv_generic_if(httpd_t) + corenet_tcp_sendrecv_generic_node(httpd_t) ++corenet_udp_sendrecv_generic_node(httpd_t) ++corenet_tcp_sendrecv_all_ports(httpd_t) ++corenet_udp_sendrecv_all_ports(httpd_t) + corenet_tcp_bind_generic_node(httpd_t) +- +-corenet_sendrecv_http_server_packets(httpd_t) ++corenet_udp_bind_generic_node(httpd_t) + corenet_tcp_bind_http_port(httpd_t) +-corenet_tcp_sendrecv_http_port(httpd_t) +- +-corenet_sendrecv_http_cache_server_packets(httpd_t) ++corenet_udp_bind_http_port(httpd_t) + corenet_tcp_bind_http_cache_port(httpd_t) +-corenet_tcp_sendrecv_http_cache_port(httpd_t) +- +-corecmd_exec_bin(httpd_t) +-corecmd_exec_shell(httpd_t) ++corenet_tcp_bind_ntop_port(httpd_t) ++corenet_tcp_bind_jboss_management_port(httpd_t) ++corenet_tcp_bind_jboss_messaging_port(httpd_t) ++corenet_sendrecv_http_server_packets(httpd_t) ++corenet_tcp_bind_puppet_port(httpd_t) ++# Signal self for shutdown ++tunable_policy(`httpd_graceful_shutdown',` ++ corenet_tcp_connect_http_port(httpd_t) ++') + + dev_read_sysfs(httpd_t) + dev_read_rand(httpd_t) + dev_read_urand(httpd_t) + dev_rw_crypto(httpd_t) + +-domain_use_interactive_fds(httpd_t) +- + fs_getattr_all_fs(httpd_t) + fs_search_auto_mountpoints(httpd_t) +- +-fs_getattr_all_fs(httpd_t) +-fs_read_anon_inodefs_files(httpd_t) + fs_read_iso9660_files(httpd_t) +-fs_search_auto_mountpoints(httpd_t) ++fs_rw_anon_inodefs_files(httpd_t) ++fs_rw_hugetlbfs_files(httpd_t) ++fs_exec_hugetlbfs_files(httpd_t) ++ ++auth_use_nsswitch(httpd_t) ++ ++application_exec_all(httpd_t) ++ ++# execute perl ++corecmd_exec_bin(httpd_t) ++corecmd_exec_shell(httpd_t) ++ ++domain_use_interactive_fds(httpd_t) ++domain_dontaudit_read_all_domains_state(httpd_t) + ++files_dontaudit_search_all_pids(httpd_t) + files_dontaudit_getattr_all_pids(httpd_t) +-files_read_usr_files(httpd_t) ++files_exec_usr_files(httpd_t) + files_list_mnt(httpd_t) ++files_read_mnt_symlinks(httpd_t) ++files_search_all(httpd_t) + files_search_spool(httpd_t) + files_read_var_symlinks(httpd_t) + files_read_var_lib_files(httpd_t) + files_search_home(httpd_t) + files_getattr_home_dir(httpd_t) ++# for modules that want to access /etc/mtab + files_read_etc_runtime_files(httpd_t) ++# Allow httpd_t to have access to files such as nisswitch.conf ++# for tomcat + files_read_var_lib_symlinks(httpd_t) + +-auth_use_nsswitch(httpd_t) ++fs_search_auto_mountpoints(httpd_sys_script_t) ++# php uploads a file to /tmp and then execs programs to acton them ++manage_dirs_pattern(httpd_sys_script_t, httpd_tmp_t, httpd_tmp_t) ++manage_files_pattern(httpd_sys_script_t, httpd_tmp_t, httpd_tmp_t) ++manage_sock_files_pattern(httpd_sys_script_t, httpd_tmp_t, httpd_tmp_t) ++manage_fifo_files_pattern(httpd_sys_script_t, httpd_tmp_t, httpd_tmp_t) ++manage_lnk_files_pattern(httpd_sys_script_t, httpd_tmp_t, httpd_tmp_t) ++files_tmp_filetrans(httpd_sys_script_t, httpd_sys_rw_content_t, { dir file lnk_file sock_file fifo_file }) + + libs_read_lib_files(httpd_t) + ++ifdef(`hide_broken_symptoms',` ++ libs_exec_lib_files(httpd_t) ++') ++ + logging_send_syslog_msg(httpd_t) + +-miscfiles_read_localization(httpd_t) ++init_dontaudit_read_utmp(httpd_t) ++ + miscfiles_read_fonts(httpd_t) + miscfiles_read_public_files(httpd_t) + miscfiles_read_generic_certs(httpd_t) ++miscfiles_map_generic_certs(httpd_t) + miscfiles_read_tetex_data(httpd_t) +- +-seutil_dontaudit_search_config(httpd_t) ++miscfiles_dontaudit_access_check_cert(httpd_t) + + userdom_use_unpriv_users_fds(httpd_t) ++userdom_rw_inherited_user_tmp_files(httpd_t) ++userdom_map_tmp_files(httpd_t) + +-ifdef(`TODO',` +- tunable_policy(`allow_httpd_mod_auth_pam',` +- auth_domtrans_chk_passwd(httpd_t) ++tunable_policy(`httpd_setrlimit',` ++ allow httpd_t self:process setrlimit; ++ allow httpd_t self:capability sys_resource; ++') + +- logging_send_audit_msgs(httpd_t) +- ') ++tunable_policy(`httpd_anon_write',` ++ miscfiles_manage_public_files(httpd_t) + ') + +-ifdef(`hide_broken_symptoms',` +- libs_exec_lib_files(httpd_t) ++tunable_policy(`httpd_dontaudit_search_dirs',` ++ files_dontaudit_search_non_security_dirs(httpd_t) + ') + +-tunable_policy(`allow_httpd_anon_write',` +- miscfiles_manage_public_files(httpd_t) ++# ++# We need optionals to be able to be within booleans to make this work ++# ++tunable_policy(`httpd_mod_auth_pam',` ++ auth_domtrans_chkpwd(httpd_t) ++ logging_send_audit_msgs(httpd_t) ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_mod_auth_ntlm_winbind',` ++ samba_domtrans_winbind_helper(httpd_t) ++ ') + ') + + tunable_policy(`httpd_can_network_connect',` +- corenet_sendrecv_all_client_packets(httpd_t) + corenet_tcp_connect_all_ports(httpd_t) +- corenet_tcp_sendrecv_all_ports(httpd_t) + ') + + tunable_policy(`httpd_can_network_connect_db',` +- corenet_sendrecv_gds_db_client_packets(httpd_t) + corenet_tcp_connect_gds_db_port(httpd_t) +- corenet_tcp_sendrecv_gds_db_port(httpd_t) +- corenet_sendrecv_mssql_client_packets(httpd_t) + corenet_tcp_connect_mssql_port(httpd_t) +- corenet_tcp_sendrecv_mssql_port(httpd_t) +- corenet_sendrecv_oracledb_client_packets(httpd_t) +- corenet_tcp_connect_oracledb_port(httpd_t) +- corenet_tcp_sendrecv_oracledb_port(httpd_t) ++ corenet_tcp_connect_mongod_port(httpd_t) ++ corenet_sendrecv_mssql_client_packets(httpd_t) ++ corenet_tcp_connect_oracle_port(httpd_t) ++ corenet_sendrecv_oracle_client_packets(httpd_t) ++') ++ ++tunable_policy(`httpd_can_network_memcache',` ++ corenet_tcp_connect_memcache_port(httpd_t) + ') + + tunable_policy(`httpd_can_network_relay',` +- corenet_sendrecv_gopher_client_packets(httpd_t) ++ # allow httpd to work as a relay + corenet_tcp_connect_gopher_port(httpd_t) +- corenet_tcp_sendrecv_gopher_port(httpd_t) +- corenet_sendrecv_ftp_client_packets(httpd_t) + corenet_tcp_connect_ftp_port(httpd_t) +- corenet_tcp_sendrecv_ftp_port(httpd_t) +- corenet_sendrecv_http_client_packets(httpd_t) + corenet_tcp_connect_http_port(httpd_t) +- corenet_tcp_sendrecv_http_port(httpd_t) +- corenet_sendrecv_http_cache_client_packets(httpd_t) + corenet_tcp_connect_http_cache_port(httpd_t) +- corenet_tcp_sendrecv_http_cache_port(httpd_t) +- corenet_sendrecv_squid_client_packets(httpd_t) + corenet_tcp_connect_squid_port(httpd_t) +- corenet_tcp_sendrecv_squid_port(httpd_t) ++ corenet_tcp_connect_memcache_port(httpd_t) ++ corenet_sendrecv_gopher_client_packets(httpd_t) ++ corenet_sendrecv_ftp_client_packets(httpd_t) ++ corenet_sendrecv_http_client_packets(httpd_t) ++ corenet_sendrecv_http_cache_client_packets(httpd_t) ++ corenet_sendrecv_squid_client_packets(httpd_t) ++ corenet_tcp_connect_all_ephemeral_ports(httpd_t) + ') + +-tunable_policy(`httpd_builtin_scripting',` +- exec_files_pattern(httpd_t, httpd_script_exec_type, httpd_script_exec_type) ++tunable_policy(`httpd_execmem',` ++ allow httpd_t self:process { execmem execstack }; ++ allow httpd_sys_script_t self:process { execmem execstack }; ++ allow httpd_suexec_t self:process { execmem execstack }; ++') + +- allow httpd_t httpdcontent:dir list_dir_perms; +- allow httpd_t httpdcontent:file read_file_perms; +- allow httpd_t httpdcontent:lnk_file read_lnk_file_perms; ++tunable_policy(`httpd_enable_cgi && httpd_unified',` ++ allow httpd_sys_script_t httpd_sys_content_t:file entrypoint; ++ filetrans_pattern(httpd_sys_script_t, httpd_sys_content_t, httpd_sys_rw_content_t, { file dir lnk_file }) ++ can_exec(httpd_sys_script_t, httpd_sys_content_t) + ') + +-tunable_policy(`httpd_enable_cgi',` +- allow httpd_t httpd_script_domains:process { signal sigkill sigstop }; +- allow httpd_t httpd_script_exec_type:dir list_dir_perms; ++tunable_policy(`httpd_sys_script_anon_write',` ++ miscfiles_manage_public_files(httpd_sys_script_t) + ') + + tunable_policy(`httpd_enable_cgi && httpd_use_nfs',` +@@ -594,28 +758,50 @@ tunable_policy(`httpd_enable_cgi && httpd_use_cifs',` + fs_cifs_domtrans(httpd_t, httpd_sys_script_t) + ') + +-# tunable_policy(`httpd_enable_cgi && httpd_use_fusefs',` +-# fs_fusefs_domtrans(httpd_t, httpd_sys_script_t) +-# ') ++tunable_policy(`httpd_enable_cgi && httpd_use_fusefs',` ++ fs_fusefs_domtrans(httpd_t, httpd_sys_script_t) ++') + + tunable_policy(`httpd_enable_cgi && httpd_unified && httpd_builtin_scripting',` + domtrans_pattern(httpd_t, httpdcontent, httpd_sys_script_t) ++ filetrans_pattern(httpd_t, httpd_sys_content_t, httpd_sys_rw_content_t, { file dir lnk_file }) ++ manage_dirs_pattern(httpd_t, httpdcontent, httpd_sys_rw_content_t) ++ manage_files_pattern(httpd_t, httpdcontent, httpd_sys_rw_content_t) ++ manage_lnk_files_pattern(httpd_t, httpdcontent, httpd_sys_rw_content_t) + + manage_dirs_pattern(httpd_t, httpdcontent, httpdcontent) + manage_files_pattern(httpd_t, httpdcontent, httpdcontent) +- manage_fifo_files_pattern(httpd_t, httpdcontent, httpdcontent) + manage_lnk_files_pattern(httpd_t, httpdcontent, httpdcontent) +- manage_sock_files_pattern(httpd_t, httpdcontent, httpdcontent) ++') ++ ++tunable_policy(`httpd_can_connect_ftp',` ++ corenet_tcp_connect_ftp_port(httpd_t) ++ corenet_tcp_connect_all_ephemeral_ports(httpd_t) ++') ++ ++tunable_policy(`httpd_can_connect_ldap',` ++ corenet_tcp_connect_ldap_port(httpd_t) ++') ++ ++tunable_policy(`httpd_can_connect_mythtv',` ++ corenet_tcp_connect_mythtv_port(httpd_t) ++') ++ ++tunable_policy(`httpd_can_connect_zabbix',` ++ corenet_tcp_connect_zabbix_port(httpd_t) + ') + + tunable_policy(`httpd_enable_ftp_server',` +- corenet_sendrecv_ftp_server_packets(httpd_t) + corenet_tcp_bind_ftp_port(httpd_t) +- corenet_tcp_sendrecv_ftp_port(httpd_t) ++ corenet_tcp_bind_all_ephemeral_ports(httpd_t) + ') + +-tunable_policy(`httpd_enable_homedirs',` +- userdom_search_user_home_dirs(httpd_t) ++tunable_policy(`httpd_tmp_exec && httpd_builtin_scripting',` ++ can_exec(httpd_t, httpd_tmp_t) ++') ++ ++tunable_policy(`httpd_tmp_exec && httpd_enable_cgi',` ++ can_exec(httpd_sys_script_t, httpd_tmp_t) + ') + + tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs',` +@@ -624,68 +810,56 @@ tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs',` + fs_read_nfs_symlinks(httpd_t) + ') + +-tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs && httpd_builtin_scripting',` +- fs_exec_nfs_files(httpd_t) ++tunable_policy(`httpd_use_nfs',` ++ fs_list_auto_mountpoints(httpd_t) ++ fs_manage_nfs_dirs(httpd_t) ++ fs_manage_nfs_files(httpd_t) ++ fs_manage_nfs_symlinks(httpd_t) ++') ++ ++ ++optional_policy(` ++ tunable_policy(`httpd_use_nfs',` ++ automount_search_tmp_dirs(httpd_t) ++ ') + ') + + tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs',` +- fs_list_auto_mountpoints(httpd_t) + fs_read_cifs_files(httpd_t) + fs_read_cifs_symlinks(httpd_t) + ') + +-tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs && httpd_builtin_scripting',` +- fs_exec_cifs_files(httpd_t) ++tunable_policy(`httpd_can_sendmail',` ++ # allow httpd to connect to mail servers ++ corenet_tcp_connect_smtp_port(httpd_t) ++ corenet_sendrecv_smtp_client_packets(httpd_t) ++ corenet_tcp_connect_pop_port(httpd_t) ++ corenet_sendrecv_pop_client_packets(httpd_t) + ') + +-tunable_policy(`httpd_execmem',` +- allow httpd_t self:process { execmem execstack }; +-') +- +-tunable_policy(`httpd_can_sendmail',` +- corenet_sendrecv_smtp_client_packets(httpd_t) +- corenet_tcp_connect_smtp_port(httpd_t) +- corenet_tcp_sendrecv_smtp_port(httpd_t) +- corenet_sendrecv_pop_client_packets(httpd_t) +- corenet_tcp_connect_pop_port(httpd_t) +- corenet_tcp_sendrecv_pop_port(httpd_t) +- +- mta_send_mail(httpd_t) +- mta_signal_system_mail(httpd_t) ++optional_policy(` ++ tunable_policy(`httpd_can_sendmail',` ++ mta_send_mail(httpd_t) ++ mta_signal_system_mail(httpd_t) ++ ') + ') + + optional_policy(` +- tunable_policy(`httpd_can_network_connect_zabbix',` +- zabbix_tcp_connect(httpd_t) +- ') ++ tunable_policy(`httpd_can_sendmail',` ++ postfix_rw_spool_maildrop_files(httpd_t) ++ ') + ') + +-optional_policy(` +- tunable_policy(`httpd_can_sendmail && httpd_can_check_spam',` +- spamassassin_domtrans_client(httpd_t) +- ') +-') +- +-tunable_policy(`httpd_graceful_shutdown',` +- corenet_sendrecv_http_client_packets(httpd_t) +- corenet_tcp_connect_http_port(httpd_t) +- corenet_tcp_sendrecv_http_port(httpd_t) +-') +- +-optional_policy(` +- tunable_policy(`httpd_enable_cgi && httpd_use_gpg',` +- gpg_spec_domtrans(httpd_t, httpd_gpg_t) +- ') +-') +- +-optional_policy(` +- tunable_policy(`httpd_mod_auth_ntlm_winbind',` +- samba_domtrans_winbind_helper(httpd_t) +- ') ++tunable_policy(`httpd_use_cifs',` ++ fs_manage_cifs_dirs(httpd_t) ++ fs_manage_cifs_files(httpd_t) ++ fs_manage_cifs_symlinks(httpd_t) + ') + +-tunable_policy(`httpd_read_user_content',` +- userdom_read_user_home_content_files(httpd_t) ++tunable_policy(`httpd_use_fusefs',` ++ fs_manage_fusefs_dirs(httpd_t) ++ fs_manage_fusefs_files(httpd_t) ++ fs_manage_fusefs_symlinks(httpd_t) + ') + + tunable_policy(`httpd_setrlimit',` +@@ -695,49 +869,48 @@ tunable_policy(`httpd_setrlimit',` + + tunable_policy(`httpd_ssi_exec',` + corecmd_shell_domtrans(httpd_t, httpd_sys_script_t) ++ allow httpd_sys_script_t httpd_t:fd use; ++ allow httpd_sys_script_t httpd_t:fifo_file rw_file_perms; ++ allow httpd_sys_script_t httpd_t:process sigchld; + ') + +-tunable_policy(`httpd_tmp_exec && httpd_builtin_scripting',` +- can_exec(httpd_t, httpd_tmp_t) +-') +- ++# When the admin starts the server, the server wants to access ++# the TTY or PTY associated with the session. The httpd appears ++# to run correctly without this permission, so the permission ++# are dontaudited here. + tunable_policy(`httpd_tty_comm',` +- userdom_use_user_terminals(httpd_t) +-',` +- userdom_dontaudit_use_user_terminals(httpd_t) ++ userdom_use_inherited_user_terminals(httpd_t) ++ userdom_use_inherited_user_terminals(httpd_suexec_t) + ') + +-tunable_policy(`httpd_use_cifs',` +- fs_list_auto_mountpoints(httpd_t) +- fs_manage_cifs_dirs(httpd_t) +- fs_manage_cifs_files(httpd_t) +- fs_manage_cifs_symlinks(httpd_t) +-') +- +-tunable_policy(`httpd_use_cifs && httpd_builtin_scripting',` +- fs_exec_cifs_files(httpd_t) +-') ++optional_policy(` ++ cobbler_list_config(httpd_t) ++ cobbler_read_config(httpd_t) + +-tunable_policy(`httpd_use_fusefs',` +- fs_list_auto_mountpoints(httpd_t) +- fs_manage_fusefs_dirs(httpd_t) +- fs_manage_fusefs_files(httpd_t) +- fs_read_fusefs_symlinks(httpd_t) +-') ++ tunable_policy(`httpd_serve_cobbler_files',` ++ cobbler_manage_lib_files(httpd_t) ++',` ++ cobbler_read_lib_files(httpd_t) ++ cobbler_search_lib(httpd_t) ++ ') + +-tunable_policy(`httpd_use_fusefs && httpd_builtin_scripting',` +- fs_exec_fusefs_files(httpd_t) ++ tunable_policy(`httpd_can_network_connect_cobbler',` ++ corenet_tcp_connect_cobbler_port(httpd_t) ++ ') + ') + +-tunable_policy(`httpd_use_nfs',` +- fs_list_auto_mountpoints(httpd_t) +- fs_manage_nfs_dirs(httpd_t) +- fs_manage_nfs_files(httpd_t) +- fs_manage_nfs_symlinks(httpd_t) ++optional_policy(` ++ tunable_policy(`httpd_use_sasl',` ++ sasl_connect(httpd_t) ++ ') + ') + +-tunable_policy(`httpd_use_nfs && httpd_builtin_scripting',` +- fs_exec_nfs_files(httpd_t) ++optional_policy(` ++ # Support for ABRT retrace server ++ # mod_wsgi ++ abrt_manage_spool_retrace(httpd_t) ++ abrt_domtrans_retrace_worker(httpd_t) ++ abrt_read_config(httpd_t) + ') + + optional_policy(` +@@ -749,24 +922,32 @@ optional_policy(` + ') + + optional_policy(` +- clamav_domtrans_clamscan(httpd_t) ++ cron_system_entry(httpd_t, httpd_exec_t) + ') + + optional_policy(` +- cobbler_read_config(httpd_t) +- cobbler_read_lib_files(httpd_t) ++ cvs_read_data(httpd_t) + ') + + optional_policy(` +- cron_system_entry(httpd_t, httpd_exec_t) ++ daemontools_service_domain(httpd_t, httpd_exec_t) + ') + + optional_policy(` +- cvs_read_data(httpd_t) ++ #needed by FreeIPA ++ dirsrv_stream_connect(httpd_t) + ') + + optional_policy(` +- daemontools_service_domain(httpd_t, httpd_exec_t) ++ dirsrv_manage_config(httpd_t) ++ dirsrv_manage_log(httpd_t) ++ dirsrv_manage_var_run(httpd_t) ++ dirsrv_read_share(httpd_t) ++ dirsrv_signal(httpd_t) ++ dirsrv_signull(httpd_t) ++ dirsrvadmin_manage_config(httpd_t) ++ dirsrvadmin_manage_tmp(httpd_t) ++ dirsrvadmin_domtrans_unconfined_script_t(httpd_t) + ') + + optional_policy(` +@@ -775,6 +956,10 @@ optional_policy(` + tunable_policy(`httpd_dbus_avahi',` + avahi_dbus_chat(httpd_t) + ') ++ ++ tunable_policy(`httpd_dbus_sssd',` ++ sssd_dbus_chat(httpd_t) ++ ') + ') + + optional_policy(` +@@ -786,35 +971,62 @@ optional_policy(` + ') + + optional_policy(` +- kerberos_manage_host_rcache(httpd_t) +- kerberos_read_keytab(httpd_t) +- kerberos_tmp_filetrans_host_rcache(httpd_t, file, "HTTP_23") +- kerberos_tmp_filetrans_host_rcache(httpd_t, file, "HTTP_48") +- kerberos_use(httpd_t) ++ tunable_policy(`httpd_enable_cgi && httpd_use_gpg',` ++ gpg_domtrans_web(httpd_t) ++ ') + ') + + optional_policy(` +- ldap_stream_connect(httpd_t) ++ gssproxy_stream_connect(httpd_t) ++') + +- tunable_policy(`httpd_can_network_connect_ldap',` +- ldap_tcp_connect(httpd_t) +- ') ++optional_policy(` ++ ipa_read_lib(httpd_t) ++ ipa_manage_pid_files(httpd_t) ++') ++ ++optional_policy(` ++ mirrormanager_manage_pid_files(httpd_t) ++ mirrormanager_manage_pid_sock_files(httpd_t) ++ mirrormanager_read_lib_files(httpd_t) ++ mirrormanager_read_log(httpd_t) ++') ++ ++optional_policy(` ++ jetty_admin(httpd_t) ++') ++ ++optional_policy(` ++ kerberos_manage_host_rcache(httpd_t) ++ kerberos_read_keytab(httpd_t) ++ kerberos_read_kdc_config(httpd_t) ++ kerberos_tmp_filetrans_host_rcache(httpd_t, "HTTP_23") ++ kerberos_tmp_filetrans_host_rcache(httpd_t, "HTTP_48") ++ kerberos_use(httpd_t) ++') ++ ++optional_policy(` ++ # needed by FreeIPA ++ ldap_stream_connect(httpd_t) ++ ldap_read_certs(httpd_t) + ') + + optional_policy(` + mailman_signal_cgi(httpd_t) + mailman_domtrans_cgi(httpd_t) + mailman_read_data_files(httpd_t) ++ # should have separate types for public and private archives + mailman_search_data(httpd_t) + mailman_read_archive(httpd_t) + ') + + optional_policy(` +- memcached_stream_connect(httpd_t) ++ mediawiki_read_tmp_files(httpd_t) ++ mediawiki_delete_tmp_files(httpd_t) ++') + +- tunable_policy(`httpd_can_network_connect_memcache',` +- memcached_tcp_connect(httpd_t) +- ') ++optional_policy(` ++ memcached_stream_connect(httpd_t) + + tunable_policy(`httpd_manage_ipa',` + memcached_manage_pid_files(httpd_t) +@@ -822,8 +1034,31 @@ optional_policy(` + ') + + optional_policy(` ++ tunable_policy(`httpd_run_ipa',` ++ oddjob_dbus_chat(httpd_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_run_ipa',` ++ ipa_domtrans_helper(httpd_t) ++ ') ++ ipa_cert_filetrans_named_content(httpd_t) ++') ++ ++optional_policy(` ++ munin_read_config(httpd_t) ++') ++ ++optional_policy(` ++ # Allow httpd to work with mysql + mysql_read_config(httpd_t) + mysql_stream_connect(httpd_t) ++ mysql_rw_db_sockets(httpd_t) ++ ++ optional_policy(` ++ postgresql_stream_connect(httpd_t) ++ ') + + tunable_policy(`httpd_can_network_connect_db',` + mysql_tcp_connect(httpd_t) +@@ -832,6 +1067,8 @@ optional_policy(` + + optional_policy(` + nagios_read_config(httpd_t) ++ nagios_read_lib(httpd_t) ++ nagios_read_log(httpd_t) + ') + + optional_policy(` +@@ -841,38 +1078,77 @@ optional_policy(` + openca_kill(httpd_t) + ') + ++optional_policy(` ++ openshift_search_lib(httpd_t) ++ openshift_initrc_signull(httpd_t) ++ openshift_initrc_signal(httpd_t) ++') ++ ++optional_policy(` ++ passenger_exec(httpd_t) ++ passenger_kill(httpd_t) ++ passenger_manage_pid_content(httpd_t) ++') ++ + optional_policy(` + pcscd_read_pid_files(httpd_t) + ') + + optional_policy(` +- postgresql_stream_connect(httpd_t) +- postgresql_unpriv_client(httpd_t) ++ pki_apache_domain_signal(httpd_t) ++ pki_manage_apache_config_files(httpd_t) ++ pki_manage_apache_lib(httpd_t) ++ pki_manage_apache_log_files(httpd_t) ++ pki_manage_apache_run(httpd_t) ++ pki_read_tomcat_cert(httpd_t) ++') + +- tunable_policy(`httpd_can_network_connect_db',` +- postgresql_tcp_connect(httpd_t) +- ') ++optional_policy(` ++ puppet_read_lib(httpd_t) + ') + + optional_policy(` +- puppet_read_lib_files(httpd_t) ++ pwauth_domtrans(httpd_t) ++') ++ ++optional_policy(` ++ realmd_read_var_lib(httpd_t) ++') ++ ++optional_policy(` ++ rpm_dontaudit_read_db(httpd_t) + ') + + optional_policy(` + rpc_search_nfs_state_data(httpd_t) + ') + ++optional_policy(` ++ # Allow httpd to work with postgresql ++ postgresql_stream_connect(httpd_t) ++ postgresql_unpriv_client(httpd_t) ++ ++ tunable_policy(`httpd_can_network_connect_db',` ++ postgresql_tcp_connect(httpd_t) ++ ') ++') ++ + optional_policy(` + seutil_sigchld_newrole(httpd_t) + ') + + optional_policy(` + smokeping_read_lib_files(httpd_t) ++ smokeping_read_pid_files(httpd_t) ++') ++ ++optional_policy(` ++ files_dontaudit_rw_usr_dirs(httpd_t) ++ snmp_dontaudit_manage_snmp_var_lib_files(httpd_t) + ') + + optional_policy(` +- snmp_dontaudit_read_snmp_var_lib_files(httpd_t) +- snmp_dontaudit_write_snmp_var_lib_files(httpd_t) ++ thin_stream_connect(httpd_t) + ') + + optional_policy(` +@@ -883,65 +1159,189 @@ optional_policy(` + yam_read_content(httpd_t) + ') + ++optional_policy(` ++ zarafa_manage_lib_files(httpd_t) ++ zarafa_stream_connect_server(httpd_t) ++ zarafa_search_config(httpd_t) ++') ++ ++optional_policy(` ++ zoneminder_append_log(httpd_t) ++ zoneminder_manage_lib_dirs(httpd_t) ++ zoneminder_manage_lib_files(httpd_t) ++ zoneminder_stream_connect(httpd_t) ++ zoneminder_exec(httpd_t) ++') ++ + ######################################## + # +-# Helper local policy ++# Apache helper local policy + # + +-read_files_pattern(httpd_helper_t, httpd_config_t, httpd_config_t) ++domtrans_pattern(httpd_t, httpd_helper_exec_t, httpd_helper_t) + +-append_files_pattern(httpd_helper_t, httpd_log_t, httpd_log_t) +-read_lnk_files_pattern(httpd_helper_t, httpd_log_t, httpd_log_t) ++allow httpd_helper_t httpd_config_t:file read_file_perms; + +-files_search_etc(httpd_helper_t) ++allow httpd_helper_t httpd_log_t:file append_file_perms; + +-logging_search_logs(httpd_helper_t) + logging_send_syslog_msg(httpd_helper_t) + ++tunable_policy(`httpd_verify_dns',` ++ corenet_udp_bind_all_ephemeral_ports(httpd_t) ++') ++ ++tunable_policy(`httpd_run_stickshift', ` ++ allow httpd_t self:capability { fowner fsetid sys_resource }; ++ dontaudit httpd_t self:capability sys_ptrace; ++ allow httpd_t self:process setexec; ++ ++ files_dontaudit_getattr_all_files(httpd_t) ++ domain_getpgid_all_domains(httpd_t) ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_run_stickshift', ` ++ passenger_manage_lib_files(httpd_t) ++ passenger_getattr_log_files(httpd_t) ++ ',` ++ passenger_domtrans(httpd_t) ++ passenger_read_lib_files(httpd_t) ++ passenger_stream_connect(httpd_t) ++ passenger_manage_tmp_files(httpd_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_run_stickshift', ` ++ oddjob_dbus_chat(httpd_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_run_preupgrade', ` ++ anaconda_manage_lib_files_preupgrade(httpd_t) ++ anaconda_domtrans_preupgrade(httpd_t) ++ ',` ++ anaconda_read_lib_files_preupgrade(httpd_t) ++ anaconda_exec_preupgrade(httpd_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`httpd_run_preupgrade', ` ++ corenet_tcp_bind_preupgrade_port(httpd_t) ++ ') ++') ++ + tunable_policy(`httpd_tty_comm',` +- userdom_use_user_terminals(httpd_helper_t) +-',` +- userdom_dontaudit_use_user_terminals(httpd_helper_t) ++ userdom_use_inherited_user_terminals(httpd_helper_t) + ') + + ######################################## + # +-# Suexec local policy ++# Apache PHP script local policy ++# ++ ++allow httpd_php_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++allow httpd_php_t self:fd use; ++allow httpd_php_t self:fifo_file rw_fifo_file_perms; ++allow httpd_php_t self:sock_file read_sock_file_perms; ++allow httpd_php_t self:unix_dgram_socket create_socket_perms; ++allow httpd_php_t self:unix_stream_socket create_stream_socket_perms; ++allow httpd_php_t self:unix_dgram_socket sendto; ++allow httpd_php_t self:unix_stream_socket connectto; ++allow httpd_php_t self:shm create_shm_perms; ++allow httpd_php_t self:sem create_sem_perms; ++allow httpd_php_t self:msgq create_msgq_perms; ++allow httpd_php_t self:msg { send receive }; ++ ++domtrans_pattern(httpd_t, httpd_php_exec_t, httpd_php_t) ++ ++# allow php to read and append to apache logfiles ++allow httpd_php_t httpd_log_t:file { read_file_perms append_file_perms }; ++ ++manage_dirs_pattern(httpd_php_t, httpd_php_tmp_t, httpd_php_tmp_t) ++manage_files_pattern(httpd_php_t, httpd_php_tmp_t, httpd_php_tmp_t) ++files_tmp_filetrans(httpd_php_t, httpd_php_tmp_t, { file dir }) ++ ++fs_search_auto_mountpoints(httpd_php_t) ++ ++auth_use_nsswitch(httpd_php_t) ++ ++libs_exec_lib_files(httpd_php_t) ++ ++userdom_use_unpriv_users_fds(httpd_php_t) ++ ++tunable_policy(`httpd_can_network_connect_db',` ++ corenet_tcp_connect_gds_db_port(httpd_php_t) ++ corenet_tcp_connect_mssql_port(httpd_php_t) ++ corenet_sendrecv_mssql_client_packets(httpd_php_t) ++ corenet_tcp_connect_oracle_port(httpd_php_t) ++ corenet_sendrecv_oracle_client_packets(httpd_php_t) ++') ++ ++optional_policy(` ++ mysql_stream_connect(httpd_php_t) ++ mysql_rw_db_sockets(httpd_php_t) ++ mysql_read_config(httpd_php_t) ++ ++ tunable_policy(`httpd_can_network_connect_db',` ++ mysql_tcp_connect(httpd_php_t) ++ ') ++') ++ ++optional_policy(` ++ postgresql_stream_connect(httpd_php_t) ++ postgresql_unpriv_client(httpd_php_t) ++ ++ tunable_policy(`httpd_can_network_connect_db',` ++ postgresql_tcp_connect(httpd_php_t) ++ ') ++') ++ ++######################################## ++# ++# Apache suexec local policy + # + + allow httpd_suexec_t self:capability { setuid setgid }; + allow httpd_suexec_t self:process signal_perms; + allow httpd_suexec_t self:fifo_file rw_fifo_file_perms; +-allow httpd_suexec_t self:tcp_socket { accept listen }; +-allow httpd_suexec_t self:unix_stream_socket { accept listen }; ++allow httpd_suexec_t self:unix_stream_socket create_stream_socket_perms; ++ ++domtrans_pattern(httpd_t, httpd_suexec_exec_t, httpd_suexec_t) + + create_files_pattern(httpd_suexec_t, httpd_log_t, httpd_log_t) + append_files_pattern(httpd_suexec_t, httpd_log_t, httpd_log_t) + read_files_pattern(httpd_suexec_t, httpd_log_t, httpd_log_t) +-read_lnk_files_pattern(httpd_suexec_t, httpd_log_t, httpd_log_t) ++ ++allow httpd_suexec_t httpd_t:fifo_file read_fifo_file_perms; + + manage_dirs_pattern(httpd_suexec_t, httpd_suexec_tmp_t, httpd_suexec_tmp_t) + manage_files_pattern(httpd_suexec_t, httpd_suexec_tmp_t, httpd_suexec_tmp_t) + files_tmp_filetrans(httpd_suexec_t, httpd_suexec_tmp_t, { file dir }) + ++can_exec(httpd_suexec_t, httpd_sys_script_exec_t) ++ ++read_files_pattern(httpd_suexec_t, httpd_user_content_t, httpd_user_content_t) ++read_files_pattern(httpd_suexec_t, httpd_user_rw_content_t, httpd_user_rw_content_t) ++read_files_pattern(httpd_suexec_t, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ + kernel_read_kernel_sysctls(httpd_suexec_t) + kernel_list_proc(httpd_suexec_t) + kernel_read_proc_symlinks(httpd_suexec_t) + +-corenet_all_recvfrom_unlabeled(httpd_suexec_t) +-corenet_all_recvfrom_netlabel(httpd_suexec_t) +-corenet_tcp_sendrecv_generic_if(httpd_suexec_t) +-corenet_tcp_sendrecv_generic_node(httpd_suexec_t) +- +-corecmd_exec_bin(httpd_suexec_t) +-corecmd_exec_shell(httpd_suexec_t) +- + dev_read_urand(httpd_suexec_t) + + fs_read_iso9660_files(httpd_suexec_t) + fs_search_auto_mountpoints(httpd_suexec_t) + +-files_read_usr_files(httpd_suexec_t) ++application_exec_all(httpd_suexec_t) ++ ++# for shell scripts ++corecmd_exec_bin(httpd_suexec_t) ++corecmd_exec_shell(httpd_suexec_t) ++ + files_dontaudit_search_pids(httpd_suexec_t) + files_search_home(httpd_suexec_t) + +@@ -950,123 +1350,78 @@ auth_use_nsswitch(httpd_suexec_t) + logging_search_logs(httpd_suexec_t) + logging_send_syslog_msg(httpd_suexec_t) + +-miscfiles_read_localization(httpd_suexec_t) + miscfiles_read_public_files(httpd_suexec_t) + +-tunable_policy(`httpd_builtin_scripting',` +- exec_files_pattern(httpd_suexec_t, httpd_script_exec_type, httpd_script_exec_type) +- +- allow httpd_suexec_t httpdcontent:dir list_dir_perms; +- allow httpd_suexec_t httpdcontent:file read_file_perms; +- allow httpd_suexec_t httpdcontent:lnk_file read_lnk_file_perms; +-') ++corenet_all_recvfrom_netlabel(httpd_suexec_t) + + tunable_policy(`httpd_can_network_connect',` ++ allow httpd_suexec_t self:tcp_socket create_stream_socket_perms; ++ allow httpd_suexec_t self:udp_socket create_socket_perms; ++ ++ corenet_tcp_sendrecv_generic_if(httpd_suexec_t) ++ corenet_udp_sendrecv_generic_if(httpd_suexec_t) ++ corenet_tcp_sendrecv_generic_node(httpd_suexec_t) ++ corenet_udp_sendrecv_generic_node(httpd_suexec_t) ++ corenet_tcp_sendrecv_all_ports(httpd_suexec_t) ++ corenet_udp_sendrecv_all_ports(httpd_suexec_t) + corenet_tcp_connect_all_ports(httpd_suexec_t) + corenet_sendrecv_all_client_packets(httpd_suexec_t) +- corenet_tcp_sendrecv_all_ports(httpd_suexec_t) + ') + + tunable_policy(`httpd_can_network_connect_db',` +- corenet_sendrecv_gds_db_client_packets(httpd_suexec_t) + corenet_tcp_connect_gds_db_port(httpd_suexec_t) +- corenet_tcp_sendrecv_gds_db_port(httpd_suexec_t) +- corenet_sendrecv_mssql_client_packets(httpd_suexec_t) + corenet_tcp_connect_mssql_port(httpd_suexec_t) +- corenet_tcp_sendrecv_mssql_port(httpd_suexec_t) +- corenet_sendrecv_oracledb_client_packets(httpd_suexec_t) +- corenet_tcp_connect_oracledb_port(httpd_suexec_t) +- corenet_tcp_sendrecv_oracledb_port(httpd_suexec_t) ++ corenet_sendrecv_mssql_client_packets(httpd_suexec_t) ++ corenet_tcp_connect_oracle_port(httpd_suexec_t) ++ corenet_sendrecv_oracle_client_packets(httpd_suexec_t) + ') + ++domain_entry_file(httpd_sys_script_t, httpd_sys_content_t) ++ + tunable_policy(`httpd_can_sendmail',` +- corenet_sendrecv_smtp_client_packets(httpd_suexec_t) +- corenet_tcp_connect_smtp_port(httpd_suexec_t) +- corenet_tcp_sendrecv_smtp_port(httpd_suexec_t) +- corenet_sendrecv_pop_client_packets(httpd_suexec_t) +- corenet_tcp_connect_pop_port(httpd_suexec_t) +- corenet_tcp_sendrecv_pop_port(httpd_suexec_t) + mta_send_mail(httpd_suexec_t) +- mta_signal_system_mail(httpd_suexec_t) + ') + + tunable_policy(`httpd_enable_cgi && httpd_unified',` ++ allow httpd_sys_script_t httpdcontent:file entrypoint; + domtrans_pattern(httpd_suexec_t, httpdcontent, httpd_sys_script_t) +-') +- +-tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs',` +- fs_list_auto_mountpoints(httpd_suexec_t) +- fs_read_cifs_files(httpd_suexec_t) +- fs_read_cifs_symlinks(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs && httpd_builtin_scripting',` +- fs_exec_cifs_files(httpd_suexec_t) ++ manage_dirs_pattern(httpd_sys_script_t, httpdcontent, httpdcontent) ++ manage_files_pattern(httpd_sys_script_t, httpdcontent, httpdcontent) ++ manage_sock_files_pattern(httpd_sys_script_t, httpdcontent, httpdcontent) ++ manage_lnk_files_pattern(httpd_sys_script_t, httpdcontent, httpdcontent) + ') + + tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs',` +- fs_list_auto_mountpoints(httpd_suexec_t) ++ fs_list_auto_mountpoints(httpd_suexec_t) + fs_read_nfs_files(httpd_suexec_t) + fs_read_nfs_symlinks(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs && httpd_builtin_scripting',` + fs_exec_nfs_files(httpd_suexec_t) + ') + +-tunable_policy(`httpd_execmem',` +- allow httpd_suexec_t self:process { execmem execstack }; +-') +- +-tunable_policy(`httpd_tmp_exec',` +- can_exec(httpd_suexec_t, httpd_suexec_tmp_t) +-') +- +-tunable_policy(`httpd_tty_comm',` +- userdom_use_user_terminals(httpd_suexec_t) +-',` +- userdom_dontaudit_use_user_terminals(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_use_cifs',` +- fs_list_auto_mountpoints(httpd_suexec_t) +- fs_manage_cifs_dirs(httpd_suexec_t) +- fs_manage_cifs_files(httpd_suexec_t) +- fs_manage_cifs_symlinks(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_use_cifs && httpd_builtin_scripting',` ++tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs',` ++ fs_read_cifs_files(httpd_suexec_t) ++ fs_read_cifs_symlinks(httpd_suexec_t) + fs_exec_cifs_files(httpd_suexec_t) + ') + +-tunable_policy(`httpd_use_fusefs',` +- fs_list_auto_mountpoints(httpd_suexec_t) +- fs_manage_fusefs_dirs(httpd_suexec_t) +- fs_manage_fusefs_files(httpd_suexec_t) +- fs_read_fusefs_symlinks(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_use_fusefs && httpd_builtin_scripting',` +- fs_exec_fusefs_files(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_use_nfs',` +- fs_list_auto_mountpoints(httpd_suexec_t) +- fs_manage_nfs_dirs(httpd_suexec_t) +- fs_manage_nfs_files(httpd_suexec_t) +- fs_manage_nfs_symlinks(httpd_suexec_t) ++optional_policy(` ++ apache_rw_stream_sockets(httpd_suexec_t) + ') + +-tunable_policy(`httpd_use_nfs && httpd_builtin_scripting',` +- fs_exec_nfs_files(httpd_suexec_t) ++optional_policy(` ++ mailman_domtrans_cgi(httpd_suexec_t) + ') + + optional_policy(` +- mailman_domtrans_cgi(httpd_suexec_t) ++ mta_stub(httpd_suexec_t) ++ ++ # apache should set close-on-exec ++ # dontaudit httpd_suexec_t httpd_t:unix_stream_socket { read write }; + ') + + optional_policy(` + mysql_stream_connect(httpd_suexec_t) ++ mysql_rw_db_sockets(httpd_suexec_t) + mysql_read_config(httpd_suexec_t) + + tunable_policy(`httpd_can_network_connect_db',` +@@ -1083,172 +1438,108 @@ optional_policy(` + ') + ') + +-tunable_policy(`httpd_read_user_content',` +- userdom_read_user_home_content_files(httpd_suexec_t) +-') +- +-tunable_policy(`httpd_enable_homedirs',` +- userdom_search_user_home_dirs(httpd_suexec_t) +-') +- + ######################################## + # +-# Common script local policy ++# Apache system script local policy + # + +-allow httpd_script_domains self:fifo_file rw_file_perms; +-allow httpd_script_domains self:unix_stream_socket connectto; +- +-allow httpd_script_domains httpd_sys_content_t:dir search_dir_perms; +- +-append_files_pattern(httpd_script_domains, httpd_log_t, httpd_log_t) +-read_lnk_files_pattern(httpd_script_domains, httpd_log_t, httpd_log_t) +- +-kernel_dontaudit_search_sysctl(httpd_script_domains) +-kernel_dontaudit_search_kernel_sysctl(httpd_script_domains) ++allow httpd_sys_script_t self:process getsched; + +-corenet_all_recvfrom_unlabeled(httpd_script_domains) +-corenet_all_recvfrom_netlabel(httpd_script_domains) +-corenet_tcp_sendrecv_generic_if(httpd_script_domains) +-corenet_tcp_sendrecv_generic_node(httpd_script_domains) ++allow httpd_sys_script_t httpd_t:unix_stream_socket rw_stream_socket_perms; ++allow httpd_sys_script_t httpd_t:tcp_socket { read write }; + +-corecmd_exec_all_executables(httpd_script_domains) ++dontaudit httpd_sys_script_t httpd_config_t:dir search; + +-dev_read_rand(httpd_script_domains) +-dev_read_urand(httpd_script_domains) ++allow httpd_sys_script_t httpd_squirrelmail_t:file { append_file_perms read_file_perms }; + +-files_exec_etc_files(httpd_script_domains) +-files_read_etc_files(httpd_script_domains) +-files_search_home(httpd_script_domains) ++allow httpd_sys_script_t squirrelmail_spool_t:dir list_dir_perms; ++read_files_pattern(httpd_sys_script_t, squirrelmail_spool_t, squirrelmail_spool_t) ++read_lnk_files_pattern(httpd_sys_script_t, squirrelmail_spool_t, squirrelmail_spool_t) + +-libs_exec_ld_so(httpd_script_domains) +-libs_exec_lib_files(httpd_script_domains) ++kernel_read_kernel_sysctls(httpd_sys_script_t) + +-logging_search_logs(httpd_script_domains) ++dev_list_sysfs(httpd_sys_script_t) + +-miscfiles_read_fonts(httpd_script_domains) +-miscfiles_read_public_files(httpd_script_domains) ++files_read_var_symlinks(httpd_sys_script_t) ++files_search_var_lib(httpd_sys_script_t) ++files_search_spool(httpd_sys_script_t) + +-seutil_dontaudit_search_config(httpd_script_domains) ++logging_send_syslog_msg(httpd_sys_script_t) ++logging_inherit_append_all_logs(httpd_sys_script_t) + +-tunable_policy(`httpd_enable_cgi && httpd_unified',` +- allow httpd_script_domains httpdcontent:file entrypoint; ++# Should we add a boolean? ++apache_domtrans_rotatelogs(httpd_sys_script_t) + +- manage_dirs_pattern(httpd_script_domains, httpdcontent, httpdcontent) +- manage_files_pattern(httpd_script_domains, httpdcontent, httpdcontent) +- manage_lnk_files_pattern(httpd_script_domains, httpdcontent, httpdcontent) ++auth_use_nsswitch(httpd_sys_script_t) + +- can_exec(httpd_script_domains, httpdcontent) ++ifdef(`distro_redhat',` ++ allow httpd_sys_script_t httpd_log_t:file append_file_perms; + ') + +-tunable_policy(`httpd_enable_cgi',` +- allow httpd_script_domains self:process { setsched signal_perms }; +- allow httpd_script_domains self:unix_stream_socket create_stream_socket_perms; +- +- kernel_read_system_state(httpd_script_domains) +- +- fs_getattr_all_fs(httpd_script_domains) +- +- files_read_etc_runtime_files(httpd_script_domains) +- files_read_usr_files(httpd_script_domains) +- +- libs_read_lib_files(httpd_script_domains) +- +- miscfiles_read_localization(httpd_script_domains) ++tunable_policy(`httpd_can_sendmail',` ++ mta_send_mail(httpd_sys_script_t) + ') + + optional_policy(` +- tunable_policy(`httpd_enable_cgi && allow_ypbind',` +- nis_use_ypbind_uncond(httpd_script_domains) ++ tunable_policy(`httpd_can_sendmail && httpd_can_check_spam',` ++ spamassassin_domtrans_client(httpd_t) + ') + ') + +-tunable_policy(`httpd_enable_cgi && httpd_can_network_connect_db',` +- corenet_sendrecv_gds_db_client_packets(httpd_script_domains) +- corenet_tcp_connect_gds_db_port(httpd_script_domains) +- corenet_tcp_sendrecv_gds_db_port(httpd_script_domains) +- corenet_sendrecv_mssql_client_packets(httpd_script_domains) +- corenet_tcp_connect_mssql_port(httpd_script_domains) +- corenet_tcp_sendrecv_mssql_port(httpd_script_domains) +- corenet_sendrecv_oracledb_client_packets(httpd_script_domains) +- corenet_tcp_connect_oracledb_port(httpd_script_domains) +- corenet_tcp_sendrecv_oracledb_port(httpd_script_domains) +-') +- +-optional_policy(` +- mysql_read_config(httpd_script_domains) +- mysql_stream_connect(httpd_script_domains) +- +- tunable_policy(`httpd_enable_cgi && httpd_can_network_connect_db',` +- mysql_tcp_connect(httpd_script_domains) +- ') ++tunable_policy(`httpd_can_network_connect_db',` ++ corenet_tcp_connect_gds_db_port(httpd_sys_script_t) ++ corenet_tcp_connect_mssql_port(httpd_sys_script_t) ++ corenet_sendrecv_mssql_client_packets(httpd_sys_script_t) ++ corenet_tcp_connect_oracle_port(httpd_sys_script_t) ++ corenet_sendrecv_oracle_client_packets(httpd_sys_script_t) ++ corenet_tcp_connect_mongod_port(httpd_sys_script_t) + ') + +-optional_policy(` +- postgresql_stream_connect(httpd_script_domains) ++fs_cifs_entry_type(httpd_sys_script_t) ++fs_read_iso9660_files(httpd_sys_script_t) ++fs_nfs_entry_type(httpd_sys_script_t) ++fs_rw_anon_inodefs_files(httpd_sys_script_t) + +- tunable_policy(`httpd_enable_cgi && httpd_can_network_connect_db',` +- postgresql_tcp_connect(httpd_script_domains) +- ') +-') ++tunable_policy(`httpd_use_nfs',` ++ fs_list_auto_mountpoints(httpd_sys_script_t) ++ fs_manage_nfs_dirs(httpd_sys_script_t) ++ fs_manage_nfs_files(httpd_sys_script_t) ++ fs_manage_nfs_symlinks(httpd_sys_script_t) ++ fs_exec_nfs_files(httpd_sys_script_t) + +-optional_policy(` +- nscd_use(httpd_script_domains) ++ fs_list_auto_mountpoints(httpd_suexec_t) ++ fs_manage_nfs_dirs(httpd_suexec_t) ++ fs_manage_nfs_files(httpd_suexec_t) ++ fs_manage_nfs_symlinks(httpd_suexec_t) ++ fs_exec_nfs_files(httpd_suexec_t) + ') + +-######################################## +-# +-# System script local policy +-# +- +-allow httpd_sys_script_t self:tcp_socket { accept listen }; ++corenet_all_recvfrom_netlabel(httpd_sys_script_t) + +-allow httpd_sys_script_t httpd_t:tcp_socket { read write }; +- +-dontaudit httpd_sys_script_t httpd_config_t:dir search; +- +-allow httpd_sys_script_t httpd_squirrelmail_t:file { append_file_perms read_file_perms }; +- +-allow httpd_sys_script_t squirrelmail_spool_t:dir list_dir_perms; +-allow httpd_sys_script_t squirrelmail_spool_t:file read_file_perms; +-allow httpd_sys_script_t squirrelmail_spool_t:lnk_file read_lnk_file_perms; +- +-kernel_read_kernel_sysctls(httpd_sys_script_t) +- +-fs_search_auto_mountpoints(httpd_sys_script_t) +- +-files_read_var_symlinks(httpd_sys_script_t) +-files_search_var_lib(httpd_sys_script_t) +-files_search_spool(httpd_sys_script_t) +- +-apache_domtrans_rotatelogs(httpd_sys_script_t) +- +-auth_use_nsswitch(httpd_sys_script_t) +- +-tunable_policy(`httpd_can_sendmail',` +- corenet_sendrecv_smtp_client_packets(httpd_sys_script_t) +- corenet_tcp_connect_smtp_port(httpd_sys_script_t) +- corenet_tcp_sendrecv_smtp_port(httpd_sys_script_t) +- corenet_sendrecv_pop_client_packets(httpd_sys_script_t) +- corenet_tcp_connect_pop_port(httpd_sys_script_t) +- corenet_tcp_sendrecv_pop_port(httpd_sys_script_t) +- +- mta_send_mail(httpd_sys_script_t) +- mta_signal_system_mail(httpd_sys_script_t) ++tunable_policy(`httpd_enable_cgi && httpd_can_network_connect',` ++ allow httpd_sys_script_t self:tcp_socket create_stream_socket_perms; ++ allow httpd_sys_script_t self:udp_socket create_socket_perms; ++ ++ corenet_tcp_bind_generic_node(httpd_sys_script_t) ++ corenet_udp_bind_generic_node(httpd_sys_script_t) ++ corenet_tcp_sendrecv_generic_if(httpd_sys_script_t) ++ corenet_udp_sendrecv_generic_if(httpd_sys_script_t) ++ corenet_tcp_sendrecv_generic_node(httpd_sys_script_t) ++ corenet_udp_sendrecv_generic_node(httpd_sys_script_t) ++ corenet_tcp_sendrecv_all_ports(httpd_sys_script_t) ++ corenet_udp_sendrecv_all_ports(httpd_sys_script_t) ++ corenet_tcp_connect_all_ports(httpd_sys_script_t) ++ corenet_sendrecv_all_client_packets(httpd_sys_script_t) + ') + + tunable_policy(`httpd_enable_homedirs',` + userdom_search_user_home_dirs(httpd_sys_script_t) + ') + +-tunable_policy(`httpd_enable_cgi && httpd_can_network_connect',` +- corenet_tcp_connect_all_ports(httpd_sys_script_t) +- corenet_sendrecv_all_client_packets(httpd_sys_script_t) +- corenet_tcp_sendrecv_all_ports(httpd_sys_script_t) +-') +- +-tunable_policy(`httpd_execmem',` +- allow httpd_sys_script_t self:process { execmem execstack }; ++tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs',` ++ fs_list_auto_mountpoints(httpd_sys_script_t) ++ fs_read_nfs_files(httpd_sys_script_t) ++ fs_read_nfs_symlinks(httpd_sys_script_t) + ') + + tunable_policy(`httpd_read_user_content',` +@@ -1256,64 +1547,74 @@ tunable_policy(`httpd_read_user_content',` + ') + + tunable_policy(`httpd_use_cifs',` +- fs_list_auto_mountpoints(httpd_sys_script_t) + fs_manage_cifs_dirs(httpd_sys_script_t) + fs_manage_cifs_files(httpd_sys_script_t) + fs_manage_cifs_symlinks(httpd_sys_script_t) +-') +- +-tunable_policy(`httpd_use_cifs && httpd_builtin_scripting',` +- fs_exec_cifs_files(httpd_sys_script_t) ++ fs_manage_cifs_dirs(httpd_suexec_t) ++ fs_manage_cifs_files(httpd_suexec_t) ++ fs_manage_cifs_symlinks(httpd_suexec_t) ++ fs_exec_cifs_files(httpd_suexec_t) + ') + + tunable_policy(`httpd_use_fusefs',` +- fs_list_auto_mountpoints(httpd_sys_script_t) + fs_manage_fusefs_dirs(httpd_sys_script_t) + fs_manage_fusefs_files(httpd_sys_script_t) +- fs_read_fusefs_symlinks(httpd_sys_script_t) ++ fs_manage_fusefs_symlinks(httpd_sys_script_t) ++ fs_manage_fusefs_dirs(httpd_suexec_t) ++ fs_manage_fusefs_files(httpd_suexec_t) ++ fs_manage_fusefs_symlinks(httpd_suexec_t) ++ fs_exec_fusefs_files(httpd_suexec_t) + ') + +-tunable_policy(`httpd_use_fusefs && httpd_builtin_scripting',` +- fs_exec_fusefs_files(httpd_sys_script_t) ++tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs',` ++ fs_read_cifs_files(httpd_sys_script_t) ++ fs_read_cifs_symlinks(httpd_sys_script_t) + ') + +-tunable_policy(`httpd_use_nfs',` +- fs_list_auto_mountpoints(httpd_sys_script_t) +- fs_manage_nfs_dirs(httpd_sys_script_t) +- fs_manage_nfs_files(httpd_sys_script_t) +- fs_manage_nfs_symlinks(httpd_sys_script_t) ++optional_policy(` ++ clamav_domtrans_clamscan(httpd_sys_script_t) ++ clamav_domtrans_clamscan(httpd_t) + ') + +-tunable_policy(`httpd_use_nfs && httpd_builtin_scripting',` +- fs_exec_nfs_files(httpd_sys_script_t) ++optional_policy(` ++ mysql_stream_connect(httpd_sys_script_t) ++ mysql_rw_db_sockets(httpd_sys_script_t) ++ mysql_read_config(httpd_sys_script_t) ++ ++ tunable_policy(`httpd_can_network_connect_db',` ++ mysql_tcp_connect(httpd_sys_script_t) ++ ') + ') + + optional_policy(` +- clamav_domtrans_clamscan(httpd_sys_script_t) ++ postgresql_stream_connect(httpd_sys_script_t) ++ postgresql_unpriv_client(httpd_sys_script_t) ++ ++ tunable_policy(`httpd_can_network_connect_db',` ++ postgresql_tcp_connect(httpd_sys_script_t) ++ ') + ') + + optional_policy(` +- postgresql_unpriv_client(httpd_sys_script_t) ++ snmp_read_snmp_var_lib_files(httpd_sys_script_t) + ') + + ######################################## + # +-# Rotatelogs local policy ++# httpd_rotatelogs local policy + # + +-allow httpd_rotatelogs_t self:capability dac_override; ++allow httpd_rotatelogs_t self:capability { dac_read_search dac_override }; + + manage_files_pattern(httpd_rotatelogs_t, httpd_log_t, httpd_log_t) +-read_lnk_files_pattern(httpd_rotatelogs_t, httpd_log_t, httpd_log_t) + + kernel_read_kernel_sysctls(httpd_rotatelogs_t) + kernel_dontaudit_list_proc(httpd_rotatelogs_t) ++kernel_dontaudit_read_proc_symlinks(httpd_rotatelogs_t) + +-files_read_etc_files(httpd_rotatelogs_t) + + logging_search_logs(httpd_rotatelogs_t) + +-miscfiles_read_localization(httpd_rotatelogs_t) + + ######################################## + # +@@ -1321,8 +1622,15 @@ miscfiles_read_localization(httpd_rotatelogs_t) + # + + optional_policy(` +- apache_content_template(unconfined) ++ type httpd_unconfined_script_t; ++ type httpd_unconfined_script_exec_t; ++ domain_type(httpd_unconfined_script_t) ++ domain_entry_file(httpd_unconfined_script_t, httpd_unconfined_script_exec_t) ++ domtrans_pattern(httpd_t, httpd_unconfined_script_exec_t, httpd_unconfined_script_t) + unconfined_domain(httpd_unconfined_script_t) ++ ++ role system_r types httpd_unconfined_script_t; ++ allow httpd_t httpd_unconfined_script_t:process signal_perms; + ') + + ######################################## +@@ -1330,49 +1638,43 @@ optional_policy(` + # User content local policy + # + +-tunable_policy(`httpd_enable_homedirs',` +- userdom_search_user_home_dirs(httpd_user_script_t) +-') +- +-tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs',` +- fs_list_auto_mountpoints(httpd_user_script_t) +- fs_read_cifs_files(httpd_user_script_t) +- fs_read_cifs_symlinks(httpd_user_script_t) +-') ++auth_use_nsswitch(httpd_user_script_t) + +-tunable_policy(`httpd_enable_homedirs && use_samba_home_dirs && httpd_builtin_scripting',` +- fs_exec_cifs_files(httpd_user_script_t) ++tunable_policy(`httpd_enable_cgi && httpd_unified',` ++ allow httpd_user_script_t httpdcontent:file entrypoint; ++ manage_dirs_pattern(httpd_user_script_t, httpd_user_content_t, httpd_user_content_t) ++ manage_files_pattern(httpd_user_script_t, httpd_user_content_t, httpd_user_content_t) ++ manage_dirs_pattern(httpd_user_script_t, httpd_user_ra_content_t, httpd_user_ra_content_t) ++ manage_files_pattern(httpd_user_script_t, httpd_user_ra_content_t, httpd_user_ra_content_t) + ') + +-tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs',` +- fs_list_auto_mountpoints(httpd_user_script_t) +- fs_read_nfs_files(httpd_user_script_t) +- fs_read_nfs_symlinks(httpd_user_script_t) +-') ++# allow accessing files/dirs below the users home dir ++tunable_policy(`httpd_enable_homedirs',` ++ userdom_search_user_home_content(httpd_t) ++ userdom_search_user_home_content(httpd_suexec_t) ++ userdom_search_user_home_content(httpd_user_script_t) + +-tunable_policy(`httpd_enable_homedirs && use_nfs_home_dirs && httpd_builtin_scripting',` +- fs_exec_nfs_files(httpd_user_script_t) ++ read_files_pattern(httpd_t, httpd_user_content_type, httpd_user_content_type) ++ read_lnk_files_pattern(httpd_t, httpd_user_content_type, httpd_user_content_type) ++ list_dirs_pattern(httpd_t, httpd_user_content_type, httpd_user_content_type) ++ allow httpd_t httpd_user_content_type:file map; + ') + + tunable_policy(`httpd_read_user_content',` ++ userdom_read_user_home_content_files(httpd_t) ++ userdom_read_user_home_content_files(httpd_suexec_t) + userdom_read_user_home_content_files(httpd_user_script_t) + ') + +-optional_policy(` +- postgresql_unpriv_client(httpd_user_script_t) +-') +- + ######################################## + # +-# Passwd local policy ++# httpd_passwd local policy + # + + allow httpd_passwd_t self:fifo_file manage_fifo_file_perms; + allow httpd_passwd_t self:unix_stream_socket create_stream_socket_perms; + allow httpd_passwd_t self:unix_dgram_socket create_socket_perms; + +-dontaudit httpd_passwd_t httpd_config_t:file read_file_perms; +- + kernel_read_system_state(httpd_passwd_t) + + corecmd_exec_bin(httpd_passwd_t) +@@ -1382,38 +1684,109 @@ dev_read_urand(httpd_passwd_t) + + domain_use_interactive_fds(httpd_passwd_t) + ++ + auth_use_nsswitch(httpd_passwd_t) + +-miscfiles_read_generic_certs(httpd_passwd_t) +-miscfiles_read_localization(httpd_passwd_t) ++miscfiles_read_certs(httpd_passwd_t) + +-######################################## +-# +-# GPG local policy +-# ++systemd_manage_passwd_run(httpd_passwd_t) ++systemd_manage_passwd_run(httpd_t) ++#systemd_passwd_agent_dev_template(httpd) ++ ++domtrans_pattern(httpd_t, httpd_passwd_exec_t, httpd_passwd_t) ++dontaudit httpd_passwd_t httpd_config_t:file read; ++ ++search_dirs_pattern(httpd_script_type, httpd_sys_content_t, httpd_script_exec_type) ++corecmd_shell_entry_type(httpd_script_type) ++ ++allow httpd_script_type self:fifo_file rw_file_perms; ++allow httpd_script_type self:unix_stream_socket connectto; ++ ++allow httpd_script_type httpd_t:fifo_file write; ++# apache should set close-on-exec ++apache_dontaudit_leaks(httpd_script_type) ++ ++append_files_pattern(httpd_script_type, httpd_log_t, httpd_log_t) ++logging_search_logs(httpd_script_type) ++ ++kernel_dontaudit_search_sysctl(httpd_script_type) ++kernel_dontaudit_search_kernel_sysctl(httpd_script_type) ++ ++dev_read_rand(httpd_script_type) ++dev_read_urand(httpd_script_type) ++ ++corecmd_exec_all_executables(httpd_script_type) ++application_exec_all(httpd_script_type) ++ ++files_exec_etc_files(httpd_script_type) ++files_search_home(httpd_script_type) ++ ++libs_exec_ld_so(httpd_script_type) ++libs_exec_lib_files(httpd_script_type) ++ ++miscfiles_read_fonts(httpd_script_type) ++miscfiles_read_public_files(httpd_script_type) + +-allow httpd_gpg_t self:process setrlimit; ++allow httpd_t httpd_script_type:unix_stream_socket connectto; + +-allow httpd_gpg_t httpd_t:fd use; +-allow httpd_gpg_t httpd_t:fifo_file rw_fifo_file_perms; +-allow httpd_gpg_t httpd_t:process sigchld; ++allow httpd_t httpd_script_exec_type:file read_file_perms; ++allow httpd_t httpd_script_exec_type:lnk_file read_lnk_file_perms; ++allow httpd_t httpd_script_type:process { signal sigkill sigstop signull }; ++allow httpd_t httpd_script_exec_type:dir list_dir_perms; + +-dev_read_rand(httpd_gpg_t) +-dev_read_urand(httpd_gpg_t) ++allow httpd_script_type self:process { setsched signal_perms }; ++allow httpd_script_type self:unix_stream_socket create_stream_socket_perms; ++allow httpd_script_type self:unix_dgram_socket create_socket_perms; ++allow httpd_script_type httpd_t:unix_stream_socket rw_stream_socket_perms; + +-files_read_usr_files(httpd_gpg_t) ++allow httpd_script_type httpd_t:fd use; ++allow httpd_script_type httpd_t:process sigchld; + +-miscfiles_read_localization(httpd_gpg_t) ++dontaudit httpd_script_type httpd_t:tcp_socket { read write }; ++dontaudit httpd_script_type httpd_t:unix_stream_socket { read write }; + +-tunable_policy(`httpd_gpg_anon_write',` +- miscfiles_manage_public_files(httpd_gpg_t) ++fs_getattr_xattr_fs(httpd_script_type) ++ ++files_read_etc_runtime_files(httpd_script_type) ++ ++libs_read_lib_files(httpd_script_type) ++ ++allow httpd_script_type httpd_sys_content_t:dir search_dir_perms; ++ ++tunable_policy(`httpd_enable_cgi && nis_enabled',` ++ nis_use_ypbind_uncond(httpd_script_type) + ') + + optional_policy(` +- apache_manage_sys_rw_content(httpd_gpg_t) ++ nscd_socket_use(httpd_script_type) ++') ++ ++read_files_pattern(httpd_t, httpd_content_type, httpd_content_type) ++allow httpd_t httpd_content_type:file map; ++ ++tunable_policy(`httpd_builtin_scripting',` ++ allow httpd_t httpd_content_type:dir search_dir_perms; ++ allow httpd_suexec_t httpd_content_type:dir search_dir_perms; ++ ++ allow httpd_t httpd_content_type:dir list_dir_perms; ++ read_files_pattern(httpd_t, httpd_content_type, httpd_content_type) ++ read_lnk_files_pattern(httpd_t, httpd_content_type, httpd_content_type) ++') ++ ++tunable_policy(`httpd_use_openstack',` ++ corenet_tcp_connect_keystone_port(httpd_sys_script_t) ++ corenet_tcp_connect_all_ephemeral_ports(httpd_t) ++ corenet_tcp_connect_glance_port(httpd_sys_script_t) ++ corenet_tcp_connect_osapi_compute_port(httpd_sys_script_t) ++') ++ ++tunable_policy(`httpd_use_openstack',` ++ corenet_tcp_connect_osapi_compute_port(httpd_t) ++ corenet_tcp_bind_commplex_main_port(httpd_t) + ') + + optional_policy(` +- gpg_entry_type(httpd_gpg_t) +- gpg_exec(httpd_gpg_t) ++ tunable_policy(`httpd_use_openstack',` ++ keystone_read_log(httpd_t) ++ ') + ') +diff --git a/apcupsd.fc b/apcupsd.fc +index 5ec0e13c87..97c204fe51 100644 +--- a/apcupsd.fc ++++ b/apcupsd.fc +@@ -1,18 +1,23 @@ ++/etc/apcupsd/powerfail -- gen_context(system_u:object_r:apcupsd_power_t,s0) ++ + /etc/rc\.d/init\.d/apcupsd -- gen_context(system_u:object_r:apcupsd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/apcupsd.* -- gen_context(system_u:object_r:apcupsd_unit_file_t,s0) ++ + /sbin/apcupsd -- gen_context(system_u:object_r:apcupsd_exec_t,s0) + + /usr/sbin/apcupsd -- gen_context(system_u:object_r:apcupsd_exec_t,s0) + + /var/lock/subsys/apcupsd -- gen_context(system_u:object_r:apcupsd_lock_t,s0) ++/var/lock/LCK.. -- gen_context(system_u:object_r:apcupsd_lock_t,s0) + + /var/log/apcupsd\.events.* -- gen_context(system_u:object_r:apcupsd_log_t,s0) + /var/log/apcupsd\.status.* -- gen_context(system_u:object_r:apcupsd_log_t,s0) + + /var/run/apcupsd\.pid -- gen_context(system_u:object_r:apcupsd_var_run_t,s0) + +-/var/www/apcupsd/multimon\.cgi -- gen_context(system_u:object_r:httpd_apcupsd_cgi_script_exec_t,s0) +-/var/www/apcupsd/upsfstats\.cgi -- gen_context(system_u:object_r:httpd_apcupsd_cgi_script_exec_t,s0) +-/var/www/apcupsd/upsimage\.cgi -- gen_context(system_u:object_r:httpd_apcupsd_cgi_script_exec_t,s0) +-/var/www/apcupsd/upsstats\.cgi -- gen_context(system_u:object_r:httpd_apcupsd_cgi_script_exec_t,s0) +-/var/www/cgi-bin/apcgui(/.*)? gen_context(system_u:object_r:httpd_apcupsd_cgi_script_exec_t,s0) ++/var/www/apcupsd/multimon\.cgi -- gen_context(system_u:object_r:apcupsd_cgi_script_exec_t,s0) ++/var/www/apcupsd/upsfstats\.cgi -- gen_context(system_u:object_r:apcupsd_cgi_script_exec_t,s0) ++/var/www/apcupsd/upsimage\.cgi -- gen_context(system_u:object_r:apcupsd_cgi_script_exec_t,s0) ++/var/www/apcupsd/upsstats\.cgi -- gen_context(system_u:object_r:apcupsd_cgi_script_exec_t,s0) ++/var/www/cgi-bin/apcgui(/.*)? gen_context(system_u:object_r:apcupsd_cgi_script_exec_t,s0) +diff --git a/apcupsd.if b/apcupsd.if +index f3c0abac62..f6e25eda4c 100644 +--- a/apcupsd.if ++++ b/apcupsd.if +@@ -102,7 +102,7 @@ interface(`apcupsd_append_log',` + ######################################## + ## + ## Execute a domain transition to +-## run httpd_apcupsd_cgi_script. ++## run apcupsd_cgi_script. + ## + ## + ## +@@ -112,17 +112,61 @@ interface(`apcupsd_append_log',` + # + interface(`apcupsd_cgi_script_domtrans',` + gen_require(` +- type httpd_apcupsd_cgi_script_t, httpd_apcupsd_cgi_script_exec_t; ++ type apcupsd_cgi_script_t, apcupsd_cgi_script_exec_t; + ') + + files_search_var($1) +- domtrans_pattern($1, httpd_apcupsd_cgi_script_exec_t, httpd_apcupsd_cgi_script_t) ++ domtrans_pattern($1, apcupsd_cgi_script_exec_t, apcupsd_cgi_script_t) + + optional_policy(` + apache_search_sys_content($1) + ') + ') + ++######################################## ++## ++## Execute apcupsd server in the apcupsd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`apcupsd_systemctl',` ++ gen_require(` ++ type apcupsd_t; ++ type apcupsd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 apcupsd_unit_file_t:file read_file_perms; ++ allow $1 apcupsd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, apcupsd_t) ++') ++ ++######################################## ++## ++## Create configuration files in /var/lock ++## with a named file type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`apcupsd_filetrans_named_content',` ++ gen_require(` ++ type apcupsd_lock_t; ++ ') ++ ++ files_lock_filetrans($1, apcupsd_lock_t, file, "apcupsd") ++ files_lock_filetrans($1, apcupsd_lock_t, file, "LCK..") ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -144,11 +188,17 @@ interface(`apcupsd_admin',` + gen_require(` + type apcupsd_t, apcupsd_tmp_t, apcupsd_log_t; + type apcupsd_var_run_t, apcupsd_initrc_exec_t, apcupsd_lock_t; ++ type apcupsd_unit_file_t; ++ type apcupsd_power_t; + ') + +- allow $1 apcupsd_t:process { ptrace signal_perms }; ++ allow $1 apcupsd_t:process signal_perms; + ps_process_pattern($1, apcupsd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 apcupsd_t:process ptrace; ++ ') ++ + apcupsd_initrc_domtrans($1, apcupsd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 apcupsd_initrc_exec_t system_r; +@@ -165,4 +215,11 @@ interface(`apcupsd_admin',` + + files_list_pids($1) + admin_pattern($1, apcupsd_var_run_t) ++ ++ apcupsd_systemctl($1) ++ admin_pattern($1, apcupsd_unit_file_t) ++ allow $1 apcupsd_unit_file_t:service all_service_perms; ++ ++ manage_files_pattern($1, apcupsd_power_t, apcupsd_power_t) ++ files_etc_filetrans(apcupsd_t, apcupsd_power_t, file, "powerfail") + ') +diff --git a/apcupsd.te b/apcupsd.te +index 080bc4ddba..b295381b86 100644 +--- a/apcupsd.te ++++ b/apcupsd.te +@@ -24,12 +24,18 @@ files_tmp_file(apcupsd_tmp_t) + type apcupsd_var_run_t; + files_pid_file(apcupsd_var_run_t) + ++type apcupsd_power_t; ++files_type(apcupsd_power_t) ++ ++type apcupsd_unit_file_t; ++systemd_unit_file(apcupsd_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow apcupsd_t self:capability { dac_override setgid sys_tty_config }; ++allow apcupsd_t self:capability { dac_read_search dac_override setgid sys_tty_config }; + allow apcupsd_t self:process signal; + allow apcupsd_t self:fifo_file rw_file_perms; + allow apcupsd_t self:unix_stream_socket create_stream_socket_perms; +@@ -38,9 +44,10 @@ allow apcupsd_t self:tcp_socket create_stream_socket_perms; + allow apcupsd_t apcupsd_lock_t:file manage_file_perms; + files_lock_filetrans(apcupsd_t, apcupsd_lock_t, file) + +-append_files_pattern(apcupsd_t, apcupsd_log_t, apcupsd_log_t) +-create_files_pattern(apcupsd_t, apcupsd_log_t, apcupsd_log_t) +-setattr_files_pattern(apcupsd_t, apcupsd_log_t, apcupsd_log_t) ++manage_files_pattern(apcupsd_t, apcupsd_power_t, apcupsd_power_t) ++files_etc_filetrans(apcupsd_t, apcupsd_power_t, file, "powerfail") ++ ++manage_files_pattern(apcupsd_t, apcupsd_log_t, apcupsd_log_t) + logging_log_filetrans(apcupsd_t, apcupsd_log_t, file) + + manage_files_pattern(apcupsd_t, apcupsd_tmp_t, apcupsd_tmp_t) +@@ -54,7 +61,6 @@ kernel_read_system_state(apcupsd_t) + corecmd_exec_bin(apcupsd_t) + corecmd_exec_shell(apcupsd_t) + +-corenet_all_recvfrom_unlabeled(apcupsd_t) + corenet_all_recvfrom_netlabel(apcupsd_t) + corenet_tcp_sendrecv_generic_if(apcupsd_t) + corenet_tcp_sendrecv_generic_node(apcupsd_t) +@@ -67,26 +73,38 @@ corenet_tcp_bind_apcupsd_port(apcupsd_t) + corenet_sendrecv_apcupsd_server_packets(apcupsd_t) + corenet_tcp_sendrecv_apcupsd_port(apcupsd_t) + corenet_tcp_connect_apcupsd_port(apcupsd_t) ++corenet_udp_bind_apc_port(apcupsd_t) ++corenet_udp_bind_snmp_port(apcupsd_t) + + corenet_udp_bind_snmp_port(apcupsd_t) + corenet_sendrecv_snmp_server_packets(apcupsd_t) + corenet_udp_sendrecv_snmp_port(apcupsd_t) + ++fs_getattr_xattr_fs(apcupsd_t) ++ ++dev_read_sysfs(apcupsd_t) ++ + dev_rw_generic_usb_dev(apcupsd_t) + +-files_read_etc_files(apcupsd_t) ++domain_signull_all_domains(apcupsd_t) ++ + files_manage_etc_runtime_files(apcupsd_t) + files_etc_filetrans_etc_runtime(apcupsd_t, file, "nologin") + +-term_use_unallocated_ttys(apcupsd_t) ++term_use_all_terms(apcupsd_t) ++term_use_usb_ttys(apcupsd_t) + +-logging_send_syslog_msg(apcupsd_t) ++#apcupsd runs shutdown, probably need a shutdown domain ++init_rw_utmp(apcupsd_t) ++init_telinit(apcupsd_t) ++ ++auth_use_nsswitch(apcupsd_t) + +-miscfiles_read_localization(apcupsd_t) ++logging_send_syslog_msg(apcupsd_t) + + sysnet_dns_name_resolve(apcupsd_t) + +-userdom_use_user_ttys(apcupsd_t) ++userdom_use_inherited_user_ttys(apcupsd_t) + + optional_policy(` + hostname_exec(apcupsd_t) +@@ -101,6 +119,11 @@ optional_policy(` + shutdown_domtrans(apcupsd_t) + ') + ++optional_policy(` ++ systemd_start_power_services(apcupsd_t) ++ systemd_status_power_services(apcupsd_t) ++') ++ + ######################################## + # + # CGI local policy +@@ -108,20 +131,20 @@ optional_policy(` + + optional_policy(` + apache_content_template(apcupsd_cgi) +- +- allow httpd_apcupsd_cgi_script_t self:tcp_socket create_stream_socket_perms; +- allow httpd_apcupsd_cgi_script_t self:udp_socket create_socket_perms; +- +- corenet_all_recvfrom_unlabeled(httpd_apcupsd_cgi_script_t) +- corenet_all_recvfrom_netlabel(httpd_apcupsd_cgi_script_t) +- corenet_tcp_sendrecv_generic_if(httpd_apcupsd_cgi_script_t) +- corenet_tcp_sendrecv_generic_node(httpd_apcupsd_cgi_script_t) +- corenet_tcp_sendrecv_all_ports(httpd_apcupsd_cgi_script_t) +- corenet_sendrecv_apcupsd_client_packets(httpd_apcupsd_cgi_script_t) +- corenet_tcp_connect_apcupsd_port(httpd_apcupsd_cgi_script_t) +- corenet_udp_sendrecv_generic_if(httpd_apcupsd_cgi_script_t) +- corenet_udp_sendrecv_generic_node(httpd_apcupsd_cgi_script_t) +- corenet_udp_sendrecv_all_ports(httpd_apcupsd_cgi_script_t) +- +- sysnet_dns_name_resolve(httpd_apcupsd_cgi_script_t) ++ apache_content_alias_template(apcupsd_cgi, apcupsd_cgi) ++ ++ allow apcupsd_cgi_script_t self:tcp_socket create_stream_socket_perms; ++ allow apcupsd_cgi_script_t self:udp_socket create_socket_perms; ++ ++ corenet_all_recvfrom_netlabel(apcupsd_cgi_script_t) ++ corenet_tcp_sendrecv_generic_if(apcupsd_cgi_script_t) ++ corenet_tcp_sendrecv_generic_node(apcupsd_cgi_script_t) ++ corenet_tcp_sendrecv_all_ports(apcupsd_cgi_script_t) ++ corenet_sendrecv_apcupsd_client_packets(apcupsd_cgi_script_t) ++ corenet_tcp_connect_apcupsd_port(apcupsd_cgi_script_t) ++ corenet_udp_sendrecv_generic_if(apcupsd_cgi_script_t) ++ corenet_udp_sendrecv_generic_node(apcupsd_cgi_script_t) ++ corenet_udp_sendrecv_all_ports(apcupsd_cgi_script_t) ++ ++ sysnet_dns_name_resolve(apcupsd_cgi_script_t) + ') +diff --git a/apm.fc b/apm.fc +index ce27d2fb33..b2ba16a046 100644 +--- a/apm.fc ++++ b/apm.fc +@@ -1,3 +1,4 @@ ++/usr/lib/systemd/system/apmd.* -- gen_context(system_u:object_r:apmd_unit_file_t,s0) + /etc/rc\.d/init\.d/acpid -- gen_context(system_u:object_r:apmd_initrc_exec_t,s0) + + /usr/bin/apm -- gen_context(system_u:object_r:apm_exec_t,s0) +@@ -7,6 +8,8 @@ + /usr/sbin/powersaved -- gen_context(system_u:object_r:apmd_exec_t,s0) + + /var/lock/subsys/acpid -- gen_context(system_u:object_r:apmd_lock_t,s0) ++/var/lock/subsys/lmt-req\.lock -- gen_context(system_u:object_r:apmd_lock_t,s0) ++/var/lock/lmt-req\.lock -- gen_context(system_u:object_r:apmd_lock_t,s0) + + /var/log/acpid.* -- gen_context(system_u:object_r:apmd_log_t,s0) + +diff --git a/apm.if b/apm.if +index 1a7a97e5c3..2c7252a391 100644 +--- a/apm.if ++++ b/apm.if +@@ -139,6 +139,30 @@ interface(`apm_stream_connect',` + stream_connect_pattern($1, apmd_var_run_t, apmd_var_run_t, apmd_t) + ') + ++######################################## ++## ++## Execute apmd server in the apmd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`apmd_systemctl',` ++ gen_require(` ++ type apmd_t; ++ type apmd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 apmd_unit_file_t:file read_file_perms; ++ allow $1 apmd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, apmd_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -163,9 +187,13 @@ interface(`apm_admin',` + type apmd_tmp_t; + ') + +- allow $1 apmd_t:process { ptrace signal_perms }; ++ allow $1 apmd_t:process { signal_perms }; + ps_process_pattern($1, apmd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 apmd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, apmd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 apmd_initrc_exec_t system_r; +diff --git a/apm.te b/apm.te +index 7fd431bcd7..f944eccf15 100644 +--- a/apm.te ++++ b/apm.te +@@ -35,12 +35,15 @@ files_type(apmd_var_lib_t) + type apmd_var_run_t; + files_pid_file(apmd_var_run_t) + ++type apmd_unit_file_t; ++systemd_unit_file(apmd_unit_file_t) ++ + ######################################## + # + # Client local policy + # + +-allow apm_t self:capability { dac_override sys_admin }; ++allow apm_t self:capability { dac_read_search dac_override sys_admin sys_resource }; + + kernel_read_system_state(apm_t) + +@@ -48,7 +51,7 @@ dev_rw_apm_bios(apm_t) + + fs_getattr_xattr_fs(apm_t) + +-term_use_all_terms(apm_t) ++term_use_all_inherited_terms(apm_t) + + domain_use_interactive_fds(apm_t) + +@@ -59,11 +62,12 @@ logging_send_syslog_msg(apm_t) + # Server local policy + # + +-allow apmd_t self:capability { sys_admin sys_nice sys_time kill mknod }; +-dontaudit apmd_t self:capability { setuid dac_override dac_read_search sys_ptrace sys_tty_config }; ++allow apmd_t self:capability { sys_admin sys_nice sys_time kill mknod sys_resource }; ++dontaudit apmd_t self:capability { setuid dac_override dac_read_search sys_tty_config }; + allow apmd_t self:process { signal_perms getsession }; + allow apmd_t self:fifo_file rw_fifo_file_perms; + allow apmd_t self:netlink_socket create_socket_perms; ++allow apmd_t self:netlink_generic_socket create_socket_perms; + allow apmd_t self:unix_stream_socket { accept listen }; + + allow apmd_t apmd_lock_t:file manage_file_perms; +@@ -90,6 +94,7 @@ kernel_read_kernel_sysctls(apmd_t) + kernel_rw_all_sysctls(apmd_t) + kernel_read_system_state(apmd_t) + kernel_write_proc_files(apmd_t) ++kernel_request_load_module(apmd_t) + + dev_read_input(apmd_t) + dev_read_mouse(apmd_t) +@@ -114,8 +119,7 @@ fs_dontaudit_getattr_all_files(apmd_t) + fs_dontaudit_getattr_all_symlinks(apmd_t) + fs_dontaudit_getattr_all_pipes(apmd_t) + fs_dontaudit_getattr_all_sockets(apmd_t) +- +-selinux_search_fs(apmd_t) ++fs_read_cgroup_files(apmd_t) + + corecmd_exec_all_executables(apmd_t) + +@@ -129,6 +133,9 @@ domain_dontaudit_list_all_domains_state(apmd_t) + auth_use_nsswitch(apmd_t) + + init_domtrans_script(apmd_t) ++init_read_utmp(apmd_t) ++init_telinit(apmd_t) ++init_dbus_chat(apmd_t) + + libs_exec_ld_so(apmd_t) + libs_exec_lib_files(apmd_t) +@@ -136,17 +143,16 @@ libs_exec_lib_files(apmd_t) + logging_send_audit_msgs(apmd_t) + logging_send_syslog_msg(apmd_t) + +-miscfiles_read_localization(apmd_t) + miscfiles_read_hwdata(apmd_t) + + modutils_domtrans_insmod(apmd_t) + modutils_read_module_config(apmd_t) + +-seutil_dontaudit_read_config(apmd_t) ++seutil_sigchld_newrole(apmd_t) + + userdom_dontaudit_use_unpriv_user_fds(apmd_t) + userdom_dontaudit_search_user_home_dirs(apmd_t) +-userdom_dontaudit_search_user_home_content(apmd_t) ++userdom_dontaudit_search_user_home_content(apmd_t) # Excessive? + + optional_policy(` + automount_domtrans(apmd_t) +@@ -206,11 +212,20 @@ optional_policy(` + ') + + optional_policy(` +- seutil_sigchld_newrole(apmd_t) ++ shutdown_domtrans(apmd_t) + ') + + optional_policy(` +- shutdown_domtrans(apmd_t) ++ sssd_search_lib(apmd_t) ++') ++ ++optional_policy(` ++ systemd_dbus_chat_logind(apmd_t) ++') ++ ++optional_policy(` ++ systemd_start_power_services(apmd_t) ++ systemd_status_power_services(apmd_t) + ') + + optional_policy(` +diff --git a/apt.if b/apt.if +index cde81d2486..2fe02018af 100644 +--- a/apt.if ++++ b/apt.if +@@ -171,7 +171,7 @@ interface(`apt_read_cache',` + + files_search_var($1) + allow $1 apt_var_cache_t:dir list_dir_perms; +- dontaudit $1 apt_var_cache_t:dir write_dir_perms; ++ dontaudit $1 apt_var_cache_t:dir rw_dir_perms; + allow $1 apt_var_cache_t:file read_file_perms; + ') + +diff --git a/apt.te b/apt.te +index efa853059d..ae5d0c9f2a 100644 +--- a/apt.te ++++ b/apt.te +@@ -39,7 +39,7 @@ logging_log_file(apt_var_log_t) + # Local policy + # + +-allow apt_t self:capability { chown dac_override fowner fsetid }; ++allow apt_t self:capability { chown dac_read_search dac_override fowner fsetid }; + allow apt_t self:process { signal setpgid fork }; + allow apt_t self:fd use; + allow apt_t self:fifo_file rw_fifo_file_perms; +@@ -85,7 +85,6 @@ kernel_read_kernel_sysctls(apt_t) + corecmd_exec_bin(apt_t) + corecmd_exec_shell(apt_t) + +-corenet_all_recvfrom_unlabeled(apt_t) + corenet_all_recvfrom_netlabel(apt_t) + corenet_tcp_sendrecv_generic_if(apt_t) + corenet_tcp_sendrecv_generic_node(apt_t) +@@ -101,27 +100,24 @@ domain_getattr_all_domains(apt_t) + domain_use_interactive_fds(apt_t) + + files_exec_usr_files(apt_t) +-files_read_etc_files(apt_t) + files_read_etc_runtime_files(apt_t) + + fs_getattr_all_fs(apt_t) + + term_create_pty(apt_t, apt_devpts_t) + term_list_ptys(apt_t) +-term_use_all_terms(apt_t) ++term_use_all_inherited_terms(apt_t) + + libs_exec_ld_so(apt_t) + libs_exec_lib_files(apt_t) + + logging_send_syslog_msg(apt_t) + +-miscfiles_read_localization(apt_t) +- + seutil_use_newrole_fds(apt_t) + + sysnet_read_config(apt_t) + +-userdom_use_user_terminals(apt_t) ++userdom_use_inherited_user_terminals(apt_t) + + optional_policy(` + backup_manage_store_files(apt_t) +diff --git a/arpwatch.fc b/arpwatch.fc +index 9ca0d0fb8c..9a1a61f82f 100644 +--- a/arpwatch.fc ++++ b/arpwatch.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/arpwatch -- gen_context(system_u:object_r:arpwatch_initrc_exec_t,s0) + ++/usr/lib/systemd/system/arpwatch.* -- gen_context(system_u:object_r:arpwatch_unit_file_t,s0) ++ + /usr/sbin/arpwatch -- gen_context(system_u:object_r:arpwatch_exec_t,s0) + + /var/arpwatch(/.*)? gen_context(system_u:object_r:arpwatch_data_t,s0) +diff --git a/arpwatch.if b/arpwatch.if +index 50c9b9c87e..533a555a2a 100644 +--- a/arpwatch.if ++++ b/arpwatch.if +@@ -117,6 +117,30 @@ interface(`arpwatch_dontaudit_rw_packet_sockets',` + dontaudit $1 arpwatch_t:packet_socket { read write }; + ') + ++######################################## ++## ++## Execute arpwatch server in the arpwatch domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`arpwatch_systemctl',` ++ gen_require(` ++ type arpwatch_t; ++ type arpwatch_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 arpwatch_unit_file_t:file read_file_perms; ++ allow $1 arpwatch_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, arpwatch_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -138,11 +162,16 @@ interface(`arpwatch_admin',` + gen_require(` + type arpwatch_t, arpwatch_tmp_t, arpwatch_initrc_exec_t; + type arpwatch_data_t, arpwatch_var_run_t; ++ type arpwatch_unit_file_t; + ') + +- allow $1 arpwatch_t:process { ptrace signal_perms }; ++ allow $1 arpwatch_t:process signal_perms; + ps_process_pattern($1, arpwatch_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 arpwatch_t:process ptrace; ++ ') ++ + arpwatch_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 arpwatch_initrc_exec_t system_r; +@@ -156,4 +185,8 @@ interface(`arpwatch_admin',` + + files_list_pids($1) + admin_pattern($1, arpwatch_var_run_t) ++ ++ arpwatch_systemctl($1) ++ admin_pattern($1, arpwatch_unit_file_t) ++ allow $1 arpwatch_unit_file_t:service all_service_perms; + ') +diff --git a/arpwatch.te b/arpwatch.te +index 2d7bf345b0..04d3ea1c85 100644 +--- a/arpwatch.te ++++ b/arpwatch.te +@@ -21,6 +21,9 @@ files_tmp_file(arpwatch_tmp_t) + type arpwatch_var_run_t; + files_pid_file(arpwatch_var_run_t) + ++type arpwatch_unit_file_t; ++systemd_unit_file(arpwatch_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -31,8 +34,11 @@ dontaudit arpwatch_t self:capability sys_tty_config; + allow arpwatch_t self:process signal_perms; + allow arpwatch_t self:unix_stream_socket { accept listen }; + allow arpwatch_t self:tcp_socket { accept listen }; +-allow arpwatch_t self:packet_socket create_socket_perms; ++allow arpwatch_t self:packet_socket { create_socket_perms map }; + allow arpwatch_t self:socket create_socket_perms; ++allow arpwatch_t self:netlink_socket create_socket_perms; ++allow arpwatch_t self:netlink_netfilter_socket create_socket_perms; ++allow arpwatch_t self:bluetooth_socket create_socket_perms; + + manage_dirs_pattern(arpwatch_t, arpwatch_data_t, arpwatch_data_t) + manage_files_pattern(arpwatch_t, arpwatch_data_t, arpwatch_data_t) +@@ -45,13 +51,26 @@ files_tmp_filetrans(arpwatch_t, arpwatch_tmp_t, { file dir }) + manage_files_pattern(arpwatch_t, arpwatch_var_run_t, arpwatch_var_run_t) + files_pid_filetrans(arpwatch_t, arpwatch_var_run_t, file) + +-kernel_read_kernel_sysctls(arpwatch_t) + kernel_read_network_state(arpwatch_t) ++# meminfo + kernel_read_system_state(arpwatch_t) ++kernel_read_kernel_sysctls(arpwatch_t) ++kernel_read_proc_symlinks(arpwatch_t) + kernel_request_load_module(arpwatch_t) + ++corenet_all_recvfrom_netlabel(arpwatch_t) ++corenet_tcp_sendrecv_generic_if(arpwatch_t) ++corenet_udp_sendrecv_generic_if(arpwatch_t) ++corenet_raw_sendrecv_generic_if(arpwatch_t) ++corenet_tcp_sendrecv_generic_node(arpwatch_t) ++corenet_udp_sendrecv_generic_node(arpwatch_t) ++corenet_raw_sendrecv_generic_node(arpwatch_t) ++corenet_tcp_sendrecv_all_ports(arpwatch_t) ++corenet_udp_sendrecv_all_ports(arpwatch_t) ++ + dev_read_sysfs(arpwatch_t) + dev_read_usbmon_dev(arpwatch_t) ++dev_map_usbmon_dev(arpwatch_t) + dev_rw_generic_usb_dev(arpwatch_t) + + fs_getattr_all_fs(arpwatch_t) +@@ -59,15 +78,12 @@ fs_search_auto_mountpoints(arpwatch_t) + + domain_use_interactive_fds(arpwatch_t) + +-files_read_usr_files(arpwatch_t) + files_search_var_lib(arpwatch_t) + + auth_use_nsswitch(arpwatch_t) + + logging_send_syslog_msg(arpwatch_t) + +-miscfiles_read_localization(arpwatch_t) +- + userdom_dontaudit_search_user_home_dirs(arpwatch_t) + userdom_dontaudit_use_unpriv_user_fds(arpwatch_t) + +diff --git a/asterisk.if b/asterisk.if +index 2077053eac..198a02ab43 100644 +--- a/asterisk.if ++++ b/asterisk.if +@@ -124,9 +124,13 @@ interface(`asterisk_admin',` + type asterisk_var_lib_t, asterisk_initrc_exec_t; + ') + +- allow $1 asterisk_t:process { ptrace signal_perms }; ++ allow $1 asterisk_t:process signal_perms; + ps_process_pattern($1, asterisk_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 asterisk_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, asterisk_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 asterisk_initrc_exec_t system_r; +diff --git a/asterisk.te b/asterisk.te +index 7e41350229..1e0f4c49bc 100644 +--- a/asterisk.te ++++ b/asterisk.te +@@ -19,7 +19,7 @@ type asterisk_log_t; + logging_log_file(asterisk_log_t) + + type asterisk_spool_t; +-files_type(asterisk_spool_t) ++files_spool_file(asterisk_spool_t) + + type asterisk_tmp_t; + files_tmp_file(asterisk_tmp_t) +@@ -39,7 +39,7 @@ init_daemon_run_dir(asterisk_var_run_t, "asterisk") + # Local policy + # + +-allow asterisk_t self:capability { dac_override chown setgid setuid sys_nice net_admin }; ++allow asterisk_t self:capability { dac_read_search dac_override chown setgid setuid sys_nice net_admin }; + dontaudit asterisk_t self:capability { sys_module sys_tty_config }; + allow asterisk_t self:process { getsched setsched signal_perms getcap setcap }; + allow asterisk_t self:fifo_file rw_fifo_file_perms; +@@ -73,11 +73,11 @@ fs_tmpfs_filetrans(asterisk_t, asterisk_tmpfs_t, { dir file lnk_file sock_file f + + manage_files_pattern(asterisk_t, asterisk_var_lib_t, asterisk_var_lib_t) + ++manage_dirs_pattern(asterisk_t, asterisk_var_run_t, asterisk_var_run_t) + manage_files_pattern(asterisk_t, asterisk_var_run_t, asterisk_var_run_t) + manage_fifo_files_pattern(asterisk_t, asterisk_var_run_t, asterisk_var_run_t) + manage_sock_files_pattern(asterisk_t, asterisk_var_run_t, asterisk_var_run_t) +-files_pid_filetrans(asterisk_t, asterisk_var_run_t, file) +- ++files_pid_filetrans(asterisk_t, asterisk_var_run_t, { dir file sock_file fifo_file }) + can_exec(asterisk_t, asterisk_exec_t) + + kernel_read_kernel_sysctls(asterisk_t) +@@ -88,7 +88,6 @@ kernel_request_load_module(asterisk_t) + corecmd_exec_bin(asterisk_t) + corecmd_exec_shell(asterisk_t) + +-corenet_all_recvfrom_unlabeled(asterisk_t) + corenet_all_recvfrom_netlabel(asterisk_t) + corenet_tcp_sendrecv_generic_if(asterisk_t) + corenet_udp_sendrecv_generic_if(asterisk_t) +@@ -126,6 +125,7 @@ corenet_tcp_connect_pktcable_cops_port(asterisk_t) + + corenet_sendrecv_sip_client_packets(asterisk_t) + corenet_tcp_connect_sip_port(asterisk_t) ++corenet_tcp_connect_http_port(asterisk_t) + + dev_rw_generic_usb_dev(asterisk_t) + dev_read_sysfs(asterisk_t) +@@ -136,7 +136,6 @@ dev_read_urand(asterisk_t) + + domain_use_interactive_fds(asterisk_t) + +-files_read_usr_files(asterisk_t) + files_search_spool(asterisk_t) + files_dontaudit_search_home(asterisk_t) + +@@ -150,8 +149,6 @@ auth_use_nsswitch(asterisk_t) + logging_search_logs(asterisk_t) + logging_send_syslog_msg(asterisk_t) + +-miscfiles_read_localization(asterisk_t) +- + userdom_dontaudit_use_unpriv_user_fds(asterisk_t) + userdom_dontaudit_search_user_home_dirs(asterisk_t) + +diff --git a/authconfig.fc b/authconfig.fc +new file mode 100644 +index 0000000000..4579cfe178 +--- /dev/null ++++ b/authconfig.fc +@@ -0,0 +1,3 @@ ++/usr/share/authconfig/authconfig\.py -- gen_context(system_u:object_r:authconfig_exec_t,s0) ++ ++/var/lib/authconfig(/.*)? gen_context(system_u:object_r:authconfig_var_lib_t,s0) +diff --git a/authconfig.if b/authconfig.if +new file mode 100644 +index 0000000000..316c324f21 +--- /dev/null ++++ b/authconfig.if +@@ -0,0 +1,127 @@ ++ ++## policy for authconfig ++ ++######################################## ++## ++## Execute TEMPLATE in the authconfig domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`authconfig_domtrans',` ++ gen_require(` ++ type authconfig_t, authconfig_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, authconfig_exec_t, authconfig_t) ++') ++ ++######################################## ++## ++## Search authconfig lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authconfig_search_lib',` ++ gen_require(` ++ type authconfig_var_lib_t; ++ ') ++ ++ allow $1 authconfig_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read authconfig lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authconfig_read_lib_files',` ++ gen_require(` ++ type authconfig_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, authconfig_var_lib_t, authconfig_var_lib_t) ++') ++ ++######################################## ++## ++## Manage authconfig lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authconfig_manage_lib_files',` ++ gen_require(` ++ type authconfig_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, authconfig_var_lib_t, authconfig_var_lib_t) ++') ++ ++######################################## ++## ++## Manage authconfig lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authconfig_manage_lib_dirs',` ++ gen_require(` ++ type authconfig_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, authconfig_var_lib_t, authconfig_var_lib_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an authconfig environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`authconfig_admin',` ++ gen_require(` ++ type authconfig_t; ++ type authconfig_var_lib_t; ++ ') ++ ++ allow $1 authconfig_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, authconfig_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, authconfig_var_lib_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/authconfig.te b/authconfig.te +new file mode 100644 +index 0000000000..dca8e7905b +--- /dev/null ++++ b/authconfig.te +@@ -0,0 +1,37 @@ ++policy_module(authconfig, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type authconfig_t; ++type authconfig_exec_t; ++application_domain(authconfig_t, authconfig_exec_t) ++role system_r types authconfig_t; ++ ++type authconfig_var_lib_t; ++files_type(authconfig_var_lib_t) ++ ++######################################## ++# ++# authconfig local policy ++# ++allow authconfig_t self:fifo_file rw_fifo_file_perms; ++allow authconfig_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(authconfig_t, authconfig_var_lib_t, authconfig_var_lib_t) ++manage_files_pattern(authconfig_t, authconfig_var_lib_t, authconfig_var_lib_t) ++manage_lnk_files_pattern(authconfig_t, authconfig_var_lib_t, authconfig_var_lib_t) ++files_var_lib_filetrans(authconfig_t, authconfig_var_lib_t, { dir file lnk_file }) ++ ++domain_use_interactive_fds(authconfig_t) ++domain_named_filetrans(authconfig_t) ++ ++init_domtrans_script(authconfig_t) ++ ++unconfined_domain_noaudit(authconfig_t) ++ ++optional_policy(` ++ policykit_dbus_chat(authconfig_t) ++') +diff --git a/automount.fc b/automount.fc +index 92adb37e15..0a2ffc62dd 100644 +--- a/automount.fc ++++ b/automount.fc +@@ -1,6 +1,8 @@ + /etc/apm/event\.d/autofs -- gen_context(system_u:object_r:automount_exec_t,s0) + /etc/rc\.d/init\.d/autofs -- gen_context(system_u:object_r:automount_initrc_exec_t,s0) + ++/usr/lib/systemd/system/autofs.* -- gen_context(system_u:object_r:automount_unit_file_t,s0) ++ + /usr/sbin/automount -- gen_context(system_u:object_r:automount_exec_t,s0) + + /var/lock/subsys/autofs -- gen_context(system_u:object_r:automount_lock_t,s0) +diff --git a/automount.if b/automount.if +index f24e369606..4484a98da2 100644 +--- a/automount.if ++++ b/automount.if +@@ -29,7 +29,6 @@ interface(`automount_domtrans',` + ## + ## + # +-# + interface(`automount_signal',` + gen_require(` + type automount_t; +@@ -112,6 +111,25 @@ interface(`automount_dontaudit_write_pipes',` + dontaudit $1 automount_t:fifo_file write; + ') + ++######################################## ++## ++## Allow domain to search of automount temporary ++## directories. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`automount_search_tmp_dirs',` ++ gen_require(` ++ type automount_tmp_t; ++ ') ++ ++ search_dirs_pattern($1, automount_tmp_t, automount_tmp_t) ++') ++ + ######################################## + ## + ## Do not audit attempts to get +@@ -132,6 +150,30 @@ interface(`automount_dontaudit_getattr_tmp_dirs',` + dontaudit $1 automount_tmp_t:dir getattr_dir_perms; + ') + ++######################################## ++## ++## Execute automount server in the automount domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`automount_systemctl',` ++ gen_require(` ++ type automount_t; ++ type automount_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 automount_unit_file_t:file read_file_perms; ++ allow $1 automount_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, automount_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -153,12 +195,16 @@ interface(`automount_admin',` + gen_require(` + type automount_t, automount_lock_t, automount_tmp_t; + type automount_var_run_t, automount_initrc_exec_t; +- type automount_keytab_t; ++ type automount_unit_file_t, automount_keytab_t; + ') + +- allow $1 automount_t:process { ptrace signal_perms }; ++ allow $1 automount_t:process signal_perms; + ps_process_pattern($1, automount_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 automount_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, automount_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 automount_initrc_exec_t system_r; +@@ -175,4 +221,8 @@ interface(`automount_admin',` + + files_list_pids($1) + admin_pattern($1, automount_var_run_t) ++ ++ automount_systemctl($1) ++ admin_pattern($1, automount_unit_file_t) ++ allow $1 automount_unit_file_t:service all_service_perms; + ') +diff --git a/automount.te b/automount.te +index 27d2f400b9..f74f75f1b6 100644 +--- a/automount.te ++++ b/automount.te +@@ -22,6 +22,9 @@ type automount_tmp_t; + files_tmp_file(automount_tmp_t) + files_mountpoint(automount_tmp_t) + ++type automount_unit_file_t; ++systemd_unit_file(automount_unit_file_t) ++ + type automount_var_run_t; + files_pid_file(automount_var_run_t) + +@@ -30,7 +33,8 @@ files_pid_file(automount_var_run_t) + # Local policy + # + +-allow automount_t self:capability { setgid setuid sys_nice sys_resource dac_override sys_admin }; ++allow automount_t self:capability { setgid setuid sys_nice sys_resource dac_read_search dac_override sys_admin }; ++allow automount_t self:capability2 block_suspend; + dontaudit automount_t self:capability sys_tty_config; + allow automount_t self:process { signal_perms getpgid setpgid setsched setrlimit }; + allow automount_t self:fifo_file rw_fifo_file_perms; +@@ -67,7 +71,6 @@ kernel_dontaudit_search_xen_state(automount_t) + corecmd_exec_bin(automount_t) + corecmd_exec_shell(automount_t) + +-corenet_all_recvfrom_unlabeled(automount_t) + corenet_all_recvfrom_netlabel(automount_t) + corenet_tcp_sendrecv_generic_if(automount_t) + corenet_udp_sendrecv_generic_if(automount_t) +@@ -91,6 +94,7 @@ corenet_udp_bind_all_rpc_ports(automount_t) + + files_dontaudit_write_var_dirs(automount_t) + files_getattr_all_dirs(automount_t) ++files_getattr_all_files(automount_t) + files_getattr_default_dirs(automount_t) + files_getattr_home_dir(automount_t) + files_getattr_isid_type_dirs(automount_t) +@@ -101,7 +105,6 @@ files_mount_all_file_type_fs(automount_t) + files_mounton_all_mountpoints(automount_t) + files_mounton_mnt(automount_t) + files_read_etc_runtime_files(automount_t) +-files_read_usr_files(automount_t) + files_search_boot(automount_t) + files_search_all(automount_t) + files_unmount_all_file_type_fs(automount_t) +@@ -113,6 +116,7 @@ fs_manage_autofs_symlinks(automount_t) + fs_mount_all_fs(automount_t) + fs_mount_autofs(automount_t) + fs_read_nfs_files(automount_t) ++fs_read_nfs_symlinks(automount_t) + fs_search_all(automount_t) + fs_search_auto_mountpoints(automount_t) + fs_unmount_all_fs(automount_t) +@@ -135,14 +139,18 @@ auth_use_nsswitch(automount_t) + logging_send_syslog_msg(automount_t) + logging_search_logs(automount_t) + +-miscfiles_read_localization(automount_t) + miscfiles_read_generic_certs(automount_t) + +-mount_domtrans(automount_t) +-mount_signal(automount_t) +- + userdom_dontaudit_use_unpriv_user_fds(automount_t) + ++optional_policy(` ++ # Run mount in the mount_t domain. ++ mount_domtrans(automount_t) ++ mount_domtrans_showmount(automount_t) ++ mount_signal(automount_t) ++ mount_rw_pid_files(automount_t) ++') ++ + optional_policy(` + fstools_domtrans(automount_t) + ') +@@ -166,3 +174,8 @@ optional_policy(` + optional_policy(` + udev_read_db(automount_t) + ') ++ ++tunable_policy(`mount_anyfile',` ++ files_mounton_non_security(automount_t) ++') ++ +diff --git a/avahi.fc b/avahi.fc +index e9fe2cac15..4c2d0769ef 100644 +--- a/avahi.fc ++++ b/avahi.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/avahi.* -- gen_context(system_u:object_r:avahi_initrc_exec_t,s0) + ++/usr/lib/systemd/system/avahi.* -- gen_context(system_u:object_r:avahi_unit_file_t,s0) ++ + /usr/sbin/avahi-daemon -- gen_context(system_u:object_r:avahi_exec_t,s0) + /usr/sbin/avahi-dnsconfd -- gen_context(system_u:object_r:avahi_exec_t,s0) + /usr/sbin/avahi-autoipd -- gen_context(system_u:object_r:avahi_exec_t,s0) +diff --git a/avahi.if b/avahi.if +index 9078c3d852..2f6b2503e6 100644 +--- a/avahi.if ++++ b/avahi.if +@@ -209,6 +209,30 @@ interface(`avahi_dontaudit_search_pid',` + dontaudit $1 avahi_var_run_t:dir search_dir_perms; + ') + ++######################################## ++## ++## Execute avahi server in the avahi domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`avahi_systemctl',` ++ gen_require(` ++ type avahi_t; ++ type avahi_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 avahi_unit_file_t:file read_file_perms; ++ allow $1 avahi_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, avahi_t) ++') ++ + ######################################## + ## + ## Create specified objects in generic +@@ -258,12 +282,17 @@ interface(`avahi_filetrans_pid',` + interface(`avahi_admin',` + gen_require(` + type avahi_t, avahi_var_run_t, avahi_initrc_exec_t; ++ type avahi_unit_file_t; + type avahi_var_lib_t; + ') + +- allow $1 avahi_t:process { ptrace signal_perms }; ++ allow $1 avahi_t:process signal_perms; + ps_process_pattern($1, avahi_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 avahi_t:process ptrace; ++ ') ++ + avahi_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 avahi_initrc_exec_t system_r; +@@ -274,4 +303,8 @@ interface(`avahi_admin',` + + files_search_var_lib($1) + admin_pattern($1, avahi_var_lib_t) ++ ++ avahi_systemctl($1) ++ admin_pattern($1, avahi_unit_file_t) ++ allow $1 avahi_unit_file_t:service all_service_perms; + ') +diff --git a/avahi.te b/avahi.te +index b8355b32f6..51ce1b60fd 100644 +--- a/avahi.te ++++ b/avahi.te +@@ -13,17 +13,21 @@ type avahi_initrc_exec_t; + init_script_file(avahi_initrc_exec_t) + + type avahi_var_lib_t; +-files_pid_file(avahi_var_lib_t) ++files_type(avahi_var_lib_t) + + type avahi_var_run_t; + files_pid_file(avahi_var_run_t) ++init_sock_file(avahi_var_run_t) ++ ++type avahi_unit_file_t; ++systemd_unit_file(avahi_unit_file_t) + + ######################################## + # + # Local policy + # + +-allow avahi_t self:capability { dac_override setgid chown fowner kill net_admin net_raw setuid sys_chroot }; ++allow avahi_t self:capability { dac_read_search dac_override setgid chown fowner kill net_admin net_raw setuid sys_chroot }; + dontaudit avahi_t self:capability sys_tty_config; + allow avahi_t self:process { setrlimit signal_perms getcap setcap }; + allow avahi_t self:fifo_file rw_fifo_file_perms; +@@ -49,7 +53,6 @@ kernel_request_load_module(avahi_t) + corecmd_exec_bin(avahi_t) + corecmd_exec_shell(avahi_t) + +-corenet_all_recvfrom_unlabeled(avahi_t) + corenet_all_recvfrom_netlabel(avahi_t) + corenet_tcp_sendrecv_generic_if(avahi_t) + corenet_udp_sendrecv_generic_if(avahi_t) +@@ -72,9 +75,9 @@ fs_search_auto_mountpoints(avahi_t) + fs_list_inotifyfs(avahi_t) + + domain_use_interactive_fds(avahi_t) ++domain_dontaudit_signull_all_domains(avahi_t) + + files_read_etc_runtime_files(avahi_t) +-files_read_usr_files(avahi_t) + + auth_use_nsswitch(avahi_t) + +@@ -83,13 +86,14 @@ init_signull_script(avahi_t) + + logging_send_syslog_msg(avahi_t) + +-miscfiles_read_localization(avahi_t) + miscfiles_read_generic_certs(avahi_t) + + sysnet_domtrans_ifconfig(avahi_t) + sysnet_manage_config(avahi_t) + sysnet_etc_filetrans_config(avahi_t) + ++systemd_login_signull(avahi_t) ++ + userdom_dontaudit_use_unpriv_user_fds(avahi_t) + userdom_dontaudit_search_user_home_dirs(avahi_t) + +diff --git a/awstats.fc b/awstats.fc +index 11e6d5ffe0..73b4ea47c8 100644 +--- a/awstats.fc ++++ b/awstats.fc +@@ -1,5 +1,5 @@ + /usr/share/awstats/tools/.+\.pl -- gen_context(system_u:object_r:awstats_exec_t,s0) +-/usr/share/awstats/wwwroot(/.*)? gen_context(system_u:object_r:httpd_awstats_content_t,s0) +-/usr/share/awstats/wwwroot/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_awstats_script_exec_t,s0) ++/usr/share/awstats/wwwroot(/.*)? gen_context(system_u:object_r:awstats_content_t,s0) ++/usr/share/awstats/wwwroot/cgi-bin(/.*)? gen_context(system_u:object_r:awstats_script_exec_t,s0) + + /var/lib/awstats(/.*)? gen_context(system_u:object_r:awstats_var_lib_t,s0) +diff --git a/awstats.te b/awstats.te +index c1b16c3929..ffbf2cb8fe 100644 +--- a/awstats.te ++++ b/awstats.te +@@ -26,6 +26,7 @@ type awstats_var_lib_t; + files_type(awstats_var_lib_t) + + apache_content_template(awstats) ++apache_content_alias_template(awstats, awstats) + + ######################################## + # +@@ -40,9 +41,9 @@ files_tmp_filetrans(awstats_t, awstats_tmp_t, { dir file }) + + manage_files_pattern(awstats_t, awstats_var_lib_t, awstats_var_lib_t) + +-allow awstats_t { httpd_awstats_content_t httpd_awstats_script_exec_t }:dir search_dir_perms; ++allow awstats_t { awstats_content_t awstats_script_exec_t }:dir search_dir_perms; + +-can_exec(awstats_t, { awstats_exec_t httpd_awstats_script_exec_t }) ++can_exec(awstats_t, { awstats_exec_t awstats_script_exec_t }) + + kernel_dontaudit_read_system_state(awstats_t) + +@@ -52,8 +53,6 @@ corecmd_exec_shell(awstats_t) + dev_read_urand(awstats_t) + + files_dontaudit_search_all_mountpoints(awstats_t) +-files_read_etc_files(awstats_t) +-files_read_usr_files(awstats_t) + + fs_list_inotifyfs(awstats_t) + +@@ -61,8 +60,6 @@ libs_read_lib_files(awstats_t) + + logging_read_generic_logs(awstats_t) + +-miscfiles_read_localization(awstats_t) +- + sysnet_dns_name_resolve(awstats_t) + + tunable_policy(`awstats_purge_apache_log_files',` +@@ -90,9 +87,13 @@ optional_policy(` + # CGI local policy + # + +-allow httpd_awstats_script_t awstats_var_lib_t:dir list_dir_perms; ++apache_read_log(awstats_script_t) ++ ++manage_dirs_pattern(awstats_script_t, awstats_tmp_t, awstats_tmp_t) ++manage_files_pattern(awstats_script_t, awstats_tmp_t, awstats_tmp_t) ++files_tmp_filetrans(awstats_script_t, awstats_tmp_t, { dir file }) + +-read_files_pattern(httpd_awstats_script_t, awstats_var_lib_t, awstats_var_lib_t) +-files_search_var_lib(httpd_awstats_script_t) ++allow awstats_script_t awstats_var_lib_t:dir list_dir_perms; + +-apache_read_log(httpd_awstats_script_t) ++read_files_pattern(awstats_script_t, awstats_var_lib_t, awstats_var_lib_t) ++files_search_var_lib(awstats_script_t) +diff --git a/backup.te b/backup.te +index 7811450b6b..e787033406 100644 +--- a/backup.te ++++ b/backup.te +@@ -21,7 +21,7 @@ files_type(backup_store_t) + # Local policy + # + +-allow backup_t self:capability dac_override; ++allow backup_t self:capability { dac_read_search dac_override }; + allow backup_t self:process signal; + allow backup_t self:fifo_file rw_fifo_file_perms; + allow backup_t self:tcp_socket create_socket_perms; +@@ -38,7 +38,6 @@ kernel_read_kernel_sysctls(backup_t) + corecmd_exec_bin(backup_t) + corecmd_exec_shell(backup_t) + +-corenet_all_recvfrom_unlabeled(backup_t) + corenet_all_recvfrom_netlabel(backup_t) + corenet_tcp_sendrecv_generic_if(backup_t) + corenet_tcp_sendrecv_generic_node(backup_t) +@@ -67,7 +66,7 @@ logging_send_syslog_msg(backup_t) + + sysnet_read_config(backup_t) + +-userdom_use_user_terminals(backup_t) ++userdom_use_inherited_user_terminals(backup_t) + + optional_policy(` + cron_system_entry(backup_t, backup_exec_t) +diff --git a/bacula.fc b/bacula.fc +index 27ec3d5193..65aa71bf63 100644 +--- a/bacula.fc ++++ b/bacula.fc +@@ -8,6 +8,8 @@ + /usr/sbin/bat -- gen_context(system_u:object_r:bacula_admin_exec_t,s0) + /usr/sbin/bconsole -- gen_context(system_u:object_r:bacula_admin_exec_t,s0) + ++/var/bacula(/.*)? gen_context(system_u:object_r:bacula_store_t,s0) ++ + /var/lib/bacula.* gen_context(system_u:object_r:bacula_var_lib_t,s0) + + /var/log/bacula.* gen_context(system_u:object_r:bacula_log_t,s0) +diff --git a/bacula.if b/bacula.if +index dcd774ee4a..c240ffaf69 100644 +--- a/bacula.if ++++ b/bacula.if +@@ -69,6 +69,7 @@ interface(`bacula_admin',` + type bacula_t, bacula_etc_t, bacula_log_t; + type bacula_spool_t, bacula_var_lib_t; + type bacula_var_run_t, bacula_initrc_exec_t; ++ attribute_role bacula_admin_roles; + ') + + allow $1 bacula_t:process { ptrace signal_perms }; +diff --git a/bacula.te b/bacula.te +index f16b000086..1a7c80f01e 100644 +--- a/bacula.te ++++ b/bacula.te +@@ -27,6 +27,9 @@ type bacula_store_t; + files_type(bacula_store_t) + files_mountpoint(bacula_store_t) + ++type bacula_tmp_t; ++files_tmp_file(bacula_tmp_t) ++ + type bacula_var_lib_t; + files_type(bacula_var_lib_t) + +@@ -38,21 +41,30 @@ type bacula_admin_exec_t; + application_domain(bacula_admin_t, bacula_admin_exec_t) + role bacula_admin_roles types bacula_admin_t; + ++type bacula_unconfined_script_exec_t; ++application_executable_file(bacula_unconfined_script_exec_t) ++ + ######################################## + # + # Local policy + # + +-allow bacula_t self:capability { dac_read_search dac_override chown fowner fsetid}; ++allow bacula_t self:capability { dac_read_search dac_override chown fowner fsetid setgid setuid}; + allow bacula_t self:process signal; + allow bacula_t self:fifo_file rw_fifo_file_perms; + allow bacula_t self:tcp_socket { accept listen }; + + read_files_pattern(bacula_t, bacula_etc_t, bacula_etc_t) + ++manage_files_pattern(bacula_t, bacula_tmp_t, bacula_tmp_t) ++manage_dirs_pattern(bacula_t, bacula_tmp_t, bacula_tmp_t) ++files_tmp_filetrans(bacula_t, bacula_tmp_t, { dir file }) ++ ++manage_dirs_pattern(bacula_t,bacula_log_t, bacula_log_t) + append_files_pattern(bacula_t, bacula_log_t, bacula_log_t) + create_files_pattern(bacula_t, bacula_log_t, bacula_log_t) + setattr_files_pattern(bacula_t, bacula_log_t, bacula_log_t) ++logging_log_filetrans(bacula_t, bacula_log_t, { file dir }) + + manage_dirs_pattern(bacula_t, bacula_spool_t, bacula_spool_t) + manage_files_pattern(bacula_t, bacula_spool_t, bacula_spool_t) +@@ -88,6 +100,10 @@ corenet_udp_bind_generic_node(bacula_t) + corenet_sendrecv_generic_server_packets(bacula_t) + corenet_udp_bind_generic_port(bacula_t) + ++ ++#TODO: check port labels for hplip a bacula ++corenet_tcp_bind_bacula_port(bacula_t) ++ + corenet_sendrecv_hplip_server_packets(bacula_t) + corenet_tcp_bind_hplip_port(bacula_t) + corenet_udp_bind_hplip_port(bacula_t) +@@ -98,19 +114,30 @@ corenet_tcp_connect_all_ports(bacula_t) + dev_getattr_all_blk_files(bacula_t) + dev_getattr_all_chr_files(bacula_t) + ++files_getattr_all_pipes(bacula_t) ++files_getattr_all_sockets(bacula_t) ++ + files_dontaudit_getattr_all_sockets(bacula_t) ++files_dontaudit_getattr_all_pipes(bacula_t) + files_read_all_files(bacula_t) + files_read_all_symlinks(bacula_t) + + fs_getattr_xattr_fs(bacula_t) + fs_list_all(bacula_t) + ++storage_raw_read_fixed_disk(bacula_t) ++storage_read_tape(bacula_t) ++storage_write_tape(bacula_t) ++ ++auth_use_nsswitch(bacula_t) + auth_read_shadow(bacula_t) + + logging_send_syslog_msg(bacula_t) + + sysnet_dns_name_resolve(bacula_t) + ++userdom_home_manager(bacula_t) ++ + optional_policy(` + mysql_stream_connect(bacula_t) + mysql_tcp_connect(bacula_t) +@@ -125,6 +152,12 @@ optional_policy(` + ldap_stream_connect(bacula_t) + ') + ++optional_policy(` ++ postgresql_tcp_connect(bacula_t) ++ postgresql_stream_connect(bacula_t) ++') ++ ++ + ######################################## + # + # Client local policy +@@ -148,11 +181,32 @@ corenet_tcp_connect_hplip_port(bacula_admin_t) + + domain_use_interactive_fds(bacula_admin_t) + +-files_read_etc_files(bacula_admin_t) +- +-miscfiles_read_localization(bacula_admin_t) +- + sysnet_dns_name_resolve(bacula_admin_t) + + userdom_dontaudit_search_user_home_dirs(bacula_admin_t) + userdom_use_user_ptys(bacula_admin_t) ++ ++######################################## ++# ++# Unconfined script local policy ++# ++ ++optional_policy(` ++ type bacula_unconfined_script_t; ++ domain_type(bacula_unconfined_script_t) ++ ++ domain_entry_file(bacula_unconfined_script_t, bacula_unconfined_script_exec_t) ++ role system_r types bacula_unconfined_script_t; ++ ++ allow bacula_t bacula_unconfined_script_t:process signal_perms; ++ ++ domtrans_pattern(bacula_t, bacula_unconfined_script_exec_t, bacula_unconfined_script_t) ++ ++ allow bacula_unconfined_script_t bacula_unconfined_script_exec_t:dir search_dir_perms; ++ allow bacula_unconfined_script_t bacula_unconfined_script_exec_t:dir read_file_perms; ++ allow bacula_unconfined_script_t bacula_unconfined_script_exec_t:file ioctl; ++ ++ optional_policy(` ++ unconfined_domain(bacula_unconfined_script_t) ++ ') ++') +diff --git a/bcfg2.fc b/bcfg2.fc +index fb42e352b3..8af0e14ced 100644 +--- a/bcfg2.fc ++++ b/bcfg2.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/bcfg2-server -- gen_context(system_u:object_r:bcfg2_initrc_exec_t,s0) + ++/usr/lib/systemd/system/bcfg2-server.* -- gen_context(system_u:object_r:bcfg2_unit_file_t,s0) ++ + /usr/sbin/bcfg2-server -- gen_context(system_u:object_r:bcfg2_exec_t,s0) + + /var/lib/bcfg2(/.*)? gen_context(system_u:object_r:bcfg2_var_lib_t,s0) +diff --git a/bcfg2.if b/bcfg2.if +index ec95d361ee..186271b74e 100644 +--- a/bcfg2.if ++++ b/bcfg2.if +@@ -115,6 +115,32 @@ interface(`bcfg2_manage_lib_dirs',` + manage_dirs_pattern($1, bcfg2_var_lib_t, bcfg2_var_lib_t) + ') + ++######################################## ++## ++## Execute bcfg2 server in the bcfg2 domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`bcfg2_systemctl',` ++ gen_require(` ++ type bcfg2_t; ++ type bcfg2_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 bcfg2_unit_file_t:file read_file_perms; ++ allow $1 bcfg2_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, bcfg2_t) ++') ++ ++ + ######################################## + ## + ## All of the rules required to +@@ -136,11 +162,16 @@ interface(`bcfg2_admin',` + gen_require(` + type bcfg2_t, bcfg2_initrc_exec_t, bcfg2_var_lib_t; + type bcfg2_var_run_t; ++ type bcfg2_unit_file_t; + ') + +- allow $1 bcfg2_t:process { ptrace signal_perms }; ++ allow $1 bcfg2_t:process { signal_perms }; + ps_process_pattern($1, bcfg2_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 bcfg2_t:process ptrace; ++ ') ++ + bcfg2_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 bcfg2_initrc_exec_t system_r; +@@ -151,4 +182,13 @@ interface(`bcfg2_admin',` + + files_search_var_lib($1) + admin_pattern($1, bcfg2_var_lib_t) ++ ++ bcfg2_systemctl($1) ++ admin_pattern($1, bcfg2_unit_file_t) ++ allow $1 bcfg2_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/bcfg2.te b/bcfg2.te +index c3fd7b1483..e18959384d 100644 +--- a/bcfg2.te ++++ b/bcfg2.te +@@ -15,6 +15,9 @@ init_script_file(bcfg2_initrc_exec_t) + type bcfg2_var_lib_t; + files_type(bcfg2_var_lib_t) + ++type bcfg2_unit_file_t; ++systemd_unit_file(bcfg2_unit_file_t) ++ + type bcfg2_var_run_t; + files_pid_file(bcfg2_var_run_t) + +@@ -52,10 +55,7 @@ dev_read_urand(bcfg2_t) + + domain_use_interactive_fds(bcfg2_t) + +-files_read_usr_files(bcfg2_t) + + auth_use_nsswitch(bcfg2_t) + + logging_send_syslog_msg(bcfg2_t) +- +-miscfiles_read_localization(bcfg2_t) +diff --git a/bind.fc b/bind.fc +index 2b9a3a10d4..982ce9b718 100644 +--- a/bind.fc ++++ b/bind.fc +@@ -1,54 +1,78 @@ +-/etc/rc\.d/init\.d/named -- gen_context(system_u:object_r:named_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/unbound -- gen_context(system_u:object_r:named_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/named -- gen_context(system_u:object_r:named_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/named-sdb -- gen_context(system_u:object_r:named_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/unbound -- gen_context(system_u:object_r:named_initrc_exec_t,s0) + +-/etc/bind(/.*)? gen_context(system_u:object_r:named_zone_t,s0) +-/etc/bind/named\.conf.* -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/bind/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) +-/etc/dnssec-trigger/dnssec_trigger_server\.key -- gen_context(system_u:object_r:dnssec_t,s0) +-/etc/named\.rfc1912\.zones -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/named\.root\.hints -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/named\.caching-nameserver\.conf -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/rndc.* -- gen_context(system_u:object_r:named_conf_t,s0) +-/etc/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) +-/etc/unbound(/.*)? gen_context(system_u:object_r:named_conf_t,s0) +-/etc/unbound/.*\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/etc/rndc.* -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/etc/unbound(/.*)? gen_context(system_u:object_r:named_conf_t,s0) ++/etc/unbound/.*\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/etc/dnssec-trigger/dnssec_trigger_server\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++ ++/usr/lib/systemd/system/unbound.* -- gen_context(system_u:object_r:named_unit_file_t,s0) ++/usr/lib/systemd/system/named.* -- gen_context(system_u:object_r:named_unit_file_t,s0) ++/usr/lib/systemd/system/named-sdb.* -- gen_context(system_u:object_r:named_unit_file_t,s0) + + /usr/sbin/lwresd -- gen_context(system_u:object_r:named_exec_t,s0) +-/usr/sbin/named -- gen_context(system_u:object_r:named_exec_t,s0) +-/usr/sbin/named-checkconf -- gen_context(system_u:object_r:named_checkconf_exec_t,s0) +-/usr/sbin/r?ndc -- gen_context(system_u:object_r:ndc_exec_t,s0) ++/usr/sbin/named -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/named-sdb -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/named-pkcs11 -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/named-checkconf -- gen_context(system_u:object_r:named_checkconf_exec_t,s0) ++/usr/sbin/r?ndc -- gen_context(system_u:object_r:ndc_exec_t,s0) + /usr/sbin/unbound -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/unbound-anchor -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/unbound-checkconf -- gen_context(system_u:object_r:named_exec_t,s0) ++/usr/sbin/unbound-control -- gen_context(system_u:object_r:named_exec_t,s0) + +-/var/bind(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +-/var/bind/pri(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++/var/log/named.* -- gen_context(system_u:object_r:named_log_t,s0) + +-/var/cache/bind(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/run/ndc -s gen_context(system_u:object_r:named_var_run_t,s0) ++/var/run/bind(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) ++/var/run/named(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) ++/var/run/unbound(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) + +-/var/log/named.* -- gen_context(system_u:object_r:named_log_t,s0) ++ifdef(`distro_debian',` ++/etc/bind(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++/etc/bind/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/bind/named\.conf\.local -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/bind/named\.conf\.options -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/bind/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/var/cache/bind(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++') ++ ++ifdef(`distro_gentoo',` ++/etc/bind(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++/etc/bind/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/bind/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/var/bind(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/bind/pri(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++') + +-/var/named(/.*)? gen_context(system_u:object_r:named_zone_t,s0) +-/var/named/slaves(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +-/var/named/data(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++ifdef(`distro_redhat',` ++/etc/named\.rfc1912.zones -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/named\.root\.hints -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/etc/named\.caching-nameserver\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/lib/softhsm(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/lib/unbound(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/named(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++/var/named/slaves(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/named/data(/.*)? gen_context(system_u:object_r:named_cache_t,s0) + /var/named/named\.ca -- gen_context(system_u:object_r:named_conf_t,s0) +-/var/named/chroot(/.*)? gen_context(system_u:object_r:named_conf_t,s0) +-/var/named/chroot/etc/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) +-/var/named/chroot/etc/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) +-/var/named/chroot/etc/named\.rfc1912\.zones -- gen_context(system_u:object_r:named_conf_t,s0) +-/var/named/chroot/etc/named\.root\.hints -- gen_context(system_u:object_r:named_conf_t,s0) +-/var/named/chroot/etc/named\.caching-nameserver\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot(/.*)? gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot/etc/rndc\.key -- gen_context(system_u:object_r:dnssec_t,s0) ++/var/named/chroot/etc/named\.conf -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot/etc/named\.rfc1912.zones -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot/etc/named\.root\.hints -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot/etc/named\.caching-nameserver\.conf -- gen_context(system_u:object_r:named_conf_t,s0) + /var/named/chroot/proc(/.*)? <> +-/var/named/chroot/var/run/named.* gen_context(system_u:object_r:named_var_run_t,s0) +-/var/named/chroot/var/tmp(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +-/var/named/chroot/var/named(/.*)? gen_context(system_u:object_r:named_zone_t,s0) +-/var/named/chroot/var/named/slaves(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +-/var/named/chroot/var/named/data(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/named/chroot/var/run/named.* gen_context(system_u:object_r:named_var_run_t,s0) ++/var/named/chroot/run/named.* gen_context(system_u:object_r:named_var_run_t,s0) ++/var/named/chroot/var/tmp(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/named/chroot/var/named(/.*)? gen_context(system_u:object_r:named_zone_t,s0) ++/var/named/chroot/var/named/slaves(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++/var/named/chroot/var/named/data(/.*)? gen_context(system_u:object_r:named_cache_t,s0) + /var/named/chroot/var/named/dynamic(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +-/var/named/chroot/var/named/named\.ca -- gen_context(system_u:object_r:named_conf_t,s0) ++/var/named/chroot/var/named/named\.ca -- gen_context(system_u:object_r:named_conf_t,s0) + /var/named/chroot/var/log/named.* -- gen_context(system_u:object_r:named_log_t,s0) +-/var/named/dynamic(/.*)? gen_context(system_u:object_r:named_cache_t,s0) +- +-/var/run/ndc -s gen_context(system_u:object_r:named_var_run_t,s0) +-/var/run/bind(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) +-/var/run/named(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) +-/var/run/unbound(/.*)? gen_context(system_u:object_r:named_var_run_t,s0) ++/var/named/dynamic(/.*)? gen_context(system_u:object_r:named_cache_t,s0) ++') +diff --git a/bind.if b/bind.if +index 531a8f244e..3fcf187225 100644 +--- a/bind.if ++++ b/bind.if +@@ -18,6 +18,30 @@ interface(`bind_initrc_domtrans',` + init_labeled_script_domtrans($1, named_initrc_exec_t) + ') + ++######################################## ++## ++## Execute bind server in the bind domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`bind_systemctl',` ++ gen_require(` ++ type named_unit_file_t; ++ type named_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 named_unit_file_t:file read_file_perms; ++ allow $1 named_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, named_t) ++') ++ + ######################################## + ## + ## Execute ndc in the ndc domain. +@@ -169,6 +193,7 @@ interface(`bind_read_config',` + type named_conf_t; + ') + ++ allow $1 named_conf_t:dir list_dir_perms; + read_files_pattern($1, named_conf_t, named_conf_t) + ') + +@@ -210,6 +235,25 @@ interface(`bind_manage_config_dirs',` + manage_dirs_pattern($1, named_conf_t, named_conf_t) + ') + ++######################################## ++## ++## Create, read, write, and delete ++## BIND configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bind_manage_config',` ++ gen_require(` ++ type named_conf_t; ++ ') ++ ++ manage_files_pattern($1, named_conf_t, named_conf_t) ++') ++ + ######################################## + ## + ## Search bind cache directories. +@@ -308,6 +352,47 @@ interface(`bind_read_zone',` + read_files_pattern($1, named_zone_t, named_zone_t) + ') + ++######################################## ++## ++## Read BIND zone files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bind_read_log',` ++ gen_require(` ++ type named_zone_t; ++ type named_log_t; ++ ') ++ ++ files_search_var($1) ++ allow $1 named_zone_t:dir search_dir_perms; ++ read_files_pattern($1, named_log_t, named_log_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## bind zone files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bind_manage_zone_dirs',` ++ gen_require(` ++ type named_zone_t; ++ ') ++ ++ files_search_var($1) ++ allow $1 named_zone_t:dir manage_dir_perms; ++') ++ + ######################################## + ## + ## Create, read, write, and delete +@@ -342,6 +427,25 @@ interface(`bind_udp_chat_named',` + refpolicywarn(`$0($*) has been deprecated.') + ') + ++######################################## ++## ++## Allow the domain to read bind state files in /proc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bind_read_state',` ++ gen_require(` ++ type named_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, named_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -364,11 +468,17 @@ interface(`bind_admin',` + type named_t, named_tmp_t, named_log_t; + type named_cache_t, named_zone_t, named_initrc_exec_t; + type dnssec_t, ndc_t, named_conf_t, named_var_run_t; +- type named_keytab_t; ++ type named_keytab_t, named_unit_file_t; + ') + +- allow $1 { named_t ndc_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { named_t ndc_t }) ++ allow $1 named_t:process signal_perms; ++ ps_process_pattern($1, named_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 named_t:process ptrace; ++ ') ++ ++ bind_run_ndc($1, $2) + + init_labeled_script_domtrans($1, named_initrc_exec_t) + domain_system_change_exemption($1) +@@ -384,11 +494,15 @@ interface(`bind_admin',` + files_list_etc($1) + admin_pattern($1, { named_keytab_t named_conf_t }) + ++ admin_pattern($1, named_keytab_t) ++ + files_list_var($1) + admin_pattern($1, { dnssec_t named_cache_t named_zone_t }) + + files_list_pids($1) + admin_pattern($1, named_var_run_t) + +- bind_run_ndc($1, $2) ++ admin_pattern($1, named_unit_file_t) ++ bind_systemctl($1) ++ allow $1 named_unit_file_t:service all_service_perms; + ') +diff --git a/bind.te b/bind.te +index 124112346e..710af00bc7 100644 +--- a/bind.te ++++ b/bind.te +@@ -34,7 +34,7 @@ type named_checkconf_exec_t; + init_system_domain(named_t, named_checkconf_exec_t) + + type named_conf_t; +-files_type(named_conf_t) ++files_config_file(named_conf_t) + files_mountpoint(named_conf_t) + + # for secondary zone files +@@ -44,6 +44,9 @@ files_type(named_cache_t) + type named_initrc_exec_t; + init_script_file(named_initrc_exec_t) + ++type named_unit_file_t; ++systemd_unit_file(named_unit_file_t) ++ + type named_keytab_t; + files_type(named_keytab_t) + +@@ -71,8 +74,9 @@ role ndc_roles types ndc_t; + # Local policy + # + +-allow named_t self:capability { chown dac_override fowner setgid setuid sys_chroot sys_nice sys_resource }; ++allow named_t self:capability { chown dac_read_search dac_override fowner net_raw net_admin setgid setuid sys_chroot sys_nice sys_resource }; + dontaudit named_t self:capability sys_tty_config; ++allow named_t self:capability2 block_suspend; + allow named_t self:process { setsched getcap setcap setrlimit signal_perms }; + allow named_t self:fifo_file rw_fifo_file_perms; + allow named_t self:unix_stream_socket { accept listen }; +@@ -84,14 +88,13 @@ allow named_t named_conf_t:dir list_dir_perms; + read_files_pattern(named_t, named_conf_t, named_conf_t) + read_lnk_files_pattern(named_t, named_conf_t, named_conf_t) + ++manage_dirs_pattern(named_t, named_cache_t, named_cache_t) + manage_files_pattern(named_t, named_cache_t, named_cache_t) + manage_lnk_files_pattern(named_t, named_cache_t, named_cache_t) + + allow named_t named_keytab_t:file read_file_perms; + +-append_files_pattern(named_t, named_log_t, named_log_t) +-create_files_pattern(named_t, named_log_t, named_log_t) +-setattr_files_pattern(named_t, named_log_t, named_log_t) ++manage_files_pattern(named_t, named_log_t, named_log_t) + logging_log_filetrans(named_t, named_log_t, file) + + manage_dirs_pattern(named_t, named_tmp_t, named_tmp_t) +@@ -112,10 +115,10 @@ read_lnk_files_pattern(named_t, named_zone_t, named_zone_t) + kernel_read_kernel_sysctls(named_t) + kernel_read_system_state(named_t) + kernel_read_network_state(named_t) ++kernel_read_net_sysctls(named_t) + + corecmd_search_bin(named_t) + +-corenet_all_recvfrom_unlabeled(named_t) + corenet_all_recvfrom_netlabel(named_t) + corenet_tcp_sendrecv_generic_if(named_t) + corenet_udp_sendrecv_generic_if(named_t) +@@ -127,9 +130,15 @@ corenet_udp_bind_generic_node(named_t) + corenet_sendrecv_all_server_packets(named_t) + corenet_tcp_bind_dns_port(named_t) + corenet_udp_bind_dns_port(named_t) ++corenet_udp_bind_ipp_port(named_t) ++corenet_udp_bind_rtsp_port(named_t) ++corenet_udp_bind_dhcpc_port(named_t) ++corenet_udp_bind_kerberos_port(named_t) ++corenet_udp_bind_flash_port(named_t) ++corenet_udp_bind_bgp_port(named_t) + corenet_tcp_sendrecv_dns_port(named_t) + corenet_udp_sendrecv_dns_port(named_t) +- ++corenet_udp_bind_whois_port(named_t) + corenet_tcp_bind_rndc_port(named_t) + corenet_tcp_sendrecv_rndc_port(named_t) + +@@ -140,14 +149,18 @@ corenet_udp_sendrecv_all_ports(named_t) + corenet_sendrecv_all_client_packets(named_t) + corenet_tcp_connect_all_ports(named_t) + corenet_tcp_sendrecv_all_ports(named_t) ++corenet_udp_bind_all_ephemeral_ports(named_t) ++corenet_tcp_bind_all_ephemeral_ports(named_t) + + dev_read_sysfs(named_t) + dev_read_rand(named_t) + dev_read_urand(named_t) ++dev_dontaudit_write_urand(named_t) + + domain_use_interactive_fds(named_t) + + files_read_etc_runtime_files(named_t) ++files_mmap_usr_files(named_t) + + fs_getattr_all_fs(named_t) + fs_search_auto_mountpoints(named_t) +@@ -174,6 +187,19 @@ tunable_policy(`named_write_master_zones',` + manage_lnk_files_pattern(named_t, named_zone_t, named_zone_t) + ') + ++optional_policy(` ++ cron_system_entry(named_t, named_exec_t) ++') ++ ++optional_policy(` ++ # needed by FreeIPA with DNS support ++ dirsrv_stream_connect(named_t) ++') ++ ++optional_policy(` ++ dnssec_trigger_manage_pid_files(named_t) ++') ++ + optional_policy(` + dbus_system_domain(named_t, named_exec_t) + +@@ -187,7 +213,17 @@ optional_policy(` + ') + + optional_policy(` ++ ipa_manage_lib(named_t) ++') ++ ++optional_policy(` ++ ipsec_rw_inherited_pipes(named_t) ++') ++ ++optional_policy(` ++ kerberos_filetrans_named_content(named_t) + kerberos_read_keytab(named_t) ++ kerberos_read_host_rcache(named_t) + kerberos_use(named_t) + ') + +@@ -214,8 +250,9 @@ optional_policy(` + # NDC local policy + # + +-allow ndc_t self:capability { dac_override net_admin }; +-allow ndc_t self:process signal_perms; ++allow ndc_t self:capability { dac_read_search dac_override net_admin }; ++allow ndc_t self:capability2 block_suspend; ++allow ndc_t self:process { fork signal_perms }; + allow ndc_t self:fifo_file rw_fifo_file_perms; + allow ndc_t self:unix_stream_socket { accept listen }; + +@@ -229,10 +266,9 @@ allow ndc_t named_conf_t:lnk_file read_lnk_file_perms; + + allow ndc_t named_zone_t:dir search_dir_perms; + +-kernel_read_kernel_sysctls(ndc_t) + kernel_read_system_state(ndc_t) ++kernel_read_kernel_sysctls(ndc_t) + +-corenet_all_recvfrom_unlabeled(ndc_t) + corenet_all_recvfrom_netlabel(ndc_t) + corenet_tcp_sendrecv_generic_if(ndc_t) + corenet_tcp_sendrecv_generic_node(ndc_t) +@@ -242,6 +278,9 @@ corenet_tcp_bind_generic_node(ndc_t) + corenet_tcp_connect_rndc_port(ndc_t) + corenet_sendrecv_rndc_client_packets(ndc_t) + ++dev_read_rand(ndc_t) ++dev_read_urand(ndc_t) ++ + domain_use_interactive_fds(ndc_t) + + files_search_pids(ndc_t) +@@ -257,7 +296,7 @@ init_use_script_ptys(ndc_t) + + logging_send_syslog_msg(ndc_t) + +-miscfiles_read_localization(ndc_t) ++userdom_use_inherited_user_terminals(ndc_t) + + userdom_use_user_terminals(ndc_t) + +diff --git a/bird.te b/bird.te +index 1d60c27304..f8bb70055b 100644 +--- a/bird.te ++++ b/bird.te +@@ -51,7 +51,6 @@ corenet_tcp_connect_bgp_port(bird_t) + corenet_tcp_sendrecv_bgp_port(bird_t) + + # /etc/iproute2/rt_realms +-files_read_etc_files(bird_t) + + logging_send_syslog_msg(bird_t) + +diff --git a/bitlbee.fc b/bitlbee.fc +index e9708d6cc5..61362d0887 100644 +--- a/bitlbee.fc ++++ b/bitlbee.fc +@@ -7,7 +7,7 @@ + + /var/lib/bitlbee(/.*)? gen_context(system_u:object_r:bitlbee_var_t,s0) + +-/var/log/bip(/.*)? gen_context(system_u:object_r:bitlbee_log_t,s0) ++/var/log/bip.* gen_context(system_u:object_r:bitlbee_log_t,s0) + + /var/run/bitlbee\.pid -- gen_context(system_u:object_r:bitlbee_var_run_t,s0) + /var/run/bitlbee\.sock -s gen_context(system_u:object_r:bitlbee_var_run_t,s0) +diff --git a/bitlbee.if b/bitlbee.if +index e73fb799e8..2badfc0d9b 100644 +--- a/bitlbee.if ++++ b/bitlbee.if +@@ -44,9 +44,13 @@ interface(`bitlbee_admin',` + type bitlbee_log_t, bitlbee_tmp_t; + ') + +- allow $1 bitlbee_t:process { ptrace signal_perms }; ++ allow $1 bitlbee_t:process signal_perms; + ps_process_pattern($1, bitlbee_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 bitlbee_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, bitlbee_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 bitlbee_initrc_exec_t system_r; +diff --git a/bitlbee.te b/bitlbee.te +index f5c1a48b60..102fa8eae2 100644 +--- a/bitlbee.te ++++ b/bitlbee.te +@@ -33,11 +33,14 @@ files_pid_file(bitlbee_var_run_t) + # Local policy + # + +-allow bitlbee_t self:capability { dac_override kill setgid setuid sys_nice }; ++allow bitlbee_t self:capability { dac_read_search dac_override kill setgid setuid sys_nice }; + allow bitlbee_t self:process { setsched signal }; ++ + allow bitlbee_t self:fifo_file rw_fifo_file_perms; +-allow bitlbee_t self:tcp_socket { accept listen }; +-allow bitlbee_t self:unix_stream_socket { accept listen }; ++allow bitlbee_t self:udp_socket create_socket_perms; ++allow bitlbee_t self:tcp_socket { create_stream_socket_perms connected_stream_socket_perms }; ++allow bitlbee_t self:unix_stream_socket create_stream_socket_perms; ++allow bitlbee_t self:netlink_route_socket r_netlink_socket_perms; + + allow bitlbee_t bitlbee_conf_t:dir list_dir_perms; + allow bitlbee_t bitlbee_conf_t:file read_file_perms; +@@ -45,22 +48,25 @@ allow bitlbee_t bitlbee_conf_t:file read_file_perms; + manage_dirs_pattern(bitlbee_t, bitlbee_log_t, bitlbee_log_t) + append_files_pattern(bitlbee_t, bitlbee_log_t, bitlbee_log_t) + create_files_pattern(bitlbee_t, bitlbee_log_t, bitlbee_log_t) ++read_files_pattern(bitlbee_t, bitlbee_log_t, bitlbee_log_t) + setattr_files_pattern(bitlbee_t, bitlbee_log_t, bitlbee_log_t) ++logging_log_filetrans(bitlbee_t, bitlbee_log_t, { dir file }) + + manage_files_pattern(bitlbee_t, bitlbee_tmp_t, bitlbee_tmp_t) + manage_dirs_pattern(bitlbee_t, bitlbee_tmp_t, bitlbee_tmp_t) + files_tmp_filetrans(bitlbee_t, bitlbee_tmp_t, { dir file }) + + manage_files_pattern(bitlbee_t, bitlbee_var_t, bitlbee_var_t) +-files_var_lib_filetrans(bitlbee_t, bitlbee_var_t, file) ++manage_dirs_pattern(bitlbee_t, bitlbee_var_t, bitlbee_var_t) ++files_var_lib_filetrans(bitlbee_t, bitlbee_var_t,{dir file}) + + manage_dirs_pattern(bitlbee_t, bitlbee_var_run_t, bitlbee_var_run_t) + manage_files_pattern(bitlbee_t, bitlbee_var_run_t, bitlbee_var_run_t) + manage_sock_files_pattern(bitlbee_t, bitlbee_var_run_t, bitlbee_var_run_t) + files_pid_filetrans(bitlbee_t, bitlbee_var_run_t, { dir file sock_file }) + +-kernel_read_kernel_sysctls(bitlbee_t) + kernel_read_system_state(bitlbee_t) ++kernel_read_kernel_sysctls(bitlbee_t) + + corenet_all_recvfrom_unlabeled(bitlbee_t) + corenet_all_recvfrom_netlabel(bitlbee_t) +@@ -98,7 +104,9 @@ corenet_tcp_sendrecv_http_cache_port(bitlbee_t) + + corenet_sendrecv_ircd_server_packets(bitlbee_t) + corenet_tcp_bind_ircd_port(bitlbee_t) ++corenet_tcp_bind_interwise_port(bitlbee_t) + corenet_sendrecv_ircd_client_packets(bitlbee_t) ++corenet_tcp_connect_interwise_port(bitlbee_t) + corenet_tcp_connect_ircd_port(bitlbee_t) + corenet_tcp_sendrecv_ircd_port(bitlbee_t) + +@@ -109,16 +117,17 @@ corenet_tcp_sendrecv_interwise_port(bitlbee_t) + dev_read_rand(bitlbee_t) + dev_read_urand(bitlbee_t) + +-files_read_usr_files(bitlbee_t) +- + libs_legacy_use_shared_libs(bitlbee_t) + + auth_use_nsswitch(bitlbee_t) + + logging_send_syslog_msg(bitlbee_t) + +-miscfiles_read_localization(bitlbee_t) ++optional_policy(` ++ dbus_system_bus_client(bitlbee_t) ++') + + optional_policy(` + tcpd_wrapped_domain(bitlbee_t, bitlbee_exec_t) + ') ++ +diff --git a/blkmapd.fc b/blkmapd.fc +new file mode 100644 +index 0000000000..5e59fb4148 +--- /dev/null ++++ b/blkmapd.fc +@@ -0,0 +1,6 @@ ++ ++/etc/rc\.d/init\.d/blkmapd -- gen_context(system_u:object_r:blkmapd_initrc_exec_t,s0) ++ ++/usr/sbin/blkmapd -- gen_context(system_u:object_r:blkmapd_exec_t,s0) ++ ++/var/run/blkmapd\.pid -- gen_context(system_u:object_r:blkmapd_var_run_t,s0) +diff --git a/blkmapd.if b/blkmapd.if +new file mode 100644 +index 0000000000..76663796f7 +--- /dev/null ++++ b/blkmapd.if +@@ -0,0 +1,121 @@ ++ ++## The blkmapd daemon performs device discovery and mapping for pNFS block layout client. ++ ++######################################## ++## ++## Execute blkmapd_exec_t in the blkmapd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`blkmapd_domtrans',` ++ gen_require(` ++ type blkmapd_t, blkmapd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, blkmapd_exec_t, blkmapd_t) ++') ++ ++###################################### ++## ++## Execute blkmapd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`blkmapd_exec',` ++ gen_require(` ++ type blkmapd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, blkmapd_exec_t) ++') ++ ++######################################## ++## ++## Execute blkmapd server in the blkmapd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`blkmapd_initrc_domtrans',` ++ gen_require(` ++ type blkmapd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, blkmapd_initrc_exec_t) ++') ++######################################## ++## ++## Read blkmapd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`blkmapd_read_pid_files',` ++ gen_require(` ++ type blkmapd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, blkmapd_var_run_t, blkmapd_var_run_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an blkmapd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`blkmapd_admin',` ++ gen_require(` ++ type blkmapd_t; ++ type blkmapd_initrc_exec_t; ++ type blkmapd_var_run_t; ++ ') ++ ++ allow $1 blkmapd_t:process { signal_perms }; ++ ps_process_pattern($1, blkmapd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 blkmapd_t:process ptrace; ++ ') ++ ++ blkmapd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 blkmapd_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ files_search_pids($1) ++ admin_pattern($1, blkmapd_var_run_t) ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/blkmapd.te b/blkmapd.te +new file mode 100644 +index 0000000000..6cfb35592d +--- /dev/null ++++ b/blkmapd.te +@@ -0,0 +1,44 @@ ++policy_module(blkmapd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type blkmapd_t; ++type blkmapd_exec_t; ++init_daemon_domain(blkmapd_t, blkmapd_exec_t) ++ ++type blkmapd_initrc_exec_t; ++init_script_file(blkmapd_initrc_exec_t) ++ ++type blkmapd_var_run_t; ++files_pid_file(blkmapd_var_run_t) ++ ++ ++######################################## ++# ++# blkmapd local policy ++# ++ ++allow blkmapd_t self:capability sys_rawio; ++ ++manage_files_pattern(blkmapd_t, blkmapd_var_run_t, blkmapd_var_run_t) ++files_pid_filetrans(blkmapd_t, blkmapd_var_run_t, file) ++ ++kernel_read_system_state(blkmapd_t) ++ ++dev_list_sysfs(blkmapd_t) ++ ++fs_list_rpc(blkmapd_t) ++fs_rw_rpc_named_pipes(blkmapd_t) ++ ++storage_raw_read_fixed_disk(blkmapd_t) ++storage_raw_read_removable_device(blkmapd_t) ++ ++ ++logging_send_syslog_msg(blkmapd_t) ++ ++optional_policy(` ++ rpc_read_nfs_state_data(blkmapd_t) ++') +diff --git a/blueman.fc b/blueman.fc +index c295d2e018..4f84e9c141 100644 +--- a/blueman.fc ++++ b/blueman.fc +@@ -1,3 +1,4 @@ ++ + /usr/libexec/blueman-mechanism -- gen_context(system_u:object_r:blueman_exec_t,s0) + + /var/lib/blueman(/.*)? gen_context(system_u:object_r:blueman_var_lib_t,s0) +diff --git a/blueman.if b/blueman.if +index 16ec52526a..1dd40595cf 100644 +--- a/blueman.if ++++ b/blueman.if +@@ -38,6 +38,7 @@ interface(`blueman_dbus_chat',` + + allow $1 blueman_t:dbus send_msg; + allow blueman_t $1:dbus send_msg; ++ ps_process_pattern(blueman_t, $1) + ') + + ######################################## +diff --git a/blueman.te b/blueman.te +index 3a5032e06d..7987a21b1b 100644 +--- a/blueman.te ++++ b/blueman.te +@@ -7,7 +7,7 @@ policy_module(blueman, 1.1.0) + + type blueman_t; + type blueman_exec_t; +-dbus_system_domain(blueman_t, blueman_exec_t) ++init_daemon_domain(blueman_t, blueman_exec_t) + + type blueman_var_lib_t; + files_type(blueman_var_lib_t) +@@ -21,7 +21,8 @@ files_pid_file(blueman_var_run_t) + # + + allow blueman_t self:capability { net_admin sys_nice }; +-allow blueman_t self:process { signal_perms setsched }; ++allow blueman_t self:process { execmem signal_perms setsched }; ++ + allow blueman_t self:fifo_file rw_fifo_file_perms; + + manage_dirs_pattern(blueman_t, blueman_var_lib_t, blueman_var_lib_t) +@@ -32,7 +33,7 @@ manage_dirs_pattern(blueman_t, blueman_var_run_t, blueman_var_run_t) + manage_files_pattern(blueman_t, blueman_var_run_t, blueman_var_run_t) + files_pid_filetrans(blueman_t, blueman_var_run_t, { dir file }) + +-kernel_read_net_sysctls(blueman_t) ++kernel_rw_net_sysctls(blueman_t) + kernel_read_system_state(blueman_t) + kernel_request_load_module(blueman_t) + +@@ -41,29 +42,45 @@ corecmd_exec_bin(blueman_t) + dev_read_rand(blueman_t) + dev_read_urand(blueman_t) + dev_rw_wireless(blueman_t) ++dev_rwx_zero(blueman_t) + + domain_use_interactive_fds(blueman_t) + + files_list_tmp(blueman_t) +-files_read_usr_files(blueman_t) ++files_dontaudit_write_all_mountpoints(blueman_t) + + auth_use_nsswitch(blueman_t) + + logging_send_syslog_msg(blueman_t) + +-miscfiles_read_localization(blueman_t) +- + sysnet_domtrans_ifconfig(blueman_t) ++sysnet_dns_name_resolve(blueman_t) + + optional_policy(` + avahi_domtrans(blueman_t) + ') + ++optional_policy(` ++ bluetooth_read_config(blueman_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(blueman_t, blueman_exec_t) ++') ++ + optional_policy(` + dnsmasq_domtrans(blueman_t) + dnsmasq_read_pid_files(blueman_t) + ') + ++optional_policy(` ++ gnome_search_gconf(blueman_t) ++') ++ + optional_policy(` + iptables_domtrans(blueman_t) + ') ++ ++optional_policy(` ++ xserver_read_state_xdm(blueman_t) ++') +diff --git a/bluetooth.fc b/bluetooth.fc +index 2b9c7f3296..0086b95d12 100644 +--- a/bluetooth.fc ++++ b/bluetooth.fc +@@ -5,10 +5,14 @@ + /etc/rc\.d/init\.d/dund -- gen_context(system_u:object_r:bluetooth_initrc_exec_t,s0) + /etc/rc\.d/init\.d/pand -- gen_context(system_u:object_r:bluetooth_initrc_exec_t,s0) + ++/usr/lib/systemd/system/bluetooth.* -- gen_context(system_u:object_r:bluetooth_unit_file_t,s0) ++ + /usr/bin/blue.*pin -- gen_context(system_u:object_r:bluetooth_helper_exec_t,s0) + /usr/bin/dund -- gen_context(system_u:object_r:bluetooth_exec_t,s0) + /usr/bin/hidd -- gen_context(system_u:object_r:bluetooth_exec_t,s0) + /usr/bin/rfcomm -- gen_context(system_u:object_r:bluetooth_exec_t,s0) ++/usr/bin/pand -- gen_context(system_u:object_r:bluetooth_exec_t,s0) ++/usr/libexec/bluetooth/bluetoothd -- gen_context(system_u:object_r:bluetooth_exec_t,s0) + + /usr/sbin/bluetoothd -- gen_context(system_u:object_r:bluetooth_exec_t,s0) + /usr/sbin/hciattach -- gen_context(system_u:object_r:bluetooth_exec_t,s0) +diff --git a/bluetooth.if b/bluetooth.if +index c723a0ae05..d3611b6589 100644 +--- a/bluetooth.if ++++ b/bluetooth.if +@@ -37,7 +37,12 @@ interface(`bluetooth_role',` + domtrans_pattern($2, bluetooth_helper_exec_t, bluetooth_helper_t) + + ps_process_pattern($2, bluetooth_helper_t) +- allow $2 bluetooth_helper_t:process { ptrace signal_perms }; ++ ++ allow $2 bluetooth_helper_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 bluetooth_helper_t:process ptrace; ++ ') + + allow $2 bluetooth_t:socket rw_socket_perms; + +@@ -45,8 +50,10 @@ interface(`bluetooth_role',` + allow $2 { bluetooth_helper_tmp_t bluetooth_helper_tmpfs_t }:file { manage_file_perms relabel_file_perms }; + allow $2 bluetooth_helper_tmp_t:sock_file { manage_sock_file_perms relabel_sock_file_perms }; + ++ manage_dirs_pattern($2, bluetooth_helper_tmpfs_t, bluetooth_helper_tmpfs_t) ++ manage_files_pattern($2, bluetooth_helper_tmpfs_t, bluetooth_helper_tmpfs_t) ++ bluetooth_stream_connect($2) + stream_connect_pattern($2, bluetooth_var_run_t, bluetooth_var_run_t, bluetooth_t) +- files_search_pids($2) + ') + + ##################################### +@@ -63,11 +70,14 @@ interface(`bluetooth_role',` + interface(`bluetooth_stream_connect',` + gen_require(` + type bluetooth_t, bluetooth_var_run_t; ++ type bluetooth_tmp_t; + ') + + files_search_pids($1) + allow $1 bluetooth_t:socket rw_socket_perms; ++ allow $1 bluetooth_t:bluetooth_socket rw_socket_perms; + stream_connect_pattern($1, bluetooth_var_run_t, bluetooth_var_run_t, bluetooth_t) ++ stream_connect_pattern($1, bluetooth_tmp_t, bluetooth_tmp_t, bluetooth_t) + ') + + ######################################## +@@ -128,6 +138,27 @@ interface(`bluetooth_dbus_chat',` + allow bluetooth_t $1:dbus send_msg; + ') + ++######################################## ++## ++## dontaudit Send and receive messages from ++## bluetooth over dbus. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`bluetooth_dontaudit_dbus_chat',` ++ gen_require(` ++ type bluetooth_t; ++ class dbus send_msg; ++ ') ++ ++ dontaudit $1 bluetooth_t:dbus send_msg; ++ dontaudit bluetooth_t $1:dbus send_msg; ++') ++ + ######################################## + ## + ## Execute bluetooth_helper in the bluetooth_helper domain. (Deprecated) +@@ -188,6 +219,30 @@ interface(`bluetooth_dontaudit_read_helper_state',` + dontaudit $1 bluetooth_helper_t:file read_file_perms; + ') + ++######################################## ++## ++## Execute bluetooth server in the bluetooth domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`bluetooth_systemctl',` ++ gen_require(` ++ type bluetooth_t; ++ type bluetooth_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 bluetooth_unit_file_t:file read_file_perms; ++ allow $1 bluetooth_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, bluetooth_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -210,12 +265,16 @@ interface(`bluetooth_admin',` + type bluetooth_t, bluetooth_tmp_t, bluetooth_lock_t; + type bluetooth_var_lib_t, bluetooth_var_run_t; + type bluetooth_conf_t, bluetooth_conf_rw_t, bluetooth_var_lib_t; +- type bluetooth_initrc_exec_t; ++ type bluetooth_unit_file_t, bluetooth_initrc_exec_t; + ') + +- allow $1 bluetooth_t:process { ptrace signal_perms }; ++ allow $1 bluetooth_t:process signal_perms; + ps_process_pattern($1, bluetooth_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 bluetooth_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, bluetooth_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 bluetooth_initrc_exec_t system_r; +@@ -235,4 +294,8 @@ interface(`bluetooth_admin',` + + files_list_pids($1) + admin_pattern($1, bluetooth_var_run_t) ++ ++ bluetooth_systemctl($1) ++ admin_pattern($1, bluetooth_unit_file_t) ++ allow $1 bluetooth_unit_file_t:service all_service_perms; + ') +diff --git a/bluetooth.te b/bluetooth.te +index 851769e555..903bc0f9eb 100644 +--- a/bluetooth.te ++++ b/bluetooth.te +@@ -10,6 +10,7 @@ attribute_role bluetooth_helper_roles; + type bluetooth_t; + type bluetooth_exec_t; + init_daemon_domain(bluetooth_t, bluetooth_exec_t) ++init_nnp_daemon_domain(bluetooth_t) + + type bluetooth_conf_t; + files_config_file(bluetooth_conf_t) +@@ -49,12 +50,15 @@ files_type(bluetooth_var_lib_t) + type bluetooth_var_run_t; + files_pid_file(bluetooth_var_run_t) + ++type bluetooth_unit_file_t; ++systemd_unit_file(bluetooth_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow bluetooth_t self:capability { dac_override net_bind_service net_admin net_raw setpcap sys_admin sys_tty_config ipc_lock }; ++allow bluetooth_t self:capability { dac_read_search dac_override net_bind_service net_admin net_raw setpcap sys_admin sys_tty_config ipc_lock }; + dontaudit bluetooth_t self:capability sys_tty_config; + allow bluetooth_t self:process { getcap setcap getsched signal_perms }; + allow bluetooth_t self:fifo_file rw_fifo_file_perms; +@@ -62,6 +66,8 @@ allow bluetooth_t self:shm create_shm_perms; + allow bluetooth_t self:socket create_stream_socket_perms; + allow bluetooth_t self:unix_stream_socket { accept connectto listen }; + allow bluetooth_t self:tcp_socket { accept listen }; ++allow bluetooth_t self:alg_socket create_stream_socket_perms; ++allow bluetooth_t self:bluetooth_socket create_stream_socket_perms; + allow bluetooth_t self:netlink_kobject_uevent_socket create_socket_perms; + + read_files_pattern(bluetooth_t, bluetooth_conf_t, bluetooth_conf_t) +@@ -78,10 +84,12 @@ files_lock_filetrans(bluetooth_t, bluetooth_lock_t, file) + + manage_dirs_pattern(bluetooth_t, bluetooth_tmp_t, bluetooth_tmp_t) + manage_files_pattern(bluetooth_t, bluetooth_tmp_t, bluetooth_tmp_t) +-files_tmp_filetrans(bluetooth_t, bluetooth_tmp_t, { dir file }) ++manage_fifo_files_pattern(bluetooth_t, bluetooth_tmp_t, bluetooth_tmp_t) ++files_tmp_filetrans(bluetooth_t, bluetooth_tmp_t, { dir file fifo_file }) + + manage_dirs_pattern(bluetooth_t, bluetooth_var_lib_t, bluetooth_var_lib_t) + manage_files_pattern(bluetooth_t, bluetooth_var_lib_t, bluetooth_var_lib_t) ++allow bluetooth_t bluetooth_var_lib_t:file map; + files_var_lib_filetrans(bluetooth_t, bluetooth_var_lib_t, { dir file } ) + + manage_files_pattern(bluetooth_t, bluetooth_var_run_t, bluetooth_var_run_t) +@@ -90,27 +98,37 @@ files_pid_filetrans(bluetooth_t, bluetooth_var_run_t, { file sock_file }) + + can_exec(bluetooth_t, bluetooth_helper_exec_t) + ++corecmd_exec_bin(bluetooth_t) ++corecmd_exec_shell(bluetooth_t) ++ + kernel_read_kernel_sysctls(bluetooth_t) + kernel_read_system_state(bluetooth_t) + kernel_read_network_state(bluetooth_t) + kernel_request_load_module(bluetooth_t) + kernel_search_debugfs(bluetooth_t) + +-corecmd_exec_bin(bluetooth_t) +-corecmd_exec_shell(bluetooth_t) +- +-dev_read_sysfs(bluetooth_t) ++corenet_all_recvfrom_netlabel(bluetooth_t) ++corenet_tcp_sendrecv_generic_if(bluetooth_t) ++corenet_udp_sendrecv_generic_if(bluetooth_t) ++corenet_raw_sendrecv_generic_if(bluetooth_t) ++corenet_tcp_sendrecv_generic_node(bluetooth_t) ++corenet_udp_sendrecv_generic_node(bluetooth_t) ++corenet_raw_sendrecv_generic_node(bluetooth_t) ++corenet_tcp_sendrecv_all_ports(bluetooth_t) ++corenet_udp_sendrecv_all_ports(bluetooth_t) ++ ++dev_rw_sysfs(bluetooth_t) + dev_rw_usbfs(bluetooth_t) + dev_rw_generic_usb_dev(bluetooth_t) + dev_read_urand(bluetooth_t) + dev_rw_input_dev(bluetooth_t) + dev_rw_wireless(bluetooth_t) ++dev_rw_uhid_dev(bluetooth_t) + + domain_use_interactive_fds(bluetooth_t) + domain_dontaudit_search_all_domains_state(bluetooth_t) + + files_read_etc_runtime_files(bluetooth_t) +-files_read_usr_files(bluetooth_t) + + fs_getattr_all_fs(bluetooth_t) + fs_search_auto_mountpoints(bluetooth_t) +@@ -122,7 +140,6 @@ auth_use_nsswitch(bluetooth_t) + + logging_send_syslog_msg(bluetooth_t) + +-miscfiles_read_localization(bluetooth_t) + miscfiles_read_fonts(bluetooth_t) + miscfiles_read_hwdata(bluetooth_t) + +@@ -130,6 +147,10 @@ userdom_dontaudit_use_unpriv_user_fds(bluetooth_t) + userdom_dontaudit_use_user_terminals(bluetooth_t) + userdom_dontaudit_search_user_home_dirs(bluetooth_t) + ++# machine-info ++systemd_hostnamed_read_config(bluetooth_t) ++systemd_dbus_chat_hostnamed(bluetooth_t) ++ + optional_policy(` + dbus_system_bus_client(bluetooth_t) + dbus_connect_system_bus(bluetooth_t) +@@ -200,7 +221,6 @@ dev_read_urand(bluetooth_helper_t) + domain_read_all_domains_state(bluetooth_helper_t) + + files_read_etc_runtime_files(bluetooth_helper_t) +-files_read_usr_files(bluetooth_helper_t) + files_dontaudit_list_default(bluetooth_helper_t) + + term_dontaudit_use_all_ttys(bluetooth_helper_t) +diff --git a/boinc.fc b/boinc.fc +index 6d3ccad60d..bda740a711 100644 +--- a/boinc.fc ++++ b/boinc.fc +@@ -1,9 +1,12 @@ +-/etc/rc\.d/init\.d/boinc-client -- gen_context(system_u:object_r:boinc_initrc_exec_t,s0) + +-/usr/bin/boinc_client -- gen_context(system_u:object_r:boinc_exec_t,s0) ++/etc/rc\.d/init\.d/boinc-client -- gen_context(system_u:object_r:boinc_initrc_exec_t,s0) + +-/var/lib/boinc(/.*)? gen_context(system_u:object_r:boinc_var_lib_t,s0) +-/var/lib/boinc/projects(/.*)? gen_context(system_u:object_r:boinc_project_var_lib_t,s0) +-/var/lib/boinc/slots(/.*)? gen_context(system_u:object_r:boinc_project_var_lib_t,s0) ++/usr/bin/boinc_client -- gen_context(system_u:object_r:boinc_exec_t,s0) + +-/var/log/boinc\.log.* -- gen_context(system_u:object_r:boinc_log_t,s0) ++/usr/lib/systemd/system/boinc-client\.service -- gen_context(system_u:object_r:boinc_unit_file_t,s0) ++ ++/var/lib/boinc(/.*)? gen_context(system_u:object_r:boinc_var_lib_t,s0) ++/var/lib/boinc/projects(/.*)? gen_context(system_u:object_r:boinc_project_var_lib_t,s0) ++/var/lib/boinc/slots(/.*)? gen_context(system_u:object_r:boinc_project_var_lib_t,s0) ++ ++/var/log/boinc\.log.* -- gen_context(system_u:object_r:boinc_log_t,s0) +diff --git a/boinc.if b/boinc.if +index 02fefaaf76..308616e8dd 100644 +--- a/boinc.if ++++ b/boinc.if +@@ -1,9 +1,166 @@ +-## Platform for computing using volunteered resources. ++## policy for boinc + + ######################################## + ## +-## All of the rules required to +-## administrate an boinc environment. ++## Execute a domain transition to run boinc. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`boinc_domtrans',` ++ gen_require(` ++ type boinc_t, boinc_exec_t; ++ ') ++ ++ domtrans_pattern($1, boinc_exec_t, boinc_t) ++') ++ ++####################################### ++## ++## Execute boinc server in the boinc domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_initrc_domtrans',` ++ gen_require(` ++ type boinc_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, boinc_initrc_exec_t) ++') ++ ++####################################### ++## ++## Dontaudit getattr on boinc lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_dontaudit_getattr_lib',` ++ gen_require(` ++ type boinc_var_lib_t; ++ ') ++ ++ dontaudit $1 boinc_var_lib_t:file getattr; ++') ++ ++######################################## ++## ++## Search boinc lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_search_lib',` ++ gen_require(` ++ type boinc_var_lib_t; ++ ') ++ ++ allow $1 boinc_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read boinc lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_read_lib_files',` ++ gen_require(` ++ type boinc_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, boinc_var_lib_t, boinc_var_lib_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## boinc lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_manage_lib_files',` ++ gen_require(` ++ type boinc_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, boinc_var_lib_t, boinc_var_lib_t) ++') ++ ++######################################## ++## ++## Manage boinc var_lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boinc_manage_var_lib',` ++ gen_require(` ++ type boinc_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, boinc_var_lib_t, boinc_var_lib_t) ++ manage_files_pattern($1, boinc_var_lib_t, boinc_var_lib_t) ++ manage_lnk_files_pattern($1, boinc_var_lib_t, boinc_var_lib_t) ++') ++ ++####################################### ++## ++## Execute boinc server in the boinc domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`boinc_systemctl',` ++ gen_require(` ++ type boinc_t; ++ type boinc_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 boinc_unit_file_t:file read_file_perms; ++ allow $1 boinc_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, boinc_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an boinc environment. + ## + ## + ## +@@ -19,26 +176,32 @@ + # + interface(`boinc_admin',` + gen_require(` +- +- type boinc_t, boinc_project_t, boinc_log_t; +- type boinc_var_lib_t, boinc_tmp_t, boinc_initrc_exec_t; +- type boinc_project_var_lib_t, boinc_project_tmp_t; ++ type boinc_t, boinc_initrc_exec_t, boinc_var_lib_t; ++ type boinc_unit_file_t; + ') + +- allow $1 { boinc_t boinc_project_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { boinc_t boinc_project_t }) ++ allow $1 boinc_t:process signal_perms; ++ ps_process_pattern($1, boinc_t) + +- init_labeled_script_domtrans($1, boinc_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 boinc_t:process ptrace; ++ ') ++ ++ boinc_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 boinc_initrc_exec_t system_r; + allow $2 system_r; + +- logging_search_logs($1) +- admin_pattern($1, boinc_log_t) ++ files_list_var_lib($1) ++ admin_pattern($1, boinc_var_lib_t) + +- files_search_tmp($1) +- admin_pattern($1, { boinc_project_tmp_t boinc_tmp_t }) ++ boinc_systemctl($1) ++ admin_pattern($1, boinc_unit_file_t) + +- files_search_var_lib($1) +- admin_pattern($1, { boinc_project_var_lib_t boinc_var_lib_t }) ++ allow $1 boinc_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/boinc.te b/boinc.te +index 687d4c48df..8ba0f8bdbd 100644 +--- a/boinc.te ++++ b/boinc.te +@@ -12,7 +12,9 @@ policy_module(boinc, 1.1.1) + ## + gen_tunable(boinc_execmem, true) + +-type boinc_t; ++attribute boinc_domain; ++ ++type boinc_t, boinc_domain; + type boinc_exec_t; + init_daemon_domain(boinc_t, boinc_exec_t) + +@@ -28,31 +30,69 @@ files_tmpfs_file(boinc_tmpfs_t) + type boinc_var_lib_t; + files_type(boinc_var_lib_t) + +-type boinc_project_var_lib_t; +-files_type(boinc_project_var_lib_t) +- + type boinc_log_t; + logging_log_file(boinc_log_t) + ++type boinc_unit_file_t; ++systemd_unit_file(boinc_unit_file_t) ++ + type boinc_project_t; + domain_type(boinc_project_t) +-domain_entry_file(boinc_project_t, boinc_project_var_lib_t) + role system_r types boinc_project_t; + + type boinc_project_tmp_t; + files_tmp_file(boinc_project_tmp_t) + ++type boinc_project_var_lib_t; ++files_type(boinc_project_var_lib_t) ++ ++####################################### ++# ++# boinc domain local policy ++# ++ ++allow boinc_domain self:fifo_file rw_fifo_file_perms; ++allow boinc_domain self:process signal; ++allow boinc_domain self:sem create_sem_perms; ++ ++manage_dirs_pattern(boinc_domain, boinc_var_lib_t, boinc_var_lib_t) ++manage_files_pattern(boinc_domain, boinc_var_lib_t, boinc_var_lib_t) ++manage_lnk_files_pattern(boinc_domain, boinc_var_lib_t, boinc_var_lib_t) ++ ++corecmd_exec_bin(boinc_domain) ++corecmd_exec_shell(boinc_domain) ++ ++dev_read_rand(boinc_domain) ++dev_read_urand(boinc_domain) ++dev_read_sysfs(boinc_domain) ++dev_rw_xserver_misc(boinc_domain) ++ ++domain_read_all_domains_state(boinc_domain) ++ ++files_read_etc_runtime_files(boinc_domain) ++ ++fs_getattr_all_fs(boinc_domain) ++ ++miscfiles_read_fonts(boinc_domain) ++ ++tunable_policy(`boinc_execmem',` ++ allow boinc_domain self:process { execstack execmem }; ++') ++ ++optional_policy(` ++ sysnet_dns_name_resolve(boinc_domain) ++') ++ + ######################################## + # +-# Local policy ++# boinc local policy + # + + allow boinc_t self:process { setsched setpgid signull sigkill }; +-allow boinc_t self:unix_stream_socket { accept listen }; +-allow boinc_t self:tcp_socket { accept listen }; ++ ++allow boinc_t self:unix_stream_socket create_stream_socket_perms; ++allow boinc_t self:tcp_socket create_stream_socket_perms; + allow boinc_t self:shm create_shm_perms; +-allow boinc_t self:fifo_file rw_fifo_file_perms; +-allow boinc_t self:sem create_sem_perms; + + manage_dirs_pattern(boinc_t, boinc_tmp_t, boinc_tmp_t) + manage_files_pattern(boinc_t, boinc_tmp_t, boinc_tmp_t) +@@ -60,75 +100,51 @@ files_tmp_filetrans(boinc_t, boinc_tmp_t, { dir file }) + + manage_files_pattern(boinc_t, boinc_tmpfs_t, boinc_tmpfs_t) + fs_tmpfs_filetrans(boinc_t, boinc_tmpfs_t, file) ++allow boinc_t boinc_tmpfs_t:file map; + +-manage_dirs_pattern(boinc_t, boinc_var_lib_t, boinc_var_lib_t) +-manage_files_pattern(boinc_t, boinc_var_lib_t, boinc_var_lib_t) +-manage_lnk_files_pattern(boinc_t, boinc_var_lib_t, boinc_var_lib_t) +- +-# entry files to the boinc_project_t domain +-manage_dirs_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_var_lib_t) +-manage_files_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_var_lib_t) ++exec_files_pattern(boinc_t, boinc_var_lib_t, boinc_var_lib_t) ++# this should be created by default by boinc ++# we need this label for transition to boinc_project_t ++# other boinc lib files will end up with boinc_var_lib_t + filetrans_pattern(boinc_t, boinc_var_lib_t, boinc_project_var_lib_t, dir, "slots") + filetrans_pattern(boinc_t, boinc_var_lib_t, boinc_project_var_lib_t, dir, "projects") + +-append_files_pattern(boinc_t, boinc_log_t, boinc_log_t) +-create_files_pattern(boinc_t, boinc_log_t, boinc_log_t) +-setattr_files_pattern(boinc_t, boinc_log_t, boinc_log_t) +-logging_log_filetrans(boinc_t, boinc_log_t, file) +- +-can_exec(boinc_t, boinc_var_lib_t) ++manage_dirs_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_var_lib_t) ++manage_files_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_var_lib_t) ++allow boinc_t boinc_project_var_lib_t:file map; + +-domtrans_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_t) ++manage_files_pattern(boinc_t, boinc_log_t, boinc_log_t) ++logging_log_filetrans(boinc_t, boinc_log_t, { file }) + ++# needs read /proc/interrupts + kernel_read_system_state(boinc_t) ++kernel_read_network_state(boinc_t) + kernel_search_vm_sysctl(boinc_t) + +-corenet_all_recvfrom_unlabeled(boinc_t) ++dev_getattr_mouse_dev(boinc_t) ++ ++files_getattr_all_dirs(boinc_t) ++files_getattr_all_files(boinc_t) ++ + corenet_all_recvfrom_netlabel(boinc_t) + corenet_tcp_sendrecv_generic_if(boinc_t) ++corenet_udp_sendrecv_generic_if(boinc_t) + corenet_tcp_sendrecv_generic_node(boinc_t) ++corenet_udp_sendrecv_generic_node(boinc_t) ++corenet_tcp_sendrecv_all_ports(boinc_t) ++corenet_udp_sendrecv_all_ports(boinc_t) + corenet_tcp_bind_generic_node(boinc_t) +- +-corenet_sendrecv_boinc_client_packets(boinc_t) +-corenet_sendrecv_boinc_server_packets(boinc_t) ++corenet_udp_bind_generic_node(boinc_t) + corenet_tcp_bind_boinc_port(boinc_t) +-corenet_tcp_connect_boinc_port(boinc_t) +-corenet_tcp_sendrecv_boinc_port(boinc_t) +- +-corenet_sendrecv_boinc_client_server_packets(boinc_t) + corenet_tcp_bind_boinc_client_port(boinc_t) +-corenet_tcp_sendrecv_boinc_client_port(boinc_t) +- +-corenet_sendrecv_http_client_packets(boinc_t) ++corenet_tcp_connect_boinc_port(boinc_t) + corenet_tcp_connect_http_port(boinc_t) +-corenet_tcp_sendrecv_http_port(boinc_t) +- +-corenet_sendrecv_http_cache_client_packets(boinc_t) + corenet_tcp_connect_http_cache_port(boinc_t) +-corenet_tcp_sendrecv_http_cache_port(boinc_t) +- +-corenet_sendrecv_squid_client_packets(boinc_t) + corenet_tcp_connect_squid_port(boinc_t) +-corenet_tcp_sendrecv_squid_port(boinc_t) +- +-corecmd_exec_bin(boinc_t) +-corecmd_exec_shell(boinc_t) +- +-dev_read_rand(boinc_t) +-dev_read_urand(boinc_t) +-dev_read_sysfs(boinc_t) +-dev_rw_xserver_misc(boinc_t) +- +-domain_read_all_domains_state(boinc_t) + + files_dontaudit_getattr_boot_dirs(boinc_t) +-files_getattr_all_dirs(boinc_t) +-files_getattr_all_files(boinc_t) +-files_read_etc_files(boinc_t) +-files_read_etc_runtime_files(boinc_t) +-files_read_usr_files(boinc_t) + +-fs_getattr_all_fs(boinc_t) ++auth_read_passwd(boinc_t) + + term_getattr_all_ptys(boinc_t) + term_getattr_unallocated_ttys(boinc_t) +@@ -137,8 +153,9 @@ init_read_utmp(boinc_t) + + logging_send_syslog_msg(boinc_t) + +-miscfiles_read_fonts(boinc_t) +-miscfiles_read_localization(boinc_t) ++modutils_dontaudit_exec_insmod(boinc_t) ++ ++xserver_stream_connect(boinc_t) + + tunable_policy(`boinc_execmem',` + allow boinc_t self:process { execstack execmem }; +@@ -148,48 +165,61 @@ optional_policy(` + mta_send_mail(boinc_t) + ') + +-optional_policy(` +- sysnet_dns_name_resolve(boinc_t) +-') +- + ######################################## + # +-# Project local policy ++# boinc-projects local policy + # + + allow boinc_project_t self:capability { setuid setgid }; +-allow boinc_project_t self:process { execmem execstack noatsecure ptrace setcap getcap setpgid setsched signal_perms }; ++ ++domtrans_pattern(boinc_t, boinc_project_var_lib_t, boinc_project_t) ++allow boinc_t boinc_project_t:process sigkill; ++allow boinc_t boinc_project_t:process noatsecure; ++ ++allow boinc_project_t self:process { setcap getcap setpgid setsched signal signull sigkill sigstop }; ++tunable_policy(`deny_ptrace',`',` ++ allow boinc_project_t self:process ptrace; ++') ++ ++allow boinc_project_t self:process { execstack }; + + manage_dirs_pattern(boinc_project_t, boinc_project_tmp_t, boinc_project_tmp_t) + manage_files_pattern(boinc_project_t, boinc_project_tmp_t, boinc_project_tmp_t) + manage_sock_files_pattern(boinc_project_t, boinc_project_tmp_t, boinc_project_tmp_t) + files_tmp_filetrans(boinc_project_t, boinc_project_tmp_t, { dir file sock_file}) + ++allow boinc_project_t boinc_project_var_lib_t:file entrypoint; ++exec_files_pattern(boinc_project_t, boinc_project_var_lib_t, boinc_project_var_lib_t) + manage_dirs_pattern(boinc_project_t, boinc_project_var_lib_t, boinc_project_var_lib_t) + manage_files_pattern(boinc_project_t, boinc_project_var_lib_t, boinc_project_var_lib_t) ++files_var_lib_filetrans(boinc_project_t, boinc_project_var_lib_t, dir, "projects") ++files_var_lib_filetrans(boinc_project_t, boinc_project_var_lib_t, dir, "slots" ) + + allow boinc_project_t boinc_project_var_lib_t:file execmod; +-can_exec(boinc_project_t, boinc_project_var_lib_t) + + allow boinc_project_t boinc_t:shm rw_shm_perms; +-allow boinc_project_t boinc_tmpfs_t:file { read write }; ++allow boinc_project_t boinc_tmpfs_t:file rw_inherited_file_perms; + + kernel_read_kernel_sysctls(boinc_project_t) +-kernel_read_network_state(boinc_project_t) + kernel_search_vm_sysctl(boinc_project_t) ++kernel_read_network_state(boinc_project_t) + +-corenet_all_recvfrom_unlabeled(boinc_project_t) +-corenet_all_recvfrom_netlabel(boinc_project_t) +-corenet_tcp_sendrecv_generic_if(boinc_project_t) +-corenet_tcp_sendrecv_generic_node(boinc_project_t) +-corenet_tcp_bind_generic_node(boinc_project_t) +- +-corenet_sendrecv_boinc_client_packets(boinc_project_t) + corenet_tcp_connect_boinc_port(boinc_project_t) +-corenet_tcp_sendrecv_boinc_port(boinc_project_t) + + files_dontaudit_search_home(boinc_project_t) + ++# needed by java ++fs_read_hugetlbfs_files(boinc_project_t) ++ ++optional_policy(` ++ gnome_read_gconf_config(boinc_project_t) ++') ++ + optional_policy(` + java_exec(boinc_project_t) + ') ++ ++# until solution for VirtualBox, java .. ++optional_policy(` ++ unconfined_domain(boinc_project_t) ++') +diff --git a/boltd.fc b/boltd.fc +new file mode 100644 +index 0000000000..e0bdf7663f +--- /dev/null ++++ b/boltd.fc +@@ -0,0 +1,5 @@ ++/usr/libexec/boltd -- gen_context(system_u:object_r:boltd_exec_t,s0) ++ ++/var/lib/boltd(/.*)? gen_context(system_u:object_r:boltd_var_lib_t,s0) ++ ++/var/run/boltd(/.*)? gen_context(system_u:object_r:boltd_var_run_t,s0) +diff --git a/boltd.if b/boltd.if +new file mode 100644 +index 0000000000..cdec3f10d9 +--- /dev/null ++++ b/boltd.if +@@ -0,0 +1,213 @@ ++ ++## policy for boltd ++ ++######################################## ++## ++## Execute boltd_exec_t in the boltd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`boltd_domtrans',` ++ gen_require(` ++ type boltd_t, boltd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, boltd_exec_t, boltd_t) ++') ++ ++###################################### ++## ++## Execute boltd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_exec',` ++ gen_require(` ++ type boltd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, boltd_exec_t) ++') ++ ++######################################## ++## ++## Search boltd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_search_lib',` ++ gen_require(` ++ type boltd_var_lib_t; ++ ') ++ ++ allow $1 boltd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read boltd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_read_lib_files',` ++ gen_require(` ++ type boltd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, boltd_var_lib_t, boltd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage boltd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_manage_lib_files',` ++ gen_require(` ++ type boltd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, boltd_var_lib_t, boltd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage boltd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_manage_lib_dirs',` ++ gen_require(` ++ type boltd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, boltd_var_lib_t, boltd_var_lib_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an boltd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`boltd_admin',` ++ gen_require(` ++ type boltd_t; ++ type boltd_var_lib_t; ++ ') ++ ++ allow $1 boltd_t:process { signal_perms }; ++ ps_process_pattern($1, boltd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 boltd_t:process ptrace; ++ ') ++ ++ files_search_var_lib($1) ++ admin_pattern($1, boltd_var_lib_t) ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++ ++######################################## ++ ++## ++## Mounton boltd lib directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_mounton_var_lib',` ++ gen_require(` ++ type boltd_var_lib_t; ++ ') ++ ++ allow $1 boltd_var_lib_t:dir mounton; ++') ++ ++######################################## ++ ++## ++## Mounton boltd var_run directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_mounton_var_run',` ++ gen_require(` ++ type boltd_var_run_t; ++ ') ++ ++ allow $1 boltd_var_run_t:dir mounton; ++') ++ ++###################################### ++## ++## Write to boltd named pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`boltd_write_var_run_pipes',` ++ gen_require(` ++ type boltd_var_run_t; ++ ') ++ ++ allow $1 boltd_var_run_t:fd use; ++ allow $1 boltd_var_run_t:fifo_file write; ++') +diff --git a/boltd.te b/boltd.te +new file mode 100644 +index 0000000000..6106dddde7 +--- /dev/null ++++ b/boltd.te +@@ -0,0 +1,74 @@ ++policy_module(boltd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type boltd_t; ++type boltd_exec_t; ++init_daemon_domain(boltd_t, boltd_exec_t) ++ ++type boltd_var_lib_t; ++files_type(boltd_var_lib_t) ++ ++type boltd_var_run_t; ++files_pid_file(boltd_var_run_t) ++ ++######################################## ++# ++# boltd local policy ++# ++allow boltd_t self:capability dac_read_search; ++ ++allow boltd_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow boltd_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(boltd_t, boltd_var_lib_t, boltd_var_lib_t) ++manage_files_pattern(boltd_t, boltd_var_lib_t, boltd_var_lib_t) ++manage_lnk_files_pattern(boltd_t, boltd_var_lib_t, boltd_var_lib_t) ++files_var_lib_filetrans(boltd_t, boltd_var_lib_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(boltd_t, boltd_var_run_t, boltd_var_run_t) ++manage_files_pattern(boltd_t, boltd_var_run_t, boltd_var_run_t) ++manage_fifo_files_pattern(boltd_t, boltd_var_run_t, boltd_var_run_t) ++files_pid_filetrans(boltd_t, boltd_var_run_t, { dir file fifo_file }) ++ ++kernel_dgram_send(boltd_t) ++ ++auth_use_nsswitch(boltd_t) ++ ++dev_list_sysfs(boltd_t) ++dev_rw_sysfs(boltd_t) ++ ++files_mmap_usr_files(boltd_t) ++fs_getattr_tmpfs(boltd_t) ++fs_getattr_xattr_fs(boltd_t) ++ ++init_named_socket_activation(boltd_t, boltd_var_lib_t, "boltd") ++ ++logging_send_syslog_msg(boltd_t) ++logging_stream_connect_syslog(boltd_t) ++ ++optional_policy(` ++ dbus_acquire_svc_system_dbusd(boltd_t) ++ dbus_stream_connect_system_dbusd(boltd_t) ++ dbus_send_system_bus(boltd_t) ++ policykit_dbus_chat(boltd_t) ++') ++ ++optional_policy(` ++ gnome_read_generic_cache_files(boltd_t) ++') ++ ++optional_policy(` ++ udev_read_db(boltd_t) ++') ++ ++optional_policy(` ++ xserver_dbus_chat_xdm(boltd_t) ++') ++ ++optional_policy(` ++ unconfined_dbus_send(boltd_t) ++') +diff --git a/brctl.te b/brctl.te +index c5a91138c9..1919abdd88 100644 +--- a/brctl.te ++++ b/brctl.te +@@ -24,6 +24,7 @@ allow brctl_t self:unix_dgram_socket create_socket_perms; + allow brctl_t self:tcp_socket create_socket_perms; + + kernel_request_load_module(brctl_t) ++kernel_read_system_state(brctl_t) + kernel_read_network_state(brctl_t) + kernel_read_sysctl(brctl_t) + +@@ -34,12 +35,8 @@ dev_write_sysfs_dirs(brctl_t) + + domain_use_interactive_fds(brctl_t) + +-files_read_etc_files(brctl_t) +- + term_dontaudit_use_console(brctl_t) + +-miscfiles_read_localization(brctl_t) +- + optional_policy(` + xen_append_log(brctl_t) + xen_dontaudit_rw_unix_stream_sockets(brctl_t) +diff --git a/brltty.fc b/brltty.fc +new file mode 100644 +index 0000000000..05e3528979 +--- /dev/null ++++ b/brltty.fc +@@ -0,0 +1,10 @@ ++/tmp/brltty\.log.* -- gen_context(system_u:object_r:brltty_log_t,s0) ++ ++/usr/lib/systemd/system/brltty.* -- gen_context(system_u:object_r:brltty_unit_file_t,s0) ++ ++/usr/bin/brltty -- gen_context(system_u:object_r:brltty_exec_t,s0) ++ ++/var/lib/BrlAPI(/.*)? gen_context(system_u:object_r:brltty_var_lib_t,s0) ++ ++/var/run/brltty(/.*)? gen_context(system_u:object_r:brltty_var_run_t,s0) ++ +diff --git a/brltty.if b/brltty.if +new file mode 100644 +index 0000000000..968c957aba +--- /dev/null ++++ b/brltty.if +@@ -0,0 +1,80 @@ ++ ++## brltty is refreshable braille display driver for Linux/Unix ++ ++######################################## ++## ++## Execute brltty in the brltty domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`brltty_domtrans',` ++ gen_require(` ++ type brltty_t, brltty_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, brltty_exec_t, brltty_t) ++') ++######################################## ++## ++## Execute brltty server in the brltty domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`brltty_systemctl',` ++ gen_require(` ++ type brltty_t; ++ type brltty_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 brltty_unit_file_t:file read_file_perms; ++ allow $1 brltty_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, brltty_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an brltty environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`brltty_admin',` ++ gen_require(` ++ type brltty_t; ++ type brltty_unit_file_t; ++ ') ++ ++ allow $1 brltty_t:process { signal_perms }; ++ ps_process_pattern($1, brltty_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 brltty_t:process ptrace; ++ ') ++ ++ brltty_systemctl($1) ++ admin_pattern($1, brltty_unit_file_t) ++ allow $1 brltty_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/brltty.te b/brltty.te +new file mode 100644 +index 0000000000..a4265adc94 +--- /dev/null ++++ b/brltty.te +@@ -0,0 +1,72 @@ ++policy_module(brltty, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type brltty_t; ++type brltty_exec_t; ++init_daemon_domain(brltty_t, brltty_exec_t) ++ ++type brltty_var_lib_t; ++files_type(brltty_var_lib_t) ++ ++type brltty_var_run_t; ++files_pid_file(brltty_var_run_t) ++ ++type brltty_log_t; ++logging_log_file(brltty_log_t) ++ ++type brltty_unit_file_t; ++systemd_unit_file(brltty_unit_file_t) ++ ++######################################## ++# ++# brltty local policy ++# ++allow brltty_t self:capability { sys_admin sys_tty_config mknod }; ++allow brltty_t self:process { fork signal_perms }; ++ ++allow brltty_t self:fifo_file rw_fifo_file_perms; ++allow brltty_t self:unix_stream_socket create_stream_socket_perms; ++allow brltty_t self:tcp_socket listen; ++ ++manage_files_pattern(brltty_t, brltty_log_t, brltty_log_t) ++manage_sock_files_pattern(brltty_t, brltty_log_t, brltty_log_t) ++manage_lnk_files_pattern(brltty_t, brltty_log_t, brltty_log_t) ++files_tmp_filetrans(brltty_t, brltty_log_t, { file dir }) ++ ++manage_dirs_pattern(brltty_t, brltty_var_lib_t, brltty_var_lib_t) ++manage_files_pattern(brltty_t, brltty_var_lib_t, brltty_var_lib_t) ++manage_sock_files_pattern(brltty_t,brltty_var_lib_t, brltty_var_lib_t) ++files_var_lib_filetrans(brltty_t, brltty_var_lib_t, {file sock_file dir}) ++ ++manage_dirs_pattern(brltty_t, brltty_var_run_t, brltty_var_run_t) ++manage_files_pattern(brltty_t, brltty_var_run_t, brltty_var_run_t) ++manage_chr_files_pattern(brltty_t, brltty_var_run_t, brltty_var_run_t) ++files_pid_filetrans(brltty_t, brltty_var_run_t, { dir file chr_file }) ++allow brltty_t brltty_var_run_t:dir mounton; ++ ++kernel_read_system_state(brltty_t) ++kernel_read_usermodehelper_state(brltty_t) ++ ++auth_use_nsswitch(brltty_t) ++ ++corenet_tcp_bind_brlp_port(brltty_t) ++ ++dev_read_sysfs(brltty_t) ++dev_rw_generic_usb_dev(brltty_t) ++dev_rw_input_dev(brltty_t) ++ ++fs_getattr_all_fs(brltty_t) ++ ++fs_getattr_all_fs(brltty_t) ++ ++logging_send_syslog_msg(brltty_t) ++ ++modutils_domtrans_insmod(brltty_t) ++ ++sysnet_dns_name_resolve(brltty_t) ++ ++term_use_unallocated_ttys(brltty_t) +diff --git a/bugzilla.fc b/bugzilla.fc +index fce0b6ebff..9efceac4ec 100644 +--- a/bugzilla.fc ++++ b/bugzilla.fc +@@ -1,4 +1,4 @@ +-/usr/share/bugzilla(/.*)? -d gen_context(system_u:object_r:httpd_bugzilla_content_t,s0) +-/usr/share/bugzilla(/.*)? -- gen_context(system_u:object_r:httpd_bugzilla_script_exec_t,s0) ++/usr/share/bugzilla(/.*)? gen_context(system_u:object_r:bugzilla_content_t,s0) ++/usr/share/bugzilla/.*\.cgi -- gen_context(system_u:object_r:bugzilla_script_exec_t,s0) + +-/var/lib/bugzilla(/.*)? gen_context(system_u:object_r:httpd_bugzilla_rw_content_t,s0) ++/var/lib/bugzilla(/.*)? gen_context(system_u:object_r:bugzilla_rw_content_t,s0) +diff --git a/bugzilla.if b/bugzilla.if +index 1b22262d51..d9ea246a17 100644 +--- a/bugzilla.if ++++ b/bugzilla.if +@@ -12,10 +12,10 @@ + # + interface(`bugzilla_search_content',` + gen_require(` +- type httpd_bugzilla_content_t; ++ type bugzilla_content_t; + ') + +- allow $1 httpd_bugzilla_content_t:dir search_dir_perms; ++ allow $1 bugzilla_content_t:dir search_dir_perms; + ') + + ######################################## +@@ -32,10 +32,10 @@ interface(`bugzilla_search_content',` + # + interface(`bugzilla_dontaudit_rw_stream_sockets',` + gen_require(` +- type httpd_bugzilla_script_t; ++ type bugzilla_script_t; + ') + +- dontaudit $1 httpd_bugzilla_script_t:unix_stream_socket { read write }; ++ dontaudit $1 bugzilla_script_t:unix_stream_socket { read write }; + ') + + ######################################## +@@ -48,33 +48,37 @@ interface(`bugzilla_dontaudit_rw_stream_sockets',` + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # + interface(`bugzilla_admin',` + gen_require(` +- type httpd_bugzilla_script_t, httpd_bugzilla_content_t, httpd_bugzilla_ra_content_t; +- type httpd_bugzilla_rw_content_t, httpd_bugzilla_script_exec_t; +- type httpd_bugzilla_htaccess_t; ++ type bugzilla_script_t, bugzilla_content_t, bugzilla_ra_content_t; ++ type bugzilla_rw_content_t, bugzilla_script_exec_t; ++ type bugzilla_htaccess_t, bugzilla_tmp_t; ++ ') ++ ++ allow $1 bugzilla_script_t:process signal_perms; ++ ps_process_pattern($1, bugzilla_script_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 bugzilla_script_t:process ptrace; + ') + +- allow $1 httpd_bugzilla_script_t:process { ptrace signal_perms }; +- ps_process_pattern($1, httpd_bugzilla_script_t) ++ files_list_tmp($1) ++ admin_pattern($1, bugzilla_tmp_t) + +- files_search_usr($1) +- admin_pattern($1, httpd_bugzilla_script_exec_t) +- admin_pattern($1, httpd_bugzilla_script_t) +- admin_pattern($1, httpd_bugzilla_content_t) +- admin_pattern($1, httpd_bugzilla_htaccess_t) +- admin_pattern($1, httpd_bugzilla_ra_content_t) ++ files_list_var_lib(bugzilla_script_t) ++ ++ admin_pattern($1, bugzilla_script_exec_t) ++ admin_pattern($1, bugzilla_script_t) ++ admin_pattern($1, bugzilla_content_t) ++ admin_pattern($1, bugzilla_htaccess_t) ++ admin_pattern($1, bugzilla_ra_content_t) + + files_search_tmp($1) + files_search_var_lib($1) +- admin_pattern($1, httpd_bugzilla_rw_content_t) ++ admin_pattern($1, bugzilla_rw_content_t) + +- apache_list_sys_content($1) ++ optional_policy(` ++ apache_list_sys_content($1) ++ ') + ') +diff --git a/bugzilla.te b/bugzilla.te +index 18623e39ea..c62f617e15 100644 +--- a/bugzilla.te ++++ b/bugzilla.te +@@ -6,42 +6,55 @@ policy_module(bugzilla, 1.1.0) + # + + apache_content_template(bugzilla) ++apache_content_alias_template(bugzilla, bugzilla) ++ ++type bugzilla_tmp_t alias httpd_bugzilla_tmp_t; ++files_tmp_file(bugzilla_tmp_t) + + ######################################## + # + # Local policy + # + +-allow httpd_bugzilla_script_t self:tcp_socket { accept listen }; ++allow bugzilla_script_t self:tcp_socket { accept listen }; ++ ++corenet_all_recvfrom_netlabel(bugzilla_script_t) ++corenet_tcp_sendrecv_generic_if(bugzilla_script_t) ++corenet_tcp_sendrecv_generic_node(bugzilla_script_t) ++ ++corenet_sendrecv_http_client_packets(bugzilla_script_t) ++corenet_tcp_connect_http_port(bugzilla_script_t) ++corenet_tcp_sendrecv_http_port(bugzilla_script_t) ++ ++corenet_sendrecv_smtp_client_packets(bugzilla_script_t) ++corenet_tcp_connect_smtp_port(bugzilla_script_t) ++corenet_tcp_sendrecv_smtp_port(bugzilla_script_t) ++ ++manage_dirs_pattern(bugzilla_script_t, bugzilla_tmp_t, bugzilla_tmp_t) ++manage_files_pattern(bugzilla_script_t, bugzilla_tmp_t, bugzilla_tmp_t) ++files_tmp_filetrans(bugzilla_script_t, bugzilla_tmp_t, { file dir }) + +-corenet_all_recvfrom_unlabeled(httpd_bugzilla_script_t) +-corenet_all_recvfrom_netlabel(httpd_bugzilla_script_t) +-corenet_tcp_sendrecv_generic_if(httpd_bugzilla_script_t) +-corenet_tcp_sendrecv_generic_node(httpd_bugzilla_script_t) ++files_search_var_lib(bugzilla_script_t) + +-corenet_sendrecv_http_client_packets(httpd_bugzilla_script_t) +-corenet_tcp_connect_http_port(httpd_bugzilla_script_t) +-corenet_tcp_sendrecv_http_port(httpd_bugzilla_script_t) ++auth_read_passwd(bugzilla_script_t) + +-corenet_sendrecv_smtp_client_packets(httpd_bugzilla_script_t) +-corenet_tcp_connect_smtp_port(httpd_bugzilla_script_t) +-corenet_tcp_sendrecv_smtp_port(httpd_bugzilla_script_t) ++dev_read_sysfs(bugzilla_script_t) + +-files_search_var_lib(httpd_bugzilla_script_t) ++sysnet_read_config(bugzilla_script_t) ++sysnet_use_ldap(bugzilla_script_t) + +-sysnet_dns_name_resolve(httpd_bugzilla_script_t) +-sysnet_use_ldap(httpd_bugzilla_script_t) ++miscfiles_read_certs(bugzilla_script_t) + + optional_policy(` +- mta_send_mail(httpd_bugzilla_script_t) ++ mta_send_mail(bugzilla_script_t) + ') + + optional_policy(` +- mysql_stream_connect(httpd_bugzilla_script_t) +- mysql_tcp_connect(httpd_bugzilla_script_t) ++ mysql_stream_connect(bugzilla_script_t) ++ mysql_tcp_connect(bugzilla_script_t) + ') + + optional_policy(` +- postgresql_stream_connect(httpd_bugzilla_script_t) +- postgresql_tcp_connect(httpd_bugzilla_script_t) ++ postgresql_stream_connect(bugzilla_script_t) ++ postgresql_tcp_connect(bugzilla_script_t) + ') +diff --git a/bumblebee.fc b/bumblebee.fc +new file mode 100644 +index 0000000000..b5ee23be76 +--- /dev/null ++++ b/bumblebee.fc +@@ -0,0 +1,7 @@ ++/etc/systemd/system/bumblebeed.* -- gen_context(system_u:object_r:bumblebee_unit_file_t,s0) ++ ++/usr/lib/systemd/system/bumblebeed.* -- gen_context(system_u:object_r:bumblebee_unit_file_t,s0) ++ ++/usr/sbin/bumblebeed -- gen_context(system_u:object_r:bumblebee_exec_t,s0) ++ ++/var/run/bumblebee.* gen_context(system_u:object_r:bumblebee_var_run_t,s0) +diff --git a/bumblebee.if b/bumblebee.if +new file mode 100644 +index 0000000000..2d2e60c199 +--- /dev/null ++++ b/bumblebee.if +@@ -0,0 +1,122 @@ ++## policy for bumblebee ++ ++######################################## ++## ++## Execute bumblebee in the bumblebee domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`bumblebee_domtrans',` ++ gen_require(` ++ type bumblebee_t, bumblebee_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, bumblebee_exec_t, bumblebee_t) ++') ++ ++######################################## ++## ++## Read bumblebee PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bumblebee_read_pid_files',` ++ gen_require(` ++ type bumblebee_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, bumblebee_var_run_t, bumblebee_var_run_t) ++') ++ ++######################################## ++## ++## Execute bumblebee server in the bumblebee domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`bumblebee_systemctl',` ++ gen_require(` ++ type bumblebee_t; ++ type bumblebee_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 bumblebee_unit_file_t:file read_file_perms; ++ allow $1 bumblebee_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, bumblebee_t) ++') ++ ++######################################## ++## ++## Connect to bumblebee over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`bumblebee_stream_connect',` ++ gen_require(` ++ type bumblebee_t, bumblebee_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, bumblebee_var_run_t, bumblebee_var_run_t, bumblebee_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an bumblebee environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`bumblebee_admin',` ++ gen_require(` ++ type bumblebee_t; ++ type bumblebee_var_run_t; ++ type bumblebee_unit_file_t; ++ ') ++ ++ allow $1 bumblebee_t:process { signal_perms }; ++ ps_process_pattern($1, bumblebee_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 bumblebee_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, bumblebee_var_run_t) ++ ++ bumblebee_systemctl($1) ++ admin_pattern($1, bumblebee_unit_file_t) ++ allow $1 bumblebee_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/bumblebee.te b/bumblebee.te +new file mode 100644 +index 0000000000..acaf51906e +--- /dev/null ++++ b/bumblebee.te +@@ -0,0 +1,62 @@ ++policy_module(bumblebee, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type bumblebee_t; ++type bumblebee_exec_t; ++init_daemon_domain(bumblebee_t, bumblebee_exec_t) ++ ++type bumblebee_var_run_t; ++files_pid_file(bumblebee_var_run_t) ++ ++type bumblebee_unit_file_t; ++systemd_unit_file(bumblebee_unit_file_t) ++ ++######################################## ++# ++# bumblebee local policy ++# ++ ++allow bumblebee_t self:capability { setgid }; ++allow bumblebee_t self:process { fork signal_perms }; ++allow bumblebee_t self:fifo_file rw_fifo_file_perms; ++allow bumblebee_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(bumblebee_t, bumblebee_var_run_t, bumblebee_var_run_t) ++manage_files_pattern(bumblebee_t, bumblebee_var_run_t, bumblebee_var_run_t) ++manage_sock_files_pattern(bumblebee_t, bumblebee_var_run_t, bumblebee_var_run_t) ++manage_lnk_files_pattern(bumblebee_t, bumblebee_var_run_t, bumblebee_var_run_t) ++files_pid_filetrans(bumblebee_t, bumblebee_var_run_t, { dir file lnk_file sock_file }) ++ ++kernel_read_system_state(bumblebee_t) ++kernel_read_network_state(bumblebee_t) ++kernel_dontaudit_access_check_proc(bumblebee_t) ++kernel_dontaudit_write_proc_files(bumblebee_t) ++kernel_manage_debugfs(bumblebee_t) ++ ++corecmd_exec_shell(bumblebee_t) ++corecmd_exec_bin(bumblebee_t) ++ ++dev_read_sysfs(bumblebee_t) ++ ++auth_use_nsswitch(bumblebee_t) ++ ++logging_send_syslog_msg(bumblebee_t) ++ ++modutils_domtrans_insmod(bumblebee_t) ++modutils_signal_insmod(bumblebee_t) ++ ++sysnet_dns_name_resolve(bumblebee_t) ++ ++xserver_domtrans(bumblebee_t) ++xserver_signal(bumblebee_t) ++xserver_stream_connect(bumblebee_t) ++xserver_manage_xkb_libs(bumblebee_t) ++corenet_tcp_connect_xserver_port(bumblebee_t) ++ ++optional_policy(` ++ apm_stream_connect(bumblebee_t) ++') +diff --git a/cachefilesd.fc b/cachefilesd.fc +index 648c7902bb..aa03fc8ae5 100644 +--- a/cachefilesd.fc ++++ b/cachefilesd.fc +@@ -1,9 +1,34 @@ +-/etc/rc\.d/init\.d/cachefilesd -- gen_context(system_u:object_r:cachefilesd_initrc_exec_t,s0) ++############################################################################### ++# ++# Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. ++# Written by David Howells (dhowells@redhat.com) ++# Karl MacMillan (kmacmill@redhat.com) ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version ++# 2 of the License, or (at your option) any later version. ++# ++############################################################################### ++ ++# ++# Define the contexts to be assigned to various files and directories of ++# importance to the CacheFiles kernel module and userspace management daemon. ++# ++ ++# cachefilesd executable will have: ++# label: system_u:object_r:cachefilesd_exec_t ++# MLS sensitivity: s0 ++# MCS categories: ++ ++/dev/cachefiles -c gen_context(system_u:object_r:cachefiles_dev_t,s0) + + /sbin/cachefilesd -- gen_context(system_u:object_r:cachefilesd_exec_t,s0) + + /usr/sbin/cachefilesd -- gen_context(system_u:object_r:cachefilesd_exec_t,s0) + +-/var/cache/fscache(/.*)? gen_context(system_u:object_r:cachefilesd_cache_t,s0) ++/var/cache/fscache(/.*)? gen_context(system_u:object_r:cachefiles_var_t,s0) ++ ++/var/fscache(/.*)? gen_context(system_u:object_r:cachefiles_var_t,s0) + +-/var/run/cachefilesd\.pid -- gen_context(system_u:object_r:cachefilesd_var_run_t,s0) ++/var/run/cachefilesd\.pid -- gen_context(system_u:object_r:cachefilesd_var_run_t,s0) +diff --git a/cachefilesd.if b/cachefilesd.if +index 8de2ab9c52..3b419455f8 100644 +--- a/cachefilesd.if ++++ b/cachefilesd.if +@@ -1,39 +1,35 @@ +-## CacheFiles user-space management daemon. ++############################################################################### ++# ++# Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. ++# Written by David Howells (dhowells@redhat.com) ++# Karl MacMillan (kmacmill@redhat.com) ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version ++# 2 of the License, or (at your option) any later version. ++# ++############################################################################### ++ ++# ++# Define the policy interface for the CacheFiles userspace management daemon. ++# ++## policy for cachefilesd + + ######################################## + ## +-## All of the rules required to +-## administrate an cachefilesd environment. ++## Execute a domain transition to run cachefilesd. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # +-interface(`cachefilesd_admin',` ++interface(`cachefilesd_domtrans',` + gen_require(` +- type cachefilesd_t, cachefilesd_initrc_exec_t, cachefilesd_cache_t; +- type cachefilesd_var_run_t; ++ type cachefilesd_t, cachefilesd_exec_t; + ') + +- allow $1 cachefilesd_t:process { ptrace signal_perms }; +- ps_process_pattern($1, cachefilesd_t) +- +- init_labeled_script_domtrans($1, cachefilesd_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 cachefilesd_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_var($1) +- admin_pattern($1, cachefilesd_cache_t) +- +- files_search_pids($1) +- admin_pattern($1, cachefilesd_var_run_t) ++ domtrans_pattern($1, cachefilesd_exec_t, cachefilesd_t) + ') +diff --git a/cachefilesd.te b/cachefilesd.te +index a3760bc924..22ed920b74 100644 +--- a/cachefilesd.te ++++ b/cachefilesd.te +@@ -1,52 +1,125 @@ + policy_module(cachefilesd, 1.1.0) + +-######################################## ++############################################################################### + # + # Declarations + # + ++# ++# Files in the cache are created by the cachefiles module with security ID ++# cachefiles_var_t ++# ++type cachefiles_var_t; ++files_type(cachefiles_var_t) ++ ++# ++# The /dev/cachefiles character device has security ID cachefiles_dev_t ++# ++type cachefiles_dev_t; ++dev_node(cachefiles_dev_t) ++ ++# ++# The cachefilesd daemon normally runs with security ID cachefilesd_t ++# + type cachefilesd_t; + type cachefilesd_exec_t; + init_daemon_domain(cachefilesd_t, cachefilesd_exec_t) + +-type cachefilesd_initrc_exec_t; +-init_script_file(cachefilesd_initrc_exec_t) +- +-type cachefilesd_cache_t; +-files_type(cachefilesd_cache_t) +- ++# ++# The cachefilesd daemon pid file context ++# + type cachefilesd_var_run_t; + files_pid_file(cachefilesd_var_run_t) + +-######################################## + # +-# Local policy ++# The CacheFiles kernel module causes processes accessing the cache files to do ++# so acting as security ID cachefiles_kernel_t ++# ++type cachefiles_kernel_t; ++domain_type(cachefiles_kernel_t) ++domain_obj_id_change_exemption(cachefiles_kernel_t) ++role system_r types cachefiles_kernel_t; ++ ++############################################################################### + # ++# Permit RPM to deal with files in the cache ++# ++optional_policy(` ++ rpm_use_script_fds(cachefilesd_t) ++') + +-allow cachefilesd_t self:capability { setuid setgid sys_admin dac_override }; ++############################################################################### ++# ++# cachefilesd local policy ++# ++# These define what cachefilesd is permitted to do. This doesn't include very ++# much: startup stuff, logging, pid file, scanning the cache superstructure and ++# deleting files from the cache. It is not permitted to read/write files in ++# the cache. ++# ++# Check in /usr/share/selinux/devel/include/ for macros to use instead of allow ++# rules. ++# ++allow cachefilesd_t self:capability { setuid setgid sys_admin dac_read_search dac_override }; ++allow cachefilesd_t self:process signal_perms; + ++# Allow manipulation of pid file ++allow cachefilesd_t cachefilesd_var_run_t:file create_file_perms; + manage_files_pattern(cachefilesd_t, cachefilesd_var_run_t, cachefilesd_var_run_t) ++manage_dirs_pattern(cachefilesd_t, cachefilesd_var_run_t, cachefilesd_var_run_t) + files_pid_filetrans(cachefilesd_t, cachefilesd_var_run_t, file) ++files_create_as_is_all_files(cachefilesd_t) + +-manage_dirs_pattern(cachefilesd_t, cachefilesd_cache_t, cachefilesd_cache_t) +-manage_files_pattern(cachefilesd_t, cachefilesd_cache_t, cachefilesd_cache_t) +- +-dev_rw_cachefiles(cachefilesd_t) ++# Allow access to cachefiles device file ++allow cachefilesd_t cachefiles_dev_t:chr_file rw_file_perms; + +-files_create_all_files_as(cachefilesd_t) +-files_read_etc_files(cachefilesd_t) ++# Allow access to cache superstructure ++manage_dirs_pattern(cachefilesd_t, cachefiles_var_t, cachefiles_var_t) ++manage_files_pattern(cachefilesd_t, cachefiles_var_t, cachefiles_var_t) + ++# Permit statfs on the backing filesystem + fs_getattr_xattr_fs(cachefilesd_t) + ++# Basic access ++logging_send_syslog_msg(cachefilesd_t) ++init_dontaudit_use_script_ptys(cachefilesd_t) + term_dontaudit_use_generic_ptys(cachefilesd_t) + term_dontaudit_getattr_unallocated_ttys(cachefilesd_t) + +-logging_send_syslog_msg(cachefilesd_t) ++############################################################################### ++# ++# When cachefilesd invokes the kernel module to begin caching, it has to tell ++# the kernel module the security context in which it should act, and this ++# policy has to approve that. ++# ++# There are two parts to this: ++# ++# (1) the security context used by the module to access files in the cache, ++# as set by the 'secctx' command in /etc/cachefilesd.conf, and ++# ++allow cachefilesd_t cachefiles_kernel_t:kernel_service { use_as_override }; + +-miscfiles_read_localization(cachefilesd_t) ++# ++# (2) the label that will be assigned to new files and directories created in ++# the cache by the module, which will be the same as the label on the ++# directory pointed to by the 'dir' command. ++# ++allow cachefilesd_t cachefiles_var_t:kernel_service { create_files_as }; + +-init_dontaudit_use_script_ptys(cachefilesd_t) ++############################################################################### ++# ++# cachefiles kernel module local policy ++# ++# This governs what the kernel module is allowed to do the contents of the ++# cache. ++# ++allow cachefiles_kernel_t self:capability { dac_override dac_read_search }; + +-optional_policy(` +- rpm_use_script_fds(cachefilesd_t) +-') ++manage_dirs_pattern(cachefiles_kernel_t, cachefiles_var_t, cachefiles_var_t) ++manage_files_pattern(cachefiles_kernel_t, cachefiles_var_t, cachefiles_var_t) ++ ++fs_getattr_xattr_fs(cachefiles_kernel_t) ++ ++dev_search_sysfs(cachefiles_kernel_t) ++ ++init_sigchld_script(cachefiles_kernel_t) +diff --git a/calamaris.if b/calamaris.if +index cd9c52871a..ba793b748a 100644 +--- a/calamaris.if ++++ b/calamaris.if +@@ -42,7 +42,7 @@ interface(`calamaris_run',` + attribute_role calamaris_roles; + ') + +- lightsquid_domtrans($1) ++ calamaris_domtrans($1) + roleattribute $2 calamaris_roles; + ') + +diff --git a/calamaris.te b/calamaris.te +index 7e574604be..8d8cd78e54 100644 +--- a/calamaris.te ++++ b/calamaris.te +@@ -23,7 +23,7 @@ files_type(calamaris_www_t) + # Local policy + # + +-allow calamaris_t self:capability dac_override; ++allow calamaris_t self:capability { dac_read_search dac_override }; + allow calamaris_t self:process { signal_perms setsched }; + allow calamaris_t self:fifo_file rw_fifo_file_perms; + allow calamaris_t self:unix_stream_socket { accept listen }; +@@ -41,19 +41,23 @@ kernel_read_system_state(calamaris_t) + + corecmd_exec_bin(calamaris_t) + ++corenet_all_recvfrom_netlabel(calamaris_t) ++corenet_tcp_sendrecv_generic_if(calamaris_t) ++corenet_udp_sendrecv_generic_if(calamaris_t) ++corenet_tcp_sendrecv_generic_node(calamaris_t) ++corenet_udp_sendrecv_generic_node(calamaris_t) ++corenet_tcp_sendrecv_all_ports(calamaris_t) ++corenet_udp_sendrecv_all_ports(calamaris_t) ++ + dev_read_urand(calamaris_t) + +-files_read_usr_files(calamaris_t) ++files_search_pids(calamaris_t) + files_read_etc_runtime_files(calamaris_t) + +-libs_read_lib_files(calamaris_t) +- + auth_use_nsswitch(calamaris_t) + + logging_send_syslog_msg(calamaris_t) + +-miscfiles_read_localization(calamaris_t) +- + userdom_dontaudit_list_user_home_dirs(calamaris_t) + + optional_policy(` +diff --git a/callweaver.te b/callweaver.te +index 0e5be4cdfc..b9a407f900 100644 +--- a/callweaver.te ++++ b/callweaver.te +@@ -84,4 +84,3 @@ term_use_ptmx(callweaver_t) + + auth_use_nsswitch(callweaver_t) + +-miscfiles_read_localization(callweaver_t) +diff --git a/canna.if b/canna.if +index 400db07a26..f416e22a7a 100644 +--- a/canna.if ++++ b/canna.if +@@ -43,9 +43,13 @@ interface(`canna_admin',` + type canna_var_run_t, canna_initrc_exec_t; + ') + +- allow $1 canna_t:process { ptrace signal_perms }; ++ allow $1 canna_t:process signal_perms; + ps_process_pattern($1, canna_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 canna_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, canna_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 canna_initrc_exec_t system_r; +diff --git a/canna.te b/canna.te +index 9fe61621f0..5c505e7ded 100644 +--- a/canna.te ++++ b/canna.te +@@ -52,7 +52,6 @@ files_pid_filetrans(canna_t, canna_var_run_t, { dir sock_file }) + kernel_read_kernel_sysctls(canna_t) + kernel_read_system_state(canna_t) + +-corenet_all_recvfrom_unlabeled(canna_t) + corenet_all_recvfrom_netlabel(canna_t) + corenet_tcp_sendrecv_generic_if(canna_t) + corenet_tcp_sendrecv_generic_node(canna_t) +@@ -68,15 +67,13 @@ fs_search_auto_mountpoints(canna_t) + + domain_use_interactive_fds(canna_t) + +-files_read_etc_files(canna_t) + files_read_etc_runtime_files(canna_t) +-files_read_usr_files(canna_t) + files_search_tmp(canna_t) + files_dontaudit_read_root_files(canna_t) + +-logging_send_syslog_msg(canna_t) ++auth_use_nsswitch(canna_t) + +-miscfiles_read_localization(canna_t) ++logging_send_syslog_msg(canna_t) + + sysnet_read_config(canna_t) + +diff --git a/ccs.if b/ccs.if +index 5ded72d378..cb94e5ea7c 100644 +--- a/ccs.if ++++ b/ccs.if +@@ -98,20 +98,24 @@ interface(`ccs_manage_config',` + interface(`ccs_admin',` + gen_require(` + type ccs_t, ccs_initrc_exec_t, cluster_conf_t; +- type ccs_var_lib_t_t, ccs_var_log_t; ++ type ccs_var_lib_t, ccs_var_log_t; + type ccs_var_run_t, ccs_tmp_t; + ') + +- allow $1 ccs_t:process { ptrace signal_perms }; ++ allow $1 ccs_t:process { signal_perms }; + ps_process_pattern($1, ccs_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ccs_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, ccs_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 ccs_initrc_exec_t system_r; + allow $2 system_r; + + files_search_etc($1) +- admin_pattern($1, ccs_conf_t) ++ admin_pattern($1, cluster_conf_t) + + files_search_var_lib($1) + admin_pattern($1, ccs_var_lib_t) +diff --git a/ccs.te b/ccs.te +index 658134d8ad..58deeceaab 100644 +--- a/ccs.te ++++ b/ccs.te +@@ -37,7 +37,7 @@ files_pid_file(ccs_var_run_t) + + allow ccs_t self:capability { ipc_owner ipc_lock sys_nice sys_resource sys_admin }; + allow ccs_t self:process { signal setrlimit setsched }; +-dontaudit ccs_t self:process ptrace; ++ + allow ccs_t self:fifo_file rw_fifo_file_perms; + allow ccs_t self:unix_stream_socket { accept connectto listen }; + allow ccs_t self:tcp_socket { accept listen }; +@@ -75,7 +75,6 @@ kernel_read_kernel_sysctls(ccs_t) + corecmd_list_bin(ccs_t) + corecmd_exec_bin(ccs_t) + +-corenet_all_recvfrom_unlabeled(ccs_t) + corenet_all_recvfrom_netlabel(ccs_t) + corenet_tcp_sendrecv_generic_if(ccs_t) + corenet_udp_sendrecv_generic_if(ccs_t) +@@ -95,15 +94,13 @@ corenet_udp_bind_netsupport_port(ccs_t) + + dev_read_urand(ccs_t) + +-files_read_etc_files(ccs_t) + files_read_etc_runtime_files(ccs_t) + + init_rw_script_tmp_files(ccs_t) ++init_signal(ccs_t) + + logging_send_syslog_msg(ccs_t) + +-miscfiles_read_localization(ccs_t) +- + sysnet_dns_name_resolve(ccs_t) + + userdom_manage_unpriv_user_shared_mem(ccs_t) +@@ -115,8 +112,7 @@ ifdef(`hide_broken_symptoms',` + ') + + optional_policy(` +- aisexec_stream_connect(ccs_t) +- corosync_stream_connect(ccs_t) ++ rhcs_stream_connect_cluster(ccs_t) + ') + + optional_policy(` +diff --git a/cdrecord.if b/cdrecord.if +index fbc20f6945..4de4a005cc 100644 +--- a/cdrecord.if ++++ b/cdrecord.if +@@ -27,6 +27,9 @@ interface(`cdrecord_role',` + + allow cdrecord_t $2:unix_stream_socket rw_socket_perms; + +- allow $2 cdrecord_t:process { ptrace signal_perms }; ++ allow $2 cdrecord_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 cdrecord_t:process ptrace; ++ ') + ps_process_pattern($2, cdrecord_t) + ') +diff --git a/cdrecord.te b/cdrecord.te +index 16883c9c30..97e9a429eb 100644 +--- a/cdrecord.te ++++ b/cdrecord.te +@@ -29,7 +29,7 @@ role cdrecord_roles types cdrecord_t; + # Local policy + # + +-allow cdrecord_t self:capability { ipc_lock sys_nice setuid dac_override sys_rawio }; ++allow cdrecord_t self:capability { ipc_lock sys_nice setuid dac_read_search dac_override sys_rawio }; + allow cdrecord_t self:process { getcap getsched setrlimit setsched sigkill }; + allow cdrecord_t self:unix_stream_socket { accept listen }; + +@@ -41,8 +41,6 @@ dev_read_sysfs(cdrecord_t) + domain_interactive_fd(cdrecord_t) + domain_use_interactive_fds(cdrecord_t) + +-files_read_etc_files(cdrecord_t) +- + term_use_controlling_term(cdrecord_t) + term_list_ptys(cdrecord_t) + +@@ -52,10 +50,7 @@ storage_write_scsi_generic(cdrecord_t) + + logging_send_syslog_msg(cdrecord_t) + +-miscfiles_read_localization(cdrecord_t) +- +-userdom_use_user_terminals(cdrecord_t) +-userdom_read_user_home_content_files(cdrecord_t) ++userdom_use_inherited_user_terminals(cdrecord_t) + + tunable_policy(`cdrecord_read_content && use_nfs_home_dirs',` + fs_list_auto_mountpoints(cdrecord_t) +@@ -104,11 +99,7 @@ tunable_policy(`cdrecord_read_content',` + userdom_dontaudit_read_user_home_content_files(cdrecord_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- files_search_mnt(cdrecord_t) +- fs_read_nfs_files(cdrecord_t) +- fs_read_nfs_symlinks(cdrecord_t) +-') ++userdom_home_manager(cdrecord_t) + + optional_policy(` + resmgr_stream_connect(cdrecord_t) +diff --git a/certmaster.if b/certmaster.if +index 0c53b189bd..ef29f6e6c3 100644 +--- a/certmaster.if ++++ b/certmaster.if +@@ -117,13 +117,16 @@ interface(`certmaster_manage_log',` + interface(`certmaster_admin',` + gen_require(` + type certmaster_t, certmaster_var_run_t, certmaster_var_lib_t; +- type certmaster_etc_rw_t, certmaster_var_log_t; +- type certmaster_initrc_exec_t; ++ type certmaster_etc_rw_t, certmaster_var_log_t, certmaster_initrc_exec_t; + ') + +- allow $1 certmaster_t:process { ptrace signal_perms }; ++ allow $1 certmaster_t:process signal_perms; + ps_process_pattern($1, certmaster_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 certmaster_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, certmaster_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 certmaster_initrc_exec_t system_r; +diff --git a/certmaster.te b/certmaster.te +index 4a878730b6..113f3b32fd 100644 +--- a/certmaster.te ++++ b/certmaster.te +@@ -65,11 +65,10 @@ corenet_tcp_sendrecv_certmaster_port(certmaster_t) + dev_read_urand(certmaster_t) + + files_list_var(certmaster_t) +-files_search_etc(certmaster_t) +-files_read_usr_files(certmaster_t) + + auth_use_nsswitch(certmaster_t) + +-miscfiles_read_localization(certmaster_t) + miscfiles_manage_generic_cert_dirs(certmaster_t) + miscfiles_manage_generic_cert_files(certmaster_t) ++ ++mta_send_mail(certmaster_t) +diff --git a/certmonger.fc b/certmonger.fc +index ed298d8b66..c887648384 100644 +--- a/certmonger.fc ++++ b/certmonger.fc +@@ -1,7 +1,12 @@ ++/etc/systemd/system/dirsrv.target.wants(/.*)? gen_context(system_u:object_r:certmonger_unit_file_t,s0) ++/usr/lib/systemd/system/certmonger.* gen_context(system_u:object_r:certmonger_unit_file_t,s0) ++ + /etc/rc\.d/init\.d/certmonger -- gen_context(system_u:object_r:certmonger_initrc_exec_t,s0) + + /usr/sbin/certmonger -- gen_context(system_u:object_r:certmonger_exec_t,s0) + ++/usr/lib/ipa/certmonger(/.*)? gen_context(system_u:object_r:certmonger_unconfined_exec_t,s0) ++ + /var/lib/certmonger(/.*)? gen_context(system_u:object_r:certmonger_var_lib_t,s0) + + /var/run/certmonger.* gen_context(system_u:object_r:certmonger_var_run_t,s0) +diff --git a/certmonger.if b/certmonger.if +index 008f8ef262..144c0740a6 100644 +--- a/certmonger.if ++++ b/certmonger.if +@@ -160,16 +160,20 @@ interface(`certmonger_admin',` + ') + + ps_process_pattern($1, certmonger_t) +- allow $1 certmonger_t:process { ptrace signal_perms }; ++ allow $1 certmonger_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 certmonger_t:process ptrace; ++ ') + + certmonger_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 certmonger_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, certmonger_var_lib_t) + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, certmonger_var_run_t) + ') +diff --git a/certmonger.te b/certmonger.te +index 550b287cec..d350a87329 100644 +--- a/certmonger.te ++++ b/certmonger.te +@@ -18,18 +18,26 @@ files_type(certmonger_var_lib_t) + type certmonger_var_run_t; + files_pid_file(certmonger_var_run_t) + ++type certmonger_unconfined_exec_t; ++application_executable_file(certmonger_unconfined_exec_t) ++ ++type certmonger_unit_file_t; ++systemd_unit_file(certmonger_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow certmonger_t self:capability { dac_override dac_read_search setgid setuid kill sys_nice }; ++allow certmonger_t self:capability { chown dac_override dac_read_search setgid setuid kill sys_nice }; + dontaudit certmonger_t self:capability sys_tty_config; + allow certmonger_t self:capability2 block_suspend; ++ + allow certmonger_t self:process { getsched setsched sigkill signal }; +-allow certmonger_t self:fifo_file rw_fifo_file_perms; +-allow certmonger_t self:unix_stream_socket { accept listen }; +-allow certmonger_t self:tcp_socket { accept listen }; ++allow certmonger_t self:fifo_file rw_file_perms; ++allow certmonger_t self:unix_stream_socket create_stream_socket_perms; ++allow certmonger_t self:tcp_socket create_stream_socket_perms; ++allow certmonger_t self:netlink_route_socket r_netlink_socket_perms; + + manage_dirs_pattern(certmonger_t, certmonger_var_lib_t, certmonger_var_lib_t) + manage_files_pattern(certmonger_t, certmonger_var_lib_t, certmonger_var_lib_t) +@@ -41,6 +49,7 @@ files_pid_filetrans(certmonger_t, certmonger_var_run_t, { dir file }) + + kernel_read_kernel_sysctls(certmonger_t) + kernel_read_system_state(certmonger_t) ++kernel_read_network_state(certmonger_t) + + corenet_all_recvfrom_unlabeled(certmonger_t) + corenet_all_recvfrom_netlabel(certmonger_t) +@@ -49,18 +58,27 @@ corenet_tcp_sendrecv_generic_node(certmonger_t) + + corenet_sendrecv_certmaster_client_packets(certmonger_t) + corenet_tcp_connect_certmaster_port(certmonger_t) ++ ++corenet_tcp_connect_http_port(certmonger_t) ++corenet_tcp_connect_http_cache_port(certmonger_t) ++ ++corenet_tcp_connect_ldap_port(certmonger_t) ++ ++corenet_tcp_connect_pki_ca_port(certmonger_t) + corenet_tcp_sendrecv_certmaster_port(certmonger_t) + + corecmd_exec_bin(certmonger_t) + corecmd_exec_shell(certmonger_t) + ++dev_read_rand(certmonger_t) + dev_read_urand(certmonger_t) + + domain_use_interactive_fds(certmonger_t) + +-files_read_usr_files(certmonger_t) + files_list_tmp(certmonger_t) ++files_list_home(certmonger_t) + ++fs_getattr_xattr_fs(certmonger_t) + fs_search_cgroup_dirs(certmonger_t) + + auth_use_nsswitch(certmonger_t) +@@ -68,18 +86,26 @@ auth_rw_cache(certmonger_t) + + init_getattr_all_script_files(certmonger_t) + ++libs_exec_ldconfig(certmonger_t) ++ + logging_send_syslog_msg(certmonger_t) + +-miscfiles_read_localization(certmonger_t) +-miscfiles_manage_generic_cert_files(certmonger_t) ++miscfiles_manage_all_certs(certmonger_t) ++ ++systemd_exec_systemctl(certmonger_t) ++systemd_manage_all_unit_files(certmonger_t) ++systemd_start_systemd_services(certmonger_t) ++systemd_status_all_unit_files(certmonger_t) ++ + + userdom_search_user_home_content(certmonger_t) ++userdom_write_user_tmp_dirs(certmonger_t) + + optional_policy(` +- apache_initrc_domtrans(certmonger_t) +- apache_search_config(certmonger_t) ++ apache_read_config(certmonger_t) + apache_signal(certmonger_t) + apache_signull(certmonger_t) ++ apache_systemctl(certmonger_t) + ') + + optional_policy(` +@@ -92,11 +118,77 @@ optional_policy(` + ') + + optional_policy(` +- kerberos_read_keytab(certmonger_t) ++ dirsrv_manage_config(certmonger_t) ++ dirsrv_signal(certmonger_t) ++ dirsrv_signull(certmonger_t) ++ dirsrv_stream_connect(certmonger_t) ++') ++ ++optional_policy(` ++ ipa_manage_lib(certmonger_t) ++ ipa_manage_log(certmonger_t) ++ ipa_manage_pid_files(certmonger_t) ++ ipa_named_filetrans_log_dir(certmonger_t) ++') ++ ++optional_policy(` + kerberos_use(certmonger_t) ++ kerberos_read_keytab(certmonger_t) ++ kerberos_manage_kdc_config(certmonger_t) ++ kerberos_filetrans_named_content(certmonger_t) ++') ++ ++optional_policy(` ++ mta_send_mail(certmonger_t) + ') + + optional_policy(` + pcscd_read_pid_files(certmonger_t) + pcscd_stream_connect(certmonger_t) + ') ++ ++optional_policy(` ++ pki_rw_tomcat_cert(certmonger_t) ++ pki_read_tomcat_lib_files(certmonger_t) ++ pki_tomcat_systemctl(certmonger_t) ++') ++ ++optional_policy(` ++ rhcs_start_haproxy_services(certmonger_t) ++') ++ ++optional_policy(` ++ sssd_delete_public_files(certmonger_t) ++') ++ ++optional_policy(` ++ allow certmonger_t certmonger_unit_file_t:service manage_service_perms; ++ allow certmonger_t certmonger_unit_file_t:file manage_file_perms; ++ allow certmonger_t certmonger_unit_file_t:dir manage_dir_perms; ++ systemd_unit_file_filetrans(certmonger_t, certmonger_unit_file_t, dir) ++') ++ ++######################################## ++# ++# certmonger_unconfined_script_t local policy ++# ++ ++optional_policy(` ++ type certmonger_unconfined_t; ++ domain_type(certmonger_unconfined_t) ++ ++ domain_entry_file(certmonger_unconfined_t, certmonger_unconfined_exec_t) ++ role system_r types certmonger_unconfined_t; ++ ++ domtrans_pattern(certmonger_t, certmonger_unconfined_exec_t, certmonger_unconfined_t) ++ ++ allow certmonger_t certmonger_unconfined_exec_t:dir search_dir_perms; ++ allow certmonger_t certmonger_unconfined_exec_t:dir read_file_perms; ++ allow certmonger_t certmonger_unconfined_exec_t:file ioctl; ++ ++ init_domtrans_script(certmonger_unconfined_t) ++ ++ optional_policy(` ++ unconfined_domain(certmonger_unconfined_t) ++ ') ++') +diff --git a/certwatch.te b/certwatch.te +index 171fafb990..69d01f6fa0 100644 +--- a/certwatch.te ++++ b/certwatch.te +@@ -18,34 +18,47 @@ role certwatch_roles types certwatch_t; + # Local policy + # + +-allow certwatch_t self:capability sys_nice; ++allow certwatch_t self:capability { dac_read_search dac_override sys_nice }; + allow certwatch_t self:process { setsched getsched }; ++allow certwatch_t self:tcp_socket create_stream_socket_perms; + ++kernel_read_system_state(certwatch_t) ++ ++corecmd_exec_bin(certwatch_t) ++ ++dev_read_rand(certwatch_t) + dev_read_urand(certwatch_t) + +-files_read_etc_files(certwatch_t) +-files_read_usr_files(certwatch_t) + files_read_usr_symlinks(certwatch_t) + files_list_tmp(certwatch_t) + + fs_list_inotifyfs(certwatch_t) + + auth_manage_cache(certwatch_t) ++auth_read_passwd(certwatch_t) + auth_var_filetrans_cache(certwatch_t) + + logging_send_syslog_msg(certwatch_t) + + miscfiles_read_all_certs(certwatch_t) +-miscfiles_read_localization(certwatch_t) ++miscfiles_manage_generic_cert_dirs(certwatch_t) ++miscfiles_map_generic_certs(certwatch_t) ++ ++sysnet_read_config(certwatch_t) + +-userdom_use_user_terminals(certwatch_t) +-userdom_dontaudit_list_user_home_dirs(certwatch_t) ++userdom_use_inherited_user_terminals(certwatch_t) ++userdom_dontaudit_list_admin_dir(certwatch_t) + + optional_policy(` ++ apache_domtrans(certwatch_t) + apache_exec_modules(certwatch_t) + apache_read_config(certwatch_t) + ') + ++optional_policy(` ++ mta_send_mail(certwatch_t) ++') ++ + optional_policy(` + cron_system_entry(certwatch_t, certwatch_exec_t) + ') +diff --git a/cfengine.if b/cfengine.if +index a7311229f7..5279d4e3a5 100644 +--- a/cfengine.if ++++ b/cfengine.if +@@ -13,7 +13,6 @@ + template(`cfengine_domain_template',` + gen_require(` + attribute cfengine_domain; +- type cfengine_log_t, cfengine_var_lib_t; + ') + + ######################################## +@@ -30,7 +29,29 @@ template(`cfengine_domain_template',` + # Policy + # + ++ kernel_read_system_state(cfengine_$1_t) ++ + auth_use_nsswitch(cfengine_$1_t) ++ ++ logging_send_syslog_msg(cfengine_$1_t) ++') ++ ++###################################### ++## ++## Search cfengine lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cfengine_search_lib_files',` ++ gen_require(` ++ type cfengine_var_lib_t; ++ ') ++ ++ allow $1 cfengine_var_lib_t:dir search_dir_perms; + ') + + ######################################## +@@ -71,6 +92,43 @@ interface(`cfengine_dontaudit_write_log_files',` + dontaudit $1 cfengine_var_log_t:file write_file_perms; + ') + ++##################################### ++## ++## Allow the specified domain to append cfengine's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cfengine_append_inherited_log',` ++ gen_require(` ++ type cfengine_var_log_t; ++ ') ++ ++ cfengine_search_lib_files($1) ++ allow $1 cfengine_var_log_t:file { getattr append ioctl lock }; ++') ++ ++#################################### ++## ++## Dontaudit the specified domain to write cfengine's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cfengine_dontaudit_write_log',` ++ gen_require(` ++ type cfengine_var_log_t; ++ ') ++ ++ dontaudit $1 cfengine_var_log_t:file write; ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -94,7 +152,7 @@ interface(`cfengine_admin',` + type cfengine_initrc_exec_t, cfengine_log_t, cfengine_var_lib_t; + ') + +- allow $1 cfengine_domain:process { ptrace signal_perms }; ++ allow $1 cfengine_domain:process { signal_perms }; + ps_process_pattern($1, cfengine_domain) + + init_labeled_script_domtrans($1, cfengine_initrc_exec_t) +@@ -105,3 +163,4 @@ interface(`cfengine_admin',` + files_search_var_lib($1) + admin_pattern($1, { cfengine_log_t cfengine_var_lib_t }) + ') ++ +diff --git a/cfengine.te b/cfengine.te +index fbe3ad9555..21ab8e1767 100644 +--- a/cfengine.te ++++ b/cfengine.te +@@ -41,18 +41,13 @@ create_files_pattern(cfengine_domain, cfengine_log_t, cfengine_log_t) + setattr_files_pattern(cfengine_domain, cfengine_log_t, cfengine_log_t) + logging_log_filetrans(cfengine_domain, cfengine_log_t, dir) + +-kernel_read_system_state(cfengine_domain) +- + corecmd_exec_bin(cfengine_domain) + corecmd_exec_shell(cfengine_domain) + + dev_read_urand(cfengine_domain) + dev_read_sysfs(cfengine_domain) + +-logging_send_syslog_msg(cfengine_domain) +- +-miscfiles_read_localization(cfengine_domain) +- ++sysnet_dns_name_resolve(cfengine_domain) + sysnet_domtrans_ifconfig(cfengine_domain) + + ######################################## +@@ -69,7 +64,7 @@ domain_read_all_domains_state(cfengine_execd_t) + # Monitord local policy + # + +-kernel_read_hotplug_sysctls(cfengine_monitord_t) ++kernel_read_usermodehelper_state(cfengine_monitord_t) + kernel_read_network_state(cfengine_monitord_t) + + domain_read_all_domains_state(cfengine_monitord_t) +diff --git a/cgdcbxd.fc b/cgdcbxd.fc +new file mode 100644 +index 0000000000..756703813d +--- /dev/null ++++ b/cgdcbxd.fc +@@ -0,0 +1,5 @@ ++/usr/lib/systemd/system/cgdcbxd\.service -- gen_context(system_u:object_r:cgdcbxd_unit_file_t,s0) ++ ++/usr/sbin/cgdcbxd -- gen_context(system_u:object_r:cgdcbxd_exec_t,s0) ++ ++/var/run/cgdcbxd\.pid -- gen_context(system_u:object_r:cgdcbxd_var_run_t,s0) +diff --git a/cgdcbxd.if b/cgdcbxd.if +new file mode 100644 +index 0000000000..1efacf1d17 +--- /dev/null ++++ b/cgdcbxd.if +@@ -0,0 +1,99 @@ ++ ++## policy for cgdcbxd ++ ++######################################## ++## ++## Execute TEMPLATE in the cgdcbxd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cgdcbxd_domtrans',` ++ gen_require(` ++ type cgdcbxd_t, cgdcbxd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, cgdcbxd_exec_t, cgdcbxd_t) ++') ++######################################## ++## ++## Read cgdcbxd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cgdcbxd_read_pid_files',` ++ gen_require(` ++ type cgdcbxd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, cgdcbxd_var_run_t, cgdcbxd_var_run_t) ++') ++ ++######################################## ++## ++## Execute cgdcbxd server in the cgdcbxd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cgdcbxd_systemctl',` ++ gen_require(` ++ type cgdcbxd_t; ++ type cgdcbxd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 cgdcbxd_unit_file_t:file read_file_perms; ++ allow $1 cgdcbxd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, cgdcbxd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an cgdcbxd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`cgdcbxd_admin',` ++ gen_require(` ++ type cgdcbxd_t; ++ type cgdcbxd_var_run_t; ++ type cgdcbxd_unit_file_t; ++ ') ++ ++ allow $1 cgdcbxd_t:process { signal_perms }; ++ ps_process_pattern($1, cgdcbxd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cgdcbxd_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, cgdcbxd_var_run_t) ++ ++ cgdcbxd_systemctl($1) ++ admin_pattern($1, cgdcbxd_unit_file_t) ++ allow $1 cgdcbxd_unit_file_t:service all_service_perms; ++ ++') +diff --git a/cgdcbxd.te b/cgdcbxd.te +new file mode 100644 +index 0000000000..32640a7b08 +--- /dev/null ++++ b/cgdcbxd.te +@@ -0,0 +1,40 @@ ++policy_module(cgdcbxd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type cgdcbxd_t; ++type cgdcbxd_exec_t; ++init_daemon_domain(cgdcbxd_t, cgdcbxd_exec_t) ++ ++type cgdcbxd_var_run_t; ++files_pid_file(cgdcbxd_var_run_t) ++ ++type cgdcbxd_unit_file_t; ++systemd_unit_file(cgdcbxd_unit_file_t) ++ ++######################################## ++# ++# cgdcbxd local policy ++# ++ ++allow cgdcbxd_t self:fifo_file rw_fifo_file_perms; ++allow cgdcbxd_t self:unix_stream_socket create_stream_socket_perms; ++allow cgdcbxd_t self:udp_socket create_socket_perms; ++allow cgdcbxd_t self:unix_dgram_socket create_socket_perms; ++ ++dontaudit cgdcbxd_t self:capability sys_ptrace; ++allow cgdcbxd_t self:netlink_route_socket rw_netlink_socket_perms; ++ ++manage_files_pattern(cgdcbxd_t, cgdcbxd_var_run_t, cgdcbxd_var_run_t) ++files_pid_filetrans(cgdcbxd_t, cgdcbxd_var_run_t, { file }) ++ ++kernel_read_system_state(cgdcbxd_t) ++kernel_read_network_state(cgdcbxd_t) ++kernel_search_network_sysctl(cgdcbxd_t) ++ ++fs_manage_cgroup_files(cgdcbxd_t) ++ ++domain_dontaudit_read_all_domains_state(cgdcbxd_t) +diff --git a/cgroup.if b/cgroup.if +index 85ca63f9a7..1d1c99c8fc 100644 +--- a/cgroup.if ++++ b/cgroup.if +@@ -171,8 +171,26 @@ interface(`cgroup_admin',` + type cgrules_etc_t, cgclear_t; + ') + +- allow $1 { cgclear_t cgconfig_t cgred_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { cgclear_t cgconfig_t cgred_t }) ++ allow $1 cgclear_t:process signal_perms; ++ ps_process_pattern($1, cgclear_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cgclear_t:process ptrace; ++ ') ++ ++ allow $1 cgconfig_t:process signal_perms; ++ ps_process_pattern($1, cgconfig_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cgconfig_t:process ptrace; ++ ') ++ ++ allow $1 cgred_t:process signal_perms; ++ ps_process_pattern($1, cgred_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cgred_t:process ptrace; ++ ') + + admin_pattern($1, { cgconfig_etc_t cgrules_etc_t }) + files_list_etc($1) +diff --git a/cgroup.te b/cgroup.te +index 80a88a27a8..514eb47f24 100644 +--- a/cgroup.te ++++ b/cgroup.te +@@ -25,8 +25,8 @@ files_pid_file(cgred_var_run_t) + type cgrules_etc_t; + files_config_file(cgrules_etc_t) + +-type cgconfig_t; +-type cgconfig_exec_t; ++type cgconfig_t alias cgconfigparser_t; ++type cgconfig_exec_t alias cgconfigparser_exec_t; + init_daemon_domain(cgconfig_t, cgconfig_exec_t) + + type cgconfig_initrc_exec_t; +@@ -42,10 +42,12 @@ files_config_file(cgconfig_etc_t) + + allow cgclear_t self:capability { dac_read_search dac_override sys_admin }; + +-allow cgclear_t cgconfig_etc_t:file read_file_perms; ++read_files_pattern(cgclear_t, cgconfig_etc_t, cgconfig_etc_t) + + kernel_read_system_state(cgclear_t) + ++auth_use_nsswitch(cgclear_t) ++ + domain_setpriority_all_domains(cgclear_t) + + fs_manage_cgroup_dirs(cgclear_t) +@@ -57,30 +59,33 @@ fs_unmount_cgroup(cgclear_t) + # cgconfig local policy + # + +-allow cgconfig_t self:capability { dac_override fowner fsetid chown sys_admin sys_tty_config }; ++allow cgconfig_t self:capability { dac_read_search dac_override fowner fsetid chown sys_admin sys_tty_config }; + + allow cgconfig_t cgconfig_etc_t:file read_file_perms; + + kernel_list_unlabeled(cgconfig_t) + kernel_read_system_state(cgconfig_t) + +-files_read_etc_files(cgconfig_t) +- + fs_manage_cgroup_dirs(cgconfig_t) + fs_manage_cgroup_files(cgconfig_t) + fs_mount_cgroup(cgconfig_t) + fs_mounton_cgroup(cgconfig_t) + fs_unmount_cgroup(cgconfig_t) + ++auth_use_nsswitch(cgconfig_t) ++ + ######################################## + # + # cgred local policy + # ++allow cgred_t self:capability { chown fsetid net_admin sys_admin dac_read_search dac_override sys_ptrace }; ++allow cgred_t self:process signal_perms; + +-allow cgred_t self:capability { chown fsetid net_admin sys_admin sys_ptrace dac_override }; + allow cgred_t self:netlink_socket { write bind create read }; + allow cgred_t self:unix_dgram_socket { write create connect }; ++allow cgred_t self:netlink_connector_socket create_socket_perms; + ++allow cgred_t cgconfig_etc_t:file read_file_perms; + allow cgred_t cgrules_etc_t:file read_file_perms; + + allow cgred_t cgred_log_t:file { append_file_perms create_file_perms setattr_file_perms }; +@@ -99,10 +104,11 @@ domain_setpriority_all_domains(cgred_t) + files_getattr_all_files(cgred_t) + files_getattr_all_sockets(cgred_t) + files_read_all_symlinks(cgred_t) +-files_read_etc_files(cgred_t) + +-fs_write_cgroup_files(cgred_t) ++fs_manage_cgroup_dirs(cgred_t) ++fs_manage_cgroup_files(cgred_t) ++fs_list_inotifyfs(cgred_t) + +-logging_send_syslog_msg(cgred_t) ++auth_use_nsswitch(cgred_t) + +-miscfiles_read_localization(cgred_t) ++logging_send_syslog_msg(cgred_t) +diff --git a/chrome.fc b/chrome.fc +new file mode 100644 +index 0000000000..5c6bdb68dd +--- /dev/null ++++ b/chrome.fc +@@ -0,0 +1,11 @@ ++/opt/google/chrome[^/]*/chrome-sandbox -- gen_context(system_u:object_r:chrome_sandbox_exec_t,s0) ++ ++/usr/lib/chromium-browser/chrome-sandbox -- gen_context(system_u:object_r:chrome_sandbox_exec_t,s0) ++ ++/opt/google/chrome/nacl_helper_bootstrap -- gen_context(system_u:object_r:chrome_sandbox_nacl_exec_t,s0) ++/opt/google/chrome[^/]*/nacl_helper_bootstrap -- gen_context(system_u:object_r:chrome_sandbox_nacl_exec_t,s0) ++/usr/lib/chromium-browser/nacl_helper_bootstrap -- gen_context(system_u:object_r:chrome_sandbox_nacl_exec_t,s0) ++ ++HOME_DIR/\.cache/google-chrome(/.*)? gen_context(system_u:object_r:chrome_sandbox_home_t,s0) ++HOME_DIR/\.cache/google-chrome-unstable(/.*)? gen_context(system_u:object_r:chrome_sandbox_home_t,s0) ++HOME_DIR/\.cache/chromium(/.*)? gen_context(system_u:object_r:chrome_sandbox_home_t,s0) +diff --git a/chrome.if b/chrome.if +new file mode 100644 +index 0000000000..aa308eba61 +--- /dev/null ++++ b/chrome.if +@@ -0,0 +1,137 @@ ++ ++## policy for chrome ++ ++######################################## ++## ++## Execute a domain transition to run chrome_sandbox. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`chrome_domtrans_sandbox',` ++ gen_require(` ++ type chrome_sandbox_t, chrome_sandbox_exec_t; ++ ') ++ ++ domtrans_pattern($1, chrome_sandbox_exec_t, chrome_sandbox_t) ++ ps_process_pattern(chrome_sandbox_t, $1) ++ ++ allow $1 chrome_sandbox_t:fd use; ++ ++ dontaudit chrome_sandbox_t $1:socket_class_set getattr; ++ allow chrome_sandbox_t $1:unix_stream_socket rw_socket_perms; ++ ++ ifdef(`hide_broken_symptoms',` ++ fs_dontaudit_rw_anon_inodefs_files(chrome_sandbox_t) ++ ') ++') ++ ++ ++######################################## ++## ++## Execute chrome_sandbox in the chrome_sandbox domain, and ++## allow the specified role the chrome_sandbox domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the chrome_sandbox domain. ++## ++## ++# ++interface(`chrome_run_sandbox',` ++ gen_require(` ++ type chrome_sandbox_t; ++ type chrome_sandbox_nacl_t; ++ ') ++ ++ chrome_domtrans_sandbox($1) ++ role $2 types chrome_sandbox_t; ++ role $2 types chrome_sandbox_nacl_t; ++') ++ ++######################################## ++## ++## Role access for chrome sandbox ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`chrome_role_notrans',` ++ gen_require(` ++ type chrome_sandbox_t; ++ type chrome_sandbox_tmpfs_t; ++ type chrome_sandbox_nacl_t; ++ ') ++ ++ role $1 types chrome_sandbox_t; ++ role $1 types chrome_sandbox_nacl_t; ++ ++ ps_process_pattern($2, chrome_sandbox_t) ++ allow $2 chrome_sandbox_t:process signal_perms; ++ ++ allow chrome_sandbox_t $2:unix_dgram_socket { read write }; ++ allow $2 chrome_sandbox_t:unix_dgram_socket { read write }; ++ allow chrome_sandbox_t $2:unix_stream_socket rw_socket_perms; ++ allow chrome_sandbox_t $2:udp_socket rw_socket_perms;; ++ allow chrome_sandbox_nacl_t $2:unix_stream_socket rw_socket_perms; ++ allow $2 chrome_sandbox_nacl_t:unix_stream_socket { getattr read write }; ++ allow $2 chrome_sandbox_t:unix_stream_socket { getattr read write }; ++ ++ allow $2 chrome_sandbox_t:shm rw_shm_perms; ++ ++ allow $2 chrome_sandbox_tmpfs_t:file rw_file_perms; ++') ++ ++######################################## ++## ++## Role access for chrome sandbox ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`chrome_role',` ++ chrome_role_notrans($1, $2) ++ chrome_domtrans_sandbox($2) ++') ++ ++######################################## ++## ++## Dontaudit read/write to a chrome_sandbox leaks ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`chrome_dontaudit_sandbox_leaks',` ++ gen_require(` ++ type chrome_sandbox_t; ++ ') ++ ++ dontaudit $1 chrome_sandbox_t:unix_stream_socket { read write }; ++') +diff --git a/chrome.te b/chrome.te +new file mode 100644 +index 0000000000..5dce7aba49 +--- /dev/null ++++ b/chrome.te +@@ -0,0 +1,257 @@ ++policy_module(chrome,1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type chrome_sandbox_t; ++type chrome_sandbox_exec_t; ++application_domain(chrome_sandbox_t, chrome_sandbox_exec_t) ++role system_r types chrome_sandbox_t; ++ubac_constrained(chrome_sandbox_t) ++ ++type chrome_sandbox_tmp_t; ++files_tmp_file(chrome_sandbox_tmp_t) ++ ++type chrome_sandbox_tmpfs_t; ++files_tmpfs_file(chrome_sandbox_tmpfs_t) ++ubac_constrained(chrome_sandbox_tmpfs_t) ++ ++type chrome_sandbox_nacl_t; ++type chrome_sandbox_nacl_exec_t; ++application_domain(chrome_sandbox_nacl_t, chrome_sandbox_nacl_exec_t) ++role system_r types chrome_sandbox_nacl_t; ++ubac_constrained(chrome_sandbox_nacl_t) ++ ++type chrome_sandbox_home_t; ++userdom_user_home_content(chrome_sandbox_home_t) ++ ++######################################## ++# ++# chrome_sandbox local policy ++# ++allow chrome_sandbox_t self:capability2 block_suspend; ++allow chrome_sandbox_t self:capability { chown dac_read_search dac_override fsetid setgid setuid sys_admin sys_chroot sys_ptrace }; ++dontaudit chrome_sandbox_t self:capability sys_nice; ++allow chrome_sandbox_t self:process { signal_perms setrlimit execmem execstack }; ++allow chrome_sandbox_t self:process { setcap setsched }; ++allow chrome_sandbox_t self:fifo_file manage_fifo_file_perms; ++allow chrome_sandbox_t self:unix_stream_socket create_stream_socket_perms; ++allow chrome_sandbox_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow chrome_sandbox_t self:shm create_shm_perms; ++allow chrome_sandbox_t self:sem create_sem_perms; ++allow chrome_sandbox_t self:msgq create_msgq_perms; ++allow chrome_sandbox_t self:netlink_route_socket r_netlink_socket_perms; ++dontaudit chrome_sandbox_t self:memprotect mmap_zero; ++ ++manage_dirs_pattern(chrome_sandbox_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++manage_files_pattern(chrome_sandbox_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++manage_lnk_files_pattern(chrome_sandbox_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++ ++manage_dirs_pattern(chrome_sandbox_t, chrome_sandbox_tmp_t, chrome_sandbox_tmp_t) ++manage_files_pattern(chrome_sandbox_t, chrome_sandbox_tmp_t, chrome_sandbox_tmp_t) ++files_tmp_filetrans(chrome_sandbox_t, chrome_sandbox_tmp_t, { dir file }) ++userdom_user_tmp_filetrans(chrome_sandbox_t, chrome_sandbox_tmp_t, { dir file }) ++ ++manage_files_pattern(chrome_sandbox_t, chrome_sandbox_tmpfs_t, chrome_sandbox_tmpfs_t) ++fs_tmpfs_filetrans(chrome_sandbox_t, chrome_sandbox_tmpfs_t, { file dir }) ++ ++kernel_read_system_state(chrome_sandbox_t) ++kernel_read_kernel_sysctls(chrome_sandbox_t) ++ ++auth_dontaudit_read_passwd(chrome_sandbox_t) ++ ++fs_manage_cgroup_dirs(chrome_sandbox_t) ++fs_manage_cgroup_files(chrome_sandbox_t) ++fs_read_dos_files(chrome_sandbox_t) ++fs_read_hugetlbfs_files(chrome_sandbox_t) ++ ++corecmd_exec_bin(chrome_sandbox_t) ++ ++corenet_all_recvfrom_netlabel(chrome_sandbox_t) ++corenet_tcp_connect_all_ephemeral_ports(chrome_sandbox_t) ++corenet_tcp_connect_aol_port(chrome_sandbox_t) ++corenet_tcp_connect_asterisk_port(chrome_sandbox_t) ++corenet_tcp_connect_commplex_link_port(chrome_sandbox_t) ++corenet_tcp_connect_couchdb_port(chrome_sandbox_t) ++corenet_tcp_connect_flash_port(chrome_sandbox_t) ++corenet_tcp_connect_ftp_port(chrome_sandbox_t) ++corenet_tcp_connect_gatekeeper_port(chrome_sandbox_t) ++corenet_tcp_connect_generic_port(chrome_sandbox_t) ++corenet_tcp_connect_http_cache_port(chrome_sandbox_t) ++corenet_tcp_connect_http_port(chrome_sandbox_t) ++corenet_tcp_connect_ipp_port(chrome_sandbox_t) ++corenet_tcp_connect_ipsecnat_port(chrome_sandbox_t) ++corenet_tcp_connect_jabber_client_port(chrome_sandbox_t) ++corenet_tcp_connect_jboss_management_port(chrome_sandbox_t) ++corenet_tcp_connect_mmcc_port(chrome_sandbox_t) ++corenet_tcp_connect_monopd_port(chrome_sandbox_t) ++corenet_tcp_connect_msnp_port(chrome_sandbox_t) ++corenet_tcp_connect_ms_streaming_port(chrome_sandbox_t) ++corenet_tcp_connect_pulseaudio_port(chrome_sandbox_t) ++corenet_tcp_connect_rtsp_port(chrome_sandbox_t) ++corenet_tcp_connect_soundd_port(chrome_sandbox_t) ++corenet_tcp_connect_speech_port(chrome_sandbox_t) ++corenet_tcp_connect_squid_port(chrome_sandbox_t) ++corenet_tcp_connect_tor_port(chrome_sandbox_t) ++corenet_tcp_connect_transproxy_port(chrome_sandbox_t) ++corenet_tcp_connect_vnc_port(chrome_sandbox_t) ++corenet_tcp_connect_whois_port(chrome_sandbox_t) ++corenet_tcp_sendrecv_generic_if(chrome_sandbox_t) ++corenet_tcp_sendrecv_generic_node(chrome_sandbox_t) ++ ++domain_dontaudit_read_all_domains_state(chrome_sandbox_t) ++ ++dev_read_urand(chrome_sandbox_t) ++dev_read_sysfs(chrome_sandbox_t) ++dev_rwx_zero(chrome_sandbox_t) ++dev_dontaudit_getattr_all_chr_files(chrome_sandbox_t) ++ ++fs_dontaudit_getattr_all_fs(chrome_sandbox_t) ++ ++libs_legacy_use_shared_libs(chrome_sandbox_t) ++ ++term_dontaudit_use_console(chrome_sandbox_t) ++ ++miscfiles_read_fonts(chrome_sandbox_t) ++ ++sysnet_dns_name_resolve(chrome_sandbox_t) ++ ++userdom_rw_inherited_user_tmp_files(chrome_sandbox_t) ++userdom_execute_user_tmp_files(chrome_sandbox_t) ++userdom_map_tmp_files(chrome_sandbox_t) ++ ++userdom_use_user_ptys(chrome_sandbox_t) ++userdom_write_inherited_user_tmp_files(chrome_sandbox_t) ++userdom_read_inherited_user_home_content_files(chrome_sandbox_t) ++userdom_dontaudit_use_user_terminals(chrome_sandbox_t) ++userdom_search_user_home_content(chrome_sandbox_t) ++# This one we should figure a way to make it more secure ++userdom_manage_home_certs(chrome_sandbox_t) ++ ++optional_policy(` ++ gnome_exec_config_home_files(chrome_sandbox_t) ++ gnome_read_generic_cache_files(chrome_sandbox_t) ++ gnome_rw_inherited_config(chrome_sandbox_t) ++ gnome_read_home_config(chrome_sandbox_t) ++ gnome_cache_filetrans(chrome_sandbox_t, chrome_sandbox_home_t, dir, "chromium") ++ gnome_cache_filetrans(chrome_sandbox_t, chrome_sandbox_home_t, dir, "chrome") ++ gnome_cache_filetrans(chrome_sandbox_t, chrome_sandbox_home_t, dir, "google-chrome") ++ gnome_cache_filetrans(chrome_sandbox_t, chrome_sandbox_home_t, dir, "google-chrome-unstable") ++') ++ ++optional_policy(` ++ mozilla_write_user_home_files(chrome_sandbox_t) ++') ++ ++optional_policy(` ++ xserver_use_user_fonts(chrome_sandbox_t) ++ xserver_user_x_domain_template(chrome_sandbox, chrome_sandbox_t, chrome_sandbox_tmpfs_t) ++') ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_search_nfs(chrome_sandbox_t) ++ fs_exec_nfs_files(chrome_sandbox_t) ++ fs_read_nfs_files(chrome_sandbox_t) ++ fs_rw_inherited_nfs_files(chrome_sandbox_t) ++ fs_read_nfs_symlinks(chrome_sandbox_t) ++ fs_dontaudit_append_nfs_files(chrome_sandbox_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_search_cifs(chrome_sandbox_t) ++ fs_exec_cifs_files(chrome_sandbox_t) ++ fs_rw_inherited_cifs_files(chrome_sandbox_t) ++ fs_read_cifs_files(chrome_sandbox_t) ++ fs_read_cifs_symlinks(chrome_sandbox_t) ++ fs_dontaudit_append_cifs_files(chrome_sandbox_t) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_search_fusefs(chrome_sandbox_t) ++ fs_read_fusefs_files(chrome_sandbox_t) ++ fs_exec_fusefs_files(chrome_sandbox_t) ++ fs_read_fusefs_symlinks(chrome_sandbox_t) ++') ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_read_ecryptfs_files(chrome_sandbox_t) ++ fs_dontaudit_append_ecryptfs_files(chrome_sandbox_t) ++ fs_read_ecryptfs_symlinks(chrome_sandbox_t) ++') ++ ++optional_policy(` ++ bumblebee_stream_connect(chrome_sandbox_t) ++') ++ ++optional_policy(` ++ cups_stream_connect(chrome_sandbox_t) ++') ++ ++optional_policy(` ++ sandbox_use_ptys(chrome_sandbox_t) ++') ++ ++optional_policy(` ++ unconfined_dontaudit_write_state(chrome_sandbox_t) ++') ++ ++######################################## ++# ++# chrome_sandbox_nacl local policy ++# ++ ++allow chrome_sandbox_nacl_t self:process { execmem setsched sigkill sigstop signull signal }; ++ ++allow chrome_sandbox_nacl_t self:fifo_file manage_fifo_file_perms; ++allow chrome_sandbox_nacl_t self:unix_stream_socket create_stream_socket_perms; ++allow chrome_sandbox_nacl_t self:shm create_shm_perms; ++allow chrome_sandbox_nacl_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow chrome_sandbox_nacl_t chrome_sandbox_t:unix_stream_socket { getattr write read }; ++allow chrome_sandbox_t chrome_sandbox_nacl_t:unix_stream_socket { getattr write read }; ++allow chrome_sandbox_nacl_t chrome_sandbox_t:unix_dgram_socket { read write }; ++ ++allow chrome_sandbox_nacl_t chrome_sandbox_t:shm rw_shm_perms; ++allow chrome_sandbox_nacl_t chrome_sandbox_tmpfs_t:file rw_inherited_file_perms; ++allow chrome_sandbox_t chrome_sandbox_nacl_t:process { sigkill sigstop signull signal sigchld share }; ++ ++manage_files_pattern(chrome_sandbox_nacl_t, chrome_sandbox_tmpfs_t, chrome_sandbox_tmpfs_t) ++fs_tmpfs_filetrans(chrome_sandbox_nacl_t, chrome_sandbox_tmpfs_t, file) ++ ++domain_use_interactive_fds(chrome_sandbox_nacl_t) ++ ++dontaudit chrome_sandbox_nacl_t self:memprotect mmap_zero; ++ ++domtrans_pattern(chrome_sandbox_t, chrome_sandbox_nacl_exec_t, chrome_sandbox_nacl_t) ++ps_process_pattern(chrome_sandbox_t, chrome_sandbox_nacl_t) ++ps_process_pattern(chrome_sandbox_nacl_t, chrome_sandbox_t) ++ ++manage_dirs_pattern(chrome_sandbox_nacl_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++manage_files_pattern(chrome_sandbox_nacl_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++manage_lnk_files_pattern(chrome_sandbox_nacl_t, chrome_sandbox_home_t, chrome_sandbox_home_t) ++ ++kernel_read_state(chrome_sandbox_nacl_t) ++kernel_read_system_state(chrome_sandbox_nacl_t) ++ ++corecmd_bin_entry_type(chrome_sandbox_nacl_t) ++ ++dev_read_urand(chrome_sandbox_nacl_t) ++dev_read_sysfs(chrome_sandbox_nacl_t) ++dev_rwx_zero(chrome_sandbox_nacl_t) ++ ++init_read_state(chrome_sandbox_nacl_t) ++ ++libs_legacy_use_shared_libs(chrome_sandbox_nacl_t) ++ ++userdom_use_inherited_user_ptys(chrome_sandbox_nacl_t) ++userdom_rw_inherited_user_tmp_files(chrome_sandbox_nacl_t) ++userdom_execute_user_tmp_files(chrome_sandbox_nacl_t) ++userdom_rw_inherited_user_tmp_files(chrome_sandbox_nacl_t) ++userdom_dontaudit_read_user_home_content_files(chrome_sandbox_nacl_t) ++userdom_dontaudit_use_user_terminals(chrome_sandbox_nacl_t) ++ ++optional_policy(` ++ gnome_dontaudit_append_config_files(chrome_sandbox_nacl_t) ++ gnome_dontaudit_write_config_files(chrome_sandbox_nacl_t) ++') +diff --git a/chronyd.fc b/chronyd.fc +index 4e4143ed8f..940434abe7 100644 +--- a/chronyd.fc ++++ b/chronyd.fc +@@ -1,13 +1,20 @@ +-/etc/chrony\.keys -- gen_context(system_u:object_r:chronyd_keys_t,s0) ++/etc/chrony\.keys.* -- gen_context(system_u:object_r:chronyd_keys_t,s0) + + /etc/rc\.d/init\.d/chronyd -- gen_context(system_u:object_r:chronyd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/chrony.* -- gen_context(system_u:object_r:chronyd_unit_file_t,s0) ++ + /usr/sbin/chronyd -- gen_context(system_u:object_r:chronyd_exec_t,s0) ++/usr/libexec/chrony-helper -- gen_context(system_u:object_r:chronyd_exec_t,s0) ++ ++/usr/bin/chronyc -- gen_context(system_u:object_r:chronyc_exec_t,s0) + + /var/lib/chrony(/.*)? gen_context(system_u:object_r:chronyd_var_lib_t,s0) + + /var/log/chrony(/.*)? gen_context(system_u:object_r:chronyd_var_log_t,s0) + +-/var/run/chronyd(/.*) gen_context(system_u:object_r:chronyd_var_run_t,s0) ++/var/run/chrony(/.*)? gen_context(system_u:object_r:chronyd_var_run_t,s0) ++/var/run/chronyd(/.*)? gen_context(system_u:object_r:chronyd_var_run_t,s0) ++/var/run/chrony-helper(/.*)? gen_context(system_u:object_r:chronyd_var_run_t,s0) + /var/run/chronyd\.pid -- gen_context(system_u:object_r:chronyd_var_run_t,s0) + /var/run/chronyd\.sock -s gen_context(system_u:object_r:chronyd_var_run_t,s0) +diff --git a/chronyd.if b/chronyd.if +index 32e8265c2e..ffebaf512b 100644 +--- a/chronyd.if ++++ b/chronyd.if +@@ -57,6 +57,24 @@ interface(`chronyd_exec',` + can_exec($1, chronyd_exec_t) + ') + ++######################################## ++## ++## Send generic signals to chronyd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`chronyd_signal',` ++ gen_require(` ++ type chronyd_t; ++ ') ++ ++ allow $1 chronyd_t:process signal; ++') ++ + ##################################### + ## + ## Read chronyd log files. +@@ -100,8 +118,7 @@ interface(`chronyd_rw_shm',` + + ######################################## + ## +-## Connect to chronyd using a unix +-## domain stream socket. ++## Read chronyd keys files. + ## + ## + ## +@@ -109,19 +126,17 @@ interface(`chronyd_rw_shm',` + ## + ## + # +-interface(`chronyd_stream_connect',` ++interface(`chronyd_read_keys',` + gen_require(` +- type chronyd_t, chronyd_var_run_t; ++ type chronyd_keys_t; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, chronyd_var_run_t, chronyd_var_run_t, chronyd_t) ++ read_files_pattern($1, chronyd_keys_t, chronyd_keys_t) + ') + + ######################################## + ## +-## Send to chronyd using a unix domain +-## datagram socket. ++## Append chronyd keys files. + ## + ## + ## +@@ -129,18 +144,62 @@ interface(`chronyd_stream_connect',` + ## + ## + # +-interface(`chronyd_dgram_send',` ++interface(`chronyd_append_keys',` ++ gen_require(` ++ type chronyd_keys_t; ++ ') ++ ++ append_files_pattern($1, chronyd_keys_t, chronyd_keys_t) ++') ++ ++######################################## ++## ++## Execute chronyd server in the chronyd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`chronyd_systemctl',` ++ gen_require(` ++ type chronyd_t; ++ type chronyd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 chronyd_unit_file_t:file read_file_perms; ++ allow $1 chronyd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, chronyd_t) ++') ++ ++####################################### ++## ++## Connect to chronyd using a unix ++## domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`chronyd_stream_connect',` + gen_require(` + type chronyd_t, chronyd_var_run_t; + ') + + files_search_pids($1) +- dgram_send_pattern($1, chronyd_var_run_t, chronyd_var_run_t, chronyd_t) ++ stream_connect_pattern($1, chronyd_var_run_t, chronyd_var_run_t, chronyd_t) + ') + + ######################################## + ## +-## Read chronyd key files. ++## Send to chronyd using a unix domain ++## datagram socket. + ## + ## + ## +@@ -148,13 +207,13 @@ interface(`chronyd_dgram_send',` + ## + ## + # +-interface(`chronyd_read_key_files',` ++interface(`chronyd_dgram_send',` + gen_require(` +- type chronyd_keys_t; ++ type chronyd_t, chronyd_var_run_t; + ') + +- files_search_etc($1) +- read_files_pattern($1, chronyd_keys_t, chronyd_keys_t) ++ files_search_pids($1) ++ dgram_send_pattern($1, chronyd_var_run_t, chronyd_var_run_t, chronyd_t) + ') + + #################################### +@@ -176,28 +235,81 @@ interface(`chronyd_read_key_files',` + # + interface(`chronyd_admin',` + gen_require(` +- type chronyd_t, chronyd_var_log_t; +- type chronyd_var_run_t, chronyd_var_lib_t; +- type chronyd_initrc_exec_t, chronyd_keys_t; ++ type chronyd_t, chronyd_var_log_t, chronyd_var_run_t; ++ type chronyd_var_lib_t, chronyd_tmpfs_t, chronyd_initrc_exec_t; ++ type chronyd_keys_t, chronyd_unit_file_t; + ') + +- allow $1 chronyd_t:process { ptrace signal_perms }; ++ allow $1 chronyd_t:process signal_perms; + ps_process_pattern($1, chronyd_t) + +- chronyd_initrc_domtrans($1) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 chronyd_t:process ptrace; ++ ') ++ ++ init_labeled_script_domtrans($1, chronyd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 chronyd_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) ++ files_list_etc($1) + admin_pattern($1, chronyd_keys_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, chronyd_var_log_t) + +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, chronyd_var_lib_t) + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, chronyd_var_run_t) ++ ++ admin_pattern($1, chronyd_tmpfs_t) ++ ++ admin_pattern($1, chronyd_unit_file_t) ++ chronyd_systemctl($1) ++ allow $1 chronyd_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Execute chronyc in the chronyc domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`chronyd_domtrans_chronyc',` ++ gen_require(` ++ type chronyc_t, chronyc_exec_t; ++ ') ++ ++ domtrans_pattern($1, chronyc_exec_t, chronyc_t) ++') ++ ++######################################## ++## ++## Execute chronyc in the chronyc domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`chronyd_run_chronyc',` ++ gen_require(` ++ type chronyc_t; ++ attribute_role chronyc_roles; ++ ') ++ ++ chronyd_domtrans_chronyc($1) ++ roleattribute $2 chronyc_roles; + ') +diff --git a/chronyd.te b/chronyd.te +index e5b621c29c..13fff22f47 100644 +--- a/chronyd.te ++++ b/chronyd.te +@@ -5,6 +5,9 @@ policy_module(chronyd, 1.2.0) + # Declarations + # + ++attribute_role chronyc_roles; ++roleattribute system_r chronyc_roles; ++ + type chronyd_t; + type chronyd_exec_t; + init_daemon_domain(chronyd_t, chronyd_exec_t) +@@ -18,6 +21,9 @@ files_type(chronyd_keys_t) + type chronyd_tmpfs_t; + files_tmpfs_file(chronyd_tmpfs_t) + ++type chronyd_unit_file_t; ++systemd_unit_file(chronyd_unit_file_t) ++ + type chronyd_var_lib_t; + files_type(chronyd_var_lib_t) + +@@ -27,21 +33,40 @@ logging_log_file(chronyd_var_log_t) + type chronyd_var_run_t; + files_pid_file(chronyd_var_run_t) + ++type chronyd_tmp_t; ++files_tmp_file(chronyd_tmp_t) ++ ++type chronyc_t; ++type chronyc_exec_t; ++domain_type(chronyc_t, chronyc_exec_t) ++init_system_domain(chronyc_t, chronyc_exec_t) ++role chronyc_roles types chronyc_t; ++ + ######################################## + # + # Local policy + # + +-allow chronyd_t self:capability { dac_override ipc_lock setuid setgid sys_resource sys_time }; +-allow chronyd_t self:process { getcap setcap setrlimit signal }; ++allow chronyd_t self:capability { dac_read_search dac_override ipc_lock fsetid setuid setgid sys_nice sys_resource sys_time chown net_admin }; ++allow chronyd_t self:capability2 block_suspend; ++allow chronyd_t self:process { getsched setsched getcap setcap setrlimit signal }; + allow chronyd_t self:shm create_shm_perms; ++allow chronyd_t self:udp_socket create_socket_perms; ++allow chronyd_t self:unix_dgram_socket { create_socket_perms sendto }; + allow chronyd_t self:fifo_file rw_fifo_file_perms; + ++allow chronyd_t chronyd_keys_t:file append_file_perms; ++allow chronyd_t chronyd_keys_t:file setattr_file_perms; + allow chronyd_t chronyd_keys_t:file read_file_perms; + ++allow chronyd_t chronyc_t:unix_dgram_socket sendto; ++ ++allow chronyd_t chronyc_exec_t:file mmap_file_perms; ++ + manage_dirs_pattern(chronyd_t, chronyd_tmpfs_t, chronyd_tmpfs_t) + manage_files_pattern(chronyd_t, chronyd_tmpfs_t, chronyd_tmpfs_t) + fs_tmpfs_filetrans(chronyd_t, chronyd_tmpfs_t, { dir file }) ++allow chronyd_t chronyd_tmpfs_t:file map; + + manage_files_pattern(chronyd_t, chronyd_var_lib_t, chronyd_var_lib_t) + manage_dirs_pattern(chronyd_t, chronyd_var_lib_t, chronyd_var_lib_t) +@@ -61,6 +86,11 @@ files_pid_filetrans(chronyd_t, chronyd_var_run_t, { dir file sock_file }) + + kernel_read_system_state(chronyd_t) + kernel_read_network_state(chronyd_t) ++kernel_request_load_module(chronyd_t) ++ ++can_exec(chronyd_t,chronyc_exec_t) ++ ++clock_read_adjtime(chronyd_t) + + corenet_all_recvfrom_unlabeled(chronyd_t) + corenet_all_recvfrom_netlabel(chronyd_t) +@@ -76,18 +106,87 @@ corenet_sendrecv_chronyd_server_packets(chronyd_t) + corenet_udp_bind_chronyd_port(chronyd_t) + corenet_udp_sendrecv_chronyd_port(chronyd_t) + ++domain_dontaudit_getsession_all_domains(chronyd_t) ++ ++dev_read_rand(chronyd_t) ++dev_read_urand(chronyd_t) ++dev_read_sysfs(chronyd_t) ++ + dev_rw_realtime_clock(chronyd_t) + + auth_use_nsswitch(chronyd_t) + ++corecmd_exec_bin(chronyd_t) ++corecmd_exec_shell(chronyd_t) ++ + logging_send_syslog_msg(chronyd_t) + +-miscfiles_read_localization(chronyd_t) ++mta_send_mail(chronyd_t) ++ ++sysnet_read_dhcpc_state(chronyd_t) ++ ++systemd_exec_systemctl(chronyd_t) ++ ++userdom_dgram_send(chronyd_t) + + optional_policy(` + gpsd_rw_shm(chronyd_t) + ') + + optional_policy(` +- mta_send_mail(chronyd_t) ++ virt_read_lib_files(chronyd_t) ++') ++ ++optional_policy(` ++ timemaster_stream_connect(chronyd_t) ++ timemaster_read_pid_files(chronyd_t) ++ timemaster_rw_shm(chronyd_t) ++') ++ ++optional_policy(` ++ ptp4l_rw_shm(chronyd_t) ++ phc2sys_rw_shm(chronyd_t) ++') ++ ++######################################## ++# ++# Local policy ++# ++ ++allow chronyc_t self:capability { dac_read_search dac_override }; ++allow chronyc_t self:udp_socket create_socket_perms; ++allow chronyc_t self:unix_dgram_socket create_socket_perms; ++allow chronyc_t self:netlink_route_socket create_netlink_socket_perms; ++ ++allow chronyc_t chronyd_t:unix_dgram_socket sendto; ++ ++allow chronyc_t chronyd_keys_t:file manage_file_perms; ++ ++manage_dirs_pattern(chronyc_t, chronyd_var_run_t, chronyd_var_run_t) ++manage_files_pattern(chronyc_t, chronyd_var_run_t, chronyd_var_run_t) ++manage_sock_files_pattern(chronyc_t, chronyd_var_run_t, chronyd_var_run_t) ++ ++manage_dirs_pattern(chronyc_t, chronyd_tmpfs_t, chronyd_tmpfs_t) ++manage_files_pattern(chronyc_t, chronyd_tmpfs_t, chronyd_tmpfs_t) ++fs_tmpfs_filetrans(chronyc_t, chronyd_tmpfs_t, { dir file }) ++ ++manage_files_pattern(chronyc_t, chronyd_var_lib_t, chronyd_var_lib_t) ++files_var_lib_filetrans(chronyc_t, chronyd_var_lib_t, file) ++ ++manage_files_pattern(chronyc_t, chronyd_var_log_t, chronyd_var_log_t) ++logging_log_filetrans(chronyc_t, chronyd_var_log_t, file) ++ ++manage_files_pattern(chronyc_t, chronyd_tmp_t, chronyd_tmp_t) ++files_tmp_filetrans(chronyc_t, chronyd_tmp_t, file) ++ ++corecmd_exec_bin(chronyc_t) ++ ++sysnet_read_config(chronyc_t) ++ ++userdom_use_user_ptys(chronyc_t) ++userdom_use_inherited_user_ttys(chronyc_t) ++userdom_rw_stream(chronyc_t) ++ ++optional_policy(` ++ nscd_shm_use(chronyc_t) + ') +diff --git a/cinder.fc b/cinder.fc +new file mode 100644 +index 0000000000..4b318b783e +--- /dev/null ++++ b/cinder.fc +@@ -0,0 +1,16 @@ ++ ++/usr/bin/cinder-api -- gen_context(system_u:object_r:cinder_api_exec_t,s0) ++/usr/bin/cinder-backup -- gen_context(system_u:object_r:cinder_backup_exec_t,s0) ++/usr/bin/cinder-scheduler -- gen_context(system_u:object_r:cinder_scheduler_exec_t,s0) ++/usr/bin/cinder-volume -- gen_context(system_u:object_r:cinder_volume_exec_t,s0) ++ ++/usr/lib/systemd/system/openstack-cinder-api.* -- gen_context(system_u:object_r:cinder_api_unit_file_t,s0) ++/usr/lib/systemd/system/openstack-cinder-backup.* -- gen_context(system_u:object_r:cinder_backup_unit_file_t,s0) ++/usr/lib/systemd/system/openstack-cinder-scheduler.* -- gen_context(system_u:object_r:cinder_scheduler_unit_file_t,s0) ++/usr/lib/systemd/system/openstack-cinder-volume.* -- gen_context(system_u:object_r:cinder_volume_unit_file_t,s0) ++ ++/var/lib/cinder(/.*)? gen_context(system_u:object_r:cinder_var_lib_t,s0) ++ ++/var/log/cinder(/.*)? gen_context(system_u:object_r:cinder_log_t,s0) ++ ++/var/run/cinder(/.*)? gen_context(system_u:object_r:cinder_var_run_t,s0) +diff --git a/cinder.if b/cinder.if +new file mode 100644 +index 0000000000..fc9cae7c76 +--- /dev/null ++++ b/cinder.if +@@ -0,0 +1,57 @@ ++## openstack-cinder ++ ++###################################### ++## ++## Manage cinder lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cinder_manage_lib_files',` ++ gen_require(` ++ type cinder_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, cinder_var_lib_t, cinder_var_lib_t) ++') ++ ++####################################### ++## ++## Creates types and rules for a basic ++## openstack-cinder systemd daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`cinder_domain_template',` ++ gen_require(` ++ attribute cinder_domain; ++ ') ++ ++ type cinder_$1_t, cinder_domain; ++ type cinder_$1_exec_t; ++ init_daemon_domain(cinder_$1_t, cinder_$1_exec_t) ++ ++ type cinder_$1_unit_file_t; ++ systemd_unit_file(cinder_$1_unit_file_t) ++ ++ type cinder_$1_tmp_t; ++ files_tmp_file(cinder_$1_tmp_t) ++ ++ manage_dirs_pattern(cinder_$1_t, cinder_$1_tmp_t, cinder_$1_tmp_t) ++ manage_files_pattern(cinder_$1_t, cinder_$1_tmp_t, cinder_$1_tmp_t) ++ files_tmp_filetrans(cinder_$1_t, cinder_$1_tmp_t, { file dir }) ++ can_exec(cinder_$1_t, cinder_$1_tmp_t) ++ ++ kernel_read_system_state(cinder_$1_t) ++ ++ logging_send_syslog_msg(cinder_$1_t) ++ ++') +diff --git a/cinder.te b/cinder.te +new file mode 100644 +index 0000000000..a05691d8fc +--- /dev/null ++++ b/cinder.te +@@ -0,0 +1,171 @@ ++policy_module(cinder, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++# ++# cinder-stack daemons contain security issue with using sudo in the code ++# we make this policy as unconfined until this issue is fixed ++# ++ ++attribute cinder_domain; ++ ++cinder_domain_template(api) ++cinder_domain_template(backup) ++cinder_domain_template(scheduler) ++cinder_domain_template(volume) ++ ++type cinder_log_t; ++logging_log_file(cinder_log_t) ++ ++type cinder_var_lib_t; ++files_type(cinder_var_lib_t) ++ ++type cinder_var_run_t; ++files_pid_file(cinder_var_run_t) ++ ++###################################### ++# ++# cinder general domain local policy ++# ++ ++allow cinder_domain self:process signal_perms; ++allow cinder_domain self:fifo_file rw_fifo_file_perms; ++allow cinder_domain self:tcp_socket create_stream_socket_perms; ++allow cinder_domain self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(cinder_domain, cinder_log_t, cinder_log_t) ++manage_files_pattern(cinder_domain, cinder_log_t, cinder_log_t) ++ ++manage_dirs_pattern(cinder_domain, cinder_var_lib_t, cinder_var_lib_t) ++manage_files_pattern(cinder_domain, cinder_var_lib_t, cinder_var_lib_t) ++ ++manage_dirs_pattern(cinder_domain, cinder_var_run_t, cinder_var_run_t) ++manage_files_pattern(cinder_domain, cinder_var_run_t, cinder_var_run_t) ++ ++corenet_tcp_connect_amqp_port(cinder_domain) ++corenet_tcp_connect_mysqld_port(cinder_domain) ++ ++kernel_read_network_state(cinder_domain) ++ ++corecmd_exec_bin(cinder_domain) ++corecmd_exec_shell(cinder_domain) ++corenet_tcp_connect_mysqld_port(cinder_domain) ++ ++auth_read_passwd(cinder_domain) ++ ++dev_read_sysfs(cinder_domain) ++dev_read_urand(cinder_domain) ++ ++fs_getattr_xattr_fs(cinder_domain) ++ ++init_read_utmp(cinder_domain) ++ ++libs_exec_ldconfig(cinder_domain) ++ ++optional_policy(` ++ mysql_stream_connect(cinder_domain) ++ mysql_read_db_lnk_files(cinder_domain) ++') ++ ++optional_policy(` ++ sysnet_read_config(cinder_domain) ++ sysnet_exec_ifconfig(cinder_domain) ++') ++ ++####################################### ++# ++# cinder api local policy ++# ++ ++allow cinder_api_t self:process setfscreate; ++allow cinder_api_t self:key write; ++allow cinder_api_t self:netlink_route_socket r_netlink_socket_perms; ++allow cinder_api_t self:udp_socket create_socket_perms; ++ ++kernel_read_kernel_sysctls(cinder_api_t) ++ ++corenet_tcp_bind_generic_node(cinder_api_t) ++corenet_udp_bind_generic_node(cinder_api_t) ++# should be add to booleans ++corenet_tcp_connect_all_ports(cinder_api_t) ++corenet_tcp_bind_all_unreserved_ports(cinder_api_t) ++ ++auth_read_passwd(cinder_api_t) ++ ++logging_send_syslog_msg(cinder_api_t) ++ ++miscfiles_read_certs(cinder_api_t) ++ ++optional_policy(` ++ iptables_domtrans(cinder_api_t) ++') ++ ++optional_policy(` ++ ssh_exec_keygen(cinder_api_t) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(cinder_api_t) ++') ++ ++optional_policy(` ++ unconfined_domain(cinder_api_t) ++') ++ ++####################################### ++# ++# cinder backup local policy ++# ++ ++allow cinder_backup_t self:udp_socket create_socket_perms; ++ ++auth_use_nsswitch(cinder_backup_t) ++ ++systemd_dbus_chat_logind(cinder_backup_t) ++ ++optional_policy(` ++ unconfined_domain(cinder_backup_t) ++') ++ ++####################################### ++# ++# cinder scheduler local policy ++# ++ ++allow cinder_scheduler_t self:netlink_route_socket r_netlink_socket_perms; ++allow cinder_scheduler_t self:udp_socket create_socket_perms; ++ ++auth_read_passwd(cinder_scheduler_t) ++ ++init_read_utmp(cinder_scheduler_t) ++ ++optional_policy(` ++ unconfined_domain(cinder_scheduler_t) ++') ++ ++####################################### ++# ++# cinder volume local policy ++# ++ ++allow cinder_volume_t self:netlink_route_socket r_netlink_socket_perms; ++ ++allow cinder_volume_t self:udp_socket create_socket_perms; ++ ++kernel_read_kernel_sysctls(cinder_volume_t) ++ ++logging_send_syslog_msg(cinder_volume_t) ++ ++systemd_dbus_chat_logind(cinder_volume_t) ++ ++optional_policy(` ++ lvm_domtrans(cinder_volume_t) ++') ++ ++optional_policy(` ++ unconfined_domain(cinder_volume_t) ++') ++ +diff --git a/cipe.te b/cipe.te +index a0aa693d14..af571edbba 100644 +--- a/cipe.te ++++ b/cipe.te +@@ -29,7 +29,6 @@ kernel_read_system_state(ciped_t) + corecmd_exec_shell(ciped_t) + corecmd_exec_bin(ciped_t) + +-corenet_all_recvfrom_unlabeled(ciped_t) + corenet_all_recvfrom_netlabel(ciped_t) + corenet_udp_sendrecv_generic_if(ciped_t) + corenet_udp_sendrecv_generic_node(ciped_t) +@@ -45,7 +44,6 @@ dev_read_urand(ciped_t) + + domain_use_interactive_fds(ciped_t) + +-files_read_etc_files(ciped_t) + files_read_etc_runtime_files(ciped_t) + files_dontaudit_search_var(ciped_t) + +@@ -53,8 +51,6 @@ fs_search_auto_mountpoints(ciped_t) + + logging_send_syslog_msg(ciped_t) + +-miscfiles_read_localization(ciped_t) +- + sysnet_read_config(ciped_t) + + userdom_dontaudit_use_unpriv_user_fds(ciped_t) +diff --git a/clamav.fc b/clamav.fc +index d72afcc314..c53b80dcd2 100644 +--- a/clamav.fc ++++ b/clamav.fc +@@ -6,6 +6,8 @@ + /usr/bin/clamdscan -- gen_context(system_u:object_r:clamscan_exec_t,s0) + /usr/bin/freshclam -- gen_context(system_u:object_r:freshclam_exec_t,s0) + ++/usr/lib/systemd/system/clamd.* -- gen_context(system_u:object_r:clamd_unit_file_t,s0) ++ + /usr/sbin/clamd -- gen_context(system_u:object_r:clamd_exec_t,s0) + /usr/sbin/clamav-milter -- gen_context(system_u:object_r:clamd_exec_t,s0) + +diff --git a/clamav.if b/clamav.if +index 4cc4a5cd0e..a6c6322903 100644 +--- a/clamav.if ++++ b/clamav.if +@@ -1,4 +1,4 @@ +-## ClamAV Virus Scanner. ++## ClamAV Virus Scanner + + ######################################## + ## +@@ -15,14 +15,12 @@ interface(`clamav_domtrans',` + type clamd_t, clamd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, clamd_exec_t, clamd_t) + ') + + ######################################## + ## +-## Connect to clamd using a unix +-## domain stream socket. ++## Connect to run clamd. + ## + ## + ## +@@ -41,7 +39,8 @@ interface(`clamav_stream_connect',` + + ######################################## + ## +-## Append clamav log files. ++## Allow the specified domain to append ++## to clamav log files. + ## + ## + ## +@@ -59,27 +58,6 @@ interface(`clamav_append_log',` + append_files_pattern($1, clamd_var_log_t, clamd_var_log_t) + ') + +-######################################## +-## +-## Create, read, write, and delete +-## clamav pid content. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`clamav_manage_pid_content',` +- gen_require(` +- type clamd_var_run_t; +- ') +- +- files_search_pids($1) +- manage_dirs_pattern($1, clamd_var_run_t, clamd_var_run_t) +- manage_files_pattern($1, clamd_var_run_t, clamd_var_run_t) +-') +- + ######################################## + ## + ## Read clamav configuration files. +@@ -101,7 +79,7 @@ interface(`clamav_read_config',` + + ######################################## + ## +-## Search clamav library directories. ++## Search clamav libraries directories. + ## + ## + ## +@@ -133,13 +111,12 @@ interface(`clamav_domtrans_clamscan',` + type clamscan_t, clamscan_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, clamscan_exec_t, clamscan_t) + ') + + ######################################## + ## +-## Execute clamscan in the caller domain. ++## Execute clamscan without a transition. + ## + ## + ## +@@ -152,13 +129,12 @@ interface(`clamav_exec_clamscan',` + type clamscan_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, clamscan_exec_t) + ') + +-####################################### ++######################################## + ## +-## Read clamd process state files. ++## Manage clamd pid content. + ## + ## + ## +@@ -166,21 +142,63 @@ interface(`clamav_exec_clamscan',` + ## + ## + # +-interface(`clamav_read_state_clamd',` ++interface(`clamav_manage_clamd_pid',` + gen_require(` +- type clamd_t; ++ type clamd_var_run_t; + ') + +- kernel_search_proc($1) +- allow $1 clamd_t:dir list_dir_perms; +- read_files_pattern($1, clamd_t, clamd_t) +- read_lnk_files_pattern($1, clamd_t, clamd_t) ++ manage_dirs_pattern($1, clamd_var_run_t, clamd_var_run_t) ++ manage_files_pattern($1, clamd_var_run_t, clamd_var_run_t) ++') ++ ++####################################### ++## ++## Read clamd state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`clamav_read_state_clamd',` ++ gen_require(` ++ type clamd_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, clamd_t) ++') ++ ++####################################### ++## ++## Execute clamd server in the clamd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`clamd_systemctl',` ++ gen_require(` ++ type clamd_t; ++ type clamd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 clamd_unit_file_t:file read_file_perms; ++ allow $1 clamd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, clamd_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an clamav environment. ++## All of the rules required to administrate ++## an clamav environment + ## + ## + ## +@@ -189,7 +207,7 @@ interface(`clamav_read_state_clamd',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the clamav domain. + ## + ## + ## +@@ -197,19 +215,36 @@ interface(`clamav_read_state_clamd',` + interface(`clamav_admin',` + gen_require(` + type clamd_t, clamd_etc_t, clamd_tmp_t; +- type clamd_var_log_t, clamd_var_lib_t, clamd_initrc_exec_t; +- type clamd_var_run_t, clamscan_t, clamscan_tmp_t; ++ type clamd_var_log_t, clamd_var_lib_t, clamd_var_run_t; ++ type clamscan_t, clamscan_tmp_t, clamd_initrc_exec_t; + type freshclam_t, freshclam_var_log_t; ++ type clamd_unit_file_t; + ') + +- allow $1 { clamd_t clamscan_t freshclam_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { clamd_t clamscan_t freshclam_t }) ++ allow $1 clamd_t:process signal_perms; ++ ps_process_pattern($1, clamd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 clamd_t:process ptrace; ++ allow $1 clamscan_t:process ptrace; ++ allow $1 freshclam_t:process ptrace; ++ ') ++ ++ allow $1 clamscan_t:process signal_perms; ++ ps_process_pattern($1, clamscan_t) ++ ++ allow $1 freshclam_t:process signal_perms; ++ ps_process_pattern($1, freshclam_t) + + init_labeled_script_domtrans($1, clamd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 clamd_initrc_exec_t system_r; + allow $2 system_r; + ++ clamd_systemctl($1) ++ admin_pattern($1, clamd_unit_file_t) ++ allow $1 clamd_unit_file_t:service all_service_perms; ++ + files_list_etc($1) + admin_pattern($1, clamd_etc_t) + +@@ -217,11 +252,21 @@ interface(`clamav_admin',` + admin_pattern($1, clamd_var_lib_t) + + logging_list_logs($1) +- admin_pattern($1, { clamd_var_log_t freshclam_var_log_t }) ++ admin_pattern($1, clamd_var_log_t) + + files_list_pids($1) + admin_pattern($1, clamd_var_run_t) + + files_list_tmp($1) +- admin_pattern($1, { clamd_tmp_t clamscan_tmp_t }) ++ admin_pattern($1, clamd_tmp_t) ++ ++ admin_pattern($1, clamscan_tmp_t) ++ ++ admin_pattern($1, freshclam_var_log_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++ + ') +diff --git a/clamav.te b/clamav.te +index ce3836acd0..0263671f79 100644 +--- a/clamav.te ++++ b/clamav.te +@@ -38,6 +38,9 @@ files_config_file(clamd_etc_t) + type clamd_initrc_exec_t; + init_script_file(clamd_initrc_exec_t) + ++type clamd_unit_file_t; ++systemd_unit_file(clamd_unit_file_t) ++ + type clamd_tmp_t; + files_tmp_file(clamd_tmp_t) + +@@ -70,9 +73,10 @@ logging_log_file(freshclam_var_log_t) + # Clamd local policy + # + +-allow clamd_t self:capability { kill setgid setuid dac_override }; ++allow clamd_t self:capability { kill setgid setuid dac_read_search dac_override }; + dontaudit clamd_t self:capability sys_tty_config; + allow clamd_t self:process signal; ++ + allow clamd_t self:fifo_file rw_fifo_file_perms; + allow clamd_t self:unix_stream_socket { accept connectto listen }; + allow clamd_t self:tcp_socket { listen accept }; +@@ -107,7 +111,6 @@ kernel_read_system_state(clamd_t) + + corecmd_exec_shell(clamd_t) + +-corenet_all_recvfrom_unlabeled(clamd_t) + corenet_all_recvfrom_netlabel(clamd_t) + corenet_tcp_sendrecv_generic_if(clamd_t) + corenet_tcp_sendrecv_generic_node(clamd_t) +@@ -119,6 +122,7 @@ corenet_tcp_bind_generic_port(clamd_t) + + corenet_sendrecv_generic_client_packets(clamd_t) + corenet_tcp_connect_generic_port(clamd_t) ++corenet_tcp_connect_clamd_port(clamd_t) + + corenet_sendrecv_clamd_server_packets(clamd_t) + corenet_tcp_bind_clamd_port(clamd_t) +@@ -135,18 +139,10 @@ auth_use_nsswitch(clamd_t) + + logging_send_syslog_msg(clamd_t) + +-miscfiles_read_localization(clamd_t) +- +-tunable_policy(`clamd_use_jit',` +- allow clamd_t self:process execmem; +-',` +- dontaudit clamd_t self:process execmem; +-') +- + optional_policy(` + amavis_read_lib_files(clamd_t) + amavis_read_spool_files(clamd_t) +- amavis_spool_filetrans(clamd_t, clamd_var_run_t, sock_file) ++ amavis_spool_filetrans(clamd_t, clamd_var_run_t, { file dir sock_file }) + amavis_create_pid_files(clamd_t) + ') + +@@ -165,12 +161,37 @@ optional_policy(` + mta_send_mail(clamd_t) + ') + ++optional_policy(` ++ spamd_stream_connect(clamd_t) ++ spamassassin_read_pid_files(clamd_t) ++') ++ ++tunable_policy(`clamd_use_jit',` ++ allow clamd_t self:process execmem; ++ allow clamscan_t self:process execmem; ++',` ++ dontaudit clamd_t self:process execmem; ++ dontaudit clamscan_t self:process execmem; ++') ++ ++optional_policy(` ++ antivirus_domain_template(clamd_t) ++') ++ ++optional_policy(` ++ antivirus_domain_template(clamscan_t) ++') ++ ++optional_policy(` ++ antivirus_domain_template(freshclam_t) ++') ++ + ######################################## + # + # Freshclam local policy + # + +-allow freshclam_t self:capability { setgid setuid dac_override }; ++allow freshclam_t self:capability { setgid setuid dac_read_search dac_override }; + allow freshclam_t self:fifo_file rw_fifo_file_perms; + allow freshclam_t self:unix_stream_socket { accept listen }; + allow freshclam_t self:tcp_socket { accept listen }; +@@ -228,7 +249,6 @@ auth_use_nsswitch(freshclam_t) + + logging_send_syslog_msg(freshclam_t) + +-miscfiles_read_localization(freshclam_t) + + tunable_policy(`clamd_use_jit',` + allow freshclam_t self:process execmem; +@@ -240,6 +260,10 @@ optional_policy(` + amavis_manage_spool_files(freshclam_t) + ') + ++optional_policy(` ++ clamd_systemctl(freshclam_t) ++') ++ + optional_policy(` + cron_system_entry(freshclam_t, freshclam_exec_t) + ') +@@ -249,7 +273,7 @@ optional_policy(` + # Clamscam local policy + # + +-allow clamscan_t self:capability { setgid setuid dac_override }; ++allow clamscan_t self:capability { setgid setuid dac_read_search dac_override }; + allow clamscan_t self:fifo_file rw_fifo_file_perms; + allow clamscan_t self:unix_stream_socket create_stream_socket_perms; + allow clamscan_t self:unix_dgram_socket create_socket_perms; +@@ -275,7 +299,6 @@ kernel_dontaudit_list_proc(clamscan_t) + kernel_read_kernel_sysctls(clamscan_t) + kernel_read_system_state(clamscan_t) + +-corenet_all_recvfrom_unlabeled(clamscan_t) + corenet_all_recvfrom_netlabel(clamscan_t) + corenet_tcp_sendrecv_generic_if(clamscan_t) + corenet_tcp_sendrecv_generic_node(clamscan_t) +@@ -286,14 +309,12 @@ corenet_tcp_sendrecv_clamd_port(clamscan_t) + + corecmd_read_all_executables(clamscan_t) + +-files_read_etc_files(clamscan_t) + files_read_etc_runtime_files(clamscan_t) + files_search_var_lib(clamscan_t) + + init_read_utmp(clamscan_t) + init_dontaudit_write_utmp(clamscan_t) + +-miscfiles_read_localization(clamscan_t) + miscfiles_read_public_files(clamscan_t) + + sysnet_dns_name_resolve(clamscan_t) +@@ -309,10 +330,6 @@ tunable_policy(`clamav_read_all_non_security_files_clamscan',` + files_getattr_all_sockets(clamscan_t) + ') + +-optional_policy(` +- amavis_read_spool_files(clamscan_t) +-') +- + optional_policy(` + apache_read_sys_content(clamscan_t) + ') +diff --git a/clockspeed.te b/clockspeed.te +index d3e2a67e53..f5b330c087 100644 +--- a/clockspeed.te ++++ b/clockspeed.te +@@ -29,7 +29,6 @@ allow clockspeed_cli_t self:udp_socket create_socket_perms; + + read_files_pattern(clockspeed_cli_t, clockspeed_var_lib_t, clockspeed_var_lib_t) + +-corenet_all_recvfrom_unlabeled(clockspeed_cli_t) + corenet_all_recvfrom_netlabel(clockspeed_cli_t) + corenet_udp_sendrecv_generic_if(clockspeed_cli_t) + corenet_udp_sendrecv_generic_node(clockspeed_cli_t) +@@ -38,11 +37,9 @@ corenet_sendrecv_ntp_client_packets(clockspeed_cli_t) + corenet_udp_sendrecv_ntp_port(clockspeed_cli_t) + + files_list_var_lib(clockspeed_cli_t) +-files_read_etc_files(clockspeed_cli_t) + +-miscfiles_read_localization(clockspeed_cli_t) + +-userdom_use_user_terminals(clockspeed_cli_t) ++userdom_use_inherited_user_terminals(clockspeed_cli_t) + + ######################################## + # +@@ -57,7 +54,6 @@ allow clockspeed_srv_t self:unix_stream_socket create_socket_perms; + manage_files_pattern(clockspeed_srv_t, clockspeed_var_lib_t, clockspeed_var_lib_t) + manage_fifo_files_pattern(clockspeed_srv_t, clockspeed_var_lib_t, clockspeed_var_lib_t) + +-corenet_all_recvfrom_unlabeled(clockspeed_srv_t) + corenet_all_recvfrom_netlabel(clockspeed_srv_t) + corenet_udp_sendrecv_generic_if(clockspeed_srv_t) + corenet_udp_sendrecv_generic_node(clockspeed_srv_t) +@@ -68,9 +64,7 @@ corenet_udp_bind_clockspeed_port(clockspeed_srv_t) + corenet_udp_sendrecv_clockspeed_port(clockspeed_srv_t) + + files_list_var_lib(clockspeed_srv_t) +-files_read_etc_files(clockspeed_srv_t) + +-miscfiles_read_localization(clockspeed_srv_t) + + optional_policy(` + daemontools_service_domain(clockspeed_srv_t, clockspeed_srv_exec_t) +diff --git a/clogd.te b/clogd.te +index 4a5b3d1a59..cd146bd5a3 100644 +--- a/clogd.te ++++ b/clogd.te +@@ -41,9 +41,6 @@ storage_raw_write_fixed_disk(clogd_t) + + logging_send_syslog_msg(clogd_t) + +-miscfiles_read_localization(clogd_t) +- + optional_policy(` +- aisexec_stream_connect(clogd_t) +- corosync_stream_connect(clogd_t) ++ rhcs_stream_connect_cluster(clogd_t) + ') +diff --git a/cloudform.fc b/cloudform.fc +new file mode 100644 +index 0000000000..3849f134a5 +--- /dev/null ++++ b/cloudform.fc +@@ -0,0 +1,21 @@ ++/etc/rc\.d/init\.d/iwhd -- gen_context(system_u:object_r:iwhd_initrc_exec_t,s0) ++ ++/usr/bin/cloud-init -- gen_context(system_u:object_r:cloud_init_exec_t,s0) ++/usr/libexec/min-metadata-service -- gen_context(system_u:object_r:cloud_init_exec_t,s0) ++/usr/libexec/min-cloud-agent -- gen_context(system_u:object_r:cloud_init_exec_t,s0) ++/usr/bin/deltacloudd -- gen_context(system_u:object_r:deltacloudd_exec_t,s0) ++/usr/bin/iwhd -- gen_context(system_u:object_r:iwhd_exec_t,s0) ++ ++/usr/lib/systemd/system/cloud-config.* -- gen_context(system_u:object_r:cloud_init_unit_file_t,s0) ++ ++/usr/lib/systemd/system/cloud-init.* -- gen_context(system_u:object_r:cloud_init_unit_file_t,s0) ++ ++/var/lib/cloud(/.*)? gen_context(system_u:object_r:cloud_var_lib_t,s0) ++/var/lib/min-cloud-agent(/.*)? gen_context(system_u:object_r:cloud_var_lib_t,s0) ++/var/log/cloud-init.*\.log.* -- gen_context(system_u:object_r:cloud_log_t,s0) ++/var/lib/iwhd(/.*)? gen_context(system_u:object_r:iwhd_var_lib_t,s0) ++ ++/var/log/deltacloud-core(/.*)? gen_context(system_u:object_r:deltacloudd_log_t,s0) ++/var/log/iwhd\.log.* -- gen_context(system_u:object_r:iwhd_log_t,s0) ++ ++/var/run/iwhd\.pid -- gen_context(system_u:object_r:iwhd_var_run_t,s0) +diff --git a/cloudform.if b/cloudform.if +new file mode 100644 +index 0000000000..55fe0d6686 +--- /dev/null ++++ b/cloudform.if +@@ -0,0 +1,116 @@ ++## cloudform policy ++ ++####################################### ++## ++## Creates types and rules for a basic ++## cloudform daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`cloudform_domain_template',` ++ gen_require(` ++ attribute cloudform_domain; ++ ') ++ ++ type $1_t, cloudform_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ kernel_read_system_state($1_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run cloud_init. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cloudform_init_domtrans',` ++ gen_require(` ++ type cloud_init_t, cloud_init_exec_t; ++ ') ++ ++ domtrans_pattern($1, cloud_init_exec_t, cloud_init_t) ++') ++ ++###################################### ++## ++## Execute mongod in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cloudform_exec_mongod',` ++ gen_require(` ++ type mongod_exec_t; ++ ') ++ ++ can_exec($1, mongod_exec_t) ++') ++ ++####################################### ++## ++## Allow read to cloud lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cloudform_read_lib_files',` ++ gen_require(` ++ type cloud_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, cloud_var_lib_t, cloud_var_lib_t) ++') ++ ++####################################### ++## ++## Allow read to cloud lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cloudform_read_lib_lnk_files',` ++ gen_require(` ++ type cloud_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_lnk_files_pattern($1, cloud_var_lib_t, cloud_var_lib_t) ++') ++ ++###################################### ++## ++## Execute mongod in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cloudform_dontaudit_write_cloud_log',` ++ gen_require(` ++ type cloud_log_t; ++ ') ++ ++ dontaudit $1 cloud_log_t:file write_inherited_file_perms; ++') +diff --git a/cloudform.te b/cloudform.te +new file mode 100644 +index 0000000000..44e5777093 +--- /dev/null ++++ b/cloudform.te +@@ -0,0 +1,253 @@ ++policy_module(cloudform, 1.0) ++######################################## ++# ++# Declarations ++# ++ ++attribute cloudform_domain; ++ ++cloudform_domain_template(deltacloudd) ++cloudform_domain_template(iwhd) ++cloudform_domain_template(cloud_init) ++ ++type cloud_init_tmp_t; ++files_tmp_file(cloud_init_tmp_t) ++ ++type cloud_init_unit_file_t; ++systemd_unit_file(cloud_init_unit_file_t) ++ ++type cloud_var_lib_t; ++files_type(cloud_var_lib_t) ++ ++type cloud_log_t; ++logging_log_file(cloud_log_t) ++ ++type deltacloudd_log_t; ++logging_log_file(deltacloudd_log_t) ++ ++type deltacloudd_var_run_t; ++files_pid_file(deltacloudd_var_run_t) ++ ++type deltacloudd_tmp_t; ++files_tmp_file(deltacloudd_tmp_t) ++ ++type iwhd_initrc_exec_t; ++init_script_file(iwhd_initrc_exec_t) ++ ++type iwhd_var_lib_t; ++files_type(iwhd_var_lib_t) ++ ++type iwhd_var_run_t; ++files_pid_file(iwhd_var_run_t) ++ ++type iwhd_log_t; ++logging_log_file(iwhd_log_t) ++ ++######################################## ++# ++# cloudform_domain local policy ++# ++ ++allow cloudform_domain self:fifo_file rw_fifo_file_perms; ++allow cloudform_domain self:tcp_socket create_stream_socket_perms; ++ ++dev_read_rand(cloudform_domain) ++dev_read_urand(cloudform_domain) ++dev_read_sysfs(cloudform_domain) ++ ++auth_read_passwd(cloudform_domain) ++ ++miscfiles_read_certs(cloudform_domain) ++ ++################################# ++# ++# cloud-init local policy ++# ++ ++allow cloud_init_t self:capability { fowner chown fsetid dac_read_search dac_override }; ++ ++allow cloud_init_t self:udp_socket create_socket_perms; ++ ++manage_files_pattern(cloud_init_t, cloud_init_tmp_t, cloud_init_tmp_t) ++manage_dirs_pattern(cloud_init_t, cloud_init_tmp_t, cloud_init_tmp_t) ++files_tmp_filetrans(cloud_init_t, cloud_init_tmp_t, { file dir }) ++ ++manage_dirs_pattern(cloud_init_t, cloud_var_lib_t, cloud_var_lib_t) ++manage_files_pattern(cloud_init_t, cloud_var_lib_t, cloud_var_lib_t) ++manage_lnk_files_pattern(cloud_init_t, cloud_var_lib_t, cloud_var_lib_t) ++ ++manage_files_pattern(cloud_init_t, cloud_log_t, cloud_log_t) ++logging_log_filetrans(cloud_init_t, cloud_log_t, { file }) ++ ++kernel_read_network_state(cloud_init_t) ++ ++corenet_tcp_connect_http_port(cloud_init_t) ++ ++corecmd_exec_bin(cloud_init_t) ++corecmd_exec_shell(cloud_init_t) ++ ++domain_read_all_domains_state(cloud_init_t) ++ ++fs_getattr_all_fs(cloud_init_t) ++ ++storage_raw_read_fixed_disk(cloud_init_t) ++ ++auth_use_nsswitch(cloud_init_t) ++ ++libs_exec_ldconfig(cloud_init_t) ++ ++logging_send_syslog_msg(cloud_init_t) ++ ++miscfiles_read_localization(cloud_init_t) ++ ++selinux_validate_context(cloud_init_t) ++ ++systemd_dbus_chat_hostnamed(cloud_init_t) ++systemd_dbus_chat_timedated(cloud_init_t) ++systemd_exec_systemctl(cloud_init_t) ++systemd_start_all_services(cloud_init_t) ++ ++usermanage_domtrans_passwd(cloud_init_t) ++ ++optional_policy(` ++ certmonger_dbus_chat(cloud_init_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(cloud_init_t) ++') ++ ++optional_policy(` ++ rhsmcertd_dbus_chat(cloud_init_t) ++') ++ ++optional_policy(` ++ networkmanager_dbus_chat(cloud_init_t) ++') ++ ++optional_policy(` ++ dmidecode_domtrans(cloud_init_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(cloud_init_t) ++') ++ ++optional_policy(` ++ iptables_filetrans_named_content(cloud_init_t) ++') ++ ++optional_policy(` ++ hostname_exec(cloud_init_t) ++') ++ ++optional_policy(` ++ mount_domtrans(cloud_init_t) ++') ++ ++optional_policy(` ++ # it check file context and run restorecon ++ seutil_read_file_contexts(cloud_init_t) ++ seutil_domtrans_setfiles(cloud_init_t) ++') ++ ++optional_policy(` ++ ssh_exec_keygen(cloud_init_t) ++ ssh_read_user_home_files(cloud_init_t) ++') ++ ++optional_policy(` ++ sysnet_domtrans_ifconfig(cloud_init_t) ++ sysnet_read_dhcpc_state(cloud_init_t) ++ sysnet_dns_name_resolve(cloud_init_t) ++') ++ ++optional_policy(` ++ rpm_run(cloud_init_t, system_r) ++ rpm_transition_script(cloud_init_t, system_r) ++') ++ ++optional_policy(` ++ unconfined_domain(cloud_init_t) ++') ++ ++######################################## ++# ++# deltacloudd local policy ++# ++ ++allow deltacloudd_t self:capability { dac_read_search dac_override setuid setgid }; ++ ++allow deltacloudd_t self:netlink_route_socket r_netlink_socket_perms; ++allow deltacloudd_t self:udp_socket create_socket_perms; ++ ++allow deltacloudd_t self:process signal; ++ ++allow deltacloudd_t self:fifo_file rw_fifo_file_perms; ++allow deltacloudd_t self:tcp_socket create_stream_socket_perms; ++allow deltacloudd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(deltacloudd_t, deltacloudd_tmp_t, deltacloudd_tmp_t) ++manage_files_pattern(deltacloudd_t, deltacloudd_tmp_t, deltacloudd_tmp_t) ++files_tmp_filetrans(deltacloudd_t, deltacloudd_tmp_t, { file dir }) ++ ++manage_files_pattern(deltacloudd_t, deltacloudd_var_run_t, deltacloudd_var_run_t) ++manage_dirs_pattern(deltacloudd_t, deltacloudd_var_run_t, deltacloudd_var_run_t) ++manage_lnk_files_pattern(deltacloudd_t, deltacloudd_var_run_t, deltacloudd_var_run_t) ++files_pid_filetrans(deltacloudd_t, deltacloudd_var_run_t, { file dir }) ++ ++manage_files_pattern(deltacloudd_t, deltacloudd_log_t, deltacloudd_log_t) ++manage_dirs_pattern(deltacloudd_t, deltacloudd_log_t, deltacloudd_log_t) ++logging_log_filetrans(deltacloudd_t, deltacloudd_log_t, { file dir }) ++ ++kernel_read_kernel_sysctls(deltacloudd_t) ++kernel_read_system_state(deltacloudd_t) ++kernel_read_network_state(deltacloudd_t) ++ ++corecmd_exec_bin(deltacloudd_t) ++ ++corenet_tcp_bind_generic_node(deltacloudd_t) ++corenet_tcp_bind_generic_port(deltacloudd_t) ++corenet_tcp_connect_http_port(deltacloudd_t) ++corenet_tcp_connect_keystone_port(deltacloudd_t) ++ ++auth_use_nsswitch(deltacloudd_t) ++ ++logging_send_syslog_msg(deltacloudd_t) ++ ++optional_policy(` ++ sysnet_read_config(deltacloudd_t) ++') ++ ++######################################## ++# ++# iwhd local policy ++# ++ ++allow iwhd_t self:capability { chown kill }; ++allow iwhd_t self:process { fork }; ++ ++allow iwhd_t self:netlink_route_socket r_netlink_socket_perms; ++allow iwhd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(iwhd_t, iwhd_var_lib_t, iwhd_var_lib_t) ++manage_files_pattern(iwhd_t, iwhd_var_lib_t, iwhd_var_lib_t) ++ ++manage_files_pattern(iwhd_t, iwhd_log_t, iwhd_log_t) ++logging_log_filetrans(iwhd_t, iwhd_log_t, { file }) ++ ++manage_dirs_pattern(iwhd_t, iwhd_var_run_t, iwhd_var_run_t) ++manage_files_pattern(iwhd_t, iwhd_var_run_t, iwhd_var_run_t) ++files_pid_filetrans(iwhd_t, iwhd_var_run_t, { dir file }) ++ ++kernel_read_system_state(iwhd_t) ++ ++corenet_tcp_bind_generic_node(iwhd_t) ++corenet_tcp_bind_websm_port(iwhd_t) ++corenet_tcp_connect_all_ports(iwhd_t) ++ ++dev_read_rand(iwhd_t) ++dev_read_urand(iwhd_t) ++ ++userdom_home_manager(iwhd_t) ++ +diff --git a/cmirrord.if b/cmirrord.if +index cc4e7cb969..f348d27465 100644 +--- a/cmirrord.if ++++ b/cmirrord.if +@@ -73,10 +73,11 @@ interface(`cmirrord_rw_shm',` + type cmirrord_t, cmirrord_tmpfs_t; + ') + +- allow $1 cmirrord_t:shm rw_shm_perms; ++ allow $1 cmirrord_t:shm { rw_shm_perms destroy }; + + allow $1 cmirrord_tmpfs_t:dir list_dir_perms; + rw_files_pattern($1, cmirrord_tmpfs_t, cmirrord_tmpfs_t) ++ delete_files_pattern($1, cmirrord_tmpfs_t, cmirrord_tmpfs_t) + read_lnk_files_pattern($1, cmirrord_tmpfs_t, cmirrord_tmpfs_t) + fs_search_tmpfs($1) + ') +@@ -103,9 +104,13 @@ interface(`cmirrord_admin',` + type cmirrord_t, cmirrord_initrc_exec_t, cmirrord_var_run_t; + ') + +- allow $1 cmirrord_t:process { ptrace signal_perms }; ++ allow $1 cmirrord_t:process signal_perms; + ps_process_pattern($1, cmirrord_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cmirrord_t:process ptrace; ++ ') ++ + cmirrord_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 cmirrord_initrc_exec_t system_r; +diff --git a/cmirrord.te b/cmirrord.te +index bbdd3960ef..28b1761820 100644 +--- a/cmirrord.te ++++ b/cmirrord.te +@@ -23,13 +23,14 @@ files_pid_file(cmirrord_var_run_t) + # Local policy + # + +-allow cmirrord_t self:capability { net_admin kill }; ++allow cmirrord_t self:capability { sys_admin net_admin kill }; + dontaudit cmirrord_t self:capability sys_tty_config; + allow cmirrord_t self:process { setfscreate signal }; + allow cmirrord_t self:fifo_file rw_fifo_file_perms; + allow cmirrord_t self:sem create_sem_perms; + allow cmirrord_t self:shm create_shm_perms; + allow cmirrord_t self:netlink_socket create_socket_perms; ++allow cmirrord_t self:netlink_connector_socket create_socket_perms; + allow cmirrord_t self:unix_stream_socket { accept listen }; + + manage_dirs_pattern(cmirrord_t, cmirrord_tmpfs_t, cmirrord_tmpfs_t) +@@ -42,16 +43,18 @@ files_pid_filetrans(cmirrord_t, cmirrord_var_run_t, file) + domain_use_interactive_fds(cmirrord_t) + domain_obj_id_change_exemption(cmirrord_t) + +-files_read_etc_files(cmirrord_t) +- + storage_create_fixed_disk_dev(cmirrord_t) ++storage_raw_read_fixed_disk(cmirrord_t) ++storage_rw_inherited_fixed_disk_dev(cmirrord_t) + + seutil_read_file_contexts(cmirrord_t) + + logging_send_syslog_msg(cmirrord_t) + +-miscfiles_read_localization(cmirrord_t) +- + optional_policy(` + corosync_stream_connect(cmirrord_t) + ') ++ ++optional_policy(` ++ rhcs_rw_cluster_tmpfs(cmirrord_t) ++') +diff --git a/cobbler.fc b/cobbler.fc +index 973d208ff6..6ce88039ff 100644 +--- a/cobbler.fc ++++ b/cobbler.fc +@@ -4,11 +4,15 @@ + + /usr/bin/cobblerd -- gen_context(system_u:object_r:cobblerd_exec_t,s0) + ++/var/cache/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + ++/var/lib/tftpboot/aarch64(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) ++/var/lib/tftpboot/boot(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/etc(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/grub(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/images(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) ++/var/lib/tftpboot/images2(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/memdisk -- gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/menu\.c32 -- gen_context(system_u:object_r:cobbler_var_lib_t,s0) + /var/lib/tftpboot/ppc(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0) +diff --git a/cobbler.if b/cobbler.if +index c223f81328..8b567c1911 100644 +--- a/cobbler.if ++++ b/cobbler.if +@@ -38,6 +38,28 @@ interface(`cobblerd_initrc_domtrans',` + init_labeled_script_domtrans($1, cobblerd_initrc_exec_t) + ') + ++ ++ ++######################################## ++## ++## Read cobbler configuration dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cobbler_list_config',` ++ gen_require(` ++ type cobbler_etc_t; ++ ') ++ ++ list_dirs_pattern($1, cobbler_etc_t, cobbler_etc_t) ++ files_search_etc($1) ++') ++ ++ + ######################################## + ## + ## Read cobbler configuration files. +@@ -112,6 +134,7 @@ interface(`cobbler_read_lib_files',` + + files_search_var_lib($1) + read_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t) ++ read_lnk_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t) + ') + + ######################################## +@@ -132,6 +155,8 @@ interface(`cobbler_manage_lib_files',` + + files_search_var_lib($1) + manage_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t) ++ manage_lnk_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t) ++ manage_dirs_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t) + ') + + ######################################## +@@ -176,8 +201,8 @@ interface(`cobblerd_admin',` + interface(`cobbler_admin',` + gen_require(` + type cobblerd_t, cobbler_var_lib_t, cobbler_var_log_t; +- type cobbler_etc_t, cobblerd_initrc_exec_t, httpd_cobbler_content_t; +- type httpd_cobbler_content_ra_t, httpd_cobbler_content_rw_t, cobbler_tmp_t; ++ type cobbler_etc_t, cobblerd_initrc_exec_t; ++ type cobbler_tmp_t; + ') + + allow $1 cobblerd_t:process { ptrace signal_perms }; +@@ -199,7 +224,4 @@ interface(`cobbler_admin',` + + logging_search_logs($1) + admin_pattern($1, cobbler_var_log_t) +- +- apache_search_sys_content($1) +- admin_pattern($1, { httpd_cobbler_content_t httpd_cobbler_content_ra_t httpd_cobbler_content_rw_t }) + ') +diff --git a/cobbler.te b/cobbler.te +index 5f306dd442..b6d1c0f703 100644 +--- a/cobbler.te ++++ b/cobbler.te +@@ -62,7 +62,7 @@ files_tmp_file(cobbler_tmp_t) + # Local policy + # + +-allow cobblerd_t self:capability { chown dac_override fowner fsetid sys_nice }; ++allow cobblerd_t self:capability { chown dac_read_search dac_override fowner fsetid sys_nice }; + dontaudit cobblerd_t self:capability sys_tty_config; + allow cobblerd_t self:process { getsched setsched signal }; + allow cobblerd_t self:fifo_file rw_fifo_file_perms; +@@ -81,6 +81,7 @@ manage_dirs_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t) + manage_files_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t) + manage_lnk_files_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t) + files_var_lib_filetrans(cobblerd_t, cobbler_var_lib_t, dir) ++files_var_filetrans(cobblerd_t, cobbler_var_lib_t, dir, "cobbler") + + append_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t) + create_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t) +@@ -89,7 +90,7 @@ setattr_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t) + logging_log_filetrans(cobblerd_t, cobbler_var_log_t, file) + + kernel_read_system_state(cobblerd_t) +-kernel_dontaudit_search_network_state(cobblerd_t) ++kernel_read_network_state(cobblerd_t) + + corecmd_exec_bin(cobblerd_t) + corecmd_exec_shell(cobblerd_t) +@@ -112,14 +113,13 @@ corenet_tcp_sendrecv_http_port(cobblerd_t) + corenet_tcp_connect_http_port(cobblerd_t) + corenet_sendrecv_http_client_packets(cobblerd_t) + ++dev_read_sysfs(cobblerd_t) + dev_read_urand(cobblerd_t) + + files_list_boot(cobblerd_t) + files_list_tmp(cobblerd_t) + files_read_boot_files(cobblerd_t) +-files_read_etc_files(cobblerd_t) + files_read_etc_runtime_files(cobblerd_t) +-files_read_usr_files(cobblerd_t) + + fs_getattr_all_fs(cobblerd_t) + fs_read_iso9660_files(cobblerd_t) +@@ -128,6 +128,8 @@ selinux_get_enforce_mode(cobblerd_t) + + term_use_console(cobblerd_t) + ++auth_use_nsswitch(cobblerd_t) ++ + logging_send_syslog_msg(cobblerd_t) + + miscfiles_read_localization(cobblerd_t) +@@ -160,6 +162,7 @@ tunable_policy(`cobbler_use_nfs',` + ') + + optional_policy(` ++ apache_domtrans(cobblerd_t) + apache_search_sys_content(cobblerd_t) + ') + +@@ -170,6 +173,7 @@ optional_policy(` + bind_domtrans(cobblerd_t) + bind_initrc_domtrans(cobblerd_t) + bind_manage_zone(cobblerd_t) ++ bind_systemctl(cobblerd_t) + ') + + optional_policy(` +@@ -179,12 +183,22 @@ optional_policy(` + optional_policy(` + dhcpd_domtrans(cobblerd_t) + dhcpd_initrc_domtrans(cobblerd_t) ++ dhcpd_systemctl(cobblerd_t) + ') + + optional_policy(` + dnsmasq_domtrans(cobblerd_t) + dnsmasq_initrc_domtrans(cobblerd_t) + dnsmasq_write_config(cobblerd_t) ++ dnsmasq_systemctl(cobblerd_t) ++') ++ ++optional_policy(` ++ libs_exec_ldconfig(cobblerd_t) ++') ++ ++optional_policy(` ++ mysql_stream_connect(cobblerd_t) + ') + + optional_policy(` +@@ -192,13 +206,13 @@ optional_policy(` + ') + + optional_policy(` ++ rsync_exec(cobblerd_t) + rsync_read_config(cobblerd_t) +- rsync_manage_config_files(cobblerd_t) ++ rsync_manage_config(cobblerd_t) + rsync_etc_filetrans_config(cobblerd_t, file, "rsync.conf") + ') + + optional_policy(` +- tftp_manage_config_files(cobblerd_t) +- tftp_etc_filetrans_config(cobblerd_t, file, "tftp") ++ tftp_manage_config(cobblerd_t) + tftp_filetrans_tftpdir(cobblerd_t, cobbler_var_lib_t, { dir file }) + ') +diff --git a/cockpit.fc b/cockpit.fc +new file mode 100644 +index 0000000000..bf801737de +--- /dev/null ++++ b/cockpit.fc +@@ -0,0 +1,13 @@ ++# cockpit stuff ++ ++/usr/lib/systemd/system/cockpit.* -- gen_context(system_u:object_r:cockpit_unit_file_t,s0) ++/etc/systemd/system/cockpit.* -- gen_context(system_u:object_r:cockpit_unit_file_t,s0) ++ ++/usr/libexec/cockpit-ws -- gen_context(system_u:object_r:cockpit_ws_exec_t,s0) ++ ++/usr/libexec/cockpit-session -- gen_context(system_u:object_r:cockpit_session_exec_t,s0) ++/usr/libexec/cockpit-ssh -- gen_context(system_u:object_r:cockpit_session_exec_t,s0) ++ ++/var/lib/cockpit(/.*)? gen_context(system_u:object_r:cockpit_var_lib_t,s0) ++ ++/var/run/cockpit-ws(/.*)? gen_context(system_u:object_r:cockpit_var_run_t,s0) +diff --git a/cockpit.if b/cockpit.if +new file mode 100644 +index 0000000000..d5920c061c +--- /dev/null ++++ b/cockpit.if +@@ -0,0 +1,188 @@ ++## policy for cockpit ++ ++######################################## ++## ++## Execute TEMPLATE in the cockpit domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cockpit_ws_domtrans',` ++ gen_require(` ++ type cockpit_ws_t, cockpit_ws_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, cockpit_ws_exec_t, cockpit_ws_t) ++') ++ ++######################################## ++## ++## Execute TEMPLATE in the cockpit domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cockpit_session_domtrans',` ++ gen_require(` ++ type cockpit_session_t, cockpit_session_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, cockpit_session_exec_t, cockpit_session_t) ++') ++ ++######################################## ++## ++## Search cockpit lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cockpit_search_lib',` ++ gen_require(` ++ type cockpit_var_lib_t; ++ ') ++ ++ allow $1 cockpit_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read cockpit lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cockpit_read_lib_files',` ++ gen_require(` ++ type cockpit_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, cockpit_var_lib_t, cockpit_var_lib_t) ++') ++ ++######################################## ++## ++## Manage cockpit lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cockpit_manage_lib_files',` ++ gen_require(` ++ type cockpit_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, cockpit_var_lib_t, cockpit_var_lib_t) ++') ++ ++######################################## ++## ++## Manage cockpit lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cockpit_manage_lib_dirs',` ++ gen_require(` ++ type cockpit_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, cockpit_var_lib_t, cockpit_var_lib_t) ++') ++ ++######################################## ++## ++## Execute cockpit server in the cockpit domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cockpit_systemctl',` ++ gen_require(` ++ type cockpit_ws_t; ++ type cockpit_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 cockpit_unit_file_t:file read_file_perms; ++ allow $1 cockpit_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, cockpit_ws_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an cockpit environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`cockpit_admin',` ++ gen_require(` ++ type cockpit_ws_t; ++ type cockpit_session_t; ++ type cockpit_var_lib_t; ++ type cockpit_var_run_t; ++ type cockpit_unit_file_t; ++ ') ++ ++ allow $1 cockpit_ws_t:process { signal_perms }; ++ ps_process_pattern($1, cockpit_ws_t) ++ ++ allow $1 cockpit_session_t:process { signal_perms }; ++ ps_process_pattern($1, cockpit_session_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cockpit_ws_t:process ptrace; ++ allow $1 cockpit_session_t:process ptrace; ++ ') ++ ++ files_search_var_lib($1) ++ admin_pattern($1, cockpit_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, cockpit_var_run_t) ++ ++ cockpit_systemctl($1) ++ admin_pattern($1, cockpit_unit_file_t) ++ allow $1 cockpit_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/cockpit.te b/cockpit.te +new file mode 100644 +index 0000000000..6b84d6f0f4 +--- /dev/null ++++ b/cockpit.te +@@ -0,0 +1,123 @@ ++policy_module(cockpit, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type cockpit_ws_t; ++type cockpit_ws_exec_t; ++init_daemon_domain(cockpit_ws_t,cockpit_ws_exec_t) ++ ++type cockpit_tmp_t; ++files_tmp_file(cockpit_tmp_t) ++ ++type cockpit_var_run_t; ++files_pid_file(cockpit_var_run_t) ++ ++type cockpit_unit_file_t; ++systemd_unit_file(cockpit_unit_file_t) ++ ++type cockpit_var_lib_t; ++files_type(cockpit_var_lib_t) ++ ++type cockpit_session_t; ++type cockpit_session_exec_t; ++domain_type(cockpit_session_t) ++domain_entry_file(cockpit_session_t,cockpit_session_exec_t) ++ ++######################################## ++# ++# cockpit_ws_t local policy ++# ++ ++allow cockpit_ws_t self:capability net_admin; ++allow cockpit_ws_t self:tcp_socket create_stream_socket_perms; ++ ++# cockpit-ws can execute cockpit-session ++can_exec(cockpit_ws_t,cockpit_session_exec_t) ++ ++# cockpit-ws can read from /dev/urandom ++dev_read_urand(cockpit_ws_t) # for authkey ++dev_read_rand(cockpit_ws_t) # for libssh ++ ++corenet_tcp_bind_websm_port(cockpit_ws_t) ++ ++# cockpit-ws can connect to other hosts via ssh ++corenet_tcp_connect_ssh_port(cockpit_ws_t) ++ ++# cockpit-ws can write to its temp files ++manage_dirs_pattern(cockpit_ws_t, cockpit_tmp_t, cockpit_tmp_t) ++manage_files_pattern(cockpit_ws_t, cockpit_tmp_t, cockpit_tmp_t) ++files_tmp_filetrans(cockpit_ws_t, cockpit_tmp_t, { dir file }) ++ ++manage_dirs_pattern(cockpit_ws_t, cockpit_var_run_t, cockpit_var_run_t) ++manage_files_pattern(cockpit_ws_t, cockpit_var_run_t, cockpit_var_run_t) ++manage_lnk_files_pattern(cockpit_ws_t, cockpit_var_run_t, cockpit_var_run_t) ++manage_sock_files_pattern(cockpit_ws_t, cockpit_var_run_t, cockpit_var_run_t) ++files_pid_filetrans(cockpit_ws_t, cockpit_var_run_t, { file dir sock_file }) ++ ++read_files_pattern(cockpit_ws_t, cockpit_var_lib_t, cockpit_var_lib_t) ++list_dirs_pattern(cockpit_ws_t, cockpit_var_lib_t, cockpit_var_lib_t) ++ ++auth_use_nsswitch(cockpit_ws_t) ++ ++files_mmap_usr_files(cockpit_ws_t) ++ ++init_stream_connect(cockpit_ws_t) ++ ++logging_send_syslog_msg(cockpit_ws_t) ++ ++# cockpit-ws launches cockpit-session ++cockpit_session_domtrans(cockpit_ws_t) ++allow cockpit_ws_t cockpit_session_t:process signal_perms; ++ ++# cockpit-session communicates back with cockpit-ws ++allow cockpit_session_t cockpit_ws_t:unix_stream_socket rw_stream_socket_perms; ++ ++optional_policy(` ++ kerberos_use(cockpit_ws_t) ++ kerberos_etc_filetrans_keytab(cockpit_ws_t) ++') ++ ++optional_policy(` ++ ssh_read_user_home_files(cockpit_ws_t) ++') ++ ++######################################################### ++# ++# cockpit-session local policy ++# ++ ++# cockpit-session changes to the actual logged in user ++allow cockpit_session_t self:capability { sys_admin dac_read_search dac_override setuid setgid sys_resource }; ++allow cockpit_session_t self:process { setexec setsched signal_perms setrlimit }; ++ ++read_files_pattern(cockpit_session_t, cockpit_var_lib_t, cockpit_var_lib_t) ++list_dirs_pattern(cockpit_session_t, cockpit_var_lib_t, cockpit_var_lib_t) ++ ++manage_dirs_pattern(cockpit_session_t, cockpit_tmp_t, cockpit_tmp_t) ++manage_files_pattern(cockpit_session_t, cockpit_tmp_t, cockpit_tmp_t) ++files_tmp_filetrans(cockpit_session_t, cockpit_tmp_t, { dir file }) ++ ++# cockpit-session runs a full pam stack, including pam_selinux.so ++auth_login_pgm_domain(cockpit_session_t) ++# cockpit-session resseting expired passwords ++auth_manage_passwd(cockpit_session_t) ++auth_manage_shadow(cockpit_session_t) ++auth_write_login_records(cockpit_session_t) ++ ++corenet_tcp_bind_ssh_port(cockpit_session_t) ++corenet_tcp_connect_ssh_port(cockpit_session_t) ++ ++# cockpit-session can execute cockpit-agent as the user ++userdom_spec_domtrans_all_users(cockpit_session_t) ++usermanage_read_crack_db(cockpit_session_t) ++ ++optional_policy(` ++ userdom_signal_all_users(cockpit_session_t) ++') ++ ++optional_policy(` ++ unconfined_domtrans(cockpit_session_t) ++') +diff --git a/collectd.fc b/collectd.fc +index 79a3abe3ab..bc83ff9381 100644 +--- a/collectd.fc ++++ b/collectd.fc +@@ -1,9 +1,16 @@ + /etc/rc\.d/init\.d/collectd -- gen_context(system_u:object_r:collectd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/collectd.* -- gen_context(system_u:object_r:collectd_unit_file_t,s0) ++ + /usr/sbin/collectd -- gen_context(system_u:object_r:collectd_exec_t,s0) + + /var/lib/collectd(/.*)? gen_context(system_u:object_r:collectd_var_lib_t,s0) + ++/var/log/collectd(/.*)? gen_context(system_u:object_r:collectd_log_t,s0) ++/var/log/collectd.log -- gen_context(system_u:object_r:collectd_log_t,s0) ++/var/log/collectd.json.log -- gen_context(system_u:object_r:collectd_log_t,s0) ++ + /var/run/collectd\.pid -- gen_context(system_u:object_r:collectd_var_run_t,s0) ++/var/run/collectd-unixsock -s gen_context(system_u:object_r:collectd_var_run_t,s0) + +-/usr/share/collectd/collection3/bin/.*\.cgi -- gen_context(system_u:object_r:httpd_collectd_script_exec_t,s0) ++/usr/share/collectd/collection3/bin/.*\.cgi -- gen_context(system_u:object_r:collectd_script_exec_t,s0) +diff --git a/collectd.if b/collectd.if +index 954309e644..c4f158fd07 100644 +--- a/collectd.if ++++ b/collectd.if +@@ -2,8 +2,165 @@ + + ######################################## + ## +-## All of the rules required to +-## administrate an collectd environment. ++## Transition to collectd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`collectd_domtrans',` ++ gen_require(` ++ type collectd_t, collectd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, collectd_exec_t, collectd_t) ++') ++ ++######################################## ++## ++## Execute collectd server in the collectd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_initrc_domtrans',` ++ gen_require(` ++ type collectd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, collectd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Search collectd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_search_lib',` ++ gen_require(` ++ type collectd_var_lib_t; ++ ') ++ ++ allow $1 collectd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read collectd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_read_lib_files',` ++ gen_require(` ++ type collectd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, collectd_var_lib_t, collectd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage collectd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_manage_lib_files',` ++ gen_require(` ++ type collectd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, collectd_var_lib_t, collectd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage collectd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_manage_lib_dirs',` ++ gen_require(` ++ type collectd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, collectd_var_lib_t, collectd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage collectd httpd rw content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`collectd_manage_rw_content',` ++ gen_require(` ++ type collectd_rw_content_t; ++ ') ++ ++ manage_dirs_pattern($1, collectd_rw_content_t, collectd_rw_content_t) ++ manage_files_pattern($1, collectd_rw_content_t, collectd_rw_content_t) ++ manage_lnk_files_pattern($1, collectd_rw_content_t, collectd_rw_content_t) ++') ++ ++######################################## ++## ++## Execute collectd server in the collectd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`collectd_systemctl',` ++ gen_require(` ++ type collectd_t; ++ type collectd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 collectd_unit_file_t:file read_file_perms; ++ allow $1 collectd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, collectd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an collectd environment + ## + ## + ## +@@ -20,13 +177,17 @@ + interface(`collectd_admin',` + gen_require(` + type collectd_t, collectd_initrc_exec_t, collectd_var_run_t; +- type collectd_var_lib_t; ++ type collectd_var_lib_t, collectd_unit_file_t; + ') + +- allow $1 collectd_t:process { ptrace signal_perms }; ++ allow $1 collectd_t:process signal_perms; + ps_process_pattern($1, collectd_t) + +- init_labeled_script_domtrans($1, collectd_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 collectd_t:process ptrace; ++ ') ++ ++ collectd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 collectd_initrc_exec_t system_r; + allow $2 system_r; +@@ -36,4 +197,9 @@ interface(`collectd_admin',` + + files_search_var_lib($1) + admin_pattern($1, collectd_var_lib_t) ++ ++ collectd_systemctl($1) ++ admin_pattern($1, collectd_unit_file_t) ++ allow $1 collectd_unit_file_t:service all_service_perms; + ') ++ +diff --git a/collectd.te b/collectd.te +index 6471fa8c42..73e2839bee 100644 +--- a/collectd.te ++++ b/collectd.te +@@ -20,49 +20,72 @@ init_daemon_domain(collectd_t, collectd_exec_t) + type collectd_initrc_exec_t; + init_script_file(collectd_initrc_exec_t) + ++type collectd_log_t; ++logging_log_file(collectd_log_t) ++ + type collectd_var_lib_t; + files_type(collectd_var_lib_t) + + type collectd_var_run_t; + files_pid_file(collectd_var_run_t) + ++type collectd_unit_file_t; ++systemd_unit_file(collectd_unit_file_t) ++ + apache_content_template(collectd) ++apache_content_alias_template(collectd, collectd) ++ ++type collectd_script_tmp_t alias httpd_collectd_script_tmp_t; ++files_tmp_file(collectd_script_tmp_t) + + ######################################## + # + # Local policy + # + +-allow collectd_t self:capability { ipc_lock sys_nice }; ++allow collectd_t self:capability { ipc_lock net_raw net_admin sys_nice sys_ptrace dac_read_search dac_override setuid setgid }; + allow collectd_t self:process { getsched setsched signal }; + allow collectd_t self:fifo_file rw_fifo_file_perms; + allow collectd_t self:packet_socket create_socket_perms; +-allow collectd_t self:unix_stream_socket { accept listen }; ++allow collectd_t self:unix_stream_socket { accept listen connectto }; ++allow collectd_t self:netlink_tcpdiag_socket create_netlink_socket_perms; ++allow collectd_t self:udp_socket create_socket_perms; ++allow collectd_t self:rawip_socket create_socket_perms; ++ ++manage_dirs_pattern(collectd_t, collectd_log_t, collectd_log_t) ++manage_files_pattern(collectd_t, collectd_log_t, collectd_log_t) ++logging_log_filetrans(collectd_t, collectd_log_t, { dir file }) + + manage_dirs_pattern(collectd_t, collectd_var_lib_t, collectd_var_lib_t) + manage_files_pattern(collectd_t, collectd_var_lib_t, collectd_var_lib_t) + files_var_lib_filetrans(collectd_t, collectd_var_lib_t, dir) + + manage_files_pattern(collectd_t, collectd_var_run_t, collectd_var_run_t) +-files_pid_filetrans(collectd_t, collectd_var_run_t, file) ++manage_sock_files_pattern(collectd_t, collectd_var_run_t, collectd_var_run_t) ++files_pid_filetrans(collectd_t, collectd_var_run_t, { file sock_file }) + +-domain_use_interactive_fds(collectd_t) ++kernel_read_all_sysctls(collectd_t) ++kernel_read_all_proc(collectd_t) ++kernel_list_all_proc(collectd_t) ++ ++auth_use_nsswitch(collectd_t) + +-kernel_read_network_state(collectd_t) +-kernel_read_net_sysctls(collectd_t) +-kernel_read_system_state(collectd_t) ++corenet_udp_bind_generic_node(collectd_t) ++corenet_udp_bind_collectd_port(collectd_t) + + dev_read_rand(collectd_t) + dev_read_sysfs(collectd_t) + dev_read_urand(collectd_t) + ++domain_use_interactive_fds(collectd_t) ++domain_read_all_domains_state(collectd_t) ++ + files_getattr_all_dirs(collectd_t) +-files_read_etc_files(collectd_t) +-files_read_usr_files(collectd_t) + + fs_getattr_all_fs(collectd_t) ++fs_getattr_all_dirs(collectd_t) + +-miscfiles_read_localization(collectd_t) ++init_read_utmp(collectd_t) + + logging_send_syslog_msg(collectd_t) + +@@ -74,17 +97,40 @@ tunable_policy(`collectd_tcp_network_connect',` + corenet_tcp_sendrecv_all_ports(collectd_t) + ') + ++optional_policy(` ++ mysql_stream_connect(collectd_t) ++') ++ ++optional_policy(` ++ netutils_domtrans_ping(collectd_t) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(collectd_t) ++') ++ ++optional_policy(` ++ snmp_read_snmp_var_lib_dirs(collectd_t) ++') ++ + optional_policy(` + virt_read_config(collectd_t) ++ virt_stream_connect(collectd_t) + ') + + ######################################## + # +-# Web local policy ++# Web collectd local policy + # + +-optional_policy(` +- read_files_pattern(httpd_collectd_script_t, collectd_var_lib_t, collectd_var_lib_t) +- list_dirs_pattern(httpd_collectd_script_t, collectd_var_lib_t, collectd_var_lib_t) +- miscfiles_setattr_fonts_cache_dirs(httpd_collectd_script_t) +-') ++ ++files_search_var_lib(collectd_script_t) ++read_files_pattern(collectd_script_t, collectd_var_lib_t, collectd_var_lib_t) ++list_dirs_pattern(collectd_script_t, collectd_var_lib_t, collectd_var_lib_t) ++miscfiles_setattr_fonts_cache_dirs(collectd_script_t) ++ ++manage_dirs_pattern(collectd_script_t, collectd_script_tmp_t, collectd_script_tmp_t) ++manage_files_pattern(collectd_script_t, collectd_script_tmp_t, collectd_script_tmp_t) ++files_tmp_filetrans(collectd_script_t, collectd_script_tmp_t, { file dir }) ++ ++auth_read_passwd(collectd_script_t) +diff --git a/colord.fc b/colord.fc +index 71639eb543..08ab891711 100644 +--- a/colord.fc ++++ b/colord.fc +@@ -7,5 +7,7 @@ + /usr/libexec/colord -- gen_context(system_u:object_r:colord_exec_t,s0) + /usr/libexec/colord-sane -- gen_context(system_u:object_r:colord_exec_t,s0) + ++/usr/lib/systemd/system/colord.* -- gen_context(system_u:object_r:colord_unit_file_t,s0) ++ + /var/lib/color(/.*)? gen_context(system_u:object_r:colord_var_lib_t,s0) + /var/lib/colord(/.*)? gen_context(system_u:object_r:colord_var_lib_t,s0) +diff --git a/colord.if b/colord.if +index 8e27a37c1b..c69be28b92 100644 +--- a/colord.if ++++ b/colord.if +@@ -1,4 +1,4 @@ +-## GNOME color manager. ++## GNOME color manager + + ######################################## + ## +@@ -15,7 +15,6 @@ interface(`colord_domtrans',` + type colord_t, colord_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, colord_exec_t, colord_t) + ') + +@@ -38,6 +37,7 @@ interface(`colord_dbus_chat',` + + allow $1 colord_t:dbus send_msg; + allow colord_t $1:dbus send_msg; ++ ps_process_pattern(colord_t, $1) + ') + + ###################################### +@@ -58,3 +58,27 @@ interface(`colord_read_lib_files',` + files_search_var_lib($1) + read_files_pattern($1, colord_var_lib_t, colord_var_lib_t) + ') ++ ++######################################## ++## ++## Execute colord server in the colord domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`colord_systemctl',` ++ gen_require(` ++ type colord_t; ++ type colord_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 colord_unit_file_t:file read_file_perms; ++ allow $1 colord_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, colord_t) ++') +diff --git a/colord.te b/colord.te +index 9f2dfb2330..ad8ae42281 100644 +--- a/colord.te ++++ b/colord.te +@@ -8,6 +8,7 @@ policy_module(colord, 1.1.0) + type colord_t; + type colord_exec_t; + dbus_system_domain(colord_t, colord_exec_t) ++init_daemon_domain(colord_t, colord_exec_t) + + type colord_tmp_t; + files_tmp_file(colord_tmp_t) +@@ -18,6 +19,9 @@ files_tmpfs_file(colord_tmpfs_t) + type colord_var_lib_t; + files_type(colord_var_lib_t) + ++type colord_unit_file_t; ++systemd_unit_file(colord_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -26,10 +30,13 @@ files_type(colord_var_lib_t) + allow colord_t self:capability { dac_read_search dac_override }; + dontaudit colord_t self:capability sys_admin; + allow colord_t self:process signal; ++ + allow colord_t self:fifo_file rw_fifo_file_perms; + allow colord_t self:netlink_kobject_uevent_socket create_socket_perms; +-allow colord_t self:tcp_socket { accept listen }; ++allow colord_t self:tcp_socket create_stream_socket_perms; + allow colord_t self:shm create_shm_perms; ++allow colord_t self:udp_socket create_socket_perms; ++allow colord_t self:unix_dgram_socket create_socket_perms; + + manage_dirs_pattern(colord_t, colord_tmp_t, colord_tmp_t) + manage_files_pattern(colord_t, colord_tmp_t, colord_tmp_t) +@@ -74,22 +81,21 @@ dev_read_video_dev(colord_t) + dev_write_video_dev(colord_t) + dev_rw_printer(colord_t) + dev_read_rand(colord_t) +-dev_read_sysfs(colord_t) + dev_read_urand(colord_t) +-dev_list_sysfs(colord_t) ++dev_read_sysfs(colord_t) + dev_rw_generic_usb_dev(colord_t) + + domain_use_interactive_fds(colord_t) + + files_list_mnt(colord_t) +-files_read_usr_files(colord_t) + +-fs_getattr_noxattr_fs(colord_t) +-fs_getattr_tmpfs(colord_t) ++fs_getattr_all_fs(colord_t) + fs_list_noxattr_fs(colord_t) + fs_read_noxattr_fs_files(colord_t) + fs_search_all(colord_t) + fs_dontaudit_getattr_all_fs(colord_t) ++fs_getattr_tmpfs(colord_t) ++fs_read_cgroup_files(colord_t) + + storage_getattr_fixed_disk_dev(colord_t) + storage_getattr_removable_dev(colord_t) +@@ -100,19 +106,17 @@ init_read_state(colord_t) + + auth_use_nsswitch(colord_t) + ++init_read_state(colord_t) ++ + logging_send_syslog_msg(colord_t) + +-miscfiles_read_localization(colord_t) ++systemd_read_logind_sessions_files(colord_t) ++systemd_hwdb_manage_config(colord_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_getattr_nfs(colord_t) +- fs_read_nfs_files(colord_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_getattr_cifs(colord_t) +- fs_read_cifs_files(colord_t) +-') ++userdom_rw_user_tmp_files(colord_t) ++userdom_home_reader(colord_t) ++userdom_list_user_home_content(colord_t) ++userdom_read_inherited_user_home_content_files(colord_t) + + optional_policy(` + cups_read_config(colord_t) +@@ -120,6 +124,13 @@ optional_policy(` + cups_read_state(colord_t) + cups_stream_connect(colord_t) + cups_dbus_chat(colord_t) ++ cups_read_state(colord_t) ++') ++ ++optional_policy(` ++ gnome_read_home_icc_data_content(colord_t) ++ # Fixes lots of breakage in F16 on upgrade ++ gnome_read_generic_data_home_files(colord_t) + ') + + optional_policy(` +@@ -137,3 +148,17 @@ optional_policy(` + udev_read_db(colord_t) + udev_read_pid_files(colord_t) + ') ++ ++optional_policy(` ++ xserver_dbus_chat_xdm(colord_t) ++ xserver_read_xdm_state(colord_t) ++ # /var/lib/gdm/.local/share/icc/edid-0a027915105823af34f99b1704e80336.icc ++ xserver_read_inherited_xdm_lib_files(colord_t) ++ # allow to read /run/initial-setup-$username ++ xserver_read_xdm_pid(colord_t) ++ xserver_map_xdm_pid(colord_t) ++') ++ ++optional_policy(` ++ zoneminder_rw_tmpfs_files(colord_t) ++') +diff --git a/comsat.te b/comsat.te +index c63cf8556e..dc6998b60d 100644 +--- a/comsat.te ++++ b/comsat.te +@@ -37,6 +37,13 @@ kernel_read_kernel_sysctls(comsat_t) + kernel_read_network_state(comsat_t) + kernel_read_system_state(comsat_t) + ++corenet_all_recvfrom_netlabel(comsat_t) ++corenet_tcp_sendrecv_generic_if(comsat_t) ++corenet_udp_sendrecv_generic_if(comsat_t) ++corenet_tcp_sendrecv_generic_node(comsat_t) ++corenet_udp_sendrecv_generic_node(comsat_t) ++corenet_udp_sendrecv_all_ports(comsat_t) ++ + dev_read_urand(comsat_t) + + fs_getattr_xattr_fs(comsat_t) +@@ -52,8 +59,6 @@ init_dontaudit_write_utmp(comsat_t) + + logging_send_syslog_msg(comsat_t) + +-miscfiles_read_localization(comsat_t) +- + userdom_dontaudit_getattr_user_ttys(comsat_t) + + mta_getattr_spool(comsat_t) +diff --git a/condor.fc b/condor.fc +index ad2b69606a..28d1af0202 100644 +--- a/condor.fc ++++ b/condor.fc +@@ -1,6 +1,7 @@ + /etc/condor(/.*)? gen_context(system_u:object_r:condor_conf_t,s0) + + /etc/rc\.d/init\.d/condor -- gen_context(system_u:object_r:condor_initrc_exec_t,s0) ++/usr/lib/systemd/system/condor.* -- gen_context(system_u:object_r:condor_unit_file_t,s0) + + /usr/sbin/condor_collector -- gen_context(system_u:object_r:condor_collector_exec_t,s0) + /usr/sbin/condor_master -- gen_context(system_u:object_r:condor_master_exec_t,s0) +diff --git a/condor.if b/condor.if +index 881d92f35e..a2d588a51c 100644 +--- a/condor.if ++++ b/condor.if +@@ -1,75 +1,391 @@ +-## High-Throughput Computing System. ++ ++## policy for condor ++ ++##################################### ++## ++## Creates types and rules for a basic ++## condor init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`condor_domain_template',` ++ gen_require(` ++ type condor_master_t; ++ attribute condor_domain; ++ ') ++ ++ ############################# ++ # ++ # Declarations ++ # ++ ++ type condor_$1_t, condor_domain; ++ type condor_$1_exec_t; ++ init_daemon_domain(condor_$1_t, condor_$1_exec_t) ++ role system_r types condor_$1_t; ++ ++ domtrans_pattern(condor_master_t, condor_$1_exec_t, condor_$1_t) ++ allow condor_master_t condor_$1_exec_t:file ioctl; ++ ++ kernel_read_system_state(condor_$1_t) ++ ++ corenet_all_recvfrom_netlabel(condor_$1_t) ++ corenet_all_recvfrom_unlabeled(condor_$1_t) ++ ++ auth_use_nsswitch(condor_$1_t) ++ ++ logging_send_syslog_msg(condor_$1_t) ++') ++ ++######################################## ++## ++## Transition to condor. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`condor_domtrans_master',` ++ gen_require(` ++ type condor_master_t, condor_master_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, condor_master_exec_t, condor_master_t) ++') ++ ++####################################### ++## ++## Allows to start userland processes ++## by transitioning to the specified domain, ++## with a range transition. ++## ++## ++## ++## The process type entered by condor_startd. ++## ++## ++## ++## ++## The executable type for the entrypoint. ++## ++## ++## ++## ++## Range for the domain. ++## ++## ++# ++interface(`condor_startd_ranged_domtrans_to',` ++ gen_require(` ++ type sshd_t; ++ ') ++ condor_startd_domtrans_to($1, $2) ++ ++ ++ ifdef(`enable_mcs',` ++ range_transition condor_startd_t $2:process $3; ++ ') ++ ++') + + ####################################### + ## +-## The template to define a condor domain. ++## Allows to start userlandprocesses ++## by transitioning to the specified domain. + ## +-## ++## ++## ++## The process type entered by condor_startd. ++## ++## ++## ++## ++## The executable type for the entrypoint. ++## ++## ++# ++interface(`condor_startd_domtrans_to',` ++ gen_require(` ++ type condor_startd_t; ++ ') ++ ++ domtrans_pattern(condor_startd_t, $2, $1) ++') ++ ++######################################## ++## ++## Read condor's log files. ++## ++## + ## +-## Domain prefix to be used. ++## Domain allowed access. + ## + ## ++## + # +-template(`condor_domain_template',` ++interface(`condor_read_log',` + gen_require(` +- attribute condor_domain; +- type condor_master_t; ++ type condor_log_t; + ') + +- ############################# +- # +- # Declarations +- # ++ logging_search_logs($1) ++ read_files_pattern($1, condor_log_t, condor_log_t) ++') + +- type condor_$1_t, condor_domain; +- type condor_$1_exec_t; +- domain_type(condor_$1_t) +- domain_entry_file(condor_$1_t, condor_$1_exec_t) +- role system_r types condor_$1_t; ++######################################## ++## ++## Append to condor log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_append_log',` ++ gen_require(` ++ type condor_log_t; ++ ') + +- ############################# +- # +- # Policy +- # ++ logging_search_logs($1) ++ append_files_pattern($1, condor_log_t, condor_log_t) ++') + +- domtrans_pattern(condor_master_t, condor_$1_exec_t, condor_$1_t) +- allow condor_master_t condor_$1_exec_t:file ioctl; ++######################################## ++## ++## Manage condor log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_manage_log',` ++ gen_require(` ++ type condor_log_t; ++ ') + +- auth_use_nsswitch(condor_$1_t) ++ logging_search_logs($1) ++ manage_dirs_pattern($1, condor_log_t, condor_log_t) ++ manage_files_pattern($1, condor_log_t, condor_log_t) ++ manage_lnk_files_pattern($1, condor_log_t, condor_log_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an condor environment. ++## Search condor lib directories. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`condor_search_lib',` ++ gen_require(` ++ type condor_var_lib_t; ++ ') ++ ++ allow $1 condor_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read condor lib files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`condor_admin',` ++interface(`condor_read_lib_files',` ++ gen_require(` ++ type condor_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, condor_var_lib_t, condor_var_lib_t) ++') ++ ++###################################### ++## ++## Read and write condor lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_rw_lib_files',` ++ gen_require(` ++ type condor_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ rw_files_pattern($1, condor_var_lib_t, condor_var_lib_t) ++') ++ ++######################################## ++## ++## Manage condor lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_manage_lib_files',` ++ gen_require(` ++ type condor_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, condor_var_lib_t, condor_var_lib_t) ++') ++ ++######################################## ++## ++## Manage condor lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_manage_lib_dirs',` ++ gen_require(` ++ type condor_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, condor_var_lib_t, condor_var_lib_t) ++') ++ ++######################################## ++## ++## Read condor PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_read_pid_files',` + gen_require(` +- attribute condor_domain; +- type condor_initrc_exec_config_t, condor_log_t; +- type condor_var_lib_t, condor_var_lock_t, condor_schedd_tmp_t; +- type condor_var_run_t, condor_startd_tmp_t, condor_conf_t; ++ type condor_var_run_t; + ') + +- allow $1 condor_domain:process { ptrace signal_perms }; ++ files_search_pids($1) ++ allow $1 condor_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Execute condor server in the condor domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`condor_systemctl',` ++ gen_require(` ++ type condor_domain; ++ type condor_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 condor_unit_file_t:file read_file_perms; ++ allow $1 condor_unit_file_t:service manage_service_perms; ++ + ps_process_pattern($1, condor_domain) ++') ++ ++####################################### ++## ++## Read and write condor_startd server TCP sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_rw_tcp_sockets_startd',` ++ gen_require(` ++ type condor_startd_t; ++ ') + +- init_labeled_script_domtrans($1, condor_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 condor_initrc_exec_t system_r; +- allow $2 system_r; ++ allow $1 condor_startd_t:tcp_socket rw_socket_perms; ++') ++ ++###################################### ++## ++## Read and write condor_schedd server TCP sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_rw_tcp_sockets_schedd',` ++ gen_require(` ++ type condor_schedd_t; ++ ') ++ ++ allow $1 condor_schedd_t:tcp_socket rw_socket_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an condor environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`condor_admin',` ++ gen_require(` ++ attribute condor_domain; ++ type condor_initrc_exec_t, condor_log_t, condor_conf_t; ++ type condor_var_lib_t, condor_var_lock_t, condor_schedd_tmp_t; ++ type condor_var_run_t, condor_startd_tmp_t; ++ type condor_unit_file_t; ++ ') ++ ++ allow $1 condor_domain:process { signal_perms }; ++ ps_process_pattern($1, condor_domain) ++ ++ init_labeled_script_domtrans($1, condor_initrc_exec_t) ++ domain_system_change_exemption($1) ++ role_transition $2 condor_initrc_exec_t system_r; ++ allow $2 system_r; + + files_search_etc($1) + admin_pattern($1, condor_conf_t) +@@ -77,8 +393,8 @@ interface(`condor_admin',` + logging_search_logs($1) + admin_pattern($1, condor_log_t) + +- files_search_locks($1) +- admin_pattern($1, condor_var_lock_t) ++ files_search_locks($1) ++ admin_pattern($1, condor_var_lock_t) + + files_search_var_lib($1) + admin_pattern($1, condor_var_lib_t) +@@ -88,4 +404,13 @@ interface(`condor_admin',` + + files_search_tmp($1) + admin_pattern($1, { condor_schedd_tmp_t condor_startd_tmp_t }) ++ ++ condor_systemctl($1) ++ admin_pattern($1, condor_unit_file_t) ++ allow $1 condor_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/condor.te b/condor.te +index ce9f040e2f..990ada3adc 100644 +--- a/condor.te ++++ b/condor.te +@@ -34,7 +34,7 @@ files_tmp_file(condor_startd_tmp_t) + type condor_startd_tmpfs_t; + files_tmpfs_file(condor_startd_tmpfs_t) + +-type condor_conf_t; ++type condor_conf_t alias condor_etc_rw_t; + files_config_file(condor_conf_t) + + type condor_log_t; +@@ -49,6 +49,9 @@ files_lock_file(condor_var_lock_t) + type condor_var_run_t; + files_pid_file(condor_var_run_t) + ++type condor_unit_file_t; ++systemd_unit_file(condor_unit_file_t) ++ + condor_domain_template(collector) + condor_domain_template(negotiator) + condor_domain_template(procd) +@@ -60,10 +63,18 @@ condor_domain_template(startd) + # Global local policy + # + ++allow condor_domain self:capability { dac_read_search dac_override }; ++allow condor_domain self:capability2 block_suspend; ++ + allow condor_domain self:process signal_perms; + allow condor_domain self:fifo_file rw_fifo_file_perms; +-allow condor_domain self:tcp_socket { accept listen }; +-allow condor_domain self:unix_stream_socket { accept listen }; ++allow condor_domain self:tcp_socket create_stream_socket_perms; ++allow condor_domain self:udp_socket create_socket_perms; ++allow condor_domain self:unix_stream_socket create_stream_socket_perms; ++allow condor_domain self:netlink_route_socket r_netlink_socket_perms; ++ ++allow condor_domain condor_etc_rw_t:dir list_dir_perms; ++rw_files_pattern(condor_domain, condor_etc_rw_t, condor_etc_rw_t) + + rw_files_pattern(condor_domain, condor_conf_t, condor_conf_t) + +@@ -86,16 +97,15 @@ files_pid_filetrans(condor_domain, condor_var_run_t, { dir file fifo_file }) + + allow condor_domain condor_master_t:process signull; + allow condor_domain condor_master_t:tcp_socket getattr; ++allow condor_domain condor_master_t:udp_socket { read write }; + +-kernel_read_kernel_sysctls(condor_domain) + kernel_read_network_state(condor_domain) +-kernel_read_system_state(condor_domain) ++kernel_rw_kernel_sysctl(condor_domain) ++kernel_search_network_sysctl(condor_domain) + + corecmd_exec_bin(condor_domain) + corecmd_exec_shell(condor_domain) + +-corenet_all_recvfrom_netlabel(condor_domain) +-corenet_all_recvfrom_unlabeled(condor_domain) + corenet_tcp_sendrecv_generic_if(condor_domain) + corenet_tcp_sendrecv_generic_node(condor_domain) + +@@ -109,9 +119,9 @@ dev_read_rand(condor_domain) + dev_read_sysfs(condor_domain) + dev_read_urand(condor_domain) + +-logging_send_syslog_msg(condor_domain) ++auth_read_passwd(condor_domain) + +-miscfiles_read_localization(condor_domain) ++sysnet_dns_name_resolve(condor_domain) + + sysnet_dns_name_resolve(condor_domain) + +@@ -130,7 +140,7 @@ optional_policy(` + # Master local policy + # + +-allow condor_master_t self:capability { setuid setgid dac_override sys_ptrace }; ++allow condor_master_t self:capability { chown setuid setgid sys_ptrace net_admin }; + + allow condor_master_t condor_domain:process { sigkill signal }; + +@@ -138,6 +148,12 @@ manage_dirs_pattern(condor_master_t, condor_master_tmp_t, condor_master_tmp_t) + manage_files_pattern(condor_master_t, condor_master_tmp_t, condor_master_tmp_t) + files_tmp_filetrans(condor_master_t, condor_master_tmp_t, { file dir }) + ++can_exec(condor_master_t, condor_master_exec_t) ++ ++kernel_read_system_state(condor_master_t) ++kernel_read_fs_sysctls(condor_master_t) ++kernel_rw_net_sysctls(condor_master_t) ++ + corenet_udp_sendrecv_generic_if(condor_master_t) + corenet_udp_sendrecv_generic_node(condor_master_t) + corenet_tcp_bind_generic_node(condor_master_t) +@@ -157,6 +173,8 @@ domain_read_all_domains_state(condor_master_t) + + auth_use_nsswitch(condor_master_t) + ++logging_send_syslog_msg(condor_master_t) ++ + optional_policy(` + mta_send_mail(condor_master_t) + mta_read_config(condor_master_t) +@@ -174,6 +192,8 @@ allow condor_collector_t condor_master_t:udp_socket rw_socket_perms; + + kernel_read_network_state(condor_collector_t) + ++corenet_tcp_bind_http_port(condor_collector_t) ++ + ##################################### + # + # Negotiator local policy +@@ -183,12 +203,14 @@ allow condor_negotiator_t self:capability { setuid setgid }; + allow condor_negotiator_t condor_master_t:tcp_socket rw_stream_socket_perms; + allow condor_negotiator_t condor_master_t:udp_socket getattr; + ++corenet_tcp_connect_all_ephemeral_ports(condor_negotiator_t) ++ + ###################################### + # + # Procd local policy + # + +-allow condor_procd_t self:capability { fowner chown kill dac_override sys_ptrace }; ++allow condor_procd_t self:capability { fowner chown kill dac_read_search dac_override sys_ptrace }; + + allow condor_procd_t condor_domain:process sigkill; + +@@ -199,13 +221,15 @@ domain_read_all_domains_state(condor_procd_t) + # Schedd local policy + # + +-allow condor_schedd_t self:capability { setuid chown setgid dac_override }; ++allow condor_schedd_t self:capability { setuid chown setgid dac_read_search dac_override }; + + allow condor_schedd_t condor_master_t:tcp_socket rw_stream_socket_perms; + allow condor_schedd_t condor_master_t:udp_socket getattr; + + allow condor_schedd_t condor_var_lock_t:dir manage_file_perms; + ++allow condor_schedd_t condor_master_tmp_t:dir getattr; ++ + domtrans_pattern(condor_schedd_t, condor_procd_exec_t, condor_procd_t) + domtrans_pattern(condor_schedd_t, condor_startd_exec_t, condor_startd_t) + +@@ -214,12 +238,19 @@ manage_files_pattern(condor_schedd_t, condor_schedd_tmp_t, condor_schedd_tmp_t) + relabel_files_pattern(condor_schedd_t, condor_schedd_tmp_t, condor_schedd_tmp_t) + files_tmp_filetrans(condor_schedd_t, condor_schedd_tmp_t, { file dir }) + ++corenet_tcp_connect_all_ephemeral_ports(condor_schedd_t) ++ ++optional_policy(` ++ mta_send_mail(condor_schedd_t) ++ mta_read_config(condor_schedd_t) ++') ++ + ##################################### + # + # Startd local policy + # + +-allow condor_startd_t self:capability { setuid net_admin setgid dac_override }; ++allow condor_startd_t self:capability { setuid net_admin setgid dac_read_search dac_override }; + allow condor_startd_t self:process execmem; + + manage_dirs_pattern(condor_startd_t, condor_startd_tmp_t, condor_startd_tmp_t) +@@ -238,11 +269,10 @@ domain_read_all_domains_state(condor_startd_t) + mcs_process_set_categories(condor_startd_t) + + init_domtrans_script(condor_startd_t) ++init_initrc_domain(condor_startd_t) + + libs_exec_lib_files(condor_startd_t) + +-files_read_usr_files(condor_startd_t) +- + optional_policy(` + ssh_basic_client_template(condor_startd, condor_startd_t, system_r) + ssh_domtrans(condor_startd_t) +@@ -254,3 +284,7 @@ optional_policy(` + kerberos_use(condor_startd_ssh_t) + ') + ') ++ ++optional_policy(` ++ unconfined_domain(condor_startd_t) ++') +diff --git a/conman.fc b/conman.fc +new file mode 100644 +index 0000000000..397da66fbc +--- /dev/null ++++ b/conman.fc +@@ -0,0 +1,11 @@ ++/usr/lib/systemd/system/conman.* -- gen_context(system_u:object_r:conman_unit_file_t,s0) ++ ++/usr/sbin/conmand -- gen_context(system_u:object_r:conman_exec_t,s0) ++ ++/usr/share/conman/exec(/.*)? gen_context(system_u:object_r:conman_unconfined_script_exec_t,s0) ++ ++/var/log/conman(/.*)? gen_context(system_u:object_r:conman_log_t,s0) ++/var/log/conman\.d(/.*)? gen_context(system_u:object_r:conman_log_t,s0) ++/var/log/conman\.old(/.*)? gen_context(system_u:object_r:conman_log_t,s0) ++ ++/var/run/conmand.* -- gen_context(system_u:object_r:conman_var_run_t,s0) +diff --git a/conman.if b/conman.if +new file mode 100644 +index 0000000000..1cc5fa4643 +--- /dev/null ++++ b/conman.if +@@ -0,0 +1,143 @@ ++## Conman is a program for connecting to remote consoles being managed by conmand ++ ++######################################## ++## ++## Execute conman in the conman domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`conman_domtrans',` ++ gen_require(` ++ type conman_t, conman_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, conman_exec_t, conman_t) ++') ++ ++######################################## ++## ++## Read conman's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`conman_read_log',` ++ gen_require(` ++ type conman_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, conman_log_t, conman_log_t) ++') ++ ++######################################## ++## ++## Append to conman log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`conman_append_log',` ++ gen_require(` ++ type conman_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, conman_log_t, conman_log_t) ++') ++ ++######################################## ++## ++## Manage conman log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`conman_manage_log',` ++ gen_require(` ++ type conman_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, conman_log_t, conman_log_t) ++ manage_files_pattern($1, conman_log_t, conman_log_t) ++') ++ ++######################################## ++## ++## Execute conman server in the conman domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`conman_systemctl',` ++ gen_require(` ++ type conman_t; ++ type conman_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 conman_unit_file_t:file read_file_perms; ++ allow $1 conman_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, conman_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an conman environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`conman_admin',` ++ gen_require(` ++ type conman_t; ++ type conman_log_t; ++ type conman_unit_file_t; ++ ') ++ ++ allow $1 conman_t:process { signal_perms }; ++ ps_process_pattern($1, conman_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 conman_t:process ptrace; ++ ') ++ ++ logging_search_logs($1) ++ admin_pattern($1, conman_log_t) ++ ++ conman_systemctl($1) ++ admin_pattern($1, conman_unit_file_t) ++ allow $1 conman_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/conman.te b/conman.te +new file mode 100644 +index 0000000000..8d5d884006 +--- /dev/null ++++ b/conman.te +@@ -0,0 +1,117 @@ ++policy_module(conman, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Determine whether conman can ++## connect to all TCP ports ++##

      ++##
      ++gen_tunable(conman_can_network, false) ++ ++## ++##

      ++## Allow conman to manage nfs files ++##

      ++##
      ++gen_tunable(conman_use_nfs, false) ++ ++type conman_t; ++type conman_exec_t; ++init_daemon_domain(conman_t, conman_exec_t) ++ ++type conman_log_t; ++logging_log_file(conman_log_t) ++ ++type conman_tmp_t; ++files_tmp_file(conman_tmp_t) ++ ++type conman_var_run_t; ++files_pid_file(conman_var_run_t) ++ ++type conman_unit_file_t; ++systemd_unit_file(conman_unit_file_t) ++ ++type conman_unconfined_script_t; ++type conman_unconfined_script_exec_t; ++application_domain(conman_unconfined_script_t, conman_unconfined_script_exec_t) ++init_system_domain(conman_unconfined_script_t, conman_unconfined_script_exec_t) ++ ++######################################## ++# ++# conman local policy ++# ++ ++allow conman_t self:capability { sys_tty_config }; ++allow conman_t self:process { setrlimit signal_perms }; ++ ++allow conman_t self:fifo_file rw_fifo_file_perms; ++allow conman_t self:unix_stream_socket create_stream_socket_perms; ++allow conman_t self:tcp_socket { accept listen create_socket_perms }; ++ ++allow conman_t conman_unconfined_script_t:process sigkill; ++allow conman_t conman_unconfined_script_exec_t:dir list_dir_perms; ++ ++manage_dirs_pattern(conman_t, conman_log_t, conman_log_t) ++manage_files_pattern(conman_t, conman_log_t, conman_log_t) ++logging_log_filetrans(conman_t, conman_log_t, { dir }) ++ ++manage_files_pattern(conman_t, conman_tmp_t, conman_tmp_t) ++manage_dirs_pattern(conman_t, conman_tmp_t, conman_tmp_t) ++files_tmp_filetrans(conman_t, conman_tmp_t, { file dir }) ++ ++manage_files_pattern(conman_t, conman_var_run_t, conman_var_run_t) ++files_pid_filetrans(conman_t, conman_var_run_t, file) ++ ++auth_use_nsswitch(conman_t) ++ ++kernel_read_system_state(conman_t) ++ ++corenet_tcp_bind_generic_node(conman_t) ++corenet_tcp_bind_conman_port(conman_t) ++ ++corenet_tcp_connect_all_ephemeral_ports(conman_t) ++ ++corecmd_exec_bin(conman_t) ++ ++dev_read_urand(conman_t) ++ ++logging_send_syslog_msg(conman_t) ++ ++sysnet_dns_name_resolve(conman_t) ++ ++userdom_use_user_ptys(conman_t) ++ ++term_use_ptmx(conman_t) ++term_use_usb_ttys(conman_t) ++term_getattr_pty_fs(conman_t) ++ ++tunable_policy(`conman_can_network',` ++ corenet_sendrecv_all_client_packets(conman_t) ++ corenet_tcp_connect_all_ports(conman_t) ++ corenet_tcp_sendrecv_all_ports(conman_t) ++') ++ ++tunable_policy(`conman_use_nfs',` ++ fs_manage_nfs_files(conman_t) ++ fs_read_nfs_symlinks(conman_t) ++') ++ ++optional_policy(` ++ freeipmi_stream_connect(conman_t) ++') ++ ++######################################## ++# ++# conman script local policy ++# ++ ++domtrans_pattern(conman_t, conman_unconfined_script_exec_t, conman_unconfined_script_t) ++ ++optional_policy(` ++ unconfined_domain(conman_unconfined_script_t) ++') +diff --git a/consolekit.fc b/consolekit.fc +index 23c95582fa..29e5fd38df 100644 +--- a/consolekit.fc ++++ b/consolekit.fc +@@ -1,3 +1,5 @@ ++/usr/lib/systemd/system/console-kit.* -- gen_context(system_u:object_r:consolekit_unit_file_t,s0) ++ + /usr/sbin/console-kit-daemon -- gen_context(system_u:object_r:consolekit_exec_t,s0) + + /var/log/ConsoleKit(/.*)? gen_context(system_u:object_r:consolekit_log_t,s0) +diff --git a/consolekit.if b/consolekit.if +index 5b830ec9c4..78025c5e70 100644 +--- a/consolekit.if ++++ b/consolekit.if +@@ -19,6 +19,27 @@ interface(`consolekit_domtrans',` + domtrans_pattern($1, consolekit_exec_t, consolekit_t) + ') + ++######################################## ++## ++## dontaudit Send and receive messages from ++## consolekit over dbus. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`consolekit_dontaudit_dbus_chat',` ++ gen_require(` ++ type consolekit_t; ++ class dbus send_msg; ++ ') ++ ++ dontaudit $1 consolekit_t:dbus send_msg; ++ dontaudit consolekit_t $1:dbus send_msg; ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -40,6 +61,24 @@ interface(`consolekit_dbus_chat',` + allow consolekit_t $1:dbus send_msg; + ') + ++######################################## ++## ++## Dontaudit attempts to read consolekit log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`consolekit_dontaudit_read_log',` ++ gen_require(` ++ type consolekit_log_t; ++ ') ++ ++ dontaudit $1 consolekit_log_t:file read_file_perms; ++') ++ + ######################################## + ## + ## Read consolekit log files. +@@ -98,3 +137,65 @@ interface(`consolekit_read_pid_files',` + allow $1 consolekit_var_run_t:dir list_dir_perms; + read_files_pattern($1, consolekit_var_run_t, consolekit_var_run_t) + ') ++ ++######################################## ++## ++## List consolekit PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`consolekit_list_pid_files',` ++ gen_require(` ++ type consolekit_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ list_dirs_pattern($1, consolekit_var_run_t, consolekit_var_run_t) ++') ++ ++######################################## ++## ++## Allow the domain to read consolekit state files in /proc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`consolekit_read_state',` ++ gen_require(` ++ type consolekit_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, consolekit_t) ++') ++ ++######################################## ++## ++## Execute consolekit server in the consolekit domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`consolekit_systemctl',` ++ gen_require(` ++ type consolekit_t; ++ type consolekit_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 consolekit_unit_file_t:file read_file_perms; ++ allow $1 consolekit_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, consolekit_t) ++') +diff --git a/consolekit.te b/consolekit.te +index bd18063f69..94407f8541 100644 +--- a/consolekit.te ++++ b/consolekit.te +@@ -19,21 +19,23 @@ type consolekit_var_run_t; + files_pid_file(consolekit_var_run_t) + init_daemon_run_dir(consolekit_var_run_t, "ConsoleKit") + ++type consolekit_unit_file_t; ++systemd_unit_file(consolekit_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow consolekit_t self:capability { chown setuid setgid sys_tty_config dac_override sys_nice sys_ptrace }; ++allow consolekit_t self:capability { chown setuid setgid sys_tty_config dac_read_search dac_override sys_nice sys_ptrace }; ++ + allow consolekit_t self:process { getsched signal }; + allow consolekit_t self:fifo_file rw_fifo_file_perms; + allow consolekit_t self:unix_stream_socket { accept listen }; + +-create_files_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) +-append_files_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) +-read_files_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) +-setattr_files_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) +-logging_log_filetrans(consolekit_t, consolekit_log_t, file) ++manage_dirs_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) ++manage_files_pattern(consolekit_t, consolekit_log_t, consolekit_log_t) ++logging_log_filetrans(consolekit_t, consolekit_log_t, { dir file }) + + manage_dirs_pattern(consolekit_t, consolekit_var_run_t, consolekit_var_run_t) + manage_files_pattern(consolekit_t, consolekit_var_run_t, consolekit_var_run_t) +@@ -54,38 +56,37 @@ dev_read_sysfs(consolekit_t) + + domain_read_all_domains_state(consolekit_t) + domain_use_interactive_fds(consolekit_t) +-domain_dontaudit_ptrace_all_domains(consolekit_t) + +-files_read_usr_files(consolekit_t) ++# needs to read /var/lib/dbus/machine-id + files_read_var_lib_files(consolekit_t) + files_search_all_mountpoints(consolekit_t) + + fs_list_inotifyfs(consolekit_t) + +-mcs_ptrace_all(consolekit_t) +- + term_use_all_terms(consolekit_t) + + auth_use_nsswitch(consolekit_t) + auth_manage_pam_console_data(consolekit_t) + auth_write_login_records(consolekit_t) + auth_create_pam_console_data_dirs(consolekit_t) +-auth_pid_filetrans_pam_var_console(consolekit_t, dir, "console") ++ ++init_read_utmp(consolekit_t) + + logging_send_syslog_msg(consolekit_t) + logging_send_audit_msgs(consolekit_t) + +-miscfiles_read_localization(consolekit_t) ++systemd_exec_systemctl(consolekit_t) ++systemd_start_power_services(consolekit_t) + ++userdom_read_all_users_state(consolekit_t) + userdom_dontaudit_read_user_home_content_files(consolekit_t) ++userdom_dontaudit_getattr_admin_home_files(consolekit_t) + userdom_read_user_tmp_files(consolekit_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(consolekit_t) +-') ++userdom_home_reader(consolekit_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(consolekit_t) ++optional_policy(` ++ cron_read_system_job_lib_files(consolekit_t) + ') + + optional_policy(` +@@ -109,13 +110,6 @@ optional_policy(` + ') + ') + +-optional_policy(` +- hal_ptrace(consolekit_t) +-') +- +-optional_policy(` +- networkmanager_append_log_files(consolekit_t) +-') + + optional_policy(` + policykit_domtrans_auth(consolekit_t) +diff --git a/container.fc b/container.fc +new file mode 100644 +index 0000000000..bad12f4214 +--- /dev/null ++++ b/container.fc +@@ -0,0 +1,31 @@ ++/root/\.docker gen_context(system_u:object_r:container_home_t,s0) ++ ++/usr/bin/docker -- gen_context(system_u:object_r:container_runtime_exec_t,s0) ++/usr/bin/docker-novolume-plugin -- gen_context(system_u:object_r:container_auth_exec_t,s0) ++/usr/lib/docker/docker-novolume-plugin -- gen_context(system_u:object_r:container_auth_exec_t,s0) ++ ++/usr/lib/systemd/system/docker.service -- gen_context(system_u:object_r:container_unit_file_t,s0) ++/usr/lib/systemd/system/docker-novolume-plugin.service -- gen_context(system_u:object_r:container_unit_file_t,s0) ++ ++/etc/docker(/.*)? gen_context(system_u:object_r:container_config_t,s0) ++ ++/var/lib/docker(/.*)? gen_context(system_u:object_r:container_var_lib_t,s0) ++/var/lib/containers(/.*)? gen_context(system_u:object_r:container_var_lib_t,s0) ++/var/lib/docker/overlay(/.*)? gen_context(system_u:object_r:container_share_t,s0) ++/var/lib/kublet(/.*)? gen_context(system_u:object_r:container_var_lib_t,s0) ++ ++/var/run/docker(/.*)? gen_context(system_u:object_r:container_var_run_t,s0) ++/var/run/containerd(/.*)? gen_context(system_u:object_r:container_var_run_t,s0) ++/var/run/docker\.pid -- gen_context(system_u:object_r:container_var_run_t,s0) ++/var/run/docker\.sock -s gen_context(system_u:object_r:container_var_run_t,s0) ++/var/run/docker-client(/.*)? gen_context(system_u:object_r:container_var_run_t,s0) ++/var/run/docker/plugins(/.*)? gen_context(system_u:object_r:container_plugin_var_run_t,s0) ++ ++/var/lock/lxc(/.*)? gen_context(system_u:object_r:container_lock_t,s0) ++ ++/var/log/lxc(/.*)? gen_context(system_u:object_r:container_log_t,s0) ++ ++/var/lib/docker/init(/.*)? gen_context(system_u:object_r:container_share_t,s0) ++/var/lib/docker/containers/.*/hosts gen_context(system_u:object_r:container_share_t,s0) ++/var/lib/docker/containers/.*/hostname gen_context(system_u:object_r:container_share_t,s0) ++/var/lib/docker/.*/config\.env gen_context(system_u:object_r:container_share_t,s0) +diff --git a/container.if b/container.if +new file mode 100644 +index 0000000000..785affa3f5 +--- /dev/null ++++ b/container.if +@@ -0,0 +1,542 @@ ++ ++## The open-source application container engine. ++ ++######################################## ++## ++## Execute docker in the docker domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`container_runtime_domtrans',` ++ gen_require(` ++ type container_runtime_t, container_runtime_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, container_runtime_exec_t, container_runtime_t) ++') ++ ++######################################## ++## ++## Execute docker in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`container_runtime_exec',` ++ gen_require(` ++ type container_runtime_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, container_runtime_exec_t) ++') ++ ++######################################## ++## ++## Search docker lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_search_lib',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ allow $1 container_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Execute docker lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_exec_lib',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ allow $1 container_var_lib_t:dir search_dir_perms; ++ can_exec($1, container_var_lib_t) ++') ++ ++######################################## ++## ++## Read docker lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_read_lib_files',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, container_var_lib_t, container_var_lib_t) ++') ++ ++######################################## ++## ++## Read docker share files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_read_share_files',` ++ gen_require(` ++ type container_share_t; ++ ') ++ ++ files_search_var_lib($1) ++ list_dirs_pattern($1, container_share_t, container_share_t) ++ read_files_pattern($1, container_share_t, container_share_t) ++ read_lnk_files_pattern($1, container_share_t, container_share_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to execute docker shared files ++## in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_exec_share_files',` ++ gen_require(` ++ type container_share_t; ++ ') ++ ++ can_exec($1, container_share_t) ++') ++ ++######################################## ++## ++## Manage docker lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_manage_lib_files',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, container_var_lib_t, container_var_lib_t) ++ manage_lnk_files_pattern($1, container_var_lib_t, container_var_lib_t) ++') ++ ++######################################## ++## ++## Manage docker lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_manage_lib_dirs',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, container_var_lib_t, container_var_lib_t) ++') ++ ++######################################## ++## ++## Create objects in a docker var lib directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`container_lib_filetrans',` ++ gen_require(` ++ type container_var_lib_t; ++ ') ++ ++ filetrans_pattern($1, container_var_lib_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Read docker PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_read_pid_files',` ++ gen_require(` ++ type container_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, container_var_run_t, container_var_run_t) ++') ++ ++######################################## ++## ++## Execute docker server in the docker domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`container_systemctl',` ++ gen_require(` ++ type container_runtime_t; ++ type container_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 container_unit_file_t:file read_file_perms; ++ allow $1 container_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, container_runtime_t) ++') ++ ++######################################## ++## ++## Read and write docker shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_rw_sem',` ++ gen_require(` ++ type container_runtime_t; ++ ') ++ ++ allow $1 container_runtime_t:sem rw_sem_perms; ++') ++ ++####################################### ++## ++## Read and write the docker pty type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_use_ptys',` ++ gen_require(` ++ type container_devpts_t; ++ ') ++ ++ allow $1 container_devpts_t:chr_file rw_term_perms; ++') ++ ++####################################### ++## ++## Allow domain to create docker content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_filetrans_named_content',` ++ ++ gen_require(` ++ type container_var_lib_t; ++ type container_share_t; ++ type container_log_t; ++ type container_var_run_t; ++ type container_home_t; ++ ') ++ ++ files_pid_filetrans($1, container_var_run_t, file, "docker.pid") ++ files_pid_filetrans($1, container_var_run_t, sock_file, "docker.sock") ++ files_pid_filetrans($1, container_var_run_t, dir, "docker-client") ++ logging_log_filetrans($1, container_log_t, dir, "lxc") ++ files_var_lib_filetrans($1, container_var_lib_t, dir, "docker") ++ filetrans_pattern($1, container_var_lib_t, container_share_t, file, "config.env") ++ filetrans_pattern($1, container_var_lib_t, container_share_t, file, "hosts") ++ filetrans_pattern($1, container_var_lib_t, container_share_t, file, "hostname") ++ filetrans_pattern($1, container_var_lib_t, container_share_t, file, "resolv.conf") ++ filetrans_pattern($1, container_var_lib_t, container_share_t, dir, "init") ++ userdom_admin_home_dir_filetrans($1, container_home_t, dir, ".docker") ++') ++ ++######################################## ++## ++## Connect to docker over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_stream_connect',` ++ gen_require(` ++ type container_runtime_t, container_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, container_var_run_t, container_var_run_t, container_runtime_t) ++') ++ ++######################################## ++## ++## Connect to SPC containers over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_spc_stream_connect',` ++ gen_require(` ++ type spc_t, spc_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ files_write_all_pid_sockets($1) ++ allow $1 spc_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an docker environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_admin',` ++ gen_require(` ++ type container_runtime_t; ++ type container_var_lib_t, container_var_run_t; ++ type container_unit_file_t; ++ type container_lock_t; ++ type container_log_t; ++ type container_config_t; ++ ') ++ ++ allow $1 container_runtime_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, container_runtime_t) ++ ++ admin_pattern($1, container_config_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, container_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, container_var_run_t) ++ ++ files_search_locks($1) ++ admin_pattern($1, container_lock_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, container_log_t) ++ ++ container_systemctl($1) ++ admin_pattern($1, container_unit_file_t) ++ allow $1 container_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Read the process state of spc containers ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_spc_read_state',` ++ gen_require(` ++ type spc_t; ++ ') ++ ++ ps_process_pattern($1, spc_t) ++') ++ ++######################################## ++## ++## Execute container_auth_exec_t in the container_auth domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`container_auth_domtrans',` ++ gen_require(` ++ type container_auth_t, container_auth_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, container_auth_exec_t, container_auth_t) ++') ++ ++###################################### ++## ++## Execute container_auth in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_auth_exec',` ++ gen_require(` ++ type container_auth_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, container_auth_exec_t) ++') ++ ++######################################## ++## ++## Connect to container_auth over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_auth_stream_connect',` ++ gen_require(` ++ type container_auth_t, container_plugin_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, container_plugin_var_run_t, container_plugin_var_run_t, container_auth_t) ++') ++ ++######################################## ++## ++## docker domain typebounds calling domain. ++## ++## ++## ++## Domain to be typebound. ++## ++## ++# ++interface(`container_runtime_typebounds',` ++ gen_require(` ++ type container_runtime_t; ++ ') ++ ++ typebounds container_runtime_t $1; ++') ++ ++######################################## ++## ++## Allow any container_runtime_exec_t to be an entrypoint of this domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`container_entrypoint',` ++ gen_require(` ++ type container_runtime_exec_t; ++ ') ++ allow $1 container_runtime_exec_t:file entrypoint; ++') ++ ++######################################## ++## ++## rw configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`container_rw_config',` ++ gen_require(` ++ type container_config_t; ++ ') ++ ++ rw_files_pattern($1, container_config_t, container_config_t) ++ files_search_etc($1) ++') ++ +diff --git a/container.te b/container.te +new file mode 100644 +index 0000000000..5a929c4277 +--- /dev/null ++++ b/container.te +@@ -0,0 +1,391 @@ ++policy_module(container, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Determine whether docker can ++## connect to all TCP ports. ++##

      ++##
      ++gen_tunable(container_connect_any, false) ++ ++type container_runtime_t alias docker_t; ++type container_runtime_exec_t alias docker_exec_t; ++init_daemon_domain(container_runtime_t, container_runtime_exec_t) ++domain_subj_id_change_exemption(container_runtime_t) ++domain_role_change_exemption(container_runtime_t) ++ ++type spc_t; ++domain_type(spc_t) ++role system_r types spc_t; ++ ++type container_auth_t alias docker_auth_t; ++type container_auth_exec_t alias docker_auth_exec_t; ++init_daemon_domain(container_auth_t, container_auth_exec_t) ++ ++type spc_var_run_t; ++files_pid_file(spc_var_run_t) ++ ++type container_var_lib_t alias docker_var_lib_t; ++files_type(container_var_lib_t) ++ ++type container_home_t alias docker_home_t; ++userdom_user_home_content(container_home_t) ++ ++type container_config_t alias docker_config_t; ++files_config_file(container_config_t) ++ ++type container_lock_t alias docker_lock_t; ++files_lock_file(container_lock_t) ++ ++type container_log_t alias docker_log_t; ++logging_log_file(container_log_t) ++ ++type container_runtime_tmp_t alias docker_tmp_t; ++files_tmp_file(container_runtime_tmp_t) ++ ++type container_runtime_tmpfs_t alias docker_tmpfs_t; ++files_tmpfs_file(container_runtime_tmpfs_t) ++ ++type container_var_run_t alias docker_var_run_t; ++files_pid_file(container_var_run_t) ++ ++type container_plugin_var_run_t alias docker_plugin_var_run_t; ++files_pid_file(container_plugin_var_run_t) ++ ++type container_unit_file_t alias docker_unit_file_t; ++systemd_unit_file(container_unit_file_t) ++ ++type container_devpts_t alias docker_devpts_t; ++term_pty(container_devpts_t) ++ ++type container_share_t alias docker_share_t; ++files_type(container_share_t) ++ ++######################################## ++# ++# docker local policy ++# ++allow container_runtime_t self:capability { chown kill fowner fsetid mknod net_admin net_bind_service net_raw setfcap }; ++allow container_runtime_t self:tun_socket relabelto; ++allow container_runtime_t self:process { getattr signal_perms setrlimit setfscreate }; ++allow container_runtime_t self:fifo_file rw_fifo_file_perms; ++allow container_runtime_t self:unix_stream_socket create_stream_socket_perms; ++allow container_runtime_t self:tcp_socket create_stream_socket_perms; ++allow container_runtime_t self:udp_socket create_socket_perms; ++allow container_runtime_t self:capability2 block_suspend; ++ ++container_auth_stream_connect(container_runtime_t) ++ ++manage_files_pattern(container_runtime_t, container_home_t, container_home_t) ++manage_dirs_pattern(container_runtime_t, container_home_t, container_home_t) ++manage_lnk_files_pattern(container_runtime_t, container_home_t, container_home_t) ++userdom_admin_home_dir_filetrans(container_runtime_t, container_home_t, dir, ".docker") ++ ++manage_dirs_pattern(container_runtime_t, container_config_t, container_config_t) ++manage_files_pattern(container_runtime_t, container_config_t, container_config_t) ++files_etc_filetrans(container_runtime_t, container_config_t, dir, "docker") ++ ++manage_dirs_pattern(container_runtime_t, container_lock_t, container_lock_t) ++manage_files_pattern(container_runtime_t, container_lock_t, container_lock_t) ++files_lock_filetrans(container_runtime_t, container_lock_t, { dir file }, "lxc") ++ ++manage_dirs_pattern(container_runtime_t, container_log_t, container_log_t) ++manage_files_pattern(container_runtime_t, container_log_t, container_log_t) ++manage_lnk_files_pattern(container_runtime_t, container_log_t, container_log_t) ++logging_log_filetrans(container_runtime_t, container_log_t, { dir file lnk_file }) ++allow container_runtime_t container_log_t:dir_file_class_set { relabelfrom relabelto }; ++ ++manage_dirs_pattern(container_runtime_t, container_runtime_tmp_t, container_runtime_tmp_t) ++manage_files_pattern(container_runtime_t, container_runtime_tmp_t, container_runtime_tmp_t) ++manage_lnk_files_pattern(container_runtime_t, container_runtime_tmp_t, container_runtime_tmp_t) ++files_tmp_filetrans(container_runtime_t, container_runtime_tmp_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++manage_files_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++manage_lnk_files_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++manage_fifo_files_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++manage_chr_files_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++manage_blk_files_pattern(container_runtime_t, container_runtime_tmpfs_t, container_runtime_tmpfs_t) ++allow container_runtime_t container_runtime_tmpfs_t:dir relabelfrom; ++can_exec(container_runtime_t, container_runtime_tmpfs_t) ++fs_tmpfs_filetrans(container_runtime_t, container_runtime_tmpfs_t, { dir file }) ++allow container_runtime_t container_runtime_tmpfs_t:chr_file mounton; ++ ++manage_dirs_pattern(container_runtime_t, container_share_t, container_share_t) ++manage_files_pattern(container_runtime_t, container_share_t, container_share_t) ++manage_lnk_files_pattern(container_runtime_t, container_share_t, container_share_t) ++allow container_runtime_t container_share_t:dir_file_class_set { relabelfrom relabelto }; ++ ++can_exec(container_runtime_t, container_share_t) ++#container_filetrans_named_content(container_runtime_t) ++ ++manage_dirs_pattern(container_runtime_t, container_var_lib_t, container_var_lib_t) ++manage_chr_files_pattern(container_runtime_t, container_var_lib_t, container_var_lib_t) ++manage_blk_files_pattern(container_runtime_t, container_var_lib_t, container_var_lib_t) ++manage_files_pattern(container_runtime_t, container_var_lib_t, container_var_lib_t) ++manage_lnk_files_pattern(container_runtime_t, container_var_lib_t, container_var_lib_t) ++allow container_runtime_t container_var_lib_t:dir_file_class_set { relabelfrom relabelto }; ++files_var_lib_filetrans(container_runtime_t, container_var_lib_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(container_runtime_t, container_var_run_t, container_var_run_t) ++manage_files_pattern(container_runtime_t, container_var_run_t, container_var_run_t) ++manage_sock_files_pattern(container_runtime_t, container_var_run_t, container_var_run_t) ++manage_lnk_files_pattern(container_runtime_t, container_var_run_t, container_var_run_t) ++files_pid_filetrans(container_runtime_t, container_var_run_t, { dir file lnk_file sock_file }) ++ ++allow container_runtime_t container_devpts_t:chr_file { relabelfrom rw_chr_file_perms setattr_chr_file_perms }; ++term_create_pty(container_runtime_t, container_devpts_t) ++ ++kernel_read_system_state(container_runtime_t) ++kernel_read_network_state(container_runtime_t) ++kernel_read_all_sysctls(container_runtime_t) ++kernel_rw_net_sysctls(container_runtime_t) ++kernel_setsched(container_runtime_t) ++kernel_read_all_proc(container_runtime_t) ++ ++domain_use_interactive_fds(container_runtime_t) ++domain_dontaudit_read_all_domains_state(container_runtime_t) ++ ++corecmd_exec_bin(container_runtime_t) ++corecmd_exec_shell(container_runtime_t) ++ ++corenet_tcp_bind_generic_node(container_runtime_t) ++corenet_tcp_sendrecv_generic_if(container_runtime_t) ++corenet_tcp_sendrecv_generic_node(container_runtime_t) ++corenet_tcp_sendrecv_generic_port(container_runtime_t) ++corenet_tcp_bind_all_ports(container_runtime_t) ++corenet_tcp_connect_http_port(container_runtime_t) ++corenet_tcp_connect_commplex_main_port(container_runtime_t) ++corenet_udp_sendrecv_generic_if(container_runtime_t) ++corenet_udp_sendrecv_generic_node(container_runtime_t) ++corenet_udp_sendrecv_all_ports(container_runtime_t) ++corenet_udp_bind_generic_node(container_runtime_t) ++corenet_udp_bind_all_ports(container_runtime_t) ++ ++files_read_config_files(container_runtime_t) ++files_dontaudit_getattr_all_dirs(container_runtime_t) ++files_dontaudit_getattr_all_files(container_runtime_t) ++ ++fs_read_cgroup_files(container_runtime_t) ++fs_read_tmpfs_symlinks(container_runtime_t) ++fs_search_all(container_runtime_t) ++fs_getattr_all_fs(container_runtime_t) ++ ++storage_raw_rw_fixed_disk(container_runtime_t) ++ ++auth_use_nsswitch(container_runtime_t) ++auth_dontaudit_getattr_shadow(container_runtime_t) ++ ++init_read_state(container_runtime_t) ++init_status(container_runtime_t) ++ ++logging_send_audit_msgs(container_runtime_t) ++logging_send_syslog_msg(container_runtime_t) ++ ++miscfiles_read_localization(container_runtime_t) ++ ++mount_domtrans(container_runtime_t) ++ ++seutil_read_default_contexts(container_runtime_t) ++seutil_read_config(container_runtime_t) ++ ++sysnet_dns_name_resolve(container_runtime_t) ++sysnet_exec_ifconfig(container_runtime_t) ++ ++optional_policy(` ++ rpm_exec(container_runtime_t) ++ rpm_read_db(container_runtime_t) ++ rpm_exec(container_runtime_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(container_runtime_t) ++') ++ ++optional_policy(` ++ iptables_domtrans(container_runtime_t) ++') ++ ++optional_policy(` ++ openvswitch_stream_connect(container_runtime_t) ++') ++ ++# ++# lxc rules ++# ++ ++allow container_runtime_t self:capability { dac_read_search dac_override setgid setpcap setuid sys_admin sys_boot sys_chroot sys_ptrace }; ++ ++allow container_runtime_t self:process { getcap setcap setexec setpgid setsched signal_perms }; ++ ++allow container_runtime_t self:netlink_route_socket rw_netlink_socket_perms;; ++allow container_runtime_t self:netlink_audit_socket create_netlink_socket_perms; ++allow container_runtime_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow container_runtime_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++allow container_runtime_t container_var_lib_t:dir mounton; ++allow container_runtime_t container_var_lib_t:chr_file mounton; ++can_exec(container_runtime_t, container_var_lib_t) ++ ++kernel_dontaudit_setsched(container_runtime_t) ++kernel_get_sysvipc_info(container_runtime_t) ++kernel_request_load_module(container_runtime_t) ++kernel_mounton_messages(container_runtime_t) ++kernel_mounton_all_proc(container_runtime_t) ++kernel_mounton_all_sysctls(container_runtime_t) ++kernel_unlabeled_entry_type(spc_t) ++kernel_unlabeled_domtrans(container_runtime_t, spc_t) ++ ++dev_getattr_all(container_runtime_t) ++dev_getattr_sysfs_fs(container_runtime_t) ++dev_read_urand(container_runtime_t) ++dev_read_lvm_control(container_runtime_t) ++dev_rw_sysfs(container_runtime_t) ++dev_rw_loop_control(container_runtime_t) ++dev_rw_lvm_control(container_runtime_t) ++ ++files_getattr_isid_type_dirs(container_runtime_t) ++files_manage_isid_type_dirs(container_runtime_t) ++files_manage_isid_type_files(container_runtime_t) ++files_manage_isid_type_symlinks(container_runtime_t) ++files_manage_isid_type_chr_files(container_runtime_t) ++files_manage_isid_type_blk_files(container_runtime_t) ++files_exec_isid_files(container_runtime_t) ++files_mounton_isid(container_runtime_t) ++files_mounton_non_security(container_runtime_t) ++files_mounton_isid_type_chr_file(container_runtime_t) ++ ++fs_mount_all_fs(container_runtime_t) ++fs_unmount_all_fs(container_runtime_t) ++fs_remount_all_fs(container_runtime_t) ++files_mounton_isid(container_runtime_t) ++fs_manage_cgroup_dirs(container_runtime_t) ++fs_manage_cgroup_files(container_runtime_t) ++fs_relabelfrom_xattr_fs(container_runtime_t) ++fs_relabelfrom_tmpfs(container_runtime_t) ++fs_read_tmpfs_symlinks(container_runtime_t) ++fs_list_hugetlbfs(container_runtime_t) ++ ++term_use_generic_ptys(container_runtime_t) ++term_use_ptmx(container_runtime_t) ++term_getattr_pty_fs(container_runtime_t) ++term_relabel_pty_fs(container_runtime_t) ++term_mounton_unallocated_ttys(container_runtime_t) ++ ++modutils_domtrans_insmod(container_runtime_t) ++ ++systemd_status_all_unit_files(container_runtime_t) ++systemd_start_systemd_services(container_runtime_t) ++ ++userdom_stream_connect(container_runtime_t) ++userdom_search_user_home_content(container_runtime_t) ++userdom_read_all_users_state(container_runtime_t) ++userdom_relabel_user_home_files(container_runtime_t) ++userdom_relabel_user_tmp_files(container_runtime_t) ++userdom_relabel_user_tmp_dirs(container_runtime_t) ++ ++optional_policy(` ++ gpm_getattr_gpmctl(container_runtime_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(container_runtime_t) ++ init_dbus_chat(container_runtime_t) ++ init_start_transient_unit(container_runtime_t) ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(container_runtime_t) ++ ') ++ ++ optional_policy(` ++ firewalld_dbus_chat(container_runtime_t) ++ ') ++') ++ ++optional_policy(` ++ udev_read_db(container_runtime_t) ++') ++ ++optional_policy(` ++ virt_read_config(container_runtime_t) ++ virt_exec(container_runtime_t) ++ virt_stream_connect(container_runtime_t) ++ virt_stream_connect_sandbox(container_runtime_t) ++ virt_exec_sandbox_files(container_runtime_t) ++ virt_manage_sandbox_files(container_runtime_t) ++ virt_relabel_sandbox_filesystem(container_runtime_t) ++ # for lxc ++ virt_transition_svirt_sandbox(container_runtime_t, system_r) ++ virt_mounton_sandbox_file(container_runtime_t) ++# virt_attach_sandbox_tun_iface(container_runtime_t) ++ allow container_runtime_t svirt_sandbox_domain:tun_socket relabelfrom; ++') ++ ++tunable_policy(`container_connect_any',` ++ corenet_tcp_connect_all_ports(container_runtime_t) ++ corenet_sendrecv_all_packets(container_runtime_t) ++ corenet_tcp_sendrecv_all_ports(container_runtime_t) ++') ++ ++######################################## ++# ++# spc local policy ++# ++allow spc_t { container_var_lib_t container_share_t }:file entrypoint; ++role system_r types spc_t; ++ ++domtrans_pattern(container_runtime_t, container_share_t, spc_t) ++domtrans_pattern(container_runtime_t, container_var_lib_t, spc_t) ++allow container_runtime_t spc_t:process { setsched signal_perms }; ++ps_process_pattern(container_runtime_t, spc_t) ++allow container_runtime_t spc_t:socket_class_set { relabelto relabelfrom }; ++filetrans_pattern(container_runtime_t, container_var_lib_t, container_share_t, dir, "overlay") ++ ++optional_policy(` ++ dbus_chat_system_bus(spc_t) ++') ++ ++optional_policy(` ++ unconfined_domain_noaudit(spc_t) ++') ++ ++optional_policy(` ++ unconfined_domain(container_runtime_t) ++') ++ ++optional_policy(` ++ virt_transition_svirt_sandbox(spc_t, system_r) ++') ++ ++######################################## ++# ++# container_auth local policy ++# ++allow container_auth_t self:fifo_file rw_fifo_file_perms; ++allow container_auth_t self:unix_stream_socket create_stream_socket_perms; ++dontaudit container_auth_t self:capability net_admin; ++ ++container_stream_connect(container_auth_t) ++ ++manage_dirs_pattern(container_auth_t, container_plugin_var_run_t, container_plugin_var_run_t) ++manage_files_pattern(container_auth_t, container_plugin_var_run_t, container_plugin_var_run_t) ++manage_sock_files_pattern(container_auth_t, container_plugin_var_run_t, container_plugin_var_run_t) ++manage_lnk_files_pattern(container_auth_t, container_plugin_var_run_t, container_plugin_var_run_t) ++files_pid_filetrans(container_auth_t, container_plugin_var_run_t, { dir file lnk_file sock_file }) ++ ++domain_use_interactive_fds(container_auth_t) ++ ++kernel_read_net_sysctls(container_auth_t) ++ ++auth_use_nsswitch(container_auth_t) ++ ++files_read_etc_files(container_auth_t) ++ ++miscfiles_read_localization(container_auth_t) ++ ++sysnet_dns_name_resolve(container_auth_t) +diff --git a/corosync.fc b/corosync.fc +index da39f0fccc..b26d3e0a47 100644 +--- a/corosync.fc ++++ b/corosync.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/corosync -- gen_context(system_u:object_r:corosync_initrc_exec_t,s0) + ++/usr/lib/systemd/system/corosync.* -- gen_context(system_u:object_r:corosync_unit_file_t,s0) ++ + /usr/sbin/corosync -- gen_context(system_u:object_r:corosync_exec_t,s0) + /usr/sbin/corosync-notifyd -- gen_context(system_u:object_r:corosync_exec_t,s0) + +@@ -10,3 +12,5 @@ + /var/run/cman_.* -s gen_context(system_u:object_r:corosync_var_run_t,s0) + /var/run/corosync\.pid -- gen_context(system_u:object_r:corosync_var_run_t,s0) + /var/run/rsctmp(/.*)? gen_context(system_u:object_r:corosync_var_run_t,s0) ++/var/run/corosync-qdevice(/.*)? gen_context(system_u:object_r:corosync_var_run_t,s0) ++/var/run/corosync-qnetd(/.*)? gen_context(system_u:object_r:corosync_var_run_t,s0) +diff --git a/corosync.if b/corosync.if +index 694a037dad..d8596812db 100644 +--- a/corosync.if ++++ b/corosync.if +@@ -77,6 +77,25 @@ interface(`corosync_read_log',` + read_files_pattern($1, corosync_var_log_t, corosync_var_log_t) + ') + ++####################################### ++## ++## Setattr corosync log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corosync_setattr_log',` ++ gen_require(` ++ type corosync_var_log_t; ++ ') ++ ++ setattr_files_pattern($1, corosync_var_log_t, corosync_var_log_t) ++') ++ ++ + ##################################### + ## + ## Connect to corosync over a unix +@@ -91,29 +110,55 @@ interface(`corosync_read_log',` + interface(`corosync_stream_connect',` + gen_require(` + type corosync_t, corosync_var_run_t; ++ type corosync_var_lib_t; + ') + + files_search_pids($1) ++ stream_connect_pattern($1, corosync_var_lib_t, corosync_var_lib_t, corosync_t) + stream_connect_pattern($1, corosync_var_run_t, corosync_var_run_t, corosync_t) + ') + + ###################################### + ## +-## Read and write corosync tmpfs files. ++## Allow the specified domain to read/write corosync's tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`corosync_rw_tmpfs',` ++ gen_require(` ++ type corosync_tmpfs_t; ++ ') ++ ++ rw_files_pattern($1, corosync_tmpfs_t, corosync_tmpfs_t) ++ ++') ++ ++######################################## ++## ++## Execute corosync server in the corosync domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`corosync_rw_tmpfs',` ++interface(`corosync_systemctl',` + gen_require(` +- type corosync_tmpfs_t; ++ type corosync_t; ++ type corosync_unit_file_t; + ') + +- fs_search_tmpfs($1) +- rw_files_pattern($1, corosync_tmpfs_t, corosync_tmpfs_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 corosync_unit_file_t:file read_file_perms; ++ allow $1 corosync_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, corosync_t) + ') + + ###################################### +@@ -160,12 +205,17 @@ interface(`corosync_admin',` + type corosync_t, corosync_var_lib_t, corosync_var_log_t; + type corosync_var_run_t, corosync_tmp_t, corosync_tmpfs_t; + type corosync_initrc_exec_t; ++ type corosync_unit_file_t; + ') + +- allow $1 corosync_t:process { ptrace signal_perms }; ++ allow $1 corosync_t:process signal_perms; + ps_process_pattern($1, corosync_t) + +- corosync_initrc_domtrans($1) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 corosync_t:process ptrace; ++ ') ++ ++ init_labeled_script_domtrans($1, corosync_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 corosync_initrc_exec_t system_r; + allow $2 system_r; +@@ -183,4 +233,8 @@ interface(`corosync_admin',` + + files_list_pids($1) + admin_pattern($1, corosync_var_run_t) ++ ++ corosync_systemctl($1) ++ admin_pattern($1, corosync_unit_file_t) ++ allow $1 corosync_unit_file_t:service all_service_perms; + ') +diff --git a/corosync.te b/corosync.te +index d5aa1e446e..9a25701453 100644 +--- a/corosync.te ++++ b/corosync.te +@@ -28,12 +28,15 @@ logging_log_file(corosync_var_log_t) + type corosync_var_run_t; + files_pid_file(corosync_var_run_t) + ++type corosync_unit_file_t; ++systemd_unit_file(corosync_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow corosync_t self:capability { dac_override fowner setuid setgid sys_nice sys_admin sys_resource ipc_lock }; ++allow corosync_t self:capability { dac_read_search dac_override fowner setuid setgid sys_nice sys_admin sys_resource ipc_lock }; + # for hearbeat + allow corosync_t self:capability { net_raw chown }; + allow corosync_t self:process { setpgid setrlimit setsched signal signull }; +@@ -93,7 +96,6 @@ dev_read_urand(corosync_t) + domain_read_all_domains_state(corosync_t) + + files_manage_mounttab(corosync_t) +-files_read_usr_files(corosync_t) + + auth_use_nsswitch(corosync_t) + +@@ -106,7 +108,13 @@ logging_send_syslog_msg(corosync_t) + miscfiles_read_localization(corosync_t) + + userdom_read_user_tmp_files(corosync_t) +-userdom_manage_user_tmpfs_files(corosync_t) ++userdom_delete_user_tmp_files(corosync_t) ++userdom_rw_user_tmp_files(corosync_t) ++ ++optional_policy(` ++ fs_manage_tmpfs_files(corosync_t) ++ init_manage_script_status_files(corosync_t) ++') + + optional_policy(` + ccs_read_config(corosync_t) +@@ -128,21 +136,30 @@ optional_policy(` + drbd_domtrans(corosync_t) + ') + ++optional_policy(` ++ lvm_rw_clvmd_tmpfs_files(corosync_t) ++ lvm_delete_clvmd_tmpfs_files(corosync_t) ++') ++ + optional_policy(` + qpidd_rw_shm(corosync_t) + ') + + optional_policy(` +- rhcs_getattr_fenced_exec_files(corosync_t) ++ rhcs_getattr_fenced(corosync_t) ++ # to communication with RHCS + rhcs_rw_cluster_shm(corosync_t) + rhcs_rw_cluster_semaphores(corosync_t) + rhcs_stream_connect_cluster(corosync_t) ++ rhcs_read_cluster_lib_files(corosync_t) ++ rhcs_manage_cluster_lib_files(corosync_t) ++ rhcs_relabel_cluster_lib_files(corosync_t) + ') + + optional_policy(` +- rgmanager_manage_tmpfs_files(corosync_t) ++ rpc_search_nfs_state_data(corosync_t) + ') + + optional_policy(` +- rpc_search_nfs_state_data(corosync_t) +-') +\ No newline at end of file ++ wdmd_rw_tmpfs(corosync_t) ++') +diff --git a/couchdb.fc b/couchdb.fc +index c0863022d1..5380ab6415 100644 +--- a/couchdb.fc ++++ b/couchdb.fc +@@ -1,8 +1,10 @@ +-/etc/couchdb(/.*)? gen_context(system_u:object_r:couchdb_conf_t,s0) +- + /etc/rc\.d/init\.d/couchdb -- gen_context(system_u:object_r:couchdb_initrc_exec_t,s0) + +-/usr/bin/couchdb -- gen_context(system_u:object_r:couchdb_exec_t,s0) ++/usr/lib/systemd/system/couchdb.* -- gen_context(system_u:object_r:couchdb_unit_file_t,s0) ++ ++/etc/couchdb(/.*)? gen_context(system_u:object_r:couchdb_conf_t,s0) ++ ++/usr/libexec/couchdb -- gen_context(system_u:object_r:couchdb_exec_t,s0) + + /var/lib/couchdb(/.*)? gen_context(system_u:object_r:couchdb_var_lib_t,s0) + +diff --git a/couchdb.if b/couchdb.if +index 715a826f15..a1cbdb29ef 100644 +--- a/couchdb.if ++++ b/couchdb.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Read couchdb log files. ++## Allow to read couchdb log files. + ## + ## + ## +@@ -15,13 +15,13 @@ interface(`couchdb_read_log_files',` + type couchdb_log_t; + ') + +- logging_search_logs($1) ++ files_search_var_lib($1) + read_files_pattern($1, couchdb_log_t, couchdb_log_t) + ') + + ######################################## + ## +-## Read, write, and create couchdb lib files. ++## Allow to read couchdb lib files. + ## + ## + ## +@@ -29,7 +29,7 @@ interface(`couchdb_read_log_files',` + ## + ## + # +-interface(`couchdb_manage_lib_files',` ++interface(`couchdb_read_lib_files',` + gen_require(` + type couchdb_var_lib_t; + ') +@@ -40,7 +40,46 @@ interface(`couchdb_manage_lib_files',` + + ######################################## + ## +-## Read couchdb config files. ++## All of the rules required to ++## administrate an couchdb environment. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`couchdb_manage_lib_files',` ++ gen_require(` ++ type couchdb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, couchdb_var_lib_t, couchdb_var_lib_t) ++') ++ ++######################################## ++## ++## Manage couchdb lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`couchdb_manage_lib_dirs',` ++ gen_require(` ++ type couchdb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, couchdb_var_lib_t, couchdb_var_lib_t) ++') ++ ++######################################## ++## ++## Allow to read couchdb conf files. + ## + ## + ## +@@ -53,13 +92,13 @@ interface(`couchdb_read_conf_files',` + type couchdb_conf_t; + ') + +- files_search_etc($1) ++ files_search_var_lib($1) + read_files_pattern($1, couchdb_conf_t, couchdb_conf_t) + ') + + ######################################## + ## +-## Read couchdb pid files. ++## Read couchdb PID files. + ## + ## + ## +@@ -73,19 +112,88 @@ interface(`couchdb_read_pid_files',` + ') + + files_search_pids($1) +- read_files_pattern($1, couchdb_var_run_t, couchdb_var_run_t) ++ allow $1 couchdb_var_run_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Search couchdb PID dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`couchdb_search_pid_dirs',` ++ gen_require(` ++ type couchdb_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 couchdb_var_run_t:dir search_dir_perms; ++') ++ ++####################################### ++## ++## Allow domain to manage couchdb content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`couchdb_manage_files',` ++ gen_require(` ++ type couchdb_var_run_t; ++ type couchdb_log_t; ++ type couchdb_var_lib_t; ++ type couchdb_conf_t; ++ ') ++ ++ manage_files_pattern($1, couchdb_log_t, couchdb_log_t) ++ manage_files_pattern($1, couchdb_var_lib_t, couchdb_var_lib_t) ++ manage_files_pattern($1, couchdb_var_run_t, couchdb_var_run_t) ++ manage_files_pattern($1, couchdb_conf_t, couchdb_conf_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an couchdb environment. ++## Execute couchdb server in the couchdb domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## ++# ++interface(`couchdb_systemctl',` ++ gen_require(` ++ type couchdb_t; ++ type couchdb_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 couchdb_unit_file_t:file read_file_perms; ++ allow $1 couchdb_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, couchdb_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an couchdb environment ++## ++## ++## ++## Domain allowed access. ++## ++## + ## + ## + ## Role allowed access. +@@ -95,14 +203,19 @@ interface(`couchdb_read_pid_files',` + # + interface(`couchdb_admin',` + gen_require(` ++ type couchdb_unit_file_t; + type couchdb_t, couchdb_conf_t, couchdb_initrc_exec_t; + type couchdb_log_t, couchdb_var_lib_t, couchdb_var_run_t; + type couchdb_tmp_t; + ') + +- allow $1 couchdb_t:process { ptrace signal_perms }; ++ allow $1 couchdb_t:process { signal_perms }; + ps_process_pattern($1, couchdb_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 couchdb_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, couchdb_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 couchdb_initrc_exec_t system_r; +@@ -122,4 +235,13 @@ interface(`couchdb_admin',` + + files_search_pids($1) + admin_pattern($1, couchdb_var_run_t) ++ ++ admin_pattern($1, couchdb_unit_file_t) ++ couchdb_systemctl($1) ++ allow $1 couchdb_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/couchdb.te b/couchdb.te +index ae1c1b12a6..9b3a328c2c 100644 +--- a/couchdb.te ++++ b/couchdb.te +@@ -27,18 +27,21 @@ files_type(couchdb_var_lib_t) + type couchdb_var_run_t; + files_pid_file(couchdb_var_run_t) + ++type couchdb_unit_file_t; ++systemd_unit_file(couchdb_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow couchdb_t self:process { setsched signal signull sigkill }; ++allow couchdb_t self:process { execmem setsched signal signull sigkill }; + allow couchdb_t self:fifo_file rw_fifo_file_perms; + allow couchdb_t self:unix_stream_socket create_stream_socket_perms; ++allow couchdb_t self:unix_dgram_socket create_socket_perms; + allow couchdb_t self:tcp_socket { accept listen }; + +-allow couchdb_t couchdb_conf_t:dir list_dir_perms; +-allow couchdb_t couchdb_conf_t:file read_file_perms; ++manage_files_pattern(couchdb_t, couchdb_conf_t, couchdb_conf_t) + + manage_dirs_pattern(couchdb_t, couchdb_log_t, couchdb_log_t) + append_files_pattern(couchdb_t, couchdb_log_t, couchdb_log_t) +@@ -56,11 +59,14 @@ files_var_lib_filetrans(couchdb_t, couchdb_var_lib_t, dir) + + manage_dirs_pattern(couchdb_t, couchdb_var_run_t, couchdb_var_run_t) + manage_files_pattern(couchdb_t, couchdb_var_run_t, couchdb_var_run_t) +-files_pid_filetrans(couchdb_t, couchdb_var_run_t, dir) ++files_pid_filetrans(couchdb_t, couchdb_var_run_t, {file dir }) + + can_exec(couchdb_t, couchdb_exec_t) + ++kernel_read_network_state(couchdb_t) + kernel_read_system_state(couchdb_t) ++kernel_read_fs_sysctls(couchdb_t) ++kernel_dgram_send(couchdb_t) + + corecmd_exec_bin(couchdb_t) + corecmd_exec_shell(couchdb_t) +@@ -75,14 +81,27 @@ corenet_sendrecv_couchdb_server_packets(couchdb_t) + corenet_tcp_bind_couchdb_port(couchdb_t) + corenet_tcp_sendrecv_couchdb_port(couchdb_t) + ++# disksup tries to monitor the local disks ++fs_getattr_all_files(couchdb_t) ++fs_getattr_all_dirs(couchdb_t) ++fs_getattr_all_fs(couchdb_t) ++files_getattr_all_mountpoints(couchdb_t) ++files_search_all_mountpoints(couchdb_t) ++files_getattr_lost_found_dirs(couchdb_t) ++files_dontaudit_list_var(couchdb_t) ++ + dev_list_sysfs(couchdb_t) + dev_read_sysfs(couchdb_t) + dev_read_urand(couchdb_t) + +-files_read_usr_files(couchdb_t) ++auth_use_nsswitch(couchdb_t) + +-fs_getattr_xattr_fs(couchdb_t) ++optional_policy(` ++ gnome_dontaudit_search_config(couchdb_t) ++') ++ ++optional_policy(` ++ rpc_read_nfs_state_data(couchdb_t) ++') + +-auth_use_nsswitch(couchdb_t) + +-miscfiles_read_localization(couchdb_t) +diff --git a/courier.fc b/courier.fc +index 2f017a076b..defdc871e4 100644 +--- a/courier.fc ++++ b/courier.fc +@@ -11,17 +11,18 @@ + /usr/sbin/imaplogin -- gen_context(system_u:object_r:courier_pop_exec_t,s0) + + /usr/lib/courier/authlib/.* -- gen_context(system_u:object_r:courier_authdaemon_exec_t,s0) +-/usr/lib/courier/courier-authlib/.* -- gen_context(system_u:object_r:courier_authdaemon_exec_t,s0) + /usr/lib/courier/courier/.* -- gen_context(system_u:object_r:courier_exec_t,s0) +-/usr/lib/courier/courier/courierpop.* -- gen_context(system_u:object_r:courier_pop_exec_t,s0) +-/usr/lib/courier/courier/imaplogin -- gen_context(system_u:object_r:courier_pop_exec_t,s0) ++/usr/lib/courier/courier/courierpop.* -- gen_context(system_u:object_r:courier_pop_exec_t,s0) ++/usr/lib/courier/courier/imaplogin -- gen_context(system_u:object_r:courier_pop_exec_t,s0) + /usr/lib/courier/courier/pcpd -- gen_context(system_u:object_r:courier_pcp_exec_t,s0) +-/usr/lib/courier/imapd -- gen_context(system_u:object_r:courier_pop_exec_t,s0) +-/usr/lib/courier/pop3d -- gen_context(system_u:object_r:courier_pop_exec_t,s0) +-/usr/lib/courier/rootcerts(/.*)? gen_context(system_u:object_r:courier_etc_t,s0) +-/usr/lib/courier/sqwebmail/cleancache\.pl -- gen_context(system_u:object_r:sqwebmail_cron_exec_t,s0) +-/usr/lib/courier-imap/couriertcpd -- gen_context(system_u:object_r:courier_tcpd_exec_t,s0) ++/usr/lib/courier/imapd -- gen_context(system_u:object_r:courier_pop_exec_t,s0) ++/usr/lib/courier/pop3d -- gen_context(system_u:object_r:courier_pop_exec_t,s0) ++/usr/lib/courier/rootcerts(/.*)? gen_context(system_u:object_r:courier_etc_t,s0) ++/usr/lib/courier/sqwebmail/cleancache\.pl -- gen_context(system_u:object_r:sqwebmail_cron_exec_t,s0) + ++ifdef(`distro_gentoo',` ++/usr/lib/courier-imap/couriertcpd -- gen_context(system_u:object_r:courier_tcpd_exec_t,s0) ++') + + /var/lib/courier(/.*)? gen_context(system_u:object_r:courier_var_lib_t,s0) + /var/lib/courier-imap(/.*)? gen_context(system_u:object_r:courier_var_lib_t,s0) +diff --git a/courier.if b/courier.if +index 10f820fc74..acdb179e8d 100644 +--- a/courier.if ++++ b/courier.if +@@ -1,12 +1,12 @@ +-## Courier IMAP and POP3 email servers. ++## Courier IMAP and POP3 email servers + +-####################################### ++######################################## + ## +-## The template to define a courier domain. ++## Template for creating courier server processes. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix name of the server process. + ## + ## + # +@@ -15,7 +15,7 @@ template(`courier_domain_template',` + attribute courier_domain; + ') + +- ######################################## ++ ############################## + # + # Declarations + # +@@ -24,18 +24,30 @@ template(`courier_domain_template',` + type courier_$1_exec_t; + init_daemon_domain(courier_$1_t, courier_$1_exec_t) + +- ######################################## ++ ############################## + # +- # Policy ++ # Declarations + # + + can_exec(courier_$1_t, courier_$1_exec_t) ++ ++ kernel_read_system_state(courier_$1_t) ++ ++ corenet_all_recvfrom_netlabel(courier_$1_t) ++ corenet_tcp_sendrecv_generic_if(courier_$1_t) ++ corenet_udp_sendrecv_generic_if(courier_$1_t) ++ corenet_tcp_sendrecv_generic_node(courier_$1_t) ++ corenet_udp_sendrecv_generic_node(courier_$1_t) ++ corenet_tcp_sendrecv_all_ports(courier_$1_t) ++ corenet_udp_sendrecv_all_ports(courier_$1_t) ++ ++ logging_send_syslog_msg(courier_$1_t) + ') + + ######################################## + ## +-## Execute the courier authentication +-## daemon with a domain transition. ++## Execute the courier authentication daemon with ++## a domain transition. + ## + ## + ## +@@ -48,34 +60,32 @@ interface(`courier_domtrans_authdaemon',` + type courier_authdaemon_t, courier_authdaemon_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, courier_authdaemon_exec_t, courier_authdaemon_t) + ') + + ####################################### + ## +-## Connect to courier-authdaemon over +-## a unix stream socket. ++## Connect to courier-authdaemon over a unix stream socket. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`courier_stream_connect_authdaemon',` +- gen_require(` +- type courier_authdaemon_t, courier_spool_t; +- ') ++ gen_require(` ++ type courier_authdaemon_t, courier_spool_t; ++ ') + + files_search_spool($1) +- stream_connect_pattern($1, courier_spool_t, courier_spool_t, courier_authdaemon_t) ++ stream_connect_pattern($1, courier_spool_t, courier_spool_t, courier_authdaemon_t) + ') + + ######################################## + ## +-## Execute the courier POP3 and IMAP +-## server with a domain transition. ++## Execute the courier POP3 and IMAP server with ++## a domain transition. + ## + ## + ## +@@ -88,13 +98,12 @@ interface(`courier_domtrans_pop',` + type courier_pop_t, courier_pop_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, courier_pop_exec_t, courier_pop_t) + ') + + ######################################## + ## +-## Read courier config files. ++## Read courier config files + ## + ## + ## +@@ -127,7 +136,7 @@ interface(`courier_manage_spool_dirs',` + type courier_spool_t; + ') + +- files_search_var($1) ++ files_search_spool($1) + manage_dirs_pattern($1, courier_spool_t, courier_spool_t) + ') + +@@ -136,7 +145,7 @@ interface(`courier_manage_spool_dirs',` + ## Create, read, write, and delete courier + ## spool files. + ## +-## ++## + ## + ## Domain allowed access. + ## +@@ -147,7 +156,7 @@ interface(`courier_manage_spool_files',` + type courier_spool_t; + ') + +- files_search_var($1) ++ files_search_spool($1) + manage_files_pattern($1, courier_spool_t, courier_spool_t) + ') + +@@ -166,13 +175,13 @@ interface(`courier_read_spool',` + type courier_spool_t; + ') + +- files_search_var($1) ++ files_search_spool($1) + read_files_pattern($1, courier_spool_t, courier_spool_t) + ') + + ######################################## + ## +-## Read and write courier spool pipes. ++## Read and write to courier spool pipes. + ## + ## + ## +@@ -185,6 +194,5 @@ interface(`courier_rw_spool_pipes',` + type courier_spool_t; + ') + +- files_search_var($1) + allow $1 courier_spool_t:fifo_file rw_fifo_file_perms; + ') +diff --git a/courier.te b/courier.te +index ae3bc70e9a..d64452f774 100644 +--- a/courier.te ++++ b/courier.te +@@ -18,7 +18,7 @@ type courier_etc_t; + files_config_file(courier_etc_t) + + type courier_spool_t; +-files_type(courier_spool_t) ++files_spool_file(courier_spool_t) + + type courier_var_lib_t; + files_type(courier_var_lib_t) +@@ -34,7 +34,7 @@ mta_agent_executable(courier_exec_t) + # Common local policy + # + +-allow courier_domain self:capability dac_override; ++allow courier_domain self:capability { dac_read_search dac_override }; + dontaudit courier_domain self:capability sys_tty_config; + allow courier_domain self:process { setpgid signal_perms }; + allow courier_domain self:fifo_file rw_fifo_file_perms; +@@ -51,7 +51,6 @@ manage_sock_files_pattern(courier_domain, courier_var_run_t, courier_var_run_t) + files_pid_filetrans(courier_domain, courier_var_run_t, dir) + + kernel_read_kernel_sysctls(courier_domain) +-kernel_read_system_state(courier_domain) + + corecmd_exec_bin(courier_domain) + +@@ -59,15 +58,11 @@ dev_read_sysfs(courier_domain) + + domain_use_interactive_fds(courier_domain) + +-files_read_etc_files(courier_domain) + files_read_etc_runtime_files(courier_domain) +-files_read_usr_files(courier_domain) + + fs_getattr_xattr_fs(courier_domain) + fs_search_auto_mountpoints(courier_domain) + +-logging_send_syslog_msg(courier_domain) +- + sysnet_read_config(courier_domain) + + userdom_dontaudit_use_unpriv_user_fds(courier_domain) +@@ -76,6 +71,10 @@ optional_policy(` + seutil_sigchld_newrole(courier_domain) + ') + ++optional_policy(` ++ mysql_stream_connect(courier_domain) ++') ++ + optional_policy(` + udev_read_db(courier_domain) + ') +@@ -91,6 +90,7 @@ allow courier_authdaemon_t self:unix_stream_socket { accept connectto listen }; + create_dirs_pattern(courier_authdaemon_t, courier_var_lib_t, courier_var_lib_t) + manage_sock_files_pattern(courier_authdaemon_t, courier_var_lib_t, courier_var_lib_t) + ++manage_files_pattern(courier_authdaemon_t, courier_spool_t, courier_spool_t) + manage_sock_files_pattern(courier_authdaemon_t, courier_spool_t, courier_spool_t) + + allow courier_authdaemon_t courier_tcpd_t:process sigchld; +@@ -112,7 +112,6 @@ auth_domtrans_chk_passwd(courier_authdaemon_t) + + libs_read_lib_files(courier_authdaemon_t) + +-miscfiles_read_localization(courier_authdaemon_t) + + userdom_dontaudit_search_user_home_dirs(courier_authdaemon_t) + +@@ -135,7 +134,7 @@ allow courier_pop_t courier_authdaemon_t:process sigchld; + + allow courier_pop_t courier_tcpd_t:{ unix_stream_socket tcp_socket } rw_stream_socket_perms; + +-allow courier_pop_t courier_var_lib_t:file { read write }; ++allow courier_pop_t courier_var_lib_t:file rw_inherited_file_perms; + + domtrans_pattern(courier_pop_t, courier_authdaemon_exec_t, courier_authdaemon_t) + +@@ -172,7 +171,6 @@ corenet_tcp_sendrecv_pop_port(courier_tcpd_t) + dev_read_rand(courier_tcpd_t) + dev_read_urand(courier_tcpd_t) + +-miscfiles_read_localization(courier_tcpd_t) + + ######################################## + # +diff --git a/cpucontrol.te b/cpucontrol.te +index af72c4e55c..afab0367f2 100644 +--- a/cpucontrol.te ++++ b/cpucontrol.te +@@ -42,8 +42,6 @@ term_dontaudit_use_console(cpucontrol_domain) + init_use_fds(cpucontrol_domain) + init_use_script_ptys(cpucontrol_domain) + +-logging_send_syslog_msg(cpucontrol_domain) +- + userdom_dontaudit_use_unpriv_user_fds(cpucontrol_domain) + + optional_policy(` +@@ -69,12 +67,13 @@ allow cpucontrol_t cpucontrol_conf_t:dir list_dir_perms; + read_files_pattern(cpucontrol_t, cpucontrol_conf_t, cpucontrol_conf_t) + read_lnk_files_pattern(cpucontrol_t, cpucontrol_conf_t, cpucontrol_conf_t) + +-kernel_list_proc(cpucontrol_t) + kernel_read_proc_symlinks(cpucontrol_t) + + dev_read_sysfs(cpucontrol_t) + dev_rw_cpu_microcode(cpucontrol_t) + ++logging_send_syslog_msg(cpucontrol_t) ++ + optional_policy(` + rhgb_use_ptys(cpucontrol_t) + ') +@@ -98,7 +97,6 @@ dev_rw_sysfs(cpuspeed_t) + + domain_read_all_domains_state(cpuspeed_t) + +-files_read_etc_files(cpuspeed_t) + files_read_etc_runtime_files(cpuspeed_t) + +-miscfiles_read_localization(cpuspeed_t) ++logging_send_syslog_msg(cpuspeed_t) +diff --git a/cpufreqselector.te b/cpufreqselector.te +index 6cedb87247..530e250e50 100644 +--- a/cpufreqselector.te ++++ b/cpufreqselector.te +@@ -14,21 +14,17 @@ init_daemon_domain(cpufreqselector_t, cpufreqselector_exec_t) + # Local policy + # + +-allow cpufreqselector_t self:capability { sys_nice sys_ptrace }; ++allow cpufreqselector_t self:capability sys_nice; + allow cpufreqselector_t self:process getsched; + allow cpufreqselector_t self:fifo_file rw_fifo_file_perms; ++allow cpufreqselector_t self:process getsched; + + kernel_read_system_state(cpufreqselector_t) + +-files_read_etc_files(cpufreqselector_t) +-files_read_usr_files(cpufreqselector_t) +- + dev_rw_sysfs(cpufreqselector_t) + +-miscfiles_read_localization(cpufreqselector_t) +- + userdom_read_all_users_state(cpufreqselector_t) +-userdom_dontaudit_search_user_home_dirs(cpufreqselector_t) ++userdom_dontaudit_search_admin_dir(cpufreqselector_t) + + optional_policy(` + dbus_system_domain(cpufreqselector_t, cpufreqselector_exec_t) +@@ -51,3 +47,7 @@ optional_policy(` + policykit_read_lib(cpufreqselector_t) + policykit_read_reload(cpufreqselector_t) + ') ++ ++optional_policy(` ++ xserver_dbus_chat_xdm(cpufreqselector_t) ++') +diff --git a/cpuplug.fc b/cpuplug.fc +new file mode 100644 +index 0000000000..be203ff492 +--- /dev/null ++++ b/cpuplug.fc +@@ -0,0 +1,3 @@ ++/etc/rc.d/init.d/cpuplugd -- gen_context(system_u:object_r:cpuplug_initrc_exec_t,s0) ++ ++/usr/sbin/cpuplugd -- gen_context(system_u:object_r:cpuplug_exec_t,s0) +diff --git a/cpuplug.if b/cpuplug.if +new file mode 100644 +index 0000000000..c68d1d3cfb +--- /dev/null ++++ b/cpuplug.if +@@ -0,0 +1,20 @@ ++## cpuplugd - Linux on System z CPU and memory hotplug daemon ++ ++######################################## ++## ++## Execute cpuplug in the cpuplug domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cpuplug_domtrans',` ++ gen_require(` ++ type cpuplug_t, cpuplug_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, cpuplug_exec_t, cpuplug_t) ++') +diff --git a/cpuplug.te b/cpuplug.te +new file mode 100644 +index 0000000000..074f3e04de +--- /dev/null ++++ b/cpuplug.te +@@ -0,0 +1,40 @@ ++policy_module(cpuplug, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type cpuplug_t; ++type cpuplug_exec_t; ++init_daemon_domain(cpuplug_t, cpuplug_exec_t) ++ ++type cpuplug_initrc_exec_t; ++init_script_file(cpuplug_initrc_exec_t) ++ ++type cpuplug_lock_t; ++files_lock_file(cpuplug_lock_t) ++ ++type cpuplug_var_run_t; ++files_pid_file(cpuplug_var_run_t) ++ ++######################################## ++# ++# cpuplug local policy ++# ++allow cpuplug_t self:fifo_file rw_fifo_file_perms; ++allow cpuplug_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_files_pattern(cpuplug_t, cpuplug_lock_t, cpuplug_lock_t) ++files_lock_filetrans(cpuplug_t, cpuplug_lock_t, { file }) ++ ++manage_files_pattern(cpuplug_t, cpuplug_var_run_t, cpuplug_var_run_t) ++files_pid_filetrans(cpuplug_t, cpuplug_var_run_t, { file }) ++ ++kernel_read_system_state(cpuplug_t) ++kernel_rw_vm_sysctls(cpuplug_t) ++ ++dev_rw_sysfs(cpuplug_t) ++ ++logging_send_syslog_msg(cpuplug_t) ++ +diff --git a/cron.fc b/cron.fc +index ad0bae948b..18a4dd4156 100644 +--- a/cron.fc ++++ b/cron.fc +@@ -1,66 +1,77 @@ +-/etc/rc\.d/init\.d/(anacron|atd) -- gen_context(system_u:object_r:crond_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/atd -- gen_context(system_u:object_r:crond_initrc_exec_t,s0) + +-/etc/cron\.d(/.*)? gen_context(system_u:object_r:system_cron_spool_t,s0) +-/etc/crontab -- gen_context(system_u:object_r:system_cron_spool_t,s0) ++/etc/cron\.d(/.*)? gen_context(system_u:object_r:system_cron_spool_t,s0) ++/etc/crontab -- gen_context(system_u:object_r:system_cron_spool_t,s0) + +-/usr/bin/at -- gen_context(system_u:object_r:crontab_exec_t,s0) +-/usr/bin/(f)?crontab -- gen_context(system_u:object_r:crontab_exec_t,s0) ++/usr/lib/systemd/system/atd.* -- gen_context(system_u:object_r:crond_unit_file_t,s0) ++/usr/lib/systemd/system/crond.* -- gen_context(system_u:object_r:crond_unit_file_t,s0) + +-/usr/libexec/fcron -- gen_context(system_u:object_r:crond_exec_t,s0) +-/usr/libexec/fcronsighup -- gen_context(system_u:object_r:crontab_exec_t,s0) ++/usr/bin/at -- gen_context(system_u:object_r:crontab_exec_t,s0) ++/usr/bin/(f)?crontab -- gen_context(system_u:object_r:crontab_exec_t,s0) + +-/usr/sbin/anacron -- gen_context(system_u:object_r:anacron_exec_t,s0) +-/usr/sbin/atd -- gen_context(system_u:object_r:crond_exec_t,s0) +-/usr/sbin/cron(d)? -- gen_context(system_u:object_r:crond_exec_t,s0) +-/usr/sbin/fcron -- gen_context(system_u:object_r:crond_exec_t,s0) +-/usr/sbin/fcronsighup -- gen_context(system_u:object_r:crontab_exec_t,s0) ++/usr/libexec/fcron -- gen_context(system_u:object_r:crond_exec_t,s0) ++/usr/libexec/fcronsighup -- gen_context(system_u:object_r:crontab_exec_t,s0) + +-/var/lib/glpi/files(/.*)? gen_context(system_u:object_r:cron_var_lib_t,s0) ++/usr/sbin/anacron -- gen_context(system_u:object_r:anacron_exec_t,s0) ++/usr/sbin/atd -- gen_context(system_u:object_r:crond_exec_t,s0) ++/usr/sbin/cron(d)? -- gen_context(system_u:object_r:crond_exec_t,s0) ++/usr/sbin/fcron -- gen_context(system_u:object_r:crond_exec_t,s0) ++/usr/sbin/fcronsighup -- gen_context(system_u:object_r:crontab_exec_t,s0) + +-/var/log/cron.* gen_context(system_u:object_r:cron_log_t,s0) +-/var/log/rpmpkgs.* -- gen_context(system_u:object_r:cron_log_t,s0) ++/var/log/cron.* gen_context(system_u:object_r:cron_log_t,s0) ++/var/log/rpmpkgs.* -- gen_context(system_u:object_r:cron_log_t,s0) + +-/var/run/anacron\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/atd\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/cron(d)?\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/cron(d)?\.reboot -- gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/fcron\.fifo -s gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/fcron\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) +-/var/run/.*cron.* -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/anacron\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/atd\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/crond?\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/crond?\.reboot -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/fcron\.fifo -s gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/fcron\.pid -- gen_context(system_u:object_r:crond_var_run_t,s0) ++/var/run/.*cron.* -- gen_context(system_u:object_r:crond_var_run_t,s0) + +-/var/spool/anacron(/.*)? gen_context(system_u:object_r:system_cron_spool_t,s0) +-/var/spool/at(/.*)? gen_context(system_u:object_r:user_cron_spool_t,s0) +-/var/spool/at/atspool(/.*)? gen_context(system_u:object_r:user_cron_spool_log_t,s0) ++/var/spool/anacron(/.*)? gen_context(system_u:object_r:system_cron_spool_t,s0) ++/var/spool/at(/.*)? gen_context(system_u:object_r:user_cron_spool_t,s0) + +-/var/spool/cron -d gen_context(system_u:object_r:cron_spool_t,s0) +-#/var/spool/cron/root -- gen_context(system_u:object_r:sysadm_cron_spool_t,s0) +-/var/spool/cron/[^/]* -- <> ++/var/spool/cron -d gen_context(system_u:object_r:user_cron_spool_t,s0) ++#/var/spool/cron/root -- gen_context(system_u:object_r:sysadm_cron_spool_t,s0) ++/var/spool/cron/USER -- gen_context(system_u:object_r:user_cron_spool_t,s0) + +-/var/spool/cron/crontabs -d gen_context(system_u:object_r:cron_spool_t,s0) ++/var/spool/cron/crontabs -d gen_context(system_u:object_r:cron_spool_t,s0) + /var/spool/cron/crontabs/.* -- <> + #/var/spool/cron/crontabs/root -- gen_context(system_u:object_r:sysadm_cron_spool_t,s0) + +-/var/spool/fcron -d gen_context(system_u:object_r:cron_spool_t,s0) +-/var/spool/fcron/.* <> ++/var/spool/fcron -d gen_context(system_u:object_r:cron_spool_t,s0) ++/var/spool/fcron/.* <> + /var/spool/fcron/systab\.orig -- gen_context(system_u:object_r:system_cron_spool_t,s0) +-/var/spool/fcron/systab -- gen_context(system_u:object_r:system_cron_spool_t,s0) +-/var/spool/fcron/systab\.tmp -- gen_context(system_u:object_r:system_cron_spool_t,s0) ++/var/spool/fcron/systab -- gen_context(system_u:object_r:system_cron_spool_t,s0) + /var/spool/fcron/new\.systab -- gen_context(system_u:object_r:system_cron_spool_t,s0) +-/var/spool/fcron/rm\.systab -- gen_context(system_u:object_r:system_cron_spool_t,s0) ++ ++ifdef(`distro_gentoo',` ++/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) ++/var/spool/cron/lastrun/[^/]* -- <> ++') ++ ++ifdef(`distro_suse', ` ++/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) ++/var/spool/cron/lastrun/[^/]* -- <> ++/var/spool/cron/tabs -d gen_context(system_u:object_r:cron_spool_t,s0) ++') + + ifdef(`distro_debian',` +-/var/spool/cron/atjobs -d gen_context(system_u:object_r:cron_spool_t,s0) ++/var/log/prelink.log.* -- gen_context(system_u:object_r:cron_log_t,s0) ++ ++/var/spool/cron/atjobs -d gen_context(system_u:object_r:cron_spool_t,s0) + /var/spool/cron/atjobs/[^/]* -- <> +-/var/spool/cron/atspool -d gen_context(system_u:object_r:cron_spool_t,s0) ++/var/spool/cron/atspool -d gen_context(system_u:object_r:cron_spool_t,s0) + ') + + ifdef(`distro_gentoo',` +-/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) ++/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) + /var/spool/cron/lastrun/[^/]* -- <> + ') + +-ifdef(`distro_suse',` +-/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) ++ifdef(`distro_suse', ` ++/var/spool/cron/lastrun -d gen_context(system_u:object_r:crond_tmp_t,s0) + /var/spool/cron/lastrun/[^/]* -- <> +-/var/spool/cron/tabs -d gen_context(system_u:object_r:cron_spool_t,s0) ++/var/spool/cron/tabs -d gen_context(system_u:object_r:cron_spool_t,s0) + ') +diff --git a/cron.if b/cron.if +index 1303b3036b..f5bd4aee87 100644 +--- a/cron.if ++++ b/cron.if +@@ -2,11 +2,12 @@ + + ####################################### + ## +-## The template to define a crontab domain. ++## The common rules for a crontab domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## The prefix of the user domain (e.g., user ++## is the prefix for user_t). + ## + ## + # +@@ -36,22 +37,29 @@ template(`cron_common_crontab_template',` + manage_files_pattern($1_t, $1_tmp_t, $1_tmp_t) + files_tmp_filetrans($1_t, $1_tmp_t, { dir file }) + ++ kernel_read_system_state($1_t) ++ + auth_domtrans_chk_passwd($1_t) + auth_use_nsswitch($1_t) ++ ++ logging_send_syslog_msg($1_t) ++ ++ userdom_home_reader($1_t) ++ + ') + + ######################################## + ## +-## Role access for cron. ++## Role access for cron + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + ## +@@ -60,56 +68,66 @@ interface(`cron_role',` + gen_require(` + type cronjob_t, crontab_t, crontab_exec_t; + type user_cron_spool_t, crond_t; +- bool cron_userdomain_transition; ++ bool cron_userdomain_transition; + ') + +- ############################## +- # +- # Declarations +- # ++ ############################## ++ # ++ # Declarations ++ # + + role $1 types { cronjob_t crontab_t }; + +- ############################## +- # +- # Local policy +- # ++ ############################## ++ # ++ # Local policy ++ # + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, crontab_exec_t, crontab_t) + + dontaudit crond_t $2:process { noatsecure siginh rlimitinh }; + allow $2 crond_t:process sigchld; + +- allow $2 user_cron_spool_t:file { getattr read write ioctl }; ++ allow $2 user_cron_spool_t:file { getattr read write ioctl }; + +- allow $2 crontab_t:process { ptrace signal_perms }; ++ # crontab shows up in user ps ++ allow $2 crontab_t:process signal_perms; + ps_process_pattern($2, crontab_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 crontab_t:process ptrace; ++ ') ++ ++ # Run helper programs as the user domain ++ #corecmd_bin_domtrans(crontab_t, $2) ++ #corecmd_shell_domtrans(crontab_t, $2) + corecmd_exec_bin(crontab_t) + corecmd_exec_shell(crontab_t) + +- tunable_policy(`cron_userdomain_transition',` +- allow crond_t $2:process transition; +- allow crond_t $2:fd use; +- allow crond_t $2:key manage_key_perms; ++ tunable_policy(`cron_userdomain_transition',` ++ allow crond_t $2:process transition; ++ allow crond_t $2:fd use; ++ allow crond_t $2:key manage_key_perms; + +- allow $2 user_cron_spool_t:file entrypoint; ++ # needs to be authorized SELinux context for cron ++ allow $2 user_cron_spool_t:file entrypoint; ++ allow $2 crond_t:fifo_file rw_fifo_file_perms; + +- allow $2 crond_t:fifo_file rw_fifo_file_perms; ++ allow $2 cronjob_t:process { signal_perms }; + +- allow $2 cronjob_t:process { ptrace signal_perms }; +- ps_process_pattern($2, cronjob_t) +- ',` +- dontaudit crond_t $2:process transition; +- dontaudit crond_t $2:fd use; +- dontaudit crond_t $2:key manage_key_perms; ++ ps_process_pattern($2, cronjob_t) ++ ',` ++ dontaudit crond_t $2:process transition; ++ dontaudit crond_t $2:fd use; ++ dontaudit crond_t $2:key manage_key_perms; + +- dontaudit $2 user_cron_spool_t:file entrypoint; ++ dontaudit $2 user_cron_spool_t:file entrypoint; + +- dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; ++ dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; + +- dontaudit $2 cronjob_t:process { ptrace signal_perms }; +- ') ++ dontaudit $2 cronjob_t:process { signal_perms }; ++ ') + + optional_policy(` + gen_require(` +@@ -119,78 +137,75 @@ interface(`cron_role',` + dbus_stub(cronjob_t) + + allow cronjob_t $2:dbus send_msg; +- ') ++ ') + ') + + ######################################## + ## +-## Role access for unconfined cron. ++## Role access for unconfined cronjobs + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## ++## + # + interface(`cron_unconfined_role',` + gen_require(` + type unconfined_cronjob_t, crontab_t, crontab_exec_t; +- type crond_t, user_cron_spool_t; +- bool cron_userdomain_transition; ++ type crond_t, user_cron_spool_t; ++ bool cron_userdomain_transition; + ') + +- ############################## +- # +- # Declarations +- # +- +- role $1 types { unconfined_cronjob_t crontab_t }; +- +- ############################## +- # +- # Local policy +- # +- +- domtrans_pattern($2, crontab_exec_t, crontab_t) ++ ############################## ++ # ++ # Declarations ++ # ++ ++ role $1 types unconfined_cronjob_t; + +- dontaudit crond_t $2:process { noatsecure siginh rlimitinh }; +- allow $2 crond_t:process sigchld; ++ ############################## ++ # ++ # Local policy ++ # + +- allow $2 user_cron_spool_t:file { getattr read write ioctl }; ++ dontaudit crond_t $2:process { noatsecure siginh rlimitinh }; + +- allow $2 crontab_t:process { ptrace signal_perms }; +- ps_process_pattern($2, crontab_t) ++ allow $2 crond_t:process sigchld; + +- corecmd_exec_bin(crontab_t) +- corecmd_exec_shell(crontab_t) ++ allow $2 user_cron_spool_t:file { getattr read write ioctl }; + +- tunable_policy(`cron_userdomain_transition',` +- allow crond_t $2:process transition; +- allow crond_t $2:fd use; +- allow crond_t $2:key manage_key_perms; ++ # cronjob shows up in user ps ++ ps_process_pattern($2, unconfined_cronjob_t) ++ allow $2 unconfined_cronjob_t:process signal_perms; + +- allow $2 user_cron_spool_t:file entrypoint; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 unconfined_cronjob_t:process ptrace; ++ ') + +- allow $2 crond_t:fifo_file rw_fifo_file_perms; ++ tunable_policy(`cron_userdomain_transition',` ++ allow crond_t $2:process transition; ++ allow crond_t $2:fd use; ++ allow crond_t $2:key manage_key_perms; + +- allow $2 unconfined_cronjob_t:process { ptrace signal_perms }; +- ps_process_pattern($2, unconfined_cronjob_t) +- ',` +- dontaudit crond_t $2:process transition; +- dontaudit crond_t $2:fd use; +- dontaudit crond_t $2:key manage_key_perms; ++ allow $2 user_cron_spool_t:file entrypoint; + +- dontaudit $2 user_cron_spool_t:file entrypoint; ++ allow $2 crond_t:fifo_file rw_fifo_file_perms; ++ ',` ++ dontaudit crond_t $2:process transition; ++ dontaudit crond_t $2:fd use; ++ dontaudit crond_t $2:key manage_key_perms; + +- dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; ++ dontaudit $2 user_cron_spool_t:file entrypoint; + +- dontaudit $2 unconfined_cronjob_t:process { ptrace signal_perms }; +-') ++ dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; ++ ') + + optional_policy(` + gen_require(` +@@ -198,55 +213,60 @@ interface(`cron_unconfined_role',` + ') + + dbus_stub(unconfined_cronjob_t) +- + allow unconfined_cronjob_t $2:dbus send_msg; + ') + ') + + ######################################## + ## +-## Role access for admin cron. ++## Role access for cron + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## ++## + # + interface(`cron_admin_role',` + gen_require(` +- type cronjob_t, crontab_exec_t, admin_crontab_t; ++ type cronjob_t, crontab_exec_t, admin_crontab_t, admin_crontab_tmp_t; ++ type user_cron_spool_t, crond_t; + class passwd crontab; +- type crond_t, user_cron_spool_t; +- bool cron_userdomain_transition; ++ bool cron_userdomain_transition; + ') + +- ############################## +- # +- # Declarations +- # ++ ############################## ++ # ++ # Declarations ++ # + +- role $1 types { cronjob_t admin_crontab_t }; ++ role $1 types { cronjob_t admin_crontab_t admin_crontab_tmp_t }; + +- ############################## +- # +- # Local policy +- # ++ ############################## ++ # ++ # Local policy ++ # + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, crontab_exec_t, admin_crontab_t) + + dontaudit crond_t $2:process { noatsecure siginh rlimitinh }; +- allow $2 crond_t:process sigchld; + +- allow $2 user_cron_spool_t:file { getattr read write ioctl }; ++ allow $2 crond_t:process sigchld; + +- allow $2 admin_crontab_t:process { ptrace signal_perms }; ++ # crontab shows up in user ps + ps_process_pattern($2, admin_crontab_t) ++ allow $2 admin_crontab_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 admin_crontab_t:process ptrace; ++ ') + + # Manipulate other users crontab. + allow $2 self:passwd crontab; +@@ -254,28 +274,26 @@ interface(`cron_admin_role',` + corecmd_exec_bin(admin_crontab_t) + corecmd_exec_shell(admin_crontab_t) + +- tunable_policy(`cron_userdomain_transition',` +- allow crond_t $2:process transition; +- allow crond_t $2:fd use; +- allow crond_t $2:key manage_key_perms; ++ tunable_policy(`cron_userdomain_transition',` ++ allow crond_t $2:process transition; ++ allow crond_t $2:fd use; ++ allow crond_t $2:key manage_key_perms; + +- allow $2 user_cron_spool_t:file entrypoint; ++ allow $2 user_cron_spool_t:file entrypoint; + +- allow $2 crond_t:fifo_file rw_fifo_file_perms; ++ allow $2 crond_t:fifo_file rw_fifo_file_perms; + +- allow $2 cronjob_t:process { ptrace signal_perms }; +- ps_process_pattern($2, cronjob_t) +- ',` +- dontaudit crond_t $2:process transition; +- dontaudit crond_t $2:fd use; +- dontaudit crond_t $2:key manage_key_perms; ++ allow $2 cronjob_t:process { signal_perms }; ++ ps_process_pattern($2, cronjob_t) ++ ',` ++ dontaudit crond_t $2:process transition; ++ dontaudit crond_t $2:fd use; ++ dontaudit crond_t $2:key manage_key_perms; + +- dontaudit $2 user_cron_spool_t:file entrypoint; +- +- dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; +- +- dontaudit $2 cronjob_t:process { ptrace signal_perms }; +- ') ++ dontaudit $2 user_cron_spool_t:file entrypoint; ++ dontaudit $2 crond_t:fifo_file rw_fifo_file_perms; ++ dontaudit $2 cronjob_t:process { signal_perms }; ++ ') + + optional_policy(` + gen_require(` +@@ -285,13 +303,13 @@ interface(`cron_admin_role',` + dbus_stub(admin_cronjob_t) + + allow cronjob_t $2:dbus send_msg; +- ') ++ ') + ') + + ######################################## + ## +-## Make the specified program domain +-## accessable from the system cron jobs. ++## Make the specified program domain accessable ++## from the system cron jobs. + ## + ## + ## +@@ -307,15 +325,15 @@ interface(`cron_admin_role',` + interface(`cron_system_entry',` + gen_require(` + type crond_t, system_cronjob_t; +- type user_cron_spool_log_t; + ') + +- rw_files_pattern($1, user_cron_spool_log_t, user_cron_spool_log_t) +- + domtrans_pattern(system_cronjob_t, $2, $1) + domtrans_pattern(crond_t, $2, $1) + + role system_r types $1; ++ ++ allow $1 crond_t:fifo_file rw_fifo_file_perms; ++ allow $1 system_cronjob_t:fifo_file rw_fifo_file_perms; + ') + + ######################################## +@@ -333,13 +351,12 @@ interface(`cron_domtrans',` + type system_cronjob_t, crond_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, crond_exec_t, system_cronjob_t) + ') + + ######################################## + ## +-## Execute crond in the caller domain. ++## Execute crond_exec_t + ## + ## + ## +@@ -352,7 +369,6 @@ interface(`cron_exec',` + type crond_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, crond_exec_t) + ') + +@@ -376,7 +392,32 @@ interface(`cron_initrc_domtrans',` + + ######################################## + ## +-## Use crond file descriptors. ++## Execute crond server in the crond domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cron_systemctl',` ++ gen_require(` ++ type crond_unit_file_t; ++ type crond_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 crond_unit_file_t:file read_file_perms; ++ allow $1 crond_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, crond_t) ++') ++ ++######################################## ++## ++## Inherit and use a file descriptor ++## from the cron daemon. + ## + ## + ## +@@ -394,7 +435,7 @@ interface(`cron_use_fds',` + + ######################################## + ## +-## Send child terminated signals to crond. ++## Send a SIGCHLD signal to the cron daemon. + ## + ## + ## +@@ -412,7 +453,7 @@ interface(`cron_sigchld',` + + ######################################## + ## +-## Set the attributes of cron log files. ++## Send a generic signal to cron daemon. + ## + ## + ## +@@ -420,17 +461,17 @@ interface(`cron_sigchld',` + ## + ## + # +-interface(`cron_setattr_log_files',` ++interface(`cron_signal',` + gen_require(` +- type cron_log_t; ++ type crond_t; + ') + +- allow $1 cron_log_t:file setattr_file_perms; ++ allow $1 crond_t:process signal; + ') + + ######################################## + ## +-## Create cron log files. ++## Read a cron daemon unnamed pipe. + ## + ## + ## +@@ -438,17 +479,17 @@ interface(`cron_setattr_log_files',` + ## + ## + # +-interface(`cron_create_log_files',` ++interface(`cron_read_pipes',` + gen_require(` +- type cron_log_t; ++ type crond_t; + ') + +- create_files_pattern($1, cron_log_t, cron_log_t) ++ allow $1 crond_t:fifo_file read_fifo_file_perms; + ') + + ######################################## + ## +-## Write to cron log files. ++## Read crond state files. + ## + ## + ## +@@ -456,18 +497,20 @@ interface(`cron_create_log_files',` + ## + ## + # +-interface(`cron_write_log_files',` ++interface(`cron_read_state_crond',` + gen_require(` +- type cron_log_t; ++ type crond_t; + ') + +- allow $1 cron_log_t:file write_file_perms; ++ kernel_search_proc($1) ++ ps_process_pattern($1, crond_t) + ') + ++ + ######################################## + ## +-## Create, read, write and delete +-## cron log files. ++## Send and receive messages from ++## crond over dbus. + ## + ## + ## +@@ -475,48 +518,37 @@ interface(`cron_write_log_files',` + ## + ## + # +-interface(`cron_manage_log_files',` ++interface(`cron_dbus_chat_crond',` + gen_require(` +- type cron_log_t; ++ type crond_t; ++ class dbus send_msg; + ') + +- manage_files_pattern($1, cron_log_t, cron_log_t) +- +- logging_search_logs($1) ++ allow $1 crond_t:dbus send_msg; ++ allow crond_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Create specified objects in generic +-## log directories with the cron log file type. ++## Do not audit attempts to write cron daemon unnamed pipes. + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`cron_generic_log_filetrans_log',` ++interface(`cron_dontaudit_write_pipes',` + gen_require(` +- type cron_log_t; ++ type crond_t; + ') + +- logging_log_filetrans($1, cron_log_t, $2, $3) ++ dontaudit $1 crond_t:fifo_file write; + ') + + ######################################## + ## +-## Read cron daemon unnamed pipes. ++## Read and write a cron daemon unnamed pipe. + ## + ## + ## +@@ -524,18 +556,17 @@ interface(`cron_generic_log_filetrans_log',` + ## + ## + # +-interface(`cron_read_pipes',` ++interface(`cron_rw_pipes',` + gen_require(` + type crond_t; + ') + +- allow $1 crond_t:fifo_file read_fifo_file_perms; ++ allow $1 crond_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to write +-## cron daemon unnamed pipes. ++## Do not audit attempts to setattr cron daemon unnamed pipes. + ## + ## + ## +@@ -543,17 +574,17 @@ interface(`cron_read_pipes',` + ## + ## + # +-interface(`cron_dontaudit_write_pipes',` ++interface(`cron_dontaudit_setattr_pipes',` + gen_require(` + type crond_t; + ') + +- dontaudit $1 crond_t:fifo_file write; ++ dontaudit $1 crond_t:fifo_file setattr; + ') + + ######################################## + ## +-## Read and write crond unnamed pipes. ++## Read and write inherited user spool files. + ## + ## + ## +@@ -561,17 +592,35 @@ interface(`cron_dontaudit_write_pipes',` + ## + ## + # +-interface(`cron_rw_pipes',` ++interface(`cron_rw_inherited_user_spool_files',` + gen_require(` +- type crond_t; ++ type user_cron_spool_t; + ') + +- allow $1 crond_t:fifo_file rw_fifo_file_perms; ++ allow $1 user_cron_spool_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Read and write crond TCP sockets. ++## Read and write inherited spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cron_rw_inherited_spool_files',` ++ gen_require(` ++ type cron_spool_t; ++ ') ++ ++ allow $1 cron_spool_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Read, and write cron daemon TCP sockets. + ## + ## + ## +@@ -589,8 +638,7 @@ interface(`cron_rw_tcp_sockets',` + + ######################################## + ## +-## Do not audit attempts to read and +-## write cron daemon TCP sockets. ++## Dontaudit Read, and write cron daemon TCP sockets. + ## + ## + ## +@@ -608,7 +656,7 @@ interface(`cron_dontaudit_rw_tcp_sockets',` + + ######################################## + ## +-## Search cron spool directories. ++## Search the directory containing user cron tables. + ## + ## + ## +@@ -627,8 +675,7 @@ interface(`cron_search_spool',` + + ######################################## + ## +-## Create, read, write, and delete +-## crond pid files. ++## Search the directory containing user cron tables. + ## + ## + ## +@@ -636,37 +683,37 @@ interface(`cron_search_spool',` + ## + ## + # +-interface(`cron_manage_pid_files',` ++interface(`cron_manage_system_spool',` + gen_require(` +- type crond_var_run_t; ++ type cron_system_spool_t; + ') + +- manage_files_pattern($1, crond_var_run_t, crond_var_run_t) ++ files_search_spool($1) ++ manage_files_pattern($1, cron_system_spool_t, cron_system_spool_t) + ') + + ######################################## + ## +-## Execute anacron in the cron +-## system domain. ++## Manage pid files used by cron + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`cron_anacron_domtrans_system_job',` ++interface(`cron_manage_pid_files',` + gen_require(` +- type system_cronjob_t, anacron_exec_t; ++ type crond_var_run_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, anacron_exec_t, system_cronjob_t) ++ files_search_pids($1) ++ manage_files_pattern($1, crond_var_run_t, crond_var_run_t) + ') + + ######################################## + ## +-## Use system cron job file descriptors. ++## Read pid files used by cron + ## + ## + ## +@@ -674,37 +721,37 @@ interface(`cron_anacron_domtrans_system_job',` + ## + ## + # +-interface(`cron_use_system_job_fds',` ++interface(`cron_read_pid_files',` + gen_require(` +- type system_cronjob_t; ++ type crond_var_run_t; + ') + +- allow $1 system_cronjob_t:fd use; ++ files_search_pids($1) ++ read_files_pattern($1, crond_var_run_t, crond_var_run_t) + ') + + ######################################## + ## +-## Read system cron job lib files. ++## Execute anacron in the cron system domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`cron_read_system_job_lib_files',` ++interface(`cron_anacron_domtrans_system_job',` + gen_require(` +- type system_cronjob_var_lib_t; ++ type system_cronjob_t, anacron_exec_t; + ') + +- files_search_var_lib($1) +- read_files_pattern($1, system_cronjob_var_lib_t, system_cronjob_var_lib_t) ++ domtrans_pattern($1, anacron_exec_t, system_cronjob_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## system cron job lib files. ++## Inherit and use a file descriptor ++## from system cron jobs. + ## + ## + ## +@@ -712,18 +759,17 @@ interface(`cron_read_system_job_lib_files',` + ## + ## + # +-interface(`cron_manage_system_job_lib_files',` ++interface(`cron_use_system_job_fds',` + gen_require(` +- type system_cronjob_var_lib_t; ++ type system_cronjob_t; + ') + +- files_search_var_lib($1) +- manage_files_pattern($1, system_cronjob_var_lib_t, system_cronjob_var_lib_t) ++ allow $1 system_cronjob_t:fd use; + ') + + ######################################## + ## +-## Write system cron job unnamed pipes. ++## Write a system cron job unnamed pipe. + ## + ## + ## +@@ -736,13 +782,12 @@ interface(`cron_write_system_job_pipes',` + type system_cronjob_t; + ') + +- allow $1 system_cronjob_t:file write; ++ allow $1 system_cronjob_t:fifo_file write; + ') + + ######################################## + ## +-## Read and write system cron job +-## unnamed pipes. ++## Read and write a system cron job unnamed pipe. + ## + ## + ## +@@ -755,13 +800,12 @@ interface(`cron_rw_system_job_pipes',` + type system_cronjob_t; + ') + +- allow $1 system_cronjob_t:fifo_file rw_fifo_file_perms; ++ allow $1 system_cronjob_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Read and write inherited system cron +-## job unix domain stream sockets. ++## Allow read/write unix stream sockets from the system cron jobs. + ## + ## + ## +@@ -779,7 +823,7 @@ interface(`cron_rw_system_job_stream_sockets',` + + ######################################## + ## +-## Read system cron job temporary files. ++## Read temporary files from the system cron jobs. + ## + ## + ## +@@ -789,17 +833,20 @@ interface(`cron_rw_system_job_stream_sockets',` + # + interface(`cron_read_system_job_tmp_files',` + gen_require(` +- type system_cronjob_tmp_t; ++ type system_cronjob_tmp_t, cron_var_run_t; + ') + + files_search_tmp($1) + allow $1 system_cronjob_tmp_t:file read_file_perms; ++ ++ files_search_pids($1) ++ allow $1 cron_var_run_t:file read_file_perms; + ') + + ######################################## + ## + ## Do not audit attempts to append temporary +-## system cron job files. ++## files from the system cron jobs. + ## + ## + ## +@@ -818,7 +865,7 @@ interface(`cron_dontaudit_append_system_job_tmp_files',` + ######################################## + ## + ## Do not audit attempts to write temporary +-## system cron job files. ++## files from the system cron jobs. + ## + ## + ## +@@ -829,7 +876,126 @@ interface(`cron_dontaudit_append_system_job_tmp_files',` + interface(`cron_dontaudit_write_system_job_tmp_files',` + gen_require(` + type system_cronjob_tmp_t; ++ type cron_var_run_t; + ') + + dontaudit $1 system_cronjob_tmp_t:file write_file_perms; ++ dontaudit $1 cron_var_run_t:file write_file_perms; ++') ++ ++######################################## ++## ++## Read temporary files from the system cron jobs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cron_read_system_job_lib_files',` ++ gen_require(` ++ type system_cronjob_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, system_cronjob_var_lib_t, system_cronjob_var_lib_t) ++') ++ ++######################################## ++## ++## Manage files from the system cron jobs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cron_manage_system_job_lib_files',` ++ gen_require(` ++ type system_cronjob_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, system_cronjob_var_lib_t, system_cronjob_var_lib_t) ++') ++ ++####################################### ++## ++## Create, read, write and delete ++## cron log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cron_manage_log_files',` ++ gen_require(` ++ type cron_log_t; ++ ') ++ ++ manage_files_pattern($1, cron_log_t, cron_log_t) ++ ++ logging_search_logs($1) ++') ++ ++####################################### ++## ++## Create specified objects in generic ++## log directories with the cron log file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`cron_generic_log_filetrans_log',` ++ gen_require(` ++ type cron_log_t; ++ ') ++ ++ logging_log_filetrans($1, cron_log_t, $2, $3) ++') ++ ++####################################### ++## ++## Create specified objects in generic ++## log directories with the cron log file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`cron_generic_log_filetrans_log_insights',` ++ gen_require(` ++ type var_log_t; ++ ') ++ ++ logging_log_filetrans($1, var_log_t, file, "redhat-access-insights.log") + ') +diff --git a/cron.te b/cron.te +index 7de385956a..b9b2c8f7f8 100644 +--- a/cron.te ++++ b/cron.te +@@ -11,46 +11,54 @@ gen_require(` + + ## + ##

      +-## Determine whether system cron jobs +-## can relabel filesystem for +-## restoring file contexts. ++## Allow system cron jobs to relabel filesystem ++## for restoring file contexts. + ##

      + ##
      + gen_tunable(cron_can_relabel, false) + + ## +-##

      +-## Determine whether crond can execute jobs +-## in the user domain as opposed to the +-## the generic cronjob domain. +-##

      ++##

      ++## Determine whether crond can execute jobs ++## in the user domain as opposed to the ++## the generic cronjob domain. ++##

      ++##
      ++gen_tunable(cron_userdomain_transition, true) ++ ++## ++##

      ++## Allow system cronjob to be executed on ++## on NFS, CIFS or FUSE filesystem. ++##

      + ##
      +-gen_tunable(cron_userdomain_transition, false) ++gen_tunable(cron_system_cronjob_use_shares, false) + + ## + ##

      +-## Determine whether extra rules +-## should be enabled to support fcron. ++## Enable extra rules in the cron domain ++## to support fcron. + ##

      + ##
      + gen_tunable(fcron_crond, false) + +-attribute cron_spool_type; + attribute crontab_domain; ++attribute cron_spool_type; + + type anacron_exec_t; + application_executable_file(anacron_exec_t) + + type cron_spool_t; +-files_type(cron_spool_t) +-mta_system_content(cron_spool_t) ++files_spool_file(cron_spool_t) + ++# var/lib files + type cron_var_lib_t; + files_type(cron_var_lib_t) + + type cron_var_run_t; + files_pid_file(cron_var_run_t) + ++# var/log files + type cron_log_t; + logging_log_file(cron_log_t) + +@@ -71,6 +79,9 @@ domain_cron_exemption_source(crond_t) + type crond_initrc_exec_t; + init_script_file(crond_initrc_exec_t) + ++type crond_unit_file_t; ++systemd_unit_file(crond_unit_file_t) ++ + type crond_tmp_t; + files_tmp_file(crond_tmp_t) + files_poly_parent(crond_tmp_t) +@@ -92,15 +103,17 @@ typealias crontab_t alias { user_crontab_t staff_crontab_t }; + typealias crontab_t alias { auditadm_crontab_t secadm_crontab_t }; + typealias crontab_tmp_t alias { user_crontab_tmp_t staff_crontab_tmp_t }; + typealias crontab_tmp_t alias { auditadm_crontab_tmp_t secadm_crontab_tmp_t }; ++allow admin_crontab_t crond_t:process signal; + + type system_cron_spool_t, cron_spool_type; +-files_type(system_cron_spool_t) +-mta_system_content(system_cron_spool_t) ++files_spool_file(system_cron_spool_t) + + type system_cronjob_t alias system_crond_t; + init_daemon_domain(system_cronjob_t, anacron_exec_t) + corecmd_shell_entry_type(system_cronjob_t) +-domain_entry_file(system_cronjob_t, system_cron_spool_t) ++corecmd_bin_entry_type(system_cronjob_t) ++role system_r types system_cronjob_t; ++domtrans_pattern(crond_t, anacron_exec_t, system_cronjob_t) + + type system_cronjob_lock_t alias system_crond_lock_t; + files_lock_file(system_cronjob_lock_t) +@@ -108,94 +121,34 @@ files_lock_file(system_cronjob_lock_t) + type system_cronjob_tmp_t alias system_crond_tmp_t; + files_tmp_file(system_cronjob_tmp_t) + +-type system_cronjob_var_lib_t; +-files_type(system_cronjob_var_lib_t) +- +-type system_cronjob_var_run_t; +-files_pid_file(system_cronjob_var_run_t) +- ++# Type of user crontabs once moved to cron spool. + type user_cron_spool_t, cron_spool_type; + typealias user_cron_spool_t alias { staff_cron_spool_t sysadm_cron_spool_t unconfined_cron_spool_t }; + typealias user_cron_spool_t alias { auditadm_cron_spool_t secadm_cron_spool_t }; +-files_type(user_cron_spool_t) ++files_spool_file(user_cron_spool_t) + ubac_constrained(user_cron_spool_t) + mta_system_content(user_cron_spool_t) + +-type user_cron_spool_log_t; +-logging_log_file(user_cron_spool_log_t) +-ubac_constrained(user_cron_spool_log_t) +-mta_system_content(user_cron_spool_log_t) ++type system_cronjob_var_lib_t; ++files_type(system_cronjob_var_lib_t) ++typealias system_cronjob_var_lib_t alias system_crond_var_lib_t; ++ ++type system_cronjob_var_run_t; ++files_pid_file(system_cronjob_var_run_t) + + ifdef(`enable_mcs',` + init_ranged_daemon_domain(crond_t, crond_exec_t, s0 - mcs_systemhigh) + ') + +-############################## +-# +-# Common crontab local policy +-# +- +-allow crontab_domain self:capability { fowner setuid setgid chown dac_override }; +-allow crontab_domain self:process { getcap setsched signal_perms }; +-allow crontab_domain self:fifo_file rw_fifo_file_perms; +- +-manage_files_pattern(crontab_domain, { cron_spool_t user_cron_spool_t }, user_cron_spool_t) +-filetrans_pattern(crontab_domain, cron_spool_t, user_cron_spool_t, file) +- +-allow crontab_domain cron_spool_t:dir setattr_dir_perms; +- +-allow crontab_domain crond_t:process signal; +-allow crontab_domain crond_var_run_t:file read_file_perms; +- +-kernel_read_system_state(crontab_domain) +- +-selinux_dontaudit_search_fs(crontab_domain) +- +-files_list_spool(crontab_domain) +-files_read_etc_files(crontab_domain) +-files_read_usr_files(crontab_domain) +-files_search_pids(crontab_domain) +- +-fs_getattr_xattr_fs(crontab_domain) +-fs_manage_cgroup_dirs(crontab_domain) +-fs_rw_cgroup_files(crontab_domain) +- +-domain_use_interactive_fds(crontab_domain) +- +-fs_dontaudit_rw_anon_inodefs_files(crontab_domain) +- +-auth_rw_var_auth(crontab_domain) +- +-logging_send_syslog_msg(crontab_domain) +-logging_send_audit_msgs(crontab_domain) +-logging_set_loginuid(crontab_domain) +- +-init_dontaudit_write_utmp(crontab_domain) +-init_read_utmp(crontab_domain) +-init_read_state(crontab_domain) +- +-miscfiles_read_localization(crontab_domain) +- +-seutil_read_config(crontab_domain) +- +-userdom_manage_user_tmp_dirs(crontab_domain) +-userdom_manage_user_tmp_files(crontab_domain) +-userdom_use_user_terminals(crontab_domain) +-userdom_read_user_home_content_files(crontab_domain) +-userdom_read_user_home_content_symlinks(crontab_domain) +- +-tunable_policy(`fcron_crond',` +- dontaudit crontab_domain crond_t:process signal; +-') +- + ######################################## + # +-# Admin local policy ++# Admin crontab local policy + # + +-allow admin_crontab_t self:capability fsetid; +-allow admin_crontab_t crond_t:process signal; ++# Allow our crontab domain to unlink a user cron spool file. ++allow admin_crontab_t user_cron_spool_t:file { read_file_perms delete_file_perms }; + ++# Manipulate other users crontab. + selinux_get_fs_mount(admin_crontab_t) + selinux_validate_context(admin_crontab_t) + selinux_compute_access_vector(admin_crontab_t) +@@ -204,22 +157,26 @@ selinux_compute_relabel_context(admin_crontab_t) + selinux_compute_user_contexts(admin_crontab_t) + + tunable_policy(`fcron_crond',` ++ # fcron wants an instant update of a crontab change for the administrator ++ # also crontab does a security check for crontab -u + allow admin_crontab_t self:process setfscreate; + ') + + ######################################## + # +-# Daemon local policy ++# Cron daemon local policy + # + + allow crond_t self:capability { dac_override chown fowner setgid setuid sys_nice dac_read_search }; +-dontaudit crond_t self:capability { sys_resource sys_tty_config }; ++dontaudit crond_t self:capability { net_admin sys_resource sys_tty_config }; + allow crond_t self:process ~{ ptrace setcurrent setexec setfscreate execmem execstack execheap }; + allow crond_t self:process { setexec setfscreate }; + allow crond_t self:fd use; + allow crond_t self:fifo_file rw_fifo_file_perms; ++allow crond_t self:unix_dgram_socket create_socket_perms; ++allow crond_t self:unix_stream_socket create_stream_socket_perms; + allow crond_t self:unix_dgram_socket sendto; +-allow crond_t self:unix_stream_socket { accept connectto listen }; ++allow crond_t self:unix_stream_socket connectto; + allow crond_t self:shm create_shm_perms; + allow crond_t self:sem create_sem_perms; + allow crond_t self:msgq create_msgq_perms; +@@ -227,7 +184,7 @@ allow crond_t self:msg { send receive }; + allow crond_t self:key { search write link }; + dontaudit crond_t self:netlink_audit_socket nlmsg_tty_audit; + +-allow crond_t cron_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(crond_t, cron_log_t, cron_log_t) + logging_log_filetrans(crond_t, cron_log_t, file) + + manage_files_pattern(crond_t, crond_var_run_t, crond_var_run_t) +@@ -237,73 +194,68 @@ manage_files_pattern(crond_t, cron_spool_t, cron_spool_t) + + manage_dirs_pattern(crond_t, crond_tmp_t, crond_tmp_t) + manage_files_pattern(crond_t, crond_tmp_t, crond_tmp_t) +-files_tmp_filetrans(crond_t, crond_tmp_t, { dir file }) ++files_tmp_filetrans(crond_t, crond_tmp_t, { file dir }) + + list_dirs_pattern(crond_t, system_cron_spool_t, system_cron_spool_t) + read_files_pattern(crond_t, system_cron_spool_t, system_cron_spool_t) + +-rw_dirs_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) +-manage_files_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) +-manage_lnk_files_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) +- +-manage_files_pattern(crond_t, user_cron_spool_log_t, user_cron_spool_log_t) ++kernel_read_kernel_sysctls(crond_t) ++kernel_read_fs_sysctls(crond_t) ++kernel_search_key(crond_t) + +-allow crond_t system_cronjob_t:process transition; +-allow crond_t system_cronjob_t:fd use; +-allow crond_t system_cronjob_t:key manage_key_perms; ++dev_read_sysfs(crond_t) ++selinux_get_fs_mount(crond_t) ++selinux_validate_context(crond_t) ++selinux_compute_access_vector(crond_t) ++selinux_compute_create_context(crond_t) ++selinux_compute_relabel_context(crond_t) ++selinux_compute_user_contexts(crond_t) + +-dontaudit crond_t { cronjob_t system_cronjob_t }:process { noatsecure siginh rlimitinh }; ++dev_read_urand(crond_t) + +-domtrans_pattern(crond_t, anacron_exec_t, system_cronjob_t) ++fs_getattr_all_fs(crond_t) ++fs_search_auto_mountpoints(crond_t) ++fs_list_inotifyfs(crond_t) + +-kernel_read_kernel_sysctls(crond_t) +-kernel_read_fs_sysctls(crond_t) +-kernel_search_key(crond_t) ++# need auth_chkpwd to check for locked accounts. ++auth_domtrans_chk_passwd(crond_t) ++auth_manage_var_auth(crond_t) + + corecmd_exec_shell(crond_t) +-corecmd_exec_bin(crond_t) + corecmd_list_bin(crond_t) +- +-dev_read_sysfs(crond_t) +-dev_read_urand(crond_t) ++corecmd_exec_bin(crond_t) ++corecmd_read_bin_symlinks(crond_t) + + domain_use_interactive_fds(crond_t) + domain_subj_id_change_exemption(crond_t) + domain_role_change_exemption(crond_t) + +-fs_getattr_all_fs(crond_t) +-fs_list_inotifyfs(crond_t) +-fs_manage_cgroup_dirs(crond_t) +-fs_rw_cgroup_files(crond_t) +-fs_search_auto_mountpoints(crond_t) +- +-files_read_usr_files(crond_t) + files_read_etc_runtime_files(crond_t) + files_read_generic_spool(crond_t) + files_list_usr(crond_t) ++# Read from /var/spool/cron. + files_search_var_lib(crond_t) + files_search_default(crond_t) + files_read_all_locks(crond_t) + +-mls_fd_share_all_levels(crond_t) ++fs_manage_cgroup_dirs(crond_t) ++fs_manage_cgroup_files(crond_t) ++ ++# needed by "crontab -e" + mls_file_read_all_levels(crond_t) + mls_file_write_all_levels(crond_t) ++ ++# needed because of kernel check of transition + mls_process_set_level(crond_t) +-mls_trusted_object(crond_t) + +-selinux_get_fs_mount(crond_t) +-selinux_validate_context(crond_t) +-selinux_compute_access_vector(crond_t) +-selinux_compute_create_context(crond_t) +-selinux_compute_relabel_context(crond_t) +-selinux_compute_user_contexts(crond_t) ++# to make cronjob working ++mls_fd_share_all_levels(crond_t) ++mls_trusted_object(crond_t) + + init_read_state(crond_t) + init_rw_utmp(crond_t) + init_spec_domtrans_script(crond_t) + +-auth_domtrans_chk_passwd(crond_t) +-auth_manage_var_auth(crond_t) + auth_use_nsswitch(crond_t) + + logging_send_audit_msgs(crond_t) +@@ -312,41 +264,46 @@ logging_set_loginuid(crond_t) + + seutil_read_config(crond_t) + seutil_read_default_contexts(crond_t) ++seutil_sigchld_newrole(crond_t) + +-miscfiles_read_localization(crond_t) + ++userdom_use_unpriv_users_fds(crond_t) ++# Not sure why this is needed + userdom_list_user_home_dirs(crond_t) ++userdom_list_admin_dir(crond_t) ++userdom_manage_all_users_keys(crond_t) + +-tunable_policy(`cron_userdomain_transition',` +- dontaudit crond_t cronjob_t:process transition; +- dontaudit crond_t cronjob_t:fd use; +- dontaudit crond_t cronjob_t:key manage_key_perms; +-',` +- allow crond_t cronjob_t:process transition; +- allow crond_t cronjob_t:fd use; +- allow crond_t cronjob_t:key manage_key_perms; +-') ++mta_send_mail(crond_t) ++mta_system_content(cron_spool_t) + + ifdef(`distro_debian',` ++ # pam_limits is used + allow crond_t self:process setrlimit; + +- optional_policy(` +- logwatch_search_cache_dir(crond_t) +- ') ++') ++ ++optional_policy(` ++ logwatch_search_cache_dir(crond_t) ++') ++ ++optional_policy(` ++ bind_read_config(crond_t) + ') + + ifdef(`distro_redhat',` ++ # Run the rpm program in the rpm_t domain. Allow creation of RPM log files ++ # via redirection of standard out. + optional_policy(` + rpm_manage_log(crond_t) + ') + ') + +-tunable_policy(`allow_polyinstantiation',` ++tunable_policy(`polyinstantiation_enabled',` + files_polyinstantiate_all(crond_t) + ') + +-tunable_policy(`fcron_crond',` +- allow crond_t { system_cron_spool_t user_cron_spool_t }:file manage_file_perms; ++tunable_policy(`fcron_crond', ` ++ allow crond_t system_cron_spool_t:file manage_file_perms; + ') + + optional_policy(` +@@ -354,103 +311,141 @@ optional_policy(` + ') + + optional_policy(` +- dbus_system_bus_client(crond_t) +- +- optional_policy(` +- hal_dbus_chat(crond_t) +- ') +- +- optional_policy(` +- unconfined_dbus_send(crond_t) +- ') ++ djbdns_search_tinydns_keys(crond_t) ++ djbdns_link_tinydns_keys(crond_t) + ') + + optional_policy(` +- amanda_search_var_lib(crond_t) ++ locallogin_search_keys(crond_t) ++ locallogin_link_keys(crond_t) + ') + + optional_policy(` +- amavis_search_lib(crond_t) ++ # these should probably be unconfined_crond_t ++ dbus_system_bus_client(crond_t) ++ init_dbus_send_script(crond_t) ++ init_dbus_chat(crond_t) + ') + + optional_policy(` +- djbdns_search_tinydns_keys(crond_t) +- djbdns_link_tinydns_keys(crond_t) ++ amanda_search_var_lib(crond_t) + ') + + optional_policy(` +- hal_write_log(crond_t) ++ antivirus_search_db(crond_t) + ') + + optional_policy(` +- locallogin_search_keys(crond_t) +- locallogin_link_keys(crond_t) ++ hal_dbus_chat(crond_t) ++ hal_write_log(crond_t) ++ hal_dbus_chat(system_cronjob_t) + ') + + optional_policy(` +- mta_send_mail(crond_t) ++ # cjp: why? ++ munin_search_lib(crond_t) + ') + + optional_policy(` +- munin_search_lib(crond_t) ++ rpc_search_nfs_state_data(crond_t) + ') + + optional_policy(` +- postgresql_search_db(crond_t) ++ # Commonly used from postinst scripts ++ rpm_read_pipes(crond_t) + ') + + optional_policy(` +- rpc_search_nfs_state_data(crond_t) ++ # allow crond to find /usr/lib/postgresql/bin/do.maintenance ++ postgresql_search_db(crond_t) + ') + + optional_policy(` +- rpm_read_pipes(crond_t) ++ systemd_use_fds_logind(crond_t) ++ systemd_write_inherited_logind_sessions_pipes(crond_t) + ') + + optional_policy(` +- seutil_sigchld_newrole(crond_t) ++ udev_read_db(crond_t) + ') + + optional_policy(` +- udev_read_db(crond_t) ++ vnstatd_search_lib(crond_t) + ') + + ######################################## + # +-# System local policy ++# System cron process domain + # + + allow system_cronjob_t self:capability { dac_override dac_read_search chown setgid setuid fowner net_bind_service fsetid sys_nice }; ++ + allow system_cronjob_t self:process { signal_perms getsched setsched }; + allow system_cronjob_t self:fd use; + allow system_cronjob_t self:fifo_file rw_fifo_file_perms; + allow system_cronjob_t self:passwd rootok; + +-allow system_cronjob_t cron_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++# This is to handle creation of files in /var/log directory. ++# Used currently by rpm script log files ++allow system_cronjob_t cron_log_t:file manage_file_perms; + logging_log_filetrans(system_cronjob_t, cron_log_t, file) + ++# This is to handle /var/lib/misc directory. Used currently ++# by prelink var/lib files for cron + allow system_cronjob_t cron_var_lib_t:file { manage_file_perms relabel_file_perms }; + files_var_lib_filetrans(system_cronjob_t, cron_var_lib_t, file) + + allow system_cronjob_t cron_var_run_t:file manage_file_perms; + files_pid_filetrans(system_cronjob_t, cron_var_run_t, file) + ++allow system_cronjob_t system_cron_spool_t:file read_file_perms; ++ ++# anacron forces the following + manage_files_pattern(system_cronjob_t, system_cron_spool_t, system_cron_spool_t) + ++# The entrypoint interface is not used as this is not ++# a regular entrypoint. Since crontab files are ++# not directly executed, crond must ensure that ++# the crontab file has a type that is appropriate ++# for the domain of the user cron job. It ++# performs an entrypoint permission check ++# for this purpose. ++allow system_cronjob_t system_cron_spool_t:file entrypoint; ++ ++tunable_policy(`cron_system_cronjob_use_shares',` ++ fs_fusefs_entrypoint(system_cronjob_t) ++ fs_nfs_entrypoint(system_cronjob_t) ++ fs_cifs_entrypoint(system_cronjob_t) ++') ++ ++# Permit a transition from the crond_t domain to this domain. ++# The transition is requested explicitly by the modified crond ++# via setexeccon. There is no way to set up an automatic ++# transition, since crontabs are configuration files, not executables. ++allow crond_t system_cronjob_t:process transition; ++dontaudit crond_t system_cronjob_t:process { noatsecure siginh rlimitinh }; ++allow crond_t system_cronjob_t:fd use; ++allow system_cronjob_t crond_t:fd use; ++allow system_cronjob_t crond_t:fifo_file rw_file_perms; ++allow system_cronjob_t crond_t:process sigchld; ++allow crond_t system_cronjob_t:key manage_key_perms; ++ ++# Write /var/lock/makewhatis.lock. + allow system_cronjob_t system_cronjob_lock_t:file manage_file_perms; + files_lock_filetrans(system_cronjob_t, system_cronjob_lock_t, file) + ++# write temporary files ++manage_dirs_pattern(system_cronjob_t, crond_tmp_t, system_cronjob_tmp_t) + manage_files_pattern(system_cronjob_t, crond_tmp_t, system_cronjob_tmp_t) + manage_lnk_files_pattern(system_cronjob_t, crond_tmp_t, system_cronjob_tmp_t) +-filetrans_pattern(system_cronjob_t, crond_tmp_t, system_cronjob_tmp_t, { file lnk_file }) +-files_tmp_filetrans(system_cronjob_t, system_cronjob_tmp_t, file) ++filetrans_pattern(system_cronjob_t, crond_tmp_t, system_cronjob_tmp_t, { dir file lnk_file }) ++files_tmp_filetrans(system_cronjob_t, system_cronjob_tmp_t, { dir file }) + ++# var/lib files for system_crond ++files_search_var_lib(system_cronjob_t) + manage_files_pattern(system_cronjob_t, system_cronjob_var_lib_t, system_cronjob_var_lib_t) + +-allow system_cronjob_t crond_t:fd use; +-allow system_cronjob_t crond_t:fifo_file rw_fifo_file_perms; +-allow system_cronjob_t crond_t:process sigchld; +- ++# Read from /var/spool/cron. + allow system_cronjob_t cron_spool_t:dir list_dir_perms; + allow system_cronjob_t cron_spool_t:file rw_file_perms; + +@@ -461,11 +456,11 @@ kernel_read_network_state(system_cronjob_t) + kernel_read_system_state(system_cronjob_t) + kernel_read_software_raid_state(system_cronjob_t) + ++# ps does not need to access /boot when run from cron + files_dontaudit_search_boot(system_cronjob_t) + + corecmd_exec_all_executables(system_cronjob_t) + +-corenet_all_recvfrom_unlabeled(system_cronjob_t) + corenet_all_recvfrom_netlabel(system_cronjob_t) + corenet_tcp_sendrecv_generic_if(system_cronjob_t) + corenet_udp_sendrecv_generic_if(system_cronjob_t) +@@ -485,6 +480,7 @@ fs_getattr_all_symlinks(system_cronjob_t) + fs_getattr_all_pipes(system_cronjob_t) + fs_getattr_all_sockets(system_cronjob_t) + ++# quiet other ps operations + domain_dontaudit_read_all_domains_state(system_cronjob_t) + + files_exec_etc_files(system_cronjob_t) +@@ -495,17 +491,22 @@ files_getattr_all_files(system_cronjob_t) + files_getattr_all_symlinks(system_cronjob_t) + files_getattr_all_pipes(system_cronjob_t) + files_getattr_all_sockets(system_cronjob_t) +-files_read_usr_files(system_cronjob_t) + files_read_var_files(system_cronjob_t) ++# for nscd: + files_dontaudit_search_pids(system_cronjob_t) ++# Access other spool directories like ++# /var/spool/anacron and /var/spool/slrnpull. + files_manage_generic_spool(system_cronjob_t) + files_create_boot_flag(system_cronjob_t) + + mls_file_read_to_clearance(system_cronjob_t) + + init_domtrans_script(system_cronjob_t) +-init_read_utmp(system_cronjob_t) + init_use_script_fds(system_cronjob_t) ++init_read_utmp(system_cronjob_t) ++init_dontaudit_rw_utmp(system_cronjob_t) ++# prelink tells init to restart it self, we either need to allow or dontaudit ++init_telinit(system_cronjob_t) + + auth_use_nsswitch(system_cronjob_t) + +@@ -516,20 +517,28 @@ logging_read_generic_logs(system_cronjob_t) + logging_send_audit_msgs(system_cronjob_t) + logging_send_syslog_msg(system_cronjob_t) + +-miscfiles_read_localization(system_cronjob_t) ++miscfiles_filetrans_named_content_letsencrypt(system_cronjob_t) + + seutil_read_config(system_cronjob_t) + ++userdom_manage_tmpfs_files(system_cronjob_t, file) ++userdom_tmpfs_filetrans(system_cronjob_t, file) ++ + ifdef(`distro_redhat',` ++ # Run the rpm program in the rpm_t domain. Allow creation of RPM log files ++ allow crond_t system_cron_spool_t:file manage_file_perms; ++ ++ # via redirection of standard out. + optional_policy(` + rpm_manage_log(system_cronjob_t) + ') + ') + ++selinux_get_fs_mount(system_cronjob_t) ++ + tunable_policy(`cron_can_relabel',` + seutil_domtrans_setfiles(system_cronjob_t) + ',` +- selinux_get_fs_mount(system_cronjob_t) + selinux_validate_context(system_cronjob_t) + selinux_compute_access_vector(system_cronjob_t) + selinux_compute_create_context(system_cronjob_t) +@@ -539,10 +548,26 @@ tunable_policy(`cron_can_relabel',` + ') + + optional_policy(` ++ # Needed for certwatch + apache_exec_modules(system_cronjob_t) + apache_read_config(system_cronjob_t) + apache_read_log(system_cronjob_t) + apache_read_sys_content(system_cronjob_t) ++ apache_manage_lib(system_cronjob_t) ++ apache_delete_cache_dirs(system_cronjob_t) ++ apache_delete_cache_files(system_cronjob_t) ++') ++ ++optional_policy(` ++ bind_read_config(system_cronjob_t) ++') ++ ++optional_policy(` ++ cron_generic_log_filetrans_log_insights(system_cronjob_t) ++') ++ ++optional_policy(` ++ chronyd_run_chronyc(system_cronjob_t,system_r) + ') + + optional_policy(` +@@ -551,10 +576,6 @@ optional_policy(` + + optional_policy(` + dbus_system_bus_client(system_cronjob_t) +- +- optional_policy(` +- networkmanager_dbus_chat(system_cronjob_t) +- ') + ') + + optional_policy(` +@@ -566,6 +587,10 @@ optional_policy(` + exim_read_spool_files(system_cronjob_t) + ') + ++optional_policy(` ++ firewalld_dbus_chat(system_cronjob_t) ++') ++ + optional_policy(` + ftp_read_log(system_cronjob_t) + ') +@@ -591,14 +616,39 @@ optional_policy(` + optional_policy(` + mta_read_config(system_cronjob_t) + mta_send_mail(system_cronjob_t) ++ mta_system_content(system_cron_spool_t) + ') + + optional_policy(` + mysql_read_config(system_cronjob_t) + ') + ++optional_policy(` ++ networkmanager_dbus_chat(system_cronjob_t) ++') ++ ++optional_policy(` ++ pcp_filetrans_named_content(system_cronjob_t) ++') ++ + optional_policy(` + postfix_read_config(system_cronjob_t) ++') ++ ++optional_policy(` ++ prelink_delete_cache(system_cronjob_t) ++ prelink_manage_lib(system_cronjob_t) ++ prelink_manage_log(system_cronjob_t) ++ prelink_read_cache(system_cronjob_t) ++ prelink_relabel_lib(system_cronjob_t) ++') ++ ++optional_policy(` ++ rkhunter_manage_lib_files(system_cronjob_t) ++') ++ ++optional_policy(` ++ rhsmcertd_dbus_chat(system_cronjob_t) + ') + + optional_policy(` +@@ -606,8 +656,13 @@ optional_policy(` + samba_read_log(system_cronjob_t) + ') + ++optional_policy(` ++ snapper_dbus_chat(system_cronjob_t) ++') ++ + optional_policy(` + spamassassin_manage_lib_files(system_cronjob_t) ++ spamassassin_manage_home_client(system_cronjob_t) + ') + + optional_policy(` +@@ -615,12 +670,27 @@ optional_policy(` + ') + + optional_policy(` +- userdom_user_home_dir_filetrans_user_home_content(system_cronjob_t, { dir file lnk_file fifo_file sock_file }) ++ systemd_dbus_chat_logind(system_cronjob_t) ++ systemd_dbus_chat_timedated(system_cronjob_t) ++ systemd_dbus_chat_hostnamed(system_cronjob_t) ++ systemd_dbus_chat_localed(system_cronjob_t) ++ systemd_write_inherited_logind_sessions_pipes(system_cronjob_t) ++') ++ ++optional_policy(` ++ unconfined_domain(crond_t) ++ unconfined_domain(system_cronjob_t) ++') ++ ++optional_policy(` ++ unconfined_shell_domtrans(crond_t) ++ unconfined_dbus_send(crond_t) ++ userdom_filetrans_home_content(crond_t) + ') + + ######################################## + # +-# Cronjob local policy ++# User cronjobs local policy + # + + allow cronjob_t self:process { signal_perms setsched }; +@@ -628,12 +698,32 @@ allow cronjob_t self:fifo_file rw_fifo_file_perms; + allow cronjob_t self:unix_stream_socket create_stream_socket_perms; + allow cronjob_t self:unix_dgram_socket create_socket_perms; + ++# The entrypoint interface is not used as this is not ++# a regular entrypoint. Since crontab files are ++# not directly executed, crond must ensure that ++# the crontab file has a type that is appropriate ++# for the domain of the user cron job. It ++# performs an entrypoint permission check ++# for this purpose. ++allow cronjob_t user_cron_spool_t:file entrypoint; ++ ++# Permit a transition from the crond_t domain to this domain. ++# The transition is requested explicitly by the modified crond ++# via setexeccon. There is no way to set up an automatic ++# transition, since crontabs are configuration files, not executables. ++allow crond_t cronjob_t:process transition; ++dontaudit crond_t cronjob_t:process { noatsecure siginh rlimitinh }; ++allow crond_t cronjob_t:fd use; ++allow cronjob_t crond_t:fd use; ++allow cronjob_t crond_t:fifo_file rw_file_perms; ++allow cronjob_t crond_t:process sigchld; ++ + kernel_read_system_state(cronjob_t) + kernel_read_kernel_sysctls(cronjob_t) + ++# ps does not need to access /boot when run from cron + files_dontaudit_search_boot(cronjob_t) + +-corenet_all_recvfrom_unlabeled(cronjob_t) + corenet_all_recvfrom_netlabel(cronjob_t) + corenet_tcp_sendrecv_generic_if(cronjob_t) + corenet_udp_sendrecv_generic_if(cronjob_t) +@@ -641,66 +731,141 @@ corenet_tcp_sendrecv_generic_node(cronjob_t) + corenet_udp_sendrecv_generic_node(cronjob_t) + corenet_tcp_sendrecv_all_ports(cronjob_t) + corenet_udp_sendrecv_all_ports(cronjob_t) +- +-corenet_sendrecv_all_client_packets(cronjob_t) + corenet_tcp_connect_all_ports(cronjob_t) +- +-corecmd_exec_all_executables(cronjob_t) ++corenet_sendrecv_all_client_packets(cronjob_t) + + dev_read_urand(cronjob_t) + + fs_getattr_all_fs(cronjob_t) + ++corecmd_exec_all_executables(cronjob_t) ++ ++# quiet other ps operations + domain_dontaudit_read_all_domains_state(cronjob_t) + domain_dontaudit_getattr_all_domains(cronjob_t) + + files_exec_etc_files(cronjob_t) +-files_read_etc_runtime_files(cronjob_t) +-files_read_var_files(cronjob_t) +-files_read_usr_files(cronjob_t) +-files_search_spool(cronjob_t) ++# for nscd: + files_dontaudit_search_pids(cronjob_t) + + libs_exec_lib_files(cronjob_t) + libs_exec_ld_so(cronjob_t) + ++files_read_etc_runtime_files(cronjob_t) ++files_read_var_files(cronjob_t) ++files_search_spool(cronjob_t) ++ + logging_search_logs(cronjob_t) + + seutil_read_config(cronjob_t) + +-miscfiles_read_localization(cronjob_t) + + userdom_manage_user_tmp_files(cronjob_t) + userdom_manage_user_tmp_symlinks(cronjob_t) + userdom_manage_user_tmp_pipes(cronjob_t) + userdom_manage_user_tmp_sockets(cronjob_t) ++# Run scripts in user home directory and access shared libs. + userdom_exec_user_home_content_files(cronjob_t) ++# Access user files and dirs. + userdom_manage_user_home_content_files(cronjob_t) + userdom_manage_user_home_content_symlinks(cronjob_t) + userdom_manage_user_home_content_pipes(cronjob_t) + userdom_manage_user_home_content_sockets(cronjob_t) + +-tunable_policy(`cron_userdomain_transition',` +- dontaudit cronjob_t crond_t:fd use; +- dontaudit cronjob_t crond_t:fifo_file rw_fifo_file_perms; +- dontaudit cronjob_t crond_t:process sigchld; +- +- dontaudit cronjob_t user_cron_spool_t:file entrypoint; +-',` +- allow cronjob_t crond_t:fd use; +- allow cronjob_t crond_t:fifo_file rw_fifo_file_perms; +- allow cronjob_t crond_t:process sigchld; ++list_dirs_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) ++rw_dirs_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) ++read_files_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) ++read_lnk_files_pattern(crond_t, user_cron_spool_t, user_cron_spool_t) ++allow crond_t user_cron_spool_t:file manage_lnk_file_perms; + +- allow cronjob_t user_cron_spool_t:file entrypoint; ++tunable_policy(`fcron_crond',` ++ allow crond_t user_cron_spool_t:file manage_file_perms; + ') + ++# need a per-role version of this: ++#optional_policy(` ++# mono_domtrans(cronjob_t) ++#') ++ + optional_policy(` + nis_use_ypbind(cronjob_t) + ') + ++############################## ++# ++# crontab common policy ++# ++ ++# dac_override is to create the file in the directory under /tmp ++allow crontab_domain self:capability { fowner setuid setgid chown dac_read_search dac_override }; ++allow crontab_domain self:process { getcap setsched signal_perms }; ++allow crontab_domain self:fifo_file rw_fifo_file_perms; ++ ++allow crontab_domain crond_t:process signal; ++allow crontab_domain crond_var_run_t:file read_file_perms; ++ ++corecmd_exec_bin(crontab_domain) ++corecmd_exec_shell(crontab_domain) ++ ++# create files in /var/spool/cron ++manage_files_pattern(crontab_domain, { cron_spool_t user_cron_spool_t }, user_cron_spool_t) ++filetrans_pattern(crontab_domain, cron_spool_t, user_cron_spool_t, file) ++files_list_spool(crontab_domain) ++ ++# crontab signals crond by updating the mtime on the spooldir ++allow crontab_domain cron_spool_t:dir setattr_dir_perms; ++ ++# for the checks used by crontab -u ++selinux_dontaudit_search_fs(crontab_domain) ++ ++fs_getattr_xattr_fs(crontab_domain) ++fs_manage_cgroup_dirs(crontab_domain) ++fs_manage_cgroup_files(crontab_domain) ++ ++domain_use_interactive_fds(crontab_domain) ++ ++files_dontaudit_search_pids(crontab_domain) ++ ++fs_dontaudit_rw_anon_inodefs_files(crontab_domain) ++ ++auth_rw_var_auth(crontab_domain) ++ ++logging_send_audit_msgs(crontab_domain) ++logging_set_loginuid(crontab_domain) ++ ++init_dontaudit_write_utmp(crontab_domain) ++init_read_utmp(crontab_domain) ++init_read_state(crontab_domain) ++ ++ ++seutil_read_config(crontab_domain) ++ ++userdom_manage_user_tmp_dirs(crontab_domain) ++userdom_manage_user_tmp_files(crontab_domain) ++# Access terminals. ++userdom_use_inherited_user_terminals(crontab_domain) ++# Read user crontabs ++userdom_read_user_home_content_files(crontab_domain) ++userdom_read_user_home_content_symlinks(crontab_domain) ++ ++tunable_policy(`fcron_crond',` ++ # fcron wants an instant update of a crontab change for the administrator ++ # also crontab does a security check for crontab -u ++ dontaudit crontab_domain crond_t:process signal; ++') ++ ++optional_policy(` ++ ssh_dontaudit_use_ptys(crontab_domain) ++') ++ ++optional_policy(` ++ openshift_dontaudit_rw_inherited_fifo_files(crontab_domain) ++ openshift_transition(system_cronjob_t) ++') ++ + ######################################## + # +-# Unconfined local policy ++# Unconfined cronjobs local policy + # + + type unconfined_cronjob_t; +diff --git a/ctdb.fc b/ctdb.fc +index 8401fe6f3b..84ece3e4a7 100644 +--- a/ctdb.fc ++++ b/ctdb.fc +@@ -1,12 +1,20 @@ + /etc/rc\.d/init\.d/ctdb -- gen_context(system_u:object_r:ctdbd_initrc_exec_t,s0) + ++/etc/ctdb/events\.d/.* -- gen_context(system_u:object_r:ctdbd_exec_t,s0) ++ + /usr/sbin/ctdbd -- gen_context(system_u:object_r:ctdbd_exec_t,s0) ++/usr/sbin/ctdbd_wrapper -- gen_context(system_u:object_r:ctdbd_exec_t,s0) ++ ++/var/ctdb(/.*)? gen_context(system_u:object_r:ctdbd_var_t,s0) + ++/var/lib/ctdb(/.*)? gen_context(system_u:object_r:ctdbd_var_lib_t,s0) + /var/lib/ctdbd(/.*)? gen_context(system_u:object_r:ctdbd_var_lib_t,s0) + + /var/log/ctdb\.log.* -- gen_context(system_u:object_r:ctdbd_log_t,s0) + /var/log/log\.ctdb.* -- gen_context(system_u:object_r:ctdbd_log_t,s0) + ++ ++/var/run/ctdb(/.*)? gen_context(system_u:object_r:ctdbd_var_run_t,s0) + /var/run/ctdbd(/.*)? gen_context(system_u:object_r:ctdbd_var_run_t,s0) + + /var/spool/ctdb(/.*)? gen_context(system_u:object_r:ctdbd_spool_t,s0) +diff --git a/ctdb.if b/ctdb.if +index b25b01d12d..06895f39ae 100644 +--- a/ctdb.if ++++ b/ctdb.if +@@ -1,9 +1,178 @@ +-## Clustered Database based on Samba Trivial Database. ++ ++## policy for ctdbd ++ ++######################################## ++## ++## Transition to ctdbd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ctdbd_domtrans',` ++ gen_require(` ++ type ctdbd_t, ctdbd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ctdbd_exec_t, ctdbd_t) ++') ++ ++######################################## ++## ++## Execute ctdbd server in the ctdbd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_initrc_domtrans',` ++ gen_require(` ++ type ctdbd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, ctdbd_initrc_exec_t) ++') ++ ++####################################### ++## ++## Allow domain to signal ctdbd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_signal',` ++ gen_require(` ++ type ctdbd_t; ++ ') ++ allow $1 ctdbd_t:process signal; ++') ++ ++####################################### ++## ++## Allow domain to sigchld ctdbd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_sigchld',` ++ gen_require(` ++ type ctdbd_t; ++ ') ++ allow $1 ctdbd_t:process sigchld; ++') ++ ++######################################## ++## ++## Read ctdbd's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`ctdbd_read_log',` ++ gen_require(` ++ type ctdbd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, ctdbd_log_t, ctdbd_log_t) ++') ++ ++######################################## ++## ++## Append to ctdbd log files. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ctdbd_append_log',` ++ gen_require(` ++ type ctdbd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, ctdbd_log_t, ctdbd_log_t) ++') ++ ++######################################## ++## ++## Manage ctdbd log files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`ctdbd_manage_log',` ++ gen_require(` ++ type ctdbd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, ctdbd_log_t, ctdbd_log_t) ++ manage_files_pattern($1, ctdbd_log_t, ctdbd_log_t) ++ manage_lnk_files_pattern($1, ctdbd_log_t, ctdbd_log_t) ++') ++ ++######################################## ++## ++## Search ctdbd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_search_lib',` ++ gen_require(` ++ type ctdbd_var_lib_t; ++ ') ++ ++ allow $1 ctdbd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read ctdbd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_read_lib_files',` ++ gen_require(` ++ type ctdbd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, ctdbd_var_lib_t, ctdbd_var_lib_t) ++') + + ######################################## + ## +-## Create, read, write, and delete +-## ctdbd lib files. ++## Manage ctdbd lib files. + ## + ## + ## +@@ -17,13 +186,12 @@ interface(`ctdbd_manage_lib_files',` + ') + + files_search_var_lib($1) +- manage_files_pattern($1, ctdbd_var_lib_t, ctdbd_var_lib_t) ++ manage_files_pattern($1, ctdbd_var_lib_t, ctdbd_var_lib_t) + ') + +-####################################### ++######################################## + ## +-## Connect to ctdbd with a unix +-## domain stream socket. ++## Manage ctdbd lib directories. + ## + ## + ## +@@ -31,19 +199,58 @@ interface(`ctdbd_manage_lib_files',` + ## + ## + # +-interface(`ctdbd_stream_connect',` ++interface(`ctdbd_manage_lib_dirs',` ++ gen_require(` ++ type ctdbd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, ctdbd_var_lib_t, ctdbd_var_lib_t) ++') ++ ++######################################## ++## ++## Read ctdbd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_read_pid_files',` + gen_require(` +- type ctdbd_t, ctdbd_var_run_t, ctdbd_tmp_t; ++ type ctdbd_var_run_t; + ') + + files_search_pids($1) +- stream_connect_pattern($1, { ctdbd_tmp_t ctdbd_var_run_t }, { ctdbd_tmp_t ctdbd_var_run_t }, ctdbd_t) ++ allow $1 ctdbd_var_run_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Connect to ctdbd over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ctdbd_stream_connect',` ++ gen_require(` ++ type ctdbd_t, ctdbd_var_run_t, ctdbd_tmp_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, ctdbd_var_run_t, ctdbd_var_run_t, ctdbd_t) ++ stream_connect_pattern($1, ctdbd_tmp_t, ctdbd_tmp_t, ctdbd_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an ctdb environment. ++## All of the rules required to administrate ++## an ctdbd environment + ## + ## + ## +@@ -57,16 +264,19 @@ interface(`ctdbd_stream_connect',` + ## + ## + # +-interface(`ctdb_admin',` ++interface(`ctdbd_admin',` + gen_require(` +- type ctdbd_t, ctdbd_initrc_exec_t, ctdbd_tmp_t; ++ type ctdbd_t, ctdbd_initrc_exec_t; + type ctdbd_log_t, ctdbd_var_lib_t, ctdbd_var_run_t; + ') + +- allow $1 ctdbd_t:process { ptrace signal_perms }; ++ allow $1 ctdbd_t:process signal_perms; + ps_process_pattern($1, ctdbd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ctdbd_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, ctdbd_initrc_exec_t) ++ ctdbd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 ctdbd_initrc_exec_t system_r; + allow $2 system_r; +@@ -74,12 +284,10 @@ interface(`ctdb_admin',` + logging_search_logs($1) + admin_pattern($1, ctdbd_log_t) + +- files_search_tmp($1) +- admin_pattern($1, ctdbd_tmp_t) +- + files_search_var_lib($1) + admin_pattern($1, ctdbd_var_lib_t) + + files_search_pids($1) + admin_pattern($1, ctdbd_var_run_t) + ') ++ +diff --git a/ctdb.te b/ctdb.te +index 001b502e6f..1b73c4d799 100644 +--- a/ctdb.te ++++ b/ctdb.te +@@ -24,6 +24,9 @@ files_tmp_file(ctdbd_tmp_t) + type ctdbd_var_lib_t; + files_type(ctdbd_var_lib_t) + ++type ctdbd_var_t; ++files_type(ctdbd_var_t) ++ + type ctdbd_var_run_t; + files_pid_file(ctdbd_var_run_t) + +@@ -32,13 +35,17 @@ files_pid_file(ctdbd_var_run_t) + # Local policy + # + +-allow ctdbd_t self:capability { chown ipc_lock net_admin net_raw sys_nice }; +-allow ctdbd_t self:process { setpgid signal_perms setsched }; ++allow ctdbd_t self:capability { chown dac_override dac_read_search ipc_lock net_admin net_raw sys_nice sys_resource }; ++allow ctdbd_t self:capability2 block_suspend; ++allow ctdbd_t self:process { setpgid setrlimit signal_perms setsched }; + allow ctdbd_t self:fifo_file rw_fifo_file_perms; + allow ctdbd_t self:unix_stream_socket { accept connectto listen }; + allow ctdbd_t self:netlink_route_socket r_netlink_socket_perms; + allow ctdbd_t self:packet_socket create_socket_perms; + allow ctdbd_t self:tcp_socket create_stream_socket_perms; ++allow ctdbd_t self:udp_socket create_socket_perms; ++allow ctdbd_t self:rawip_socket create_socket_perms; ++allow ctdbd_t self:netlink_tcpdiag_socket create_socket_perms; + + append_files_pattern(ctdbd_t, ctdbd_log_t, ctdbd_log_t) + create_files_pattern(ctdbd_t, ctdbd_log_t, ctdbd_log_t) +@@ -57,12 +64,24 @@ files_spool_filetrans(ctdbd_t, ctdbd_spool_t, dir) + exec_files_pattern(ctdbd_t, ctdbd_var_lib_t, ctdbd_var_lib_t) + manage_dirs_pattern(ctdbd_t, ctdbd_var_lib_t, ctdbd_var_lib_t) + manage_files_pattern(ctdbd_t, ctdbd_var_lib_t, ctdbd_var_lib_t) +-files_var_lib_filetrans(ctdbd_t, ctdbd_var_lib_t, dir) ++files_var_lib_filetrans(ctdbd_t, ctdbd_var_lib_t, dir, "ctdb") ++ ++manage_dirs_pattern(ctdbd_t, ctdbd_var_t, ctdbd_var_t) ++manage_files_pattern(ctdbd_t, ctdbd_var_t, ctdbd_var_t) ++manage_lnk_files_pattern(ctdbd_t, ctdbd_var_t, ctdbd_var_t) ++files_var_filetrans(ctdbd_t, ctdbd_var_t, dir, "ctdbd") ++files_var_filetrans(ctdbd_t, ctdbd_var_t, dir, "ctdb") + + manage_dirs_pattern(ctdbd_t, ctdbd_var_run_t, ctdbd_var_run_t) + manage_files_pattern(ctdbd_t, ctdbd_var_run_t, ctdbd_var_run_t) ++manage_sock_files_pattern(ctdbd_t, ctdbd_var_run_t, ctdbd_var_run_t) + files_pid_filetrans(ctdbd_t, ctdbd_var_run_t, dir) + ++setattr_files_pattern(ctdbd_t, ctdbd_exec_t, ctdbd_exec_t) ++write_files_pattern(ctdbd_t, ctdbd_exec_t, ctdbd_exec_t) ++ ++can_exec(ctdbd_t, ctdbd_exec_t) ++ + kernel_read_network_state(ctdbd_t) + kernel_read_system_state(ctdbd_t) + kernel_rw_net_sysctls(ctdbd_t) +@@ -72,27 +91,41 @@ corenet_all_recvfrom_netlabel(ctdbd_t) + corenet_tcp_sendrecv_generic_if(ctdbd_t) + corenet_tcp_sendrecv_generic_node(ctdbd_t) + corenet_tcp_bind_generic_node(ctdbd_t) ++corenet_udp_bind_generic_node(ctdbd_t) + + corenet_sendrecv_ctdb_server_packets(ctdbd_t) + corenet_tcp_bind_ctdb_port(ctdbd_t) ++corenet_udp_bind_ctdb_port(ctdbd_t) ++corenet_tcp_bind_smbd_port(ctdbd_t) ++corenet_tcp_bind_all_rpc_ports(ctdbd_t) ++corenet_udp_bind_all_rpc_ports(ctdbd_t) ++corenet_tcp_connect_ctdb_port(ctdbd_t) + corenet_tcp_sendrecv_ctdb_port(ctdbd_t) ++corenet_tcp_connect_gluster_port(ctdbd_t) ++corenet_tcp_connect_nfs_port(ctdbd_t) ++corenet_tcp_connect_portmap_port(ctdbd_t) + + corecmd_exec_bin(ctdbd_t) + corecmd_exec_shell(ctdbd_t) ++corecmd_getattr_all_executables(ctdbd_t) + + dev_read_sysfs(ctdbd_t) + dev_read_urand(ctdbd_t) + + domain_dontaudit_read_all_domains_state(ctdbd_t) + +-files_read_etc_files(ctdbd_t) + files_search_all_mountpoints(ctdbd_t) + ++fs_getattr_all_fs(ctdbd_t) ++ ++auth_use_nsswitch(ctdbd_t) ++ + logging_send_syslog_msg(ctdbd_t) + +-miscfiles_read_localization(ctdbd_t) + miscfiles_read_public_files(ctdbd_t) + ++userdom_home_manager(ctdbd_t) ++ + optional_policy(` + consoletype_exec(ctdbd_t) + ') +@@ -106,9 +139,23 @@ optional_policy(` + ') + + optional_policy(` ++ rpc_domtrans_rpcd(ctdbd_t) ++ rpc_manage_nfs_state_data_dir(ctdbd_t) ++ rpc_read_nfs_state_data(ctdbd_t) ++') ++ ++optional_policy(` ++ samba_signull_smbd(ctdbd_t) + samba_initrc_domtrans(ctdbd_t) + samba_domtrans_net(ctdbd_t) +- samba_rw_var_files(ctdbd_t) ++ samba_manage_var_dirs(ctdbd_t) ++ samba_manage_var_files(ctdbd_t) ++ samba_systemctl(ctdbd_t) ++') ++ ++optional_policy(` ++ samba_signull_winbind(ctdbd_t) ++ samba_signull_unconfined_net(ctdbd_t) + ') + + optional_policy(` +diff --git a/cups.fc b/cups.fc +index 949011ec86..9437dbe018 100644 +--- a/cups.fc ++++ b/cups.fc +@@ -1,77 +1,91 @@ +-/etc/alchemist/namespace/printconf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + +-/etc/cups(/.*)? gen_context(system_u:object_r:cupsd_etc_t,s0) +-/etc/cups/classes\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/cupsd\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/lpoptions.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/ppd(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/alchemist/namespace/printconf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++ ++/etc/cups(/.*)? gen_context(system_u:object_r:cupsd_etc_t,s0) ++/etc/cups/classes\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/cupsd\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/lpoptions.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/ppd(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + /etc/cups/ppds\.dat -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/printers\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/subscriptions.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/etc/cups/certs -d gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/printers\.conf.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/subscriptions.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/cups/certs -d gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + /etc/cups/certs/.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + /etc/rc\.d/init\.d/cups -- gen_context(system_u:object_r:cupsd_initrc_exec_t,s0) + + /etc/cups/interfaces(/.*)? gen_context(system_u:object_r:cupsd_interface_t,s0) + +-/etc/hp(/.*)? gen_context(system_u:object_r:hplip_etc_t,s0) +- +-/etc/printcap.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/etc/hp(/.*)? gen_context(system_u:object_r:cupsd_etc_t,s0) + +-/lib/udev/udev-configure-printer -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/etc/printcap.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + +-/opt/brother/Printers(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/opt/gutenprint/ppds(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/lib/systemd/system/cups.* -- gen_context(system_u:object_r:cupsd_unit_file_t,s0) + +-/usr/bin/cups-config-daemon -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) +-/usr/bin/hpijs -- gen_context(system_u:object_r:hplip_exec_t,s0) ++/usr/lib/udev/udev-configure-printer -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) + +-/usr/Brother/fax/.*\.log.* gen_context(system_u:object_r:cupsd_log_t,s0) +-/usr/Brother/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/usr/Printer/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/opt/gutenprint/ppds(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + +-/usr/lib/cups-pk-helper/cups-pk-helper-mechanism -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) +-/usr/lib/cups/daemon/cups-lpd -- gen_context(system_u:object_r:cupsd_lpd_exec_t,s0) +-/usr/lib/cups/backend/cups-pdf -- gen_context(system_u:object_r:cups_pdf_exec_t,s0) +-/usr/lib/cups/backend/hp.* -- gen_context(system_u:object_r:hplip_exec_t,s0) +-/usr/lib/udev/udev-configure-printer -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/bin/cups-config-daemon -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/bin/hpijs -- gen_context(system_u:object_r:cupsd_exec_t,s0) + +-/usr/libexec/cups-pk-helper-mechanism -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) +-/usr/libexec/hal_lpadmin -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/lib/cups/daemon/cups-lpd -- gen_context(system_u:object_r:cupsd_lpd_exec_t,s0) ++/usr/lib/cups/backend/cups-pdf -- gen_context(system_u:object_r:cups_pdf_exec_t,s0) ++/usr/lib/cups/backend/hp.* -- gen_context(system_u:object_r:cupsd_exec_t,s0) + +-/usr/local/linuxprinter/ppd(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/libexec/cups-pk-helper-mechanism -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/libexec/hal_lpadmin -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) + +-/usr/sbin/hp-[^/]+ -- gen_context(system_u:object_r:hplip_exec_t,s0) +-/usr/sbin/cupsd -- gen_context(system_u:object_r:cupsd_exec_t,s0) +-/usr/sbin/hal_lpadmin -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) +-/usr/sbin/hpiod -- gen_context(system_u:object_r:hplip_exec_t,s0) +-/usr/sbin/printconf-backend -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/sbin/hp-[^/]+ -- gen_context(system_u:object_r:cupsd_exec_t,s0) ++/usr/sbin/cupsd -- gen_context(system_u:object_r:cupsd_exec_t,s0) ++/usr/sbin/cups-browsed -- gen_context(system_u:object_r:cupsd_exec_t,s0) ++/usr/sbin/hal_lpadmin -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) ++/usr/sbin/hpiod -- gen_context(system_u:object_r:cupsd_exec_t,s0) ++/usr/sbin/printconf-backend -- gen_context(system_u:object_r:cupsd_config_exec_t,s0) + /usr/sbin/ptal-printd -- gen_context(system_u:object_r:ptal_exec_t,s0) + /usr/sbin/ptal-mlcd -- gen_context(system_u:object_r:ptal_exec_t,s0) + /usr/sbin/ptal-photod -- gen_context(system_u:object_r:ptal_exec_t,s0) + +-/usr/share/cups(/.*)? gen_context(system_u:object_r:cupsd_etc_t,s0) +-/usr/share/foomatic/db/oldprinterids -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/usr/share/hplip/.*\.py -- gen_context(system_u:object_r:hplip_exec_t,s0) ++/usr/share/cups(/.*)? gen_context(system_u:object_r:cupsd_etc_t,s0) ++/usr/share/foomatic/db/oldprinterids -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/share/hplip/.*\.py -- gen_context(system_u:object_r:cupsd_exec_t,s0) + +-/var/cache/alchemist/printconf.* gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/var/cache/foomatic(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +-/var/cache/cups(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,mls_systemhigh) ++/var/cache/alchemist/printconf.* gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/var/cache/foomatic(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/var/cache/cups(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,mls_systemhigh) + + /var/lib/cups/certs -d gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + /var/lib/cups/certs/.* -- gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/lib/bjlib(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,mls_systemhigh) + +-/var/lib/hp(/.*)? gen_context(system_u:object_r:hplip_var_lib_t,s0) ++/var/lib/hp(/.*)? gen_context(system_u:object_r:cupsd_var_lib_t,s0) ++/var/lib/iscan(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) + +-/var/log/cups(/.*)? gen_context(system_u:object_r:cupsd_log_t,s0) +-/var/log/turboprint.* gen_context(system_u:object_r:cupsd_log_t,s0) ++/var/log/cups(/.*)? gen_context(system_u:object_r:cupsd_log_t,s0) ++/var/log/turboprint.* gen_context(system_u:object_r:cupsd_log_t,s0) + +-/var/ccpd(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) +-/var/ekpd(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) +-/var/run/cups(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) +-/var/run/hp.*\.pid -- gen_context(system_u:object_r:hplip_var_run_t,s0) +-/var/run/hp.*\.port -- gen_context(system_u:object_r:hplip_var_run_t,s0) ++/var/log/hp(/.*)? gen_context(system_u:object_r:cupsd_log_t,s0) ++ ++/var/ccpd(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) ++/var/ekpd(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) ++/var/run/cups(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,mls_systemhigh) ++/var/run/hplip(/.*) gen_context(system_u:object_r:cupsd_var_run_t,s0) ++/var/run/hp.*\.pid -- gen_context(system_u:object_r:cupsd_var_run_t,s0) ++/var/run/hp.*\.port -- gen_context(system_u:object_r:cupsd_var_run_t,s0) + /var/run/ptal-printd(/.*)? gen_context(system_u:object_r:ptal_var_run_t,s0) + /var/run/ptal-mlcd(/.*)? gen_context(system_u:object_r:ptal_var_run_t,s0) +-/var/run/udev-configure-printer(/.*)? gen_context(system_u:object_r:cupsd_config_var_run_t,s0) +-/var/turboprint(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) ++/var/run/udev-configure-printer(/.*)? gen_context(system_u:object_r:cupsd_config_var_run_t,s0) ++/var/turboprint(/.*)? gen_context(system_u:object_r:cupsd_var_run_t,s0) ++ ++/etc/opt/Brother/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/Brother/fax/.*\.log.* gen_context(system_u:object_r:cupsd_log_t,s0) ++/usr/Brother/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/Printer/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/local/Brother/fax/.*\.log.* gen_context(system_u:object_r:cupsd_log_t,s0) ++/usr/local/Brother/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/usr/local/Printer/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++ ++ ++/usr/local/linuxprinter/ppd(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++ ++/etc/opt/brother/Printers/(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) ++/opt/brother/Printers(.*/)?inf(/.*)? gen_context(system_u:object_r:cupsd_rw_etc_t,s0) +diff --git a/cups.if b/cups.if +index 3023be7f6d..27938e4b4e 100644 +--- a/cups.if ++++ b/cups.if +@@ -200,10 +200,13 @@ interface(`cups_dbus_chat_config',` + interface(`cups_read_config',` + gen_require(` + type cupsd_etc_t, cupsd_rw_etc_t; ++ type hplip_etc_t; + ') + + files_search_etc($1) +- read_files_pattern($1, cupsd_etc_t, { cupsd_etc_t cupsd_rw_etc_t }) ++ read_files_pattern($1, cupsd_etc_t, cupsd_etc_t) ++ read_files_pattern($1, hplip_etc_t, hplip_etc_t) ++ read_files_pattern($1, cupsd_etc_t, cupsd_rw_etc_t) + ') + + ######################################## +@@ -304,6 +307,30 @@ interface(`cups_stream_connect_ptal',` + stream_connect_pattern($1, ptal_var_run_t, ptal_var_run_t, ptal_t) + ') + ++######################################## ++## ++## Execute cupsd server in the cupsd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`cupsd_systemctl',` ++ gen_require(` ++ type cupsd_t; ++ type cupsd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 cupsd_unit_file_t:file read_file_perms; ++ allow $1 cupsd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, cupsd_t) ++') ++ + ######################################## + ## + ## Read the process state (/proc/pid) of cupsd. +@@ -344,18 +371,23 @@ interface(`cups_read_state',` + interface(`cups_admin',` + gen_require(` + type cupsd_t, cupsd_tmp_t, cupsd_lpd_tmp_t; +- type cupsd_etc_t, cupsd_log_t, cupsd_spool_t; ++ type cupsd_etc_t, cupsd_log_t; + type cupsd_config_var_run_t, cupsd_lpd_var_run_t; + type cupsd_var_run_t, ptal_etc_t, cupsd_rw_etc_t; + type ptal_var_run_t, hplip_var_run_t, cupsd_initrc_exec_t; + type cupsd_config_t, cupsd_lpd_t, cups_pdf_t; +- type hplip_t, ptal_t; ++ type ptal_t; ++ type cupsd_unit_file_t; + ') + +- allow $1 { cupsd_t cupsd_config_t cupsd_lpd_t }:process { ptrace signal_perms }; +- allow $1 { cups_pdf_t hplip_t ptal_t }:process { ptrace signal_perms }; ++ allow $1 { cupsd_t cupsd_config_t cupsd_lpd_t }:process { signal_perms }; ++ allow $1 { cups_pdf_t ptal_t }:process { signal_perms }; + ps_process_pattern($1, { cupsd_t cupsd_config_t cupsd_lpd_t }) +- ps_process_pattern($1, { cups_pdf_t hplip_t ptal_t }) ++ ps_process_pattern($1, { cups_pdf_t ptal_t }) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 { cupsd_t cupsd_config_t cupsd_lpd_t }:process ptrace; ++ ') + + init_labeled_script_domtrans($1, cupsd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -368,13 +400,48 @@ interface(`cups_admin',` + logging_list_logs($1) + admin_pattern($1, cupsd_log_t) + +- files_list_spool($1) +- admin_pattern($1, cupsd_spool_t) +- + files_list_tmp($1) + admin_pattern($1, { cupsd_tmp_t cupsd_lpd_tmp_t }) +- +- files_list_pids($1) + admin_pattern($1, { cupsd_config_var_run_t cupsd_var_run_t hplip_var_run_t }) + admin_pattern($1, { ptal_var_run_t cupsd_lpd_var_run_t }) ++ ++ cupsd_systemctl($1) ++ admin_pattern($1, cupsd_unit_file_t) ++ allow $1 cupsd_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Transition to cups named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cups_filetrans_named_content',` ++ gen_require(` ++ type cupsd_rw_etc_t; ++ type cupsd_etc_t; ++ ') ++ ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "classes.conf") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "printers.conf") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "printers.conf.O") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "cupsd.conf") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "cupsd.conf.default") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "lpoptions") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "subscriptions.conf") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "subscriptions.conf.O") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "subscriptions.conf.N") ++ filetrans_pattern($1, cupsd_etc_t, cupsd_rw_etc_t, file, "ppds.dat") ++ files_etc_filetrans($1, cupsd_rw_etc_t, file, "printcap") ++ files_etc_filetrans($1, cupsd_rw_etc_t, file, "ppds.dat") ++ files_etc_filetrans($1, cupsd_rw_etc_t, file, "ppd") ++ files_etc_filetrans($1, cupsd_rw_etc_t, dir, "inf") ++ files_etc_filetrans($1, cupsd_rw_etc_t, dir, "ppd") ++ files_usr_filetrans($1, cupsd_rw_etc_t, dir, "inf") ++ corecmd_bin_filetrans($1, cupsd_rw_etc_t, dir, "inf") ++ files_var_filetrans($1, cupsd_rw_etc_t, dir, "cups") + ') +diff --git a/cups.te b/cups.te +index c91813ccbc..8d9b894e5e 100644 +--- a/cups.te ++++ b/cups.te +@@ -5,19 +5,31 @@ policy_module(cups, 1.16.2) + # Declarations + # + +-type cupsd_config_t; ++## ++##

      ++## Allow cups execmem/execstack ++##

      ++##
      ++gen_tunable(cups_execmem, false) ++ ++attribute cups_domain; ++ ++type cupsd_config_t, cups_domain; + type cupsd_config_exec_t; + init_daemon_domain(cupsd_config_t, cupsd_config_exec_t) + + type cupsd_config_var_run_t; + files_pid_file(cupsd_config_var_run_t) + +-type cupsd_t; ++type cupsd_t, cups_domain; + type cupsd_exec_t; ++typealias cupsd_t alias hplip_t; ++typealias cupsd_exec_t alias hplip_exec_t; + init_daemon_domain(cupsd_t, cupsd_exec_t) + mls_trusted_object(cupsd_t) + + type cupsd_etc_t; ++typealias cupsd_etc_t alias hplip_etc_t; + files_config_file(cupsd_etc_t) + + type cupsd_initrc_exec_t; +@@ -33,13 +45,15 @@ type cupsd_lock_t; + files_lock_file(cupsd_lock_t) + + type cupsd_log_t; ++typealias cupsd_log_t alias hplip_var_log_t; + logging_log_file(cupsd_log_t) + +-type cupsd_lpd_t; ++type cupsd_var_lib_t alias hplip_var_lib_t; ++files_type(cupsd_var_lib_t) ++ ++type cupsd_lpd_t, cups_domain; + type cupsd_lpd_exec_t; +-domain_type(cupsd_lpd_t) +-domain_entry_file(cupsd_lpd_t, cupsd_lpd_exec_t) +-role system_r types cupsd_lpd_t; ++init_domain(cupsd_lpd_t, cupsd_lpd_exec_t) + + type cupsd_lpd_tmp_t; + files_tmp_file(cupsd_lpd_tmp_t) +@@ -47,7 +61,7 @@ files_tmp_file(cupsd_lpd_tmp_t) + type cupsd_lpd_var_run_t; + files_pid_file(cupsd_lpd_var_run_t) + +-type cups_pdf_t; ++type cups_pdf_t, cups_domain; + type cups_pdf_exec_t; + cups_backend(cups_pdf_t, cups_pdf_exec_t) + +@@ -55,29 +69,17 @@ type cups_pdf_tmp_t; + files_tmp_file(cups_pdf_tmp_t) + + type cupsd_tmp_t; ++typealias cupsd_tmp_t alias hplip_tmp_t; + files_tmp_file(cupsd_tmp_t) + + type cupsd_var_run_t; ++typealias cupsd_var_run_t alias hplip_var_run_t; + files_pid_file(cupsd_var_run_t) + init_daemon_run_dir(cupsd_var_run_t, "cups") + mls_trusted_object(cupsd_var_run_t) + +-type hplip_t; +-type hplip_exec_t; +-init_daemon_domain(hplip_t, hplip_exec_t) +-cups_backend(hplip_t, hplip_exec_t) +- +-type hplip_etc_t; +-files_config_file(hplip_etc_t) +- +-type hplip_tmp_t; +-files_tmp_file(hplip_tmp_t) +- +-type hplip_var_lib_t; +-files_type(hplip_var_lib_t) +- +-type hplip_var_run_t; +-files_pid_file(hplip_var_run_t) ++type cupsd_unit_file_t; ++systemd_unit_file(cupsd_unit_file_t) + + type ptal_t; + type ptal_exec_t; +@@ -97,34 +99,65 @@ ifdef(`enable_mls',` + init_ranged_daemon_domain(cupsd_t, cupsd_exec_t, mls_systemhigh) + ') + ++####################################### ++# ++# Cups general local policy ++# ++ ++allow cups_domain self:capability { setuid setgid sys_nice }; ++allow cups_domain self:process { getsched setsched signal_perms }; ++allow cups_domain self:fifo_file rw_fifo_file_perms; ++allow cups_domain self:tcp_socket { accept listen }; ++allow cups_domain self:netlink_kobject_uevent_socket create_socket_perms; ++ ++kernel_read_kernel_sysctls(cups_domain) ++kernel_read_network_state(cups_domain) ++ ++corecmd_exec_bin(cups_domain) ++corecmd_exec_shell(cups_domain) ++ ++dev_read_urand(cups_domain) ++dev_read_rand(cups_domain) ++dev_read_sysfs(cups_domain) ++ ++fs_getattr_all_fs(cups_domain) ++ ++miscfiles_read_fonts(cups_domain) ++miscfiles_setattr_fonts_cache_dirs(cups_domain) ++ ++optional_policy(` ++ lpd_manage_spool(cups_domain) ++') ++ + ######################################## + # + # Cups local policy + # + +-allow cupsd_t self:capability { ipc_lock sys_admin dac_override dac_read_search kill setgid setuid fsetid fowner chown dac_override sys_rawio sys_resource sys_tty_config }; ++allow cupsd_t self:capability { ipc_lock sys_admin dac_read_search kill fsetid fowner chown dac_override sys_resource sys_tty_config }; + dontaudit cupsd_t self:capability { sys_tty_config net_admin }; + allow cupsd_t self:capability2 block_suspend; +-allow cupsd_t self:process { getpgid setpgid setsched signal_perms }; +-allow cupsd_t self:fifo_file rw_fifo_file_perms; ++allow cupsd_t self:process { getpgid setpgid setsched }; + allow cupsd_t self:unix_stream_socket { accept connectto listen }; + allow cupsd_t self:netlink_selinux_socket create_socket_perms; + allow cupsd_t self:shm create_shm_perms; + allow cupsd_t self:sem create_sem_perms; +-allow cupsd_t self:tcp_socket { accept listen }; + allow cupsd_t self:appletalk_socket create_socket_perms; + +-allow cupsd_t cupsd_etc_t:dir setattr_dir_perms; +-allow cupsd_t cupsd_etc_t:file setattr_file_perms; ++allow cupsd_t cupsd_etc_t:dir manage_dir_perms; ++allow cupsd_t cupsd_etc_t:file { map setattr_file_perms }; + read_files_pattern(cupsd_t, cupsd_etc_t, cupsd_etc_t) + read_lnk_files_pattern(cupsd_t, cupsd_etc_t, cupsd_etc_t) + + manage_files_pattern(cupsd_t, cupsd_interface_t, cupsd_interface_t) ++can_exec(cupsd_t, cupsd_interface_t) + + manage_dirs_pattern(cupsd_t, cupsd_etc_t, cupsd_rw_etc_t) + manage_files_pattern(cupsd_t, cupsd_etc_t, cupsd_rw_etc_t) + filetrans_pattern(cupsd_t, cupsd_etc_t, cupsd_rw_etc_t, file) + files_var_filetrans(cupsd_t, cupsd_rw_etc_t, { dir file }) ++cups_filetrans_named_content(cupsd_t) ++can_exec(cupsd_t, cupsd_rw_etc_t) + + allow cupsd_t cupsd_exec_t:dir search_dir_perms; + allow cupsd_t cupsd_exec_t:lnk_file read_lnk_file_perms; +@@ -136,22 +169,24 @@ manage_dirs_pattern(cupsd_t, cupsd_log_t, cupsd_log_t) + manage_files_pattern(cupsd_t, cupsd_log_t, cupsd_log_t) + logging_log_filetrans(cupsd_t, cupsd_log_t, { file dir }) + ++manage_files_pattern(cupsd_t, cupsd_var_lib_t, cupsd_var_lib_t) ++manage_lnk_files_pattern(cupsd_t, cupsd_var_lib_t, cupsd_var_lib_t) ++ + manage_dirs_pattern(cupsd_t, cupsd_tmp_t, cupsd_tmp_t) + manage_files_pattern(cupsd_t, cupsd_tmp_t, cupsd_tmp_t) + manage_fifo_files_pattern(cupsd_t, cupsd_tmp_t, cupsd_tmp_t) +-files_tmp_filetrans(cupsd_t, cupsd_tmp_t, { dir fifo_file file }) ++manage_lnk_files_pattern(cupsd_t, cupsd_tmp_t, cupsd_tmp_t) ++files_tmp_filetrans(cupsd_t, cupsd_tmp_t, { dir fifo_file file lnk_file }) + ++allow cupsd_t cupsd_var_run_t:dir setattr_dir_perms; + manage_dirs_pattern(cupsd_t, cupsd_var_run_t, cupsd_var_run_t) + manage_files_pattern(cupsd_t, cupsd_var_run_t, cupsd_var_run_t) + manage_sock_files_pattern(cupsd_t, cupsd_var_run_t, cupsd_var_run_t) + manage_fifo_files_pattern(cupsd_t, cupsd_var_run_t, cupsd_var_run_t) + files_pid_filetrans(cupsd_t, cupsd_var_run_t, { dir fifo_file file }) + +-allow cupsd_t hplip_t:process { signal sigkill }; ++allow cupsd_t cupsd_unit_file_t:file read_file_perms; + +-read_files_pattern(cupsd_t, hplip_etc_t, hplip_etc_t) +- +-allow cupsd_t hplip_var_run_t:file read_file_perms; + + stream_connect_pattern(cupsd_t, ptal_var_run_t, ptal_var_run_t, ptal_t) + allow cupsd_t ptal_var_run_t:sock_file setattr_sock_file_perms; +@@ -159,11 +194,9 @@ allow cupsd_t ptal_var_run_t:sock_file setattr_sock_file_perms; + can_exec(cupsd_t, { cupsd_exec_t cupsd_interface_t }) + + kernel_read_system_state(cupsd_t) +-kernel_read_network_state(cupsd_t) + kernel_read_all_sysctls(cupsd_t) + kernel_request_load_module(cupsd_t) + +-corenet_all_recvfrom_unlabeled(cupsd_t) + corenet_all_recvfrom_netlabel(cupsd_t) + corenet_tcp_sendrecv_generic_if(cupsd_t) + corenet_udp_sendrecv_generic_if(cupsd_t) +@@ -186,12 +219,20 @@ corenet_dontaudit_tcp_bind_all_reserved_ports(cupsd_t) + corenet_tcp_bind_all_rpc_ports(cupsd_t) + corenet_tcp_connect_all_ports(cupsd_t) + +-corecmd_exec_bin(cupsd_t) +-corecmd_exec_shell(cupsd_t) ++corenet_sendrecv_hplip_client_packets(cupsd_t) ++corenet_receive_hplip_server_packets(cupsd_t) ++corenet_tcp_bind_hplip_port(cupsd_t) ++corenet_tcp_connect_hplip_port(cupsd_t) ++corenet_tcp_bind_glance_port(cupsd_t) ++corenet_tcp_connect_glance_port(cupsd_t) ++ ++corenet_sendrecv_ipp_client_packets(cupsd_t) ++corenet_tcp_connect_ipp_port(cupsd_t) ++ ++corenet_sendrecv_howl_server_packets(cupsd_t) ++corenet_udp_bind_howl_port(cupsd_t) + + dev_rw_printer(cupsd_t) +-dev_read_urand(cupsd_t) +-dev_read_sysfs(cupsd_t) + dev_rw_input_dev(cupsd_t) + dev_rw_generic_usb_dev(cupsd_t) + dev_rw_usbfs(cupsd_t) +@@ -203,7 +244,6 @@ domain_use_interactive_fds(cupsd_t) + files_getattr_boot_dirs(cupsd_t) + files_list_spool(cupsd_t) + files_read_etc_runtime_files(cupsd_t) +-files_read_usr_files(cupsd_t) + files_exec_usr_files(cupsd_t) + # for /var/lib/defoma + files_read_var_lib_files(cupsd_t) +@@ -212,17 +252,19 @@ files_read_world_readable_files(cupsd_t) + files_read_world_readable_symlinks(cupsd_t) + files_read_var_files(cupsd_t) + files_read_var_symlinks(cupsd_t) +-files_write_generic_pid_pipes(cupsd_t) + files_dontaudit_getattr_all_tmp_files(cupsd_t) + files_dontaudit_list_home(cupsd_t) + # for /etc/printcap + files_dontaudit_write_etc_files(cupsd_t) ++files_dontaudit_write_usr_dirs(cupsd_t) + +-fs_getattr_all_fs(cupsd_t) + fs_search_auto_mountpoints(cupsd_t) + fs_search_fusefs(cupsd_t) + fs_read_anon_inodefs_files(cupsd_t) ++fs_rw_anon_inodefs_files(cupsd_t) ++fs_rw_inherited_tmpfs_files(cupsd_t) + ++mls_dbus_send_all_levels(cupsd_t) + mls_fd_use_all_levels(cupsd_t) + mls_file_downgrade(cupsd_t) + mls_file_write_all_levels(cupsd_t) +@@ -232,6 +274,8 @@ mls_socket_write_all_levels(cupsd_t) + + term_search_ptys(cupsd_t) + term_use_unallocated_ttys(cupsd_t) ++term_use_ptmx(cupsd_t) ++term_use_usb_ttys(cupsd_t) + + selinux_compute_access_vector(cupsd_t) + selinux_validate_context(cupsd_t) +@@ -244,22 +288,27 @@ auth_dontaudit_read_pam_pid(cupsd_t) + auth_rw_faillog(cupsd_t) + auth_use_nsswitch(cupsd_t) + +-libs_read_lib_files(cupsd_t) + libs_exec_lib_files(cupsd_t) ++libs_exec_ldconfig(cupsd_t) + + logging_send_audit_msgs(cupsd_t) + logging_send_syslog_msg(cupsd_t) + +-miscfiles_read_localization(cupsd_t) +-miscfiles_read_fonts(cupsd_t) +-miscfiles_setattr_fonts_cache_dirs(cupsd_t) +- + seutil_read_config(cupsd_t) + + sysnet_exec_ifconfig(cupsd_t) ++sysnet_dns_name_resolve(cupsd_t) + + userdom_dontaudit_use_unpriv_user_fds(cupsd_t) ++userdom_dontaudit_search_user_home_dirs(cupsd_t) + userdom_dontaudit_search_user_home_content(cupsd_t) ++userdom_dontaudit_use_unpriv_user_fds(cupsd_t) ++userdom_dontaudit_search_user_home_content(cupsd_t) ++ ++tunable_policy(`cups_execmem',` ++ allow cupsd_t self:process { execmem execstack }; ++') ++ + + optional_policy(` + apm_domtrans_client(cupsd_t) +@@ -272,18 +321,26 @@ optional_policy(` + optional_policy(` + dbus_system_bus_client(cupsd_t) + ++ init_dbus_chat(cupsd_t) ++ + userdom_dbus_send_all_users(cupsd_t) + + optional_policy(` + avahi_dbus_chat(cupsd_t) + ') + ++ optional_policy(` ++ colord_read_lib_files(cupsd_t) ++ ') ++ + optional_policy(` + hal_dbus_chat(cupsd_t) + ') + ++ # talk to processes that do not have policy + optional_policy(` + unconfined_dbus_chat(cupsd_t) ++ files_write_generic_pid_pipes(cupsd_t) + ') + ') + +@@ -296,8 +353,8 @@ optional_policy(` + ') + + optional_policy(` ++ kerberos_tmp_filetrans_host_rcache(cupsd_t, "host_0") + kerberos_manage_host_rcache(cupsd_t) +- kerberos_tmp_filetrans_host_rcache(cupsd_t, file, "host_0") + ') + + optional_policy(` +@@ -306,7 +363,6 @@ optional_policy(` + + optional_policy(` + lpd_exec_lpr(cupsd_t) +- lpd_manage_spool(cupsd_t) + lpd_read_config(cupsd_t) + lpd_relabel_spool(cupsd_t) + ') +@@ -315,6 +371,10 @@ optional_policy(` + mta_send_mail(cupsd_t) + ') + ++optional_policy(` ++ networkmanager_dbus_chat(cupsd_t) ++') ++ + optional_policy(` + samba_read_config(cupsd_t) + samba_rw_var_files(cupsd_t) +@@ -334,7 +394,11 @@ optional_policy(` + ') + + optional_policy(` +- virt_rw_all_image_chr_files(cupsd_t) ++ virt_rw_chr_files(cupsd_t) ++') ++ ++optional_policy(` ++ vmware_read_system_config(cupsd_t) + ') + + ######################################## +@@ -342,12 +406,11 @@ optional_policy(` + # Configuration daemon local policy + # + +-allow cupsd_config_t self:capability { chown dac_override sys_tty_config setuid setgid }; ++allow cupsd_config_t self:capability { chown dac_read_search dac_override sys_tty_config }; + dontaudit cupsd_config_t self:capability sys_tty_config; +-allow cupsd_config_t self:process { getsched signal_perms }; +-allow cupsd_config_t self:fifo_file rw_fifo_file_perms; +-allow cupsd_config_t self:tcp_socket { accept listen }; ++allow cupsd_config_t self:process { getsched }; + ++domtrans_pattern(cupsd_config_t, cupsd_exec_t, cupsd_t) + allow cupsd_config_t cupsd_t:process signal; + ps_process_pattern(cupsd_config_t, cupsd_t) + +@@ -372,18 +435,16 @@ manage_dirs_pattern(cupsd_config_t, cupsd_config_var_run_t, cupsd_config_var_run + manage_files_pattern(cupsd_config_t, cupsd_config_var_run_t, cupsd_config_var_run_t) + files_pid_filetrans(cupsd_config_t, cupsd_config_var_run_t, { dir file }) + +-read_files_pattern(cupsd_config_t, hplip_etc_t, hplip_etc_t) ++read_files_pattern(cupsd_config_t, cupsd_etc_t, cupsd_etc_t) + + stream_connect_pattern(cupsd_config_t, cupsd_var_run_t, cupsd_var_run_t, cupsd_t) + + can_exec(cupsd_config_t, cupsd_config_exec_t) +- +-domtrans_pattern(cupsd_config_t, hplip_exec_t, hplip_t) ++can_exec(cupsd_config_t, cupsd_exec_t) + + kernel_read_system_state(cupsd_config_t) + kernel_read_all_sysctls(cupsd_config_t) + +-corenet_all_recvfrom_unlabeled(cupsd_config_t) + corenet_all_recvfrom_netlabel(cupsd_config_t) + corenet_tcp_sendrecv_generic_if(cupsd_config_t) + corenet_tcp_sendrecv_generic_node(cupsd_config_t) +@@ -392,20 +453,12 @@ corenet_tcp_sendrecv_all_ports(cupsd_config_t) + corenet_sendrecv_all_client_packets(cupsd_config_t) + corenet_tcp_connect_all_ports(cupsd_config_t) + +-corecmd_exec_bin(cupsd_config_t) +-corecmd_exec_shell(cupsd_config_t) +- +-dev_read_sysfs(cupsd_config_t) +-dev_read_urand(cupsd_config_t) +-dev_read_rand(cupsd_config_t) + dev_rw_generic_usb_dev(cupsd_config_t) + + files_read_etc_runtime_files(cupsd_config_t) +-files_read_usr_files(cupsd_config_t) + files_read_var_symlinks(cupsd_config_t) + files_search_all_mountpoints(cupsd_config_t) + +-fs_getattr_all_fs(cupsd_config_t) + fs_search_auto_mountpoints(cupsd_config_t) + + domain_use_interactive_fds(cupsd_config_t) +@@ -417,11 +470,6 @@ auth_use_nsswitch(cupsd_config_t) + + logging_send_syslog_msg(cupsd_config_t) + +-miscfiles_read_localization(cupsd_config_t) +-miscfiles_read_hwdata(cupsd_config_t) +- +-seutil_dontaudit_search_config(cupsd_config_t) +- + userdom_dontaudit_use_unpriv_user_fds(cupsd_config_t) + userdom_dontaudit_search_user_home_dirs(cupsd_config_t) + userdom_read_all_users_state(cupsd_config_t) +@@ -448,10 +496,13 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ gnome_dontaudit_read_config(cupsd_config_t) ++') ++ + optional_policy(` + hal_domtrans(cupsd_config_t) + hal_read_tmp_files(cupsd_config_t) +- hal_dontaudit_use_fds(hplip_t) + ') + + optional_policy(` +@@ -466,6 +517,10 @@ optional_policy(` + lpd_read_config(cupsd_config_t) + ') + ++optional_policy(` ++ libs_exec_ldconfig(cupsd_config_t) ++') ++ + optional_policy(` + rpm_read_db(cupsd_config_t) + ') +@@ -487,10 +542,6 @@ optional_policy(` + # Lpd local policy + # + +-allow cupsd_lpd_t self:capability { setuid setgid }; +-allow cupsd_lpd_t self:process signal_perms; +-allow cupsd_lpd_t self:fifo_file rw_fifo_file_perms; +-allow cupsd_lpd_t self:tcp_socket { accept listen }; + allow cupsd_lpd_t self:netlink_tcpdiag_socket r_netlink_socket_perms; + + allow cupsd_lpd_t { cupsd_etc_t cupsd_rw_etc_t }:dir list_dir_perms; +@@ -508,15 +559,15 @@ stream_connect_pattern(cupsd_lpd_t, cupsd_var_run_t, cupsd_var_run_t, cupsd_t) + + kernel_read_kernel_sysctls(cupsd_lpd_t) + kernel_read_system_state(cupsd_lpd_t) +-kernel_read_network_state(cupsd_lpd_t) + +-corenet_all_recvfrom_unlabeled(cupsd_lpd_t) + corenet_all_recvfrom_netlabel(cupsd_lpd_t) + corenet_tcp_sendrecv_generic_if(cupsd_lpd_t) + corenet_tcp_sendrecv_generic_node(cupsd_lpd_t) + + corenet_sendrecv_ipp_client_packets(cupsd_lpd_t) + corenet_tcp_connect_ipp_port(cupsd_lpd_t) ++corenet_tcp_bind_printer_port(cupsd_lpd_t) ++corenet_tcp_connect_printer_port(cupsd_lpd_t) + corenet_tcp_sendrecv_ipp_port(cupsd_lpd_t) + + corenet_sendrecv_printer_server_packets(cupsd_lpd_t) +@@ -537,9 +588,6 @@ auth_use_nsswitch(cupsd_lpd_t) + + logging_send_syslog_msg(cupsd_lpd_t) + +-miscfiles_read_localization(cupsd_lpd_t) +-miscfiles_setattr_fonts_cache_dirs(cupsd_lpd_t) +- + optional_policy(` + inetd_service_domain(cupsd_lpd_t, cupsd_lpd_exec_t) + ') +@@ -549,8 +597,7 @@ optional_policy(` + # Pdf local policy + # + +-allow cups_pdf_t self:capability { chown fowner fsetid setuid setgid dac_override }; +-allow cups_pdf_t self:fifo_file rw_fifo_file_perms; ++allow cups_pdf_t self:capability { chown fowner fsetid setuid setgid dac_read_search dac_override }; + allow cups_pdf_t self:unix_stream_socket create_stream_socket_perms; + + append_files_pattern(cups_pdf_t, cupsd_log_t, cupsd_log_t) +@@ -566,148 +613,23 @@ fs_search_auto_mountpoints(cups_pdf_t) + + kernel_read_system_state(cups_pdf_t) + +-files_read_usr_files(cups_pdf_t) +- +-corecmd_exec_bin(cups_pdf_t) +-corecmd_exec_shell(cups_pdf_t) +- + auth_use_nsswitch(cups_pdf_t) + +-miscfiles_read_localization(cups_pdf_t) +-miscfiles_read_fonts(cups_pdf_t) +-miscfiles_setattr_fonts_cache_dirs(cups_pdf_t) +- + userdom_manage_user_home_content_dirs(cups_pdf_t) + userdom_manage_user_home_content_files(cups_pdf_t) +-userdom_home_filetrans_user_home_dir(cups_pdf_t) ++userdom_filetrans_home_content(cups_pdf_t) + + tunable_policy(`use_nfs_home_dirs',` + fs_manage_nfs_dirs(cups_pdf_t) + fs_manage_nfs_files(cups_pdf_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(cups_pdf_t) +- fs_manage_cifs_files(cups_pdf_t) +-') ++userdom_home_manager(cups_pdf_t) + + optional_policy(` +- lpd_manage_spool(cups_pdf_t) ++ gnome_read_config(cups_pdf_t) + ') + +-######################################## +-# +-# HPLIP local policy +-# +- +-allow hplip_t self:capability { dac_override dac_read_search net_raw }; +-dontaudit hplip_t self:capability sys_tty_config; +-allow hplip_t self:fifo_file rw_fifo_file_perms; +-allow hplip_t self:process signal_perms; +-allow hplip_t self:tcp_socket { accept listen }; +-allow hplip_t self:rawip_socket create_socket_perms; +- +-allow hplip_t cupsd_etc_t:dir search_dir_perms; +- +-manage_dirs_pattern(hplip_t, cupsd_tmp_t, cupsd_tmp_t) +-manage_files_pattern(hplip_t, cupsd_tmp_t, cupsd_tmp_t) +-files_tmp_filetrans(hplip_t, cupsd_tmp_t, { dir file }) +- +-allow hplip_t hplip_etc_t:dir list_dir_perms; +-allow hplip_t hplip_etc_t:file read_file_perms; +-allow hplip_t hplip_etc_t:lnk_file read_lnk_file_perms; +- +-manage_files_pattern(hplip_t, hplip_var_lib_t, hplip_var_lib_t) +-manage_lnk_files_pattern(hplip_t, hplip_var_lib_t, hplip_var_lib_t) +- +-manage_fifo_files_pattern(hplip_t, hplip_tmp_t, hplip_tmp_t) +-files_tmp_filetrans(hplip_t, hplip_tmp_t, fifo_file) +- +-manage_files_pattern(hplip_t, hplip_var_run_t, hplip_var_run_t) +-files_pid_filetrans(hplip_t, hplip_var_run_t, file) +- +-stream_connect_pattern(hplip_t, cupsd_var_run_t, cupsd_var_run_t, cupsd_t) +- +-kernel_read_system_state(hplip_t) +-kernel_read_kernel_sysctls(hplip_t) +- +-corenet_all_recvfrom_unlabeled(hplip_t) +-corenet_all_recvfrom_netlabel(hplip_t) +-corenet_tcp_sendrecv_generic_if(hplip_t) +-corenet_udp_sendrecv_generic_if(hplip_t) +-corenet_raw_sendrecv_generic_if(hplip_t) +-corenet_tcp_sendrecv_generic_node(hplip_t) +-corenet_udp_sendrecv_generic_node(hplip_t) +-corenet_raw_sendrecv_generic_node(hplip_t) +-corenet_tcp_sendrecv_all_ports(hplip_t) +-corenet_udp_sendrecv_all_ports(hplip_t) +-corenet_tcp_bind_generic_node(hplip_t) +-corenet_udp_bind_generic_node(hplip_t) +- +-corenet_sendrecv_hplip_client_packets(hplip_t) +-corenet_receive_hplip_server_packets(hplip_t) +-corenet_tcp_bind_hplip_port(hplip_t) +-corenet_tcp_connect_hplip_port(hplip_t) +- +-corenet_sendrecv_ipp_client_packets(hplip_t) +-corenet_tcp_connect_ipp_port(hplip_t) +- +-corenet_sendrecv_howl_server_packets(hplip_t) +-corenet_udp_bind_howl_port(hplip_t) +- +-corecmd_exec_bin(hplip_t) +- +-dev_read_sysfs(hplip_t) +-dev_rw_printer(hplip_t) +-dev_read_urand(hplip_t) +-dev_read_rand(hplip_t) +-dev_rw_generic_usb_dev(hplip_t) +-dev_rw_usbfs(hplip_t) +- +-domain_use_interactive_fds(hplip_t) +- +-files_read_etc_files(hplip_t) +-files_read_etc_runtime_files(hplip_t) +-files_read_usr_files(hplip_t) +- +-fs_getattr_all_fs(hplip_t) +-fs_search_auto_mountpoints(hplip_t) +-fs_rw_anon_inodefs_files(hplip_t) +- +-logging_send_syslog_msg(hplip_t) +- +-miscfiles_read_localization(hplip_t) +- +-sysnet_dns_name_resolve(hplip_t) +- +-userdom_dontaudit_use_unpriv_user_fds(hplip_t) +-userdom_dontaudit_search_user_home_dirs(hplip_t) +-userdom_dontaudit_search_user_home_content(hplip_t) +- +-optional_policy(` +- dbus_system_bus_client(hplip_t) +- +- optional_policy(` +- userdom_dbus_send_all_users(hplip_t) +- ') +-') +- +-optional_policy(` +- lpd_read_config(hplip_t) +- lpd_manage_spool(hplip_t) +-') +- +-optional_policy(` +- seutil_sigchld_newrole(hplip_t) +-') +- +-optional_policy(` +- snmp_read_snmp_var_lib_files(hplip_t) +-') +- +-optional_policy(` +- udev_read_db(hplip_t) +-') + + ######################################## + # +@@ -735,7 +657,6 @@ kernel_read_kernel_sysctls(ptal_t) + kernel_list_proc(ptal_t) + kernel_read_proc_symlinks(ptal_t) + +-corenet_all_recvfrom_unlabeled(ptal_t) + corenet_all_recvfrom_netlabel(ptal_t) + corenet_tcp_sendrecv_generic_if(ptal_t) + corenet_tcp_sendrecv_generic_node(ptal_t) +@@ -745,13 +666,11 @@ corenet_sendrecv_ptal_server_packets(ptal_t) + corenet_tcp_bind_ptal_port(ptal_t) + corenet_tcp_sendrecv_ptal_port(ptal_t) + +-dev_read_sysfs(ptal_t) + dev_read_usbfs(ptal_t) + dev_rw_printer(ptal_t) + + domain_use_interactive_fds(ptal_t) + +-files_read_etc_files(ptal_t) + files_read_etc_runtime_files(ptal_t) + + fs_getattr_all_fs(ptal_t) +@@ -759,8 +678,6 @@ fs_search_auto_mountpoints(ptal_t) + + logging_send_syslog_msg(ptal_t) + +-miscfiles_read_localization(ptal_t) +- + sysnet_read_config(ptal_t) + + userdom_dontaudit_use_unpriv_user_fds(ptal_t) +@@ -773,3 +690,4 @@ optional_policy(` + optional_policy(` + udev_read_db(ptal_t) + ') ++ +diff --git a/cvs.fc b/cvs.fc +index 75c8be90cd..4c1a965c03 100644 +--- a/cvs.fc ++++ b/cvs.fc +@@ -1,13 +1,16 @@ ++HOME_DIR/\.cvsignore -- gen_context(system_u:object_r:cvs_home_t,s0) ++/root/\.cvsignore -- gen_context(system_u:object_r:cvs_home_t,s0) ++ + /etc/rc\.d/init\.d/cvs -- gen_context(system_u:object_r:cvs_initrc_exec_t,s0) + + /opt/cvs(/.*)? gen_context(system_u:object_r:cvs_data_t,s0) + + /usr/bin/cvs -- gen_context(system_u:object_r:cvs_exec_t,s0) + +-/usr/share/cvsweb/cvsweb\.cgi -- gen_context(system_u:object_r:httpd_cvs_script_exec_t,s0) ++/usr/share/cvsweb/cvsweb\.cgi -- gen_context(system_u:object_r:cvs_script_exec_t,s0) + + /var/cvs(/.*)? gen_context(system_u:object_r:cvs_data_t,s0) + + /var/run/cvs\.pid -- gen_context(system_u:object_r:cvs_var_run_t,s0) + +-/var/www/cgi-bin/cvsweb\.cgi -- gen_context(system_u:object_r:httpd_cvs_script_exec_t,s0) ++/var/www/cgi-bin/cvsweb\.cgi -- gen_context(system_u:object_r:cvs_script_exec_t,s0) +diff --git a/cvs.if b/cvs.if +index 64775fd372..91a60569cd 100644 +--- a/cvs.if ++++ b/cvs.if +@@ -1,5 +1,23 @@ + ## Concurrent versions system. + ++###################################### ++## ++## Dontaudit Attempts to list the CVS data and metadata. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`cvs_dontaudit_list_data',` ++ gen_require(` ++ type cvs_data_t; ++ ') ++ ++ dontaudit $1 cvs_data_t:dir list_dir_perms; ++') ++ + ######################################## + ## + ## Read CVS data and metadata content. +@@ -39,6 +57,24 @@ interface(`cvs_exec',` + can_exec($1, cvs_exec_t) + ') + ++######################################## ++## ++## Transition to cvs named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cvs_filetrans_home_content',` ++ gen_require(` ++ type cvs_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, cvs_home_t, file, ".cvsignore") ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -60,11 +96,17 @@ interface(`cvs_admin',` + gen_require(` + type cvs_t, cvs_tmp_t, cvs_initrc_exec_t; + type cvs_data_t, cvs_var_run_t, cvs_keytab_t; ++ type cvs_home_t; + ') + +- allow $1 cvs_t:process { ptrace signal_perms }; ++ allow $1 cvs_t:process signal_perms; + ps_process_pattern($1, cvs_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cvs_t:process ptrace; ++ ') ++ ++ # Allow cvs_t to restart the apache service + init_labeled_script_domtrans($1, cvs_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 cvs_initrc_exec_t system_r; +@@ -81,4 +123,7 @@ interface(`cvs_admin',` + + files_list_pids($1) + admin_pattern($1, cvs_var_run_t) ++ ++ userdom_search_user_home_dirs($1) ++ admin_pattern($1, cvs_home_t) + ') +diff --git a/cvs.te b/cvs.te +index 0f7755005f..36e4a38cfb 100644 +--- a/cvs.te ++++ b/cvs.te +@@ -11,7 +11,7 @@ policy_module(cvs, 1.10.2) + ## password files. + ##

      + ## +-gen_tunable(allow_cvs_read_shadow, false) ++gen_tunable(cvs_read_shadow, false) + + type cvs_t; + type cvs_exec_t; +@@ -34,17 +34,23 @@ files_tmp_file(cvs_tmp_t) + type cvs_var_run_t; + files_pid_file(cvs_var_run_t) + ++type cvs_home_t; ++userdom_user_home_content(cvs_home_t) ++ + ######################################## + # + # Local policy + # + +-allow cvs_t self:capability { setuid setgid }; ++allow cvs_t self:capability { dac_override dac_read_search setuid setgid }; + allow cvs_t self:process signal_perms; + allow cvs_t self:fifo_file rw_fifo_file_perms; + allow cvs_t self:netlink_tcpdiag_socket r_netlink_socket_perms; + allow cvs_t self:tcp_socket { accept listen }; + ++userdom_search_user_home_dirs(cvs_t) ++allow cvs_t cvs_home_t:file read_file_perms; ++ + manage_dirs_pattern(cvs_t, cvs_data_t, cvs_data_t) + manage_files_pattern(cvs_t, cvs_data_t, cvs_data_t) + manage_lnk_files_pattern(cvs_t, cvs_data_t, cvs_data_t) +@@ -74,6 +80,15 @@ corenet_tcp_sendrecv_cvs_port(cvs_t) + corecmd_exec_bin(cvs_t) + corecmd_exec_shell(cvs_t) + ++corenet_all_recvfrom_netlabel(cvs_t) ++corenet_tcp_sendrecv_generic_if(cvs_t) ++corenet_udp_sendrecv_generic_if(cvs_t) ++corenet_tcp_sendrecv_generic_node(cvs_t) ++corenet_udp_sendrecv_generic_node(cvs_t) ++corenet_tcp_sendrecv_all_ports(cvs_t) ++corenet_udp_sendrecv_all_ports(cvs_t) ++corenet_tcp_bind_cvs_port(cvs_t) ++ + dev_read_urand(cvs_t) + + files_read_etc_runtime_files(cvs_t) +@@ -86,19 +101,17 @@ auth_use_nsswitch(cvs_t) + + init_read_utmp(cvs_t) + ++init_dontaudit_read_utmp(cvs_t) ++ + logging_send_syslog_msg(cvs_t) + logging_send_audit_msgs(cvs_t) + +-miscfiles_read_localization(cvs_t) +- + mta_send_mail(cvs_t) + +-userdom_dontaudit_search_user_home_dirs(cvs_t) +- + # cjp: typeattribute doesnt work in conditionals yet + auth_can_read_shadow_passwords(cvs_t) +-tunable_policy(`allow_cvs_read_shadow',` +- allow cvs_t self:capability dac_override; ++tunable_policy(`cvs_read_shadow',` ++ allow cvs_t self:capability { dac_read_search dac_override }; + auth_tunable_read_shadow(cvs_t) + ') + +@@ -116,8 +129,10 @@ optional_policy(` + + optional_policy(` + apache_content_template(cvs) ++ apache_content_alias_template(cvs, cvs) + +- read_files_pattern(httpd_cvs_script_t, cvs_data_t, cvs_data_t) +- manage_dirs_pattern(httpd_cvs_script_t, cvs_tmp_t, cvs_tmp_t) +- manage_files_pattern(httpd_cvs_script_t, cvs_tmp_t, cvs_tmp_t) ++ read_files_pattern(cvs_script_t, cvs_data_t, cvs_data_t) ++ manage_dirs_pattern(cvs_script_t, cvs_tmp_t, cvs_tmp_t) ++ manage_files_pattern(cvs_script_t, cvs_tmp_t, cvs_tmp_t) ++ files_tmp_filetrans(cvs_script_t, cvs_tmp_t, { file dir }) + ') +diff --git a/cyphesis.te b/cyphesis.te +index 77ffc7355c..86e11f5e33 100644 +--- a/cyphesis.te ++++ b/cyphesis.te +@@ -48,7 +48,6 @@ kernel_read_kernel_sysctls(cyphesis_t) + corecmd_search_bin(cyphesis_t) + corecmd_getattr_bin_files(cyphesis_t) + +-corenet_all_recvfrom_unlabeled(cyphesis_t) + corenet_tcp_sendrecv_generic_if(cyphesis_t) + corenet_tcp_sendrecv_generic_node(cyphesis_t) + corenet_tcp_bind_generic_node(cyphesis_t) +@@ -61,13 +60,9 @@ dev_read_urand(cyphesis_t) + + domain_use_interactive_fds(cyphesis_t) + +-files_read_etc_files(cyphesis_t) +-files_read_usr_files(cyphesis_t) + + logging_send_syslog_msg(cyphesis_t) + +-miscfiles_read_localization(cyphesis_t) +- + sysnet_dns_name_resolve(cyphesis_t) + + optional_policy(` +diff --git a/cyrus.if b/cyrus.if +index 83bfda6edd..92d9fb2e74 100644 +--- a/cyrus.if ++++ b/cyrus.if +@@ -20,6 +20,25 @@ interface(`cyrus_manage_data',` + manage_files_pattern($1, cyrus_var_lib_t, cyrus_var_lib_t) + ') + ++####################################### ++## ++## Allow write cyrus data files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`cyrus_write_data',` ++ gen_require(` ++ type cyrus_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ write_files_pattern($1, cyrus_var_lib_t, cyrus_var_lib_t) ++') ++ + ######################################## + ## + ## Connect to Cyrus using a unix +@@ -64,9 +83,13 @@ interface(`cyrus_admin',` + type cyrus_keytab_t; + ') + +- allow $1 cyrus_t:process { ptrace signal_perms }; ++ allow $1 cyrus_t:process signal_perms; + ps_process_pattern($1, cyrus_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cyrus_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, cyrus_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 cyrus_initrc_exec_t system_r; +diff --git a/cyrus.te b/cyrus.te +index 4283f2de23..21d93a737a 100644 +--- a/cyrus.te ++++ b/cyrus.te +@@ -29,7 +29,7 @@ files_pid_file(cyrus_var_run_t) + # Local policy + # + +-allow cyrus_t self:capability { dac_override setgid setuid sys_resource }; ++allow cyrus_t self:capability { fsetid dac_read_search dac_override net_bind_service setgid setuid sys_resource }; + dontaudit cyrus_t self:capability sys_tty_config; + allow cyrus_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow cyrus_t self:process setrlimit; +@@ -54,21 +54,24 @@ manage_dirs_pattern(cyrus_t, cyrus_var_lib_t, cyrus_var_lib_t) + manage_files_pattern(cyrus_t, cyrus_var_lib_t, cyrus_var_lib_t) + manage_lnk_files_pattern(cyrus_t, cyrus_var_lib_t, cyrus_var_lib_t) + manage_sock_files_pattern(cyrus_t, cyrus_var_lib_t, cyrus_var_lib_t) ++allow cyrus_t cyrus_var_lib_t:file map; + + manage_files_pattern(cyrus_t, cyrus_var_run_t, cyrus_var_run_t) + manage_sock_files_pattern(cyrus_t, cyrus_var_run_t, cyrus_var_run_t) + files_pid_filetrans(cyrus_t, cyrus_var_run_t, { file sock_file }) ++allow cyrus_t cyrus_var_run_t:file map; + + kernel_read_kernel_sysctls(cyrus_t) + kernel_read_system_state(cyrus_t) + kernel_read_all_sysctls(cyrus_t) ++kernel_read_network_state(cyrus_t) + +-corenet_all_recvfrom_unlabeled(cyrus_t) + corenet_all_recvfrom_netlabel(cyrus_t) + corenet_tcp_sendrecv_generic_if(cyrus_t) + corenet_tcp_sendrecv_generic_node(cyrus_t) + corenet_tcp_sendrecv_all_ports(cyrus_t) + corenet_tcp_bind_generic_node(cyrus_t) ++corenet_tcp_bind_cyrus_imapd_port(cyrus_t) + + corenet_sendrecv_mail_server_packets(cyrus_t) + corenet_tcp_bind_mail_port(cyrus_t) +@@ -76,6 +79,9 @@ corenet_tcp_bind_mail_port(cyrus_t) + corenet_sendrecv_lmtp_server_packets(cyrus_t) + corenet_tcp_bind_lmtp_port(cyrus_t) + ++corenet_sendrecv_innd_server_packets(cyrus_t) ++corenet_tcp_bind_innd_port(cyrus_t) ++ + corenet_sendrecv_pop_server_packets(cyrus_t) + corenet_tcp_bind_pop_port(cyrus_t) + +@@ -95,8 +101,6 @@ domain_use_interactive_fds(cyrus_t) + + files_list_var_lib(cyrus_t) + files_read_etc_runtime_files(cyrus_t) +-files_read_usr_files(cyrus_t) +-files_dontaudit_write_usr_dirs(cyrus_t) + + fs_getattr_all_fs(cyrus_t) + fs_search_auto_mountpoints(cyrus_t) +@@ -107,7 +111,6 @@ libs_exec_lib_files(cyrus_t) + + logging_send_syslog_msg(cyrus_t) + +-miscfiles_read_localization(cyrus_t) + miscfiles_read_generic_certs(cyrus_t) + + userdom_use_unpriv_users_fds(cyrus_t) +@@ -120,6 +123,14 @@ optional_policy(` + cron_system_entry(cyrus_t, cyrus_exec_t) + ') + ++optional_policy(` ++ dirsrv_stream_connect(cyrus_t) ++') ++ ++optional_policy(` ++ gssproxy_stream_connect(cyrus_t) ++') ++ + optional_policy(` + kerberos_read_keytab(cyrus_t) + kerberos_use(cyrus_t) +@@ -134,8 +145,8 @@ optional_policy(` + ') + + optional_policy(` +- snmp_read_snmp_var_lib_files(cyrus_t) +- snmp_dontaudit_write_snmp_var_lib_files(cyrus_t) ++ files_dontaudit_write_usr_dirs(cyrus_t) ++ snmp_manage_var_lib_files(cyrus_t) + snmp_stream_connect(cyrus_t) + ') + +diff --git a/daemontools.if b/daemontools.if +index 3b3d9a0b7b..6c8106a871 100644 +--- a/daemontools.if ++++ b/daemontools.if +@@ -218,3 +218,4 @@ interface(`daemontools_manage_svc',` + allow $1 svc_svc_t:file manage_file_perms; + allow $1 svc_svc_t:lnk_file manage_lnk_file_perms; + ') ++ +diff --git a/daemontools.te b/daemontools.te +index ee1b4aa8e0..2fd746e050 100644 +--- a/daemontools.te ++++ b/daemontools.te +@@ -44,7 +44,10 @@ allow svc_multilog_t svc_start_t:process sigchld; + allow svc_multilog_t svc_start_t:fd use; + allow svc_multilog_t svc_start_t:fifo_file rw_fifo_file_perms; + ++term_write_console(svc_multilog_t) ++ + init_use_fds(svc_multilog_t) ++init_dontaudit_use_script_fds(svc_multilog_t) + + logging_manage_generic_logs(svc_multilog_t) + +@@ -77,7 +80,8 @@ dev_read_urand(svc_run_t) + corecmd_exec_bin(svc_run_t) + corecmd_exec_shell(svc_run_t) + +-files_read_etc_files(svc_run_t) ++term_write_console(svc_run_t) ++ + files_read_etc_runtime_files(svc_run_t) + files_search_pids(svc_run_t) + files_search_var_lib(svc_run_t) +@@ -109,6 +113,7 @@ allow svc_start_t svc_run_t:process { signal setrlimit }; + + can_exec(svc_start_t, svc_start_exec_t) + ++mmap_files_pattern(svc_start_t, svc_svc_t, svc_svc_t) + domtrans_pattern(svc_start_t, svc_run_exec_t, svc_run_t) + + kernel_read_kernel_sysctls(svc_start_t) +@@ -117,11 +122,13 @@ kernel_read_system_state(svc_start_t) + corecmd_exec_bin(svc_start_t) + corecmd_exec_shell(svc_start_t) + +-files_read_etc_files(svc_start_t) ++corenet_tcp_bind_generic_node(svc_start_t) ++corenet_tcp_bind_generic_port(svc_start_t) ++ ++term_write_console(svc_start_t) ++ + files_read_etc_runtime_files(svc_start_t) + files_search_var(svc_start_t) + files_search_pids(svc_start_t) + + logging_send_syslog_msg(svc_start_t) +- +-miscfiles_read_localization(svc_start_t) +diff --git a/dante.te b/dante.te +index 5a5e2902a3..6321a1d0a2 100644 +--- a/dante.te ++++ b/dante.te +@@ -53,7 +53,6 @@ dev_read_sysfs(dante_t) + + domain_use_interactive_fds(dante_t) + +-files_read_etc_files(dante_t) + files_read_etc_runtime_files(dante_t) + + fs_getattr_all_fs(dante_t) +diff --git a/dbadm.te b/dbadm.te +index b60c464f1d..3a5246a9bb 100644 +--- a/dbadm.te ++++ b/dbadm.te +@@ -23,14 +23,14 @@ gen_tunable(dbadm_read_user_files, false) + + role dbadm_r; + +-userdom_base_user_template(dbadm) ++userdom_confined_admin_template(dbadm) + + ######################################## + # + # Local policy + # + +-allow dbadm_t self:capability { dac_override dac_read_search sys_ptrace }; ++allow dbadm_t self:capability { dac_override dac_read_search }; + + files_dontaudit_search_all_dirs(dbadm_t) + files_delete_generic_locks(dbadm_t) +@@ -39,6 +39,7 @@ files_list_var(dbadm_t) + selinux_get_enforce_mode(dbadm_t) + + logging_send_syslog_msg(dbadm_t) ++logging_send_audit_msgs(dbadm_t) + + userdom_dontaudit_search_user_home_dirs(dbadm_t) + +@@ -60,3 +61,7 @@ optional_policy(` + optional_policy(` + postgresql_admin(dbadm_t, dbadm_r) + ') ++ ++optional_policy(` ++ sudo_role_template(dbadm, dbadm_r, dbadm_t) ++') +diff --git a/dbskk.te b/dbskk.te +index f55c420821..e9d64ab5f2 100644 +--- a/dbskk.te ++++ b/dbskk.te +@@ -36,7 +36,6 @@ kernel_read_kernel_sysctls(dbskkd_t) + kernel_read_system_state(dbskkd_t) + kernel_read_network_state(dbskkd_t) + +-corenet_all_recvfrom_unlabeled(dbskkd_t) + corenet_all_recvfrom_netlabel(dbskkd_t) + corenet_tcp_sendrecv_generic_if(dbskkd_t) + corenet_udp_sendrecv_generic_if(dbskkd_t) +@@ -49,10 +48,7 @@ dev_read_urand(dbskkd_t) + + fs_getattr_xattr_fs(dbskkd_t) + +-files_read_etc_files(dbskkd_t) + + auth_use_nsswitch(dbskkd_t) + + logging_send_syslog_msg(dbskkd_t) +- +-miscfiles_read_localization(dbskkd_t) +diff --git a/dbus.fc b/dbus.fc +index dda905b9c2..558729530c 100644 +--- a/dbus.fc ++++ b/dbus.fc +@@ -1,20 +1,29 @@ +-HOME_DIR/\.dbus(/.*)? gen_context(system_u:object_r:session_dbusd_home_t,s0) ++/etc/dbus-1(/.*)? gen_context(system_u:object_r:dbusd_etc_t,s0) + +-/etc/dbus-.*(/.*)? gen_context(system_u:object_r:dbusd_etc_t,s0) ++/bin/dbus-daemon -- gen_context(system_u:object_r:dbusd_exec_t,s0) + +-/bin/dbus-daemon -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++ifdef(`distro_redhat',` ++/lib/dbus-1/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++/usr/lib/dbus-1/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++/usr/libexec/dbus-1/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++') + +-/lib/dbus-.*/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++/usr/bin/dbus-daemon(-1)? -- gen_context(system_u:object_r:dbusd_exec_t,s0) + +-/usr/bin/dbus-daemon(-1)? -- gen_context(system_u:object_r:dbusd_exec_t,s0) + +-/usr/lib/dbus-.*/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++ifdef(`distro_debian',` ++/usr/lib/dbus-1.0/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++') + +-/usr/libexec/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++ifdef(`distro_gentoo',` ++/usr/libexec/dbus-daemon-launch-helper -- gen_context(system_u:object_r:dbusd_exec_t,s0) ++') + +-/var/lib/dbus(/.*)? gen_context(system_u:object_r:system_dbusd_var_lib_t,s0) ++/var/lib/dbus(/.*)? gen_context(system_u:object_r:system_dbusd_var_lib_t,s0) ++/var/cache/ibus(/.*)? gen_context(system_u:object_r:system_dbusd_var_lib_t,s0) + +-/var/run/dbus(/.*)? gen_context(system_u:object_r:system_dbusd_var_run_t,s0) +-/var/run/messagebus\.pid -- gen_context(system_u:object_r:system_dbusd_var_run_t,s0) ++/var/run/dbus(/.*)? gen_context(system_u:object_r:system_dbusd_var_run_t,s0) + ++ifdef(`distro_redhat',` + /var/named/chroot/var/run/dbus(/.*)? gen_context(system_u:object_r:system_dbusd_var_run_t,s0) ++') +diff --git a/dbus.if b/dbus.if +index 62d22cb460..3b6a2c833c 100644 +--- a/dbus.if ++++ b/dbus.if +@@ -1,4 +1,4 @@ +-## Desktop messaging bus. ++## Desktop messaging bus + + ######################################## + ## +@@ -19,7 +19,24 @@ interface(`dbus_stub',` + + ######################################## + ## +-## Role access for dbus. ++## Execute dbus-daemon in the caller domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`dbus_exec_dbusd',` ++ gen_require(` ++ type dbusd_exec_t; ++ ') ++ can_exec($1, dbusd_exec_t) ++') ++ ++######################################## ++## ++## Role access for dbus + ## + ## + ## +@@ -41,59 +58,68 @@ interface(`dbus_stub',` + template(`dbus_role_template',` + gen_require(` + class dbus { send_msg acquire_svc }; +- attribute session_bus_type; +- type system_dbusd_t, dbusd_exec_t; +- type session_dbusd_tmp_t, session_dbusd_home_t; ++ attribute dbusd_unconfined, session_bus_type; ++ type system_dbusd_t, session_dbusd_tmp_t, dbusd_exec_t, dbusd_etc_t; ++ type $1_t; + ') + + ############################## + # +- # Declarations ++ # Delcarations + # + + type $1_dbusd_t, session_bus_type; +- domain_type($1_dbusd_t) +- domain_entry_file($1_dbusd_t, dbusd_exec_t) ++ application_domain($1_dbusd_t, dbusd_exec_t) + ubac_constrained($1_dbusd_t) +- + role $2 types $1_dbusd_t; + ++ kernel_read_system_state($1_dbusd_t) ++ ++ selinux_get_fs_mount($1_dbusd_t) ++ ++ userdom_home_manager($1_dbusd_t) ++ + ############################## + # + # Local policy + # + +- allow $3 $1_dbusd_t:unix_stream_socket connectto; +- allow $3 $1_dbusd_t:dbus { send_msg acquire_svc }; +- allow $3 $1_dbusd_t:fd use; +- +- allow $3 system_dbusd_t:dbus { send_msg acquire_svc }; ++ # For connecting to the bus ++ allow $3 $1_dbusd_t:unix_stream_socket { connectto rw_socket_perms }; + +- allow $3 { session_dbusd_home_t session_dbusd_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 { session_dbusd_home_t session_dbusd_tmp_t }:file { manage_file_perms relabel_file_perms }; +- userdom_user_home_dir_filetrans($3, session_dbusd_home_t, dir, ".dbus") ++ # SE-DBus specific permissions ++ allow { dbusd_unconfined $3 } $1_dbusd_t:dbus { send_msg acquire_svc }; ++ allow $3 system_dbusd_t:dbus { send_msg acquire_svc }; + + domtrans_pattern($3, dbusd_exec_t, $1_dbusd_t) + + ps_process_pattern($3, $1_dbusd_t) +- allow $3 $1_dbusd_t:process { ptrace signal_perms }; ++ allow $3 $1_dbusd_t:process signal_perms; + +- allow $1_dbusd_t $3:process sigkill; ++ tunable_policy(`deny_ptrace',`',` ++ allow $3 $1_dbusd_t:process ptrace; ++ ') + +- corecmd_bin_domtrans($1_dbusd_t, $3) +- corecmd_shell_domtrans($1_dbusd_t, $3) ++ # cjp: this seems very broken ++ corecmd_bin_domtrans($1_dbusd_t, $1_t) ++ corecmd_shell_domtrans($1_dbusd_t, $1_t) ++ allow $1_dbusd_t $3:process sigkill; ++ allow $3 $1_dbusd_t:fd use; ++ allow $3 $1_dbusd_t:fifo_file rw_fifo_file_perms; + + auth_use_nsswitch($1_dbusd_t) + +- ifdef(`hide_broken_symptoms',` +- dontaudit $3 $1_dbusd_t:netlink_selinux_socket { read write }; ++ logging_send_syslog_msg($1_dbusd_t) ++ ++ optional_policy(` ++ mozilla_domtrans_spec($1_dbusd_t, $1_t) + ') + ') + + ####################################### + ## + ## Template for creating connections to +-## the system bus. ++## the system DBUS. + ## + ## + ## +@@ -103,91 +129,88 @@ template(`dbus_role_template',` + # + interface(`dbus_system_bus_client',` + gen_require(` +- attribute dbusd_system_bus_client; +- type system_dbusd_t, system_dbusd_var_run_t, system_dbusd_var_lib_t; ++ type system_dbusd_t, system_dbusd_t; ++ type system_dbusd_var_run_t, system_dbusd_var_lib_t; + class dbus send_msg; ++ attribute dbusd_unconfined; + ') + +- typeattribute $1 dbusd_system_bus_client; +- ++ # SE-DBus specific permissions + allow $1 { system_dbusd_t self }:dbus send_msg; +- allow system_dbusd_t $1:dbus send_msg; ++ allow { system_dbusd_t dbusd_unconfined } $1:dbus send_msg; + +- files_search_var_lib($1) + read_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) ++ files_search_var_lib($1) + ++ dev_read_urand($1) ++ ++ # For connecting to the bus + files_search_pids($1) + stream_connect_pattern($1, system_dbusd_var_run_t, system_dbusd_var_run_t, system_dbusd_t) +- + dbus_read_config($1) ++ ++ optional_policy(` ++ unconfined_server_dbus_chat($1) ++ ') + ') + + ####################################### + ## +-## Acquire service on DBUS +-## session bus. ++## Creating connections to specified ++## DBUS sessions. + ## +-## ++## + ## +-## Domain allowed access. ++## The prefix of the user role (e.g., user ++## is the prefix for user_r). + ## + ## +-# +-interface(`dbus_connect_session_bus',` +- refpolicywarn(`$0($*) has been deprecated, use dbus_connect_all_session_bus() instead.') +- dbus_connect_all_session_bus($1) +-') +- +-####################################### +-## +-## Acquire service on all DBUS +-## session busses. +-## + ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`dbus_connect_all_session_bus',` ++interface(`dbus_session_client',` + gen_require(` +- attribute session_bus_type; +- class dbus acquire_svc; ++ class dbus send_msg; ++ type $1_dbusd_t; + ') + +- allow $1 session_bus_type:dbus acquire_svc; ++ allow $2 $1_dbusd_t:fd use; ++ allow $2 { $1_dbusd_t self }:dbus send_msg; ++ allow $2 $1_dbusd_t:unix_stream_socket connectto; + ') + + ####################################### + ## +-## Acquire service on specified +-## DBUS session bus. ++## Template for creating connections to ++## a user DBUS. + ## +-## +-## +-## The prefix of the user role (e.g., user +-## is the prefix for user_r). +-## +-## + ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`dbus_connect_spec_session_bus',` ++interface(`dbus_session_bus_client',` + gen_require(` +- type $1_dbusd_t; +- class dbus acquire_svc; ++ attribute session_bus_type; ++ class dbus send_msg; + ') + +- allow $2 $1_dbusd_t:dbus acquire_svc; ++ # SE-DBus specific permissions ++ allow $1 { session_bus_type self }:dbus send_msg; ++ ++ # For connecting to the bus ++ allow $1 session_bus_type:unix_stream_socket connectto; ++ ++ allow session_bus_type $1:process sigkill; + ') + +-####################################### ++######################################## + ## +-## Creating connections to DBUS +-## session bus. ++## Send a message the session DBUS. + ## + ## + ## +@@ -195,15 +218,18 @@ interface(`dbus_connect_spec_session_bus',` + ## + ## + # +-interface(`dbus_session_bus_client',` +- refpolicywarn(`$0($*) has been deprecated, use dbus_all_session_bus_client() instead.') +- dbus_all_session_bus_client($1) ++interface(`dbus_send_session_bus',` ++ gen_require(` ++ attribute session_bus_type; ++ class dbus send_msg; ++ ') ++ ++ allow $1 session_bus_type:dbus send_msg; + ') + +-####################################### ++######################################## + ## +-## Creating connections to all +-## DBUS session busses. ++## Read dbus configuration. + ## + ## + ## +@@ -211,57 +237,39 @@ interface(`dbus_session_bus_client',` + ## + ## + # +-interface(`dbus_all_session_bus_client',` ++interface(`dbus_read_config',` + gen_require(` +- attribute session_bus_type, dbusd_session_bus_client; +- class dbus send_msg; ++ type dbusd_etc_t; + ') + +- typeattribute $1 dbusd_session_bus_client; +- +- allow $1 { session_bus_type self }:dbus send_msg; +- allow session_bus_type $1:dbus send_msg; +- +- allow $1 session_bus_type:unix_stream_socket connectto; +- allow $1 session_bus_type:fd use; ++ allow $1 dbusd_etc_t:dir list_dir_perms; ++ allow $1 dbusd_etc_t:file read_file_perms; + ') + +-####################################### ++######################################## + ## +-## Creating connections to specified +-## DBUS session bus. ++## Read system dbus lib files. + ## +-## +-## +-## The prefix of the user role (e.g., user +-## is the prefix for user_r). +-## +-## + ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`dbus_spec_session_bus_client',` ++interface(`dbus_read_lib_files',` + gen_require(` +- attribute dbusd_session_bus_client; +- type $1_dbusd_t; +- class dbus send_msg; ++ type system_dbusd_var_lib_t; + ') + +- typeattribute $2 dbusd_session_bus_client; +- +- allow $2 { $1_dbusd_t self }:dbus send_msg; +- allow $1_dbusd_t $2:dbus send_msg; +- +- allow $2 $1_dbusd_t:unix_stream_socket connectto; +- allow $2 $1_dbusd_t:fd use; ++ files_search_var_lib($1) ++ read_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) ++ read_lnk_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) + ') + +-####################################### ++######################################## + ## +-## Send messages to DBUS session bus. ++## Create, read, write, and delete ++## system dbus lib files. + ## + ## + ## +@@ -269,15 +277,19 @@ interface(`dbus_spec_session_bus_client',` + ## + ## + # +-interface(`dbus_send_session_bus',` +- refpolicywarn(`$0($*) has been deprecated, use dbus_send_all_session_bus() instead.') +- dbus_send_all_session_bus($1) ++interface(`dbus_manage_lib_files',` ++ gen_require(` ++ type system_dbusd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) + ') + +-####################################### ++######################################## + ## +-## Send messages to all DBUS +-## session busses. ++## Connect to the system DBUS ++## for service (acquire_svc). + ## + ## + ## +@@ -285,44 +297,52 @@ interface(`dbus_send_session_bus',` + ## + ## + # +-interface(`dbus_send_all_session_bus',` ++interface(`dbus_connect_session_bus',` + gen_require(` + attribute session_bus_type; +- class dbus send_msg; ++ class dbus acquire_svc; + ') + +- allow $1 dbus_session_bus_type:dbus send_msg; ++ allow $1 session_bus_type:dbus acquire_svc; + ') + +-####################################### ++######################################## + ## +-## Send messages to specified +-## DBUS session busses. ++## Allow a application domain to be started ++## by the session dbus. + ## +-## ++## + ## +-## The prefix of the user role (e.g., user +-## is the prefix for user_r). ++## User domain prefix to be used. + ## + ## + ## + ## +-## Domain allowed access. ++## Type to be used as a domain. ++## ++## ++## ++## ++## Type of the program to be used as an ++## entry point to this domain. + ## + ## + # +-interface(`dbus_send_spec_session_bus',` ++interface(`dbus_session_domain',` + gen_require(` + type $1_dbusd_t; +- class dbus send_msg; + ') + +- allow $2 $1_dbusd_t:dbus send_msg; ++ domtrans_pattern($1_dbusd_t, $2, $3) ++ ++ dbus_session_bus_client($3) ++ dbus_connect_session_bus($3) + ') + + ######################################## + ## +-## Read dbus configuration content. ++## Connect to the system DBUS ++## for service (acquire_svc). + ## + ## + ## +@@ -330,18 +350,18 @@ interface(`dbus_send_spec_session_bus',` + ## + ## + # +-interface(`dbus_read_config',` ++interface(`dbus_connect_system_bus',` + gen_require(` +- type dbusd_etc_t; ++ type system_dbusd_t; ++ class dbus acquire_svc; + ') + +- allow $1 dbusd_etc_t:dir list_dir_perms; +- allow $1 dbusd_etc_t:file read_file_perms; ++ allow $1 system_dbusd_t:dbus acquire_svc; + ') + + ######################################## + ## +-## Read system dbus lib files. ++## Send a message on the system DBUS. + ## + ## + ## +@@ -349,20 +369,18 @@ interface(`dbus_read_config',` + ## + ## + # +-interface(`dbus_read_lib_files',` ++interface(`dbus_send_system_bus',` + gen_require(` +- type system_dbusd_var_lib_t; ++ type system_dbusd_t; ++ class dbus send_msg; + ') + +- files_search_var_lib($1) +- read_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) +- read_lnk_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) ++ allow $1 system_dbusd_t:dbus send_msg; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## system dbus lib files. ++## Allow unconfined access to the system DBUS. + ## + ## + ## +@@ -370,26 +388,20 @@ interface(`dbus_read_lib_files',` + ## + ## + # +-interface(`dbus_manage_lib_files',` ++interface(`dbus_system_bus_unconfined',` + gen_require(` +- type system_dbusd_var_lib_t; ++ type system_dbusd_t; ++ class dbus all_dbus_perms; + ') + +- files_search_var_lib($1) +- manage_files_pattern($1, system_dbusd_var_lib_t, system_dbusd_var_lib_t) ++ allow $1 system_dbusd_t:dbus *; + ') + + ######################################## + ## +-## Allow a application domain to be +-## started by the specified session bus. ++## Create a domain for processes ++## which can be started by the system dbus + ## +-## +-## +-## The prefix of the user role (e.g., user +-## is the prefix for user_r). +-## +-## + ## + ## + ## Type to be used as a domain. +@@ -397,199 +409,251 @@ interface(`dbus_manage_lib_files',` + ## + ## + ## +-## Type of the program to be used as an +-## entry point to this domain. ++## Type of the program to be used as an entry point to this domain. + ## + ## + # +-interface(`dbus_session_domain',` +- refpolicywarn(`$0($*) has been deprecated, use dbus_all_session_domain() instead.') +- dbus_all_session_domain($1, $2) ++interface(`dbus_system_domain',` ++ gen_require(` ++ attribute system_bus_type; ++ type system_dbusd_t; ++ role system_r; ++ ') ++ typeattribute $1 system_bus_type; ++ ++ domain_type($1) ++ domain_entry_file($1, $2) ++ ++ domtrans_pattern(system_dbusd_t, $2, $1) ++ allow system_dbusd_t $2:file map; ++ init_system_domain($1, $2) ++ ++ ps_process_pattern($1, system_dbusd_t) ++ + ') + + ######################################## + ## +-## Allow a application domain to be +-## started by the specified session bus. ++## Use and inherit system DBUS file descriptors. + ## + ## + ## +-## Type to be used as a domain. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`dbus_use_system_bus_fds',` ++ gen_require(` ++ type system_dbusd_t; ++ ') ++ ++ allow $1 system_dbusd_t:fd use; ++') ++ ++######################################## ++## ++## Allow unconfined access to the system DBUS. ++## ++## + ## +-## Type of the program to be used as an +-## entry point to this domain. ++## Domain allowed access. + ## + ## + # +-interface(`dbus_all_session_domain',` ++interface(`dbus_unconfined',` + gen_require(` +- type session_bus_type; ++ attribute dbusd_unconfined; + ') + +- domtrans_pattern(session_bus_type, $2, $1) +- +- dbus_all_session_bus_client($1) +- dbus_connect_all_session_bus($1) ++ typeattribute $1 dbusd_unconfined; + ') + + ######################################## + ## +-## Allow a application domain to be +-## started by the specified session bus. ++## Delete all dbus pid files + ## +-## ++## + ## +-## The prefix of the user role (e.g., user +-## is the prefix for user_r). ++## Domain allowed access. + ## + ## ++# ++interface(`dbus_delete_pid_files',` ++ gen_require(` ++ type system_dbusd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ delete_files_pattern($1, system_dbusd_var_run_t, system_dbusd_var_run_t) ++') ++ ++######################################## ++## ++## Read all dbus pid files ++## + ## + ## +-## Type to be used as a domain. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`dbus_read_pid_files',` ++ gen_require(` ++ type system_dbusd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, system_dbusd_var_run_t, system_dbusd_var_run_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to connect to ++## session bus types with a unix ++## stream socket. ++## ++## + ## +-## Type of the program to be used as an +-## entry point to this domain. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_spec_session_domain',` ++interface(`dbus_dontaudit_stream_connect_session_bus',` + gen_require(` +- type $1_dbusd_t; ++ attribute session_bus_type; + ') + +- domtrans_pattern($1_dbusd_t, $2, $3) +- +- dbus_spec_session_bus_client($1, $2) +- dbus_connect_spec_session_bus($1, $2) ++ dontaudit $1 session_bus_type:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Acquire service on the DBUS system bus. ++## Allow attempts to connect to ++## session bus types with a unix ++## stream socket. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_connect_system_bus',` ++interface(`dbus_stream_connect_session_bus',` + gen_require(` +- type system_dbusd_t; +- class dbus acquire_svc; ++ attribute session_bus_type; + ') + +- allow $1 system_dbusd_t:dbus acquire_svc; ++ allow $1 session_bus_type:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Send messages to the DBUS system bus. ++## Do not audit attempts to send dbus ++## messages to session bus types. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_send_system_bus',` ++interface(`dbus_chat_session_bus',` + gen_require(` +- type system_dbusd_t; ++ attribute session_bus_type; + class dbus send_msg; + ') + +- allow $1 system_dbusd_t:dbus send_msg; ++ allow $1 session_bus_type:dbus send_msg; ++ allow session_bus_type $1:dbus send_msg; + ') + + ######################################## + ## +-## Unconfined access to DBUS system bus. ++## Do not audit attempts to send dbus ++## messages to session bus types. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_system_bus_unconfined',` ++interface(`dbus_dontaudit_chat_session_bus',` + gen_require(` +- type system_dbusd_t; +- class dbus all_dbus_perms; ++ attribute session_bus_type; ++ class dbus send_msg; + ') + +- allow $1 system_dbusd_t:dbus *; ++ dontaudit $1 session_bus_type:dbus send_msg; + ') + + ######################################## + ## +-## Create a domain for processes which +-## can be started by the DBUS system bus. ++## Do not audit attempts to send dbus ++## messages to system bus types. + ## + ## + ## +-## Type to be used as a domain. ++## Domain to not audit. + ## + ## +-## ++# ++interface(`dbus_dontaudit_chat_system_bus',` ++ gen_require(` ++ attribute system_bus_type; ++ class dbus send_msg; ++ ') ++ ++ dontaudit $1 system_bus_type:dbus send_msg; ++ dontaudit system_bus_type $1:dbus send_msg; ++') ++ ++ ++######################################## ++## ++## Allow attempts to connect to ++## session bus types with a unix ++## stream socket. ++## ++## + ## +-## Type of the program to be used as an entry point to this domain. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_system_domain',` ++interface(`dbus_stream_connect_system_dbusd',` + gen_require(` + type system_dbusd_t; +- role system_r; + ') + +- domain_type($1) +- domain_entry_file($1, $2) +- +- role system_r types $1; +- +- domtrans_pattern(system_dbusd_t, $2, $1) +- +- dbus_system_bus_client($1) +- dbus_connect_system_bus($1) +- +- ps_process_pattern(system_dbusd_t, $1) +- +- userdom_read_all_users_state($1) +- +- ifdef(`hide_broken_symptoms', ` +- dontaudit $1 system_dbusd_t:netlink_selinux_socket { read write }; +- ') ++ allow $1 system_dbusd_t:unix_stream_socket connectto; + ') + ++ + ######################################## + ## +-## Use and inherit DBUS system bus +-## file descriptors. ++## Do not audit attempts to connect to ++## session bus types with a unix ++## stream socket. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_use_system_bus_fds',` ++interface(`dbus_dontaudit_stream_connect_system_dbusd',` + gen_require(` +- type system_dbusd_t; ++ attribute system_dbusd_t; + ') + +- allow $1 system_dbusd_t:fd use; ++ dontaudit $1 system_dbusd_t:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Do not audit attempts to read and +-## write DBUS system bus TCP sockets. ++## Allow attempts to send dbus ++## messages to system bus types. + ## + ## + ## +@@ -597,28 +661,50 @@ interface(`dbus_use_system_bus_fds',` + ## + ## + # +-interface(`dbus_dontaudit_system_bus_rw_tcp_sockets',` ++interface(`dbus_chat_system_bus',` + gen_require(` +- type system_dbusd_t; ++ attribute system_bus_type; ++ class dbus send_msg; + ') + +- dontaudit $1 system_dbusd_t:tcp_socket { read write }; ++ allow $1 system_bus_type:dbus send_msg; ++ allow system_bus_type $1:dbus send_msg; ++') ++ ++####################################### ++## ++## Transition to dbus named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dbus_filetrans_named_content_system',` ++ gen_require(` ++ type system_dbusd_var_lib_t; ++ ') ++ files_var_filetrans($1, system_dbusd_var_lib_t, dir, "ibus") + ') + + ######################################## + ## +-## Unconfined access to DBUS. ++## Allow attempts to send dbus ++## messages to system dbusd type. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`dbus_unconfined',` ++interface(`dbus_acquire_svc_system_dbusd',` + gen_require(` +- attribute dbusd_unconfined; ++ type system_dbusd_t; ++ class dbus acquire_svc; + ') + +- typeattribute $1 dbusd_unconfined; ++ allow $1 system_dbusd_t:dbus acquire_svc; ++ + ') +diff --git a/dbus.te b/dbus.te +index c9998c80da..843dd09ec4 100644 +--- a/dbus.te ++++ b/dbus.te +@@ -4,17 +4,15 @@ gen_require(` + class dbus all_dbus_perms; + ') + +-######################################## ++############################## + # +-# Declarations ++# Delcarations + # + + attribute dbusd_unconfined; ++attribute system_bus_type; + attribute session_bus_type; + +-attribute dbusd_system_bus_client; +-attribute dbusd_session_bus_client; +- + type dbusd_etc_t; + files_config_file(dbusd_etc_t) + +@@ -22,9 +20,6 @@ type dbusd_exec_t; + corecmd_executable_file(dbusd_exec_t) + typealias dbusd_exec_t alias system_dbusd_exec_t; + +-type session_dbusd_home_t; +-userdom_user_home_content(session_dbusd_home_t) +- + type session_dbusd_tmp_t; + typealias session_dbusd_tmp_t alias { user_dbusd_tmp_t staff_dbusd_tmp_t sysadm_dbusd_tmp_t }; + typealias session_dbusd_tmp_t alias { auditadm_dbusd_tmp_t secadm_dbusd_tmp_t }; +@@ -41,7 +36,8 @@ files_type(system_dbusd_var_lib_t) + + type system_dbusd_var_run_t; + files_pid_file(system_dbusd_var_run_t) +-init_daemon_run_dir(system_dbusd_var_run_t, "dbus") ++init_sock_file(system_dbusd_var_run_t) ++mls_trusted_object(system_dbusd_var_run_t) + + ifdef(`enable_mcs',` + init_ranged_system_domain(system_dbusd_t, dbusd_exec_t, s0 - mcs_systemhigh) +@@ -51,59 +47,64 @@ ifdef(`enable_mls',` + init_ranged_system_domain(system_dbusd_t, dbusd_exec_t, s0 - mls_systemhigh) + ') + +-######################################## ++############################## + # +-# Local policy ++# System bus local policy + # + +-allow system_dbusd_t self:capability { sys_resource dac_override setgid setpcap setuid }; ++# dac_override: /var/run/dbus is owned by messagebus on Debian ++# cjp: dac_override should probably go in a distro_debian ++allow system_dbusd_t self:capability2 block_suspend; ++allow system_dbusd_t self:capability { sys_resource dac_read_search dac_override setgid setpcap setuid }; + dontaudit system_dbusd_t self:capability sys_tty_config; + allow system_dbusd_t self:process { getattr getsched signal_perms setpgid getcap setcap setrlimit }; + allow system_dbusd_t self:fifo_file rw_fifo_file_perms; + allow system_dbusd_t self:dbus { send_msg acquire_svc }; +-allow system_dbusd_t self:unix_stream_socket { accept connectto listen }; ++allow system_dbusd_t self:unix_stream_socket { connectto create_stream_socket_perms connectto }; ++allow system_dbusd_t self:unix_dgram_socket create_socket_perms; ++# Receive notifications of policy reloads and enforcing status changes. + allow system_dbusd_t self:netlink_selinux_socket { create bind read }; + ++can_exec(system_dbusd_t, dbusd_exec_t) ++ + allow system_dbusd_t dbusd_etc_t:dir list_dir_perms; + read_files_pattern(system_dbusd_t, dbusd_etc_t, dbusd_etc_t) + read_lnk_files_pattern(system_dbusd_t, dbusd_etc_t, dbusd_etc_t) + + manage_dirs_pattern(system_dbusd_t, system_dbusd_tmp_t, system_dbusd_tmp_t) + manage_files_pattern(system_dbusd_t, system_dbusd_tmp_t, system_dbusd_tmp_t) +-files_tmp_filetrans(system_dbusd_t, system_dbusd_tmp_t, { dir file }) ++files_tmp_filetrans(system_dbusd_t, system_dbusd_tmp_t, { file dir }) + + read_files_pattern(system_dbusd_t, system_dbusd_var_lib_t, system_dbusd_var_lib_t) + + manage_dirs_pattern(system_dbusd_t, system_dbusd_var_run_t, system_dbusd_var_run_t) + manage_files_pattern(system_dbusd_t, system_dbusd_var_run_t, system_dbusd_var_run_t) + manage_sock_files_pattern(system_dbusd_t, system_dbusd_var_run_t, system_dbusd_var_run_t) +-files_pid_filetrans(system_dbusd_t, system_dbusd_var_run_t, { dir file }) +- +-can_exec(system_dbusd_t, dbusd_exec_t) ++files_pid_filetrans(system_dbusd_t, system_dbusd_var_run_t, { file dir }) + + kernel_read_system_state(system_dbusd_t) + kernel_read_kernel_sysctls(system_dbusd_t) +- +-corecmd_list_bin(system_dbusd_t) +-corecmd_read_bin_pipes(system_dbusd_t) +-corecmd_read_bin_sockets(system_dbusd_t) +-corecmd_exec_shell(system_dbusd_t) ++kernel_stream_connect(system_dbusd_t) + + dev_read_urand(system_dbusd_t) + dev_read_sysfs(system_dbusd_t) + +-domain_use_interactive_fds(system_dbusd_t) +-domain_read_all_domains_state(system_dbusd_t) ++dev_rw_inherited_input_dev(system_dbusd_t) ++dev_rw_inherited_dri(system_dbusd_t) + +-files_list_home(system_dbusd_t) +-files_read_usr_files(system_dbusd_t) ++dev_rw_nvme(system_dbusd_t) ++ ++files_rw_inherited_non_security_files(system_dbusd_t) + + fs_getattr_all_fs(system_dbusd_t) + fs_list_inotifyfs(system_dbusd_t) + fs_search_auto_mountpoints(system_dbusd_t) +-fs_search_cgroup_dirs(system_dbusd_t) + fs_dontaudit_list_nfs(system_dbusd_t) + ++storage_rw_inherited_fixed_disk_dev(system_dbusd_t) ++storage_rw_inherited_removable_device(system_dbusd_t) ++ ++mls_trusted_object(system_dbusd_t) + mls_fd_use_all_levels(system_dbusd_t) + mls_rangetrans_target(system_dbusd_t) + mls_file_read_all_levels(system_dbusd_t) +@@ -123,66 +124,174 @@ term_dontaudit_use_console(system_dbusd_t) + auth_use_nsswitch(system_dbusd_t) + auth_read_pam_console_data(system_dbusd_t) + ++corecmd_list_bin(system_dbusd_t) ++corecmd_read_bin_pipes(system_dbusd_t) ++corecmd_read_bin_sockets(system_dbusd_t) ++# needed for system-tools-backends ++corecmd_exec_shell(system_dbusd_t) ++corecmd_exec_bin(system_dbusd_t) ++ ++domain_use_interactive_fds(system_dbusd_t) ++domain_read_all_domains_state(system_dbusd_t) ++ ++files_list_home(system_dbusd_t) ++ + init_use_fds(system_dbusd_t) + init_use_script_ptys(system_dbusd_t) +-init_all_labeled_script_domtrans(system_dbusd_t) ++init_domtrans_script(system_dbusd_t) ++init_rw_stream_sockets(system_dbusd_t) ++init_status(system_dbusd_t) + + logging_send_audit_msgs(system_dbusd_t) + logging_send_syslog_msg(system_dbusd_t) + +-miscfiles_read_localization(system_dbusd_t) + miscfiles_read_generic_certs(system_dbusd_t) + + seutil_read_config(system_dbusd_t) + seutil_read_default_contexts(system_dbusd_t) ++seutil_sigchld_newrole(system_dbusd_t) + + userdom_dontaudit_use_unpriv_user_fds(system_dbusd_t) + userdom_dontaudit_search_user_home_dirs(system_dbusd_t) + ++userdom_home_reader(system_dbusd_t) ++ ++optional_policy(` ++ bind_domtrans(system_dbusd_t) ++') ++ + optional_policy(` + bluetooth_stream_connect(system_dbusd_t) + ') + + optional_policy(` +- policykit_read_lib(system_dbusd_t) ++ boltd_write_var_run_pipes(system_dbusd_t) ++') ++ ++optional_policy(` ++ cpufreqselector_dbus_chat(system_dbusd_t) ++') ++ ++optional_policy(` ++ getty_start_services(system_dbusd_t) ++') ++ ++optional_policy(` ++ gnome_exec_gconf(system_dbusd_t) ++ gnome_read_inherited_home_icc_data_files(system_dbusd_t) ++') ++ ++optional_policy(` ++ nis_use_ypbind(system_dbusd_t) ++') ++ ++optional_policy(` ++ networkmanager_initrc_domtrans(system_dbusd_t) ++ networkmanager_systemctl(system_dbusd_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(system_dbusd_t) ++ policykit_domtrans_auth(system_dbusd_t) ++ policykit_search_lib(system_dbusd_t) + ') + + optional_policy(` +- seutil_sigchld_newrole(system_dbusd_t) ++ snapper_read_inherited_pipe(system_dbusd_t) ++') ++ ++optional_policy(` ++ sysnet_domtrans_dhcpc(system_dbusd_t) ++') ++ ++optional_policy(` ++ systemd_use_fds_logind(system_dbusd_t) ++ systemd_write_inherited_logind_sessions_pipes(system_dbusd_t) ++ systemd_write_inhibit_pipes(system_dbusd_t) ++# These are caused by broken systemd patch ++ systemd_start_power_services(system_dbusd_t) ++ systemd_config_all_services(system_dbusd_t) ++ files_config_all_files(system_dbusd_t) + ') + + optional_policy(` + udev_read_db(system_dbusd_t) + ') + ++optional_policy(` ++ # /var/lib/gdm/.local/share/icc/edid-0a027915105823af34f99b1704e80336.icc ++ xserver_read_inherited_xdm_lib_files(system_dbusd_t) ++') ++ ++optional_policy(` ++ unconfined_server_domtrans(system_dbusd_t) ++') ++ + ######################################## + # +-# Common session bus local policy ++# system_bus_type rules + # ++role system_r types system_bus_type; ++dontaudit system_bus_type self:capability net_admin; ++ ++allow system_bus_type system_dbusd_t:unix_stream_socket rw_socket_perms; ++ ++fs_search_all(system_bus_type) ++ ++dbus_system_bus_client(system_bus_type) ++dbus_connect_system_bus(system_bus_type) ++ ++init_status(system_bus_type) ++init_stream_connect(system_bus_type) ++init_dgram_send(system_bus_type) ++init_use_fds(system_bus_type) ++init_rw_stream_sockets(system_bus_type) ++ ++ps_process_pattern(system_dbusd_t, system_bus_type) ++ ++userdom_dontaudit_search_admin_dir(system_bus_type) ++userdom_read_all_users_state(system_bus_type) ++ ++optional_policy(` ++ abrt_stream_connect(system_bus_type) ++') ++ ++optional_policy(` ++ rpm_script_dbus_chat(system_bus_type) ++') ++ ++optional_policy(` ++ unconfined_dbus_send(system_bus_type) ++') ++ ++ifdef(`hide_broken_symptoms',` ++ dontaudit system_bus_type system_dbusd_t:netlink_selinux_socket { read write }; ++') + ++######################################## ++# ++# session_bus_type rules ++# ++allow session_bus_type self:capability2 block_suspend; + dontaudit session_bus_type self:capability sys_resource; + allow session_bus_type self:process { getattr sigkill signal }; +-dontaudit session_bus_type self:process { ptrace setrlimit }; ++dontaudit session_bus_type self:process setrlimit; + allow session_bus_type self:file { getattr read write }; + allow session_bus_type self:fifo_file rw_fifo_file_perms; + allow session_bus_type self:dbus { send_msg acquire_svc }; +-allow session_bus_type self:unix_stream_socket { accept listen }; +-allow session_bus_type self:tcp_socket { accept listen }; ++allow session_bus_type self:unix_stream_socket create_stream_socket_perms; ++allow session_bus_type self:unix_dgram_socket create_socket_perms; ++allow session_bus_type self:tcp_socket create_stream_socket_perms; + allow session_bus_type self:netlink_selinux_socket create_socket_perms; + + allow session_bus_type dbusd_etc_t:dir list_dir_perms; + read_files_pattern(session_bus_type, dbusd_etc_t, dbusd_etc_t) + read_lnk_files_pattern(session_bus_type, dbusd_etc_t, dbusd_etc_t) + +-manage_dirs_pattern(session_bus_type, session_dbusd_home_t, session_dbusd_home_t) +-manage_files_pattern(session_bus_type, session_dbusd_home_t, session_dbusd_home_t) +-userdom_user_home_dir_filetrans(session_bus_type, session_dbusd_home_t, dir, ".dbus") +- + manage_dirs_pattern(session_bus_type, session_dbusd_tmp_t, session_dbusd_tmp_t) + manage_files_pattern(session_bus_type, session_dbusd_tmp_t, session_dbusd_tmp_t) +-files_tmp_filetrans(session_bus_type, session_dbusd_tmp_t, { dir file }) ++files_tmp_filetrans(session_bus_type, session_dbusd_tmp_t, { file dir }) + +-kernel_read_system_state(session_bus_type) + kernel_read_kernel_sysctls(session_bus_type) + + corecmd_list_bin(session_bus_type) +@@ -191,23 +300,18 @@ corecmd_read_bin_files(session_bus_type) + corecmd_read_bin_pipes(session_bus_type) + corecmd_read_bin_sockets(session_bus_type) + +-corenet_all_recvfrom_unlabeled(session_bus_type) +-corenet_all_recvfrom_netlabel(session_bus_type) + corenet_tcp_sendrecv_generic_if(session_bus_type) + corenet_tcp_sendrecv_generic_node(session_bus_type) + corenet_tcp_sendrecv_all_ports(session_bus_type) + corenet_tcp_bind_generic_node(session_bus_type) +- +-corenet_sendrecv_all_server_packets(session_bus_type) + corenet_tcp_bind_reserved_port(session_bus_type) + + dev_read_urand(session_bus_type) + +-domain_read_all_domains_state(session_bus_type) + domain_use_interactive_fds(session_bus_type) ++domain_read_all_domains_state(session_bus_type) + + files_list_home(session_bus_type) +-files_read_usr_files(session_bus_type) + files_dontaudit_search_var(session_bus_type) + + fs_getattr_romfs(session_bus_type) +@@ -215,7 +319,6 @@ fs_getattr_xattr_fs(session_bus_type) + fs_list_inotifyfs(session_bus_type) + fs_dontaudit_list_nfs(session_bus_type) + +-selinux_get_fs_mount(session_bus_type) + selinux_validate_context(session_bus_type) + selinux_compute_access_vector(session_bus_type) + selinux_compute_create_context(session_bus_type) +@@ -225,18 +328,36 @@ selinux_compute_user_contexts(session_bus_type) + auth_read_pam_console_data(session_bus_type) + + logging_send_audit_msgs(session_bus_type) +-logging_send_syslog_msg(session_bus_type) +- +-miscfiles_read_localization(session_bus_type) + + seutil_read_config(session_bus_type) + seutil_read_default_contexts(session_bus_type) + +-term_use_all_terms(session_bus_type) ++term_use_all_inherited_terms(session_bus_type) ++ ++userdom_dontaudit_search_admin_dir(session_bus_type) ++userdom_manage_user_home_content_dirs(session_bus_type) ++userdom_manage_user_home_content_files(session_bus_type) ++userdom_manage_tmpfs_files(session_bus_type, file) ++userdom_tmpfs_filetrans(session_bus_type, file) + + optional_policy(` +- xserver_use_xdm_fds(session_bus_type) ++ gnome_read_config(session_bus_type) ++ gnome_read_gconf_home_files(session_bus_type) ++') ++ ++optional_policy(` ++ hal_dbus_chat(session_bus_type) ++') ++ ++optional_policy(` ++ thumb_domtrans(session_bus_type) ++') ++ ++optional_policy(` ++ xserver_search_xdm_lib(session_bus_type) + xserver_rw_xdm_pipes(session_bus_type) ++ xserver_use_xdm_fds(session_bus_type) ++ xserver_append_xdm_home_files(session_bus_type) + ') + + ######################################## +@@ -244,5 +365,9 @@ optional_policy(` + # Unconfined access to this module + # + +-allow dbusd_unconfined { system_dbusd_t session_bus_type dbusd_session_bus_client dbusd_system_bus_client }:dbus all_dbus_perms; +-allow { dbusd_session_bus_client dbusd_system_bus_client } dbusd_unconfined:dbus send_msg; ++allow dbusd_unconfined session_bus_type:dbus all_dbus_perms; ++allow dbusd_unconfined dbusd_unconfined:dbus all_dbus_perms; ++allow session_bus_type dbusd_unconfined:dbus send_msg; ++ ++kernel_stream_connect(session_bus_type) ++systemd_login_read_pid_files(session_bus_type) +diff --git a/dcc.fc b/dcc.fc +index 62d3c4e666..cef59a7523 100644 +--- a/dcc.fc ++++ b/dcc.fc +@@ -10,6 +10,8 @@ + /usr/libexec/dcc/dccifd -- gen_context(system_u:object_r:dccifd_exec_t,s0) + /usr/libexec/dcc/dccm -- gen_context(system_u:object_r:dccm_exec_t,s0) + ++/usr/libexec/dcc/start-dccifd -- gen_context(system_u:object_r:dccifd_exec_t,s0) ++ + /usr/sbin/dbclean -- gen_context(system_u:object_r:dcc_dbclean_exec_t,s0) + /usr/sbin/dccd -- gen_context(system_u:object_r:dccd_exec_t,s0) + /usr/sbin/dccifd -- gen_context(system_u:object_r:dccifd_exec_t,s0) +diff --git a/dcc.if b/dcc.if +index a5c21e0e87..46394219af 100644 +--- a/dcc.if ++++ b/dcc.if +@@ -173,6 +173,6 @@ interface(`dcc_stream_connect_dccifd',` + type dcc_var_t, dccifd_var_run_t, dccifd_t; + ') + +- files_search_var($1) ++ files_search_pids($1) + stream_connect_pattern($1, dcc_var_t, dccifd_var_run_t, dccifd_t) + ') +diff --git a/dcc.te b/dcc.te +index 353fa4a09f..a5e912fca2 100644 +--- a/dcc.te ++++ b/dcc.te +@@ -45,7 +45,7 @@ type dcc_var_t; + files_type(dcc_var_t) + + type dcc_var_run_t; +-files_type(dcc_var_run_t) ++files_pid_file(dcc_var_run_t) + + type dccd_t; + type dccd_exec_t; +@@ -94,15 +94,18 @@ allow cdcc_t dcc_var_t:dir list_dir_perms; + read_files_pattern(cdcc_t, dcc_var_t, dcc_var_t) + read_lnk_files_pattern(cdcc_t, dcc_var_t, dcc_var_t) + ++corenet_all_recvfrom_netlabel(cdcc_t) ++corenet_udp_sendrecv_generic_if(cdcc_t) ++corenet_udp_sendrecv_generic_node(cdcc_t) ++corenet_udp_sendrecv_all_ports(cdcc_t) ++ + files_read_etc_runtime_files(cdcc_t) + + auth_use_nsswitch(cdcc_t) + + logging_send_syslog_msg(cdcc_t) + +-miscfiles_read_localization(cdcc_t) +- +-userdom_use_user_terminals(cdcc_t) ++userdom_use_inherited_user_terminals(cdcc_t) + + ######################################## + # +@@ -113,6 +116,8 @@ allow dcc_client_t self:capability { setuid setgid }; + + allow dcc_client_t dcc_client_map_t:file rw_file_perms; + ++domtrans_pattern(dcc_client_t, dccifd_exec_t, dccifd_t) ++ + manage_dirs_pattern(dcc_client_t, dcc_client_tmp_t, dcc_client_tmp_t) + manage_files_pattern(dcc_client_t, dcc_client_tmp_t, dcc_client_tmp_t) + files_tmp_filetrans(dcc_client_t, dcc_client_tmp_t, { file dir }) +@@ -123,6 +128,12 @@ read_lnk_files_pattern(dcc_client_t, dcc_var_t, dcc_var_t) + + kernel_read_system_state(dcc_client_t) + ++corenet_all_recvfrom_netlabel(dcc_client_t) ++corenet_udp_sendrecv_generic_if(dcc_client_t) ++corenet_udp_sendrecv_generic_node(dcc_client_t) ++corenet_udp_sendrecv_all_ports(dcc_client_t) ++corenet_udp_bind_generic_node(dcc_client_t) ++ + files_read_etc_runtime_files(dcc_client_t) + + fs_getattr_all_fs(dcc_client_t) +@@ -131,12 +142,10 @@ auth_use_nsswitch(dcc_client_t) + + logging_send_syslog_msg(dcc_client_t) + +-miscfiles_read_localization(dcc_client_t) +- +-userdom_use_user_terminals(dcc_client_t) ++userdom_use_inherited_user_terminals(dcc_client_t) + + optional_policy(` +- amavis_read_spool_files(dcc_client_t) ++ antivirus_read_db(dcc_client_t) + ') + + optional_policy(` +@@ -160,15 +169,18 @@ manage_lnk_files_pattern(dcc_dbclean_t, dcc_var_t, dcc_var_t) + + kernel_read_system_state(dcc_dbclean_t) + ++corenet_all_recvfrom_netlabel(dcc_dbclean_t) ++corenet_udp_sendrecv_generic_if(dcc_dbclean_t) ++corenet_udp_sendrecv_generic_node(dcc_dbclean_t) ++corenet_udp_sendrecv_all_ports(dcc_dbclean_t) ++ + files_read_etc_runtime_files(dcc_dbclean_t) + + auth_use_nsswitch(dcc_dbclean_t) + + logging_send_syslog_msg(dcc_dbclean_t) + +-miscfiles_read_localization(dcc_dbclean_t) +- +-userdom_use_user_terminals(dcc_dbclean_t) ++userdom_use_inherited_user_terminals(dcc_dbclean_t) + + ######################################## + # +@@ -202,7 +214,6 @@ files_pid_filetrans(dccd_t, dccd_var_run_t, { dir file }) + kernel_read_system_state(dccd_t) + kernel_read_kernel_sysctls(dccd_t) + +-corenet_all_recvfrom_unlabeled(dccd_t) + corenet_all_recvfrom_netlabel(dccd_t) + corenet_udp_sendrecv_generic_if(dccd_t) + corenet_udp_sendrecv_generic_node(dccd_t) +@@ -227,8 +238,6 @@ auth_use_nsswitch(dccd_t) + + logging_send_syslog_msg(dccd_t) + +-miscfiles_read_localization(dccd_t) +- + userdom_dontaudit_use_unpriv_user_fds(dccd_t) + userdom_dontaudit_search_user_home_dirs(dccd_t) + +@@ -269,6 +278,11 @@ files_pid_filetrans(dccifd_t, dccifd_var_run_t, file) + kernel_read_system_state(dccifd_t) + kernel_read_kernel_sysctls(dccifd_t) + ++corenet_all_recvfrom_netlabel(dccifd_t) ++corenet_udp_sendrecv_generic_if(dccifd_t) ++corenet_udp_sendrecv_generic_node(dccifd_t) ++corenet_udp_sendrecv_all_ports(dccifd_t) ++ + dev_read_sysfs(dccifd_t) + + domain_use_interactive_fds(dccifd_t) +@@ -282,8 +296,6 @@ auth_use_nsswitch(dccifd_t) + + logging_send_syslog_msg(dccifd_t) + +-miscfiles_read_localization(dccifd_t) +- + userdom_dontaudit_use_unpriv_user_fds(dccifd_t) + userdom_dontaudit_search_user_home_dirs(dccifd_t) + +@@ -324,6 +336,11 @@ files_pid_filetrans(dccm_t, dccm_var_run_t, file) + kernel_read_system_state(dccm_t) + kernel_read_kernel_sysctls(dccm_t) + ++corenet_all_recvfrom_netlabel(dccm_t) ++corenet_udp_sendrecv_generic_if(dccm_t) ++corenet_udp_sendrecv_generic_node(dccm_t) ++corenet_udp_sendrecv_all_ports(dccm_t) ++ + dev_read_sysfs(dccm_t) + + domain_use_interactive_fds(dccm_t) +@@ -337,8 +354,6 @@ auth_use_nsswitch(dccm_t) + + logging_send_syslog_msg(dccm_t) + +-miscfiles_read_localization(dccm_t) +- + userdom_dontaudit_use_unpriv_user_fds(dccm_t) + userdom_dontaudit_search_user_home_dirs(dccm_t) + +diff --git a/ddclient.if b/ddclient.if +index 5606b40691..cd18cf2a70 100644 +--- a/ddclient.if ++++ b/ddclient.if +@@ -70,9 +70,13 @@ interface(`ddclient_admin',` + type ddclient_var_run_t, ddclient_initrc_exec_t; + ') + +- allow $1 ddclient_t:process { ptrace signal_perms }; ++ allow $1 ddclient_t:process signal_perms; + ps_process_pattern($1, ddclient_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ddclient_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, ddclient_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 ddclient_initrc_exec_t system_r; +diff --git a/ddclient.te b/ddclient.te +index a4caa1b5b5..42f30662dd 100644 +--- a/ddclient.te ++++ b/ddclient.te +@@ -38,9 +38,13 @@ files_pid_file(ddclient_var_run_t) + # Declarations + # + ++ + dontaudit ddclient_t self:capability sys_tty_config; + allow ddclient_t self:process signal_perms; + allow ddclient_t self:fifo_file rw_fifo_file_perms; ++allow ddclient_t self:tcp_socket create_socket_perms; ++allow ddclient_t self:udp_socket create_socket_perms; ++allow ddclient_t self:netlink_route_socket r_netlink_socket_perms; + + read_files_pattern(ddclient_t, ddclient_etc_t, ddclient_etc_t) + setattr_files_pattern(ddclient_t, ddclient_etc_t, ddclient_etc_t) +@@ -75,7 +79,6 @@ kernel_search_network_sysctl(ddclient_t) + corecmd_exec_shell(ddclient_t) + corecmd_exec_bin(ddclient_t) + +-corenet_all_recvfrom_unlabeled(ddclient_t) + corenet_all_recvfrom_netlabel(ddclient_t) + corenet_tcp_sendrecv_generic_if(ddclient_t) + corenet_udp_sendrecv_generic_if(ddclient_t) +@@ -83,6 +86,8 @@ corenet_tcp_sendrecv_generic_node(ddclient_t) + corenet_udp_sendrecv_generic_node(ddclient_t) + corenet_tcp_sendrecv_all_ports(ddclient_t) + corenet_udp_sendrecv_all_ports(ddclient_t) ++corenet_tcp_bind_generic_node(ddclient_t) ++corenet_udp_bind_generic_node(ddclient_t) + + corenet_sendrecv_all_client_packets(ddclient_t) + corenet_tcp_connect_all_ports(ddclient_t) +@@ -92,16 +97,16 @@ dev_read_urand(ddclient_t) + + domain_use_interactive_fds(ddclient_t) + +-files_read_etc_files(ddclient_t) + files_read_etc_runtime_files(ddclient_t) +-files_read_usr_files(ddclient_t) + + fs_getattr_all_fs(ddclient_t) + fs_search_auto_mountpoints(ddclient_t) + ++auth_read_passwd(ddclient_t) ++ + logging_send_syslog_msg(ddclient_t) + +-miscfiles_read_localization(ddclient_t) ++mta_send_mail(ddclient_t) + + sysnet_exec_ifconfig(ddclient_t) + sysnet_dns_name_resolve(ddclient_t) +diff --git a/ddcprobe.te b/ddcprobe.te +index 8fa4bb994b..8f5ffb00a3 100644 +--- a/ddcprobe.te ++++ b/ddcprobe.te +@@ -34,9 +34,7 @@ dev_read_urand(ddcprobe_t) + dev_read_raw_memory(ddcprobe_t) + dev_wx_raw_memory(ddcprobe_t) + +-files_read_etc_files(ddcprobe_t) + files_read_etc_runtime_files(ddcprobe_t) +-files_read_usr_files(ddcprobe_t) + + term_use_all_ttys(ddcprobe_t) + term_use_all_ptys(ddcprobe_t) +diff --git a/denyhosts.if b/denyhosts.if +index a7326da62d..c87b5b7c67 100644 +--- a/denyhosts.if ++++ b/denyhosts.if +@@ -53,6 +53,7 @@ interface(`denyhosts_initrc_domtrans',` + ## Role allowed access. + ## + ## ++## + # + interface(`denyhosts_admin',` + gen_require(` +@@ -60,20 +61,24 @@ interface(`denyhosts_admin',` + type denyhosts_var_log_t, denyhosts_initrc_exec_t; + ') + +- allow $1 denyhosts_t:process { ptrace signal_perms }; ++ allow $1 denyhosts_t:process signal_perms; + ps_process_pattern($1, denyhosts_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 denyhosts_t:process ptrace; ++ ') ++ + denyhosts_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 denyhosts_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, denyhosts_var_lib_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, denyhosts_var_log_t) + +- files_search_locks($1) ++ files_list_locks($1) + admin_pattern($1, denyhosts_var_lock_t) + ') +diff --git a/denyhosts.te b/denyhosts.te +index 583a527266..91c4104c7f 100644 +--- a/denyhosts.te ++++ b/denyhosts.te +@@ -25,6 +25,9 @@ logging_log_file(denyhosts_var_log_t) + # + # Local policy + # ++# Bug #588563 ++allow denyhosts_t self:capability sys_tty_config; ++allow denyhosts_t self:fifo_file rw_fifo_file_perms; + + allow denyhosts_t self:capability sys_tty_config; + allow denyhosts_t self:fifo_file rw_fifo_file_perms; +@@ -48,7 +51,6 @@ kernel_read_system_state(denyhosts_t) + corecmd_exec_bin(denyhosts_t) + corecmd_exec_shell(denyhosts_t) + +-corenet_all_recvfrom_unlabeled(denyhosts_t) + corenet_all_recvfrom_netlabel(denyhosts_t) + corenet_tcp_sendrecv_generic_if(denyhosts_t) + corenet_tcp_sendrecv_generic_node(denyhosts_t) +@@ -57,13 +59,19 @@ corenet_sendrecv_smtp_client_packets(denyhosts_t) + corenet_tcp_connect_smtp_port(denyhosts_t) + corenet_tcp_sendrecv_smtp_port(denyhosts_t) + ++corenet_sendrecv_sype_transport_client_packets(denyhosts_t) ++corenet_tcp_connect_sype_transport_port(denyhosts_t) ++corenet_tcp_sendrecv_sype_transport_port(denyhosts_t) ++ + dev_read_urand(denyhosts_t) + ++auth_use_nsswitch(denyhosts_t) ++ ++iptables_domtrans(denyhosts_t) ++ + logging_read_generic_logs(denyhosts_t) + logging_send_syslog_msg(denyhosts_t) + +-miscfiles_read_localization(denyhosts_t) +- + sysnet_dns_name_resolve(denyhosts_t) + sysnet_manage_config(denyhosts_t) + sysnet_etc_filetrans_config(denyhosts_t) +@@ -71,3 +79,7 @@ sysnet_etc_filetrans_config(denyhosts_t) + optional_policy(` + cron_system_entry(denyhosts_t, denyhosts_exec_t) + ') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(denyhosts_t) ++') +diff --git a/devicekit.fc b/devicekit.fc +index ae49c9d99f..b8479873e7 100644 +--- a/devicekit.fc ++++ b/devicekit.fc +@@ -11,6 +11,7 @@ + /usr/libexec/devkit-power-daemon -- gen_context(system_u:object_r:devicekit_power_exec_t,s0) + /usr/libexec/udisks-daemon -- gen_context(system_u:object_r:devicekit_disk_exec_t,s0) + /usr/libexec/upowerd -- gen_context(system_u:object_r:devicekit_power_exec_t,s0) ++/usr/libexec/udisks2/udisksd -- gen_context(system_u:object_r:devicekit_disk_exec_t,s0) + + /var/lib/DeviceKit-.* gen_context(system_u:object_r:devicekit_var_lib_t,s0) + /var/lib/upower(/.*)? gen_context(system_u:object_r:devicekit_var_lib_t,s0) +diff --git a/devicekit.if b/devicekit.if +index 8ce99ff486..1bc5d3aea7 100644 +--- a/devicekit.if ++++ b/devicekit.if +@@ -1,4 +1,4 @@ +-## Devicekit modular hardware abstraction layer. ++## Devicekit modular hardware abstraction layer + + ######################################## + ## +@@ -15,10 +15,27 @@ interface(`devicekit_domtrans',` + type devicekit_t, devicekit_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, devicekit_exec_t, devicekit_t) + ') + ++######################################## ++## ++## Execute a domain transition to run devicekit_disk. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`devicekit_domtrans_disk',` ++ gen_require(` ++ type devicekit_disk_t, devicekit_disk_exec_t; ++ ') ++ ++ domtrans_pattern($1, devicekit_disk_exec_t, devicekit_disk_t) ++') ++ + ######################################## + ## + ## Send to devicekit over a unix domain +@@ -32,11 +49,10 @@ interface(`devicekit_domtrans',` + # + interface(`devicekit_dgram_send',` + gen_require(` +- type devicekit_t, devicekit_var_run_t; ++ type devicekit_t; + ') + +- files_search_pids($1) +- dgram_send_pattern($1, devicekit_var_run_t, devicekit_var_run_t, devicekit_t) ++ allow $1 devicekit_t:unix_dgram_socket sendto; + ') + + ######################################## +@@ -83,7 +99,7 @@ interface(`devicekit_dbus_chat_disk',` + + ######################################## + ## +-## Send generic signals to devicekit power. ++## Use file descriptors for devicekit_disk. + ## + ## + ## +@@ -91,39 +107,38 @@ interface(`devicekit_dbus_chat_disk',` + ## + ## + # +-interface(`devicekit_signal_power',` ++interface(`devicekit_use_fds_disk',` + gen_require(` +- type devicekit_power_t; ++ type devicekit_disk_t; + ') + +- allow $1 devicekit_power_t:process signal; ++ allow $1 devicekit_disk_t:fd use; + ') + + ######################################## + ## +-## Send and receive messages from +-## devicekit power over dbus. ++## Dontaudit Send and receive messages from ++## devicekit disk over dbus. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`devicekit_dbus_chat_power',` ++interface(`devicekit_dontaudit_dbus_chat_disk',` + gen_require(` +- type devicekit_power_t; ++ type devicekit_disk_t; + class dbus send_msg; + ') + +- allow $1 devicekit_power_t:dbus send_msg; +- allow devicekit_power_t $1:dbus send_msg; ++ dontaudit $1 devicekit_disk_t:dbus send_msg; ++ dontaudit devicekit_disk_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Use and inherit devicekit power +-## file descriptors. ++## Send signal devicekit power + ## + ## + ## +@@ -131,17 +146,18 @@ interface(`devicekit_dbus_chat_power',` + ## + ## + # +-interface(`devicekit_use_fds_power',` ++interface(`devicekit_signal_power',` + gen_require(` + type devicekit_power_t; + ') + +- allow $1 devicekit_power_t:fd use; ++ allow $1 devicekit_power_t:process signal; + ') + + ######################################## + ## +-## Append inherited devicekit log files. ++## Send and receive messages from ++## devicekit power over dbus. + ## + ## + ## +@@ -149,40 +165,97 @@ interface(`devicekit_use_fds_power',` + ## + ## + # ++interface(`devicekit_dbus_chat_power',` ++ gen_require(` ++ type devicekit_power_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 devicekit_power_t:dbus send_msg; ++ allow devicekit_power_t $1:dbus send_msg; ++') ++ ++####################################### ++## ++## Use and inherit devicekit power ++## file descriptors. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`devicekit_use_fds_power',` ++ gen_require(` ++ type devicekit_power_t; ++ ') ++ ++ allow $1 devicekit_power_t:fd use; ++') ++ ++####################################### ++## ++## Append inherited devicekit log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# + interface(`devicekit_append_inherited_log_files',` + gen_require(` + type devicekit_var_log_t; + ') + + logging_search_logs($1) +- allow $1 devicekit_var_log_t:file { getattr_file_perms append }; ++ allow $1 devicekit_var_log_t:file append_inherited_file_perms; + + devicekit_use_fds_power($1) + ') + +-######################################## ++####################################### + ## +-## Create, read, write, and delete +-## devicekit log files. ++## Allow read devicekit log files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`devicekit_manage_log_files',` ++interface(`devicekit_read_log_files',` + gen_require(` + type devicekit_var_log_t; + ') + + logging_search_logs($1) +- manage_files_pattern($1, devicekit_var_log_t, devicekit_var_log_t) ++ allow $1 devicekit_var_log_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Do not audit attempts to write the devicekit ++## log files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`devicekit_dontaudit_rw_log',` ++ gen_require(` ++ type devicekit_var_log_t; ++ ') ++ ++ dontaudit $1 devicekit_var_log_t:file rw_file_perms; + ') + + ######################################## + ## +-## Relabel devicekit log files. ++## Allow the domain to read devicekit_power state files in /proc. + ## + ## + ## +@@ -190,13 +263,13 @@ interface(`devicekit_manage_log_files',` + ## + ## + # +-interface(`devicekit_relabel_log_files',` ++interface(`devicekit_read_state_power',` + gen_require(` +- type devicekit_var_log_t; ++ type devicekit_power_t; + ') + +- logging_search_logs($1) +- relabel_files_pattern($1, devicekit_var_log_t, devicekit_var_log_t) ++ kernel_search_proc($1) ++ ps_process_pattern($1, devicekit_power_t) + ') + + ######################################## +@@ -220,11 +293,30 @@ interface(`devicekit_read_pid_files',` + + ######################################## + ## +-## Create, read, write, and delete ++## Do not audit attempts to read + ## devicekit PID files. + ## + ## + ## ++## Domain to not audit. ++## ++## ++# ++interface(`devicekit_dontaudit_read_pid_files',` ++ gen_require(` ++ type devicekit_var_run_t; ++ ') ++ ++ dontaudit $1 devicekit_var_run_t:file read_inherited_file_perms; ++') ++ ++ ++######################################## ++## ++## Manage devicekit PID files. ++## ++## ++## + ## Domain allowed access. + ## + ## +@@ -235,22 +327,59 @@ interface(`devicekit_manage_pid_files',` + ') + + files_search_pids($1) ++ manage_dirs_pattern($1, devicekit_var_run_t, devicekit_var_run_t) + manage_files_pattern($1, devicekit_var_run_t, devicekit_var_run_t) ++ files_pid_filetrans($1, devicekit_var_run_t, dir, "pm-utils") ++') ++ ++####################################### ++## ++## Relabel devicekit LOG files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`devicekit_relabel_log_files',` ++ gen_require(` ++ type devicekit_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ relabel_files_pattern($1, devicekit_var_log_t, devicekit_var_log_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an devicekit environment. ++## Manage devicekit LOG files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`devicekit_manage_log_files',` ++ gen_require(` ++ type devicekit_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_files_pattern($1, devicekit_var_log_t, devicekit_var_log_t) ++ #logging_log_filetrans($1, devicekit_var_log_t, file, "pm-powersave.log") ++ #logging_log_filetrans($1, devicekit_var_log_t, file, "pm-suspend.log") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an devicekit environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## +@@ -259,21 +388,48 @@ interface(`devicekit_admin',` + gen_require(` + type devicekit_t, devicekit_disk_t, devicekit_power_t; + type devicekit_var_lib_t, devicekit_var_run_t, devicekit_tmp_t; +- type devicekit_var_log_t; + ') + +- allow $1 { devicekit_t devicekit_disk_t devicekit_power_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { devicekit_t devicekit_disk_t devicekit_power_t }) ++ allow $1 devicekit_t:process signal_perms; ++ ps_process_pattern($1, devicekit_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 devicekit_t:process ptrace; ++ allow $1 devicekit_disk_t:process ptrace; ++ allow $1 devicekit_power_t:process ptrace; ++ ') ++ ++ allow $1 devicekit_disk_t:process signal_perms; ++ ps_process_pattern($1, devicekit_disk_t) ++ ++ allow $1 devicekit_power_t:process signal_perms; ++ ps_process_pattern($1, devicekit_power_t) + +- files_search_tmp($1) + admin_pattern($1, devicekit_tmp_t) ++ files_list_tmp($1) + +- files_search_var_lib($1) + admin_pattern($1, devicekit_var_lib_t) ++ files_list_var_lib($1) + +- logging_search_logs($1) +- admin_pattern($1, devicekit_var_log_t) +- +- files_search_pids($1) + admin_pattern($1, devicekit_var_run_t) ++ files_list_pids($1) ++') ++ ++######################################## ++## ++## Transition to devicekit named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`devicekit_filetrans_named_content',` ++ gen_require(` ++ type devicekit_var_run_t, devicekit_var_log_t; ++ ') ++ ++ files_pid_filetrans($1, devicekit_var_run_t, dir, "pm-utils") ++ logging_log_filetrans($1, devicekit_var_log_t, file, "pm-powersave.log") ++ logging_log_filetrans($1, devicekit_var_log_t, file, "pm-suspend.log") + ') +diff --git a/devicekit.te b/devicekit.te +index 77a5003c0d..8d3dc77cbf 100644 +--- a/devicekit.te ++++ b/devicekit.te +@@ -7,15 +7,15 @@ policy_module(devicekit, 1.3.1) + + type devicekit_t; + type devicekit_exec_t; +-dbus_system_domain(devicekit_t, devicekit_exec_t) ++init_daemon_domain(devicekit_t, devicekit_exec_t) + + type devicekit_power_t; + type devicekit_power_exec_t; +-dbus_system_domain(devicekit_power_t, devicekit_power_exec_t) ++init_daemon_domain(devicekit_power_t, devicekit_power_exec_t) + + type devicekit_disk_t; + type devicekit_disk_exec_t; +-dbus_system_domain(devicekit_disk_t, devicekit_disk_exec_t) ++init_daemon_domain(devicekit_disk_t, devicekit_disk_exec_t) + + type devicekit_tmp_t; + files_tmp_file(devicekit_tmp_t) +@@ -45,11 +45,8 @@ kernel_read_system_state(devicekit_t) + dev_read_sysfs(devicekit_t) + dev_read_urand(devicekit_t) + +-files_read_etc_files(devicekit_t) +- +-miscfiles_read_localization(devicekit_t) +- + optional_policy(` ++ dbus_system_domain(devicekit_t, devicekit_exec_t) + dbus_system_bus_client(devicekit_t) + + allow devicekit_t { devicekit_disk_t devicekit_power_t }:dbus send_msg; +@@ -64,7 +61,8 @@ optional_policy(` + # Disk local policy + # + +-allow devicekit_disk_t self:capability { chown setuid setgid dac_override fowner fsetid net_admin sys_admin sys_nice sys_ptrace sys_rawio }; ++allow devicekit_disk_t self:capability { chown setuid setgid dac_read_search dac_read_search dac_override fowner fsetid net_admin sys_admin sys_nice sys_tty_config sys_rawio }; ++ + allow devicekit_disk_t self:process { getsched signal_perms }; + allow devicekit_disk_t self:fifo_file rw_fifo_file_perms; + allow devicekit_disk_t self:netlink_kobject_uevent_socket create_socket_perms; +@@ -81,17 +79,18 @@ allow devicekit_disk_t devicekit_var_run_t:dir mounton; + manage_dirs_pattern(devicekit_disk_t, devicekit_var_run_t, devicekit_var_run_t) + manage_files_pattern(devicekit_disk_t, devicekit_var_run_t, devicekit_var_run_t) + files_pid_filetrans(devicekit_disk_t, devicekit_var_run_t, { dir file }) ++files_filetrans_named_content(devicekit_disk_t) + ++kernel_dontaudit_getattr_unlabeled_files(devicekit_disk_t) + kernel_getattr_message_if(devicekit_disk_t) + kernel_list_unlabeled(devicekit_disk_t) +-kernel_dontaudit_getattr_unlabeled_files(devicekit_disk_t) + kernel_read_fs_sysctls(devicekit_disk_t) + kernel_read_network_state(devicekit_disk_t) + kernel_read_software_raid_state(devicekit_disk_t) + kernel_read_system_state(devicekit_disk_t) + kernel_read_vm_sysctls(devicekit_disk_t) + kernel_request_load_module(devicekit_disk_t) +-kernel_setsched(devicekit_disk_t) ++kernel_dontaudit_setsched(devicekit_disk_t) + + corecmd_exec_bin(devicekit_disk_t) + corecmd_exec_shell(devicekit_disk_t) +@@ -99,6 +98,8 @@ corecmd_getattr_all_executables(devicekit_disk_t) + + dev_getattr_all_chr_files(devicekit_disk_t) + dev_getattr_mtrr_dev(devicekit_disk_t) ++dev_rw_generic_blk_files(devicekit_disk_t) ++dev_rw_loop_control(devicekit_disk_t) + dev_getattr_usbfs_dirs(devicekit_disk_t) + dev_manage_generic_files(devicekit_disk_t) + dev_read_urand(devicekit_disk_t) +@@ -117,8 +118,8 @@ files_getattr_all_pipes(devicekit_disk_t) + files_manage_boot_dirs(devicekit_disk_t) + files_manage_isid_type_dirs(devicekit_disk_t) + files_manage_mnt_dirs(devicekit_disk_t) ++files_manage_etc_files(devicekit_disk_t) + files_read_etc_runtime_files(devicekit_disk_t) +-files_read_usr_files(devicekit_disk_t) + + fs_getattr_all_fs(devicekit_disk_t) + fs_list_inotifyfs(devicekit_disk_t) +@@ -135,18 +136,18 @@ storage_raw_write_fixed_disk(devicekit_disk_t) + storage_raw_read_removable_device(devicekit_disk_t) + storage_raw_write_removable_device(devicekit_disk_t) + +-term_use_all_terms(devicekit_disk_t) ++term_use_all_inherited_terms(devicekit_disk_t) + + auth_use_nsswitch(devicekit_disk_t) + + logging_send_syslog_msg(devicekit_disk_t) + +-miscfiles_read_localization(devicekit_disk_t) +- + userdom_read_all_users_state(devicekit_disk_t) + userdom_search_user_home_dirs(devicekit_disk_t) ++userdom_manage_user_tmp_dirs(devicekit_disk_t) + + optional_policy(` ++ dbus_system_domain(devicekit_disk_t, devicekit_disk_exec_t) + dbus_system_bus_client(devicekit_disk_t) + + allow devicekit_disk_t devicekit_t:dbus send_msg; +@@ -170,6 +171,7 @@ optional_policy(` + + optional_policy(` + mount_domtrans(devicekit_disk_t) ++ mount_read_pid_files(devicekit_disk_t) + ') + + optional_policy(` +@@ -182,6 +184,11 @@ optional_policy(` + raid_domtrans_mdadm(devicekit_disk_t) + ') + ++optional_policy(` ++ systemd_read_logind_sessions_files(devicekit_disk_t) ++ systemd_write_inhibit_pipes(devicekit_disk_t) ++') ++ + optional_policy(` + udev_domtrans(devicekit_disk_t) + udev_read_db(devicekit_disk_t) +@@ -192,12 +199,19 @@ optional_policy(` + virt_manage_images(devicekit_disk_t) + ') + ++optional_policy(` ++ unconfined_domain(devicekit_t) ++ unconfined_domain(devicekit_power_t) ++ unconfined_domain(devicekit_disk_t) ++') ++ + ######################################## + # + # Power local policy + # + +-allow devicekit_power_t self:capability { dac_override net_admin sys_admin sys_tty_config sys_nice sys_ptrace }; ++allow devicekit_power_t self:capability { dac_read_search dac_override net_admin sys_admin sys_tty_config sys_nice }; ++allow devicekit_power_t self:capability2 compromise_kernel; + allow devicekit_power_t self:process { getsched signal_perms }; + allow devicekit_power_t self:fifo_file rw_fifo_file_perms; + allow devicekit_power_t self:unix_dgram_socket create_socket_perms; +@@ -212,9 +226,7 @@ manage_dirs_pattern(devicekit_power_t, devicekit_var_lib_t, devicekit_var_lib_t) + manage_files_pattern(devicekit_power_t, devicekit_var_lib_t, devicekit_var_lib_t) + files_var_lib_filetrans(devicekit_power_t, devicekit_var_lib_t, dir) + +-allow devicekit_power_t devicekit_var_log_t:file append_file_perms; +-allow devicekit_power_t devicekit_var_log_t:file create_file_perms; +-allow devicekit_power_t devicekit_var_log_t:file setattr_file_perms; ++manage_files_pattern(devicekit_power_t, devicekit_var_log_t, devicekit_var_log_t) + logging_log_filetrans(devicekit_power_t, devicekit_var_log_t, file) + + manage_dirs_pattern(devicekit_power_t, devicekit_var_run_t, devicekit_var_run_t) +@@ -224,12 +236,12 @@ files_pid_filetrans(devicekit_power_t, devicekit_var_run_t, { dir file }) + kernel_read_fs_sysctls(devicekit_power_t) + kernel_read_network_state(devicekit_power_t) + kernel_read_system_state(devicekit_power_t) +-kernel_rw_hotplug_sysctls(devicekit_power_t) ++kernel_rw_usermodehelper_state(devicekit_power_t) + kernel_rw_kernel_sysctl(devicekit_power_t) + kernel_rw_vm_sysctls(devicekit_power_t) + kernel_search_debugfs(devicekit_power_t) + kernel_write_proc_files(devicekit_power_t) +-kernel_setsched(devicekit_power_t) ++kernel_dontaudit_setsched(devicekit_power_t) + + corecmd_exec_bin(devicekit_power_t) + corecmd_exec_shell(devicekit_power_t) +@@ -248,21 +260,18 @@ domain_read_all_domains_state(devicekit_power_t) + + files_read_kernel_img(devicekit_power_t) + files_read_etc_runtime_files(devicekit_power_t) +-files_read_usr_files(devicekit_power_t) + files_dontaudit_list_mnt(devicekit_power_t) + + fs_getattr_all_fs(devicekit_power_t) + fs_list_inotifyfs(devicekit_power_t) + +-term_use_all_terms(devicekit_power_t) ++term_use_all_inherited_terms(devicekit_power_t) + + auth_use_nsswitch(devicekit_power_t) + + init_all_labeled_script_domtrans(devicekit_power_t) + init_read_utmp(devicekit_power_t) + +-miscfiles_read_localization(devicekit_power_t) +- + sysnet_domtrans_ifconfig(devicekit_power_t) + sysnet_domtrans_dhcpc(devicekit_power_t) + +@@ -277,6 +286,12 @@ optional_policy(` + ') + + optional_policy(` ++ cron_initrc_domtrans(devicekit_power_t) ++ cron_systemctl(devicekit_power_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(devicekit_power_t, devicekit_power_exec_t) + dbus_system_bus_client(devicekit_power_t) + + allow devicekit_power_t devicekit_t:dbus send_msg; +@@ -306,9 +321,12 @@ optional_policy(` + fstools_domtrans(devicekit_power_t) + ') + ++optional_policy(` ++ gnome_manage_home_config(devicekit_power_t) ++') ++ + optional_policy(` + hal_domtrans_mac(devicekit_power_t) +- hal_manage_log(devicekit_power_t) + hal_manage_pid_dirs(devicekit_power_t) + hal_manage_pid_files(devicekit_power_t) + ') +@@ -347,3 +365,9 @@ optional_policy(` + optional_policy(` + vbetool_domtrans(devicekit_power_t) + ') ++ ++optional_policy(` ++ corenet_tcp_connect_xserver_port(devicekit_power_t) ++ xserver_stream_connect(devicekit_power_t) ++') ++ +diff --git a/dhcp.fc b/dhcp.fc +index 8182c4806c..0b9bb9710b 100644 +--- a/dhcp.fc ++++ b/dhcp.fc +@@ -1,6 +1,13 @@ + /etc/rc\.d/init\.d/dhcpd(6)? -- gen_context(system_u:object_r:dhcpd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/dhcrelay(6)? -- gen_context(system_u:object_r:dhcpd_initrc_exec_t,s0) + +-/usr/sbin/dhcpd.* -- gen_context(system_u:object_r:dhcpd_exec_t,s0) ++/usr/lib/systemd/system/dhcpcd.* -- gen_context(system_u:object_r:dhcpd_unit_file_t,s0) ++/usr/lib/systemd/system/dhcpd.* -- gen_context(system_u:object_r:dhcpd_unit_file_t,s0) ++/usr/lib/systemd/system/dhcpd6.* -- gen_context(system_u:object_r:dhcpd_unit_file_t,s0) ++/usr/lib/systemd/system/dhcrelay.* -- gen_context(system_u:object_r:dhcpd_unit_file_t,s0) ++ ++/usr/sbin/dhcpd(6)? -- gen_context(system_u:object_r:dhcpd_exec_t,s0) ++/usr/sbin/dhcrelay(6)? -- gen_context(system_u:object_r:dhcpd_exec_t,s0) + + /var/lib/dhcpd(/.*)? gen_context(system_u:object_r:dhcpd_state_t,s0) + /var/lib/dhcp(3)?/dhcpd\.leases.* -- gen_context(system_u:object_r:dhcpd_state_t,s0) +diff --git a/dhcp.if b/dhcp.if +index c697edbcd0..954c090bd5 100644 +--- a/dhcp.if ++++ b/dhcp.if +@@ -36,7 +36,7 @@ interface(`dhcpd_setattr_state_files',` + ') + + sysnet_search_dhcp_state($1) +- allow $1 dhcpd_state_t:file setattr; ++ allow $1 dhcpd_state_t:file setattr_file_perms; + ') + + ######################################## +@@ -58,6 +58,31 @@ interface(`dhcpd_initrc_domtrans',` + init_labeled_script_domtrans($1, dhcpd_initrc_exec_t) + ') + ++######################################## ++## ++## Execute dhcpd server in the dhcpd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dhcpd_systemctl',` ++ gen_require(` ++ type dhcpd_unit_file_t; ++ type dhcpd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_search_unit_dirs($1) ++ allow $1 dhcpd_unit_file_t:file read_file_perms; ++ allow $1 dhcpd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, dhcpd_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -79,11 +104,16 @@ interface(`dhcpd_admin',` + gen_require(` + type dhcpd_t, dhcpd_tmp_t, dhcpd_state_t; + type dhcpd_var_run_t, dhcpd_initrc_exec_t; ++ type dhcpd_unit_file_t; + ') + +- allow $1 dhcpd_t:process { ptrace signal_perms }; ++ allow $1 dhcpd_t:process signal_perms; + ps_process_pattern($1, dhcpd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 dhcpd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, dhcpd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 dhcpd_initrc_exec_t system_r; +@@ -97,4 +127,8 @@ interface(`dhcpd_admin',` + + files_list_pids($1) + admin_pattern($1, dhcpd_var_run_t) ++ ++ dhcpd_systemctl($1) ++ admin_pattern($1, dhcpd_unit_file_t) ++ allow $1 dhcpd_unit_file_t:service all_service_perms; + ') +diff --git a/dhcp.te b/dhcp.te +index 98a24b9897..3ca9fe61af 100644 +--- a/dhcp.te ++++ b/dhcp.te +@@ -20,6 +20,9 @@ init_daemon_domain(dhcpd_t, dhcpd_exec_t) + type dhcpd_initrc_exec_t; + init_script_file(dhcpd_initrc_exec_t) + ++type dhcpd_unit_file_t; ++systemd_unit_file(dhcpd_unit_file_t) ++ + type dhcpd_state_t; + files_type(dhcpd_state_t) + +@@ -34,7 +37,7 @@ files_pid_file(dhcpd_var_run_t) + # Local policy + # + +-allow dhcpd_t self:capability { chown dac_override sys_chroot net_raw setgid setuid sys_resource }; ++allow dhcpd_t self:capability { chown dac_read_search dac_override fowner sys_chroot net_raw kill setgid setuid setpcap sys_resource }; + dontaudit dhcpd_t self:capability { net_admin sys_tty_config }; + allow dhcpd_t self:process { getcap setcap signal_perms }; + allow dhcpd_t self:fifo_file rw_fifo_file_perms; +@@ -58,7 +61,6 @@ kernel_read_system_state(dhcpd_t) + kernel_read_kernel_sysctls(dhcpd_t) + kernel_read_network_state(dhcpd_t) + +-corenet_all_recvfrom_unlabeled(dhcpd_t) + corenet_all_recvfrom_netlabel(dhcpd_t) + corenet_tcp_sendrecv_generic_if(dhcpd_t) + corenet_udp_sendrecv_generic_if(dhcpd_t) +@@ -94,7 +96,6 @@ fs_search_auto_mountpoints(dhcpd_t) + + domain_use_interactive_fds(dhcpd_t) + +-files_read_usr_files(dhcpd_t) + files_read_etc_runtime_files(dhcpd_t) + files_search_var_lib(dhcpd_t) + +@@ -102,21 +103,41 @@ auth_use_nsswitch(dhcpd_t) + + logging_send_syslog_msg(dhcpd_t) + +-miscfiles_read_localization(dhcpd_t) +- ++sysnet_read_config(dhcpd_t) + sysnet_read_dhcp_config(dhcpd_t) + + userdom_dontaudit_use_unpriv_user_fds(dhcpd_t) + userdom_dontaudit_search_user_home_dirs(dhcpd_t) + + tunable_policy(`dhcpd_use_ldap',` +- sysnet_use_ldap(dhcpd_t) ++ allow dhcpd_t self:tcp_socket create_socket_perms; ++') ++ ++tunable_policy(`dhcpd_use_ldap',` ++ corenet_tcp_sendrecv_generic_if(dhcpd_t) ++ corenet_tcp_sendrecv_generic_node(dhcpd_t) ++ corenet_tcp_sendrecv_ldap_port(dhcpd_t) ++ corenet_tcp_connect_ldap_port(dhcpd_t) ++ corenet_sendrecv_ldap_client_packets(dhcpd_t) ++') ++ ++tunable_policy(`dhcpd_use_ldap',` ++ ldap_read_certs(dhcpd_t) ++') ++ ++ifdef(`distro_gentoo',` ++ allow dhcpd_t self:capability { chown dac_read_search dac_override setgid setuid sys_chroot }; + ') + + optional_policy(` ++ # used for dynamic DNS + bind_read_dnssec_keys(dhcpd_t) + ') + ++optional_policy(` ++ cobbler_dontaudit_rw_log(dhcpd_t) ++') ++ + optional_policy(` + dbus_system_bus_client(dhcpd_t) + dbus_connect_system_bus(dhcpd_t) +diff --git a/dictd.if b/dictd.if +index 3cc3494bd6..cb0a1f4bfa 100644 +--- a/dictd.if ++++ b/dictd.if +@@ -38,8 +38,11 @@ interface(`dictd_admin',` + type dictd_var_run_t, dictd_initrc_exec_t; + ') + +- allow $1 dictd_t:process { ptrace signal_perms }; ++ allow $1 dictd_t:process signal_perms; + ps_process_pattern($1, dictd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 dictd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, dictd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/dictd.te b/dictd.te +index 433d3c5a0b..0dccebfd94 100644 +--- a/dictd.te ++++ b/dictd.te +@@ -43,7 +43,6 @@ files_pid_filetrans(dictd_t, dictd_var_run_t, file) + kernel_read_system_state(dictd_t) + kernel_read_kernel_sysctls(dictd_t) + +-corenet_all_recvfrom_unlabeled(dictd_t) + corenet_all_recvfrom_netlabel(dictd_t) + corenet_tcp_sendrecv_generic_if(dictd_t) + corenet_tcp_sendrecv_generic_node(dictd_t) +@@ -58,7 +57,6 @@ dev_read_sysfs(dictd_t) + domain_use_interactive_fds(dictd_t) + + files_read_etc_runtime_files(dictd_t) +-files_read_usr_files(dictd_t) + files_search_var_lib(dictd_t) + + fs_getattr_xattr_fs(dictd_t) +@@ -68,8 +66,6 @@ auth_use_nsswitch(dictd_t) + + logging_send_syslog_msg(dictd_t) + +-miscfiles_read_localization(dictd_t) +- + userdom_dontaudit_use_unpriv_user_fds(dictd_t) + + optional_policy(` +diff --git a/dirmngr.te b/dirmngr.te +index b3b218815a..5f917054c7 100644 +--- a/dirmngr.te ++++ b/dirmngr.te +@@ -53,6 +53,5 @@ files_pid_filetrans(dirmngr_t, dirmngr_var_run_t, { dir file }) + + kernel_read_crypto_sysctls(dirmngr_t) + +-files_read_etc_files(dirmngr_t) + + miscfiles_read_localization(dirmngr_t) +diff --git a/dirsrv-admin.fc b/dirsrv-admin.fc +new file mode 100644 +index 0000000000..38b17f89f8 +--- /dev/null ++++ b/dirsrv-admin.fc +@@ -0,0 +1,17 @@ ++/usr/lib/systemd/system/dirsrv-admin\.service -- gen_context(system_u:object_r:dirsrvadmin_unit_file_t,s0) ++ ++/etc/dirsrv/admin-serv(/.*)? gen_context(system_u:object_r:dirsrvadmin_config_t,s0) ++ ++/etc/dirsrv/dsgw(/.*)? gen_context(system_u:object_r:dirsrvadmin_config_t,s0) ++ ++/usr/sbin/restart-ds-admin -- gen_context(system_u:object_r:dirsrvadmin_exec_t,s0) ++/usr/sbin/start-ds-admin -- gen_context(system_u:object_r:dirsrvadmin_exec_t,s0) ++/usr/sbin/stop-ds-admin -- gen_context(system_u:object_r:dirsrvadmin_exec_t,s0) ++ ++/usr/lib/dirsrv/cgi-bin(/.*)? gen_context(system_u:object_r:dirsrvadmin_script_exec_t,s0) ++/usr/lib/dirsrv/dsgw-cgi-bin(/.*)? gen_context(system_u:object_r:dirsrvadmin_script_exec_t,s0) ++ ++/usr/lib/dirsrv/cgi-bin/ds_create -- gen_context(system_u:object_r:dirsrvadmin_unconfined_script_exec_t,s0) ++/usr/lib/dirsrv/cgi-bin/ds_remove -- gen_context(system_u:object_r:dirsrvadmin_unconfined_script_exec_t,s0) ++ ++/var/lock/subsys/dirsrv-admin -- gen_context(system_u:object_r:dirsrvadmin_lock_t,s0) +diff --git a/dirsrv-admin.if b/dirsrv-admin.if +new file mode 100644 +index 0000000000..0d4e704926 +--- /dev/null ++++ b/dirsrv-admin.if +@@ -0,0 +1,157 @@ ++## Administration Server for Directory Server, dirsrv-admin. ++ ++######################################## ++## ++## Exec dirsrv-admin programs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_run_exec',` ++ gen_require(` ++ type dirsrvadmin_exec_t; ++ ') ++ ++ allow $1 dirsrvadmin_exec_t:dir search_dir_perms; ++ can_exec($1, dirsrvadmin_exec_t) ++') ++ ++######################################## ++## ++## Exec cgi programs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_run_script_exec',` ++ gen_require(` ++ type dirsrvadmin_script_exec_t; ++ ') ++ ++ allow $1 dirsrvadmin_script_exec_t:dir search_dir_perms; ++ can_exec($1, dirsrvadmin_script_exec_t) ++') ++ ++######################################## ++## ++## Manage dirsrv-adminserver configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_read_config',` ++ gen_require(` ++ type dirsrvadmin_config_t; ++ ') ++ ++ read_files_pattern($1, dirsrvadmin_config_t, dirsrvadmin_config_t) ++') ++ ++######################################## ++## ++## Manage dirsrv-adminserver configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_manage_config',` ++ gen_require(` ++ type dirsrvadmin_config_t; ++ ') ++ ++ allow $1 dirsrvadmin_config_t:dir manage_dir_perms; ++ allow $1 dirsrvadmin_config_t:file manage_file_perms; ++') ++ ++####################################### ++## ++## Read dirsrv-adminserver tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_read_tmp',` ++ gen_require(` ++ type dirsrvadmin_tmp_t; ++ ') ++ ++ read_files_pattern($1, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++') ++ ++######################################## ++## ++## Manage dirsrv-adminserver tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_manage_tmp',` ++ gen_require(` ++ type dirsrvadmin_tmp_t; ++ ') ++ ++ manage_files_pattern($1, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++ manage_dirs_pattern($1, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++') ++ ++######################################## ++## ++## Execute dirsrv-admin server in the dirsrv-admin domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dirsrvadmin_systemctl',` ++ gen_require(` ++ type dirsrvadmin_t; ++ type dirsrvadmin_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 dirsrvadmin_unit_file_t:file read_file_perms; ++ allow $1 dirsrvadmin_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, dirsrvadmin_t) ++') ++ ++####################################### ++## ++## Execute admin cgi programs in caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrvadmin_domtrans_unconfined_script_t',` ++ gen_require(` ++ type dirsrvadmin_unconfined_script_t; ++ type dirsrvadmin_unconfined_script_exec_t; ++ ') ++ ++ domtrans_pattern($1, dirsrvadmin_unconfined_script_exec_t, dirsrvadmin_unconfined_script_t) ++ allow $1 dirsrvadmin_unconfined_script_t:process signal_perms; ++') +diff --git a/dirsrv-admin.te b/dirsrv-admin.te +new file mode 100644 +index 0000000000..51fb95d13e +--- /dev/null ++++ b/dirsrv-admin.te +@@ -0,0 +1,173 @@ ++policy_module(dirsrv-admin,1.0.0) ++ ++######################################## ++# ++# Declarations for the daemon ++# ++ ++type dirsrvadmin_t; ++type dirsrvadmin_exec_t; ++init_daemon_domain(dirsrvadmin_t, dirsrvadmin_exec_t) ++role system_r types dirsrvadmin_t; ++ ++type dirsrvadmin_config_t; ++files_type(dirsrvadmin_config_t) ++ ++type dirsrvadmin_lock_t; ++files_lock_file(dirsrvadmin_lock_t) ++ ++type dirsrvadmin_tmp_t; ++files_tmp_file(dirsrvadmin_tmp_t) ++ ++type dirsrvadmin_unit_file_t; ++systemd_unit_file(dirsrvadmin_unit_file_t) ++ ++type dirsrvadmin_unconfined_script_t; ++type dirsrvadmin_unconfined_script_exec_t; ++domain_type(dirsrvadmin_unconfined_script_t) ++domain_entry_file(dirsrvadmin_unconfined_script_t, dirsrvadmin_unconfined_script_exec_t) ++corecmd_shell_entry_type(dirsrvadmin_unconfined_script_t) ++role system_r types dirsrvadmin_unconfined_script_t; ++ ++######################################## ++# ++# Local policy for the daemon ++# ++ ++allow dirsrvadmin_t self:fifo_file rw_fifo_file_perms; ++allow dirsrvadmin_t self:capability { dac_read_search dac_override sys_tty_config sys_resource }; ++allow dirsrvadmin_t self:process { setrlimit signal_perms }; ++ ++manage_files_pattern(dirsrvadmin_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++manage_dirs_pattern(dirsrvadmin_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++files_tmp_filetrans(dirsrvadmin_t, dirsrvadmin_tmp_t, { file dir }) ++ ++kernel_read_system_state(dirsrvadmin_t) ++ ++corecmd_exec_bin(dirsrvadmin_t) ++corecmd_read_bin_symlinks(dirsrvadmin_t) ++corecmd_search_bin(dirsrvadmin_t) ++corecmd_shell_entry_type(dirsrvadmin_t) ++ ++files_exec_etc_files(dirsrvadmin_t) ++ ++libs_exec_ld_so(dirsrvadmin_t) ++ ++logging_search_logs(dirsrvadmin_t) ++ ++# Needed for stop and restart scripts ++dirsrv_read_var_run(dirsrvadmin_t) ++ ++optional_policy(` ++ apache_domtrans(dirsrvadmin_t) ++ apache_signal(dirsrvadmin_t) ++') ++ ++######################################## ++# ++# Local policy for the CGIs ++# ++# ++# ++# Create a domain for the CGI scripts ++ ++optional_policy(` ++ apache_content_template(dirsrvadmin) ++ apache_content_alias_template(dirsrvadmin, dirsrvadmin) ++ ++ allow dirsrvadmin_script_t self:process { getsched getpgid }; ++ allow dirsrvadmin_script_t self:capability { fowner fsetid setuid net_bind_service setgid chown sys_nice kill dac_read_search dac_override }; ++ allow dirsrvadmin_script_t self:tcp_socket create_stream_socket_perms; ++ allow dirsrvadmin_script_t self:udp_socket create_socket_perms; ++ allow dirsrvadmin_script_t self:unix_dgram_socket create_socket_perms; ++ allow dirsrvadmin_script_t self:netlink_route_socket r_netlink_socket_perms; ++ allow dirsrvadmin_script_t self:sem create_sem_perms; ++ ++ ++ manage_files_pattern(dirsrvadmin_script_t, dirsrvadmin_lock_t, dirsrvadmin_lock_t) ++ files_lock_filetrans(dirsrvadmin_script_t, dirsrvadmin_lock_t, { file }) ++ ++ kernel_read_kernel_sysctls(dirsrvadmin_script_t) ++ ++ auth_read_passwd(dirsrvadmin_script_t) ++ ++ corenet_tcp_bind_generic_node(dirsrvadmin_script_t) ++ corenet_udp_bind_generic_node(dirsrvadmin_script_t) ++ corenet_all_recvfrom_netlabel(dirsrvadmin_script_t) ++ ++ corenet_tcp_bind_http_port(dirsrvadmin_script_t) ++ corenet_tcp_connect_generic_port(dirsrvadmin_script_t) ++ corenet_tcp_connect_ldap_port(dirsrvadmin_script_t) ++ corenet_tcp_connect_http_port(dirsrvadmin_script_t) ++ ++ files_search_var_lib(dirsrvadmin_script_t) ++ ++ sysnet_read_config(dirsrvadmin_script_t) ++ ++ manage_files_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++ manage_lnk_files_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++ manage_dirs_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++ files_tmp_filetrans(dirsrvadmin_script_t, dirsrvadmin_tmp_t, { file dir }) ++ ++ miscfiles_read_certs(dirsrvadmin_script_t) ++ ++ optional_policy(` ++ dirsrvadmin_systemctl(dirsrvadmin_script_t) ++ ') ++ ++ optional_policy(` ++ apache_read_modules(dirsrvadmin_script_t) ++ apache_read_config(dirsrvadmin_script_t) ++ apache_read_pid_files(dirsrvadmin_script_t) ++ apache_read_tmp_symlinks(dirsrvadmin_script_t) ++ apache_read_tmp_files(dirsrvadmin_script_t) ++ apache_read_tmp_dirs(dirsrvadmin_script_t) ++ apache_signal(dirsrvadmin_script_t) ++ apache_signull(dirsrvadmin_script_t) ++ ') ++ ++ optional_policy(` ++ # The CGI scripts must be able to manage dirsrv-admin ++ dirsrvadmin_run_exec(dirsrvadmin_script_t) ++ dirsrvadmin_manage_config(dirsrvadmin_script_t) ++ dirsrv_domtrans(dirsrvadmin_script_t) ++ dirsrv_signal(dirsrvadmin_script_t) ++ dirsrv_signull(dirsrvadmin_script_t) ++ dirsrv_manage_log(dirsrvadmin_script_t) ++ dirsrv_manage_var_lib(dirsrvadmin_script_t) ++ dirsrv_pid_filetrans(dirsrvadmin_script_t) ++ dirsrv_manage_var_run(dirsrvadmin_script_t) ++ dirsrv_manage_config(dirsrvadmin_script_t) ++ dirsrv_read_share(dirsrvadmin_script_t) ++ ') ++') ++ ++####################################### ++# ++# Local policy for the admin CGIs ++# ++# ++ ++ ++manage_files_pattern(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++manage_dirs_pattern(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t) ++files_tmp_filetrans(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, { file dir }) ++ ++# needed because of filetrans rules ++dirsrvadmin_run_exec(dirsrvadmin_unconfined_script_t) ++dirsrvadmin_manage_config(dirsrvadmin_unconfined_script_t) ++dirsrv_domtrans(dirsrvadmin_unconfined_script_t) ++dirsrv_signal(dirsrvadmin_unconfined_script_t) ++dirsrv_signull(dirsrvadmin_unconfined_script_t) ++dirsrv_manage_log(dirsrvadmin_unconfined_script_t) ++dirsrv_manage_var_lib(dirsrvadmin_unconfined_script_t) ++dirsrv_pid_filetrans(dirsrvadmin_unconfined_script_t) ++dirsrv_manage_var_run(dirsrvadmin_unconfined_script_t) ++dirsrv_manage_config(dirsrvadmin_unconfined_script_t) ++dirsrv_read_share(dirsrvadmin_unconfined_script_t) ++ ++optional_policy(` ++ unconfined_domain(dirsrvadmin_unconfined_script_t) ++') ++ ++ +diff --git a/dirsrv.fc b/dirsrv.fc +new file mode 100644 +index 0000000000..0c441124cf +--- /dev/null ++++ b/dirsrv.fc +@@ -0,0 +1,23 @@ ++/etc/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_config_t,s0) ++ ++/usr/sbin/ns-slapd -- gen_context(system_u:object_r:dirsrv_exec_t,s0) ++/usr/sbin/ldap-agent -- gen_context(system_u:object_r:dirsrv_snmp_exec_t,s0) ++/usr/sbin/ldap-agent-bin -- gen_context(system_u:object_r:dirsrv_snmp_exec_t,s0) ++/usr/sbin/start-dirsrv -- gen_context(system_u:object_r:initrc_exec_t,s0) ++/usr/sbin/restart-dirsrv -- gen_context(system_u:object_r:initrc_exec_t,s0) ++ ++/usr/share/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_share_t,s0) ++ ++/var/run/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_var_run_t,s0) ++/var/run/ldap-agent\.pid gen_context(system_u:object_r:dirsrv_snmp_var_run_t,s0) ++ ++# BZ: ++/var/run/slapd.* -s gen_context(system_u:object_r:dirsrv_var_run_t,s0) ++ ++/var/lib/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_var_lib_t,s0) ++ ++/var/lock/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_var_lock_t,s0) ++ ++/var/log/dirsrv(/.*)? gen_context(system_u:object_r:dirsrv_var_log_t,s0) ++ ++/var/log/dirsrv/ldap-agent.log.* gen_context(system_u:object_r:dirsrv_snmp_var_log_t,s0) +diff --git a/dirsrv.if b/dirsrv.if +new file mode 100644 +index 0000000000..943a99c98f +--- /dev/null ++++ b/dirsrv.if +@@ -0,0 +1,232 @@ ++## policy for dirsrv ++ ++######################################## ++## ++## Execute a domain transition to run dirsrv. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dirsrv_domtrans',` ++ gen_require(` ++ type dirsrv_t, dirsrv_exec_t; ++ ') ++ ++ domtrans_pattern($1, dirsrv_exec_t,dirsrv_t) ++') ++ ++######################################## ++## ++## Execute dirsrv in the dirsrv domain, and ++## allow the specified role the dirsrv domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`dirsrv_run',` ++ gen_require(` ++ type dirsrv_t; ++ ') ++ ++ dirsrv_domtrans($1) ++ role $2 types dirsrv_t; ++') ++ ++######################################## ++## ++## Allow caller to signal dirsrv. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_signal',` ++ gen_require(` ++ type dirsrv_t; ++ ') ++ ++ allow $1 dirsrv_t:process signal; ++') ++ ++ ++######################################## ++## ++## Send a null signal to dirsrv. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_signull',` ++ gen_require(` ++ type dirsrv_t; ++ ') ++ ++ allow $1 dirsrv_t:process signull; ++') ++ ++####################################### ++## ++## Allow a domain to manage dirsrv logs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_manage_log',` ++ gen_require(` ++ type dirsrv_var_log_t; ++ ') ++ ++ allow $1 dirsrv_var_log_t:dir manage_dir_perms; ++ allow $1 dirsrv_var_log_t:file manage_file_perms; ++ allow $1 dirsrv_var_log_t:fifo_file manage_fifo_file_perms; ++') ++ ++####################################### ++## ++## Allow a domain to manage dirsrv /var/lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_manage_var_lib',` ++ gen_require(` ++ type dirsrv_var_lib_t; ++ ') ++ allow $1 dirsrv_var_lib_t:dir manage_dir_perms; ++ allow $1 dirsrv_var_lib_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## Connect to dirsrv over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_stream_connect',` ++ gen_require(` ++ type dirsrv_t, dirsrv_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, dirsrv_var_run_t, dirsrv_var_run_t, dirsrv_t) ++') ++ ++####################################### ++## ++## Allow a domain to manage dirsrv /var/run files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_manage_var_run',` ++ gen_require(` ++ type dirsrv_var_run_t; ++ ') ++ allow $1 dirsrv_var_run_t:dir manage_dir_perms; ++ allow $1 dirsrv_var_run_t:file manage_file_perms; ++ allow $1 dirsrv_var_run_t:sock_file manage_file_perms; ++') ++ ++###################################### ++## ++## Allow a domain to create dirsrv pid directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_pid_filetrans',` ++ gen_require(` ++ type dirsrv_var_run_t; ++ ') ++ # Allow creating a dir in /var/run with this type ++ files_pid_filetrans($1, dirsrv_var_run_t, dir) ++') ++ ++####################################### ++## ++## Allow a domain to read dirsrv /var/run files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_read_var_run',` ++ gen_require(` ++ type dirsrv_var_run_t; ++ ') ++ allow $1 dirsrv_var_run_t:dir list_dir_perms; ++ allow $1 dirsrv_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Manage dirsrv configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_manage_config',` ++ gen_require(` ++ type dirsrv_config_t; ++ ') ++ ++ allow $1 dirsrv_config_t:dir manage_dir_perms; ++ allow $1 dirsrv_config_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## Read dirsrv share files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dirsrv_read_share',` ++ gen_require(` ++ type dirsrv_share_t; ++ ') ++ ++ allow $1 dirsrv_share_t:dir list_dir_perms; ++ allow $1 dirsrv_share_t:file { map read_file_perms }; ++ allow $1 dirsrv_share_t:lnk_file read; ++') +diff --git a/dirsrv.te b/dirsrv.te +new file mode 100644 +index 0000000000..dbddd4aafb +--- /dev/null ++++ b/dirsrv.te +@@ -0,0 +1,213 @@ ++policy_module(dirsrv,1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++# main daemon ++type dirsrv_t; ++type dirsrv_exec_t; ++domain_type(dirsrv_t) ++init_daemon_domain(dirsrv_t, dirsrv_exec_t) ++ ++type dirsrv_snmp_t; ++type dirsrv_snmp_exec_t; ++domain_type(dirsrv_snmp_t) ++init_daemon_domain(dirsrv_snmp_t, dirsrv_snmp_exec_t) ++ ++type dirsrv_var_lib_t; ++files_type(dirsrv_var_lib_t) ++ ++type dirsrv_var_log_t; ++logging_log_file(dirsrv_var_log_t) ++ ++type dirsrv_snmp_var_log_t; ++logging_log_file(dirsrv_snmp_var_log_t) ++ ++type dirsrv_var_run_t; ++files_pid_file(dirsrv_var_run_t) ++ ++type dirsrv_snmp_var_run_t; ++files_pid_file(dirsrv_snmp_var_run_t) ++ ++type dirsrv_var_lock_t; ++files_lock_file(dirsrv_var_lock_t) ++ ++type dirsrv_config_t; ++files_type(dirsrv_config_t) ++ ++type dirsrv_tmp_t; ++files_tmp_file(dirsrv_tmp_t) ++ ++type dirsrv_tmpfs_t; ++files_tmpfs_file(dirsrv_tmpfs_t) ++ ++type dirsrv_share_t; ++files_type(dirsrv_share_t); ++ ++######################################## ++# ++# dirsrv local policy ++# ++allow dirsrv_t self:process { getsched setsched setfscreate setrlimit signal_perms}; ++allow dirsrv_t self:capability { sys_nice setuid setgid fsetid chown dac_read_search dac_override fowner }; ++allow dirsrv_t self:fifo_file manage_fifo_file_perms; ++allow dirsrv_t self:sem create_sem_perms; ++allow dirsrv_t self:tcp_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(dirsrv_t, dirsrv_tmpfs_t, dirsrv_tmpfs_t) ++manage_files_pattern(dirsrv_t, dirsrv_tmpfs_t, dirsrv_tmpfs_t) ++manage_lnk_files_pattern(dirsrv_t, dirsrv_tmpfs_t, dirsrv_tmpfs_t) ++fs_tmpfs_filetrans(dirsrv_t, dirsrv_tmpfs_t, { dir file }) ++allow dirsrv_t dirsrv_tmpfs_t:file map; ++ ++manage_dirs_pattern(dirsrv_t, dirsrv_var_lib_t, dirsrv_var_lib_t) ++manage_files_pattern(dirsrv_t, dirsrv_var_lib_t, dirsrv_var_lib_t) ++manage_sock_files_pattern(dirsrv_t, dirsrv_var_lib_t, dirsrv_var_lib_t) ++files_var_lib_filetrans(dirsrv_t,dirsrv_var_lib_t, { file dir sock_file }) ++allow dirsrv_t dirsrv_var_lib_t:file map; ++ ++manage_dirs_pattern(dirsrv_t, dirsrv_var_log_t, dirsrv_var_log_t) ++manage_files_pattern(dirsrv_t, dirsrv_var_log_t, dirsrv_var_log_t) ++manage_fifo_files_pattern(dirsrv_t, dirsrv_var_log_t, dirsrv_var_log_t) ++allow dirsrv_t dirsrv_var_log_t:dir { setattr }; ++logging_log_filetrans(dirsrv_t,dirsrv_var_log_t,{ sock_file file dir }) ++ ++manage_dirs_pattern(dirsrv_t, dirsrv_var_run_t, dirsrv_var_run_t) ++manage_files_pattern(dirsrv_t, dirsrv_var_run_t, dirsrv_var_run_t) ++manage_sock_files_pattern(dirsrv_t, dirsrv_var_run_t, dirsrv_var_run_t) ++files_pid_filetrans(dirsrv_t, dirsrv_var_run_t, { file dir sock_file }) ++allow dirsrv_t dirsrv_var_run_t:file map; ++ ++manage_files_pattern(dirsrv_t, dirsrv_var_lock_t, dirsrv_var_lock_t) ++manage_dirs_pattern(dirsrv_t, dirsrv_var_lock_t, dirsrv_var_lock_t) ++files_lock_filetrans(dirsrv_t, dirsrv_var_lock_t, { dir file }) ++files_setattr_lock_dirs(dirsrv_t) ++ ++manage_files_pattern(dirsrv_t, dirsrv_config_t, dirsrv_config_t) ++manage_dirs_pattern(dirsrv_t, dirsrv_config_t, dirsrv_config_t) ++manage_lnk_files_pattern(dirsrv_t, dirsrv_config_t, dirsrv_config_t) ++ ++manage_files_pattern(dirsrv_t, dirsrv_tmp_t, dirsrv_tmp_t) ++manage_lnk_files_pattern(dirsrv_t, dirsrv_tmp_t, dirsrv_tmp_t) ++manage_dirs_pattern(dirsrv_t, dirsrv_tmp_t, dirsrv_tmp_t) ++files_tmp_filetrans(dirsrv_t, dirsrv_tmp_t, { file dir lnk_file }) ++allow dirsrv_t dirsrv_tmp_t:file relabel_file_perms; ++ ++read_files_pattern(dirsrv_t, dirsrv_share_t, dirsrv_share_t) ++list_dirs_pattern(dirsrv_t, dirsrv_share_t, dirsrv_share_t) ++ ++kernel_read_network_state(dirsrv_t) ++kernel_read_system_state(dirsrv_t) ++kernel_read_kernel_sysctls(dirsrv_t) ++ ++corecmd_search_bin(dirsrv_t) ++ ++corenet_all_recvfrom_netlabel(dirsrv_t) ++corenet_tcp_sendrecv_generic_if(dirsrv_t) ++corenet_tcp_sendrecv_generic_node(dirsrv_t) ++corenet_tcp_sendrecv_all_ports(dirsrv_t) ++corenet_tcp_bind_generic_node(dirsrv_t) ++corenet_tcp_bind_ldap_port(dirsrv_t) ++corenet_tcp_bind_dogtag_port(dirsrv_t) ++corenet_tcp_bind_all_rpc_ports(dirsrv_t) ++corenet_udp_bind_all_rpc_ports(dirsrv_t) ++corenet_tcp_connect_all_ports(dirsrv_t) ++corenet_sendrecv_ldap_server_packets(dirsrv_t) ++corenet_sendrecv_all_client_packets(dirsrv_t) ++ ++dev_read_sysfs(dirsrv_t) ++dev_read_urand(dirsrv_t) ++ ++files_read_usr_symlinks(dirsrv_t) ++ ++fs_getattr_all_fs(dirsrv_t) ++fs_read_cgroup_files(dirsrv_t) ++ ++auth_use_pam(dirsrv_t) ++ ++logging_send_syslog_msg(dirsrv_t) ++ ++sysnet_dns_name_resolve(dirsrv_t) ++ ++usermanage_read_crack_db(dirsrv_t) ++ ++optional_policy(` ++ apache_dontaudit_leaks(dirsrv_t) ++') ++ ++optional_policy(` ++ dirsrvadmin_read_tmp(dirsrv_t) ++') ++ ++optional_policy(` ++ kerberos_use(dirsrv_t) ++ kerberos_tmp_filetrans_host_rcache(dirsrv_t, "ldapmap1_0") ++ kerberos_tmp_filetrans_host_rcache(dirsrv_t, "ldap_487") ++ kerberos_tmp_filetrans_host_rcache(dirsrv_t, "ldap_55") ++') ++ ++# FIPS mode ++optional_policy(` ++ prelink_exec(dirsrv_t) ++') ++ ++optional_policy(` ++ rpcbind_stream_connect(dirsrv_t) ++') ++ ++optional_policy(` ++ uuidd_stream_connect_manager(dirsrv_t) ++') ++ ++optional_policy(` ++ systemd_manage_passwd_run(dirsrv_t) ++') ++ ++######################################## ++# ++# dirsrv-snmp local policy ++# ++allow dirsrv_snmp_t self:capability { dac_override dac_read_search }; ++allow dirsrv_snmp_t self:fifo_file rw_fifo_file_perms; ++ ++rw_files_pattern(dirsrv_snmp_t, dirsrv_tmpfs_t, dirsrv_tmpfs_t) ++ ++read_files_pattern(dirsrv_snmp_t, dirsrv_var_run_t, dirsrv_var_run_t) ++ ++read_files_pattern(dirsrv_snmp_t, dirsrv_config_t, dirsrv_config_t) ++ ++manage_files_pattern(dirsrv_snmp_t, dirsrv_snmp_var_run_t, dirsrv_snmp_var_run_t) ++files_pid_filetrans(dirsrv_snmp_t, dirsrv_snmp_var_run_t, { file sock_file }) ++search_dirs_pattern(dirsrv_snmp_t, dirsrv_var_run_t, dirsrv_var_run_t) ++ ++manage_files_pattern(dirsrv_snmp_t, dirsrv_var_log_t, dirsrv_snmp_var_log_t); ++filetrans_pattern(dirsrv_snmp_t, dirsrv_var_log_t, dirsrv_snmp_var_log_t, file) ++ ++kernel_read_system_state(dirsrv_snmp_t) ++ ++corenet_tcp_connect_agentx_port(dirsrv_snmp_t) ++ ++dev_read_rand(dirsrv_snmp_t) ++dev_read_urand(dirsrv_snmp_t) ++ ++domain_use_interactive_fds(dirsrv_snmp_t) ++ ++#files_manage_var_files(dirsrv_snmp_t) ++ ++fs_getattr_tmpfs(dirsrv_snmp_t) ++fs_search_tmpfs(dirsrv_snmp_t) ++ ++sysnet_read_config(dirsrv_snmp_t) ++sysnet_dns_name_resolve(dirsrv_snmp_t) ++ ++userdom_use_inherited_user_ptys(dirsrv_snmp_t) ++ ++optional_policy(` ++ snmp_dontaudit_read_snmp_var_lib_files(dirsrv_snmp_t) ++ snmp_dontaudit_write_snmp_var_lib_files(dirsrv_snmp_t) ++ snmp_manage_var_lib_dirs(dirsrv_snmp_t) ++ snmp_manage_var_lib_files(dirsrv_snmp_t) ++ snmp_stream_connect(dirsrv_snmp_t) ++') +diff --git a/distcc.if b/distcc.if +index 24d8c740c5..1790ec5dcb 100644 +--- a/distcc.if ++++ b/distcc.if +@@ -19,7 +19,7 @@ + # + interface(`distcc_admin',` + gen_require(` +- type distccd_t, distccd_t, distccd_log_t; ++ type distccd_t, distccd_t, distccd_log_t, distccd_var_run_t; + type disccd_var_run_t, distccd_tmp_t, distccd_initrc_exec_t; + ') + +diff --git a/distcc.te b/distcc.te +index 898b2f4339..8a1725b623 100644 +--- a/distcc.te ++++ b/distcc.te +@@ -47,7 +47,6 @@ files_pid_filetrans(distccd_t, distccd_var_run_t, file) + kernel_read_system_state(distccd_t) + kernel_read_kernel_sysctls(distccd_t) + +-corenet_all_recvfrom_unlabeled(distccd_t) + corenet_all_recvfrom_netlabel(distccd_t) + corenet_tcp_sendrecv_generic_if(distccd_t) + corenet_tcp_sendrecv_generic_node(distccd_t) +@@ -74,8 +73,6 @@ libs_exec_lib_files(distccd_t) + + logging_send_syslog_msg(distccd_t) + +-miscfiles_read_localization(distccd_t) +- + userdom_dontaudit_use_unpriv_user_fds(distccd_t) + userdom_dontaudit_search_user_home_dirs(distccd_t) + +diff --git a/djbdns.if b/djbdns.if +index 671d3c0a15..6d36c951a3 100644 +--- a/djbdns.if ++++ b/djbdns.if +@@ -39,6 +39,23 @@ template(`djbdns_daemontools_domain_template',` + + allow djbdns_$1_t djbdns_$1_conf_t:dir list_dir_perms; + allow djbdns_$1_t djbdns_$1_conf_t:file read_file_perms; ++ ++ corenet_all_recvfrom_netlabel(djbdns_$1_t) ++ corenet_tcp_sendrecv_generic_if(djbdns_$1_t) ++ corenet_udp_sendrecv_generic_if(djbdns_$1_t) ++ corenet_tcp_sendrecv_generic_node(djbdns_$1_t) ++ corenet_udp_sendrecv_generic_node(djbdns_$1_t) ++ corenet_tcp_sendrecv_all_ports(djbdns_$1_t) ++ corenet_udp_sendrecv_all_ports(djbdns_$1_t) ++ corenet_tcp_bind_generic_node(djbdns_$1_t) ++ corenet_udp_bind_generic_node(djbdns_$1_t) ++ corenet_tcp_bind_dns_port(djbdns_$1_t) ++ corenet_udp_bind_dns_port(djbdns_$1_t) ++ corenet_udp_bind_generic_port(djbdns_$1_t) ++ corenet_sendrecv_dns_server_packets(djbdns_$1_t) ++ corenet_sendrecv_generic_server_packets(djbdns_$1_t) ++ ++ files_search_var(djbdns_$1_t) + ') + + ##################################### +diff --git a/djbdns.te b/djbdns.te +index 87ca536ae3..ebd327ad1a 100644 +--- a/djbdns.te ++++ b/djbdns.te +@@ -48,6 +48,10 @@ corenet_udp_bind_generic_port(djbdns_domain) + + files_search_var(djbdns_domain) + ++daemontools_ipc_domain(djbdns_axfrdns_t) ++daemontools_read_svc(djbdns_axfrdns_t) ++ ++ + ######################################## + # + # axfrdns local policy +diff --git a/dkim.fc b/dkim.fc +index 5818418af7..674367b3a7 100644 +--- a/dkim.fc ++++ b/dkim.fc +@@ -9,7 +9,6 @@ + + /var/lib/dkim-milter(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) + +-/var/run/dkim-filter(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) + /var/run/dkim-milter(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) + /var/run/dkim-milter\.pid -- gen_context(system_u:object_r:dkim_milter_data_t,s0) + +diff --git a/dmidecode.if b/dmidecode.if +index 41c3f67701..653a1ecbb5 100644 +--- a/dmidecode.if ++++ b/dmidecode.if +@@ -19,6 +19,25 @@ interface(`dmidecode_domtrans',` + domtrans_pattern($1, dmidecode_exec_t, dmidecode_t) + ') + ++###################################### ++## ++## Execute dmidecode in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dmidecode_exec',` ++ gen_require(` ++ type dmidecode_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, dmidecode_exec_t) ++') ++ + ######################################## + ## + ## Execute dmidecode in the dmidecode +diff --git a/dmidecode.te b/dmidecode.te +index aa0ef6e944..d55bbd34c4 100644 +--- a/dmidecode.te ++++ b/dmidecode.te +@@ -31,4 +31,9 @@ mls_file_read_all_levels(dmidecode_t) + + locallogin_use_fds(dmidecode_t) + +-userdom_use_user_terminals(dmidecode_t) ++userdom_use_inherited_user_terminals(dmidecode_t) ++ ++optional_policy(` ++ rhsmcertd_rw_lock_files(dmidecode_t) ++ rhsmcertd_read_log(dmidecode_t) ++') +diff --git a/dnsmasq.fc b/dnsmasq.fc +index 23ab808d82..84735a8cb3 100644 +--- a/dnsmasq.fc ++++ b/dnsmasq.fc +@@ -1,13 +1,16 @@ + /etc/dnsmasq\.conf -- gen_context(system_u:object_r:dnsmasq_etc_t,s0) ++/etc/dnsmasq\.d(/.*)? gen_context(system_u:object_r:dnsmasq_etc_t,s0) + + /etc/rc\.d/init\.d/dnsmasq -- gen_context(system_u:object_r:dnsmasq_initrc_exec_t,s0) + ++/usr/lib/systemd/system/dnsmasq.* -- gen_context(system_u:object_r:dnsmasq_unit_file_t,s0) ++ + /usr/sbin/dnsmasq -- gen_context(system_u:object_r:dnsmasq_exec_t,s0) + + /var/lib/misc/dnsmasq\.leases -- gen_context(system_u:object_r:dnsmasq_lease_t,s0) + /var/lib/dnsmasq(/.*)? gen_context(system_u:object_r:dnsmasq_lease_t,s0) + +-/var/log/dnsmasq.* -- gen_context(system_u:object_r:dnsmasq_var_log_t,s0) ++/var/log/dnsmasq.* gen_context(system_u:object_r:dnsmasq_var_log_t,s0) + +-/var/run/dnsmasq.* -- gen_context(system_u:object_r:dnsmasq_var_run_t,s0) ++/var/run/dnsmasq.* gen_context(system_u:object_r:dnsmasq_var_run_t,s0) + /var/run/libvirt/network(/.*)? gen_context(system_u:object_r:dnsmasq_var_run_t,s0) +diff --git a/dnsmasq.if b/dnsmasq.if +index 19aa0b80b9..a79982cd6e 100644 +--- a/dnsmasq.if ++++ b/dnsmasq.if +@@ -10,7 +10,6 @@ + ## + ## + # +-# + interface(`dnsmasq_domtrans',` + gen_require(` + type dnsmasq_exec_t, dnsmasq_t; +@@ -20,6 +19,42 @@ interface(`dnsmasq_domtrans',` + domtrans_pattern($1, dnsmasq_exec_t, dnsmasq_t) + ') + ++####################################### ++## ++## Execute dnsmasq server in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dnsmasq_exec',` ++ gen_require(` ++ type dnsmasq_exec_t; ++ ') ++ ++ can_exec($1, dnsmasq_exec_t) ++') ++ ++######################################## ++## ++## Allow read/write dnsmasq pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnsmasq_rw_inherited_pipes',` ++ gen_require(` ++ type dnsmasq_t; ++ ') ++ ++ allow $1 dnsmasq_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ + ######################################## + ## + ## Execute the dnsmasq init script in +@@ -40,6 +75,49 @@ interface(`dnsmasq_initrc_domtrans',` + init_labeled_script_domtrans($1, dnsmasq_initrc_exec_t) + ') + ++######################################## ++## ++## Execute dnsmasq server in the dnsmasq domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dnsmasq_systemctl',` ++ gen_require(` ++ type dnsmasq_unit_file_t; ++ type dnsmasq_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 dnsmasq_unit_file_t:file read_file_perms; ++ allow $1 dnsmasq_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, dnsmasq_t) ++') ++ ++######################################## ++## ++## Send sigchld to dnsmasq. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# ++interface(`dnsmasq_sigchld',` ++ gen_require(` ++ type dnsmasq_t; ++ ') ++ ++ allow $1 dnsmasq_t:process sigchld; ++') ++ + ######################################## + ## + ## Send generic signals to dnsmasq. +@@ -145,15 +223,16 @@ interface(`dnsmasq_write_config',` + ## + ## + # +-# + interface(`dnsmasq_delete_pid_files',` + gen_require(` + type dnsmasq_var_run_t; + ') + ++ files_search_pids($1) + delete_files_pattern($1, dnsmasq_var_run_t, dnsmasq_var_run_t) + ') + ++ + ######################################## + ## + ## Create, read, write, and delete +@@ -176,7 +255,7 @@ interface(`dnsmasq_manage_pid_files',` + + ######################################## + ## +-## Read dnsmasq pid files. ++## Read dnsmasq pid files + ## + ## + ## +@@ -184,12 +263,12 @@ interface(`dnsmasq_manage_pid_files',` + ## + ## + # +-# + interface(`dnsmasq_read_pid_files',` + gen_require(` + type dnsmasq_var_run_t; + ') + ++ files_search_pids($1) + read_files_pattern($1, dnsmasq_var_run_t, dnsmasq_var_run_t) + ') + +@@ -214,37 +293,66 @@ interface(`dnsmasq_create_pid_dirs',` + + ######################################## + ## +-## Create specified objects in specified +-## directories with a type transition to +-## the dnsmasq pid file type. ++## Create dnsmasq pid directories. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Directory to transition on. +-## +-## +-## ++# ++interface(`dnsmasq_read_state',` ++ gen_require(` ++ type dnsmasq_t; ++ ') ++ ps_process_pattern($1, dnsmasq_t) ++') ++ ++######################################## ++## ++## Transition to dnsmasq named content ++## ++## + ## +-## The object class of the object being created. ++## Domain allowed access. + ## + ## +-## ++## + ## +-## The name of the object being created. ++## The type of the directory for the object to be created. + ## + ## + # +-interface(`dnsmasq_spec_filetrans_pid',` ++interface(`dnsmasq_filetrans_named_content_fromdir',` + gen_require(` + type dnsmasq_var_run_t; + ') + +- filetrans_pattern($1, $2, dnsmasq_var_run_t, $3, $4) ++ filetrans_pattern($1, $2, dnsmasq_var_run_t, dir, "network") ++ filetrans_pattern($1, $2, dnsmasq_var_run_t, file, "dnsmasq.pid") ++') ++ ++####################################### ++## ++## Transition to dnsmasq named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnsmasq_filetrans_named_content',` ++ gen_require(` ++ type dnsmasq_etc_t; ++ type dnsmasq_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, dnsmasq_var_run_t, dir, "network") ++ files_pid_filetrans($1, dnsmasq_var_run_t, file, "dnsmasq.pid") ++ virt_pid_filetrans($1, dnsmasq_var_run_t, file, "network") ++ files_etc_filetrans($1, dnsmasq_etc_t, file, "dnsmasq.conf") ++ files_etc_filetrans($1, dnsmasq_etc_t, dir, "dnsmasq.d") + ') + + ######################################## +@@ -267,12 +375,18 @@ interface(`dnsmasq_spec_filetrans_pid',` + interface(`dnsmasq_admin',` + gen_require(` + type dnsmasq_t, dnsmasq_lease_t, dnsmasq_var_run_t; +- type dnsmasq_initrc_exec_t, dnsmasq_var_log_t; ++ type dnsmasq_var_log_t; ++ type dnsmasq_initrc_exec_t; ++ type dnsmasq_unit_file_t; + ') + +- allow $1 dnsmasq_t:process { ptrace signal_perms }; ++ allow $1 dnsmasq_t:process signal_perms; + ps_process_pattern($1, dnsmasq_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 dnsmasq_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, dnsmasq_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 dnsmasq_initrc_exec_t system_r; +@@ -281,9 +395,36 @@ interface(`dnsmasq_admin',` + files_list_var_lib($1) + admin_pattern($1, dnsmasq_lease_t) + +- logging_seearch_logs($1) ++ logging_search_logs($1) + admin_pattern($1, dnsmasq_var_log_t) + + files_list_pids($1) + admin_pattern($1, dnsmasq_var_run_t) ++ ++ dnsmasq_systemctl($1) ++ admin_pattern($1, dnsmasq_unit_file_t) ++ allow $1 dnsmasq_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## dnsmasq over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnsmasq_dbus_chat',` ++ gen_require(` ++ type dnsmasq_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 dnsmasq_t:dbus send_msg; ++ allow dnsmasq_t $1:dbus send_msg; + ') ++ ++ +diff --git a/dnsmasq.te b/dnsmasq.te +index 37a3b7b30e..3d07c22fa4 100644 +--- a/dnsmasq.te ++++ b/dnsmasq.te +@@ -24,12 +24,18 @@ logging_log_file(dnsmasq_var_log_t) + type dnsmasq_var_run_t; + files_pid_file(dnsmasq_var_run_t) + ++type dnsmasq_unit_file_t; ++systemd_unit_file(dnsmasq_unit_file_t) ++ ++type dnsmasq_tmp_t; ++files_tmp_file(dnsmasq_tmp_t) ++ + ######################################## + # + # Local policy + # + +-allow dnsmasq_t self:capability { chown dac_override net_admin setgid setuid net_raw }; ++allow dnsmasq_t self:capability { chown dac_read_search dac_override net_admin setgid setuid net_raw }; + dontaudit dnsmasq_t self:capability sys_tty_config; + allow dnsmasq_t self:process { getcap setcap signal_perms }; + allow dnsmasq_t self:fifo_file rw_fifo_file_perms; +@@ -38,6 +44,7 @@ allow dnsmasq_t self:packet_socket create_socket_perms; + allow dnsmasq_t self:rawip_socket create_socket_perms; + + read_files_pattern(dnsmasq_t, dnsmasq_etc_t, dnsmasq_etc_t) ++list_dirs_pattern(dnsmasq_t, dnsmasq_etc_t, dnsmasq_etc_t) + + manage_files_pattern(dnsmasq_t, dnsmasq_lease_t, dnsmasq_lease_t) + files_var_lib_filetrans(dnsmasq_t, dnsmasq_lease_t, file) +@@ -51,12 +58,19 @@ manage_dirs_pattern(dnsmasq_t, dnsmasq_var_run_t, dnsmasq_var_run_t) + manage_files_pattern(dnsmasq_t, dnsmasq_var_run_t, dnsmasq_var_run_t) + files_pid_filetrans(dnsmasq_t, dnsmasq_var_run_t, { dir file }) + ++manage_dirs_pattern(dnsmasq_t, dnsmasq_tmp_t, dnsmasq_tmp_t) ++manage_files_pattern(dnsmasq_t, dnsmasq_tmp_t, dnsmasq_tmp_t) ++files_tmp_filetrans(dnsmasq_t, dnsmasq_tmp_t, { file dir }) ++ + kernel_read_kernel_sysctls(dnsmasq_t) ++kernel_read_net_sysctls(dnsmasq_t) + kernel_read_network_state(dnsmasq_t) + kernel_read_system_state(dnsmasq_t) + kernel_request_load_module(dnsmasq_t) + +-corenet_all_recvfrom_unlabeled(dnsmasq_t) ++corecmd_exec_bin(dnsmasq_t) ++corecmd_exec_shell(dnsmasq_t) ++ + corenet_all_recvfrom_netlabel(dnsmasq_t) + corenet_tcp_sendrecv_generic_if(dnsmasq_t) + corenet_udp_sendrecv_generic_if(dnsmasq_t) +@@ -80,15 +94,16 @@ dev_read_urand(dnsmasq_t) + domain_use_interactive_fds(dnsmasq_t) + + files_read_etc_runtime_files(dnsmasq_t) ++files_manage_mnt_files(dnsmasq_t) + + fs_getattr_all_fs(dnsmasq_t) + fs_search_auto_mountpoints(dnsmasq_t) + + auth_use_nsswitch(dnsmasq_t) + +-logging_send_syslog_msg(dnsmasq_t) ++libs_exec_ldconfig(dnsmasq_t) + +-miscfiles_read_localization(dnsmasq_t) ++logging_send_syslog_msg(dnsmasq_t) + + userdom_dontaudit_use_unpriv_user_fds(dnsmasq_t) + userdom_dontaudit_search_user_home_dirs(dnsmasq_t) +@@ -97,13 +112,27 @@ optional_policy(` + cobbler_read_lib_files(dnsmasq_t) + ') + ++optional_policy(` ++ cron_manage_pid_files(dnsmasq_t) ++') ++ + optional_policy(` + dbus_connect_system_bus(dnsmasq_t) + dbus_system_bus_client(dnsmasq_t) ++ ++ optional_policy(` ++ networkmanager_dbus_chat(dnsmasq_t) ++ ') + ') + + optional_policy(` +- networkmanager_read_pid_files(dnsmasq_t) ++ dnsmasq_domtrans(dnsmasq_t) ++') ++ ++optional_policy(` ++ networkmanager_read_conf(dnsmasq_t) ++ networkmanager_manage_pid_files(dnsmasq_t) ++ networkmanager_manage_lib(dnsmasq_t) + ') + + optional_policy(` +@@ -124,6 +153,18 @@ optional_policy(` + + optional_policy(` + virt_manage_lib_files(dnsmasq_t) ++ virt_read_lib_files(dnsmasq_t) + virt_read_pid_files(dnsmasq_t) + virt_pid_filetrans(dnsmasq_t, dnsmasq_var_run_t, { dir file }) + ') ++ ++optional_policy(` ++ neutron_manage_lib_files(dnsmasq_t) ++ neutron_stream_connect(dnsmasq_t) ++ neutron_rw_fifo_file(dnsmasq_t) ++ neutron_sigchld(dnsmasq_t) ++') ++ ++optional_policy(` ++ systemd_resolved_read_pid(dnsmasq_t) ++') +diff --git a/dnssec.fc b/dnssec.fc +new file mode 100644 +index 0000000000..1714fa6618 +--- /dev/null ++++ b/dnssec.fc +@@ -0,0 +1,6 @@ ++/usr/lib/systemd/system/dnssec-triggerd.* -- gen_context(system_u:object_r:dnssec_trigger_unit_file_t,s0) ++ ++/usr/sbin/dnssec-triggerd -- gen_context(system_u:object_r:dnssec_trigger_exec_t,s0) ++/usr/libexec/dnssec-trigger-script -- gen_context(system_u:object_r:dnssec_trigger_exec_t,s0) ++ ++/var/run/dnssec.* gen_context(system_u:object_r:dnssec_trigger_var_run_t,s0) +diff --git a/dnssec.if b/dnssec.if +new file mode 100644 +index 0000000000..a846ce0308 +--- /dev/null ++++ b/dnssec.if +@@ -0,0 +1,104 @@ ++ ++## policy for dnssec_trigger ++ ++######################################## ++## ++## Transition to dnssec_trigger. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dnssec_trigger_domtrans',` ++ gen_require(` ++ type dnssec_trigger_t, dnssec_trigger_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, dnssec_trigger_exec_t, dnssec_trigger_t) ++') ++######################################## ++## ++## Read dnssec_trigger PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnssec_trigger_read_pid_files',` ++ gen_require(` ++ type dnssec_trigger_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 dnssec_trigger_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Manage dnssec_trigger PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnssec_trigger_manage_pid_files',` ++ gen_require(` ++ type dnssec_trigger_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_dirs_pattern($1, dnssec_trigger_var_run_t, dnssec_trigger_var_run_t) ++ manage_files_pattern($1, dnssec_trigger_var_run_t, dnssec_trigger_var_run_t) ++ manage_lnk_files_pattern($1, dnssec_trigger_var_run_t, dnssec_trigger_var_run_t) ++') ++ ++ ++######################################## ++## ++## Send signull to dnssec_trigger. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# ++interface(`dnssec_trigger_signull',` ++ gen_require(` ++ type dnssec_trigger_t; ++ ') ++ ++ allow $1 dnssec_trigger_t:process signull; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an dnssec_trigger environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dnssec_trigger_admin',` ++ gen_require(` ++ type dnssec_trigger_t; ++ type dnssec_trigger_var_run_t; ++ ') ++ ++ allow $1 dnssec_trigger_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, dnssec_trigger_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, dnssec_trigger_var_run_t) ++') +diff --git a/dnssec.te b/dnssec.te +new file mode 100644 +index 0000000000..bc3fac51c4 +--- /dev/null ++++ b/dnssec.te +@@ -0,0 +1,81 @@ ++policy_module(dnssec, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type dnssec_trigger_t; ++type dnssec_trigger_exec_t; ++init_daemon_domain(dnssec_trigger_t, dnssec_trigger_exec_t) ++ ++type dnssec_trigger_unit_file_t; ++systemd_unit_file(dnssec_trigger_unit_file_t) ++ ++type dnssec_trigger_var_run_t; ++files_pid_file(dnssec_trigger_var_run_t) ++ ++type dnssec_trigger_tmp_t; ++files_tmp_file(dnssec_trigger_tmp_t) ++ ++######################################## ++# ++# dnssec_trigger local policy ++# ++allow dnssec_trigger_t self:capability { net_admin linux_immutable }; ++allow dnssec_trigger_t self:process signal; ++allow dnssec_trigger_t self:fifo_file rw_fifo_file_perms; ++allow dnssec_trigger_t self:unix_stream_socket create_stream_socket_perms; ++allow dnssec_trigger_t self:tcp_socket create_stream_socket_perms; ++allow dnssec_trigger_t self:udp_socket create_socket_perms; ++ ++manage_dirs_pattern(dnssec_trigger_t, dnssec_trigger_var_run_t, dnssec_trigger_var_run_t) ++manage_files_pattern(dnssec_trigger_t, dnssec_trigger_var_run_t, dnssec_trigger_var_run_t) ++allow dnssec_trigger_t dnssec_trigger_var_run_t:file relabelfrom_file_perms; ++files_pid_filetrans(dnssec_trigger_t, dnssec_trigger_var_run_t, { dir file }) ++ ++manage_files_pattern(dnssec_trigger_t,dnssec_trigger_tmp_t,dnssec_trigger_tmp_t) ++manage_dirs_pattern(dnssec_trigger_t,dnssec_trigger_tmp_t,dnssec_trigger_tmp_t) ++files_tmp_filetrans(dnssec_trigger_t,dnssec_trigger_tmp_t,{ file dir }) ++ ++kernel_read_system_state(dnssec_trigger_t) ++ ++corecmd_exec_bin(dnssec_trigger_t) ++corecmd_exec_shell(dnssec_trigger_t) ++ ++corenet_tcp_bind_generic_node(dnssec_trigger_t) ++corenet_tcp_bind_dnssec_port(dnssec_trigger_t) ++corenet_tcp_connect_rndc_port(dnssec_trigger_t) ++corenet_tcp_connect_http_port(dnssec_trigger_t) ++ ++dev_read_urand(dnssec_trigger_t) ++ ++domain_use_interactive_fds(dnssec_trigger_t) ++ ++files_read_etc_runtime_files(dnssec_trigger_t) ++files_dontaudit_list_tmp(dnssec_trigger_t) ++ ++logging_send_syslog_msg(dnssec_trigger_t) ++ ++auth_use_nsswitch(dnssec_trigger_t) ++ ++sysnet_dns_name_resolve(dnssec_trigger_t) ++sysnet_manage_config(dnssec_trigger_t) ++sysnet_filetrans_named_content(dnssec_trigger_t) ++ ++optional_policy(` ++ dbus_system_bus_client(dnssec_trigger_t) ++') ++ ++optional_policy(` ++ bind_domtrans(dnssec_trigger_t) ++ bind_read_config(dnssec_trigger_t) ++ bind_read_dnssec_keys(dnssec_trigger_t) ++') ++ ++optional_policy(` ++ networkmanager_stream_connect(dnssec_trigger_t) ++ networkmanager_sigchld(dnssec_trigger_t) ++ networkmanager_sigkill(dnssec_trigger_t) ++ networkmanager_signull(dnssec_trigger_t) ++') +diff --git a/dnssectrigger.te b/dnssectrigger.te +index c7bb4e782f..e6fe2f402f 100644 +--- a/dnssectrigger.te ++++ b/dnssectrigger.te +@@ -67,8 +67,6 @@ files_read_etc_runtime_files(dnssec_triggerd_t) + + logging_send_syslog_msg(dnssec_triggerd_t) + +-miscfiles_read_localization(dnssec_triggerd_t) +- + sysnet_dns_name_resolve(dnssec_triggerd_t) + sysnet_manage_config(dnssec_triggerd_t) + sysnet_etc_filetrans_config(dnssec_triggerd_t) +diff --git a/dovecot.fc b/dovecot.fc +index c880070041..444805588a 100644 +--- a/dovecot.fc ++++ b/dovecot.fc +@@ -1,36 +1,48 @@ +-/etc/dovecot(/.*)? gen_context(system_u:object_r:dovecot_etc_t,s0) +-/etc/dovecot/passwd.* gen_context(system_u:object_r:dovecot_passwd_t,s0) + +-/etc/dovecot\.conf.* gen_context(system_u:object_r:dovecot_etc_t,s0) +-/etc/dovecot\.passwd.* gen_context(system_u:object_r:dovecot_passwd_t,s0) +- +-/etc/pki/dovecot(/.*)? gen_context(system_u:object_r:dovecot_cert_t,s0) ++# ++# /etc ++# ++/etc/dovecot(/.*)? gen_context(system_u:object_r:dovecot_etc_t,s0) ++/etc/dovecot\.conf.* gen_context(system_u:object_r:dovecot_etc_t,s0) ++/etc/dovecot\.passwd.* gen_context(system_u:object_r:dovecot_passwd_t,s0) + ++/etc/pki/dovecot(/.*)? gen_context(system_u:object_r:dovecot_cert_t,s0) + /etc/rc\.d/init\.d/dovecot -- gen_context(system_u:object_r:dovecot_initrc_exec_t,s0) + +-/usr/sbin/dovecot -- gen_context(system_u:object_r:dovecot_exec_t,s0) ++# Debian uses /etc/dovecot/ ++ifdef(`distro_debian',` ++/etc/dovecot/passwd.* gen_context(system_u:object_r:dovecot_passwd_t,s0) ++') + +-/usr/share/ssl/certs/dovecot\.pem -- gen_context(system_u:object_r:dovecot_cert_t,s0) +-/usr/share/ssl/private/dovecot\.pem -- gen_context(system_u:object_r:dovecot_cert_t,s0) ++# ++# /usr ++# ++/usr/sbin/dovecot -- gen_context(system_u:object_r:dovecot_exec_t,s0) + +-/etc/ssl/dovecot(/.*)? gen_context(system_u:object_r:dovecot_cert_t,s0) ++/usr/share/ssl/certs/dovecot\.pem -- gen_context(system_u:object_r:dovecot_cert_t,s0) ++/usr/share/ssl/private/dovecot\.pem -- gen_context(system_u:object_r:dovecot_cert_t,s0) + +-/usr/lib/dovecot/auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) +-/usr/lib/dovecot/deliver -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) ++ifdef(`distro_debian', ` + /usr/lib/dovecot/dovecot-auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) +-/usr/lib/dovecot/dovecot-lda -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) ++/usr/lib/dovecot/deliver -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) ++') + +-/usr/libexec/dovecot/auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) ++ifdef(`distro_redhat', ` ++/usr/libexec/dovecot/auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) + /usr/libexec/dovecot/deliver -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) +-/usr/libexec/dovecot/deliver-lda -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) +-/usr/libexec/dovecot/dovecot-auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) ++/usr/libexec/dovecot/dovecot-lda -- gen_context(system_u:object_r:dovecot_deliver_exec_t,s0) ++/usr/libexec/dovecot/dovecot-auth -- gen_context(system_u:object_r:dovecot_auth_exec_t,s0) ++') + +-/var/run/dovecot(-login)?(/.*)? gen_context(system_u:object_r:dovecot_var_run_t,s0) +-/var/run/dovecot/login/ssl-parameters.dat -- gen_context(system_u:object_r:dovecot_var_lib_t,s0) ++# ++# /var ++# ++/var/run/dovecot(-login)?(/.*)? gen_context(system_u:object_r:dovecot_var_run_t,s0) ++/var/run/dovecot/login/ssl-parameters.dat -- gen_context(system_u:object_r:dovecot_var_lib_t,s0) + +-/var/lib/dovecot(/.*)? gen_context(system_u:object_r:dovecot_var_lib_t,s0) ++/var/lib/dovecot(/.*)? gen_context(system_u:object_r:dovecot_var_lib_t,s0) + +-/var/log/dovecot(/.*)? gen_context(system_u:object_r:dovecot_var_log_t,s0) +-/var/log/dovecot\.log.* gen_context(system_u:object_r:dovecot_var_log_t,s0) ++/var/log/dovecot(/.*)? gen_context(system_u:object_r:dovecot_var_log_t,s0) ++/var/log/dovecot\.log.* gen_context(system_u:object_r:dovecot_var_log_t,s0) + +-/var/spool/dovecot(/.*)? gen_context(system_u:object_r:dovecot_spool_t,s0) ++/var/spool/dovecot(/.*)? gen_context(system_u:object_r:dovecot_spool_t,s0) +diff --git a/dovecot.if b/dovecot.if +index d5badb7557..c2431fc731 100644 +--- a/dovecot.if ++++ b/dovecot.if +@@ -1,29 +1,49 @@ +-## POP and IMAP mail server. ++## Dovecot POP and IMAP mail server ++ ++###################################### ++## ++## Creates types and rules for a basic ++## dovecot daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`dovecot_basic_types_template',` ++ gen_require(` ++ attribute dovecot_domain; ++ ') ++ ++ type $1_t, dovecot_domain; ++ type $1_exec_t; ++ ++ kernel_read_system_state($1_t) ++') + + ####################################### + ## +-## Connect to dovecot using a unix +-## domain stream socket. ++## Connect to dovecot unix domain stream socket. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`dovecot_stream_connect',` +- gen_require(` +- type dovecot_t, dovecot_var_run_t; +- ') ++ gen_require(` ++ type dovecot_t, dovecot_var_run_t; ++ ') + +- files_search_pids($1) +- stream_connect_pattern($1, dovecot_var_run_t, dovecot_var_run_t, dovecot_t) ++ files_search_pids($1) ++ stream_connect_pattern($1, dovecot_var_run_t, dovecot_var_run_t, dovecot_t) + ') + + ######################################## + ## +-## Connect to dovecot using a unix +-## domain stream socket. ++## Connect to dovecot auth unix domain stream socket. + ## + ## + ## +@@ -43,8 +63,7 @@ interface(`dovecot_stream_connect_auth',` + + ######################################## + ## +-## Execute dovecot_deliver in the +-## dovecot_deliver domain. ++## Execute dovecot_deliver in the dovecot_deliver domain. + ## + ## + ## +@@ -57,14 +76,12 @@ interface(`dovecot_domtrans_deliver',` + type dovecot_deliver_t, dovecot_deliver_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, dovecot_deliver_exec_t, dovecot_deliver_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## dovecot spool files. ++## Create, read, write, and delete the dovecot spool files. + ## + ## + ## +@@ -78,15 +95,13 @@ interface(`dovecot_manage_spool',` + ') + + files_search_spool($1) +- allow $1 dovecot_spool_t:dir manage_dir_perms; +- allow $1 dovecot_spool_t:file manage_file_perms; +- allow $1 dovecot_spool_t:lnk_file manage_lnk_file_perms; ++ manage_files_pattern($1, dovecot_spool_t, dovecot_spool_t) ++ manage_lnk_files_pattern($1, dovecot_spool_t, dovecot_spool_t) + ') + + ######################################## + ## +-## Do not audit attempts to delete +-## dovecot lib files. ++## Do not audit attempts to delete dovecot lib files. + ## + ## + ## +@@ -99,12 +114,13 @@ interface(`dovecot_dontaudit_unlink_lib_files',` + type dovecot_var_lib_t; + ') + +- dontaudit $1 dovecot_var_lib_t:file delete_file_perms; ++ dontaudit $1 dovecot_var_lib_t:file unlink; + ') + + ###################################### + ## +-## Write inherited dovecot tmp files. ++## Allow attempts to write inherited ++## dovecot tmp files. + ## + ## + ## +@@ -120,10 +136,30 @@ interface(`dovecot_write_inherited_tmp_files',` + allow $1 dovecot_tmp_t:file write; + ') + ++#################################### ++## ++## Read dovecot configuration file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dovecot_read_config',` ++ gen_require(` ++ type dovecot_etc_t; ++ ') ++ ++ files_search_etc($1) ++ list_dirs_pattern($1, dovecot_etc_t, dovecot_etc_t) ++ read_files_pattern($1, dovecot_etc_t, dovecot_etc_t) ++') ++ + ######################################## + ## +-## All of the rules required to +-## administrate an dovecot environment. ++## All of the rules required to administrate ++## an dovecot environment + ## + ## + ## +@@ -132,7 +168,7 @@ interface(`dovecot_write_inherited_tmp_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the dovecot domain. + ## + ## + ## +@@ -146,9 +182,13 @@ interface(`dovecot_admin',` + type dovecot_keytab_t; + ') + +- allow $1 dovecot_t:process { ptrace signal_perms }; ++ allow $1 dovecot_t:process signal_perms; + ps_process_pattern($1, dovecot_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 dovecot_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, dovecot_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 dovecot_initrc_exec_t system_r; +@@ -157,20 +197,25 @@ interface(`dovecot_admin',` + files_list_etc($1) + admin_pattern($1, { dovecot_keytab_t dovecot_etc_t }) + +- logging_list_logs($1) +- admin_pattern($1, dovecot_var_log_t) ++ files_list_tmp($1) ++ admin_pattern($1, dovecot_auth_tmp_t) ++ admin_pattern($1, dovecot_tmp_t) ++ ++ admin_pattern($1, dovecot_keytab_t) + + files_list_spool($1) + admin_pattern($1, dovecot_spool_t) + +- files_search_tmp($1) +- admin_pattern($1, { dovecot_tmp_t dovecot_auth_tmp_t dovecot_deliver_tmp_t }) +- + files_list_var_lib($1) + admin_pattern($1, dovecot_var_lib_t) + ++ logging_search_logs($1) ++ admin_pattern($1, dovecot_var_log_t) ++ + files_list_pids($1) + admin_pattern($1, dovecot_var_run_t) + +- admin_pattern($1, { dovecot_cert_t dovecot_passwd_t }) ++ admin_pattern($1, dovecot_cert_t) ++ ++ admin_pattern($1, dovecot_passwd_t) + ') +diff --git a/dovecot.te b/dovecot.te +index 0aabc7e663..641a03465a 100644 +--- a/dovecot.te ++++ b/dovecot.te +@@ -7,12 +7,10 @@ policy_module(dovecot, 1.16.1) + + attribute dovecot_domain; + +-type dovecot_t, dovecot_domain; +-type dovecot_exec_t; ++dovecot_basic_types_template(dovecot) + init_daemon_domain(dovecot_t, dovecot_exec_t) + +-type dovecot_auth_t, dovecot_domain; +-type dovecot_auth_exec_t; ++dovecot_basic_types_template(dovecot_auth) + domain_type(dovecot_auth_t) + domain_entry_file(dovecot_auth_t, dovecot_auth_exec_t) + role system_r types dovecot_auth_t; +@@ -23,8 +21,7 @@ files_tmp_file(dovecot_auth_tmp_t) + type dovecot_cert_t; + miscfiles_cert_type(dovecot_cert_t) + +-type dovecot_deliver_t, dovecot_domain; +-type dovecot_deliver_exec_t; ++dovecot_basic_types_template(dovecot_deliver) + domain_type(dovecot_deliver_t) + domain_entry_file(dovecot_deliver_t, dovecot_deliver_exec_t) + role system_r types dovecot_deliver_t; +@@ -45,11 +42,12 @@ type dovecot_passwd_t; + files_type(dovecot_passwd_t) + + type dovecot_spool_t; +-files_type(dovecot_spool_t) ++files_spool_file(dovecot_spool_t) + + type dovecot_tmp_t; + files_tmp_file(dovecot_tmp_t) + ++# /var/lib/dovecot holds SSL parameters file + type dovecot_var_lib_t; + files_type(dovecot_var_lib_t) + +@@ -59,20 +57,20 @@ logging_log_file(dovecot_var_log_t) + type dovecot_var_run_t; + files_pid_file(dovecot_var_run_t) + +-######################################## ++####################################### + # +-# Common local policy ++# dovecot domain local policy + # + +-allow dovecot_domain self:capability2 block_suspend; +-allow dovecot_domain self:fifo_file rw_fifo_file_perms; ++allow dovecot_domain self:capability sys_resource; ++dontaudit dovecot_domain self:capability2 block_suspend; ++allow dovecot_domain self:process signal_perms; + +-allow dovecot_domain dovecot_etc_t:dir list_dir_perms; +-allow dovecot_domain dovecot_etc_t:file read_file_perms; +-allow dovecot_domain dovecot_etc_t:lnk_file read_lnk_file_perms; ++allow dovecot_domain self:unix_dgram_socket create_socket_perms; ++allow dovecot_domain self:fifo_file rw_fifo_file_perms; + + kernel_read_all_sysctls(dovecot_domain) +-kernel_read_system_state(dovecot_domain) ++kernel_read_network_state(dovecot_domain) + + corecmd_exec_bin(dovecot_domain) + corecmd_exec_shell(dovecot_domain) +@@ -81,26 +79,34 @@ dev_read_sysfs(dovecot_domain) + dev_read_rand(dovecot_domain) + dev_read_urand(dovecot_domain) + ++# Dovecot now has quota support and it uses getmntent() to find the mountpoints. + files_read_etc_runtime_files(dovecot_domain) + +-logging_send_syslog_msg(dovecot_domain) +- +-miscfiles_read_localization(dovecot_domain) +- + ######################################## + # +-# Local policy ++# dovecot local policy + # + +-allow dovecot_t self:capability { dac_override dac_read_search chown fsetid kill setgid setuid sys_chroot }; ++allow dovecot_t self:capability { dac_override dac_read_search chown fsetid kill net_bind_service setgid setuid sys_chroot sys_resource }; + dontaudit dovecot_t self:capability sys_tty_config; + allow dovecot_t self:process { setrlimit signal_perms getcap setcap setsched }; +-allow dovecot_t self:tcp_socket { accept listen }; +-allow dovecot_t self:unix_stream_socket { accept connectto listen }; ++allow dovecot_t self:tcp_socket create_stream_socket_perms; ++allow dovecot_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++domtrans_pattern(dovecot_t, dovecot_auth_exec_t, dovecot_auth_t) ++ ++allow dovecot_t dovecot_auth_t:process signal; + + allow dovecot_t dovecot_cert_t:dir list_dir_perms; +-allow dovecot_t dovecot_cert_t:file read_file_perms; +-allow dovecot_t dovecot_cert_t:lnk_file read_lnk_file_perms; ++read_files_pattern(dovecot_t, dovecot_cert_t, dovecot_cert_t) ++read_lnk_files_pattern(dovecot_t, dovecot_cert_t, dovecot_cert_t) ++ ++allow dovecot_t dovecot_etc_t:dir list_dir_perms; ++read_files_pattern(dovecot_t, dovecot_etc_t, dovecot_etc_t) ++read_lnk_files_pattern(dovecot_t, dovecot_etc_t, dovecot_etc_t) ++files_search_etc(dovecot_t) ++ ++can_exec(dovecot_t, dovecot_exec_t) + + allow dovecot_t dovecot_keytab_t:file read_file_perms; + +@@ -108,12 +114,13 @@ manage_dirs_pattern(dovecot_t, dovecot_tmp_t, dovecot_tmp_t) + manage_files_pattern(dovecot_t, dovecot_tmp_t, dovecot_tmp_t) + files_tmp_filetrans(dovecot_t, dovecot_tmp_t, { file dir }) + ++# Allow dovecot to create and read SSL parameters file + manage_files_pattern(dovecot_t, dovecot_var_lib_t, dovecot_var_lib_t) ++files_search_var_lib(dovecot_t) ++files_read_var_symlinks(dovecot_t) + + manage_dirs_pattern(dovecot_t, dovecot_var_log_t, dovecot_var_log_t) +-append_files_pattern(dovecot_t, dovecot_var_log_t, dovecot_var_log_t) +-create_files_pattern(dovecot_t, dovecot_var_log_t, dovecot_var_log_t) +-setattr_files_pattern(dovecot_t, dovecot_var_log_t, dovecot_var_log_t) ++manage_files_pattern(dovecot_t, dovecot_var_log_t, dovecot_var_log_t) + logging_log_filetrans(dovecot_t, dovecot_var_log_t, { file dir }) + + manage_dirs_pattern(dovecot_t, dovecot_spool_t, dovecot_spool_t) +@@ -125,45 +132,35 @@ manage_files_pattern(dovecot_t, dovecot_var_run_t, dovecot_var_run_t) + manage_lnk_files_pattern(dovecot_t, dovecot_var_run_t, dovecot_var_run_t) + manage_sock_files_pattern(dovecot_t, dovecot_var_run_t, dovecot_var_run_t) + manage_fifo_files_pattern(dovecot_t, dovecot_var_run_t, dovecot_var_run_t) +-files_pid_filetrans(dovecot_t, dovecot_var_run_t, { dir file fifo_file }) +- +-can_exec(dovecot_t, dovecot_exec_t) +- +-allow dovecot_t dovecot_auth_t:process signal; +- +-domtrans_pattern(dovecot_t, dovecot_auth_exec_t, dovecot_auth_t) ++files_pid_filetrans(dovecot_t, dovecot_var_run_t, { dir file fifo_file sock_file }) + +-corenet_all_recvfrom_unlabeled(dovecot_t) + corenet_all_recvfrom_netlabel(dovecot_t) + corenet_tcp_sendrecv_generic_if(dovecot_t) + corenet_tcp_sendrecv_generic_node(dovecot_t) + corenet_tcp_sendrecv_all_ports(dovecot_t) + corenet_tcp_bind_generic_node(dovecot_t) +- +-corenet_sendrecv_mail_server_packets(dovecot_t) + corenet_tcp_bind_mail_port(dovecot_t) +-corenet_sendrecv_pop_server_packets(dovecot_t) + corenet_tcp_bind_pop_port(dovecot_t) +-corenet_sendrecv_sieve_server_packets(dovecot_t) ++corenet_tcp_bind_lmtp_port(dovecot_t) + corenet_tcp_bind_sieve_port(dovecot_t) +- +-corenet_sendrecv_all_client_packets(dovecot_t) + corenet_tcp_connect_all_ports(dovecot_t) + corenet_tcp_connect_postgresql_port(dovecot_t) ++corenet_sendrecv_pop_server_packets(dovecot_t) ++corenet_sendrecv_all_client_packets(dovecot_t) ++ ++fs_getattr_all_fs(dovecot_t) ++fs_getattr_all_dirs(dovecot_t) ++fs_search_auto_mountpoints(dovecot_t) ++fs_list_inotifyfs(dovecot_t) + + domain_use_interactive_fds(dovecot_t) + +-files_read_var_lib_files(dovecot_t) +-files_read_var_symlinks(dovecot_t) + files_search_spool(dovecot_t) ++files_search_tmp(dovecot_t) + files_dontaudit_list_default(dovecot_t) + files_dontaudit_search_all_dirs(dovecot_t) + files_search_all_mountpoints(dovecot_t) +- +-fs_getattr_all_fs(dovecot_t) +-fs_getattr_all_dirs(dovecot_t) +-fs_search_auto_mountpoints(dovecot_t) +-fs_list_inotifyfs(dovecot_t) ++files_read_var_lib_files(dovecot_t) + + init_getattr_utmp(dovecot_t) + +@@ -171,45 +168,45 @@ auth_use_nsswitch(dovecot_t) + + miscfiles_read_generic_certs(dovecot_t) + +-userdom_dontaudit_use_unpriv_user_fds(dovecot_t) +-userdom_use_user_terminals(dovecot_t) ++logging_send_syslog_msg(dovecot_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(dovecot_t) +- fs_manage_nfs_files(dovecot_t) +- fs_manage_nfs_symlinks(dovecot_t) +-') ++userdom_home_manager(dovecot_t) ++userdom_dontaudit_use_unpriv_user_fds(dovecot_t) ++userdom_manage_user_home_content_dirs(dovecot_t) ++userdom_manage_user_home_content_files(dovecot_t) ++userdom_manage_user_home_content_symlinks(dovecot_t) ++userdom_manage_user_home_content_pipes(dovecot_t) ++userdom_manage_user_home_content_sockets(dovecot_t) ++userdom_filetrans_home_content(dovecot_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(dovecot_t) +- fs_manage_cifs_files(dovecot_t) +- fs_manage_cifs_symlinks(dovecot_t) ++optional_policy(` ++ mta_manage_home_rw(dovecot_t) ++ mta_mmap_home_rw(dovecot_t) ++ mta_manage_spool(dovecot_t) + ') + + optional_policy(` + kerberos_manage_host_rcache(dovecot_t) + kerberos_read_keytab(dovecot_t) +- kerberos_tmp_filetrans_host_rcache(dovecot_t, file, "imap_0") ++ kerberos_tmp_filetrans_host_rcache(dovecot_t, "imap_0") + kerberos_use(dovecot_t) + ') + + optional_policy(` +- mta_manage_spool(dovecot_t) +- mta_manage_mail_home_rw_content(dovecot_t) +- mta_home_filetrans_mail_home_rw(dovecot_t, dir, "Maildir") +- mta_home_filetrans_mail_home_rw(dovecot_t, dir, ".maildir") ++ gnome_manage_data(dovecot_t) + ') + + optional_policy(` +- postgresql_stream_connect(dovecot_t) ++ postfix_manage_private_sockets(dovecot_t) ++ postfix_search_spool(dovecot_t) + ') + + optional_policy(` +- postfix_manage_private_sockets(dovecot_t) +- postfix_search_spool(dovecot_t) ++ postgresql_stream_connect(dovecot_t) + ') + + optional_policy(` ++ # Handle sieve scripts + sendmail_domtrans(dovecot_t) + ') + +@@ -227,103 +224,155 @@ optional_policy(` + + ######################################## + # +-# Auth local policy ++# dovecot auth local policy + # + +-allow dovecot_auth_t self:capability { chown dac_override ipc_lock setgid setuid sys_nice }; ++allow dovecot_auth_t self:capability { chown dac_read_search dac_override ipc_lock setgid setuid sys_nice }; + allow dovecot_auth_t self:process { getsched setsched signal_perms getcap setcap }; +-allow dovecot_auth_t self:unix_stream_socket { accept connectto listen }; ++allow dovecot_auth_t self:unix_stream_socket create_stream_socket_perms; ++ ++allow dovecot_auth_t dovecot_t:unix_stream_socket { connectto rw_stream_socket_perms }; + + read_files_pattern(dovecot_auth_t, dovecot_passwd_t, dovecot_passwd_t) + ++read_files_pattern(dovecot_auth_t, dovecot_etc_t, dovecot_etc_t) ++read_lnk_files_pattern(dovecot_auth_t, dovecot_etc_t, dovecot_etc_t) ++ ++manage_files_pattern(dovecot_auth_t, dovecot_var_run_t, dovecot_var_run_t) ++ + manage_dirs_pattern(dovecot_auth_t, dovecot_auth_tmp_t, dovecot_auth_tmp_t) + manage_files_pattern(dovecot_auth_t, dovecot_auth_tmp_t, dovecot_auth_tmp_t) + files_tmp_filetrans(dovecot_auth_t, dovecot_auth_tmp_t, { file dir }) + + allow dovecot_auth_t dovecot_var_run_t:dir list_dir_perms; + manage_sock_files_pattern(dovecot_auth_t, dovecot_var_run_t, dovecot_var_run_t) ++manage_fifo_files_pattern(dovecot_auth_t, dovecot_var_run_t, dovecot_var_run_t) + +-allow dovecot_auth_t dovecot_t:unix_stream_socket { connectto rw_stream_socket_perms }; ++dovecot_stream_connect_auth(dovecot_auth_t) + +-files_search_pids(dovecot_auth_t) +-files_read_usr_files(dovecot_auth_t) +-files_read_var_lib_files(dovecot_auth_t) ++corecmd_exec_bin(dovecot_auth_t) ++ ++logging_send_audit_msgs(dovecot_auth_t) + + auth_domtrans_chk_passwd(dovecot_auth_t) + auth_use_nsswitch(dovecot_auth_t) + +-init_rw_utmp(dovecot_auth_t) ++logging_send_syslog_msg(dovecot_auth_t) + +-logging_send_audit_msgs(dovecot_auth_t) ++files_search_pids(dovecot_auth_t) ++files_read_usr_symlinks(dovecot_auth_t) ++files_read_var_lib_files(dovecot_auth_t) ++files_search_tmp(dovecot_auth_t) + +-seutil_dontaudit_search_config(dovecot_auth_t) ++fs_getattr_xattr_fs(dovecot_auth_t) ++ ++init_rw_utmp(dovecot_auth_t) ++init_stream_connect(dovecot_auth_t) + + sysnet_use_ldap(dovecot_auth_t) + ++systemd_login_read_pid_files(dovecot_auth_t) ++systemd_dbus_chat_logind(dovecot_auth_t) ++systemd_write_inherited_logind_sessions_pipes(dovecot_auth_t) ++ ++userdom_getattr_user_home_dirs(dovecot_auth_t) ++ + optional_policy(` ++ kerberos_use(dovecot_auth_t) ++ ++ # for gssapi (kerberos) + userdom_list_user_tmp(dovecot_auth_t) + userdom_read_user_tmp_files(dovecot_auth_t) + userdom_read_user_tmp_symlinks(dovecot_auth_t) + ') + + optional_policy(` ++ mysql_search_db(dovecot_auth_t) + mysql_stream_connect(dovecot_auth_t) + mysql_read_config(dovecot_auth_t) + mysql_tcp_connect(dovecot_auth_t) ++ mysql_rw_db_sockets(dovecot_auth_t) + ') + + optional_policy(` + nis_authenticate(dovecot_auth_t) + ') + ++optional_policy(` ++ dbus_system_bus_client(dovecot_auth_t) ++ optional_policy(` ++ oddjob_dbus_chat(dovecot_auth_t) ++ oddjob_domtrans_mkhomedir(dovecot_auth_t) ++ ') ++') ++ + optional_policy(` + postfix_manage_private_sockets(dovecot_auth_t) ++ postfix_rw_inherited_master_pipes(dovecot_deliver_t) + postfix_search_spool(dovecot_auth_t) + ') + + ######################################## + # +-# Deliver local policy ++# dovecot deliver local policy + # + ++allow dovecot_deliver_t dovecot_t:process signull; ++ ++allow dovecot_deliver_t dovecot_etc_t:dir list_dir_perms; ++read_files_pattern(dovecot_deliver_t, dovecot_etc_t, dovecot_etc_t) ++read_lnk_files_pattern(dovecot_deliver_t, dovecot_etc_t, dovecot_etc_t) ++ + allow dovecot_deliver_t dovecot_cert_t:dir search_dir_perms; + +-append_files_pattern(dovecot_deliver_t, dovecot_var_log_t, dovecot_var_log_t) ++manage_dirs_pattern(dovecot_deliver_t, dovecot_var_log_t, dovecot_var_log_t) ++manage_files_pattern(dovecot_deliver_t, dovecot_var_log_t, dovecot_var_log_t) ++logging_log_filetrans(dovecot_deliver_t, dovecot_var_log_t, { file dir }) + + manage_dirs_pattern(dovecot_deliver_t, dovecot_deliver_tmp_t, dovecot_deliver_tmp_t) + manage_files_pattern(dovecot_deliver_t, dovecot_deliver_tmp_t, dovecot_deliver_tmp_t) + files_tmp_filetrans(dovecot_deliver_t, dovecot_deliver_tmp_t, { file dir }) + + allow dovecot_deliver_t dovecot_var_run_t:dir list_dir_perms; +-allow dovecot_deliver_t dovecot_var_run_t:file read_file_perms; +-allow dovecot_deliver_t dovecot_var_run_t:sock_file read_sock_file_perms; +- +-stream_connect_pattern(dovecot_deliver_t, dovecot_var_run_t, dovecot_var_run_t, { dovecot_t dovecot_auth_t }) ++read_files_pattern(dovecot_deliver_t, dovecot_var_run_t, dovecot_var_run_t) ++read_sock_files_pattern(dovecot_deliver_t, dovecot_var_run_t, dovecot_var_run_t) ++dovecot_stream_connect(dovecot_deliver_t) + + can_exec(dovecot_deliver_t, dovecot_deliver_exec_t) + +-allow dovecot_deliver_t dovecot_t:process signull; ++auth_use_nsswitch(dovecot_deliver_t) + +-fs_getattr_all_fs(dovecot_deliver_t) ++logging_append_all_logs(dovecot_deliver_t) ++logging_send_syslog_msg(dovecot_deliver_t) + +-auth_use_nsswitch(dovecot_deliver_t) ++dovecot_stream_connect_auth(dovecot_deliver_t) + +-logging_search_logs(dovecot_deliver_t) ++files_search_tmp(dovecot_deliver_t) ++files_dontaudit_getattr_all_dirs(dovecot_deliver_t) ++files_search_all_mountpoints(dovecot_deliver_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(dovecot_deliver_t) +- fs_manage_nfs_files(dovecot_deliver_t) +- fs_manage_nfs_symlinks(dovecot_deliver_t) +-') ++fs_getattr_all_fs(dovecot_deliver_t) ++fs_dontaudit_getattr_all_fs(dovecot_deliver_t) ++fs_dontaudit_getattr_all_dirs(dovecot_deliver_t) ++fs_dontaudit_search_cgroup_dirs(dovecot_deliver_t) ++ ++userdom_manage_user_home_content_dirs(dovecot_deliver_t) ++userdom_manage_user_home_content_files(dovecot_deliver_t) ++userdom_manage_user_home_content_symlinks(dovecot_deliver_t) ++userdom_manage_user_home_content_pipes(dovecot_deliver_t) ++userdom_manage_user_home_content_sockets(dovecot_deliver_t) ++userdom_filetrans_home_content(dovecot_deliver_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(dovecot_deliver_t) +- fs_manage_cifs_files(dovecot_deliver_t) +- fs_manage_cifs_symlinks(dovecot_deliver_t) ++userdom_home_manager(dovecot_deliver_t) ++ ++optional_policy(` ++ gnome_manage_data(dovecot_deliver_t) + ') + + optional_policy(` + mta_mailserver_delivery(dovecot_deliver_t) ++ mta_mmap_home_rw(dovecot_deliver_t) ++ mta_manage_spool(dovecot_deliver_t) + mta_read_queue(dovecot_deliver_t) + ') + +@@ -332,5 +381,6 @@ optional_policy(` + ') + + optional_policy(` ++ # Handle sieve scripts + sendmail_domtrans(dovecot_deliver_t) + ') +diff --git a/dpkg.te b/dpkg.te +index 50af48c896..5ab49010f4 100644 +--- a/dpkg.te ++++ b/dpkg.te +@@ -49,7 +49,7 @@ files_tmpfs_file(dpkg_script_tmpfs_t) + # Local policy + # + +-allow dpkg_t self:capability { chown dac_override fowner fsetid setgid setuid kill sys_tty_config sys_nice sys_resource mknod linux_immutable }; ++allow dpkg_t self:capability { chown dac_read_search dac_override fowner fsetid setgid setuid kill sys_tty_config sys_nice sys_resource mknod linux_immutable }; + allow dpkg_t self:process { setpgid fork getsched setfscreate }; + allow dpkg_t self:fd use; + allow dpkg_t self:fifo_file rw_fifo_file_perms; +diff --git a/drbd.fc b/drbd.fc +index 671a3fb6f4..47b4958d08 100644 +--- a/drbd.fc ++++ b/drbd.fc +@@ -3,7 +3,7 @@ + /sbin/drbdadm -- gen_context(system_u:object_r:drbd_exec_t,s0) + /sbin/drbdsetup -- gen_context(system_u:object_r:drbd_exec_t,s0) + +-/usr/lib/ocf/resource.\d/linbit/drbd -- gen_context(system_u:object_r:drbd_exec_t,s0) ++/usr/lib/ocf/resource\.d/linbit/drbd -- gen_context(system_u:object_r:drbd_exec_t,s0) + + /usr/sbin/drbdadm -- gen_context(system_u:object_r:drbd_exec_t,s0) + /usr/sbin/drbdsetup -- gen_context(system_u:object_r:drbd_exec_t,s0) +@@ -11,3 +11,5 @@ + /var/lib/drbd(/.*)? gen_context(system_u:object_r:drbd_var_lib_t,s0) + + /var/lock/subsys/drbd -- gen_context(system_u:object_r:drbd_lock_t,s0) ++ ++/var/run/drbd(/.*)? gen_context(system_u:object_r:drbd_var_run_t,s0) +diff --git a/drbd.if b/drbd.if +index 9a21639361..26c59868b4 100644 +--- a/drbd.if ++++ b/drbd.if +@@ -2,12 +2,11 @@ + + ######################################## + ## +-## Execute a domain transition to +-## run drbd. ++## Execute a domain transition to run drbd. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +@@ -16,14 +15,91 @@ interface(`drbd_domtrans',` + type drbd_t, drbd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, drbd_exec_t, drbd_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an drbd environment. ++## Search drbd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`drbd_search_lib',` ++ gen_require(` ++ type drbd_var_lib_t; ++ ') ++ ++ allow $1 drbd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read drbd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`drbd_read_lib_files',` ++ gen_require(` ++ type drbd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, drbd_var_lib_t, drbd_var_lib_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## drbd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`drbd_manage_lib_files',` ++ gen_require(` ++ type drbd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, drbd_var_lib_t, drbd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage drbd lib dirs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`drbd_manage_lib_dirs',` ++ gen_require(` ++ type drbd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, drbd_var_lib_t, drbd_var_lib_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an drbd environment + ## + ## + ## +@@ -35,7 +111,6 @@ interface(`drbd_domtrans',` + ## Role allowed access. + ## + ## +-## + # + interface(`drbd_admin',` + gen_require(` +@@ -43,9 +118,13 @@ interface(`drbd_admin',` + type drbd_var_lib_t; + ') + +- allow $1 drbd_t:process { ptrace signal_perms }; ++ allow $1 drbd_t:process signal_perms; + ps_process_pattern($1, drbd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 drbd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, drbd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 drbd_initrc_exec_t system_r; +@@ -57,3 +136,4 @@ interface(`drbd_admin',` + files_search_var_lib($1) + admin_pattern($1, drbd_var_lib_t) + ') ++ +diff --git a/drbd.te b/drbd.te +index f2516cc073..af2c2ad81d 100644 +--- a/drbd.te ++++ b/drbd.te +@@ -18,38 +18,72 @@ files_type(drbd_var_lib_t) + type drbd_lock_t; + files_lock_file(drbd_lock_t) + ++type drbd_var_run_t; ++files_pid_file(drbd_var_run_t) ++ ++type drbd_tmp_t; ++files_tmp_file(drbd_tmp_t) ++ + ######################################## + # + # Local policy + # + +-allow drbd_t self:capability { kill net_admin }; ++allow drbd_t self:capability { dac_read_search dac_override kill net_admin sys_admin }; + dontaudit drbd_t self:capability sys_tty_config; + allow drbd_t self:fifo_file rw_fifo_file_perms; + allow drbd_t self:unix_stream_socket create_stream_socket_perms; + allow drbd_t self:netlink_socket create_socket_perms; +-allow drbd_t self:netlink_route_socket nlmsg_write; ++allow drbd_t self:netlink_route_socket rw_netlink_socket_perms; + + manage_dirs_pattern(drbd_t, drbd_var_lib_t, drbd_var_lib_t) + manage_files_pattern(drbd_t, drbd_var_lib_t, drbd_var_lib_t) + manage_lnk_files_pattern(drbd_t, drbd_var_lib_t, drbd_var_lib_t) + files_var_lib_filetrans(drbd_t, drbd_var_lib_t, dir) + ++manage_dirs_pattern(drbd_t, drbd_var_run_t, drbd_var_run_t) ++manage_files_pattern(drbd_t, drbd_var_run_t, drbd_var_run_t) ++manage_lnk_files_pattern(drbd_t, drbd_var_run_t, drbd_var_run_t) ++files_pid_filetrans(drbd_t, drbd_var_run_t, { file dir }) ++ + manage_files_pattern(drbd_t, drbd_lock_t, drbd_lock_t) + files_lock_filetrans(drbd_t, drbd_lock_t, file) + +-can_exec(drbd_t, drbd_exec_t) ++manage_dirs_pattern(drbd_t, drbd_tmp_t, drbd_tmp_t) ++manage_files_pattern(drbd_t, drbd_tmp_t, drbd_tmp_t) ++files_tmp_filetrans(drbd_t, drbd_tmp_t, {file dir}) + + kernel_read_system_state(drbd_t) ++kernel_load_module(drbd_t) ++ ++auth_use_nsswitch(drbd_t) ++ ++can_exec(drbd_t, drbd_exec_t) ++ ++corecmd_exec_bin(drbd_t) ++ ++corenet_tcp_connect_http_port(drbd_t) + + dev_read_rand(drbd_t) + dev_read_sysfs(drbd_t) + dev_read_urand(drbd_t) + +-files_read_etc_files(drbd_t) ++files_read_kernel_modules(drbd_t) + +-storage_raw_read_fixed_disk(drbd_t) ++logging_send_syslog_msg(drbd_t) ++ ++fs_getattr_xattr_fs(drbd_t) + +-miscfiles_read_localization(drbd_t) ++modutils_read_module_config(drbd_t) ++modutils_exec_insmod(drbd_t) ++ ++storage_raw_read_fixed_disk(drbd_t) ++storage_raw_write_fixed_disk(drbd_t) + + sysnet_dns_name_resolve(drbd_t) ++ ++optional_policy(` ++ rhcs_read_log_cluster(drbd_t) ++ rhcs_rw_cluster_tmpfs(drbd_t) ++ rhcs_manage_cluster_lib_files(drbd_t) ++') +diff --git a/dspam.fc b/dspam.fc +index 5eddac51c8..b5fcb77608 100644 +--- a/dspam.fc ++++ b/dspam.fc +@@ -2,11 +2,16 @@ + + /usr/bin/dspam -- gen_context(system_u:object_r:dspam_exec_t,s0) + +-/usr/share/dspam-web/dspam\.cgi -- gen_context(system_u:object_r:httpd_dspam_script_exec_t,s0) ++/usr/share/dspam-web/dspam\.cgi -- gen_context(system_u:object_r:dspam_script_exec_t,s0) + + /var/lib/dspam(/.*)? gen_context(system_u:object_r:dspam_var_lib_t,s0) +-/var/lib/dspam/data(/.*)? gen_context(system_u:object_r:httpd_dspam_rw_content_t,s0) + + /var/log/dspam(/.*)? gen_context(system_u:object_r:dspam_log_t,s0) + + /var/run/dspam(/.*)? gen_context(system_u:object_r:dspam_var_run_t,s0) ++ ++# web ++/var/www/dspam/.*\.cgi -- gen_context(system_u:object_r:dspam_script_exec_t,s0) ++/var/www/dspam(/.*?) gen_context(system_u:object_r:dspam_content_t,s0) ++ ++/var/lib/dspam/data(/.*)? gen_context(system_u:object_r:dspam_rw_content_t,s0) +diff --git a/dspam.if b/dspam.if +index 18f2452509..a446210f0d 100644 +--- a/dspam.if ++++ b/dspam.if +@@ -1,13 +1,15 @@ +-## Content-based spam filter designed for multi-user enterprise systems. ++ ++## policy for dspam ++ + + ######################################## + ## + ## Execute a domain transition to run dspam. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`dspam_domtrans',` +@@ -15,35 +17,211 @@ interface(`dspam_domtrans',` + type dspam_t, dspam_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, dspam_exec_t, dspam_t) + ') + +-####################################### ++ ++######################################## + ## +-## Connect to dspam using a unix +-## domain stream socket. ++## Execute dspam server in the dspam domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++# ++interface(`dspam_initrc_domtrans',` ++ gen_require(` ++ type dspam_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, dspam_initrc_exec_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read dspam's log files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`dspam_stream_connect',` ++interface(`dspam_read_log',` ++ gen_require(` ++ type dspam_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, dspam_log_t, dspam_log_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to append ++## dspam log files. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`dspam_append_log',` ++ gen_require(` ++ type dspam_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, dspam_log_t, dspam_log_t) ++') ++ ++######################################## ++## ++## Allow domain to manage dspam log files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`dspam_manage_log',` ++ gen_require(` ++ type dspam_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, dspam_log_t, dspam_log_t) ++ manage_files_pattern($1, dspam_log_t, dspam_log_t) ++ manage_lnk_files_pattern($1, dspam_log_t, dspam_log_t) ++') ++ ++######################################## ++## ++## Search dspam lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_search_lib',` ++ gen_require(` ++ type dspam_var_lib_t; ++ ') ++ ++ allow $1 dspam_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read dspam lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_read_lib_files',` ++ gen_require(` ++ type dspam_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, dspam_var_lib_t, dspam_var_lib_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## dspam lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_manage_lib_files',` ++ gen_require(` ++ type dspam_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, dspam_var_lib_t, dspam_var_lib_t) ++') ++ ++######################################## ++## ++## Manage dspam lib dirs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_manage_lib_dirs',` + gen_require(` +- type dspam_t, dspam_var_run_t, dspam_tmp_t; ++ type dspam_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, dspam_var_lib_t, dspam_var_lib_t) ++') ++ ++ ++######################################## ++## ++## Read dspam PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_read_pid_files',` ++ gen_require(` ++ type dspam_var_run_t; + ') + + files_search_pids($1) ++ allow $1 dspam_var_run_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Connect to DSPAM using a unix domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`dspam_stream_connect',` ++ gen_require(` ++ type dspam_t, dspam_var_run_t, dspam_tmp_t; ++ ') ++ ++ files_search_pids($1) + files_search_tmp($1) +- stream_connect_pattern($1, { dspam_tmp_t dspam_var_run_t }, { dspam_tmp_t dspam_var_run_t }, dspam_t) ++ stream_connect_pattern($1, dspam_var_run_t, dspam_var_run_t, dspam_t) ++ stream_connect_pattern($1, dspam_tmp_t, dspam_tmp_t, dspam_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an dspam environment. ++## All of the rules required to administrate ++## an dspam environment + ## + ## + ## +@@ -59,14 +237,20 @@ interface(`dspam_stream_connect',` + # + interface(`dspam_admin',` + gen_require(` +- type dspam_t, dspam_initrc_exec_t, dspam_log_t; +- type dspam_var_lib_t, dspam_var_run_t; ++ type dspam_t; ++ type dspam_initrc_exec_t; ++ type dspam_log_t; ++ type dspam_var_lib_t; ++ type dspam_var_run_t; + ') + +- allow $1 dspam_t:process { ptrace signal_perms }; ++ allow $1 dspam_t:process signal_perms; + ps_process_pattern($1, dspam_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 dspam_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, dspam_initrc_exec_t) ++ dspam_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 dspam_initrc_exec_t system_r; + allow $2 system_r; +@@ -79,4 +263,5 @@ interface(`dspam_admin',` + + files_search_pids($1) + admin_pattern($1, dspam_var_run_t) ++ + ') +diff --git a/dspam.te b/dspam.te +index ef6236335e..6b0dc19d12 100644 +--- a/dspam.te ++++ b/dspam.te +@@ -28,6 +28,9 @@ files_pid_file(dspam_var_run_t) + + allow dspam_t self:capability net_admin; + allow dspam_t self:process signal; ++ ++allow dspam_t self:tcp_socket { listen accept }; ++ + allow dspam_t self:fifo_file rw_fifo_file_perms; + allow dspam_t self:unix_stream_socket { accept listen }; + +@@ -57,6 +60,12 @@ corenet_sendrecv_spamd_server_packets(dspam_t) + corenet_tcp_bind_spamd_port(dspam_t) + corenet_tcp_connect_spamd_port(dspam_t) + corenet_tcp_sendrecv_spamd_port(dspam_t) ++corenet_tcp_bind_lmtp_port(dspam_t) ++corenet_tcp_connect_lmtp_port(dspam_t) ++ ++kernel_read_system_state(dspam_t) ++ ++corecmd_exec_shell(dspam_t) + + files_search_spool(dspam_t) + +@@ -64,14 +73,33 @@ auth_use_nsswitch(dspam_t) + + logging_send_syslog_msg(dspam_t) + +-miscfiles_read_localization(dspam_t) +- + optional_policy(` + apache_content_template(dspam) ++ apache_content_alias_template(dspam, dspam) ++ ++ allow dspam_t dspam_rw_content_t:file map; ++ read_files_pattern(dspam_script_t, dspam_var_lib_t, dspam_var_lib_t) ++ ++ auth_read_passwd(dspam_script_t) ++ ++ files_search_var_lib(dspam_script_t) ++ ++ domain_dontaudit_read_all_domains_state(dspam_script_t) ++ ++ term_dontaudit_search_ptys(dspam_script_t) ++ term_dontaudit_getattr_all_ttys(dspam_script_t) ++ term_dontaudit_getattr_all_ptys(dspam_script_t) + +- list_dirs_pattern(dspam_t, httpd_dspam_content_t, httpd_dspam_content_t) +- manage_dirs_pattern(dspam_t, httpd_dspam_rw_content_t, httpd_dspam_rw_content_t) +- manage_files_pattern(dspam_t, httpd_dspam_rw_content_t, httpd_dspam_rw_content_t) ++ init_read_utmp(dspam_script_t) ++ ++ logging_send_syslog_msg(dspam_script_t) ++ ++ mta_send_mail(dspam_script_t) ++ ++ optional_policy(` ++ mysql_tcp_connect(dspam_script_t) ++ mysql_stream_connect(dspam_script_t) ++ ') + ') + + optional_policy(` +@@ -87,3 +115,12 @@ optional_policy(` + + postgresql_tcp_connect(dspam_t) + ') ++ ++optional_policy(` ++ postfix_rw_inherited_master_pipes(dspam_t) ++ postfix_list_spool(dspam_t) ++') ++ ++optional_policy(` ++ procmail_domtrans(dspam_t) ++') +diff --git a/entropyd.te b/entropyd.te +index b8b8328c07..e3dc7c72c8 100644 +--- a/entropyd.te ++++ b/entropyd.te +@@ -12,7 +12,7 @@ policy_module(entropyd, 1.8.0) + ## the entropy feeds. + ##

      + ## +-gen_tunable(entropyd_use_audio, false) ++gen_tunable(entropyd_use_audio, true) + + type entropyd_t; + type entropyd_exec_t; +@@ -29,7 +29,7 @@ files_pid_file(entropyd_var_run_t) + # Local policy + # + +-allow entropyd_t self:capability { dac_override ipc_lock sys_admin }; ++allow entropyd_t self:capability { dac_read_search dac_override ipc_lock sys_admin }; + dontaudit entropyd_t self:capability sys_tty_config; + allow entropyd_t self:process signal_perms; + +@@ -45,9 +45,6 @@ dev_write_urand(entropyd_t) + dev_read_rand(entropyd_t) + dev_write_rand(entropyd_t) + +-files_read_etc_files(entropyd_t) +-files_read_usr_files(entropyd_t) +- + fs_getattr_all_fs(entropyd_t) + fs_search_auto_mountpoints(entropyd_t) + +@@ -55,7 +52,7 @@ domain_use_interactive_fds(entropyd_t) + + logging_send_syslog_msg(entropyd_t) + +-miscfiles_read_localization(entropyd_t) ++auth_use_nsswitch(entropyd_t) + + userdom_dontaudit_use_unpriv_user_fds(entropyd_t) + userdom_dontaudit_search_user_home_dirs(entropyd_t) +diff --git a/etcd.fc b/etcd.fc +new file mode 100644 +index 0000000000..eac30a338e +--- /dev/null ++++ b/etcd.fc +@@ -0,0 +1,5 @@ ++/usr/lib/systemd/system/etcd.* -- gen_context(system_u:object_r:etcd_unit_file_t,s0) ++ ++/usr/bin/etcd -- gen_context(system_u:object_r:etcd_exec_t,s0) ++ ++/var/lib/etcd(/.*)? gen_context(system_u:object_r:etcd_var_lib_t,s0) +diff --git a/etcd.if b/etcd.if +new file mode 100644 +index 0000000000..d1a05a6507 +--- /dev/null ++++ b/etcd.if +@@ -0,0 +1,161 @@ ++## A highly-available key value store for shared configuration. ++ ++######################################## ++## ++## Execute etcd in the etcd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`etcd_domtrans',` ++ gen_require(` ++ type etcd_t, etcd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, etcd_exec_t, etcd_t) ++') ++ ++######################################## ++## ++## Search etcd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`etcd_search_lib',` ++ gen_require(` ++ type etcd_var_lib_t; ++ ') ++ ++ allow $1 etcd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read etcd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`etcd_read_lib_files',` ++ gen_require(` ++ type etcd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, etcd_var_lib_t, etcd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage etcd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`etcd_manage_lib_files',` ++ gen_require(` ++ type etcd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, etcd_var_lib_t, etcd_var_lib_t) ++') ++ ++######################################## ++## ++## Manage etcd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`etcd_manage_lib_dirs',` ++ gen_require(` ++ type etcd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, etcd_var_lib_t, etcd_var_lib_t) ++') ++ ++######################################## ++## ++## Execute etcd server in the etcd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`etcd_systemctl',` ++ gen_require(` ++ type etcd_t; ++ type etcd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 etcd_unit_file_t:file read_file_perms; ++ allow $1 etcd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, etcd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an etcd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`etcd_admin',` ++ gen_require(` ++ type etcd_t; ++ type etcd_var_lib_t; ++ type etcd_unit_file_t; ++ ') ++ ++ allow $1 etcd_t:process { signal_perms }; ++ ps_process_pattern($1, etcd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 etcd_t:process ptrace; ++ ') ++ ++ files_search_var_lib($1) ++ admin_pattern($1, etcd_var_lib_t) ++ ++ etcd_systemctl($1) ++ admin_pattern($1, etcd_unit_file_t) ++ allow $1 etcd_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/etcd.te b/etcd.te +new file mode 100644 +index 0000000000..7cee445f6a +--- /dev/null ++++ b/etcd.te +@@ -0,0 +1,42 @@ ++policy_module(etcd,1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type etcd_t; ++type etcd_exec_t; ++init_daemon_domain(etcd_t,etcd_exec_t) ++ ++permissive etcd_t; ++ ++type etcd_unit_file_t; ++systemd_unit_file(etcd_unit_file_t) ++ ++type etcd_var_lib_t; ++files_type(etcd_var_lib_t) ++ ++######################################## ++# ++# ectd local policy ++# ++ ++allow etcd_t self:tcp_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(etcd_t, etcd_var_lib_t, etcd_var_lib_t) ++manage_files_pattern(etcd_t, etcd_var_lib_t, etcd_var_lib_t) ++manage_lnk_files_pattern(etcd_t, etcd_var_lib_t, etcd_var_lib_t) ++files_var_lib_filetrans(etcd_t, etcd_var_lib_t, dir) ++ ++kernel_read_unix_sysctls(etcd_t) ++kernel_read_net_sysctls(etcd_t) ++ ++corenet_tcp_bind_generic_node(etcd_t) ++ ++corenet_tcp_bind_kubernetes_port(etcd_t) ++corenet_tcp_bind_afs3_callback_port(etcd_t) ++ ++fs_getattr_xattr_fs(etcd_t) ++ ++logging_send_syslog_msg(etcd_t) +diff --git a/evolution.fc b/evolution.fc +index 597f305dae..85206539cc 100644 +--- a/evolution.fc ++++ b/evolution.fc +@@ -1,5 +1,6 @@ + HOME_DIR/\.camel_certs(/.*)? gen_context(system_u:object_r:evolution_home_t,s0) + HOME_DIR/\.evolution(/.*)? gen_context(system_u:object_r:evolution_home_t,s0) ++HOME_DIR/\.cache/evolution(/.*)? gen_context(system_u:object_r:evolution_home_t,s0) + + /tmp/\.exchange-USER(/.*)? gen_context(system_u:object_r:evolution_exchange_tmp_t,s0) + +diff --git a/evolution.te b/evolution.te +index c99e07c483..ab9dd9f90f 100644 +--- a/evolution.te ++++ b/evolution.te +@@ -168,7 +168,6 @@ dev_read_urand(evolution_t) + + domain_dontaudit_read_all_domains_state(evolution_t) + +-files_read_usr_files(evolution_t) + + fs_search_auto_mountpoints(evolution_t) + +@@ -187,7 +186,7 @@ userdom_manage_user_tmp_files(evolution_t) + + userdom_manage_user_home_content_dirs(evolution_t) + userdom_manage_user_home_content_files(evolution_t) +-userdom_user_home_dir_filetrans_user_home_content(evolution_t, { dir file }) ++userdom_filetrans_home_content(evolution_t) + + userdom_write_user_tmp_sockets(evolution_t) + +@@ -286,7 +285,6 @@ stream_connect_pattern(evolution_alarm_t, evolution_server_orbit_tmp_t, evolutio + + dev_read_urand(evolution_alarm_t) + +-files_read_usr_files(evolution_alarm_t) + + fs_search_auto_mountpoints(evolution_alarm_t) + +@@ -354,7 +352,6 @@ corecmd_exec_bin(evolution_exchange_t) + + dev_read_urand(evolution_exchange_t) + +-files_read_usr_files(evolution_exchange_t) + + fs_search_auto_mountpoints(evolution_exchange_t) + +@@ -423,7 +420,6 @@ corenet_tcp_connect_http_port(evolution_server_t) + + dev_read_urand(evolution_server_t) + +-files_read_usr_files(evolution_server_t) + + fs_search_auto_mountpoints(evolution_server_t) + +diff --git a/exim.if b/exim.if +index 9bbc6907a9..4a8d0536b4 100644 +--- a/exim.if ++++ b/exim.if +@@ -21,35 +21,51 @@ interface(`exim_domtrans',` + + ######################################## + ## +-## Execute exim in the exim domain, +-## and allow the specified role +-## the exim domain. ++## Execute the mailman program in the mailman domain. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed to transition. ++## + ## + ## +-## +-## Role allowed access. +-## ++## ++## The role to allow the mailman domain. ++## + ## + ## + # + interface(`exim_run',` ++ gen_require(` ++ type exim_t; ++ ') ++ ++ exim_domtrans($1) ++ role $2 types exim_t; ++') ++ ++######################################## ++## ++## Execute exim in the exim domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`exim_initrc_domtrans',` + gen_require(` +- attribute_role exim_roles; ++ type exim_initrc_exec_t; + ') + +- exim_domtrans($1) +- roleattribute $2 exim_roles; ++ init_labeled_script_domtrans($1, exim_initrc_exec_t) + ') + + ######################################## + ## +-## Do not audit attempts to read exim +-## temporary tmp files. ++## Do not audit attempts to read, ++## exim tmp files + ## + ## + ## +@@ -67,7 +83,7 @@ interface(`exim_dontaudit_read_tmp_files',` + + ######################################## + ## +-## Read exim temporary files. ++## Allow domain to read, exim tmp files + ## + ## + ## +@@ -86,7 +102,7 @@ interface(`exim_read_tmp_files',` + + ######################################## + ## +-## Read exim pid files. ++## Read exim PID files. + ## + ## + ## +@@ -105,7 +121,7 @@ interface(`exim_read_pid_files',` + + ######################################## + ## +-## Read exim log files. ++## Allow the specified domain to read exim's log files. + ## + ## + ## +@@ -125,7 +141,8 @@ interface(`exim_read_log',` + + ######################################## + ## +-## Append exim log files. ++## Allow the specified domain to append ++## exim log files. + ## + ## + ## +@@ -144,8 +161,7 @@ interface(`exim_append_log',` + + ######################################## + ## +-## Create, read, write, and delete +-## exim log files. ++## Allow the specified domain to manage exim's log files. + ## + ## + ## +@@ -166,7 +182,7 @@ interface(`exim_manage_log',` + ######################################## + ## + ## Create, read, write, and delete +-## exim spool directories. ++## exim spool dirs. + ## + ## + ## +@@ -276,7 +292,6 @@ interface(`exim_manage_var_lib_files',` + ## Role allowed access. + ## + ## +-## + # + interface(`exim_admin',` + gen_require(` +@@ -285,10 +300,14 @@ interface(`exim_admin',` + type exim_keytab_t; + ') + +- allow $1 exim_t:process { ptrace signal_perms }; ++ allow $1 exim_t:process signal_perms; + ps_process_pattern($1, exim_t) + +- init_labeled_script_domtrans($1, exim_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 exim_t:process ptrace; ++ ') ++ ++ exim_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 exim_initrc_exec_t system_r; + allow $2 system_r; +diff --git a/exim.te b/exim.te +index 4086c51b90..3e7a99099c 100644 +--- a/exim.te ++++ b/exim.te +@@ -55,7 +55,7 @@ type exim_log_t; + logging_log_file(exim_log_t) + + type exim_spool_t; +-files_type(exim_spool_t) ++files_spool_file(exim_spool_t) + + type exim_tmp_t; + files_tmp_file(exim_tmp_t) +@@ -105,11 +105,10 @@ can_exec(exim_t, exim_exec_t) + kernel_read_crypto_sysctls(exim_t) + kernel_read_kernel_sysctls(exim_t) + kernel_read_network_state(exim_t) +-kernel_dontaudit_read_system_state(exim_t) ++kernel_read_system_state(exim_t) + + corecmd_search_bin(exim_t) + +-corenet_all_recvfrom_unlabeled(exim_t) + corenet_all_recvfrom_netlabel(exim_t) + corenet_tcp_sendrecv_generic_if(exim_t) + corenet_udp_sendrecv_generic_if(exim_t) +@@ -151,10 +150,10 @@ fs_getattr_xattr_fs(exim_t) + fs_list_inotifyfs(exim_t) + + auth_use_nsswitch(exim_t) ++auth_domtrans_chk_passwd(exim_t) + + logging_send_syslog_msg(exim_t) + +-miscfiles_read_localization(exim_t) + miscfiles_read_generic_certs(exim_t) + + userdom_dontaudit_search_user_home_dirs(exim_t) +@@ -170,9 +169,9 @@ tunable_policy(`exim_can_connect_db',` + corenet_sendrecv_mssql_client_packets(exim_t) + corenet_tcp_connect_mssql_port(exim_t) + corenet_tcp_sendrecv_mssql_port(exim_t) +- corenet_sendrecv_oracledb_client_packets(exim_t) +- corenet_tcp_connect_oracledb_port(exim_t) +- corenet_tcp_sendrecv_oracledb_port(exim_t) ++ corenet_sendrecv_oracle_client_packets(exim_t) ++ corenet_tcp_connect_oracle_port(exim_t) ++ corenet_tcp_sendrecv_oracle_port(exim_t) + ') + + tunable_policy(`exim_read_user_files',` +@@ -186,8 +185,8 @@ tunable_policy(`exim_manage_user_files',` + ') + + optional_policy(` +- clamav_domtrans_clamscan(exim_t) +- clamav_stream_connect(exim_t) ++ antivirus_domtrans(exim_t) ++ antivirus_stream_connect(exim_t) + ') + + optional_policy(` +@@ -209,11 +208,6 @@ optional_policy(` + kerberos_use(exim_t) + ') + +-optional_policy(` +- mailman_read_data_files(exim_t) +- mailman_domtrans(exim_t) +-') +- + optional_policy(` + nagios_search_spool(exim_t) + ') +@@ -236,6 +230,7 @@ optional_policy(` + + optional_policy(` + procmail_domtrans(exim_t) ++ procmail_read_home_files(exim_t) + ') + + optional_policy(` +diff --git a/fail2ban.if b/fail2ban.if +index 50d0084d42..94e1936060 100644 +--- a/fail2ban.if ++++ b/fail2ban.if +@@ -19,57 +19,57 @@ interface(`fail2ban_domtrans',` + domtrans_pattern($1, fail2ban_exec_t, fail2ban_t) + ') + +-######################################## ++####################################### + ## +-## Execute the fail2ban client in +-## the fail2ban client domain. ++## Execute the fail2ban client in ++## the fail2ban client domain. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed to transition. ++## + ## + # + interface(`fail2ban_domtrans_client',` +- gen_require(` +- type fail2ban_client_t, fail2ban_client_exec_t; +- ') ++ gen_require(` ++ type fail2ban_client_t, fail2ban_client_exec_t; ++ ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, fail2ban_client_exec_t, fail2ban_client_t) ++ corecmd_search_bin($1) ++ domtrans_pattern($1, fail2ban_client_exec_t, fail2ban_client_t) + ') + +-######################################## ++####################################### + ## +-## Execute fail2ban client in the +-## fail2ban client domain, and allow +-## the specified role the fail2ban +-## client domain. ++## Execute fail2ban client in the ++## fail2ban client domain, and allow ++## the specified role the fail2ban ++## client domain. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed to transition. ++## + ## + ## +-## +-## Role allowed access. +-## ++## ++## Role allowed access. ++## + ## + # + interface(`fail2ban_run_client',` +- gen_require(` +- attribute_role fail2ban_client_roles; +- ') ++ gen_require(` ++ attribute_role fail2ban_client_roles; ++ ') + +- fail2ban_domtrans_client($1) +- roleattribute $2 fail2ban_client_roles; ++ fail2ban_domtrans_client($1) ++ roleattribute $2 fail2ban_client_roles; + ') + + ##################################### + ## +-## Connect to fail2ban over a +-## unix domain stream socket. ++## Connect to fail2ban over a unix domain ++## stream socket. + ## + ## + ## +@@ -102,64 +102,63 @@ interface(`fail2ban_rw_inherited_tmp_files',` + ') + + files_search_tmp($1) +- allow $1 fail2ban_tmp_t:file { read write }; ++ allow $1 fail2ban_tmp_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to use +-## fail2ban file descriptors. ++## Read and write to an fail2ba unix stream socket. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`fail2ban_dontaudit_use_fds',` ++interface(`fail2ban_rw_stream_sockets',` + gen_require(` + type fail2ban_t; + ') + +- dontaudit $1 fail2ban_t:fd use; ++ allow $1 fail2ban_t:unix_stream_socket rw_stream_socket_perms; + ') + +-######################################## ++####################################### + ## +-## Do not audit attempts to read and +-## write fail2ban unix stream sockets ++## Do not audit attempts to use ++## fail2ban file descriptors. + ## + ## +-## +-## Domain to not audit. +-## ++## ++## Domain to not audit. ++## + ## + # +-interface(`fail2ban_dontaudit_rw_stream_sockets',` +- gen_require(` +- type fail2ban_t; +- ') ++interface(`fail2ban_dontaudit_use_fds',` ++ gen_require(` ++ type fail2ban_t; ++ ') + +- dontaudit $1 fail2ban_t:unix_stream_socket { read write }; ++ dontaudit $1 fail2ban_t:fd use; + ') + +-######################################## ++####################################### + ## +-## Read and write fail2ban unix +-## stream sockets. ++## Do not audit attempts to read and ++## write fail2ban unix stream sockets + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain to not audit. ++## + ## + # +-interface(`fail2ban_rw_stream_sockets',` +- gen_require(` +- type fail2ban_t; +- ') ++interface(`fail2ban_dontaudit_rw_stream_sockets',` ++ gen_require(` ++ type fail2ban_t; ++ ') + +- allow $1 fail2ban_t:unix_stream_socket rw_stream_socket_perms; ++ dontaudit $1 fail2ban_t:unix_stream_socket { read write }; + ') + + ######################################## +@@ -178,12 +177,12 @@ interface(`fail2ban_read_lib_files',` + ') + + files_search_var_lib($1) +- allow $1 fail2ban_var_lib_t:file read_file_perms; ++ read_files_pattern($1, fail2ban_var_lib_t, fail2ban_var_lib_t) + ') + + ######################################## + ## +-## Read fail2ban log files. ++## Allow the specified domain to read fail2ban's log files. + ## + ## + ## +@@ -198,12 +197,14 @@ interface(`fail2ban_read_log',` + ') + + logging_search_logs($1) ++ allow $1 fail2ban_log_t:dir list_dir_perms; + allow $1 fail2ban_log_t:file read_file_perms; + ') + + ######################################## + ## +-## Append fail2ban log files. ++## Allow the specified domain to append ++## fail2ban log files. + ## + ## + ## +@@ -217,12 +218,13 @@ interface(`fail2ban_append_log',` + ') + + logging_search_logs($1) ++ allow $1 fail2ban_log_t:dir list_dir_perms; + allow $1 fail2ban_log_t:file append_file_perms; + ') + + ######################################## + ## +-## Read fail2ban pid files. ++## Read fail2ban PID files. + ## + ## + ## +@@ -241,8 +243,28 @@ interface(`fail2ban_read_pid_files',` + + ######################################## + ## +-## All of the rules required to +-## administrate an fail2ban environment. ++## dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`fail2ban_dontaudit_leaks',` ++ gen_require(` ++ type fail2ban_t; ++ ') ++ ++ dontaudit $1 fail2ban_t:tcp_socket { read write }; ++ dontaudit $1 fail2ban_t:unix_dgram_socket { read write }; ++ dontaudit $1 fail2ban_t:unix_stream_socket { read write }; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an fail2ban environment + ## + ## + ## +@@ -251,21 +273,25 @@ interface(`fail2ban_read_pid_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the fail2ban domain. + ## + ## + ## + # + interface(`fail2ban_admin',` + gen_require(` +- type fail2ban_t, fail2ban_log_t, fail2ban_tmp_t; +- type fail2ban_var_run_t, fail2ban_initrc_exec_t; +- type fail2ban_var_lib_t, fail2ban_client_t; ++ type fail2ban_t, fail2ban_log_t, fail2ban_initrc_exec_t; ++ type fail2ban_var_run_t, fail2ban_var_lib_t, fail2ban_tmp_t; ++ type fail2ban_client_t; + ') + +- allow $1 { fail2ban_t fail2ban_client_t }:process { ptrace signal_perms }; ++ allow $1 { fail2ban_t fail2ban_client_t }:process signal_perms; + ps_process_pattern($1, { fail2ban_t fail2ban_client_t }) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 { fail2ban_t fail2ban_client_t }:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, fail2ban_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 fail2ban_initrc_exec_t system_r; +@@ -277,10 +303,10 @@ interface(`fail2ban_admin',` + files_list_pids($1) + admin_pattern($1, fail2ban_var_run_t) + +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, fail2ban_var_lib_t) + +- files_search_tmp($1) ++ files_list_tmp($1) + admin_pattern($1, fail2ban_tmp_t) + + fail2ban_run_client($1, $2) +diff --git a/fail2ban.te b/fail2ban.te +index cf0e567725..62fb6587ae 100644 +--- a/fail2ban.te ++++ b/fail2ban.te +@@ -37,7 +37,7 @@ role fail2ban_client_roles types fail2ban_client_t; + # + + allow fail2ban_t self:capability { dac_read_search dac_override sys_tty_config }; +-allow fail2ban_t self:process signal; ++allow fail2ban_t self:process { setsched signal }; + allow fail2ban_t self:fifo_file rw_fifo_file_perms; + allow fail2ban_t self:unix_stream_socket { accept connectto listen }; + allow fail2ban_t self:tcp_socket { accept listen }; +@@ -67,7 +67,6 @@ kernel_read_system_state(fail2ban_t) + corecmd_exec_bin(fail2ban_t) + corecmd_exec_shell(fail2ban_t) + +-corenet_all_recvfrom_unlabeled(fail2ban_t) + corenet_all_recvfrom_netlabel(fail2ban_t) + corenet_tcp_sendrecv_generic_if(fail2ban_t) + corenet_tcp_sendrecv_generic_node(fail2ban_t) +@@ -82,7 +81,6 @@ domain_use_interactive_fds(fail2ban_t) + domain_dontaudit_read_all_domains_state(fail2ban_t) + + files_read_etc_runtime_files(fail2ban_t) +-files_read_usr_files(fail2ban_t) + files_list_var(fail2ban_t) + files_dontaudit_list_tmp(fail2ban_t) + +@@ -92,23 +90,37 @@ fs_getattr_all_fs(fail2ban_t) + auth_use_nsswitch(fail2ban_t) + + logging_read_all_logs(fail2ban_t) ++logging_read_audit_log(fail2ban_t) + logging_send_syslog_msg(fail2ban_t) ++logging_read_syslog_pid(fail2ban_t) ++logging_dontaudit_search_audit_logs(fail2ban_t) ++logging_mmap_generic_logs(fail2ban_t) + +-miscfiles_read_localization(fail2ban_t) ++mta_send_mail(fail2ban_t) + + sysnet_manage_config(fail2ban_t) +-sysnet_etc_filetrans_config(fail2ban_t) +- +-mta_send_mail(fail2ban_t) + + optional_policy(` + apache_read_log(fail2ban_t) + ') + ++optional_policy(` ++ dbus_system_bus_client(fail2ban_t) ++ dbus_connect_system_bus(fail2ban_t) ++ ++ optional_policy(` ++ firewalld_dbus_chat(fail2ban_t) ++ ') ++') ++ + optional_policy(` + ftp_read_log(fail2ban_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(fail2ban_t) ++') ++ + optional_policy(` + iptables_domtrans(fail2ban_t) + ') +@@ -117,6 +129,10 @@ optional_policy(` + libs_exec_ldconfig(fail2ban_t) + ') + ++optional_policy(` ++ rpm_exec(fail2ban_t) ++') ++ + optional_policy(` + shorewall_domtrans(fail2ban_t) + ') +@@ -126,27 +142,37 @@ optional_policy(` + # Client Local policy + # + +-allow fail2ban_client_t self:capability dac_read_search; ++allow fail2ban_client_t self:capability { dac_read_search dac_override }; + allow fail2ban_client_t self:unix_stream_socket { create connect write read }; + + domtrans_pattern(fail2ban_client_t, fail2ban_exec_t, fail2ban_t) + ++allow fail2ban_client_t fail2ban_t:process { rlimitinh }; ++ ++dontaudit fail2ban_client_t fail2ban_var_run_t:dir_file_class_set audit_access; ++allow fail2ban_client_t fail2ban_var_run_t:dir write; + stream_connect_pattern(fail2ban_client_t, fail2ban_var_run_t, fail2ban_var_run_t, fail2ban_t) + + kernel_read_system_state(fail2ban_client_t) + + corecmd_exec_bin(fail2ban_client_t) + ++dev_read_urand(fail2ban_client_t) ++dev_read_rand(fail2ban_client_t) ++ + domain_use_interactive_fds(fail2ban_client_t) + +-files_read_etc_files(fail2ban_client_t) +-files_read_usr_files(fail2ban_client_t) + files_search_pids(fail2ban_client_t) + ++auth_use_nsswitch(fail2ban_client_t) ++ + logging_getattr_all_logs(fail2ban_client_t) + logging_search_all_logs(fail2ban_client_t) +- +-miscfiles_read_localization(fail2ban_client_t) ++logging_read_audit_log(fail2ban_client_t) + + userdom_dontaudit_search_user_home_dirs(fail2ban_client_t) + userdom_use_user_terminals(fail2ban_client_t) ++ ++optional_policy(` ++ apache_read_log(fail2ban_client_t) ++') +diff --git a/fcoe.te b/fcoe.te +index ce358fb3f6..cdc11a7f9b 100644 +--- a/fcoe.te ++++ b/fcoe.te +@@ -20,25 +20,32 @@ files_pid_file(fcoemon_var_run_t) + # Local policy + # + +-allow fcoemon_t self:capability { dac_override kill net_admin }; ++allow fcoemon_t self:capability { net_admin net_raw dac_read_search dac_override }; + allow fcoemon_t self:fifo_file rw_fifo_file_perms; + allow fcoemon_t self:unix_stream_socket { accept listen }; + allow fcoemon_t self:netlink_socket create_socket_perms; + allow fcoemon_t self:netlink_route_socket create_netlink_socket_perms; ++allow fcoemon_t self:netlink_scsitransport_socket create_socket_perms; ++allow fcoemon_t self:packet_socket create_socket_perms; ++allow fcoemon_t self:udp_socket create_socket_perms; + + manage_dirs_pattern(fcoemon_t, fcoemon_var_run_t, fcoemon_var_run_t) + manage_files_pattern(fcoemon_t, fcoemon_var_run_t, fcoemon_var_run_t) + manage_sock_files_pattern(fcoemon_t, fcoemon_var_run_t, fcoemon_var_run_t) + files_pid_filetrans(fcoemon_t, fcoemon_var_run_t, { dir file }) + +-files_read_etc_files(fcoemon_t) +- +-dev_read_sysfs(fcoemon_t) ++dev_rw_sysfs(fcoemon_t) + + logging_send_syslog_msg(fcoemon_t) + + miscfiles_read_localization(fcoemon_t) + ++userdom_dgram_send(fcoemon_t) ++ + optional_policy(` + lldpad_dgram_send(fcoemon_t) + ') ++ ++optional_policy(` ++ networkmanager_dgram_send(fcoemon_t) ++') +diff --git a/fetchmail.fc b/fetchmail.fc +index 133b8ee67d..a47a12fe77 100644 +--- a/fetchmail.fc ++++ b/fetchmail.fc +@@ -1,4 +1,5 @@ + HOME_DIR/\.fetchmailrc -- gen_context(system_u:object_r:fetchmail_home_t,s0) ++/root/\.fetchmailrc -- gen_context(system_u:object_r:fetchmail_home_t, s0) + + /etc/fetchmailrc -- gen_context(system_u:object_r:fetchmail_etc_t,s0) + +diff --git a/fetchmail.if b/fetchmail.if +index c3f7916602..cab3954f3d 100644 +--- a/fetchmail.if ++++ b/fetchmail.if +@@ -23,14 +23,16 @@ interface(`fetchmail_admin',` + type fetchmail_var_run_t, fetchmail_initrc_exec_t, fetchmail_log_t; + ') + ++ ps_process_pattern($1, fetchmail_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 fetchmail_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, fetchmail_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 fetchmail_initrc_exec_t system_r; + allow $2 system_r; + +- allow $1 fetchmail_t:process { ptrace signal_perms }; +- ps_process_pattern($1, fetchmail_t) +- + files_list_etc($1) + admin_pattern($1, fetchmail_etc_t) + +diff --git a/fetchmail.te b/fetchmail.te +index 742559a54d..fa51d09dd0 100644 +--- a/fetchmail.te ++++ b/fetchmail.te +@@ -32,14 +32,18 @@ files_type(fetchmail_uidl_cache_t) + # + # Local policy + # +- ++allow fetchmail_t self:capability setuid; + dontaudit fetchmail_t self:capability sys_tty_config; + allow fetchmail_t self:process { signal_perms setrlimit }; + allow fetchmail_t self:unix_stream_socket { accept listen }; ++allow fetchmail_t self:key manage_key_perms; + + allow fetchmail_t fetchmail_etc_t:file read_file_perms; + ++list_dirs_pattern(fetchmail_t, fetchmail_home_t, fetchmail_home_t) + read_files_pattern(fetchmail_t, fetchmail_home_t, fetchmail_home_t) ++userdom_search_user_home_dirs(fetchmail_t) ++userdom_search_admin_dir(fetchmail_t) + + manage_dirs_pattern(fetchmail_t, fetchmail_log_t, fetchmail_log_t) + append_files_pattern(fetchmail_t, fetchmail_log_t, fetchmail_log_t) +@@ -63,7 +67,6 @@ kernel_dontaudit_read_system_state(fetchmail_t) + corecmd_exec_bin(fetchmail_t) + corecmd_exec_shell(fetchmail_t) + +-corenet_all_recvfrom_unlabeled(fetchmail_t) + corenet_all_recvfrom_netlabel(fetchmail_t) + corenet_tcp_sendrecv_generic_if(fetchmail_t) + corenet_tcp_sendrecv_generic_node(fetchmail_t) +@@ -84,15 +87,24 @@ fs_search_auto_mountpoints(fetchmail_t) + + domain_use_interactive_fds(fetchmail_t) + +-auth_use_nsswitch(fetchmail_t) ++auth_read_passwd(fetchmail_t) + + logging_send_syslog_msg(fetchmail_t) + +-miscfiles_read_localization(fetchmail_t) + miscfiles_read_generic_certs(fetchmail_t) + ++sysnet_dns_name_resolve(fetchmail_t) ++ + userdom_dontaudit_use_unpriv_user_fds(fetchmail_t) +-userdom_search_user_home_dirs(fetchmail_t) ++ ++optional_policy(` ++ mta_send_mail(fetchmail_t) ++ mta_read_spool(fetchmail_t) ++') ++ ++optional_policy(` ++ kerberos_use(fetchmail_t) ++') + + optional_policy(` + procmail_domtrans(fetchmail_t) +diff --git a/finger.te b/finger.te +index 35da09d97a..85f1e03d41 100644 +--- a/finger.te ++++ b/finger.te +@@ -45,7 +45,6 @@ logging_log_filetrans(fingerd_t, fingerd_log_t, file) + kernel_read_kernel_sysctls(fingerd_t) + kernel_read_system_state(fingerd_t) + +-corenet_all_recvfrom_unlabeled(fingerd_t) + corenet_all_recvfrom_netlabel(fingerd_t) + corenet_tcp_sendrecv_generic_if(fingerd_t) + corenet_tcp_sendrecv_generic_node(fingerd_t) +@@ -63,6 +62,7 @@ dev_read_sysfs(fingerd_t) + domain_use_interactive_fds(fingerd_t) + + files_read_etc_runtime_files(fingerd_t) ++files_search_home(fingerd_t) + + fs_getattr_all_fs(fingerd_t) + fs_search_auto_mountpoints(fingerd_t) +@@ -71,6 +71,7 @@ term_getattr_all_ttys(fingerd_t) + term_getattr_all_ptys(fingerd_t) + + auth_read_lastlog(fingerd_t) ++auth_use_nsswitch(fingerd_t) + + init_read_utmp(fingerd_t) + init_dontaudit_write_utmp(fingerd_t) +@@ -79,7 +80,7 @@ logging_send_syslog_msg(fingerd_t) + + mta_getattr_spool(fingerd_t) + +-miscfiles_read_localization(fingerd_t) ++sysnet_read_config(fingerd_t) + + userdom_dontaudit_use_unpriv_user_fds(fingerd_t) + +diff --git a/firewalld.fc b/firewalld.fc +index 21d7b84422..0e272bd0e3 100644 +--- a/firewalld.fc ++++ b/firewalld.fc +@@ -1,3 +1,5 @@ ++/usr/lib/systemd/system/firewalld.* -- gen_context(system_u:object_r:firewalld_unit_file_t,s0) ++ + /etc/rc\.d/init\.d/firewalld -- gen_context(system_u:object_r:firewalld_initrc_exec_t,s0) + + /etc/firewalld(/.*)? gen_context(system_u:object_r:firewalld_etc_rw_t,s0) +diff --git a/firewalld.if b/firewalld.if +index c62c5670a3..2d9e254b43 100644 +--- a/firewalld.if ++++ b/firewalld.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Read firewalld configuration files. ++## Read firewalld config + ## + ## + ## +@@ -10,7 +10,7 @@ + ## + ## + # +-interface(`firewalld_read_config_files',` ++interface(`firewalld_read_config',` + gen_require(` + type firewalld_etc_rw_t; + ') +@@ -19,6 +19,48 @@ interface(`firewalld_read_config_files',` + read_files_pattern($1, firewalld_etc_rw_t, firewalld_etc_rw_t) + ') + ++######################################## ++## ++## Execute firewalld server in the firewalld domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++# ++interface(`firewalld_initrc_domtrans',` ++ gen_require(` ++ type firewalld_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, firewalld_initrc_exec_t) ++') ++ ++######################################## ++## ++## Execute firewalld server in the firewalld domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`firewalld_systemctl',` ++ gen_require(` ++ type firewalld_t; ++ type firewalld_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 firewalld_unit_file_t:file read_file_perms; ++ allow $1 firewalld_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, firewalld_t) ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -42,8 +84,8 @@ interface(`firewalld_dbus_chat',` + + ######################################## + ## +-## Do not audit attempts to read, snd +-## write firewalld temporary files. ++## Dontaudit attempts to write ++## firewalld tmp files. + ## + ## + ## +@@ -51,18 +93,37 @@ interface(`firewalld_dbus_chat',` + ## + ## + # +-interface(`firewalld_dontaudit_rw_tmp_files',` ++interface(`firewalld_dontaudit_write_tmp_files',` + gen_require(` + type firewalld_tmp_t; + ') + +- dontaudit $1 firewalld_tmp_t:file { read write }; ++ dontaudit $1 firewalld_tmp_t:file write; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an firewalld environment. ++## Read firewalld PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`firewalld_read_pid_files',` ++ gen_require(` ++ type firewalld_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 firewalld_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an firewalld environment + ## + ## + ## +@@ -79,14 +140,18 @@ interface(`firewalld_dontaudit_rw_tmp_files',` + interface(`firewalld_admin',` + gen_require(` + type firewalld_t, firewalld_initrc_exec_t; +- type firewall_etc_rw_t, firewalld_var_run_t; ++ type firewalld_etc_rw_t, firewalld_var_run_t; + type firewalld_var_log_t; + ') + +- allow $1 firewalld_t:process { ptrace signal_perms }; ++ allow $1 firewalld_t:process signal_perms; + ps_process_pattern($1, firewalld_t) + +- init_labeled_script_domtrans($1, firewalld_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 firewalld_t:process ptrace; ++ ') ++ ++ firewalld_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 firewalld_initrc_exec_t system_r; + allow $2 system_r; +@@ -97,6 +162,9 @@ interface(`firewalld_admin',` + logging_search_logs($1) + admin_pattern($1, firewalld_var_log_t) + +- files_search_etc($1) +- admin_pattern($1, firewall_etc_rw_t) ++ admin_pattern($1, firewalld_etc_rw_t) ++ ++ admin_pattern($1, firewalld_unit_file_t) ++ firewalld_systemctl($1) ++ allow $1 firewalld_unit_file_t:service all_service_perms; + ') +diff --git a/firewalld.te b/firewalld.te +index 98072a3a13..5fd0906be6 100644 +--- a/firewalld.te ++++ b/firewalld.te +@@ -21,15 +21,21 @@ logging_log_file(firewalld_var_log_t) + type firewalld_tmp_t; + files_tmp_file(firewalld_tmp_t) + ++type firewalld_tmpfs_t; ++files_tmpfs_file(firewalld_tmpfs_t) ++ + type firewalld_var_run_t; + files_pid_file(firewalld_var_run_t) + ++type firewalld_unit_file_t; ++systemd_unit_file(firewalld_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow firewalld_t self:capability { dac_override net_admin }; ++allow firewalld_t self:capability { dac_read_search dac_override net_admin }; + dontaudit firewalld_t self:capability sys_tty_config; + allow firewalld_t self:fifo_file rw_fifo_file_perms; + allow firewalld_t self:unix_stream_socket { accept listen }; +@@ -37,6 +43,8 @@ allow firewalld_t self:udp_socket create_socket_perms; + + manage_dirs_pattern(firewalld_t, firewalld_etc_rw_t, firewalld_etc_rw_t) + manage_files_pattern(firewalld_t, firewalld_etc_rw_t, firewalld_etc_rw_t) ++relabel_files_pattern(firewalld_t, firewalld_etc_rw_t, firewalld_etc_rw_t) ++manage_lnk_files_pattern(firewalld_t, firewalld_etc_rw_t, firewalld_etc_rw_t) + + allow firewalld_t firewalld_var_log_t:file append_file_perms; + allow firewalld_t firewalld_var_log_t:file create_file_perms; +@@ -48,13 +56,21 @@ manage_files_pattern(firewalld_t, firewalld_tmp_t, firewalld_tmp_t) + files_tmp_filetrans(firewalld_t, firewalld_tmp_t, file) + allow firewalld_t firewalld_tmp_t:file mmap_file_perms; + ++manage_files_pattern(firewalld_t, firewalld_tmpfs_t, firewalld_tmpfs_t) ++fs_tmpfs_filetrans(firewalld_t, firewalld_tmpfs_t, file) ++allow firewalld_t firewalld_tmpfs_t:file mmap_file_perms; ++ + manage_files_pattern(firewalld_t, firewalld_var_run_t, firewalld_var_run_t) +-files_pid_filetrans(firewalld_t, firewalld_var_run_t, file) ++manage_dirs_pattern(firewalld_t, firewalld_var_run_t, firewalld_var_run_t) ++files_pid_filetrans(firewalld_t, firewalld_var_run_t, { file dir }) ++can_exec(firewalld_t, firewalld_var_run_t) + + kernel_read_network_state(firewalld_t) + kernel_read_system_state(firewalld_t) + kernel_rw_net_sysctls(firewalld_t) + ++files_list_kernel_modules(firewalld_t) ++ + corecmd_exec_bin(firewalld_t) + corecmd_exec_shell(firewalld_t) + +@@ -63,20 +79,24 @@ dev_search_sysfs(firewalld_t) + + domain_use_interactive_fds(firewalld_t) + +-files_read_etc_files(firewalld_t) +-files_read_usr_files(firewalld_t) ++files_dontaudit_access_check_tmp(firewalld_t) + files_dontaudit_list_tmp(firewalld_t) + + fs_getattr_xattr_fs(firewalld_t) ++fs_dontaudit_all_access_check(firewalld_t) + +-logging_send_syslog_msg(firewalld_t) ++auth_use_nsswitch(firewalld_t) + +-miscfiles_read_localization(firewalld_t) ++libs_exec_ldconfig(firewalld_t) + +-seutil_exec_setfiles(firewalld_t) +-seutil_read_file_contexts(firewalld_t) ++logging_send_syslog_msg(firewalld_t) ++ ++sysnet_dns_name_resolve(firewalld_t) ++sysnet_manage_config_dirs(firewalld_t) ++sysnet_manage_config(firewalld_t) + +-sysnet_read_config(firewalld_t) ++userdom_dontaudit_create_admin_dir(firewalld_t) ++userdom_dontaudit_manage_admin_dir(firewalld_t) + + optional_policy(` + dbus_system_domain(firewalld_t, firewalld_exec_t) +@@ -94,6 +114,10 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ gnome_read_generic_data_home_dirs(firewalld_t) ++') ++ + optional_policy(` + iptables_domtrans(firewalld_t) + ') +diff --git a/firewallgui.if b/firewallgui.if +index e6866d1fd0..941f4ef733 100644 +--- a/firewallgui.if ++++ b/firewallgui.if +@@ -37,5 +37,5 @@ interface(`firewallgui_dontaudit_rw_pipes',` + type firewallgui_t; + ') + +- dontaudit $1 firewallgui_t:fifo_file rw_fifo_file_perms; ++ dontaudit $1 firewallgui_t:fifo_file rw_inherited_fifo_file_perms; + ') +diff --git a/firewallgui.te b/firewallgui.te +index 2094546645..2481a97049 100644 +--- a/firewallgui.te ++++ b/firewallgui.te +@@ -36,8 +36,10 @@ corecmd_exec_shell(firewallgui_t) + dev_read_sysfs(firewallgui_t) + dev_read_urand(firewallgui_t) + ++files_manage_system_conf_files(firewallgui_t) ++files_etc_filetrans_system_conf(firewallgui_t) ++files_search_kernel_modules(firewallgui_t) + files_list_kernel_modules(firewallgui_t) +-files_read_usr_files(firewallgui_t) + + auth_use_nsswitch(firewallgui_t) + +@@ -60,12 +62,13 @@ optional_policy(` + ') + + optional_policy(` +- gnome_read_generic_gconf_home_content(firewallgui_t) ++ gnome_read_gconf_home_files(firewallgui_t) + ') + + optional_policy(` + iptables_domtrans(firewallgui_t) + iptables_initrc_domtrans(firewallgui_t) ++ iptables_systemctl(firewallgui_t) + ') + + optional_policy(` +diff --git a/firstboot.fc b/firstboot.fc +index 12c782c891..ba614e457b 100644 +--- a/firstboot.fc ++++ b/firstboot.fc +@@ -1,5 +1,3 @@ +-/etc/rc\.d/init\.d/firstboot.* -- gen_context(system_u:object_r:firstboot_initrc_exec_t,s0) ++/usr/sbin/firstboot -- gen_context(system_u:object_r:firstboot_exec_t,s0) + +-/usr/sbin/firstboot -- gen_context(system_u:object_r:firstboot_exec_t,s0) +- +-/usr/share/firstboot/firstboot\.py -- gen_context(system_u:object_r:firstboot_exec_t,s0) ++/usr/share/firstboot/firstboot\.py -- gen_context(system_u:object_r:firstboot_exec_t,s0) +diff --git a/firstboot.if b/firstboot.if +index 280f875f0b..f3a67c911b 100644 +--- a/firstboot.if ++++ b/firstboot.if +@@ -1,4 +1,7 @@ +-## Initial system configuration utility. ++## ++## Final system configuration run during the first boot ++## after installation of Red Hat/Fedora systems. ++## + + ######################################## + ## +@@ -15,15 +18,13 @@ interface(`firstboot_domtrans',` + type firstboot_t, firstboot_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, firstboot_exec_t, firstboot_t) + ') + + ######################################## + ## +-## Execute firstboot in the firstboot +-## domain, and allow the specified role +-## the firstboot domain. ++## Execute firstboot in the firstboot domain, and ++## allow the specified role the firstboot domain. + ## + ## + ## +@@ -38,16 +39,16 @@ interface(`firstboot_domtrans',` + # + interface(`firstboot_run',` + gen_require(` +- attribute_role firstboot_roles; ++ type firstboot_t; + ') + + firstboot_domtrans($1) +- roleattribute $2 firstboot_roles; ++ role $2 types firstboot_t; + ') + + ######################################## + ## +-## Inherit and use firstboot file descriptors. ++## Inherit and use a file descriptor from firstboot. + ## + ## + ## +@@ -65,8 +66,8 @@ interface(`firstboot_use_fds',` + + ######################################## + ## +-## Do not audit attempts to inherit +-## firstboot file descriptors. ++## Do not audit attempts to inherit a ++## file descriptor from firstboot. + ## + ## + ## +@@ -84,7 +85,26 @@ interface(`firstboot_dontaudit_use_fds',` + + ######################################## + ## +-## Write firstboot unnamed pipes. ++## dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`firstboot_dontaudit_leaks',` ++ gen_require(` ++ type firstboot_t; ++ ') ++ ++ dontaudit $1 firstboot_t:socket_class_set { read write }; ++ dontaudit $1 firstboot_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Write to a firstboot unnamed pipe. + ## + ## + ## +@@ -97,12 +117,13 @@ interface(`firstboot_write_pipes',` + type firstboot_t; + ') + ++ allow $1 firstboot_t:fd use; + allow $1 firstboot_t:fifo_file write; + ') + + ######################################## + ## +-## Read and Write firstboot unnamed pipes. ++## Read and Write to a firstboot unnamed pipe. + ## + ## + ## +@@ -120,8 +141,7 @@ interface(`firstboot_rw_pipes',` + + ######################################## + ## +-## Do not audit attemps to read and +-## write firstboot unnamed pipes. ++## Do not audit attemps to read and write to a firstboot unnamed pipe. + ## + ## + ## +@@ -139,9 +159,8 @@ interface(`firstboot_dontaudit_rw_pipes',` + + ######################################## + ## +-## Do not audit attemps to read and +-## write firstboot unix domain +-## stream sockets. ++## Do not audit attemps to read and write to a firstboot ++## unix domain stream socket. + ## + ## + ## +diff --git a/firstboot.te b/firstboot.te +index 5010f04e1b..0341ae121b 100644 +--- a/firstboot.te ++++ b/firstboot.te +@@ -1,7 +1,7 @@ + policy_module(firstboot, 1.13.0) + + gen_require(` +- class passwd { passwd chfn chsh rootok }; ++ class passwd { passwd chfn chsh rootok crontab }; + ') + + ######################################## +@@ -9,17 +9,12 @@ gen_require(` + # Declarations + # + +-attribute_role firstboot_roles; +- + type firstboot_t; + type firstboot_exec_t; + init_system_domain(firstboot_t, firstboot_exec_t) + domain_obj_id_change_exemption(firstboot_t) + domain_subj_id_change_exemption(firstboot_t) +-role firstboot_roles types firstboot_t; +- +-type firstboot_initrc_exec_t; +-init_script_file(firstboot_initrc_exec_t) ++role system_r types firstboot_t; + + type firstboot_etc_t; + files_config_file(firstboot_etc_t) +@@ -29,31 +24,28 @@ files_config_file(firstboot_etc_t) + # Local policy + # + +-allow firstboot_t self:capability { dac_override setgid }; ++allow firstboot_t self:capability { dac_read_search dac_override setgid }; + allow firstboot_t self:process setfscreate; + allow firstboot_t self:fifo_file rw_fifo_file_perms; +-allow firstboot_t self:tcp_socket { accept listen }; ++allow firstboot_t self:tcp_socket create_stream_socket_perms; ++allow firstboot_t self:unix_stream_socket { connect create }; + allow firstboot_t self:passwd { rootok passwd chfn chsh }; + + allow firstboot_t firstboot_etc_t:file read_file_perms; + ++files_manage_generic_tmp_dirs(firstboot_t) ++files_manage_generic_tmp_files(firstboot_t) ++ + kernel_read_system_state(firstboot_t) + kernel_read_kernel_sysctls(firstboot_t) + +-corecmd_exec_all_executables(firstboot_t) ++corenet_all_recvfrom_netlabel(firstboot_t) ++corenet_tcp_sendrecv_generic_if(firstboot_t) ++corenet_tcp_sendrecv_generic_node(firstboot_t) ++corenet_tcp_sendrecv_all_ports(firstboot_t) + + dev_read_urand(firstboot_t) + +-files_exec_etc_files(firstboot_t) +-files_manage_etc_files(firstboot_t) +-files_manage_etc_runtime_files(firstboot_t) +-files_read_usr_files(firstboot_t) +-files_manage_var_dirs(firstboot_t) +-files_manage_var_files(firstboot_t) +-files_manage_var_symlinks(firstboot_t) +-files_create_boot_flag(firstboot_t) +-files_delete_boot_flag(firstboot_t) +- + selinux_get_fs_mount(firstboot_t) + selinux_validate_context(firstboot_t) + selinux_compute_access_vector(firstboot_t) +@@ -63,6 +55,17 @@ selinux_compute_user_contexts(firstboot_t) + + auth_dontaudit_getattr_shadow(firstboot_t) + ++corecmd_exec_all_executables(firstboot_t) ++ ++files_exec_etc_files(firstboot_t) ++files_manage_etc_files(firstboot_t) ++files_manage_etc_runtime_files(firstboot_t) ++files_manage_var_dirs(firstboot_t) ++files_manage_var_files(firstboot_t) ++files_manage_var_symlinks(firstboot_t) ++files_create_boot_flag(firstboot_t) ++files_delete_boot_flag(firstboot_t) ++ + init_domtrans_script(firstboot_t) + init_rw_utmp(firstboot_t) + +@@ -73,18 +76,18 @@ locallogin_use_fds(firstboot_t) + + logging_send_syslog_msg(firstboot_t) + +-miscfiles_read_localization(firstboot_t) +- + sysnet_dns_name_resolve(firstboot_t) + +-userdom_use_user_terminals(firstboot_t) ++userdom_use_inherited_user_terminals(firstboot_t) ++ ++# Add/remove user home directories + userdom_manage_user_home_content_dirs(firstboot_t) + userdom_manage_user_home_content_files(firstboot_t) + userdom_manage_user_home_content_symlinks(firstboot_t) + userdom_manage_user_home_content_pipes(firstboot_t) + userdom_manage_user_home_content_sockets(firstboot_t) + userdom_home_filetrans_user_home_dir(firstboot_t) +-userdom_user_home_dir_filetrans_user_home_content(firstboot_t, { dir file lnk_file fifo_file sock_file }) ++userdom_filetrans_home_content(firstboot_t) + + optional_policy(` + dbus_system_bus_client(firstboot_t) +@@ -101,21 +104,18 @@ optional_policy(` + modutils_read_module_deps(firstboot_t) + ') + +-optional_policy(` +- nis_use_ypbind(firstboot_t) +-') +- + optional_policy(` + samba_rw_config(firstboot_t) + ') + + optional_policy(` +- unconfined_domtrans(firstboot_t) +- unconfined_domain(firstboot_t) ++ # The big hammer ++ unconfined_domain_noaudit(firstboot_t) + ') + + optional_policy(` +- gnome_manage_generic_home_content(firstboot_t) ++ gnome_admin_home_gconf_filetrans(firstboot_t, dir) ++ gnome_manage_config(firstboot_t) + ') + + optional_policy(` +diff --git a/fprintd.te b/fprintd.te +index 92a6479a28..66f574fc97 100644 +--- a/fprintd.te ++++ b/fprintd.te +@@ -8,6 +8,7 @@ policy_module(fprintd, 1.2.0) + type fprintd_t; + type fprintd_exec_t; + init_daemon_domain(fprintd_t, fprintd_exec_t) ++init_nnp_daemon_domain(fprintd_t) + + type fprintd_var_lib_t; + files_type(fprintd_var_lib_t) +@@ -18,25 +19,29 @@ files_type(fprintd_var_lib_t) + # + + allow fprintd_t self:capability sys_nice; ++allow fprintd_t self:capability2 wake_alarm; + allow fprintd_t self:process { getsched setsched signal sigkill }; + allow fprintd_t self:fifo_file rw_fifo_file_perms; ++allow fprintd_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow fprintd_t self:unix_dgram_socket { create_socket_perms sendto }; + + manage_dirs_pattern(fprintd_t, fprintd_var_lib_t, fprintd_var_lib_t) + manage_files_pattern(fprintd_t, fprintd_var_lib_t, fprintd_var_lib_t) + + kernel_read_system_state(fprintd_t) + ++corecmd_exec_bin(fprintd_t) ++ + dev_list_usbfs(fprintd_t) + dev_read_sysfs(fprintd_t) ++dev_read_urand(fprintd_t) + dev_rw_generic_usb_dev(fprintd_t) + +-files_read_usr_files(fprintd_t) +- + fs_getattr_all_fs(fprintd_t) + + auth_use_nsswitch(fprintd_t) + +-miscfiles_read_localization(fprintd_t) ++logging_send_syslog_msg(fprintd_t) + + userdom_use_user_ptys(fprintd_t) + userdom_read_all_users_state(fprintd_t) +@@ -54,8 +59,17 @@ optional_policy(` + ') + ') + ++ + optional_policy(` +- policykit_domtrans_auth(fprintd_t) + policykit_read_reload(fprintd_t) + policykit_read_lib(fprintd_t) ++ policykit_domtrans_auth(fprintd_t) ++') ++ ++optional_policy(` ++ udev_read_db(fprintd_t) ++') ++ ++optional_policy(` ++ xserver_read_state_xdm(fprintd_t) + ') +diff --git a/freeipmi.fc b/freeipmi.fc +new file mode 100644 +index 0000000000..0942a2e397 +--- /dev/null ++++ b/freeipmi.fc +@@ -0,0 +1,17 @@ ++/usr/lib/systemd/system/bmc-watchdog.* -- gen_context(system_u:object_r:freeipmi_bmc_watchdog_unit_file_t,s0) ++/usr/lib/systemd/system/ipmidetectd.* -- gen_context(system_u:object_r:freeipmi_ipmidetectd_unit_file_t,s0) ++/usr/lib/systemd/system/ipmiseld.* -- gen_context(system_u:object_r:freeipmi_ipmiseld_unit_file_t,s0) ++ ++/usr/sbin/bmc-watchdog -- gen_context(system_u:object_r:freeipmi_bmc_watchdog_exec_t,s0) ++/usr/sbin/ipmidetectd -- gen_context(system_u:object_r:freeipmi_ipmidetectd_exec_t,s0) ++/usr/sbin/ipmiseld -- gen_context(system_u:object_r:freeipmi_ipmiseld_exec_t,s0) ++ ++/var/cache/ipmiseld(/.*)? gen_context(system_u:object_r:freeipmi_var_cache_t,s0) ++/var/cache/ipmimonitoringsdrcache(/.*)? gen_context(system_u:object_r:freeipmi_var_cache_t,s0) ++ ++/var/lib/freeipmi(/.*)? gen_context(system_u:object_r:freeipmi_var_lib_t,s0) ++ ++ ++/var/run/ipmidetectd\.pid -- gen_context(system_u:object_r:freeipmi_ipmidetectd_var_run_t,s0) ++/var/run/ipmiseld\.pid -- gen_context(system_u:object_r:freeipmi_ipmiseld_var_run_t,s0) ++/var/run/bmc-watchdog\.pid -- gen_context(system_u:object_r:freeipmi_bmc_watchdog_var_run_t,s0) +diff --git a/freeipmi.if b/freeipmi.if +new file mode 100644 +index 0000000000..dc94853095 +--- /dev/null ++++ b/freeipmi.if +@@ -0,0 +1,71 @@ ++## Remote-Console (out-of-band) and System Management Software (in-band) based on Intelligent Platform Management Interface specification ++ ++##################################### ++## ++## Creates types and rules for a basic ++## freeipmi init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`freeipmi_domain_template',` ++ gen_require(` ++ attribute freeipmi_domain, freeipmi_pid; ++ ') ++ ++ ############################# ++ # ++ # Declarations ++ # ++ ++ type freeipmi_$1_t, freeipmi_domain; ++ type freeipmi_$1_exec_t; ++ init_daemon_domain(freeipmi_$1_t, freeipmi_$1_exec_t) ++ role system_r types freeipmi_$1_t; ++ ++ type freeipmi_$1_unit_file_t; ++ systemd_unit_file(freeipmi_$1_unit_file_t) ++ ++ type freeipmi_$1_var_run_t, freeipmi_pid; ++ files_pid_file(freeipmi_$1_var_run_t) ++ ++ ############################# ++ # ++ # Local policy ++ # ++ ++ manage_files_pattern(freeipmi_$1_t, freeipmi_$1_var_run_t, freeipmi_$1_var_run_t) ++ ++ kernel_read_system_state(freeipmi_$1_t) ++ ++ corenet_all_recvfrom_netlabel(freeipmi_$1_t) ++ corenet_all_recvfrom_unlabeled(freeipmi_$1_t) ++ ++ auth_use_nsswitch(freeipmi_$1_t) ++ ++ logging_send_syslog_msg(freeipmi_$1_t) ++') ++ ++#################################### ++## ++## Connect to cluster domains over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`freeipmi_stream_connect',` ++ gen_require(` ++ attribute freeipmi_domain, freeipmi_pid; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, freeipmi_pid, freeipmi_pid, freeipmi_domain) ++') ++ +diff --git a/freeipmi.te b/freeipmi.te +new file mode 100644 +index 0000000000..b7f52674ca +--- /dev/null ++++ b/freeipmi.te +@@ -0,0 +1,81 @@ ++policy_module(freeipmi, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute freeipmi_domain; ++attribute freeipmi_pid; ++ ++freeipmi_domain_template(ipmidetectd) ++freeipmi_domain_template(ipmiseld) ++freeipmi_domain_template(bmc_watchdog) ++ ++type freeipmi_var_lib_t; ++files_type(freeipmi_var_lib_t) ++ ++type freeipmi_var_cache_t; ++files_type(freeipmi_var_cache_t) ++ ++######################################## ++# ++# freeipmi_domain local policy ++# ++ ++allow freeipmi_domain self:fifo_file rw_fifo_file_perms; ++allow freeipmi_domain self:unix_stream_socket create_stream_socket_perms; ++allow freeipmi_domain self:sem create_sem_perms; ++ ++manage_dirs_pattern(freeipmi_domain, freeipmi_var_cache_t, freeipmi_var_cache_t) ++manage_files_pattern(freeipmi_domain, freeipmi_var_cache_t, freeipmi_var_cache_t) ++manage_lnk_files_pattern(freeipmi_domain, freeipmi_var_cache_t, freeipmi_var_cache_t) ++files_var_filetrans(freeipmi_domain, freeipmi_var_cache_t, { dir }) ++ ++manage_dirs_pattern(freeipmi_domain, freeipmi_var_lib_t, freeipmi_var_lib_t) ++manage_files_pattern(freeipmi_domain, freeipmi_var_lib_t, freeipmi_var_lib_t) ++manage_lnk_files_pattern(freeipmi_domain, freeipmi_var_lib_t, freeipmi_var_lib_t) ++files_var_lib_filetrans(freeipmi_domain, freeipmi_var_lib_t, { dir }) ++ ++dev_read_rand(freeipmi_domain) ++dev_read_urand(freeipmi_domain) ++dev_rw_ipmi_dev(freeipmi_domain) ++dev_read_sysfs(freeipmi_domain) ++dev_map_sysfs(freeipmi_domain) ++ ++sysnet_dns_name_resolve(freeipmi_domain) ++ ++####################################### ++# ++# bmc-watchdog local policy ++# ++ ++allow freeipmi_bmc_watchdog_t freeipmi_ipmiseld_t:sem rw_sem_perms; ++ ++files_pid_filetrans(freeipmi_bmc_watchdog_t, freeipmi_bmc_watchdog_var_run_t, file, "bmc-watchdog.pid") ++ ++dev_read_raw_memory(freeipmi_bmc_watchdog_t) ++ ++####################################### ++# ++# ipmidetectd local policy ++# ++ ++allow freeipmi_ipmidetectd_t self:tcp_socket listen; ++ ++files_pid_filetrans(freeipmi_ipmidetectd_t, freeipmi_ipmidetectd_var_run_t, file, "ipmidetectd.pid") ++ ++corenet_tcp_bind_freeipmi_port(freeipmi_ipmidetectd_t) ++ ++####################################### ++# ++# ipmiseld local policy ++# ++ ++allow freeipmi_ipmiseld_t self:capability sys_rawio; ++ ++allow freeipmi_ipmiseld_t freeipmi_bmc_watchdog_t:sem rw_sem_perms; ++ ++dev_read_raw_memory(freeipmi_ipmiseld_t) ++ ++files_pid_filetrans(freeipmi_ipmiseld_t, freeipmi_ipmiseld_var_run_t, file, "ipmiseld.pid") +diff --git a/freqset.fc b/freqset.fc +new file mode 100644 +index 0000000000..3cd9c38fd0 +--- /dev/null ++++ b/freqset.fc +@@ -0,0 +1 @@ ++/usr/lib/enlightenment/modules/cpufreq/linux-gnu-[^/]*/freqset -- gen_context(system_u:object_r:freqset_exec_t,s0) +diff --git a/freqset.if b/freqset.if +new file mode 100644 +index 0000000000..190ccc0358 +--- /dev/null ++++ b/freqset.if +@@ -0,0 +1,76 @@ ++ ++## policy for freqset ++ ++######################################## ++## ++## Execute TEMPLATE in the freqset domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`freqset_domtrans',` ++ gen_require(` ++ type freqset_t, freqset_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, freqset_exec_t, freqset_t) ++') ++ ++######################################## ++## ++## Execute freqset in the freqset domain, and ++## allow the specified role the freqset domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the freqset domain. ++## ++## ++# ++interface(`freqset_run',` ++ gen_require(` ++ type freqset_t; ++ attribute_role freqset_roles; ++ ') ++ ++ freqset_domtrans($1) ++ roleattribute $2 freqset_roles; ++') ++ ++######################################## ++## ++## Role access for freqset ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`freqset_role',` ++ gen_require(` ++ type freqset_t; ++ attribute_role freqset_roles; ++ ') ++ ++ roleattribute $1 freqset_roles; ++ ++ freqset_domtrans($2) ++ ++ ps_process_pattern($2, freqset_t) ++ allow $2 freqset_t:process { signull signal sigkill }; ++') +diff --git a/freqset.te b/freqset.te +new file mode 100644 +index 0000000000..0d09fbd62a +--- /dev/null ++++ b/freqset.te +@@ -0,0 +1,34 @@ ++policy_module(freqset, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute_role freqset_roles; ++roleattribute system_r freqset_roles; ++ ++type freqset_t; ++type freqset_exec_t; ++application_domain(freqset_t, freqset_exec_t) ++ ++role freqset_roles types freqset_t; ++ ++######################################## ++# ++# freqset local policy ++# ++allow freqset_t self:capability { setuid }; ++ ++allow freqset_t self:fifo_file manage_fifo_file_perms; ++allow freqset_t self:unix_stream_socket create_stream_socket_perms; ++ ++dev_rw_sysfs(freqset_t) ++ ++domain_use_interactive_fds(freqset_t) ++ ++files_read_etc_files(freqset_t) ++ ++miscfiles_read_localization(freqset_t) ++ ++userdom_use_inherited_user_terminals(freqset_t) +diff --git a/ftp.fc b/ftp.fc +index ddb75c12c8..44f74e62fe 100644 +--- a/ftp.fc ++++ b/ftp.fc +@@ -1,5 +1,8 @@ + /etc/proftpd\.conf -- gen_context(system_u:object_r:ftpd_etc_t,s0) + ++/usr/lib/systemd/system/vsftpd.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++/usr/lib/systemd/system/proftpd.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) ++ + /etc/cron\.monthly/proftpd -- gen_context(system_u:object_r:ftpd_exec_t,s0) + + /etc/rc\.d/init\.d/vsftpd -- gen_context(system_u:object_r:ftpd_initrc_exec_t,s0) +diff --git a/ftp.if b/ftp.if +index 44981434b9..84a4858b6f 100644 +--- a/ftp.if ++++ b/ftp.if +@@ -1,5 +1,67 @@ + ## File transfer protocol service. + ++###################################### ++## ++## Execute a domain transition to run ftpd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ftp_domtrans',` ++ gen_require(` ++ type ftpd_t, ftpd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1,ftpd_exec_t, ftpd_t) ++ ++') ++ ++####################################### ++## ++## Execute ftpd server in the ftpd domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++# ++interface(`ftp_initrc_domtrans',` ++ gen_require(` ++ type ftpd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, ftpd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Execute ftpd server in the ftpd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ftp_systemctl',` ++ gen_require(` ++ type ftpd_unit_file_t; ++ type ftpd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 ftpd_unit_file_t:file read_file_perms; ++ allow $1 ftpd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ftpd_t) ++') ++ + ####################################### + ## + ## Execute a dyntransition to run anon sftpd. +@@ -179,8 +241,11 @@ interface(`ftp_admin',` + type ftpd_keytab_t; + ') + +- allow $1 { ftpd_t ftpdctl_t sftpd_t anon_sftpd }:process { ptrace signal_perms }; ++ allow $1 ftpd_t:process signal_perms; + ps_process_pattern($1, { ftpd_t ftpdctl_t sftpd_t anon_sftpd_t }) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 { ftpd_t ftpdctl_t sftpd_t anon_sftpd_t }:process ptrace; ++ ') + + init_labeled_script_domtrans($1, ftpd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -204,5 +269,9 @@ interface(`ftp_admin',` + logging_list_logs($1) + admin_pattern($1, xferlog_t) + ++ ftp_systemctl($1) ++ admin_pattern($1, ftpd_unit_file_t) ++ allow $1 ftpd_unit_file_t:service all_service_perms; ++ + ftp_run_ftpdctl($1, $2) + ') +diff --git a/ftp.te b/ftp.te +index 36838c2027..d8066fbd48 100644 +--- a/ftp.te ++++ b/ftp.te +@@ -13,7 +13,7 @@ policy_module(ftp, 1.15.1) + ## be labeled public_content_rw_t. + ##

      + ## +-gen_tunable(allow_ftpd_anon_write, false) ++gen_tunable(ftpd_anon_write, false) + + ## + ##

      +@@ -22,7 +22,7 @@ gen_tunable(allow_ftpd_anon_write, false) + ## all files on the system, governed by DAC. + ##

      + ##
      +-gen_tunable(allow_ftpd_full_access, false) ++gen_tunable(ftpd_full_access, false) + + ## + ##

      +@@ -30,7 +30,14 @@ gen_tunable(allow_ftpd_full_access, false) + ## used for public file transfer services. + ##

      + ##
      +-gen_tunable(allow_ftpd_use_cifs, false) ++gen_tunable(ftpd_use_cifs, false) ++ ++## ++##

      ++## Allow ftpd to use ntfs/fusefs volumes. ++##

      ++##
      ++gen_tunable(ftpd_use_fusefs, false) + + ## + ##

      +@@ -38,7 +45,7 @@ gen_tunable(allow_ftpd_use_cifs, false) + ## used for public file transfer services. + ##

      + ##
      +-gen_tunable(allow_ftpd_use_nfs, false) ++gen_tunable(ftpd_use_nfs, false) + + ## + ##

      +@@ -49,11 +56,11 @@ gen_tunable(allow_ftpd_use_nfs, false) + gen_tunable(ftpd_connect_db, false) + + ## +-##

      +-## Determine whether ftpd can bind to all +-## unreserved ports for passive mode. +-##

      +-##
      ++##

      ++## Determine whether ftpd can bind to all ++## unreserved ports for passive mode. ++##

      ++## + gen_tunable(ftpd_use_passive_mode, false) + + ## +@@ -64,49 +71,6 @@ gen_tunable(ftpd_use_passive_mode, false) + ## + gen_tunable(ftpd_connect_all_unreserved, false) + +-## +-##

      +-## Determine whether ftpd can read and write +-## files in user home directories. +-##

      +-##
      +-gen_tunable(ftp_home_dir, false) +- +-## +-##

      +-## Determine whether sftpd can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      +-##
      +-gen_tunable(sftpd_anon_write, false) +- +-## +-##

      +-## Determine whether sftpd-can read and write +-## files in user home directories. +-##

      +-##
      +-gen_tunable(sftpd_enable_homedirs, false) +- +-## +-##

      +-## Determine whether sftpd-can login to +-## local users and read and write all +-## files on the system, governed by DAC. +-##

      +-##
      +-gen_tunable(sftpd_full_access, false) +- +-## +-##

      +-## Determine whether sftpd can read and write +-## files in user ssh home directories. +-##

      +-##
      +-gen_tunable(sftpd_write_ssh_home, false) +- + attribute_role ftpdctl_roles; + + type anon_sftpd_t; +@@ -124,6 +88,9 @@ files_config_file(ftpd_etc_t) + type ftpd_initrc_exec_t; + init_script_file(ftpd_initrc_exec_t) + ++type ftpd_unit_file_t; ++systemd_unit_file(ftpd_unit_file_t) ++ + type ftpd_keytab_t; + files_type(ftpd_keytab_t) + +@@ -184,6 +151,9 @@ allow ftpd_t ftpd_keytab_t:file read_file_perms; + allow ftpd_t ftpd_lock_t:file manage_file_perms; + files_lock_filetrans(ftpd_t, ftpd_lock_t, file) + ++manage_dirs_pattern(ftpd_t, ftpd_tmp_t, ftpd_tmp_t) ++manage_files_pattern(ftpd_t, ftpd_tmp_t, ftpd_tmp_t) ++ + manage_dirs_pattern(ftpd_t, ftpd_tmpfs_t, ftpd_tmpfs_t) + manage_files_pattern(ftpd_t, ftpd_tmpfs_t, ftpd_tmpfs_t) + manage_lnk_files_pattern(ftpd_t, ftpd_tmpfs_t, ftpd_tmpfs_t) +@@ -198,22 +168,19 @@ files_pid_filetrans(ftpd_t, ftpd_var_run_t, { file dir }) + + allow ftpd_t ftpdctl_tmp_t:sock_file delete_sock_file_perms; + +-allow ftpd_t xferlog_t:dir setattr_dir_perms; +-append_files_pattern(ftpd_t, xferlog_t, xferlog_t) +-create_files_pattern(ftpd_t, xferlog_t, xferlog_t) +-setattr_files_pattern(ftpd_t, xferlog_t, xferlog_t) +-logging_log_filetrans(ftpd_t, xferlog_t, file) ++manage_dirs_pattern(ftpd_t, xferlog_t, xferlog_t) ++manage_files_pattern(ftpd_t, xferlog_t, xferlog_t) ++logging_log_filetrans(ftpd_t, xferlog_t, { dir file }) + + kernel_read_kernel_sysctls(ftpd_t) + kernel_read_system_state(ftpd_t) +-kernel_search_network_state(ftpd_t) ++kernel_read_network_state(ftpd_t) + + dev_read_sysfs(ftpd_t) + dev_read_urand(ftpd_t) + + corecmd_exec_bin(ftpd_t) + +-corenet_all_recvfrom_unlabeled(ftpd_t) + corenet_all_recvfrom_netlabel(ftpd_t) + corenet_tcp_sendrecv_generic_if(ftpd_t) + corenet_udp_sendrecv_generic_if(ftpd_t) +@@ -229,9 +196,12 @@ corenet_tcp_bind_ftp_port(ftpd_t) + corenet_sendrecv_ftp_data_server_packets(ftpd_t) + corenet_tcp_bind_ftp_data_port(ftpd_t) + ++corenet_tcp_bind_generic_port(ftpd_t) ++corenet_tcp_bind_all_ephemeral_ports(ftpd_t) ++corenet_tcp_connect_all_ephemeral_ports(ftpd_t) ++ + domain_use_interactive_fds(ftpd_t) + +-files_read_etc_files(ftpd_t) + files_read_etc_runtime_files(ftpd_t) + files_search_var_lib(ftpd_t) + +@@ -250,7 +220,6 @@ logging_send_audit_msgs(ftpd_t) + logging_send_syslog_msg(ftpd_t) + logging_set_loginuid(ftpd_t) + +-miscfiles_read_localization(ftpd_t) + miscfiles_read_public_files(ftpd_t) + + seutil_dontaudit_search_config(ftpd_t) +@@ -259,37 +228,60 @@ sysnet_use_ldap(ftpd_t) + + userdom_dontaudit_use_unpriv_user_fds(ftpd_t) + userdom_dontaudit_search_user_home_dirs(ftpd_t) ++userdom_filetrans_home_content(ftpd_t) ++userdom_manage_user_home_content_dirs(ftpd_t) ++userdom_manage_user_home_content_files(ftpd_t) ++userdom_manage_user_tmp_dirs(ftpd_t) ++userdom_manage_user_tmp_files(ftpd_t) ++ + +-tunable_policy(`allow_ftpd_anon_write',` ++tunable_policy(`ftpd_anon_write',` + miscfiles_manage_public_files(ftpd_t) + ') + +-tunable_policy(`allow_ftpd_use_cifs',` ++tunable_policy(`ftpd_use_cifs',` + fs_read_cifs_files(ftpd_t) + fs_read_cifs_symlinks(ftpd_t) + ') + +-tunable_policy(`allow_ftpd_use_cifs && allow_ftpd_anon_write',` ++tunable_policy(`ftpd_use_cifs && ftpd_anon_write',` + fs_manage_cifs_files(ftpd_t) + ') + +-tunable_policy(`allow_ftpd_use_nfs',` ++tunable_policy(`ftpd_use_fusefs',` ++ fs_manage_fusefs_dirs(ftpd_t) ++ fs_manage_fusefs_files(ftpd_t) ++ fs_manage_fusefs_symlinks(ftpd_t) ++',` ++ fs_search_fusefs(ftpd_t) ++') ++ ++tunable_policy(`ftpd_use_nfs',` + fs_read_nfs_files(ftpd_t) + fs_read_nfs_symlinks(ftpd_t) + ') + +-tunable_policy(`allow_ftpd_use_nfs && allow_ftpd_anon_write',` ++tunable_policy(`ftpd_use_nfs && ftpd_anon_write',` + fs_manage_nfs_files(ftpd_t) + ') + +-tunable_policy(`allow_ftpd_full_access',` ++tunable_policy(`ftpd_full_access',` + allow ftpd_t self:capability { dac_override dac_read_search }; +- files_manage_non_auth_files(ftpd_t) ++ files_manage_non_security_dirs(ftpd_t) ++ files_manage_non_security_files(ftpd_t) + ') + + tunable_policy(`ftpd_use_passive_mode',` +- corenet_sendrecv_all_server_packets(ftpd_t) +- corenet_tcp_bind_all_unreserved_ports(ftpd_t) ++ corenet_tcp_bind_all_unreserved_ports(ftpd_t) ++') ++ ++tunable_policy(`ftpd_connect_all_unreserved',` ++ corenet_tcp_connect_all_unreserved_ports(ftpd_t) ++') ++ ++tunable_policy(`ftpd_use_passive_mode',` ++ corenet_sendrecv_all_server_packets(ftpd_t) ++ corenet_tcp_bind_all_unreserved_ports(ftpd_t) + ') + + tunable_policy(`ftpd_connect_all_unreserved',` +@@ -304,43 +296,23 @@ tunable_policy(`ftpd_connect_db',` + corenet_sendrecv_mssql_client_packets(ftpd_t) + corenet_tcp_connect_mssql_port(ftpd_t) + corenet_tcp_sendrecv_mssql_port(ftpd_t) +- corenet_sendrecv_oracledb_client_packets(ftpd_t) +- corenet_tcp_connect_oracledb_port(ftpd_t) +- corenet_tcp_sendrecv_oracledb_port(ftpd_t) ++ corenet_sendrecv_oracle_client_packets(ftpd_t) ++ corenet_tcp_connect_oracle_port(ftpd_t) ++ corenet_tcp_sendrecv_oracle_port(ftpd_t) + ') + +-tunable_policy(`ftp_home_dir',` +- allow ftpd_t self:capability { dac_override dac_read_search }; +- +- userdom_manage_user_home_content_dirs(ftpd_t) +- userdom_manage_user_home_content_files(ftpd_t) +- userdom_user_home_dir_filetrans_user_home_content(ftpd_t, { dir file }) +- userdom_manage_user_tmp_dirs(ftpd_t) +- userdom_manage_user_tmp_files(ftpd_t) +- userdom_tmp_filetrans_user_tmp(ftpd_t, { dir file }) +-',` +- userdom_user_home_dir_filetrans_user_home_content(ftpd_t, { dir file }) +- userdom_tmp_filetrans_user_tmp(ftpd_t, { dir file }) +-') +- +-tunable_policy(`ftp_home_dir && use_nfs_home_dirs',` ++tunable_policy(`use_nfs_home_dirs',` + fs_manage_nfs_dirs(ftpd_t) + fs_manage_nfs_files(ftpd_t) + fs_manage_nfs_symlinks(ftpd_t) + ') + +-tunable_policy(`ftp_home_dir && use_samba_home_dirs',` ++tunable_policy(`use_samba_home_dirs',` + fs_manage_cifs_dirs(ftpd_t) + fs_manage_cifs_files(ftpd_t) + fs_manage_cifs_symlinks(ftpd_t) + ') + +-optional_policy(` +- tunable_policy(`ftp_home_dir',` +- apache_search_sys_content(ftpd_t) +- ') +-') +- + optional_policy(` + corecmd_exec_shell(ftpd_t) + +@@ -363,9 +335,8 @@ optional_policy(` + + optional_policy(` + selinux_validate_context(ftpd_t) +- + kerberos_read_keytab(ftpd_t) +- kerberos_tmp_filetrans_host_rcache(ftpd_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(ftpd_t, "host_0") + kerberos_use(ftpd_t) + ') + +@@ -410,92 +381,49 @@ optional_policy(` + udev_read_db(ftpd_t) + ') + ++optional_policy(` ++ apache_manage_user_content(ftpd_t) ++') ++ + ######################################## + # + # Ctl local policy + # + + stream_connect_pattern(ftpdctl_t, ftpd_var_run_t, ftpd_var_run_t, ftpd_t) ++files_search_pids(ftpdctl_t) + + allow ftpdctl_t ftpdctl_tmp_t:sock_file manage_sock_file_perms; + files_tmp_filetrans(ftpdctl_t, ftpdctl_tmp_t, sock_file) + +-files_read_etc_files(ftpdctl_t) + files_search_pids(ftpdctl_t) + +-userdom_use_user_terminals(ftpdctl_t) ++userdom_use_inherited_user_terminals(ftpdctl_t) + + ######################################## + # + # Anon sftpd local policy + # + +-files_read_etc_files(anon_sftpd_t) +- + miscfiles_read_public_files(anon_sftpd_t) + +-tunable_policy(`sftpd_anon_write',` +- miscfiles_manage_public_files(anon_sftpd_t) +-') +- + ######################################## + # + # Sftpd local policy + # + +-files_read_etc_files(sftpd_t) + + userdom_read_user_home_content_files(sftpd_t) + userdom_read_user_home_content_symlinks(sftpd_t) ++userdom_dontaudit_list_admin_dir(sftpd_t) + +-tunable_policy(`sftpd_enable_homedirs',` +- allow sftpd_t self:capability { dac_override dac_read_search }; ++userdom_filetrans_home_content(sftpd_t) ++userdom_tmp_filetrans_user_tmp(sftpd_t, { dir file }) + + userdom_manage_user_home_content_dirs(sftpd_t) + userdom_manage_user_home_content_files(sftpd_t) +- userdom_user_home_dir_filetrans_user_home_content(sftpd_t, { dir file }) + userdom_manage_user_tmp_dirs(sftpd_t) + userdom_manage_user_tmp_files(sftpd_t) +- userdom_tmp_filetrans_user_tmp(sftpd_t, { dir file }) +-',` +- userdom_user_home_dir_filetrans_user_home_content(sftpd_t, { dir file }) +- userdom_tmp_filetrans_user_tmp(sftpd_t, { dir file }) +-') +- +-tunable_policy(`sftpd_enable_homedirs && use_nfs_home_dirs',` +- fs_manage_nfs_dirs(sftpd_t) +- fs_manage_nfs_files(sftpd_t) +- fs_manage_nfs_symlinks(sftpd_t) +-') +- +-tunable_policy(`sftpd_enable_homedirs && use_samba_home_dirs',` +- fs_manage_cifs_dirs(sftpd_t) +- fs_manage_cifs_files(sftpd_t) +- fs_manage_cifs_symlinks(sftpd_t) +-') +- +-tunable_policy(`sftpd_anon_write',` +- miscfiles_manage_public_files(sftpd_t) +-') +- +-tunable_policy(`sftpd_full_access',` +- allow sftpd_t self:capability { dac_override dac_read_search }; +- fs_read_noxattr_fs_files(sftpd_t) +- files_manage_non_auth_files(sftpd_t) +-') +- +-tunable_policy(`sftpd_write_ssh_home',` +- ssh_manage_home_files(sftpd_t) +-') + +-tunable_policy(`use_samba_home_dirs',` +- fs_list_cifs(sftpd_t) +- fs_read_cifs_files(sftpd_t) +- fs_read_cifs_symlinks(sftpd_t) +-') ++userdom_home_reader(sftpd_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_list_nfs(sftpd_t) +- fs_read_nfs_files(sftpd_t) +- fs_read_nfs_symlinks(ftpd_t) +-') +diff --git a/games.if b/games.if +index e2a3e0dbaa..50ebd4080b 100644 +--- a/games.if ++++ b/games.if +@@ -58,3 +58,23 @@ interface(`games_rw_data',` + files_search_var_lib($1) + rw_files_pattern($1, games_data_t, games_data_t) + ') ++ ++######################################## ++## ++## Manage games data files. ++## games data. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`games_manage_data_files',` ++ gen_require(` ++ type games_data_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, games_data_t, games_data_t) ++') +diff --git a/games.te b/games.te +index e5b15fb7ef..220622e848 100644 +--- a/games.te ++++ b/games.te +@@ -76,8 +76,6 @@ init_use_script_ptys(games_srv_t) + + logging_send_syslog_msg(games_srv_t) + +-miscfiles_read_localization(games_srv_t) +- + userdom_dontaudit_use_unpriv_user_fds(games_srv_t) + + userdom_dontaudit_search_user_home_dirs(games_srv_t) +@@ -120,7 +118,6 @@ kernel_read_system_state(games_t) + + corecmd_exec_bin(games_t) + +-corenet_all_recvfrom_unlabeled(games_t) + corenet_all_recvfrom_netlabel(games_t) + corenet_tcp_sendrecv_generic_if(games_t) + corenet_tcp_sendrecv_generic_node(games_t) +@@ -142,8 +139,6 @@ dev_write_sound(games_t) + files_list_var(games_t) + files_search_var_lib(games_t) + files_dontaudit_search_var(games_t) +-files_read_etc_files(games_t) +-files_read_usr_files(games_t) + files_read_var_files(games_t) + + init_dontaudit_rw_utmp(games_t) +@@ -151,7 +146,6 @@ init_dontaudit_rw_utmp(games_t) + logging_dontaudit_search_logs(games_t) + + miscfiles_read_man_pages(games_t) +-miscfiles_read_localization(games_t) + + sysnet_dns_name_resolve(games_t) + +@@ -161,7 +155,7 @@ userdom_manage_user_tmp_symlinks(games_t) + userdom_manage_user_tmp_sockets(games_t) + userdom_dontaudit_read_user_home_content_files(games_t) + +-tunable_policy(`allow_execmem',` ++tunable_policy(`deny_execmem',`', ` + allow games_t self:process execmem; + ') + +diff --git a/ganesha.fc b/ganesha.fc +new file mode 100644 +index 0000000000..6105051204 +--- /dev/null ++++ b/ganesha.fc +@@ -0,0 +1,14 @@ ++/usr/bin/ganesha.nfsd -- gen_context(system_u:object_r:ganesha_exec_t,s0) ++ ++/usr/lib/systemd/system/nfs-ganesha-config.* -- gen_context(system_u:object_r:ganesha_unit_file_t,s0) ++ ++/usr/lib/systemd/system/nfs-ganesha-lock.* -- gen_context(system_u:object_r:ganesha_unit_file_t,s0) ++ ++/usr/lib/systemd/system/nfs-ganesha.*e -- gen_context(system_u:object_r:ganesha_unit_file_t,s0) ++ ++/var/log/ganesha(/.*)? gen_context(system_u:object_r:ganesha_var_log_t,s0) ++/var/log/ganesha.log -- gen_context(system_u:object_r:ganesha_var_log_t,s0) ++/var/log/ganesha.log.* -- gen_context(system_u:object_r:ganesha_var_log_t,s0) ++/var/log/ganesha-gfapi.log.* -- gen_context(system_u:object_r:ganesha_var_log_t,s0) ++ ++/var/run/ganesha(/.*)? gen_context(system_u:object_r:ganesha_var_run_t,s0) +diff --git a/ganesha.if b/ganesha.if +new file mode 100644 +index 0000000000..d9ba5fa271 +--- /dev/null ++++ b/ganesha.if +@@ -0,0 +1,147 @@ ++ ++## policy for ganesha ++ ++######################################## ++## ++## Execute ganesha_exec_t in the ganesha domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ganesha_domtrans',` ++ gen_require(` ++ type ganesha_t, ganesha_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ganesha_exec_t, ganesha_t) ++') ++ ++###################################### ++## ++## Execute ganesha in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ganesha_exec',` ++ gen_require(` ++ type ganesha_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, ganesha_exec_t) ++') ++######################################## ++## ++## Read ganesha PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ganesha_read_pid_files',` ++ gen_require(` ++ type ganesha_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, ganesha_var_run_t, ganesha_var_run_t) ++') ++ ++######################################## ++## ++## Execute ganesha server in the ganesha domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ganesha_systemctl',` ++ gen_require(` ++ type ganesha_t; ++ type ganesha_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 ganesha_unit_file_t:file read_file_perms; ++ allow $1 ganesha_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ganesha_t) ++') ++ ++ ++######################################## ++## ++## Send and receive messages from ++## ganesha over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ganesha_dbus_chat',` ++ gen_require(` ++ type ganesha_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 ganesha_t:dbus send_msg; ++ allow ganesha_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ganesha environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`ganesha_admin',` ++ gen_require(` ++ type ganesha_t; ++ type ganesha_var_run_t; ++ type ganesha_unit_file_t; ++ ') ++ ++ allow $1 ganesha_t:process { signal_perms }; ++ ps_process_pattern($1, ganesha_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ganesha_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, ganesha_var_run_t) ++ ++ ganesha_systemctl($1) ++ admin_pattern($1, ganesha_unit_file_t) ++ allow $1 ganesha_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/ganesha.te b/ganesha.te +new file mode 100644 +index 0000000000..591cb272b7 +--- /dev/null ++++ b/ganesha.te +@@ -0,0 +1,114 @@ ++policy_module(ganesha, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow ganesha to read/write fuse files ++##

      ++##
      ++gen_tunable(ganesha_use_fusefs, false) ++ ++type ganesha_t; ++type ganesha_exec_t; ++init_daemon_domain(ganesha_t, ganesha_exec_t) ++ ++type ganesha_var_log_t; ++logging_log_file(ganesha_var_log_t) ++ ++type ganesha_var_run_t; ++files_pid_file(ganesha_var_run_t) ++ ++type ganesha_tmp_t; ++files_tmp_file(ganesha_tmp_t) ++ ++type ganesha_unit_file_t; ++systemd_unit_file(ganesha_unit_file_t) ++ ++######################################## ++# ++# ganesha local policy ++# ++dontaudit ganesha_t self:capability net_admin; ++ ++allow ganesha_t self:capability { dac_read_search dac_override }; ++allow ganesha_t self:capability2 block_suspend; ++allow ganesha_t self:process { setcap setrlimit }; ++allow ganesha_t self:fifo_file rw_fifo_file_perms; ++allow ganesha_t self:unix_stream_socket create_stream_socket_perms; ++allow ganesha_t self:tcp_socket { accept listen }; ++ ++manage_dirs_pattern(ganesha_t, ganesha_var_run_t, ganesha_var_run_t) ++manage_files_pattern(ganesha_t, ganesha_var_run_t, ganesha_var_run_t) ++manage_lnk_files_pattern(ganesha_t, ganesha_var_run_t, ganesha_var_run_t) ++files_pid_filetrans(ganesha_t, ganesha_var_run_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(ganesha_t, ganesha_var_log_t, ganesha_var_log_t) ++manage_files_pattern(ganesha_t, ganesha_var_log_t, ganesha_var_log_t) ++logging_log_filetrans(ganesha_t, ganesha_var_log_t, { file dir }) ++ ++manage_dirs_pattern(ganesha_t, ganesha_tmp_t, ganesha_tmp_t) ++manage_files_pattern(ganesha_t, ganesha_tmp_t, ganesha_tmp_t) ++files_tmp_filetrans(ganesha_t, ganesha_tmp_t, { file dir }) ++ ++kernel_read_system_state(ganesha_t) ++kernel_read_network_state(ganesha_t) ++kernel_search_network_sysctl(ganesha_t) ++kernel_read_net_sysctls(ganesha_t) ++ ++auth_use_nsswitch(ganesha_t) ++ ++corenet_tcp_bind_nfs_port(ganesha_t) ++corenet_tcp_connect_generic_port(ganesha_t) ++corenet_tcp_connect_gluster_port(ganesha_t) ++corenet_udp_bind_dey_keyneg_port(ganesha_t) ++corenet_tcp_bind_dey_keyneg_port(ganesha_t) ++corenet_udp_bind_nfs_port(ganesha_t) ++corenet_udp_bind_all_rpc_ports(ganesha_t) ++corenet_tcp_bind_all_rpc_ports(ganesha_t) ++corenet_tcp_bind_mountd_port(ganesha_t) ++corenet_udp_bind_mountd_port(ganesha_t) ++corenet_tcp_connect_virt_migration_port(ganesha_t) ++corenet_tcp_connect_all_rpc_ports(ganesha_t) ++corenet_tcp_connect_portmap_port(ganesha_t) ++corenet_tcp_connect_cyphesis_port(ganesha_t) ++ ++dev_rw_infiniband_dev(ganesha_t) ++dev_read_gpfs(ganesha_t) ++dev_read_rand(ganesha_t) ++ ++logging_send_syslog_msg(ganesha_t) ++ ++sysnet_dns_name_resolve(ganesha_t) ++ ++optional_policy(` ++ dbus_system_bus_client(ganesha_t) ++ dbus_connect_system_bus(ganesha_t) ++ unconfined_dbus_chat(ganesha_t) ++') ++ ++optional_policy(` ++ glusterd_read_conf(ganesha_t) ++ glusterd_read_lib_files(ganesha_t) ++ glusterd_manage_pid(ganesha_t) ++') ++ ++optional_policy(` ++ kerberos_read_keytab(ganesha_t) ++') ++ ++optional_policy(` ++ rpc_manage_nfs_state_data_dir(ganesha_t) ++ rpc_read_nfs_state_data(ganesha_t) ++ rpcbind_stream_connect(ganesha_t) ++') ++ ++tunable_policy(`ganesha_use_fusefs',` ++ fs_manage_fusefs_dirs(ganesha_t) ++ fs_manage_fusefs_files(ganesha_t) ++ fs_read_fusefs_symlinks(ganesha_t) ++ fs_getattr_fusefs(ganesha_t) ++') +diff --git a/gatekeeper.te b/gatekeeper.te +index 28203689c8..88c98f4818 100644 +--- a/gatekeeper.te ++++ b/gatekeeper.te +@@ -57,7 +57,6 @@ kernel_read_kernel_sysctls(gatekeeper_t) + + corecmd_list_bin(gatekeeper_t) + +-corenet_all_recvfrom_unlabeled(gatekeeper_t) + corenet_all_recvfrom_netlabel(gatekeeper_t) + corenet_tcp_sendrecv_generic_if(gatekeeper_t) + corenet_udp_sendrecv_generic_if(gatekeeper_t) +@@ -77,15 +76,11 @@ dev_read_urand(gatekeeper_t) + + domain_use_interactive_fds(gatekeeper_t) + +-files_read_etc_files(gatekeeper_t) +- + fs_getattr_all_fs(gatekeeper_t) + fs_search_auto_mountpoints(gatekeeper_t) + + logging_send_syslog_msg(gatekeeper_t) + +-miscfiles_read_localization(gatekeeper_t) +- + sysnet_read_config(gatekeeper_t) + + userdom_dontaudit_use_unpriv_user_fds(gatekeeper_t) +diff --git a/gdomap.te b/gdomap.te +index db7b56c2d3..3c23579653 100644 +--- a/gdomap.te ++++ b/gdomap.te +@@ -32,6 +32,7 @@ files_pid_filetrans(gdomap_t, gdomap_var_run_t, file, "gdomap.pid") + corenet_sendrecv_gdomap_server_packets(gdomap_t) + corenet_tcp_bind_generic_node(gdomap_t) + corenet_tcp_bind_gdomap_port(gdomap_t) ++corenet_tcp_connect_gdomap_port(gdomap_t) + corenet_tcp_sendrecv_gdomap_port(gdomap_t) + corenet_udp_bind_generic_node(gdomap_t) + corenet_udp_bind_gdomap_port(gdomap_t) +diff --git a/gear.fc b/gear.fc +new file mode 100644 +index 0000000000..4d7dc99912 +--- /dev/null ++++ b/gear.fc +@@ -0,0 +1,6 @@ ++/usr/bin/gear -- gen_context(system_u:object_r:gear_exec_t,s0) ++ ++/usr/lib/systemd/system/gear.service -- gen_context(system_u:object_r:gear_unit_file_t,s0) ++ ++/var/lib/containers/units(/.*)? gen_context(system_u:object_r:gear_unit_file_t,s0) ++/var/lib/gear(/.*)? gen_context(system_u:object_r:gear_var_lib_t,s0) +diff --git a/gear.if b/gear.if +new file mode 100644 +index 0000000000..2c08004bfe +--- /dev/null ++++ b/gear.if +@@ -0,0 +1,288 @@ ++ ++## The open-source application container engine. ++ ++######################################## ++## ++## Execute gear in the gear domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`gear_domtrans',` ++ gen_require(` ++ type gear_t, gear_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, gear_exec_t, gear_t) ++') ++ ++######################################## ++## ++## Search gear lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_search_lib',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ allow $1 gear_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Execute gear lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_exec_lib',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ allow $1 gear_var_lib_t:dir search_dir_perms; ++ can_exec($1, gear_var_lib_t) ++') ++ ++######################################## ++## ++## Read gear lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_read_lib_files',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, gear_var_lib_t, gear_var_lib_t) ++') ++ ++######################################## ++## ++## Manage gear lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_manage_lib_files',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, gear_var_lib_t, gear_var_lib_t) ++ manage_lnk_files_pattern($1, gear_var_lib_t, gear_var_lib_t) ++') ++ ++######################################## ++## ++## Manage gear lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_manage_lib_dirs',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, gear_var_lib_t, gear_var_lib_t) ++') ++ ++######################################## ++## ++## Create objects in a gear var lib directory ++## with an automatic type transition to ++## a specified private type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`gear_lib_filetrans',` ++ gen_require(` ++ type gear_var_lib_t; ++ ') ++ ++ filetrans_pattern($1, gear_var_lib_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Read gear PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_read_pid_files',` ++ gen_require(` ++ type gear_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, gear_var_run_t, gear_var_run_t) ++') ++ ++######################################## ++## ++## Execute gear server in the gear domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`gear_systemctl',` ++ gen_require(` ++ type gear_t; ++ type gear_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 gear_unit_file_t:file read_file_perms; ++ allow $1 gear_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, gear_t) ++') ++ ++######################################## ++## ++## Read and write gear shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_rw_sem',` ++ gen_require(` ++ type gear_t; ++ ') ++ ++ allow $1 gear_t:sem rw_sem_perms; ++') ++ ++####################################### ++## ++## Read and write the gear pty type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_use_ptys',` ++ gen_require(` ++ type gear_devpts_t; ++ ') ++ ++ allow $1 gear_devpts_t:chr_file rw_term_perms; ++') ++ ++####################################### ++## ++## Allow domain to create gear content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_filetrans_named_content',` ++ gen_require(` ++ type gear_var_lib_t; ++ type gear_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, gear_var_run_t, file, "gear.pid") ++ files_var_lib_filetrans($1, gear_var_lib_t, dir, "gear") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an gear environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gear_admin',` ++ gen_require(` ++ type gear_t; ++ type gear_var_lib_t, gear_var_run_t; ++ type gear_unit_file_t; ++ type gear_log_t; ++ ') ++ ++ allow $1 gear_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, gear_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, gear_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, gear_var_run_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, gear_log_t) ++ ++ gear_systemctl($1) ++ admin_pattern($1, gear_unit_file_t) ++ allow $1 gear_unit_file_t:service all_service_perms; ++') +diff --git a/gear.te b/gear.te +new file mode 100644 +index 0000000000..33dbdf7ece +--- /dev/null ++++ b/gear.te +@@ -0,0 +1,136 @@ ++policy_module(gear, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type gear_t; ++type gear_exec_t; ++init_daemon_domain(gear_t, gear_exec_t) ++ ++type gear_var_lib_t; ++files_type(gear_var_lib_t) ++ ++type gear_log_t; ++logging_log_file(gear_log_t) ++ ++type gear_var_run_t; ++files_pid_file(gear_var_run_t) ++ ++type gear_unit_file_t; ++systemd_unit_file(gear_unit_file_t) ++ ++######################################## ++# ++# gear local policy ++# ++allow gear_t self:capability { chown net_admin fowner dac_read_search dac_override }; ++dontaudit gear_t self:capability sys_ptrace; ++allow gear_t self:capability2 block_suspend; ++allow gear_t self:process { getattr signal_perms }; ++allow gear_t self:fifo_file rw_fifo_file_perms; ++allow gear_t self:unix_stream_socket create_stream_socket_perms; ++allow gear_t self:tcp_socket create_stream_socket_perms; ++ ++allow gear_t gear_unit_file_t:file read_file_perms; ++allow gear_t gear_unit_file_t:service manage_service_perms; ++allow gear_t gear_unit_file_t:dir { relabelfrom relabelto }; ++manage_dirs_pattern(gear_t, gear_unit_file_t, gear_unit_file_t) ++ ++manage_dirs_pattern(gear_t, gear_log_t, gear_log_t) ++manage_files_pattern(gear_t, gear_log_t, gear_log_t) ++manage_lnk_files_pattern(gear_t, gear_log_t, gear_log_t) ++logging_log_filetrans(gear_t, gear_log_t, { dir file lnk_file }) ++ ++gear_filetrans_named_content(gear_t) ++ ++manage_dirs_pattern(gear_t, gear_var_lib_t, gear_var_lib_t) ++manage_chr_files_pattern(gear_t, gear_var_lib_t, gear_var_lib_t) ++manage_blk_files_pattern(gear_t, gear_var_lib_t, gear_var_lib_t) ++manage_files_pattern(gear_t, gear_var_lib_t, gear_var_lib_t) ++manage_lnk_files_pattern(gear_t, gear_var_lib_t, gear_var_lib_t) ++files_var_lib_filetrans(gear_t, gear_var_lib_t, { dir file lnk_file }) ++allow gear_t gear_var_lib_t:dir { relabelfrom relabelto }; ++ ++manage_dirs_pattern(gear_t, gear_var_run_t, gear_var_run_t) ++manage_files_pattern(gear_t, gear_var_run_t, gear_var_run_t) ++manage_sock_files_pattern(gear_t, gear_var_run_t, gear_var_run_t) ++manage_lnk_files_pattern(gear_t, gear_var_run_t, gear_var_run_t) ++files_pid_filetrans(gear_t, gear_var_run_t, { dir file lnk_file sock_file }) ++init_pid_filetrans(gear_t, gear_var_run_t, { dir file lnk_file sock_file }) ++ ++kernel_read_system_state(gear_t) ++kernel_read_network_state(gear_t) ++kernel_read_all_sysctls(gear_t) ++kernel_rw_net_sysctls(gear_t) ++ ++domain_use_interactive_fds(gear_t) ++domain_read_all_domains_state(gear_t) ++ ++corecmd_exec_bin(gear_t) ++corecmd_exec_shell(gear_t) ++ ++corenet_tcp_bind_generic_node(gear_t) ++corenet_tcp_sendrecv_generic_if(gear_t) ++corenet_tcp_sendrecv_generic_node(gear_t) ++corenet_tcp_sendrecv_generic_port(gear_t) ++corenet_tcp_bind_gear_port(gear_t) ++ ++dev_mounton_sysfs(gear_t) ++dev_mount_sysfs_fs(gear_t) ++dev_unmount_sysfs_fs(gear_t) ++ ++files_mounton_rootfs(gear_t) ++files_read_etc_files(gear_t) ++ ++fs_list_cgroup_dirs(gear_t) ++fs_read_cgroup_files(gear_t) ++fs_read_tmpfs_symlinks(gear_t) ++fs_getattr_all_fs(gear_t) ++ ++auth_use_nsswitch(gear_t) ++ ++init_read_state(gear_t) ++init_dbus_chat(gear_t) ++init_enable_services(gear_t) ++ ++iptables_domtrans(gear_t) ++ ++logging_send_audit_msgs(gear_t) ++logging_send_syslog_msg(gear_t) ++logging_read_generic_logs(gear_t) ++ ++miscfiles_read_localization(gear_t) ++ ++mount_domtrans(gear_t) ++ ++selinux_validate_context(gear_t) ++ ++seutil_read_default_contexts(gear_t) ++seutil_read_config(gear_t) ++ ++sysnet_dns_name_resolve(gear_t) ++ ++sysnet_exec_ifconfig(gear_t) ++sysnet_manage_ifconfig_run(gear_t) ++ ++systemd_manage_all_unit_files(gear_t) ++systemd_exec_systemctl(gear_t) ++ ++usermanage_domtrans_useradd(gear_t) ++usermanage_domtrans_passwd(gear_t) ++ ++optional_policy(` ++ hostname_exec(gear_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(gear_t) ++') ++ ++optional_policy(` ++ openshift_manage_lib_dirs(gear_t) ++ openshift_manage_lib_files(gear_t) ++ openshift_relabelfrom_lib(gear_t) ++') +diff --git a/geoclue.fc b/geoclue.fc +new file mode 100644 +index 0000000000..a97f14fd90 +--- /dev/null ++++ b/geoclue.fc +@@ -0,0 +1,4 @@ ++ ++/usr/libexec/geoclue -- gen_context(system_u:object_r:geoclue_exec_t,s0) ++ ++/var/lib/geoclue(/.*)? gen_context(system_u:object_r:geoclue_var_lib_t,s0) +diff --git a/geoclue.if b/geoclue.if +new file mode 100644 +index 0000000000..cf9f7bfca9 +--- /dev/null ++++ b/geoclue.if +@@ -0,0 +1,153 @@ ++ ++## Geoclue is a D-Bus service that provides location information ++ ++######################################## ++## ++## Execute geoclue in the geoclue domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`geoclue_domtrans',` ++ gen_require(` ++ type geoclue_t, geoclue_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, geoclue_exec_t, geoclue_t) ++') ++ ++######################################## ++## ++## Search geoclue lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`geoclue_search_lib',` ++ gen_require(` ++ type geoclue_var_lib_t; ++ ') ++ ++ allow $1 geoclue_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read geoclue lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`geoclue_read_lib_files',` ++ gen_require(` ++ type geoclue_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, geoclue_var_lib_t, geoclue_var_lib_t) ++') ++ ++######################################## ++## ++## Manage geoclue lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`geoclue_manage_lib_files',` ++ gen_require(` ++ type geoclue_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, geoclue_var_lib_t, geoclue_var_lib_t) ++') ++ ++######################################## ++## ++## Manage geoclue lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`geoclue_manage_lib_dirs',` ++ gen_require(` ++ type geoclue_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, geoclue_var_lib_t, geoclue_var_lib_t) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## geoclue over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`geoclue_dbus_chat',` ++ gen_require(` ++ type geoclue_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 geoclue_t:dbus send_msg; ++ allow geoclue_t $1:dbus send_msg; ++ ps_process_pattern(geoclue_t, $1) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an geoclue environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`geoclue_admin',` ++ gen_require(` ++ type geoclue_t; ++ type geoclue_var_lib_t; ++ ') ++ ++ allow $1 geoclue_t:process { signal_perms }; ++ ps_process_pattern($1, geoclue_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 geoclue_t:process ptrace; ++ ') ++ ++ files_search_var_lib($1) ++ admin_pattern($1, geoclue_var_lib_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/geoclue.te b/geoclue.te +new file mode 100644 +index 0000000000..efd838f74d +--- /dev/null ++++ b/geoclue.te +@@ -0,0 +1,71 @@ ++policy_module(geoclue, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type geoclue_t; ++type geoclue_exec_t; ++application_domain(geoclue_t, geoclue_exec_t) ++role system_r types geoclue_t; ++ ++type geoclue_var_lib_t; ++files_type(geoclue_var_lib_t) ++ ++type geoclue_tmp_t; ++files_tmp_file(geoclue_tmp_t) ++ ++######################################## ++# ++# geoclue local policy ++# ++allow geoclue_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(geoclue_t, geoclue_var_lib_t, geoclue_var_lib_t) ++manage_files_pattern(geoclue_t, geoclue_var_lib_t, geoclue_var_lib_t) ++manage_lnk_files_pattern(geoclue_t, geoclue_var_lib_t, geoclue_var_lib_t) ++files_var_lib_filetrans(geoclue_t, geoclue_var_lib_t, { dir }) ++ ++manage_files_pattern(geoclue_t, geoclue_tmp_t, geoclue_tmp_t) ++manage_dirs_pattern(geoclue_t, geoclue_tmp_t, geoclue_tmp_t) ++files_tmp_filetrans(geoclue_t, geoclue_tmp_t, { dir file }) ++ ++kernel_read_network_state(geoclue_t) ++ ++auth_read_passwd(geoclue_t) ++ ++corenet_tcp_connect_http_port(geoclue_t) ++corenet_tcp_connect_http_cache_port(geoclue_t) ++ ++corecmd_exec_bin(geoclue_t) ++ ++dev_read_urand(geoclue_t) ++ ++logging_send_syslog_msg(geoclue_t) ++ ++miscfiles_read_certs(geoclue_t) ++ ++sysnet_dns_name_resolve(geoclue_t) ++ ++optional_policy(` ++ kerberos_use(geoclue_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(geoclue_t, geoclue_exec_t) ++ ++ optional_policy(` ++ avahi_dbus_chat(geoclue_t) ++ ') ++ optional_policy(` ++ modemmanager_dbus_chat(geoclue_t) ++ ') ++ optional_policy(` ++ networkmanager_dbus_chat(geoclue_t) ++ ') ++') ++ ++optional_policy(` ++ pcscd_stream_connect(geoclue_t) ++') +diff --git a/gift.te b/gift.te +index 8a820face3..996b30c161 100644 +--- a/gift.te ++++ b/gift.te +@@ -67,17 +67,7 @@ auth_use_nsswitch(gift_t) + + userdom_dontaudit_read_user_home_content_files(gift_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(gift_t) +- fs_manage_nfs_files(gift_t) +- fs_manage_nfs_symlinks(gift_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(gift_t) +- fs_manage_cifs_files(gift_t) +- fs_manage_cifs_symlinks(gift_t) +-') ++userdom_home_manager(gift_t) + + optional_policy(` + xserver_user_x_domain_template(gift, gift_t, gift_tmpfs_t) +@@ -119,22 +109,8 @@ corenet_sendrecv_all_client_packets(giftd_t) + corenet_tcp_connect_all_ports(giftd_t) + + files_read_etc_runtime_files(giftd_t) +-files_read_usr_files(giftd_t) +- +-miscfiles_read_localization(giftd_t) + + sysnet_dns_name_resolve(giftd_t) + +-userdom_use_user_terminals(giftd_t) +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(giftd_t) +- fs_manage_nfs_files(giftd_t) +- fs_manage_nfs_symlinks(giftd_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(giftd_t) +- fs_manage_cifs_files(giftd_t) +- fs_manage_cifs_symlinks(giftd_t) +-') ++userdom_use_inherited_user_terminals(giftd_t) ++userdom_home_manager(gitd_t) +diff --git a/git.fc b/git.fc +index 24700f84ba..6561d568ed 100644 +--- a/git.fc ++++ b/git.fc +@@ -2,12 +2,12 @@ HOME_DIR/public_git(/.*)? gen_context(system_u:object_r:git_user_content_t,s0) + + /usr/libexec/git-core/git-daemon -- gen_context(system_u:object_r:gitd_exec_t,s0) + +-/var/cache/cgit(/.*)? gen_context(system_u:object_r:httpd_git_rw_content_t,s0) +-/var/cache/gitweb-caching(/.*)? gen_context(system_u:object_r:httpd_git_rw_content_t,s0) ++/var/cache/cgit(/.*)? gen_context(system_u:object_r:git_rw_content_t,s0) ++/var/cache/gitweb-caching(/.*)? gen_context(system_u:object_r:git_rw_content_t,s0) + + /var/lib/git(/.*)? gen_context(system_u:object_r:git_sys_content_t,s0) + +-/var/www/cgi-bin/cgit -- gen_context(system_u:object_r:httpd_git_script_exec_t,s0) +-/var/www/git(/.*)? gen_context(system_u:object_r:httpd_git_content_t,s0) +-/var/www/git/gitweb\.cgi -- gen_context(system_u:object_r:httpd_git_script_exec_t,s0) +-/var/www/gitweb-caching/gitweb\.cgi -- gen_context(system_u:object_r:httpd_git_script_exec_t,s0) ++/var/www/cgi-bin/cgit -- gen_context(system_u:object_r:git_script_exec_t,s0) ++/var/www/git(/.*)? gen_context(system_u:object_r:git_content_t,s0) ++/var/www/git/gitweb\.cgi -- gen_context(system_u:object_r:git_script_exec_t,s0) ++/var/www/gitweb-caching/gitweb\.cgi -- gen_context(system_u:object_r:git_script_exec_t,s0) +diff --git a/git.if b/git.if +index 1e29af1968..6c64f55c36 100644 +--- a/git.if ++++ b/git.if +@@ -37,7 +37,10 @@ template(`git_role',` + allow $2 git_user_content_t:file { exec_file_perms manage_file_perms relabel_file_perms }; + userdom_user_home_dir_filetrans($2, git_user_content_t, dir, "public_git") + +- allow $2 git_session_t:process { ptrace signal_perms }; ++ allow $2 git_session_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 git_session_t:process ptrace; ++ ') + ps_process_pattern($2, git_session_t) + + tunable_policy(`git_session_users',` +@@ -64,6 +67,7 @@ interface(`git_read_generic_sys_content_files',` + + list_dirs_pattern($1, git_sys_content_t, git_sys_content_t) + read_files_pattern($1, git_sys_content_t, git_sys_content_t) ++ read_lnk_files_pattern($1, git_sys_content_t, git_sys_content_t) + + files_search_var_lib($1) + +@@ -79,3 +83,21 @@ interface(`git_read_generic_sys_content_files',` + fs_read_nfs_files($1) + ') + ') ++ ++####################################### ++## ++## Create Git user content with a ++## named file transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`git_filetrans_user_content',` ++ gen_require(` ++ type git_user_content_t; ++ ') ++ userdom_user_home_dir_filetrans($1, git_user_content_t, dir, "public_git") ++') +diff --git a/git.te b/git.te +index dc49c715ed..43f79d6de9 100644 +--- a/git.te ++++ b/git.te +@@ -47,14 +47,6 @@ gen_tunable(git_session_bind_all_unreserved_ports, false) + ## + gen_tunable(git_session_users, false) + +-## +-##

      +-## Determine whether Git session daemons +-## can send syslog messages. +-##

      +-##
      +-gen_tunable(git_session_send_syslog_msg, false) +- + ## + ##

      + ## Determine whether Git system daemon +@@ -83,6 +75,7 @@ attribute git_daemon; + attribute_role git_session_roles; + + apache_content_template(git) ++apache_content_alias_template(git, git) + + type git_system_t, git_daemon; + type gitd_exec_t; +@@ -93,12 +86,15 @@ type git_session_t, git_daemon; + userdom_user_application_domain(git_session_t, gitd_exec_t) + role git_session_roles types git_session_t; + +-type git_sys_content_t; ++type git_sys_content_t alias git_system_content_t; + files_type(git_sys_content_t) + +-type git_user_content_t; ++type git_user_content_t alias git_session_content_t; + userdom_user_home_content(git_user_content_t) + ++type git_script_tmp_t; ++files_tmp_file(git_script_tmp_t) ++ + ######################################## + # + # Session policy +@@ -110,6 +106,8 @@ list_dirs_pattern(git_session_t, git_user_content_t, git_user_content_t) + read_files_pattern(git_session_t, git_user_content_t, git_user_content_t) + userdom_search_user_home_dirs(git_session_t) + ++kernel_read_system_state(git_session_t) ++ + corenet_all_recvfrom_netlabel(git_session_t) + corenet_all_recvfrom_unlabeled(git_session_t) + corenet_tcp_bind_generic_node(git_session_t) +@@ -130,9 +128,7 @@ tunable_policy(`git_session_bind_all_unreserved_ports',` + corenet_tcp_sendrecv_all_ports(git_session_t) + ') + +-tunable_policy(`git_session_send_syslog_msg',` +- logging_send_syslog_msg(git_session_t) +-') ++logging_send_syslog_msg(git_session_t) + + tunable_policy(`use_nfs_home_dirs',` + fs_getattr_nfs(git_session_t) +@@ -158,6 +154,9 @@ tunable_policy(`use_samba_home_dirs',` + list_dirs_pattern(git_system_t, git_sys_content_t, git_sys_content_t) + read_files_pattern(git_system_t, git_sys_content_t, git_sys_content_t) + ++kernel_read_network_state(git_system_t) ++kernel_read_system_state(git_system_t) ++ + corenet_all_recvfrom_unlabeled(git_system_t) + corenet_all_recvfrom_netlabel(git_system_t) + corenet_tcp_sendrecv_generic_if(git_system_t) +@@ -176,6 +175,10 @@ logging_send_syslog_msg(git_system_t) + + tunable_policy(`git_system_enable_homedirs',` + userdom_search_user_home_dirs(git_system_t) ++ list_dirs_pattern(git_script_t, git_user_content_t, git_user_content_t) ++ list_dirs_pattern(git_system_t, git_user_content_t, git_user_content_t) ++ read_files_pattern(git_system_t, git_user_content_t, git_user_content_t) ++ + ') + + tunable_policy(`git_system_enable_homedirs && use_nfs_home_dirs',` +@@ -215,48 +218,54 @@ tunable_policy(`git_system_use_nfs',` + # CGI policy + # + +-list_dirs_pattern(httpd_git_script_t, { git_sys_content_t git_user_content_t }, { git_sys_content_t git_user_content_t }) +-read_files_pattern(httpd_git_script_t, { git_sys_content_t git_user_content_t }, { git_sys_content_t git_user_content_t }) +-files_search_var_lib(httpd_git_script_t) ++manage_dirs_pattern(git_script_t, git_script_tmp_t, git_script_tmp_t) ++manage_files_pattern(git_script_t, git_script_tmp_t, git_script_tmp_t) ++manage_lnk_files_pattern(git_script_t, git_script_tmp_t, git_script_tmp_t) ++files_tmp_filetrans(git_script_t, git_script_tmp_t, { file dir }) + +-files_dontaudit_getattr_tmp_dirs(httpd_git_script_t) ++list_dirs_pattern(git_script_t, { git_sys_content_t git_user_content_t }, { git_sys_content_t git_user_content_t }) ++read_files_pattern(git_script_t, { git_sys_content_t git_user_content_t }, { git_sys_content_t git_user_content_t }) ++files_search_var_lib(git_script_t) ++allow git_script_t git_sys_content_t:file map; ++allow git_script_t git_user_content_t:file map; + +-auth_use_nsswitch(httpd_git_script_t) ++auth_use_nsswitch(git_script_t) + + tunable_policy(`git_cgi_enable_homedirs',` +- userdom_search_user_home_dirs(httpd_git_script_t) ++ userdom_search_user_home_dirs(git_script_t) + ') + ++fs_getattr_tmpfs(git_script_t) + tunable_policy(`git_cgi_enable_homedirs && use_nfs_home_dirs',` +- fs_getattr_nfs(httpd_git_script_t) +- fs_list_nfs(httpd_git_script_t) +- fs_read_nfs_files(httpd_git_script_t) ++ fs_getattr_nfs(git_script_t) ++ fs_list_nfs(git_script_t) ++ fs_read_nfs_files(git_script_t) + ',` +- fs_dontaudit_read_nfs_files(httpd_git_script_t) ++ fs_dontaudit_read_nfs_files(git_script_t) + ') + + tunable_policy(`git_cgi_enable_homedirs && use_samba_home_dirs',` +- fs_getattr_cifs(httpd_git_script_t) +- fs_list_cifs(httpd_git_script_t) +- fs_read_cifs_files(httpd_git_script_t) ++ fs_getattr_cifs(git_script_t) ++ fs_list_cifs(git_script_t) ++ fs_read_cifs_files(git_script_t) + ',` +- fs_dontaudit_read_cifs_files(httpd_git_script_t) ++ fs_dontaudit_read_cifs_files(git_script_t) + ') + + tunable_policy(`git_cgi_use_cifs',` +- fs_getattr_cifs(httpd_git_script_t) +- fs_list_cifs(httpd_git_script_t) +- fs_read_cifs_files(httpd_git_script_t) ++ fs_getattr_cifs(git_script_t) ++ fs_list_cifs(git_script_t) ++ fs_read_cifs_files(git_script_t) + ',` +- fs_dontaudit_read_cifs_files(httpd_git_script_t) ++ fs_dontaudit_read_cifs_files(git_script_t) + ') + + tunable_policy(`git_cgi_use_nfs',` +- fs_getattr_nfs(httpd_git_script_t) +- fs_list_nfs(httpd_git_script_t) +- fs_read_nfs_files(httpd_git_script_t) ++ fs_getattr_nfs(git_script_t) ++ fs_list_nfs(git_script_t) ++ fs_read_nfs_files(git_script_t) + ',` +- fs_dontaudit_read_nfs_files(httpd_git_script_t) ++ fs_dontaudit_read_nfs_files(git_script_t) + ') + + ######################################## +@@ -266,12 +275,9 @@ tunable_policy(`git_cgi_use_nfs',` + + allow git_daemon self:fifo_file rw_fifo_file_perms; + +-kernel_read_system_state(git_daemon) ++#kernel_read_system_state(git_daemon) + + corecmd_exec_bin(git_daemon) + +-files_read_usr_files(git_daemon) +- + fs_search_auto_mountpoints(git_daemon) + +-miscfiles_read_localization(git_daemon) +diff --git a/gitosis.te b/gitosis.te +index 582db0a2e4..d77a1a5492 100644 +--- a/gitosis.te ++++ b/gitosis.te +@@ -52,12 +52,8 @@ corecmd_exec_shell(gitosis_t) + + dev_read_urand(gitosis_t) + +-files_read_etc_files(gitosis_t) +-files_read_usr_files(gitosis_t) + files_search_var_lib(gitosis_t) + +-miscfiles_read_localization(gitosis_t) +- + sysnet_read_config(gitosis_t) + + tunable_policy(`gitosis_can_sendmail',` +diff --git a/glance.fc b/glance.fc +index c21a528b58..a746a2b16e 100644 +--- a/glance.fc ++++ b/glance.fc +@@ -1,8 +1,14 @@ + /etc/rc\.d/init\.d/openstack-glance-api -- gen_context(system_u:object_r:glance_api_initrc_exec_t,s0) + /etc/rc\.d/init\.d/openstack-glance-registry -- gen_context(system_u:object_r:glance_registry_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/openstack-glance-scrubber -- gen_context(system_u:object_r:glance_scrubber_initrc_exec_t,s0) + +-/usr/bin/glance-api -- gen_context(system_u:object_r:glance_api_exec_t,s0) ++/usr/lib/systemd/system/openstack-glance-api.* -- gen_context(system_u:object_r:glance_api_unit_file_t,s0) ++/usr/lib/systemd/system/openstack-glance-registry.* -- gen_context(system_u:object_r:glance_registry_unit_file_t,s0) ++/usr/lib/systemd/system/openstack-glance-scrubber.* -- gen_context(system_u:object_r:glance_scrubber_unit_file_t,s0) ++ ++/usr/bin/glance-api -- gen_context(system_u:object_r:glance_api_exec_t,s0) + /usr/bin/glance-registry -- gen_context(system_u:object_r:glance_registry_exec_t,s0) ++/usr/bin/glance-scrubber -- gen_context(system_u:object_r:glance_scrubber_exec_t,s0) + + /var/lib/glance(/.*)? gen_context(system_u:object_r:glance_var_lib_t,s0) + +diff --git a/glance.if b/glance.if +index 9eacb2c9c5..7b19ad2db2 100644 +--- a/glance.if ++++ b/glance.if +@@ -1,5 +1,38 @@ + ##

      OpenStack image registry and delivery service. + ++####################################### ++## ++## Creates types and rules for a basic ++## glance daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`glance_basic_types_template',` ++ gen_require(` ++ attribute glance_domain; ++ ') ++ ++ type $1_t, glance_domain; ++ type $1_exec_t; ++ ++ type $1_unit_file_t; ++ systemd_unit_file($1_unit_file_t) ++ ++ kernel_read_system_state($1_t) ++ ++ corenet_all_recvfrom_unlabeled($1_t) ++ corenet_all_recvfrom_netlabel($1_t) ++ ++ logging_send_syslog_msg($1_t) ++ ++ auth_use_nsswitch($1_t) ++ ++') ++ + ######################################## + ## + ## Execute a domain transition to +@@ -26,9 +59,9 @@ interface(`glance_domtrans_registry',` + ## run glance api. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`glance_domtrans_api',` +@@ -242,8 +275,13 @@ interface(`glance_admin',` + type glance_registry_initrc_exec_t, glance_api_initrc_exec_t; + ') + +- allow $1 { glance_api_t glance_registry_t }:process signal_perms; +- ps_process_pattern($1, { glance_api_t glance_registry_t }) ++ allow $1 glance_registry_t:process signal_perms; ++ ps_process_pattern($1, glance_registry_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 glance_registry_t:process ptrace; ++ allow $1 glance_api_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, { glance_api_initrc_exec_t glance_registry_initrc_exec_t }) + domain_system_change_exemption($1) +diff --git a/glance.te b/glance.te +index 5cd09096a8..bd3c3d21be 100644 +--- a/glance.te ++++ b/glance.te +@@ -5,10 +5,31 @@ policy_module(glance, 1.1.0) + # Declarations + # + ++## ++##

      ++## Determine whether glance-api can ++## connect to all TCP ports ++##

      ++##
      ++gen_tunable(glance_api_can_network, false) ++ ++## ++##

      ++## Allow glance domain to manage fuse files ++##

      ++##
      ++gen_tunable(glance_use_fusefs, false) ++ ++## ++##

      ++## Allow glance domain to use executable memory and executable stack ++##

      ++##
      ++gen_tunable(glance_use_execmem, false) ++ + attribute glance_domain; + +-type glance_registry_t, glance_domain; +-type glance_registry_exec_t; ++glance_basic_types_template(glance_registry) + init_daemon_domain(glance_registry_t, glance_registry_exec_t) + + type glance_registry_initrc_exec_t; +@@ -17,13 +38,21 @@ init_script_file(glance_registry_initrc_exec_t) + type glance_registry_tmp_t; + files_tmp_file(glance_registry_tmp_t) + +-type glance_api_t, glance_domain; +-type glance_api_exec_t; ++type glance_registry_tmpfs_t; ++files_tmpfs_file(glance_registry_tmpfs_t) ++ ++glance_basic_types_template(glance_api) + init_daemon_domain(glance_api_t, glance_api_exec_t) + + type glance_api_initrc_exec_t; + init_script_file(glance_api_initrc_exec_t) + ++glance_basic_types_template(glance_scrubber) ++init_daemon_domain(glance_scrubber_t, glance_scrubber_exec_t) ++ ++type glance_scrubber_initrc_exec_t; ++init_script_file(glance_scrubber_initrc_exec_t) ++ + type glance_log_t; + logging_log_file(glance_log_t) + +@@ -41,6 +70,7 @@ files_pid_file(glance_var_run_t) + # Common local policy + # + ++allow glance_domain self:process signal_perms; + allow glance_domain self:fifo_file rw_fifo_file_perms; + allow glance_domain self:unix_stream_socket create_stream_socket_perms; + allow glance_domain self:tcp_socket { accept listen }; +@@ -56,29 +86,40 @@ manage_files_pattern(glance_domain, glance_var_lib_t, glance_var_lib_t) + manage_dirs_pattern(glance_domain, glance_var_run_t, glance_var_run_t) + manage_files_pattern(glance_domain, glance_var_run_t, glance_var_run_t) + +-kernel_read_system_state(glance_domain) +- +-corenet_all_recvfrom_unlabeled(glance_domain) +-corenet_all_recvfrom_netlabel(glance_domain) + corenet_tcp_sendrecv_generic_if(glance_domain) + corenet_tcp_sendrecv_generic_node(glance_domain) + corenet_tcp_sendrecv_all_ports(glance_domain) + corenet_tcp_bind_generic_node(glance_domain) ++corenet_tcp_connect_mysqld_port(glance_domain) ++corenet_tcp_connect_http_port(glance_domain) + + corecmd_exec_bin(glance_domain) + corecmd_exec_shell(glance_domain) + + dev_read_urand(glance_domain) ++dev_read_sysfs(glance_domain) + +-files_read_etc_files(glance_domain) +-files_read_usr_files(glance_domain) ++auth_read_passwd(glance_domain) + + libs_exec_ldconfig(glance_domain) + +-miscfiles_read_localization(glance_domain) +- + sysnet_dns_name_resolve(glance_domain) + ++tunable_policy(`glance_use_fusefs',` ++ fs_manage_fusefs_dirs(glance_domain) ++ fs_manage_fusefs_files(glance_domain) ++ fs_read_fusefs_symlinks(glance_domain) ++ fs_getattr_fusefs(glance_domain) ++') ++ ++tunable_policy(`glance_use_execmem',` ++ allow glance_domain self:process { execmem execstack }; ++') ++ ++optional_policy(` ++ mysql_read_db_lnk_files(glance_domain) ++') ++ + ######################################## + # + # Registry local policy +@@ -88,8 +129,16 @@ manage_dirs_pattern(glance_registry_t, glance_registry_tmp_t, glance_registry_tm + manage_files_pattern(glance_registry_t, glance_registry_tmp_t, glance_registry_tmp_t) + files_tmp_filetrans(glance_registry_t, glance_registry_tmp_t, { dir file }) + ++manage_dirs_pattern(glance_registry_t, glance_registry_tmpfs_t, glance_registry_tmpfs_t) ++manage_files_pattern(glance_registry_t, glance_registry_tmpfs_t, glance_registry_tmpfs_t) ++fs_tmpfs_filetrans(glance_registry_t, glance_registry_tmpfs_t,{ dir file }) ++ ++corenet_tcp_bind_generic_node(glance_registry_t) + corenet_sendrecv_glance_registry_server_packets(glance_registry_t) + corenet_tcp_bind_glance_registry_port(glance_registry_t) ++corenet_tcp_connect_all_ephemeral_ports(glance_registry_t) ++ ++corenet_tcp_connect_keystone_port(glance_registry_t) + + logging_send_syslog_msg(glance_registry_t) + +@@ -108,13 +157,38 @@ manage_files_pattern(glance_api_t, glance_tmp_t, glance_tmp_t) + files_tmp_filetrans(glance_api_t, glance_tmp_t, { dir file }) + can_exec(glance_api_t, glance_tmp_t) + +-corenet_sendrecv_armtechdaemon_server_packets(glance_api_t) +-corenet_tcp_bind_armtechdaemon_port(glance_api_t) +- +-corenet_sendrecv_hplip_server_packets(glance_api_t) +-corenet_tcp_bind_hplip_port(glance_api_t) ++corenet_tcp_bind_generic_node(glance_api_t) + ++corenet_tcp_bind_glance_port(glance_api_t) + corenet_sendrecv_glance_registry_client_packets(glance_api_t) ++corenet_tcp_connect_amqp_port(glance_api_t) + corenet_tcp_connect_glance_registry_port(glance_api_t) ++corenet_tcp_connect_mysqld_port(glance_api_t) ++corenet_tcp_connect_http_port(glance_api_t) ++ ++corenet_tcp_connect_all_ephemeral_ports(glance_api_t) ++corenet_tcp_connect_commplex_main_port(glance_api_t) ++corenet_tcp_connect_http_cache_port(glance_api_t) ++ ++corenet_sendrecv_hplip_server_packets(glance_api_t) ++corenet_tcp_bind_hplip_port(glance_api_t) + + fs_getattr_xattr_fs(glance_api_t) ++ ++tunable_policy(`glance_api_can_network',` ++ corenet_sendrecv_all_client_packets(glance_api_t) ++ corenet_tcp_connect_all_ports(glance_api_t) ++ corenet_tcp_sendrecv_all_ports(glance_api_t) ++') ++ ++optional_policy(` ++ mysql_stream_connect(glance_api_t) ++') ++ ++######################################## ++# ++# Scrubber local policy ++# ++ ++corenet_tcp_connect_commplex_main_port(glance_scrubber_t) ++corenet_tcp_connect_glance_registry_port(glance_scrubber_t) +diff --git a/glusterd.fc b/glusterd.fc +new file mode 100644 +index 0000000000..9806f50ae1 +--- /dev/null ++++ b/glusterd.fc +@@ -0,0 +1,25 @@ ++/etc/rc\.d/init\.d/gluster.* -- gen_context(system_u:object_r:glusterd_initrc_exec_t,s0) ++ ++/etc/glusterfs(/.*)? gen_context(system_u:object_r:glusterd_conf_t,s0) ++/etc/glusterd(/.*)? gen_context(system_u:object_r:glusterd_conf_t,s0) ++ ++/usr/sbin/glusterd -- gen_context(system_u:object_r:glusterd_initrc_exec_t,s0) ++/usr/sbin/glusterfsd -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++ ++/usr/sbin/glustereventsd -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++/usr/sbin/gluster-eventsapi -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++ ++ ++/usr/libexec/glusterfs/peer_eventsapi.py -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++/usr/libexec/glusterfs/events/glustereventsd.py -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++ ++/opt/glusterfs/[^/]+/sbin/glusterfsd -- gen_context(system_u:object_r:glusterd_exec_t,s0) ++ ++/var/lib/glusterd(/.*)? gen_context(system_u:object_r:glusterd_var_lib_t,s0) ++ ++/var/log/glusterfs(/.*)? gen_context(system_u:object_r:glusterd_log_t,s0) ++ ++/var/run/gluster(/.*)? gen_context(system_u:object_r:glusterd_var_run_t,s0) ++/var/run/glusterd(/.*)? gen_context(system_u:object_r:glusterd_var_run_t,s0) ++/var/run/glusterd.* -- gen_context(system_u:object_r:glusterd_var_run_t,s0) ++/var/run/glusterd.* -s gen_context(system_u:object_r:glusterd_var_run_t,s0) +diff --git a/glusterd.if b/glusterd.if +new file mode 100644 +index 0000000000..4501460189 +--- /dev/null ++++ b/glusterd.if +@@ -0,0 +1,302 @@ ++ ++## policy for glusterd ++ ++ ++######################################## ++## ++## Transition to glusterd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`glusterd_domtrans',` ++ gen_require(` ++ type glusterd_t, glusterd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, glusterd_exec_t, glusterd_t) ++') ++ ++ ++######################################## ++## ++## Execute glusterd server in the glusterd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_initrc_domtrans',` ++ gen_require(` ++ type glusterd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, glusterd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Read glusterd's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`glusterd_read_log',` ++ gen_require(` ++ type glusterd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, glusterd_log_t, glusterd_log_t) ++') ++ ++######################################## ++## ++## Append to glusterd log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_append_log',` ++ gen_require(` ++ type glusterd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, glusterd_log_t, glusterd_log_t) ++') ++ ++####################################### ++## ++## Transition content labels to glusterd named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_filetrans_named_pid',` ++ gen_require(` ++ type glusterd_var_run_t; ++ ') ++ files_pid_filetrans($1, glusterd_var_run_t , sock_file, "glusterd.socket") ++') ++ ++######################################## ++## ++## Manage glusterd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_manage_pid',` ++ gen_require(` ++ type glusterd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_dirs_pattern($1, glusterd_var_run_t, glusterd_var_run_t) ++ manage_files_pattern($1, glusterd_var_run_t, glusterd_var_run_t) ++') ++ ++######################################## ++## ++## Manage glusterd log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_manage_log',` ++ gen_require(` ++ type glusterd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, glusterd_log_t, glusterd_log_t) ++ manage_files_pattern($1, glusterd_log_t, glusterd_log_t) ++ manage_lnk_files_pattern($1, glusterd_log_t, glusterd_log_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to execute gluster's lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gluster_execute_lib',` ++ gen_require(` ++ type glusterd_var_lib_t; ++ ') ++ ++ files_list_var_lib($1) ++ allow $1 glusterd_var_lib_t:dir search_dir_perms; ++ can_exec($1, glusterd_var_lib_t) ++') ++ ++###################################### ++## ++## Read glusterd's config files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_read_conf',` ++ gen_require(` ++ type glusterd_conf_t; ++ ') ++ ++ files_search_etc($1) ++ read_files_pattern($1, glusterd_conf_t, glusterd_conf_t) ++') ++ ++###################################### ++## ++## Dontaudit Read /var/lib/glusterd files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_dontaudit_read_lib_dirs',` ++ gen_require(` ++ type glusterd_var_lib_t; ++ ') ++ ++ dontaudit $1 glusterd_var_lib_t:dir list_dir_perms; ++') ++ ++###################################### ++## ++## Read and write /var/lib/glusterd files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_rw_lib',` ++ gen_require(` ++ type glusterd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ rw_files_pattern($1, glusterd_var_lib_t, glusterd_var_lib_t) ++') ++ ++###################################### ++## ++## Read /var/lib/glusterd files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_read_lib_files',` ++ gen_require(` ++ type glusterd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 glusterd_var_lib_t:dir search_dir_perms; ++ read_files_pattern($1, glusterd_var_lib_t, glusterd_var_lib_t) ++') ++ ++###################################### ++## ++## Read and write /var/lib/glusterd files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`glusterd_manage_lib_files',` ++ gen_require(` ++ type glusterd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 glusterd_var_lib_t:dir search_dir_perms; ++ manage_files_pattern($1, glusterd_var_lib_t, glusterd_var_lib_t) ++') ++ ++###################################### ++## ++## All of the rules required to administrate ++## an glusterd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`glusterd_admin',` ++ gen_require(` ++ type glusterd_t; ++ type glusterd_initrc_exec_t; ++ type glusterd_log_t; ++ type glusterd_tmp_t; ++ type glusterd_conf_t; ++ ') ++ ++ allow $1 glusterd_t:process { signal_perms }; ++ ps_process_pattern($1, glusterd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 glusterd_t:process ptrace; ++ ') ++ ++ glusterd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 glusterd_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_search_logs($1) ++ admin_pattern($1, glusterd_log_t) ++ ++ admin_pattern($1, glusterd_tmp_t) ++ ++ admin_pattern($1, glusterd_conf_t) ++ ++') ++ +diff --git a/glusterd.te b/glusterd.te +new file mode 100644 +index 0000000000..382d67a996 +--- /dev/null ++++ b/glusterd.te +@@ -0,0 +1,333 @@ ++policy_module(glusterd, 1.1.2) ++ ++## ++##

      ++## Allow glusterfsd to modify public files used for public file ++## transfer services. Files/Directories must be labeled ++## public_content_rw_t. ++##

      ++##
      ++gen_tunable(gluster_anon_write, false) ++ ++## ++##

      ++## Allow glusterfsd to share any file/directory read only. ++##

      ++##
      ++gen_tunable(gluster_export_all_ro, false) ++ ++## ++##

      ++## Allow glusterfsd to share any file/directory read/write. ++##

      ++##
      ++gen_tunable(gluster_export_all_rw, true) ++ ++## ++##

      ++## Allow glusterd_t domain to use executable memory ++##

      ++##
      ++gen_tunable(gluster_use_execmem, false) ++ ++######################################## ++# ++# Declarations ++# ++ ++type glusterd_t; ++type glusterd_exec_t; ++init_daemon_domain(glusterd_t, glusterd_exec_t) ++domain_obj_id_change_exemption(glusterd_t) ++ ++type glusterd_conf_t; ++files_type(glusterd_conf_t) ++ ++type glusterd_initrc_exec_t; ++init_script_file(glusterd_initrc_exec_t) ++ ++type glusterd_tmp_t; ++files_tmp_file(glusterd_tmp_t) ++ ++type glusterd_tmpfs_t; ++files_tmpfs_file(glusterd_tmpfs_t) ++ ++type glusterd_log_t; ++logging_log_file(glusterd_log_t) ++ ++type glusterd_var_run_t; ++files_pid_file(glusterd_var_run_t) ++ ++type glusterd_var_lib_t; ++files_type(glusterd_var_lib_t) ++ ++type glusterd_brick_t; ++files_type(glusterd_brick_t) ++ ++######################################## ++# ++# Local policy ++# ++ ++allow glusterd_t self:capability { sys_admin sys_resource sys_ptrace dac_override chown dac_read_search fowner fsetid ipc_lock kill setgid setuid net_admin mknod net_raw }; ++ ++allow glusterd_t self:capability2 block_suspend; ++allow glusterd_t self:process { getcap setcap setpgid setrlimit signal_perms setsched getsched setfscreate}; ++allow glusterd_t self:sem create_sem_perms; ++allow glusterd_t self:fifo_file rw_fifo_file_perms; ++allow glusterd_t self:tcp_socket { accept listen }; ++allow glusterd_t self:unix_stream_socket { accept listen connectto }; ++allow glusterd_t self:rawip_socket create_socket_perms; ++allow glusterd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(glusterd_t, glusterd_conf_t, glusterd_conf_t) ++manage_files_pattern(glusterd_t, glusterd_conf_t, glusterd_conf_t) ++files_etc_filetrans(glusterd_t, glusterd_conf_t, { dir file }, "glusterfs") ++ ++manage_dirs_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) ++manage_files_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) ++manage_sock_files_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) ++files_tmp_filetrans(glusterd_t, glusterd_tmp_t, { dir file sock_file }) ++allow glusterd_t glusterd_tmp_t:dir mounton; ++ ++manage_dirs_pattern(glusterd_t, glusterd_tmpfs_t, glusterd_tmpfs_t) ++manage_files_pattern(glusterd_t, glusterd_tmpfs_t, glusterd_tmpfs_t) ++fs_tmpfs_filetrans(glusterd_t, glusterd_tmpfs_t, { dir file }) ++ ++manage_dirs_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) ++manage_files_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) ++logging_log_filetrans(glusterd_t, glusterd_log_t, { file dir }) ++ ++manage_dirs_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) ++manage_files_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) ++manage_sock_files_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) ++files_pid_filetrans(glusterd_t, glusterd_var_run_t, { dir file sock_file }) ++ ++manage_dirs_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) ++manage_files_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) ++manage_sock_files_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) ++files_var_lib_filetrans(glusterd_t, glusterd_var_lib_t, dir) ++relabel_files_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) ++ ++manage_dirs_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_fifo_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_lnk_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_blk_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_chr_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++manage_sock_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++relabel_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++relabel_lnk_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++relabel_dirs_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++relabel_chr_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++relabel_blk_files_pattern(glusterd_t, glusterd_brick_t, glusterd_brick_t) ++ ++can_exec(glusterd_t, glusterd_exec_t) ++ ++kernel_read_system_state(glusterd_t) ++kernel_read_network_state(glusterd_t) ++kernel_read_net_sysctls(glusterd_t) ++kernel_request_load_module(glusterd_t) ++ ++corecmd_exec_bin(glusterd_t) ++corecmd_exec_shell(glusterd_t) ++ ++corenet_all_recvfrom_unlabeled(glusterd_t) ++corenet_all_recvfrom_netlabel(glusterd_t) ++corenet_tcp_sendrecv_generic_if(glusterd_t) ++corenet_udp_sendrecv_generic_if(glusterd_t) ++corenet_tcp_sendrecv_generic_node(glusterd_t) ++corenet_udp_sendrecv_generic_node(glusterd_t) ++corenet_tcp_sendrecv_all_ports(glusterd_t) ++corenet_udp_sendrecv_all_ports(glusterd_t) ++corenet_tcp_bind_generic_node(glusterd_t) ++corenet_udp_bind_generic_node(glusterd_t) ++corenet_raw_bind_generic_node(glusterd_t) ++ ++corenet_tcp_connect_gluster_port(glusterd_t) ++corenet_tcp_bind_gluster_port(glusterd_t) ++corenet_udp_bind_gluster_port(glusterd_t) ++ ++# replacement for rpc.mountd ++corenet_sendrecv_all_server_packets(glusterd_t) ++corenet_tcp_bind_all_reserved_ports(glusterd_t) ++corenet_udp_bind_all_rpc_ports(glusterd_t) ++corenet_tcp_bind_all_rpc_ports(glusterd_t) ++corenet_tcp_bind_nfs_port(glusterd_t) ++corenet_udp_bind_nfs_port(glusterd_t) ++corenet_udp_bind_mountd_port(glusterd_t) ++corenet_tcp_bind_mountd_port(glusterd_t) ++corenet_udp_bind_ipp_port(glusterd_t) ++ ++corenet_sendrecv_all_client_packets(glusterd_t) ++corenet_tcp_bind_all_unreserved_ports(glusterd_t) ++corenet_tcp_connect_all_unreserved_ports(glusterd_t) ++corenet_tcp_connect_all_ephemeral_ports(glusterd_t) ++corenet_tcp_connect_ssh_port(glusterd_t) ++corenet_tcp_connect_all_rpc_ports(glusterd_t) ++corenet_tcp_connect_all_ports(glusterd_t) ++ ++dev_read_sysfs(glusterd_t) ++dev_read_urand(glusterd_t) ++dev_read_rand(glusterd_t) ++dev_rw_infiniband_dev(glusterd_t) ++ ++domain_read_all_domains_state(glusterd_t) ++domain_getattr_all_sockets(glusterd_t) ++ ++domain_use_interactive_fds(glusterd_t) ++ ++fs_mount_all_fs(glusterd_t) ++fs_unmount_all_fs(glusterd_t) ++fs_getattr_all_fs(glusterd_t) ++fs_getattr_all_dirs(glusterd_t) ++ ++files_mounton_non_security(glusterd_t) ++ ++files_dontaudit_read_security_files(glusterd_t) ++files_dontaudit_list_security_dirs(glusterd_t) ++ ++storage_rw_fuse(glusterd_t) ++#needed by /usr/sbin/xfs_db ++storage_raw_read_fixed_disk(glusterd_t) ++storage_raw_write_fixed_disk(glusterd_t) ++ ++auth_use_nsswitch(glusterd_t) ++ ++fs_getattr_all_fs(glusterd_t) ++ ++init_domtrans_script(glusterd_t) ++init_initrc_domain(glusterd_t) ++init_read_script_state(glusterd_t) ++init_rw_script_tmp_files(glusterd_t) ++init_manage_script_status_files(glusterd_t) ++init_status(glusterd_t) ++init_stop_transient_unit(glusterd_t) ++ ++systemd_config_systemd_services(glusterd_t) ++systemd_signal_passwd_agent(glusterd_t) ++ ++logging_send_syslog_msg(glusterd_t) ++logging_dontaudit_search_audit_logs(glusterd_t) ++ ++libs_exec_ldconfig(glusterd_t) ++ ++miscfiles_read_localization(glusterd_t) ++miscfiles_read_public_files(glusterd_t) ++ ++userdom_manage_user_home_dirs(glusterd_t) ++userdom_filetrans_home_content(glusterd_t) ++userdom_read_user_tmp_files(glusterd_t) ++userdom_delete_user_tmp_files(glusterd_t) ++userdom_rw_user_tmp_files(glusterd_t) ++userdom_map_tmp_files(glusterd_t) ++userdom_kill_all_users(glusterd_t) ++userdom_signal_unpriv_users(glusterd_t) ++ ++mount_domtrans(glusterd_t) ++ ++fstools_domtrans(glusterd_t) ++ ++tunable_policy(`gluster_anon_write',` ++ miscfiles_manage_public_files(glusterd_t) ++') ++ ++tunable_policy(`gluster_export_all_ro',` ++ fs_read_noxattr_fs_files(glusterd_t) ++ files_read_non_security_files(glusterd_t) ++ files_getattr_all_pipes(glusterd_t) ++ files_getattr_all_sockets(glusterd_t) ++') ++ ++tunable_policy(`gluster_export_all_rw',` ++ fs_manage_noxattr_fs_files(glusterd_t) ++ files_manage_non_security_dirs(glusterd_t) ++ files_manage_non_security_files(glusterd_t) ++ files_relabel_base_file_types(glusterd_t) ++ files_getattr_all_pipes(glusterd_t) ++ files_getattr_all_sockets(glusterd_t) ++ files_map_non_security_files(glusterd_t) ++') ++ ++tunable_policy(`gluster_use_execmem',` ++ allow glusterd_t self:process { execmem }; ++') ++ ++optional_policy(` ++ ctdbd_domtrans(glusterd_t) ++ ctdbd_signal(glusterd_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(glusterd_t) ++ dbus_connect_system_bus(glusterd_t) ++ unconfined_dbus_chat(glusterd_t) ++ ++ optional_policy(` ++ policykit_dbus_chat(glusterd_t) ++ ') ++') ++ ++optional_policy(` ++ ganesha_systemctl(glusterd_t) ++ ganesha_dbus_chat(glusterd_t) ++') ++ ++optional_policy(` ++ hostname_exec(glusterd_t) ++') ++ ++ ++optional_policy(` ++ kerberos_read_keytab(glusterd_t) ++') ++ ++optional_policy(` ++ lvm_domtrans(glusterd_t) ++') ++ ++optional_policy(` ++ mount_domtrans_showmount(glusterd_t) ++') ++ ++optional_policy(` ++ samba_domtrans_smbd(glusterd_t) ++ samba_systemctl(glusterd_t) ++ samba_signal_smbd(glusterd_t) ++ samba_manage_config(glusterd_t) ++') ++ ++optional_policy(` ++ ssh_exec_keygen(glusterd_t) ++') ++ ++optional_policy(` ++ rpc_domtrans_rpcd(glusterd_t) ++ rpc_kill_rpcd(glusterd_t) ++') ++ ++optional_policy(` ++ rsync_exec(glusterd_t) ++') ++ ++optional_policy(` ++ rpc_systemctl_nfsd(glusterd_t) ++ rpc_systemctl_rpcd(glusterd_t) ++ ++ rpc_domtrans_nfsd(glusterd_t) ++ rpc_domtrans_rpcd(glusterd_t) ++ rpc_manage_nfs_state_data(glusterd_t) ++ rpc_manage_nfs_state_data_dir(glusterd_t) ++ rpcbind_stream_connect(glusterd_t) ++') ++ ++optional_policy(` ++ rhcs_dbus_chat_cluster(glusterd_t) ++ rhcs_domtrans_cluster(glusterd_t) ++ rhcs_systemctl_cluster(glusterd_t) ++ rhcs_stream_connect_cluster(glusterd_t) ++') ++ ++optional_policy(` ++ ssh_exec(glusterd_t) ++') +diff --git a/glusterfs.fc b/glusterfs.fc +deleted file mode 100644 +index 4bd6ade465..0000000000 +--- a/glusterfs.fc ++++ /dev/null +@@ -1,16 +0,0 @@ +-/etc/rc\.d/init\.d/gluster.* -- gen_context(system_u:object_r:glusterd_initrc_exec_t,s0) +- +-/etc/glusterfs(/.*)? gen_context(system_u:object_r:glusterd_conf_t,s0) +-/etc/glusterd(/.*)? gen_context(system_u:object_r:glusterd_conf_t,s0) +- +-/usr/sbin/glusterd -- gen_context(system_u:object_r:glusterd_initrc_exec_t,s0) +-/usr/sbin/glusterfsd -- gen_context(system_u:object_r:glusterd_exec_t,s0) +- +-/opt/glusterfs/[^/]+/sbin/glusterfsd -- gen_context(system_u:object_r:glusterd_exec_t,s0) +- +-/var/lib/gluster.* gen_context(system_u:object_r:glusterd_var_lib_t,s0) +- +-/var/log/glusterfs(/.*)? gen_context(system_u:object_r:glusterd_log_t,s0) +- +-/var/run/glusterd(/.*)? gen_context(system_u:object_r:glusterd_var_run_t,s0) +-/var/run/glusterd\.pid -- gen_context(system_u:object_r:glusterd_var_run_t,s0) +diff --git a/glusterfs.if b/glusterfs.if +deleted file mode 100644 +index 05233c86ed..0000000000 +--- a/glusterfs.if ++++ /dev/null +@@ -1,71 +0,0 @@ +-## Cluster File System binary, daemon and command line. +- +-######################################## +-## +-## All of the rules required to +-## administrate an glusterfs environment. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-# +-interface(`glusterd_admin',` +- refpolicywarn(`$0($*) has been deprecated, use glusterfs_admin() instead.') +- glusterfs_admin($1, $2) +-') +- +-######################################## +-## +-## All of the rules required to +-## administrate an glusterfs environment. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-# +-interface(`glusterfs_admin',` +- gen_require(` +- type glusterd_t, glusterd_initrc_exec_t, glusterd_log_t; +- type glusterd_tmp_t, glusterd_conf_t, glusterd_var_lib_t; +- type glusterd_var_run_t; +- ') +- +- init_labeled_script_domtrans($1, glusterd_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 glusterd_initrc_exec_t system_r; +- allow $2 system_r; +- +- allow $1 glusterd_t:process { ptrace signal_perms }; +- ps_process_pattern($1, glusterd_t) +- +- files_search_etc($1) +- admin_pattern($1, glusterd_conf_t) +- +- logging_search_logs($1) +- admin_pattern($1, glusterd_log_t) +- +- files_search_tmp($1) +- admin_pattern($1, glusterd_tmp_t) +- +- files_search_var_lib($1) +- admin_pattern($1, glusterd_var_lib_t) +- +- files_search_pids($1) +- admin_pattern($1, glusterd_var_run_t) +-') +diff --git a/glusterfs.te b/glusterfs.te +deleted file mode 100644 +index 4e95c7e2f4..0000000000 +--- a/glusterfs.te ++++ /dev/null +@@ -1,105 +0,0 @@ +-policy_module(glusterfs, 1.1.2) +- +-######################################## +-# +-# Declarations +-# +- +-type glusterd_t; +-type glusterd_exec_t; +-init_daemon_domain(glusterd_t, glusterd_exec_t) +- +-type glusterd_conf_t; +-files_type(glusterd_conf_t) +- +-type glusterd_initrc_exec_t; +-init_script_file(glusterd_initrc_exec_t) +- +-type glusterd_tmp_t; +-files_tmp_file(glusterd_tmp_t) +- +-type glusterd_log_t; +-logging_log_file(glusterd_log_t) +- +-type glusterd_var_run_t; +-files_pid_file(glusterd_var_run_t) +- +-type glusterd_var_lib_t; +-files_type(glusterd_var_lib_t) +- +-######################################## +-# +-# Local policy +-# +- +-allow glusterd_t self:capability { sys_admin sys_resource dac_override chown dac_read_search fowner }; +-allow glusterd_t self:process { setrlimit signal }; +-allow glusterd_t self:fifo_file rw_fifo_file_perms; +-allow glusterd_t self:tcp_socket { accept listen }; +-allow glusterd_t self:unix_stream_socket { accept listen }; +- +-manage_dirs_pattern(glusterd_t, glusterd_conf_t, glusterd_conf_t) +-manage_files_pattern(glusterd_t, glusterd_conf_t, glusterd_conf_t) +-files_etc_filetrans(glusterd_t, glusterd_conf_t, dir) +- +-manage_dirs_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) +-manage_files_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) +-manage_sock_files_pattern(glusterd_t, glusterd_tmp_t, glusterd_tmp_t) +-files_tmp_filetrans(glusterd_t, glusterd_tmp_t, { dir file sock_file }) +- +-manage_dirs_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) +-append_files_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) +-create_files_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) +-setattr_files_pattern(glusterd_t, glusterd_log_t, glusterd_log_t) +-logging_log_filetrans(glusterd_t, glusterd_log_t, dir) +- +-manage_dirs_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) +-manage_files_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) +-manage_sock_files_pattern(glusterd_t, glusterd_var_run_t, glusterd_var_run_t) +-files_pid_filetrans(glusterd_t, glusterd_var_run_t, { dir file sock_file }) +- +-manage_dirs_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) +-manage_files_pattern(glusterd_t, glusterd_var_lib_t, glusterd_var_lib_t) +-files_var_lib_filetrans(glusterd_t, glusterd_var_lib_t, dir) +- +-can_exec(glusterd_t, glusterd_exec_t) +- +-kernel_read_system_state(glusterd_t) +- +-corecmd_exec_bin(glusterd_t) +-corecmd_exec_shell(glusterd_t) +- +-corenet_all_recvfrom_unlabeled(glusterd_t) +-corenet_all_recvfrom_netlabel(glusterd_t) +-corenet_tcp_sendrecv_generic_if(glusterd_t) +-corenet_udp_sendrecv_generic_if(glusterd_t) +-corenet_tcp_sendrecv_generic_node(glusterd_t) +-corenet_udp_sendrecv_generic_node(glusterd_t) +-corenet_tcp_sendrecv_all_ports(glusterd_t) +-corenet_udp_sendrecv_all_ports(glusterd_t) +-corenet_tcp_bind_generic_node(glusterd_t) +-corenet_udp_bind_generic_node(glusterd_t) +- +-# Too coarse? +-corenet_sendrecv_all_server_packets(glusterd_t) +-corenet_tcp_bind_all_reserved_ports(glusterd_t) +-corenet_udp_bind_all_rpc_ports(glusterd_t) +-corenet_udp_bind_ipp_port(glusterd_t) +- +-corenet_sendrecv_all_client_packets(glusterd_t) +-corenet_tcp_connect_all_unreserved_ports(glusterd_t) +- +-dev_read_sysfs(glusterd_t) +-dev_read_urand(glusterd_t) +- +-domain_read_all_domains_state(glusterd_t) +- +-domain_use_interactive_fds(glusterd_t) +- +-files_read_usr_files(glusterd_t) +- +-auth_use_nsswitch(glusterd_t) +- +-logging_send_syslog_msg(glusterd_t) +- +-miscfiles_read_localization(glusterd_t) +diff --git a/gnome.fc b/gnome.fc +index e39de436a2..5edcb8330a 100644 +--- a/gnome.fc ++++ b/gnome.fc +@@ -1,15 +1,60 @@ +-HOME_DIR/\.gconf(/.*)? gen_context(system_u:object_r:gconf_home_t,s0) +-HOME_DIR/\.gconfd(/.*)? gen_context(system_u:object_r:gconf_home_t,s0) +-HOME_DIR/\.gnome(/.*)? gen_context(system_u:object_r:gnome_home_t,s0) +-HOME_DIR/\.gnome2(/.*)? gen_context(system_u:object_r:gnome_home_t,s0) +-HOME_DIR/\.gnome2/keyrings(/.*)? gen_context(system_u:object_r:gnome_keyring_home_t,s0) +-HOME_DIR/\.gnome2_private(/.*)? gen_context(system_u:object_r:gnome_home_t,s0) ++HOME_DIR/\.cache(/.*)? gen_context(system_u:object_r:cache_home_t,s0) ++HOME_DIR/\.cache/dconf(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++HOME_DIR/\.color/icc(/.*)? gen_context(system_u:object_r:icc_data_home_t,s0) ++HOME_DIR/\.dbus(/.*)? gen_context(system_u:object_r:dbus_home_t,s0) ++HOME_DIR/\.config(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++HOME_DIR/\.kde(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++HOME_DIR/\.nv(/.*)? gen_context(system_u:object_r:cache_home_t,s0) ++HOME_DIR/\.nv/GLCache(/.*)? gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.gconf(d)?(/.*)? gen_context(system_u:object_r:gconf_home_t,s0) ++HOME_DIR/\.gnome2(/.*)? gen_context(system_u:object_r:gnome_home_t,s0) ++HOME_DIR/\.gnome2/keyrings(/.*)? gen_context(system_u:object_r:gkeyringd_gnome_home_t,s0) ++HOME_DIR/\.grl-metadata-store gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.grl-bookmarks gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.gstreamer-.* gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.cache/gstreamer-.* gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.cache/GLCache(/.*)? gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.orc(/.*)? gen_context(system_u:object_r:gstreamer_home_t,s0) ++HOME_DIR/\.local.* gen_context(system_u:object_r:gconf_home_t,s0) ++HOME_DIR/\.local/share(/.*)? gen_context(system_u:object_r:data_home_t,s0) ++HOME_DIR/\.local/share/icc(/.*)? gen_context(system_u:object_r:icc_data_home_t,s0) ++HOME_DIR/\.local/share/keyrings(/.*)? gen_context(system_u:object_r:gkeyringd_gnome_home_t,s0) ++HOME_DIR/\.Xdefaults gen_context(system_u:object_r:config_home_t,s0) ++HOME_DIR/\.xine(/.*)? gen_context(system_u:object_r:config_home_t,s0) + +-/etc/gconf(/.*)? gen_context(system_u:object_r:gconf_etc_t,s0) ++/var/run/user/[^/]*/\.orc(/.*)? gen_context(system_u:object_r:gstreamer_home_t,s0) ++/var/run/user/[^/]*/dconf(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++/var/run/user/[^/]*/keyring.* gen_context(system_u:object_r:gkeyringd_tmp_t,s0) ++ ++/root/\.cache(/.*)? gen_context(system_u:object_r:cache_home_t,s0) ++/root/\.color/icc(/.*)? gen_context(system_u:object_r:icc_data_home_t,s0) ++/root/\.config(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++/root/\.kde(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++/root/\.gconf(d)?(/.*)? gen_context(system_u:object_r:gconf_home_t,s0) ++/root/\.dbus(/.*)? gen_context(system_u:object_r:dbus_home_t,s0) ++/root/\.gnome2(/.*)? gen_context(system_u:object_r:gnome_home_t,s0) ++/root/\.gnome2/keyrings(/.*)? gen_context(system_u:object_r:gkeyringd_gnome_home_t,s0) ++/root/\.gstreamer-.* gen_context(system_u:object_r:gstreamer_home_t,s0) ++/root/\.cache/gstreamer-.* gen_context(system_u:object_r:gstreamer_home_t,s0) ++/root/\.local.* gen_context(system_u:object_r:gconf_home_t,s0) ++/root/\.local/share(/.*)? gen_context(system_u:object_r:data_home_t,s0) ++/root/\.local/share/icc(/.*)? gen_context(system_u:object_r:icc_data_home_t,s0) ++/root/\.Xdefaults gen_context(system_u:object_r:config_home_t,s0) ++/root/\.xine(/.*)? gen_context(system_u:object_r:config_home_t,s0) ++ ++/etc/gconf(/.*)? gen_context(system_u:object_r:gconf_etc_t,s0) + + /tmp/gconfd-USER/.* -- gen_context(system_u:object_r:gconf_tmp_t,s0) + ++/usr/share/config(/.*)? gen_context(system_u:object_r:config_usr_t,s0) ++ + /usr/bin/gnome-keyring-daemon -- gen_context(system_u:object_r:gkeyringd_exec_t,s0) ++/usr/bin/mate-keyring-daemon -- gen_context(system_u:object_r:gkeyringd_exec_t,s0) ++ ++# Don't use because toolchain is broken ++#/usr/libexec/gconfd-2 -- gen_context(system_u:object_r:gconfd_exec_t,s0) ++ ++/usr/libexec/gconf-defaults-mechanism -- gen_context(system_u:object_r:gconfdefaultsm_exec_t,s0) + +-/usr/lib/[^/]*/gconf/gconfd-2 -- gen_context(system_u:object_r:gconfd_exec_t,s0) +-/usr/libexec/gconfd-2 -- gen_context(system_u:object_r:gconfd_exec_t,s0) ++/usr/libexec/gnome-system-monitor-mechanism -- gen_context(system_u:object_r:gnomesystemmm_exec_t,s0) ++/usr/libexec/kde(3|4)/ksysguardprocesslist_helper -- gen_context(system_u:object_r:gnomesystemmm_exec_t,s0) +diff --git a/gnome.if b/gnome.if +index ab09d61950..898f4262a2 100644 +--- a/gnome.if ++++ b/gnome.if +@@ -1,52 +1,76 @@ +-## GNU network object model environment. ++## GNU network object model environment (GNOME) + +-######################################## ++####################################### + ## +-## Role access for gnome. (Deprecated) ++## Role access for gnome. (Deprecated) + ## + ## +-## +-## Role allowed access. +-## ++## ++## Role allowed access. ++## + ## + ## +-## +-## User domain for the role. +-## ++## ++## User domain for the role. ++## + ## + # + interface(`gnome_role',` +- refpolicywarn(`$0($*) has been deprecated') ++ refpolicywarn(`$0($*) has been deprecated') ++ ') ++ ++###################################### ++## ++## The role template for the gnome-keyring-daemon. ++## ++## ++## ++## The user prefix. ++## ++## ++## ++## ++## The user role. ++## ++## ++## ++## ++## The user domain associated with the role. ++## ++## ++# ++interface(`gnome_role_gkeyringd',` ++ refpolicywarn(`$0($*) has been deprecated') + ') + +-####################################### ++###################################### + ## +-## The role template for gnome. ++## The role template for gnome. + ## + ## +-## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). +-## ++## ++## The prefix of the user domain (e.g., user ++## is the prefix for user_t). ++## + ## + ## +-## +-## The role associated with the user domain. +-## ++## ++## The role associated with the user domain. ++## + ## + ## +-## +-## The type of the user domain. +-## ++## ++## The type of the user domain. ++## + ## + # + template(`gnome_role_template',` +- gen_require(` +- attribute gnomedomain, gkeyringd_domain; ++ gen_require(` ++ attribute gnomedomain, gkeyringd_domain, gnome_home_type; + attribute_role gconfd_roles; +- type gkeyringd_exec_t, gnome_keyring_home_t, gnome_keyring_tmp_t; ++ type gkeyringd_exec_t, gkeyringd_tmp_t; + type gconfd_t, gconfd_exec_t, gconf_tmp_t; +- type gconf_home_t; ++ class dbus all_dbus_perms; + ') + + ######################################## +@@ -74,52 +98,112 @@ template(`gnome_role_template',` + + domtrans_pattern($3, gconfd_exec_t, gconfd_t) + +- allow $3 { gconf_home_t gconf_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 { gconf_home_t gconf_tmp_t }:file { manage_file_perms relabel_file_perms }; +- userdom_user_home_dir_filetrans($3, gconf_home_t, dir, ".gconf") +- userdom_user_home_dir_filetrans($3, gconf_home_t, dir, ".gconfd") +- +- allow $3 gconfd_t:process { ptrace signal_perms }; ++ allow $3 gconfd_t:process { signal_perms }; ++ allow $3 gconfd_t:unix_stream_socket connectto; + ps_process_pattern($3, gconfd_t) + ++ + ######################################## + # + # Gkeyringd policy + # + ++ allow $1_gkeyringd_t $3:unix_stream_socket { connectto create_stream_socket_perms }; ++ + domtrans_pattern($3, gkeyringd_exec_t, $1_gkeyringd_t) + +- allow $3 { gnome_home_t gnome_keyring_home_t gnome_keyring_tmp_t }:dir { relabel_dir_perms manage_dir_perms }; +- allow $3 { gnome_home_t gnome_keyring_home_t }:file { relabel_file_perms manage_file_perms }; ++ allow $3 { gnome_home_type gkeyringd_tmp_t gconf_tmp_t }:dir { relabel_dir_perms manage_dir_perms }; ++ allow $3 { gnome_home_type gkeyringd_tmp_t gconf_tmp_t }:file { relabel_file_perms manage_file_perms }; + +- userdom_user_home_dir_filetrans($3, gnome_home_t, dir, ".gnome") +- userdom_user_home_dir_filetrans($3, gnome_home_t, dir, ".gnome2") +- userdom_user_home_dir_filetrans($3, gnome_home_t, dir, ".gnome2_private") +- +- gnome_home_filetrans($3, gnome_keyring_home_t, dir, "keyrings") ++ userdom_home_manager($1_gkeyringd_t) + +- allow $3 gnome_keyring_tmp_t:sock_file { relabel_sock_file_perms manage_sock_file_perms }; ++ allow $3 gkeyringd_tmp_t:sock_file { relabel_sock_file_perms manage_sock_file_perms }; + + ps_process_pattern($3, $1_gkeyringd_t) +- allow $3 $1_gkeyringd_t:process { ptrace signal_perms }; ++ allow $3 $1_gkeyringd_t:process signal_perms; ++ dontaudit $3 gkeyringd_exec_t:file entrypoint; ++ ++ allow $1_gkeyringd_t $3:process sigkill; ++ allow $3 $1_gkeyringd_t:fd use; ++ allow $3 $1_gkeyringd_t:fifo_file rw_fifo_file_perms; ++ ++ dontaudit $1_gkeyringd_t $3:unix_stream_socket { getattr read write }; ++ ++ stream_connect_pattern($3, gkeyringd_tmp_t, gkeyringd_tmp_t, $1_gkeyringd_t) ++ ++ kernel_read_system_state($1_gkeyringd_t) + + corecmd_bin_domtrans($1_gkeyringd_t, $3) + corecmd_shell_domtrans($1_gkeyringd_t, $3) + +- gnome_stream_connect_gkeyringd($1, $3) ++ gnome_stream_connect_gkeyringd($3) ++ ++ ps_process_pattern($1_gkeyringd_t, $3) ++ ++ auth_use_nsswitch($1_gkeyringd_t) ++ ++ logging_send_syslog_msg($1_gkeyringd_t) ++ ++ userdom_rw_user_tmp_sock_files($1_gkeyringd_t) ++ ++ allow $1_gkeyringd_t $3:dbus { acquire_svc send_msg }; ++ allow $3 $1_gkeyringd_t:dbus send_msg; ++ allow $3 $3:dbus acquire_svc; ++ ++ optional_policy(` ++ systemd_dbus_chat_logind($1_gkeyringd_t) ++ ') ++ ++ optional_policy(` ++ dbus_session_domain($1, gkeyringd_exec_t, $1_gkeyringd_t) ++ dbus_stream_connect_system_dbusd($1_gkeyringd_t) ++ dbus_send_system_bus($1_gkeyringd_t) ++ ') ++ ++ optional_policy(` ++ gnome_manage_generic_home_dirs($1_gkeyringd_t) ++ gnome_read_generic_data_home_files($1_gkeyringd_t) ++ gnome_read_generic_data_home_dirs($1_gkeyringd_t) ++ ') + + optional_policy(` +- dbus_spec_session_domain($1, gkeyringd_exec_t, $1_gkeyringd_t) ++ telepathy_mission_control_read_state($1_gkeyringd_t) ++ telepathy_gabble_stream_connect_to($1_gkeyringd_t,gkeyringd_tmp_t,gkeyringd_tmp_t) ++ ') ++') + +- optional_policy(` +- gnome_dbus_chat_gkeyringd($1, $3) +- ') ++####################################### ++## ++## Allow domain to run gkeyring in the $1_gkeyringd_t domain. ++## ++## ++## ++## The user prefix. ++## ++## ++## ++## ++## The user role. ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_run_gkeyringd',` ++ gen_require(` ++ type $1_gkeyringd_t; ++ type gkeyringd_exec_t; + ') ++ role $2 types $1_gkeyringd_t; ++ domtrans_pattern($3, gkeyringd_exec_t, $1_gkeyringd_t) + ') + + ######################################## + ## +-## Execute gconf in the caller domain. ++## gconf connection template. + ## + ## + ## +@@ -127,18 +211,18 @@ template(`gnome_role_template',` + ## + ## + # +-interface(`gnome_exec_gconf',` ++interface(`gnome_stream_connect_gconf',` + gen_require(` +- type gconfd_exec_t; ++ type gconfd_t, gconf_tmp_t; + ') + +- corecmd_search_bin($1) +- can_exec($1, gconfd_exec_t) ++ read_files_pattern($1, gconf_tmp_t, gconf_tmp_t) ++ allow $1 gconfd_t:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Read gconf configuration content. ++## Connect to gkeyringd with a unix stream socket. + ## + ## + ## +@@ -146,119 +230,114 @@ interface(`gnome_exec_gconf',` + ## + ## + # +-interface(`gnome_read_gconf_config',` ++interface(`gnome_stream_connect_gkeyringd',` + gen_require(` +- type gconf_etc_t; ++ attribute gkeyringd_domain; ++ type gkeyringd_tmp_t; ++ type gconf_tmp_t; ++ type cache_home_t; + ') + +- files_search_etc($1) +- allow $1 gconf_etc_t:dir list_dir_perms; +- allow $1 gconf_etc_t:file read_file_perms; +- allow $1 gconf_etc_t:lnk_file read_lnk_file_perms; ++ allow $1 gconf_tmp_t:dir search_dir_perms; ++ userdom_search_user_tmp_dirs($1) ++ stream_connect_pattern($1, gkeyringd_tmp_t, gkeyringd_tmp_t, gkeyringd_domain) ++ stream_connect_pattern($1, cache_home_t, cache_home_t, gkeyringd_domain) + ') + + ######################################## + ## +-## Do not audit attempts to read +-## inherited gconf configuration files. ++## Run gconfd in gconfd domain. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed access. + ## + ## + # +-interface(`gnome_dontaudit_read_inherited_gconf_config_files',` ++interface(`gnome_domtrans_gconfd',` + gen_require(` +- type gconf_etc_t; ++ type gconfd_t, gconfd_exec_t; + ') + +- dontaudit $1 gconf_etc_t:file read; ++ domtrans_pattern($1, gconfd_exec_t, gconfd_t) + ') + +-####################################### ++######################################## + ## +-## Create, read, write, and delete +-## gconf configuration content. ++## Dontaudit read gnome homedir content (.config) + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_manage_gconf_config',` ++interface(`gnome_dontaudit_read_config',` + gen_require(` +- type gconf_etc_t; ++ attribute gnome_home_type; + ') + +- files_search_etc($1) +- allow $1 gconf_etc_t:dir manage_dir_perms; +- allow $1 gconf_etc_t:file manage_file_perms; +- allow $1 gconf_etc_t:lnk_file manage_lnk_file_perms; ++ dontaudit $1 gnome_home_type:dir read_inherited_file_perms; + ') + + ######################################## + ## +-## Connect to gconf using a unix +-## domain stream socket. ++## Dontaudit search gnome homedir content (.config) + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_stream_connect_gconf',` ++interface(`gnome_dontaudit_search_config',` + gen_require(` +- type gconfd_t, gconf_tmp_t; ++ attribute gnome_home_type; + ') + +- files_search_tmp($1) +- stream_connect_pattern($1, gconf_tmp_t, gconf_tmp_t, gconfd_t) ++ dontaudit $1 gnome_home_type:dir search_dir_perms; + ') + + ######################################## + ## +-## Run gconfd in gconfd domain. ++## Dontaudit write gnome homedir content (.config) + ## + ## + ## +-## Domain allowed to transition. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_domtrans_gconfd',` ++interface(`gnome_dontaudit_append_config_files',` + gen_require(` +- type gconfd_t, gconfd_exec_t; ++ attribute gnome_home_type; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, gconfd_exec_t, gconfd_t) ++ dontaudit $1 gnome_home_type:file append; + ') + ++ + ######################################## + ## +-## Create generic gnome home directories. ++## Dontaudit write gnome homedir content (.config) + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_create_generic_home_dirs',` ++interface(`gnome_dontaudit_write_config_files',` + gen_require(` +- type gnome_home_t; ++ attribute gnome_home_type; + ') + +- allow $1 gnome_home_t:dir create_dir_perms; ++ dontaudit $1 gnome_home_type:file write; + ') + + ######################################## + ## +-## Set attributes of generic gnome +-## user home directories. (Deprecated) ++## manage gnome homedir content (.config) + ## + ## + ## +@@ -266,15 +345,21 @@ interface(`gnome_create_generic_home_dirs',` + ## + ## + # +-interface(`gnome_setattr_config_dirs',` +- refpolicywarn(`$0($*) has been deprecated, use gnome_setattr_generic_home_dirs() instead.') +- gnome_setattr_generic_home_dirs($1) ++interface(`gnome_manage_config',` ++ gen_require(` ++ attribute gnome_home_type; ++ ') ++ ++ allow $1 gnome_home_type:dir manage_dir_perms; ++ allow $1 gnome_home_type:file { manage_file_perms map }; ++ allow $1 gnome_home_type:lnk_file manage_lnk_file_perms; ++ allow $1 gnome_home_type:sock_file manage_sock_file_perms; ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Set attributes of generic gnome +-## user home directories. ++## Send general signals to all gconf domains. + ## + ## + ## +@@ -282,57 +367,89 @@ interface(`gnome_setattr_config_dirs',` + ## + ## + # +-interface(`gnome_setattr_generic_home_dirs',` ++interface(`gnome_signal_all',` + gen_require(` +- type gnome_home_t; ++ attribute gnomedomain; + ') + +- userdom_search_user_home_dirs($1) +- setattr_dirs_pattern($1, gnome_home_t, gnome_home_t) ++ allow $1 gnomedomain:process signal; + ') + + ######################################## + ## +-## Read generic gnome user home content. (Deprecated) ++## Create objects in a Gnome cache home directory ++## with an automatic type transition to ++## a specified private type. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## + # +-interface(`gnome_read_config',` +- refpolicywarn(`$0($*) has been deprecated, use gnome_read_generic_home_content() instead.') +- gnome_read_generic_home_content($1) ++interface(`gnome_cache_filetrans',` ++ gen_require(` ++ type cache_home_t; ++ ') ++ ++ filetrans_pattern($1, cache_home_t, $2, $3, $4) ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Read generic gnome home content. ++## Create objects in a Gnome cache home directory ++## with an automatic type transition to ++## a specified private type. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## ++## ++## The type of the object to create. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## + # +-interface(`gnome_read_generic_home_content',` ++interface(`gnome_config_filetrans',` + gen_require(` +- type gnome_home_t; ++ type config_home_t; + ') + ++ filetrans_pattern($1, config_home_t, $2, $3, $4) + userdom_search_user_home_dirs($1) +- allow $1 gnome_home_t:dir list_dir_perms; +- allow $1 gnome_home_t:file read_file_perms; +- allow $1 gnome_home_t:fifo_file read_fifo_file_perms; +- allow $1 gnome_home_t:lnk_file read_lnk_file_perms; +- allow $1 gnome_home_t:sock_file read_sock_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## generic gnome user home content. (Deprecated) ++## Read generic cache home files (.cache) + ## + ## + ## +@@ -340,15 +457,18 @@ interface(`gnome_read_generic_home_content',` + ## + ## + # +-interface(`gnome_manage_config',` +- refpolicywarn(`$0($*) has been deprecated, use gnome_manage_generic_home_content() instead.') +- gnome_manage_generic_home_content($1) ++interface(`gnome_read_generic_cache_files',` ++ gen_require(` ++ type cache_home_t; ++ ') ++ ++ read_files_pattern($1, cache_home_t, cache_home_t) ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## generic gnome home content. ++## Create generic cache home dir (.cache) + ## + ## + ## +@@ -356,22 +476,18 @@ interface(`gnome_manage_config',` + ## + ## + # +-interface(`gnome_manage_generic_home_content',` ++interface(`gnome_create_generic_cache_dir',` + gen_require(` +- type gnome_home_t; ++ type cache_home_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 gnome_home_t:dir manage_dir_perms; +- allow $1 gnome_home_t:file manage_file_perms; +- allow $1 gnome_home_t:fifo_file manage_fifo_file_perms; +- allow $1 gnome_home_t:lnk_file manage_lnk_file_perms; +- allow $1 gnome_home_t:sock_file manage_sock_file_perms; ++ allow $1 cache_home_t:dir create_dir_perms; ++ userdom_user_home_dir_filetrans($1, cache_home_t, dir, ".cache") + ') + + ######################################## + ## +-## Search generic gnome home directories. ++## Set attributes of cache home dir (.cache) + ## + ## + ## +@@ -379,53 +495,37 @@ interface(`gnome_manage_generic_home_content',` + ## + ## + # +-interface(`gnome_search_generic_home',` ++interface(`gnome_setattr_cache_home_dir',` + gen_require(` +- type gnome_home_t; ++ type cache_home_t; + ') + ++ setattr_dirs_pattern($1, cache_home_t, cache_home_t) + userdom_search_user_home_dirs($1) +- allow $1 gnome_home_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Create objects in gnome user home +-## directories with a private type. ++## Manage cache home dir (.cache) + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Private file type. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`gnome_home_filetrans',` ++interface(`gnome_manage_cache_home_dir',` + gen_require(` +- type gnome_home_t; ++ type cache_home_t; + ') + ++ manage_dirs_pattern($1, cache_home_t, cache_home_t) + userdom_search_user_home_dirs($1) +- filetrans_pattern($1, gnome_home_t, $2, $3, $4) + ') + + ######################################## + ## +-## Create generic gconf home directories. ++## append to generic cache home files (.cache) + ## + ## + ## +@@ -433,17 +533,18 @@ interface(`gnome_home_filetrans',` + ## + ## + # +-interface(`gnome_create_generic_gconf_home_dirs',` ++interface(`gnome_append_generic_cache_files',` + gen_require(` +- type gconf_home_t; ++ type cache_home_t; + ') + +- allow $1 gconf_home_t:dir create_dir_perms; ++ append_files_pattern($1, cache_home_t, cache_home_t) ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Read generic gconf home content. ++## write to generic cache home files (.cache) + ## + ## + ## +@@ -451,23 +552,18 @@ interface(`gnome_create_generic_gconf_home_dirs',` + ## + ## + # +-interface(`gnome_read_generic_gconf_home_content',` ++interface(`gnome_write_generic_cache_files',` + gen_require(` +- type gconf_home_t; ++ type cache_home_t; + ') + ++ write_files_pattern($1, cache_home_t, cache_home_t) + userdom_search_user_home_dirs($1) +- allow $1 gconf_home_t:dir list_dir_perms; +- allow $1 gconf_home_t:file read_file_perms; +- allow $1 gconf_home_t:fifo_file read_fifo_file_perms; +- allow $1 gconf_home_t:lnk_file read_lnk_file_perms; +- allow $1 gconf_home_t:sock_file read_sock_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## generic gconf home content. ++## write to generic cache home files (.cache) + ## + ## + ## +@@ -475,22 +571,18 @@ interface(`gnome_read_generic_gconf_home_content',` + ## + ## + # +-interface(`gnome_manage_generic_gconf_home_content',` ++interface(`gnome_manage_generic_cache_files',` + gen_require(` +- type gconf_home_t; ++ type cache_home_t; + ') + ++ manage_files_pattern($1, cache_home_t, cache_home_t) + userdom_search_user_home_dirs($1) +- allow $1 gconf_home_t:dir manage_dir_perms; +- allow $1 gconf_home_t:file manage_file_perms; +- allow $1 gconf_home_t:fifo_file manage_fifo_file_perms; +- allow $1 gconf_home_t:lnk_file manage_lnk_file_perms; +- allow $1 gconf_home_t:sock_file manage_sock_file_perms; + ') + + ######################################## + ## +-## Search generic gconf home directories. ++## Manage a sock_file in the generic cache home files (.cache) + ## + ## + ## +@@ -498,79 +590,59 @@ interface(`gnome_manage_generic_gconf_home_content',` + ## + ## + # +-interface(`gnome_search_generic_gconf_home',` ++interface(`gnome_manage_generic_cache_sockets',` + gen_require(` +- type gconf_home_t; ++ type cache_home_t; + ') + + userdom_search_user_home_dirs($1) +- allow $1 gconf_home_t:dir search_dir_perms; ++ manage_sock_files_pattern($1, cache_home_t, cache_home_t) + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the generic gconf +-## home type. ++## Dontaudit read/write to generic cache home files (.cache) + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_home_filetrans_gconf_home',` ++interface(`gnome_dontaudit_rw_generic_cache_files',` + gen_require(` +- type gconf_home_t; ++ type cache_home_t; + ') + +- userdom_user_home_dir_filetrans($1, gconf_home_t, $2, $3) ++ dontaudit $1 cache_home_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the generic gnome +-## home type. ++## read gnome homedir content (.config) + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`gnome_home_filetrans_gnome_home',` ++interface(`gnome_read_config',` + gen_require(` +- type gnome_home_t; ++ attribute gnome_home_type; + ') + +- userdom_user_home_dir_filetrans($1, gnome_home_t, $2, $3) ++ list_dirs_pattern($1, gnome_home_type, gnome_home_type) ++ read_files_pattern($1, gnome_home_type, gnome_home_type) ++ read_lnk_files_pattern($1, gnome_home_type, gnome_home_type) ++ gnome_read_usr_config($1) + ') + + ######################################## + ## +-## Create objects in gnome gconf home +-## directories with a private type. ++## Create objects in a Gnome gconf home directory ++## with an automatic type transition to ++## a specified private type. + ## + ## + ## +@@ -579,12 +651,12 @@ interface(`gnome_home_filetrans_gnome_home',` + ## + ## + ## +-## Private file type. ++## The type of the object to create. + ## + ## + ## + ## +-## Class of the object being created. ++## The class of the object to be created. + ## + ## + ## +@@ -593,18 +665,18 @@ interface(`gnome_home_filetrans_gnome_home',` + ## + ## + # +-interface(`gnome_gconf_home_filetrans',` ++interface(`gnome_data_filetrans',` + gen_require(` +- type gconf_home_t; ++ type data_home_t; + ') + +- userdom_search_user_home_dirs($1) +- filetrans_pattern($1, gconf_home_t, $2, $3, $4) ++ filetrans_pattern($1, data_home_t, $2, $3, $4) ++ gnome_search_gconf($1) + ') + +-######################################## ++####################################### + ## +-## Read generic gnome keyring home files. ++## Read generic data home files. + ## + ## + ## +@@ -612,46 +684,58 @@ interface(`gnome_gconf_home_filetrans',` + ## + ## + # +-interface(`gnome_read_keyring_home_files',` ++interface(`gnome_read_generic_data_home_files',` + gen_require(` +- type gnome_home_t, gnome_keyring_home_t; ++ type data_home_t, gconf_home_t; + ') + +- userdom_search_user_home_dirs($1) +- read_files_pattern($1, { gnome_home_t gnome_keyring_home_t }, gnome_keyring_home_t) ++ read_files_pattern($1, { gconf_home_t data_home_t }, data_home_t) ++ read_lnk_files_pattern($1, { gconf_home_t data_home_t }, data_home_t) + ') + +-######################################## ++###################################### + ## +-## Send and receive messages from +-## gnome keyring daemon over dbus. ++## Read generic data home dirs. + ## +-## +-## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). +-## ++## ++## ++## Domain allowed access. ++## + ## ++# ++interface(`gnome_read_generic_data_home_dirs',` ++ gen_require(` ++ type data_home_t, gconf_home_t; ++ ') ++ ++ list_dirs_pattern($1, { gconf_home_t data_home_t }, data_home_t) ++') ++ ++####################################### ++## ++## Manage gconf data home files ++## + ## + ## + ## Domain allowed access. + ## + ## + # +-interface(`gnome_dbus_chat_gkeyringd',` ++interface(`gnome_manage_data',` + gen_require(` +- type $1_gkeyringd_t; +- class dbus send_msg; ++ type data_home_t; ++ type gconf_home_t; + ') + +- allow $2 $1_gkeyringd_t:dbus send_msg; +- allow $1_gkeyringd_t $2:dbus send_msg; ++ allow $1 gconf_home_t:dir search_dir_perms; ++ manage_dirs_pattern($1, data_home_t, data_home_t) ++ manage_files_pattern($1, data_home_t, data_home_t) ++ manage_lnk_files_pattern($1, data_home_t, data_home_t) + ') + + ######################################## + ## +-## Send and receive messages from all +-## gnome keyring daemon over dbus. ++## Read icc data home content. + ## + ## + ## +@@ -659,59 +743,1073 @@ interface(`gnome_dbus_chat_gkeyringd',` + ## + ## + # +-interface(`gnome_dbus_chat_all_gkeyringd',` ++interface(`gnome_read_home_icc_data_content',` + gen_require(` +- attribute gkeyringd_domain; +- class dbus send_msg; ++ type icc_data_home_t, gconf_home_t, data_home_t; + ') + +- allow $1 gkeyringd_domain:dbus send_msg; +- allow gkeyringd_domain $1:dbus send_msg; ++ userdom_search_user_home_dirs($1) ++ allow $1 { gconf_home_t data_home_t }:dir search_dir_perms; ++ allow $1 icc_data_home_t:file map; ++ list_dirs_pattern($1, icc_data_home_t, icc_data_home_t) ++ read_files_pattern($1, icc_data_home_t, icc_data_home_t) ++ read_lnk_files_pattern($1, icc_data_home_t, icc_data_home_t) + ') + + ######################################## + ## +-## Connect to gnome keyring daemon +-## with a unix stream socket. ++## Read inherited icc data home files. + ## +-## ++## + ## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). ++## Domain allowed access. + ## + ## ++# ++interface(`gnome_read_inherited_home_icc_data_files',` ++ gen_require(` ++ type icc_data_home_t; ++ ') ++ ++ allow $1 icc_data_home_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## Create gconf_home_t objects in the /root directory ++## + ## + ## + ## Domain allowed access. + ## + ## ++## ++## ++## The class of the object to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## + # +-interface(`gnome_stream_connect_gkeyringd',` ++interface(`gnome_admin_home_gconf_filetrans',` + gen_require(` +- type $1_gkeyringd_t, gnome_keyring_tmp_t; ++ type gconf_home_t; + ') + +- files_search_tmp($2) +- stream_connect_pattern($2, gnome_keyring_tmp_t, gnome_keyring_tmp_t, $1_gkeyringd_t) ++ userdom_admin_home_dir_filetrans($1, gconf_home_t, $2, $3) + ') + + ######################################## + ## +-## Connect to all gnome keyring daemon +-## with a unix stream socket. ++## Do not audit attempts to read ++## inherited gconf config files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`gnome_stream_connect_all_gkeyringd',` ++interface(`gnome_dontaudit_read_inherited_gconf_config_files',` + gen_require(` +- attribute gkeyringd_domain; +- type gnome_keyring_tmp_t; ++ type gconf_etc_t; + ') + +- files_search_tmp($1) +- stream_connect_pattern($1, gnome_keyring_tmp_t, gnome_keyring_tmp_t, gkeyringd_domain) ++ dontaudit $1 gconf_etc_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## read gconf config files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_read_gconf_config',` ++ gen_require(` ++ type gconf_etc_t; ++ ') ++ ++ allow $1 gconf_etc_t:dir list_dir_perms; ++ read_files_pattern($1, gconf_etc_t, gconf_etc_t) ++ files_search_etc($1) ++') ++ ++####################################### ++## ++## Manage gconf config files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_gconf_config',` ++ gen_require(` ++ type gconf_etc_t; ++ ') ++ ++ allow $1 gconf_etc_t:dir list_dir_perms; ++ manage_files_pattern($1, gconf_etc_t, gconf_etc_t) ++') ++ ++######################################## ++## ++## Execute gconf programs in ++## in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_exec_gconf',` ++ gen_require(` ++ type gconfd_exec_t; ++ ') ++ ++ can_exec($1, gconfd_exec_t) ++') ++ ++######################################## ++## ++## Execute gnome keyringd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_exec_keyringd',` ++ gen_require(` ++ type gkeyringd_exec_t; ++ ') ++ ++ can_exec($1, gkeyringd_exec_t) ++ corecmd_search_bin($1) ++') ++ ++######################################## ++## ++## Search gconf home data dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_search_gconf_data_dir',` ++ gen_require(` ++ type gconf_home_t; ++ type data_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ allow $1 gconf_home_t:dir list_dir_perms; ++ allow $1 data_home_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Read gconf home files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_read_gconf_home_files',` ++ gen_require(` ++ type gconf_home_t; ++ type data_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ allow $1 gconf_home_t:dir list_dir_perms; ++ allow $1 data_home_t:dir list_dir_perms; ++ read_files_pattern($1, gconf_home_t, gconf_home_t) ++ read_files_pattern($1, data_home_t, data_home_t) ++ read_lnk_files_pattern($1, gconf_home_t, gconf_home_t) ++ read_lnk_files_pattern($1, data_home_t, data_home_t) ++') ++ ++######################################## ++## ++## Search gkeyringd temporary directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_search_gkeyringd_tmp_dirs',` ++ gen_require(` ++ type gkeyringd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 gkeyringd_tmp_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## List gkeyringd temporary directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_list_gkeyringd_tmp_dirs',` ++ gen_require(` ++ type gkeyringd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 gkeyringd_tmp_t:dir list_dir_perms; ++') ++ ++####################################### ++## ++## Delete gkeyringd temporary ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_delete_gkeyringd_tmp_content',` ++ gen_require(` ++ type gkeyringd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ delete_dirs_pattern($1, gkeyringd_tmp_t, gkeyringd_tmp_t) ++ delete_files_pattern($1, gkeyringd_tmp_t, gkeyringd_tmp_t) ++ delete_sock_files_pattern($1, gkeyringd_tmp_t, gkeyringd_tmp_t) ++') ++ ++####################################### ++## ++## Manage gkeyringd temporary directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_gkeyringd_tmp_dirs',` ++ gen_require(` ++ type gkeyringd_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ manage_dirs_pattern($1, gkeyringd_tmp_t, gkeyringd_tmp_t) ++') ++ ++######################################## ++## ++## search gconf homedir (.local) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_search_gconf',` ++ gen_require(` ++ type gconf_home_t; ++ ') ++ ++ allow $1 gconf_home_t:dir search_dir_perms; ++ userdom_search_user_home_dirs($1) ++') ++ ++######################################## ++## ++## Set attributes of Gnome config dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_setattr_config_dirs',` ++ gen_require(` ++ type gnome_home_t; ++ ') ++ ++ setattr_dirs_pattern($1, gnome_home_t, gnome_home_t) ++ files_search_home($1) ++') ++ ++######################################## ++## ++## Manage generic gnome home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_generic_home_files',` ++ gen_require(` ++ type gnome_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ manage_files_pattern($1, gnome_home_t, gnome_home_t) ++') ++ ++######################################## ++## ++## Manage generic gnome home directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_generic_home_dirs',` ++ gen_require(` ++ type gnome_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ allow $1 gnome_home_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Append gconf home files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_append_gconf_home_files',` ++ gen_require(` ++ type gconf_home_t; ++ ') ++ ++ append_files_pattern($1, gconf_home_t, gconf_home_t) ++') ++ ++######################################## ++## ++## manage gconf home files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_gconf_home_files',` ++ gen_require(` ++ type gconf_home_t; ++ ') ++ ++ allow $1 gconf_home_t:dir list_dir_perms; ++ manage_files_pattern($1, gconf_home_t, gconf_home_t) ++') ++ ++######################################## ++## ++## Connect to gnome over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++interface(`gnome_stream_connect',` ++ gen_require(` ++ attribute gnome_home_type; ++ ') ++ ++ # Connect to pulseaudit server ++ stream_connect_pattern($1, gnome_home_type, gnome_home_type, $2) ++') ++ ++######################################## ++## ++## list gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_list_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ allow $1 config_home_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Set attributes of gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_setattr_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ setattr_dirs_pattern($1, config_home_t, config_home_t) ++ userdom_search_user_home_dirs($1) ++') ++ ++######################################## ++## ++## read gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_read_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ list_dirs_pattern($1, config_home_t, config_home_t) ++ read_files_pattern($1, config_home_t, config_home_t) ++ read_lnk_files_pattern($1, config_home_t, config_home_t) ++') ++####################################### ++## ++## append gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_append_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ append_files_pattern($1, config_home_t, config_home_t) ++') ++ ++####################################### ++## ++## delete gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_delete_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ delete_files_pattern($1, config_home_t, config_home_t) ++') ++ ++######################################## ++## ++## Create gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_create_home_config_dirs',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ allow $1 config_home_t:dir create_dir_perms; ++') ++ ++####################################### ++## ++## setattr gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_setattr_home_config_dirs',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ setattr_dirs_pattern($1, config_home_t, config_home_t) ++') ++ ++######################################## ++## ++## manage gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_home_config',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ manage_files_pattern($1, config_home_t, config_home_t) ++') ++ ++####################################### ++## ++## delete gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_delete_home_config_dirs',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ delete_dirs_pattern($1, config_home_t, config_home_t) ++') ++ ++######################################## ++## ++## manage gnome homedir content (.config) ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_home_config_dirs',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ manage_dirs_pattern($1, config_home_t, config_home_t) ++') ++ ++######################################## ++## ++## manage gstreamer home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_gstreamer_home_files',` ++ gen_require(` ++ type gstreamer_home_t; ++ ') ++ ++ manage_dirs_pattern($1, gstreamer_home_t, gstreamer_home_t) ++ manage_files_pattern($1, gstreamer_home_t, gstreamer_home_t) ++ gnome_filetrans_gstreamer_home_content($1) ++') ++ ++###################################### ++## ++## Allow to execute gstreamer home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_exec_gstreamer_home_files',` ++ gen_require(` ++ type gstreamer_home_t; ++ ') ++ ++ can_exec($1, gstreamer_home_t) ++') ++ ++###################################### ++## ++## Allow to execute config home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_exec_config_home_files',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ can_exec($1, config_home_t) ++') ++ ++####################################### ++## ++## file name transition gstreamer home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_filetrans_gstreamer_home_content',` ++ gen_require(` ++ type gstreamer_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, file, ".grl-bookmarks") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, file, ".grl-metadata-store") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, file, ".grl-podcasts") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-0.12") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-0.10") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-1.0") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-1.2") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-10") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".gstreamer-12") ++ userdom_user_home_dir_filetrans($1, gstreamer_home_t, dir, ".orc") ++ userdom_user_tmp_filetrans($1, gstreamer_home_t, dir, ".orc") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-0.12") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "GLCache") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-0.10") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-1.0") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-1.2") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-10") ++ gnome_cache_filetrans($1, gstreamer_home_t, dir, "gstreamer-12") ++') ++ ++####################################### ++## ++## manage gstreamer home content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_gstreamer_home_dirs',` ++ gen_require(` ++ type gstreamer_home_t; ++ ') ++ ++ manage_dirs_pattern($1, gstreamer_home_t, gstreamer_home_t) ++') ++ ++######################################## ++## ++## Read/Write all inherited gnome home config ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_rw_inherited_config',` ++ gen_require(` ++ attribute gnome_home_type; ++ ') ++ ++ allow $1 gnome_home_type:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Dontaudit Read/Write all inherited gnome home config ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`gnome_dontaudit_rw_inherited_config',` ++ gen_require(` ++ attribute gnome_home_type; ++ ') ++ ++ dontaudit $1 gnome_home_type:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## gconf system service over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_dbus_chat_gconfdefault',` ++ gen_require(` ++ type gconfdefaultsm_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 gconfdefaultsm_t:dbus send_msg; ++ allow gconfdefaultsm_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## gkeyringd over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_dbus_chat_gkeyringd',` ++ gen_require(` ++ attribute gkeyringd_domain; ++ class dbus send_msg; ++ ') ++ ++ allow $1 gkeyringd_domain:dbus send_msg; ++ allow gkeyringd_domain $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Send signull signal to gkeyringd processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_signull_gkeyringd',` ++ gen_require(` ++ attribute gkeyringd_domain; ++ ') ++ ++ allow $1 gkeyringd_domain:process signull; ++') ++ ++######################################## ++## ++## Allow the domain to read gkeyringd state files in /proc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_read_gkeyringd_state',` ++ gen_require(` ++ attribute gkeyringd_domain; ++ ') ++ ++ ps_process_pattern($1, gkeyringd_domain) ++') ++ ++######################################## ++## ++## Create directories in user home directories ++## with the gnome home file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_home_dir_filetrans',` ++ gen_require(` ++ type gnome_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, gnome_home_t, dir) ++ userdom_search_user_home_dirs($1) ++') ++ ++######################################## ++## ++## Check whether sendmail executable ++## files are executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_access_check_usr_config',` ++ gen_require(` ++ type config_usr_t; ++ ') ++ ++ allow $1 config_usr_t:dir_file_class_set audit_access;; ++') ++ ++###################################### ++## ++## Allow read kde config content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_read_usr_config',` ++ gen_require(` ++ type config_usr_t; ++ ') ++ ++ files_search_usr($1) ++ list_dirs_pattern($1, config_usr_t, config_usr_t) ++ read_files_pattern($1, config_usr_t, config_usr_t) ++ read_lnk_files_pattern($1, config_usr_t, config_usr_t) ++') ++ ++####################################### ++## ++## Allow manage kde config content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_manage_usr_config',` ++ gen_require(` ++ type config_usr_t; ++ ') ++ ++ files_search_usr($1) ++ manage_dirs_pattern($1, config_usr_t, config_usr_t) ++ manage_files_pattern($1, config_usr_t, config_usr_t) ++ manage_lnk_files_pattern($1, config_usr_t, config_usr_t) ++') ++ ++######################################## ++## ++## Execute gnome-keyring in the user gkeyring domain ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`gnome_transition_gkeyringd',` ++ gen_require(` ++ attribute gkeyringd_domain; ++ ') ++ ++ allow $1 gkeyringd_domain:process transition; ++ dontaudit $1 gkeyringd_domain:process { noatsecure siginh rlimitinh }; ++ allow gkeyringd_domain $1:process { sigchld signull }; ++ allow gkeyringd_domain $1:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Create gnome content in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_filetrans_home_content',` ++ ++gen_require(` ++ type config_home_t; ++ type cache_home_t; ++ type dbus_home_t; ++ type gconf_home_t; ++ type gnome_home_t; ++ type data_home_t, icc_data_home_t; ++ type gkeyringd_gnome_home_t; ++') ++ ++ userdom_user_home_dir_filetrans($1, config_home_t, dir, ".config") ++ userdom_user_home_dir_filetrans($1, config_home_t, file, ".Xdefaults") ++ userdom_user_home_dir_filetrans($1, config_home_t, dir, ".xine") ++ userdom_user_home_dir_filetrans($1, cache_home_t, dir, ".cache") ++ userdom_user_home_dir_filetrans($1, dbus_home_t, dir, ".dbus") ++ userdom_user_home_dir_filetrans($1, cache_home_t, dir, ".nv") ++ userdom_user_home_dir_filetrans($1, config_home_t, dir, ".kde") ++ userdom_user_home_dir_filetrans($1, gconf_home_t, dir, ".gconf") ++ userdom_user_home_dir_filetrans($1, gconf_home_t, dir, ".gconfd") ++ userdom_user_home_dir_filetrans($1, gconf_home_t, dir, ".local") ++ userdom_user_home_dir_filetrans($1, gnome_home_t, dir, ".gnome2") ++ ++ # ~/.color/icc: legacy ++ userdom_user_home_content_filetrans($1, icc_data_home_t, dir, "icc") ++ filetrans_pattern($1, gnome_home_t, gkeyringd_gnome_home_t, dir, "keyrings") ++ filetrans_pattern($1, data_home_t, gkeyringd_gnome_home_t, dir, "keyrings") ++ filetrans_pattern($1, gconf_home_t, data_home_t, dir, "share") ++ filetrans_pattern($1, data_home_t, icc_data_home_t, dir, "icc") ++ filetrans_pattern($1, cache_home_t, cache_home_t, dir, "fontconfig") ++ userdom_user_tmp_filetrans($1, config_home_t, dir, "dconf") ++ gnome_cache_filetrans($1, config_home_t, dir, "dconf") ++ gnome_filetrans_gstreamer_home_content($1) ++') ++ ++######################################## ++## ++## Create gnome dconf dir in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_filetrans_config_home_content',` ++ gen_require(` ++ type config_home_t; ++ ') ++ ++ gnome_cache_filetrans($1, config_home_t, dir, "dconf") ++') ++ ++######################################## ++## ++## Create gnome directory in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gnome_filetrans_admin_home_content',` ++ ++gen_require(` ++ type config_home_t; ++ type cache_home_t; ++ type dbus_home_t; ++ type gstreamer_home_t; ++ type gconf_home_t; ++ type gnome_home_t; ++ type icc_data_home_t; ++') ++ ++ userdom_admin_home_dir_filetrans($1, config_home_t, dir, ".config") ++ userdom_admin_home_dir_filetrans($1, config_home_t, file, ".Xdefaults") ++ userdom_admin_home_dir_filetrans($1, config_home_t, dir, ".xine") ++ userdom_admin_home_dir_filetrans($1, cache_home_t, dir, ".cache") ++ userdom_admin_home_dir_filetrans($1, dbus_home_t, dir, ".dbus") ++ userdom_admin_home_dir_filetrans($1, config_home_t, dir, ".kde") ++ userdom_admin_home_dir_filetrans($1, gconf_home_t, dir, ".gconf") ++ userdom_admin_home_dir_filetrans($1, gconf_home_t, dir, ".gconfd") ++ userdom_admin_home_dir_filetrans($1, gconf_home_t, dir, ".local") ++ userdom_admin_home_dir_filetrans($1, gnome_home_t, dir, ".gnome2") ++ gnome_filetrans_gstreamer_home_content($1) ++ # /root/.color/icc: legacy ++ userdom_admin_home_dir_filetrans($1, icc_data_home_t, dir, "icc") ++') ++ ++##################################### ++## ++## Execute gnome-keyring executable ++## in the specified domain. ++## ++## ++##

      ++## Execute a telepathy executable ++## in the specified domain. This allows ++## the specified domain to execute any file ++## on these filesystems in the specified ++## domain. ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##

      ++## This interface was added to handle ++## the ssh-agent policy. ++##

      ++##
      ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`gnome_command_domtrans_gkeyringd', ` ++ gen_require(` ++ type gkeyringd_exec_t; ++ ') ++ ++ allow $2 gkeyringd_exec_t:file entrypoint; ++ domain_transition_pattern($1, gkeyringd_exec_t, $2) ++ type_transition $1 gkeyringd_exec_t:process $2; + ') +diff --git a/gnome.te b/gnome.te +index 63893eb2d0..61dd9e336d 100644 +--- a/gnome.te ++++ b/gnome.te +@@ -5,14 +5,33 @@ policy_module(gnome, 2.3.0) + # Declarations + # + +-attribute gkeyringd_domain; + attribute gnomedomain; ++attribute gnome_home_type; ++attribute gkeyringd_domain; + attribute_role gconfd_roles; + + type gconf_etc_t; + files_config_file(gconf_etc_t) + +-type gconf_home_t; ++type data_home_t, gnome_home_type; ++userdom_user_home_content(data_home_t) ++ ++type config_home_t, gnome_home_type; ++userdom_user_home_content(config_home_t) ++ ++type cache_home_t, gnome_home_type; ++userdom_user_home_content(cache_home_t) ++ ++type gstreamer_home_t, gnome_home_type; ++userdom_user_home_content(gstreamer_home_t) ++ ++type dbus_home_t, gnome_home_type; ++userdom_user_home_content(dbus_home_t) ++ ++type icc_data_home_t, gnome_home_type; ++userdom_user_home_content(icc_data_home_t) ++ ++type gconf_home_t, gnome_home_type; + typealias gconf_home_t alias { user_gconf_home_t staff_gconf_home_t sysadm_gconf_home_t }; + typealias gconf_home_t alias { auditadm_gconf_home_t secadm_gconf_home_t }; + typealias gconf_home_t alias unconfined_gconf_home_t; +@@ -31,105 +50,225 @@ typealias gconfd_t alias { auditadm_gconfd_t secadm_gconfd_t }; + userdom_user_application_domain(gconfd_t, gconfd_exec_t) + role gconfd_roles types gconfd_t; + +-type gnome_home_t; ++type gnome_home_t, gnome_home_type; + typealias gnome_home_t alias { user_gnome_home_t staff_gnome_home_t sysadm_gnome_home_t }; + typealias gnome_home_t alias { auditadm_gnome_home_t secadm_gnome_home_t }; + typealias gnome_home_t alias unconfined_gnome_home_t; + userdom_user_home_content(gnome_home_t) + ++# type KDE /usr/share/config files ++type config_usr_t; ++files_type(config_usr_t) ++ + type gkeyringd_exec_t; +-application_executable_file(gkeyringd_exec_t) ++corecmd_executable_file(gkeyringd_exec_t) + +-type gnome_keyring_home_t; +-userdom_user_home_content(gnome_keyring_home_t) ++type gkeyringd_gnome_home_t, gnome_home_type; ++userdom_user_home_content(gkeyringd_gnome_home_t) + +-type gnome_keyring_tmp_t; +-userdom_user_tmp_file(gnome_keyring_tmp_t) ++type gkeyringd_tmp_t; ++userdom_user_tmp_content(gkeyringd_tmp_t) ++ ++type gconfdefaultsm_t; ++type gconfdefaultsm_exec_t; ++init_daemon_domain(gconfdefaultsm_t, gconfdefaultsm_exec_t) ++ ++type gnomesystemmm_t; ++type gnomesystemmm_exec_t; ++init_daemon_domain(gnomesystemmm_t, gnomesystemmm_exec_t) + + ############################## + # +-# Common local Policy ++# Local Policy + # + +-allow gnomedomain self:process { getsched signal }; +-allow gnomedomain self:fifo_file rw_fifo_file_perms; ++allow gconfd_t self:process getsched; ++allow gconfd_t self:fifo_file rw_fifo_file_perms; + +-dev_read_urand(gnomedomain) ++manage_dirs_pattern(gconfd_t, gconf_home_t, gconf_home_t) ++manage_files_pattern(gconfd_t, gconf_home_t, gconf_home_t) ++userdom_user_home_dir_filetrans(gconfd_t, gconf_home_t, dir) + +-domain_use_interactive_fds(gnomedomain) ++manage_dirs_pattern(gconfd_t, gconf_tmp_t, gconf_tmp_t) ++manage_files_pattern(gconfd_t, gconf_tmp_t, gconf_tmp_t) ++userdom_user_tmp_filetrans(gconfd_t, gconf_tmp_t, { dir file }) + +-files_read_etc_files(gnomedomain) ++allow gconfd_t gconf_etc_t:dir list_dir_perms; ++read_files_pattern(gconfd_t, gconf_etc_t, gconf_etc_t) ++ ++dev_read_urand(gconfd_t) + +-miscfiles_read_localization(gnomedomain) + +-logging_send_syslog_msg(gnomedomain) + +-userdom_use_user_terminals(gnomedomain) ++logging_send_syslog_msg(gconfd_t) ++ ++userdom_manage_user_tmp_sockets(gconfd_t) ++userdom_manage_user_tmp_dirs(gconfd_t) ++userdom_tmp_filetrans_user_tmp(gconfd_t, dir) + + optional_policy(` +- xserver_rw_xdm_pipes(gnomedomain) +- xserver_use_xdm_fds(gnomedomain) ++ nscd_dontaudit_search_pid(gconfd_t) + ') + +-############################## ++optional_policy(` ++ xserver_use_xdm_fds(gconfd_t) ++ xserver_rw_xdm_pipes(gconfd_t) ++') ++ ++####################################### + # +-# Conf daemon local Policy ++# gconf-defaults-mechanisms local policy + # + +-allow gconfd_t gconf_etc_t:dir list_dir_perms; +-read_files_pattern(gconfd_t, gconf_etc_t, gconf_etc_t) ++allow gconfdefaultsm_t self:capability { dac_read_search dac_override sys_nice }; ++allow gconfdefaultsm_t self:process getsched; ++allow gconfdefaultsm_t self:fifo_file rw_fifo_file_perms; + +-manage_dirs_pattern(gconfd_t, gconf_home_t, gconf_home_t) +-manage_files_pattern(gconfd_t, gconf_home_t, gconf_home_t) +-userdom_user_home_dir_filetrans(gconfd_t, gconf_home_t, dir) ++corecmd_search_bin(gconfdefaultsm_t) + +-manage_dirs_pattern(gconfd_t, gconf_tmp_t, gconf_tmp_t) +-manage_files_pattern(gconfd_t, gconf_tmp_t, gconf_tmp_t) +-userdom_user_tmp_filetrans(gconfd_t, gconf_tmp_t, { dir file }) ++auth_read_passwd(gconfdefaultsm_t) + +-userdom_manage_user_tmp_dirs(gconfd_t) +-userdom_tmp_filetrans_user_tmp(gconfd_t, dir) ++gnome_manage_gconf_home_files(gconfdefaultsm_t) ++gnome_manage_gconf_config(gconfdefaultsm_t) ++ ++userdom_read_all_users_state(gconfdefaultsm_t) ++userdom_search_user_home_dirs(gconfdefaultsm_t) ++ ++userdom_dontaudit_search_admin_dir(gconfdefaultsm_t) + + optional_policy(` +- nscd_dontaudit_search_pid(gconfd_t) ++ consolekit_dbus_chat(gconfdefaultsm_t) + ') + +-############################## ++optional_policy(` ++ dbus_system_domain(gconfdefaultsm_t, gconfdefaultsm_exec_t) ++') ++ ++optional_policy(` ++ nscd_dontaudit_search_pid(gconfdefaultsm_t) ++') ++ ++optional_policy(` ++ policykit_domtrans_auth(gconfdefaultsm_t) ++ policykit_dbus_chat(gconfdefaultsm_t) ++ policykit_read_lib(gconfdefaultsm_t) ++ policykit_read_reload(gconfdefaultsm_t) ++') ++ ++userdom_home_manager(gconfdefaultsm_t) ++ ++####################################### ++# ++# gnome-system-monitor-mechanisms local policy ++# ++ ++allow gnomesystemmm_t self:capability { sys_admin sys_nice }; ++allow gnomesystemmm_t self:fifo_file rw_fifo_file_perms; ++ ++rw_files_pattern(gnomesystemmm_t, config_usr_t, config_usr_t) ++ ++kernel_read_system_state(gnomesystemmm_t) ++ ++corecmd_search_bin(gnomesystemmm_t) ++ ++domain_kill_all_domains(gnomesystemmm_t) ++domain_search_all_domains_state(gnomesystemmm_t) ++domain_setpriority_all_domains(gnomesystemmm_t) ++domain_signal_all_domains(gnomesystemmm_t) ++domain_sigstop_all_domains(gnomesystemmm_t) ++ ++fs_getattr_xattr_fs(gnomesystemmm_t) ++ ++auth_read_passwd(gnomesystemmm_t) ++ ++logging_send_syslog_msg(gnomesystemmm_t) ++ ++userdom_read_all_users_state(gnomesystemmm_t) ++userdom_dontaudit_search_admin_dir(gnomesystemmm_t) ++ ++optional_policy(` ++ consolekit_dbus_chat(gnomesystemmm_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(gnomesystemmm_t, gnomesystemmm_exec_t) ++') ++ ++optional_policy(` ++ gnome_manage_home_config(gnomesystemmm_t) ++') ++ ++optional_policy(` ++ nscd_dontaudit_search_pid(gnomesystemmm_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(gnomesystemmm_t) ++ policykit_domtrans_auth(gnomesystemmm_t) ++ policykit_read_lib(gnomesystemmm_t) ++ policykit_read_reload(gnomesystemmm_t) ++') ++ ++###################################### + # +-# Keyring-daemon local policy ++# gnome-keyring-daemon local policy + # + + allow gkeyringd_domain self:capability ipc_lock; +-allow gkeyringd_domain self:process { getcap setcap }; ++allow gkeyringd_domain self:process { getcap getsched setcap signal }; ++allow gkeyringd_domain self:fifo_file rw_fifo_file_perms; + allow gkeyringd_domain self:unix_stream_socket { connectto accept listen }; + +-allow gkeyringd_domain gnome_home_t:dir create_dir_perms; +-gnome_home_filetrans_gnome_home(gkeyringd_domain, dir, ".gnome2") ++manage_files_pattern(gkeyringd_domain, config_home_t, config_home_t) + +-manage_dirs_pattern(gkeyringd_domain, gnome_keyring_home_t, gnome_keyring_home_t) +-manage_files_pattern(gkeyringd_domain, gnome_keyring_home_t, gnome_keyring_home_t) +-gnome_home_filetrans(gkeyringd_domain, gnome_keyring_home_t, dir, "keyrings") ++manage_dirs_pattern(gkeyringd_domain, gkeyringd_gnome_home_t, gkeyringd_gnome_home_t) ++manage_files_pattern(gkeyringd_domain, gkeyringd_gnome_home_t, gkeyringd_gnome_home_t) ++allow gkeyringd_domain data_home_t:dir create_dir_perms; ++allow gkeyringd_domain gconf_home_t:dir create_dir_perms; ++filetrans_pattern(gkeyringd_domain, gconf_home_t, data_home_t, dir, "share") ++filetrans_pattern(gkeyringd_domain, gnome_home_t, gkeyringd_gnome_home_t, dir, "keyrings") ++filetrans_pattern(gkeyringd_domain, data_home_t, gkeyringd_gnome_home_t, dir, "keyrings") + +-manage_dirs_pattern(gkeyringd_domain, gnome_keyring_tmp_t, gnome_keyring_tmp_t) +-manage_sock_files_pattern(gkeyringd_domain, gnome_keyring_tmp_t, gnome_keyring_tmp_t) +-files_tmp_filetrans(gkeyringd_domain, gnome_keyring_tmp_t, dir) ++manage_dirs_pattern(gkeyringd_domain, gkeyringd_tmp_t, gkeyringd_tmp_t) ++manage_sock_files_pattern(gkeyringd_domain, gkeyringd_tmp_t, gkeyringd_tmp_t) ++files_tmp_filetrans(gkeyringd_domain, gkeyringd_tmp_t, dir) ++fs_tmpfs_filetrans(gkeyringd_domain, gkeyringd_tmp_t, dir) ++userdom_user_tmp_filetrans(gkeyringd_domain, gkeyringd_tmp_t, { sock_file dir }) + +-kernel_read_system_state(gkeyringd_domain) + kernel_read_crypto_sysctls(gkeyringd_domain) + ++corecmd_search_bin(gkeyringd_domain) ++ + dev_read_rand(gkeyringd_domain) ++dev_read_urand(gkeyringd_domain) + dev_read_sysfs(gkeyringd_domain) + +-files_read_usr_files(gkeyringd_domain) ++# for nscd? ++files_search_pids(gkeyringd_domain) + +-fs_getattr_all_fs(gkeyringd_domain) ++fs_getattr_xattr_fs(gkeyringd_domain) ++fs_getattr_tmpfs(gkeyringd_domain) + +-selinux_getattr_fs(gkeyringd_domain) ++userdom_user_home_dir_filetrans(gkeyringd_domain, gconf_home_t, dir, ".local") + + optional_policy(` +- ssh_read_user_home_files(gkeyringd_domain) ++ xserver_append_xdm_home_files(gkeyringd_domain) ++ xserver_read_xdm_home_files(gkeyringd_domain) ++ xserver_use_xdm_fds(gkeyringd_domain) + ') + + optional_policy(` +- telepathy_mission_control_read_state(gkeyringd_domain) ++ gnome_create_home_config_dirs(gkeyringd_domain) ++ gnome_read_home_config(gkeyringd_domain) ++ gnome_manage_generic_cache_files(gkeyringd_domain) ++ gnome_manage_cache_home_dir(gkeyringd_domain) ++ gnome_manage_generic_cache_sockets(gkeyringd_domain) + ') ++ ++optional_policy(` ++ ssh_read_user_home_files(gkeyringd_domain) ++') ++ ++domain_use_interactive_fds(gnomedomain) ++ ++userdom_use_inherited_user_terminals(gnomedomain) +diff --git a/gnomeclock.fc b/gnomeclock.fc +index f9ba8cd993..690630113f 100644 +--- a/gnomeclock.fc ++++ b/gnomeclock.fc +@@ -1,7 +1,10 @@ ++/usr/lib/systemd/systemd-timedated -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) ++ + /usr/libexec/gnome-clock-applet-mechanism -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) + +-/usr/libexec/gsd-datetime-mechanism -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) ++/usr/libexec/gsd-datetime-mechanism -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) + +-/usr/libexec/kde(3|4)/kcmdatetimehelper -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) ++/usr/libexec/kde3/kcmdatetimehelper -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) ++/usr/libexec/kde4/kcmdatetimehelper -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) + + /usr/lib/gnome-settings-daemon/gsd-datetime-mechanism -- gen_context(system_u:object_r:gnomeclock_exec_t,s0) +diff --git a/gnomeclock.if b/gnomeclock.if +index 3f55702fb6..25c7ab82cd 100644 +--- a/gnomeclock.if ++++ b/gnomeclock.if +@@ -2,8 +2,7 @@ + + ######################################## + ## +-## Execute a domain transition to +-## run gnomeclock. ++## Execute a domain transition to run gnomeclock. + ## + ## + ## +@@ -16,15 +15,13 @@ interface(`gnomeclock_domtrans',` + type gnomeclock_t, gnomeclock_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, gnomeclock_exec_t, gnomeclock_t) + ') + + ######################################## + ## +-## Execute gnomeclock in the gnomeclock +-## domain, and allow the specified +-## role the gnomeclock domain. ++## Execute gnomeclock in the gnomeclock domain, and ++## allow the specified role the gnomeclock domain. + ## + ## + ## +@@ -39,11 +36,11 @@ interface(`gnomeclock_domtrans',` + # + interface(`gnomeclock_run',` + gen_require(` +- attribute_role gnomeclock_roles; ++ type gnomeclock_t; + ') + + gnomeclock_domtrans($1) +- roleattribute $2 gnomeclock_roles; ++ role $2 types gnomeclock_t; + ') + + ######################################## +@@ -69,9 +66,8 @@ interface(`gnomeclock_dbus_chat',` + + ######################################## + ## +-## Do not audit attempts to send and +-## receive messages from gnomeclock +-## over dbus. ++## Do not audit send and receive messages from ++## gnomeclock over dbus. + ## + ## + ## +diff --git a/gnomeclock.te b/gnomeclock.te +index 7cd7435e65..8f26e9862c 100644 +--- a/gnomeclock.te ++++ b/gnomeclock.te +@@ -5,82 +5,95 @@ policy_module(gnomeclock, 1.1.0) + # Declarations + # + +-attribute_role gnomeclock_roles; +- + type gnomeclock_t; + type gnomeclock_exec_t; +-init_system_domain(gnomeclock_t, gnomeclock_exec_t) +-role gnomeclock_roles types gnomeclock_t; ++init_daemon_domain(gnomeclock_t, gnomeclock_exec_t) ++ ++type gnomeclock_tmp_t; ++files_tmp_file(gnomeclock_tmp_t) + + ######################################## + # +-# Local policy ++# gnomeclock local policy + # + +-allow gnomeclock_t self:capability { sys_nice sys_time }; ++allow gnomeclock_t self:capability { sys_nice sys_time dac_read_search dac_override }; + allow gnomeclock_t self:process { getattr getsched signal }; + allow gnomeclock_t self:fifo_file rw_fifo_file_perms; +-allow gnomeclock_t self:unix_stream_socket { accept listen }; ++allow gnomeclock_t self:unix_stream_socket create_stream_socket_perms; ++allow gnomeclock_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(gnomeclock_t, gnomeclock_tmp_t, gnomeclock_tmp_t) ++manage_files_pattern(gnomeclock_t, gnomeclock_tmp_t, gnomeclock_tmp_t) ++manage_lnk_files_pattern(gnomeclock_t, gnomeclock_tmp_t, gnomeclock_tmp_t) ++files_tmp_filetrans(gnomeclock_t, gnomeclock_tmp_t, { file dir }) + + kernel_read_system_state(gnomeclock_t) + + corecmd_exec_bin(gnomeclock_t) + corecmd_exec_shell(gnomeclock_t) ++corecmd_dontaudit_access_check_bin(gnomeclock_t) + +-corenet_all_recvfrom_unlabeled(gnomeclock_t) +-corenet_all_recvfrom_netlabel(gnomeclock_t) +-corenet_tcp_sendrecv_generic_if(gnomeclock_t) +-corenet_tcp_sendrecv_generic_node(gnomeclock_t) ++corenet_tcp_connect_time_port(gnomeclock_t) + +-# tcp:37 (time) +-corenet_sendrecv_inetd_child_client_packets(gnomeclock_t) +-corenet_tcp_connect_inetd_child_port(gnomeclock_t) +-corenet_tcp_sendrecv_inetd_child_port(gnomeclock_t) +- +-dev_read_sysfs(gnomeclock_t) +-dev_read_urand(gnomeclock_t) + dev_rw_realtime_clock(gnomeclock_t) ++dev_read_urand(gnomeclock_t) ++dev_write_kmsg(gnomeclock_t) ++dev_read_sysfs(gnomeclock_t) + +-files_read_usr_files(gnomeclock_t) ++files_read_etc_runtime_files(gnomeclock_t) + + fs_getattr_xattr_fs(gnomeclock_t) + + auth_use_nsswitch(gnomeclock_t) + ++init_dbus_chat(gnomeclock_t) ++ ++logging_stream_connect_syslog(gnomeclock_t) + logging_send_syslog_msg(gnomeclock_t) + +-miscfiles_etc_filetrans_localization(gnomeclock_t) + miscfiles_manage_localization(gnomeclock_t) +-miscfiles_read_localization(gnomeclock_t) ++miscfiles_etc_filetrans_localization(gnomeclock_t) + + userdom_read_all_users_state(gnomeclock_t) + + optional_policy(` +- chronyd_initrc_domtrans(gnomeclock_t) ++ chronyd_systemctl(gnomeclock_t) + ') + + optional_policy(` ++ clock_read_adjtime(gnomeclock_t) + clock_domtrans(gnomeclock_t) + ') + + optional_policy(` +- dbus_system_domain(gnomeclock_t, gnomeclock_exec_t) ++ consolekit_dbus_chat(gnomeclock_t) ++') + +- optional_policy(` +- consolekit_dbus_chat(gnomeclock_t) +- ') ++optional_policy(` ++ consoletype_exec(gnomeclock_t) ++') + +- optional_policy(` +- policykit_dbus_chat(gnomeclock_t) +- ') ++optional_policy(` ++dbus_system_domain(gnomeclock_t, gnomeclock_exec_t) ++') ++ ++optional_policy(` ++ gnome_manage_usr_config(gnomeclock_t) ++ gnome_manage_home_config(gnomeclock_t) ++ gnome_filetrans_admin_home_content(gnomeclock_t) + ') + + optional_policy(` + ntp_domtrans_ntpdate(gnomeclock_t) + ntp_initrc_domtrans(gnomeclock_t) ++ init_dontaudit_getattr_all_script_files(gnomeclock_t) ++ init_dontaudit_getattr_exec(gnomeclock_t) ++ ntp_systemctl(gnomeclock_t) + ') + + optional_policy(` ++ policykit_dbus_chat(gnomeclock_t) + policykit_domtrans_auth(gnomeclock_t) + policykit_read_lib(gnomeclock_t) + policykit_read_reload(gnomeclock_t) +diff --git a/gpg.fc b/gpg.fc +index 888cd2c68b..c02fa56941 100644 +--- a/gpg.fc ++++ b/gpg.fc +@@ -1,10 +1,14 @@ +-HOME_DIR/\.gnupg(/.+)? gen_context(system_u:object_r:gpg_secret_t,s0) +-HOME_DIR/\.gnupg/log-socket -s gen_context(system_u:object_r:gpg_agent_tmp_t,s0) ++HOME_DIR/\.gnupg(/.+)? gen_context(system_u:object_r:gpg_secret_t,s0) ++HOME_DIR/\.gnupg/log-socket gen_context(system_u:object_r:gpg_agent_tmp_t,s0) ++ ++/etc/mail/spamassassin/sa-update-keys(/.*)? gen_context(system_u:object_r:gpg_secret_t,s0) ++ ++/root/\.gnupg(/.+)? gen_context(system_u:object_r:gpg_secret_t,s0) + + /usr/bin/gpg(2)? -- gen_context(system_u:object_r:gpg_exec_t,s0) +-/usr/bin/gpgsm -- gen_context(system_u:object_r:gpg_exec_t,s0) ++/usr/bin/gpgsm -- gen_context(system_u:object_r:gpg_exec_t,s0) + /usr/bin/gpg-agent -- gen_context(system_u:object_r:gpg_agent_exec_t,s0) + /usr/bin/pinentry.* -- gen_context(system_u:object_r:pinentry_exec_t,s0) + + /usr/lib/gnupg/.* -- gen_context(system_u:object_r:gpg_exec_t,s0) +-/usr/lib/gnupg/gpgkeys.* -- gen_context(system_u:object_r:gpg_helper_exec_t,s0) ++/usr/lib/gnupg/gpgkeys.* -- gen_context(system_u:object_r:gpg_helper_exec_t,s0) +diff --git a/gpg.if b/gpg.if +index 180f1b7cc7..60be406a9f 100644 +--- a/gpg.if ++++ b/gpg.if +@@ -2,57 +2,79 @@ + + ############################################################ + ## +-## Role access for gpg. ++## Role access for gpg + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + # + interface(`gpg_role',` + gen_require(` +- attribute_role gpg_roles, gpg_agent_roles, gpg_helper_roles, gpg_pinentry_roles; +- type gpg_t, gpg_exec_t, gpg_agent_t; +- type gpg_agent_exec_t, gpg_agent_tmp_t, gpg_helper_t; +- type gpg_pinentry_t, gpg_pinentry_tmp_t, gpg_secret_t; ++ attribute_role gpg_roles, gpg_agent_roles, gpg_helper_roles, gpg_pinentry_roles; ++ type gpg_t, gpg_exec_t; ++ type gpg_agent_t, gpg_agent_exec_t; ++ type gpg_agent_tmp_t; ++ type gpg_helper_t, gpg_pinentry_t; ++ type gpg_pinentry_tmp_t; + ') + +- roleattribute $1 gpg_roles; +- roleattribute $1 gpg_agent_roles; +- roleattribute $1 gpg_helper_roles; +- roleattribute $1 gpg_pinentry_roles; ++ roleattribute $1 gpg_roles; ++ roleattribute $1 gpg_agent_roles; ++ roleattribute $1 gpg_helper_roles; ++ roleattribute $1 gpg_pinentry_roles; + ++ # transition from the userdomain to the derived domain + domtrans_pattern($2, gpg_exec_t, gpg_t) +- domtrans_pattern($2, gpg_agent_exec_t, gpg_agent_t) + +- allow $2 { gpg_t gpg_agent_t gpg_helper_t gpg_pinentry_t }:process { ptrace signal_perms }; +- ps_process_pattern($2, { gpg_t gpg_agent_t gpg_helper_t gpg_pinentry_t }) ++ # allow ps to show gpg ++ ps_process_pattern($2, gpg_t) ++ allow $2 gpg_t:process { signull sigstop signal sigkill }; + +- allow gpg_pinentry_t $2:process signull; ++ # communicate with the user + allow gpg_helper_t $2:fd use; +- allow { gpg_t gpg_agent_t gpg_helper_t gpg_pinentry_t } $2:fifo_file { read write }; ++ allow gpg_helper_t $2:fifo_file write; ++ ++ # allow ps to show gpg-agent ++ ps_process_pattern($2, gpg_agent_t) ++ ++ # Allow the user shell to signal the gpg-agent program. ++ allow $2 gpg_agent_t:process { signal sigkill }; ++ ++ manage_dirs_pattern($2, gpg_agent_tmp_t, gpg_agent_tmp_t) ++ manage_files_pattern($2, gpg_agent_tmp_t, gpg_agent_tmp_t) ++ manage_sock_files_pattern($2, gpg_agent_tmp_t, gpg_agent_tmp_t) ++ files_tmp_filetrans(gpg_agent_t, gpg_agent_tmp_t, { file sock_file dir }) ++ ++ # Transition from the user domain to the agent domain. ++ domtrans_pattern($2, gpg_agent_exec_t, gpg_agent_t) ++ ++ manage_sock_files_pattern($2, gpg_pinentry_tmp_t, gpg_pinentry_tmp_t) ++ relabel_sock_files_pattern($2, gpg_pinentry_tmp_t, gpg_pinentry_tmp_t) + +- allow $2 { gpg_agent_tmp_t gpg_secret_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { gpg_agent_tmp_t gpg_secret_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 gpg_secret_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- allow $2 { gpg_agent_tmp_t gpg_pinentry_tmp_t gpg_secret_t }:sock_file { manage_sock_file_perms relabel_sock_file_perms }; +- filetrans_pattern($2, gpg_secret_t, gpg_agent_tmp_t, sock_file, "log-socket") +- userdom_user_home_dir_filetrans($2, gpg_secret_t, dir, ".gnupg") ++ allow gpg_pinentry_t $2:fifo_file { read write }; + + optional_policy(` + gpg_pinentry_dbus_chat($2) + ') ++ ++ allow $2 gpg_agent_t:unix_stream_socket { rw_socket_perms connectto }; ++ ifdef(`hide_broken_symptoms',` ++ #Leaked File Descriptors ++ dontaudit gpg_t $2:fifo_file rw_fifo_file_perms; ++ dontaudit gpg_agent_t $2:fifo_file rw_fifo_file_perms; ++ ') + ') + + ######################################## + ## +-## Execute the gpg in the gpg domain. ++## Transition to a user gpg domain. + ## + ## + ## +@@ -65,13 +87,12 @@ interface(`gpg_domtrans',` + type gpg_t, gpg_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, gpg_exec_t, gpg_t) + ') + +-######################################## ++###################################### + ## +-## Execute the gpg in the caller domain. ++## Execute gpg in the caller domain. + ## + ## + ## +@@ -88,76 +109,46 @@ interface(`gpg_exec',` + can_exec($1, gpg_exec_t) + ') + +-######################################## +-## +-## Execute gpg in a specified domain. +-## +-## +-##

      +-## Execute gpg in a specified domain. +-##

      +-##

      +-## No interprocess communication (signals, pipes, +-## etc.) is provided by this interface since +-## the domains are not owned by this module. +-##

      +-##
      +-## +-## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Domain to transition to. +-## +-## +-# +-interface(`gpg_spec_domtrans',` +- gen_require(` +- type gpg_exec_t; +- ') +- +- corecmd_search_bin($1) +- domain_auto_trans($1, gpg_exec_t, $2) +-') +- + ###################################### + ## +-## Execute gpg in the gpg web domain. (Deprecated) ++## Transition to a gpg web domain. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`gpg_domtrans_web',` +- refpolicywarn(`$0($*) has been deprecated.') ++ gen_require(` ++ type gpg_web_t, gpg_exec_t; ++ ') ++ ++ domtrans_pattern($1, gpg_exec_t, gpg_web_t) + ') + + ###################################### + ## +-## Make gpg executable files an +-## entrypoint for the specified domain. ++## Make gpg an entrypoint for ++## the specified domain. + ## + ## +-## +-## The domain for which gpg_exec_t is an entrypoint. +-## ++## ++## The domain for which cifs_t is an entrypoint. ++## + ## + # + interface(`gpg_entry_type',` +- gen_require(` +- type gpg_exec_t; +- ') ++ gen_require(` ++ type gpg_exec_t; ++ ') + +- domain_entry_file($1, gpg_exec_t) ++ domain_entry_file($1, gpg_exec_t) + ') + + ######################################## + ## +-## Send generic signals to gpg. ++## Send generic signals to user gpg processes. + ## + ## + ## +@@ -175,7 +166,7 @@ interface(`gpg_signal',` + + ######################################## + ## +-## Read and write gpg agent pipes. ++## Read and write GPG agent pipes. + ## + ## + ## +@@ -184,6 +175,7 @@ interface(`gpg_signal',` + ## + # + interface(`gpg_rw_agent_pipes',` ++ # Just wants read/write could this be a leak? + gen_require(` + type gpg_agent_t; + ') +@@ -193,8 +185,8 @@ interface(`gpg_rw_agent_pipes',` + + ######################################## + ## +-## Send messages to and from gpg +-## pinentry over DBUS. ++## Send messages to and from GPG ++## Pinentry over DBUS. + ## + ## + ## +@@ -214,7 +206,7 @@ interface(`gpg_pinentry_dbus_chat',` + + ######################################## + ## +-## List gpg user secrets. ++## List Gnu Privacy Guard user secrets. + ## + ## + ## +@@ -230,3 +222,75 @@ interface(`gpg_list_user_secrets',` + list_dirs_pattern($1, gpg_secret_t, gpg_secret_t) + userdom_search_user_home_dirs($1) + ') ++########################### ++## ++## Allow to manage gpg named home content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gpg_manage_home_content',` ++ gen_require(` ++ type gpg_secret_t; ++ ') ++ ++ manage_files_pattern($1, gpg_secret_t, gpg_secret_t) ++ manage_dirs_pattern($1, gpg_secret_t, gpg_secret_t) ++ userdom_user_home_dir_filetrans($1, gpg_secret_t, dir, ".gnupg") ++') ++######################################## ++## ++## Transition to gpg named home content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gpg_filetrans_home_content',` ++ gen_require(` ++ type gpg_secret_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, gpg_secret_t, dir, ".gnupg") ++') ++ ++######################################## ++## ++## Connected to gpg_agent_t unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gpg_agent_stream_connect',` ++ gen_require(` ++ type gpg_agent_t; ++ ') ++ ++ allow $1 gpg_agent_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## Connected to gpg_agent_t unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gpg_noatsecure',` ++ gen_require(` ++ type gpg_t; ++ ') ++ ++ allow $1 gpg_t:process { noatsecure rlimitinh siginh }; ++') +diff --git a/gpg.te b/gpg.te +index 0e97e82f14..0e6cf4a073 100644 +--- a/gpg.te ++++ b/gpg.te +@@ -4,15 +4,7 @@ policy_module(gpg, 2.8.0) + # + # Declarations + # +- +-## +-##

      +-## Determine whether GPG agent can manage +-## generic user home content files. This is +-## required by the --write-env-file option. +-##

      +-##
      +-gen_tunable(gpg_agent_env_file, false) ++attribute gpgdomain; + + attribute_role gpg_roles; + roleattribute system_r gpg_roles; +@@ -24,7 +16,15 @@ roleattribute system_r gpg_helper_roles; + + attribute_role gpg_pinentry_roles; + +-type gpg_t; ++## ++##

      ++## Allow gpg web domain to modify public files ++## used for public file transfer services. ++##

      ++##
      ++gen_tunable(gpg_web_anon_write, false) ++ ++type gpg_t, gpgdomain; + type gpg_exec_t; + typealias gpg_t alias { user_gpg_t staff_gpg_t sysadm_gpg_t }; + typealias gpg_t alias { auditadm_gpg_t secadm_gpg_t }; +@@ -69,95 +69,109 @@ type gpg_pinentry_tmpfs_t; + userdom_user_tmpfs_file(gpg_pinentry_tmpfs_t) + + optional_policy(` +- pulseaudio_tmpfs_content(gpg_pinentry_tmpfs_t) ++ pulseaudio_tmpfs_content(gpg_pinentry_tmpfs_t) + ') + ++type gpg_web_t; ++domain_type(gpg_web_t) ++gpg_entry_type(gpg_web_t) ++role system_r types gpg_web_t; ++ ++type gpg_tmpfs_t; ++files_tmpfs_file(gpg_tmpfs_t) ++ + ######################################## + # +-# Local policy ++# GPG local policy + # + +-allow gpg_t self:capability { ipc_lock setuid }; +-allow gpg_t self:process { signal signull setrlimit getcap setcap getsched setsched setpgid }; +-dontaudit gpg_t self:netlink_audit_socket r_netlink_socket_perms; +-allow gpg_t self:fifo_file rw_fifo_file_perms; +-allow gpg_t self:tcp_socket { accept listen }; ++allow gpgdomain self:capability { ipc_lock setuid }; ++allow gpgdomain self:process { getsched setsched }; ++#at setrlimit is for ulimit -c 0 ++allow gpgdomain self:process { signal signull setrlimit getcap setcap setpgid }; ++dontaudit gpgdomain self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; ++allow gpgdomain self:netlink_kobject_uevent_socket create_socket_perms; ++allow gpgdomain self:netlink_audit_socket { create_socket_perms nlmsg_relay }; ++ ++allow gpgdomain self:fifo_file rw_fifo_file_perms; ++allow gpgdomain self:tcp_socket create_stream_socket_perms; + + manage_dirs_pattern(gpg_t, gpg_agent_tmp_t, gpg_agent_tmp_t) + manage_files_pattern(gpg_t, gpg_agent_tmp_t, gpg_agent_tmp_t) + files_tmp_filetrans(gpg_t, gpg_agent_tmp_t, { dir file }) + +-manage_dirs_pattern(gpg_t, gpg_secret_t, gpg_secret_t) ++allow gpg_t gpg_secret_t:dir create_dir_perms; + manage_sock_files_pattern(gpg_t, gpg_secret_t, gpg_secret_t) + manage_files_pattern(gpg_t, gpg_secret_t, gpg_secret_t) + manage_lnk_files_pattern(gpg_t, gpg_secret_t, gpg_secret_t) +-userdom_user_home_dir_filetrans(gpg_t, gpg_secret_t, dir) +- +-stream_connect_pattern(gpg_t, gpg_agent_tmp_t, gpg_agent_tmp_t, gpg_agent_t) +- +-domtrans_pattern(gpg_t, gpg_agent_exec_t, gpg_agent_t) +-domtrans_pattern(gpg_t, gpg_helper_exec_t, gpg_helper_t) ++userdom_user_home_dir_filetrans(gpg_t, gpg_secret_t, dir, ".gnupg") + + kernel_read_sysctl(gpg_t) ++kernel_read_system_state(gpg_t) ++kernel_getattr_core_if(gpg_t) + + corecmd_exec_shell(gpg_t) + corecmd_exec_bin(gpg_t) + +-corenet_all_recvfrom_unlabeled(gpg_t) + corenet_all_recvfrom_netlabel(gpg_t) + corenet_tcp_sendrecv_generic_if(gpg_t) ++corenet_udp_sendrecv_generic_if(gpg_t) + corenet_tcp_sendrecv_generic_node(gpg_t) +- +-corenet_sendrecv_all_client_packets(gpg_t) +-corenet_tcp_connect_all_ports(gpg_t) ++corenet_udp_sendrecv_generic_node(gpg_t) + corenet_tcp_sendrecv_all_ports(gpg_t) ++corenet_udp_sendrecv_all_ports(gpg_t) ++corenet_tcp_connect_all_ports(gpg_t) ++corenet_sendrecv_all_client_packets(gpg_t) + +-dev_read_generic_usb_dev(gpg_t) + dev_read_rand(gpg_t) + dev_read_urand(gpg_t) +- +-files_read_usr_files(gpg_t) +-files_dontaudit_search_var(gpg_t) ++dev_read_generic_usb_dev(gpg_t) ++dev_dontaudit_getattr_all(gpg_t) ++dev_list_sysfs(gpg_t) ++dev_read_sysfs(gpg_t) ++dev_rw_generic_usb_dev(gpg_t) + + fs_getattr_xattr_fs(gpg_t) + fs_list_inotifyfs(gpg_t) + + domain_use_interactive_fds(gpg_t) + ++files_dontaudit_search_var(gpg_t) ++ + auth_use_nsswitch(gpg_t) + +-logging_send_syslog_msg(gpg_t) ++init_dontaudit_getattr_initctl(gpg_t) + +-miscfiles_read_localization(gpg_t) ++logging_send_syslog_msg(gpg_t) + +-userdom_use_user_terminals(gpg_t) ++term_search_ptys(gpg_t) + +-userdom_manage_user_tmp_files(gpg_t) ++userdom_use_inherited_user_terminals(gpg_t) ++# sign/encrypt user files ++userdom_manage_all_user_tmp_content(gpg_t) ++#userdom_manage_user_home_content(gpg_t) + userdom_manage_user_home_content_files(gpg_t) +-userdom_user_home_dir_filetrans_user_home_content(gpg_t, file) ++userdom_manage_user_home_content_dirs(gpg_t) ++userdom_filetrans_home_content(gpg_t) ++userdom_stream_connect(gpg_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(gpg_t) +- fs_manage_nfs_files(gpg_t) +-') ++mta_manage_config(gpg_t) ++mta_read_spool(gpg_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(gpg_t) +- fs_manage_cifs_files(gpg_t) +-') ++userdom_home_manager(gpg_t) + + optional_policy(` +- gnome_read_generic_home_content(gpg_t) +- gnome_stream_connect_all_gkeyringd(gpg_t) ++ gpm_dontaudit_getattr_gpmctl(gpg_t) + ') + + optional_policy(` +- mozilla_dontaudit_rw_user_home_files(gpg_t) ++ gnome_manage_config(gpg_t) ++ gnome_stream_connect_gkeyringd(gpg_t) + ') + + optional_policy(` +- mta_read_spool_files(gpg_t) +- mta_write_config(gpg_t) ++ mozilla_read_user_home_files(gpg_t) ++ mozilla_write_user_home_files(gpg_t) + ') + + optional_policy(` +@@ -165,37 +179,55 @@ optional_policy(` + ') + + optional_policy(` +- cron_system_entry(gpg_t, gpg_exec_t) +- cron_read_system_job_tmp_files(gpg_t) ++ xserver_use_xdm_fds(gpg_t) ++ xserver_rw_xdm_pipes(gpg_t) + ') + + optional_policy(` +- xserver_use_xdm_fds(gpg_t) +- xserver_rw_xdm_pipes(gpg_t) ++ udev_read_db(gpg_t) + ') + ++#optional_policy(` ++# cron_system_entry(gpg_t, gpg_exec_t) ++# cron_read_system_job_tmp_files(gpg_t) ++#') ++ + ######################################## + # +-# Helper local policy ++# GPG helper local policy + # + ++domtrans_pattern(gpg_t, gpg_agent_exec_t, gpg_agent_t) ++ + allow gpg_helper_t self:process { getsched setsched }; ++ ++# for helper programs (which automatically fetch keys) ++# Note: this is only tested with the hkp interface. If you use eg the ++# mail interface you will likely need additional permissions. ++ + allow gpg_helper_t self:unix_stream_socket create_stream_socket_perms; ++allow gpg_helper_t self:tcp_socket { connect connected_socket_perms }; ++allow gpg_helper_t self:udp_socket { connect connected_socket_perms }; + +-dontaudit gpg_helper_t gpg_secret_t:file read_file_perms; ++dontaudit gpg_helper_t gpg_secret_t:file read; + +-corenet_all_recvfrom_unlabeled(gpg_helper_t) + corenet_all_recvfrom_netlabel(gpg_helper_t) + corenet_tcp_sendrecv_generic_if(gpg_helper_t) ++corenet_raw_sendrecv_generic_if(gpg_helper_t) ++corenet_udp_sendrecv_generic_if(gpg_helper_t) + corenet_tcp_sendrecv_generic_node(gpg_helper_t) ++corenet_udp_sendrecv_generic_node(gpg_helper_t) ++corenet_raw_sendrecv_generic_node(gpg_helper_t) + corenet_tcp_sendrecv_all_ports(gpg_helper_t) +- +-corenet_sendrecv_all_client_packets(gpg_helper_t) ++corenet_udp_sendrecv_all_ports(gpg_helper_t) ++corenet_tcp_bind_generic_node(gpg_helper_t) ++corenet_udp_bind_generic_node(gpg_helper_t) + corenet_tcp_connect_all_ports(gpg_helper_t) + ++ + auth_use_nsswitch(gpg_helper_t) + +-userdom_use_user_terminals(gpg_helper_t) ++userdom_use_inherited_user_terminals(gpg_helper_t) + + tunable_policy(`use_nfs_home_dirs',` + fs_dontaudit_rw_nfs_files(gpg_helper_t) +@@ -207,67 +239,97 @@ tunable_policy(`use_samba_home_dirs',` + + ######################################## + # +-# Agent local policy ++# GPG agent local policy + # ++domtrans_pattern(gpg_t, gpg_agent_exec_t, gpg_agent_t) ++ ++# rlimit: gpg-agent wants to prevent coredumps ++allow gpg_agent_t self:process { setrlimit signal_perms }; + +-allow gpg_agent_t self:process setrlimit; +-allow gpg_agent_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow gpg_agent_t self:unix_stream_socket { create_stream_socket_perms connectto } ; + allow gpg_agent_t self:fifo_file rw_fifo_file_perms; ++allow gpg_agent_t self:netlink_kobject_uevent_socket create_socket_perms; + ++# read and write ~/.gnupg (gpg-agent stores secret keys in ~/.gnupg/private-keys-v1.d ) + manage_dirs_pattern(gpg_agent_t, gpg_secret_t, gpg_secret_t) + manage_sock_files_pattern(gpg_agent_t, gpg_secret_t, gpg_secret_t) + manage_files_pattern(gpg_agent_t, gpg_secret_t, gpg_secret_t) + manage_lnk_files_pattern(gpg_agent_t, gpg_secret_t, gpg_secret_t) + ++# Allow the gpg-agent to manage its tmp files (socket) + manage_dirs_pattern(gpg_agent_t, gpg_agent_tmp_t, gpg_agent_tmp_t) + manage_files_pattern(gpg_agent_t, gpg_agent_tmp_t, gpg_agent_tmp_t) + manage_sock_files_pattern(gpg_agent_t, gpg_agent_tmp_t, gpg_agent_tmp_t) + files_tmp_filetrans(gpg_agent_t, gpg_agent_tmp_t, { file sock_file dir }) + +-filetrans_pattern(gpg_agent_t, gpg_secret_t, gpg_agent_tmp_t, sock_file, "log-socket") ++manage_dirs_pattern(gpg_t, gpg_tmpfs_t, gpg_tmpfs_t) ++manage_files_pattern(gpg_t, gpg_tmpfs_t, gpg_tmpfs_t) ++manage_sock_files_pattern(gpg_t, gpg_tmpfs_t, gpg_tmpfs_t) ++fs_tmpfs_filetrans(gpg_t, gpg_tmpfs_t, { dir file sock_file }) + +-domtrans_pattern(gpg_agent_t, pinentry_exec_t, gpg_pinentry_t) ++# allow gpg to connect to the gpg agent ++stream_connect_pattern(gpg_t, gpg_agent_tmp_t, gpg_agent_tmp_t, gpg_agent_t) + +-kernel_dontaudit_search_sysctl(gpg_agent_t) ++kernel_read_system_state(gpg_agent_t) ++kernel_read_core_if(gpg_agent_t) + ++corecmd_read_bin_symlinks(gpg_agent_t) ++corecmd_exec_bin(gpg_agent_t) + corecmd_exec_shell(gpg_agent_t) + + dev_read_rand(gpg_agent_t) + dev_read_urand(gpg_agent_t) ++dev_rw_generic_usb_dev(gpg_agent_t) ++dev_list_sysfs(gpg_agent_t) ++dev_read_sysfs(gpg_agent_t) ++dev_dontaudit_getattr_all_chr_files(gpg_agent_t) ++dev_dontaudit_getattr_all_blk_files(gpg_agent_t) + + domain_use_interactive_fds(gpg_agent_t) + + fs_dontaudit_list_inotifyfs(gpg_agent_t) + +-miscfiles_read_localization(gpg_agent_t) ++init_getattr_initctl(gpg_agent_t) ++ ++logging_send_syslog_msg(gpg_agent_t) + +-userdom_use_user_terminals(gpg_agent_t) ++miscfiles_read_certs(gpg_agent_t) ++ ++# Write to the user domain tty. ++userdom_use_inherited_user_terminals(gpg_agent_t) ++# read and write ~/.gnupg (gpg-agent stores secret keys in ~/.gnupg/private-keys-v1.d ) + userdom_search_user_home_dirs(gpg_agent_t) ++userdom_filetrans_home_content(gpg_agent_t) ++ ++userdom_manage_user_home_content_dirs(gpg_agent_t) ++userdom_manage_user_home_content_files(gpg_agent_t) ++userdom_manage_all_user_tmp_content(gpg_agent_t) + + ifdef(`hide_broken_symptoms',` + userdom_dontaudit_read_user_tmp_files(gpg_agent_t) ++ userdom_dontaudit_write_user_tmp_files(gpg_agent_t) + ') + +-tunable_policy(`gpg_agent_env_file',` +- userdom_manage_user_home_content_dirs(gpg_agent_t) +- userdom_manage_user_home_content_files(gpg_agent_t) +- userdom_user_home_dir_filetrans_user_home_content(gpg_agent_t, file) ++userdom_home_manager(gpg_agent_t) ++ ++optional_policy(` ++ gnome_manage_config(gpg_agent_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(gpg_agent_t) +- fs_manage_nfs_files(gpg_agent_t) +- fs_manage_nfs_symlinks(gpg_agent_t) ++optional_policy(` ++ mozilla_dontaudit_rw_user_home_files(gpg_agent_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(gpg_agent_t) +- fs_manage_cifs_files(gpg_agent_t) +- fs_manage_cifs_symlinks(gpg_agent_t) ++optional_policy(` ++ pcscd_stream_connect(gpg_agent_t) + ') + + optional_policy(` +- mozilla_dontaudit_rw_user_home_files(gpg_agent_t) ++ gpm_getattr_gpmctl(gpg_agent_t) ++') ++ ++optional_policy(` ++ udev_read_db(gpg_agent_t) + ') + + ############################## +@@ -277,63 +339,121 @@ optional_policy(` + + allow gpg_pinentry_t self:process { getcap getsched setsched signal }; + allow gpg_pinentry_t self:fifo_file rw_fifo_file_perms; ++allow gpg_pinentry_t self:netlink_route_socket create_netlink_socket_perms; + allow gpg_pinentry_t self:shm create_shm_perms; +-allow gpg_pinentry_t self:tcp_socket { accept listen }; ++allow gpg_pinentry_t self:tcp_socket create_stream_socket_perms; ++allow gpg_pinentry_t self:unix_dgram_socket sendto; ++allow gpg_pinentry_t self:unix_stream_socket { connect create getattr read shutdown write }; ++ ++can_exec(gpg_pinentry_t, pinentry_exec_t) ++ ++# we need to allow gpg-agent to call pinentry so it can get the passphrase ++# from the user. ++allow gpg_agent_t gpg_pinentry_t:process { siginh noatsecure rlimitinh }; ++domtrans_pattern(gpg_agent_t, pinentry_exec_t, gpg_pinentry_t) + + manage_sock_files_pattern(gpg_pinentry_t, gpg_pinentry_tmp_t, gpg_pinentry_tmp_t) + userdom_user_tmp_filetrans(gpg_pinentry_t, gpg_pinentry_tmp_t, sock_file) + ++manage_dirs_pattern(gpg_pinentry_t, gpg_agent_tmp_t, gpg_agent_tmp_t) ++manage_files_pattern(gpg_pinentry_t, gpg_agent_tmp_t, gpg_agent_tmp_t) ++manage_sock_files_pattern(gpg_pinentry_t, gpg_agent_tmp_t, gpg_agent_tmp_t) ++files_tmp_filetrans(gpg_pinentry_t, gpg_agent_tmp_t, { dir sock_file file }) ++ + manage_dirs_pattern(gpg_pinentry_t, gpg_pinentry_tmpfs_t, gpg_pinentry_tmpfs_t) + manage_files_pattern(gpg_pinentry_t, gpg_pinentry_tmpfs_t, gpg_pinentry_tmpfs_t) + fs_tmpfs_filetrans(gpg_pinentry_t, gpg_pinentry_tmpfs_t, { file dir }) + +-can_exec(gpg_pinentry_t, pinentry_exec_t) ++# read and write ~/.gnupg (gpg-agent stores secret keys in ~/.gnupg/private-keys-v1.d ) ++manage_dirs_pattern(gpg_pinentry_t, gpg_secret_t, gpg_secret_t) ++manage_sock_files_pattern(gpg_pinentry_t, gpg_secret_t, gpg_secret_t) ++manage_files_pattern(gpg_pinentry_t, gpg_secret_t, gpg_secret_t) ++manage_lnk_files_pattern(gpg_pinentry_t, gpg_secret_t, gpg_secret_t) + ++# read /proc/meminfo + kernel_read_system_state(gpg_pinentry_t) + + corecmd_exec_shell(gpg_pinentry_t) + corecmd_exec_bin(gpg_pinentry_t) + + corenet_all_recvfrom_netlabel(gpg_pinentry_t) +-corenet_all_recvfrom_unlabeled(gpg_pinentry_t) ++corenet_sendrecv_pulseaudio_client_packets(gpg_pinentry_t) ++corenet_tcp_bind_generic_node(gpg_pinentry_t) ++corenet_tcp_connect_pulseaudio_port(gpg_pinentry_t) + corenet_tcp_sendrecv_generic_if(gpg_pinentry_t) + corenet_tcp_sendrecv_generic_node(gpg_pinentry_t) ++corenet_tcp_sendrecv_generic_port(gpg_pinentry_t) + + dev_read_urand(gpg_pinentry_t) + dev_read_rand(gpg_pinentry_t) + +-domain_use_interactive_fds(gpg_pinentry_t) +- +-files_read_usr_files(gpg_pinentry_t) ++# read /etc/X11/qtrc + + fs_dontaudit_list_inotifyfs(gpg_pinentry_t) ++fs_getattr_all_fs(gpg_pinentry_t) + + auth_use_nsswitch(gpg_pinentry_t) + + logging_send_syslog_msg(gpg_pinentry_t) + + miscfiles_read_fonts(gpg_pinentry_t) +-miscfiles_read_localization(gpg_pinentry_t) + ++term_search_ptys(gpg_pinentry_t) ++ ++# for .Xauthority ++userdom_read_user_home_content_files(gpg_pinentry_t) ++userdom_read_user_tmp_files(gpg_pinentry_t) ++# Bug: user pulseaudio files need open,read and unlink: ++allow gpg_pinentry_t user_tmp_t:file unlink; ++userdom_signull_unpriv_users(gpg_pinentry_t) + userdom_use_user_terminals(gpg_pinentry_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(gpg_pinentry_t) +-') ++userdom_home_reader(gpg_pinentry_t) ++userdom_stream_connect(gpg_pinentry_t) ++userdom_map_tmp_files(gpg_pinentry_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(gpg_pinentry_t) ++optional_policy(` ++ gnome_manage_home_config(gpg_pinentry_t) + ') + + optional_policy(` +- dbus_all_session_bus_client(gpg_pinentry_t) ++ dbus_session_bus_client(gpg_pinentry_t) + dbus_system_bus_client(gpg_pinentry_t) + ') + + optional_policy(` +- pulseaudio_run(gpg_pinentry_t, gpg_pinentry_roles) ++ gnome_write_generic_cache_files(gpg_pinentry_t) ++ gnome_read_generic_cache_files(gpg_pinentry_t) ++ gnome_read_gconf_home_files(gpg_pinentry_t) ++') ++ ++optional_policy(` ++ pulseaudio_run(gpg_pinentry_t, gpg_pinentry_roles) ++ pulseaudio_stream_connect(gpg_pinentry_t) + ') + + optional_policy(` + xserver_user_x_domain_template(gpg_pinentry, gpg_pinentry_t, gpg_pinentry_tmpfs_t) ++ ++') ++ ++############################# ++# ++# gpg web local policy ++# ++ ++allow gpg_web_t self:process setrlimit; ++ ++dev_read_rand(gpg_web_t) ++dev_read_urand(gpg_web_t) ++ ++can_exec(gpg_web_t, gpg_exec_t) ++ ++ ++ ++apache_dontaudit_rw_tmp_files(gpg_web_t) ++apache_manage_sys_content_rw(gpg_web_t) ++ ++tunable_policy(`gpg_web_anon_write',` ++ miscfiles_manage_public_files(gpg_web_t) + ') +diff --git a/gpm.te b/gpm.te +index 69734fd157..a659808d09 100644 +--- a/gpm.te ++++ b/gpm.te +@@ -13,7 +13,7 @@ type gpm_initrc_exec_t; + init_script_file(gpm_initrc_exec_t) + + type gpm_conf_t; +-files_type(gpm_conf_t) ++files_config_file(gpm_conf_t) + + type gpm_tmp_t; + files_tmp_file(gpm_tmp_t) +@@ -29,7 +29,7 @@ files_type(gpmctl_t) + # Local policy + # + +-allow gpm_t self:capability { setpcap setuid dac_override sys_admin sys_tty_config }; ++allow gpm_t self:capability { setpcap setuid dac_read_search dac_override sys_admin sys_tty_config }; + allow gpm_t self:process { signal signull getcap setcap }; + allow gpm_t self:unix_stream_socket { accept listen }; + +@@ -57,7 +57,6 @@ dev_read_sysfs(gpm_t) + dev_rw_input_dev(gpm_t) + dev_rw_mouse(gpm_t) + +-files_read_etc_files(gpm_t) + + fs_getattr_all_fs(gpm_t) + fs_search_auto_mountpoints(gpm_t) +@@ -68,11 +67,9 @@ domain_use_interactive_fds(gpm_t) + + logging_send_syslog_msg(gpm_t) + +-miscfiles_read_localization(gpm_t) +- +-userdom_use_user_terminals(gpm_t) + userdom_dontaudit_use_unpriv_user_fds(gpm_t) + userdom_dontaudit_search_user_home_dirs(gpm_t) ++userdom_use_inherited_user_terminals(gpm_t) + + optional_policy(` + seutil_sigchld_newrole(gpm_t) +diff --git a/gpsd.if b/gpsd.if +index 92eb564186..8aa8f66986 100644 +--- a/gpsd.if ++++ b/gpsd.if +@@ -63,6 +63,7 @@ interface(`gpsd_rw_shm',` + allow $1 gpsd_tmpfs_t:dir list_dir_perms; + rw_files_pattern($1, gpsd_tmpfs_t, gpsd_tmpfs_t) + read_lnk_files_pattern($1, gpsd_tmpfs_t, gpsd_tmpfs_t) ++ allow $1 gpsd_tmpfs_t:file map; + fs_search_tmpfs($1) + ') + +diff --git a/gpsd.te b/gpsd.te +index fe3895ece7..ce48f6c496 100644 +--- a/gpsd.te ++++ b/gpsd.te +@@ -28,15 +28,17 @@ files_pid_file(gpsd_var_run_t) + # + + allow gpsd_t self:capability { fowner fsetid setuid setgid sys_nice sys_time sys_tty_config }; +-dontaudit gpsd_t self:capability { dac_read_search dac_override }; +-allow gpsd_t self:process { setsched signal_perms }; ++dontaudit gpsd_t self:capability { sys_ptrace dac_read_search dac_override }; ++allow gpsd_t self:process { setsched signal_perms getsession }; + allow gpsd_t self:shm create_shm_perms; + allow gpsd_t self:unix_dgram_socket sendto; + allow gpsd_t self:tcp_socket { accept listen }; ++allow gpsd_t self:netlink_kobject_uevent_socket create_socket_perms; + + manage_dirs_pattern(gpsd_t, gpsd_tmpfs_t, gpsd_tmpfs_t) + manage_files_pattern(gpsd_t, gpsd_tmpfs_t, gpsd_tmpfs_t) + fs_tmpfs_filetrans(gpsd_t, gpsd_tmpfs_t, { dir file }) ++allow gpsd_t gpsd_tmpfs_t:file map; + + manage_files_pattern(gpsd_t, gpsd_var_run_t, gpsd_var_run_t) + manage_sock_files_pattern(gpsd_t, gpsd_var_run_t, gpsd_var_run_t) +@@ -62,13 +64,13 @@ domain_dontaudit_read_all_domains_state(gpsd_t) + + term_use_unallocated_ttys(gpsd_t) + term_setattr_unallocated_ttys(gpsd_t) ++term_use_usb_ttys(gpsd_t) ++term_setattr_usb_ttys(gpsd_t) + + auth_use_nsswitch(gpsd_t) + + logging_send_syslog_msg(gpsd_t) + +-miscfiles_read_localization(gpsd_t) +- + optional_policy(` + chronyd_rw_shm(gpsd_t) + chronyd_stream_connect(gpsd_t) +diff --git a/gssproxy.fc b/gssproxy.fc +new file mode 100644 +index 0000000000..f4659d1252 +--- /dev/null ++++ b/gssproxy.fc +@@ -0,0 +1,8 @@ ++/usr/lib/systemd/system/gssproxy.service -- gen_context(system_u:object_r:gssproxy_unit_file_t,s0) ++ ++/usr/sbin/gssproxy -- gen_context(system_u:object_r:gssproxy_exec_t,s0) ++ ++/var/lib/gssproxy(/.*)? gen_context(system_u:object_r:gssproxy_var_lib_t,s0) ++ ++/var/run/gssproxy\.pid -- gen_context(system_u:object_r:gssproxy_var_run_t,s0) ++/var/run/gssproxy\.sock -s gen_context(system_u:object_r:gssproxy_var_run_t,s0) +diff --git a/gssproxy.if b/gssproxy.if +new file mode 100644 +index 0000000000..8a2013af9b +--- /dev/null ++++ b/gssproxy.if +@@ -0,0 +1,217 @@ ++ ++## policy for gssproxy ++ ++######################################## ++## ++## Execute TEMPLATE in the gssproxy domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`gssproxy_domtrans',` ++ gen_require(` ++ type gssproxy_t, gssproxy_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, gssproxy_exec_t, gssproxy_t) ++') ++ ++######################################## ++## ++## Search gssproxy lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_search_lib',` ++ gen_require(` ++ type gssproxy_var_lib_t; ++ ') ++ ++ allow $1 gssproxy_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read gssproxy lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_read_lib_files',` ++ gen_require(` ++ type gssproxy_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, gssproxy_var_lib_t, gssproxy_var_lib_t) ++') ++ ++######################################## ++## ++## Manage gssproxy lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_manage_lib_files',` ++ gen_require(` ++ type gssproxy_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, gssproxy_var_lib_t, gssproxy_var_lib_t) ++') ++ ++######################################## ++## ++## Manage gssproxy lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_manage_lib_dirs',` ++ gen_require(` ++ type gssproxy_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, gssproxy_var_lib_t, gssproxy_var_lib_t) ++') ++ ++######################################## ++## ++## Read gssproxy PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_read_pid_files',` ++ gen_require(` ++ type gssproxy_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, gssproxy_var_run_t, gssproxy_var_run_t) ++') ++ ++######################################## ++## ++## Execute gssproxy server in the gssproxy domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`gssproxy_systemctl',` ++ gen_require(` ++ type gssproxy_t; ++ type gssproxy_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 gssproxy_unit_file_t:file read_file_perms; ++ allow $1 gssproxy_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, gssproxy_t) ++') ++ ++######################################## ++## ++## Connect to gssproxy over an unix ++## domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_stream_connect',` ++ gen_require(` ++ type gssproxy_t, gssproxy_var_run_t, gssproxy_var_lib_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, gssproxy_var_run_t, gssproxy_var_run_t, gssproxy_t) ++ stream_connect_pattern($1, gssproxy_var_lib_t, gssproxy_var_lib_t, gssproxy_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an gssproxy environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`gssproxy_admin',` ++ gen_require(` ++ type gssproxy_t; ++ type gssproxy_var_lib_t; ++ type gssproxy_var_run_t; ++ type gssproxy_unit_file_t; ++ ') ++ ++ allow $1 gssproxy_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, gssproxy_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, gssproxy_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, gssproxy_var_run_t) ++ ++ gssproxy_systemctl($1) ++ admin_pattern($1, gssproxy_unit_file_t) ++ allow $1 gssproxy_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Read and write to svirt_image devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`gssproxy_noatsecure',` ++ gen_require(` ++ type gssproxy_t; ++ ') ++ ++ allow $1 gssproxy_t:process { noatsecure rlimitinh }; ++') +diff --git a/gssproxy.te b/gssproxy.te +new file mode 100644 +index 0000000000..79e22c58a6 +--- /dev/null ++++ b/gssproxy.te +@@ -0,0 +1,74 @@ ++policy_module(gssproxy, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type gssproxy_t; ++type gssproxy_exec_t; ++init_daemon_domain(gssproxy_t, gssproxy_exec_t) ++ ++type gssproxy_var_lib_t; ++files_type(gssproxy_var_lib_t) ++ ++type gssproxy_var_run_t; ++files_pid_file(gssproxy_var_run_t) ++ ++type gssproxy_unit_file_t; ++systemd_unit_file(gssproxy_unit_file_t) ++ ++######################################## ++# ++# gssproxy local policy ++# ++allow gssproxy_t self:capability { setuid setgid dac_read_search dac_override }; ++allow gssproxy_t self:capability2 block_suspend; ++allow gssproxy_t self:fifo_file rw_fifo_file_perms; ++allow gssproxy_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(gssproxy_t, gssproxy_var_lib_t, gssproxy_var_lib_t) ++manage_files_pattern(gssproxy_t, gssproxy_var_lib_t, gssproxy_var_lib_t) ++manage_sock_files_pattern(gssproxy_t, gssproxy_var_lib_t, gssproxy_var_lib_t) ++manage_lnk_files_pattern(gssproxy_t, gssproxy_var_lib_t, gssproxy_var_lib_t) ++files_var_lib_filetrans(gssproxy_t, gssproxy_var_lib_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(gssproxy_t, gssproxy_var_run_t, gssproxy_var_run_t) ++manage_files_pattern(gssproxy_t, gssproxy_var_run_t, gssproxy_var_run_t) ++manage_sock_files_pattern(gssproxy_t, gssproxy_var_run_t, gssproxy_var_run_t) ++manage_lnk_files_pattern(gssproxy_t, gssproxy_var_run_t, gssproxy_var_run_t) ++files_pid_filetrans(gssproxy_t, gssproxy_var_run_t, { dir file lnk_file sock_file }) ++ ++kernel_rw_rpc_sysctls(gssproxy_t) ++ ++domain_use_interactive_fds(gssproxy_t) ++ ++files_read_etc_files(gssproxy_t) ++ ++fs_getattr_all_fs(gssproxy_t) ++ ++auth_use_nsswitch(gssproxy_t) ++ ++dev_read_urand(gssproxy_t) ++ ++logging_send_syslog_msg(gssproxy_t) ++ ++miscfiles_read_localization(gssproxy_t) ++ ++userdom_read_all_users_keys(gssproxy_t) ++userdom_manage_user_tmp_dirs(gssproxy_t) ++userdom_manage_user_tmp_files(gssproxy_t) ++ ++optional_policy(` ++ ipa_read_lib(gssproxy_t) ++') ++ ++optional_policy(` ++ kerberos_use(gssproxy_t) ++ kerberos_filetrans_named_content(gssproxy_t) ++') ++ ++optional_policy(` ++ kerberos_keytab_template(gssproxy, gssproxy_t) ++ kerberos_manage_host_rcache(gssproxy_t) ++') +diff --git a/guest.if b/guest.if +index ad1653f9ad..ff424b8e7f 100644 +--- a/guest.if ++++ b/guest.if +@@ -1,4 +1,4 @@ +-## Least privledge terminal user role. ++## Least privileged terminal user role. + + ######################################## + ## +diff --git a/guest.te b/guest.te +index 19cdbe1d74..0605776333 100644 +--- a/guest.te ++++ b/guest.te +@@ -20,4 +20,4 @@ optional_policy(` + apache_role(guest_r, guest_t) + ') + +-#gen_user(guest_u, user, guest_r, s0, s0) ++gen_user(guest_u, user, guest_r, s0, s0) +diff --git a/hadoop.te b/hadoop.te +index e151378405..04d173d1d0 100644 +--- a/hadoop.te ++++ b/hadoop.te +@@ -155,7 +155,6 @@ dev_read_urand(hadoop_t) + domain_use_interactive_fds(hadoop_t) + + files_dontaudit_search_spool(hadoop_t) +-files_read_usr_files(hadoop_t) + + fs_getattr_xattr_fs(hadoop_t) + +@@ -263,8 +262,6 @@ kernel_read_system_state(hadoop_initrc_domain) + corecmd_exec_bin(hadoop_initrc_domain) + corecmd_exec_shell(hadoop_initrc_domain) + +-files_read_etc_files(hadoop_initrc_domain) +-files_read_usr_files(hadoop_initrc_domain) + files_search_locks(hadoop_initrc_domain) + files_search_pids(hadoop_initrc_domain) + +@@ -453,7 +450,6 @@ dev_read_urand(zookeeper_t) + + domain_use_interactive_fds(zookeeper_t) + +-files_read_usr_files(zookeeper_t) + + auth_use_nsswitch(zookeeper_t) + +@@ -537,7 +533,6 @@ dev_read_rand(zookeeper_server_t) + dev_read_sysfs(zookeeper_server_t) + dev_read_urand(zookeeper_server_t) + +-files_read_usr_files(zookeeper_server_t) + + fs_getattr_xattr_fs(zookeeper_server_t) + +diff --git a/hal.te b/hal.te +index bbccc79f16..b02720214b 100644 +--- a/hal.te ++++ b/hal.te +@@ -61,7 +61,6 @@ files_type(hald_var_lib_t) + # Common local policy + # + +-files_read_usr_files(hald_domain) + + miscfiles_read_localization(hald_domain) + +@@ -116,7 +115,7 @@ kernel_rw_irq_sysctls(hald_t) + kernel_rw_vm_sysctls(hald_t) + kernel_write_proc_files(hald_t) + kernel_rw_net_sysctls(hald_t) +-kernel_setsched(hald_t) ++kernel_dontaudit_setsched(hald_t) + kernel_request_load_module(hald_t) + + corecmd_exec_all_executables(hald_t) +@@ -339,7 +338,7 @@ optional_policy(` + # ACL local policy + # + +-allow hald_acl_t self:capability { dac_override fowner sys_resource }; ++allow hald_acl_t self:capability { dac_read_search dac_override fowner sys_resource }; + allow hald_acl_t self:process { getattr signal }; + allow hald_acl_t self:fifo_file rw_fifo_file_perms; + +@@ -437,7 +436,6 @@ write_files_pattern(hald_keymap_t, hald_log_t, hald_log_t) + + dev_rw_input_dev(hald_keymap_t) + +-files_read_etc_files(hald_keymap_t) + + logging_search_logs(hald_keymap_t) + +diff --git a/hddtemp.if b/hddtemp.if +index 1728071d0e..6e2d333d9b 100644 +--- a/hddtemp.if ++++ b/hddtemp.if +@@ -19,6 +19,32 @@ interface(`hddtemp_domtrans',` + domtrans_pattern($1, hddtemp_exec_t, hddtemp_t) + ') + ++######################################## ++## ++## Execute hddtemp in the hddtemp domain, and ++## allow the specified role the hddtemp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`hddtemp_run',` ++ gen_require(` ++ type hddtemp_t; ++ attribute_role hddtemp_roles; ++ ') ++ ++ hddtemp_domtrans($1) ++ roleattribute $2 hddtemp_roles; ++') ++ + ###################################### + ## + ## Execute hddtemp in the caller domain. +@@ -60,9 +86,13 @@ interface(`hddtemp_admin',` + type hddtemp_t, hddtemp_etc_t, hddtemp_initrc_exec_t; + ') + +- allow $1 hddtemp_t:process { ptrace signal_perms }; ++ allow $1 hddtemp_t:process signal_perms; + ps_process_pattern($1, hddtemp_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 hddtemp_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, hddtemp_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 hddtemp_initrc_exec_t system_r; +diff --git a/hddtemp.te b/hddtemp.te +index 9e11b98222..6338ea7611 100644 +--- a/hddtemp.te ++++ b/hddtemp.te +@@ -4,10 +4,12 @@ policy_module(hddtemp, 1.2.0) + # + # Declarations + # ++attribute_role hddtemp_roles; + + type hddtemp_t; + type hddtemp_exec_t; + init_daemon_domain(hddtemp_t, hddtemp_exec_t) ++role hddtemp_roles types hddtemp_t; + + type hddtemp_initrc_exec_t; + init_script_file(hddtemp_initrc_exec_t) +@@ -26,7 +28,6 @@ allow hddtemp_t self:tcp_socket { accept listen }; + + allow hddtemp_t hddtemp_etc_t:file read_file_perms; + +-corenet_all_recvfrom_unlabeled(hddtemp_t) + corenet_all_recvfrom_netlabel(hddtemp_t) + corenet_tcp_sendrecv_generic_if(hddtemp_t) + corenet_tcp_sendrecv_generic_node(hddtemp_t) +@@ -36,9 +37,6 @@ corenet_tcp_bind_hddtemp_port(hddtemp_t) + corenet_sendrecv_hddtemp_server_packets(hddtemp_t) + corenet_tcp_sendrecv_hddtemp_port(hddtemp_t) + +-files_search_etc(hddtemp_t) +-files_read_usr_files(hddtemp_t) +- + storage_raw_read_fixed_disk(hddtemp_t) + storage_raw_read_removable_device(hddtemp_t) + +@@ -46,4 +44,3 @@ auth_use_nsswitch(hddtemp_t) + + logging_send_syslog_msg(hddtemp_t) + +-miscfiles_read_localization(hddtemp_t) +diff --git a/hostapd.fc b/hostapd.fc +new file mode 100644 +index 0000000000..0ca97b84b1 +--- /dev/null ++++ b/hostapd.fc +@@ -0,0 +1,5 @@ ++/usr/lib/systemd/system/hostapd.service -- gen_context(system_u:object_r:hostapd_unit_file_t,s0) ++ ++/usr/sbin/hostapd -- gen_context(system_u:object_r:hostapd_exec_t,s0) ++ ++/var/run/hostapd(/.*)? gen_context(system_u:object_r:hostapd_var_run_t,s0) +\ No newline at end of file +diff --git a/hostapd.if b/hostapd.if +new file mode 100644 +index 0000000000..d0016da914 +--- /dev/null ++++ b/hostapd.if +@@ -0,0 +1,101 @@ ++ ++## policy for hostapd ++ ++######################################## ++## ++## Execute TEMPLATE in the hostapd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hostapd_domtrans',` ++ gen_require(` ++ type hostapd_t, hostapd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, hostapd_exec_t, hostapd_t) ++') ++######################################## ++## ++## Execute hostapd server in the hostapd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hostapd_systemctl',` ++ gen_require(` ++ type hostapd_t; ++ type hostapd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 hostapd_unit_file_t:file read_file_perms; ++ allow $1 hostapd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, hostapd_t) ++') ++ ++ ++######################################## ++## ++## Read hostapd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hostapd_read_pid_files',` ++ gen_require(` ++ type hostapd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, hostapd_var_run_t, hostapd_var_run_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an hostapd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`hostapd_admin',` ++ gen_require(` ++ type hostapd_t; ++ type hostapd_unit_file_t; ++ type hostapd_var_run_t; ++ ') ++ ++ allow $1 hostapd_t:process { signal_perms }; ++ ps_process_pattern($1, hostapd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 hostapd_t:process ptrace; ++ ') ++ ++ hostapd_systemctl($1) ++ admin_pattern($1, hostapd_unit_file_t) ++ allow $1 hostapd_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++ ++ admin_pattern($1, hostapd_var_run_t) ++') +diff --git a/hostapd.te b/hostapd.te +new file mode 100644 +index 0000000000..ef3f6a9390 +--- /dev/null ++++ b/hostapd.te +@@ -0,0 +1,51 @@ ++policy_module(hostapd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type hostapd_t; ++type hostapd_exec_t; ++init_daemon_domain(hostapd_t, hostapd_exec_t) ++ ++type hostapd_var_run_t; ++files_pid_file(hostapd_var_run_t) ++ ++type hostapd_unit_file_t; ++systemd_unit_file(hostapd_unit_file_t) ++ ++######################################## ++# ++# hostapd local policy ++# ++allow hostapd_t self:capability { chown net_admin }; ++allow hostapd_t self:fifo_file rw_fifo_file_perms; ++allow hostapd_t self:unix_stream_socket create_stream_socket_perms; ++allow hostapd_t self:netlink_socket create_socket_perms; ++allow hostapd_t self:netlink_route_socket create_netlink_socket_perms; ++allow hostapd_t self:packet_socket create_socket_perms; ++ ++manage_dirs_pattern(hostapd_t, hostapd_var_run_t, hostapd_var_run_t) ++manage_files_pattern(hostapd_t, hostapd_var_run_t, hostapd_var_run_t) ++manage_lnk_files_pattern(hostapd_t, hostapd_var_run_t, hostapd_var_run_t) ++files_pid_filetrans(hostapd_t, hostapd_var_run_t, { dir file lnk_file }) ++ ++kernel_read_system_state(hostapd_t) ++kernel_read_network_state(hostapd_t) ++kernel_request_load_module(hostapd_t) ++ ++dev_read_rand(hostapd_t) ++dev_read_urand(hostapd_t) ++dev_read_sysfs(hostapd_t) ++dev_rw_wireless(hostapd_t) ++ ++domain_use_interactive_fds(hostapd_t) ++ ++files_read_etc_files(hostapd_t) ++ ++auth_use_nsswitch(hostapd_t) ++ ++logging_send_syslog_msg(hostapd_t) ++ ++miscfiles_read_localization(hostapd_t) +diff --git a/howl.te b/howl.te +index b9e60ecfbd..0477728a06 100644 +--- a/howl.te ++++ b/howl.te +@@ -36,7 +36,6 @@ kernel_request_load_module(howl_t) + kernel_list_proc(howl_t) + kernel_read_proc_symlinks(howl_t) + +-corenet_all_recvfrom_unlabeled(howl_t) + corenet_all_recvfrom_netlabel(howl_t) + corenet_tcp_sendrecv_generic_if(howl_t) + corenet_udp_sendrecv_generic_if(howl_t) +@@ -65,8 +64,6 @@ init_dontaudit_write_utmp(howl_t) + + logging_send_syslog_msg(howl_t) + +-miscfiles_read_localization(howl_t) +- + userdom_dontaudit_use_unpriv_user_fds(howl_t) + userdom_dontaudit_search_user_home_dirs(howl_t) + +diff --git a/hsqldb.fc b/hsqldb.fc +new file mode 100644 +index 0000000000..aa92d7118e +--- /dev/null ++++ b/hsqldb.fc +@@ -0,0 +1,7 @@ ++/usr/lib/hsqldb/hsqldb-post -- gen_context(system_u:object_r:hsqldb_exec_t,s0) ++/usr/lib/hsqldb/hsqldb-stop -- gen_context(system_u:object_r:hsqldb_exec_t,s0) ++/usr/lib/hsqldb/hsqldb-wrapper -- gen_context(system_u:object_r:hsqldb_exec_t,s0) ++ ++/usr/lib/systemd/system/hsqldb.* -- gen_context(system_u:object_r:hsqldb_unit_file_t,s0) ++ ++/var/lib/hsqldb(/.*)? gen_context(system_u:object_r:hsqldb_var_lib_t,s0) +diff --git a/hsqldb.if b/hsqldb.if +new file mode 100644 +index 0000000000..f43f7489f6 +--- /dev/null ++++ b/hsqldb.if +@@ -0,0 +1,241 @@ ++ ++## Hsqldb is transactional database engine with in-memory and disk-based tables, supporting embedded and server modes. ++ ++######################################## ++## ++## Execute hsqldb_exec_t in the hsqldb domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hsqldb_domtrans',` ++ gen_require(` ++ type hsqldb_t, hsqldb_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, hsqldb_exec_t, hsqldb_t) ++') ++ ++###################################### ++## ++## Execute hsqldb in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_exec',` ++ gen_require(` ++ type hsqldb_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, hsqldb_exec_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to read, ++## hsqldb tmp files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`hsqldb_dontaudit_read_tmp_files',` ++ gen_require(` ++ type hsqldb_tmp_t; ++ ') ++ ++ dontaudit $1 hsqldb_tmp_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Read hsqldb tmp files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_read_tmp_files',` ++ gen_require(` ++ type hsqldb_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ read_files_pattern($1, hsqldb_tmp_t, hsqldb_tmp_t) ++') ++ ++######################################## ++## ++## Manage hsqldb tmp files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_manage_tmp',` ++ gen_require(` ++ type hsqldb_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ manage_dirs_pattern($1, hsqldb_tmp_t, hsqldb_tmp_t) ++ manage_files_pattern($1, hsqldb_tmp_t, hsqldb_tmp_t) ++ manage_lnk_files_pattern($1, hsqldb_tmp_t, hsqldb_tmp_t) ++') ++ ++######################################## ++## ++## Search hsqldb lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_search_lib',` ++ gen_require(` ++ type hsqldb_var_lib_t; ++ ') ++ ++ allow $1 hsqldb_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read hsqldb lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_read_lib_files',` ++ gen_require(` ++ type hsqldb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, hsqldb_var_lib_t, hsqldb_var_lib_t) ++') ++ ++######################################## ++## ++## Manage hsqldb lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_manage_lib_files',` ++ gen_require(` ++ type hsqldb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, hsqldb_var_lib_t, hsqldb_var_lib_t) ++') ++ ++######################################## ++## ++## Manage hsqldb lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_manage_lib_dirs',` ++ gen_require(` ++ type hsqldb_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, hsqldb_var_lib_t, hsqldb_var_lib_t) ++') ++ ++######################################## ++## ++## Execute hsqldb server in the hsqldb domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hsqldb_systemctl',` ++ gen_require(` ++ type hsqldb_t; ++ type hsqldb_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 hsqldb_unit_file_t:file read_file_perms; ++ allow $1 hsqldb_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, hsqldb_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an hsqldb environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hsqldb_admin',` ++ gen_require(` ++ type hsqldb_t; ++ type hsqldb_tmp_t; ++ type hsqldb_var_lib_t; ++ type hsqldb_unit_file_t; ++ ') ++ ++ allow $1 hsqldb_t:process { signal_perms }; ++ ps_process_pattern($1, hsqldb_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 hsqldb_t:process ptrace; ++ ') ++ ++ files_search_tmp($1) ++ admin_pattern($1, hsqldb_tmp_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, hsqldb_var_lib_t) ++ ++ hsqldb_systemctl($1) ++ admin_pattern($1, hsqldb_unit_file_t) ++ allow $1 hsqldb_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/hsqldb.te b/hsqldb.te +new file mode 100644 +index 0000000000..8035eaf537 +--- /dev/null ++++ b/hsqldb.te +@@ -0,0 +1,61 @@ ++policy_module(hsqldb, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type hsqldb_t; ++type hsqldb_exec_t; ++init_daemon_domain(hsqldb_t, hsqldb_exec_t) ++ ++type hsqldb_tmp_t; ++files_tmp_file(hsqldb_tmp_t) ++ ++type hsqldb_var_lib_t; ++files_type(hsqldb_var_lib_t) ++ ++type hsqldb_unit_file_t; ++systemd_unit_file(hsqldb_unit_file_t) ++ ++######################################## ++# ++# hsqldb local policy ++# ++ ++allow hsqldb_t self:process execmem; ++ ++allow hsqldb_t self:fifo_file rw_fifo_file_perms; ++allow hsqldb_t self:stream_socket_class_set create_stream_socket_perms; ++ ++manage_dirs_pattern(hsqldb_t, hsqldb_tmp_t, hsqldb_tmp_t) ++manage_files_pattern(hsqldb_t, hsqldb_tmp_t, hsqldb_tmp_t) ++files_tmp_filetrans(hsqldb_t, hsqldb_tmp_t, { dir file }) ++allow hsqldb_t hsqldb_tmp_t:file map; ++ ++manage_dirs_pattern(hsqldb_t, hsqldb_var_lib_t, hsqldb_var_lib_t) ++manage_files_pattern(hsqldb_t, hsqldb_var_lib_t, hsqldb_var_lib_t) ++manage_lnk_files_pattern(hsqldb_t, hsqldb_var_lib_t, hsqldb_var_lib_t) ++manage_sock_files_pattern(hsqldb_t, hsqldb_var_lib_t, hsqldb_var_lib_t) ++files_var_lib_filetrans(hsqldb_t, hsqldb_var_lib_t, { dir }) ++ ++kernel_read_system_state(hsqldb_t) ++kernel_read_network_state(hsqldb_t) ++ ++corecmd_exec_bin(hsqldb_t) ++ ++corenet_tcp_bind_generic_node(hsqldb_t) ++corenet_tcp_bind_tor_port(hsqldb_t) ++corenet_tcp_connect_tor_port(hsqldb_t) ++ ++dev_list_sysfs(hsqldb_t) ++ ++dev_read_urand(hsqldb_t) ++dev_read_rand(hsqldb_t) ++ ++fs_read_cgroup_files(hsqldb_t) ++fs_search_cgroup_dirs(hsqldb_t) ++ ++auth_use_nsswitch(hsqldb_t) ++ ++sysnet_read_config(hsqldb_t) +diff --git a/hwloc.fc b/hwloc.fc +new file mode 100644 +index 0000000000..d0c5a15020 +--- /dev/null ++++ b/hwloc.fc +@@ -0,0 +1,5 @@ ++/usr/sbin/hwloc-dump-hwdata -- gen_context(system_u:object_r:hwloc_dhwd_exec_t,s0) ++ ++/usr/lib/systemd/system/hwloc-dump-hwdata.* -- gen_context(system_u:object_r:hwloc_dhwd_unit_t,s0) ++ ++/var/run/hwloc(/.*)? gen_context(system_u:object_r:hwloc_var_run_t,s0) +diff --git a/hwloc.if b/hwloc.if +new file mode 100644 +index 0000000000..f98e166126 +--- /dev/null ++++ b/hwloc.if +@@ -0,0 +1,110 @@ ++## Dump topology and locality information from hardware tables. ++ ++######################################## ++## ++## Execute hwloc dhwd in the hwloc dhwd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hwloc_domtrans_dhwd',` ++ gen_require(` ++ type hwloc_dhwd_t, hwloc_dhwd_exec_t; ++ ') ++ ++ domtrans_pattern($1, hwloc_dhwd_exec_t, hwloc_dhwd_t) ++') ++ ++######################################## ++## ++## Execute hwloc dhwd in the hwloc dhwd domain, and ++## allow the specified role the hwloc dhwd domain, ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`hwloc_run_dhwd',` ++ gen_require(` ++ attribute_role hwloc_dhwd_roles; ++ ') ++ ++ hwloc_domtrans_dhwd($1) ++ roleattribute $2 hwloc_dhwd_roles; ++') ++ ++######################################## ++## ++## Execute hwloc dhwd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hwloc_exec_dhwd',` ++ gen_require(` ++ type hwloc_dhwd_exec_t; ++ ') ++ ++ can_exec($1, hwloc_dhwd_exec_t) ++') ++ ++######################################## ++## ++## Read hwloc runtime files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hwloc_read_runtime_files',` ++ gen_require(` ++ type hwloc_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, hwloc_var_run_t, hwloc_var_run_t) ++') ++ ++######################################## ++## ++## All of the rules required to ++## administrate an hwloc environment. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`hwloc_admin',` ++ gen_require(` ++ type hwloc_dhwd_t, hwloc_var_run_t; ++ ') ++ ++ allow $1 hwloc_dhwd_t:process { signal_perms }; ++ ps_process_pattern($1, hwloc_dhwd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 hwloc_dhwd_t:process ptrace; ++ ') ++ ++ admin_pattern($1, hwloc_var_run_t) ++ files_pid_filetrans($1, hwloc_var_run_t, dir, "hwloc") ++') +diff --git a/hwloc.te b/hwloc.te +new file mode 100644 +index 0000000000..0f45fd50e3 +--- /dev/null ++++ b/hwloc.te +@@ -0,0 +1,31 @@ ++policy_module(hwloc, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute_role hwloc_dhwd_roles; ++roleattribute system_r hwloc_dhwd_roles; ++ ++type hwloc_dhwd_t; ++type hwloc_dhwd_exec_t; ++init_system_domain(hwloc_dhwd_t, hwloc_dhwd_exec_t) ++role hwloc_dhwd_roles types hwloc_dhwd_t; ++ ++type hwloc_var_run_t; ++files_pid_file(hwloc_var_run_t) ++ ++type hwloc_dhwd_unit_t; ++systemd_unit_file(hwloc_dhwd_unit_t) ++ ++######################################## ++# ++# Local policy ++# ++ ++allow hwloc_dhwd_t hwloc_var_run_t:dir manage_dir_perms; ++allow hwloc_dhwd_t hwloc_var_run_t:file manage_file_perms; ++files_pid_filetrans(hwloc_dhwd_t, hwloc_var_run_t, dir) ++ ++dev_read_sysfs(hwloc_dhwd_t) +diff --git a/hypervkvp.fc b/hypervkvp.fc +index b46130ef50..e2ae3b22b8 100644 +--- a/hypervkvp.fc ++++ b/hypervkvp.fc +@@ -1,3 +1,10 @@ +-/etc/rc\.d/init\.d/hypervkvpd -- gen_context(system_u:object_r:hypervkvpd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/hypervkvpd -- gen_context(system_u:object_r:hypervkvp_initrc_exec_t,s0) + +-/usr/sbin/hv_kvp_daemon -- gen_context(system_u:object_r:hypervkvpd_exec_t,s0) ++/usr/lib/systemd/system/hypervvssd.* -- gen_context(system_u:object_r:hypervvssd_unit_file_t,s0) ++ ++/usr/sbin/hv_kvp_daemon -- gen_context(system_u:object_r:hypervkvp_exec_t,s0) ++/usr/sbin/hypervkvpd -- gen_context(system_u:object_r:hypervkvp_exec_t,s0) ++ ++/usr/sbin/hypervvssd -- gen_context(system_u:object_r:hypervvssd_exec_t,s0) ++ ++/var/lib/hyperv(/.*)? gen_context(system_u:object_r:hypervkvp_var_lib_t,s0) +diff --git a/hypervkvp.if b/hypervkvp.if +index 6517fadbb3..f1837481b0 100644 +--- a/hypervkvp.if ++++ b/hypervkvp.if +@@ -1,32 +1,135 @@ +-## HyperV key value pair (KVP). ++ ++## policy for hypervkvp ++ ++######################################## ++## ++## Execute TEMPLATE in the hypervkvp domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hypervkvp_domtrans',` ++ gen_require(` ++ type hypervkvp_t, hypervkvp_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, hypervkvp_exec_t, hypervkvp_t) ++') ++ ++######################################## ++## ++## Search hypervkvp lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hypervkvp_search_lib',` ++ gen_require(` ++ type hypervkvp_var_lib_t; ++ ') ++ ++ allow $1 hypervkvp_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read hypervkvp lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`hypervkvp_read_lib_files',` ++ gen_require(` ++ type hypervkvp_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 hypervkvp_var_lib_t:dir list_dir_perms; ++ read_files_pattern($1, hypervkvp_var_lib_t, hypervkvp_var_lib_t) ++') + + ######################################## + ## +-## All of the rules required to +-## administrate an hypervkvp environment. ++## Create, read, write, and delete ++## hypervkvp lib files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`hypervkvp_manage_lib_files',` ++ gen_require(` ++ type hypervkvp_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, hypervkvp_var_lib_t, hypervkvp_var_lib_t) ++') ++ ++####################################### ++## ++## Execute hypervkvp server in the hypervkvp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`hypervkvp_systemctl',` ++ gen_require(` ++ type hypervkvp_t; ++ type hypervkvp_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 hypervkvp_unit_file_t:file read_file_perms; ++ allow $1 hypervkvp_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, hypervkvp_t) ++ ') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an hypervkvp environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # + interface(`hypervkvp_admin',` + gen_require(` +- type hypervkvpd_t, hypervkvpd_initrc_exec_t; ++ type hypervkvp_t; ++ type hypervkvp_unit_file_t; ++ ') ++ ++ allow $1 hypervkvp_t:process signal_perms; ++ ps_process_pattern($1, hypervkvp_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 hypervkvp_t:process ptrace; + ') + +- allow $1 hypervkvpd_t:process { ptrace signal_perms }; +- ps_process_pattern($1, hypervkvpd_t) ++ hypervkvp_manage_lib_files($1) + +- init_labeled_script_domtrans($1, hypervkvpd_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 hypervkvpd_initrc_exec_t system_r; +- allow $2 system_r; ++ hypervkvp_systemctl($1) ++ admin_pattern($1, hypervkvp_unit_file_t) ++ allow $1 hypervkvp_unit_file_t:service all_service_perms; + ') +diff --git a/hypervkvp.te b/hypervkvp.te +index 4eb7041ef3..bce3f60a92 100644 +--- a/hypervkvp.te ++++ b/hypervkvp.te +@@ -5,24 +5,161 @@ policy_module(hypervkvp, 1.0.0) + # Declarations + # + +-type hypervkvpd_t; +-type hypervkvpd_exec_t; +-init_daemon_domain(hypervkvpd_t, hypervkvpd_exec_t) ++attribute hyperv_domain; + +-type hypervkvpd_initrc_exec_t; +-init_script_file(hypervkvpd_initrc_exec_t) ++type hypervkvp_t, hyperv_domain; ++type hypervkvp_exec_t; ++init_daemon_domain(hypervkvp_t, hypervkvp_exec_t) ++ ++type hypervkvp_initrc_exec_t; ++init_script_file(hypervkvp_initrc_exec_t) ++ ++type hypervkvp_unit_file_t; ++systemd_unit_file(hypervkvp_unit_file_t) ++ ++type hypervkvp_var_lib_t; ++files_type(hypervkvp_var_lib_t) ++ ++type hypervkvp_tmp_t; ++files_tmpfs_file(hypervkvp_tmp_t) ++ ++type hypervvssd_t, hyperv_domain; ++type hypervvssd_exec_t; ++init_daemon_domain(hypervvssd_t, hypervvssd_exec_t) ++ ++type hypervvssd_unit_file_t; ++systemd_unit_file(hypervvssd_unit_file_t) + + ######################################## + # +-# Local policy ++# hyperv domain local policy ++# ++ ++allow hyperv_domain self:capability net_admin; ++allow hyperv_domain self:netlink_socket create_socket_perms; ++ ++allow hyperv_domain self:fifo_file rw_fifo_file_perms; ++allow hyperv_domain self:unix_stream_socket create_stream_socket_perms; ++ ++corecmd_exec_shell(hyperv_domain) ++corecmd_exec_bin(hyperv_domain) ++ ++dev_read_sysfs(hyperv_domain) ++ ++######################################## + # ++# hypervkvp local policy + # + +-allow hypervkvpd_t self:fifo_file rw_fifo_file_perms; +-allow hypervkvpd_t self:unix_stream_socket create_stream_socket_perms; ++allow hypervkvp_t self:capability sys_ptrace; ++allow hypervkvp_t self:process setfscreate; ++allow hypervkvp_t self:netlink_route_socket rw_netlink_socket_perms; ++ ++manage_dirs_pattern(hypervkvp_t, hypervkvp_var_lib_t, hypervkvp_var_lib_t) ++manage_files_pattern(hypervkvp_t, hypervkvp_var_lib_t, hypervkvp_var_lib_t) ++files_var_lib_filetrans(hypervkvp_t, hypervkvp_var_lib_t, dir) ++ ++manage_files_pattern(hypervkvp_t, hypervkvp_tmp_t, hypervkvp_tmp_t) ++manage_dirs_pattern(hypervkvp_t, hypervkvp_tmp_t, hypervkvp_tmp_t) ++files_tmp_filetrans(hypervkvp_t, hypervkvp_tmp_t, { file dir }) ++ ++kernel_read_system_state(hypervkvp_t) ++kernel_read_network_state(hypervkvp_t) ++kernel_rw_net_sysctls(hypervkvp_t) ++ ++corecmd_getattr_all_executables(hypervkvp_t) ++ ++dev_rw_hypervkvp(hypervkvp_t) ++ ++domain_read_all_domains_state(hypervkvp_t) ++ ++seutil_exec_setfiles(hypervkvp_t) ++seutil_read_file_contexts(hypervkvp_t) ++ ++domain_read_all_domains_state(hypervkvp_t) ++ ++dev_read_urand(hypervkvp_t) ++ ++files_dontaudit_search_home(hypervkvp_t) ++files_dontaudit_getattr_non_security_files(hypervkvp_t) ++ ++fs_getattr_all_fs(hypervkvp_t) ++fs_read_hugetlbfs_files(hypervkvp_t) ++fs_list_hugetlbfs(hypervkvp_t) ++ ++auth_use_nsswitch(hypervkvp_t) ++ ++logging_send_syslog_msg(hypervkvp_t) ++logging_read_syslog_config(hypervkvp_t) ++ ++libs_exec_ldconfig(hypervkvp_t) ++ ++modutils_domtrans_insmod(hypervkvp_t) ++ ++sysnet_dns_name_resolve(hypervkvp_t) ++sysnet_domtrans_dhcpc(hypervkvp_t) ++sysnet_domtrans_ifconfig(hypervkvp_t) ++ ++sysnet_manage_dhcpc_pid(hypervkvp_t) ++sysnet_signal_dhcpc(hypervkvp_t) ++ ++sysnet_manage_config(hypervkvp_t) ++sysnet_read_dhcpc_state(hypervkvp_t) ++sysnet_read_dhcp_config(hypervkvp_t) ++sysnet_etc_filetrans_config(hypervkvp_t) ++ ++systemd_exec_systemctl(hypervkvp_t) ++ ++userdom_dontaudit_search_admin_dir(hypervkvp_t) ++ ++optional_policy(` ++ dbus_read_pid_files(hypervkvp_t) ++ dbus_system_bus_client(hypervkvp_t) ++') ++ ++optional_policy(` ++ brctl_domtrans(hypervkvp_t) ++') ++ ++optional_policy(` ++ hostname_exec(hypervkvp_t) ++') ++ ++optional_policy(` ++ firewalld_dbus_chat(hypervkvp_t) ++') ++ ++optional_policy(` ++ netutils_domtrans_ping(hypervkvp_t) ++ netutils_domtrans(hypervkvp_t) ++') ++ ++optional_policy(` ++ networkmanager_read_pid_files(hypervkvp_t) ++ networkmanager_dbus_chat(hypervkvp_t) ++') ++ ++optional_policy(` ++ sysnet_exec_ifconfig(hypervkvp_t) ++') ++ ++optional_policy(` ++ rpm_exec(hypervkvp_t) ++') ++ ++######################################## ++# ++# hypervvssd local policy ++# ++ ++allow hypervvssd_t self:capability { dac_read_search dac_override sys_admin }; ++ ++dev_rw_hypervvssd(hypervvssd_t) + +-logging_send_syslog_msg(hypervkvpd_t) ++files_list_all_mountpoints(hypervvssd_t) ++files_list_boot(hypervvssd_t) ++files_list_non_auth_dirs(hypervvssd_t) + +-miscfiles_read_localization(hypervkvpd_t) ++logging_send_syslog_msg(hypervvssd_t) + +-sysnet_dns_name_resolve(hypervkvpd_t) ++storage_raw_read_fixed_disk(hypervvssd_t) +diff --git a/i18n_input.te b/i18n_input.te +index 369a0566b0..65fde93d9e 100644 +--- a/i18n_input.te ++++ b/i18n_input.te +@@ -45,7 +45,6 @@ can_exec(i18n_input_t, i18n_input_exec_t) + kernel_read_kernel_sysctls(i18n_input_t) + kernel_read_system_state(i18n_input_t) + +-corenet_all_recvfrom_unlabeled(i18n_input_t) + corenet_all_recvfrom_netlabel(i18n_input_t) + corenet_tcp_sendrecv_generic_if(i18n_input_t) + corenet_tcp_sendrecv_generic_node(i18n_input_t) +@@ -68,7 +67,6 @@ fs_getattr_all_fs(i18n_input_t) + fs_search_auto_mountpoints(i18n_input_t) + + files_read_etc_runtime_files(i18n_input_t) +-files_read_usr_files(i18n_input_t) + + auth_use_nsswitch(i18n_input_t) + +@@ -76,20 +74,9 @@ init_stream_connect_script(i18n_input_t) + + logging_send_syslog_msg(i18n_input_t) + +-miscfiles_read_localization(i18n_input_t) +- + userdom_dontaudit_use_unpriv_user_fds(i18n_input_t) + userdom_read_user_home_content_files(i18n_input_t) +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(i18n_input_t) +- fs_read_nfs_symlinks(i18n_input_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(i18n_input_t) +- fs_read_cifs_symlinks(i18n_input_t) +-') ++userdom_home_reader(i18n_input_t) + + optional_policy(` + canna_stream_connect(i18n_input_t) +diff --git a/icecast.if b/icecast.if +index 580b533ce7..c267cea588 100644 +--- a/icecast.if ++++ b/icecast.if +@@ -176,6 +176,14 @@ interface(`icecast_admin',` + type icecast_var_run_t; + ') + ++ allow $1 icecast_t:process signal_perms; ++ ps_process_pattern($1, icecast_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 icecast_t:process ptrace; ++ ') ++ ++ # Allow icecast_t to restart the apache service + icecast_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 icecast_initrc_exec_t system_r; +diff --git a/icecast.te b/icecast.te +index a9e573a501..9a9245f49a 100644 +--- a/icecast.te ++++ b/icecast.te +@@ -32,7 +32,7 @@ files_pid_file(icecast_var_run_t) + # Local policy + # + +-allow icecast_t self:capability { dac_override setgid setuid sys_nice }; ++allow icecast_t self:capability { dac_read_search dac_override setgid setuid sys_nice }; + allow icecast_t self:process { getsched setsched signal }; + allow icecast_t self:fifo_file rw_fifo_file_perms; + allow icecast_t self:unix_stream_socket create_stream_socket_perms; +@@ -65,11 +65,9 @@ dev_read_sysfs(icecast_t) + dev_read_urand(icecast_t) + dev_read_rand(icecast_t) + +-domain_use_interactive_fds(icecast_t) +- + auth_use_nsswitch(icecast_t) + +-miscfiles_read_localization(icecast_t) ++files_dontaudit_list_tmp(icecast_t) + + tunable_policy(`icecast_use_any_tcp_ports',` + corenet_tcp_connect_all_ports(icecast_t) +diff --git a/ifplugd.if b/ifplugd.if +index 8999899962..96909ae6ae 100644 +--- a/ifplugd.if ++++ b/ifplugd.if +@@ -119,7 +119,7 @@ interface(`ifplugd_admin',` + type ifplugd_initrc_exec_t; + ') + +- allow $1 ifplugd_t:process { ptrace signal_perms }; ++ allow $1 ifplugd_t:process signal_perms; + ps_process_pattern($1, ifplugd_t) + + init_labeled_script_domtrans($1, ifplugd_initrc_exec_t) +diff --git a/ifplugd.te b/ifplugd.te +index b0546b43b1..98d7326a8f 100644 +--- a/ifplugd.te ++++ b/ifplugd.te +@@ -10,7 +10,7 @@ type ifplugd_exec_t; + init_daemon_domain(ifplugd_t, ifplugd_exec_t) + + type ifplugd_etc_t; +-files_type(ifplugd_etc_t) ++files_config_file(ifplugd_etc_t) + + type ifplugd_initrc_exec_t; + init_script_file(ifplugd_initrc_exec_t) +@@ -49,14 +49,11 @@ corecmd_exec_shell(ifplugd_t) + dev_read_sysfs(ifplugd_t) + + domain_read_confined_domains_state(ifplugd_t) +-domain_dontaudit_read_all_domains_state(ifplugd_t) + + auth_use_nsswitch(ifplugd_t) + + logging_send_syslog_msg(ifplugd_t) + +-miscfiles_read_localization(ifplugd_t) +- + netutils_domtrans(ifplugd_t) + + sysnet_domtrans_ifconfig(ifplugd_t) +diff --git a/imaze.te b/imaze.te +index 1eb24d8c89..b320d51ae4 100644 +--- a/imaze.te ++++ b/imaze.te +@@ -45,7 +45,6 @@ kernel_list_proc(imazesrv_t) + kernel_read_kernel_sysctls(imazesrv_t) + kernel_read_proc_symlinks(imazesrv_t) + +-corenet_all_recvfrom_unlabeled(imazesrv_t) + corenet_all_recvfrom_netlabel(imazesrv_t) + corenet_tcp_sendrecv_generic_if(imazesrv_t) + corenet_udp_sendrecv_generic_if(imazesrv_t) +@@ -71,8 +70,6 @@ auth_use_nsswitch(imazesrv_t) + + logging_send_syslog_msg(imazesrv_t) + +-miscfiles_read_localization(imazesrv_t) +- + userdom_use_unpriv_users_fds(imazesrv_t) + userdom_dontaudit_search_user_home_dirs(imazesrv_t) + +diff --git a/inetd.if b/inetd.if +index fbb54e7d8d..05c3777686 100644 +--- a/inetd.if ++++ b/inetd.if +@@ -37,6 +37,12 @@ interface(`inetd_core_service_domain',` + + domtrans_pattern(inetd_t, $2, $1) + allow inetd_t $1:process { siginh sigkill }; ++ ++ init_domain($1, $2) ++ ++ optional_policy(` ++ abrt_stream_connect($1) ++ ') + ') + + ######################################## +diff --git a/inetd.te b/inetd.te +index c6450df8ae..0c88e1cf70 100644 +--- a/inetd.te ++++ b/inetd.te +@@ -37,9 +37,9 @@ ifdef(`enable_mcs',` + # Local policy + # + +-allow inetd_t self:capability { setuid setgid sys_resource }; ++allow inetd_t self:capability { setuid setgid }; + dontaudit inetd_t self:capability sys_tty_config; +-allow inetd_t self:process { setsched setexec setrlimit }; ++allow inetd_t self:process { setsched setexec }; + allow inetd_t self:fifo_file rw_fifo_file_perms; + allow inetd_t self:tcp_socket { accept listen }; + allow inetd_t self:fd use; +@@ -61,6 +61,7 @@ kernel_read_system_state(inetd_t) + kernel_tcp_recvfrom_unlabeled(inetd_t) + + corecmd_bin_domtrans(inetd_t, inetd_child_t) ++corecmd_exec_shell(inetd_t) + + corenet_all_recvfrom_unlabeled(inetd_t) + corenet_all_recvfrom_netlabel(inetd_t) +@@ -98,6 +99,11 @@ corenet_sendrecv_inetd_child_server_packets(inetd_t) + corenet_tcp_bind_inetd_child_port(inetd_t) + corenet_udp_bind_inetd_child_port(inetd_t) + ++corenet_tcp_bind_echo_port(inetd_t) ++corenet_udp_bind_echo_port(inetd_t) ++corenet_tcp_bind_time_port(inetd_t) ++corenet_udp_bind_time_port(inetd_t) ++ + corenet_sendrecv_ircd_server_packets(inetd_t) + corenet_tcp_bind_ircd_port(inetd_t) + +@@ -141,6 +147,9 @@ corenet_sendrecv_git_server_packets(inetd_t) + corenet_tcp_bind_git_port(inetd_t) + corenet_udp_bind_git_port(inetd_t) + ++dev_read_urand(inetd_t) ++dev_read_rand(inetd_t) ++ + dev_read_sysfs(inetd_t) + + domain_use_interactive_fds(inetd_t) +@@ -157,8 +166,6 @@ auth_use_nsswitch(inetd_t) + + logging_send_syslog_msg(inetd_t) + +-miscfiles_read_localization(inetd_t) +- + mls_fd_share_all_levels(inetd_t) + mls_socket_read_to_clearance(inetd_t) + mls_socket_write_to_clearance(inetd_t) +@@ -188,17 +195,13 @@ optional_policy(` + ') + + optional_policy(` +- tftp_read_config_files(inetd_t) ++ tftp_read_config(inetd_t) + ') + + optional_policy(` + udev_read_db(inetd_t) + ') + +-optional_policy(` +- unconfined_domtrans(inetd_t) +-') +- + ######################################## + # + # Child local policy +@@ -220,6 +223,16 @@ kernel_read_kernel_sysctls(inetd_child_t) + kernel_read_network_state(inetd_child_t) + kernel_read_system_state(inetd_child_t) + ++corenet_all_recvfrom_netlabel(inetd_child_t) ++corenet_tcp_sendrecv_generic_if(inetd_child_t) ++corenet_udp_sendrecv_generic_if(inetd_child_t) ++corenet_tcp_sendrecv_generic_node(inetd_child_t) ++corenet_udp_sendrecv_generic_node(inetd_child_t) ++corenet_tcp_sendrecv_all_ports(inetd_child_t) ++corenet_udp_sendrecv_all_ports(inetd_child_t) ++ ++corecmd_bin_entry_type(inetd_child_t) ++ + dev_read_urand(inetd_child_t) + + fs_getattr_xattr_fs(inetd_child_t) +@@ -230,7 +243,23 @@ auth_use_nsswitch(inetd_child_t) + + logging_send_syslog_msg(inetd_child_t) + +-miscfiles_read_localization(inetd_child_t) ++sysnet_read_config(inetd_child_t) ++ ++optional_policy(` ++ abrt_dbus_chat(inetd_child_t) ++') ++ ++optional_policy(` ++ chronyd_run_chronyc(inetd_child_t,system_r) ++') ++ ++optional_policy(` ++ kerberos_use(inetd_child_t) ++') ++ ++optional_policy(` ++ systemd_dbus_chat_logind(inetd_child_t) ++') + + optional_policy(` + unconfined_domain(inetd_child_t) +diff --git a/inn.fc b/inn.fc +index 8c0a48b1d1..b9eabf1455 100644 +--- a/inn.fc ++++ b/inn.fc +@@ -3,6 +3,8 @@ + + /etc/rc\.d/init\.d/innd -- gen_context(system_u:object_r:innd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/innd.* -- gen_context(system_u:object_r:innd_unit_file_t,s0) ++ + /usr/bin/inews -- gen_context(system_u:object_r:innd_exec_t,s0) + /usr/bin/rnews -- gen_context(system_u:object_r:innd_exec_t,s0) + /usr/bin/rpost -- gen_context(system_u:object_r:innd_exec_t,s0) +@@ -13,42 +15,43 @@ + + /var/lib/news(/.*)? gen_context(system_u:object_r:innd_var_lib_t,s0) + +-/usr/lib/news/bin/actsync -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/archive -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/batcher -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/buffchan -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/convdate -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/ctlinnd -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/cvtbatch -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/expire -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/expireover -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/fastrm -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/filechan -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/getlist -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/grephistory -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/inews -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/innconfval -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/innd -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/inndf -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/inndstart -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/innfeed -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/innxbatch -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/innxmit -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/makedbz -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/makehistory -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/newsrequeue -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/nnrpd -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/nntpget -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/ovdb_recover -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/overchan -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/prunehistory -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/rnews -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/shlock -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/shrinkfile -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/sm -- gen_context(system_u:object_r:innd_exec_t,s0) +-/usr/lib/news/bin/startinnfeed -- gen_context(system_u:object_r:innd_exec_t,s0) +- +-/var/log/news.* -- gen_context(system_u:object_r:innd_log_t,s0) ++/usr/libexec/news/actsync -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/archive -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/batcher -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/buffchan -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/convdate -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/ctlinnd -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/cvtbatch -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/expire -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/expireover -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/fastrm -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/filechan -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/getlist -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/grephistory -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/inews -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/newsinnconfval -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/innd -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/inndf -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/inndstart -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/innfeed -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/innxbatch -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/innxmit -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/makedbz -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/makehistory -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/newsrequeue -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/nnrpd -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/nntpget -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/ovdb_recover -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/overchan -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/prunehistory -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/rnews -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/shlock -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/shrinkfile -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/sm -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/startinnfeed -- gen_context(system_u:object_r:innd_exec_t,s0) ++/usr/libexec/news/rc.news -- gen_context(system_u:object_r:innd_exec_t,s0) ++ ++/var/log/news(/.*)? gen_context(system_u:object_r:innd_log_t,s0) + + /var/run/innd(/.*)? gen_context(system_u:object_r:innd_var_run_t,s0) + /var/run/innd\.pid -- gen_context(system_u:object_r:innd_var_run_t,s0) +diff --git a/inn.if b/inn.if +index eb87f23416..d3d32c3ad7 100644 +--- a/inn.if ++++ b/inn.if +@@ -124,6 +124,7 @@ interface(`inn_read_config',` + type innd_etc_t; + ') + ++ files_search_etc($1) + allow $1 innd_etc_t:dir list_dir_perms; + allow $1 innd_etc_t:file read_file_perms; + allow $1 innd_etc_t:lnk_file read_lnk_file_perms; +@@ -144,10 +145,29 @@ interface(`inn_read_news_lib',` + type innd_var_lib_t; + ') + ++ files_search_var_lib($1) + allow $1 innd_var_lib_t:dir list_dir_perms; + allow $1 innd_var_lib_t:file read_file_perms; + ') + ++######################################## ++## ++## Write innd inherited news library content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`inn_write_inherited_news_lib',` ++ gen_require(` ++ type innd_var_lib_t; ++ ') ++ ++ allow $1 innd_var_lib_t:file write_inherited_file_perms; ++') ++ + ######################################## + ## + ## Read innd news spool content. +@@ -163,6 +183,7 @@ interface(`inn_read_news_spool',` + type news_spool_t; + ') + ++ files_search_spool($1) + allow $1 news_spool_t:dir list_dir_perms; + allow $1 news_spool_t:file read_file_perms; + allow $1 news_spool_t:lnk_file read_lnk_file_perms; +@@ -226,8 +247,15 @@ interface(`inn_domtrans',` + interface(`inn_admin',` + gen_require(` + type innd_t, innd_etc_t, innd_log_t; +- type news_spool_t, innd_var_lib_t; +- type innd_var_run_t, innd_initrc_exec_t; ++ type news_spool_t, innd_var_lib_t, innd_var_run_t; ++ type innd_initrc_exec_t; ++ ') ++ ++ allow $1 innd_t:process signal_perms; ++ ps_process_pattern($1, innd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 innd_t:process ptrace; + ') + + init_labeled_script_domtrans($1, innd_initrc_exec_t) +diff --git a/inn.te b/inn.te +index d39f0cc51e..fc0bd082b3 100644 +--- a/inn.te ++++ b/inn.te +@@ -15,6 +15,9 @@ files_config_file(innd_etc_t) + type innd_initrc_exec_t; + init_script_file(innd_initrc_exec_t) + ++type innd_unit_file_t; ++systemd_unit_file(innd_unit_file_t) ++ + type innd_log_t; + logging_log_file(innd_log_t) + +@@ -26,13 +29,14 @@ files_pid_file(innd_var_run_t) + + type news_spool_t; + files_mountpoint(news_spool_t) ++files_spool_file(news_spool_t) + + ######################################## + # + # Local policy + # + +-allow innd_t self:capability { dac_override kill setgid setuid }; ++allow innd_t self:capability { dac_read_search dac_override kill setgid setuid }; + dontaudit innd_t self:capability sys_tty_config; + allow innd_t self:process { setsched signal_perms }; + allow innd_t self:fifo_file rw_fifo_file_perms; +@@ -43,29 +47,29 @@ allow innd_t self:tcp_socket { accept listen }; + read_files_pattern(innd_t, innd_etc_t, innd_etc_t) + read_lnk_files_pattern(innd_t, innd_etc_t, innd_etc_t) + +-allow innd_t innd_log_t:dir setattr_dir_perms; +-append_files_pattern(innd_t, innd_log_t, innd_log_t) +-create_files_pattern(innd_t, innd_log_t, innd_log_t) +-setattr_files_pattern(innd_t, innd_log_t, innd_log_t) ++manage_files_pattern(innd_t, innd_log_t, innd_log_t) ++manage_dirs_pattern(innd_t, innd_log_t, innd_log_t) ++logging_log_filetrans(innd_t, innd_log_t, { dir file }) + + manage_dirs_pattern(innd_t, innd_var_lib_t, innd_var_lib_t) + manage_files_pattern(innd_t, innd_var_lib_t, innd_var_lib_t) ++allow innd_t innd_var_lib_t:file map; + + manage_dirs_pattern(innd_t, innd_var_run_t, innd_var_run_t) + manage_files_pattern(innd_t, innd_var_run_t, innd_var_run_t) + manage_sock_files_pattern(innd_t, innd_var_run_t, innd_var_run_t) +-files_pid_filetrans(innd_t, innd_var_run_t, file) ++files_pid_filetrans(innd_t, innd_var_run_t, { dir file }) + + manage_dirs_pattern(innd_t, news_spool_t, news_spool_t) + manage_files_pattern(innd_t, news_spool_t, news_spool_t) + manage_lnk_files_pattern(innd_t, news_spool_t, news_spool_t) ++allow innd_t news_spool_t:file map; + + can_exec(innd_t, innd_exec_t) + + kernel_read_kernel_sysctls(innd_t) + kernel_read_system_state(innd_t) + +-corenet_all_recvfrom_unlabeled(innd_t) + corenet_all_recvfrom_netlabel(innd_t) + corenet_tcp_sendrecv_generic_if(innd_t) + corenet_tcp_sendrecv_generic_node(innd_t) +@@ -91,18 +95,18 @@ fs_search_auto_mountpoints(innd_t) + + files_list_spool(innd_t) + files_read_etc_runtime_files(innd_t) +-files_read_usr_files(innd_t) ++ ++inn_exec_config(innd_t) + + auth_use_nsswitch(innd_t) + + logging_send_syslog_msg(innd_t) + +-miscfiles_read_localization(innd_t) +- + seutil_dontaudit_search_config(innd_t) + + userdom_dontaudit_use_unpriv_user_fds(innd_t) + userdom_dontaudit_search_user_home_dirs(innd_t) ++userdom_dgram_send(innd_t) + + mta_send_mail(innd_t) + +diff --git a/iodine.fc b/iodine.fc +index ca07a8744e..6ea129cf63 100644 +--- a/iodine.fc ++++ b/iodine.fc +@@ -1,3 +1,5 @@ + /etc/rc\.d/init\.d/((iodined)|(iodine-server)) -- gen_context(system_u:object_r:iodined_initrc_exec_t,s0) + ++/usr/lib/systemd/system/iodine-server.* -- gen_context(system_u:object_r:iodined_unit_file_t,s0) ++ + /usr/sbin/iodined -- gen_context(system_u:object_r:iodined_exec_t,s0) +diff --git a/iodine.if b/iodine.if +index a0bfbd04f1..8dc7c3e31e 100644 +--- a/iodine.if ++++ b/iodine.if +@@ -1,5 +1,49 @@ + ## IP over DNS tunneling daemon. + ++######################################## ++## ++## Execute NetworkManager with a domain transition. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`iodined_domtrans',` ++ gen_require(` ++ type iodined_t, iodined_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, iodined_exec_t, iodined_t) ++') ++ ++######################################## ++## ++## Execute iodined server in the iodined domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`iodined_systemctl',` ++ gen_require(` ++ type iodined_t; ++ type iodined_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 iodined_unit_file_t:file read_file_perms; ++ allow $1 iodined_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, iodined_t) ++') ++ + ######################################## + ## + ## All of the rules required to +diff --git a/iodine.te b/iodine.te +index d443feee45..6cbbf7d847 100644 +--- a/iodine.te ++++ b/iodine.te +@@ -12,6 +12,9 @@ init_daemon_domain(iodined_t, iodined_exec_t) + type iodined_initrc_exec_t; + init_script_file(iodined_initrc_exec_t) + ++type iodined_unit_file_t; ++systemd_unit_file(iodined_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -43,7 +46,7 @@ corenet_udp_sendrecv_dns_port(iodined_t) + + corecmd_exec_shell(iodined_t) + +-files_read_etc_files(iodined_t) ++auth_use_nsswitch(iodined_t) + + logging_send_syslog_msg(iodined_t) + +diff --git a/iotop.fc b/iotop.fc +new file mode 100644 +index 0000000000..c8d2deac26 +--- /dev/null ++++ b/iotop.fc +@@ -0,0 +1 @@ ++/usr/sbin/iotop -- gen_context(system_u:object_r:iotop_exec_t,s0) +diff --git a/iotop.if b/iotop.if +new file mode 100644 +index 0000000000..7fc3464e60 +--- /dev/null ++++ b/iotop.if +@@ -0,0 +1,46 @@ ++## Simple top-like I/O monitor ++ ++######################################## ++## ++## Allow execution of iotop in the iotop domain from the target domain. ++## ++## ++## ++## Domain allowed to transition to iotop. ++## ++## ++# ++interface(`iotop_domtrans',` ++ gen_require(` ++ type iotop_t, iotop_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, iotop_exec_t, iotop_t) ++') ++ ++######################################## ++## ++## Execute iotop in the iotop domain, and ++## allow the specified role to access the iotop domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed into the iotop domain. ++## ++## ++# ++interface(`iotop_run',` ++ gen_require(` ++ type iotop_t; ++ attribute_role iotop_roles; ++ ') ++ ++ iotop_domtrans($1) ++ roleattribute $2 iotop_roles; ++') +diff --git a/iotop.te b/iotop.te +new file mode 100644 +index 0000000000..61f2003c8e +--- /dev/null ++++ b/iotop.te +@@ -0,0 +1,39 @@ ++policy_module(iotop, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute_role iotop_roles; ++roleattribute system_r iotop_roles; ++ ++type iotop_t; ++type iotop_exec_t; ++application_domain(iotop_t, iotop_exec_t) ++ ++role iotop_roles types iotop_t; ++ ++######################################## ++# ++# iotop local policy ++# ++ ++allow iotop_t self:capability net_admin; ++allow iotop_t self:netlink_route_socket r_netlink_socket_perms; ++allow iotop_t self:netlink_socket create_socket_perms; ++ ++kernel_read_system_state(iotop_t) ++ ++auth_use_nsswitch(iotop_t) ++ ++dev_read_urand(iotop_t) ++ ++domain_getsched_all_domains(iotop_t) ++domain_read_all_domains_state(iotop_t) ++ ++corecmd_exec_bin(iotop_t) ++ ++miscfiles_read_localization(iotop_t) ++ ++userdom_use_user_terminals(iotop_t) +diff --git a/ipa.fc b/ipa.fc +new file mode 100644 +index 0000000000..4cd9ef1324 +--- /dev/null ++++ b/ipa.fc +@@ -0,0 +1,25 @@ ++/etc/httpd/alias/ipasession.key -- gen_context(system_u:object_r:ipa_cert_t,s0) ++ ++/usr/lib/systemd/system/ipa-otpd.* -- gen_context(system_u:object_r:ipa_otpd_unit_file_t,s0) ++ ++/usr/lib/systemd/system/ipa-dnskeysyncd.* -- gen_context(system_u:object_r:ipa_dnskey_unit_file_t,s0) ++ ++/usr/libexec/ipa-otpd -- gen_context(system_u:object_r:ipa_otpd_exec_t,s0) ++/usr/libexec/ipa/ipa-otpd -- gen_context(system_u:object_r:ipa_otpd_exec_t,s0) ++ ++ ++/usr/libexec/ipa/ipa-dnskeysyncd -- gen_context(system_u:object_r:ipa_dnskey_exec_t,s0) ++/usr/libexec/ipa/ipa-dnskeysync-replica -- gen_context(system_u:object_r:ipa_dnskey_exec_t,s0) ++ ++/usr/libexec/ipa/com\.redhat\.idm\.trust-fetch-domains -- gen_context(system_u:object_r:ipa_helper_exec_t,s0) ++/usr/libexec/ipa/oddjob/com\.redhat\.idm\.trust-fetch-domains -- gen_context(system_u:object_r:ipa_helper_exec_t,s0) ++/usr/libexec/ipa/oddjob/org\.freeipa\.server\.conncheck -- gen_context(system_u:object_r:ipa_helper_exec_t,s0) ++/usr/libexec/ipa/oddjob/org\.freeipa\.server\.trust-enable-agent -- gen_context(system_u:object_r:ipa_helper_exec_t,s0) ++ ++/var/lib/ipa(/.*)? gen_context(system_u:object_r:ipa_var_lib_t,s0) ++ ++/var/log/ipa(/.*)? gen_context(system_u:object_r:ipa_log_t,s0) ++ ++/var/log/ipareplica-conncheck.log.* -- gen_context(system_u:object_r:ipa_log_t,s0) ++ ++/var/run/ipa(/.*)? gen_context(system_u:object_r:ipa_var_run_t,s0) +diff --git a/ipa.if b/ipa.if +new file mode 100644 +index 0000000000..c54d3d4922 +--- /dev/null ++++ b/ipa.if +@@ -0,0 +1,293 @@ ++## Policy for IPA services. ++ ++######################################## ++## ++## Execute rtas_errd in the rtas_errd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ipa_domtrans_otpd',` ++ gen_require(` ++ type ipa_otpd_t, ipa_otpd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ipa_otpd_exec_t, ipa_otpd_t) ++') ++ ++######################################## ++## ++## Connect to ipa-otpd over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_stream_connect_otpd',` ++ gen_require(` ++ type ipa_otpd_t; ++ ') ++ allow $1 ipa_otpd_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## Execute ipa-helper in the ipa_helper domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ipa_domtrans_helper',` ++ gen_require(` ++ type ipa_helper_t, ipa_helper_exec_t; ++ ') ++ ++ domtrans_pattern($1, ipa_helper_exec_t, ipa_helper_t) ++') ++ ++######################################## ++## ++## Execute ipa-helper in the ipa_helper domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`ipa_run_helper',` ++ gen_require(` ++ type ipa_helper_t; ++ attribute_role ipa_helper_roles; ++ ') ++ ++ ipa_domtrans_helper($1) ++ roleattribute $2 ipa_helper_roles; ++') ++ ++######################################## ++## ++## Allow domain to manage ipa lib files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_search_lib',` ++ gen_require(` ++ type ipa_var_lib_t; ++ ') ++ ++ search_dirs_pattern($1, ipa_var_lib_t, ipa_var_lib_t) ++') ++ ++######################################## ++## ++## Allow domain to manage ipa lib files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_manage_lib',` ++ gen_require(` ++ type ipa_var_lib_t; ++ ') ++ ++ manage_files_pattern($1, ipa_var_lib_t, ipa_var_lib_t) ++ manage_dirs_pattern($1, ipa_var_lib_t, ipa_var_lib_t) ++') ++ ++######################################## ++## ++## Allow domain to manage ipa log files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_manage_log',` ++ gen_require(` ++ type ipa_log_t; ++ ') ++ ++ manage_files_pattern($1, ipa_log_t, ipa_log_t) ++ manage_dirs_pattern($1, ipa_log_t, ipa_log_t) ++') ++ ++######################################## ++## ++## Allow domain to manage ipa lib files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_read_lib',` ++ gen_require(` ++ type ipa_var_lib_t; ++ ') ++ ++ read_files_pattern($1, ipa_var_lib_t, ipa_var_lib_t) ++ list_dirs_pattern($1, ipa_var_lib_t, ipa_var_lib_t) ++') ++ ++######################################## ++## ++## Allow domain to manage ipa run files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_manage_pid_files',` ++ gen_require(` ++ type ipa_var_run_t; ++ ') ++ manage_files_pattern($1, ipa_var_run_t, ipa_var_run_t) ++ manage_dirs_pattern($1, ipa_var_run_t, ipa_var_run_t) ++') ++ ++######################################## ++## ++## Create specified objects in generic ++## pid directories with the ipa pid file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`ipa_filetrans_pid',` ++ gen_require(` ++ type ipa_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, ipa_var_run_t, file, $2) ++') ++ ++######################################## ++## ++## Allow domain to manage ipa tmp files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_delete_tmp',` ++ gen_require(` ++ type ipa_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 ipa_tmp_t:file unlink; ++') ++ ++######################################## ++## ++## Create log files with a named file ++## type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_named_filetrans_log_dir',` ++ gen_require(` ++ type ipa_log_t; ++ ') ++ ++ logging_log_named_filetrans($1, ipa_log_t, dir, "ipa") ++') ++ ++####################################### ++## ++## Allow domain to create /tmp/ca.p12 ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_filetrans_named_content',` ++ ++ gen_require(` ++ type ipa_tmp_t; ++ ') ++ ++ files_tmp_filetrans($1, ipa_tmp_t, file, "ca.p12") ++') ++ ++######################################## ++## ++## Create file ipasession.key in cert_t dir ++## with ipa_cert_t type ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_cert_filetrans_named_content',` ++ gen_require(` ++ type ipa_cert_t; ++ type cert_t; ++ ') ++ ++ filetrans_pattern($1, cert_t, ipa_cert_t, file ,"ipasession.key") ++ manage_files_pattern($1, ipa_cert_t, ipa_cert_t) ++') ++ ++######################################## ++## ++## Allow domain to read ipa tmp files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipa_read_tmp',` ++ gen_require(` ++ type ipa_tmp_t; ++ ') ++ ++ read_files_pattern($1, ipa_tmp_t, ipa_tmp_t) ++') +diff --git a/ipa.te b/ipa.te +new file mode 100644 +index 0000000000..c2b0e4438d +--- /dev/null ++++ b/ipa.te +@@ -0,0 +1,230 @@ ++policy_module(ipa, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute ipa_domain; ++ ++attribute_role ipa_helper_roles; ++roleattribute system_r ipa_helper_roles; ++ ++type ipa_otpd_t, ipa_domain; ++type ipa_otpd_exec_t; ++init_daemon_domain(ipa_otpd_t, ipa_otpd_exec_t) ++ ++type ipa_dnskey_t, ipa_domain; ++type ipa_dnskey_exec_t; ++init_daemon_domain(ipa_dnskey_t, ipa_dnskey_exec_t) ++ ++type ipa_otpd_unit_file_t; ++systemd_unit_file(ipa_otpd_unit_file_t) ++ ++type ipa_dnskey_unit_file_t; ++systemd_unit_file(ipa_dnskey_unit_file_t) ++ ++type ipa_log_t; ++logging_log_file(ipa_log_t) ++ ++type ipa_var_lib_t; ++files_type(ipa_var_lib_t) ++ ++type ipa_var_run_t; ++files_pid_file(ipa_var_run_t) ++ ++type ipa_helper_t; ++type ipa_helper_exec_t; ++domain_type(ipa_helper_t) ++domain_obj_id_change_exemption(ipa_helper_t) ++init_system_domain(ipa_helper_t, ipa_helper_exec_t) ++role ipa_helper_roles types ipa_helper_t; ++ ++type ipa_cert_t; ++miscfiles_cert_type(ipa_cert_t) ++ ++type ipa_tmp_t; ++files_tmp_file(ipa_tmp_t) ++ ++######################################## ++# ++# ipa_otpd local policy ++# ++ ++allow ipa_otpd_t self:capability2 block_suspend; ++ ++allow ipa_otpd_t self:fifo_file rw_fifo_file_perms; ++allow ipa_otpd_t self:unix_stream_socket create_stream_socket_perms; ++ ++read_files_pattern(ipa_otpd_t, ipa_cert_t, ipa_cert_t) ++read_lnk_files_pattern(ipa_otpd_t, ipa_cert_t, ipa_cert_t) ++ ++manage_dirs_pattern(ipa_otpd_t, ipa_var_run_t, ipa_var_run_t) ++manage_files_pattern(ipa_otpd_t, ipa_var_run_t, ipa_var_run_t) ++files_pid_filetrans(ipa_otpd_t, ipa_var_run_t, file) ++ ++corenet_tcp_connect_radius_port(ipa_otpd_t) ++ ++dev_read_urand(ipa_otpd_t) ++dev_read_rand(ipa_otpd_t) ++ ++sysnet_dns_name_resolve(ipa_otpd_t) ++ ++optional_policy(` ++ dirsrv_stream_connect(ipa_otpd_t) ++') ++ ++optional_policy(` ++ kerberos_use(ipa_otpd_t) ++') ++ ++######################################## ++# ++# ipa-helper local policy ++# ++ ++ ++allow ipa_helper_t self:capability { net_admin dac_read_search dac_override chown }; ++ ++#kernel bug ++dontaudit ipa_helper_t self:capability2 block_suspend; ++ ++allow ipa_helper_t self:process setfscreate; ++allow ipa_helper_t self:fifo_file rw_fifo_file_perms; ++allow ipa_helper_t self:netlink_route_socket r_netlink_socket_perms; ++ ++manage_files_pattern(ipa_helper_t, ipa_log_t, ipa_log_t) ++logging_log_filetrans(ipa_helper_t, ipa_log_t, file) ++ ++manage_dirs_pattern(ipa_helper_t, ipa_var_run_t, ipa_var_run_t) ++manage_files_pattern(ipa_helper_t, ipa_var_run_t, ipa_var_run_t) ++files_pid_filetrans(ipa_helper_t, ipa_var_run_t, { dir file }) ++ ++kernel_read_system_state(ipa_helper_t) ++kernel_read_network_state(ipa_helper_t) ++ ++corenet_tcp_connect_ldap_port(ipa_helper_t) ++corenet_tcp_connect_smbd_port(ipa_helper_t) ++corenet_tcp_connect_http_port(ipa_helper_t) ++corenet_tcp_connect_kerberos_password_port(ipa_helper_t) ++ ++corecmd_exec_bin(ipa_helper_t) ++corecmd_exec_shell(ipa_helper_t) ++ ++dev_read_urand(ipa_helper_t) ++ ++auth_use_nsswitch(ipa_helper_t) ++ ++files_list_tmp(ipa_helper_t) ++ ++init_read_state(ipa_helper_t) ++init_stream_connect(ipa_helper_t) ++ ++ipa_manage_pid_files(ipa_helper_t) ++ipa_read_lib(ipa_helper_t) ++ ++logging_send_syslog_msg(ipa_helper_t) ++ ++optional_policy(` ++ dirsrv_stream_connect(ipa_helper_t) ++') ++ ++optional_policy(` ++ ldap_stream_connect(ipa_helper_t) ++') ++ ++optional_policy(` ++ libs_exec_ldconfig(ipa_helper_t) ++') ++ ++optional_policy(` ++ memcached_stream_connect(ipa_helper_t) ++') ++ ++optional_policy(` ++ oddjob_system_entry(ipa_helper_t, ipa_helper_exec_t) ++') ++ ++optional_policy(` ++ rpm_read_db(ipa_helper_t) ++') ++ ++optional_policy(` ++ samba_read_config(ipa_helper_t) ++') ++ ++optional_policy(` ++ sssd_manage_lib_files(ipa_helper_t) ++ sssd_systemctl(ipa_helper_t) ++') ++ ++optional_policy(` ++ systemd_config_generic_services(ipa_helper_t) ++') ++ ++######################################## ++# ++# ipa-dnskey local policy ++# ++allow ipa_dnskey_t self:tcp_socket create_stream_socket_perms; ++allow ipa_dnskey_t self:udp_socket create_socket_perms; ++allow ipa_dnskey_t self:unix_dgram_socket create_socket_perms; ++allow ipa_dnskey_t self:netlink_route_socket { create_netlink_socket_perms nlmsg_read }; ++ ++read_files_pattern(ipa_dnskey_t, ipa_cert_t, ipa_cert_t) ++read_lnk_files_pattern(ipa_dnskey_t, ipa_cert_t, ipa_cert_t) ++ ++manage_files_pattern(ipa_dnskey_t, ipa_var_lib_t, ipa_var_lib_t) ++setattr_dirs_pattern(ipa_dnskey_t, ipa_var_lib_t, ipa_var_lib_t) ++list_dirs_pattern(ipa_dnskey_t, ipa_var_lib_t, ipa_var_lib_t) ++ ++manage_files_pattern(ipa_dnskey_t, ipa_tmp_t, ipa_tmp_t) ++files_tmp_filetrans(ipa_dnskey_t, ipa_tmp_t, { file }) ++ ++kernel_dgram_send(ipa_dnskey_t) ++kernel_read_system_state(ipa_dnskey_t) ++kernel_read_network_state(ipa_dnskey_t) ++ ++auth_use_nsswitch(ipa_dnskey_t) ++ ++corecmd_exec_bin(ipa_dnskey_t) ++corecmd_exec_shell(ipa_dnskey_t) ++ ++corenet_tcp_bind_generic_node(ipa_dnskey_t) ++corenet_tcp_connect_kerberos_port(ipa_dnskey_t) ++corenet_tcp_connect_rndc_port(ipa_dnskey_t) ++ ++dev_read_rand(ipa_dnskey_t) ++ ++can_exec(ipa_dnskey_t,ipa_dnskey_exec_t) ++ ++libs_exec_ldconfig(ipa_dnskey_t) ++ ++logging_send_syslog_msg(ipa_dnskey_t) ++ ++miscfiles_read_certs(ipa_dnskey_t) ++ ++sysnet_read_config(ipa_dnskey_t) ++ ++optional_policy(` ++ apache_search_config(ipa_dnskey_t) ++') ++ ++optional_policy(` ++ bind_domtrans_ndc(ipa_dnskey_t) ++ bind_read_dnssec_keys(ipa_dnskey_t) ++ bind_manage_zone(ipa_dnskey_t) ++ bind_manage_zone_dirs(ipa_dnskey_t) ++ bind_search_cache(ipa_dnskey_t) ++') ++ ++optional_policy(` ++ dirsrv_stream_connect(ipa_dnskey_t) ++') ++ ++optional_policy(` ++ opendnssec_domtrans(ipa_dnskey_t) ++ opendnssec_manage_config(ipa_dnskey_t) ++ opendnssec_manage_var_files(ipa_dnskey_t) ++ opendnssec_filetrans_etc_content(ipa_dnskey_t) ++') +diff --git a/ipmievd.fc b/ipmievd.fc +new file mode 100644 +index 0000000000..0f598ca9fb +--- /dev/null ++++ b/ipmievd.fc +@@ -0,0 +1,9 @@ ++/usr/lib/systemd/system/ipmievd\.service -- gen_context(system_u:object_r:ipmievd_unit_file_t,s0) ++ ++/usr/sbin/ipmievd -- gen_context(system_u:object_r:ipmievd_exec_t,s0) ++ ++/usr/libexec/openipmi-helper -- gen_context(system_u:object_r:ipmievd_exec_t,s0) ++ ++/var/run/ipmievd\.pid -- gen_context(system_u:object_r:ipmievd_var_run_t,s0) ++ ++/var/lock/subsys/ipmi -- gen_context(system_u:object_r:ipmievd_lock_t,s0) +diff --git a/ipmievd.if b/ipmievd.if +new file mode 100644 +index 0000000000..e86db54188 +--- /dev/null ++++ b/ipmievd.if +@@ -0,0 +1,120 @@ ++## IPMI event daemon for sending events to syslog. ++ ++######################################## ++## ++## Execute ipmievd_exec_t in the ipmievd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ipmievd_domtrans',` ++ gen_require(` ++ type ipmievd_t, ipmievd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ipmievd_exec_t, ipmievd_t) ++') ++ ++###################################### ++## ++## Execute ipmievd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipmievd_exec',` ++ gen_require(` ++ type ipmievd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, ipmievd_exec_t) ++') ++ ++######################################## ++## ++## Read ipmievd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipmievd_read_pid_files',` ++ gen_require(` ++ type ipmievd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, ipmievd_var_run_t, ipmievd_var_run_t) ++') ++ ++######################################## ++## ++## Execute ipmievd server in the ipmievd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ipmievd_systemctl',` ++ gen_require(` ++ type ipmievd_t; ++ type ipmievd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 ipmievd_unit_file_t:file read_file_perms; ++ allow $1 ipmievd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ipmievd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ipmievd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ipmievd_admin',` ++ gen_require(` ++ type ipmievd_t; ++ type ipmievd_var_run_t; ++ type ipmievd_unit_file_t; ++ ') ++ ++ allow $1 ipmievd_t:process { signal_perms }; ++ ps_process_pattern($1, ipmievd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ipmievd_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, ipmievd_var_run_t) ++ ++ ipmievd_systemctl($1) ++ admin_pattern($1, ipmievd_unit_file_t) ++ allow $1 ipmievd_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/ipmievd.te b/ipmievd.te +new file mode 100644 +index 0000000000..272487e096 +--- /dev/null ++++ b/ipmievd.te +@@ -0,0 +1,55 @@ ++policy_module(ipmievd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type ipmievd_t; ++type ipmievd_exec_t; ++init_daemon_domain(ipmievd_t, ipmievd_exec_t) ++ ++type ipmievd_var_run_t; ++files_pid_file(ipmievd_var_run_t) ++ ++type ipmievd_lock_t; ++files_lock_file(ipmievd_lock_t) ++ ++type ipmievd_unit_file_t; ++systemd_unit_file(ipmievd_unit_file_t) ++ ++######################################## ++# ++# ipmievd local policy ++# ++ ++allow ipmievd_t self:process { fork setpgid }; ++allow ipmievd_t self:fifo_file rw_fifo_file_perms; ++ ++manage_files_pattern(ipmievd_t, ipmievd_var_run_t, ipmievd_var_run_t) ++files_pid_filetrans(ipmievd_t, ipmievd_var_run_t, { file }) ++ ++manage_files_pattern(ipmievd_t, ipmievd_lock_t, ipmievd_lock_t) ++files_lock_filetrans(ipmievd_t, ipmievd_lock_t, file) ++ ++kernel_read_system_state(ipmievd_t) ++kernel_load_module(ipmievd_t) ++ ++auth_use_nsswitch(ipmievd_t) ++ ++corecmd_exec_bin(ipmievd_t) ++ ++dev_manage_ipmi_dev(ipmievd_t) ++dev_filetrans_ipmi(ipmievd_t) ++dev_read_sysfs(ipmievd_t) ++dev_rw_watchdog(ipmievd_t) ++ ++files_read_kernel_modules(ipmievd_t) ++files_map_kernel_modules(ipmievd_t) ++ ++logging_send_syslog_msg(ipmievd_t) ++ ++miscfiles_read_certs(ipmievd_t) ++ ++modutils_exec_insmod(ipmievd_t) ++modutils_read_module_config(ipmievd_t) +diff --git a/irc.fc b/irc.fc +index 48e7739f94..1bf0326cdc 100644 +--- a/irc.fc ++++ b/irc.fc +@@ -1,6 +1,6 @@ + HOME_DIR/\.ircmotd -- gen_context(system_u:object_r:irc_home_t,s0) + HOME_DIR/\.irssi(/.*)? gen_context(system_u:object_r:irc_home_t,s0) +-HOME_DIR/irclogs(/.*)? gen_context(system_u:object_r:irc_log_home_t,s0) ++HOME_DIR/irclog(/.*)? gen_context(system_u:object_r:irc_home_t,s0) + + /etc/irssi\.conf -- gen_context(system_u:object_r:irc_conf_t,s0) + +diff --git a/irc.if b/irc.if +index ac00fb0fbc..36ef2e59cb 100644 +--- a/irc.if ++++ b/irc.if +@@ -20,6 +20,7 @@ interface(`irc_role',` + attribute_role irc_roles; + type irc_t, irc_exec_t, irc_home_t; + type irc_tmp_t, irc_log_home_t; ++ type irssi_t, irssi_exec_t, irssi_home_t; + ') + + ######################################## +@@ -37,12 +38,42 @@ interface(`irc_role',` + domtrans_pattern($2, irc_exec_t, irc_t) + + ps_process_pattern($2, irc_t) +- allow $2 irc_t:process { ptrace signal_perms }; +- +- allow $2 { irc_home_t irc_log_home_t irc_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { irc_home_t irc_log_home_t irc_tmp_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 { irc_home_t irc_log_home_t irc_tmp_t }:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, irc_home_t, dir, ".irssi") +- userdom_user_home_dir_filetrans($2, irc_home_t, file, ".ircmotd") +- userdom_user_home_dir_filetrans($2, irc_log_home_t, dir, "irclogs") ++ allow $2 irc_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 irc_t:process ptrace; ++ ') ++ ++ domtrans_pattern($2, irssi_exec_t, irssi_t) ++ ++ allow $2 irssi_t:process signal_perms; ++ ps_process_pattern($2, irssi_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 irssi_t:process ptrace; ++ ') ++ ++ allow $2 { irc_home_t irc_log_home_t irc_tmp_t irssi_home_t }:dir { manage_dir_perms relabel_dir_perms }; ++ allow $2 { irc_home_t irc_log_home_t irc_tmp_t irssi_home_t }:file { manage_file_perms relabel_file_perms }; ++ allow $2 { irc_home_t irc_log_home_t irc_tmp_t irssi_home_t }:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; ++ ++ irc_filetrans_home_content($2) ++') ++ ++####################################### ++## ++## Transition to alsa named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`irc_filetrans_home_content',` ++ gen_require(` ++ type irc_home_t; ++ type irssi_home_t; ++ ') ++ userdom_user_home_dir_filetrans($1, irc_home_t, file, ".ircmotd") ++ userdom_user_home_dir_filetrans($1, irc_home_t, dir, ".irssi") ++ userdom_user_home_dir_filetrans($1, irssi_home_t, dir, "irclogs") + ') +diff --git a/irc.te b/irc.te +index 2636503679..5910c59315 100644 +--- a/irc.te ++++ b/irc.te +@@ -31,13 +31,35 @@ typealias irc_home_t alias { user_irc_home_t staff_irc_home_t sysadm_irc_home_t + typealias irc_home_t alias { auditadm_irc_home_t secadm_irc_home_t }; + userdom_user_home_content(irc_home_t) + +-type irc_log_home_t; +-userdom_user_home_content(irc_log_home_t) +- + type irc_tmp_t; + typealias irc_tmp_t alias { user_irc_tmp_t staff_irc_tmp_t sysadm_irc_tmp_t }; + typealias irc_tmp_t alias { auditadm_irc_tmp_t secadm_irc_tmp_t }; +-userdom_user_tmp_file(irc_tmp_t) ++userdom_user_home_content(irc_tmp_t) ++ ++######################################## ++# ++# Irssi personal declarations. ++# ++ ++## ++##

      ++## Allow the Irssi IRC Client to connect to any port, ++## and to bind to any unreserved port. ++##

      ++##
      ++gen_tunable(irssi_use_full_network, false) ++ ++type irssi_t; ++type irssi_exec_t; ++application_domain(irssi_t, irssi_exec_t) ++ubac_constrained(irssi_t) ++role irc_roles types irssi_t; ++ ++type irssi_etc_t; ++files_config_file(irssi_etc_t) ++ ++type irssi_home_t alias irc_log_home_t; ++userdom_user_home_content(irssi_home_t) + + ######################################## + # +@@ -53,13 +75,7 @@ allow irc_t irc_conf_t:file read_file_perms; + manage_dirs_pattern(irc_t, irc_home_t, irc_home_t) + manage_files_pattern(irc_t, irc_home_t, irc_home_t) + manage_lnk_files_pattern(irc_t, irc_home_t, irc_home_t) +-userdom_user_home_dir_filetrans(irc_t, irc_home_t, dir, ".irssi") +-userdom_user_home_dir_filetrans(irc_t, irc_home_t, file, ".ircmotd") +- +-manage_dirs_pattern(irc_t, irc_log_home_t, irc_log_home_t) +-create_files_pattern(irc_t, irc_log_home_t, irc_log_home_t) +-append_files_pattern(irc_t, irc_log_home_t, irc_log_home_t) +-userdom_user_home_dir_filetrans(irc_t, irc_log_home_t, dir, "irclogs") ++irc_filetrans_home_content(irc_t) + + manage_dirs_pattern(irc_t, irc_tmp_t, irc_tmp_t) + manage_files_pattern(irc_t, irc_tmp_t, irc_tmp_t) +@@ -70,7 +86,9 @@ files_tmp_filetrans(irc_t, irc_tmp_t, { file dir lnk_file sock_file fifo_file }) + + kernel_read_system_state(irc_t) + +-corenet_all_recvfrom_unlabeled(irc_t) ++corecmd_exec_shell(irc_t) ++corecmd_exec_bin(irc_t) ++ + corenet_all_recvfrom_netlabel(irc_t) + corenet_tcp_sendrecv_generic_if(irc_t) + corenet_tcp_sendrecv_generic_node(irc_t) +@@ -93,8 +111,6 @@ dev_read_rand(irc_t) + + domain_use_interactive_fds(irc_t) + +-files_read_usr_files(irc_t) +- + fs_getattr_all_fs(irc_t) + fs_search_auto_mountpoints(irc_t) + +@@ -106,14 +122,16 @@ auth_use_nsswitch(irc_t) + init_read_utmp(irc_t) + init_dontaudit_lock_utmp(irc_t) + +-miscfiles_read_generic_certs(irc_t) +-miscfiles_read_localization(irc_t) +- +-userdom_use_user_terminals(irc_t) ++userdom_use_inherited_user_terminals(irc_t) + + userdom_manage_user_home_content_dirs(irc_t) + userdom_manage_user_home_content_files(irc_t) +-userdom_user_home_dir_filetrans_user_home_content(irc_t, { dir file }) ++userdom_filetrans_home_content(irc_t) ++ ++# Write to the user domain tty. ++userdom_use_inherited_user_terminals(irc_t) ++ ++userdom_home_manager(irc_t) + + tunable_policy(`irc_use_any_tcp_ports',` + allow irc_t self:tcp_socket { accept listen }; +@@ -124,18 +142,69 @@ tunable_policy(`irc_use_any_tcp_ports',` + corenet_tcp_sendrecv_all_ports(irc_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(irc_t) +- fs_manage_nfs_files(irc_t) +- fs_manage_nfs_symlinks(irc_t) ++optional_policy(` ++ nis_use_ypbind(irc_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(irc_t) +- fs_manage_cifs_files(irc_t) +- fs_manage_cifs_symlinks(irc_t) ++######################################## ++# ++# Irssi personal declarations. ++# ++ ++allow irssi_t self:process { signal sigkill }; ++allow irssi_t self:fifo_file rw_fifo_file_perms; ++allow irssi_t self:tcp_socket create_stream_socket_perms; ++ ++read_files_pattern(irssi_t, irssi_etc_t, irssi_etc_t) ++ ++manage_dirs_pattern(irssi_t, irssi_home_t, irssi_home_t) ++manage_files_pattern(irssi_t, irssi_home_t, irssi_home_t) ++manage_lnk_files_pattern(irssi_t, irssi_home_t, irssi_home_t) ++irc_filetrans_home_content(irssi_t) ++userdom_search_user_home_dirs(irssi_t) ++ ++kernel_read_system_state(irssi_t) ++ ++corecmd_exec_shell(irssi_t) ++corecmd_read_bin_symlinks(irssi_t) ++ ++corenet_tcp_connect_ircd_port(irssi_t) ++corenet_tcp_sendrecv_ircd_port(irssi_t) ++corenet_sendrecv_ircd_client_packets(irssi_t) ++ ++# tcp:7000 is often used for SSL irc ++corenet_tcp_connect_gatekeeper_port(irssi_t) ++corenet_tcp_sendrecv_gatekeeper_port(irssi_t) ++corenet_sendrecv_gatekeeper_client_packets(irssi_t) ++ ++# Privoxy ++corenet_tcp_connect_http_cache_port(irssi_t) ++corenet_tcp_sendrecv_http_cache_port(irssi_t) ++corenet_sendrecv_http_cache_client_packets(irssi_t) ++ ++corenet_tcp_bind_generic_node(irssi_t) ++ ++dev_read_urand(irssi_t) ++# irssi-otr genkey. ++dev_read_rand(irssi_t) ++ ++ ++fs_search_auto_mountpoints(irssi_t) ++ ++auth_use_nsswitch(irssi_t) ++ ++ ++userdom_use_inherited_user_terminals(irssi_t) ++ ++tunable_policy(`irssi_use_full_network', ` ++ corenet_tcp_bind_all_unreserved_ports(irssi_t) ++ corenet_tcp_connect_all_ports(irssi_t) ++ corenet_sendrecv_generic_server_packets(irssi_t) ++ corenet_sendrecv_all_client_packets(irssi_t) + ') + ++userdom_home_manager(irssi_t) ++ + optional_policy(` + seutil_use_newrole_fds(irc_t) + ') +diff --git a/ircd.if b/ircd.if +index ade9803231..3620c9a674 100644 +--- a/ircd.if ++++ b/ircd.if +@@ -33,8 +33,8 @@ interface(`ircd_admin',` + + files_search_etc($1) + admin_pattern($1, ircd_etc_t) +- +- logging_search_log($1) ++ ++ logging_search_logs($1) + admin_pattern($1, ircd_log_t) + + files_search_var_lib($1) +diff --git a/ircd.te b/ircd.te +index efaf4b10ad..bd1a132acd 100644 +--- a/ircd.te ++++ b/ircd.te +@@ -52,7 +52,6 @@ kernel_read_kernel_sysctls(ircd_t) + + corecmd_exec_bin(ircd_t) + +-corenet_all_recvfrom_unlabeled(ircd_t) + corenet_all_recvfrom_netlabel(ircd_t) + corenet_tcp_sendrecv_generic_if(ircd_t) + corenet_tcp_sendrecv_generic_node(ircd_t) +@@ -75,8 +74,6 @@ auth_use_nsswitch(ircd_t) + + logging_send_syslog_msg(ircd_t) + +-miscfiles_read_localization(ircd_t) +- + userdom_dontaudit_use_unpriv_user_fds(ircd_t) + userdom_dontaudit_search_user_home_dirs(ircd_t) + +diff --git a/irqbalance.te b/irqbalance.te +index e1f302ddb6..1e5418a2e0 100644 +--- a/irqbalance.te ++++ b/irqbalance.te +@@ -35,7 +35,6 @@ kernel_rw_irq_sysctls(irqbalance_t) + + dev_read_sysfs(irqbalance_t) + +-files_read_etc_files(irqbalance_t) + files_read_etc_runtime_files(irqbalance_t) + + fs_getattr_all_fs(irqbalance_t) +@@ -45,8 +44,6 @@ domain_use_interactive_fds(irqbalance_t) + + logging_send_syslog_msg(irqbalance_t) + +-miscfiles_read_localization(irqbalance_t) +- + userdom_dontaudit_use_unpriv_user_fds(irqbalance_t) + userdom_dontaudit_search_user_home_dirs(irqbalance_t) + +diff --git a/iscsi.fc b/iscsi.fc +index 08b7560479..417e630049 100644 +--- a/iscsi.fc ++++ b/iscsi.fc +@@ -1,19 +1,18 @@ +-/etc/rc\.d/init\.d/((iscsi)|(iscsid)) -- gen_context(system_u:object_r:iscsi_initrc_exec_t,s0) +- + /sbin/iscsid -- gen_context(system_u:object_r:iscsid_exec_t,s0) +-/sbin/brcm_iscsiuio -- gen_context(system_u:object_r:iscsid_exec_t,s0) + /sbin/iscsiuio -- gen_context(system_u:object_r:iscsid_exec_t,s0) + + /usr/sbin/iscsid -- gen_context(system_u:object_r:iscsid_exec_t,s0) +-/usr/sbin/brcm_iscsiuio -- gen_context(system_u:object_r:iscsid_exec_t,s0) + /usr/sbin/iscsiuio -- gen_context(system_u:object_r:iscsid_exec_t,s0) ++/usr/sbin/iscsiadm -- gen_context(system_u:object_r:iscsid_exec_t,s0) + + /var/lib/iscsi(/.*)? gen_context(system_u:object_r:iscsi_var_lib_t,s0) + + /var/lock/iscsi(/.*)? gen_context(system_u:object_r:iscsi_lock_t,s0) + +-/var/log/brcm-iscsi\.log.* -- gen_context(system_u:object_r:iscsi_log_t,s0) + /var/log/iscsiuio\.log.* -- gen_context(system_u:object_r:iscsi_log_t,s0) + + /var/run/iscsid\.pid -- gen_context(system_u:object_r:iscsi_var_run_t,s0) + /var/run/iscsiuio\.pid -- gen_context(system_u:object_r:iscsi_var_run_t,s0) ++ ++/usr/lib/systemd/system/((iscsi)|(iscsid)|(iscsiuio))\.service -- gen_context(system_u:object_r:iscsi_unit_file_t,s0) ++/usr/lib/systemd/system/((iscsid)|(iscsiuio))\.socket -- gen_context(system_u:object_r:iscsi_unit_file_t,s0) +diff --git a/iscsi.if b/iscsi.if +index 1a354203e8..77004ecad1 100644 +--- a/iscsi.if ++++ b/iscsi.if +@@ -17,6 +17,53 @@ interface(`iscsid_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, iscsid_exec_t, iscsid_t) ++ allow $1 iscsid_exec_t:file map; ++') ++ ++######################################## ++## ++## Execute iscsid programs in the iscsid domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to allow the iscsid domain. ++## ++## ++## ++# ++interface(`iscsid_run',` ++ gen_require(` ++ attribute_role iscsid_roles; ++ ') ++ ++ iscsid_domtrans($1) ++ roleattribute $2 iscsid_roles; ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## iscsid lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`iscsi_manage_lock',` ++ gen_require(` ++ type iscsi_lock_t; ++ ') ++ ++ files_search_locks($1) ++ manage_files_pattern($1, iscsi_lock_t, iscsi_lock_t) ++ manage_dirs_pattern($1, iscsi_lock_t, iscsi_lock_t) + ') + + ######################################## +@@ -80,17 +127,54 @@ interface(`iscsi_read_lib_files',` + + ######################################## + ## +-## All of the rules required to +-## administrate an iscsi environment. ++## Transition to iscsi named content + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`iscsi_filetrans_named_content',` ++ gen_require(` ++ type iscsi_lock_t; ++ ') ++ ++ files_lock_filetrans($1, iscsi_lock_t, dir, "iscsi") ++') ++ ++######################################## ++## ++## Execute iscsi server in the iscsi domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`iscsi_systemctl',` ++ gen_require(` ++ type iscsid_t; ++ type iscsi_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 iscsi_unit_file_t:file read_file_perms; ++ allow $1 iscsi_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, iscsid_t) ++') ++ ++######################################## ++## ++## All of the rules required to ++## administrate an iscsi environment. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## +@@ -99,16 +183,16 @@ interface(`iscsi_admin',` + gen_require(` + type iscsid_t, iscsi_lock_t, iscsi_log_t; + type iscsi_var_lib_t, iscsi_var_run_t, iscsi_tmp_t; +- type iscsi_initrc_exec_t; ++ type iscsi_unit_file_t; + ') + + allow $1 iscsid_t:process { ptrace signal_perms }; + ps_process_pattern($1, iscsid_t) + +- init_labeled_script_domtrans($1, iscsi_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 iscsi_initrc_exec_t system_r; +- allow $2 system_r; ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 iscsi_unit_file_t:file manage_file_perms; ++ allow $1 iscsi_unit_file_t:service manage_service_perms; + + logging_search_logs($1) + admin_pattern($1, iscsi_log_t) +diff --git a/iscsi.te b/iscsi.te +index ca020faa98..5b3ff1668c 100644 +--- a/iscsi.te ++++ b/iscsi.te +@@ -5,12 +5,15 @@ policy_module(iscsi, 1.9.0) + # Declarations + # + ++attribute_role iscsid_roles; ++ + type iscsid_t; + type iscsid_exec_t; + init_daemon_domain(iscsid_t, iscsid_exec_t) ++role iscsid_roles types iscsid_t; + +-type iscsi_initrc_exec_t; +-init_script_file(iscsi_initrc_exec_t) ++type iscsi_unit_file_t; ++systemd_unit_file(iscsi_unit_file_t) + + type iscsi_lock_t; + files_lock_file(iscsi_lock_t) +@@ -32,17 +35,18 @@ files_pid_file(iscsi_var_run_t) + # Local policy + # + +-allow iscsid_t self:capability { dac_override ipc_lock net_admin net_raw sys_admin sys_nice sys_resource }; +-dontaudit iscsid_t self:capability sys_ptrace; ++allow iscsid_t self:capability { dac_read_search dac_override ipc_lock net_admin net_raw sys_admin sys_nice sys_module sys_resource }; + allow iscsid_t self:process { setrlimit setsched signal }; + allow iscsid_t self:fifo_file rw_fifo_file_perms; + allow iscsid_t self:unix_stream_socket { accept connectto listen }; + allow iscsid_t self:sem create_sem_perms; + allow iscsid_t self:shm create_shm_perms; ++allow iscsid_t self:netlink_iscsi_socket create_socket_perms; + allow iscsid_t self:netlink_socket create_socket_perms; + allow iscsid_t self:netlink_kobject_uevent_socket create_socket_perms; + allow iscsid_t self:netlink_route_socket nlmsg_write; + allow iscsid_t self:tcp_socket { listen accept }; ++allow iscsid_t self:system module_load; + + manage_dirs_pattern(iscsid_t, iscsi_lock_t, iscsi_lock_t) + manage_files_pattern(iscsid_t, iscsi_lock_t, iscsi_lock_t) +@@ -54,21 +58,24 @@ logging_log_filetrans(iscsid_t, iscsi_log_t, file) + manage_dirs_pattern(iscsid_t, iscsi_tmp_t, iscsi_tmp_t) + manage_files_pattern(iscsid_t, iscsi_tmp_t, iscsi_tmp_t) + fs_tmpfs_filetrans(iscsid_t, iscsi_tmp_t, { dir file }) ++allow iscsid_t iscsi_tmp_t:file map; + +-allow iscsid_t iscsi_var_lib_t:dir list_dir_perms; +-read_files_pattern(iscsid_t, iscsi_var_lib_t, iscsi_var_lib_t) +-read_lnk_files_pattern(iscsid_t, iscsi_var_lib_t, iscsi_var_lib_t) ++manage_files_pattern(iscsid_t, iscsi_var_lib_t, iscsi_var_lib_t) ++manage_lnk_files_pattern(iscsid_t, iscsi_var_lib_t, iscsi_var_lib_t) ++manage_dirs_pattern(iscsid_t, iscsi_var_lib_t, iscsi_var_lib_t) ++files_var_lib_filetrans(iscsid_t, iscsi_var_lib_t, dir) + + manage_files_pattern(iscsid_t, iscsi_var_run_t, iscsi_var_run_t) + files_pid_filetrans(iscsid_t, iscsi_var_run_t, file) + + can_exec(iscsid_t, iscsid_exec_t) + ++kernel_load_module(iscsid_t) + kernel_read_network_state(iscsid_t) + kernel_read_system_state(iscsid_t) +-kernel_setsched(iscsid_t) ++kernel_dontaudit_setsched(iscsid_t) ++kernel_request_load_module(iscsid_t) + +-corenet_all_recvfrom_unlabeled(iscsid_t) + corenet_all_recvfrom_netlabel(iscsid_t) + corenet_tcp_sendrecv_generic_if(iscsid_t) + corenet_tcp_sendrecv_generic_node(iscsid_t) +@@ -85,22 +92,43 @@ corenet_sendrecv_isns_client_packets(iscsid_t) + corenet_tcp_connect_isns_port(iscsid_t) + corenet_tcp_sendrecv_isns_port(iscsid_t) + +-dev_read_raw_memory(iscsid_t) ++corenet_sendrecv_winshadow_client_packets(iscsid_t) ++corenet_tcp_connect_winshadow_port(iscsid_t) ++corenet_tcp_sendrecv_winshadow_port(iscsid_t) ++ ++corecmd_exec_bin(iscsid_t) ++corecmd_exec_shell(iscsid_t) ++ ++dev_read_urand(iscsid_t) + dev_rw_sysfs(iscsid_t) ++dev_map_sysfs(iscsid_t) + dev_rw_userio_dev(iscsid_t) +-dev_write_raw_memory(iscsid_t) ++dev_map_userio_dev(iscsid_t) + + domain_use_interactive_fds(iscsid_t) + domain_dontaudit_read_all_domains_state(iscsid_t) + ++files_read_kernel_modules(iscsid_t) ++files_map_kernel_modules(iscsid_t) ++ + auth_use_nsswitch(iscsid_t) + + init_stream_connect_script(iscsid_t) + + logging_send_syslog_msg(iscsid_t) + +-miscfiles_read_localization(iscsid_t) ++modutils_read_module_config(iscsid_t) ++ ++mount_read_pid_files(iscsid_t) ++ ++optional_policy(` ++ iscsi_systemctl(iscsid_t) ++') + + optional_policy(` + tgtd_manage_semaphores(iscsid_t) + ') ++ ++optional_policy(` ++ kdump_rw_inherited_kdumpctl_tmp_pipes(iscsid_t) ++') +diff --git a/isns.te b/isns.te +index bc11034932..5a8ae798fa 100644 +--- a/isns.te ++++ b/isns.te +@@ -26,6 +26,7 @@ files_pid_file(isnsd_var_run_t) + allow isnsd_t self:capability kill; + allow isnsd_t self:process signal; + allow isnsd_t self:fifo_file rw_fifo_file_perms; ++allow isnsd_t self:tcp_socket { listen accept }; + allow isnsd_t self:udp_socket { accept listen }; + allow isnsd_t self:unix_stream_socket { accept listen }; + +@@ -37,6 +38,9 @@ manage_sock_files_pattern(isnsd_t, isnsd_var_run_t, isnsd_var_run_t) + manage_files_pattern(isnsd_t, isnsd_var_run_t, isnsd_var_run_t) + files_pid_filetrans(isnsd_t, isnsd_var_run_t, { file sock_file }) + ++kernel_read_system_state(isnsd_t) ++kernel_read_network_state(isnsd_t) ++ + corenet_all_recvfrom_unlabeled(isnsd_t) + corenet_all_recvfrom_netlabel(isnsd_t) + corenet_tcp_sendrecv_generic_if(isnsd_t) +@@ -46,10 +50,6 @@ corenet_tcp_bind_generic_node(isnsd_t) + corenet_sendrecv_isns_server_packets(isnsd_t) + corenet_tcp_bind_isns_port(isnsd_t) + +-files_read_etc_files(isnsd_t) ++auth_use_nsswitch(isnsd_t) + + logging_send_syslog_msg(isnsd_t) +- +-miscfiles_read_localization(isnsd_t) +- +-sysnet_dns_name_resolve(isnsd_t) +diff --git a/jabber.fc b/jabber.fc +index 59ad3b3c4d..bd02cc87d8 100644 +--- a/jabber.fc ++++ b/jabber.fc +@@ -1,25 +1,18 @@ +-/etc/rc\.d/init\.d/((jabber)|(ejabberd)|(jabberd)) -- gen_context(system_u:object_r:jabberd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/jabberd -- gen_context(system_u:object_r:jabberd_initrc_exec_t,s0) + +-/usr/bin/router -- gen_context(system_u:object_r:jabberd_router_exec_t,s0) +-/usr/bin/c2s -- gen_context(system_u:object_r:jabberd_router_exec_t,s0) +-/usr/bin/s2s -- gen_context(system_u:object_r:jabberd_exec_t,s0) +-/usr/bin/sm -- gen_context(system_u:object_r:jabberd_exec_t,s0) ++/usr/bin/router -- gen_context(system_u:object_r:jabberd_router_exec_t,s0) ++/usr/bin/c2s -- gen_context(system_u:object_r:jabberd_router_exec_t,s0) ++/usr/bin/s2s -- gen_context(system_u:object_r:jabberd_exec_t,s0) ++/usr/bin/sm -- gen_context(system_u:object_r:jabberd_exec_t,s0) + +-/usr/sbin/ejabberd -- gen_context(system_u:object_r:jabberd_exec_t,s0) +-/usr/sbin/ejabberdctl -- gen_context(system_u:object_r:jabberd_exec_t,s0) +-/usr/sbin/jabberd -- gen_context(system_u:object_r:jabberd_exec_t,s0) ++/var/lib/jabberd(/.*)? gen_context(system_u:object_r:jabberd_var_lib_t,s0) + +-/var/lock/ejabberdctl(/.*) gen_context(system_u:object_r:jabberd_lock_t,s0) ++# pyicq-t + +-/var/log/ejabberd(/.*)? gen_context(system_u:object_r:jabberd_log_t,s0) +-/var/log/jabber(/.*)? gen_context(system_u:object_r:jabberd_log_t,s0) ++/usr/share/pyicq-t/PyICQt\.py -- gen_context(system_u:object_r:pyicqt_exec_t,s0) + +-/var/lib/ejabberd(/.*)? gen_context(system_u:object_r:jabberd_var_lib_t,s0) +-/var/lib/ejabberd/spool(/.*)? gen_context(system_u:object_r:jabberd_spool_t,s0) +-/var/lib/jabber(/.*)? gen_context(system_u:object_r:jabberd_var_lib_t,s0) +-/var/lib/jabberd(/.*)? gen_context(system_u:object_r:jabberd_var_lib_t,s0) +-/var/lib/jabberd/log(/.*)? gen_context(system_u:object_r:jabberd_log_t,s0) +-/var/lib/jabberd/pid(/.*)? gen_context(system_u:object_r:jabberd_var_run_t,s0) ++/var/log/pyicq-t\.log.* gen_context(system_u:object_r:pyicqt_log_t,s0) + +-/var/run/ejabber\.pid -- gen_context(system_u:object_r:jabberd_var_run_t,s0) +-/var/run/jabber\.pid -- gen_context(system_u:object_r:jabberd_var_run_t,s0) ++/var/run/pyicq-t(/.*)? gen_context(system_u:object_r:pyicqt_var_run_t,s0) ++ ++/var/spool/pyicq-t(/.*)? gen_context(system_u:object_r:pyicqt_var_spool_t,s0) +diff --git a/jabber.if b/jabber.if +index 7eb3811219..8075ba5f00 100644 +--- a/jabber.if ++++ b/jabber.if +@@ -1,29 +1,76 @@ +-## Jabber instant messaging servers. ++## Jabber instant messaging server ++ ++##################################### ++## ++## Creates types and rules for a basic ++## jabber init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`jabber_domain_template',` ++ gen_require(` ++ attribute jabberd_domain; ++ ') ++ ++ ############################## ++ # ++ # $1_t declarations ++ # ++ ++ type $1_t, jabberd_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ kernel_read_system_state($1_t) ++ ++ corenet_all_recvfrom_netlabel($1_t) ++ ++ logging_send_syslog_msg($1_t) ++') + + ####################################### + ## +-## The template to define a jabber domain. ++## Execute a domain transition to run jabberd services + ## +-## ++## + ## +-## Domain prefix to be used. ++## Domain allowed to transition. + ## + ## + # +-template(`jabber_domain_template',` ++interface(`jabber_domtrans_jabberd',` + gen_require(` +- attribute jabberd_domain; ++ type jabberd_t, jabberd_exec_t; + ') + +- type $1_t, jabberd_domain; +- type $1_exec_t; +- init_daemon_domain($1_t, $1_exec_t) ++ domtrans_pattern($1, jabberd_exec_t, jabberd_t) + ') + +-######################################## ++###################################### + ## +-## Create, read, write, and delete +-## jabber lib files. ++## Execute a domain transition to run jabberd router service ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`jabber_domtrans_jabberd_router',` ++ gen_require(` ++ type jabberd_router_t, jabberd_router_exec_t; ++ ') ++ ++ domtrans_pattern($1, jabberd_router_exec_t, jabberd_router_t) ++') ++ ++####################################### ++## ++## Read jabberd lib files. + ## + ## + ## +@@ -31,18 +78,37 @@ template(`jabber_domain_template',` + ## + ## + # +-interface(`jabber_manage_lib_files',` ++interface(`jabberd_read_lib_files',` + gen_require(` + type jabberd_var_lib_t; + ') + + files_search_var_lib($1) +- manage_files_pattern($1, jabberd_var_lib_t, jabberd_var_lib_t) ++ read_files_pattern($1, jabberd_var_lib_t, jabberd_var_lib_t) + ') + +-######################################## ++####################################### ++## ++## Dontaudit inherited read jabberd lib files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`jabberd_dontaudit_read_lib_files',` ++ gen_require(` ++ type jabberd_var_lib_t; ++ ') ++ ++ dontaudit $1 jabberd_var_lib_t:file read_inherited_file_perms; ++') ++ ++####################################### + ## +-## Connect to jabber over a TCP socket (Deprecated) ++## Create, read, write, and delete ++## jabberd lib files. + ## + ## + ## +@@ -50,14 +116,19 @@ interface(`jabber_manage_lib_files',` + ## + ## + # +-interface(`jabber_tcp_connect',` +- refpolicywarn(`$0($*) has been deprecated.') ++interface(`jabberd_manage_lib_files',` ++ gen_require(` ++ type jabberd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, jabberd_var_lib_t, jabberd_var_lib_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an jabber environment. ++## All of the rules required to administrate ++## an jabber environment + ## + ## + ## +@@ -66,20 +137,28 @@ interface(`jabber_tcp_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the jabber domain. + ## + ## + ## + # + interface(`jabber_admin',` + gen_require(` +- attribute jabberd_domain; +- type jabberd_lock_t, jabberd_log_t, jabberd_spool_t; +- type jabberd_var_lib_t, jabberd_var_run_t, jabberd_initrc_exec_t; ++ type jabberd_t, jabberd_var_lib_t; ++ type jabberd_initrc_exec_t, jabberd_router_t; ++ type jabberd_lock_t; ++ type jabberd_var_spool_t; + ') + +- allow $1 jabberd_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, jabberd_domain) ++ allow $1 jabberd_t:process signal_perms; ++ ps_process_pattern($1, jabberd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 jabberd_t:process ptrace; ++ allow $1 jabberd_router_t:process ptrace; ++ ') ++ ++ allow $1 jabberd_router_t:process signal_perms; ++ ps_process_pattern($1, jabberd_router_t) + + init_labeled_script_domtrans($1, jabberd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -89,15 +168,9 @@ interface(`jabber_admin',` + files_search_locks($1) + admin_pattern($1, jabberd_lock_t) + +- logging_search_logs($1) +- admin_pattern($1, jabberd_log_t) +- + files_search_spool($1) +- admin_pattern($1, jabberd_spool_t) ++ admin_pattern($1, jabberd_var_spool_t) + + files_search_var_lib($1) + admin_pattern($1, jabberd_var_lib_t) +- +- files_search_pids($1) +- admin_pattern($1, jabberd_var_run_t) + ') +diff --git a/jabber.te b/jabber.te +index af67c36ee9..4755e0af81 100644 +--- a/jabber.te ++++ b/jabber.te +@@ -9,129 +9,137 @@ attribute jabberd_domain; + + jabber_domain_template(jabberd) + jabber_domain_template(jabberd_router) ++jabber_domain_template(pyicqt) + + type jabberd_initrc_exec_t; + init_script_file(jabberd_initrc_exec_t) + +-type jabberd_lock_t; +-files_lock_file(jabberd_lock_t) +- +-type jabberd_log_t; +-logging_log_file(jabberd_log_t) +- +-type jabberd_spool_t; +-files_type(jabberd_spool_t) +- ++# type which includes log/pid files pro jabberd components + type jabberd_var_lib_t; + files_type(jabberd_var_lib_t) + +-type jabberd_var_run_t; +-files_pid_file(jabberd_var_run_t) ++# pyicq-t types ++type pyicqt_log_t; ++logging_log_file(pyicqt_log_t); + +-######################################## +-# +-# Common local policy +-# ++type pyicqt_var_spool_t; ++files_spool_file(pyicqt_var_spool_t) + +-allow jabberd_domain self:process signal_perms; +-allow jabberd_domain self:fifo_file rw_fifo_file_perms; +-allow jabberd_domain self:tcp_socket { accept listen }; ++type pyicqt_var_run_t; ++files_pid_file(pyicqt_var_run_t) + +-manage_files_pattern(jabberd_domain, jabberd_var_lib_t, jabberd_var_lib_t) ++###################################### ++# ++# Local policy for jabberd-router and c2s components ++# + +-kernel_read_system_state(jabberd_domain) ++allow jabberd_router_t self:netlink_route_socket r_netlink_socket_perms; + +-corenet_all_recvfrom_unlabeled(jabberd_domain) +-corenet_all_recvfrom_netlabel(jabberd_domain) +-corenet_tcp_sendrecv_generic_if(jabberd_domain) +-corenet_tcp_sendrecv_generic_node(jabberd_domain) +-corenet_tcp_bind_generic_node(jabberd_domain) ++manage_files_pattern(jabberd_router_t, jabberd_var_lib_t, jabberd_var_lib_t) ++manage_dirs_pattern(jabberd_router_t, jabberd_var_lib_t, jabberd_var_lib_t) + +-dev_read_urand(jabberd_domain) +-dev_read_sysfs(jabberd_domain) ++kernel_read_network_state(jabberd_router_t) + +-fs_getattr_all_fs(jabberd_domain) ++corenet_tcp_bind_jabber_client_port(jabberd_router_t) ++corenet_tcp_bind_jabber_router_port(jabberd_router_t) ++corenet_tcp_connect_jabber_router_port(jabberd_router_t) ++corenet_sendrecv_jabber_router_server_packets(jabberd_router_t) ++corenet_sendrecv_jabber_client_server_packets(jabberd_router_t) ++corenet_tcp_connect_postgresql_port(jabberd_router_t) + +-logging_send_syslog_msg(jabberd_domain) ++fs_getattr_all_fs(jabberd_router_t) + +-miscfiles_read_localization(jabberd_domain) ++miscfiles_read_generic_certs(jabberd_router_t) + + optional_policy(` +- nis_use_ypbind(jabberd_domain) ++ kerberos_use(jabberd_router_t) + ') + + optional_policy(` +- seutil_sigchld_newrole(jabberd_domain) ++ nis_use_ypbind(jabberd_router_t) + ') + +-######################################## ++##################################### + # +-# Local policy ++# Local policy for other jabberd components + # + +-allow jabberd_t self:capability dac_override; +-dontaudit jabberd_t self:capability sys_tty_config; +-allow jabberd_t self:tcp_socket create_socket_perms; +-allow jabberd_t self:udp_socket create_socket_perms; ++allow jabberd_t self:netlink_route_socket { create_socket_perms nlmsg_read }; ++ ++manage_files_pattern(jabberd_t, jabberd_var_lib_t, jabberd_var_lib_t) ++manage_dirs_pattern(jabberd_t, jabberd_var_lib_t, jabberd_var_lib_t) ++ ++corenet_tcp_bind_jabber_interserver_port(jabberd_t) ++corenet_tcp_connect_jabber_interserver_port(jabberd_t) ++corenet_tcp_connect_jabber_router_port(jabberd_t) ++corenet_tcp_connect_postgresql_port(jabberd_t) + +-manage_files_pattern(jabberd_t, jabberd_lock_t, jabberd_lock_t) ++userdom_dontaudit_use_unpriv_user_fds(jabberd_t) ++userdom_dontaudit_search_user_home_dirs(jabberd_t) + +-allow jabberd_t jabberd_log_t:dir setattr_dir_perms; +-append_files_pattern(jabberd_t, jabberd_log_t, jabberd_log_t) +-create_files_pattern(jabberd_t, jabberd_log_t, jabberd_log_t) +-setattr_files_pattern(jabberd_t, jabberd_log_t, jabberd_log_t) +-logging_log_filetrans(jabberd_t, jabberd_log_t, { file dir }) ++miscfiles_read_certs(jabberd_t) + +-manage_files_pattern(jabberd_domain, jabberd_spool_t, jabberd_spool_t) ++optional_policy(` ++ seutil_sigchld_newrole(jabberd_t) ++') + +-manage_files_pattern(jabberd_t, jabberd_var_run_t, jabberd_var_run_t) +-files_pid_filetrans(jabberd_t, jabberd_var_run_t, file) ++optional_policy(` ++ udev_read_db(jabberd_t) ++') + +-kernel_read_kernel_sysctls(jabberd_t) ++###################################### ++# ++# Local policy for pyicq-t ++# + +-corenet_sendrecv_jabber_client_server_packets(jabberd_t) +-corenet_tcp_bind_jabber_client_port(jabberd_t) +-corenet_tcp_sendrecv_jabber_client_port(jabberd_t) ++# need for /var/log/pyicq-t.log ++manage_files_pattern(pyicqt_t, pyicqt_log_t, pyicqt_log_t) ++logging_log_filetrans(pyicqt_t, pyicqt_log_t, file) + +-corenet_sendrecv_jabber_interserver_server_packets(jabberd_t) +-corenet_tcp_bind_jabber_interserver_port(jabberd_t) +-corenet_tcp_sendrecv_jabber_interserver_port(jabberd_t) ++manage_files_pattern(pyicqt_t, pyicqt_var_run_t, pyicqt_var_run_t); + +-dev_read_rand(jabberd_t) ++files_search_spool(pyicqt_t) ++manage_files_pattern(pyicqt_t, pyicqt_var_spool_t, pyicqt_var_spool_t); + +-domain_use_interactive_fds(jabberd_t) ++corenet_tcp_bind_jabber_router_port(pyicqt_t) ++corenet_tcp_connect_jabber_router_port(pyicqt_t) + +-files_read_etc_files(jabberd_t) +-files_read_etc_runtime_files(jabberd_t) ++corecmd_exec_bin(pyicqt_t) + +-fs_search_auto_mountpoints(jabberd_t) ++dev_read_urand(pyicqt_t) + +-sysnet_read_config(jabberd_t) ++auth_use_nsswitch(pyicqt_t) + +-userdom_dontaudit_use_unpriv_user_fds(jabberd_t) +-userdom_dontaudit_search_user_home_dirs(jabberd_t) ++# needed for pyicq-t-mysql ++optional_policy(` ++ corenet_tcp_connect_mysqld_port(pyicqt_t) ++') + + optional_policy(` +- udev_read_db(jabberd_t) ++ sysnet_use_ldap(pyicqt_t) + ') + +-######################################## ++####################################### + # +-# Router local policy ++# Local policy for jabberd domains + # + +-manage_dirs_pattern(jabberd_router_t, jabberd_var_lib_t, jabberd_var_lib_t) ++allow jabberd_domain self:process signal_perms; ++allow jabberd_domain self:fifo_file rw_fifo_file_perms; ++allow jabberd_domain self:tcp_socket create_stream_socket_perms; ++allow jabberd_domain self:udp_socket create_socket_perms; + +-kernel_read_network_state(jabberd_router_t) ++corenet_tcp_sendrecv_generic_if(jabberd_domain) ++corenet_udp_sendrecv_generic_if(jabberd_domain) ++corenet_tcp_sendrecv_generic_node(jabberd_domain) ++corenet_udp_sendrecv_generic_node(jabberd_domain) ++corenet_tcp_sendrecv_all_ports(jabberd_domain) ++corenet_udp_sendrecv_all_ports(jabberd_domain) ++corenet_tcp_bind_generic_node(jabberd_domain) + +-corenet_sendrecv_jabber_client_server_packets(jabberd_router_t) +-corenet_tcp_bind_jabber_client_port(jabberd_router_t) +-corenet_tcp_sendrecv_jabber_client_port(jabberd_router_t) ++dev_read_sysfs(jabberd_domain) ++dev_read_urand(jabberd_domain) + +-# corenet_sendrecv_jabber_router_server_packets(jabberd_router_t) +-# corenet_tcp_bind_jabber_router_port(jabberd_router_t) +-# corenet_sendrecv_jabber_router_client_packets(jabberd_router_t) +-# corenet_tcp_connect_jabber_router_port(jabberd_router_t) +-# corenet_tcp_sendrecv_jabber_router_port(jabberd_router_t) ++files_read_etc_runtime_files(jabberd_domain) + +-auth_use_nsswitch(jabberd_router_t) ++sysnet_read_config(jabberd_domain) +diff --git a/java.te b/java.te +index a7ae1531b3..6341e31199 100644 +--- a/java.te ++++ b/java.te +@@ -11,7 +11,7 @@ policy_module(java, 2.7.0) + ## its stack executable. + ##

      + ## +-gen_tunable(allow_java_execstack, false) ++gen_tunable(java_execstack, false) + + attribute java_domain; + +@@ -90,7 +90,6 @@ dev_read_urand(java_domain) + dev_read_rand(java_domain) + dev_dontaudit_append_rand(java_domain) + +-files_read_usr_files(java_domain) + files_read_etc_runtime_files(java_domain) + + fs_getattr_all_fs(java_domain) +@@ -108,11 +107,11 @@ userdom_manage_user_home_content_files(java_domain) + userdom_manage_user_home_content_symlinks(java_domain) + userdom_manage_user_home_content_pipes(java_domain) + userdom_manage_user_home_content_sockets(java_domain) +-userdom_user_home_dir_filetrans_user_home_content(java_domain, { file lnk_file sock_file fifo_file }) ++userdom_filetrans_home_content(java_domain_t) + + userdom_write_user_tmp_sockets(java_domain) + +-tunable_policy(`allow_java_execstack',` ++tunable_policy(`java_execstack',` + allow java_domain self:process { execmem execstack }; + + libs_legacy_use_shared_libs(java_domain) +diff --git a/jetty.fc b/jetty.fc +new file mode 100644 +index 0000000000..1725b7e692 +--- /dev/null ++++ b/jetty.fc +@@ -0,0 +1,9 @@ ++ ++/var/cache/jetty(/.*)? gen_context(system_u:object_r:jetty_cache_t,s0) ++ ++/var/lib/jetty(/.*)? gen_context(system_u:object_r:jetty_var_lib_t,s0) ++ ++/var/log/jetty(/.*)? gen_context(system_u:object_r:jetty_log_t,s0) ++ ++/var/run/jetty(/.*)? gen_context(system_u:object_r:jetty_var_run_t,s0) ++ +diff --git a/jetty.if b/jetty.if +new file mode 100644 +index 0000000000..2abc285a75 +--- /dev/null ++++ b/jetty.if +@@ -0,0 +1,268 @@ ++ ++## policy for jetty ++ ++######################################## ++## ++## Search jetty cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_search_cache',` ++ gen_require(` ++ type jetty_cache_t; ++ ') ++ ++ allow $1 jetty_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read jetty cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_read_cache_files',` ++ gen_require(` ++ type jetty_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, jetty_cache_t, jetty_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## jetty cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_manage_cache_files',` ++ gen_require(` ++ type jetty_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, jetty_cache_t, jetty_cache_t) ++') ++ ++######################################## ++## ++## Manage jetty cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_manage_cache_dirs',` ++ gen_require(` ++ type jetty_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, jetty_cache_t, jetty_cache_t) ++') ++ ++######################################## ++## ++## Read jetty's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`jetty_read_log',` ++ gen_require(` ++ type jetty_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, jetty_log_t, jetty_log_t) ++') ++ ++######################################## ++## ++## Append to jetty log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_append_log',` ++ gen_require(` ++ type jetty_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, jetty_log_t, jetty_log_t) ++') ++ ++######################################## ++## ++## Manage jetty log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_manage_log',` ++ gen_require(` ++ type jetty_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, jetty_log_t, jetty_log_t) ++ manage_files_pattern($1, jetty_log_t, jetty_log_t) ++ manage_lnk_files_pattern($1, jetty_log_t, jetty_log_t) ++') ++ ++######################################## ++## ++## Search jetty lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_search_lib',` ++ gen_require(` ++ type jetty_var_lib_t; ++ ') ++ ++ allow $1 jetty_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read jetty lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_read_lib_files',` ++ gen_require(` ++ type jetty_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, jetty_var_lib_t, jetty_var_lib_t) ++') ++ ++######################################## ++## ++## Manage jetty lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_manage_lib_files',` ++ gen_require(` ++ type jetty_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, jetty_var_lib_t, jetty_var_lib_t) ++') ++ ++######################################## ++## ++## Manage jetty lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_manage_lib_dirs',` ++ gen_require(` ++ type jetty_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, jetty_var_lib_t, jetty_var_lib_t) ++') ++ ++######################################## ++## ++## Read jetty PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jetty_read_pid_files',` ++ gen_require(` ++ type jetty_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 jetty_var_run_t:file read_file_perms; ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an jetty environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`jetty_admin',` ++ gen_require(` ++ type jetty_cache_t; ++ type jetty_log_t; ++ type jetty_var_lib_t; ++ type jetty_var_run_t; ++ ') ++ ++ files_search_var($1) ++ admin_pattern($1, jetty_cache_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, jetty_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, jetty_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, jetty_var_run_t) ++') +diff --git a/jetty.te b/jetty.te +new file mode 100644 +index 0000000000..af510eac64 +--- /dev/null ++++ b/jetty.te +@@ -0,0 +1,25 @@ ++policy_module(jetty, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type jetty_cache_t; ++files_type(jetty_cache_t) ++ ++type jetty_log_t; ++logging_log_file(jetty_log_t) ++ ++type jetty_var_lib_t; ++files_type(jetty_var_lib_t) ++ ++type jetty_var_run_t; ++files_pid_file(jetty_var_run_t) ++ ++######################################## ++# ++# jetty local policy ++# ++ ++# No local policy. This module just contains type definitions +diff --git a/jockey.if b/jockey.if +index 2fb7a20fad..c6ba007988 100644 +--- a/jockey.if ++++ b/jockey.if +@@ -1 +1,131 @@ +-## Jockey driver manager. ++ ++## policy for jockey ++ ++######################################## ++## ++## Transition to jockey. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`jockey_domtrans',` ++ gen_require(` ++ type jockey_t, jockey_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, jockey_exec_t, jockey_t) ++') ++ ++######################################## ++## ++## Search jockey cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jockey_search_cache',` ++ gen_require(` ++ type jockey_cache_t; ++ ') ++ ++ allow $1 jockey_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read jockey cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jockey_read_cache_files',` ++ gen_require(` ++ type jockey_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, jockey_cache_t, jockey_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## jockey cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jockey_manage_cache_files',` ++ gen_require(` ++ type jockey_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, jockey_cache_t, jockey_cache_t) ++') ++ ++######################################## ++## ++## Manage jockey cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jockey_manage_cache_dirs',` ++ gen_require(` ++ type jockey_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, jockey_cache_t, jockey_cache_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an jockey environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`jockey_admin',` ++ gen_require(` ++ type jockey_t; ++ type jockey_cache_t; ++ type jockey_var_log_t; ++ ') ++ ++ allow $1 jockey_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, jockey_t) ++ ++ files_search_var($1) ++ admin_pattern($1, jockey_cache_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, jockey_var_log_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/jockey.te b/jockey.te +index d59ec10a21..a46018d042 100644 +--- a/jockey.te ++++ b/jockey.te +@@ -15,6 +15,9 @@ files_type(jockey_cache_t) + type jockey_var_log_t; + logging_log_file(jockey_var_log_t) + ++type jockey_tmpfs_t; ++files_tmpfs_file(jockey_tmpfs_t) ++ + ######################################## + # + # Local policy +@@ -33,6 +36,10 @@ create_files_pattern(jockey_t, jockey_var_log_t, jockey_var_log_t) + setattr_files_pattern(jockey_t, jockey_var_log_t, jockey_var_log_t) + logging_log_filetrans(jockey_t, jockey_var_log_t, { file dir }) + ++manage_dirs_pattern(jockey_t, jockey_tmpfs_t, jockey_tmpfs_t) ++manage_files_pattern(jockey_t, jockey_tmpfs_t, jockey_tmpfs_t) ++fs_tmpfs_filetrans(jockey_t, jockey_tmpfs_t, { dir file }) ++ + kernel_read_system_state(jockey_t) + + corecmd_exec_bin(jockey_t) +@@ -44,16 +51,19 @@ dev_read_urand(jockey_t) + + domain_use_interactive_fds(jockey_t) + +-files_read_etc_files(jockey_t) +-files_read_usr_files(jockey_t) + +-miscfiles_read_localization(jockey_t) ++auth_read_passwd(jockey_t) + + optional_policy(` + dbus_system_domain(jockey_t, jockey_exec_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(jockey_t) ++') ++ + optional_policy(` + modutils_domtrans_insmod(jockey_t) + modutils_read_module_config(jockey_t) ++ modutils_list_module_config(jockey_t) + ') +diff --git a/journalctl.fc b/journalctl.fc +new file mode 100644 +index 0000000000..f270652865 +--- /dev/null ++++ b/journalctl.fc +@@ -0,0 +1 @@ ++/usr/bin/journalctl -- gen_context(system_u:object_r:journalctl_exec_t,s0) +diff --git a/journalctl.if b/journalctl.if +new file mode 100644 +index 0000000000..17126b64c0 +--- /dev/null ++++ b/journalctl.if +@@ -0,0 +1,95 @@ ++ ++## policy for journalctl ++ ++######################################## ++## ++## Execute TEMPLATE in the journalctl domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`journalctl_domtrans',` ++ gen_require(` ++ type journalctl_t, journalctl_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, journalctl_exec_t, journalctl_t) ++') ++ ++###################################### ++## ++## Execute journalctl in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`journalctl_exec',` ++ gen_require(` ++ type journalctl_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, journalctl_exec_t) ++') ++ ++######################################## ++## ++## Execute journalctl in the journalctl domain, and ++## allow the specified role the journalctl domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the journalctl domain. ++## ++## ++# ++interface(`journalctl_run',` ++ gen_require(` ++ type journalctl_t; ++ attribute_role journalctl_roles; ++ ') ++ ++ journalctl_domtrans($1) ++ roleattribute $2 journalctl_roles; ++') ++ ++######################################## ++## ++## Role access for journalctl ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`journalctl_role',` ++ gen_require(` ++ type journalctl_t; ++ attribute_role journalctl_roles; ++ ') ++ ++ roleattribute $1 journalctl_roles; ++ ++ journalctl_domtrans($2) ++ ++ ps_process_pattern($2, journalctl_t) ++ allow $2 journalctl_t:process { signull signal sigkill }; ++') +diff --git a/journalctl.te b/journalctl.te +new file mode 100644 +index 0000000000..68dd2b7d6f +--- /dev/null ++++ b/journalctl.te +@@ -0,0 +1,47 @@ ++policy_module(journalctl, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute_role journalctl_roles; ++roleattribute system_r journalctl_roles; ++ ++type journalctl_t; ++type journalctl_exec_t; ++application_domain(journalctl_t, journalctl_exec_t) ++ ++role journalctl_roles types journalctl_t; ++ ++######################################## ++# ++# journalctl local policy ++# ++allow journalctl_t self:process { fork signal_perms }; ++ ++allow journalctl_t self:fifo_file manage_fifo_file_perms; ++allow journalctl_t self:unix_stream_socket create_stream_socket_perms; ++ ++kernel_read_system_state(journalctl_t) ++ ++corecmd_exec_bin(journalctl_t) ++ ++domain_use_interactive_fds(journalctl_t) ++ ++files_read_etc_files(journalctl_t) ++ ++fs_getattr_all_fs(journalctl_t) ++ ++auth_use_nsswitch(journalctl_t) ++ ++miscfiles_read_localization(journalctl_t) ++ ++logging_read_generic_logs(journalctl_t) ++logging_read_syslog_pid(journalctl_t) ++ ++userdom_list_user_home_dirs(journalctl_t) ++userdom_read_user_home_content_files(journalctl_t) ++userdom_use_inherited_user_ptys(journalctl_t) ++userdom_rw_inherited_user_tmp_files(journalctl_t) ++userdom_rw_inherited_user_home_content_files(journalctl_t) +diff --git a/kde.fc b/kde.fc +new file mode 100644 +index 0000000000..25e4b6817e +--- /dev/null ++++ b/kde.fc +@@ -0,0 +1 @@ ++#/usr/libexec/kde(3|4)/backlighthelper -- gen_context(system_u:object_r:kdebacklighthelper_exec_t,s0) +diff --git a/kde.if b/kde.if +new file mode 100644 +index 0000000000..cf6557769d +--- /dev/null ++++ b/kde.if +@@ -0,0 +1,22 @@ ++## Policy for KDE components ++ ++####################################### ++## ++## Send and receive messages from ++## firewallgui over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kde_dbus_chat_backlighthelper',` ++ gen_require(` ++ type kdebacklighthelper_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 kdebacklighthelper_t:dbus send_msg; ++ allow kdebacklighthelper_t $1:dbus send_msg; ++') +diff --git a/kde.te b/kde.te +new file mode 100644 +index 0000000000..dbe3f038d5 +--- /dev/null ++++ b/kde.te +@@ -0,0 +1,41 @@ ++policy_module(kde,1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type kdebacklighthelper_t; ++type kdebacklighthelper_exec_t; ++init_daemon_domain(kdebacklighthelper_t, kdebacklighthelper_exec_t) ++ ++######################################## ++# ++# backlighthelper local policy ++# ++ ++allow kdebacklighthelper_t self:fifo_file rw_fifo_file_perms; ++ ++kernel_read_system_state(kdebacklighthelper_t) ++ ++# r/w brightness values ++dev_rw_sysfs(kdebacklighthelper_t) ++ ++files_read_etc_runtime_files(kdebacklighthelper_t) ++ ++fs_getattr_all_fs(kdebacklighthelper_t) ++ ++logging_send_syslog_msg(kdebacklighthelper_t) ++ ++optional_policy(` ++ dbus_system_domain(kdebacklighthelper_t, kdebacklighthelper_exec_t) ++') ++ ++optional_policy(` ++ consolekit_dbus_chat(kdebacklighthelper_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(kdebacklighthelper_t) ++') ++ +diff --git a/kdump.fc b/kdump.fc +index a49ae4e918..0c0e987a8b 100644 +--- a/kdump.fc ++++ b/kdump.fc +@@ -1,13 +1,16 @@ + /etc/kdump\.conf -- gen_context(system_u:object_r:kdump_etc_t,s0) ++/etc/rc\.d/init\.d/kdump -- gen_context(system_u:object_r:kdump_initrc_exec_t,s0) + +-/etc/rc\.d/init\.d/kdump -- gen_context(system_u:object_r:kdump_initrc_exec_t,s0) ++/sbin/kdump -- gen_context(system_u:object_r:kdump_exec_t,s0) ++/sbin/kexec -- gen_context(system_u:object_r:kdump_exec_t,s0) + +-/bin/kdumpctl -- gen_context(system_u:object_r:kdumpctl_exec_t,s0) + +-/usr/bin/kdumpctl -- gen_context(system_u:object_r:kdumpctl_exec_t,s0) ++/usr/lib/systemd/system/kdump\.service -- gen_context(system_u:object_r:kdump_unit_file_t,s0) + +-/sbin/kdump -- gen_context(system_u:object_r:kdump_exec_t,s0) +-/sbin/kexec -- gen_context(system_u:object_r:kdump_exec_t,s0) ++/usr/bin/kdumpctl -- gen_context(system_u:object_r:kdumpctl_exec_t,s0) ++/usr/sbin/kdump -- gen_context(system_u:object_r:kdump_exec_t,s0) ++/usr/sbin/kexec -- gen_context(system_u:object_r:kdump_exec_t,s0) + +-/usr/sbin/kdump -- gen_context(system_u:object_r:kdump_exec_t,s0) +-/usr/sbin/kexec -- gen_context(system_u:object_r:kdump_exec_t,s0) ++/var/crash(/.*)? gen_context(system_u:object_r:kdump_crash_t,s0) ++ ++/var/lock/kdump(/.*)? gen_context(system_u:object_r:kdump_lock_t,s0) +diff --git a/kdump.if b/kdump.if +index 3a00b3a138..15c709f08b 100644 +--- a/kdump.if ++++ b/kdump.if +@@ -1,4 +1,4 @@ +-## Kernel crash dumping mechanism. ++## Kernel crash dumping mechanism + + ###################################### + ## +@@ -19,6 +19,26 @@ interface(`kdump_domtrans',` + domtrans_pattern($1, kdump_exec_t, kdump_t) + ') + ++###################################### ++## ++## Execute kdumpctl in the kdumpctl domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`kdumpctl_domtrans',` ++ gen_require(` ++ type kdumpctl_t, kdumpctl_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, kdumpctl_exec_t, kdumpctl_t) ++') ++ ++ + ####################################### + ## + ## Execute kdump in the kdump domain. +@@ -37,9 +57,34 @@ interface(`kdump_initrc_domtrans',` + init_labeled_script_domtrans($1, kdump_initrc_exec_t) + ') + ++######################################## ++## ++## Execute kdump server in the kdump domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`kdump_systemctl',` ++ gen_require(` ++ type kdump_unit_file_t; ++ type kdump_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_search_unit_dirs($1) ++ allow $1 kdump_unit_file_t:file read_file_perms; ++ allow $1 kdump_unit_file_t:service all_service_perms; ++ ++ ps_process_pattern($1, kdump_t) ++') ++ + ##################################### + ## +-## Read kdump configuration files. ++## Read kdump configuration file. + ## + ## + ## +@@ -56,10 +101,67 @@ interface(`kdump_read_config',` + allow $1 kdump_etc_t:file read_file_perms; + ') + ++##################################### ++## ++## Read kdump crash files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_read_crash',` ++ gen_require(` ++ type kdump_crash_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, kdump_crash_t, kdump_crash_t) ++ list_dirs_pattern($1, kdump_crash_t, kdump_crash_t) ++') ++ ++##################################### ++## ++## Read kdump crash files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_manage_crash',` ++ gen_require(` ++ type kdump_crash_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, kdump_crash_t, kdump_crash_t) ++ manage_dirs_pattern($1, kdump_crash_t, kdump_crash_t) ++') ++ ++##################################### ++## ++## Dontaudit read kdump configuration file. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`kdump_dontaudit_read_config',` ++ gen_require(` ++ type kdump_etc_t; ++ ') ++ ++ dontaudit $1 kdump_etc_t:file read_inherited_file_perms; ++') ++ + #################################### + ## +-## Create, read, write, and delete +-## kdmup configuration files. ++## Manage kdump configuration file. + ## + ## + ## +@@ -76,10 +178,89 @@ interface(`kdump_manage_config',` + allow $1 kdump_etc_t:file manage_file_perms; + ') + ++##################################### ++## ++## Read and write kdump lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_rw_lock',` ++ gen_require(` ++ type kdump_lock_t; ++ ') ++ ++ files_search_locks($1) ++ rw_files_pattern($1, kdump_lock_t, kdump_lock_t) ++') ++ ++################################### ++## ++## Read/write inherited kdump /var/tmp named pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_rw_inherited_kdumpctl_tmp_pipes',` ++ gen_require(` ++ type kdumpctl_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ allow $1 kdumpctl_tmp_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++################################### ++## ++## Manage kdump /var/tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_manage_kdumpctl_tmp_files',` ++ gen_require(` ++ type kdumpctl_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ manage_files_pattern($1, kdumpctl_tmp_t, kdumpctl_tmp_t) ++ manage_dirs_pattern($1, kdumpctl_tmp_t, kdumpctl_tmp_t) ++ manage_fifo_files_pattern($1, kdumpctl_tmp_t, kdumpctl_tmp_t) ++ manage_lnk_files_pattern($1, kdumpctl_tmp_t, kdumpctl_tmp_t) ++ allow $1 kdumpctl_tmp_t:file map; ++') ++ ++####################################### ++## ++## Transition content labels to kdump named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdump_filetrans_named_content',` ++ gen_require(` ++ type kdump_lock_t; ++ ') ++ ++ files_lock_filetrans($1, kdump_lock_t, file, "kdump") ++') ++ + ###################################### + ## +-## All of the rules required to +-## administrate an kdump environment. ++## All of the rules required to administrate ++## an kdump environment + ## + ## + ## +@@ -88,19 +269,24 @@ interface(`kdump_manage_config',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the kdump domain. + ## + ## + ## + # + interface(`kdump_admin',` + gen_require(` +- type kdump_t, kdump_etc_t, kdumpctl_tmp_t; +- type kdump_initrc_exec_t, kdumpctl_t; ++ type kdump_t, kdump_etc_t; ++ type kdump_initrc_exec_t; ++ type kdump_unit_file_t; ++ type kdump_crash_t; + ') + +- allow $1 { kdump_t kdumpctl_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { kdump_t kdumpctl_t }) ++ allow $1 kdump_t:process signal_perms; ++ ps_process_pattern($1, kdump_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 kdump_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, kdump_initrc_exec_t) + domain_system_change_exemption($1) +@@ -110,6 +296,29 @@ interface(`kdump_admin',` + files_search_etc($1) + admin_pattern($1, kdump_etc_t) + +- files_search_tmp($1) +- admin_pattern($1, kdumpctl_tmp_t) ++ files_search_var($1) ++ admin_pattern($1, kdump_crash_t) ++ ++ kdump_systemctl($1) ++ admin_pattern($1, kdump_unit_file_t) ++ allow $1 kdump_unit_file_t:service all_service_perms; + ') ++ ++################################### ++## ++## Dontaudit Read/write inherited kdump /var/tmp named pipes. ++## ++## ++## ++## Domain to not audit ++## ++## ++# ++interface(`kdump_dontaudit_inherited_kdumpctl_tmp_pipes',` ++ gen_require(` ++ type kdumpctl_tmp_t; ++ ') ++ ++ dontaudit $1 kdumpctl_tmp_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ +diff --git a/kdump.te b/kdump.te +index 715fc211cc..41e1154aea 100644 +--- a/kdump.te ++++ b/kdump.te +@@ -12,34 +12,59 @@ init_system_domain(kdump_t, kdump_exec_t) + type kdump_etc_t; + files_config_file(kdump_etc_t) + ++type kdump_crash_t; ++files_type(kdump_crash_t) ++ + type kdump_initrc_exec_t; + init_script_file(kdump_initrc_exec_t) + ++type kdump_unit_file_t alias kdumpctl_unit_file_t; ++systemd_unit_file(kdump_unit_file_t) ++ ++type kdump_lock_t; ++files_lock_file(kdump_lock_t) ++ + type kdumpctl_t; + type kdumpctl_exec_t; + init_daemon_domain(kdumpctl_t, kdumpctl_exec_t) +-application_executable_file(kdumpctl_exec_t) ++init_initrc_domain(kdumpctl_t) + + type kdumpctl_tmp_t; + files_tmp_file(kdumpctl_tmp_t) + + ##################################### + # +-# Local policy ++# kdump local policy + # + +-allow kdump_t self:capability { sys_boot dac_override }; ++allow kdump_t self:capability { sys_admin sys_boot dac_read_search dac_override }; ++allow kdump_t self:capability2 compromise_kernel; + +-allow kdump_t kdump_etc_t:file read_file_perms; ++manage_dirs_pattern(kdump_t, kdump_crash_t, kdump_crash_t) ++manage_files_pattern(kdump_t, kdump_crash_t, kdump_crash_t) ++manage_lnk_files_pattern(kdump_t, kdump_crash_t, kdump_crash_t) ++files_var_filetrans(kdump_t, kdump_crash_t, dir, "crash") ++ ++read_files_pattern(kdump_t, kdump_etc_t, kdump_etc_t) ++ ++manage_dirs_pattern(kdump_t, kdump_lock_t, kdump_lock_t) ++manage_files_pattern(kdump_t, kdump_lock_t, kdump_lock_t) ++manage_lnk_files_pattern(kdump_t, kdump_lock_t, kdump_lock_t) ++files_lock_filetrans(kdump_t, kdump_lock_t, { dir file lnk_file }) + +-files_read_etc_files(kdump_t) + files_read_etc_runtime_files(kdump_t) ++files_read_kernel_symbol_table(kdump_t) ++files_read_kernel_modules(kdump_t) + files_read_kernel_img(kdump_t) ++files_map_boot_files(kdump_t) + ++kernel_read_system_state(kdump_t) + kernel_read_core_if(kdump_t) + kernel_read_debugfs(kdump_t) +-kernel_read_system_state(kdump_t) + kernel_request_load_module(kdump_t) ++kernel_read_ring_buffer(kdump_t) ++ ++mls_file_read_all_levels(kdump_t) + + dev_read_framebuffer(kdump_t) + dev_read_sysfs(kdump_t) +@@ -48,69 +73,105 @@ term_use_console(kdump_t) + + ####################################### + # +-# Ctl local policy ++# kdumpctl local policy + # + +-allow kdumpctl_t self:capability { dac_override sys_chroot }; ++#cjp:almost all rules are needed by dracut ++ ++kdump_domtrans(kdumpctl_t) ++ ++allow kdumpctl_t self:capability { dac_read_search dac_override sys_chroot }; + allow kdumpctl_t self:process setfscreate; ++ + allow kdumpctl_t self:fifo_file rw_fifo_file_perms; +-allow kdumpctl_t self:unix_stream_socket { accept listen }; ++allow kdumpctl_t self:unix_stream_socket create_stream_socket_perms; + +-allow kdumpctl_t kdump_etc_t:file read_file_perms; ++manage_files_pattern(kdumpctl_t, kdump_lock_t, kdump_lock_t) ++files_lock_filetrans(kdumpctl_t, kdump_lock_t, file, "kdump") + + manage_dirs_pattern(kdumpctl_t, kdumpctl_tmp_t, kdumpctl_tmp_t) ++manage_chr_files_pattern(kdumpctl_t, kdumpctl_tmp_t, kdumpctl_tmp_t) + manage_files_pattern(kdumpctl_t, kdumpctl_tmp_t, kdumpctl_tmp_t) + manage_lnk_files_pattern(kdumpctl_t, kdumpctl_tmp_t, kdumpctl_tmp_t) ++manage_fifo_files_pattern(kdumpctl_t, kdumpctl_tmp_t, kdumpctl_tmp_t) + files_tmp_filetrans(kdumpctl_t, kdumpctl_tmp_t, { file dir lnk_file }) ++can_exec(kdumpctl_t, kdumpctl_tmp_t) + +-domtrans_pattern(kdumpctl_t, kdump_exec_t, kdump_t) ++manage_dirs_pattern(kdumpctl_t, kdump_crash_t, kdump_crash_t) ++manage_files_pattern(kdumpctl_t, kdump_crash_t, kdump_crash_t) ++manage_lnk_files_pattern(kdumpctl_t, kdump_crash_t, kdump_crash_t) ++files_var_filetrans(kdumpctl_t, kdump_crash_t, dir, "crash") ++ ++read_files_pattern(kdumpctl_t, kdump_etc_t, kdump_etc_t) + + kernel_read_system_state(kdumpctl_t) ++kernel_stream_connect(kdumpctl_t) ++ ++mls_file_read_all_levels(kdumpctl_t) + + corecmd_exec_bin(kdumpctl_t) + corecmd_exec_shell(kdumpctl_t) + + dev_read_sysfs(kdumpctl_t) ++# dracut + dev_manage_all_dev_nodes(kdumpctl_t) + + domain_use_interactive_fds(kdumpctl_t) + + files_create_kernel_img(kdumpctl_t) +-files_read_etc_files(kdumpctl_t) + files_read_etc_runtime_files(kdumpctl_t) +-files_read_usr_files(kdumpctl_t) + files_read_kernel_modules(kdumpctl_t) + files_getattr_all_dirs(kdumpctl_t) ++files_delete_kernel(kdumpctl_t) + + fs_getattr_all_fs(kdumpctl_t) + fs_search_all(kdumpctl_t) + +-init_domtrans_script(kdumpctl_t) ++application_executable_ioctl(kdumpctl_t) ++ ++auth_read_passwd(kdumpctl_t) ++ + init_exec(kdumpctl_t) ++systemd_exec_systemctl(kdumpctl_t) ++systemd_read_unit_files(kdumpctl_t) + + libs_exec_ld_so(kdumpctl_t) + + logging_send_syslog_msg(kdumpctl_t) ++# Need log file from /var/log/dracut.log ++logging_write_generic_logs(kdumpctl_t) ++ ++selinux_get_enforce_mode(kdumpctl_t) ++ ++storage_raw_read_fixed_disk(kdumpctl_t) ++storage_getattr_fixed_disk_dev(kdumpctl_t) + +-miscfiles_read_localization(kdumpctl_t) ++optional_policy(` ++ networkmanager_dbus_chat(kdumpctl_t) ++') ++ ++optional_policy(` ++ gpg_exec(kdumpctl_t) ++') + + optional_policy(` +- gpg_exec(kdumpctl_t) ++ lvm_read_config(kdumpctl_t) + ') + + optional_policy(` +- lvm_read_config(kdumpctl_t) ++ modutils_domtrans_insmod(kdumpctl_t) ++ modutils_list_module_config(kdumpctl_t) ++ modutils_read_module_config(kdumpctl_t) + ') + + optional_policy(` +- modutils_domtrans_insmod(kdumpctl_t) +- modutils_read_module_config(kdumpctl_t) ++ plymouthd_domtrans_plymouth(kdumpctl_t) + ') + + optional_policy(` +- plymouthd_domtrans_plymouth(kdumpctl_t) ++ ssh_exec(kdumpctl_t) + ') + + optional_policy(` +- ssh_exec(kdumpctl_t) ++ unconfined_domain(kdumpctl_t) + ') +diff --git a/kdumpgui.if b/kdumpgui.if +index 182ab8b585..8b1d9c23cb 100644 +--- a/kdumpgui.if ++++ b/kdumpgui.if +@@ -1 +1,23 @@ +-## System-config-kdump GUI. ++## system-config-kdump GUI ++ ++######################################## ++## ++## Send and receive messages from ++## kdumpgui over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kdumpgui_dbus_chat',` ++ gen_require(` ++ type kdumpgui_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 kdumpgui_t:dbus send_msg; ++ allow kdumpgui_t $1:dbus send_msg; ++') ++ +diff --git a/kdumpgui.te b/kdumpgui.te +index 2990962b6a..abd217f1d6 100644 +--- a/kdumpgui.te ++++ b/kdumpgui.te +@@ -5,79 +5,89 @@ policy_module(kdumpgui, 1.2.0) + # Declarations + # + ++## ++##

      ++## Allow s-c-kdump to run bootloader in bootloader_t. ++##

      ++##
      ++gen_tunable(kdumpgui_run_bootloader, false) ++ + type kdumpgui_t; + type kdumpgui_exec_t; +-init_system_domain(kdumpgui_t, kdumpgui_exec_t) ++init_daemon_domain(kdumpgui_t, kdumpgui_exec_t) + + type kdumpgui_tmp_t; + files_tmp_file(kdumpgui_tmp_t) + + ###################################### + # +-# Local policy ++# system-config-kdump local policy + # + + allow kdumpgui_t self:capability { net_admin sys_admin sys_nice sys_rawio }; +-allow kdumpgui_t self:process { setsched sigkill }; + allow kdumpgui_t self:fifo_file rw_fifo_file_perms; + allow kdumpgui_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow kdumpgui_t self:process { setsched sigkill }; + + manage_dirs_pattern(kdumpgui_t, kdumpgui_tmp_t, kdumpgui_tmp_t) + manage_files_pattern(kdumpgui_t, kdumpgui_tmp_t, kdumpgui_tmp_t) + files_tmp_filetrans(kdumpgui_t, kdumpgui_tmp_t, { dir file }) + +-kernel_getattr_core_if(kdumpgui_t) + kernel_read_system_state(kdumpgui_t) + kernel_read_network_state(kdumpgui_t) ++kernel_getattr_core_if(kdumpgui_t) + + corecmd_exec_bin(kdumpgui_t) + corecmd_exec_shell(kdumpgui_t) + +-dev_getattr_all_blk_files(kdumpgui_t) + dev_dontaudit_getattr_all_chr_files(kdumpgui_t) + dev_read_sysfs(kdumpgui_t) ++dev_read_urand(kdumpgui_t) ++dev_getattr_all_blk_files(kdumpgui_t) ++dev_read_nvme(kdumpgui_t) + + files_manage_boot_files(kdumpgui_t) + files_manage_boot_symlinks(kdumpgui_t) ++# Needed for running chkconfig + files_manage_etc_symlinks(kdumpgui_t) ++# for blkid.tab + files_manage_etc_runtime_files(kdumpgui_t) + files_etc_filetrans_etc_runtime(kdumpgui_t, file) +-files_read_usr_files(kdumpgui_t) + ++fs_manage_dos_files(kdumpgui_t) + fs_getattr_all_fs(kdumpgui_t) + fs_list_hugetlbfs(kdumpgui_t) +-fs_read_dos_files(kdumpgui_t) + + storage_raw_read_fixed_disk(kdumpgui_t) + storage_raw_write_fixed_disk(kdumpgui_t) ++storage_getattr_removable_dev(kdumpgui_t) + + auth_use_nsswitch(kdumpgui_t) + ++logging_send_syslog_msg(kdumpgui_t) + logging_list_logs(kdumpgui_t) + logging_read_generic_logs(kdumpgui_t) +-logging_send_syslog_msg(kdumpgui_t) +- +-miscfiles_read_localization(kdumpgui_t) + + mount_exec(kdumpgui_t) + + init_dontaudit_read_all_script_files(kdumpgui_t) ++init_access_check(kdumpgui_t) + +-optional_policy(` +- bootloader_exec(kdumpgui_t) +- bootloader_rw_config(kdumpgui_t) +-') ++userdom_dontaudit_search_admin_dir(kdumpgui_t) + + optional_policy(` +- consoletype_exec(kdumpgui_t) ++ tunable_policy(`kdumpgui_run_bootloader',` ++ bootloader_domtrans(kdumpgui_t) ++ #if s-c-kdump is involved ++ bootloader_manage_config(kdumpgui_t) ++ ',` ++ bootloader_exec(kdumpgui_t) ++ bootloader_manage_config(kdumpgui_t) ++ ') + ') + + optional_policy(` + dbus_system_domain(kdumpgui_t, kdumpgui_exec_t) +- +- optional_policy(` +- policykit_dbus_chat(kdumpgui_t) +- ') + ') + + optional_policy(` +@@ -87,4 +97,10 @@ optional_policy(` + optional_policy(` + kdump_manage_config(kdumpgui_t) + kdump_initrc_domtrans(kdumpgui_t) ++ kdump_systemctl(kdumpgui_t) ++ kdumpctl_domtrans(kdumpgui_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(kdumpgui_t) + ') +diff --git a/keepalived.fc b/keepalived.fc +new file mode 100644 +index 0000000000..9a19f91f3a +--- /dev/null ++++ b/keepalived.fc +@@ -0,0 +1,7 @@ ++/usr/lib/systemd/system/keepalived.* -- gen_context(system_u:object_r:keepalived_unit_file_t,s0) ++ ++/usr/sbin/keepalived -- gen_context(system_u:object_r:keepalived_exec_t,s0) ++ ++/usr/libexec/keepalived(/.*)? gen_context(system_u:object_r:keepalived_unconfined_script_exec_t,s0) ++ ++/var/run/keepalived.* -- gen_context(system_u:object_r:keepalived_var_run_t,s0) +diff --git a/keepalived.if b/keepalived.if +new file mode 100644 +index 0000000000..bd7e7fa17d +--- /dev/null ++++ b/keepalived.if +@@ -0,0 +1,80 @@ ++ ++## keepalived - load-balancing and high-availability service ++ ++######################################## ++## ++## Execute keepalived in the keepalived domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`keepalived_domtrans',` ++ gen_require(` ++ type keepalived_t, keepalived_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, keepalived_exec_t, keepalived_t) ++') ++######################################## ++## ++## Execute keepalived server in the keepalived domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`keepalived_systemctl',` ++ gen_require(` ++ type keepalived_t; ++ type keepalived_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 keepalived_unit_file_t:file read_file_perms; ++ allow $1 keepalived_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, keepalived_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an keepalived environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`keepalived_admin',` ++ gen_require(` ++ type keepalived_t; ++ type keepalived_unit_file_t; ++ ') ++ ++ allow $1 keepalived_t:process { signal_perms }; ++ ps_process_pattern($1, keepalived_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 keepalived_t:process ptrace; ++ ') ++ ++ keepalived_systemctl($1) ++ admin_pattern($1, keepalived_unit_file_t) ++ allow $1 keepalived_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/keepalived.te b/keepalived.te +new file mode 100644 +index 0000000000..eb1bb07eb8 +--- /dev/null ++++ b/keepalived.te +@@ -0,0 +1,119 @@ ++policy_module(keepalived, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Determine whether keepalived can ++## connect to all TCP ports. ++##

      ++##
      ++gen_tunable(keepalived_connect_any, false) ++ ++type keepalived_t; ++type keepalived_exec_t; ++init_daemon_domain(keepalived_t, keepalived_exec_t) ++ ++type keepalived_unit_file_t; ++systemd_unit_file(keepalived_unit_file_t) ++ ++type keepalived_var_run_t; ++files_pid_file(keepalived_var_run_t) ++ ++type keepalived_unconfined_script_exec_t; ++application_executable_file(keepalived_unconfined_script_exec_t) ++ ++######################################## ++# ++# keepalived local policy ++# ++ ++allow keepalived_t self:capability { net_admin net_raw kill dac_read_search sys_ptrace }; ++allow keepalived_t self:process { signal_perms setpgid }; ++allow keepalived_t self:netlink_socket create_socket_perms; ++allow keepalived_t self:netlink_generic_socket create_socket_perms; ++allow keepalived_t self:netlink_netfilter_socket create_socket_perms; ++allow keepalived_t self:netlink_route_socket nlmsg_write; ++allow keepalived_t self:packet_socket create_socket_perms; ++allow keepalived_t self:rawip_socket create_socket_perms; ++ ++manage_files_pattern(keepalived_t, keepalived_var_run_t, keepalived_var_run_t) ++files_pid_filetrans(keepalived_t, keepalived_var_run_t, { file }) ++ ++kernel_read_system_state(keepalived_t) ++kernel_read_network_state(keepalived_t) ++kernel_request_load_module(keepalived_t) ++kernel_read_usermodehelper_state(keepalived_t) ++kernel_search_network_sysctl(keepalived_t) ++kernel_read_net_sysctls(keepalived_t) ++kernel_getattr_proc(keepalived_t) ++ ++auth_use_nsswitch(keepalived_t) ++ ++corecmd_exec_bin(keepalived_t) ++corecmd_exec_shell(keepalived_t) ++ ++corenet_tcp_connect_connlcli_port(keepalived_t) ++corenet_tcp_connect_http_port(keepalived_t) ++corenet_tcp_connect_mysqld_port(keepalived_t) ++corenet_tcp_connect_smtp_port(keepalived_t) ++corenet_tcp_connect_snmp_port(keepalived_t) ++corenet_tcp_connect_agentx_port(keepalived_t) ++corenet_tcp_connect_squid_port(keepalived_t) ++ ++domain_read_all_domains_state(keepalived_t) ++domain_getattr_all_domains(keepalived_t) ++ ++dev_read_urand(keepalived_t) ++ ++modutils_domtrans_insmod(keepalived_t) ++ ++logging_send_syslog_msg(keepalived_t) ++ ++optional_policy(` ++ iptables_domtrans(keepalived_t) ++') ++ ++optional_policy(` ++ rhcs_signull_haproxy(keepalived_t) ++') ++ ++optional_policy(` ++ snmp_manage_var_lib_files(keepalived_t) ++ snmp_manage_var_lib_sock_files(keepalived_t) ++ snmp_manage_var_lib_dirs(keepalived_t) ++ snmp_stream_connect(keepalived_t) ++') ++ ++tunable_policy(`keepalived_connect_any',` ++ corenet_tcp_connect_all_ports(keepalived_t) ++ corenet_tcp_bind_all_ports(keepalived_t) ++ corenet_sendrecv_all_packets(keepalived_t) ++ corenet_tcp_sendrecv_all_ports(keepalived_t) ++') ++ ++######################################## ++# ++# keepalived_unconfined_script_script_t local policy ++# ++ ++optional_policy(` ++ type keepalived_unconfined_script_t; ++ domain_type(keepalived_unconfined_script_t) ++ ++ domain_entry_file(keepalived_unconfined_script_t, keepalived_unconfined_script_exec_t) ++ role system_r types keepalived_unconfined_script_t; ++ ++ domtrans_pattern(keepalived_t, keepalived_unconfined_script_exec_t, keepalived_unconfined_script_t) ++ ++ allow keepalived_t keepalived_unconfined_script_exec_t:dir search_dir_perms; ++ allow keepalived_t keepalived_unconfined_script_exec_t:dir read_file_perms; ++ allow keepalived_t keepalived_unconfined_script_exec_t:file ioctl; ++ ++ optional_policy(` ++ unconfined_domain(keepalived_unconfined_script_t) ++ ') ++') +diff --git a/kerberos.fc b/kerberos.fc +index 4fe75fd63e..3504a9bf74 100644 +--- a/kerberos.fc ++++ b/kerberos.fc +@@ -1,52 +1,54 @@ +-HOME_DIR/\.k5login -- gen_context(system_u:object_r:krb5_home_t,s0) +-/root/\.k5login -- gen_context(system_u:object_r:krb5_home_t,s0) ++HOME_DIR/\.k5login -- gen_context(system_u:object_r:krb5_home_t,s0) ++HOME_DIR/\.k5users -- gen_context(system_u:object_r:krb5_home_t,s0) ++/root/\.k5login -- gen_context(system_u:object_r:krb5_home_t,s0) ++/root/\.k5users -- gen_context(system_u:object_r:krb5_home_t,s0) + +-/etc/krb5\.conf -- gen_context(system_u:object_r:krb5_conf_t,s0) +-/etc/krb5\.keytab -- gen_context(system_u:object_r:krb5_keytab_t,s0) ++/etc/krb5\.conf -- gen_context(system_u:object_r:krb5_conf_t,s0) ++/etc/krb5\.keytab gen_context(system_u:object_r:krb5_keytab_t,s0) + +-/etc/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) +-/etc/krb5kdc/kadm5\.keytab -- gen_context(system_u:object_r:krb5_keytab_t,s0) +-/etc/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) ++/etc/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) ++/etc/krb5kdc/kadm5\.keytab -- gen_context(system_u:object_r:krb5_keytab_t,s0) ++/etc/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) + + /etc/rc\.d/init\.d/kadmind -- gen_context(system_u:object_r:kerberos_initrc_exec_t,s0) + /etc/rc\.d/init\.d/kprop -- gen_context(system_u:object_r:kerberos_initrc_exec_t,s0) + /etc/rc\.d/init\.d/krb524d -- gen_context(system_u:object_r:kerberos_initrc_exec_t,s0) + /etc/rc\.d/init\.d/krb5kdc -- gen_context(system_u:object_r:kerberos_initrc_exec_t,s0) + +-/usr/kerberos/sbin/krb5kdc -- gen_context(system_u:object_r:krb5kdc_exec_t,s0) +-/usr/kerberos/sbin/kadmind -- gen_context(system_u:object_r:kadmind_exec_t,s0) +-/usr/kerberos/sbin/kadmin\.local -- gen_context(system_u:object_r:kadmind_exec_t,s0) ++/usr/(kerberos/)?sbin/krb5kdc -- gen_context(system_u:object_r:krb5kdc_exec_t,s0) ++/usr/(kerberos/)?sbin/kadmind -- gen_context(system_u:object_r:kadmind_exec_t,s0) ++/usr/(kerberos/)?sbin/\_kadmind -- gen_context(system_u:object_r:kadmind_exec_t,s0) ++/usr/kerberos/sbin/kadmin\.local -- gen_context(system_u:object_r:kadmind_exec_t,s0) + /usr/kerberos/sbin/kpropd -- gen_context(system_u:object_r:kpropd_exec_t,s0) ++/usr/sbin/kpropd -- gen_context(system_u:object_r:kpropd_exec_t,s0) ++/usr/sbin/\_kpropd -- gen_context(system_u:object_r:kpropd_exec_t,s0) + +-/usr/local/kerberos/sbin/krb5kdc -- gen_context(system_u:object_r:krb5kdc_exec_t,s0) +-/usr/local/kerberos/sbin/kadmind -- gen_context(system_u:object_r:kadmind_exec_t,s0) ++/usr/var/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) ++/usr/var/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) + +-/usr/sbin/krb5kdc -- gen_context(system_u:object_r:krb5kdc_exec_t,s0) +-/usr/sbin/kadmind -- gen_context(system_u:object_r:kadmind_exec_t,s0) ++/var/kerberos/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) ++/var/kerberos/krb5kdc/from_master.* gen_context(system_u:object_r:krb5kdc_lock_t,s0) ++/var/kerberos/krb5kdc/kadm5\.keytab -- gen_context(system_u:object_r:krb5_keytab_t,s0) ++/var/kerberos/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) ++/var/kerberos/krb5kdc/principal.*\.ok gen_context(system_u:object_r:krb5kdc_lock_t,s0) + +-/usr/local/var/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) +-/usr/local/var/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) ++/var/lib/kdcproxy(/.*)? gen_context(system_u:object_r:krb5kdc_var_lib_t,s0) + +-/usr/var/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) +-/usr/var/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) ++/var/log/krb5kdc\.log.* gen_context(system_u:object_r:krb5kdc_log_t,s0) ++/var/log/kadmin(d)?\.log.* gen_context(system_u:object_r:kadmind_log_t,s0) + +-/var/cache/krb5rcache(/.*)? gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/cache/krb5rcache(/.*)? gen_context(system_u:object_r:krb5_host_rcache_t,s0) + +-/var/kerberos/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_conf_t,s0) +-/var/kerberos/krb5kdc/from_master.* gen_context(system_u:object_r:krb5kdc_lock_t,s0) +-/var/kerberos/krb5kdc/kadm5\.keytab -- gen_context(system_u:object_r:krb5_keytab_t,s0) +-/var/kerberos/krb5kdc/principal.* gen_context(system_u:object_r:krb5kdc_principal_t,s0) +-/var/kerberos/krb5kdc/principal.*\.ok -- gen_context(system_u:object_r:krb5kdc_lock_t,s0) +- +-/var/log/krb5kdc\.log.* -- gen_context(system_u:object_r:krb5kdc_log_t,s0) +-/var/log/kadmin\.log.* -- gen_context(system_u:object_r:kadmind_log_t,s0) +-/var/log/kadmind\.log.* -- gen_context(system_u:object_r:kadmind_log_t,s0) +- +-/var/tmp/host_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/HTTP_23 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/HTTP_48 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/imap_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/nfs_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/ldapmap1_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/ldap_487 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +-/var/tmp/ldap_55 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/run/krb5kdc(/.*)? gen_context(system_u:object_r:krb5kdc_var_run_t,s0) ++ ++/var/tmp/DNS_25 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/kadmin_0 -- gen_context(system_u:object_r:kadmind_tmp_t,s0) ++/var/tmp/kiprop_0 -- gen_context(system_u:object_r:kadmind_tmp_t,s0) ++/var/tmp/host_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/HTTP_23 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/HTTP_48 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/imap_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/nfs_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/ldapmap1_0 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/ldap_487 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) ++/var/tmp/ldap_55 -- gen_context(system_u:object_r:krb5_host_rcache_t,s0) +diff --git a/kerberos.if b/kerberos.if +index f6c00d8e60..79ea4d8d28 100644 +--- a/kerberos.if ++++ b/kerberos.if +@@ -1,27 +1,29 @@ +-## MIT Kerberos admin and KDC. ++## MIT Kerberos admin and KDC ++## ++##

      ++## This policy supports: ++##

      ++##

      ++## Servers: ++##

        ++##
      • kadmind
      • ++##
      • krb5kdc
      • ++##
      ++##

      ++##

      ++## Clients: ++##

        ++##
      • kinit
      • ++##
      • kdestroy
      • ++##
      • klist
      • ++##
      • ksu (incomplete)
      • ++##
      ++##

      ++##
      + + ######################################## + ## +-## Role access for kerberos. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-template(`kerberos_role',` +- refpolicywarn(`$0($*) has been deprecated') +-') +- +-######################################## +-## +-## Execute kadmind in the caller domain. ++## Execute kadmind in the current domain + ## + ## + ## +@@ -34,7 +36,6 @@ interface(`kerberos_exec_kadmind',` + type kadmind_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, kadmind_exec_t) + ') + +@@ -53,13 +54,12 @@ interface(`kerberos_domtrans_kpropd',` + type kpropd_t, kpropd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, kpropd_exec_t, kpropd_t) + ') + + ######################################## + ## +-## Support kerberos services. ++## Use kerberos services + ## + ## + ## +@@ -69,45 +69,45 @@ interface(`kerberos_domtrans_kpropd',` + # + interface(`kerberos_use',` + gen_require(` +- type krb5kdc_conf_t, krb5_host_rcache_t; ++ type krb5_conf_t, krb5kdc_conf_t; ++ type krb5_host_rcache_t; + ') + +- kerberos_read_config($1) +- +- dontaudit $1 krb5_conf_t:file write_file_perms; ++ files_search_etc($1) ++ read_files_pattern($1, krb5_conf_t, krb5_conf_t) ++ list_dirs_pattern($1, krb5_conf_t, krb5_conf_t) ++ dontaudit $1 krb5_conf_t:file write; + dontaudit $1 krb5kdc_conf_t:dir list_dir_perms; + dontaudit $1 krb5kdc_conf_t:file rw_file_perms; + ++ #kerberos libraries are attempting to set the correct file context + dontaudit $1 self:process setfscreate; +- + selinux_dontaudit_validate_context($1) +- seutil_dontaudit_read_file_contexts($1) ++ seutil_read_file_contexts($1) + +- tunable_policy(`allow_kerberos',` ++ tunable_policy(`kerberos_enabled',` + allow $1 self:tcp_socket create_socket_perms; + allow $1 self:udp_socket create_socket_perms; + +- corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) + corenet_tcp_sendrecv_generic_if($1) + corenet_udp_sendrecv_generic_if($1) + corenet_tcp_sendrecv_generic_node($1) + corenet_udp_sendrecv_generic_node($1) +- +- corenet_sendrecv_kerberos_client_packets($1) +- corenet_tcp_connect_kerberos_port($1) + corenet_tcp_sendrecv_kerberos_port($1) + corenet_udp_sendrecv_kerberos_port($1) +- +- corenet_sendrecv_ocsp_client_packets($1) ++ corenet_tcp_bind_generic_node($1) ++ corenet_udp_bind_generic_node($1) ++ corenet_tcp_connect_kerberos_port($1) + corenet_tcp_connect_ocsp_port($1) +- corenet_tcp_sendrecv_ocsp_port($1) ++ corenet_sendrecv_kerberos_client_packets($1) ++ corenet_sendrecv_ocsp_client_packets($1) + ++ allow $1 krb5_host_rcache_t:dir search_dir_perms; + allow $1 krb5_host_rcache_t:file getattr_file_perms; + ') + + optional_policy(` +- tunable_policy(`allow_kerberos',` ++ tunable_policy(`kerberos_enabled',` + pcscd_stream_connect($1) + ') + ') +@@ -119,7 +119,7 @@ interface(`kerberos_use',` + + ######################################## + ## +-## Read kerberos configuration files. ++## Read the kerberos configuration file (/etc/krb5.conf). + ## + ## + ## +@@ -135,15 +135,13 @@ interface(`kerberos_read_config',` + + files_search_etc($1) + allow $1 krb5_conf_t:file read_file_perms; +- +- userdom_search_user_home_dirs($1) + allow $1 krb5_home_t:file read_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to write +-## kerberos configuration files. ++## Do not audit attempts to write the kerberos ++## configuration file (/etc/krb5.conf). + ## + ## + ## +@@ -156,13 +154,12 @@ interface(`kerberos_dontaudit_write_config',` + type krb5_conf_t; + ') + +- dontaudit $1 krb5_conf_t:file write_file_perms; ++ dontaudit $1 krb5_conf_t:file write; + ') + + ######################################## + ## +-## Read and write kerberos +-## configuration files. ++## Read and write the kerberos configuration file (/etc/krb5.conf). + ## + ## + ## +@@ -182,27 +179,27 @@ interface(`kerberos_rw_config',` + + ######################################## + ## +-## Create, read, write, and delete +-## kerberos home files. ++## Read the kerberos key table. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`kerberos_manage_krb5_home_files',` ++interface(`kerberos_read_keytab',` + gen_require(` +- type krb5_home_t; ++ type krb5_keytab_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 krb5_home_t:file manage_file_perms; ++ files_search_etc($1) ++ allow $1 krb5_keytab_t:file read_file_perms; + ') + + ######################################## + ## +-## Relabel kerberos home files. ++## Read/Write the kerberos key table. + ## + ## + ## +@@ -210,220 +207,252 @@ interface(`kerberos_manage_krb5_home_files',` + ## + ## + # +-interface(`kerberos_relabel_krb5_home_files',` ++interface(`kerberos_rw_keytab',` + gen_require(` +- type krb5_home_t; ++ type krb5_keytab_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 krb5_home_t:file relabel_file_perms; ++ files_search_etc($1) ++ allow $1 krb5_keytab_t:file rw_file_perms; + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the krb5 home type. ++## Create keytab file in /etc + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## + ## + ## + ## The name of the object being created. + ## + ## + # +-interface(`kerberos_home_filetrans_krb5_home',` ++interface(`kerberos_etc_filetrans_keytab',` + gen_require(` +- type krb5_home_t; ++ type krb5_keytab_t; + ') + +- userdom_user_home_dir_filetrans($1, krb5_home_t, $2, $3) ++ allow $1 krb5_keytab_t:file manage_file_perms; ++ files_etc_filetrans($1, krb5_keytab_t, file, $2) + ') + + ######################################## + ## +-## Read kerberos key table files. ++## Create a derived type for kerberos keytab + ## ++## ++## ++## The prefix to be used for deriving type names. ++## ++## + ## + ## + ## Domain allowed access. + ## + ## +-## + # +-interface(`kerberos_read_keytab',` +- gen_require(` +- type krb5_keytab_t; +- ') +- +- files_search_etc($1) +- allow $1 krb5_keytab_t:file read_file_perms; ++template(`kerberos_keytab_template',` ++ refpolicywarn(`$0($*) has been deprecated.') ++ kerberos_read_keytab($2) ++ kerberos_use($2) + ') + + ######################################## + ## +-## Read and write kerberos key table files. ++## Read the kerberos kdc configuration file (/etc/krb5kdc.conf). + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`kerberos_rw_keytab',` ++interface(`kerberos_read_kdc_config',` + gen_require(` +- type krb5_keytab_t; ++ type krb5kdc_conf_t; + ') + + files_search_etc($1) +- allow $1 krb5_keytab_t:file rw_file_perms; ++ read_files_pattern($1, krb5kdc_conf_t, krb5kdc_conf_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## kerberos key table files. ++## Manage the kerberos kdc configuration file (/etc/krb5kdc.conf). + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`kerberos_manage_keytab_files',` ++interface(`kerberos_manage_kdc_config',` + gen_require(` +- type krb5_keytab_t; ++ type krb5kdc_conf_t; + ') + + files_search_etc($1) +- allow $1 krb5_keytab_t:file manage_file_perms; ++ manage_files_pattern($1, krb5kdc_conf_t, krb5kdc_conf_t) ++ manage_dirs_pattern($1, krb5kdc_conf_t, krb5kdc_conf_t) + ') + + ######################################## + ## +-## Create specified objects in generic +-## etc directories with the kerberos +-## keytab file type. ++## Read the kerberos kdc configuration file (/etc/krb5kdc.conf). + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`kerberos_etc_filetrans_keytab',` ++interface(`kerberos_read_host_rcache',` + gen_require(` +- type krb5_keytab_t; ++ type krb5_host_rcache_t; + ') +- +- files_etc_filetrans($1, krb5_keytab_t, $2, $3) ++ read_files_pattern($1, krb5_host_rcache_t, krb5_host_rcache_t) + ') + + ######################################## + ## +-## Create a derived type for kerberos +-## keytab files. ++## Read the kerberos kdc configuration file (/etc/krb5kdc.conf). + ## +-## +-## +-## The prefix to be used for deriving type names. +-## +-## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-template(`kerberos_keytab_template',` +- refpolicywarn(`$0($*) has been deprecated.') +- kerberos_read_keytab($2) +- kerberos_use($2) ++interface(`kerberos_manage_host_rcache',` ++ gen_require(` ++ type krb5_host_rcache_t; ++ ') ++ ++ # creates files as system_u no matter what the selinux user ++ # cjp: should be in the below tunable but typeattribute ++ # does not work in conditionals ++ domain_obj_id_change_exemption($1) ++ ++ tunable_policy(`kerberos_enabled',` ++ allow $1 self:process setfscreate; ++ ++ selinux_validate_context($1) ++ ++ seutil_read_file_contexts($1) ++ ++ files_rw_generic_tmp_dir($1) ++ manage_files_pattern($1, krb5_host_rcache_t, krb5_host_rcache_t) ++ files_search_tmp($1) ++ ') + ') + + ######################################## + ## +-## Read kerberos kdc configuration files. ++## All of the rules required to administrate ++## an kerberos environment + ## + ## + ## + ## Domain allowed access. + ## + ## ++## ++## ++## The role to be allowed to manage the kerberos domain. ++## ++## + ## + # +-interface(`kerberos_read_kdc_config',` ++interface(`kerberos_admin',` + gen_require(` +- type krb5kdc_conf_t; ++ type kadmind_t, krb5kdc_t, kerberos_initrc_exec_t; ++ type kadmind_log_t, kadmind_tmp_t, kadmind_var_run_t; ++ type krb5_conf_t, krb5_keytab_t, krb5kdc_conf_t; ++ type krb5kdc_principal_t, krb5kdc_tmp_t, kpropd_t; ++ type krb5kdc_var_run_t, krb5_host_rcache_t; + ') + +- files_search_etc($1) +- read_files_pattern($1, krb5kdc_conf_t, krb5kdc_conf_t) ++ allow $1 kadmind_t:process signal_perms; ++ ps_process_pattern($1, kadmind_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 kadmind_t:process ptrace; ++ allow $1 krb5kdc_t:process ptrace; ++ allow $1 kpropd_t:process ptrace; ++ ') ++ ++ allow $1 krb5kdc_t:process signal_perms; ++ ps_process_pattern($1, krb5kdc_t) ++ ++ allow $1 kpropd_t:process signal_perms; ++ ps_process_pattern($1, kpropd_t) ++ ++ init_labeled_script_domtrans($1, kerberos_initrc_exec_t) ++ domain_system_change_exemption($1) ++ role_transition $2 kerberos_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_list_logs($1) ++ admin_pattern($1, kadmind_log_t) ++ ++ files_list_tmp($1) ++ admin_pattern($1, kadmind_tmp_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, kadmind_var_run_t) ++ ++ admin_pattern($1, krb5_conf_t) ++ ++ admin_pattern($1, krb5_host_rcache_t) ++ ++ admin_pattern($1, krb5_keytab_t) ++ ++ admin_pattern($1, krb5kdc_principal_t) ++ ++ admin_pattern($1, krb5kdc_tmp_t) ++ ++ admin_pattern($1, krb5kdc_var_run_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## kerberos host rcache files. ++## Type transition files created in /tmp ++## to the krb5_host_rcache type. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## ++## ++## The name of the object being created. ++## ++## + # +-interface(`kerberos_manage_host_rcache',` ++interface(`kerberos_tmp_filetrans_host_rcache',` + gen_require(` + type krb5_host_rcache_t; + ') + +- domain_obj_id_change_exemption($1) +- +- tunable_policy(`allow_kerberos',` +- allow $1 self:process setfscreate; +- +- selinux_validate_context($1) +- +- seutil_read_file_contexts($1) +- +- files_search_tmp($1) +- allow $1 krb5_host_rcache_t:file manage_file_perms; +- ') ++ manage_files_pattern($1, krb5_host_rcache_t, krb5_host_rcache_t) ++ files_tmp_filetrans($1, krb5_host_rcache_t, file, $2) + ') + + ######################################## + ## +-## Create objects in generic temporary +-## directories with the kerberos host +-## rcache type. ++## Type transition files created in /tmp ++## to the kadmind_tmp type. + ## + ## + ## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Class of the object being created. ++## Domain allowed access. + ## + ## + ## +@@ -432,17 +461,18 @@ interface(`kerberos_manage_host_rcache',` + ## + ## + # +-interface(`kerberos_tmp_filetrans_host_rcache',` ++interface(`kerberos_tmp_filetrans_kadmin',` + gen_require(` +- type krb5_host_rcache_t; ++ type kadmind_tmp_t; + ') + +- files_tmp_filetrans($1, krb5_host_rcache_t, $2, $3) ++ manage_files_pattern($1, kadmind_tmp_t, kadmind_tmp_t) ++ files_tmp_filetrans($1, kadmind_tmp_t, file, $2) + ') + + ######################################## + ## +-## Connect to krb524 service. ++## read kerberos homedir content (.k5login) + ## + ## + ## +@@ -450,82 +480,109 @@ interface(`kerberos_tmp_filetrans_host_rcache',` + ## + ## + # +-interface(`kerberos_connect_524',` +- tunable_policy(`allow_kerberos',` +- allow $1 self:udp_socket create_socket_perms; +- +- corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) +- corenet_udp_sendrecv_generic_if($1) +- corenet_udp_sendrecv_generic_node($1) +- +- corenet_sendrecv_kerberos_master_client_packets($1) +- corenet_udp_sendrecv_kerberos_master_port($1) ++interface(`kerberos_read_home_content',` ++ gen_require(` ++ type krb5_home_t; + ') ++ ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, krb5_home_t, krb5_home_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an kerberos environment. ++## Manage the kerberos kdc /var/lib files ++## and directories. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## + ## + # +-interface(`kerberos_admin',` ++interface(`kerberos_manage_kdc_var_lib',` + gen_require(` +- type kadmind_t, krb5kdc_t, kerberos_initrc_exec_t; +- type kadmind_log_t, kadmind_tmp_t, kadmind_var_run_t; +- type krb5_conf_t, krb5_keytab_t, krb5kdc_conf_t; +- type krb5kdc_principal_t, krb5kdc_tmp_t, kpropd_t; +- type krb5kdc_var_run_t, krb5_host_rcache_t; ++ type krb5kdc_var_lib_t; + ') + +- allow $1 { kadmind_t krb5kdc_t kpropd }:process { ptrace signal_perms }; +- ps_process_pattern($1, { kadmind_t krb5kdc_t kpropd }) +- +- init_labeled_script_domtrans($1, kerberos_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 kerberos_initrc_exec_t system_r; +- allow $2 system_r; ++ files_search_etc($1) ++ manage_files_pattern($1, krb5kdc_var_lib_t, krb5kdc_var_lib_t) ++ manage_dirs_pattern($1, krb5kdc_var_lib_t, krb5kdc_var_lib_t) ++') + +- logging_list_logs($1) +- admin_pattern($1, kadmind_log_t) ++######################################## ++## ++## create kerberos content in the in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kerberos_filetrans_admin_home_content',` ++ gen_require(` ++ type krb5_home_t; ++ ') + +- files_list_tmp($1) +- admin_pattern($1, { kadmind_tmp_t krb5_host_rcache_t krb5kdc_tmp_t }) ++ userdom_admin_home_dir_filetrans($1, krb5_home_t, file, ".k5login") ++ userdom_admin_home_dir_filetrans($1, krb5_home_t, file, ".k5users") ++') + +- kerberos_tmp_filetrans_host_rcache($1, file, "host_0") +- kerberos_tmp_filetrans_host_rcache($1, file, "HTTP_23") +- kerberos_tmp_filetrans_host_rcache($1, file, "HTTP_48") +- kerberos_tmp_filetrans_host_rcache($1, file, "imap_0") +- kerberos_tmp_filetrans_host_rcache($1, file, "nfs_0") +- kerberos_tmp_filetrans_host_rcache($1, file, "ldapmap1_0") +- kerberos_tmp_filetrans_host_rcache($1, file, "ldap_487") +- kerberos_tmp_filetrans_host_rcache($1, file, "ldap_55") ++######################################## ++## ++## Transition to kerberos named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kerberos_filetrans_home_content',` ++ gen_require(` ++ type krb5_home_t; ++ ') + +- files_list_pids($1) +- admin_pattern($1, { kadmind_var_run_t krb5kdc_var_run_t }) ++ userdom_user_home_dir_filetrans($1, krb5_home_t, file, ".k5login") ++ userdom_user_home_dir_filetrans($1, krb5_home_t, file, ".k5users") ++') + +- files_list_etc($1) +- admin_pattern($1, krb5_conf_t) ++######################################## ++## ++## Transition to kerberos named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kerberos_filetrans_named_content',` ++ gen_require(` ++ type krb5_conf_t, krb5_keytab_t, krb5kdc_conf_t; ++ type krb5kdc_principal_t; ++ ') + + files_etc_filetrans($1, krb5_conf_t, file, "krb5.conf") +- +- admin_pattern($1, { krb5_keytab_t krb5kdc_principal_t }) +- ++ filetrans_pattern($1, krb5kdc_conf_t, krb5_keytab_t, file, "kadm5.keytab") + filetrans_pattern($1, krb5kdc_conf_t, krb5kdc_principal_t, file, "principal") + filetrans_pattern($1, krb5kdc_conf_t, krb5kdc_principal_t, file, "principal0") + filetrans_pattern($1, krb5kdc_conf_t, krb5kdc_principal_t, file, "principal1") +- +- kerberos_etc_filetrans_keytab($1, file, "kadm5.keytab") ++ #filetrans_pattern($1, krb5kdc_conf_t, krb5kdc_principal_t, file, "principal1") ++ ++ kerberos_etc_filetrans_keytab($1, "krb5.keytab") ++ kerberos_filetrans_admin_home_content($1) ++ ++ kerberos_tmp_filetrans_host_rcache($1, "DNS_25") ++ kerberos_tmp_filetrans_host_rcache($1, "host_0") ++ kerberos_tmp_filetrans_host_rcache($1, "HTTP_23") ++ kerberos_tmp_filetrans_host_rcache($1, "HTTP_48") ++ kerberos_tmp_filetrans_host_rcache($1, "imap_0") ++ kerberos_tmp_filetrans_host_rcache($1, "nfs_0") ++ kerberos_tmp_filetrans_host_rcache($1, "ldapmap1_0") ++ kerberos_tmp_filetrans_host_rcache($1, "ldap_487") ++ kerberos_tmp_filetrans_host_rcache($1, "ldap_55") + ') +diff --git a/kerberos.te b/kerberos.te +index 8833d596d0..3519d8b7b8 100644 +--- a/kerberos.te ++++ b/kerberos.te +@@ -6,11 +6,11 @@ policy_module(kerberos, 1.12.0) + # + + ## +-##

      +-## Determine whether kerberos is supported. +-##

      ++##

      ++## Allow confined applications to run with kerberos. ++##

      + ##
      +-gen_tunable(allow_kerberos, false) ++gen_tunable(kerberos_enabled, false) + + type kadmind_t; + type kadmind_exec_t; +@@ -35,23 +35,29 @@ init_daemon_domain(kpropd_t, kpropd_exec_t) + domain_obj_id_change_exemption(kpropd_t) + + type krb5_conf_t; +-files_type(krb5_conf_t) ++files_config_file(krb5_conf_t) + + type krb5_home_t; + userdom_user_home_content(krb5_home_t) + +-type krb5_host_rcache_t; ++type krb5_host_rcache_t alias saslauthd_tmp_t; + files_tmp_file(krb5_host_rcache_t) + ++# types for general configuration files in /etc + type krb5_keytab_t; + files_security_file(krb5_keytab_t) + ++# types for KDC configs and principal file(s) + type krb5kdc_conf_t; +-files_type(krb5kdc_conf_t) ++files_config_file(krb5kdc_conf_t) + + type krb5kdc_lock_t; +-files_type(krb5kdc_lock_t) ++files_lock_file(krb5kdc_lock_t) + ++type krb5kdc_var_lib_t; ++files_type(krb5kdc_var_lib_t) ++ ++# types for KDC principal file(s) + type krb5kdc_principal_t; + files_type(krb5kdc_principal_t) + +@@ -74,28 +80,33 @@ files_pid_file(krb5kdc_var_run_t) + # kadmind local policy + # + +-allow kadmind_t self:capability { setuid setgid chown fowner dac_override sys_nice }; +-dontaudit kadmind_t self:capability sys_tty_config; ++# Use capabilities. Surplus capabilities may be allowed. ++allow kadmind_t self:capability { setuid setgid chown fowner dac_read_search dac_override sys_nice }; + allow kadmind_t self:capability2 block_suspend; ++dontaudit kadmind_t self:capability sys_tty_config; + allow kadmind_t self:process { setfscreate setsched getsched signal_perms }; + allow kadmind_t self:netlink_route_socket r_netlink_socket_perms; +-allow kadmind_t self:tcp_socket { accept listen }; ++allow kadmind_t self:unix_dgram_socket { connect create write }; ++allow kadmind_t self:tcp_socket connected_stream_socket_perms; + allow kadmind_t self:udp_socket create_socket_perms; + +-allow kadmind_t kadmind_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow kadmind_t kadmind_log_t:file manage_file_perms; + logging_log_filetrans(kadmind_t, kadmind_log_t, file) + + allow kadmind_t krb5_conf_t:file read_file_perms; +-dontaudit kadmind_t krb5_conf_t:file write_file_perms; ++dontaudit kadmind_t krb5_conf_t:file write; + +-read_files_pattern(kadmind_t, krb5kdc_conf_t, krb5kdc_conf_t) +-dontaudit kadmind_t krb5kdc_conf_t:file { write_file_perms setattr_file_perms }; ++manage_files_pattern(kadmind_t, krb5kdc_conf_t, krb5kdc_conf_t) + + allow kadmind_t krb5kdc_lock_t:file { rw_file_perms setattr_file_perms }; + +-allow kadmind_t krb5kdc_principal_t:file manage_file_perms; ++allow kadmind_t krb5kdc_principal_t:file { manage_file_perms map }; + filetrans_pattern(kadmind_t, krb5kdc_conf_t, krb5kdc_principal_t, file) + ++allow kadmind_t krb5_keytab_t:file read_file_perms; ++ ++can_exec(kadmind_t, kadmind_exec_t) ++ + manage_dirs_pattern(kadmind_t, kadmind_tmp_t, kadmind_tmp_t) + manage_files_pattern(kadmind_t, kadmind_tmp_t, kadmind_tmp_t) + files_tmp_filetrans(kadmind_t, kadmind_tmp_t, { file dir }) +@@ -103,13 +114,15 @@ files_tmp_filetrans(kadmind_t, kadmind_tmp_t, { file dir }) + manage_files_pattern(kadmind_t, kadmind_var_run_t, kadmind_var_run_t) + files_pid_filetrans(kadmind_t, kadmind_var_run_t, file) + +-can_exec(kadmind_t, kadmind_exec_t) +- + kernel_read_kernel_sysctls(kadmind_t) ++kernel_list_proc(kadmind_t) + kernel_read_network_state(kadmind_t) ++kernel_read_proc_symlinks(kadmind_t) + kernel_read_system_state(kadmind_t) + +-corenet_all_recvfrom_unlabeled(kadmind_t) ++corecmd_exec_bin(kadmind_t) ++corecmd_exec_shell(kadmind_t) ++ + corenet_all_recvfrom_netlabel(kadmind_t) + corenet_tcp_sendrecv_generic_if(kadmind_t) + corenet_udp_sendrecv_generic_if(kadmind_t) +@@ -119,31 +132,44 @@ corenet_tcp_sendrecv_all_ports(kadmind_t) + corenet_udp_sendrecv_all_ports(kadmind_t) + corenet_tcp_bind_generic_node(kadmind_t) + corenet_udp_bind_generic_node(kadmind_t) +- +-corenet_sendrecv_all_server_packets(kadmind_t) + corenet_tcp_bind_kerberos_admin_port(kadmind_t) ++corenet_tcp_bind_kerberos_password_port(kadmind_t) + corenet_udp_bind_kerberos_admin_port(kadmind_t) ++corenet_udp_bind_kerberos_password_port(kadmind_t) + corenet_tcp_bind_reserved_port(kadmind_t) ++corenet_dontaudit_tcp_bind_all_reserved_ports(kadmind_t) ++corenet_sendrecv_kerberos_admin_server_packets(kadmind_t) ++corenet_sendrecv_kerberos_password_server_packets(kadmind_t) ++corenet_tcp_bind_kprop_port(kadmind_t) ++corenet_tcp_connect_kprop_port(kadmind_t) + + dev_read_sysfs(kadmind_t) ++dev_read_rand(kadmind_t) ++dev_read_urand(kadmind_t) + + fs_getattr_all_fs(kadmind_t) + fs_search_auto_mountpoints(kadmind_t) ++fs_rw_anon_inodefs_files(kadmind_t) + + domain_use_interactive_fds(kadmind_t) + + files_read_etc_files(kadmind_t) +-files_read_usr_files(kadmind_t) ++files_read_usr_symlinks(kadmind_t) + files_read_var_files(kadmind_t) + + selinux_validate_context(kadmind_t) + ++auth_read_passwd(kadmind_t) ++ + logging_send_syslog_msg(kadmind_t) + ++miscfiles_read_generic_certs(kadmind_t) + miscfiles_read_localization(kadmind_t) + ++seutil_read_config(kadmind_t) + seutil_read_file_contexts(kadmind_t) + ++sysnet_read_config(kadmind_t) + sysnet_use_ldap(kadmind_t) + + userdom_dontaudit_use_unpriv_user_fds(kadmind_t) +@@ -153,12 +179,17 @@ optional_policy(` + ldap_stream_connect(kadmind_t) + ') + ++optional_policy(` ++ dirsrv_stream_connect(kadmind_t) ++') ++ + optional_policy(` + nis_use_ypbind(kadmind_t) + ') + + optional_policy(` + sssd_read_public_files(kadmind_t) ++ sssd_stream_connect(kadmind_t) + ') + + optional_policy(` +@@ -174,24 +205,28 @@ optional_policy(` + # Krb5kdc local policy + # + +-allow krb5kdc_t self:capability { setuid setgid net_admin chown fowner dac_override sys_nice }; +-dontaudit krb5kdc_t self:capability sys_tty_config; ++# Use capabilities. Surplus capabilities may be allowed. ++allow krb5kdc_t self:capability { setuid setgid net_admin chown fowner dac_read_search dac_override sys_nice }; + allow krb5kdc_t self:capability2 block_suspend; ++dontaudit krb5kdc_t self:capability sys_tty_config; + allow krb5kdc_t self:process { setfscreate setsched getsched signal_perms }; + allow krb5kdc_t self:netlink_route_socket r_netlink_socket_perms; +-allow krb5kdc_t self:tcp_socket { accept listen }; ++allow krb5kdc_t self:tcp_socket create_stream_socket_perms; + allow krb5kdc_t self:udp_socket create_socket_perms; + allow krb5kdc_t self:fifo_file rw_fifo_file_perms; + + allow krb5kdc_t krb5_conf_t:file read_file_perms; + dontaudit krb5kdc_t krb5_conf_t:file write; + ++can_exec(krb5kdc_t, krb5kdc_exec_t) ++ ++list_dirs_pattern(krb5kdc_t, krb5kdc_conf_t, krb5kdc_conf_t) + read_files_pattern(krb5kdc_t, krb5kdc_conf_t, krb5kdc_conf_t) +-dontaudit krb5kdc_t krb5kdc_conf_t:file write_file_perms; ++dontaudit krb5kdc_t krb5kdc_conf_t:file write; + + allow krb5kdc_t krb5kdc_lock_t:file { rw_file_perms setattr_file_perms }; + +-allow krb5kdc_t krb5kdc_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow krb5kdc_t krb5kdc_log_t:file manage_file_perms; + logging_log_filetrans(krb5kdc_t, krb5kdc_log_t, file) + + allow krb5kdc_t krb5kdc_principal_t:file rw_file_perms; +@@ -201,77 +236,93 @@ manage_files_pattern(krb5kdc_t, krb5kdc_tmp_t, krb5kdc_tmp_t) + files_tmp_filetrans(krb5kdc_t, krb5kdc_tmp_t, { file dir }) + + manage_files_pattern(krb5kdc_t, krb5kdc_var_run_t, krb5kdc_var_run_t) +-files_pid_filetrans(krb5kdc_t, krb5kdc_var_run_t, file) ++manage_sock_files_pattern(krb5kdc_t, krb5kdc_var_run_t, krb5kdc_var_run_t) ++manage_dirs_pattern(krb5kdc_t, krb5kdc_var_run_t, krb5kdc_var_run_t) ++files_pid_filetrans(krb5kdc_t, krb5kdc_var_run_t, { dir file sock_file }) + +-can_exec(krb5kdc_t, krb5kdc_exec_t) ++manage_files_pattern(krb5kdc_t, krb5kdc_var_lib_t, krb5kdc_var_lib_t) ++manage_dirs_pattern(krb5kdc_t, krb5kdc_var_lib_t, krb5kdc_var_lib_t) + + kernel_read_system_state(krb5kdc_t) + kernel_read_kernel_sysctls(krb5kdc_t) ++kernel_list_proc(krb5kdc_t) ++kernel_read_proc_symlinks(krb5kdc_t) + kernel_read_network_state(krb5kdc_t) + kernel_search_network_sysctl(krb5kdc_t) + + corecmd_exec_bin(krb5kdc_t) + +-corenet_all_recvfrom_unlabeled(krb5kdc_t) + corenet_all_recvfrom_netlabel(krb5kdc_t) + corenet_tcp_sendrecv_generic_if(krb5kdc_t) + corenet_udp_sendrecv_generic_if(krb5kdc_t) + corenet_tcp_sendrecv_generic_node(krb5kdc_t) + corenet_udp_sendrecv_generic_node(krb5kdc_t) ++corenet_tcp_sendrecv_all_ports(krb5kdc_t) ++corenet_udp_sendrecv_all_ports(krb5kdc_t) + corenet_tcp_bind_generic_node(krb5kdc_t) + corenet_udp_bind_generic_node(krb5kdc_t) +- +-corenet_sendrecv_kerberos_server_packets(krb5kdc_t) + corenet_tcp_bind_kerberos_port(krb5kdc_t) + corenet_udp_bind_kerberos_port(krb5kdc_t) +-corenet_tcp_sendrecv_kerberos_port(krb5kdc_t) +-corenet_udp_sendrecv_kerberos_port(krb5kdc_t) +- +-corenet_sendrecv_ocsp_client_packets(krb5kdc_t) + corenet_tcp_connect_ocsp_port(krb5kdc_t) +-corenet_tcp_sendrecv_ocsp_port(krb5kdc_t) ++corenet_sendrecv_kerberos_server_packets(krb5kdc_t) ++corenet_sendrecv_ocsp_client_packets(krb5kdc_t) + + dev_read_sysfs(krb5kdc_t) ++dev_read_urand(krb5kdc_t) + + fs_getattr_all_fs(krb5kdc_t) + fs_search_auto_mountpoints(krb5kdc_t) ++fs_rw_anon_inodefs_files(krb5kdc_t) + + domain_use_interactive_fds(krb5kdc_t) + +-files_read_etc_files(krb5kdc_t) + files_read_usr_symlinks(krb5kdc_t) + files_read_var_files(krb5kdc_t) + + selinux_validate_context(krb5kdc_t) + ++auth_use_nsswitch(krb5kdc_t) ++ + logging_send_syslog_msg(krb5kdc_t) + + miscfiles_read_generic_certs(krb5kdc_t) +-miscfiles_read_localization(krb5kdc_t) + + seutil_read_file_contexts(krb5kdc_t) + ++sysnet_read_config(krb5kdc_t) + sysnet_use_ldap(krb5kdc_t) + + userdom_dontaudit_use_unpriv_user_fds(krb5kdc_t) + userdom_dontaudit_search_user_home_dirs(krb5kdc_t) + ++optional_policy(` ++ ipa_stream_connect_otpd(krb5kdc_t) ++') ++ + optional_policy(` + ldap_stream_connect(krb5kdc_t) + ') + ++optional_policy(` ++ dirsrv_stream_connect(krb5kdc_t) ++') ++ + optional_policy(` + nis_use_ypbind(krb5kdc_t) + ') + + optional_policy(` +- sssd_read_public_files(krb5kdc_t) ++ realmd_read_var_lib(krb5kdc_t) + ') + + optional_policy(` + seutil_sigchld_newrole(krb5kdc_t) + ') + ++optional_policy(` ++ sssd_read_public_files(krb5kdc_t) ++') ++ + optional_policy(` + udev_read_db(krb5kdc_t) + ') +@@ -281,10 +332,12 @@ optional_policy(` + # kpropd local policy + # + ++allow kpropd_t self:capability net_bind_service; + allow kpropd_t self:process setfscreate; +-allow kpropd_t self:fifo_file rw_fifo_file_perms; +-allow kpropd_t self:unix_stream_socket { accept listen }; +-allow kpropd_t self:tcp_socket { accept listen }; ++ ++allow kpropd_t self:fifo_file rw_file_perms; ++allow kpropd_t self:unix_stream_socket create_stream_socket_perms; ++allow kpropd_t self:tcp_socket create_stream_socket_perms; + + allow kpropd_t krb5_host_rcache_t:file manage_file_perms; + +@@ -296,32 +349,35 @@ manage_files_pattern(kpropd_t, krb5kdc_conf_t, krb5kdc_lock_t) + filetrans_pattern(kpropd_t, krb5kdc_conf_t, krb5kdc_lock_t, file) + + manage_files_pattern(kpropd_t, krb5kdc_conf_t, krb5kdc_principal_t) ++allow kpropd_t krb5kdc_principal_t:file map; + + manage_dirs_pattern(kpropd_t, krb5kdc_tmp_t, krb5kdc_tmp_t) + manage_files_pattern(kpropd_t, krb5kdc_tmp_t, krb5kdc_tmp_t) + files_tmp_filetrans(kpropd_t, krb5kdc_tmp_t, { file dir }) + ++kernel_read_system_state(kpropd_t) ++kernel_read_network_state(kpropd_t) ++ ++can_exec(kpropd_t,kpropd_exec_t) ++ + corecmd_exec_bin(kpropd_t) + +-corenet_all_recvfrom_unlabeled(kpropd_t) + corenet_tcp_sendrecv_generic_if(kpropd_t) + corenet_tcp_sendrecv_generic_node(kpropd_t) ++corenet_tcp_sendrecv_all_ports(kpropd_t) + corenet_tcp_bind_generic_node(kpropd_t) +- +-corenet_sendrecv_kprop_server_packets(kpropd_t) + corenet_tcp_bind_kprop_port(kpropd_t) +-corenet_tcp_sendrecv_kprop_port(kpropd_t) ++corenet_tcp_connect_kprop_port(kpropd_t) + + dev_read_urand(kpropd_t) + +-files_read_etc_files(kpropd_t) + files_search_tmp(kpropd_t) + + selinux_validate_context(kpropd_t) + +-logging_send_syslog_msg(kpropd_t) ++auth_use_nsswitch(kpropd_t) + +-miscfiles_read_localization(kpropd_t) ++logging_send_syslog_msg(kpropd_t) + + seutil_read_file_contexts(kpropd_t) + +diff --git a/kerneloops.if b/kerneloops.if +index 714448f8d9..fa0c994e50 100644 +--- a/kerneloops.if ++++ b/kerneloops.if +@@ -101,13 +101,16 @@ interface(`kerneloops_manage_tmp_files',` + # + interface(`kerneloops_admin',` + gen_require(` +- type kerneloops_t, kerneloops_initrc_exec_t; +- type kerneloops_tmp_t; ++ type kerneloops_t, kerneloops_initrc_exec_t, kerneloops_tmp_t; + ') + +- allow $1 kerneloops_t:process { ptrace signal_perms }; ++ allow $1 kerneloops_t:process signal_perms; + ps_process_pattern($1, kerneloops_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 kerneloops_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, kerneloops_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 kerneloops_initrc_exec_t system_r; +diff --git a/kerneloops.te b/kerneloops.te +index bcdb29599b..f6e3736dd3 100644 +--- a/kerneloops.te ++++ b/kerneloops.te +@@ -31,7 +31,6 @@ kernel_read_ring_buffer(kerneloops_t) + + domain_use_interactive_fds(kerneloops_t) + +-corenet_all_recvfrom_unlabeled(kerneloops_t) + corenet_all_recvfrom_netlabel(kerneloops_t) + corenet_tcp_sendrecv_generic_if(kerneloops_t) + corenet_tcp_sendrecv_generic_node(kerneloops_t) +@@ -45,8 +44,6 @@ auth_use_nsswitch(kerneloops_t) + logging_send_syslog_msg(kerneloops_t) + logging_read_generic_logs(kerneloops_t) + +-miscfiles_read_localization(kerneloops_t) +- + optional_policy(` + dbus_system_domain(kerneloops_t, kerneloops_exec_t) + ') +diff --git a/keyboardd.if b/keyboardd.if +index 8982b9106c..6134ef2584 100644 +--- a/keyboardd.if ++++ b/keyboardd.if +@@ -1,19 +1,39 @@ +-## Xorg.conf keyboard layout callout. + +-###################################### ++## policy for system-setup-keyboard daemon ++ ++######################################## + ## +-## Read keyboardd unnamed pipes. ++## Execute a domain transition to run keyboard setup daemon. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # +-interface(`keyboardd_read_pipes',` ++interface(`keyboardd_domtrans',` + gen_require(` +- type keyboardd_t; ++ type keyboardd_t, keyboardd_exec_t; ++ ') ++ ++ domtrans_pattern($1, keyboardd_exec_t, keyboardd_t) ++') ++ ++###################################### ++## ++## Allow attempts to read to ++## keyboardd unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keyboardd_read_pipes',` ++ gen_require(` ++ type keyboardd_t; + ') + +- allow $1 keyboardd_t:fifo_file read_fifo_file_perms; ++ allow $1 keyboardd_t:fifo_file read_fifo_file_perms; + ') +diff --git a/keyboardd.te b/keyboardd.te +index 628b78b4b8..fe656175e2 100644 +--- a/keyboardd.te ++++ b/keyboardd.te +@@ -19,6 +19,3 @@ allow keyboardd_t self:unix_stream_socket create_stream_socket_perms; + + files_manage_etc_runtime_files(keyboardd_t) + files_etc_filetrans_etc_runtime(keyboardd_t, file) +-files_read_etc_files(keyboardd_t) +- +-miscfiles_read_localization(keyboardd_t) +diff --git a/keystone.fc b/keystone.fc +index b273d803c2..6b2b50d699 100644 +--- a/keystone.fc ++++ b/keystone.fc +@@ -1,7 +1,13 @@ ++/usr/lib/systemd/system/openstack-keystone.* -- gen_context(system_u:object_r:keystone_unit_file_t,s0) ++ + /etc/rc\.d/init\.d/openstack-keystone -- gen_context(system_u:object_r:keystone_initrc_exec_t,s0) + + /usr/bin/keystone-all -- gen_context(system_u:object_r:keystone_exec_t,s0) + ++/var/www/cgi-bin/keystone(/.*)? gen_context(system_u:object_r:keystone_cgi_script_exec_t,s0) ++ + /var/lib/keystone(/.*)? gen_context(system_u:object_r:keystone_var_lib_t,s0) + + /var/log/keystone(/.*)? gen_context(system_u:object_r:keystone_log_t,s0) ++ ++/var/run/keystone(/.*)? gen_context(system_u:object_r:keystone_var_run_t,s0) +diff --git a/keystone.if b/keystone.if +index e88fb16e06..ec6121a5c8 100644 +--- a/keystone.if ++++ b/keystone.if +@@ -1,42 +1,219 @@ +-## Python implementation of the OpenStack identity service API. ++ ++## policy for keystone + + ######################################## + ## +-## All of the rules required to +-## administrate an keystone environment. ++## Transition to keystone. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`keystone_domtrans',` ++ gen_require(` ++ type keystone_t, keystone_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, keystone_exec_t, keystone_t) ++') ++######################################## ++## ++## Read keystone's log files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## ++# ++interface(`keystone_read_log',` ++ gen_require(` ++ type keystone_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, keystone_log_t, keystone_log_t) ++') ++ ++######################################## ++## ++## Append to keystone log files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_append_log',` ++ gen_require(` ++ type keystone_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, keystone_log_t, keystone_log_t) ++') ++ ++######################################## ++## ++## Manage keystone log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_manage_log',` ++ gen_require(` ++ type keystone_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, keystone_log_t, keystone_log_t) ++ manage_files_pattern($1, keystone_log_t, keystone_log_t) ++ manage_lnk_files_pattern($1, keystone_log_t, keystone_log_t) ++') ++ ++######################################## ++## ++## Search keystone lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_search_lib',` ++ gen_require(` ++ type keystone_var_lib_t; ++ ') ++ ++ allow $1 keystone_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read keystone lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_read_lib_files',` ++ gen_require(` ++ type keystone_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, keystone_var_lib_t, keystone_var_lib_t) ++') ++ ++######################################## ++## ++## Manage keystone lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_manage_lib_files',` ++ gen_require(` ++ type keystone_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, keystone_var_lib_t, keystone_var_lib_t) ++') ++ ++######################################## ++## ++## Manage keystone lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`keystone_manage_lib_dirs',` ++ gen_require(` ++ type keystone_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, keystone_var_lib_t, keystone_var_lib_t) ++') ++ ++######################################## ++## ++## Execute keystone server in the keystone domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`keystone_systemctl',` ++ gen_require(` ++ type keystone_t; ++ type keystone_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 keystone_unit_file_t:file read_file_perms; ++ allow $1 keystone_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, keystone_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an keystone environment ++## ++## ++## ++## Domain allowed access. + ## + ## +-## + # + interface(`keystone_admin',` + gen_require(` +- type keystone_t, keystone_initrc_exec_t, keystone_log_t; +- type keystone_var_lib_t, keystone_tmp_t; ++ type keystone_t; ++ type keystone_log_t; ++ type keystone_var_lib_t; ++ type keystone_unit_file_t; + ') + + allow $1 keystone_t:process { ptrace signal_perms }; + ps_process_pattern($1, keystone_t) + +- init_labeled_script_domtrans($1, keystone_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 keystone_initrc_exec_t system_r; +- allow $2 system_r; +- + logging_search_logs($1) + admin_pattern($1, keystone_log_t) + + files_search_var_lib($1) + admin_pattern($1, keystone_var_lib_t) + +- files_search_tmp($1) +- admin_pattern($1, keystone_tmp_t) ++ keystone_systemctl($1) ++ admin_pattern($1, keystone_unit_file_t) ++ allow $1 keystone_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/keystone.te b/keystone.te +index 9929647749..c573d0ed53 100644 +--- a/keystone.te ++++ b/keystone.te +@@ -18,13 +18,20 @@ logging_log_file(keystone_log_t) + type keystone_var_lib_t; + files_type(keystone_var_lib_t) + ++type keystone_var_run_t; ++files_pid_file(keystone_var_run_t) ++ + type keystone_tmp_t; + files_tmp_file(keystone_tmp_t) + ++type keystone_unit_file_t; ++systemd_unit_file(keystone_unit_file_t) ++ + ######################################## + # + # Local policy + # ++allow keystone_t self:process { getsched setsched signal }; + + allow keystone_t self:fifo_file rw_fifo_file_perms; + allow keystone_t self:unix_stream_socket { accept listen }; +@@ -45,6 +52,10 @@ manage_dirs_pattern(keystone_t, keystone_var_lib_t, keystone_var_lib_t) + manage_files_pattern(keystone_t, keystone_var_lib_t, keystone_var_lib_t) + files_var_lib_filetrans(keystone_t, keystone_var_lib_t, dir) + ++manage_dirs_pattern(keystone_t, keystone_var_run_t, keystone_var_run_t) ++manage_files_pattern(keystone_t, keystone_var_run_t, keystone_var_run_t) ++files_pid_filetrans(keystone_t, keystone_var_run_t, { dir }) ++ + can_exec(keystone_t, keystone_tmp_t) + + kernel_read_system_state(keystone_t) +@@ -57,20 +68,53 @@ corenet_all_recvfrom_netlabel(keystone_t) + corenet_tcp_sendrecv_generic_if(keystone_t) + corenet_tcp_sendrecv_generic_node(keystone_t) + corenet_tcp_bind_generic_node(keystone_t) ++corenet_tcp_connect_mysqld_port(keystone_t) ++corenet_tcp_connect_ldap_port(keystone_t) ++corenet_tcp_connect_keystone_port(keystone_t) ++corenet_tcp_connect_amqp_port(keystone_t) ++corenet_tcp_connect_osapi_compute_port(keystone_t) + + corenet_sendrecv_commplex_main_server_packets(keystone_t) + corenet_tcp_bind_commplex_main_port(keystone_t) + corenet_tcp_sendrecv_commplex_main_port(keystone_t) + +-files_read_usr_files(keystone_t) ++corenet_tcp_bind_keystone_port(keystone_t) + + auth_use_pam(keystone_t) + + libs_exec_ldconfig(keystone_t) + +-miscfiles_read_localization(keystone_t) ++optional_policy(` ++ ldap_stream_connect(keystone_t) ++') + + optional_policy(` + mysql_stream_connect(keystone_t) + mysql_tcp_connect(keystone_t) ++ mysql_read_db_lnk_files(keystone_t) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(keystone_t) ++') ++ ++optional_policy(` ++ rpm_exec(keystone_t) ++') ++ ++####################################### ++# ++# Cgi local policy ++# ++ ++optional_policy(` ++ apache_content_template(keystone_cgi) ++ apache_content_alias_template(keystone_cgi, keystone_cgi) ++ ++ getattr_dirs_pattern(keystone_cgi_script_t, keystone_var_lib_t, keystone_var_lib_t) ++ ++ read_files_pattern(keystone_cgi_script_t, keystone_log_t, keystone_log_t) ++ ++ corenet_tcp_bind_commplex_main_port(keystone_cgi_script_t) ++ corenet_tcp_sendrecv_commplex_main_port(keystone_cgi_script_t) + ') +diff --git a/kismet.if b/kismet.if +index aa2a3379be..7ff229f325 100644 +--- a/kismet.if ++++ b/kismet.if +@@ -283,7 +283,7 @@ interface(`kismet_manage_log',` + interface(`kismet_admin',` + gen_require(` + type kismet_t, kismet_var_lib_t, kismet_var_run_t; +- type kismet_log_t, kismet_tmp_t; ++ type kismet_log_t, kismet_tmp_t, kismet_initrc_exec_t; + ') + + init_labeled_script_domtrans($1, kismet_initrc_exec_t) +@@ -292,7 +292,11 @@ interface(`kismet_admin',` + allow $2 system_r; + + ps_process_pattern($1, kismet_t) +- allow $1 kismet_t:process { ptrace signal_perms }; ++ allow $1 kismet_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 kismet_t:process ptrace; ++ ') + + files_search_var_lib($1) + admin_pattern($1, kismet_var_lib_t) +diff --git a/kismet.te b/kismet.te +index 8ad0d4d507..01e5037909 100644 +--- a/kismet.te ++++ b/kismet.te +@@ -38,7 +38,7 @@ files_pid_file(kismet_var_run_t) + # Local policy + # + +-allow kismet_t self:capability { dac_override kill net_admin net_raw setuid setgid }; ++allow kismet_t self:capability { dac_read_search dac_override kill net_admin net_raw setuid setgid }; + allow kismet_t self:process signal_perms; + allow kismet_t self:fifo_file rw_fifo_file_perms; + allow kismet_t self:packet_socket create_socket_perms; +@@ -81,25 +81,22 @@ kernel_read_network_state(kismet_t) + + corecmd_exec_bin(kismet_t) + +-corenet_all_recvfrom_unlabeled(kismet_t) + corenet_all_recvfrom_netlabel(kismet_t) + corenet_tcp_sendrecv_generic_if(kismet_t) + corenet_tcp_sendrecv_generic_node(kismet_t) + corenet_tcp_bind_generic_node(kismet_t) + +-corenet_sendrecv_kismet_server_packets(kismet_t) +-corenet_tcp_bind_kismet_port(kismet_t) +-corenet_sendrecv_kismet_client_packets(kismet_t) +-corenet_tcp_connect_kismet_port(kismet_t) +-corenet_tcp_sendrecv_kismet_port(kismet_t) ++corenet_tcp_connect_pulseaudio_port(kismet_t) + +-auth_use_nsswitch(kismet_t) +- +-files_read_usr_files(kismet_t) ++corenet_sendrecv_rtsclient_server_packets(kismet_t) ++corenet_tcp_bind_rtsclient_port(kismet_t) ++corenet_sendrecv_rtsclient_client_packets(kismet_t) ++corenet_tcp_connect_rtsclient_port(kismet_t) + +-miscfiles_read_localization(kismet_t) ++auth_use_nsswitch(kismet_t) + +-userdom_use_user_terminals(kismet_t) ++userdom_use_inherited_user_terminals(kismet_t) ++userdom_read_user_tmp_files(kismet_t) + + optional_policy(` + dbus_system_bus_client(kismet_t) +diff --git a/kmscon.fc b/kmscon.fc +new file mode 100644 +index 0000000000..ccd29c0791 +--- /dev/null ++++ b/kmscon.fc +@@ -0,0 +1,3 @@ ++/usr/bin/kmscon -- gen_context(system_u:object_r:kmscon_exec_t,s0) ++/usr/lib/systemd/system/kmscon.*\.* -- gen_context(system_u:object_r:kmscon_unit_file_t,s0) ++/etc/kmscon(/.*)? gen_context(system_u:object_r:kmscon_conf_t,s0) +diff --git a/kmscon.if b/kmscon.if +new file mode 100644 +index 0000000000..b9347faa95 +--- /dev/null ++++ b/kmscon.if +@@ -0,0 +1,25 @@ ++## Terminal emulator for Linux graphical console ++ ++######################################## ++## ++## Execute kmscon in the kmscon domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`kmscon_systemctl',` ++ gen_require(` ++ type kmscon_unit_file_t; ++ type kmscon_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 kmscon_unit_file_t:file read_file_perms; ++ allow $1 kmscon_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, kmscon_t) ++') +diff --git a/kmscon.te b/kmscon.te +new file mode 100644 +index 0000000000..32a9e13562 +--- /dev/null ++++ b/kmscon.te +@@ -0,0 +1,88 @@ ++# KMSCon SELinux policy module ++# Contributed by Lubomir Rintel ++ ++######################################## ++# ++# Declarations ++# ++policy_module(kmscon, 1.0) ++ ++type kmscon_t; ++type kmscon_exec_t; ++init_daemon_domain(kmscon_t, kmscon_exec_t) ++ ++type kmscon_conf_t; ++files_config_file(kmscon_conf_t) ++ ++type kmscon_unit_file_t; ++systemd_unit_file(kmscon_unit_file_t) ++ ++type kmscon_devpts_t; ++term_pty(kmscon_devpts_t) ++# Label this as t, so that login_t can read our terminal with use_all_ttys() ++term_tty(kmscon_devpts_t) ++ ++######################################## ++# ++# zoneminder local policy ++# ++ ++# Switch the VT into a graphics mode ; Set DRM master ++allow kmscon_t self:capability {sys_admin sys_tty_config}; ++ ++dontaudit kmscon_t self:capability2 block_suspend; ++ ++# Create an udev monitor ++allow kmscon_t self:netlink_kobject_uevent_socket { bind create setopt getattr }; ++ ++allow kmscon_t kmscon_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms }; ++term_create_pty(kmscon_t, kmscon_devpts_t) ++ ++list_dirs_pattern(kmscon_t, kmscon_conf_t, kmscon_conf_t) ++read_files_pattern(kmscon_t, kmscon_conf_t, kmscon_conf_t) ++ ++kernel_read_system_state(kmscon_t) ++ ++auth_read_passwd(kmscon_t) ++ ++dev_rw_dri(kmscon_t) ++dev_read_sysfs(kmscon_t) ++dev_read_framebuffer(kmscon_t) ++dev_write_framebuffer(kmscon_t) ++dev_rw_input_dev(kmscon_t) ++ ++# Get allowed path length for directory with modules ++fs_getattr_xattr_fs(kmscon_t) ++ ++locallogin_domtrans(kmscon_t) ++ ++miscfiles_read_fonts(kmscon_t) ++miscfiles_manage_fonts_cache(kmscon_t) ++ ++# Open the tty, so that it can be handed over to the seat manager ++term_use_unallocated_ttys(kmscon_t) ++ ++optional_policy(` ++ # Learn about the input devices ++ udev_read_db(kmscon_t) ++') ++ ++optional_policy(` ++ # Fontconfig and Pango configuration ++ gnome_read_home_config(kmscon_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(kmscon_t) ++ init_dbus_chat(kmscon_t) ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(kmscon_t) ++ ++ # List seats ++ systemd_login_list_pid_dirs(kmscon_t) ++ systemd_login_read_pid_files(kmscon_t) ++ ++ kmscon_systemctl(systemd_logind_t) ++ ') ++') +diff --git a/kpatch.fc b/kpatch.fc +new file mode 100644 +index 0000000000..43aaa8a789 +--- /dev/null ++++ b/kpatch.fc +@@ -0,0 +1,3 @@ ++/usr/sbin/kpatch -- gen_context(system_u:object_r:kpatch_exec_t,s0) ++ ++/var/lib/kpatch(/.*)? gen_context(system_u:object_r:kpatch_var_lib_t,s0) +diff --git a/kpatch.if b/kpatch.if +new file mode 100644 +index 0000000000..7ca0e4c87a +--- /dev/null ++++ b/kpatch.if +@@ -0,0 +1,75 @@ ++## Policy for kpatch ++ ++######################################## ++## ++## Transition to kpatch. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`kpatch_domtrans',` ++ gen_require(` ++ type kpatch_t, kpatch_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, kpatch_exec_t, kpatch_t) ++ dontaudit kpatch_t $1:unix_stream_socket { getattr read write }; ++') ++ ++######################################## ++## ++## NNP Transition to kpatch. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`kpatch_nnp_domtrans',` ++ gen_require(` ++ type kpatch_t; ++ ') ++ ++ allow $1 kpatch_t:process2 { nnp_transition nosuid_transition }; ++ ++') ++ ++######################################## ++## ++## Execute kpatch in the kpatch domain, and ++## allow the specified role the kpatch domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the kpatch domain. ++## ++## ++# ++interface(`kpatch_run',` ++ gen_require(` ++ type kpatch_t; ++ ') ++ ++ kpatch_domtrans($1) ++ kpatch_nnp_domtrans($1) ++ role $2 types kpatch_t; ++ ++ allow $1 kpatch_t:process signal_perms; ++ ++ dontaudit kpatch_t $1:dir list_dir_perms; ++ dontaudit kpatch_t $1:file read_file_perms; ++ dontaudit kpatch_t $1:unix_stream_socket rw_socket_perms; ++ ++ allow kpatch_t $1:shm create_shm_perms; ++ allow kpatch_t $1:sem create_sem_perms; ++') +diff --git a/kpatch.te b/kpatch.te +new file mode 100644 +index 0000000000..9209849272 +--- /dev/null ++++ b/kpatch.te +@@ -0,0 +1,40 @@ ++policy_module(kpatch, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type kpatch_t; ++type kpatch_exec_t; ++application_domain(kpatch_t, kpatch_exec_t) ++init_daemon_domain(kpatch_t, kpatch_exec_t) ++ ++type kpatch_var_lib_t; ++files_type(kpatch_var_lib_t) ++ ++######################################## ++# ++# kpatch local policy ++# ++ ++manage_dirs_pattern(kpatch_t, kpatch_var_lib_t, kpatch_var_lib_t) ++manage_files_pattern(kpatch_t, kpatch_var_lib_t, kpatch_var_lib_t) ++files_var_lib_filetrans(kpatch_t, kpatch_var_lib_t, { dir file }) ++allow kpatch_t kpatch_var_lib_t:system module_load; ++ ++auth_use_nsswitch(kpatch_t) ++ ++corecmd_exec_bin(kpatch_t) ++corecmd_mmap_bin_files(kpatch_t) ++ ++dev_list_sysfs(kpatch_t) ++ ++optional_policy(` ++ policykit_dbus_chat(kpatch_t) ++') ++ ++optional_policy(` ++ unconfined_domain(kpatch_t) ++') ++ +diff --git a/ksmtuned.fc b/ksmtuned.fc +index e736c450c0..4b1e1e4536 100644 +--- a/ksmtuned.fc ++++ b/ksmtuned.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/ksmtuned -- gen_context(system_u:object_r:ksmtuned_initrc_exec_t,s0) + ++/usr/lib/systemd/system/ksmtuned.* -- gen_context(system_u:object_r:ksmtuned_unit_file_t,s0) ++ + /usr/sbin/ksmtuned -- gen_context(system_u:object_r:ksmtuned_exec_t,s0) + + /var/log/ksmtuned.* gen_context(system_u:object_r:ksmtuned_log_t,s0) +diff --git a/ksmtuned.if b/ksmtuned.if +index 93a64bc506..af6d741d6b 100644 +--- a/ksmtuned.if ++++ b/ksmtuned.if +@@ -38,6 +38,30 @@ interface(`ksmtuned_initrc_domtrans',` + init_labeled_script_domtrans($1, ksmtuned_initrc_exec_t) + ') + ++####################################### ++## ++## Execute ksmtuned server in the ksmtunedd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ksmtuned_systemctl',` ++ gen_require(` ++ type ksmtuned_unit_file_t; ++ type ksmtuned_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 ksmtuned_unit_file_t:file read_file_perms; ++ allow $1 ksmtuned_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ksmtuned_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -48,30 +72,28 @@ interface(`ksmtuned_initrc_domtrans',` + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## + ## + # + interface(`ksmtuned_admin',` + gen_require(` +- type ksmtuned_t, ksmtuned_var_run_t; +- type ksmtuned_initrc_exec_t, ksmtuned_log_t; ++ type ksmtuned_t, ksmtuned_var_run_t, ksmtuned_initrc_exec_t, ksmtuned_unit_file_t; ++ type ksmtuned_log_t; + ') + +- ksmtuned_initrc_domtrans($1) +- domain_system_change_exemption($1) +- role_transition $2 ksmtuned_initrc_exec_t system_r; +- allow $2 system_r; +- +- allow $1 ksmtuned_t:process { ptrace signal_perms }; ++ allow $1 ksmtuned_t:process signal_perms; + ps_process_pattern($1, ksmtuned_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ksmtuned_t:process ptrace; ++ ') ++ + files_list_pids($1) + admin_pattern($1, ksmtuned_var_run_t) + + logging_search_logs($1) + admin_pattern($1, ksmtuned_log_t) ++ ++ ksmtuned_systemctl($1) ++ admin_pattern($1, ksmtuned_unit_file_t) ++ allow $1 ksmtuned_unit_file_t:service all_service_perms; + ') +diff --git a/ksmtuned.te b/ksmtuned.te +index 8eef134acd..9636a5343c 100644 +--- a/ksmtuned.te ++++ b/ksmtuned.te +@@ -5,10 +5,27 @@ policy_module(ksmtuned, 1.1.1) + # Declarations + # + ++## ++##

      ++## Allow ksmtuned to use nfs file systems ++##

      ++##
      ++gen_tunable(ksmtuned_use_nfs, false) ++ ++## ++##

      ++## Allow ksmtuned to use cifs/Samba file systems ++##

      ++##
      ++gen_tunable(ksmtuned_use_cifs, false) ++ + type ksmtuned_t; + type ksmtuned_exec_t; + init_daemon_domain(ksmtuned_t, ksmtuned_exec_t) + ++type ksmtuned_unit_file_t; ++systemd_unit_file(ksmtuned_unit_file_t) ++ + type ksmtuned_initrc_exec_t; + init_script_file(ksmtuned_initrc_exec_t) + +@@ -40,9 +57,10 @@ kernel_read_system_state(ksmtuned_t) + corecmd_exec_bin(ksmtuned_t) + corecmd_exec_shell(ksmtuned_t) + +-dev_rw_sysfs(ksmtuned_t) ++dev_manage_sysfs(ksmtuned_t) + + domain_read_all_domains_state(ksmtuned_t) ++domain_dontaudit_read_all_domains_state(ksmtuned_t) + + mls_file_read_to_clearance(ksmtuned_t) + +@@ -52,4 +70,11 @@ auth_use_nsswitch(ksmtuned_t) + + logging_send_syslog_msg(ksmtuned_t) + +-miscfiles_read_localization(ksmtuned_t) ++tunable_policy(`ksmtuned_use_nfs',` ++ fs_read_nfs_files(ksmtuned_t) ++') ++ ++tunable_policy(`ksmtuned_use_cifs',` ++ fs_read_cifs_files(ksmtuned_t) ++ samba_read_share_files(ksmtuned_t) ++') +diff --git a/ktalk.fc b/ktalk.fc +index 38ecb07d15..451067ebdf 100644 +--- a/ktalk.fc ++++ b/ktalk.fc +@@ -1,3 +1,5 @@ ++/usr/lib/systemd/system/ntalk.* -- gen_context(system_u:object_r:ktalkd_unit_file_t,s0) ++ + /usr/bin/ktalkd -- gen_context(system_u:object_r:ktalkd_exec_t,s0) + + /usr/sbin/in\.talkd -- gen_context(system_u:object_r:ktalkd_exec_t,s0) +diff --git a/ktalk.if b/ktalk.if +index 19777b8062..cd721fd6b6 100644 +--- a/ktalk.if ++++ b/ktalk.if +@@ -1 +1,77 @@ +-## KDE Talk daemon. ++ ++## talk-server - daemon programs for the Internet talk ++ ++######################################## ++## ++## Execute TEMPLATE in the ktalkd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ktalk_domtrans',` ++ gen_require(` ++ type ktalkd_t, ktalkd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ktalkd_exec_t, ktalkd_t) ++') ++######################################## ++## ++## Execute ktalkd server in the ktalkd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ktalk_systemctl',` ++ gen_require(` ++ type ktalkd_t; ++ type ktalkd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 ktalkd_unit_file_t:file read_file_perms; ++ allow $1 ktalkd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ktalkd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ktalkd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`ktalk_admin',` ++ gen_require(` ++ type ktalkd_t; ++ type ktalkd_unit_file_t; ++ ') ++ ++ allow $1 ktalkd_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, ktalkd_t) ++ ++ ktalk_systemctl($1) ++ admin_pattern($1, ktalkd_unit_file_t) ++ allow $1 ktalkd_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/ktalk.te b/ktalk.te +index c5548c5edc..1356fcbd27 100644 +--- a/ktalk.te ++++ b/ktalk.te +@@ -13,6 +13,9 @@ inetd_udp_service_domain(ktalkd_t, ktalkd_exec_t) + type ktalkd_log_t; + logging_log_file(ktalkd_log_t) + ++type ktalkd_unit_file_t; ++systemd_unit_file(ktalkd_unit_file_t) ++ + type ktalkd_tmp_t; + files_tmp_file(ktalkd_tmp_t) + +@@ -50,7 +53,8 @@ dev_read_urand(ktalkd_t) + + fs_getattr_xattr_fs(ktalkd_t) + +-term_use_all_terms(ktalkd_t) ++term_search_ptys(ktalkd_t) ++term_use_all_inherited_terms(ktalkd_t) + + auth_use_nsswitch(ktalkd_t) + +@@ -58,4 +62,5 @@ init_read_utmp(ktalkd_t) + + logging_send_syslog_msg(ktalkd_t) + +-miscfiles_read_localization(ktalkd_t) ++userdom_use_user_ptys(ktalkd_t) ++userdom_use_user_ttys(ktalkd_t) +diff --git a/kubernetes.fc b/kubernetes.fc +new file mode 100644 +index 0000000000..6ab641c51e +--- /dev/null ++++ b/kubernetes.fc +@@ -0,0 +1,13 @@ ++/usr/lib/systemd/system/kubelet.* -- gen_context(system_u:object_r:kubelet_unit_file_t,s0) ++/usr/lib/systemd/system/kube-apiserver.* -- gen_context(system_u:object_r:kube_apiserver_unit_file_t,s0) ++/usr/lib/systemd/system/kube-controller-manager.* -- gen_context(system_u:object_r:kube_controller_manager_unit_file_t,s0) ++/usr/lib/systemd/system/kube-proxy.* -- gen_context(system_u:object_r:kube_proxy_unit_file_t,s0) ++ ++/usr/bin/kubelet -- gen_context(system_u:object_r:kubelet_exec_t,s0) ++/usr/bin/kube-apiserver -- gen_context(system_u:object_r:kube_apiserver_exec_t,s0) ++/usr/bin/kube-controller-manager -- gen_context(system_u:object_r:kube_controller_manager_exec_t,s0) ++/usr/bin/kube-proxy -- gen_context(system_u:object_r:kube_proxy_exec_t,s0) ++ ++/var/lib/kubelet(/.*)? gen_context(system_u:object_r:kubelet_var_lib_t,s0) ++ ++ +diff --git a/kubernetes.if b/kubernetes.if +new file mode 100644 +index 0000000000..b2841e526f +--- /dev/null ++++ b/kubernetes.if +@@ -0,0 +1,87 @@ ++## SELinux policy for Kubernetes container management ++ ++###################################### ++## ++## Creates types and rules for a basic ++## kube init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`kubernetes_domain_template',` ++ gen_require(` ++ attribute kubernetes_domain; ++ ') ++ ++ ############################## ++ # ++ # $1_t declarations ++ # ++ ++ type $1_t, kubernetes_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ type $1_unit_file_t; ++ systemd_unit_file($1_unit_file_t) ++') ++ ++######################################## ++## ++## Search kubernetes lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kubernetes_search_lib_kubelet',` ++ gen_require(` ++ type kubelet_var_lib_t; ++ ') ++ ++ allow $1 kubelet_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read kubernetes lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kubernetes_read_lib_files_kubelet',` ++ gen_require(` ++ type kubelet_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, kubelet_var_lib_t, kubelet_var_lib_t) ++') ++ ++######################################## ++## ++## Manage kubernetes lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`kubernetes_manage_lib_files_kubelet',` ++ gen_require(` ++ type kubelet_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, kubelet_var_lib_t, kubelet_var_lib_t) ++') +diff --git a/kubernetes.te b/kubernetes.te +new file mode 100644 +index 0000000000..b625b5343a +--- /dev/null ++++ b/kubernetes.te +@@ -0,0 +1,76 @@ ++policy_module(kubernetes, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute kubernetes_domain; ++ ++kubernetes_domain_template(kube_apiserver) ++kubernetes_domain_template(kube_controller_manager) ++kubernetes_domain_template(kube_proxy) ++kubernetes_domain_template(kubelet) ++ ++permissive kube_apiserver_t; ++permissive kube_controller_manager_t; ++permissive kube_proxy_t; ++permissive kubelet_t; ++ ++type kubelet_var_lib_t; ++files_type(kubelet_var_lib_t) ++ ++######################################## ++# ++# kubernetes domain local policy ++# ++ ++# this is kernel bug which is going to be fixed ++# needs to be removed then ++dontaudit kubernetes_domain self:capability2 block_suspend; ++ ++allow kubernetes_domain self:tcp_socket create_stream_socket_perms; ++ ++kernel_read_unix_sysctls(kubernetes_domain) ++kernel_read_net_sysctls(kubernetes_domain) ++ ++auth_read_passwd(kubernetes_domain) ++ ++corenet_tcp_bind_generic_node(kubernetes_domain) ++ ++corenet_tcp_connect_http_cache_port(kubernetes_domain) ++corenet_tcp_connect_kubernetes_port(kubernetes_domain) ++ ++######################################## ++# ++# kubelet local policy ++# ++ ++allow kubelet_t self:capability net_admin; ++ ++manage_dirs_pattern(kubelet_t, kubelet_var_lib_t, kubelet_var_lib_t) ++manage_files_pattern(kubelet_t, kubelet_var_lib_t, kubelet_var_lib_t) ++manage_lnk_files_pattern(kubelet_t, kubelet_var_lib_t, kubelet_var_lib_t) ++files_var_lib_filetrans(kubelet_t, kubelet_var_lib_t, dir) ++ ++corenet_tcp_bind_kubernetes_port(kubelet_t) ++ ++######################################## ++# ++# kube_controller local policy ++# ++ ++ ++######################################## ++# ++# kube_apiserver local policy ++# ++ ++corenet_tcp_bind_http_cache_port(kube_apiserver_t) ++ ++######################################## ++# ++# kube_proxy local policy ++# ++ ++allow kube_proxy_t self:capability net_admin; +diff --git a/kudzu.if b/kudzu.if +index 52970645ff..6ba8108342 100644 +--- a/kudzu.if ++++ b/kudzu.if +@@ -86,9 +86,13 @@ interface(`kudzu_admin',` + type kudzu_tmp_t; + ') + +- allow $1 kudzu_t:process { ptrace signal_perms }; ++ allow $1 kudzu_t:process { signal_perms }; + ps_process_pattern($1, kudzu_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 kudzu_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, kudzu_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 kudzu_initrc_exec_t system_r; +diff --git a/kudzu.te b/kudzu.te +index 16640364be..ee7a9a1d55 100644 +--- a/kudzu.te ++++ b/kudzu.te +@@ -26,7 +26,7 @@ files_pid_file(kudzu_var_run_t) + # Local policy + # + +-allow kudzu_t self:capability { dac_override sys_admin sys_rawio net_admin sys_tty_config mknod }; ++allow kudzu_t self:capability { dac_read_search dac_override sys_admin sys_rawio net_admin sys_tty_config mknod }; + dontaudit kudzu_t self:capability sys_tty_config; + allow kudzu_t self:process { signal_perms execmem }; + allow kudzu_t self:fifo_file rw_fifo_file_perms; +@@ -47,7 +47,7 @@ kernel_read_device_sysctls(kudzu_t) + kernel_read_kernel_sysctls(kudzu_t) + kernel_read_network_state(kudzu_t) + kernel_read_system_state(kudzu_t) +-kernel_rw_hotplug_sysctls(kudzu_t) ++kernel_rw_usermodehelper_state(kudzu_t) + kernel_rw_kernel_sysctl(kudzu_t) + + corecmd_exec_all_executables(kudzu_t) +@@ -63,7 +63,6 @@ dev_rwx_zero(kudzu_t) + domain_use_interactive_fds(kudzu_t) + + files_read_kernel_modules(kudzu_t) +-files_read_usr_files(kudzu_t) + files_search_locks(kudzu_t) + files_manage_etc_files(kudzu_t) + files_manage_etc_runtime_files(kudzu_t) +@@ -101,11 +100,10 @@ libs_read_lib_files(kudzu_t) + logging_send_syslog_msg(kudzu_t) + + miscfiles_read_hwdata(kudzu_t) +-miscfiles_read_localization(kudzu_t) + + sysnet_read_config(kudzu_t) + +-userdom_use_user_terminals(kudzu_t) ++userdom_use_inherited_user_terminals(kudzu_t) + userdom_dontaudit_use_unpriv_user_fds(kudzu_t) + userdom_search_user_home_dirs(kudzu_t) + +@@ -121,10 +119,6 @@ optional_policy(` + modutils_domtrans_insmod(kudzu_t) + ') + +-optional_policy(` +- nscd_use(kudzu_t) +-') +- + optional_policy(` + seutil_sigchld_newrole(kudzu_t) + ') +@@ -132,7 +126,3 @@ optional_policy(` + optional_policy(` + udev_read_db(kudzu_t) + ') +- +-optional_policy(` +- unconfined_domtrans(kudzu_t) +-') +diff --git a/l2tp.fc b/l2tp.fc +index d5d1572b1c..ddc6ef210e 100644 +--- a/l2tp.fc ++++ b/l2tp.fc +@@ -5,7 +5,9 @@ + /etc/sysconfig/.*l2tpd -- gen_context(system_u:object_r:l2tp_conf_t,s0) + + /usr/sbin/.*l2tpd -- gen_context(system_u:object_r:l2tpd_exec_t,s0) ++/usr/libexec/nm-l2tp-service -- gen_context(system_u:object_r:l2tpd_exec_t,s0) + + /var/run/.*l2tpd(/.*)? gen_context(system_u:object_r:l2tpd_var_run_t,s0) + /var/run/prol2tpd\.ctl -s gen_context(system_u:object_r:l2tpd_var_run_t,s0) + /var/run/.*l2tpd\.pid -- gen_context(system_u:object_r:l2tpd_var_run_t,s0) ++/var/run/*.xl2tpd.* -- gen_context(system_u:object_r:l2tpd_var_run_t,s0) +diff --git a/l2tp.if b/l2tp.if +index 73e2803eef..34ca3aa22b 100644 +--- a/l2tp.if ++++ b/l2tp.if +@@ -1,9 +1,45 @@ +-## Layer 2 Tunneling Protocol. ++## Layer 2 Tunneling Protocol daemons. + + ######################################## + ## +-## Send to l2tpd with a unix +-## domain dgram socket. ++## Transition to l2tpd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`l2tpd_domtrans',` ++ gen_require(` ++ type l2tpd_t, l2tpd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, l2tpd_exec_t, l2tpd_t) ++') ++ ++######################################## ++## ++## Execute l2tpd server in the l2tpd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_initrc_domtrans',` ++ gen_require(` ++ type l2tpd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, l2tpd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Send to l2tpd via a unix dgram socket. + ## + ## + ## +@@ -16,7 +52,6 @@ interface(`l2tpd_dgram_send',` + type l2tpd_t, l2tpd_tmp_t, l2tpd_var_run_t; + ') + +- files_search_pids($1) + files_search_tmp($1) + dgram_send_pattern($1, { l2tpd_tmp_t l2tpd_var_run_t }, { l2tpd_tmp_t l2tpd_var_run_t }, l2tpd_t) + ') +@@ -39,10 +74,29 @@ interface(`l2tpd_rw_socket',` + allow $1 l2tpd_t:socket rw_socket_perms; + ') + ++######################################## ++## ++## Read l2tpd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_read_pid_files',` ++ gen_require(` ++ type l2tpd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 l2tpd_var_run_t:file read_file_perms; ++') ++ + ##################################### + ## +-## Connect to l2tpd with a unix +-## domain stream socket. ++## Connect to l2tpd over a unix domain ++## stream socket. + ## + ## + ## +@@ -56,14 +110,107 @@ interface(`l2tpd_stream_connect',` + ') + + files_search_pids($1) +- files_search_tmp($1) +- stream_connect_pattern($1, { l2tpd_tmp_t l2tpd_var_run_t }, { l2tpd_tmp_t l2tpd_var_run_t }, l2tpd_t) ++ stream_connect_pattern($1, l2tpd_tmp_t, l2tpd_tmp_t, l2tpd_t) ++ stream_connect_pattern($1, l2tpd_var_run_t, l2tpd_var_run_t, l2tpd_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an l2tp environment. ++## Read and write l2tpd unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_rw_pipes',` ++ gen_require(` ++ type l2tpd_t; ++ ') ++ ++ allow $1 l2tpd_t:fifo_file rw_fifo_file_perms; ++') ++ ++######################################## ++## ++## Allow send a signal to l2tpd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_signal',` ++ gen_require(` ++ type l2tpd_t; ++ ') ++ ++ allow $1 l2tpd_t:process signal; ++') ++ ++######################################## ++## ++## Allow send signull to l2tpd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_signull',` ++ gen_require(` ++ type l2tpd_t; ++ ') ++ ++ allow $1 l2tpd_t:process signull; ++') ++ ++######################################## ++## ++## Allow send sigkill to l2tpd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_sigkill',` ++ gen_require(` ++ type l2tpd_t; ++ ') ++ ++ allow $1 l2tpd_t:process sigkill; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## l2tpd over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`l2tpd_dbus_chat',` ++ gen_require(` ++ type l2tpd_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 l2tpd_t:dbus send_msg; ++ allow l2tpd_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an l2tpd environment + ## + ## + ## +@@ -77,16 +224,20 @@ interface(`l2tpd_stream_connect',` + ## + ## + # +-interface(`l2tp_admin',` ++interface(`l2tpd_admin',` + gen_require(` + type l2tpd_t, l2tpd_initrc_exec_t, l2tpd_var_run_t; + type l2tp_conf_t, l2tpd_tmp_t; + ') + +- allow $1 l2tpd_t:process { ptrace signal_perms }; ++ allow $1 l2tpd_t:process signal_perms; + ps_process_pattern($1, l2tpd_t) + +- init_labeled_script_domtrans($1, l2tpd_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 l2tpd_t:process ptrace; ++ ') ++ ++ l2tpd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 l2tpd_initrc_exec_t system_r; + allow $2 system_r; +diff --git a/l2tp.te b/l2tp.te +index bb06a7fee9..01e784bf59 100644 +--- a/l2tp.te ++++ b/l2tp.te +@@ -27,7 +27,7 @@ files_pid_file(l2tpd_var_run_t) + # + + allow l2tpd_t self:capability net_admin; +-allow l2tpd_t self:process signal; ++allow l2tpd_t self:process signal_perms; + allow l2tpd_t self:fifo_file rw_fifo_file_perms; + allow l2tpd_t self:netlink_socket create_socket_perms; + allow l2tpd_t self:rawip_socket create_socket_perms; +@@ -42,11 +42,13 @@ manage_dirs_pattern(l2tpd_t, l2tpd_var_run_t, l2tpd_var_run_t) + manage_files_pattern(l2tpd_t, l2tpd_var_run_t, l2tpd_var_run_t) + manage_sock_files_pattern(l2tpd_t, l2tpd_var_run_t, l2tpd_var_run_t) + manage_fifo_files_pattern(l2tpd_t, l2tpd_var_run_t, l2tpd_var_run_t) +-files_pid_filetrans(l2tpd_t, l2tpd_var_run_t, { dir file sock_file }) ++files_pid_filetrans(l2tpd_t, l2tpd_var_run_t, { dir file sock_file fifo_file }) + + manage_sock_files_pattern(l2tpd_t, l2tpd_tmp_t, l2tpd_tmp_t) + files_tmp_filetrans(l2tpd_t, l2tpd_tmp_t, sock_file) + ++can_exec(l2tpd_t, l2tpd_exec_t) ++ + corenet_all_recvfrom_unlabeled(l2tpd_t) + corenet_all_recvfrom_netlabel(l2tpd_t) + corenet_raw_sendrecv_generic_if(l2tpd_t) +@@ -75,18 +77,36 @@ corecmd_exec_bin(l2tpd_t) + + dev_read_urand(l2tpd_t) + +-files_read_etc_files(l2tpd_t) +- + term_setattr_generic_ptys(l2tpd_t) + term_use_generic_ptys(l2tpd_t) + term_use_ptmx(l2tpd_t) + +-logging_send_syslog_msg(l2tpd_t) ++auth_read_passwd(l2tpd_t) + +-miscfiles_read_localization(l2tpd_t) ++logging_send_syslog_msg(l2tpd_t) + + sysnet_dns_name_resolve(l2tpd_t) + ++optional_policy(` ++ dbus_system_bus_client(l2tpd_t) ++ dbus_connect_system_bus(l2tpd_t) ++ ++ optional_policy(` ++ networkmanager_dbus_chat(l2tpd_t) ++ ') ++') ++ ++optional_policy(` ++ ipsec_domtrans_mgmt(l2tpd_t) ++ ipsec_mgmt_read_pid(l2tpd_t) ++ ipsec_filetrans_key_file(l2tpd_t) ++ ipsec_manage_key_file(l2tpd_t) ++') ++ ++optional_policy(` ++ networkmanager_manage_pid_files(l2tpd_t) ++') ++ + optional_policy(` + ppp_domtrans(l2tpd_t) + ppp_signal(l2tpd_t) +diff --git a/ldap.fc b/ldap.fc +index b7e5679167..c93db3316a 100644 +--- a/ldap.fc ++++ b/ldap.fc +@@ -1,8 +1,11 @@ + /etc/ldap/slapd\.conf -- gen_context(system_u:object_r:slapd_etc_t,s0) +-/etc/openldap/certs(/.*)? gen_context(system_u:object_r:slapd_cert_t,s0) ++ ++/etc/openldap/certs(/.*)? gen_context(system_u:object_r:slapd_cert_t,s0) + /etc/openldap/slapd\.d(/.*)? gen_context(system_u:object_r:slapd_db_t,s0) + +-/etc/rc\.d/init\.d/ldap -- gen_context(system_u:object_r:slapd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/slapd -- gen_context(system_u:object_r:slapd_initrc_exec_t,s0) ++ ++/usr/lib/systemd/system/slapd.* -- gen_context(system_u:object_r:slapd_unit_file_t,s0) + + /usr/sbin/slapd -- gen_context(system_u:object_r:slapd_exec_t,s0) + +@@ -22,8 +25,7 @@ + /var/log/ldap.* gen_context(system_u:object_r:slapd_log_t,s0) + /var/log/slapd.* gen_context(system_u:object_r:slapd_log_t,s0) + +-/var/run/ldapi -s gen_context(system_u:object_r:slapd_var_run_t,s0) +-/var/run/openldap(/.*)? gen_context(system_u:object_r:slapd_var_run_t,s0) +-/var/run/slapd.* -s gen_context(system_u:object_r:slapd_var_run_t,s0) +-/var/run/slapd\.args -- gen_context(system_u:object_r:slapd_var_run_t,s0) +-/var/run/slapd\.pid -- gen_context(system_u:object_r:slapd_var_run_t,s0) ++/var/run/ldapi -s gen_context(system_u:object_r:slapd_var_run_t,s0) ++/var/run/openldap(/.*)? gen_context(system_u:object_r:slapd_var_run_t,s0) ++/var/run/slapd\.args -- gen_context(system_u:object_r:slapd_var_run_t,s0) ++/var/run/slapd\.pid -- gen_context(system_u:object_r:slapd_var_run_t,s0) +diff --git a/ldap.if b/ldap.if +index 3602712d06..af83a5b6b9 100644 +--- a/ldap.if ++++ b/ldap.if +@@ -1,8 +1,69 @@ +-## OpenLDAP directory server. ++## OpenLDAP directory server ++ ++####################################### ++## ++## Execute OpenLDAP in the ldap domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ldap_domtrans',` ++ gen_require(` ++ type slapd_t, slapd_exec_t; ++ ') ++ ++ domtrans_pattern($1, slapd_exec_t, slapd_t) ++') ++ ++####################################### ++## ++## Execute OpenLDAP server in the ldap domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ldap_initrc_domtrans',` ++ gen_require(` ++ type slapd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, slapd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Execute slapd server in the slapd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ldap_systemctl',` ++ gen_require(` ++ type slapd_unit_file_t; ++ type slapd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 slapd_unit_file_t:file read_file_perms; ++ allow $1 slapd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, slapd_t) ++') + + ######################################## + ## +-## List ldap database directories. ++## Read the contents of the OpenLDAP ++## database directories. + ## + ## + ## +@@ -15,13 +76,31 @@ interface(`ldap_list_db',` + type slapd_db_t; + ') + +- files_search_etc($1) + allow $1 slapd_db_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Read ldap configuration files. ++## Read the contents of the OpenLDAP ++## database files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ldap_read_db_files',` ++ gen_require(` ++ type slapd_db_t; ++ ') ++ ++ read_files_pattern($1, slapd_db_t, slapd_db_t) ++') ++ ++######################################## ++## ++## Read the OpenLDAP configuration files. + ## + ## + ## +@@ -41,22 +120,29 @@ interface(`ldap_read_config',` + + ######################################## + ## +-## Use LDAP over TCP connection. (Deprecated) ++## Read the OpenLDAP cert files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`ldap_use',` +- refpolicywarn(`$0($*) has been deprecated.') ++interface(`ldap_read_certs',` ++ gen_require(` ++ type slapd_cert_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 slapd_cert_t:dir list_dir_perms; ++ read_files_pattern($1, slapd_cert_t, slapd_cert_t) ++ read_lnk_files_pattern($1, slapd_cert_t, slapd_cert_t) + ') + + ######################################## + ## +-## Connect to slapd over an unix +-## stream socket. ++## Use LDAP over TCP connection. (Deprecated) + ## + ## + ## +@@ -64,18 +150,13 @@ interface(`ldap_use',` + ## + ## + # +-interface(`ldap_stream_connect',` +- gen_require(` +- type slapd_t, slapd_var_run_t; +- ') +- +- files_search_pids($1) +- stream_connect_pattern($1, slapd_var_run_t, slapd_var_run_t, slapd_t) ++interface(`ldap_use',` ++ refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## + ## +-## Connect to ldap over the network. ++## Connect to slapd over an unix stream socket. + ## + ## + ## +@@ -83,21 +164,19 @@ interface(`ldap_stream_connect',` + ## + ## + # +-interface(`ldap_tcp_connect',` ++interface(`ldap_stream_connect',` + gen_require(` +- type slapd_t; ++ type slapd_t, slapd_var_run_t; + ') + +- corenet_sendrecv_ldap_client_packets($1) +- corenet_tcp_connect_ldap_port($1) +- corenet_tcp_recvfrom_labeled($1, slapd_t) +- corenet_tcp_sendrecv_ldap_port($1) ++ files_search_pids($1) ++ stream_connect_pattern($1, slapd_var_run_t, slapd_var_run_t, slapd_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an ldap environment. ++## All of the rules required to administrate ++## an ldap environment + ## + ## + ## +@@ -106,7 +185,7 @@ interface(`ldap_tcp_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the ldap domain. + ## + ## + ## +@@ -117,11 +196,16 @@ interface(`ldap_admin',` + type slapd_lock_t, slapd_etc_t, slapd_var_run_t; + type slapd_initrc_exec_t, slapd_log_t, slapd_cert_t; + type slapd_db_t, slapd_keytab_t; ++ type slapd_unit_file_t; + ') + +- allow $1 slapd_t:process { ptrace signal_perms }; ++ allow $1 slapd_t:process signal_perms; + ps_process_pattern($1, slapd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 slapd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, slapd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 slapd_initrc_exec_t system_r; +@@ -130,13 +214,9 @@ interface(`ldap_admin',` + files_list_etc($1) + admin_pattern($1, { slapd_etc_t slapd_db_t slapd_cert_t slapd_keytab_t }) + +- files_list_locks($1) + admin_pattern($1, slapd_lock_t) + +- logging_list_logs($1) +- admin_pattern($1, slapd_log_t) +- +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, slapd_replog_t) + + files_list_tmp($1) +@@ -144,4 +224,8 @@ interface(`ldap_admin',` + + files_list_pids($1) + admin_pattern($1, slapd_var_run_t) ++ ++ ldap_systemctl($1) ++ admin_pattern($1, slapd_unit_file_t) ++ allow $1 slapd_unit_file_t:service all_service_perms; + ') +diff --git a/ldap.te b/ldap.te +index 4c2b1110ed..1c922b3402 100644 +--- a/ldap.te ++++ b/ldap.te +@@ -21,6 +21,9 @@ files_config_file(slapd_etc_t) + type slapd_initrc_exec_t; + init_script_file(slapd_initrc_exec_t) + ++type slapd_unit_file_t; ++systemd_unit_file(slapd_unit_file_t) ++ + type slapd_keytab_t; + files_type(slapd_keytab_t) + +@@ -49,7 +52,8 @@ files_pid_file(slapd_var_run_t) + + allow slapd_t self:capability { kill setgid setuid net_raw dac_override dac_read_search }; + dontaudit slapd_t self:capability sys_tty_config; +-allow slapd_t self:process setsched; ++dontaudit slapd_t self:capability2 block_suspend; ++allow slapd_t self:process { setsched signal } ; + allow slapd_t self:fifo_file rw_fifo_file_perms; + allow slapd_t self:tcp_socket { accept listen }; + +@@ -60,6 +64,7 @@ read_lnk_files_pattern(slapd_t, slapd_cert_t, slapd_cert_t) + manage_dirs_pattern(slapd_t, slapd_db_t, slapd_db_t) + manage_files_pattern(slapd_t, slapd_db_t, slapd_db_t) + manage_lnk_files_pattern(slapd_t, slapd_db_t, slapd_db_t) ++allow slapd_t slapd_db_t:file map; + + allow slapd_t slapd_etc_t:file read_file_perms; + +@@ -69,9 +74,7 @@ allow slapd_t slapd_lock_t:file manage_file_perms; + files_lock_filetrans(slapd_t, slapd_lock_t, file) + + manage_dirs_pattern(slapd_t, slapd_log_t, slapd_log_t) +-append_files_pattern(slapd_t, slapd_log_t, slapd_log_t) +-create_files_pattern(slapd_t, slapd_log_t, slapd_log_t) +-setattr_files_pattern(slapd_t, slapd_log_t, slapd_log_t) ++manage_files_pattern(slapd_t, slapd_log_t, slapd_log_t) + logging_log_filetrans(slapd_t, slapd_log_t, { file dir }) + + manage_dirs_pattern(slapd_t, slapd_replog_t, slapd_replog_t) +@@ -80,7 +83,8 @@ manage_lnk_files_pattern(slapd_t, slapd_replog_t, slapd_replog_t) + + manage_dirs_pattern(slapd_t, slapd_tmp_t, slapd_tmp_t) + manage_files_pattern(slapd_t, slapd_tmp_t, slapd_tmp_t) +-files_tmp_filetrans(slapd_t, slapd_tmp_t, { file dir }) ++manage_lnk_files_pattern(slapd_t, slapd_tmp_t, slapd_tmp_t) ++files_tmp_filetrans(slapd_t, slapd_tmp_t, { file lnk_file dir }) + + manage_files_pattern(slapd_t, slapd_tmpfs_t, slapd_tmpfs_t) + fs_tmpfs_filetrans(slapd_t, slapd_tmpfs_t, file) +@@ -89,11 +93,11 @@ manage_dirs_pattern(slapd_t, slapd_var_run_t, slapd_var_run_t) + manage_files_pattern(slapd_t, slapd_var_run_t, slapd_var_run_t) + manage_sock_files_pattern(slapd_t, slapd_var_run_t, slapd_var_run_t) + files_pid_filetrans(slapd_t, slapd_var_run_t, { dir file sock_file }) ++allow slapd_t slapd_var_run_t:file map; + + kernel_read_system_state(slapd_t) + kernel_read_kernel_sysctls(slapd_t) + +-corenet_all_recvfrom_unlabeled(slapd_t) + corenet_all_recvfrom_netlabel(slapd_t) + corenet_tcp_sendrecv_generic_if(slapd_t) + corenet_tcp_sendrecv_generic_node(slapd_t) +@@ -115,25 +119,27 @@ fs_getattr_all_fs(slapd_t) + fs_search_auto_mountpoints(slapd_t) + + files_read_etc_runtime_files(slapd_t) +-files_read_usr_files(slapd_t) + files_list_var_lib(slapd_t) + + auth_use_nsswitch(slapd_t) ++auth_rw_cache(slapd_t) + + logging_send_syslog_msg(slapd_t) + + miscfiles_read_generic_certs(slapd_t) +-miscfiles_read_localization(slapd_t) ++miscfiles_map_generic_certs(slapd_t) + + userdom_dontaudit_use_unpriv_user_fds(slapd_t) + userdom_dontaudit_search_user_home_dirs(slapd_t) + ++usermanage_read_crack_db(slapd_t) ++ + optional_policy(` + kerberos_manage_host_rcache(slapd_t) + kerberos_read_keytab(slapd_t) +- kerberos_tmp_filetrans_host_rcache(slapd_t, file, "ldapmap1_0") +- kerberos_tmp_filetrans_host_rcache(slapd_t, file, "ldap_487") +- kerberos_tmp_filetrans_host_rcache(slapd_t, file, "ldap_55") ++ kerberos_tmp_filetrans_host_rcache(slapd_t, "ldapmap1_0") ++ kerberos_tmp_filetrans_host_rcache(slapd_t, "ldap_487") ++ kerberos_tmp_filetrans_host_rcache(slapd_t, "ldap_55") + kerberos_use(slapd_t) + ') + +diff --git a/lightsquid.fc b/lightsquid.fc +index 044390c6e2..63e205863c 100644 +--- a/lightsquid.fc ++++ b/lightsquid.fc +@@ -1,11 +1,11 @@ + /etc/cron\.daily/lightsquid -- gen_context(system_u:object_r:lightsquid_exec_t,s0) + +-/usr/lib/cgi-bin/lightsquid/.*\.cfg -- gen_context(system_u:object_r:httpd_lightsquid_content_t,s0) +-/usr/lib/cgi-bin/lightsquid/.*\.cgi -- gen_context(system_u:object_r:httpd_lightsquid_script_exec_t,s0) ++/usr/lib/cgi-bin/lightsquid/.*\.cfg -- gen_context(system_u:object_r:lightsquid_content_t,s0) ++/usr/lib/cgi-bin/lightsquid/.*\.cgi -- gen_context(system_u:object_r:lightsquid_script_exec_t,s0) + +-/usr/share/lightsquid/cgi/.*\.cgi -- gen_context(system_u:object_r:httpd_lightsquid_script_exec_t,s0) ++/usr/share/lightsquid/cgi/.*\.cgi -- gen_context(system_u:object_r:lightsquid_script_exec_t,s0) + + /var/lightsquid(/.*)? gen_context(system_u:object_r:lightsquid_rw_content_t,s0) + +-/var/www/html/lightsquid(/.*)? gen_context(system_u:object_r:httpd_lightsquid_content_t,s0) +-/var/www/html/lightsquid/report(/.*)? gen_context(system_u:object_r:lightsquid_rw_content_t,s0) ++/var/www/html/lightsquid(/.*)? gen_context(system_u:object_r:lightsquid_content_t,s0) ++/var/www/html/lightsquid/report(/.*)? gen_context(system_u:object_r:lightsquid_report_content_t,s0) +diff --git a/lightsquid.if b/lightsquid.if +index 33a28b9ad6..33ffe2484b 100644 +--- a/lightsquid.if ++++ b/lightsquid.if +@@ -76,5 +76,7 @@ interface(`lightsquid_admin',` + files_search_var_lib($1) + admin_pattern($1, lightsquid_rw_content_t) + +- apache_list_sys_content($1) ++ optional_policy(` ++ apache_list_sys_content($1) ++ ') + ') +diff --git a/lightsquid.te b/lightsquid.te +index 09c4f27bad..6c7855e4e1 100644 +--- a/lightsquid.te ++++ b/lightsquid.te +@@ -13,38 +13,34 @@ type lightsquid_exec_t; + application_domain(lightsquid_t, lightsquid_exec_t) + role lightsquid_roles types lightsquid_t; + +-type lightsquid_rw_content_t; +-files_type(lightsquid_rw_content_t) ++type lightsquid_report_content_t; ++files_type(lightsquid_report_content_t) + + ######################################## + # + # Local policy + # + +-manage_dirs_pattern(lightsquid_t, lightsquid_rw_content_t, lightsquid_rw_content_t) +-manage_files_pattern(lightsquid_t, lightsquid_rw_content_t, lightsquid_rw_content_t) +-manage_lnk_files_pattern(lightsquid_t, lightsquid_rw_content_t, lightsquid_rw_content_t) +-files_var_filetrans(lightsquid_t, lightsquid_rw_content_t, dir) ++manage_dirs_pattern(lightsquid_t, lightsquid_report_content_t, lightsquid_report_content_t) ++manage_files_pattern(lightsquid_t, lightsquid_report_content_t, lightsquid_report_content_t) ++manage_lnk_files_pattern(lightsquid_t, lightsquid_report_content_t, lightsquid_report_content_t) ++files_var_filetrans(lightsquid_t, lightsquid_report_content_t, dir) + + corecmd_exec_bin(lightsquid_t) + corecmd_exec_shell(lightsquid_t) + + dev_read_urand(lightsquid_t) + +-files_read_etc_files(lightsquid_t) +-files_read_usr_files(lightsquid_t) +- +-miscfiles_read_localization(lightsquid_t) +- + squid_read_config(lightsquid_t) + squid_read_log(lightsquid_t) + + optional_policy(` + apache_content_template(lightsquid) ++ apache_content_alias_template(lightsquid, lightsquid) + +- list_dirs_pattern(httpd_lightsquid_script_t, lightsquid_rw_content_t, lightsquid_rw_content_t) +- read_files_pattern(httpd_lightsquid_script_t, lightsquid_rw_content_t, lightsquid_rw_content_t) +- read_lnk_files_pattern(httpd_lightsquid_script_t, lightsquid_rw_content_t, lightsquid_rw_content_t) ++ list_dirs_pattern(lightsquid_script_t, lightsquid_report_content_t, lightsquid_report_content_t) ++ read_files_pattern(lightsquid_script_t, lightsquid_report_content_t, lightsquid_report_content_t) ++ read_lnk_files_pattern(lightsquid_script_t, lightsquid_report_content_t, lightsquid_report_content_t) + ') + + optional_policy(` +diff --git a/likewise.if b/likewise.if +index bd20e8cc92..3393a01e61 100644 +--- a/likewise.if ++++ b/likewise.if +@@ -1,9 +1,22 @@ + ## Likewise Active Directory support for UNIX. ++## ++##

      ++## Likewise Open is a free, open source application that joins Linux, Unix, ++## and Mac machines to Microsoft Active Directory to securely authenticate ++## users with their domain credentials. ++##

      ++##
      + + ####################################### + ## + ## The template to define a likewise domain. + ## ++## ++##

      ++## This template creates a domain to be used for ++## a new likewise daemon. ++##

      ++##
      + ## + ## + ## The type of daemon to be used. +@@ -11,6 +24,7 @@ + ## + # + template(`likewise_domain_template',` ++ + gen_require(` + attribute likewise_domains; + type likewise_var_lib_t; +@@ -24,6 +38,7 @@ template(`likewise_domain_template',` + type $1_t; + type $1_exec_t; + init_daemon_domain($1_t, $1_exec_t) ++ domain_use_interactive_fds($1_t) + + typeattribute $1_t likewise_domains; + +@@ -38,15 +53,18 @@ template(`likewise_domain_template',` + + #################################### + # +- # Policy ++ # Local Policy + # + + allow $1_t self:process { signal_perms getsched setsched }; + allow $1_t self:fifo_file rw_fifo_file_perms; +- allow $1_t self:unix_stream_socket { accept listen }; ++ allow $1_t self:unix_dgram_socket create_socket_perms; ++ allow $1_t self:unix_stream_socket create_stream_socket_perms; + allow $1_t self:tcp_socket create_stream_socket_perms; + allow $1_t self:udp_socket create_socket_perms; + ++ allow $1_t likewise_var_lib_t:dir setattr_dir_perms; ++ + manage_files_pattern($1_t, $1_var_run_t, $1_var_run_t) + files_pid_filetrans($1_t, $1_var_run_t, file) + +@@ -55,12 +73,15 @@ template(`likewise_domain_template',` + + manage_sock_files_pattern($1_t, likewise_var_lib_t, $1_var_socket_t) + filetrans_pattern($1_t, likewise_var_lib_t, $1_var_socket_t, sock_file) ++ ++ kernel_read_system_state($1_t) ++ ++ logging_send_syslog_msg($1_t) + ') + + ######################################## + ## +-## Connect to lsassd with a unix domain +-## stream socket. ++## Connect to lsassd. + ## + ## + ## +@@ -76,59 +97,3 @@ interface(`likewise_stream_connect_lsassd',` + files_search_pids($1) + stream_connect_pattern($1, likewise_var_lib_t, lsassd_var_socket_t, lsassd_t) + ') +- +-######################################## +-## +-## All of the rules required to +-## administrate an likewise environment. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-# +-interface(`likewise_admin',` +- gen_require(` +- attribute likewise_domains; +- type likewise_initrc_exec_t, likewise_etc_t, likewise_pstore_lock_t; +- type likewise_krb5_ad_t, likewise_var_lib_t, eventlogd_var_socket_t; +- type lsassd_var_socket_t, lwiod_var_socket_t, lwregd_var_socket_t; +- type lwsmd_var_socket_t, lwsmd_var_lib_t, netlogond_var_socket_t; +- type netlogond_var_lib_t, lsassd_var_lib_t, lwregd_var_lib_t; +- type eventlogd_var_lib_t, dcerpcd_var_lib_t, lsassd_tmp_t; +- type eventlogd_var_run_t, lsassd_var_run_t, lwiod_var_run_t; +- type lwregd_var_run_t, netlogond_var_run_t, srvsvcd_var_run_t; +- ') +- +- allow $1 likewise_domains:process { ptrace signal_perms }; +- ps_process_pattern($1, likewise_domains) +- +- init_labeled_script_domtrans($1, likewise_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 likewise_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_list_etc($1) +- admin_pattern($1, { likewise_etc_t likewise_pstore_lock_t likewise_krb5_ad_t }) +- +- files_search_var_lib($1) +- admin_pattern($1, { likewise_var_lib_t eventlogd_var_socket_t lsassd_var_socket_t }) +- admin_pattern($1, { lwiod_var_socket_t lwregd_var_socket_t lwsmd_var_socket_t }) +- admin_pattern($1, { lwsmd_var_lib_t netlogond_var_socket_t netlogond_var_lib_t }) +- admin_pattern($1, { lsassd_var_lib_t lwregd_var_lib_t eventlogd_var_lib_t }) +- admin_pattern($1, dcerpcd_var_lib_t) +- +- files_list_tmp($1) +- admin_pattern($1, lsassd_tmp_t) +- +- files_list_pids($1) +- admin_pattern($1, { eventlogd_var_run_t lsassd_var_run_t lwiod_var_run_t }) +- admin_pattern($1, { lwregd_var_run_t netlogond_var_run_t srvsvcd_var_run_t }) +-') +diff --git a/likewise.te b/likewise.te +index d8c2442a80..f5dff31732 100644 +--- a/likewise.te ++++ b/likewise.te +@@ -26,7 +26,7 @@ type likewise_var_lib_t; + files_type(likewise_var_lib_t) + + type likewise_pstore_lock_t; +-files_type(likewise_pstore_lock_t) ++files_lock_file(likewise_pstore_lock_t) + + type likewise_krb5_ad_t; + files_type(likewise_krb5_ad_t) +@@ -41,20 +41,13 @@ files_tmp_file(lsassd_tmp_t) + + allow likewise_domains likewise_var_lib_t:dir setattr_dir_perms; + +-kernel_read_system_state(likewise_domains) +- + dev_read_rand(likewise_domains) + dev_read_urand(likewise_domains) + + domain_use_interactive_fds(likewise_domains) + +-files_read_etc_files(likewise_domains) + files_search_var_lib(likewise_domains) + +-logging_send_syslog_msg(likewise_domains) +- +-miscfiles_read_localization(likewise_domains) +- + ################################# + # + # dcerpcd local policy +@@ -102,7 +95,7 @@ corenet_tcp_sendrecv_epmap_port(eventlogd_t) + # lsassd local policy + # + +-allow lsassd_t self:capability { fowner chown fsetid dac_override sys_time }; ++allow lsassd_t self:capability { fowner chown fsetid dac_read_search dac_override sys_time }; + allow lsassd_t self:unix_stream_socket { create_stream_socket_perms connectto }; + allow lsassd_t self:netlink_route_socket rw_netlink_socket_perms; + +@@ -126,7 +119,6 @@ corecmd_exec_bin(lsassd_t) + corecmd_exec_shell(lsassd_t) + + corenet_all_recvfrom_netlabel(lsassd_t) +-corenet_all_recvfrom_unlabeled(lsassd_t) + corenet_tcp_sendrecv_generic_if(lsassd_t) + corenet_tcp_sendrecv_generic_node(lsassd_t) + +@@ -165,7 +157,7 @@ optional_policy(` + # lwiod local policy + # + +-allow lwiod_t self:capability { fowner chown fsetid dac_override sys_resource }; ++allow lwiod_t self:capability { fowner chown fsetid dac_read_search dac_override sys_resource }; + allow lwiod_t self:process setrlimit; + allow lwiod_t self:netlink_route_socket rw_netlink_socket_perms; + +@@ -221,7 +213,7 @@ stream_connect_pattern(lwsmd_t, likewise_var_lib_t, lwregd_var_socket_t, lwregd_ + # netlogond local policy + # + +-allow netlogond_t self:capability dac_override; ++allow netlogond_t self:capability { dac_read_search dac_override }; + + manage_files_pattern(netlogond_t, likewise_etc_t, likewise_etc_t) + +@@ -242,7 +234,6 @@ stream_connect_pattern(srvsvcd_t, likewise_var_lib_t, lwiod_var_socket_t, lwiod_ + stream_connect_pattern(srvsvcd_t, likewise_var_lib_t, lwregd_var_socket_t, lwregd_t) + + corenet_all_recvfrom_netlabel(srvsvcd_t) +-corenet_all_recvfrom_unlabeled(srvsvcd_t) + corenet_sendrecv_generic_server_packets(srvsvcd_t) + corenet_tcp_sendrecv_generic_if(srvsvcd_t) + corenet_tcp_sendrecv_generic_node(srvsvcd_t) +diff --git a/linuxptp.fc b/linuxptp.fc +new file mode 100644 +index 0000000000..d2061a9e4c +--- /dev/null ++++ b/linuxptp.fc +@@ -0,0 +1,11 @@ ++/usr/lib/systemd/system/phc2sys.* -- gen_context(system_u:object_r:phc2sys_unit_file_t,s0) ++ ++/usr/lib/systemd/system/ptp4l.* -- gen_context(system_u:object_r:ptp4l_unit_file_t,s0) ++ ++/usr/lib/systemd/system/timemaster.* -- gen_context(system_u:object_r:timemaster_unit_file_t,s0) ++ ++/usr/sbin/ptp4l -- gen_context(system_u:object_r:ptp4l_exec_t,s0) ++/usr/sbin/phc2sys -- gen_context(system_u:object_r:phc2sys_exec_t,s0) ++/usr/sbin/timemaster -- gen_context(system_u:object_r:timemaster_exec_t,s0) ++ ++/var/run/timemaster(/.*)? gen_context(system_u:object_r:timemaster_var_run_t,s0) +diff --git a/linuxptp.if b/linuxptp.if +new file mode 100644 +index 0000000000..e2c96f4a80 +--- /dev/null ++++ b/linuxptp.if +@@ -0,0 +1,142 @@ ++## implementation of the Precision Time Protocol (PTP) according to IEEE standard 1588 for Linux. ++ ++######################################## ++## ++## Execute domain in the phc2sys domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`linuxptp_domtrans_phc2sys',` ++ gen_require(` ++ type phc2sys_t, phc2sys_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, phc2sys_exec_t, phc2sys_t) ++') ++ ++######################################## ++## ++## Execute domain in the phc2sys domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`linuxptp_domtrans_ptp4l',` ++ gen_require(` ++ type ptp4l_t, ptp4l_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ptp4l_exec_t, ptp4l_t) ++') ++###################################### ++## ++## Connect to timemaster using a unix ++## domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`timemaster_stream_connect',` ++ gen_require(` ++ type timemaster_t, timemaster_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, timemaster_var_run_t, timemaster_var_run_t, timemaster_t) ++') ++ ++######################################## ++## ++## Read timemaster conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`timemaster_read_pid_files',` ++ gen_require(` ++ type timemaster_var_run_t; ++ ') ++ ++ read_files_pattern($1, timemaster_var_run_t, timemaster_var_run_t) ++') ++ ++######################################## ++## ++## Read and write timemaster shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`timemaster_rw_shm',` ++ gen_require(` ++ type timemaster_t, timemaster_tmpfs_t; ++ ') ++ ++ allow $1 timemaster_t:shm rw_shm_perms; ++ list_dirs_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ rw_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ read_lnk_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ fs_search_tmpfs($1) ++') ++ ++######################################## ++## ++## Read and write ptp4l_t shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ptp4l_rw_shm',` ++ gen_require(` ++ type ptp4l_t, timemaster_tmpfs_t; ++ ') ++ ++ allow $1 ptp4l_t:shm rw_shm_perms; ++ list_dirs_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ rw_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ read_lnk_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ fs_search_tmpfs($1) ++') ++ ++######################################## ++## ++## Read and write phc2sys_t shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`phc2sys_rw_shm',` ++ gen_require(` ++ type phc2sys_t, timemaster_tmpfs_t; ++ ') ++ ++ allow $1 phc2sys_t:shm rw_shm_perms; ++ list_dirs_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ rw_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ read_lnk_files_pattern($1, timemaster_tmpfs_t, timemaster_tmpfs_t) ++ fs_search_tmpfs($1) ++') +diff --git a/linuxptp.te b/linuxptp.te +new file mode 100644 +index 0000000000..75611d3e88 +--- /dev/null ++++ b/linuxptp.te +@@ -0,0 +1,188 @@ ++policy_module(linuxptp, 1.0.0) ++ ++ ++######################################## ++# ++# Declarations ++# ++ ++type timemaster_t; ++type timemaster_exec_t; ++init_daemon_domain(timemaster_t, timemaster_exec_t) ++ ++type timemaster_var_run_t; ++files_pid_file(timemaster_var_run_t) ++ ++type timemaster_tmpfs_t; ++files_tmpfs_file(timemaster_tmpfs_t) ++ ++type timemaster_unit_file_t; ++systemd_unit_file(timemaster_unit_file_t) ++ ++type phc2sys_t; ++type phc2sys_exec_t; ++init_daemon_domain(phc2sys_t, phc2sys_exec_t) ++ ++type phc2sys_unit_file_t; ++systemd_unit_file(phc2sys_unit_file_t) ++ ++type ptp4l_t; ++type ptp4l_exec_t; ++init_daemon_domain(ptp4l_t, ptp4l_exec_t) ++ ++type ptp4l_unit_file_t; ++systemd_unit_file(ptp4l_unit_file_t) ++ ++######################################## ++# ++# timemaster local policy ++# ++ ++allow timemaster_t self:process { signal_perms setcap}; ++allow timemaster_t self:fifo_file rw_fifo_file_perms; ++allow timemaster_t self:capability { setuid sys_time kill setgid }; ++allow timemaster_t self:unix_stream_socket create_stream_socket_perms; ++allow timemaster_t self:shm create_shm_perms; ++allow timemaster_t self:udp_socket create_socket_perms; ++ ++allow timemaster_t ptp4l_t:process signal; ++allow timemaster_t phc2sys_t:process signal; ++ ++allow timemaster_t ptp4l_t:shm rw_shm_perms; ++ ++manage_dirs_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_files_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_sock_files_pattern(timemaster_t, timemaster_var_run_t, timemaster_var_run_t) ++files_pid_filetrans(timemaster_t, timemaster_var_run_t, { dir file sock_file }) ++ ++manage_dirs_pattern(timemaster_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++manage_files_pattern(timemaster_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++fs_tmpfs_filetrans(timemaster_t, timemaster_tmpfs_t, { dir file }) ++ ++kernel_read_network_state(timemaster_t) ++ ++auth_use_nsswitch(timemaster_t) ++ ++corenet_udp_bind_generic_node(timemaster_t) ++corenet_udp_bind_ntp_port(timemaster_t) ++ ++dev_read_urand(timemaster_t) ++ ++logging_send_syslog_msg(timemaster_t) ++ ++sysnet_read_config(timemaster_t) ++ ++optional_policy(` ++ ntp_domtrans(timemaster_t) ++ ntp_signal(timemaster_t) ++') ++ ++optional_policy(` ++ chronyd_domtrans(timemaster_t) ++ chronyd_rw_shm(timemaster_t) ++') ++ ++optional_policy(` ++ gpsd_rw_shm(timemaster_t) ++') ++ ++ ++optional_policy(` ++ chronyd_signal(timemaster_t) ++') ++ ++ ++optional_policy(` ++ linuxptp_domtrans_ptp4l(timemaster_t) ++') ++ ++optional_policy(` ++ linuxptp_domtrans_phc2sys(timemaster_t) ++') ++ ++######################################## ++# ++# phc2sys local policy ++# ++ ++allow phc2sys_t self:capability sys_time; ++allow phc2sys_t self:fifo_file rw_fifo_file_perms; ++allow phc2sys_t self:unix_stream_socket create_stream_socket_perms; ++allow phc2sys_t self:shm create_shm_perms; ++allow phc2sys_t self:udp_socket create_socket_perms; ++ ++allow phc2sys_t ptp4l_t:unix_dgram_socket sendto; ++ ++allow phc2sys_t timemaster_t:shm rw_shm_perms; ++ ++manage_dirs_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_files_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_sock_files_pattern(phc2sys_t, timemaster_var_run_t, timemaster_var_run_t) ++files_pid_filetrans(phc2sys_t, timemaster_var_run_t, { dir file sock_file }) ++ ++manage_dirs_pattern(phc2sys_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++manage_files_pattern(phc2sys_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++fs_tmpfs_filetrans(phc2sys_t, timemaster_tmpfs_t, { dir file }) ++ ++dev_rw_realtime_clock(phc2sys_t) ++ ++logging_send_syslog_msg(phc2sys_t) ++ ++optional_policy(` ++ chronyd_rw_shm(phc2sys_t) ++') ++ ++optional_policy(` ++ gpsd_rw_shm(phc2sys_t) ++') ++ ++optional_policy(` ++ ntp_rw_shm(phc2sys_t) ++') ++ ++optional_policy(` ++ ptp4l_rw_shm(phc2sys_t) ++') ++ ++######################################## ++# ++# ptp4l local policy ++# ++ ++allow ptp4l_t self:fifo_file rw_fifo_file_perms; ++allow ptp4l_t self:unix_stream_socket create_stream_socket_perms; ++allow ptp4l_t self:shm create_shm_perms; ++allow ptp4l_t self:udp_socket create_socket_perms; ++allow ptp4l_t self:capability { net_admin net_raw sys_time }; ++allow ptp4l_t self:capability2 { wake_alarm }; ++allow ptp4l_t self:netlink_route_socket rw_netlink_socket_perms; ++ ++allow ptp4l_t phc2sys_t:unix_dgram_socket sendto; ++ ++manage_dirs_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_files_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t) ++manage_sock_files_pattern(ptp4l_t, timemaster_var_run_t, timemaster_var_run_t) ++files_pid_filetrans(ptp4l_t, timemaster_var_run_t, { dir file sock_file }) ++ ++manage_dirs_pattern(ptp4l_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++manage_files_pattern(ptp4l_t, timemaster_tmpfs_t, timemaster_tmpfs_t) ++fs_tmpfs_filetrans(ptp4l_t, timemaster_tmpfs_t, { dir file }) ++ ++corenet_udp_bind_generic_node(ptp4l_t) ++corenet_udp_bind_reserved_port(ptp4l_t) ++ ++kernel_read_network_state(ptp4l_t) ++ ++dev_rw_realtime_clock(ptp4l_t) ++ ++logging_send_syslog_msg(ptp4l_t) ++ ++userdom_dgram_send(ptp4l_t) ++ ++optional_policy(` ++ chronyd_rw_shm(ptp4l_t) ++') ++ ++optional_policy(` ++ gpsd_rw_shm(ptp4l_t) ++') +diff --git a/lircd.if b/lircd.if +index dff21a7c44..b6981c8465 100644 +--- a/lircd.if ++++ b/lircd.if +@@ -81,8 +81,11 @@ interface(`lircd_admin',` + type lircd_initrc_exec_t, lircd_etc_t; + ') + +- allow $1 lircd_t:process { ptrace signal_perms }; ++ allow $1 lircd_t:process signal_perms; + ps_process_pattern($1, lircd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 lircd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, lircd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/lircd.te b/lircd.te +index 483c87bb64..f9d2e10b1d 100644 +--- a/lircd.te ++++ b/lircd.te +@@ -13,7 +13,7 @@ type lircd_initrc_exec_t; + init_script_file(lircd_initrc_exec_t) + + type lircd_etc_t; +-files_type(lircd_etc_t) ++files_config_file(lircd_etc_t) + + type lircd_var_run_t alias lircd_sock_t; + files_pid_file(lircd_var_run_t) +@@ -23,10 +23,11 @@ files_pid_file(lircd_var_run_t) + # Local policy + # + +-allow lircd_t self:capability { chown kill sys_admin }; ++allow lircd_t self:capability { chown kill setgid setuid sys_admin dac_read_search dac_override }; + allow lircd_t self:process signal; + allow lircd_t self:fifo_file rw_fifo_file_perms; + allow lircd_t self:tcp_socket { accept listen }; ++allow lircd_t self:netlink_kobject_uevent_socket create_socket_perms; + + read_files_pattern(lircd_t, lircd_etc_t, lircd_etc_t) + +@@ -38,6 +39,12 @@ files_pid_filetrans(lircd_t, lircd_var_run_t, { dir file }) + dev_filetrans(lircd_t, lircd_var_run_t, sock_file) + + kernel_request_load_module(lircd_t) ++kernel_read_system_state(lircd_t) ++ ++auth_read_passwd(lircd_t) ++ ++corecmd_exec_shell(lircd_t) ++corecmd_exec_bin(lircd_t) + + corenet_all_recvfrom_unlabeled(lircd_t) + corenet_all_recvfrom_netlabel(lircd_t) +@@ -64,9 +71,14 @@ files_manage_generic_locks(lircd_t) + files_read_all_locks(lircd_t) + + term_use_ptmx(lircd_t) ++term_use_usb_ttys(lircd_t) ++term_use_unallocated_ttys(lircd_t) + ++auth_use_nsswitch(lircd_t) + logging_send_syslog_msg(lircd_t) + +-miscfiles_read_localization(lircd_t) +- + sysnet_dns_name_resolve(lircd_t) ++ ++optional_policy(` ++ sssd_read_public_files(lircd_t) ++') +diff --git a/livecd.if b/livecd.if +index e3541811ac..fc614bac2b 100644 +--- a/livecd.if ++++ b/livecd.if +@@ -38,11 +38,36 @@ interface(`livecd_domtrans',` + # + interface(`livecd_run',` + gen_require(` ++ type livecd_t; ++ type livecd_exec_t; + attribute_role livecd_roles; + ') + + livecd_domtrans($1) + roleattribute $2 livecd_roles; ++ role_transition $2 livecd_exec_t system_r; ++ ++ optional_policy(` ++ rpm_transition_script(livecd_t, $2) ++ ') ++') ++ ++######################################## ++## ++## Dontaudit read/write to a livecd leaks ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`livecd_dontaudit_leaks',` ++ gen_require(` ++ type livecd_t; ++ ') ++ ++ dontaudit $1 livecd_t:unix_dgram_socket { read write }; + ') + + ######################################## +diff --git a/livecd.te b/livecd.te +index 2f974bf839..f6e97faaf2 100644 +--- a/livecd.te ++++ b/livecd.te +@@ -21,9 +21,11 @@ files_tmp_file(livecd_tmp_t) + # Local policy + # + +-dontaudit livecd_t self:capability2 mac_admin; ++allow livecd_t self:capability2 mac_admin; + +-domain_ptrace_all_domains(livecd_t) ++tunable_policy(`deny_ptrace',`',` ++ domain_ptrace_all_domains(livecd_t) ++') + + manage_dirs_pattern(livecd_t, livecd_tmp_t, livecd_tmp_t) + manage_files_pattern(livecd_t, livecd_tmp_t, livecd_tmp_t) +@@ -35,12 +37,13 @@ sysnet_etc_filetrans_config(livecd_t) + optional_policy(` + hal_dbus_chat(livecd_t) + ') ++ + optional_policy(` +- mount_run(livecd_t, livecd_roles) ++ mount_run(livecd_t, livecd_roles) + ') + + optional_policy(` +- rpm_domtrans(livecd_t) ++ seutil_run_setfiles_mac(livecd_t, livecd_roles) + ') + + optional_policy(` +diff --git a/lldpad.fc b/lldpad.fc +index 8031a78eb8..72e56acc3a 100644 +--- a/lldpad.fc ++++ b/lldpad.fc +@@ -5,3 +5,5 @@ + /var/lib/lldpad(/.*)? gen_context(system_u:object_r:lldpad_var_lib_t,s0) + + /var/run/lldpad.* gen_context(system_u:object_r:lldpad_var_run_t,s0) ++ ++/dev/shm/lldpad.* -- gen_context(system_u:object_r:lldpad_tmpfs_t,s0) +diff --git a/lldpad.if b/lldpad.if +index d18c96023c..fb5b67416b 100644 +--- a/lldpad.if ++++ b/lldpad.if +@@ -1,5 +1,24 @@ + ## Intel LLDP Agent. + ++####################################### ++## ++## Transition to lldpad. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`lldpad_domtrans',` ++ gen_require(` ++ type lldpad_t, lldpad_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, lldpad_exec_t, lldpad_t) ++') ++ + ####################################### + ## + ## Send to lldpad with a unix dgram socket. +@@ -42,9 +61,13 @@ interface(`lldpad_admin',` + type lldpad_var_run_t; + ') + +- allow $1 lldpad_t:process { ptrace signal_perms }; ++ allow $1 lldpad_t:process { signal_perms }; + ps_process_pattern($1, lldpad_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 lldpad_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, lldpad_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 lldpad_initrc_exec_t system_r; +diff --git a/lldpad.te b/lldpad.te +index 2a491d96c1..d909b408c3 100644 +--- a/lldpad.te ++++ b/lldpad.te +@@ -26,7 +26,7 @@ files_pid_file(lldpad_var_run_t) + # Local policy + # + +-allow lldpad_t self:capability { net_admin net_raw }; ++allow lldpad_t self:capability { net_admin net_raw sys_resource }; + allow lldpad_t self:shm create_shm_perms; + allow lldpad_t self:fifo_file rw_fifo_file_perms; + allow lldpad_t self:unix_stream_socket { accept listen }; +@@ -36,6 +36,7 @@ allow lldpad_t self:udp_socket create_socket_perms; + + manage_files_pattern(lldpad_t, lldpad_tmpfs_t, lldpad_tmpfs_t) + fs_tmpfs_filetrans(lldpad_t, lldpad_tmpfs_t, file) ++allow lldpad_t lldpad_tmpfs_t:file map; + + manage_dirs_pattern(lldpad_t, lldpad_var_lib_t, lldpad_var_lib_t) + manage_files_pattern(lldpad_t, lldpad_var_lib_t, lldpad_var_lib_t) +@@ -51,12 +52,20 @@ kernel_request_load_module(lldpad_t) + + dev_read_sysfs(lldpad_t) + +-files_read_etc_files(lldpad_t) ++fs_getattr_tmpfs(lldpad_t) + + logging_send_syslog_msg(lldpad_t) + +-miscfiles_read_localization(lldpad_t) ++userdom_dgram_send(lldpad_t) + + optional_policy(` + fcoe_dgram_send_fcoemon(lldpad_t) + ') ++ ++optional_policy(` ++ networkmanager_dgram_send(lldpad_t) ++') ++ ++optional_policy(` ++ virt_dgram_send(lldpad_t) ++') +diff --git a/loadkeys.te b/loadkeys.te +index d2f4643757..ecbfa88ffa 100644 +--- a/loadkeys.te ++++ b/loadkeys.te +@@ -25,20 +25,19 @@ kernel_read_system_state(loadkeys_t) + corecmd_exec_bin(loadkeys_t) + corecmd_exec_shell(loadkeys_t) + +-files_read_etc_files(loadkeys_t) + files_read_etc_runtime_files(loadkeys_t) + + term_dontaudit_use_console(loadkeys_t) + term_use_unallocated_ttys(loadkeys_t) + ++auth_read_passwd(loadkeys_t) ++ + init_dontaudit_use_fds(loadkeys_t) + init_dontaudit_use_script_ptys(loadkeys_t) + + locallogin_use_fds(loadkeys_t) + +-miscfiles_read_localization(loadkeys_t) +- +-userdom_use_user_ttys(loadkeys_t) ++userdom_use_inherited_user_ttys(loadkeys_t) + userdom_list_user_home_content(loadkeys_t) + + ifdef(`hide_broken_symptoms',` +@@ -52,3 +51,8 @@ optional_policy(` + optional_policy(` + nscd_dontaudit_search_pid(loadkeys_t) + ') ++ ++optional_policy(` ++ sssd_read_public_files(loadkeys_t) ++ sssd_stream_connect(loadkeys_t) ++') +diff --git a/lockdev.if b/lockdev.if +index 4313b8bc0b..cd1435cdf2 100644 +--- a/lockdev.if ++++ b/lockdev.if +@@ -1,5 +1,25 @@ + ## Library for locking devices. + ++####################################### ++## ++## Create, read, write, and delete ++## lockdev lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lockdev_manage_files',` ++ gen_require(` ++ type lockdev_lock_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, lockdev_lock_t, lockdev_lock_t) ++') ++ + ######################################## + ## + ## Role access for lockdev. +diff --git a/lockdev.te b/lockdev.te +index 61db5a0a70..9d5d255241 100644 +--- a/lockdev.te ++++ b/lockdev.te +@@ -36,4 +36,5 @@ fs_getattr_xattr_fs(lockdev_t) + + logging_send_syslog_msg(lockdev_t) + +-userdom_use_user_terminals(lockdev_t) ++userdom_use_inherited_user_terminals(lockdev_t) ++ +diff --git a/logrotate.fc b/logrotate.fc +index a11d5be993..dc14626a90 100644 +--- a/logrotate.fc ++++ b/logrotate.fc +@@ -1,6 +1,7 @@ +-/etc/cron\.(daily|weekly)/sysklogd -- gen_context(system_u:object_r:logrotate_exec_t,s0) ++/etc/cron\.(daily|weekly)/sysklogd -- gen_context(system_u:object_r:logrotate_exec_t,s0) + + /usr/sbin/logrotate -- gen_context(system_u:object_r:logrotate_exec_t,s0) + + /var/lib/logrotate(/.*)? gen_context(system_u:object_r:logrotate_var_lib_t,s0) +-/var/lib/logrotate\.status -- gen_context(system_u:object_r:logrotate_var_lib_t,s0) ++/var/lib/logrotate\.status.* -- gen_context(system_u:object_r:logrotate_var_lib_t,s0) ++ +diff --git a/logrotate.if b/logrotate.if +index dd8e01af35..9cd6b0b8e1 100644 +--- a/logrotate.if ++++ b/logrotate.if +@@ -1,4 +1,4 @@ +-## Rotates, compresses, removes and mails system log files. ++## Rotate and archive system logs + + ######################################## + ## +@@ -21,9 +21,8 @@ interface(`logrotate_domtrans',` + + ######################################## + ## +-## Execute logrotate in the logrotate +-## domain, and allow the specified +-## role the logrotate domain. ++## Execute logrotate in the logrotate domain, and ++## allow the specified role the logrotate domain. + ## + ## + ## +@@ -39,11 +38,11 @@ interface(`logrotate_domtrans',` + # + interface(`logrotate_run',` + gen_require(` +- attribute_role logrotate_roles; ++ type logrotate_t; + ') + + logrotate_domtrans($1) +- roleattribute $2 logrotate_roles; ++ role $2 types logrotate_t; + ') + + ######################################## +@@ -85,8 +84,7 @@ interface(`logrotate_use_fds',` + + ######################################## + ## +-## Do not audit attempts to inherit +-## logrotate file descriptors. ++## Do not audit attempts to inherit logrotate file descriptors. + ## + ## + ## +@@ -104,7 +102,7 @@ interface(`logrotate_dontaudit_use_fds',` + + ######################################## + ## +-## Read logrotate temporary files. ++## Read a logrotate temporary files. + ## + ## + ## +diff --git a/logrotate.te b/logrotate.te +index be0ab84b35..a283ea42cf 100644 +--- a/logrotate.te ++++ b/logrotate.te +@@ -5,16 +5,33 @@ policy_module(logrotate, 1.15.0) + # Declarations + # + +-attribute_role logrotate_roles; +-roleattribute system_r logrotate_roles; ++gen_require(` ++ class passwd passwd; ++') ++ ++## ++##

      ++## Allow logrotate to manage nfs files ++##

      ++##
      ++gen_tunable(logrotate_use_nfs, false) ++ ++## ++##

      ++## Allow logrotate to read logs inside ++##

      ++##
      ++gen_tunable(logrotate_read_inside_containers, false) ++ + + type logrotate_t; +-type logrotate_exec_t; + domain_type(logrotate_t) + domain_obj_id_change_exemption(logrotate_t) + domain_system_change_exemption(logrotate_t) ++role system_r types logrotate_t; ++ ++type logrotate_exec_t; + domain_entry_file(logrotate_t, logrotate_exec_t) +-role logrotate_roles types logrotate_t; + + type logrotate_lock_t; + files_lock_file(logrotate_lock_t) +@@ -25,21 +42,30 @@ files_tmp_file(logrotate_tmp_t) + type logrotate_var_lib_t; + files_type(logrotate_var_lib_t) + +-mta_base_mail_template(logrotate) +-role system_r types logrotate_mail_t; +- + ######################################## + # + # Local policy + # + +-allow logrotate_t self:capability { chown dac_override dac_read_search kill fsetid fowner setuid setgid sys_resource sys_nice }; +-allow logrotate_t self:process ~{ ptrace setcurrent setexec setrlimit execmem execstack execheap }; ++# Change ownership on log files. ++allow logrotate_t self:capability { chown dac_override dac_read_search kill fsetid fowner setuid setgid sys_resource sys_nice sys_ptrace }; ++dontaudit logrotate_t self:capability { sys_resource net_admin }; ++ ++allow logrotate_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++ ++allow logrotate_t self:passwd { passwd }; ++ ++# Set a context other than the default one for newly created files. ++allow logrotate_t self:process setfscreate; ++ + allow logrotate_t self:fd use; + allow logrotate_t self:key manage_key_perms; + allow logrotate_t self:fifo_file rw_fifo_file_perms; ++allow logrotate_t self:unix_dgram_socket create_socket_perms; ++allow logrotate_t self:unix_stream_socket create_stream_socket_perms; + allow logrotate_t self:unix_dgram_socket sendto; +-allow logrotate_t self:unix_stream_socket { accept connectto listen }; ++allow logrotate_t self:unix_stream_socket connectto; ++allow logrotate_t self:netlink_selinux_socket create_socket_perms; + allow logrotate_t self:shm create_shm_perms; + allow logrotate_t self:sem create_sem_perms; + allow logrotate_t self:msgq create_msgq_perms; +@@ -48,36 +74,53 @@ allow logrotate_t self:msg { send receive }; + allow logrotate_t logrotate_lock_t:file manage_file_perms; + files_lock_filetrans(logrotate_t, logrotate_lock_t, file) + ++can_exec(logrotate_t, logrotate_tmp_t) ++ + manage_dirs_pattern(logrotate_t, logrotate_tmp_t, logrotate_tmp_t) + manage_files_pattern(logrotate_t, logrotate_tmp_t, logrotate_tmp_t) + files_tmp_filetrans(logrotate_t, logrotate_tmp_t, { file dir }) + ++# for /var/lib/logrotate.status and /var/lib/logcheck + create_dirs_pattern(logrotate_t, logrotate_var_lib_t, logrotate_var_lib_t) + manage_files_pattern(logrotate_t, logrotate_var_lib_t, logrotate_var_lib_t) + read_lnk_files_pattern(logrotate_t, logrotate_var_lib_t, logrotate_var_lib_t) + files_var_lib_filetrans(logrotate_t, logrotate_var_lib_t, file) + +-can_exec(logrotate_t, logrotate_tmp_t) +- + kernel_read_system_state(logrotate_t) + kernel_read_kernel_sysctls(logrotate_t) + ++dev_read_urand(logrotate_t) ++dev_read_sysfs(logrotate_t) ++dev_write_kmsg(logrotate_t) ++ ++fs_search_auto_mountpoints(logrotate_t) ++fs_getattr_all_fs(logrotate_t) ++fs_list_inotifyfs(logrotate_t) ++ ++mls_file_read_all_levels(logrotate_t) ++mls_file_write_all_levels(logrotate_t) ++mls_file_upgrade(logrotate_t) ++mls_process_write_to_clearance(logrotate_t) ++ ++selinux_get_fs_mount(logrotate_t) ++selinux_get_enforce_mode(logrotate_t) ++ ++# Run helper programs. + corecmd_exec_bin(logrotate_t) + corecmd_exec_shell(logrotate_t) + corecmd_getattr_all_executables(logrotate_t) + +-dev_read_urand(logrotate_t) +- + domain_signal_all_domains(logrotate_t) + domain_use_interactive_fds(logrotate_t) + domain_getattr_all_entry_files(logrotate_t) ++# Read /proc/PID directories for all domains. + domain_read_all_domains_state(logrotate_t) + +-files_read_usr_files(logrotate_t) + files_read_etc_runtime_files(logrotate_t) + files_read_all_pids(logrotate_t) + files_search_all(logrotate_t) + files_read_var_lib_files(logrotate_t) ++# Write to /var/spool/slrnpull - should be moved into its own type. + files_manage_generic_spool(logrotate_t) + files_manage_generic_spool_dirs(logrotate_t) + files_getattr_generic_locks(logrotate_t) +@@ -95,32 +138,58 @@ mls_process_write_to_clearance(logrotate_t) + selinux_get_fs_mount(logrotate_t) + selinux_get_enforce_mode(logrotate_t) + ++application_exec_all(logrotate_t) ++ ++auth_domtrans_chk_passwd(logrotate_t) + auth_manage_login_records(logrotate_t) + auth_use_nsswitch(logrotate_t) + + init_all_labeled_script_domtrans(logrotate_t) ++init_reload_services(logrotate_t) ++init_reload_transient_unit(logrotate_t) + + logging_manage_all_logs(logrotate_t) + logging_send_syslog_msg(logrotate_t) + logging_send_audit_msgs(logrotate_t) ++# cjp: why is this needed? + logging_exec_all_logs(logrotate_t) + +-miscfiles_read_localization(logrotate_t) ++systemd_exec_systemctl(logrotate_t) ++systemd_getattr_unit_files(logrotate_t) ++systemd_start_all_unit_files(logrotate_t) ++systemd_reload_all_services(logrotate_t) ++systemd_status_all_unit_files(logrotate_t) ++systemd_dbus_chat_logind(logrotate_t) ++systemd_config_generic_services(logrotate_t) ++init_stream_connect(logrotate_t) ++init_reload_transient_unit(logrotate_t) ++ ++miscfiles_read_hwdata(logrotate_t) + +-seutil_dontaudit_read_config(logrotate_t) ++term_dontaudit_use_unallocated_ttys(logrotate_t) + +-userdom_use_user_terminals(logrotate_t) ++userdom_use_inherited_user_terminals(logrotate_t) + userdom_list_user_home_dirs(logrotate_t) + userdom_use_unpriv_users_fds(logrotate_t) ++userdom_list_admin_dir(logrotate_t) ++userdom_dontaudit_getattr_user_home_content(logrotate_t) + +-mta_sendmail_domtrans(logrotate_t, logrotate_mail_t) ++tunable_policy(`logrotate_use_nfs',` ++ fs_manage_nfs_files(logrotate_t) ++ fs_manage_nfs_dirs(logrotate_t) ++ fs_manage_nfs_symlinks(logrotate_t) ++') + +-ifdef(`distro_debian',` ++ifdef(`distro_debian', ` + allow logrotate_t logrotate_tmp_t:file relabel_file_perms; ++ # for savelog + can_exec(logrotate_t, logrotate_exec_t) + +- logging_check_exec_syslog(logrotate_t) ++ # for syslogd-listfiles + logging_read_syslog_config(logrotate_t) ++ ++ # for "test -x /sbin/syslogd" ++ logging_check_exec_syslog(logrotate_t) + ') + + optional_policy(` +@@ -135,16 +204,17 @@ optional_policy(` + + optional_policy(` + apache_read_config(logrotate_t) ++ apache_read_sys_content_rw_dirs(logrotate_t) + apache_domtrans(logrotate_t) + apache_signull(logrotate_t) + ') + + optional_policy(` +- asterisk_domtrans(logrotate_t) ++ awstats_domtrans(logrotate_t) + ') + + optional_policy(` +- awstats_domtrans(logrotate_t) ++ asterisk_domtrans(logrotate_t) + ') + + optional_policy(` +@@ -160,6 +230,10 @@ optional_policy(` + consoletype_exec(logrotate_t) + ') + ++optional_policy(` ++ collectd_manage_rw_content(logrotate_t) ++') ++ + optional_policy(` + cron_system_entry(logrotate_t, logrotate_exec_t) + cron_search_spool(logrotate_t) +@@ -170,6 +244,11 @@ optional_policy(` + ') + + optional_policy(` ++ dbus_system_bus_client(logrotate_t) ++') ++ ++optional_policy(` ++ fail2ban_domtrans_client(logrotate_t) + fail2ban_stream_connect(logrotate_t) + ') + +@@ -178,7 +257,8 @@ optional_policy(` + ') + + optional_policy(` +- chronyd_read_key_files(logrotate_t) ++ chronyd_domtrans_chronyc(logrotate_t) ++ chronyd_read_keys(logrotate_t) + ') + + optional_policy(` +@@ -198,23 +278,32 @@ optional_policy(` + ') + + optional_policy(` ++ mysql_read_home_content(logrotate_t) + mysql_read_config(logrotate_t) ++ mysql_search_db(logrotate_t) + mysql_stream_connect(logrotate_t) + ') + + optional_policy(` +- openvswitch_read_pid_files(logrotate_t) +- openvswitch_domtrans(logrotate_t) ++ polipo_named_filetrans_log_files(logrotate_t) + ') + + optional_policy(` +- polipo_log_filetrans_log(logrotate_t, file, "polipo") ++ prosody_stream_connect(logrotate_t) + ') + + optional_policy(` + psad_domtrans(logrotate_t) + ') + ++optional_policy(` ++ rabbitmq_domtrans(logrotate_t) ++') ++ ++optional_policy(` ++ raid_domtrans_mdadm(logrotate_t) ++') ++ + optional_policy(` + samba_exec_log(logrotate_t) + ') +@@ -227,27 +316,51 @@ optional_policy(` + slrnpull_manage_spool(logrotate_t) + ') + ++optional_policy(` ++ openshift_manage_lib_files(logrotate_t) ++') ++ ++optional_policy(` ++ openvswitch_read_pid_files(logrotate_t) ++ openvswitch_domtrans(logrotate_t) ++') ++ + optional_policy(` + squid_domtrans(logrotate_t) ++ squid_read_config(logrotate_t) + ') + + optional_policy(` ++ #Red Hat bug 564565 + su_exec(logrotate_t) + ') + ++optional_policy(` ++ rpm_read_cache(logrotate_t) ++') ++ + optional_policy(` + varnishd_manage_log(logrotate_t) + ') + ++optional_policy(` ++ virt_manage_cache(logrotate_t) ++') ++ ++ ++optional_policy(` ++ tunable_policy(`logrotate_read_inside_containers',` ++ virt_read_sandbox_files(logrotate_t) ++ ') ++') ++ + ####################################### + # +-# Mail local policy ++# logrotate_mail local policy + # + +-allow logrotate_mail_t logrotate_t:fd use; +-allow logrotate_mail_t logrotate_t:fifo_file rw_fifo_file_perms; +-allow logrotate_mail_t logrotate_t:process sigchld; +- +-manage_files_pattern(logrotate_mail_t, logrotate_tmp_t, logrotate_tmp_t) +- ++mta_base_mail_template(logrotate) ++mta_sendmail_domtrans(logrotate_t, logrotate_mail_t) ++role system_r types logrotate_mail_t; + logging_read_all_logs(logrotate_mail_t) ++manage_files_pattern(logrotate_mail_t, logrotate_tmp_t, logrotate_tmp_t) +diff --git a/logwatch.if b/logwatch.if +index 06c3d36caa..37e71b3d7d 100644 +--- a/logwatch.if ++++ b/logwatch.if +@@ -37,3 +37,42 @@ interface(`logwatch_search_cache_dir',` + files_search_var($1) + allow $1 logwatch_cache_t:dir search_dir_perms; + ') ++ ++####################################### ++## ++## Dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`logwatch_dontaudit_leaks',` ++ gen_require(` ++ type logwatch_t; ++ ') ++ ++ dontaudit $1 logwatch_t:fifo_file { read write }; ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## svirt cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`logwatch_manage_cache',` ++ gen_require(` ++ type logwatch_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, logwatch_cache_t, logwatch_cache_t) ++ manage_dirs_pattern($1, logwatch_cache_t, logwatch_cache_t) ++') +diff --git a/logwatch.te b/logwatch.te +index ab650340c1..6d6816bb67 100644 +--- a/logwatch.te ++++ b/logwatch.te +@@ -15,7 +15,8 @@ gen_tunable(logwatch_can_network_connect_mail, false) + + type logwatch_t; + type logwatch_exec_t; +-init_system_domain(logwatch_t, logwatch_exec_t) ++init_daemon_domain(logwatch_t, logwatch_exec_t) ++application_domain(logwatch_t, logwatch_exec_t) + + type logwatch_cache_t; + files_type(logwatch_cache_t) +@@ -45,7 +46,8 @@ allow logwatch_t self:unix_stream_socket { accept listen }; + manage_dirs_pattern(logwatch_t, logwatch_cache_t, logwatch_cache_t) + manage_files_pattern(logwatch_t, logwatch_cache_t, logwatch_cache_t) + +-allow logwatch_t logwatch_lock_t:file manage_file_perms; ++manage_files_pattern(logwatch_t, logwatch_lock_t, logwatch_lock_t) ++manage_dirs_pattern(logwatch_t, logwatch_lock_t, logwatch_lock_t) + files_lock_filetrans(logwatch_t, logwatch_lock_t, file) + + manage_dirs_pattern(logwatch_t, logwatch_tmp_t, logwatch_tmp_t) +@@ -61,6 +63,11 @@ kernel_read_system_state(logwatch_t) + kernel_read_net_sysctls(logwatch_t) + kernel_read_network_state(logwatch_t) + ++corenet_all_recvfrom_unlabeled(logwatch_t) ++corenet_all_recvfrom_netlabel(logwatch_t) ++corenet_tcp_sendrecv_generic_if(logwatch_t) ++corenet_tcp_sendrecv_generic_node(logwatch_t) ++ + corecmd_exec_bin(logwatch_t) + corecmd_exec_shell(logwatch_t) + +@@ -75,10 +82,11 @@ files_list_var(logwatch_t) + files_search_all(logwatch_t) + files_read_var_symlinks(logwatch_t) + files_read_etc_runtime_files(logwatch_t) +-files_read_usr_files(logwatch_t) ++files_read_system_conf_files(logwatch_t) + + fs_getattr_all_dirs(logwatch_t) + fs_getattr_all_fs(logwatch_t) ++fs_getattr_all_dirs(logwatch_t) + fs_dontaudit_list_auto_mountpoints(logwatch_t) + fs_list_inotifyfs(logwatch_t) + +@@ -100,23 +108,16 @@ libs_read_lib_files(logwatch_t) + logging_read_all_logs(logwatch_t) + logging_send_syslog_msg(logwatch_t) + +-miscfiles_read_localization(logwatch_t) ++miscfiles_read_hwdata(logwatch_t) + + selinux_dontaudit_getattr_dir(logwatch_t) + + sysnet_exec_ifconfig(logwatch_t) + +-userdom_dontaudit_search_user_home_dirs(logwatch_t) +- + mta_sendmail_domtrans(logwatch_t, logwatch_mail_t) + mta_getattr_spool(logwatch_t) + + tunable_policy(`logwatch_can_network_connect_mail',` +- corenet_all_recvfrom_unlabeled(logwatch_t) +- corenet_all_recvfrom_netlabel(logwatch_t) +- corenet_tcp_sendrecv_generic_if(logwatch_t) +- corenet_tcp_sendrecv_generic_node(logwatch_t) +- + corenet_sendrecv_smtp_client_packets(logwatch_t) + corenet_tcp_connect_smtp_port(logwatch_t) + corenet_tcp_sendrecv_smtp_port(logwatch_t) +@@ -159,6 +160,16 @@ optional_policy(` + ntp_domtrans(logwatch_t) + ') + ++optional_policy(` ++ postfix_domtrans_postqueue(logwatch_t) ++') ++ ++optional_policy(` ++ raid_domtrans_mdadm(logwatch_t) ++ raid_access_check_mdadm(logwatch_t) ++ raid_read_conf_files(logwatch_t) ++') ++ + optional_policy(` + rpc_search_nfs_state_data(logwatch_t) + ') +@@ -187,6 +198,19 @@ dev_read_sysfs(logwatch_mail_t) + + logging_read_all_logs(logwatch_mail_t) + ++mta_read_home(logwatch_mail_t) ++mta_filetrans_home_content(logwatch_mail_t) ++mta_filetrans_admin_home_content(logwatch_mail_t) ++ + optional_policy(` + cron_use_system_job_fds(logwatch_mail_t) + ') ++ ++optional_policy(` ++ courier_stream_connect_authdaemon(logwatch_mail_t) ++') ++ ++optional_policy(` ++ qmail_domtrans_inject(logwatch_mail_t) ++ qmail_domtrans_queue(logwatch_mail_t) ++') +diff --git a/lpd.fc b/lpd.fc +index 2fb9b2ec28..08974e3760 100644 +--- a/lpd.fc ++++ b/lpd.fc +@@ -19,6 +19,7 @@ + /usr/sbin/lpinfo -- gen_context(system_u:object_r:lpr_exec_t,s0) + /usr/sbin/lpmove -- gen_context(system_u:object_r:lpr_exec_t,s0) + ++/usr/linuxprinter/bin/l?lpr -- gen_context(system_u:object_r:lpr_exec_t,s0) + /usr/local/linuxprinter/bin/l?lpr -- gen_context(system_u:object_r:lpr_exec_t,s0) + + /usr/share/printconf/.* -- gen_context(system_u:object_r:printconf_t,s0) +diff --git a/lpd.if b/lpd.if +index 62563717b4..ce2acb8815 100644 +--- a/lpd.if ++++ b/lpd.if +@@ -1,44 +1,49 @@ +-## Line printer daemon. ++## Line printer daemon + + ######################################## + ## +-## Role access for lpd. ++## Role access for lpd + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## ++## + # + interface(`lpd_role',` + gen_require(` + attribute_role lpr_roles; +- type lpr_t, lpr_exec_t; ++ type lpr_t, lpr_exec_t, print_spool_t; + ') + +- ######################################## +- # +- # Declarations +- # ++ ######################################## ++ # ++ # Declarations ++ # + + roleattribute $1 lpr_roles; + +- ######################################## +- # +- # Policy +- # ++ ######################################## ++ # ++ # Policy ++ # + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, lpr_exec_t, lpr_t) ++ dontaudit lpr_t $2:unix_stream_socket { read write }; + +- allow $2 lpr_t:process { ptrace signal_perms }; + ps_process_pattern($2, lpr_t) ++ allow $2 lpr_t:process signal_perms; + +- dontaudit lpr_t $2:unix_stream_socket { read write }; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 lpr_t:process ptrace; ++ ') + + optional_policy(` + cups_read_config($2) +@@ -60,15 +65,13 @@ interface(`lpd_domtrans_checkpc',` + type checkpc_t, checkpc_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, checkpc_exec_t, checkpc_t) + ') + + ######################################## + ## +-## Execute amrecover in the lpd +-## domain, and allow the specified +-## role the lpd domain. ++## Execute amrecover in the lpd domain, and ++## allow the specified role the lpd domain. + ## + ## + ## +@@ -84,16 +87,16 @@ interface(`lpd_domtrans_checkpc',` + # + interface(`lpd_run_checkpc',` + gen_require(` +- attribute_role checkpc_roles; ++ type checkpc_t; + ') + + lpd_domtrans_checkpc($1) +- roleattribute $2 checkpc_roles; ++ role $2 types checkpc_t; + ') + + ######################################## + ## +-## List printer spool directories. ++## List the contents of the printer spool directories. + ## + ## + ## +@@ -112,7 +115,7 @@ interface(`lpd_list_spool',` + + ######################################## + ## +-## Read printer spool files. ++## Read the printer spool files. + ## + ## + ## +@@ -131,8 +134,7 @@ interface(`lpd_read_spool',` + + ######################################## + ## +-## Create, read, write, and delete +-## printer spool content. ++## Create, read, write, and delete printer spool files. + ## + ## + ## +@@ -149,11 +151,12 @@ interface(`lpd_manage_spool',` + manage_dirs_pattern($1, print_spool_t, print_spool_t) + manage_files_pattern($1, print_spool_t, print_spool_t) + manage_lnk_files_pattern($1, print_spool_t, print_spool_t) ++ manage_fifo_files_pattern($1, print_spool_t, print_spool_t) + ') + + ######################################## + ## +-## Relabel spool files. ++## Relabel from and to the spool files. + ## + ## + ## +@@ -172,7 +175,7 @@ interface(`lpd_relabel_spool',` + + ######################################## + ## +-## Read printer configuration files. ++## List the contents of the printer spool directories. + ## + ## + ## +@@ -200,12 +203,11 @@ interface(`lpd_read_config',` + ## + ## + # +-template(`lpd_domtrans_lpr',` ++interface(`lpd_domtrans_lpr',` + gen_require(` + type lpr_t, lpr_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, lpr_exec_t, lpr_t) + ') + +@@ -237,7 +239,8 @@ interface(`lpd_run_lpr',` + + ######################################## + ## +-## Execute lpr in the caller domain. ++## Allow the specified domain to execute lpr ++## in the caller domain. + ## + ## + ## +@@ -250,6 +253,5 @@ interface(`lpd_exec_lpr',` + type lpr_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, lpr_exec_t) + ') +diff --git a/lpd.te b/lpd.te +index 39d31640ed..1ec2cd26eb 100644 +--- a/lpd.te ++++ b/lpd.te +@@ -48,7 +48,7 @@ userdom_user_tmp_file(lpr_tmp_t) + type print_spool_t; + typealias print_spool_t alias { user_print_spool_t staff_print_spool_t sysadm_print_spool_t }; + typealias print_spool_t alias { auditadm_print_spool_t secadm_print_spool_t }; +-files_type(print_spool_t) ++files_spool_file(print_spool_t) + ubac_constrained(print_spool_t) + + type printer_t; +@@ -62,7 +62,7 @@ files_config_file(printconf_t) + # Checkpc local policy + # + +-allow checkpc_t self:capability { setgid setuid dac_override }; ++allow checkpc_t self:capability { setgid setuid dac_read_search dac_override }; + allow checkpc_t self:process signal_perms; + allow checkpc_t self:unix_stream_socket create_socket_perms; + allow checkpc_t self:tcp_socket create_socket_perms; +@@ -81,7 +81,6 @@ allow checkpc_t printconf_t:dir list_dir_perms; + + kernel_read_system_state(checkpc_t) + +-corenet_all_recvfrom_unlabeled(checkpc_t) + corenet_all_recvfrom_netlabel(checkpc_t) + corenet_tcp_sendrecv_generic_if(checkpc_t) + corenet_tcp_sendrecv_generic_node(checkpc_t) +@@ -97,7 +96,6 @@ dev_append_printer(checkpc_t) + + domain_use_interactive_fds(checkpc_t) + +-files_read_etc_files(checkpc_t) + files_read_etc_runtime_files(checkpc_t) + files_search_pids(checkpc_t) + files_search_spool(checkpc_t) +@@ -107,7 +105,7 @@ init_use_fds(checkpc_t) + + sysnet_read_config(checkpc_t) + +-userdom_use_user_terminals(checkpc_t) ++userdom_use_inherited_user_terminals(checkpc_t) + + optional_policy(` + cron_system_entry(checkpc_t, checkpc_exec_t) +@@ -155,7 +153,6 @@ can_exec(lpd_t, printconf_t) + kernel_read_kernel_sysctls(lpd_t) + kernel_read_system_state(lpd_t) + +-corenet_all_recvfrom_unlabeled(lpd_t) + corenet_all_recvfrom_netlabel(lpd_t) + corenet_tcp_sendrecv_generic_if(lpd_t) + corenet_tcp_sendrecv_generic_node(lpd_t) +@@ -174,14 +171,12 @@ dev_rw_printer(lpd_t) + domain_use_interactive_fds(lpd_t) + + files_read_etc_runtime_files(lpd_t) +-files_read_usr_files(lpd_t) + files_list_world_readable(lpd_t) + files_read_world_readable_files(lpd_t) + files_read_world_readable_symlinks(lpd_t) + files_list_var_lib(lpd_t) + files_read_var_lib_files(lpd_t) + files_read_var_lib_symlinks(lpd_t) +-files_read_etc_files(lpd_t) + files_search_spool(lpd_t) + + fs_getattr_all_fs(lpd_t) +@@ -190,7 +185,6 @@ fs_search_auto_mountpoints(lpd_t) + logging_send_syslog_msg(lpd_t) + + miscfiles_read_fonts(lpd_t) +-miscfiles_read_localization(lpd_t) + + sysnet_read_config(lpd_t) + +@@ -214,7 +208,7 @@ optional_policy(` + # Lpr local policy + # + +-allow lpr_t self:capability { setuid dac_override net_bind_service chown }; ++allow lpr_t self:capability { setuid dac_read_search dac_override net_bind_service chown }; + allow lpr_t self:unix_stream_socket { accept listen }; + + allow lpd_t print_spool_t:file { read_file_perms rename_file_perms delete_file_perms }; +@@ -224,7 +218,6 @@ can_exec(lpr_t, lpr_exec_t) + kernel_read_crypto_sysctls(lpr_t) + kernel_read_kernel_sysctls(lpr_t) + +-corenet_all_recvfrom_unlabeled(lpr_t) + corenet_all_recvfrom_netlabel(lpr_t) + corenet_tcp_sendrecv_generic_if(lpr_t) + corenet_tcp_sendrecv_generic_node(lpr_t) +@@ -239,7 +232,6 @@ dev_read_urand(lpr_t) + domain_use_interactive_fds(lpr_t) + + files_search_spool(lpr_t) +-files_read_usr_files(lpr_t) + files_list_home(lpr_t) + + fs_getattr_all_fs(lpr_t) +@@ -249,23 +241,27 @@ term_use_generic_ptys(lpr_t) + + auth_use_nsswitch(lpr_t) + +-logging_send_syslog_msg(lpr_t) +- + miscfiles_read_fonts(lpr_t) +-miscfiles_read_localization(lpr_t) + + userdom_read_user_tmp_symlinks(lpr_t) +-userdom_use_user_terminals(lpr_t) ++# Write to the user domain tty. ++userdom_use_inherited_user_terminals(lpr_t) + userdom_read_user_home_content_files(lpr_t) + userdom_read_user_tmp_files(lpr_t) ++userdom_write_user_tmp_sockets(lpr_t) ++userdom_stream_connect(lpr_t) + + tunable_policy(`use_lpd_server',` +- allow lpr_t lpd_t:process signal; +- +- write_sock_files_pattern(lpr_t, lpd_var_run_t, lpd_var_run_t) ++ # lpr can run in lightweight mode, without a local print spooler. ++ allow lpr_t lpd_var_run_t:dir search_dir_perms; ++ allow lpr_t lpd_var_run_t:sock_file write_sock_file_perms; + files_read_var_files(lpr_t) + ++ # Connect to lpd via a Unix domain socket. ++ allow lpr_t printer_t:sock_file read_sock_file_perms; + stream_connect_pattern(lpr_t, printer_t, printer_t, lpd_t) ++ # Send SIGHUP to lpd. ++ allow lpr_t lpd_t:process signal; + + manage_dirs_pattern(lpr_t, lpr_tmp_t, lpr_tmp_t) + manage_files_pattern(lpr_t, lpr_tmp_t, lpr_tmp_t) +@@ -279,17 +275,7 @@ tunable_policy(`use_lpd_server',` + allow lpr_t printconf_t:lnk_file read_lnk_file_perms; + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_list_auto_mountpoints(lpr_t) +- fs_read_nfs_files(lpr_t) +- fs_read_nfs_symlinks(lpr_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_list_auto_mountpoints(lpr_t) +- fs_read_cifs_files(lpr_t) +- fs_read_cifs_symlinks(lpr_t) +-') ++userdom_home_reader(lpr_t) + + optional_policy(` + cups_read_config(lpr_t) +@@ -298,5 +284,13 @@ optional_policy(` + ') + + optional_policy(` +- gnome_stream_connect_all_gkeyringd(lpr_t) ++ gnome_stream_connect_gkeyringd(lpr_t) ++') ++ ++optional_policy(` ++ logging_send_syslog_msg(lpr_t) ++') ++ ++optional_policy(` ++ mozilla_plugin_dontaudit_rw_tmp_files(lpr_t) + ') +diff --git a/lsm.fc b/lsm.fc +index c455730535..6e14667940 100644 +--- a/lsm.fc ++++ b/lsm.fc +@@ -1,3 +1,7 @@ + /usr/bin/lsmd -- gen_context(system_u:object_r:lsmd_exec_t,s0) + ++/usr/bin/.*_lsmplugin -- gen_context(system_u:object_r:lsmd_plugin_exec_t,s0) ++ ++/usr/lib/systemd/system/libstoragemgmt.* -- gen_context(system_u:object_r:lsmd_unit_file_t,s0) ++ + /var/run/lsm(/.*)? gen_context(system_u:object_r:lsmd_var_run_t,s0) +diff --git a/lsm.if b/lsm.if +index d3143334dd..27ede090c4 100644 +--- a/lsm.if ++++ b/lsm.if +@@ -1,25 +1,86 @@ +-## Storage array management library. ++ ++## libStorageMgmt plug-in daemon + + ######################################## + ## +-## All of the rules required to administrate +-## an lsmd environment. ++## Execute TEMPLATE in the lsmd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`lsmd_domtrans',` ++ gen_require(` ++ type lsmd_t, lsmd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, lsmd_exec_t, lsmd_t) ++') ++######################################## ++## ++## Read lsmd PID files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`lsmd_read_pid_files',` ++ gen_require(` ++ type lsmd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, lsmd_var_run_t, lsmd_var_run_t) ++') ++ ++######################################## ++## ++## Execute lsmd server in the lsmd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`lsmd_systemctl',` ++ gen_require(` ++ type lsmd_t; ++ type lsmd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 lsmd_unit_file_t:file read_file_perms; ++ allow $1 lsmd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, lsmd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an lsmd environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## + # + interface(`lsmd_admin',` + gen_require(` +- type lsmd_t, type lsmd_var_run_t; ++ type lsmd_t; ++ type lsmd_var_run_t; ++ type lsmd_unit_file_t; + ') + + allow $1 lsmd_t:process { ptrace signal_perms }; +@@ -27,4 +88,13 @@ interface(`lsmd_admin',` + + files_search_pids($1) + admin_pattern($1, lsmd_var_run_t) ++ ++ lsmd_systemctl($1) ++ admin_pattern($1, lsmd_unit_file_t) ++ allow $1 lsmd_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/lsm.te b/lsm.te +index 4ec0eea306..45a3516462 100644 +--- a/lsm.te ++++ b/lsm.te +@@ -4,6 +4,13 @@ policy_module(lsm, 1.0.0) + # + # Declarations + # ++## ++##

      ++## Determine whether lsmd_plugin can ++## connect to all TCP ports. ++##

      ++##
      ++gen_tunable(lsmd_plugin_connect_any, false) + + type lsmd_t; + type lsmd_exec_t; +@@ -12,12 +19,23 @@ init_daemon_domain(lsmd_t, lsmd_exec_t) + type lsmd_var_run_t; + files_pid_file(lsmd_var_run_t) + ++type lsmd_unit_file_t; ++systemd_unit_file(lsmd_unit_file_t) ++ ++type lsmd_plugin_t; ++type lsmd_plugin_exec_t; ++application_domain(lsmd_plugin_t, lsmd_plugin_exec_t) ++role system_r types lsmd_plugin_t; ++ ++type lsmd_plugin_tmp_t; ++files_tmp_file(lsmd_plugin_tmp_t) ++ + ######################################## + # + # Local policy + # + +-allow lsmd_t self:capability setgid; ++allow lsmd_t self:capability { setuid setgid }; + allow lsmd_t self:unix_stream_socket create_stream_socket_perms; + + manage_dirs_pattern(lsmd_t, lsmd_var_run_t, lsmd_var_run_t) +@@ -26,4 +44,76 @@ manage_lnk_files_pattern(lsmd_t, lsmd_var_run_t, lsmd_var_run_t) + manage_sock_files_pattern(lsmd_t, lsmd_var_run_t, lsmd_var_run_t) + files_pid_filetrans(lsmd_t, lsmd_var_run_t, { dir file sock_file }) + ++auth_use_nsswitch(lsmd_t) ++ ++corecmd_exec_bin(lsmd_t) ++corecmd_getattr_all_executables(lsmd_t) ++ + logging_send_syslog_msg(lsmd_t) ++ ++optional_policy(` ++ rpm_debuginfo_domtrans(lsmd_t) ++') ++ ++######################################## ++# ++# Local lsmd plugin policy ++# ++ ++allow lsmd_plugin_t self:udp_socket create_socket_perms; ++allow lsmd_plugin_t self:tcp_socket create_stream_socket_perms; ++allow lsmd_plugin_t self:netlink_route_socket r_netlink_socket_perms; ++allow lsmd_plugin_t self:capability { sys_admin sys_rawio } ; ++ ++domtrans_pattern(lsmd_t, lsmd_plugin_exec_t, lsmd_plugin_t) ++allow lsmd_plugin_t lsmd_t:unix_stream_socket { read write }; ++ ++allow lsmd_t lsmd_plugin_exec_t:file { map read_file_perms }; ++stream_connect_pattern(lsmd_plugin_t, lsmd_var_run_t, lsmd_var_run_t, lsmd_t) ++ ++manage_files_pattern(lsmd_plugin_t, lsmd_plugin_tmp_t, lsmd_plugin_tmp_t) ++manage_dirs_pattern(lsmd_plugin_t, lsmd_plugin_tmp_t, lsmd_plugin_tmp_t) ++files_tmp_filetrans(lsmd_plugin_t, lsmd_plugin_tmp_t, { file dir }) ++ ++tunable_policy(`lsmd_plugin_connect_any',` ++ corenet_tcp_connect_all_ports(lsmd_plugin_t) ++ corenet_sendrecv_all_packets(lsmd_plugin_t) ++ corenet_tcp_sendrecv_all_ports(lsmd_plugin_t) ++') ++ ++kernel_read_system_state(lsmd_plugin_t) ++ ++auth_read_passwd(lsmd_plugin_t) ++ ++dev_read_urand(lsmd_plugin_t) ++dev_read_sysfs(lsmd_plugin_t) ++dev_getattr_sysfs_fs(lsmd_plugin_t) ++ ++corecmd_exec_bin(lsmd_plugin_t) ++ ++corenet_tcp_connect_http_port(lsmd_plugin_t) ++corenet_tcp_connect_http_cache_port(lsmd_plugin_t) ++corenet_tcp_connect_lsm_plugin_port(lsmd_plugin_t) ++corenet_tcp_connect_pegasus_https_port(lsmd_plugin_t) ++corenet_tcp_connect_pegasus_http_port(lsmd_plugin_t) ++corenet_tcp_connect_ssh_port(lsmd_plugin_t) ++ ++auth_use_nsswitch(lsmd_plugin_t) ++ ++init_stream_connect(lsmd_plugin_t) ++init_dontaudit_rw_stream_socket(lsmd_plugin_t) ++ ++libs_exec_ldconfig(lsmd_plugin_t) ++ ++logging_send_syslog_msg(lsmd_plugin_t) ++ ++miscfiles_read_certs(lsmd_plugin_t) ++miscfiles_read_hwdata(lsmd_plugin_t) ++ ++sysnet_read_config(lsmd_plugin_t) ++ ++storage_raw_rw_fixed_disk(lsmd_plugin_t) ++storage_create_fixed_disk_dev(lsmd_plugin_t) ++storage_read_scsi_generic(lsmd_plugin_t) ++storage_write_scsi_generic(lsmd_plugin_t) ++storage_dev_filetrans_named_fixed_disk(lsmd_plugin_t) +diff --git a/lttng-tools.fc b/lttng-tools.fc +new file mode 100644 +index 0000000000..bdd17ca85b +--- /dev/null ++++ b/lttng-tools.fc +@@ -0,0 +1,5 @@ ++/usr/bin/lttng-sessiond -- gen_context(system_u:object_r:lttng_sessiond_exec_t,s0) ++ ++/usr/lib/systemd/system/lttng-sessiond.service -- gen_context(system_u:object_r:lttng_sessiond_unit_file_t,s0) ++ ++/var/run/lttng(/.*)? gen_context(system_u:object_r:lttng_sessiond_var_run_t,s0) +diff --git a/lttng-tools.if b/lttng-tools.if +new file mode 100644 +index 0000000000..e86897d290 +--- /dev/null ++++ b/lttng-tools.if +@@ -0,0 +1,117 @@ ++ ++## LTTng 2.x central tracing registry session daemon. ++ ++######################################## ++## ++## Execute lttng_sessiond_exec_t in the lttng_sessiond domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`lttng_sessiond_domtrans',` ++ gen_require(` ++ type lttng_sessiond_t, lttng_sessiond_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, lttng_sessiond_exec_t, lttng_sessiond_t) ++') ++ ++###################################### ++## ++## Execute lttng_sessiond in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lttng_sessiond_exec',` ++ gen_require(` ++ type lttng_sessiond_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, lttng_sessiond_exec_t) ++') ++ ++######################################## ++## ++## Execute lttng_sessiond server in the lttng_sessiond domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`lttng_sessiond_systemctl',` ++ gen_require(` ++ type lttng_sessiond_t; ++ type lttng_sessiond_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 lttng_sessiond_unit_file_t:file read_file_perms; ++ allow $1 lttng_sessiond_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, lttng_sessiond_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an lttng_sessiond environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lttng_sessiond_admin',` ++ gen_require(` ++ type lttng_sessiond_t; ++ type lttng_sessiond_unit_file_t; ++ ') ++ ++ allow $1 lttng_sessiond_t:process { signal_perms }; ++ ps_process_pattern($1, lttng_sessiond_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 lttng_sessiond_t:process ptrace; ++ ') ++ ++ lttng_sessiond_systemctl($1) ++ admin_pattern($1, lttng_sessiond_unit_file_t) ++ allow $1 lttng_sessiond_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Read and write lttng-tools shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`lttng_read_shm',` ++ gen_require(` ++ type lttng_sessiond_tmpfs_t; ++ ') ++ ++ read_files_pattern($1, lttng_sessiond_tmpfs_t, lttng_sessiond_tmpfs_t) ++ fs_search_tmpfs($1) ++') +diff --git a/lttng-tools.te b/lttng-tools.te +new file mode 100644 +index 0000000000..1d2ca22240 +--- /dev/null ++++ b/lttng-tools.te +@@ -0,0 +1,60 @@ ++policy_module(lttng-tools, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type lttng_sessiond_t; ++type lttng_sessiond_exec_t; ++init_daemon_domain(lttng_sessiond_t, lttng_sessiond_exec_t) ++ ++type lttng_sessiond_tmpfs_t; ++files_tmpfs_file(lttng_sessiond_tmpfs_t) ++ ++type lttng_sessiond_var_run_t; ++files_pid_file(lttng_sessiond_var_run_t) ++ ++type lttng_sessiond_unit_file_t; ++systemd_unit_file(lttng_sessiond_unit_file_t) ++ ++######################################## ++# ++# lttng_sessiond local policy ++# ++ ++allow lttng_sessiond_t self:capability { chown setgid setuid fsetid net_admin sys_resource }; ++allow lttng_sessiond_t self:capability2 block_suspend; ++allow lttng_sessiond_t self:process { setrlimit signal_perms }; ++allow lttng_sessiond_t self:fifo_file rw_fifo_file_perms; ++allow lttng_sessiond_t self:tcp_socket listen; ++allow lttng_sessiond_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(lttng_sessiond_t, lttng_sessiond_var_run_t, lttng_sessiond_var_run_t) ++manage_files_pattern(lttng_sessiond_t, lttng_sessiond_var_run_t, lttng_sessiond_var_run_t) ++manage_lnk_files_pattern(lttng_sessiond_t, lttng_sessiond_var_run_t, lttng_sessiond_var_run_t) ++manage_sock_files_pattern(lttng_sessiond_t, lttng_sessiond_var_run_t, lttng_sessiond_var_run_t) ++files_pid_filetrans(lttng_sessiond_t, lttng_sessiond_var_run_t, { dir }) ++ ++manage_dirs_pattern(lttng_sessiond_t, lttng_sessiond_tmpfs_t, lttng_sessiond_tmpfs_t) ++manage_files_pattern(lttng_sessiond_t, lttng_sessiond_tmpfs_t, lttng_sessiond_tmpfs_t) ++fs_tmpfs_filetrans(lttng_sessiond_t, lttng_sessiond_tmpfs_t, { dir file }) ++ ++kernel_read_system_state(lttng_sessiond_t) ++kernel_read_net_sysctls(lttng_sessiond_t) ++kernel_read_fs_sysctls(lttng_sessiond_t) ++ ++corecmd_exec_shell(lttng_sessiond_t) ++ ++corenet_tcp_bind_generic_node(lttng_sessiond_t) ++corenet_tcp_bind_lltng_port(lttng_sessiond_t) ++ ++dev_read_sysfs(lttng_sessiond_t) ++ ++fs_getattr_tmpfs(lttng_sessiond_t) ++ ++auth_use_nsswitch(lttng_sessiond_t) ++ ++modutils_exec_insmod(lttng_sessiond_t) ++modutils_read_module_config(lttng_sessiond_t) ++files_read_kernel_modules(lttng_sessiond_t) +diff --git a/mailman.fc b/mailman.fc +index 995d0a5d34..3d40d59d2d 100644 +--- a/mailman.fc ++++ b/mailman.fc +@@ -2,10 +2,12 @@ + + /etc/mailman.* gen_context(system_u:object_r:mailman_data_t,s0) + ++/usr/lib/mailman/bin/mailmanctl -- gen_context(system_u:object_r:mailman_mail_exec_t,s0) + /usr/lib/mailman.*/bin/mailmanctl -- gen_context(system_u:object_r:mailman_mail_exec_t,s0) ++/usr/lib/mailman/bin/mm-handler.* -- gen_context(system_u:object_r:mailman_mail_exec_t,s0) + /usr/lib/mailman.*/bin/mm-handler.* -- gen_context(system_u:object_r:mailman_mail_exec_t,s0) + /usr/lib/mailman.*/cron/.* -- gen_context(system_u:object_r:mailman_queue_exec_t,s0) +-/var/lib/mailman.* gen_context(system_u:object_r:mailman_data_t,s0) ++/var/lib/mailman(/.*)? gen_context(system_u:object_r:mailman_data_t,s0) + /var/lib/mailman.*/archives(/.*)? gen_context(system_u:object_r:mailman_archive_t,s0) + + /var/lock/mailman.* gen_context(system_u:object_r:mailman_lock_t,s0) +diff --git a/mailman.if b/mailman.if +index 108c0f1f55..a2485018e2 100644 +--- a/mailman.if ++++ b/mailman.if +@@ -1,44 +1,70 @@ +-## Manage electronic mail discussion and e-newsletter lists. ++## Mailman is for managing electronic mail discussion and e-newsletter lists + + ####################################### + ## +-## The template to define a mailman domain. ++## The template to define a mailmain domain. + ## +-## ++## ++##

      ++## This template creates a domain to be used for ++## a new mailman daemon. ++##

      ++##
      ++## + ## +-## Domain prefix to be used. ++## The type of daemon to be used eg, cgi would give mailman_cgi_ + ## + ## + # +-template(`mailman_domain_template',` +- gen_require(` +- attribute mailman_domain; +- ') ++template(`mailman_domain_template', ` + +- ######################################## +- # +- # Declarations +- # ++ ######################################## ++ # ++ # Declarations ++ # + +- type mailman_$1_t; +- type mailman_$1_exec_t; ++ gen_require(` ++ attribute mailman_domain; ++ ') ++ ++ type mailman_$1_t, mailman_domain; + domain_type(mailman_$1_t) ++ type mailman_$1_exec_t; + domain_entry_file(mailman_$1_t, mailman_$1_exec_t) + role system_r types mailman_$1_t; + + type mailman_$1_tmp_t; + files_tmp_file(mailman_$1_tmp_t) + +- #################################### +- # +- # Policy +- # ++ #################################### ++ # ++ # Policy ++ # + + manage_dirs_pattern(mailman_$1_t, mailman_$1_tmp_t, mailman_$1_tmp_t) + manage_files_pattern(mailman_$1_t, mailman_$1_tmp_t, mailman_$1_tmp_t) + files_tmp_filetrans(mailman_$1_t, mailman_$1_tmp_t, { file dir }) + ++ kernel_read_system_state(mailman_$1_t) ++ ++ corenet_all_recvfrom_unlabeled(mailman_$1_t) ++ corenet_all_recvfrom_netlabel(mailman_$1_t) ++ corenet_tcp_sendrecv_generic_if(mailman_$1_t) ++ corenet_udp_sendrecv_generic_if(mailman_$1_t) ++ corenet_raw_sendrecv_generic_if(mailman_$1_t) ++ corenet_tcp_sendrecv_generic_node(mailman_$1_t) ++ corenet_udp_sendrecv_generic_node(mailman_$1_t) ++ corenet_raw_sendrecv_generic_node(mailman_$1_t) ++ corenet_tcp_sendrecv_all_ports(mailman_$1_t) ++ corenet_udp_sendrecv_all_ports(mailman_$1_t) ++ corenet_tcp_bind_generic_node(mailman_$1_t) ++ corenet_udp_bind_generic_node(mailman_$1_t) ++ corenet_tcp_connect_smtp_port(mailman_$1_t) ++ corenet_sendrecv_smtp_client_packets(mailman_$1_t) ++ + auth_use_nsswitch(mailman_$1_t) ++ ++ logging_send_syslog_msg(mailman_$1_t) + ') + + ####################################### +@@ -56,15 +82,12 @@ interface(`mailman_domtrans',` + type mailman_mail_exec_t, mailman_mail_t; + ') + +- libs_search_lib($1) + domtrans_pattern($1, mailman_mail_exec_t, mailman_mail_t) + ') + + ######################################## + ## +-## Execute the mailman program in the +-## mailman domain and allow the +-## specified role the mailman domain. ++## Execute the mailman program in the mailman domain. + ## + ## + ## +@@ -73,18 +96,18 @@ interface(`mailman_domtrans',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the mailman domain. + ## + ## + ## + # + interface(`mailman_run',` + gen_require(` +- attribute_role mailman_roles; ++ type mailman_mail_t; + ') + + mailman_domtrans($1) +- roleattribute $2 mailman_roles; ++ role $2 types mailman_mail_t; + ') + + ####################################### +@@ -103,7 +126,6 @@ interface(`mailman_domtrans_cgi',` + type mailman_cgi_exec_t, mailman_cgi_t; + ') + +- libs_search_lib($1) + domtrans_pattern($1, mailman_cgi_exec_t, mailman_cgi_t) + ') + +@@ -122,13 +144,12 @@ interface(`mailman_exec',` + type mailman_mail_exec_t; + ') + +- libs_search_lib($1) + can_exec($1, mailman_mail_exec_t) + ') + + ####################################### + ## +-## Send generic signals to mailman cgi. ++## Send generic signals to the mailman cgi domain. + ## + ## + ## +@@ -146,7 +167,7 @@ interface(`mailman_signal_cgi',` + + ####################################### + ## +-## Search mailman data directories. ++## Allow domain to search data directories. + ## + ## + ## +@@ -159,13 +180,12 @@ interface(`mailman_search_data',` + type mailman_data_t; + ') + +- files_search_spool($1) + allow $1 mailman_data_t:dir search_dir_perms; + ') + + ####################################### + ## +-## Read mailman data content. ++## Allow domain to to read mailman data files. + ## + ## + ## +@@ -178,7 +198,6 @@ interface(`mailman_read_data_files',` + type mailman_data_t; + ') + +- files_search_spool($1) + list_dirs_pattern($1, mailman_data_t, mailman_data_t) + read_files_pattern($1, mailman_data_t, mailman_data_t) + read_lnk_files_pattern($1, mailman_data_t, mailman_data_t) +@@ -186,8 +205,8 @@ interface(`mailman_read_data_files',` + + ####################################### + ## +-## Create, read, write, and delete +-## mailman data files. ++## Allow domain to to create mailman data files ++## and write the directory. + ## + ## + ## +@@ -200,14 +219,13 @@ interface(`mailman_manage_data_files',` + type mailman_data_t; + ') + +- files_search_spool($1) + manage_dirs_pattern($1, mailman_data_t, mailman_data_t) + manage_files_pattern($1, mailman_data_t, mailman_data_t) + ') + + ####################################### + ## +-## List mailman data directories. ++## List the contents of mailman data directories. + ## + ## + ## +@@ -220,13 +238,12 @@ interface(`mailman_list_data',` + type mailman_data_t; + ') + +- files_search_spool($1) + allow $1 mailman_data_t:dir list_dir_perms; + ') + + ####################################### + ## +-## Read mailman data symbolic links. ++## Allow read acces to mailman data symbolic links. + ## + ## + ## +@@ -244,7 +261,7 @@ interface(`mailman_read_data_symlinks',` + + ####################################### + ## +-## Read mailman log files. ++## Read mailman logs. + ## + ## + ## +@@ -257,13 +274,12 @@ interface(`mailman_read_log',` + type mailman_log_t; + ') + +- logging_search_logs($1) + read_files_pattern($1, mailman_log_t, mailman_log_t) + ') + + ####################################### + ## +-## Append mailman log files. ++## Append to mailman logs. + ## + ## + ## +@@ -276,14 +292,13 @@ interface(`mailman_append_log',` + type mailman_log_t; + ') + +- logging_search_logs($1) + append_files_pattern($1, mailman_log_t, mailman_log_t) + ') + + ####################################### + ## + ## Create, read, write, and delete +-## mailman log content. ++## mailman logs. + ## + ## + ## +@@ -296,14 +311,13 @@ interface(`mailman_manage_log',` + type mailman_log_t; + ') + +- logging_search_logs($1) + manage_files_pattern($1, mailman_log_t, mailman_log_t) + manage_lnk_files_pattern($1, mailman_log_t, mailman_log_t) + ') + + ####################################### + ## +-## Read mailman archive content. ++## Allow domain to read mailman archive files. + ## + ## + ## +@@ -316,7 +330,6 @@ interface(`mailman_read_archive',` + type mailman_archive_t; + ') + +- files_search_var_lib($1) + allow $1 mailman_archive_t:dir list_dir_perms; + read_files_pattern($1, mailman_archive_t, mailman_archive_t) + read_lnk_files_pattern($1, mailman_archive_t, mailman_archive_t) +@@ -324,8 +337,7 @@ interface(`mailman_read_archive',` + + ####################################### + ## +-## Execute mailman_queue in the +-## mailman_queue domain. ++## Execute mailman_queue in the mailman_queue domain. + ## + ## + ## +@@ -338,6 +350,5 @@ interface(`mailman_domtrans_queue',` + type mailman_queue_exec_t, mailman_queue_t; + ') + +- libs_search_lib($1) + domtrans_pattern($1, mailman_queue_exec_t, mailman_queue_t) + ') +diff --git a/mailman.te b/mailman.te +index ac81c7fa9a..2bbde0b7c7 100644 +--- a/mailman.te ++++ b/mailman.te +@@ -4,6 +4,12 @@ policy_module(mailman, 1.10.0) + # + # Declarations + # ++## ++##

      ++## Allow mailman to access FUSE file systems ++##

      ++##
      ++gen_tunable(mailman_use_fusefs, false) + + attribute mailman_domain; + +@@ -50,16 +56,12 @@ manage_lnk_files_pattern(mailman_domain, mailman_data_t, mailman_data_t) + manage_files_pattern(mailman_domain, mailman_lock_t, mailman_lock_t) + files_lock_filetrans(mailman_domain, mailman_lock_t, file) + +-append_files_pattern(mailman_domain, mailman_log_t, mailman_log_t) +-create_files_pattern(mailman_domain, mailman_log_t, mailman_log_t) +-setattr_files_pattern(mailman_domain, mailman_log_t, mailman_log_t) ++manage_files_pattern(mailman_domain, mailman_log_t, mailman_log_t) + logging_log_filetrans(mailman_domain, mailman_log_t, file) + + kernel_read_kernel_sysctls(mailman_domain) +-kernel_read_system_state(mailman_domain) ++kernel_read_network_state(mailman_domain) + +-corenet_all_recvfrom_unlabeled(mailman_domain) +-corenet_all_recvfrom_netlabel(mailman_domain) + corenet_tcp_sendrecv_generic_if(mailman_domain) + corenet_tcp_sendrecv_generic_node(mailman_domain) + +@@ -82,10 +84,6 @@ fs_getattr_all_fs(mailman_domain) + libs_exec_ld_so(mailman_domain) + libs_exec_lib_files(mailman_domain) + +-logging_send_syslog_msg(mailman_domain) +- +-miscfiles_read_localization(mailman_domain) +- + ######################################## + # + # CGI local policy +@@ -103,7 +101,7 @@ optional_policy(` + apache_dontaudit_append_log(mailman_cgi_t) + apache_search_sys_script_state(mailman_cgi_t) + apache_read_config(mailman_cgi_t) +- apache_dontaudit_rw_stream_sockets(mailman_cgi_t) ++ apache_rw_stream_sockets(mailman_cgi_t) + ') + + optional_policy(` +@@ -115,20 +113,23 @@ optional_policy(` + # Mail local policy + # + +-allow mailman_mail_t self:capability { kill dac_override setuid setgid sys_tty_config }; +-allow mailman_mail_t self:process { signal signull }; ++allow mailman_mail_t self:capability { kill dac_read_search dac_override setuid setgid sys_nice sys_tty_config }; ++allow mailman_mail_t self:process { setsched signal signull }; ++allow mailman_mail_t self:unix_dgram_socket create_socket_perms; + + manage_files_pattern(mailman_mail_t, mailman_var_run_t, mailman_var_run_t) + manage_dirs_pattern(mailman_mail_t, mailman_var_run_t, mailman_var_run_t) + files_pid_filetrans(mailman_mail_t, mailman_var_run_t, { file dir }) + ++can_exec(mailman_mail_t, mailman_mail_exec_t) ++ + corenet_sendrecv_innd_client_packets(mailman_mail_t) + corenet_tcp_connect_innd_port(mailman_mail_t) + corenet_tcp_sendrecv_innd_port(mailman_mail_t) + + corenet_sendrecv_spamd_client_packets(mailman_mail_t) +-corenet_tcp_connect_spamd_port(mailman_mail_t) + corenet_tcp_sendrecv_spamd_port(mailman_mail_t) ++corenet_tcp_connect_spamd_port(mailman_mail_t) + + dev_read_urand(mailman_mail_t) + +@@ -137,10 +138,18 @@ fs_rw_anon_inodefs_files(mailman_mail_t) + mta_dontaudit_rw_delivery_tcp_sockets(mailman_mail_t) + mta_dontaudit_rw_queue(mailman_mail_t) + ++optional_policy(` ++ apache_search_config(mailman_mail_t) ++') ++ + optional_policy(` + courier_read_spool(mailman_mail_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(mailman_mail_t) ++') ++ + optional_policy(` + cron_read_pipes(mailman_mail_t) + ') +@@ -182,3 +191,9 @@ optional_policy(` + optional_policy(` + su_exec(mailman_queue_t) + ') ++ ++tunable_policy(`mailman_use_fusefs',` ++ fs_manage_fusefs_dirs(mailman_domain) ++ fs_manage_fusefs_files(mailman_domain) ++ fs_manage_fusefs_symlinks(mailman_domain) ++') +diff --git a/mailscanner.if b/mailscanner.if +index 214cb44983..bd1d48e4fb 100644 +--- a/mailscanner.if ++++ b/mailscanner.if +@@ -2,29 +2,27 @@ + + ######################################## + ## +-## Create, read, write, and delete +-## mscan spool content. ++## Execute a domain transition to run ++## MailScanner. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`mscan_manage_spool_content',` ++interface(`mailscanner_initrc_domtrans',` + gen_require(` +- type mscan_spool_t; ++ type mscan_initrc_exec_t; + ') + +- files_search_spool($1) +- manage_dirs_pattern($1, mscan_spool_t, mscan_spool_t) +- manage_files_pattern($1, mscan_spool_t, mscan_spool_t) ++ init_labeled_script_domtrans($1, mscan_initrc_exec_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an mscan environment ++## All of the rules required to administrate ++## an mailscanner environment. + ## + ## + ## +@@ -38,26 +36,26 @@ interface(`mscan_manage_spool_content',` + ## + ## + # +-interface(`mscan_admin',` ++interface(`mailscanner_admin',` + gen_require(` +- type mscan_t, mscan_etc_t, mscan_initrc_exec_t; +- type mscan_var_run_t, mscan_spool_t; ++ type mscan_t, mscan_var_run_t, mscan_etc_t; ++ type mscan_initrc_exec_t; + ') + +- allow $1 mscan_t:process { ptrace signal_perms }; +- ps_process_pattern($1, mscan_t) +- +- init_labeled_script_domtrans($1, mscan_initrc_exec_t) ++ mailscanner_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 mscan_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) ++ allow $1 mscan_t:process signal_perms; ++ ps_process_pattern($1, mscan_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mscan_t:process ptrace; ++ ') ++ + admin_pattern($1, mscan_etc_t) ++ files_list_etc($1) + +- files_search_pids($1) + admin_pattern($1, mscan_var_run_t) +- +- files_search_spool($1) +- admin_pattern($1, mscan_spool_t) ++ files_list_pids($1) + ') +diff --git a/mailscanner.te b/mailscanner.te +index 6b6e2e130b..3fb3393bad 100644 +--- a/mailscanner.te ++++ b/mailscanner.te +@@ -29,11 +29,12 @@ files_pid_file(mscan_var_run_t) + # Local policy + # + +-allow mscan_t self:capability { setuid chown setgid dac_override }; ++allow mscan_t self:capability { setuid chown setgid dac_read_search dac_override }; + allow mscan_t self:process signal; + allow mscan_t self:fifo_file rw_fifo_file_perms; + + read_files_pattern(mscan_t, mscan_etc_t, mscan_etc_t) ++list_dirs_pattern(mscan_t, mscan_etc_t, mscan_etc_t) + + manage_files_pattern(mscan_t, mscan_var_run_t, mscan_var_run_t) + files_pid_filetrans(mscan_t, mscan_var_run_t, file) +@@ -72,7 +73,6 @@ corenet_udp_sendrecv_all_ports(mscan_t) + + dev_read_urand(mscan_t) + +-files_read_usr_files(mscan_t) + + fs_getattr_xattr_fs(mscan_t) + +@@ -81,10 +81,9 @@ auth_use_nsswitch(mscan_t) + + logging_send_syslog_msg(mscan_t) + +-miscfiles_read_localization(mscan_t) +- + optional_policy(` +- clamav_domtrans_clamscan(mscan_t) ++ antivirus_domtrans(mscan_t) ++ antivirus_manage_pid(mscan_t) + ') + + optional_policy(` +@@ -97,5 +96,6 @@ optional_policy(` + ') + + optional_policy(` ++ spamassassin_read_home_client(mscan_t) + spamassassin_read_lib_files(mscan_t) + ') +diff --git a/man2html.fc b/man2html.fc +index 82f6255512..3686732372 100644 +--- a/man2html.fc ++++ b/man2html.fc +@@ -1,5 +1,5 @@ +-/usr/lib/man2html/cgi-bin/man/man2html -- gen_context(system_u:object_r:httpd_man2html_script_exec_t,s0) +-/usr/lib/man2html/cgi-bin/man/mansec -- gen_context(system_u:object_r:httpd_man2html_script_exec_t,s0) +-/usr/lib/man2html/cgi-bin/man/manwhatis -- gen_context(system_u:object_r:httpd_man2html_script_exec_t,s0) ++/usr/lib/man2html/cgi-bin/man/man2html -- gen_context(system_u:object_r:man2html_script_exec_t,s0) ++/usr/lib/man2html/cgi-bin/man/mansec -- gen_context(system_u:object_r:man2html_script_exec_t,s0) ++/usr/lib/man2html/cgi-bin/man/manwhatis -- gen_context(system_u:object_r:man2html_script_exec_t,s0) + +-/var/cache/man2html(/.*)? gen_context(system_u:object_r:httpd_man2html_script_cache_t,s0) ++/var/cache/man2html(/.*)? gen_context(system_u:object_r:man2html_rw_content_t,s0) +diff --git a/man2html.if b/man2html.if +index 54ec04d3b4..53eaf61d60 100644 +--- a/man2html.if ++++ b/man2html.if +@@ -1 +1,137 @@ + ## A Unix manpage-to-HTML converter. ++ ++######################################## ++## ++## Transition to man2html_script. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`man2html_script_domtrans',` ++ gen_require(` ++ type man2html_script_t, man2html_script_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, man2html_script_exec_t, man2html_script_t) ++') ++ ++######################################## ++## ++## Search man2html_script content directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`man2html_search_content',` ++ gen_require(` ++ type man2html_content_t; ++ type man2html_rw_content_t; ++ ') ++ ++ allow $1 { man2html_rw_content_t man2html_content_t }:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read man2html cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`man2html_read_content_files',` ++ gen_require(` ++ type man2html_content_t; ++ type man2html_rw_content_t; ++ ') ++ ++ files_search_var($1) ++ allow $1 { man2html_rw_content_t man2html_content_t }:dir search_dir_perms; ++ read_files_pattern($1, man2html_rw_content_t, man2html_rw_content_t) ++ read_files_pattern($1, man2html_content_t, man2html_content_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## man2html content files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`man2html_manage_content_files',` ++ gen_require(` ++ type man2html_content_t; ++ type man2html_rw_content_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, man2html_rw_content_t, man2html_rw_content_t) ++ manage_files_pattern($1, man2html_content_t, man2html_content_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## man2html content dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`man2html_manage_content_dirs',` ++ gen_require(` ++ type man2html_content_t; ++ type man2html_rw_content_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, man2html_rw_content_t, man2html_rw_content_t) ++ manage_dirs_pattern($1, man2html_content_t, man2html_content_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an man2html environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`man2html_admin',` ++ gen_require(` ++ type man2html_script_t; ++ type man2html_rw_content_t; ++ type man2html_content_t; ++ ') ++ ++ allow $1 man2html_script_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, man2html_script_t) ++ ++ files_search_var($1) ++ admin_pattern($1, man2html_content_t) ++ admin_pattern($1, man2html_rw_content_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/man2html.te b/man2html.te +index e08c55d433..24b56e9ee7 100644 +--- a/man2html.te ++++ b/man2html.te +@@ -5,22 +5,18 @@ policy_module(man2html, 1.0.0) + # Declarations + # + +-apache_content_template(man2html) +- +-type httpd_man2html_script_cache_t; +-files_type(httpd_man2html_script_cache_t) + + ######################################## + # +-# Local policy ++# man2html_script local policy + # + +-manage_dirs_pattern(httpd_man2html_script_t, httpd_man2html_script_cache_t, httpd_man2html_script_cache_t) +-manage_files_pattern(httpd_man2html_script_t, httpd_man2html_script_cache_t, httpd_man2html_script_cache_t) +-manage_lnk_files_pattern(httpd_man2html_script_t, httpd_man2html_script_cache_t, httpd_man2html_script_cache_t) +-files_var_filetrans(httpd_man2html_script_t, httpd_man2html_script_cache_t, dir) ++optional_policy(` ++ apache_content_template(man2html) ++ apache_content_alias_template(man2html, man2html) + +-files_read_etc_files(httpd_man2html_script_t) ++ allow man2html_script_t self:process fork; + +-miscfiles_read_localization(httpd_man2html_script_t) +-miscfiles_read_man_pages(httpd_man2html_script_t) ++ typealias man2html_rw_content_t alias man2html_script_cache_t; ++ files_var_filetrans(man2html_script_t, man2html_rw_content_t, { dir file }) ++') +diff --git a/mandb.fc b/mandb.fc +index 8ae78b5bf7..b365cddec1 100644 +--- a/mandb.fc ++++ b/mandb.fc +@@ -1 +1,12 @@ ++HOME_DIR/\.manpath -- gen_context(system_u:object_r:mandb_home_t,s0) ++ + /etc/cron\.(daily|weekly)/man-db.* -- gen_context(system_u:object_r:mandb_exec_t,s0) ++ ++/usr/bin/mandb -- gen_context(system_u:object_r:mandb_exec_t,s0) ++ ++/var/cache/man(/.*)? gen_context(system_u:object_r:mandb_cache_t,s0) ++/opt/local/share/man(/.*)? gen_context(system_u:object_r:mandb_cache_t,s0) ++ ++/var/lock/man-db\.lock -- gen_context(system_u:object_r:mandb_lock_t,s0) ++ ++/root/.manpath -- gen_context(system_u:object_r:mandb_home_t,s0) +diff --git a/mandb.if b/mandb.if +index 327f3f7261..d6ae4eab6a 100644 +--- a/mandb.if ++++ b/mandb.if +@@ -1,14 +1,14 @@ +-## On-line manual database. ++ ++## policy for mandb + + ######################################## + ## +-## Execute the mandb program in +-## the mandb domain. ++## Transition to mandb. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`mandb_domtrans',` +@@ -22,33 +22,45 @@ interface(`mandb_domtrans',` + + ######################################## + ## +-## Execute mandb in the mandb +-## domain, and allow the specified +-## role the mandb domain. ++## Search mandb cache directories. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`mandb_search_cache',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ allow $1 mandb_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read mandb cache files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`mandb_run',` ++interface(`mandb_read_cache_files',` + gen_require(` +- attribute_role mandb_roles; ++ type mandb_cache_t; + ') + +- lightsquid_domtrans($1) +- roleattribute $2 mandb_roles; ++ files_search_var($1) ++ read_files_pattern($1, mandb_cache_t, mandb_cache_t) + ') + + ######################################## + ## +-## Search mandb cache directories. ++## Mmap mandb cache files. + ## + ## + ## +@@ -56,13 +68,17 @@ interface(`mandb_run',` + ## + ## + # +-interface(`mandb_search_cache',` +- refpolicywarn(`$0($*) has been deprecated') ++interface(`mandb_map_cache_files',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ allow $1 mandb_cache_t:file map; + ') + + ######################################## + ## +-## Delete mandb cache content. ++## Relabel mandb cache files/directories + ## + ## + ## +@@ -70,13 +86,18 @@ interface(`mandb_search_cache',` + ## + ## + # +-interface(`mandb_delete_cache_content',` +- refpolicywarn(`$0($*) has been deprecated') ++interface(`mandb_relabel_cache',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ allow $1 mandb_cache_t:dir relabel_dir_perms; ++ allow $1 mandb_cache_t:file relabel_file_perms; + ') + + ######################################## + ## +-## Read mandb cache content. ++## Set attributes on mandb cache files. + ## + ## + ## +@@ -84,8 +105,35 @@ interface(`mandb_delete_cache_content',` + ## + ## + # +-interface(`mandb_read_cache_content',` +- refpolicywarn(`$0($*) has been deprecated') ++interface(`mandb_setattr_cache_dirs',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ files_search_var($1) ++ allow $1 mandb_cache_t:dir setattr; ++') ++ ++######################################## ++## ++## Delete mandb cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mandb_delete_cache',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ files_search_var($1) ++ allow $1 mandb_cache_t:dir list_dir_perms; ++ delete_dirs_pattern($1, mandb_cache_t, mandb_cache_t) ++ delete_files_pattern($1, mandb_cache_t, mandb_cache_t) ++ delete_lnk_files_pattern($1, mandb_cache_t, mandb_cache_t) + ') + + ######################################## +@@ -99,37 +147,82 @@ interface(`mandb_read_cache_content',` + ## + ## + # +-interface(`mandb_manage_cache_content',` +- refpolicywarn(`$0($*) has been deprecated') ++interface(`mandb_manage_cache_files',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, mandb_cache_t, mandb_cache_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an mandb environment. ++## Manage mandb cache dirs. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`mandb_manage_cache_dirs',` ++ gen_require(` ++ type mandb_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, mandb_cache_t, mandb_cache_t) ++') ++ ++######################################## ++## ++## Create configuration files in user ++## home directories with a named file ++## type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mandb_filetrans_named_home_content',` ++ gen_require(` ++ type mandb_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, mandb_home_t, file, ".manpath") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an mandb environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # + interface(`mandb_admin',` + gen_require(` +- type mandb_t, mandb_cache_t; ++ type mandb_t; ++ type mandb_cache_t, mandb_lock_t; + ') + + allow $1 mandb_t:process { ptrace signal_perms }; + ps_process_pattern($1, mandb_t) + +- mandb_run($1, $2) ++ files_search_var($1) ++ admin_pattern($1, mandb_cache_t) + +- # pending +- # miscfiles_manage_man_cache_content(mandb_t) ++ files_search_locks($1) ++ admin_pattern($1, mandb_lock_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/mandb.te b/mandb.te +index e6136fd372..2edabefc3e 100644 +--- a/mandb.te ++++ b/mandb.te +@@ -10,19 +10,41 @@ roleattribute system_r mandb_roles; + + type mandb_t; + type mandb_exec_t; +-application_domain(mandb_t, mandb_exec_t) ++init_daemon_domain(mandb_t, mandb_exec_t) + role mandb_roles types mandb_t; + ++type mandb_cache_t; ++files_type(mandb_cache_t) ++ ++type mandb_home_t; ++userdom_user_home_content(mandb_home_t) ++ ++type mandb_lock_t; ++files_lock_file(mandb_lock_t) ++ + ######################################## + # + # Local policy + # + +-allow mandb_t self:capability { setuid setgid }; ++allow mandb_t self:capability { dac_read_search dac_override setuid setgid fsetid }; + allow mandb_t self:process { setsched signal }; + allow mandb_t self:fifo_file rw_fifo_file_perms; + allow mandb_t self:unix_stream_socket create_stream_socket_perms; + ++manage_dirs_pattern(mandb_t, mandb_cache_t, mandb_cache_t) ++manage_files_pattern(mandb_t, mandb_cache_t, mandb_cache_t) ++manage_lnk_files_pattern(mandb_t, mandb_cache_t, mandb_cache_t) ++files_var_filetrans(mandb_t, mandb_cache_t, { dir file lnk_file }) ++can_exec(mandb_t, mandb_exec_t) ++allow mandb_t mandb_cache_t:file map; ++ ++userdom_search_user_home_dirs(mandb_t) ++allow mandb_t mandb_home_t:file read_file_perms; ++ ++allow mandb_t mandb_lock_t:file manage_file_perms; ++files_lock_filetrans(mandb_t, mandb_lock_t, file) ++ + kernel_read_kernel_sysctls(mandb_t) + kernel_read_system_state(mandb_t) + +@@ -33,11 +55,14 @@ dev_search_sysfs(mandb_t) + + domain_use_interactive_fds(mandb_t) + +-files_read_etc_files(mandb_t) ++files_search_locks(mandb_t) ++files_dontaudit_search_all_mountpoints(mandb_t) ++ ++fs_getattr_all_fs(mandb_t) + + miscfiles_manage_man_cache(mandb_t) ++miscfiles_setattr_man_pages(mandb_t) + miscfiles_read_man_pages(mandb_t) +-miscfiles_read_localization(mandb_t) + + ifdef(`distro_debian',` + optional_policy(` +diff --git a/mcelog.if b/mcelog.if +index f89651e753..c73214d811 100644 +--- a/mcelog.if ++++ b/mcelog.if +@@ -19,6 +19,25 @@ interface(`mcelog_domtrans',` + domtrans_pattern($1, mcelog_exec_t, mcelog_t) + ') + ++###################################### ++## ++## Read mcelog logs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mcelog_read_log',` ++ gen_require(` ++ type mcelog_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, mcelog_log_t, mcelog_log_t) ++') ++ + ######################################## + ## + ## All of the rules required to +diff --git a/mcelog.te b/mcelog.te +index 59b3b3dd6f..494c4f3a46 100644 +--- a/mcelog.te ++++ b/mcelog.te +@@ -36,13 +36,6 @@ gen_tunable(mcelog_foreground, false) + ## + gen_tunable(mcelog_server, false) + +-## +-##

      +-## Determine whether mcelog can use syslog. +-##

      +-##
      +-gen_tunable(mcelog_syslog, false) +- + type mcelog_t; + type mcelog_exec_t; + init_daemon_domain(mcelog_t, mcelog_exec_t) +@@ -84,17 +77,21 @@ files_pid_filetrans(mcelog_t, mcelog_var_run_t, { dir file sock_file }) + + kernel_read_system_state(mcelog_t) + ++corecmd_exec_shell(mcelog_t) ++corecmd_exec_bin(mcelog_t) ++ + dev_read_raw_memory(mcelog_t) + dev_read_kmsg(mcelog_t) + dev_rw_sysfs(mcelog_t) +- +-files_read_etc_files(mcelog_t) ++dev_rw_cpu_microcode(mcelog_t) + + mls_file_read_all_levels(mcelog_t) + ++auth_use_nsswitch(mcelog_t) ++ + locallogin_use_fds(mcelog_t) + +-miscfiles_read_localization(mcelog_t) ++logging_send_syslog_msg(mcelog_t) + + tunable_policy(`mcelog_client',` + allow mcelog_t self:unix_stream_socket connectto; +@@ -114,9 +111,6 @@ tunable_policy(`mcelog_server',` + allow mcelog_t self:unix_stream_socket { listen accept }; + ') + +-tunable_policy(`mcelog_syslog',` +- logging_send_syslog_msg(mcelog_t) +-') + + optional_policy(` + cron_system_entry(mcelog_t, mcelog_exec_t) +diff --git a/mcollective.fc b/mcollective.fc +new file mode 100644 +index 0000000000..821bf88222 +--- /dev/null ++++ b/mcollective.fc +@@ -0,0 +1,3 @@ ++/etc/mcollective/facts\.yaml -- gen_context(system_u:object_r:mcollective_etc_rw_t,s0) ++ ++/usr/libexec/mcollective/update_yaml\.rb -- gen_context(system_u:object_r:mcollective_exec_t,s0) +diff --git a/mcollective.if b/mcollective.if +new file mode 100644 +index 0000000000..3f433f1e2b +--- /dev/null ++++ b/mcollective.if +@@ -0,0 +1,109 @@ ++ ++## policy for mcollective ++ ++######################################## ++## ++## Execute TEMPLATE in the mcollective domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mcollective_domtrans',` ++ gen_require(` ++ type mcollective_t, mcollective_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mcollective_exec_t, mcollective_t) ++') ++ ++######################################## ++## ++## Search mcollective conf directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mcollective_search_conf',` ++ gen_require(` ++ type mcollective_etc_rw_t; ++ ') ++ ++ allow $1 mcollective_etc_rw_t:dir search_dir_perms; ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Read mcollective conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mcollective_read_conf_files',` ++ gen_require(` ++ type mcollective_etc_rw_t; ++ ') ++ ++ allow $1 mcollective_etc_rw_t:dir list_dir_perms; ++ read_files_pattern($1, mcollective_etc_rw_t, mcollective_etc_rw_t) ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Manage mcollective conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mcollective_manage_conf_files',` ++ gen_require(` ++ type mcollective_etc_rw_t; ++ ') ++ ++ manage_files_pattern($1, mcollective_etc_rw_t, mcollective_etc_rw_t) ++ files_search_etc($1) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an mcollective environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mcollective_admin',` ++ gen_require(` ++ type mcollective_t; ++ type mcollective_etc_rw_t; ++ ') ++ ++ allow $1 mcollective_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, mcollective_t) ++ ++ files_search_etc($1) ++ admin_pattern($1, mcollective_etc_rw_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/mcollective.te b/mcollective.te +new file mode 100644 +index 0000000000..8bc27f4c5c +--- /dev/null ++++ b/mcollective.te +@@ -0,0 +1,27 @@ ++policy_module(mcollective, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type mcollective_t; ++type mcollective_exec_t; ++init_daemon_domain(mcollective_t, mcollective_exec_t) ++cron_system_entry(mcollective_t, mcollective_exec_t) ++ ++type mcollective_etc_rw_t; ++files_type(mcollective_etc_rw_t) ++ ++######################################## ++# ++# mcollective local policy ++# ++allow mcollective_t self:fifo_file rw_fifo_file_perms; ++allow mcollective_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_files_pattern(mcollective_t, mcollective_etc_rw_t, mcollective_etc_rw_t) ++files_etc_filetrans(mcollective_t, mcollective_etc_rw_t, file, "facts.yaml") ++ ++domain_use_interactive_fds(mcollective_t) ++ +diff --git a/mediawiki.fc b/mediawiki.fc +index 99f7c41879..1745603189 100644 +--- a/mediawiki.fc ++++ b/mediawiki.fc +@@ -1,8 +1,8 @@ +-/usr/lib/mediawiki/math/texvc -- gen_context(system_u:object_r:httpd_mediawiki_script_exec_t,s0) +-/usr/lib/mediawiki/math/texvc_tex -- gen_context(system_u:object_r:httpd_mediawiki_script_exec_t,s0) +-/usr/lib/mediawiki/math/texvc_tes -- gen_context(system_u:object_r:httpd_mediawiki_script_exec_t,s0) ++/usr/lib/mediawiki/math/texvc -- gen_context(system_u:object_r:mediawiki_script_exec_t,s0) ++/usr/lib/mediawiki/math/texvc_tex -- gen_context(system_u:object_r:mediawiki_script_exec_t,s0) ++/usr/lib/mediawiki/math/texvc_tes -- gen_context(system_u:object_r:mediawiki_script_exec_t,s0) + +-/usr/share/mediawiki(/.*)? gen_context(system_u:object_r:httpd_mediawiki_content_t,s0) ++/usr/share/mediawiki[0-9]?(/.*)? gen_context(system_u:object_r:mediawiki_content_t,s0) + +-/var/www/wiki(/.*)? gen_context(system_u:object_r:httpd_mediawiki_rw_content_t,s0) +-/var/www/wiki/.*\.php -- gen_context(system_u:object_r:httpd_mediawiki_content_t,s0) ++/var/www/wiki[0-9]?(/.*)? gen_context(system_u:object_r:mediawiki_rw_content_t,s0) ++/var/www/wiki[0-9]?\.php -- gen_context(system_u:object_r:mediawiki_content_t,s0) +diff --git a/mediawiki.if b/mediawiki.if +index 9771b4ba34..9b183e62be 100644 +--- a/mediawiki.if ++++ b/mediawiki.if +@@ -1 +1,40 @@ +-## Open source wiki package written in PHP. ++## Mediawiki policy ++ ++####################################### ++## ++## Allow the specified domain to read ++## mediawiki tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mediawiki_read_tmp_files',` ++ gen_require(` ++ type mediawiki_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ read_files_pattern($1, mediawiki_tmp_t, mediawiki_tmp_t) ++ read_lnk_files_pattern($1, mediawiki_tmp_t, mediawiki_tmp_t) ++') ++ ++####################################### ++## ++## Delete mediawiki tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mediawiki_delete_tmp_files',` ++ gen_require(` ++ type mediawiki_tmp_t; ++ ') ++ ++ delete_files_pattern($1, mediawiki_tmp_t, mediawiki_tmp_t) ++') +diff --git a/mediawiki.te b/mediawiki.te +index c528b9fa70..f577a7fa6c 100644 +--- a/mediawiki.te ++++ b/mediawiki.te +@@ -5,13 +5,29 @@ policy_module(mediawiki, 1.0.0) + # Declarations + # + +-apache_content_template(mediawiki) ++type mediawiki_tmp_t; ++files_tmp_file(mediawiki_tmp_t) + + ######################################## + # + # Local policy + # + +-files_search_var_lib(httpd_mediawiki_script_t) ++optional_policy(` + +-miscfiles_read_tetex_data(httpd_mediawiki_script_t) ++ apache_content_template(mediawiki) ++ apache_content_alias_template(mediawiki, mediawiki) ++ ++ manage_dirs_pattern(mediawiki_script_t, mediawiki_tmp_t, mediawiki_tmp_t) ++ manage_files_pattern(mediawiki_script_t, mediawiki_tmp_t, mediawiki_tmp_t) ++ manage_sock_files_pattern(mediawiki_script_t, mediawiki_tmp_t, mediawiki_tmp_t) ++ manage_lnk_files_pattern(mediawiki_script_t, mediawiki_tmp_t, mediawiki_tmp_t) ++ files_tmp_filetrans(mediawiki_script_t, mediawiki_tmp_t, { file dir lnk_file }) ++ ++ files_search_var_lib(mediawiki_script_t) ++ ++ miscfiles_read_tetex_data(mediawiki_script_t) ++ ++ auth_read_passwd(mediawiki_script_t) ++ ++') +diff --git a/memcached.if b/memcached.if +index 1d4eb19b8f..650014e0f2 100644 +--- a/memcached.if ++++ b/memcached.if +@@ -1,4 +1,4 @@ +-## High-performance memory object caching system. ++## high-performance memory object caching system + + ######################################## + ## +@@ -12,17 +12,16 @@ + # + interface(`memcached_domtrans',` + gen_require(` +- type memcached_t,memcached_exec_t; ++ type memcached_t; ++ type memcached_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, memcached_exec_t, memcached_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## memcached pid files. ++## Read memcached PID files. + ## + ## + ## +@@ -30,18 +29,18 @@ interface(`memcached_domtrans',` + ## + ## + # +-interface(`memcached_manage_pid_files',` ++interface(`memcached_read_pid_files',` + gen_require(` + type memcached_var_run_t; + ') + + files_search_pids($1) +- manage_files_pattern($1, memcached_var_run_t, memcached_var_run_t) ++ allow $1 memcached_var_run_t:file read_file_perms; + ') + + ######################################## + ## +-## Read memcached pid files. ++## Manage memcached PID files + ## + ## + ## +@@ -49,19 +48,18 @@ interface(`memcached_manage_pid_files',` + ## + ## + # +-interface(`memcached_read_pid_files',` ++interface(`memcached_manage_pid_files',` + gen_require(` + type memcached_var_run_t; + ') + + files_search_pids($1) +- allow $1 memcached_var_run_t:file read_file_perms; ++ manage_files_pattern($1, memcached_var_run_t, memcached_var_run_t) + ') + + ######################################## + ## +-## Connect to memcached using a unix +-## domain stream socket. ++## Connect to memcached over a unix stream socket. + ## + ## + ## +@@ -80,29 +78,8 @@ interface(`memcached_stream_connect',` + + ######################################## + ## +-## Connect to memcache over the network. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`memcached_tcp_connect',` +- gen_require(` +- type memcached_t; +- ') +- +- corenet_sendrecv_memcache_client_packets($1) +- corenet_tcp_connect_memcache_port($1) +- corenet_tcp_recvfrom_labeled($1, memcached_t) +- corenet_tcp_sendrecv_memcache_port($1) +-') +- +-######################################## +-## +-## All of the rules required to +-## administrate an memcached environment. ++## All of the rules required to administrate ++## an memcached environment + ## + ## + ## +@@ -111,7 +88,7 @@ interface(`memcached_tcp_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the memcached domain. + ## + ## + ## +@@ -121,14 +98,17 @@ interface(`memcached_admin',` + type memcached_t, memcached_initrc_exec_t, memcached_var_run_t; + ') + +- allow $1 memcached_t:process { ptrace signal_perms }; ++ allow $1 memcached_t:process signal_perms; + ps_process_pattern($1, memcached_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 memcached_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, memcached_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 memcached_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, memcached_var_run_t) + ') +diff --git a/memcached.te b/memcached.te +index 29b752160f..5000dd91c7 100644 +--- a/memcached.te ++++ b/memcached.te +@@ -8,6 +8,7 @@ policy_module(memcached, 1.3.1) + type memcached_t; + type memcached_exec_t; + init_daemon_domain(memcached_t, memcached_exec_t) ++init_nnp_daemon_domain(memcached_t) + + type memcached_initrc_exec_t; + init_script_file(memcached_initrc_exec_t) +@@ -20,7 +21,7 @@ files_pid_file(memcached_var_run_t) + # Local policy + # + +-allow memcached_t self:capability { setuid setgid }; ++allow memcached_t self:capability { setuid setgid sys_resource }; + dontaudit memcached_t self:capability sys_tty_config; + allow memcached_t self:process { setrlimit signal_perms }; + allow memcached_t self:tcp_socket { accept listen }; +@@ -28,6 +29,8 @@ allow memcached_t self:udp_socket { accept listen }; + allow memcached_t self:fifo_file rw_fifo_file_perms; + allow memcached_t self:unix_stream_socket create_stream_socket_perms; + ++allow memcached_t memcached_exec_t:file map; ++ + manage_dirs_pattern(memcached_t, memcached_var_run_t, memcached_var_run_t) + manage_files_pattern(memcached_t, memcached_var_run_t, memcached_var_run_t) + manage_sock_files_pattern(memcached_t, memcached_var_run_t, memcached_var_run_t) +@@ -59,4 +62,3 @@ term_dontaudit_use_console(memcached_t) + + auth_use_nsswitch(memcached_t) + +-miscfiles_read_localization(memcached_t) +diff --git a/milter.fc b/milter.fc +index 89409ebbc7..67e42f6a9f 100644 +--- a/milter.fc ++++ b/milter.fc +@@ -1,18 +1,29 @@ ++/etc/mail/dkim-milter/keys(/.*)? gen_context(system_u:object_r:dkim_milter_private_key_t,s0) ++ ++/usr/sbin/dkim-filter -- gen_context(system_u:object_r:dkim_milter_exec_t,s0) ++/usr/sbin/opendkim -- gen_context(system_u:object_r:dkim_milter_exec_t,s0) ++/usr/sbin/opendmarc -- gen_context(system_u:object_r:dkim_milter_exec_t,s0) + /usr/sbin/milter-greylist -- gen_context(system_u:object_r:greylist_milter_exec_t,s0) +-/usr/sbin/sqlgrey -- gen_context(system_u:object_r:greylist_milter_exec_t,s0) +-/usr/sbin/milter-regex -- gen_context(system_u:object_r:regex_milter_exec_t,s0) ++/usr/sbin/sqlgrey -- gen_context(system_u:object_r:greylist_milter_exec_t,s0) ++/usr/sbin/milter-regex -- gen_context(system_u:object_r:regex_milter_exec_t,s0) + /usr/sbin/spamass-milter -- gen_context(system_u:object_r:spamass_milter_exec_t,s0) + +-/var/lib/milter-greylist(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) +-/var/lib/sqlgrey(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) +-/var/lib/spamass-milter(/.*)? gen_context(system_u:object_r:spamass_milter_state_t,s0) ++/var/lib/dkim-milter(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) ++/var/lib/milter-greylist(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) ++/var/lib/sqlgrey(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) ++/var/lib/spamass-milter(/.*)? gen_context(system_u:object_r:spamass_milter_state_t,s0) + +-/var/run/milter-greylist(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) ++/var/run/dkim-milter(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) ++/var/run/opendmarc(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) ++/var/run/milter-greylist(/.*)? gen_context(system_u:object_r:greylist_milter_data_t,s0) + /var/run/milter-greylist\.pid -- gen_context(system_u:object_r:greylist_milter_data_t,s0) +-/var/run/spamass(/.*)? gen_context(system_u:object_r:spamass_milter_data_t,s0) +-/var/run/sqlgrey\.pid -- gen_context(system_u:object_r:greylist_milter_data_t,s0) +-/var/run/spamass-milter(/.*)? gen_context(system_u:object_r:spamass_milter_data_t,s0) ++/var/run/spamass(/.*)? gen_context(system_u:object_r:spamass_milter_data_t,s0) ++/var/run/sqlgrey\.pid -- gen_context(system_u:object_r:greylist_milter_data_t,s0) ++/var/run/spamass-milter(/.*)? gen_context(system_u:object_r:spamass_milter_data_t,s0) + /var/run/spamass-milter\.pid -- gen_context(system_u:object_r:spamass_milter_data_t,s0) ++/var/run/opendkim(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) + +-/var/spool/milter-regex(/.*)? gen_context(system_u:object_r:regex_milter_data_t,s0) ++/var/spool/milter-regex(/.*)? gen_context(system_u:object_r:regex_milter_data_t,s0) + /var/spool/postfix/spamass(/.*)? gen_context(system_u:object_r:spamass_milter_data_t,s0) ++/var/spool/opendkim(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) ++/var/spool/opendmarc(/.*)? gen_context(system_u:object_r:dkim_milter_data_t,s0) +diff --git a/milter.if b/milter.if +index cba62db12b..562833a816 100644 +--- a/milter.if ++++ b/milter.if +@@ -1,47 +1,43 @@ +-## Milter mail filters. ++## Milter mail filters + +-####################################### ++######################################## + ## +-## The template to define a milter domain. ++## Create a set of derived types for various ++## mail filter applications using the milter interface. + ## +-## ++## + ## +-## Domain prefix to be used. ++## The name to be used for deriving type names. + ## + ## + # + template(`milter_template',` ++ # attributes common to all milters + gen_require(` + attribute milter_data_type, milter_domains; + ') + +- ######################################## +- # +- # Declarations +- # +- + type $1_milter_t, milter_domains; + type $1_milter_exec_t; + init_daemon_domain($1_milter_t, $1_milter_exec_t) ++ role system_r types $1_milter_t; + ++ # Type for the milter data (e.g. the socket used to communicate with the MTA) + type $1_milter_data_t, milter_data_type; + files_pid_file($1_milter_data_t) + +- ######################################## +- # +- # Policy +- # ++ # Allow communication with MTA over a unix-domain socket ++ manage_sock_files_pattern($1_milter_t, $1_milter_data_t, $1_milter_data_t) + ++ # Create other data files and directories in the data directory + manage_files_pattern($1_milter_t, $1_milter_data_t, $1_milter_data_t) +- manage_sock_files_pattern($1_milter_t, $1_milter_data_t, $1_milter_data_t) + +- auth_use_nsswitch($1_milter_t) ++ logging_send_syslog_msg($1_milter_t) + ') + + ######################################## + ## +-## connect to all milter domains using +-## a unix domain stream socket. ++## MTA communication with milter sockets + ## + ## + ## +@@ -55,12 +51,13 @@ interface(`milter_stream_connect_all',` + ') + + files_search_pids($1) ++ getattr_dirs_pattern($1, milter_data_type, milter_data_type) + stream_connect_pattern($1, milter_data_type, milter_data_type, milter_domains) + ') + + ######################################## + ## +-## Get attributes of all milter sock files. ++## Allow getattr of milter sockets + ## + ## + ## +@@ -73,13 +70,31 @@ interface(`milter_getattr_all_sockets',` + attribute milter_data_type; + ') + ++ getattr_dirs_pattern($1, milter_data_type, milter_data_type) + getattr_sock_files_pattern($1, milter_data_type, milter_data_type) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## spamassissin milter data content. ++## Allow setattr of milter dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`milter_setattr_all_dirs',` ++ gen_require(` ++ attribute milter_data_type; ++ ') ++ ++ setattr_dirs_pattern($1, milter_data_type, milter_data_type) ++') ++ ++######################################## ++## ++## Manage spamassassin milter state + ## + ## + ## +@@ -97,3 +112,22 @@ interface(`milter_manage_spamass_state',` + manage_dirs_pattern($1, spamass_milter_state_t, spamass_milter_state_t) + manage_lnk_files_pattern($1, spamass_milter_state_t, spamass_milter_state_t) + ') ++ ++####################################### ++## ++## Delete dkim-milter PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`milter_delete_dkim_pid_files',` ++ gen_require(` ++ type dkim_milter_data_t; ++ ') ++ ++ files_search_pids($1) ++ delete_files_pattern($1, dkim_milter_data_t, dkim_milter_data_t) ++') +diff --git a/milter.te b/milter.te +index 4dc99f4645..48e3f38138 100644 +--- a/milter.te ++++ b/milter.te +@@ -5,73 +5,117 @@ policy_module(milter, 1.5.0) + # Declarations + # + ++# attributes common to all milters + attribute milter_domains; + attribute milter_data_type; + ++# support for dkim-milter - domainKeys Identified Mail sender authentication sendmail milter ++milter_template(dkim) ++ ++# type for the private key of dkim-milter ++type dkim_milter_private_key_t; ++files_type(dkim_milter_private_key_t) ++ ++type dkim_milter_tmp_t; ++files_tmp_file(dkim_milter_tmp_t) ++ ++# currently-supported milters are milter-greylist, milter-regex and spamass-milter + milter_template(greylist) + milter_template(regex) + milter_template(spamass) + ++# Type for the spamass-milter home directory, under which spamassassin will ++# store system-wide preferences, bayes databases etc. if not configured to ++# use per-user configuration + type spamass_milter_state_t; + files_type(spamass_milter_state_t) + ++ + ####################################### + # +-# Common local policy ++# milter domains local policy + # + ++# Allow communication with MTA over a unix-domain socket ++# Note: usage with TCP sockets requires additional policy ++ + allow milter_domains self:fifo_file rw_fifo_file_perms; +-allow milter_domains self:tcp_socket { accept listen }; ++ ++allow milter_domains self:process signull; ++ ++# Allow communication with MTA over a TCP socket ++allow milter_domains self:tcp_socket create_stream_socket_perms; + + kernel_dontaudit_read_system_state(milter_domains) + +-corenet_all_recvfrom_unlabeled(milter_domains) +-corenet_all_recvfrom_netlabel(milter_domains) +-corenet_tcp_sendrecv_generic_if(milter_domains) +-corenet_tcp_sendrecv_generic_node(milter_domains) + corenet_tcp_bind_generic_node(milter_domains) +- + corenet_tcp_bind_milter_port(milter_domains) +-corenet_tcp_sendrecv_all_ports(milter_domains) + +-miscfiles_read_localization(milter_domains) ++dev_read_rand(milter_domains) ++dev_read_urand(milter_domains) ++ ++mta_read_config(milter_domains) ++ ++sysnet_read_config(greylist_milter_t) ++ ++####################################### ++# ++# dkim-milter local policy ++# ++ ++allow dkim_milter_t self:capability { kill setgid setuid }; ++allow dkim_milter_t self:process signal; ++allow dkim_milter_t self:tcp_socket create_stream_socket_perms; ++allow dkim_milter_t self:unix_stream_socket create_stream_socket_perms; + +-logging_send_syslog_msg(milter_domains) ++read_files_pattern(dkim_milter_t, dkim_milter_private_key_t, dkim_milter_private_key_t) ++ ++manage_files_pattern(dkim_milter_t, dkim_milter_tmp_t, dkim_milter_tmp_t) ++manage_dirs_pattern(dkim_milter_t, dkim_milter_tmp_t, dkim_milter_tmp_t) ++files_tmp_filetrans(dkim_milter_t, dkim_milter_tmp_t, { dir file }) ++ ++kernel_read_kernel_sysctls(dkim_milter_t) ++ ++corenet_udp_bind_all_ports(dkim_milter_t) ++ ++auth_use_nsswitch(dkim_milter_t) ++ ++sysnet_dns_name_resolve(dkim_milter_t) + + ######################################## + # +-# greylist local policy ++# milter-greylist local policy ++# ensure smtp clients retry mail like real MTAs and not spamware ++# http://hcpnet.free.fr/milter-greylist/ + # + +-allow greylist_milter_t self:capability { chown dac_override setgid setuid sys_nice }; ++# It removes any existing socket (not owned by root) whilst running as root, ++# fixes permissions, renices itself and then calls setgid() and setuid() to ++# drop privileges ++allow greylist_milter_t self:capability { chown dac_read_search dac_override setgid setuid sys_nice }; + allow greylist_milter_t self:process { setsched getsched }; + ++allow greylist_milter_t self:tcp_socket create_stream_socket_perms; ++ ++# It creates a pid file /var/run/milter-greylist.pid + files_pid_filetrans(greylist_milter_t, greylist_milter_data_t, file) + + kernel_read_kernel_sysctls(greylist_milter_t) + +-corenet_sendrecv_movaz_ssc_server_packets(greylist_milter_t) +-corenet_tcp_bind_movaz_ssc_port(greylist_milter_t) +-corenet_sendrecv_movaz_ssc_client_packets(greylist_milter_t) +-corenet_tcp_connect_movaz_ssc_port(greylist_milter_t) +-corenet_tcp_sendrecv_movaz_ssc_port(greylist_milter_t) +- +-corenet_sendrecv_kismet_server_packets(greylist_milter_t) +-corenet_tcp_bind_kismet_port(greylist_milter_t) +-corenet_tcp_sendrecv_kismet_port(greylist_milter_t) +- + corecmd_exec_bin(greylist_milter_t) + corecmd_exec_shell(greylist_milter_t) + +-dev_read_rand(greylist_milter_t) +-dev_read_urand(greylist_milter_t) ++corenet_tcp_bind_movaz_ssc_port(greylist_milter_t) ++corenet_tcp_connect_movaz_ssc_port(greylist_milter_t) ++corenet_tcp_bind_rtsclient_port(greylist_milter_t) + +-files_read_usr_files(greylist_milter_t) ++# perl getgroups() reads a bunch of files in /etc ++# Allow the milter to read a GeoIP database in /usr/share ++# The milter runs from /var/lib/milter-greylist and maintains files there + files_search_var_lib(greylist_milter_t) + +-mta_read_config(greylist_milter_t) +- +-miscfiles_read_localization(greylist_milter_t) ++# Look up username for dropping privs ++auth_use_nsswitch(greylist_milter_t) + + optional_policy(` + mysql_stream_connect(greylist_milter_t) +@@ -79,30 +123,45 @@ optional_policy(` + + ######################################## + # +-# regex local policy ++# milter-regex local policy ++# filter emails using regular expressions ++# http://www.benzedrine.cx/milter-regex.html + # + +-allow regex_milter_t self:capability { setuid setgid dac_override }; ++# It removes any existing socket (not owned by root) whilst running as root ++# and then calls setgid() and setuid() to drop privileges ++allow regex_milter_t self:capability { setuid setgid dac_read_search dac_override }; + ++# The milter's socket directory lives under /var/spool + files_search_spool(regex_milter_t) + +-mta_read_config(regex_milter_t) ++# Look up username for dropping privs ++auth_use_nsswitch(regex_milter_t) + + ######################################## + # +-# spamass local policy ++# spamass-milter local policy ++# pipe emails through SpamAssassin ++# http://savannah.nongnu.org/projects/spamass-milt/ + # + ++# The milter runs from /var/lib/spamass-milter + allow spamass_milter_t spamass_milter_state_t:dir search_dir_perms; ++files_search_var_lib(spamass_milter_t) + + kernel_read_system_state(spamass_milter_t) + ++# When used with -b or -B options, the milter invokes sendmail to send mail ++# to a spamtrap address, using popen() + corecmd_exec_shell(spamass_milter_t) ++corecmd_read_bin_symlinks(spamass_milter_t) ++corecmd_search_bin(spamass_milter_t) + +-files_search_var_lib(spamass_milter_t) ++auth_use_nsswitch(spamass_milter_t) + + mta_send_mail(spamass_milter_t) + ++# The main job of the milter is to pipe spam through spamc and act on the result + optional_policy(` + spamassassin_domtrans_client(spamass_milter_t) + ') +diff --git a/minissdpd.if b/minissdpd.if +index b3301610f5..54509375eb 100644 +--- a/minissdpd.if ++++ b/minissdpd.if +@@ -39,10 +39,10 @@ interface(`minissdpd_read_config',` + interface(`minissdpd_admin',` + gen_require(` + type minissdpd_t, minissdpd_initrc_exec_t, minissdpd_conf_t; +- type minissdpd_var_run_t ++ type minissdpd_var_run_t; + ') + +- allow $1 minissdpd_t:process { ptrace signal_perms }; ++ allow $1 minissdpd_t:process { signal_perms }; + ps_process_pattern($1, minissdpd_t) + + init_labeled_script_domtrans($1, minissdpd_initrc_exec_t) +diff --git a/mip6d.fc b/mip6d.fc +new file mode 100644 +index 0000000000..767bbad7b2 +--- /dev/null ++++ b/mip6d.fc +@@ -0,0 +1,3 @@ ++/usr/lib/systemd/system/mip6d.* -- gen_context(system_u:object_r:mip6d_unit_file_t,s0) ++ ++/usr/sbin/mip6d -- gen_context(system_u:object_r:mip6d_exec_t,s0) +diff --git a/mip6d.if b/mip6d.if +new file mode 100644 +index 0000000000..861b486dc2 +--- /dev/null ++++ b/mip6d.if +@@ -0,0 +1,80 @@ ++ ++## Mobile IPv6 and NEMO Basic Support implementation ++ ++######################################## ++## ++## Execute TEMPLATE in the mip6d domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mip6d_domtrans',` ++ gen_require(` ++ type mip6d_t, mip6d_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mip6d_exec_t, mip6d_t) ++') ++######################################## ++## ++## Execute mip6d server in the mip6d domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mip6d_systemctl',` ++ gen_require(` ++ type mip6d_t; ++ type mip6d_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 mip6d_unit_file_t:file read_file_perms; ++ allow $1 mip6d_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, mip6d_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an mip6d environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`mip6d_admin',` ++ gen_require(` ++ type mip6d_t; ++ type mip6d_unit_file_t; ++ ') ++ ++ allow $1 mip6d_t:process { signal_perms }; ++ ps_process_pattern($1, mip6d_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mip6d_t:process ptrace; ++ ') ++ ++ mip6d_systemctl($1) ++ admin_pattern($1, mip6d_unit_file_t) ++ allow $1 mip6d_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/mip6d.te b/mip6d.te +new file mode 100644 +index 0000000000..0f290e9d45 +--- /dev/null ++++ b/mip6d.te +@@ -0,0 +1,33 @@ ++policy_module(mip6d, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type mip6d_t; ++type mip6d_exec_t; ++init_daemon_domain(mip6d_t, mip6d_exec_t) ++ ++type mip6d_unit_file_t; ++systemd_unit_file(mip6d_unit_file_t) ++ ++######################################## ++# ++# mip6d local policy ++# ++allow mip6d_t self:capability { net_admin net_raw }; ++allow mip6d_t self:process { setpgid fork signal }; ++allow mip6d_t self:netlink_route_socket create_netlink_socket_perms; ++allow mip6d_t self:netlink_xfrm_socket create_netlink_socket_perms; ++allow mip6d_t self:rawip_socket create_socket_perms; ++allow mip6d_t self:udp_socket create_socket_perms; ++allow mip6d_t self:fifo_file rw_fifo_file_perms; ++allow mip6d_t self:unix_stream_socket create_stream_socket_perms; ++ ++kernel_rw_net_sysctls(mip6d_t) ++kernel_read_network_state(mip6d_t) ++kernel_request_load_module(mip6d_t) ++ ++logging_send_syslog_msg(mip6d_t) ++ +diff --git a/mirrormanager.fc b/mirrormanager.fc +new file mode 100644 +index 0000000000..abd53a4c78 +--- /dev/null ++++ b/mirrormanager.fc +@@ -0,0 +1,7 @@ ++/usr/share/mirrormanager/server/mirrormanager(/.*)? gen_context(system_u:object_r:mirrormanager_exec_t,s0) ++ ++/var/lib/mirrormanager(/.*)? gen_context(system_u:object_r:mirrormanager_var_lib_t,s0) ++ ++/var/log/mirrormanager(/.*)? gen_context(system_u:object_r:mirrormanager_log_t,s0) ++ ++/var/run/mirrormanager(/.*)? gen_context(system_u:object_r:mirrormanager_var_run_t,s0) +diff --git a/mirrormanager.if b/mirrormanager.if +new file mode 100644 +index 0000000000..86467cffba +--- /dev/null ++++ b/mirrormanager.if +@@ -0,0 +1,256 @@ ++ ++## policy for mirrormanager ++ ++######################################## ++## ++## Execute mirrormanager in the mirrormanager domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mirrormanager_domtrans',` ++ gen_require(` ++ type mirrormanager_t, mirrormanager_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mirrormanager_exec_t, mirrormanager_t) ++') ++ ++######################################## ++## ++## Read mirrormanager's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`mirrormanager_read_log',` ++ gen_require(` ++ type mirrormanager_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, mirrormanager_log_t, mirrormanager_log_t) ++') ++ ++######################################## ++## ++## Append to mirrormanager log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_append_log',` ++ gen_require(` ++ type mirrormanager_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, mirrormanager_log_t, mirrormanager_log_t) ++') ++ ++######################################## ++## ++## Manage mirrormanager log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_manage_log',` ++ gen_require(` ++ type mirrormanager_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, mirrormanager_log_t, mirrormanager_log_t) ++ manage_files_pattern($1, mirrormanager_log_t, mirrormanager_log_t) ++ manage_lnk_files_pattern($1, mirrormanager_log_t, mirrormanager_log_t) ++') ++ ++######################################## ++## ++## Search mirrormanager lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_search_lib',` ++ gen_require(` ++ type mirrormanager_var_lib_t; ++ ') ++ ++ allow $1 mirrormanager_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read mirrormanager lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_read_lib_files',` ++ gen_require(` ++ type mirrormanager_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ list_dirs_pattern($1, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++ read_files_pattern($1, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++') ++ ++######################################## ++## ++## Manage mirrormanager lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_manage_lib_files',` ++ gen_require(` ++ type mirrormanager_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++') ++ ++######################################## ++## ++## Manage mirrormanager lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_manage_lib_dirs',` ++ gen_require(` ++ type mirrormanager_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++') ++ ++######################################## ++## ++## Read mirrormanager PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_read_pid_files',` ++ gen_require(` ++ type mirrormanager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, mirrormanager_var_run_t, mirrormanager_var_run_t) ++') ++ ++######################################## ++## ++## Manage mirrormanager PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_manage_pid_files',` ++ gen_require(` ++ type mirrormanager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, mirrormanager_var_run_t, mirrormanager_var_run_t) ++') ++ ++######################################## ++## ++## Manage mirrormanager PID sock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_manage_pid_sock_files',` ++ gen_require(` ++ type mirrormanager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_sock_files_pattern($1, mirrormanager_var_run_t, mirrormanager_var_run_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an mirrormanager environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mirrormanager_admin',` ++ gen_require(` ++ type mirrormanager_t; ++ type mirrormanager_log_t; ++ type mirrormanager_var_lib_t; ++ type mirrormanager_var_run_t; ++ ') ++ ++ allow $1 mirrormanager_t:process { signal_perms }; ++ ps_process_pattern($1, mirrormanager_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mirrormanager_t:process ptrace; ++ ') ++ ++ logging_search_logs($1) ++ admin_pattern($1, mirrormanager_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, mirrormanager_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, mirrormanager_var_run_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/mirrormanager.te b/mirrormanager.te +new file mode 100644 +index 0000000000..2e3289ed3d +--- /dev/null ++++ b/mirrormanager.te +@@ -0,0 +1,46 @@ ++policy_module(mirrormanager, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type mirrormanager_t; ++type mirrormanager_exec_t; ++application_domain(mirrormanager_t, mirrormanager_exec_t) ++ ++type mirrormanager_log_t; ++logging_log_file(mirrormanager_log_t) ++ ++type mirrormanager_var_lib_t; ++files_type(mirrormanager_var_lib_t) ++ ++type mirrormanager_var_run_t; ++files_pid_file(mirrormanager_var_run_t) ++ ++######################################## ++# ++# mirrormanager local policy ++# ++ ++allow mirrormanager_t self:fifo_file rw_fifo_file_perms; ++allow mirrormanager_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(mirrormanager_t, mirrormanager_log_t, mirrormanager_log_t) ++manage_files_pattern(mirrormanager_t, mirrormanager_log_t, mirrormanager_log_t) ++manage_lnk_files_pattern(mirrormanager_t, mirrormanager_log_t, mirrormanager_log_t) ++logging_log_filetrans(mirrormanager_t, mirrormanager_log_t, { dir }) ++ ++manage_dirs_pattern(mirrormanager_t, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++manage_files_pattern(mirrormanager_t, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++manage_lnk_files_pattern(mirrormanager_t, mirrormanager_var_lib_t, mirrormanager_var_lib_t) ++files_var_lib_filetrans(mirrormanager_t, mirrormanager_var_lib_t, { dir }) ++ ++manage_dirs_pattern(mirrormanager_t, mirrormanager_var_run_t, mirrormanager_var_run_t) ++manage_files_pattern(mirrormanager_t, mirrormanager_var_run_t, mirrormanager_var_run_t) ++manage_lnk_files_pattern(mirrormanager_t, mirrormanager_var_run_t, mirrormanager_var_run_t) ++files_pid_filetrans(mirrormanager_t, mirrormanager_var_run_t, { dir }) ++ ++optional_policy(` ++ cron_system_entry(mirrormanager_t, mirrormanager_exec_t) ++') +diff --git a/mock.fc b/mock.fc +new file mode 100644 +index 0000000000..394bc46584 +--- /dev/null ++++ b/mock.fc +@@ -0,0 +1,7 @@ ++ ++/usr/sbin/mock -- gen_context(system_u:object_r:mock_exec_t,s0) ++ ++/usr/libexec/mock/mock -- gen_context(system_u:object_r:mock_exec_t,s0) ++ ++/var/lib/mock(/.*)? gen_context(system_u:object_r:mock_var_lib_t,s0) ++/var/cache/mock(/.*)? gen_context(system_u:object_r:mock_cache_t,s0) +diff --git a/mock.if b/mock.if +new file mode 100644 +index 0000000000..f5b98e6de8 +--- /dev/null ++++ b/mock.if +@@ -0,0 +1,311 @@ ++## policy for mock ++ ++######################################## ++## ++## Execute a domain transition to run mock. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mock_domtrans',` ++ gen_require(` ++ type mock_t, mock_exec_t; ++ ') ++ ++ domtrans_pattern($1, mock_exec_t, mock_t) ++') ++ ++######################################## ++## ++## Search mock lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_search_lib',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ allow $1 mock_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read mock lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_read_lib_files',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ list_dirs_pattern($1, mock_var_lib_t, mock_var_lib_t) ++ read_files_pattern($1, mock_var_lib_t, mock_var_lib_t) ++') ++ ++######################################## ++## ++## Getattr on mock lib file,dir,sock_file ... ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_getattr_lib',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ allow $1 mock_var_lib_t:dir_file_class_set getattr; ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## mock lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_manage_lib_files',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, mock_var_lib_t, mock_var_lib_t) ++') ++ ++######################################## ++## ++## Manage mock lib dirs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_manage_lib_dirs',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, mock_var_lib_t, mock_var_lib_t) ++') ++ ++######################################### ++## ++## Manage mock lib symlinks. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_manage_lib_symlinks',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_lnk_files_pattern($1, mock_var_lib_t, mock_var_lib_t) ++') ++ ++######################################## ++## ++## Manage mock lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_manage_lib_chr_files',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_chr_files_pattern($1, mock_var_lib_t, mock_var_lib_t) ++') ++ ++######################################## ++## ++## Manage mock lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_dontaudit_write_lib_chr_files',` ++ gen_require(` ++ type mock_var_lib_t; ++ ') ++ ++ dontaudit $1 mock_var_lib_t:chr_file write; ++') ++ ++####################################### ++## ++## Dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mock_dontaudit_leaks',` ++ gen_require(` ++ type mock_tmp_t; ++ ') ++ ++ dontaudit $1 mock_tmp_t:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Execute mock in the mock domain, and ++## allow the specified role the mock domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the mock domain. ++## ++## ++## ++# ++interface(`mock_run',` ++ gen_require(` ++ type mock_t; ++ type mock_build_t; ++ ') ++ ++ mock_domtrans($1) ++ role $2 types mock_t; ++ role $2 types mock_build_t; ++ ++ mount_run(mock_t, $2) ++') ++ ++######################################## ++## ++## Role access for mock ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++## ++# ++interface(`mock_role',` ++ gen_require(` ++ type mock_t; ++ ') ++ ++ role $1 types mock_t; ++ ++ mock_run($2, $1) ++ ++ ps_process_pattern($2, mock_t) ++ allow $2 mock_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 mock_t:process ptrace; ++ ') ++ ++ optional_policy(` ++ mock_read_lib_files($2) ++ ') ++') ++ ++####################################### ++## ++## Send a generic signal to mock. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_signal',` ++ gen_require(` ++ type mock_t; ++ ') ++ ++ allow $1 mock_t:process signal; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an mock environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mock_admin',` ++ gen_require(` ++ type mock_t, mock_var_lib_t; ++ type mock_build_t, mock_etc_t, mock_tmp_t; ++ ') ++ ++ allow $1 mock_t:process signal_perms; ++ ps_process_pattern($1, mock_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mock_t:process ptrace; ++ allow $1 mock_build_t:process ptrace; ++ ') ++ ++ allow $1 mock_build_t:process signal_perms; ++ ps_process_pattern($1, mock_build_t) ++ ++ files_list_var_lib($1) ++ admin_pattern($1, mock_var_lib_t) ++ ++ files_list_tmp($1) ++ admin_pattern($1, mock_tmp_t) ++ ++ files_search_etc($1) ++ admin_pattern($1, mock_etc_t) ++') +diff --git a/mock.te b/mock.te +new file mode 100644 +index 0000000000..f647022cb9 +--- /dev/null ++++ b/mock.te +@@ -0,0 +1,288 @@ ++policy_module(mock,1.0.0) ++ ++## ++##

      ++## Allow mock to read files in home directories. ++##

      ++##
      ++gen_tunable(mock_enable_homedirs, false) ++ ++######################################## ++# ++# Declarations ++# ++ ++type mock_t; ++type mock_exec_t; ++application_domain(mock_t, mock_exec_t) ++domain_role_change_exemption(mock_t) ++domain_system_change_exemption(mock_t) ++role system_r types mock_t; ++ ++type mock_build_t; ++type mock_build_exec_t; ++application_domain(mock_build_t, mock_build_exec_t) ++role system_r types mock_build_t; ++ ++type mock_cache_t; ++files_type(mock_cache_t) ++ ++type mock_tmp_t; ++files_tmp_file(mock_tmp_t) ++ ++type mock_var_lib_t; ++files_type(mock_var_lib_t) ++ ++type mock_var_run_t; ++files_pid_file(mock_var_run_t) ++ ++type mock_etc_t; ++files_config_file(mock_etc_t) ++ ++######################################## ++# ++# mock local policy ++# ++ ++allow mock_t self:capability { sys_admin sys_ptrace setfcap setuid sys_chroot chown audit_write dac_read_search dac_override sys_nice mknod fsetid setgid fowner }; ++allow mock_t self:capability2 block_suspend; ++allow mock_t self:process { siginh noatsecure signal_perms transition rlimitinh setsched setpgid }; ++# Needed because mock can run java and mono withing build environment ++allow mock_t self:process { execmem execstack }; ++dontaudit mock_t self:process { siginh noatsecure rlimitinh }; ++allow mock_t self:fifo_file manage_fifo_file_perms; ++allow mock_t self:unix_stream_socket create_stream_socket_perms; ++allow mock_t self:unix_dgram_socket create_socket_perms; ++ ++allow mock_t mock_build_t:process { siginh noatsecure rlimitinh }; ++ ++manage_dirs_pattern(mock_t, mock_cache_t, mock_cache_t) ++manage_files_pattern(mock_t, mock_cache_t, mock_cache_t) ++manage_lnk_files_pattern(mock_t, mock_cache_t, mock_cache_t) ++files_var_filetrans(mock_t, mock_cache_t, { dir file } ) ++ ++read_files_pattern(mock_t, mock_etc_t, mock_etc_t) ++read_lnk_files_pattern(mock_t, mock_etc_t, mock_etc_t) ++ ++manage_dirs_pattern(mock_t, mock_tmp_t, mock_tmp_t) ++manage_files_pattern(mock_t, mock_tmp_t, mock_tmp_t) ++manage_lnk_files_pattern(mock_t, mock_tmp_t, mock_tmp_t) ++files_tmp_filetrans(mock_t, mock_tmp_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(mock_t, mock_var_lib_t, mock_var_lib_t) ++manage_files_pattern(mock_t, mock_var_lib_t, mock_var_lib_t) ++manage_lnk_files_pattern(mock_t, mock_var_lib_t, mock_var_lib_t) ++manage_blk_files_pattern(mock_t, mock_var_lib_t, mock_var_lib_t) ++manage_chr_files_pattern(mock_t, mock_var_lib_t, mock_var_lib_t) ++files_var_lib_filetrans(mock_t, mock_var_lib_t, { dir file }) ++allow mock_t mock_var_lib_t:dir mounton; ++allow mock_t mock_var_lib_t:dir relabel_dir_perms; ++allow mock_t mock_var_lib_t:file relabel_file_perms; ++ ++manage_files_pattern(mock_t, mock_var_run_t, mock_var_run_t) ++manage_dirs_pattern(mock_t, mock_var_run_t, mock_var_run_t) ++manage_sock_files_pattern(mock_t, mock_var_run_t, mock_var_run_t) ++manage_lnk_files_pattern(mock_t, mock_var_run_t, mock_var_run_t) ++files_pid_filetrans(mock_t, mock_var_run_t, { file dir sock_file }) ++ ++kernel_read_irq_sysctls(mock_t) ++kernel_read_system_state(mock_t) ++kernel_read_network_state(mock_t) ++kernel_read_kernel_sysctls(mock_t) ++kernel_request_load_module(mock_t) ++kernel_dontaudit_setattr_proc_dirs(mock_t) ++kernel_read_fs_sysctls(mock_t) ++# we run mount in mock_t ++kernel_mount_proc(mock_t) ++kernel_unmount_proc(mock_t) ++ ++fs_mount_tmpfs(mock_t) ++fs_unmount_tmpfs(mock_t) ++fs_unmount_xattr_fs(mock_t) ++ ++corecmd_exec_bin(mock_t) ++corecmd_exec_shell(mock_t) ++corecmd_dontaudit_exec_all_executables(mock_t) ++ ++corenet_tcp_connect_git_port(mock_t) ++corenet_tcp_connect_http_port(mock_t) ++corenet_tcp_connect_ftp_port(mock_t) ++corenet_tcp_connect_all_ephemeral_ports(mock_t) ++ ++dev_read_urand(mock_t) ++dev_rw_sysfs(mock_t) ++dev_setattr_sysfs_dirs(mock_t) ++dev_mount_sysfs_fs(mock_t) ++dev_unmount_sysfs_fs(mock_t) ++ ++domain_read_all_domains_state(mock_t) ++domain_use_interactive_fds(mock_t) ++ ++files_read_etc_runtime_files(mock_t) ++files_dontaudit_list_boot(mock_t) ++files_list_isid_type_dirs(mock_t) ++ ++fs_getattr_all_fs(mock_t) ++fs_manage_cgroup_dirs(mock_t) ++fs_search_all(mock_t) ++fs_setattr_tmpfs_dirs(mock_t) ++ ++selinux_get_enforce_mode(mock_t) ++ ++term_search_ptys(mock_t) ++term_use_generic_ptys(mock_t) ++term_mount_pty_fs(mock_t) ++term_unmount_pty_fs(mock_t) ++term_use_ptmx(mock_t) ++ ++auth_use_nsswitch(mock_t) ++ ++init_exec(mock_t) ++init_dontaudit_stream_connect(mock_t) ++ ++libs_exec_ldconfig(mock_t) ++ ++logging_send_audit_msgs(mock_t) ++logging_send_syslog_msg(mock_t) ++ ++lvm_manage_lock(mock_t) ++lvm_read_config(mock_t) ++lvm_read_metadata(mock_t) ++lvm_getattr_exec_files(mock_t) ++ ++miscfiles_dontaudit_write_generic_cert_files(mock_t) ++ ++userdom_use_user_ptys(mock_t) ++userdom_use_user_ttys(mock_t) ++ ++files_search_home(mock_t) ++ ++tunable_policy(`mock_enable_homedirs',` ++ userdom_manage_user_home_content_dirs(mock_t) ++ userdom_manage_user_home_content_files(mock_t) ++') ++ ++tunable_policy(`mock_enable_homedirs && use_nfs_home_dirs',` ++ rpc_search_nfs_state_data(mock_t) ++ fs_list_auto_mountpoints(mock_t) ++ fs_manage_nfs_files(mock_t) ++') ++ ++tunable_policy(`mock_enable_homedirs && use_samba_home_dirs',` ++ fs_list_auto_mountpoints(mock_t) ++ fs_read_cifs_files(mock_t) ++ fs_manage_cifs_files(mock_t) ++') ++ ++optional_policy(` ++ abrt_read_spool_retrace(mock_t) ++ abrt_read_cache_retrace(mock_t) ++ abrt_stream_connect(mock_t) ++') ++ ++optional_policy(` ++ apache_read_sys_content_rw_files(mock_t) ++') ++ ++optional_policy(` ++ rpm_exec(mock_t) ++ rpm_manage_cache(mock_t) ++ rpm_manage_db(mock_t) ++ rpm_manage_tmp_files(mock_t) ++ rpm_read_log(mock_t) ++') ++ ++optional_policy(` ++ mount_exec(mock_t) ++ mount_rw_pid_files(mock_t) ++') ++ ++ ++######################################## ++# ++# mock_build local policy ++# ++allow mock_build_t self:capability { sys_admin setfcap setuid sys_chroot chown dac_read_search dac_override sys_nice mknod fsetid setgid fowner sys_ptrace }; ++dontaudit mock_build_t self:capability audit_write; ++allow mock_build_t self:process { fork setsched setpgid signal_perms }; ++allow mock_build_t self:netlink_audit_socket { create_socket_perms nlmsg_relay }; ++# Needed because mock can run java and mono withing build environment ++allow mock_build_t self:process { execmem execstack }; ++dontaudit mock_build_t self:process { siginh noatsecure rlimitinh }; ++allow mock_build_t self:fifo_file manage_fifo_file_perms; ++allow mock_build_t self:unix_stream_socket create_stream_socket_perms; ++allow mock_build_t self:unix_dgram_socket create_socket_perms; ++allow mock_build_t self:dir list_dir_perms; ++allow mock_build_t self:dir read_file_perms; ++ ++ps_process_pattern(mock_t, mock_build_t) ++allow mock_t mock_build_t:process signal_perms; ++domtrans_pattern(mock_t, mock_build_exec_t, mock_build_t) ++domtrans_pattern(mock_t, mock_tmp_t, mock_build_t) ++domain_entry_file(mock_build_t, mock_tmp_t) ++domtrans_pattern(mock_t, mock_var_lib_t, mock_build_t) ++domain_entry_file(mock_build_t, mock_var_lib_t) ++ ++manage_dirs_pattern(mock_build_t, mock_cache_t, mock_cache_t) ++manage_files_pattern(mock_build_t, mock_cache_t, mock_cache_t) ++manage_lnk_files_pattern(mock_build_t, mock_cache_t, mock_cache_t) ++files_var_filetrans(mock_build_t, mock_cache_t, { dir file } ) ++ ++manage_dirs_pattern(mock_build_t, mock_tmp_t, mock_tmp_t) ++manage_files_pattern(mock_build_t, mock_tmp_t, mock_tmp_t) ++files_tmp_filetrans(mock_build_t, mock_tmp_t, { dir file }) ++can_exec(mock_build_t, mock_tmp_t) ++ ++manage_dirs_pattern(mock_build_t, mock_var_lib_t, mock_var_lib_t) ++manage_files_pattern(mock_build_t, mock_var_lib_t, mock_var_lib_t) ++manage_lnk_files_pattern(mock_build_t, mock_var_lib_t, mock_var_lib_t) ++manage_blk_files_pattern(mock_build_t, mock_var_lib_t, mock_var_lib_t) ++manage_chr_files_pattern(mock_build_t, mock_var_lib_t, mock_var_lib_t) ++files_var_lib_filetrans(mock_build_t, mock_var_lib_t, { dir file }) ++can_exec(mock_build_t, mock_var_lib_t) ++allow mock_build_t mock_var_lib_t:dir mounton; ++allow mock_build_t mock_var_lib_t:dir relabel_dir_perms; ++allow mock_build_t mock_var_lib_t:file relabel_file_perms; ++ ++kernel_list_proc(mock_build_t) ++kernel_read_irq_sysctls(mock_build_t) ++kernel_read_system_state(mock_build_t) ++kernel_read_network_state(mock_build_t) ++kernel_read_kernel_sysctls(mock_build_t) ++kernel_request_load_module(mock_build_t) ++kernel_dontaudit_setattr_proc_dirs(mock_build_t) ++ ++corecmd_exec_bin(mock_build_t) ++corecmd_exec_shell(mock_build_t) ++corecmd_dontaudit_exec_all_executables(mock_build_t) ++ ++dev_getattr_all_chr_files(mock_build_t) ++dev_dontaudit_list_all_dev_nodes(mock_build_t) ++dev_dontaudit_getattr_all(mock_build_t) ++fs_getattr_all_dirs(mock_build_t) ++dev_read_sysfs(mock_build_t) ++ ++domain_dontaudit_read_all_domains_state(mock_build_t) ++domain_use_interactive_fds(mock_build_t) ++ ++files_dontaudit_list_boot(mock_build_t) ++ ++fs_getattr_all_fs(mock_build_t) ++fs_manage_cgroup_dirs(mock_build_t) ++ ++selinux_get_enforce_mode(mock_build_t) ++ ++auth_use_nsswitch(mock_build_t) ++ ++init_exec(mock_build_t) ++init_dontaudit_stream_connect(mock_build_t) ++ ++libs_exec_ldconfig(mock_build_t) ++ ++term_use_all_inherited_terms(mock_build_t) ++userdom_use_inherited_user_ptys(mock_build_t) ++term_dontaudit_manage_pty_dirs(mock_build_t) ++ ++tunable_policy(`mock_enable_homedirs',` ++ userdom_read_user_home_content_files(mock_build_t) ++') +diff --git a/modemmanager.fc b/modemmanager.fc +index a83894c6ec..481dca3ff8 100644 +--- a/modemmanager.fc ++++ b/modemmanager.fc +@@ -1 +1,4 @@ + /usr/sbin/modem-manager -- gen_context(system_u:object_r:modemmanager_exec_t,s0) ++/usr/sbin/ModemManager -- gen_context(system_u:object_r:modemmanager_exec_t,s0) ++ ++/usr/lib/systemd/system/ModemManager.service -- gen_context(system_u:object_r:modemmanager_unit_file_t,s0) +diff --git a/modemmanager.if b/modemmanager.if +index b1ac8b5d81..24782b35f6 100644 +--- a/modemmanager.if ++++ b/modemmanager.if +@@ -19,6 +19,31 @@ interface(`modemmanager_domtrans',` + domtrans_pattern($1, modemmanager_exec_t, modemmanager_t) + ') + ++######################################## ++## ++## Execute modemmanager server in the modemmanager domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`modemmanager_systemctl',` ++ gen_require(` ++ type modemmanager_t; ++ type modemmanager_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 modemmanager_unit_file_t:file read_file_perms; ++ allow $1 modemmanager_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, modemmanager_t) ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -39,3 +64,33 @@ interface(`modemmanager_dbus_chat',` + allow $1 modemmanager_t:dbus send_msg; + allow modemmanager_t $1:dbus send_msg; + ') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an modemmanager environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`modemmanager_admin',` ++ gen_require(` ++ type modemmanager_t; ++ type modemmanager_unit_file_t; ++ ') ++ ++ allow $1 modemmanager_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, modemmanager_t) ++ ++ modemmanager_systemctl($1) ++ admin_pattern($1, modemmanager_unit_file_t) ++ allow $1 modemmanager_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/modemmanager.te b/modemmanager.te +index d15eb5b643..c7fd00ea07 100644 +--- a/modemmanager.te ++++ b/modemmanager.te +@@ -11,6 +11,9 @@ init_daemon_domain(modemmanager_t, modemmanager_exec_t) + typealias modemmanager_t alias ModemManager_t; + typealias modemmanager_exec_t alias ModemManager_exec_t; + ++type modemmanager_unit_file_t; ++systemd_unit_file(modemmanager_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -19,20 +22,22 @@ typealias modemmanager_exec_t alias ModemManager_exec_t; + allow modemmanager_t self:capability { net_admin sys_admin sys_tty_config }; + allow modemmanager_t self:process { getsched signal }; + allow modemmanager_t self:fifo_file rw_fifo_file_perms; +-allow modemmanager_t self:unix_stream_socket create_stream_socket_perms; ++allow modemmanager_t self:unix_stream_socket {connectto create_stream_socket_perms}; + allow modemmanager_t self:netlink_kobject_uevent_socket create_socket_perms; + + kernel_read_system_state(modemmanager_t) + +-dev_read_sysfs(modemmanager_t) +-dev_rw_modem(modemmanager_t) ++corecmd_exec_bin(modemmanager_t) + +-files_read_etc_files(modemmanager_t) ++dev_rw_sysfs(modemmanager_t) ++dev_read_urand(modemmanager_t) ++dev_rw_modem(modemmanager_t) + + term_use_generic_ptys(modemmanager_t) + term_use_unallocated_ttys(modemmanager_t) ++term_use_usb_ttys(modemmanager_t) + +-miscfiles_read_localization(modemmanager_t) ++xserver_read_state_xdm(modemmanager_t) + + logging_send_syslog_msg(modemmanager_t) + +@@ -50,6 +55,11 @@ optional_policy(` + optional_policy(` + policykit_dbus_chat(modemmanager_t) + ') ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(modemmanager_t) ++ systemd_write_inhibit_pipes(modemmanager_t) ++ ') + ') + + optional_policy(` +diff --git a/mojomojo.fc b/mojomojo.fc +index 7b827ca7fb..5ee8a0f2b0 100644 +--- a/mojomojo.fc ++++ b/mojomojo.fc +@@ -1,5 +1,5 @@ +-/usr/bin/mojomojo_fastcgi\.pl -- gen_context(system_u:object_r:httpd_mojomojo_script_exec_t,s0) ++/usr/bin/mojomojo_fastcgi\.pl -- gen_context(system_u:object_r:mojomojo_script_exec_t,s0) + +-/usr/share/mojomojo/root(/.*)? gen_context(system_u:object_r:httpd_mojomojo_content_t,s0) ++/usr/share/mojomojo/root(/.*)? gen_context(system_u:object_r:mojomojo_content_t,s0) + +-/var/lib/mojomojo(/.*)? gen_context(system_u:object_r:httpd_mojomojo_rw_content_t,s0) ++/var/lib/mojomojo(/.*)? gen_context(system_u:object_r:mojomojo_rw_content_t,s0) +diff --git a/mojomojo.if b/mojomojo.if +index 73952f4c9b..b19a6ee2dc 100644 +--- a/mojomojo.if ++++ b/mojomojo.if +@@ -15,7 +15,6 @@ + ## Role allowed access. + ## + ## +-## + # + interface(`mojomojo_admin',` + refpolicywarn(`$0($*) has been deprecated, use apache_admin() instead.') +diff --git a/mojomojo.te b/mojomojo.te +index b94102efd0..25d1d33a10 100644 +--- a/mojomojo.te ++++ b/mojomojo.te +@@ -5,21 +5,40 @@ policy_module(mojomojo, 1.1.0) + # Declarations + # + +-apache_content_template(mojomojo) ++type mojomojo_tmp_t alias httpd_mojomojo_tmp_t; ++files_tmp_file(mojomojo_tmp_t) + + ######################################## + # + # Local policy + # + +-allow httpd_mojomojo_script_t httpd_t:unix_stream_socket rw_stream_socket_perms; ++optional_policy(` ++ apache_content_template(mojomojo) ++ apache_content_alias_template(mojomojo, mojomojo) + +-corenet_sendrecv_smtp_client_packets(httpd_mojomojo_script_t) +-corenet_tcp_connect_smtp_port(httpd_mojomojo_script_t) +-corenet_sendrecv_smtp_client_packets(httpd_mojomojo_script_t) ++ manage_dirs_pattern(mojomojo_script_t, mojomojo_tmp_t, mojomojo_tmp_t) ++ manage_files_pattern(mojomojo_script_t, mojomojo_tmp_t, mojomojo_tmp_t) ++ files_tmp_filetrans(mojomojo_script_t, mojomojo_tmp_t, { file dir }) + +-files_search_var_lib(httpd_mojomojo_script_t) ++ corenet_tcp_connect_postgresql_port(mojomojo_script_t) ++ corenet_tcp_connect_mysqld_port(mojomojo_script_t) ++ corenet_tcp_connect_smtp_port(mojomojo_script_t) ++ corenet_sendrecv_postgresql_client_packets(mojomojo_script_t) ++ corenet_sendrecv_mysqld_client_packets(mojomojo_script_t) ++ corenet_sendrecv_smtp_client_packets(mojomojo_script_t) + +-sysnet_dns_name_resolve(httpd_mojomojo_script_t) ++ files_search_var_lib(mojomojo_script_t) + +-mta_send_mail(httpd_mojomojo_script_t) ++ sysnet_dns_name_resolve(mojomojo_script_t) ++ ++ mta_send_mail(mojomojo_script_t) ++ ++ optional_policy(` ++ mysql_stream_connect(mojomojo_script_t) ++ ') ++ ++ optional_policy(` ++ postgresql_stream_connect(mojomojo_script_t) ++ ') ++') +diff --git a/mon_statd.fc b/mon_statd.fc +new file mode 100644 +index 0000000000..60c11c0608 +--- /dev/null ++++ b/mon_statd.fc +@@ -0,0 +1,7 @@ ++/etc/rc\.d/init\.d/mon_statd -- gen_context(system_u:object_r:mon_statd_initrc_exec_t,s0) ++ ++/usr/sbin/mon_fsstatd -- gen_context(system_u:object_r:mon_statd_exec_t,s0) ++/usr/sbin/mon_procd -- gen_context(system_u:object_r:mon_procd_exec_t,s0) ++ ++/var/run/procd.* -- gen_context(system_u:object_r:mon_statd_var_run_t,s0) ++/var/run/fstatd.* -- gen_context(system_u:object_r:mon_statd_var_run_t,s0) +diff --git a/mon_statd.if b/mon_statd.if +new file mode 100644 +index 0000000000..1ce3e44286 +--- /dev/null ++++ b/mon_statd.if +@@ -0,0 +1,39 @@ ++## policy for mon_statd ++ ++######################################## ++## ++## Execute mon_statd in the mon_statd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mon_statd_domtrans',` ++ gen_require(` ++ type mon_statd_t, mon_statd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mon_statd_exec_t, mon_statd_t) ++') ++ ++######################################## ++## ++## Execute mon_procd in the mon_procd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mon_procd_domtrans',` ++ gen_require(` ++ type mon_procd_t, mon_procd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mon_procd_exec_t, mon_procd_t) ++') +diff --git a/mon_statd.te b/mon_statd.te +new file mode 100644 +index 0000000000..e7220a5a86 +--- /dev/null ++++ b/mon_statd.te +@@ -0,0 +1,76 @@ ++policy_module(mon_statd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute mon_statd_domain; ++ ++type mon_statd_t, mon_statd_domain; ++type mon_statd_exec_t; ++init_daemon_domain(mon_statd_t, mon_statd_exec_t) ++ ++type mon_procd_t, mon_statd_domain; ++type mon_procd_exec_t; ++init_daemon_domain(mon_procd_t, mon_procd_exec_t) ++ ++type mon_statd_initrc_exec_t; ++init_script_file(mon_statd_initrc_exec_t) ++ ++type mon_statd_var_run_t; ++files_pid_file(mon_statd_var_run_t) ++ ++######################################## ++# ++# mon_statd domain policy ++# ++ ++manage_files_pattern(mon_statd_domain, mon_statd_var_run_t, mon_statd_var_run_t) ++files_pid_filetrans(mon_statd_domain, mon_statd_var_run_t, file) ++ ++domain_read_all_domains_state(mon_statd_domain) ++ ++dev_rw_monitor_dev(mon_statd_domain) ++ ++######################################## ++# ++# mon_fstatd local policy ++# ++allow mon_statd_t self:process { fork signal }; ++allow mon_statd_t self:fifo_file rw_fifo_file_perms; ++ ++allow mon_statd_t self:unix_stream_socket create_stream_socket_perms; ++allow mon_statd_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_dgram_send(mon_statd_t) ++kernel_read_fs_sysctls(mon_statd_t) ++ ++fs_getattr_all_fs(mon_statd_t) ++fs_getattr_all_dirs(mon_statd_t) ++ ++fs_search_cgroup_dirs(mon_statd_t) ++ ++logging_send_syslog_msg(mon_statd_t) ++ ++optional_policy(` ++ rpc_read_nfs_state_data(mon_statd_t) ++') ++ ++######################################## ++# ++# mon_procd local policy ++# ++allow mon_procd_t self:capability sys_ptrace; ++ ++allow mon_procd_t self:unix_dgram_socket { create connect }; ++ ++auth_read_passwd(mon_procd_t) ++ ++kernel_dgram_send(mon_procd_t) ++kernel_read_system_state(mon_procd_t) ++ ++init_read_utmp(mon_procd_t) ++ ++logging_send_syslog_msg(mon_procd_t) ++ +diff --git a/mongodb.fc b/mongodb.fc +index 6fcfc31b46..e9e6bc51c0 100644 +--- a/mongodb.fc ++++ b/mongodb.fc +@@ -1,9 +1,19 @@ + /etc/rc\.d/init\.d/mongod -- gen_context(system_u:object_r:mongod_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/mongos -- gen_context(system_u:object_r:mongod_initrc_exec_t,s0) + +-/usr/bin/mongod -- gen_context(system_u:object_r:mongod_exec_t,s0) ++/usr/lib/systemd/system/mongod.* -- gen_context(system_u:object_r:mongod_unit_file_t,s0) ++/usr/lib/systemd/system/mongos.* -- gen_context(system_u:object_r:mongod_unit_file_t,s0) ++ ++/usr/bin/mongod -- gen_context(system_u:object_r:mongod_exec_t,s0) ++/usr/bin/mongos -- gen_context(system_u:object_r:mongod_exec_t,s0) ++/usr/share/aeolus-conductor/dbomatic/dbomatic -- gen_context(system_u:object_r:mongod_exec_t,s0) ++ ++/usr/libexec/mongodb-scl-helper -- gen_context(system_u:object_r:mongod_exec_t,s0) + + /var/lib/mongo.* gen_context(system_u:object_r:mongod_var_lib_t,s0) + +-/var/log/mongo.* gen_context(system_u:object_r:mongod_log_t,s0) ++/var/log/mongo.* gen_context(system_u:object_r:mongod_log_t,s0) ++/var/log/aeolus-conductor/dbomatic\.log.* -- gen_context(system_u:object_r:mongod_log_t,s0) + +-/var/run/mongo.* gen_context(system_u:object_r:mongod_var_run_t,s0) ++/var/run/mongo.* gen_context(system_u:object_r:mongod_var_run_t,s0) ++/var/run/aeolus/dbomatic\.pid -- gen_context(system_u:object_r:mongod_var_run_t,s0) +diff --git a/mongodb.te b/mongodb.te +index 169f236e87..bc47602c8c 100644 +--- a/mongodb.te ++++ b/mongodb.te +@@ -12,6 +12,9 @@ init_daemon_domain(mongod_t, mongod_exec_t) + type mongod_initrc_exec_t; + init_script_file(mongod_initrc_exec_t) + ++type mongod_unit_file_t; ++systemd_unit_file(mongod_unit_file_t) ++ + type mongod_log_t; + logging_log_file(mongod_log_t) + +@@ -21,41 +24,73 @@ files_type(mongod_var_lib_t) + type mongod_var_run_t; + files_pid_file(mongod_var_run_t) + ++type mongod_tmp_t; ++files_tmp_file(mongod_tmp_t) ++ + ######################################## + # + # Local policy + # + +-allow mongod_t self:process signal; ++ ++allow mongod_t self:process { setsched signal execmem }; + allow mongod_t self:fifo_file rw_fifo_file_perms; + +-manage_dirs_pattern(mongod_t, mongod_log_t, mongod_log_t) +-append_files_pattern(mongod_t, mongod_log_t, mongod_log_t) +-create_files_pattern(mongod_t, mongod_log_t, mongod_log_t) +-setattr_files_pattern(mongod_t, mongod_log_t, mongod_log_t) +-logging_log_filetrans(mongod_t, mongod_log_t, dir) ++allow mongod_t self:netlink_route_socket r_netlink_socket_perms; ++allow mongod_t self:unix_stream_socket create_stream_socket_perms; ++allow mongod_t self:udp_socket create_socket_perms; ++allow mongod_t self:tcp_socket { accept listen }; ++ ++manage_files_pattern(mongod_t, mongod_log_t, mongod_log_t) ++logging_log_filetrans(mongod_t, mongod_log_t, { dir file }) + + manage_dirs_pattern(mongod_t, mongod_var_lib_t, mongod_var_lib_t) + manage_files_pattern(mongod_t, mongod_var_lib_t, mongod_var_lib_t) + files_var_lib_filetrans(mongod_t, mongod_var_lib_t, dir) ++allow mongod_t mongod_var_lib_t:file map; + + manage_dirs_pattern(mongod_t, mongod_var_run_t, mongod_var_run_t) + manage_files_pattern(mongod_t, mongod_var_run_t, mongod_var_run_t) +-files_pid_filetrans(mongod_t, mongod_var_run_t, dir) ++manage_sock_files_pattern(mongod_t, mongod_var_run_t, mongod_var_run_t) ++files_pid_filetrans(mongod_t, mongod_var_run_t, { dir file sock_file }) ++ ++manage_dirs_pattern(mongod_t, mongod_tmp_t, mongod_tmp_t) ++manage_files_pattern(mongod_t, mongod_tmp_t, mongod_tmp_t) ++manage_sock_files_pattern(mongod_t, mongod_tmp_t, mongod_tmp_t) ++files_tmp_filetrans(mongod_t, mongod_tmp_t, { file dir sock_file }) + + kernel_read_system_state(mongod_t) ++kernel_read_vm_sysctls(mongod_t) ++ ++corecmd_exec_bin(mongod_t) ++corecmd_exec_shell(mongod_t) + + corenet_all_recvfrom_unlabeled(mongod_t) + corenet_all_recvfrom_netlabel(mongod_t) + corenet_tcp_sendrecv_generic_if(mongod_t) + corenet_tcp_sendrecv_generic_node(mongod_t) ++corenet_tcp_connect_mongod_port(mongod_t) ++corenet_tcp_bind_mongod_port(mongod_t) + corenet_tcp_bind_generic_node(mongod_t) + + dev_read_sysfs(mongod_t) + dev_read_urand(mongod_t) + +-files_read_etc_files(mongod_t) +- + fs_getattr_all_fs(mongod_t) + +-miscfiles_read_localization(mongod_t) ++auth_use_nsswitch(mongod_t) ++ ++logging_send_syslog_msg(mongod_t) ++ ++optional_policy(` ++ mysql_stream_connect(mongod_t) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(mongod_t) ++') ++ ++optional_policy(` ++ sysnet_dns_name_resolve(mongod_t) ++') ++ +diff --git a/mono.te b/mono.te +index a6a86439fa..c0f6cf503d 100644 +--- a/mono.te ++++ b/mono.te +@@ -28,7 +28,7 @@ allow mono_domain self:process { signal getsched execheap execmem execstack }; + # local policy + # + +-userdom_user_home_dir_filetrans_user_home_content(mono_t, { dir file lnk_file fifo_file sock_file }) ++userdom_filetrans_home_content(mono_t) + + init_dbus_chat_script(mono_t) + +diff --git a/monop.if b/monop.if +index 8fdaecea21..5440757657 100644 +--- a/monop.if ++++ b/monop.if +@@ -31,7 +31,7 @@ interface(`monop_admin',` + role_transition $2 monopd_initrc_exec_t system_r; + allow $2 system_r; + +- logging_search_etc($1) ++ logging_search_logs($1) + admin_pattern($1, monopd_etc_t) + + files_search_pids($1) +diff --git a/monop.te b/monop.te +index 5f93763848..8596763e7a 100644 +--- a/monop.te ++++ b/monop.te +@@ -43,7 +43,6 @@ kernel_read_kernel_sysctls(monopd_t) + kernel_list_proc(monopd_t) + kernel_read_proc_symlinks(monopd_t) + +-corenet_all_recvfrom_unlabeled(monopd_t) + corenet_all_recvfrom_netlabel(monopd_t) + corenet_tcp_sendrecv_generic_if(monopd_t) + corenet_tcp_sendrecv_generic_node(monopd_t) +@@ -57,15 +56,11 @@ dev_read_sysfs(monopd_t) + + domain_use_interactive_fds(monopd_t) + +-files_read_etc_files(monopd_t) +- + fs_getattr_all_fs(monopd_t) + fs_search_auto_mountpoints(monopd_t) + + logging_send_syslog_msg(monopd_t) + +-miscfiles_read_localization(monopd_t) +- + sysnet_dns_name_resolve(monopd_t) + + userdom_dontaudit_use_unpriv_user_fds(monopd_t) +diff --git a/motion.fc b/motion.fc +new file mode 100644 +index 0000000000..74151069bc +--- /dev/null ++++ b/motion.fc +@@ -0,0 +1,9 @@ ++/usr/bin/motion -- gen_context(system_u:object_r:motion_exec_t,s0) ++ ++/usr/lib/systemd/system/motion.* -- gen_context(system_u:object_r:motion_unit_file_t,s0) ++ ++/var/log/motion\.log.* -- gen_context(system_u:object_r:motion_log_t,s0) ++ ++/var/run/motion\.pid -- gen_context(system_u:object_r:motion_var_run_t,s0) ++ ++/var/motion(/.*)? gen_context(system_u:object_r:motion_data_t,s0) +diff --git a/motion.if b/motion.if +new file mode 100644 +index 0000000000..edfd267776 +--- /dev/null ++++ b/motion.if +@@ -0,0 +1,198 @@ ++ ++## Detect motion using a video4linux device ++ ++######################################## ++## ++## Execute motion in the motion domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`motion_domtrans',` ++ gen_require(` ++ type motion_t, motion_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, motion_exec_t, motion_t) ++') ++######################################## ++## ++## Read motion's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`motion_read_log',` ++ gen_require(` ++ type motion_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, motion_log_t, motion_log_t) ++') ++ ++######################################## ++## ++## Append to motion log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`motion_append_log',` ++ gen_require(` ++ type motion_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, motion_log_t, motion_log_t) ++') ++ ++######################################## ++## ++## Manage motion log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`motion_manage_log',` ++ gen_require(` ++ type motion_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, motion_log_t, motion_log_t) ++ manage_files_pattern($1, motion_log_t, motion_log_t) ++ manage_lnk_files_pattern($1, motion_log_t, motion_log_t) ++') ++ ++######################################## ++## ++## Manage motion pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`motion_manage_pid',` ++ gen_require(` ++ type motion_var_run_t; ++ ') ++ ++ manage_dirs_pattern($1, motion_var_run_t, motion_var_run_t) ++ manage_files_pattern($1, motion_var_run_t, motion_var_run_t) ++') ++ ++######################################## ++## ++## Manage motion data files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`motion_manage_data',` ++ gen_require(` ++ type motion_data_t; ++ ') ++ ++ manage_dirs_pattern($1, motion_data_t, motion_data_t) ++ manage_files_pattern($1, motion_data_t, motion_data_t) ++') ++ ++######################################## ++## ++## Execute motion server in the motion domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`motion_systemctl',` ++ gen_require(` ++ type motion_t; ++ type motion_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 motion_unit_file_t:file read_file_perms; ++ allow $1 motion_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, motion_t) ++') ++ ++######################################## ++## ++## Manage all motion files. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`motion_manage_all_files',` ++ ++ motion_manage_log($1) ++ motion_manage_pid($1) ++ motion_manage_data($1) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an motion environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`motion_admin',` ++ gen_require(` ++ type motion_t; ++ type motion_log_t; ++ type motion_unit_file_t; ++ ') ++ ++ allow $1 motion_t:process { signal_perms }; ++ ps_process_pattern($1, motion_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 motion_t:process ptrace; ++ ') ++ ++ logging_search_logs($1) ++ admin_pattern($1, motion_log_t) ++ ++ motion_systemctl($1) ++ admin_pattern($1, motion_unit_file_t) ++ allow $1 motion_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/motion.te b/motion.te +new file mode 100644 +index 0000000000..c7f4eb5837 +--- /dev/null ++++ b/motion.te +@@ -0,0 +1,65 @@ ++policy_module(motion, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type motion_t; ++type motion_exec_t; ++init_daemon_domain(motion_t, motion_exec_t) ++ ++type motion_log_t; ++logging_log_file(motion_log_t) ++ ++type motion_unit_file_t; ++systemd_unit_file(motion_unit_file_t) ++ ++type motion_var_run_t; ++files_pid_file(motion_var_run_t) ++ ++type motion_data_t; ++files_type(motion_data_t) ++ ++######################################## ++# ++# motion local policy ++# ++allow motion_t self:udp_socket { create connect getattr }; ++allow motion_t self:tcp_socket create_stream_socket_perms; ++allow motion_t self:netlink_route_socket r_netlink_socket_perms; ++ ++manage_dirs_pattern(motion_t, motion_log_t, motion_log_t) ++manage_files_pattern(motion_t, motion_log_t, motion_log_t) ++logging_log_filetrans(motion_t, motion_log_t, { dir file }) ++ ++manage_dirs_pattern(motion_t, motion_var_run_t, motion_var_run_t) ++manage_files_pattern(motion_t, motion_var_run_t, motion_var_run_t) ++files_pid_filetrans(motion_t, motion_var_run_t, { dir file }) ++ ++manage_dirs_pattern(motion_t, motion_data_t, motion_data_t) ++manage_files_pattern(motion_t, motion_data_t, motion_data_t) ++files_var_filetrans(motion_t, motion_data_t, { dir file }) ++ ++corenet_tcp_bind_http_cache_port(motion_t) ++corenet_tcp_bind_transproxy_port(motion_t) ++corenet_tcp_bind_us_cli_port(motion_t) ++corenet_tcp_connect_http_port(motion_t) ++corenet_tcp_bind_generic_node(motion_t) ++ ++dev_read_video_dev(motion_t) ++dev_write_video_dev(motion_t) ++ ++domain_use_interactive_fds(motion_t) ++ ++logging_send_syslog_msg(motion_t) ++ ++sysnet_read_config(motion_t) ++ ++userdom_home_manager(motion_t) ++ ++optional_policy(` ++ zoneminder_domtrans(motion_t) ++ zoneminder_manage_lib_files(motion_t) ++') ++ +diff --git a/mozilla.fc b/mozilla.fc +index 6ffaba2e43..e863bad61f 100644 +--- a/mozilla.fc ++++ b/mozilla.fc +@@ -1,38 +1,73 @@ +-HOME_DIR/\.galeon(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) +-HOME_DIR/\.mozilla(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) +-HOME_DIR/\.mozilla/plugins(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.netscape(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) +-HOME_DIR/\.phoenix(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) +- +-HOME_DIR/\.adobe(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.macromedia(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.gnash(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.gcjwebplugin(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.icedteaplugin(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.spicec(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/\.ICAClient(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +-HOME_DIR/zimbrauserdata(/.*)? gen_context(system_u:object_r:mozilla_plugin_home_t,s0) +- +-/usr/bin/epiphany -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/bin/epiphany-bin -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/bin/mozilla -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++HOME_DIR/\.config/chromium(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.galeon(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.java(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.mozilla(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.cache/mozilla(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.cache/icedtea-web(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.thunderbird(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/POkemon.*(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.netscape(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.phoenix(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.adobe(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.macromedia(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.gnash(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.webex(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.gnashpluginrc gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/abc -- gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/mozilla\.pdf -- gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.gcjwebplugin(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.grl-podcasts(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.icedteaplugin(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.icedtea(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.juniper_networks(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.lyx(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.quakelive(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.spicec(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.ICAClient(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/\.IBMERS(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++HOME_DIR/zimbrauserdata(/.*)? gen_context(system_u:object_r:mozilla_home_t,s0) ++# ++# /bin ++# ++/usr/bin/netscape -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/bin/mozilla -- gen_context(system_u:object_r:mozilla_exec_t,s0) + /usr/bin/mozilla-snapshot -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/bin/epiphany-bin -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/bin/epiphany -- gen_context(system_u:object_r:mozilla_exec_t,s0) + /usr/bin/mozilla-[0-9].* -- gen_context(system_u:object_r:mozilla_exec_t,s0) + /usr/bin/mozilla-bin-[0-9].* -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/bin/netscape -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/bin/nspluginscan -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) +-/usr/bin/nspluginviewer -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) +- +-/usr/lib/[^/]*firefox[^/]*/firefox -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/[^/]*firefox[^/]*/firefox-bin -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/firefox[^/]*/mozilla-.* -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/galeon/galeon -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/iceweasel/iceweasel -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/mozilla[^/]*/reg.+ -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/mozilla[^/]*/mozilla-.* -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/mozilla/plugins-wrapped(/.*)? gen_context(system_u:object_r:mozilla_plugin_rw_t,s0) +-/usr/lib/netscape/base-4/wrapper -- gen_context(system_u:object_r:mozilla_exec_t,s0) +-/usr/lib/netscape/.+/communicator/communicator-smotif\.real -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++ ++ifdef(`distro_redhat',` ++/usr/bin/nspluginscan -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) ++/usr/bin/nspluginviewer -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) + /usr/lib/nspluginwrapper/npviewer.bin -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) +-/usr/lib/nspluginwrapper/plugin-config -- gen_context(system_u:object_r:mozilla_plugin_config_exec_t,s0) +-/usr/lib/xulrunner[^/]*/plugin-container -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) ++') ++ ++ifdef(`distro_debian',` ++/usr/lib/iceweasel/iceweasel -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++') ++ ++# ++# /lib ++# ++ ++/usr/lib/galeon/galeon -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/netscape/.+/communicator/communicator-smotif\.real -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/netscape/base-4/wrapper -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/mozilla[^/]*/reg.+ -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/mozilla[^/]*/mozilla-.* -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/firefox[^/]*/mozilla-.* -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/[^/]*firefox[^/]*/firefox-bin -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++/usr/lib/[^/]*firefox[^/]*/firefox -- gen_context(system_u:object_r:mozilla_exec_t,s0) ++ ++/usr/lib/xulrunner[^/]*/plugin-container -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) ++ ++/usr/lib/firefox/plugin-container -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) ++ ++/usr/lib/mozilla/plugins-wrapped(/.*)? gen_context(system_u:object_r:mozilla_plugin_rw_t,s0) ++ ++/usr/libexec/WebKitPluginProcess -- gen_context(system_u:object_r:mozilla_plugin_exec_t,s0) ++ ++ifdef(`distro_redhat',` ++/usr/lib/nspluginwrapper/plugin-config -- gen_context(system_u:object_r:mozilla_plugin_config_exec_t,s0) ++') +diff --git a/mozilla.if b/mozilla.if +index 6194b806b2..ded39ae5c2 100644 +--- a/mozilla.if ++++ b/mozilla.if +@@ -1,146 +1,75 @@ +-## Policy for Mozilla and related web browsers. ++## Policy for Mozilla and related web browsers + + ######################################## + ## +-## Role access for mozilla. ++## Role access for mozilla + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + # + interface(`mozilla_role',` + gen_require(` + type mozilla_t, mozilla_exec_t, mozilla_home_t; +- type mozilla_tmp_t, mozilla_tmpfs_t, mozilla_plugin_tmp_t; +- type mozilla_plugin_tmpfs_t, mozilla_plugin_home_t; + attribute_role mozilla_roles; + ') + +- ######################################## +- # +- # Declarations +- # +- + roleattribute $1 mozilla_roles; + +- ######################################## +- # +- # Policy +- # +- +- domtrans_pattern($2, mozilla_exec_t, mozilla_t) ++ domain_auto_trans($2, mozilla_exec_t, mozilla_t) ++ # Unrestricted inheritance from the caller. ++ allow $2 mozilla_t:process { noatsecure siginh rlimitinh }; ++ allow mozilla_t $2:fd use; ++ allow mozilla_t $2:process { sigchld signull }; ++ allow mozilla_t $2:unix_stream_socket connectto; + +- allow $2 mozilla_t:process { noatsecure siginh rlimitinh ptrace signal_perms }; ++ # Allow the user domain to signal/ps. + ps_process_pattern($2, mozilla_t) +- +- allow mozilla_t $2:process signull; +- allow mozilla_t $2:unix_stream_socket connectto; ++ allow $2 mozilla_t:process signal_perms; + + allow $2 mozilla_t:fd use; +- allow $2 mozilla_t:shm rw_shm_perms; +- +- stream_connect_pattern($2, mozilla_tmpfs_t, mozilla_tmpfs_t, mozilla_t) +- +- allow $2 { mozilla_home_t mozilla_plugin_home_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { mozilla_home_t mozilla_plugin_home_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 mozilla_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".galeon") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".mozilla") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".netscape") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".phoenix") ++ allow $2 mozilla_t:shm { associate getattr }; ++ allow $2 mozilla_t:shm { unix_read unix_write }; ++ allow $2 mozilla_t:unix_stream_socket connectto; + +- filetrans_pattern($2, mozilla_home_t, mozilla_plugin_home_t, dir, "plugins") ++ # X access, Home files ++ manage_dirs_pattern($2, mozilla_home_t, mozilla_home_t) ++ manage_files_pattern($2, mozilla_home_t, mozilla_home_t) ++ manage_lnk_files_pattern($2, mozilla_home_t, mozilla_home_t) ++ relabel_dirs_pattern($2, mozilla_home_t, mozilla_home_t) ++ relabel_files_pattern($2, mozilla_home_t, mozilla_home_t) ++ relabel_lnk_files_pattern($2, mozilla_home_t, mozilla_home_t) + +- allow $2 { mozilla_tmp_t mozilla_plugin_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { mozilla_tmp_t mozilla_plugin_tmp_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 mozilla_plugin_tmp_t:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; ++ #should be remove then with adding of roleattribute ++ mozilla_run_plugin(mozilla_t, $1) ++ mozilla_dbus_chat($2) + +- allow $2 { mozilla_tmpfs_t mozilla_plugin_tmpfs_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { mozilla_tmpfs_t mozilla_plugin_tmpfs_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 { mozilla_tmpfs_t mozilla_plugin_tmpfs_t }:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; +- allow $2 { mozilla_tmpfs_t mozilla_plugin_tmpfs_t }:sock_file { manage_sock_file_perms relabel_sock_file_perms }; ++ userdom_manage_tmp_role($1, mozilla_t) + + optional_policy(` +- mozilla_dbus_chat($2) ++ nsplugin_role($1, mozilla_t) + ') +-') + +-######################################## +-## +-## Role access for mozilla plugin. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-interface(`mozilla_role_plugin',` +- gen_require(` +- type mozilla_plugin_tmp_t, mozilla_plugin_tmpfs_t, mozilla_plugin_rw_t; +- type mozilla_home_t; ++ optional_policy(` ++ pulseaudio_role($1, mozilla_t) ++ pulseaudio_filetrans_admin_home_content(mozilla_t) ++ pulseaudio_filetrans_home_content(mozilla_t) + ') + +- mozilla_run_plugin($2, $1) +- mozilla_run_plugin_config($2, $1) +- +- allow $2 { mozilla_plugin_t mozilla_plugin_config_t }:process { ptrace signal_perms }; +- ps_process_pattern($2, { mozilla_plugin_t mozilla_plugin_config_t }) ++ mozilla_filetrans_home_content($2) + +- allow $2 mozilla_plugin_t:unix_stream_socket rw_socket_perms; +- allow $2 mozilla_plugin_t:fd use; +- +- stream_connect_pattern($2, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t, mozilla_plugin_t) +- +- allow mozilla_plugin_t $2:process signull; +- allow mozilla_plugin_t $2:unix_stream_socket { connectto rw_socket_perms }; +- allow mozilla_plugin_t $2:unix_dgram_socket { sendto rw_socket_perms }; +- allow mozilla_plugin_t $2:shm { rw_shm_perms destroy }; +- allow mozilla_plugin_t $2:sem create_sem_perms; +- +- allow $2 mozilla_home_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 mozilla_home_t:file { manage_file_perms relabel_file_perms }; +- allow $2 mozilla_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".galeon") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".mozilla") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".netscape") +- userdom_user_home_dir_filetrans($2, mozilla_home_t, dir, ".phoenix") +- +- allow $2 mozilla_plugin_tmp_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 mozilla_plugin_tmp_t:file { manage_file_perms relabel_file_perms }; +- allow $2 mozilla_plugin_tmp_t:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; +- +- allow $2 mozilla_plugin_tmpfs_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 mozilla_plugin_tmpfs_t:file { manage_file_perms relabel_file_perms }; +- allow $2 mozilla_plugin_tmpfs_t:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; +- allow $2 mozilla_plugin_tmpfs_t:sock_file { manage_sock_file_perms relabel_sock_file_perms }; +- +- allow $2 mozilla_plugin_rw_t:dir list_dir_perms; +- allow $2 mozilla_plugin_rw_t:file read_file_perms; +- allow $2 mozilla_plugin_rw_t:lnk_file read_lnk_file_perms; +- +- can_exec($2, mozilla_plugin_rw_t) +- +- optional_policy(` +- mozilla_dbus_chat_plugin($2) +- ') + ') + + ######################################## + ## +-## Read mozilla home directory content. ++## Read mozilla home directory content + ## + ## + ## +@@ -153,15 +82,15 @@ interface(`mozilla_read_user_home_files',` + type mozilla_home_t; + ') + +- userdom_search_user_home_dirs($1) + allow $1 mozilla_home_t:dir list_dir_perms; + allow $1 mozilla_home_t:file read_file_perms; + allow $1 mozilla_home_t:lnk_file read_lnk_file_perms; ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Write mozilla home directory files. ++## Write mozilla home directory content + ## + ## + ## +@@ -174,14 +103,13 @@ interface(`mozilla_write_user_home_files',` + type mozilla_home_t; + ') + +- userdom_search_user_home_dirs($1) + write_files_pattern($1, mozilla_home_t, mozilla_home_t) ++ userdom_search_user_home_dirs($1) + ') + + ######################################## + ## +-## Do not audit attempts to read and +-## write mozilla home directory files. ++## Dontaudit attempts to read/write mozilla home directory content + ## + ## + ## +@@ -194,14 +122,12 @@ interface(`mozilla_dontaudit_rw_user_home_files',` + type mozilla_home_t; + ') + +- dontaudit $1 mozilla_home_t:file rw_file_perms; ++ dontaudit $1 mozilla_home_t:file rw_inherited_file_perms; + ') + + ######################################## + ## +-## Do not audit attempt to Create, +-## read, write, and delete mozilla +-## home directory content. ++## Dontaudit attempts to write mozilla home directory content + ## + ## + ## +@@ -216,12 +142,11 @@ interface(`mozilla_dontaudit_manage_user_home_files',` + + dontaudit $1 mozilla_home_t:dir manage_dir_perms; + dontaudit $1 mozilla_home_t:file manage_file_perms; +- dontaudit $1 mozilla_home_t:lnk_file manage_lnk_file_perms; + ') + + ######################################## + ## +-## Execute mozilla home directory files. (Deprecated) ++## Execute mozilla home directory content. + ## + ## + ## +@@ -230,33 +155,16 @@ interface(`mozilla_dontaudit_manage_user_home_files',` + ## + # + interface(`mozilla_exec_user_home_files',` +- refpolicywarn(`$0($*) has been deprecated, use mozilla_exec_user_plugin_home_files() instead.') +- mozilla_exec_user_plugin_home_files($1) +-') +- +-######################################## +-## +-## Execute mozilla plugin home directory files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`mozilla_exec_user_plugin_home_files',` + gen_require(` +- type mozilla_home_t, mozilla_plugin_home_t; ++ type mozilla_home_t; + ') + +- userdom_search_user_home_dirs($1) +- exec_files_pattern($1, { mozilla_home_t mozilla_plugin_home_t }, mozilla_plugin_home_t) ++ can_exec($1, mozilla_home_t) + ') + + ######################################## + ## +-## Mozilla home directory file +-## text relocation. (Deprecated) ++## Execmod mozilla home directory content. + ## + ## + ## +@@ -265,140 +173,157 @@ interface(`mozilla_exec_user_plugin_home_files',` + ## + # + interface(`mozilla_execmod_user_home_files',` +- refpolicywarn(`$0($*) has been deprecated, use mozilla_execmod_user_plugin_home_files() instead.') +- mozilla_execmod_user_plugin_home_files($1) ++ gen_require(` ++ type mozilla_home_t; ++ ') ++ ++ allow $1 mozilla_home_t:file execmod; + ') + + ######################################## + ## +-## Mozilla plugin home directory file +-## text relocation. ++## Run mozilla in the mozilla domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`mozilla_execmod_user_plugin_home_files',` ++interface(`mozilla_domtrans',` + gen_require(` +- type mozilla_plugin_home_t; ++ type mozilla_t, mozilla_exec_t; + ') + +- allow $1 mozilla_plugin_home_t:file execmod; ++ domtrans_pattern($1, mozilla_exec_t, mozilla_t) + ') + + ######################################## + ## +-## Run mozilla in the mozilla domain. ++## Execute a mozilla_exec_t in the specified domain. + ## + ## + ## + ## Domain allowed to transition. + ## + ## ++## ++## ++## The type of the new process. ++## ++## + # +-interface(`mozilla_domtrans',` ++interface(`mozilla_domtrans_spec',` + gen_require(` +- type mozilla_t, mozilla_exec_t; ++ type mozilla_exec_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, mozilla_exec_t, mozilla_t) ++ domain_entry_file($2, mozilla_exec_t) ++ domtrans_pattern($1, mozilla_exec_t, $2) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run mozilla plugin. ++## Execute a domain transition to run mozilla_plugin. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # + interface(`mozilla_domtrans_plugin',` + gen_require(` + type mozilla_plugin_t, mozilla_plugin_exec_t; ++ type mozilla_plugin_config_t, mozilla_plugin_config_exec_t; ++ type mozilla_plugin_rw_t; ++ class dbus send_msg; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, mozilla_plugin_exec_t, mozilla_plugin_t) ++ domtrans_pattern($1, mozilla_plugin_config_exec_t, mozilla_plugin_config_t) ++ allow mozilla_plugin_t $1:process signull; ++ dontaudit mozilla_plugin_config_t $1:file read_inherited_file_perms; ++ dontaudit mozilla_plugin_t $1:process signal; ++ allow $1 mozilla_plugin_t:unix_stream_socket { connectto rw_socket_perms }; ++ allow $1 mozilla_plugin_t:fd use; ++ ++ allow mozilla_plugin_t $1:unix_stream_socket rw_socket_perms; ++ allow mozilla_plugin_t $1:unix_dgram_socket { sendto rw_socket_perms }; ++ allow mozilla_plugin_t $1:shm { rw_shm_perms destroy }; ++ allow mozilla_plugin_t $1:sem create_sem_perms; ++ allow $1 mozilla_plugin_t:sem rw_sem_perms; ++ allow $1 mozilla_plugin_t:shm rw_shm_perms; ++ allow $1 mozilla_plugin_t:fifo_file rw_fifo_file_perms; ++ ++ ps_process_pattern($1, mozilla_plugin_t) ++ ps_process_pattern(mozilla_plugin_t, $1) ++ allow $1 mozilla_plugin_t:process { signal_perms noatsecure }; ++ ++ list_dirs_pattern($1, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++ read_files_pattern($1, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++ read_lnk_files_pattern($1, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++ can_exec($1, mozilla_plugin_rw_t) ++ ++ allow $1 mozilla_plugin_t:dbus send_msg; ++ allow mozilla_plugin_t $1:dbus send_msg; ++ ++ allow mozilla_plugin_t $1:process signull; + ') + + ######################################## + ## +-## Execute mozilla plugin in the +-## mozilla plugin domain, and allow +-## the specified role the mozilla +-## plugin domain. ++## Execute mozilla_plugin in the mozilla_plugin domain, and ++## allow the specified role the mozilla_plugin domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access + ## + ## + ## + ## +-## Role allowed access. ++## The role to be allowed the mozilla_plugin domain. + ## + ## + # + interface(`mozilla_run_plugin',` + gen_require(` +- attribute_role mozilla_plugin_roles; ++ type mozilla_plugin_t; ++ attribute_role mozilla_plugin_roles, mozilla_plugin_config_roles; + ') + + mozilla_domtrans_plugin($1) + roleattribute $2 mozilla_plugin_roles; +-') ++ roleattribute $2 mozilla_plugin_config_roles; + +-######################################## +-## +-## Execute a domain transition to +-## run mozilla plugin config. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-# +-interface(`mozilla_domtrans_plugin_config',` +- gen_require(` +- type mozilla_plugin_config_t, mozilla_plugin_config_exec_t; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mozilla_plugin_t:process ptrace; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, mozilla_plugin_config_exec_t, mozilla_plugin_config_t) ++ optional_policy(` ++ lpd_run_lpr(mozilla_plugin_t, $2) ++ ') + ') + +-######################################## ++####################################### + ## +-## Execute mozilla plugin config in +-## the mozilla plugin config domain, +-## and allow the specified role the +-## mozilla plugin config domain. ++## Execute qemu unconfined programs in the role. + ## +-## +-## +-## Domain allowed to transition. +-## +-## + ## +-## +-## Role allowed access. +-## ++## ++## The role to allow the mozilla_plugin domain. ++## + ## ++## + # +-interface(`mozilla_run_plugin_config',` +- gen_require(` +- attribute_role mozilla_plugin_config_roles; +- ') ++interface(`mozilla_role_plugin',` ++ gen_require(` ++ attribute_role mozilla_plugin_roles, mozilla_plugin_config_roles; ++ ') + +- mozilla_domtrans_plugin_config($1) +- roleattribute $2 mozilla_plugin_config_roles; ++ roleattribute $1 mozilla_plugin_roles; ++ roleattribute $1 mozilla_plugin_config_roles; + ') + + ######################################## +@@ -424,8 +349,7 @@ interface(`mozilla_dbus_chat',` + + ######################################## + ## +-## Send and receive messages from +-## mozilla plugin over dbus. ++## read/write mozilla per user tcp_socket + ## + ## + ## +@@ -433,57 +357,162 @@ interface(`mozilla_dbus_chat',` + ## + ## + # +-interface(`mozilla_dbus_chat_plugin',` ++interface(`mozilla_rw_tcp_sockets',` + gen_require(` +- type mozilla_plugin_t; +- class dbus send_msg; ++ type mozilla_t; + ') + +- allow $1 mozilla_plugin_t:dbus send_msg; +- allow mozilla_plugin_t $1:dbus send_msg; ++ allow $1 mozilla_t:tcp_socket rw_socket_perms; ++') ++ ++####################################### ++## ++## Read mozilla_plugin tmpfs files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`mozilla_plugin_read_tmpfs_files',` ++ gen_require(` ++ type mozilla_plugin_tmpfs_t; ++ ') ++ ++ allow $1 mozilla_plugin_tmpfs_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Read/Write mozilla_plugin tmpfs files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`mozilla_plugin_rw_tmpfs_files',` ++ gen_require(` ++ type mozilla_plugin_tmpfs_t; ++ ') ++ ++ rw_files_pattern($1, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t) + ') + + ######################################## + ## +-## Read and write mozilla TCP sockets. ++## Delete mozilla_plugin tmpfs files + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access + ## + ## + # +-interface(`mozilla_rw_tcp_sockets',` ++interface(`mozilla_plugin_delete_tmpfs_files',` + gen_require(` +- type mozilla_t; ++ type mozilla_plugin_tmpfs_t; + ') + +- allow $1 mozilla_t:tcp_socket rw_socket_perms; ++ allow $1 mozilla_plugin_tmpfs_t:file delete_file_perms; ++') ++ ++####################################### ++## ++## Dontaudit generict ipc read/write to a mozilla_plugin ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mozilla_plugin_dontaudit_rw_sem',` ++ gen_require(` ++ type mozilla_plugin_t; ++ ') ++ ++ dontaudit $1 mozilla_plugin_t:sem { associate unix_read unix_write }; ++') ++ ++####################################### ++## ++## Allow generict ipc read/write to a mozilla_plugin ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mozilla_plugin_rw_sem',` ++ gen_require(` ++ type mozilla_plugin_t; ++ ') ++ ++ allow $1 mozilla_plugin_t:sem { associate unix_read unix_write }; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## mozilla plugin rw files. ++## Dontaudit read/write to a mozilla_plugin leaks + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`mozilla_manage_plugin_rw_files',` ++interface(`mozilla_plugin_dontaudit_leaks',` + gen_require(` +- type mozilla_plugin_rw_t; ++ type mozilla_plugin_t; + ') + +- libs_search_lib($1) +- manage_files_pattern($1, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++ dontaudit $1 mozilla_plugin_t:unix_stream_socket { read write }; ++') ++ ++####################################### ++## ++## Dontaudit read/write to a mozilla_plugin tmp files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mozilla_plugin_dontaudit_rw_tmp_files',` ++ gen_require(` ++ type mozilla_plugin_tmp_t; ++ ') ++ ++ dontaudit $1 mozilla_plugin_tmp_t:file { read write }; ++') ++ ++####################################### ++## ++## Allow read/write to a mozilla_plugin tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mozilla_plugin_rw_tmp_files',` ++ gen_require(` ++ type mozilla_plugin_tmp_t; ++ ') ++ ++ dontaudit $1 mozilla_plugin_tmp_t:file { read write }; + ') + + ######################################## + ## +-## Read mozilla_plugin tmpfs files. ++## Create, read, write, and delete ++## mozilla_plugin rw files. + ## + ## + ## +@@ -491,18 +520,18 @@ interface(`mozilla_manage_plugin_rw_files',` + ## + ## + # +-interface(`mozilla_plugin_read_tmpfs_files',` ++interface(`mozilla_plugin_manage_rw_files',` + gen_require(` +- type mozilla_plugin_tmpfs_t; ++ type mozilla_plugin_rw_t; + ') + +- fs_search_tmpfs($1) +- allow $1 mozilla_plugin_tmpfs_t:file read_file_perms; ++ allow $1 mozilla_plugin_rw_t:file manage_file_perms; ++ allow $1 mozilla_plugin_rw_t:dir rw_dir_perms; + ') + + ######################################## + ## +-## Delete mozilla_plugin tmpfs files. ++## read mozilla_plugin rw files. + ## + ## + ## +@@ -510,19 +539,18 @@ interface(`mozilla_plugin_read_tmpfs_files',` + ## + ## + # +-interface(`mozilla_plugin_delete_tmpfs_files',` ++interface(`mozilla_plugin_read_rw_files',` + gen_require(` +- type mozilla_plugin_tmpfs_t; ++ type mozilla_plugin_rw_t; + ') + +- fs_search_tmpfs($1) +- allow $1 mozilla_plugin_tmpfs_t:file delete_file_perms; ++ read_files_pattern($1, mozilla_plugin_rw_t, mozilla_plugin_rw_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## generic mozilla plugin home content. ++## Create mozilla content in the user home directory ++## with an correct label. + ## + ## + ## +@@ -530,45 +558,59 @@ interface(`mozilla_plugin_delete_tmpfs_files',` + ## + ## + # +-interface(`mozilla_manage_generic_plugin_home_content',` ++interface(`mozilla_filetrans_home_content',` ++ + gen_require(` +- type mozilla_plugin_home_t; ++ type mozilla_home_t, mozilla_plugin_rw_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 mozilla_plugin_home_t:dir manage_dir_perms; +- allow $1 mozilla_plugin_home_t:file manage_file_perms; +- allow $1 mozilla_plugin_home_t:fifo_file manage_fifo_file_perms; +- allow $1 mozilla_plugin_home_t:lnk_file manage_lnk_file_perms; +- allow $1 mozilla_plugin_home_t:sock_file manage_sock_file_perms; ++ files_filetrans_lib($1, mozilla_plugin_rw_t, file, "nswrapper_32_64.nppdf.so") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".galeon") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".java") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".mozilla") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".thunderbird") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".netscape") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".phoenix") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".adobe") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".macromedia") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".gnash") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".grl-podcasts") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".gcjwebplugin") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".icedteaplugin") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".icedtea") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, file, "abc") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".quakelive") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".spicec") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".ICAClient") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, "zimbrauserdata") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".juniper_networks") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".lyx") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".IBMERS") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, file, ".gnashpluginrc") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, file, "mozilla.pdf") ++ userdom_user_home_dir_filetrans($1, mozilla_home_t, dir, ".webex") ++ optional_policy(` ++ gnome_cache_filetrans($1, mozilla_home_t, dir, "mozilla") ++ gnome_cache_filetrans($1, mozilla_home_t, dir, "icedtea-web") ++ ') + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the generic mozilla +-## plugin home type. ++## Allow the domain to read mozilla_plugin state files in /proc. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`mozilla_home_filetrans_plugin_home',` ++interface(`mozilla_plugin_read_state',` + gen_require(` +- type mozilla_plugin_home_t; ++ type mozilla_plugin_t; + ') + +- userdom_user_home_dir_filetrans($1, mozilla_plugin_home_t, $2, $3) ++ kernel_search_proc($1) ++ ps_process_pattern($1, mozilla_plugin_t) + ') ++ +diff --git a/mozilla.te b/mozilla.te +index 11ac8e4fce..e2a8b27f67 100644 +--- a/mozilla.te ++++ b/mozilla.te +@@ -6,17 +6,56 @@ policy_module(mozilla, 2.8.0) + # + + ## +-##

      +-## Determine whether mozilla can +-## make its stack executable. +-##

      ++##

      ++## Allow mozilla plugin domain to connect to the network using TCP. ++##

      + ##
      +-gen_tunable(mozilla_execstack, false) ++gen_tunable(mozilla_plugin_can_network_connect, false) ++ ++## ++##

      ++## Allow mozilla plugin domain to bind unreserved tcp/udp ports. ++##

      ++##
      ++ ++gen_tunable(mozilla_plugin_bind_unreserved_ports, false) ++ ++## ++##

      ++## Allow mozilla plugin to support spice protocols. ++##

      ++##
      ++gen_tunable(mozilla_plugin_use_spice, false) ++ ++## ++##

      ++## Allow mozilla plugin to support GPS. ++##

      ++##
      ++gen_tunable(mozilla_plugin_use_gps, false) ++ ++## ++##

      ++## Allow mozilla plugin to use Bluejeans. ++##

      ++##
      ++gen_tunable(mozilla_plugin_use_bluejeans, false) ++ ++## ++##

      ++## Allow confined web browsers to read home directory content ++##

      ++##
      ++gen_tunable(mozilla_read_content, false) + + attribute_role mozilla_roles; + attribute_role mozilla_plugin_roles; + attribute_role mozilla_plugin_config_roles; + ++roleattribute system_r mozilla_roles; ++roleattribute system_r mozilla_plugin_roles; ++roleattribute system_r mozilla_plugin_config_roles; ++ + type mozilla_t; + type mozilla_exec_t; + typealias mozilla_t alias { user_mozilla_t staff_mozilla_t sysadm_mozilla_t }; +@@ -24,6 +63,9 @@ typealias mozilla_t alias { auditadm_mozilla_t secadm_mozilla_t }; + userdom_user_application_domain(mozilla_t, mozilla_exec_t) + role mozilla_roles types mozilla_t; + ++type mozilla_conf_t; ++files_config_file(mozilla_conf_t) ++ + type mozilla_home_t; + typealias mozilla_home_t alias { user_mozilla_home_t staff_mozilla_home_t sysadm_mozilla_home_t }; + typealias mozilla_home_t alias { auditadm_mozilla_home_t secadm_mozilla_home_t }; +@@ -31,28 +73,24 @@ userdom_user_home_content(mozilla_home_t) + + type mozilla_plugin_t; + type mozilla_plugin_exec_t; +-userdom_user_application_domain(mozilla_plugin_t, mozilla_plugin_exec_t) ++application_domain(mozilla_plugin_t, mozilla_plugin_exec_t) + role mozilla_plugin_roles types mozilla_plugin_t; + +-type mozilla_plugin_home_t; +-userdom_user_home_content(mozilla_plugin_home_t) +- + type mozilla_plugin_tmp_t; ++userdom_user_tmp_content(mozilla_plugin_tmp_t) + userdom_user_tmp_file(mozilla_plugin_tmp_t) + + type mozilla_plugin_tmpfs_t; ++userdom_user_tmpfs_content(mozilla_plugin_tmpfs_t) + userdom_user_tmpfs_file(mozilla_plugin_tmpfs_t) + +-optional_policy(` +- pulseaudio_tmpfs_content(mozilla_plugin_tmpfs_t) +-') +- + type mozilla_plugin_rw_t; + files_type(mozilla_plugin_rw_t) + + type mozilla_plugin_config_t; + type mozilla_plugin_config_exec_t; +-userdom_user_application_domain(mozilla_plugin_config_t, mozilla_plugin_config_exec_t) ++application_domain(mozilla_plugin_config_t, mozilla_plugin_config_exec_t) ++role mozilla_roles types mozilla_plugin_config_t; + role mozilla_plugin_config_roles types mozilla_plugin_config_t; + + type mozilla_tmp_t; +@@ -63,10 +101,6 @@ typealias mozilla_tmpfs_t alias { user_mozilla_tmpfs_t staff_mozilla_tmpfs_t sys + typealias mozilla_tmpfs_t alias { auditadm_mozilla_tmpfs_t secadm_mozilla_tmpfs_t }; + userdom_user_tmpfs_file(mozilla_tmpfs_t) + +-optional_policy(` +- pulseaudio_tmpfs_content(mozilla_tmpfs_t) +-') +- + ######################################## + # + # Local policy +@@ -75,104 +109,101 @@ optional_policy(` + allow mozilla_t self:capability { sys_nice setgid setuid }; + allow mozilla_t self:process { sigkill signal setsched getsched setrlimit }; + allow mozilla_t self:fifo_file rw_fifo_file_perms; +-allow mozilla_t self:shm create_shm_perms; ++allow mozilla_t self:shm { unix_read unix_write read write destroy create }; + allow mozilla_t self:sem create_sem_perms; + allow mozilla_t self:socket create_socket_perms; +-allow mozilla_t self:unix_stream_socket { accept listen }; ++allow mozilla_t self:unix_stream_socket { listen accept }; ++# Browse the web, connect to printer ++allow mozilla_t self:tcp_socket create_socket_perms; ++allow mozilla_t self:netlink_route_socket r_netlink_socket_perms; + +-allow mozilla_t mozilla_plugin_t:unix_stream_socket rw_socket_perms; +-allow mozilla_t mozilla_plugin_t:fd use; ++# for bash - old mozilla binary ++can_exec(mozilla_t, mozilla_exec_t) + +-allow mozilla_t { mozilla_home_t mozilla_plugin_home_t }:dir manage_dir_perms; +-allow mozilla_t { mozilla_home_t mozilla_plugin_home_t }:file manage_file_perms; +-allow mozilla_t mozilla_home_t:lnk_file manage_lnk_file_perms; +-userdom_user_home_dir_filetrans(mozilla_t, mozilla_home_t, dir, ".galeon") +-userdom_user_home_dir_filetrans(mozilla_t, mozilla_home_t, dir, ".mozilla") +-userdom_user_home_dir_filetrans(mozilla_t, mozilla_home_t, dir, ".netscape") +-userdom_user_home_dir_filetrans(mozilla_t, mozilla_home_t, dir, ".phoenix") ++# X access, Home files ++manage_dirs_pattern(mozilla_t, mozilla_home_t, mozilla_home_t) ++manage_files_pattern(mozilla_t, mozilla_home_t, mozilla_home_t) ++manage_lnk_files_pattern(mozilla_t, mozilla_home_t, mozilla_home_t) ++userdom_search_user_home_dirs(mozilla_t) + +-filetrans_pattern(mozilla_t, mozilla_home_t, mozilla_plugin_home_t, dir, "plugins") ++# Mozpluggerrc ++allow mozilla_t mozilla_conf_t:file read_file_perms; + + manage_files_pattern(mozilla_t, mozilla_tmp_t, mozilla_tmp_t) + manage_dirs_pattern(mozilla_t, mozilla_tmp_t, mozilla_tmp_t) +-files_tmp_filetrans(mozilla_t, mozilla_tmp_t, { file dir }) ++# mozilla will manage user_tmp_t, so it will transition to it. ++#files_tmp_filetrans(mozilla_t, mozilla_tmp_t, { file dir }) + + manage_files_pattern(mozilla_t, mozilla_tmpfs_t, mozilla_tmpfs_t) + manage_lnk_files_pattern(mozilla_t, mozilla_tmpfs_t, mozilla_tmpfs_t) + manage_fifo_files_pattern(mozilla_t, mozilla_tmpfs_t, mozilla_tmpfs_t) + manage_sock_files_pattern(mozilla_t, mozilla_tmpfs_t, mozilla_tmpfs_t) + fs_tmpfs_filetrans(mozilla_t, mozilla_tmpfs_t, { file lnk_file sock_file fifo_file }) +- +-allow mozilla_t mozilla_plugin_rw_t:dir list_dir_perms; +-allow mozilla_t mozilla_plugin_rw_t:file read_file_perms; +-allow mozilla_t mozilla_plugin_rw_t:lnk_file read_lnk_file_perms; +- +-stream_connect_pattern(mozilla_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t, mozilla_plugin_t) +- +-can_exec(mozilla_t, { mozilla_exec_t mozilla_plugin_rw_t mozilla_plugin_home_t }) ++allow mozilla_plugin_t mozilla_tmpfs_t:file map; + + kernel_read_kernel_sysctls(mozilla_t) + kernel_read_network_state(mozilla_t) ++# Access /proc, sysctl + kernel_read_system_state(mozilla_t) + kernel_read_net_sysctls(mozilla_t) + ++# Look for plugins + corecmd_list_bin(mozilla_t) ++# for bash - old mozilla binary + corecmd_exec_shell(mozilla_t) + corecmd_exec_bin(mozilla_t) + +-corenet_all_recvfrom_unlabeled(mozilla_t) ++# Browse the web, connect to printer + corenet_all_recvfrom_netlabel(mozilla_t) + corenet_tcp_sendrecv_generic_if(mozilla_t) ++corenet_raw_sendrecv_generic_if(mozilla_t) + corenet_tcp_sendrecv_generic_node(mozilla_t) +- +-corenet_sendrecv_http_client_packets(mozilla_t) +-corenet_tcp_connect_http_port(mozilla_t) ++corenet_raw_sendrecv_generic_node(mozilla_t) + corenet_tcp_sendrecv_http_port(mozilla_t) +- +-corenet_sendrecv_http_cache_client_packets(mozilla_t) +-corenet_tcp_connect_http_cache_port(mozilla_t) + corenet_tcp_sendrecv_http_cache_port(mozilla_t) +- +-corenet_sendrecv_squid_client_packets(mozilla_t) +-corenet_tcp_connect_squid_port(mozilla_t) + corenet_tcp_sendrecv_squid_port(mozilla_t) +- +-corenet_sendrecv_ftp_client_packets(mozilla_t) +-corenet_tcp_connect_ftp_port(mozilla_t) + corenet_tcp_sendrecv_ftp_port(mozilla_t) +- +-corenet_sendrecv_ipp_client_packets(mozilla_t) +-corenet_tcp_connect_ipp_port(mozilla_t) ++corenet_tcp_connect_all_ephemeral_ports(mozilla_t) + corenet_tcp_sendrecv_ipp_port(mozilla_t) +- +-corenet_sendrecv_soundd_client_packets(mozilla_t) ++corenet_tcp_connect_http_port(mozilla_t) ++corenet_tcp_connect_http_cache_port(mozilla_t) ++corenet_tcp_connect_squid_port(mozilla_t) ++corenet_tcp_connect_ftp_port(mozilla_t) ++corenet_tcp_connect_ipp_port(mozilla_t) ++corenet_tcp_connect_generic_port(mozilla_t) + corenet_tcp_connect_soundd_port(mozilla_t) +-corenet_tcp_sendrecv_soundd_port(mozilla_t) +- +-corenet_sendrecv_speech_client_packets(mozilla_t) ++corenet_sendrecv_http_client_packets(mozilla_t) ++corenet_sendrecv_http_cache_client_packets(mozilla_t) ++corenet_sendrecv_squid_client_packets(mozilla_t) ++corenet_sendrecv_ftp_client_packets(mozilla_t) ++corenet_sendrecv_ipp_client_packets(mozilla_t) ++corenet_sendrecv_generic_client_packets(mozilla_t) ++# Should not need other ports ++corenet_dontaudit_tcp_sendrecv_generic_port(mozilla_t) ++corenet_dontaudit_tcp_bind_generic_port(mozilla_t) + corenet_tcp_connect_speech_port(mozilla_t) +-corenet_tcp_sendrecv_speech_port(mozilla_t) + +-dev_getattr_sysfs_dirs(mozilla_t) +-dev_read_sound(mozilla_t) +-dev_read_rand(mozilla_t) + dev_read_urand(mozilla_t) +-dev_rw_dri(mozilla_t) ++dev_read_rand(mozilla_t) + dev_write_sound(mozilla_t) ++dev_read_sound(mozilla_t) ++dev_dontaudit_rw_dri(mozilla_t) ++dev_getattr_sysfs_dirs(mozilla_t) + + domain_dontaudit_read_all_domains_state(mozilla_t) + + files_read_etc_runtime_files(mozilla_t) +-files_read_usr_files(mozilla_t) +-files_read_var_files(mozilla_t) ++# /var/lib + files_read_var_lib_files(mozilla_t) ++# interacting with gstreamer ++files_read_var_files(mozilla_t) + files_read_var_symlinks(mozilla_t) + files_dontaudit_getattr_boot_dirs(mozilla_t) + +-fs_getattr_all_fs(mozilla_t) ++fs_dontaudit_getattr_all_fs(mozilla_t) + fs_search_auto_mountpoints(mozilla_t) + fs_list_inotifyfs(mozilla_t) +-fs_rw_tmpfs_files(mozilla_t) ++fs_rw_inherited_tmpfs_files(mozilla_t) + + term_dontaudit_getattr_pty_dirs(mozilla_t) + +@@ -181,56 +212,73 @@ auth_use_nsswitch(mozilla_t) + logging_send_syslog_msg(mozilla_t) + + miscfiles_read_fonts(mozilla_t) +-miscfiles_read_localization(mozilla_t) + miscfiles_dontaudit_setattr_fonts_dirs(mozilla_t) + +-userdom_use_user_ptys(mozilla_t) +- +-userdom_manage_user_tmp_dirs(mozilla_t) +-userdom_manage_user_tmp_files(mozilla_t) ++userdom_use_inherited_user_ptys(mozilla_t) + +-userdom_manage_user_home_content_dirs(mozilla_t) +-userdom_manage_user_home_content_files(mozilla_t) +-userdom_user_home_dir_filetrans_user_home_content(mozilla_t, { dir file }) +- +-userdom_write_user_tmp_sockets(mozilla_t) +- +-mozilla_run_plugin(mozilla_t, mozilla_roles) +-mozilla_run_plugin_config(mozilla_t, mozilla_roles) ++#mozilla_run_plugin(mozilla_t, mozilla_roles) + + xserver_user_x_domain_template(mozilla, mozilla_t, mozilla_tmpfs_t) + xserver_dontaudit_read_xdm_tmp_files(mozilla_t) + xserver_dontaudit_getattr_xdm_tmp_sockets(mozilla_t) + +-ifndef(`enable_mls',` +- fs_list_dos(mozilla_t) +- fs_read_dos_files(mozilla_t) +- +- fs_search_removable(mozilla_t) +- fs_read_removable_files(mozilla_t) +- fs_read_removable_symlinks(mozilla_t) +- +- fs_read_iso9660_files(mozilla_t) ++tunable_policy(`selinuxuser_execstack',` ++ allow mozilla_t self:process execstack; + ') + +-tunable_policy(`allow_execmem',` ++tunable_policy(`deny_execmem',`',` + allow mozilla_t self:process execmem; + ') + +-tunable_policy(`mozilla_execstack',` +- allow mozilla_t self:process { execmem execstack }; +-') +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(mozilla_t) +- fs_manage_nfs_files(mozilla_t) +- fs_manage_nfs_symlinks(mozilla_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(mozilla_t) +- fs_manage_cifs_files(mozilla_t) +- fs_manage_cifs_symlinks(mozilla_t) ++userdom_home_manager(mozilla_t) ++ ++# Uploads, local html ++tunable_policy(`mozilla_read_content && use_nfs_home_dirs',` ++ fs_list_auto_mountpoints(mozilla_t) ++ files_list_home(mozilla_t) ++ fs_read_nfs_files(mozilla_t) ++ fs_read_nfs_symlinks(mozilla_t) ++ ++',` ++ files_dontaudit_list_home(mozilla_t) ++ fs_dontaudit_list_auto_mountpoints(mozilla_t) ++ fs_dontaudit_read_nfs_files(mozilla_t) ++ fs_dontaudit_list_nfs(mozilla_t) ++') ++ ++tunable_policy(`mozilla_read_content && use_samba_home_dirs',` ++ fs_list_auto_mountpoints(mozilla_t) ++ files_list_home(mozilla_t) ++ fs_read_cifs_files(mozilla_t) ++ fs_read_cifs_symlinks(mozilla_t) ++',` ++ files_dontaudit_list_home(mozilla_t) ++ fs_dontaudit_list_auto_mountpoints(mozilla_t) ++ fs_dontaudit_read_cifs_files(mozilla_t) ++ fs_dontaudit_list_cifs(mozilla_t) ++') ++ ++tunable_policy(`mozilla_read_content',` ++ userdom_list_user_tmp(mozilla_t) ++ userdom_read_user_tmp_files(mozilla_t) ++ userdom_read_user_tmp_symlinks(mozilla_t) ++ userdom_read_user_home_content_files(mozilla_t) ++ userdom_read_user_home_content_symlinks(mozilla_t) ++ ++ ifndef(`enable_mls',` ++ fs_search_removable(mozilla_t) ++ fs_read_removable_files(mozilla_t) ++ fs_read_removable_symlinks(mozilla_t) ++ ') ++',` ++ files_dontaudit_list_tmp(mozilla_t) ++ files_dontaudit_list_home(mozilla_t) ++ fs_dontaudit_list_removable(mozilla_t) ++ fs_dontaudit_read_removable_files(mozilla_t) ++ userdom_dontaudit_list_user_tmp(mozilla_t) ++ userdom_dontaudit_read_user_tmp_files(mozilla_t) ++ userdom_dontaudit_list_user_home_dirs(mozilla_t) ++ userdom_dontaudit_read_user_home_content_files(mozilla_t) + ') + + optional_policy(` +@@ -244,19 +292,12 @@ optional_policy(` + + optional_policy(` + cups_read_rw_config(mozilla_t) ++ cups_dbus_chat(mozilla_t) + ') + + optional_policy(` +- dbus_all_session_bus_client(mozilla_t) + dbus_system_bus_client(mozilla_t) +- +- optional_policy(` +- cups_dbus_chat(mozilla_t) +- ') +- +- optional_policy(` +- mozilla_dbus_chat_plugin(mozilla_t) +- ') ++ dbus_session_bus_client(mozilla_t) + + optional_policy(` + networkmanager_dbus_chat(mozilla_t) +@@ -265,33 +306,32 @@ optional_policy(` + + optional_policy(` + gnome_stream_connect_gconf(mozilla_t) +- gnome_manage_generic_gconf_home_content(mozilla_t) +- gnome_home_filetrans_gconf_home(mozilla_t, dir, ".gconf") +- gnome_home_filetrans_gconf_home(mozilla_t, dir, ".gconfd") +- gnome_manage_generic_home_content(mozilla_t) +- gnome_home_filetrans_gnome_home(mozilla_t, dir, ".gnome") +- gnome_home_filetrans_gnome_home(mozilla_t, dir, ".gnome2") +- gnome_home_filetrans_gnome_home(mozilla_t, dir, ".gnome2_private") ++ gnome_manage_config(mozilla_t) ++ gnome_manage_gconf_home_files(mozilla_t) ++') ++ ++optional_policy(` ++ java_domtrans(mozilla_t) + ') + + optional_policy(` +- java_exec(mozilla_t) +- java_manage_generic_home_content(mozilla_t) +- java_home_filetrans_java_home(mozilla_t, dir, ".java") ++ lpd_domtrans_lpr(mozilla_t) + ') + + optional_policy(` +- lpd_run_lpr(mozilla_t, mozilla_roles) ++ mplayer_domtrans(mozilla_t) ++ mplayer_read_user_home_files(mozilla_t) + ') + + optional_policy(` +- mplayer_exec(mozilla_t) +- mplayer_manage_generic_home_content(mozilla_t) +- mplayer_home_filetrans_mplayer_home(mozilla_t, dir, ".mplayer") ++ nscd_socket_use(mozilla_t) + ') + + optional_policy(` +- pulseaudio_run(mozilla_t, mozilla_roles) ++ #pulseaudio_role(mozilla_roles, mozilla_t) ++ pulseaudio_exec(mozilla_t) ++ pulseaudio_stream_connect(mozilla_t) ++ pulseaudio_manage_home_files(mozilla_t) + ') + + optional_policy(` +@@ -300,259 +340,261 @@ optional_policy(` + + ######################################## + # +-# Plugin local policy ++# mozilla_plugin local policy + # + +-dontaudit mozilla_plugin_t self:capability { ipc_lock sys_nice sys_ptrace sys_tty_config }; +-allow mozilla_plugin_t self:process { setpgid getsched setsched signal_perms setrlimit }; +-allow mozilla_plugin_t self:fifo_file manage_fifo_file_perms; ++dontaudit mozilla_plugin_t self:capability { sys_ptrace sys_admin ipc_lock sys_nice sys_tty_config }; ++dontaudit mozilla_plugin_t self:capability2 block_suspend; ++ ++allow mozilla_plugin_t self:process { getsession setcap setpgid getsched setsched signal_perms execmem execstack setrlimit transition }; ++allow mozilla_plugin_t self:netlink_route_socket r_netlink_socket_perms; ++allow mozilla_plugin_t self:netlink_socket create_socket_perms; ++allow mozilla_plugin_t self:tcp_socket create_stream_socket_perms; ++allow mozilla_plugin_t self:udp_socket create_socket_perms; + allow mozilla_plugin_t self:netlink_kobject_uevent_socket create_socket_perms; ++ + allow mozilla_plugin_t self:sem create_sem_perms; + allow mozilla_plugin_t self:shm create_shm_perms; +-allow mozilla_plugin_t self:tcp_socket { accept listen }; +-allow mozilla_plugin_t self:unix_stream_socket { accept connectto listen }; +- +-allow mozilla_plugin_t mozilla_t:unix_stream_socket rw_socket_perms; +-allow mozilla_plugin_t mozilla_t:unix_dgram_socket rw_socket_perms; +-allow mozilla_plugin_t mozilla_t:shm { rw_shm_perms destroy }; +-allow mozilla_plugin_t mozilla_t:sem create_sem_perms; +- +-manage_dirs_pattern(mozilla_plugin_t, { mozilla_home_t mozilla_plugin_home_t }, { mozilla_home_t mozilla_plugin_home_t }) +-manage_files_pattern(mozilla_plugin_t, { mozilla_home_t mozilla_plugin_home_t }, mozilla_plugin_home_t) +-manage_lnk_files_pattern(mozilla_plugin_t, { mozilla_home_t mozilla_plugin_home_t }, mozilla_plugin_home_t) +- +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_home_t, dir, ".galeon") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_home_t, dir, ".mozilla") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_home_t, dir, ".netscape") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_home_t, dir, ".phoenix") +- +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".adobe") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".macromedia") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".gnash") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".gcjwebplugin") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".icedteaplugin") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".spicec") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, ".ICAClient") +-userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_plugin_home_t, dir, "zimbrauserdata") +- +-filetrans_pattern(mozilla_plugin_t, mozilla_home_t, mozilla_plugin_home_t, dir, "plugins") ++allow mozilla_plugin_t self:msgq create_msgq_perms; ++allow mozilla_plugin_t self:fifo_file manage_fifo_file_perms; ++allow mozilla_plugin_t self:unix_dgram_socket sendto; ++allow mozilla_plugin_t self:unix_stream_socket { connectto create_stream_socket_perms }; ++ ++can_exec(mozilla_plugin_t, mozilla_home_t) ++manage_dirs_pattern(mozilla_plugin_t, mozilla_home_t, mozilla_home_t) ++manage_files_pattern(mozilla_plugin_t, mozilla_home_t, mozilla_home_t) ++manage_lnk_files_pattern(mozilla_plugin_t, mozilla_home_t, mozilla_home_t) ++manage_fifo_files_pattern(mozilla_plugin_t, mozilla_home_t, mozilla_home_t) + + manage_dirs_pattern(mozilla_plugin_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) + manage_files_pattern(mozilla_plugin_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) ++manage_lnk_files_pattern(mozilla_plugin_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) + manage_fifo_files_pattern(mozilla_plugin_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) +-files_tmp_filetrans(mozilla_plugin_t, mozilla_plugin_tmp_t, { dir file fifo_file }) +-userdom_user_tmp_filetrans(mozilla_plugin_t, mozilla_plugin_tmp_t, { dir file fifo_file }) ++manage_sock_files_pattern(mozilla_plugin_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) ++files_tmp_filetrans(mozilla_plugin_t, mozilla_plugin_tmp_t, { dir file fifo_file sock_file lnk_file }) ++userdom_user_tmp_filetrans(mozilla_plugin_t, mozilla_plugin_tmp_t, { dir file fifo_file sock_file }) ++can_exec(mozilla_plugin_t, mozilla_plugin_tmp_t) + + manage_files_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t) + manage_lnk_files_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t) + manage_fifo_files_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t) + manage_sock_files_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t) + fs_tmpfs_filetrans(mozilla_plugin_t, mozilla_plugin_tmpfs_t, { file lnk_file sock_file fifo_file }) ++userdom_manage_home_texlive(mozilla_plugin_t) ++allow mozilla_plugin_t mozilla_plugin_tmpfs_t:file map; + +-allow mozilla_plugin_t mozilla_plugin_rw_t:dir list_dir_perms; +-allow mozilla_plugin_t mozilla_plugin_rw_t:file read_file_perms; +-allow mozilla_plugin_t mozilla_plugin_rw_t:lnk_file read_lnk_file_perms; + +-dgram_send_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t, mozilla_t) +-stream_connect_pattern(mozilla_plugin_t, mozilla_plugin_tmpfs_t, mozilla_plugin_tmpfs_t, mozilla_t) ++allow mozilla_plugin_t mozilla_plugin_rw_t:dir list_dir_perms; ++read_lnk_files_pattern(mozilla_plugin_t, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++read_files_pattern(mozilla_plugin_t, mozilla_plugin_rw_t, mozilla_plugin_rw_t) + +-can_exec(mozilla_plugin_t, { mozilla_exec_t mozilla_plugin_home_t mozilla_plugin_tmp_t }) ++can_exec(mozilla_plugin_t, mozilla_exec_t) + + kernel_read_all_sysctls(mozilla_plugin_t) + kernel_read_system_state(mozilla_plugin_t) + kernel_read_network_state(mozilla_plugin_t) + kernel_request_load_module(mozilla_plugin_t) + kernel_dontaudit_getattr_core_if(mozilla_plugin_t) ++files_dontaudit_read_root_files(mozilla_plugin_t) ++kernel_dontaudit_list_all_proc(mozilla_plugin_t) ++kernel_dontaudit_list_all_sysctls(mozilla_plugin_t) + + corecmd_exec_bin(mozilla_plugin_t) + corecmd_exec_shell(mozilla_plugin_t) ++corecmd_dontaudit_access_all_executables(mozilla_plugin_t) ++corecmd_getattr_all_executables(mozilla_plugin_t) + +-corenet_all_recvfrom_netlabel(mozilla_plugin_t) +-corenet_all_recvfrom_unlabeled(mozilla_plugin_t) +-corenet_tcp_sendrecv_generic_if(mozilla_plugin_t) +-corenet_tcp_sendrecv_generic_node(mozilla_plugin_t) +- +-corenet_sendrecv_asterisk_client_packets(mozilla_plugin_t) ++corenet_tcp_bind_generic_node(mozilla_plugin_t) ++corenet_tcp_connect_all_ephemeral_ports(mozilla_plugin_t) ++corenet_tcp_connect_aol_port(mozilla_plugin_t) + corenet_tcp_connect_asterisk_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_asterisk_port(mozilla_plugin_t) +- +-corenet_sendrecv_ftp_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_commplex_link_port(mozilla_plugin_t) ++corenet_tcp_connect_couchdb_port(mozilla_plugin_t) ++corenet_tcp_connect_flash_port(mozilla_plugin_t) + corenet_tcp_connect_ftp_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_ftp_port(mozilla_plugin_t) +- +-corenet_sendrecv_gatekeeper_client_packets(mozilla_plugin_t) + corenet_tcp_connect_gatekeeper_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_gatekeeper_port(mozilla_plugin_t) +- +-corenet_sendrecv_http_client_packets(mozilla_plugin_t) +-corenet_tcp_connect_http_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_http_port(mozilla_plugin_t) +- +-corenet_sendrecv_http_cache_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_generic_port(mozilla_plugin_t) + corenet_tcp_connect_http_cache_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_http_cache_port(mozilla_plugin_t) +- +-corenet_sendrecv_ipp_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_http_port(mozilla_plugin_t) + corenet_tcp_connect_ipp_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_ipp_port(mozilla_plugin_t) +- +-corenet_sendrecv_ircd_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_ipsecnat_port(mozilla_plugin_t) + corenet_tcp_connect_ircd_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_ircd_port(mozilla_plugin_t) +- +-corenet_sendrecv_jabber_client_client_packets(mozilla_plugin_t) + corenet_tcp_connect_jabber_client_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_jabber_client_port(mozilla_plugin_t) +- +-corenet_sendrecv_mmcc_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_jboss_management_port(mozilla_plugin_t) + corenet_tcp_connect_mmcc_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_mmcc_port(mozilla_plugin_t) +- +-corenet_sendrecv_monopd_client_packets(mozilla_plugin_t) + corenet_tcp_connect_monopd_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_monopd_port(mozilla_plugin_t) +- +-corenet_sendrecv_soundd_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_msnp_port(mozilla_plugin_t) ++corenet_tcp_connect_ms_streaming_port(mozilla_plugin_t) ++corenet_tcp_connect_pulseaudio_port(mozilla_plugin_t) ++corenet_tcp_connect_rtsp_port(mozilla_plugin_t) + corenet_tcp_connect_soundd_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_soundd_port(mozilla_plugin_t) +- +-corenet_sendrecv_speech_client_packets(mozilla_plugin_t) + corenet_tcp_connect_speech_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_speech_port(mozilla_plugin_t) +- +-corenet_sendrecv_squid_client_packets(mozilla_plugin_t) + corenet_tcp_connect_squid_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_squid_port(mozilla_plugin_t) +- +-corenet_sendrecv_vnc_client_packets(mozilla_plugin_t) ++corenet_tcp_connect_tor_port(mozilla_plugin_t) ++corenet_tcp_connect_transproxy_port(mozilla_plugin_t) + corenet_tcp_connect_vnc_port(mozilla_plugin_t) +-corenet_tcp_sendrecv_vnc_port(mozilla_plugin_t) ++corenet_tcp_connect_whois_port(mozilla_plugin_t) ++corenet_tcp_bind_generic_node(mozilla_plugin_t) ++corenet_udp_bind_generic_node(mozilla_plugin_t) ++corenet_tcp_bind_jboss_debug_port(mozilla_plugin_t) ++corenet_dontaudit_udp_bind_ssdp_port(mozilla_plugin_t) + +-dev_read_generic_usb_dev(mozilla_plugin_t) ++dev_dontaudit_append_rand(mozilla_plugin_t) + dev_read_rand(mozilla_plugin_t) +-dev_read_realtime_clock(mozilla_plugin_t) +-dev_read_sound(mozilla_plugin_t) +-dev_read_sysfs(mozilla_plugin_t) + dev_read_urand(mozilla_plugin_t) ++dev_read_generic_usb_dev(mozilla_plugin_t) + dev_read_video_dev(mozilla_plugin_t) +-dev_write_sound(mozilla_plugin_t) + dev_write_video_dev(mozilla_plugin_t) +-dev_rw_dri(mozilla_plugin_t) ++dev_read_realtime_clock(mozilla_plugin_t) ++dev_read_sysfs(mozilla_plugin_t) ++dev_read_sound(mozilla_plugin_t) ++dev_write_sound(mozilla_plugin_t) ++# for nvidia driver + dev_rw_xserver_misc(mozilla_plugin_t) ++dev_rwx_zero(mozilla_plugin_t) ++dev_dontaudit_read_mtrr(mozilla_plugin_t) ++dev_map_video_dev(mozilla_plugin_t) ++xserver_dri_domain(mozilla_plugin_t) + +-dev_dontaudit_getattr_generic_files(mozilla_plugin_t) +-dev_dontaudit_getattr_generic_pipes(mozilla_plugin_t) +-dev_dontaudit_getattr_all_blk_files(mozilla_plugin_t) +-dev_dontaudit_getattr_all_chr_files(mozilla_plugin_t) ++dev_dontaudit_getattr_all(mozilla_plugin_t) ++dev_dontaudit_leaked_xserver_misc(mozilla_plugin_t) + + domain_use_interactive_fds(mozilla_plugin_t) + domain_dontaudit_read_all_domains_state(mozilla_plugin_t) + +-files_exec_usr_files(mozilla_plugin_t) +-files_list_mnt(mozilla_plugin_t) + files_read_config_files(mozilla_plugin_t) +-files_read_usr_files(mozilla_plugin_t) ++files_list_mnt(mozilla_plugin_t) ++files_exec_usr_files(mozilla_plugin_t) ++fs_rw_inherited_tmpfs_files(mozilla_plugin_t) ++files_dontaudit_all_access_check(mozilla_plugin_t) + + fs_getattr_all_fs(mozilla_plugin_t) +-# fs_read_hugetlbfs_files(mozilla_plugin_t) +-fs_search_auto_mountpoints(mozilla_plugin_t) ++fs_list_dos(mozilla_plugin_t) ++fs_read_noxattr_fs_files(mozilla_plugin_t) ++fs_read_hugetlbfs_files(mozilla_plugin_t) ++fs_exec_hugetlbfs_files(mozilla_plugin_t) + +-term_getattr_all_ttys(mozilla_plugin_t) +-term_getattr_all_ptys(mozilla_plugin_t) ++storage_raw_read_removable_device(mozilla_plugin_t) ++fs_read_removable_files(mozilla_plugin_t) ++fs_read_removable_symlinks(mozilla_plugin_t) + + application_exec(mozilla_plugin_t) ++application_dontaudit_signull(mozilla_plugin_t) + + auth_use_nsswitch(mozilla_plugin_t) + ++init_dontaudit_getattr_initctl(mozilla_plugin_t) ++init_read_all_script_files(mozilla_plugin_t) ++ + libs_exec_ld_so(mozilla_plugin_t) + libs_exec_lib_files(mozilla_plugin_t) ++libs_legacy_use_shared_libs(mozilla_plugin_t) + + logging_send_syslog_msg(mozilla_plugin_t) + +-miscfiles_read_localization(mozilla_plugin_t) + miscfiles_read_fonts(mozilla_plugin_t) + miscfiles_read_generic_certs(mozilla_plugin_t) ++miscfiles_dontaudit_write_generic_cert_files(mozilla_plugin_t) + miscfiles_dontaudit_setattr_fonts_dirs(mozilla_plugin_t) + miscfiles_dontaudit_setattr_fonts_cache_dirs(mozilla_plugin_t) + +-userdom_manage_user_tmp_dirs(mozilla_plugin_t) +-userdom_manage_user_tmp_files(mozilla_plugin_t) ++systemd_read_logind_sessions_files(mozilla_plugin_t) + +-userdom_manage_user_home_content_dirs(mozilla_plugin_t) +-userdom_manage_user_home_content_files(mozilla_plugin_t) +-userdom_user_home_dir_filetrans_user_home_content(mozilla_plugin_t, { dir file }) +- +-userdom_write_user_tmp_sockets(mozilla_plugin_t) ++term_getattr_all_ttys(mozilla_plugin_t) ++term_getattr_all_ptys(mozilla_plugin_t) ++term_getattr_ptmx(mozilla_plugin_t) ++term_dontaudit_use_ptmx(mozilla_plugin_t) + ++userdom_dontaudit_setattr_user_tmpfs(mozilla_plugin_t) + userdom_dontaudit_use_user_terminals(mozilla_plugin_t) ++userdom_manage_user_tmp_sockets(mozilla_plugin_t) ++userdom_manage_user_tmp_dirs(mozilla_plugin_t) ++userdom_rw_inherited_user_tmp_files(mozilla_plugin_t) ++userdom_delete_user_tmp_files(mozilla_plugin_t) ++userdom_rw_inherited_user_home_sock_files(mozilla_plugin_t) ++userdom_manage_home_certs(mozilla_plugin_t) ++userdom_read_user_tmp_symlinks(mozilla_plugin_t) ++userdom_stream_connect(mozilla_plugin_t) ++userdom_dontaudit_rw_user_tmp_pipes(mozilla_plugin_t) ++userdom_map_user_home_files(mozilla_plugin_t) + +-ifndef(`enable_mls',` +- fs_list_dos(mozilla_plugin_t) +- fs_read_dos_files(mozilla_plugin_t) ++userdom_read_user_home_content_files(mozilla_plugin_t) ++userdom_read_user_home_content_symlinks(mozilla_plugin_t) ++userdom_read_home_certs(mozilla_plugin_t) ++userdom_read_home_audio_files(mozilla_plugin_t) ++userdom_exec_user_tmp_files(mozilla_plugin_t) + +- fs_search_removable(mozilla_plugin_t) +- fs_read_removable_files(mozilla_plugin_t) +- fs_read_removable_symlinks(mozilla_plugin_t) ++userdom_home_manager(mozilla_plugin_t) + +- fs_read_iso9660_files(mozilla_plugin_t) ++tunable_policy(`mozilla_plugin_can_network_connect',` ++ corenet_tcp_connect_all_ports(mozilla_plugin_t) + ') + +-tunable_policy(`allow_execmem',` +- allow mozilla_plugin_t self:process execmem; ++optional_policy(` ++ abrt_stream_connect(mozilla_plugin_t) + ') + +-tunable_policy(`mozilla_execstack',` +- allow mozilla_plugin_t self:process { execmem execstack }; ++optional_policy(` ++ alsa_read_rw_config(mozilla_plugin_t) ++ alsa_read_rw_config(mozilla_plugin_config_t) ++ alsa_read_home_files(mozilla_plugin_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(mozilla_plugin_t) +- fs_manage_nfs_files(mozilla_plugin_t) +- fs_manage_nfs_symlinks(mozilla_plugin_t) ++optional_policy(` ++ apache_list_modules(mozilla_plugin_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(mozilla_plugin_t) +- fs_manage_cifs_files(mozilla_plugin_t) +- fs_manage_cifs_symlinks(mozilla_plugin_t) ++optional_policy(` ++ bluetooth_stream_connect(mozilla_plugin_t) + ') + + optional_policy(` +- alsa_read_rw_config(mozilla_plugin_t) +- alsa_read_home_files(mozilla_plugin_t) ++ bumblebee_stream_connect(mozilla_plugin_t) + ') + + optional_policy(` +- automount_dontaudit_getattr_tmp_dirs(mozilla_plugin_t) ++ cups_stream_connect(mozilla_plugin_t) + ') + + optional_policy(` +- dbus_all_session_bus_client(mozilla_plugin_t) +- dbus_connect_all_session_bus(mozilla_plugin_t) + dbus_system_bus_client(mozilla_plugin_t) ++ dbus_session_bus_client(mozilla_plugin_t) ++ dbus_connect_session_bus(mozilla_plugin_t) ++ dbus_read_lib_files(mozilla_plugin_t) ++') ++ ++optional_policy(` ++ devicekit_dbus_chat_disk(mozilla_plugin_t) ++') ++ ++optional_policy(` ++ gnome_manage_config(mozilla_plugin_t) ++ gnome_read_usr_config(mozilla_plugin_t) ++ gnome_filetrans_home_content(mozilla_plugin_t) ++ gnome_exec_gstreamer_home_files(mozilla_plugin_t) + ') + + optional_policy(` +- gnome_manage_generic_home_content(mozilla_plugin_t) +- gnome_home_filetrans_gnome_home(mozilla_plugin_t, dir, ".gnome") +- gnome_home_filetrans_gnome_home(mozilla_plugin_t, dir, ".gnome2") +- gnome_home_filetrans_gnome_home(mozilla_plugin_t, dir, ".gnome2_private") ++ gpm_dontaudit_getattr_gpmctl(mozilla_plugin_t) + ') + + optional_policy(` + java_exec(mozilla_plugin_t) +- java_manage_generic_home_content(mozilla_plugin_t) +- java_home_filetrans_java_home(mozilla_plugin_t, dir, ".java") + ') + + optional_policy(` +- lpd_run_lpr(mozilla_plugin_t, mozilla_plugin_roles) ++ mplayer_exec(mozilla_plugin_t) ++ mplayer_manage_generic_home_content(mozilla_plugin_t) ++ mplayer_home_filetrans_mplayer_home(mozilla_plugin_t, dir, ".mplayer") + ') + + optional_policy(` +- mplayer_exec(mozilla_plugin_t) +- mplayer_manage_generic_home_content(mozilla_plugin_t) +- mplayer_home_filetrans_mplayer_home(mozilla_plugin_t, dir, ".mplayer") ++ pulseaudio_exec(mozilla_plugin_t) ++ pulseaudio_stream_connect(mozilla_plugin_t) ++ pulseaudio_setattr_home_dir(mozilla_plugin_t) ++ pulseaudio_manage_home_dirs(mozilla_plugin_t) ++ pulseaudio_manage_home_files(mozilla_plugin_t) ++ pulseaudio_manage_home_symlinks(mozilla_plugin_t) + ') + + optional_policy(` +@@ -560,7 +602,11 @@ optional_policy(` + ') + + optional_policy(` +- pulseaudio_run(mozilla_plugin_t, mozilla_plugin_roles) ++ policykit_dbus_chat(mozilla_plugin_t) ++') ++ ++optional_policy(` ++ rtkit_scheduled(mozilla_plugin_t) + ') + + optional_policy(` +@@ -568,108 +614,144 @@ optional_policy(` + ') + + optional_policy(` +- xserver_read_user_xauth(mozilla_plugin_t) ++ xserver_xdm_tmp_filetrans(mozilla_plugin_t, mozilla_plugin_tmp_t, { dir file fifo_file sock_file }) ++ xserver_dontaudit_read_xdm_tmp_files(mozilla_plugin_t) + xserver_read_xdm_pid(mozilla_plugin_t) + xserver_stream_connect(mozilla_plugin_t) + xserver_use_user_fonts(mozilla_plugin_t) +- xserver_dontaudit_read_xdm_tmp_files(mozilla_plugin_t) ++ xserver_read_user_iceauth(mozilla_plugin_t) ++ xserver_read_user_xauth(mozilla_plugin_t) ++ xserver_append_xdm_home_files(mozilla_plugin_t) ++ xserver_dontaudit_xdm_tmp_dirs(mozilla_plugin_t) ++ xserver_dontaudit_xdm_rw_stream_sockets(mozilla_plugin_t) ++ xserver_filetrans_fonts_cache_home_content(mozilla_plugin_t) + ') + + ######################################## + # +-# Plugin config local policy ++# mozilla_plugin_config local policy + # + + allow mozilla_plugin_config_t self:capability { dac_override dac_read_search sys_nice setuid setgid }; +-allow mozilla_plugin_config_t self:process { setsched signal_perms getsched }; +-allow mozilla_plugin_config_t self:fifo_file rw_fifo_file_perms; +-allow mozilla_plugin_config_t self:unix_stream_socket create_stream_socket_perms; +- +-allow mozilla_plugin_config_t mozilla_plugin_rw_t:dir manage_dir_perms; +-allow mozilla_plugin_config_t mozilla_plugin_rw_t:file manage_file_perms; +-allow mozilla_plugin_config_t mozilla_plugin_rw_t:lnk_file manage_lnk_file_perms; +- +-manage_dirs_pattern(mozilla_plugin_config_t, { mozilla_home_t mozilla_plugin_home_t }, { mozilla_home_t mozilla_plugin_home_t }) +-manage_files_pattern(mozilla_plugin_config_t, { mozilla_home_t mozilla_plugin_home_t }, mozilla_plugin_home_t) +-manage_lnk_files_pattern(mozilla_plugin_config_t, { mozilla_home_t mozilla_plugin_home_t }, mozilla_plugin_home_t) ++allow mozilla_plugin_config_t self:process { setsched signal_perms getsched execmem execstack }; + +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_home_t, dir, ".galeon") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_home_t, dir, ".mozilla") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_home_t, dir, ".netscape") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_home_t, dir, ".phoenix") +- +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".adobe") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".macromedia") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".gnash") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".gcjwebplugin") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".icedteaplugin") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".spicec") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, ".ICAClient") +-userdom_user_home_dir_filetrans(mozilla_plugin_config_t, mozilla_plugin_home_t, dir, "zimbrauserdata") ++allow mozilla_plugin_config_t self:fifo_file rw_file_perms; ++allow mozilla_plugin_config_t self:unix_stream_socket create_stream_socket_perms; + +-filetrans_pattern(mozilla_plugin_config_t, mozilla_home_t, mozilla_plugin_home_t, dir, "plugins") ++ps_process_pattern(mozilla_plugin_config_t,mozilla_plugin_t) + +-can_exec(mozilla_plugin_config_t, { mozilla_plugin_rw_t mozilla_plugin_home_t }) ++dev_read_sysfs(mozilla_plugin_config_t) ++dev_read_urand(mozilla_plugin_config_t) ++dev_dontaudit_read_rand(mozilla_plugin_config_t) ++dev_dontaudit_rw_dri(mozilla_plugin_config_t) + +-ps_process_pattern(mozilla_plugin_config_t, mozilla_plugin_t) ++fs_search_auto_mountpoints(mozilla_plugin_config_t) ++fs_list_inotifyfs(mozilla_plugin_config_t) + +-kernel_read_system_state(mozilla_plugin_config_t) +-kernel_request_load_module(mozilla_plugin_config_t) ++can_exec(mozilla_plugin_config_t, mozilla_plugin_rw_t) ++manage_dirs_pattern(mozilla_plugin_config_t, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++manage_files_pattern(mozilla_plugin_config_t, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++manage_lnk_files_pattern(mozilla_plugin_config_t, mozilla_plugin_rw_t, mozilla_plugin_rw_t) ++ ++manage_dirs_pattern(mozilla_plugin_config_t, mozilla_home_t, mozilla_home_t) ++manage_files_pattern(mozilla_plugin_config_t, mozilla_home_t, mozilla_home_t) ++manage_lnk_files_pattern(mozilla_plugin_config_t, mozilla_home_t, mozilla_home_t) ++manage_fifo_files_pattern(mozilla_plugin_config_t, mozilla_home_t, mozilla_home_t) ++mozilla_filetrans_home_content(mozilla_plugin_t) ++ ++manage_dirs_pattern(mozilla_plugin_config_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) ++manage_files_pattern(mozilla_plugin_config_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) ++manage_lnk_files_pattern(mozilla_plugin_config_t, mozilla_plugin_tmp_t, mozilla_plugin_tmp_t) ++files_tmp_filetrans(mozilla_plugin_config_t, mozilla_plugin_tmp_t, { dir file fifo_file sock_file lnk_file }) ++userdom_user_tmp_filetrans(mozilla_plugin_config_t, mozilla_plugin_tmp_t, { dir file }) ++mozilla_filetrans_home_content(mozilla_plugin_config_t) ++dontaudit mozilla_plugin_t mozilla_plugin_tmp_t:file relabelfrom; + + corecmd_exec_bin(mozilla_plugin_config_t) + corecmd_exec_shell(mozilla_plugin_config_t) + +-dev_read_urand(mozilla_plugin_config_t) +-dev_rw_dri(mozilla_plugin_config_t) +-dev_search_sysfs(mozilla_plugin_config_t) +-dev_dontaudit_read_rand(mozilla_plugin_config_t) ++kernel_read_system_state(mozilla_plugin_config_t) ++kernel_request_load_module(mozilla_plugin_config_t) + + domain_use_interactive_fds(mozilla_plugin_config_t) + +-files_list_tmp(mozilla_plugin_config_t) +-files_read_usr_files(mozilla_plugin_config_t) + files_dontaudit_search_home(mozilla_plugin_config_t) ++files_list_tmp(mozilla_plugin_config_t) + + fs_getattr_all_fs(mozilla_plugin_config_t) +-fs_search_auto_mountpoints(mozilla_plugin_config_t) +-fs_list_inotifyfs(mozilla_plugin_config_t) ++ ++term_dontaudit_use_ptmx(mozilla_plugin_config_t) + + auth_use_nsswitch(mozilla_plugin_config_t) + +-miscfiles_read_localization(mozilla_plugin_config_t) + miscfiles_read_fonts(mozilla_plugin_config_t) + ++userdom_search_user_home_content(mozilla_plugin_config_t) + userdom_read_user_home_content_symlinks(mozilla_plugin_config_t) + userdom_read_user_home_content_files(mozilla_plugin_config_t) ++userdom_dontaudit_search_admin_dir(mozilla_plugin_config_t) ++userdom_use_inherited_user_ptys(mozilla_plugin_config_t) ++userdom_dontaudit_use_user_terminals(mozilla_plugin_config_t) ++userdom_dontaudit_rw_user_tmp_pipes(mozilla_plugin_config_t) ++userdom_dontaudit_write_all_user_home_content_files(mozilla_plugin_config_t) ++userdom_dontaudit_write_all_user_tmp_content_files(mozilla_plugin_config_t) ++ ++domtrans_pattern(mozilla_plugin_config_t, mozilla_plugin_exec_t, mozilla_plugin_t) ++ ++tunable_policy(`use_ecryptfs_home_dirs',` ++ fs_read_ecryptfs_files(mozilla_plugin_config_t) ++') + +-userdom_use_user_ptys(mozilla_plugin_config_t) ++optional_policy(` ++ gnome_dontaudit_rw_inherited_config(mozilla_plugin_config_t) ++') + +-mozilla_run_plugin(mozilla_plugin_config_t, mozilla_plugin_config_roles) ++optional_policy(` ++ xserver_use_user_fonts(mozilla_plugin_config_t) ++') + +-tunable_policy(`allow_execmem',` +- allow mozilla_plugin_config_t self:process execmem; ++ifdef(`distro_redhat',` ++ typealias mozilla_plugin_t alias nsplugin_t; ++ typealias mozilla_plugin_exec_t alias nsplugin_exec_t; ++ typealias mozilla_plugin_rw_t alias nsplugin_rw_t; ++ typealias mozilla_plugin_tmp_t alias nsplugin_tmp_t; ++ typealias mozilla_home_t alias nsplugin_home_t; ++ typealias mozilla_plugin_config_t alias nsplugin_config_t; ++ typealias mozilla_plugin_config_exec_t alias nsplugin_config_exec_t; + ') + +-tunable_policy(`mozilla_execstack',` +- allow mozilla_plugin_config_t self:process { execmem execstack }; ++#tunable_policy(`mozilla_plugin_enable_homedirs',` ++# userdom_user_home_dir_filetrans(mozilla_plugin_t, mozilla_home_t, { dir file }) ++#', ` ++ ++ #userdom_user_home_dir_filetrans_pattern(mozilla_plugin_t, file) ++ #userdom_user_home_dir_filetrans_pattern(mozilla_plugin_t, dir) ++#') ++ ++tunable_policy(`selinuxuser_execmod',` ++ userdom_execmod_user_home_files(mozilla_plugin_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(mozilla_plugin_config_t) +- fs_manage_nfs_files(mozilla_plugin_config_t) +- fs_manage_nfs_symlinks(mozilla_plugin_config_t) ++tunable_policy(`mozilla_plugin_use_spice',` ++ dev_rw_generic_usb_dev(mozilla_plugin_t) ++ dev_setattr_generic_usb_dev(mozilla_plugin_t) ++ corenet_tcp_bind_vnc_port(mozilla_plugin_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(mozilla_plugin_config_t) +- fs_manage_cifs_files(mozilla_plugin_config_t) +- fs_manage_cifs_symlinks(mozilla_plugin_config_t) ++tunable_policy(`mozilla_plugin_use_gps',` ++ fs_manage_dos_dirs(mozilla_plugin_t) ++ fs_manage_dos_files(mozilla_plugin_t) + ') + +-optional_policy(` +- automount_dontaudit_getattr_tmp_dirs(mozilla_plugin_config_t) ++tunable_policy(`mozilla_plugin_use_bluejeans',` ++ corenet_tcp_bind_unreserved_ports(mozilla_plugin_t) ++ corenet_dontaudit_tcp_bind_all_defined_ports(mozilla_plugin_t) ++ corenet_tcp_connect_commplex_main_port(mozilla_plugin_t) ++ corenet_dontaudit_udp_bind_all_ports(mozilla_plugin_t) ++ corenet_udp_bind_all_unreserved_ports(mozilla_plugin_t) + ') + +-optional_policy(` +- xserver_use_user_fonts(mozilla_plugin_config_t) ++tunable_policy(`mozilla_plugin_bind_unreserved_ports',` ++ corenet_tcp_bind_unreserved_ports(mozilla_plugin_t) ++ corenet_udp_bind_all_unreserved_ports(mozilla_plugin_t) + ') +diff --git a/mpd.fc b/mpd.fc +index 313ce521c7..ae93e07eb0 100644 +--- a/mpd.fc ++++ b/mpd.fc +@@ -1,3 +1,5 @@ ++HOME_DIR/\.mpd(/.*)? gen_context(system_u:object_r:mpd_home_t,s0) ++ + /etc/mpd\.conf -- gen_context(system_u:object_r:mpd_etc_t,s0) + + /etc/rc\.d/init\.d/mpd -- gen_context(system_u:object_r:mpd_initrc_exec_t,s0) +@@ -9,3 +11,5 @@ + /var/lib/mpd/playlists(/.*)? gen_context(system_u:object_r:mpd_data_t,s0) + + /var/log/mpd(/.*)? gen_context(system_u:object_r:mpd_log_t,s0) ++ ++/var/run/mpd(/.*)? gen_context(system_u:object_r:mpd_var_run_t,s0) +diff --git a/mpd.if b/mpd.if +index 5fa77c7e6f..2e01c7d0a9 100644 +--- a/mpd.if ++++ b/mpd.if +@@ -320,6 +320,25 @@ interface(`mpd_manage_lib_dirs',` + manage_dirs_pattern($1, mpd_var_lib_t, mpd_var_lib_t) + ') + ++######################################## ++## ++## Connect to mpd over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mpd_stream_connect',` ++ gen_require(` ++ type mpd_t, mpd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, mpd_var_run_t, mpd_var_run_t, mpd_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -344,9 +363,13 @@ interface(`mpd_admin',` + type mpd_tmpfs_t, mpd_tmp_t, mpd_user_data_t; + ') + +- allow $1 mpd_t:process { ptrace signal_perms }; ++ allow $1 mpd_t:process signal_perms; + ps_process_pattern($1, mpd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mpd_t:process ptrace; ++ ') ++ + mpd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 mpd_initrc_exec_t system_r; +diff --git a/mpd.te b/mpd.te +index fe72523551..062ad640af 100644 +--- a/mpd.te ++++ b/mpd.te +@@ -62,18 +62,25 @@ files_type(mpd_var_lib_t) + type mpd_user_data_t; + userdom_user_home_content(mpd_user_data_t) # customizable + ++type mpd_home_t; ++userdom_user_home_content(mpd_home_t) ++ ++type mpd_var_run_t; ++files_pid_file(mpd_var_run_t) ++ + ######################################## + # + # Local policy + # + +-allow mpd_t self:capability { dac_override kill setgid setuid }; ++allow mpd_t self:capability { dac_read_search dac_override kill setgid setuid }; + allow mpd_t self:process { getsched setsched setrlimit signal signull setcap }; + allow mpd_t self:fifo_file rw_fifo_file_perms; + allow mpd_t self:unix_stream_socket { accept connectto listen }; + allow mpd_t self:unix_dgram_socket sendto; + allow mpd_t self:tcp_socket { accept listen }; + allow mpd_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow mpd_t self:unix_dgram_socket { create_socket_perms sendto }; + + allow mpd_t mpd_data_t:dir manage_dir_perms; + allow mpd_t mpd_data_t:file manage_file_perms; +@@ -104,13 +111,22 @@ manage_files_pattern(mpd_t, mpd_var_lib_t, mpd_var_lib_t) + manage_lnk_files_pattern(mpd_t, mpd_var_lib_t, mpd_var_lib_t) + files_var_lib_filetrans(mpd_t, mpd_var_lib_t, dir) + ++manage_files_pattern(mpd_t, mpd_var_run_t, mpd_var_run_t) ++manage_dirs_pattern(mpd_t, mpd_var_run_t, mpd_var_run_t) ++manage_sock_files_pattern(mpd_t, mpd_var_run_t, mpd_var_run_t) ++manage_lnk_files_pattern(mpd_t, mpd_var_run_t, mpd_var_run_t) ++files_pid_filetrans(mpd_t, mpd_var_run_t, { file dir sock_file }) ++ ++manage_files_pattern(mpd_t, mpd_home_t, mpd_home_t) ++manage_dirs_pattern(mpd_t, mpd_home_t, mpd_home_t) ++manage_lnk_files_pattern(mpd_t, mpd_home_t, mpd_home_t) ++ + kernel_getattr_proc(mpd_t) + kernel_read_system_state(mpd_t) + kernel_read_kernel_sysctls(mpd_t) + + corecmd_exec_bin(mpd_t) + +-corenet_all_recvfrom_unlabeled(mpd_t) + corenet_all_recvfrom_netlabel(mpd_t) + corenet_tcp_sendrecv_generic_if(mpd_t) + corenet_tcp_sendrecv_generic_node(mpd_t) +@@ -139,9 +155,9 @@ dev_read_sound(mpd_t) + dev_write_sound(mpd_t) + dev_read_sysfs(mpd_t) + +-files_read_usr_files(mpd_t) + + fs_getattr_all_fs(mpd_t) ++fs_getattr_all_dirs(mpd_t) + fs_list_inotifyfs(mpd_t) + fs_rw_anon_inodefs_files(mpd_t) + fs_search_auto_mountpoints(mpd_t) +@@ -150,15 +166,26 @@ auth_use_nsswitch(mpd_t) + + logging_send_syslog_msg(mpd_t) + +-miscfiles_read_localization(mpd_t) ++userdom_home_reader(mpd_t) + + tunable_policy(`mpd_enable_homedirs',` +- userdom_search_user_home_dirs(mpd_t) ++ userdom_stream_connect(mpd_t) ++ userdom_read_home_audio_files(mpd_t) ++ userdom_list_user_tmp(mpd_t) ++ userdom_read_user_tmp_files(mpd_t) ++ userdom_dontaudit_setattr_user_tmp(mpd_t) ++') ++ ++optional_policy(` ++ tunable_policy(`mpd_enable_homedirs',` ++ pulseaudio_read_home_files(mpd_t) ++ ') + ') + + tunable_policy(`mpd_enable_homedirs && use_nfs_home_dirs',` + fs_read_nfs_files(mpd_t) + fs_read_nfs_symlinks(mpd_t) ++ + ') + + tunable_policy(`mpd_enable_homedirs && use_samba_home_dirs',` +@@ -191,13 +218,23 @@ optional_policy(` + ') + + optional_policy(` +- pulseaudio_domtrans(mpd_t) ++ pulseaudio_exec(mpd_t) + ') + + optional_policy(` + rpc_search_nfs_state_data(mpd_t) + ') + ++optional_policy(` ++ #needed by pulseaudio ++ systemd_read_logind_sessions_files(mpd_t) ++ systemd_login_read_pid_files(mpd_t) ++') ++ ++optional_policy(` ++ rtkit_daemon_dontaudit_dbus_chat(mpd_t) ++') ++ + optional_policy(` + udev_read_db(mpd_t) + ') +diff --git a/mplayer.if b/mplayer.if +index 861d5e9746..1c3d5a538f 100644 +--- a/mplayer.if ++++ b/mplayer.if +@@ -161,3 +161,23 @@ interface(`mplayer_home_filetrans_mplayer_home',` + + userdom_user_home_dir_filetrans($1, mplayer_home_t, $2, $3) + ') ++ ++######################################## ++## ++## Create specified objects in user home ++## directories with the generic mplayer ++## home type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mplayer_filetrans_home_content',` ++ gen_require(` ++ type mplayer_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, mplayer_home_t, dir, ".mplayer") ++') +diff --git a/mplayer.te b/mplayer.te +index 0f03cd9375..e3ed3933de 100644 +--- a/mplayer.te ++++ b/mplayer.te +@@ -11,7 +11,7 @@ policy_module(mplayer, 2.5.0) + ## its stack executable. + ##

      + ## +-gen_tunable(allow_mplayer_execstack, false) ++gen_tunable(mplayer_execstack, false) + + attribute_role mencoder_roles; + attribute_role mplayer_roles; +@@ -67,7 +67,6 @@ kernel_read_kernel_sysctls(mencoder_t) + dev_rwx_zero(mencoder_t) + dev_read_video_dev(mencoder_t) + +-files_read_usr_files(mencoder_t) + + fs_search_auto_mountpoints(mencoder_t) + +@@ -82,7 +81,7 @@ userdom_manage_user_tmp_files(mencoder_t) + + userdom_manage_user_home_content_dirs(mencoder_t) + userdom_manage_user_home_content_files(mencoder_t) +-userdom_user_home_dir_filetrans_user_home_content(mencoder_t, { dir file }) ++userdom_filetrans_home_content(mencoder_t) + + ifndef(`enable_mls',` + fs_list_dos(mencoder_t) +@@ -95,15 +94,15 @@ ifndef(`enable_mls',` + fs_read_iso9660_files(mencoder_t) + ') + +-tunable_policy(`allow_execmem',` +- allow mencoder_t self:process execmem; ++tunable_policy(`deny_execmem',`',` ++ allow mencoder_t self:process execmem; + ') + +-tunable_policy(`allow_execmod',` ++tunable_policy(`selinuxuser_execmod',` + dev_execmod_zero(mencoder_t) + ') + +-tunable_policy(`allow_mplayer_execstack',` ++tunable_policy(`mplayer_execstack',` + allow mencoder_t self:process { execmem execstack }; + ') + +@@ -183,7 +182,6 @@ files_dontaudit_getattr_non_security_files(mplayer_t) + files_read_non_security_files(mplayer_t) + files_list_home(mplayer_t) + files_read_etc_runtime_files(mplayer_t) +-files_read_usr_files(mplayer_t) + + fs_getattr_all_fs(mplayer_t) + fs_search_auto_mountpoints(mplayer_t) +@@ -204,7 +202,7 @@ userdom_tmp_filetrans_user_tmp(mplayer_t, { dir file }) + + userdom_manage_user_home_content_dirs(mplayer_t) + userdom_manage_user_home_content_files(mplayer_t) +-userdom_user_home_dir_filetrans_user_home_content(mplayer_t, { dir file }) ++userdom_filetrans_home_content(mplayer_t) + + userdom_write_user_tmp_sockets(mplayer_t) + +@@ -221,15 +219,15 @@ ifndef(`enable_mls',` + fs_read_iso9660_files(mplayer_t) + ') + +-tunable_policy(`allow_execmem',` +- allow mplayer_t self:process execmem; ++tunable_policy(`deny_execmem',`',` ++ allow mplayer_t self:process execmem; + ') + +-tunable_policy(`allow_execmod',` ++tunable_policy(`selinuxuser_execmod',` + dev_execmod_zero(mplayer_t) + ') + +-tunable_policy(`allow_mplayer_execstack',` ++tunable_policy(`mplayer_execstack',` + allow mplayer_t self:process { execmem execstack }; + ') + +@@ -245,7 +243,7 @@ tunable_policy(`use_samba_home_dirs',` + fs_manage_cifs_symlinks(mplayer_t) + ') + +-tunable_policy(`allow_mplayer_execstack',` ++tunable_policy(`mplayer_execstack',` + allow mplayer_t mplayer_tmpfs_t:file execute; + ') + +diff --git a/mrtg.if b/mrtg.if +index c595094a64..23464583b5 100644 +--- a/mrtg.if ++++ b/mrtg.if +@@ -1,5 +1,24 @@ + ## Network traffic graphing. + ++######################################## ++## ++## Read mrtg lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mrtg_read_lib_files',` ++ gen_require(` ++ type mrtg_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, mrtg_var_lib_t, mrtg_var_lib_t) ++') ++ + ######################################## + ## + ## Create and append mrtg log files. +diff --git a/mrtg.te b/mrtg.te +index 65a246a520..fa8632064c 100644 +--- a/mrtg.te ++++ b/mrtg.te +@@ -65,7 +65,6 @@ kernel_read_kernel_sysctls(mrtg_t) + corecmd_exec_bin(mrtg_t) + corecmd_exec_shell(mrtg_t) + +-corenet_all_recvfrom_unlabeled(mrtg_t) + corenet_all_recvfrom_netlabel(mrtg_t) + corenet_tcp_sendrecv_generic_if(mrtg_t) + corenet_tcp_sendrecv_generic_node(mrtg_t) +@@ -82,7 +81,6 @@ domain_dontaudit_search_all_domains_state(mrtg_t) + + files_getattr_tmp_dirs(mrtg_t) + files_read_etc_runtime_files(mrtg_t) +-files_read_usr_files(mrtg_t) + files_search_var(mrtg_t) + files_search_locks(mrtg_t) + files_search_var_lib(mrtg_t) +@@ -105,13 +103,12 @@ libs_read_lib_files(mrtg_t) + + logging_send_syslog_msg(mrtg_t) + +-miscfiles_read_localization(mrtg_t) +- + selinux_dontaudit_getattr_dir(mrtg_t) + +-userdom_use_user_terminals(mrtg_t) ++userdom_use_inherited_user_terminals(mrtg_t) + userdom_dontaudit_read_user_home_content_files(mrtg_t) + userdom_dontaudit_use_unpriv_user_fds(mrtg_t) ++userdom_dontaudit_list_admin_dir(mrtg_t) + + netutils_domtrans_ping(mrtg_t) + +diff --git a/mta.fc b/mta.fc +index f42896cbf9..fce39c1ce6 100644 +--- a/mta.fc ++++ b/mta.fc +@@ -1,34 +1,39 @@ +-HOME_DIR/\.esmtp_queue -- gen_context(system_u:object_r:mail_home_t,s0) + HOME_DIR/\.forward[^/]* -- gen_context(system_u:object_r:mail_home_t,s0) + HOME_DIR/dead\.letter -- gen_context(system_u:object_r:mail_home_t,s0) + HOME_DIR/\.mailrc -- gen_context(system_u:object_r:mail_home_t,s0) +-HOME_DIR/Maildir(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) +-HOME_DIR/\.maildir(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) ++HOME_DIR/\.esmtp_queue(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) ++HOME_DIR/Maildir(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) ++HOME_DIR/.maildir(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) + +-/bin/mail(x)? -- gen_context(system_u:object_r:sendmail_exec_t,s0) +- +-/etc/aliases -- gen_context(system_u:object_r:etc_aliases_t,s0) ++/etc/aliases -- gen_context(system_u:object_r:etc_aliases_t,s0) + /etc/aliases\.db -- gen_context(system_u:object_r:etc_aliases_t,s0) +-/etc/mail(/.*)? gen_context(system_u:object_r:etc_mail_t,s0) ++/etc/mail(/.*)? gen_context(system_u:object_r:etc_mail_t,s0) + /etc/mail/aliases.* -- gen_context(system_u:object_r:etc_aliases_t,s0) +-/etc/postfix/aliases.* -- gen_context(system_u:object_r:etc_aliases_t,s0) +- +-/usr/bin/esmtp -- gen_context(system_u:object_r:sendmail_exec_t,s0) +-/usr/bin/mail(x)? -- gen_context(system_u:object_r:sendmail_exec_t,s0) +- ++/etc/mail/.*\.db -- gen_context(system_u:object_r:etc_aliases_t,s0) ++ifdef(`distro_redhat',` ++/etc/postfix/aliases.* gen_context(system_u:object_r:etc_aliases_t,s0) ++') ++ ++/root/\.forward -- gen_context(system_u:object_r:mail_home_t,s0) ++/root/dead\.letter -- gen_context(system_u:object_r:mail_home_t,s0) ++/root/\.mailrc -- gen_context(system_u:object_r:mail_home_t,s0) ++/root/\.esmtp_queue(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) ++/root/Maildir(/.*)? gen_context(system_u:object_r:mail_home_rw_t,s0) ++ ++/usr/bin/esmtp -- gen_context(system_u:object_r:sendmail_exec_t,s0) + /usr/lib/sendmail -- gen_context(system_u:object_r:sendmail_exec_t,s0) +-/usr/lib/courier/bin/sendmail -- gen_context(system_u:object_r:sendmail_exec_t,s0) + +-/usr/sbin/rmail -- gen_context(system_u:object_r:sendmail_exec_t,s0) ++/usr/sbin/rmail -- gen_context(system_u:object_r:sendmail_exec_t,s0) + /usr/sbin/sendmail\.postfix -- gen_context(system_u:object_r:sendmail_exec_t,s0) + /usr/sbin/sendmail(\.sendmail)? -- gen_context(system_u:object_r:sendmail_exec_t,s0) +-/usr/sbin/ssmtp -- gen_context(system_u:object_r:sendmail_exec_t,s0) ++/usr/sbin/ssmtp -- gen_context(system_u:object_r:sendmail_exec_t,s0) + +-/var/mail(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) ++/var/mail(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) + + /var/qmail/bin/sendmail -- gen_context(system_u:object_r:sendmail_exec_t,s0) + +-/var/spool/imap(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) ++/var/spool/imap(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) + /var/spool/(client)?mqueue(/.*)? gen_context(system_u:object_r:mqueue_spool_t,s0) + /var/spool/mqueue\.in(/.*)? gen_context(system_u:object_r:mqueue_spool_t,s0) +-/var/spool/mail(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) ++/var/spool/mail(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) ++/var/spool/smtpd(/.*)? gen_context(system_u:object_r:mail_spool_t,s0) +diff --git a/mta.if b/mta.if +index ed81cac5a1..806055cba9 100644 +--- a/mta.if ++++ b/mta.if +@@ -1,4 +1,4 @@ +-## Common e-mail transfer agent policy. ++## Policy common to all email tranfer agents. + + ######################################## + ## +@@ -18,23 +18,37 @@ interface(`mta_stub',` + + ####################################### + ## +-## The template to define a mail domain. ++## Basic mail transfer agent domain template. + ## ++## ++##

      ++## This template creates a derived domain which is ++## a email transfer agent, which sends mail on ++## behalf of the user. ++##

      ++##

      ++## This is the basic types and rules, common ++## to the system agent and user agents. ++##

      ++##
      + ## + ## +-## Domain prefix to be used. ++## The prefix of the domain (e.g., user ++## is the prefix for user_t). + ## + ## ++## + # + template(`mta_base_mail_template',` ++ + gen_require(` + attribute user_mail_domain; + type sendmail_exec_t; + ') + +- ######################################## ++ ############################## + # +- # Declarations ++ # $1_mail_t declarations + # + + type $1_mail_t, user_mail_domain; +@@ -43,17 +57,18 @@ template(`mta_base_mail_template',` + type $1_mail_tmp_t; + files_tmp_file($1_mail_tmp_t) + +- ######################################## +- # +- # Declarations +- # +- + manage_dirs_pattern($1_mail_t, $1_mail_tmp_t, $1_mail_tmp_t) + manage_files_pattern($1_mail_t, $1_mail_tmp_t, $1_mail_tmp_t) + files_tmp_filetrans($1_mail_t, $1_mail_tmp_t, { file dir }) + ++ kernel_read_system_state($1_mail_t) ++ ++ corenet_all_recvfrom_netlabel($1_mail_t) ++ + auth_use_nsswitch($1_mail_t) + ++ logging_send_syslog_msg($1_mail_t) ++ + optional_policy(` + postfix_domtrans_user_mail_handler($1_mail_t) + ') +@@ -61,61 +76,41 @@ template(`mta_base_mail_template',` + + ######################################## + ## +-## Role access for mta. ++## Role access for mta + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + # + interface(`mta_role',` + gen_require(` + attribute mta_user_agent; +- attribute_role user_mail_roles; +- type user_mail_t, sendmail_exec_t, mail_home_t; +- type user_mail_tmp_t, mail_home_rw_t; ++ type user_mail_t, sendmail_exec_t; + ') + +- roleattribute $1 user_mail_roles; +- +- # this is something i need to fix +- # i dont know if and why it is needed +- # will role attribute work? +- role $1 types mta_user_agent; ++ role $1 types { user_mail_t mta_user_agent }; + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, sendmail_exec_t, user_mail_t) + allow $2 sendmail_exec_t:lnk_file read_lnk_file_perms; + +- allow $2 { user_mail_t mta_user_agent }:process { ptrace signal_perms }; +- ps_process_pattern($2, { user_mail_t mta_user_agent }) +- +- allow $2 mail_home_t:file { manage_file_perms relabel_file_perms }; +- userdom_user_home_dir_filetrans($2, mail_home_t, file, ".esmtp_queue") +- userdom_user_home_dir_filetrans($2, mail_home_t, file, ".forward") +- userdom_user_home_dir_filetrans($2, mail_home_t, file, ".mailrc") +- userdom_user_home_dir_filetrans($2, mail_home_t, file, "dead.letter") +- +- allow $2 mail_home_rw_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 mail_home_rw_t:file { manage_file_perms relabel_file_perms }; +- allow $2 mail_home_rw_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, mail_home_rw_t, dir, "Maildir") +- userdom_user_home_dir_filetrans($2, mail_home_rw_t, dir, ".maildir") +- +- allow $2 user_mail_tmp_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 user_mail_tmp_t:file { manage_file_perms relabel_file_perms }; ++ allow mta_user_agent $2:fd use; ++ allow mta_user_agent $2:process sigchld; ++ allow mta_user_agent $2:fifo_file rw_inherited_fifo_file_perms; + + optional_policy(` + exim_run($2, $1) + ') + + optional_policy(` +- mailman_run($2, $1) ++ mailman_run(mta_user_agent, $1) + ') + ') + +@@ -163,125 +158,23 @@ interface(`mta_agent_executable',` + application_executable_file($1) + ') + +-####################################### +-## +-## Read mta mail home files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`mta_read_mail_home_files',` +- gen_require(` +- type mail_home_t; +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 mail_home_t:file read_file_perms; +-') +- +-####################################### +-## +-## Create, read, write, and delete +-## mta mail home files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`mta_manage_mail_home_files',` +- gen_require(` +- type mail_home_t; +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 mail_home_t:file manage_file_perms; +-') +- +-######################################## ++###################################### + ## +-## Create specified objects in user home +-## directories with the generic mail +-## home type. ++## Dontaudit read and write an leaked file descriptors + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## +-# +-interface(`mta_home_filetrans_mail_home',` +- gen_require(` +- type mail_home_t; +- ') +- +- userdom_user_home_dir_filetrans($1, mail_home_t, $2, $3) +-') +- +-####################################### +-## +-## Create, read, write, and delete +-## mta mail home rw content. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`mta_manage_mail_home_rw_content',` +- gen_require(` +- type mail_home_rw_t; +- ') +- +- userdom_search_user_home_dirs($1) +- manage_dirs_pattern($1, mail_home_rw_t, mail_home_rw_t) +- manage_files_pattern($1, mail_home_rw_t, mail_home_rw_t) +- manage_lnk_files_pattern($1, mail_home_rw_t, mail_home_rw_t) +-') +- +-######################################## +-## +-## Create specified objects in user home +-## directories with the generic mail +-## home rw type. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`mta_home_filetrans_mail_home_rw',` ++interface(`mta_dontaudit_leaks_system_mail',` + gen_require(` +- type mail_home_rw_t; ++ type system_mail_t; + ') + +- userdom_user_home_dir_filetrans($1, mail_home_rw_t, $2, $3) ++ dontaudit $1 system_mail_t:fifo_file write; ++ dontaudit $1 system_mail_t:tcp_socket { read write }; + ') + + ######################################## +@@ -334,7 +227,6 @@ interface(`mta_sendmail_mailserver',` + ') + + init_system_domain($1, sendmail_exec_t) +- + typeattribute $1 mailserver_domain; + ') + +@@ -374,6 +266,15 @@ interface(`mta_mailserver_delivery',` + ') + + typeattribute $1 mailserver_delivery; ++ ++ userdom_home_manager($1) ++ ++ optional_policy(` ++ mta_rw_delivery_tcp_sockets($1) ++ ') ++ ++ userdom_filetrans_home_content($1) ++ + ') + + ####################################### +@@ -394,6 +295,12 @@ interface(`mta_mailserver_user_agent',` + ') + + typeattribute $1 mta_user_agent; ++ ++ optional_policy(` ++ # apache should set close-on-exec ++ apache_dontaudit_rw_stream_sockets($1) ++ apache_dontaudit_rw_sys_script_stream_sockets($1) ++ ') + ') + + ######################################## +@@ -408,14 +315,19 @@ interface(`mta_mailserver_user_agent',` + # + interface(`mta_send_mail',` + gen_require(` ++ attribute mta_user_agent; + type system_mail_t; + attribute mta_exec_type; + ') + +- corecmd_search_bin($1) ++ allow $1 mta_exec_type:lnk_file read_lnk_file_perms; ++ corecmd_read_bin_symlinks($1) + domtrans_pattern($1, mta_exec_type, system_mail_t) + +- allow $1 mta_exec_type:lnk_file read_lnk_file_perms; ++ allow mta_user_agent $1:fd use; ++ allow mta_user_agent $1:process sigchld; ++ allow mta_user_agent $1:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit mta_user_agent $1:unix_stream_socket rw_socket_perms; + ') + + ######################################## +@@ -445,18 +357,24 @@ interface(`mta_send_mail',` + # + interface(`mta_sendmail_domtrans',` + gen_require(` +- type sendmail_exec_t; ++ attribute mta_exec_type; ++ attribute mta_user_agent; + ') + +- corecmd_search_bin($1) +- domain_auto_trans($1, sendmail_exec_t, $2) ++ files_search_usr($1) ++ allow $1 mta_exec_type:lnk_file read_lnk_file_perms; ++ corecmd_read_bin_symlinks($1) + +- allow $1 sendmail_exec_t:lnk_file read_lnk_file_perms; ++ allow $2 mta_exec_type:file entrypoint; ++ domtrans_pattern($1, mta_exec_type, $2) ++ allow mta_user_agent $1:fd use; ++ allow mta_user_agent $1:process sigchld; ++ allow mta_user_agent $1:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Send signals to system mail. ++## Send system mail client a signal + ## + ## + ## +@@ -464,7 +382,6 @@ interface(`mta_sendmail_domtrans',` + ## + ## + # +-# + interface(`mta_signal_system_mail',` + gen_require(` + type system_mail_t; +@@ -475,7 +392,61 @@ interface(`mta_signal_system_mail',` + + ######################################## + ## +-## Send kill signals to system mail. ++## Allow role to access system_mail_t. ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`mta_role_access_system_mail',` ++ gen_require(` ++ type system_mail_t; ++ ') ++ ++ role $1 types system_mail_t; ++') ++ ++######################################## ++## ++## Send all user mail client a signal ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_signal_user_agent',` ++ gen_require(` ++ attribute mta_user_agent; ++ ') ++ ++ allow $1 mta_user_agent:process signal; ++') ++ ++######################################## ++## ++## Send all user mail client a kill signal ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_kill_user_agent',` ++ gen_require(` ++ attribute mta_user_agent; ++ ') ++ ++ allow $1 mta_user_agent:process sigkill; ++') ++ ++######################################## ++## ++## Send system mail client a kill signal + ## + ## + ## +@@ -506,13 +477,32 @@ interface(`mta_sendmail_exec',` + type sendmail_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, sendmail_exec_t) + ') + + ######################################## + ## +-## Read mail server configuration content. ++## Check whether sendmail executable ++## files are executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_sendmail_access_check',` ++ gen_require(` ++ type sendmail_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ allow $1 sendmail_exec_t:file { getattr_file_perms execute }; ++') ++ ++######################################## ++## ++## Read mail server configuration. + ## + ## + ## +@@ -528,13 +518,13 @@ interface(`mta_read_config',` + + files_search_etc($1) + allow $1 etc_mail_t:dir list_dir_perms; +- allow $1 etc_mail_t:file read_file_perms; +- allow $1 etc_mail_t:lnk_file read_lnk_file_perms; ++ read_files_pattern($1, etc_mail_t, etc_mail_t) ++ read_lnk_files_pattern($1, etc_mail_t, etc_mail_t) + ') + + ######################################## + ## +-## Write mail server configuration files. ++## write mail server configuration. + ## + ## + ## +@@ -548,33 +538,31 @@ interface(`mta_write_config',` + type etc_mail_t; + ') + +- files_search_etc($1) + write_files_pattern($1, etc_mail_t, etc_mail_t) + ') + + ######################################## + ## +-## Read mail address alias files. ++## Manage mail server configuration. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`mta_read_aliases',` ++interface(`mta_manage_config',` + gen_require(` +- type etc_aliases_t; ++ type etc_mail_t; + ') + +- files_search_etc($1) +- allow $1 etc_aliases_t:file read_file_perms; ++ manage_files_pattern($1, etc_mail_t, etc_mail_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## mail address alias content. ++## Read mail address aliases. + ## + ## + ## +@@ -582,84 +570,64 @@ interface(`mta_read_aliases',` + ## + ## + # +-interface(`mta_manage_aliases',` ++interface(`mta_read_aliases',` + gen_require(` + type etc_aliases_t; + ') + + files_search_etc($1) +- manage_files_pattern($1, etc_aliases_t, etc_aliases_t) +- manage_lnk_files_pattern($1, etc_aliases_t, etc_aliases_t) ++ allow $1 etc_aliases_t:file read_file_perms; ++ allow $1 etc_aliases_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## +-## Create specified object in generic +-## etc directories with the mail address +-## alias type. ++## Create, read, write, and delete mail address aliases. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## The object class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`mta_etc_filetrans_aliases',` ++interface(`mta_manage_aliases',` + gen_require(` + type etc_aliases_t; + ') + +- files_etc_filetrans($1, etc_aliases_t, $2, $3) ++ files_search_etc($1) ++ manage_files_pattern($1, etc_aliases_t, etc_aliases_t) ++ manage_lnk_files_pattern($1, etc_aliases_t, etc_aliases_t) ++ mta_filetrans_named_content($1) + ') + + ######################################## + ## +-## Create specified objects in specified +-## directories with a type transition to +-## the mail address alias type. ++## Type transition files created in /etc ++## to the mail address aliases type. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Directory to transition on. +-## +-## +-## +-## +-## The object class of the object being created. +-## +-## + ## + ## + ## The name of the object being created. + ## + ## + # +-interface(`mta_spec_filetrans_aliases',` ++interface(`mta_etc_filetrans_aliases',` + gen_require(` + type etc_aliases_t; + ') + +- filetrans_pattern($1, $2, etc_aliases_t, $3, $4) ++ files_etc_filetrans($1, etc_aliases_t, file, $2) + ') + + ######################################## + ## +-## Read and write mail alias files. ++## Read and write mail aliases. + ## + ## + ## +@@ -674,14 +642,13 @@ interface(`mta_rw_aliases',` + ') + + files_search_etc($1) +- allow $1 etc_aliases_t:file rw_file_perms; ++ allow $1 etc_aliases_t:file { rw_file_perms setattr_file_perms }; + ') + + ####################################### + ## +-## Do not audit attempts to read +-## and write TCP sockets of mail +-## delivery domains. ++## Do not audit attempts to read and write TCP ++## sockets of mail delivery domains. + ## + ## + ## +@@ -697,6 +664,25 @@ interface(`mta_dontaudit_rw_delivery_tcp_sockets',` + dontaudit $1 mailserver_delivery:tcp_socket { read write }; + ') + ++###################################### ++## ++## Allow attempts to read and write TCP ++## sockets of mail delivery domains. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`mta_rw_delivery_tcp_sockets',` ++ gen_require(` ++ attribute mailserver_delivery; ++ ') ++ ++ allow $1 mailserver_delivery:tcp_socket { read write }; ++') ++ + ####################################### + ## + ## Connect to all mail servers over TCP. (Deprecated) +@@ -713,8 +699,8 @@ interface(`mta_tcp_connect_all_mailservers',` + + ####################################### + ## +-## Do not audit attempts to read +-## mail spool symlinks. ++## Do not audit attempts to read a symlink ++## in the mail spool. + ## + ## + ## +@@ -732,7 +718,7 @@ interface(`mta_dontaudit_read_spool_symlinks',` + + ######################################## + ## +-## Get attributes of mail spool content. ++## Get the attributes of mail spool files. + ## + ## + ## +@@ -753,8 +739,8 @@ interface(`mta_getattr_spool',` + + ######################################## + ## +-## Do not audit attempts to get +-## attributes of mail spool files. ++## Do not audit attempts to get the attributes ++## of mail spool files. + ## + ## + ## +@@ -775,9 +761,8 @@ interface(`mta_dontaudit_getattr_spool_files',` + + ####################################### + ## +-## Create specified objects in the +-## mail spool directory with a +-## private type. ++## Create private objects in the ++## mail spool directory. + ## + ## + ## +@@ -811,7 +796,7 @@ interface(`mta_spool_filetrans',` + + ####################################### + ## +-## Read mail spool files. ++## Read the mail spool. + ## + ## + ## +@@ -819,10 +804,10 @@ interface(`mta_spool_filetrans',` + ## + ## + # +-interface(`mta_read_spool_files',` +- gen_require(` +- type mail_spool_t; +- ') ++interface(`mta_read_spool',` ++ gen_require(` ++ type mail_spool_t; ++ ') + + files_search_spool($1) + read_files_pattern($1, mail_spool_t, mail_spool_t) +@@ -830,7 +815,7 @@ interface(`mta_read_spool_files',` + + ######################################## + ## +-## Read and write mail spool files. ++## Read and write the mail spool. + ## + ## + ## +@@ -845,13 +830,14 @@ interface(`mta_rw_spool',` + + files_search_spool($1) + allow $1 mail_spool_t:dir list_dir_perms; +- allow $1 mail_spool_t:file rw_file_perms; +- allow $1 mail_spool_t:lnk_file read_lnk_file_perms; ++ allow $1 mail_spool_t:file setattr_file_perms; ++ manage_files_pattern($1, mail_spool_t, mail_spool_t) ++ read_lnk_files_pattern($1, mail_spool_t, mail_spool_t) + ') + + ####################################### + ## +-## Create, read, and write mail spool files. ++## Create, read, and write the mail spool. + ## + ## + ## +@@ -866,13 +852,14 @@ interface(`mta_append_spool',` + + files_search_spool($1) + allow $1 mail_spool_t:dir list_dir_perms; +- manage_files_pattern($1, mail_spool_t, mail_spool_t) +- allow $1 mail_spool_t:lnk_file read_lnk_file_perms; ++ create_files_pattern($1, mail_spool_t, mail_spool_t) ++ write_files_pattern($1, mail_spool_t, mail_spool_t) ++ read_lnk_files_pattern($1, mail_spool_t, mail_spool_t) + ') + + ####################################### + ## +-## Delete mail spool files. ++## Delete from the mail spool. + ## + ## + ## +@@ -891,8 +878,7 @@ interface(`mta_delete_spool',` + + ######################################## + ## +-## Create, read, write, and delete +-## mail spool content. ++## Create, read, write, and delete mail spool files. + ## + ## + ## +@@ -909,47 +895,12 @@ interface(`mta_manage_spool',` + manage_dirs_pattern($1, mail_spool_t, mail_spool_t) + manage_files_pattern($1, mail_spool_t, mail_spool_t) + manage_lnk_files_pattern($1, mail_spool_t, mail_spool_t) +-') +- +-####################################### +-## +-## Create specified objects in the +-## mail queue spool directory with a +-## private type. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## The type of the object to be created. +-## +-## +-## +-## +-## The object class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## +-# +-interface(`mta_queue_filetrans',` +- gen_require(` +- type mqueue_spool_t; +- ') +- +- files_search_spool($1) +- filetrans_pattern($1, mqueue_spool_t, $2, $3, $4) ++ allow $1 mail_spool_t:file map; + ') + + ######################################## + ## +-## Search mail queue directories. ++## Search mail queue dirs. + ## + ## + ## +@@ -968,7 +919,7 @@ interface(`mta_search_queue',` + + ####################################### + ## +-## List mail queue directories. ++## List the mail queue. + ## + ## + ## +@@ -981,13 +932,13 @@ interface(`mta_list_queue',` + type mqueue_spool_t; + ') + +- files_search_spool($1) + allow $1 mqueue_spool_t:dir list_dir_perms; ++ files_search_spool($1) + ') + + ####################################### + ## +-## Read mail queue files. ++## Read the mail queue. + ## + ## + ## +@@ -1000,14 +951,14 @@ interface(`mta_read_queue',` + type mqueue_spool_t; + ') + +- files_search_spool($1) + read_files_pattern($1, mqueue_spool_t, mqueue_spool_t) ++ files_search_spool($1) + ') + + ####################################### + ## + ## Do not audit attempts to read and +-## write mail queue content. ++## write the mail queue. + ## + ## + ## +@@ -1027,7 +978,7 @@ interface(`mta_dontaudit_rw_queue',` + ######################################## + ## + ## Create, read, write, and delete +-## mail queue content. ++## mail queue files. + ## + ## + ## +@@ -1045,6 +996,41 @@ interface(`mta_manage_queue',` + manage_files_pattern($1, mqueue_spool_t, mqueue_spool_t) + ') + ++####################################### ++## ++## Create private objects in the ++## mqueue spool directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`mta_spool_filetrans_queue',` ++ gen_require(` ++ type mqueue_spool_t; ++ ') ++ ++ files_search_spool($1) ++ filetrans_pattern($1, mqueue_spool_t, $2, $3, $4) ++') ++ + ####################################### + ## + ## Read sendmail binary. +@@ -1055,6 +1041,7 @@ interface(`mta_manage_queue',` + ## + ## + # ++# cjp: added for postfix + interface(`mta_read_sendmail_bin',` + gen_require(` + type sendmail_exec_t; +@@ -1065,8 +1052,8 @@ interface(`mta_read_sendmail_bin',` + + ####################################### + ## +-## Read and write unix domain stream +-## sockets of all base mail domains. ++## Read and write unix domain stream sockets ++## of user mail domains. + ## + ## + ## +@@ -1081,3 +1068,227 @@ interface(`mta_rw_user_mail_stream_sockets',` + + allow $1 user_mail_domain:unix_stream_socket rw_socket_perms; + ') ++ ++######################################## ++## ++## Type transition files created in calling dir ++## to the mail address aliases type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Directory to transition on. ++## ++## ++# ++interface(`mta_filetrans_aliases',` ++ gen_require(` ++ type etc_aliases_t; ++ ') ++ ++ filetrans_pattern($1, $2, etc_aliases_t, file) ++') ++ ++###################################### ++## ++## ALlow domain to append mail content in the homedir ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_append_home',` ++ gen_require(` ++ type mail_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ append_files_pattern($1, mail_home_t, mail_home_t) ++ ++ ifdef(`distro_redhat',` ++ userdom_search_admin_dir($1) ++ ') ++') ++ ++###################################### ++## ++## ALlow domain to read mail content in the homedir ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_read_home',` ++ gen_require(` ++ type mail_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, mail_home_t, mail_home_t) ++ ++ ifdef(`distro_redhat',` ++ userdom_search_admin_dir($1) ++ ') ++') ++ ++#################################### ++## ++## ALlow domain to mmap mail content in the homedir ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_mmap_home_rw',` ++ gen_require(` ++ type mail_home_rw_t; ++ ') ++ ++ allow $1 mail_home_rw_t:file map; ++') ++ ++#################################### ++## ++## ALlow domain to read mail content in the homedir ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_read_home_rw',` ++ gen_require(` ++ type mail_home_rw_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, mail_home_rw_t, mail_home_rw_t) ++ read_lnk_files_pattern($1, mail_home_rw_t, mail_home_rw_t) ++ ++ ifdef(`distro_redhat',` ++ userdom_search_admin_dir($1) ++ ') ++') ++ ++#################################### ++## ++## Allow domain to manage mail content in the homedir ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_manage_home_rw',` ++ gen_require(` ++ type mail_home_rw_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ userdom_search_admin_dir($1) ++ manage_files_pattern($1, mail_home_rw_t, mail_home_rw_t) ++ manage_dirs_pattern($1, mail_home_rw_t, mail_home_rw_t) ++ manage_lnk_files_pattern($1, mail_home_rw_t, mail_home_rw_t) ++ userdom_user_home_dir_filetrans($1, mail_home_rw_t, dir, "Maildir") ++ ++ ifdef(`distro_redhat',` ++ userdom_search_admin_dir($1) ++ userdom_admin_home_dir_filetrans($1, mail_home_rw_t, dir, "Maildir") ++ ') ++') ++ ++######################################## ++## ++## create mail content in the in the /root directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_filetrans_admin_home_content',` ++ gen_require(` ++ type mail_home_t; ++ type mail_home_rw_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, mail_home_t, file, "dead.letter") ++ userdom_admin_home_dir_filetrans($1, mail_home_t, file, ".mailrc") ++ userdom_admin_home_dir_filetrans($1, mail_home_t, file, ".forward") ++ userdom_admin_home_dir_filetrans($1, mail_home_rw_t, dir, "Maildir") ++ userdom_admin_home_dir_filetrans($1, mail_home_rw_t, dir, ".maildir") ++ userdom_admin_home_dir_filetrans($1, mail_home_rw_t, file, ".esmtp_queue") ++ userdom_admin_home_dir_filetrans($1, mail_home_rw_t, dir, ".esmtp_queue") ++') ++ ++######################################## ++## ++## Transition to mta named home content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_filetrans_home_content',` ++ gen_require(` ++ type mail_home_t; ++ type mail_home_rw_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, mail_home_t, file, ".mailrc") ++ userdom_user_home_dir_filetrans($1, mail_home_t, file, "dead.letter") ++ userdom_user_home_dir_filetrans($1, mail_home_t, file, ".forward") ++ userdom_user_home_dir_filetrans($1, mail_home_rw_t, dir, "Maildir") ++ userdom_user_home_dir_filetrans($1, mail_home_rw_t, dir, ".maildir") ++ userdom_user_home_dir_filetrans($1, mail_home_rw_t, file, ".esmtp_queue") ++ userdom_user_home_dir_filetrans($1, mail_home_rw_t, dir, ".esmtp_queue") ++') ++ ++######################################## ++## ++## Transition to mta named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mta_filetrans_named_content',` ++ gen_require(` ++ type etc_aliases_t; ++ type etc_mail_t; ++ ') ++ ++ #filetrans_pattern($1, etc_mail_t, etc_aliases_t, { dir file }) ++ mta_etc_filetrans_aliases($1, "aliases") ++ mta_etc_filetrans_aliases($1, "aliases.db") ++ mta_etc_filetrans_aliases($1, "aliasesdb-stamp") ++ mta_etc_filetrans_aliases($1, "__db.aliases.db") ++ mta_etc_filetrans_aliases($1, "virtusertable.db") ++ mta_etc_filetrans_aliases($1, "access.db") ++ mta_etc_filetrans_aliases($1, "domaintable.db") ++ filetrans_pattern($1, etc_mail_t, etc_aliases_t, file, "virtusertable.db") ++ filetrans_pattern($1, etc_mail_t, etc_aliases_t, file, "access.db") ++ filetrans_pattern($1, etc_mail_t, etc_aliases_t, file, "domaintable.db") ++ filetrans_pattern($1, etc_mail_t, etc_aliases_t, file, "mailertable.db") ++ filetrans_pattern($1, etc_mail_t, etc_aliases_t, file, "aliasesdb-stamp") ++ mta_filetrans_home_content($1) ++ mta_filetrans_admin_home_content($1) ++') +diff --git a/mta.te b/mta.te +index ff1d68c6aa..630956deb3 100644 +--- a/mta.te ++++ b/mta.te +@@ -14,8 +14,6 @@ attribute mailserver_sender; + + attribute user_mail_domain; + +-attribute_role user_mail_roles; +- + type etc_aliases_t; + files_type(etc_aliases_t) + +@@ -30,9 +28,11 @@ userdom_user_home_content(mail_home_rw_t) + + type mqueue_spool_t; + files_mountpoint(mqueue_spool_t) ++files_spool_file(mqueue_spool_t) + + type mail_spool_t; + files_mountpoint(mail_spool_t) ++files_spool_file(mail_spool_t) + + type sendmail_exec_t; + mta_agent_executable(sendmail_exec_t) +@@ -43,11 +43,9 @@ role system_r types system_mail_t; + mta_base_mail_template(user) + typealias user_mail_t alias { staff_mail_t sysadm_mail_t }; + typealias user_mail_t alias { auditadm_mail_t secadm_mail_t }; +-userdom_user_application_type(user_mail_t) +-role user_mail_roles types user_mail_t; +- + typealias user_mail_tmp_t alias { staff_mail_tmp_t sysadm_mail_tmp_t }; + typealias user_mail_tmp_t alias { auditadm_mail_tmp_t secadm_mail_tmp_t }; ++userdom_user_application_type(user_mail_t) + userdom_user_tmp_file(user_mail_tmp_t) + + ######################################## +@@ -61,13 +59,11 @@ allow user_mail_domain self:fifo_file rw_fifo_file_perms; + + allow user_mail_domain mta_exec_type:file entrypoint; + +-allow user_mail_domain mail_home_t:file { append_file_perms read_file_perms }; ++manage_files_pattern(user_mail_domain, mail_home_t, mail_home_t) + + manage_dirs_pattern(user_mail_domain, mail_home_rw_t, mail_home_rw_t) + manage_files_pattern(user_mail_domain, mail_home_rw_t, mail_home_rw_t) + manage_lnk_files_pattern(user_mail_domain, mail_home_rw_t, mail_home_rw_t) +-userdom_user_home_dir_filetrans(user_mail_domain, mail_home_rw_t, dir, "Maildir") +-userdom_user_home_dir_filetrans(user_mail_domain, mail_home_rw_t, dir, ".maildir") + + read_files_pattern(user_mail_domain, { etc_mail_t etc_aliases_t }, { etc_mail_t etc_aliases_t }) + +@@ -79,12 +75,10 @@ allow user_mail_domain sendmail_exec_t:lnk_file read_lnk_file_perms; + can_exec(user_mail_domain, { mta_exec_type sendmail_exec_t }) + + kernel_read_crypto_sysctls(user_mail_domain) +-kernel_read_system_state(user_mail_domain) + kernel_read_kernel_sysctls(user_mail_domain) + kernel_read_network_state(user_mail_domain) + kernel_request_load_module(user_mail_domain) + +-corenet_all_recvfrom_netlabel(user_mail_domain) + corenet_tcp_sendrecv_generic_if(user_mail_domain) + corenet_tcp_sendrecv_generic_node(user_mail_domain) + +@@ -107,10 +101,6 @@ fs_getattr_all_fs(user_mail_domain) + + init_dontaudit_rw_utmp(user_mail_domain) + +-logging_send_syslog_msg(user_mail_domain) +- +-miscfiles_read_localization(user_mail_domain) +- + tunable_policy(`use_samba_home_dirs',` + fs_manage_cifs_dirs(user_mail_domain) + fs_manage_cifs_files(user_mail_domain) +@@ -123,6 +113,11 @@ tunable_policy(`use_nfs_home_dirs',` + fs_read_nfs_symlinks(user_mail_domain) + ') + ++optional_policy(` ++ antivirus_stream_connect(user_mail_domain) ++ antivirus_stream_connect(mta_user_agent) ++') ++ + optional_policy(` + courier_manage_spool_dirs(user_mail_domain) + courier_manage_spool_files(user_mail_domain) +@@ -149,6 +144,11 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ openshift_rw_inherited_content(mta_user_agent) ++ openshift_dontaudit_rw_inherited_fifo_files(mta_user_agent) ++') ++ + optional_policy(` + procmail_exec(user_mail_domain) + ') +@@ -166,57 +166,79 @@ optional_policy(` + uucp_manage_spool(user_mail_domain) + ') + ++mta_filetrans_admin_home_content(user_mail_domain) ++mta_filetrans_home_content(user_mail_domain) ++ + ######################################## + # + # System local policy + # + +-allow system_mail_t self:capability { dac_override fowner }; ++# newalias required this, not sure if it is needed in 'if' file ++allow system_mail_t self:capability { dac_read_search dac_override fowner }; ++dontaudit system_mail_t self:capability net_admin; + +-read_files_pattern(system_mail_t, etc_mail_t, etc_mail_t) ++allow system_mail_t mail_home_t:file manage_file_perms; + + read_files_pattern(system_mail_t, mailcontent_type, mailcontent_type) + +-allow system_mail_t mail_home_t:file manage_file_perms; +-userdom_user_home_dir_filetrans(system_mail_t, mail_home_t, file, ".esmtp_queue") +-userdom_user_home_dir_filetrans(system_mail_t, mail_home_t, file, ".forward") +-userdom_user_home_dir_filetrans(system_mail_t, mail_home_t, file, ".mailrc") +-userdom_user_home_dir_filetrans(system_mail_t, mail_home_t, file, "dead.letter") +- +-allow system_mail_t user_mail_domain:dir list_dir_perms; +-allow system_mail_t user_mail_domain:file read_file_perms; +-allow system_mail_t user_mail_domain:lnk_file read_lnk_file_perms; ++kernel_search_network_sysctl(system_mail_t) + + corecmd_exec_shell(system_mail_t) + +-dev_read_rand(system_mail_t) + dev_read_sysfs(system_mail_t) ++dev_read_rand(system_mail_t) ++dev_read_urand(system_mail_t) + + fs_rw_anon_inodefs_files(system_mail_t) + +-selinux_getattr_fs(system_mail_t) +- + term_dontaudit_use_unallocated_ttys(system_mail_t) + + init_use_script_ptys(system_mail_t) ++init_dontaudit_rw_stream_socket(system_mail_t) ++ ++userdom_use_inherited_user_terminals(system_mail_t) ++userdom_dontaudit_list_user_home_dirs(system_mail_t) ++userdom_dontaudit_list_admin_dir(system_mail_t) ++userdom_dontaudit_list_user_tmp(system_mail_t) ++userdom_dontaudit_read_inherited_admin_home_files(system_mail_t) + +-userdom_use_user_terminals(system_mail_t) ++manage_dirs_pattern(system_mail_t, mail_home_rw_t, mail_home_rw_t) ++manage_files_pattern(system_mail_t, mail_home_rw_t, mail_home_rw_t) ++ ++allow system_mail_t mail_home_t:file manage_file_perms; ++userdom_admin_home_dir_filetrans(system_mail_t, mail_home_t, file) ++ ++logging_append_all_logs(system_mail_t) ++ ++logging_send_syslog_msg(system_mail_t) + + optional_policy(` + apache_read_squirrelmail_data(system_mail_t) + apache_append_squirrelmail_data(system_mail_t) ++ ++ # apache should set close-on-exec + apache_dontaudit_append_log(system_mail_t) + apache_dontaudit_rw_stream_sockets(system_mail_t) + apache_dontaudit_rw_tcp_sockets(system_mail_t) + apache_dontaudit_rw_sys_script_stream_sockets(system_mail_t) ++ apache_dontaudit_rw_tmp_files(system_mail_t) ++ ++ apache_dontaudit_rw_fifo_file(user_mail_domain) ++ apache_dontaudit_rw_fifo_file(mta_user_agent) ++ # apache should set close-on-exec ++ apache_dontaudit_rw_stream_sockets(mta_user_agent) ++ apache_dontaudit_rw_sys_script_stream_sockets(mta_user_agent) ++ apache_append_log(mta_user_agent) + ') + + optional_policy(` + arpwatch_manage_tmp_files(system_mail_t) + +- ifdef(`hide_broken_symptoms',` +- arpwatch_dontaudit_rw_packet_sockets(system_mail_t) +- ') ++ ifdef(`hide_broken_symptoms', ` ++ arpwatch_dontaudit_rw_packet_sockets(system_mail_t) ++ ') ++ + ') + + optional_policy(` +@@ -225,17 +247,21 @@ optional_policy(` + ') + + optional_policy(` +- clamav_stream_connect(system_mail_t) +- clamav_append_log(system_mail_t) ++ courier_stream_connect_authdaemon(system_mail_t) + ') + + optional_policy(` + cron_read_system_job_tmp_files(system_mail_t) + cron_dontaudit_write_pipes(system_mail_t) + cron_rw_system_job_stream_sockets(system_mail_t) ++ cron_rw_inherited_spool_files(system_mail_t) ++ cron_rw_inherited_user_spool_files(system_mail_t) + ') + + optional_policy(` ++ courier_manage_spool_dirs(system_mail_t) ++ courier_manage_spool_files(system_mail_t) ++ courier_rw_spool_pipes(system_mail_t) + courier_stream_connect_authdaemon(system_mail_t) + ') + +@@ -244,9 +270,10 @@ optional_policy(` + ') + + optional_policy(` +- fail2ban_dontaudit_rw_stream_sockets(system_mail_t) +- fail2ban_append_log(system_mail_t) +- fail2ban_rw_inherited_tmp_files(system_mail_t) ++ fail2ban_append_log(user_mail_domain) ++ fail2ban_dontaudit_leaks(user_mail_domain) ++ fail2ban_rw_inherited_tmp_files(mta_user_agent) ++ fail2ban_rw_inherited_tmp_files(user_mail_domain) + ') + + optional_policy(` +@@ -258,10 +285,17 @@ optional_policy(` + ') + + optional_policy(` ++ # newaliases runs as system_mail_t when the sendmail initscript does a restart + milter_getattr_all_sockets(system_mail_t) + ') + + optional_policy(` ++ munin_dontaudit_leaks(system_mail_t) ++ munin_manage_var_lib_files(system_mail_t) ++') ++ ++optional_policy(` ++ nagios_append_spool(system_mail_t) + nagios_read_tmp_files(system_mail_t) + ') + +@@ -272,12 +306,29 @@ optional_policy(` + manage_fifo_files_pattern(system_mail_t, etc_aliases_t, etc_aliases_t) + manage_sock_files_pattern(system_mail_t, etc_aliases_t, etc_aliases_t) + files_etc_filetrans(system_mail_t, etc_aliases_t, { file lnk_file sock_file fifo_file }) ++ ++ domain_use_interactive_fds(system_mail_t) ++') ++ ++optional_policy(` ++ postfix_domtrans_postdrop(system_mail_t) ++') ++ ++optional_policy(` ++ qmail_domtrans_inject(system_mail_t) ++ qmail_manage_spool_dirs(system_mail_t) ++ qmail_manage_spool_files(system_mail_t) ++ qmail_rw_spool_pipes(system_mail_t) + ') + + optional_policy(` + sxid_read_log(system_mail_t) + ') + ++optional_policy(` ++ systemd_write_inhibit_pipes(system_mail_t) ++') ++ + optional_policy(` + userdom_dontaudit_use_user_ptys(system_mail_t) + +@@ -287,42 +338,36 @@ optional_policy(` + ') + + optional_policy(` +- spamassassin_stream_connect_spamd(system_mail_t) ++ spamd_stream_connect(system_mail_t) + ') + + optional_policy(` + smartmon_read_tmp_files(system_mail_t) + ') + +-######################################## +-# +-# MTA user agent local policy +-# +- +-userdom_use_user_terminals(mta_user_agent) +- +-optional_policy(` +- apache_append_log(mta_user_agent) +-') ++# should break this up among sections: + + optional_policy(` ++ # why is mail delivered to a directory of type arpwatch_data_t? ++ arpwatch_search_data(mailserver_delivery) + arpwatch_manage_tmp_files(mta_user_agent) + +- ifdef(`hide_broken_symptoms',` +- arpwatch_dontaudit_rw_packet_sockets(mta_user_agent) +- ') +- + optional_policy(` + cron_read_system_job_tmp_files(mta_user_agent) + ') + ') + ++ifdef(`hide_broken_symptoms',` ++ domain_dontaudit_leaks(user_mail_domain) ++ domain_dontaudit_leaks(mta_user_agent) ++') ++ + ######################################## + # + # Mailserver delivery local policy + # + +-allow mailserver_delivery self:fifo_file rw_fifo_file_perms; ++allow mailserver_delivery self:fifo_file rw_inherited_fifo_file_perms; + + allow mailserver_delivery mail_spool_t:dir list_dir_perms; + create_files_pattern(mailserver_delivery, mail_spool_t, mail_spool_t) +@@ -331,44 +376,48 @@ append_files_pattern(mailserver_delivery, mail_spool_t, mail_spool_t) + create_lnk_files_pattern(mailserver_delivery, mail_spool_t, mail_spool_t) + read_lnk_files_pattern(mailserver_delivery, mail_spool_t, mail_spool_t) + ++userdom_search_admin_dir(mailserver_delivery) ++read_files_pattern(mailserver_delivery, mail_home_t, mail_home_t) ++ + manage_dirs_pattern(mailserver_delivery, mail_home_rw_t, mail_home_rw_t) +-manage_files_pattern(mailserver_delivery, { mail_home_t mail_home_rw_t }, { mail_home_t mail_home_rw_t }) ++manage_files_pattern(mailserver_delivery, mail_home_rw_t, mail_home_rw_t) + manage_lnk_files_pattern(mailserver_delivery, mail_home_rw_t, mail_home_rw_t) +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_t, file, ".esmtp_queue") +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_t, file, ".forward") +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_t, file, ".mailrc") +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_t, file, "dead.letter") +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_rw_t, dir, "Maildir") +-userdom_user_home_dir_filetrans(mailserver_delivery, mail_home_rw_t, dir, ".maildir") + + read_files_pattern(mailserver_delivery, system_mail_tmp_t, system_mail_tmp_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(mailserver_delivery) +- fs_manage_cifs_files(mailserver_delivery) +- fs_read_cifs_symlinks(mailserver_delivery) ++optional_policy(` ++ dovecot_manage_spool(mailserver_delivery) ++ dovecot_domtrans_deliver(mailserver_delivery) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(mailserver_delivery) +- fs_manage_nfs_files(mailserver_delivery) +- fs_read_nfs_symlinks(mailserver_delivery) ++optional_policy(` ++ logwatch_search_cache_dir(mailserver_delivery) + ') + + optional_policy(` +- arpwatch_search_data(mailserver_delivery) ++ # so MTA can access /var/lib/mailman/mail/wrapper ++ files_search_var_lib(mailserver_delivery) ++ ++ mailman_domtrans(mailserver_delivery) ++ mailman_read_data_symlinks(mailserver_delivery) + ') + + optional_policy(` +- dovecot_manage_spool(mailserver_delivery) +- dovecot_domtrans_deliver(mailserver_delivery) ++ mailman_manage_data_files(mailserver_domain) ++ mailman_domtrans(mailserver_domain) ++ mailman_append_log(mailserver_domain) ++ mailman_read_log(mailserver_domain) + ') + + optional_policy(` +- files_search_var_lib(mailserver_delivery) ++ mta_filetrans_home_content(mailserver_domain) ++ mta_filetrans_admin_home_content(mailserver_domain) ++ mta_read_home(mailserver_domain) ++ mta_append_home(mailserver_domain) ++') + +- mailman_domtrans(mailserver_delivery) +- mailman_read_data_symlinks(mailserver_delivery) ++optional_policy(` ++ pcp_read_lib_files(mailserver_delivery) + ') + + optional_policy(` +@@ -381,24 +430,49 @@ optional_policy(` + + ######################################## + # +-# User local policy ++# User send mail local policy + # + +-manage_files_pattern(user_mail_t, mail_home_t, mail_home_t) +-userdom_user_home_dir_filetrans(user_mail_t, mail_home_t, file, ".esmtp_queue") +-userdom_user_home_dir_filetrans(user_mail_t, mail_home_t, file, ".forward") +-userdom_user_home_dir_filetrans(user_mail_t, mail_home_t, file, ".mailrc") +-userdom_user_home_dir_filetrans(user_mail_t, mail_home_t, file, "dead.letter") ++domain_use_interactive_fds(user_mail_t) ++ ++userdom_use_inherited_user_terminals(user_mail_t) ++# Write to the user domain tty. cjp: why? ++userdom_use_inherited_user_terminals(mta_user_agent) ++# Create dead.letter in user home directories. ++userdom_manage_user_home_content_files(user_mail_t) ++userdom_filetrans_home_content(user_mail_t) ++# for reading .forward - maybe we need a new type for it? ++# also for delivering mail to maildir ++userdom_manage_user_home_content_dirs(mailserver_delivery) ++userdom_manage_user_home_content_files(mailserver_delivery) ++userdom_manage_user_home_content_symlinks(mailserver_delivery) ++userdom_manage_user_home_content_pipes(mailserver_delivery) ++userdom_manage_user_home_content_sockets(mailserver_delivery) ++allow mailserver_delivery mailserver_delivery:fifo_file rw_inherited_fifo_file_perms; ++ ++# Read user temporary files. ++userdom_read_user_tmp_files(user_mail_t) ++userdom_dontaudit_append_user_tmp_files(user_mail_t) ++# cjp: this should probably be read all user tmp ++# files in an appropriate place for mta_user_agent ++userdom_read_user_tmp_files(mta_user_agent) + + dev_read_sysfs(user_mail_t) + +-userdom_use_user_terminals(user_mail_t) ++tunable_policy(`use_samba_home_dirs',` ++ fs_manage_cifs_files(user_mail_t) ++ fs_manage_cifs_symlinks(user_mail_t) ++') + + optional_policy(` +- allow user_mail_t self:capability dac_override; ++ allow user_mail_t self:capability {dac_read_search dac_override }; + ++ # Read user temporary files. ++ # postfix seems to need write access if the file handle is opened read/write + userdom_rw_user_tmp_files(user_mail_t) + + postfix_read_config(user_mail_t) + postfix_list_spool(user_mail_t) + ') ++ ++ +diff --git a/munin.fc b/munin.fc +index eb4b72a92a..4ea6ce7e29 100644 +--- a/munin.fc ++++ b/munin.fc +@@ -1,77 +1,78 @@ +-/etc/munin(/.*)? gen_context(system_u:object_r:munin_etc_t,s0) +- ++/etc/munin(/.*)? gen_context(system_u:object_r:munin_etc_t,s0) + /etc/rc\.d/init\.d/munin-node -- gen_context(system_u:object_r:munin_initrc_exec_t,s0) + +-/usr/bin/munin-.* -- gen_context(system_u:object_r:munin_exec_t,s0) +- +-/usr/sbin/munin-.* -- gen_context(system_u:object_r:munin_exec_t,s0) +- ++/usr/bin/munin-.* -- gen_context(system_u:object_r:munin_exec_t,s0) ++/usr/sbin/munin-.* -- gen_context(system_u:object_r:munin_exec_t,s0) + /usr/share/munin/munin-.* -- gen_context(system_u:object_r:munin_exec_t,s0) + ++# label all plugins as unconfined_munin_plugin_exec_t + /usr/share/munin/plugins/.* -- gen_context(system_u:object_r:unconfined_munin_plugin_exec_t,s0) + +-/usr/share/munin/plugins/diskstat.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) ++# disk plugins ++/usr/share/munin/plugins/diskstat.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/df.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/hddtemp.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/smart_.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/hddtemp.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/smart_.* -- gen_context(system_u:object_r:disk_munin_plugin_exec_t,s0) + +-/usr/share/munin/plugins/courier_mta_.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/exim_mail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/mailman -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/mailscanner -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/postfix_mail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/sendmail_.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/qmail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++# mail plugins ++/usr/share/munin/plugins/courier_mta_.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/exim_mail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/mailman -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/mailscanner -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/postfix_mail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/sendmail_.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/qmail.* -- gen_context(system_u:object_r:mail_munin_plugin_exec_t,s0) + +-/usr/share/munin/plugins/apache_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/asterisk_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/http_loadtime -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/fail2ban -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++# services plugins ++/usr/share/munin/plugins/apache_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/asterisk_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/http_loadtime -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/fail2ban -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/lpstat -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/mysql_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/mysql_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/named -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/ntp_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/nut.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/openvpn -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/ping_ -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/postgres_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/openvpn -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/ping_ -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/postgres_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/samba -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/slapd_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/snmp_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/squid_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/tomcat_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/varnish_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/slapd_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/snmp_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/squid_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/tomcat_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/varnish_.* -- gen_context(system_u:object_r:services_munin_plugin_exec_t,s0) + ++# selinux plugins + /usr/share/munin/plugins/selinux_avcstat -- gen_context(system_u:object_r:selinux_munin_plugin_exec_t,s0) + ++# system plugins + /usr/share/munin/plugins/acpi -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/cpu.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/forks -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/if_.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/iostat.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/interrupts -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/irqstats -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/iostat.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/interrupts -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/irqstats -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/load -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/memory -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/munin_.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/netstat -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/netstat -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/nfs.* -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/open_files -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/proc_pri -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/processes -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/open_files -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/proc_pri -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/processes -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/swap -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/threads -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) ++/usr/share/munin/plugins/threads -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/unbound -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/uptime -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + /usr/share/munin/plugins/users -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) +-/usr/share/munin/plugins/yum -- gen_context(system_u:object_r:system_munin_plugin_exec_t,s0) + +-/var/lib/munin(/.*)? gen_context(system_u:object_r:munin_var_lib_t,s0) ++/var/lib/munin(/.*)? gen_context(system_u:object_r:munin_var_lib_t,s0) + /var/lib/munin/plugin-state(/.*)? gen_context(system_u:object_r:munin_plugin_state_t,s0) +- +-/var/log/munin.* gen_context(system_u:object_r:munin_log_t,s0) +- +-/var/run/munin.* gen_context(system_u:object_r:munin_var_run_t,s0) +- +-/var/www/html/munin(/.*)? gen_context(system_u:object_r:httpd_munin_content_t,s0) +-/var/www/html/munin/cgi(/.*)? gen_context(system_u:object_r:httpd_munin_script_exec_t,s0) ++/var/log/munin.* gen_context(system_u:object_r:munin_log_t,s0) ++/var/run/munin(/.*)? gen_context(system_u:object_r:munin_var_run_t,s0) ++/var/www/html/munin(/.*)? gen_context(system_u:object_r:munin_content_t,s0) ++/var/www/html/munin/cgi(/.*)? gen_context(system_u:object_r:munin_script_exec_t,s0) ++/var/www/html/cgi/munin.* gen_context(system_u:object_r:munin_script_exec_t,s0) ++/var/www/cgi-bin/munin.* gen_context(system_u:object_r:munin_script_exec_t,s0) +diff --git a/munin.if b/munin.if +index b744fe35ea..cb0e2af61a 100644 +--- a/munin.if ++++ b/munin.if +@@ -1,12 +1,13 @@ +-## Munin network-wide load graphing. ++## Munin network-wide load graphing (formerly LRRD) + +-####################################### ++######################################## + ## +-## The template to define a munin plugin domain. ++## Create a set of derived types for various ++## munin plugins, + ## +-## ++## + ## +-## Domain prefix to be used. ++## The name to be used for deriving type names. + ## + ## + # +@@ -14,12 +15,8 @@ template(`munin_plugin_template',` + gen_require(` + attribute munin_plugin_domain, munin_plugin_tmp_content; + type munin_t; +- ') + +- ######################################## +- # +- # Declarations +- # ++ ') + + type $1_munin_plugin_t, munin_plugin_domain; + type $1_munin_plugin_exec_t; +@@ -33,15 +30,22 @@ template(`munin_plugin_template',` + files_tmp_file($1_munin_plugin_tmp_t) + + ######################################## +- # +- # Policy +- # ++ # ++ # Policy ++ # + ++ # automatic transition rules from munin domain ++ # to specific munin plugin domain + domtrans_pattern(munin_t, $1_munin_plugin_exec_t, $1_munin_plugin_t) + + manage_files_pattern($1_munin_plugin_t, $1_munin_plugin_tmp_t, $1_munin_plugin_tmp_t) + manage_dirs_pattern($1_munin_plugin_t, $1_munin_plugin_tmp_t, $1_munin_plugin_tmp_t) + files_tmp_filetrans($1_munin_plugin_t, $1_munin_plugin_tmp_t, { dir file }) ++ ++ kernel_read_system_state($1_munin_plugin_t) ++ ++ corenet_all_recvfrom_unlabeled($1_munin_plugin_t) ++ corenet_all_recvfrom_netlabel($1_munin_plugin_t) + ') + + ######################################## +@@ -66,7 +70,7 @@ interface(`munin_stream_connect',` + + ####################################### + ## +-## Read munin configuration content. ++## Read munin configuration files. + ## + ## + ## +@@ -80,15 +84,92 @@ interface(`munin_read_config',` + type munin_etc_t; + ') + +- files_search_etc($1) + allow $1 munin_etc_t:dir list_dir_perms; + allow $1 munin_etc_t:file read_file_perms; + allow $1 munin_etc_t:lnk_file read_lnk_file_perms; ++ files_search_etc($1) ++') ++ ++####################################### ++## ++## Read munin library files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`munin_read_var_lib_files',` ++ gen_require(` ++ type munin_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, munin_var_lib_t, munin_var_lib_t) ++ ++') ++ ++####################################### ++## ++## Manage munin library files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`munin_manage_var_lib_files',` ++ gen_require(` ++ type munin_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, munin_var_lib_t, munin_var_lib_t) ++') ++ ++####################################### ++## ++## Append munin library files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`munin_append_var_lib_files',` ++ gen_require(` ++ type munin_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ append_files_pattern($1, munin_var_lib_t, munin_var_lib_t) ++ ++') ++ ++###################################### ++## ++## dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`munin_dontaudit_leaks',` ++ gen_require(` ++ type munin_t; ++ ') ++ ++ dontaudit $1 munin_t:tcp_socket { read write }; + ') + + ####################################### + ## +-## Append munin log files. ++## Append to the munin log. + ## + ## + ## +@@ -147,8 +228,8 @@ interface(`munin_dontaudit_search_lib',` + + ######################################## + ## +-## All of the rules required to +-## administrate an munin environment. ++## All of the rules required to administrate ++## an munin environment + ## + ## + ## +@@ -157,7 +238,7 @@ interface(`munin_dontaudit_search_lib',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the munin domain. + ## + ## + ## +@@ -167,11 +248,15 @@ interface(`munin_admin',` + attribute munin_plugin_domain, munin_plugin_tmp_content; + type munin_t, munin_etc_t, munin_tmp_t; + type munin_log_t, munin_var_lib_t, munin_var_run_t; +- type httpd_munin_content_t, munin_plugin_state_t, munin_initrc_exec_t; ++ type munin_content_t, munin_plugin_state_t, munin_initrc_exec_t; + ') + +- allow $1 { munin_plugin_domain munin_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { munin_plugin_domain munin_t }) ++ allow $1 munin_t:process signal_perms; ++ ps_process_pattern($1, munin_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 munin_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, munin_initrc_exec_t) + domain_system_change_exemption($1) +@@ -193,5 +278,5 @@ interface(`munin_admin',` + files_list_pids($1) + admin_pattern($1, munin_var_run_t) + +- admin_pattern($1, httpd_munin_content_t) ++ admin_pattern($1, munin_content_t) + ') +diff --git a/munin.te b/munin.te +index b70870816b..7d87f0a806 100644 +--- a/munin.te ++++ b/munin.te +@@ -44,41 +44,40 @@ files_tmpfs_file(services_munin_plugin_tmpfs_t) + munin_plugin_template(system) + munin_plugin_template(unconfined) + ++type munin_script_tmp_t alias httpd_munin_script_tmp_t; ++files_tmp_file(munin_script_tmp_t) ++ + ################################ + # + # Common munin plugin local policy + # + +-allow munin_plugin_domain self:process signal; ++allow munin_plugin_domain self:process signal_perms; + allow munin_plugin_domain self:fifo_file rw_fifo_file_perms; + + allow munin_plugin_domain munin_t:tcp_socket rw_socket_perms; + + read_lnk_files_pattern(munin_plugin_domain, munin_etc_t, munin_etc_t) + ++allow munin_plugin_domain munin_unconfined_plugin_exec_t:file read_file_perms; ++ + allow munin_plugin_domain munin_exec_t:file read_file_perms; + + allow munin_plugin_domain munin_var_lib_t:dir search_dir_perms; + + manage_files_pattern(munin_plugin_domain, munin_plugin_state_t, munin_plugin_state_t) + +-kernel_read_system_state(munin_plugin_domain) +- +-corenet_all_recvfrom_unlabeled(munin_plugin_domain) +-corenet_all_recvfrom_netlabel(munin_plugin_domain) + corenet_tcp_sendrecv_generic_if(munin_plugin_domain) + corenet_tcp_sendrecv_generic_node(munin_plugin_domain) + + corecmd_exec_bin(munin_plugin_domain) + corecmd_exec_shell(munin_plugin_domain) + +-files_read_etc_files(munin_plugin_domain) +-files_read_usr_files(munin_plugin_domain) + files_search_var_lib(munin_plugin_domain) + + fs_getattr_all_fs(munin_plugin_domain) + +-miscfiles_read_localization(munin_plugin_domain) ++auth_read_passwd(munin_plugin_domain) + + optional_policy(` + nscd_use(munin_plugin_domain) +@@ -89,7 +88,7 @@ optional_policy(` + # Local policy + # + +-allow munin_t self:capability { chown dac_override kill setgid setuid sys_rawio }; ++allow munin_t self:capability { chown dac_read_search dac_override kill setgid setuid sys_rawio }; + dontaudit munin_t self:capability sys_tty_config; + allow munin_t self:process { getsched setsched signal_perms }; + allow munin_t self:unix_stream_socket { accept connectto listen }; +@@ -118,7 +117,7 @@ manage_dirs_pattern(munin_t, munin_var_lib_t, munin_var_lib_t) + manage_files_pattern(munin_t, munin_var_lib_t, munin_var_lib_t) + manage_lnk_files_pattern(munin_t, munin_var_lib_t, munin_var_lib_t) + +-read_files_pattern(munin_t, munin_plugin_state_t, munin_plugin_state_t) ++rw_files_pattern(munin_t, munin_plugin_state_t, munin_plugin_state_t) + + manage_dirs_pattern(munin_t, munin_var_run_t, munin_var_run_t) + manage_files_pattern(munin_t, munin_var_run_t, munin_var_run_t) +@@ -134,7 +133,6 @@ kernel_read_all_sysctls(munin_t) + corecmd_exec_bin(munin_t) + corecmd_exec_shell(munin_t) + +-corenet_all_recvfrom_unlabeled(munin_t) + corenet_all_recvfrom_netlabel(munin_t) + corenet_tcp_sendrecv_generic_if(munin_t) + corenet_tcp_sendrecv_generic_node(munin_t) +@@ -157,7 +155,6 @@ domain_use_interactive_fds(munin_t) + domain_read_all_domains_state(munin_t) + + files_read_etc_runtime_files(munin_t) +-files_read_usr_files(munin_t) + files_list_spool(munin_t) + + fs_getattr_all_fs(munin_t) +@@ -169,7 +166,6 @@ logging_send_syslog_msg(munin_t) + logging_read_all_logs(munin_t) + + miscfiles_read_fonts(munin_t) +-miscfiles_read_localization(munin_t) + miscfiles_setattr_fonts_cache_dirs(munin_t) + + sysnet_exec_ifconfig(munin_t) +@@ -177,13 +173,6 @@ sysnet_exec_ifconfig(munin_t) + userdom_dontaudit_use_unpriv_user_fds(munin_t) + userdom_dontaudit_search_user_home_dirs(munin_t) + +-optional_policy(` +- apache_content_template(munin) +- +- manage_dirs_pattern(munin_t, httpd_munin_content_t, httpd_munin_content_t) +- manage_files_pattern(munin_t, httpd_munin_content_t, httpd_munin_content_t) +- apache_search_sys_content(munin_t) +-') + + optional_policy(` + cron_system_entry(munin_t, munin_exec_t) +@@ -217,7 +206,6 @@ optional_policy(` + + optional_policy(` + postfix_list_spool(munin_t) +- postfix_getattr_all_spool_files(munin_t) + ') + + optional_policy(` +@@ -246,21 +234,23 @@ allow disk_munin_plugin_t self:tcp_socket create_stream_socket_perms; + + rw_files_pattern(disk_munin_plugin_t, munin_var_lib_t, munin_var_lib_t) + ++kernel_read_fs_sysctls(disk_munin_plugin_t) ++ + corenet_sendrecv_hddtemp_client_packets(disk_munin_plugin_t) + corenet_tcp_connect_hddtemp_port(disk_munin_plugin_t) + corenet_tcp_sendrecv_hddtemp_port(disk_munin_plugin_t) + +-dev_getattr_all_blk_files(disk_munin_plugin_t) ++files_read_etc_runtime_files(disk_munin_plugin_t) ++ + dev_getattr_lvm_control(disk_munin_plugin_t) + dev_read_sysfs(disk_munin_plugin_t) + dev_read_urand(disk_munin_plugin_t) +- +-files_read_etc_runtime_files(disk_munin_plugin_t) ++dev_read_all_blk_files(disk_munin_plugin_t) + + fs_getattr_all_fs(disk_munin_plugin_t) + fs_getattr_all_dirs(disk_munin_plugin_t) + +-storage_getattr_fixed_disk_dev(disk_munin_plugin_t) ++storage_raw_read_fixed_disk(disk_munin_plugin_t) + + sysnet_read_config(disk_munin_plugin_t) + +@@ -272,34 +262,50 @@ optional_policy(` + fstools_exec(disk_munin_plugin_t) + ') + ++optional_policy(` ++ rpc_search_nfs_state_data(disk_munin_plugin_t) ++') ++ + #################################### + # + # Mail local policy + # + +-allow mail_munin_plugin_t self:capability dac_override; ++allow mail_munin_plugin_t self:capability { dac_read_search dac_override }; ++ ++allow mail_munin_plugin_t self:tcp_socket create_stream_socket_perms; ++allow mail_munin_plugin_t self:netlink_route_socket r_netlink_socket_perms; ++allow mail_munin_plugin_t self:udp_socket create_socket_perms; + + rw_files_pattern(mail_munin_plugin_t, munin_var_lib_t, munin_var_lib_t) + ++kernel_read_net_sysctls(mail_munin_plugin_t) ++ + dev_read_urand(mail_munin_plugin_t) + + logging_read_generic_logs(mail_munin_plugin_t) + ++sysnet_read_config(mail_munin_plugin_t) ++ ++optional_policy(` ++ exim_read_log(mail_munin_plugin_t) ++') ++ + optional_policy(` +- mta_list_queue(mail_munin_plugin_t) + mta_read_config(mail_munin_plugin_t) +- mta_read_queue(mail_munin_plugin_t) + mta_send_mail(mail_munin_plugin_t) ++ mta_list_queue(mail_munin_plugin_t) ++ mta_read_queue(mail_munin_plugin_t) + ') + + optional_policy(` +- nscd_use(mail_munin_plugin_t) ++ nscd_socket_use(mail_munin_plugin_t) + ') + + optional_policy(` +- postfix_getattr_all_spool_files(mail_munin_plugin_t) + postfix_read_config(mail_munin_plugin_t) + postfix_list_spool(mail_munin_plugin_t) ++ postfix_getattr_spool_files(mail_munin_plugin_t) + ') + + optional_policy(` +@@ -339,7 +345,7 @@ dev_read_rand(services_munin_plugin_t) + sysnet_read_config(services_munin_plugin_t) + + optional_policy(` +- bind_read_config(munin_services_plugin_t) ++ bind_read_config(services_munin_plugin_t) + ') + + optional_policy(` +@@ -347,6 +353,10 @@ optional_policy(` + cups_stream_connect(services_munin_plugin_t) + ') + ++optional_policy(` ++ fail2ban_domtrans_client(services_munin_plugin_t) ++') ++ + optional_policy(` + lpd_exec_lpr(services_munin_plugin_t) + ') +@@ -361,7 +371,11 @@ optional_policy(` + ') + + optional_policy(` +- nscd_use(services_munin_plugin_t) ++ nscd_socket_use(services_munin_plugin_t) ++') ++ ++optional_policy(` ++ ntp_exec(services_munin_plugin_t) + ') + + optional_policy(` +@@ -393,6 +407,7 @@ read_files_pattern(system_munin_plugin_t, munin_log_t, munin_log_t) + + kernel_read_network_state(system_munin_plugin_t) + kernel_read_all_sysctls(system_munin_plugin_t) ++kernel_read_fs_sysctls(system_munin_plugin_t) + + dev_read_sysfs(system_munin_plugin_t) + dev_read_urand(system_munin_plugin_t) +@@ -421,3 +436,33 @@ optional_policy(` + optional_policy(` + unconfined_domain(unconfined_munin_plugin_t) + ') ++ ++ ++####################################### ++# ++# Munin CGI script local policy ++# ++ ++apache_content_template(munin) ++apache_content_alias_template(munin, munin) ++ ++manage_dirs_pattern(munin_t, munin_content_t, munin_content_t) ++manage_files_pattern(munin_t, munin_content_t, munin_content_t) ++ ++manage_dirs_pattern(munin_script_t, munin_script_tmp_t, munin_script_tmp_t) ++manage_files_pattern(munin_script_t, munin_script_tmp_t,munin_script_tmp_t) ++files_tmp_filetrans(munin_script_t, munin_script_tmp_t, { dir file }) ++ ++read_files_pattern(munin_script_t, munin_var_lib_t, munin_var_lib_t) ++list_dirs_pattern(munin_script_t, munin_etc_t, munin_etc_t) ++read_files_pattern(munin_script_t, munin_etc_t, munin_etc_t) ++ ++manage_files_pattern(munin_script_t, munin_log_t, munin_log_t) ++ ++files_search_var_lib(munin_script_t) ++ ++auth_read_passwd(munin_script_t) ++ ++optional_policy(` ++ apache_search_sys_content(munin_t) ++') +diff --git a/mysql.fc b/mysql.fc +index 06f8666df6..3099f74f56 100644 +--- a/mysql.fc ++++ b/mysql.fc +@@ -1,27 +1,47 @@ +-HOME_DIR/\.my\.cnf -- gen_context(system_u:object_r:mysqld_home_t,s0) +- +-/etc/my\.cnf -- gen_context(system_u:object_r:mysqld_etc_t,s0) +-/etc/my\.cnf\.d(/.*)? gen_context(system_u:object_r:mysqld_etc_t,s0) +-/etc/mysql(/.*)? gen_context(system_u:object_r:mysqld_etc_t,s0) +- +-/etc/rc\.d/init\.d/mysqld? -- gen_context(system_u:object_r:mysqld_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/mysqlmanager -- gen_context(system_u:object_r:mysqlmanagerd_initrc_exec_t,s0) +- ++# mysql database server ++ ++# ++# /HOME ++# ++HOME_DIR/\.my\.cnf -- gen_context(system_u:object_r:mysqld_home_t, s0) ++/root/\.my\.cnf -- gen_context(system_u:object_r:mysqld_home_t, s0) ++ ++/usr/lib/systemd/system/mysqld.* -- gen_context(system_u:object_r:mysqld_unit_file_t,s0) ++/usr/lib/systemd/system/mariadb.* -- gen_context(system_u:object_r:mysqld_unit_file_t,s0) ++ ++# ++# /etc ++# ++/etc/my\.cnf -- gen_context(system_u:object_r:mysqld_etc_t,s0) ++/etc/mysql(/.*)? gen_context(system_u:object_r:mysqld_etc_t,s0) ++/etc/my\.cnf\.d(/.*)? gen_context(system_u:object_r:mysqld_etc_t,s0) ++/etc/rc\.d/init\.d/mysqld -- gen_context(system_u:object_r:mysqld_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/mysqlmanager -- gen_context(system_u:object_r:mysqlmanagerd_initrc_exec_t,s0) ++ ++# ++# /usr ++# + /usr/bin/mysqld_safe -- gen_context(system_u:object_r:mysqld_safe_exec_t,s0) ++/usr/bin/mysqld_safe_helper -- gen_context(system_u:object_r:mysqld_exec_t,s0) + /usr/bin/mysql_upgrade -- gen_context(system_u:object_r:mysqld_exec_t,s0) + + /usr/libexec/mysqld -- gen_context(system_u:object_r:mysqld_exec_t,s0) ++/usr/libexec/mysqld_safe-scl-helper -- gen_context(system_u:object_r:mysqld_safe_exec_t,s0) ++ + + /usr/sbin/mysqld(-max)? -- gen_context(system_u:object_r:mysqld_exec_t,s0) + /usr/sbin/mysqlmanager -- gen_context(system_u:object_r:mysqlmanagerd_exec_t,s0) +-/usr/sbin/ndbd -- gen_context(system_u:object_r:mysqld_exec_t,s0) ++/usr/sbin/ndbd -- gen_context(system_u:object_r:mysqld_exec_t,s0) + +-/var/lib/mysql(/.*)? gen_context(system_u:object_r:mysqld_db_t,s0) +-/var/lib/mysql/mysql.* -s gen_context(system_u:object_r:mysqld_var_run_t,s0) ++# ++# /var ++# ++/var/lib/mysql(-files|-keyring)?(/.*)? gen_context(system_u:object_r:mysqld_db_t,s0) ++/var/lib/mysql/mysql\.sock -s gen_context(system_u:object_r:mysqld_var_run_t,s0) + + /var/log/mariadb(/.*)? gen_context(system_u:object_r:mysqld_log_t,s0) + /var/log/mysql.* -- gen_context(system_u:object_r:mysqld_log_t,s0) + +-/var/run/mysqld.* gen_context(system_u:object_r:mysqld_var_run_t,s0) +-/var/run/mysqlmanager.* -- gen_context(system_u:object_r:mysqlmanagerd_var_run_t,s0) +-/var/run/mysqld/mysqlmanager.* -- gen_context(system_u:object_r:mysqlmanagerd_var_run_t,s0) ++/var/run/mariadb(/.*)? gen_context(system_u:object_r:mysqld_var_run_t,s0) ++/var/run/mysqld(/.*)? gen_context(system_u:object_r:mysqld_var_run_t,s0) ++/var/run/mysqld/mysqlmanager.* -- gen_context(system_u:object_r:mysqlmanagerd_var_run_t,s0) +diff --git a/mysql.if b/mysql.if +index 687af38bbd..5381f1b390 100644 +--- a/mysql.if ++++ b/mysql.if +@@ -1,23 +1,4 @@ +-## Open source database. +- +-######################################## +-## +-## Role access for mysql. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-interface(`mysql_role',` +- refpolicywarn(`$0($*) has been deprecated') +-') ++## Policy for MySQL + + ###################################### + ## +@@ -34,38 +15,30 @@ interface(`mysql_domtrans',` + type mysqld_t, mysqld_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, mysqld_exec_t, mysqld_t) + ') + +-######################################## ++###################################### + ## +-## Execute mysqld in the mysqld domain, and +-## allow the specified role the mysqld domain. ++## Execute MySQL in the caller domain. + ## + ## + ## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`mysql_run_mysqld',` ++interface(`mysql_exec',` + gen_require(` +- attribute_role mysqld_roles; ++ type mysqld_exec_t; + ') + +- mysql_domtrans($1) +- roleattribute $2 mysqld_roles; ++ can_exec($1, mysqld_exec_t) + ') + + ######################################## + ## +-## Send generic signals to mysqld. ++## Send a generic signal to MySQL. + ## + ## + ## +@@ -81,9 +54,27 @@ interface(`mysql_signal',` + allow $1 mysqld_t:process signal; + ') + ++####################################### ++## ++## Send a null signal to mysql. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mysql_signull',` ++ gen_require(` ++ type mysqld_t; ++ ') ++ ++ allow $1 mysqld_t:process signull; ++') ++ + ######################################## + ## +-## Connect to mysqld with a tcp socket. ++## Allow the specified domain to connect to postgresql with a tcp socket. + ## + ## + ## +@@ -104,8 +95,7 @@ interface(`mysql_tcp_connect',` + + ######################################## + ## +-## Connect to mysqld with a unix +-# domain stream socket. ++## Connect to MySQL using a unix domain stream socket. + ## + ## + ## +@@ -120,12 +110,13 @@ interface(`mysql_stream_connect',` + ') + + files_search_pids($1) +- stream_connect_pattern($1, { mysqld_db_t mysqld_var_run_t }, mysqld_var_run_t, mysqld_t) ++ stream_connect_pattern($1, mysqld_var_run_t, mysqld_var_run_t, mysqld_t) ++ stream_connect_pattern($1, mysqld_db_t, mysqld_var_run_t, mysqld_t) + ') + + ######################################## + ## +-## Read mysqld configuration content. ++## Read MySQL configuration files. + ## + ## + ## +@@ -139,7 +130,6 @@ interface(`mysql_read_config',` + type mysqld_etc_t; + ') + +- files_search_etc($1) + allow $1 mysqld_etc_t:dir list_dir_perms; + allow $1 mysqld_etc_t:file read_file_perms; + allow $1 mysqld_etc_t:lnk_file read_lnk_file_perms; +@@ -147,7 +137,8 @@ interface(`mysql_read_config',` + + ######################################## + ## +-## Search mysqld db directories. ++## Search the directories that contain MySQL ++## database storage. + ## + ## + ## +@@ -155,6 +146,8 @@ interface(`mysql_read_config',` + ## + ## + # ++# cjp: "_dir" in the name is added to clarify that this ++# is not searching the database itself. + interface(`mysql_search_db',` + gen_require(` + type mysqld_db_t; +@@ -166,7 +159,27 @@ interface(`mysql_search_db',` + + ######################################## + ## +-## Read and write mysqld database directories. ++## List the directories that contain MySQL ++## database storage. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mysql_list_db',` ++ gen_require(` ++ type mysqld_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 mysqld_db_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Read and write to the MySQL database directory. + ## + ## + ## +@@ -185,8 +198,7 @@ interface(`mysql_rw_db_dirs',` + + ######################################## + ## +-## Create, read, write, and delete +-## mysqld database directories. ++## Create, read, write, and delete MySQL database directories. + ## + ## + ## +@@ -205,7 +217,7 @@ interface(`mysql_manage_db_dirs',` + + ####################################### + ## +-## Append mysqld database files. ++## Append to the MySQL database directory. + ## + ## + ## +@@ -221,10 +233,28 @@ interface(`mysql_append_db_files',` + files_search_var_lib($1) + append_files_pattern($1, mysqld_db_t, mysqld_db_t) + ') ++####################################### ++## ++## Read and write to the MySQL database directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mysql_read_db_lnk_files',` ++ gen_require(` ++ type mysqld_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_lnk_files_pattern($1, mysqld_db_t, mysqld_db_t) ++') + + ####################################### + ## +-## Read and write mysqld database files. ++## Read and write to the MySQL database directory. + ## + ## + ## +@@ -243,8 +273,7 @@ interface(`mysql_rw_db_files',` + + ####################################### + ## +-## Create, read, write, and delete +-## mysqld database files. ++## Create, read, write, and delete MySQL database files. + ## + ## + ## +@@ -263,7 +292,7 @@ interface(`mysql_manage_db_files',` + + ######################################## + ## +-## Read and write mysqld database sockets. ++## Read and write to the MySQL database + ## named socket. + ## + ## +@@ -273,13 +302,18 @@ interface(`mysql_manage_db_files',` + ## + # + interface(`mysql_rw_db_sockets',` +- refpolicywarn(`$0($*) has been deprecated.') ++ gen_require(` ++ type mysqld_db_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 mysqld_db_t:dir search_dir_perms; ++ allow $1 mysqld_db_t:sock_file rw_sock_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## mysqld home files. ++## Write to the MySQL log. + ## + ## + ## +@@ -287,86 +321,92 @@ interface(`mysql_rw_db_sockets',` + ## + ## + # +-interface(`mysql_manage_mysqld_home_files',` ++interface(`mysql_write_log',` + gen_require(` +- type mysqld_home_t; ++ type mysqld_log_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 mysqld_home_t:file manage_file_perms; ++ logging_search_logs($1) ++ allow $1 mysqld_log_t:file { write_file_perms setattr_file_perms }; + ') + +-######################################## ++###################################### + ## +-## Relabel mysqld home files. ++## Execute MySQL safe script in the mysql safe domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`mysql_relabel_mysqld_home_files',` ++interface(`mysql_domtrans_mysql_safe',` + gen_require(` +- type mysqld_home_t; ++ type mysqld_safe_t, mysqld_safe_exec_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 mysqld_home_t:file relabel_file_perms; ++ domtrans_pattern($1, mysqld_safe_exec_t, mysqld_safe_t) + ') + +-######################################## ++###################################### + ## +-## Create objects in user home +-## directories with the mysqld home type. ++## Execute MySQL_safe in the caller domain. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## ++# ++interface(`mysql_safe_exec',` ++ gen_require(` ++ type mysqld_safe_exec_t; ++ ') ++ ++ can_exec($1, mysqld_safe_exec_t) ++') ++ ++##################################### ++## ++## Read MySQL PID files. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## + # +-interface(`mysql_home_filetrans_mysqld_home',` ++interface(`mysql_read_pid_files',` + gen_require(` +- type mysqld_home_t; ++ type mysqld_var_run_t; + ') + +- userdom_user_home_dir_filetrans($1, mysqld_home_t, $2, $3) ++ mysql_search_pid_files($1) ++ read_files_pattern($1, mysqld_var_run_t, mysqld_var_run_t) + ') + +-######################################## ++##################################### + ## +-## Write mysqld log files. ++## Search MySQL PID files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## + # +-interface(`mysql_write_log',` ++interface(`mysql_search_pid_files',` + gen_require(` +- type mysqld_log_t; ++ type mysqld_var_run_t; + ') + +- logging_search_logs($1) +- allow $1 mysqld_log_t:file write_file_perms; ++ search_dirs_pattern($1, mysqld_var_run_t, mysqld_var_run_t) + ') + +-###################################### ++######################################## + ## +-## Execute mysqld safe in the +-## mysqld safe domain. ++## Execute mysqld server in the mysqld domain. + ## + ## + ## +@@ -374,18 +414,23 @@ interface(`mysql_write_log',` + ## + ## + # +-interface(`mysql_domtrans_mysql_safe',` ++interface(`mysql_systemctl',` + gen_require(` +- type mysqld_safe_t, mysqld_safe_exec_t; ++ type mysqld_unit_file_t; ++ type mysqld_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, mysqld_safe_exec_t, mysqld_safe_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 mysqld_unit_file_t:file read_file_perms; ++ allow $1 mysqld_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, mysqld_t) + ') + +-##################################### ++######################################## + ## +-## Read mysqld pid files. ++## read mysqld homedir content (.k5login) + ## + ## + ## +@@ -393,39 +438,37 @@ interface(`mysql_domtrans_mysql_safe',` + ## + ## + # +-interface(`mysql_read_pid_files',` ++interface(`mysql_read_home_content',` + gen_require(` +- type mysqld_var_run_t; ++ type mysqld_home_t; + ') + +- files_search_pids($1) +- read_files_pattern($1, mysqld_var_run_t, mysqld_var_run_t) ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, mysqld_home_t, mysqld_home_t) + ') + +-##################################### ++######################################## + ## +-## Search mysqld pid files. ++## Transition to mysqld named content + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`mysql_search_pid_files',` ++interface(`mysql_filetrans_named_content',` + gen_require(` +- type mysqld_var_run_t; ++ type mysqld_home_t; + ') + +- files_search_pids($1) +- search_dirs_pattern($1, mysqld_var_run_t, mysqld_var_run_t) ++ userdom_admin_home_dir_filetrans($1, mysqld_home_t, file, ".my.cnf") ++ userdom_user_home_dir_filetrans($1, mysqld_home_t, file, ".my.cnf") + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an mysqld environment. ++## All of the rules required to administrate an mysql environment + ## + ## + ## +@@ -434,41 +477,52 @@ interface(`mysql_search_pid_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the mysql domain. + ## + ## + ## + # + interface(`mysql_admin',` + gen_require(` +- type mysqld_t, mysqld_var_run_t, mysqld_etc_t; ++ type mysqld_t, mysqld_var_run_t, mysqld_initrc_exec_t; + type mysqld_tmp_t, mysqld_db_t, mysqld_log_t; +- type mysqld_safe_t, mysqlmanagerd_t, mysqlmanagerd_var_run_t; +- type mysqld_initrc_exec_t, mysqlmanagerd_initrc_exec_t, mysqld_home_t; ++ type mysqld_etc_t; ++ type mysqld_home_t; ++ type mysqld_unit_file_t; + ') + +- allow $1 { mysqld_safe_t mysqld_t mysqlmanagerd_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { mysqld_safe_t mysqld_t mysqlmanagerd_t }) ++ allow $1 mysqld_t:process signal_perms; ++ ps_process_pattern($1, mysqld_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mysqld_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, { mysqlmanagerd_initrc_exec_t mysqld_initrc_exec_t }) ++ init_labeled_script_domtrans($1, mysqld_initrc_exec_t) + domain_system_change_exemption($1) +- role_transition $2 { mysqlmanagerd_initrc_exec_t mysqld_initrc_exec_t } system_r; ++ role_transition $2 mysqld_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_pids($1) +- admin_pattern($1, { mysqlmanagerd_var_run_t mysqld_var_run_t }) ++ files_list_pids($1) ++ admin_pattern($1, mysqld_var_run_t) + +- files_search_var_lib($1) + admin_pattern($1, mysqld_db_t) + +- files_search_etc($1) +- admin_pattern($1, { mysqld_etc_t mysqld_home_t }) ++ files_list_etc($1) ++ admin_pattern($1, mysqld_etc_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, mysqld_log_t) + +- files_search_tmp($1) ++ files_list_tmp($1) + admin_pattern($1, mysqld_tmp_t) + +- mysql_run_mysqld($1, $2) ++ userdom_search_user_home_dirs($1) ++ files_list_root($1) ++ admin_pattern($1, mysqld_home_t) ++ ++ mysql_systemctl($1) ++ admin_pattern($1, mysqld_unit_file_t) ++ allow $1 mysqld_unit_file_t:service all_service_perms; ++ ++ mysql_stream_connect($1) + ') +diff --git a/mysql.te b/mysql.te +index 7584bbe7cd..34251389c7 100644 +--- a/mysql.te ++++ b/mysql.te +@@ -6,20 +6,15 @@ policy_module(mysql, 1.14.1) + # + + ## +-##

      +-## Determine whether mysqld can +-## connect to all TCP ports. +-##

      ++##

      ++## Allow mysqld to connect to all ports ++##

      + ##
      + gen_tunable(mysql_connect_any, false) + +-attribute_role mysqld_roles; +- + type mysqld_t; + type mysqld_exec_t; + init_daemon_domain(mysqld_t, mysqld_exec_t) +-application_domain(mysqld_t, mysqld_exec_t) +-role mysqld_roles types mysqld_t; + + type mysqld_safe_t; + type mysqld_safe_exec_t; +@@ -27,7 +22,6 @@ init_daemon_domain(mysqld_safe_t, mysqld_safe_exec_t) + + type mysqld_var_run_t; + files_pid_file(mysqld_var_run_t) +-init_daemon_run_dir(mysqld_var_run_t, "mysqld") + + type mysqld_db_t; + files_type(mysqld_db_t) +@@ -38,6 +32,9 @@ files_config_file(mysqld_etc_t) + type mysqld_home_t; + userdom_user_home_content(mysqld_home_t) + ++type mysqld_unit_file_t; ++systemd_unit_file(mysqld_unit_file_t) ++ + type mysqld_initrc_exec_t; + init_script_file(mysqld_initrc_exec_t) + +@@ -62,89 +59,112 @@ files_pid_file(mysqlmanagerd_var_run_t) + # Local policy + # + +-allow mysqld_t self:capability { dac_override ipc_lock setgid setuid sys_resource }; ++allow mysqld_t self:capability { dac_read_search dac_override ipc_lock setgid setuid sys_nice sys_resource net_bind_service }; + dontaudit mysqld_t self:capability sys_tty_config; + allow mysqld_t self:process { setsched getsched setrlimit signal_perms rlimitinh }; + allow mysqld_t self:fifo_file rw_fifo_file_perms; + allow mysqld_t self:shm create_shm_perms; +-allow mysqld_t self:unix_stream_socket { accept listen }; +-allow mysqld_t self:tcp_socket { accept listen }; ++allow mysqld_t self:unix_stream_socket create_stream_socket_perms; ++allow mysqld_t self:tcp_socket create_stream_socket_perms; ++allow mysqld_t self:udp_socket create_socket_perms; + + manage_dirs_pattern(mysqld_t, mysqld_db_t, mysqld_db_t) + manage_files_pattern(mysqld_t, mysqld_db_t, mysqld_db_t) ++manage_sock_files_pattern(mysqld_t, mysqld_db_t, mysqld_db_t) + manage_lnk_files_pattern(mysqld_t, mysqld_db_t, mysqld_db_t) + files_var_lib_filetrans(mysqld_t, mysqld_db_t, { dir file lnk_file }) ++allow mysqld_t mysqld_db_t:file map; + +-filetrans_pattern(mysqld_t, mysqld_db_t, mysqld_var_run_t, sock_file) +- +-allow mysqld_t mysqld_etc_t:dir list_dir_perms; +-allow mysqld_t { mysqld_etc_t mysqld_home_t }:file read_file_perms; ++allow mysqld_t mysqld_etc_t:file read_file_perms; + allow mysqld_t mysqld_etc_t:lnk_file read_lnk_file_perms; ++allow mysqld_t mysqld_etc_t:dir list_dir_perms; + + manage_dirs_pattern(mysqld_t, mysqld_log_t, mysqld_log_t) + manage_files_pattern(mysqld_t, mysqld_log_t, mysqld_log_t) + manage_lnk_files_pattern(mysqld_t, mysqld_log_t, mysqld_log_t) ++manage_fifo_files_pattern(mysqld_t, mysqld_log_t, mysqld_log_t) + logging_log_filetrans(mysqld_t, mysqld_log_t, { dir file }) + + manage_dirs_pattern(mysqld_t, mysqld_tmp_t, mysqld_tmp_t) + manage_files_pattern(mysqld_t, mysqld_tmp_t, mysqld_tmp_t) + files_tmp_filetrans(mysqld_t, mysqld_tmp_t, { file dir }) ++allow mysqld_t mysqld_tmp_t:file map; + + manage_dirs_pattern(mysqld_t, mysqld_var_run_t, mysqld_var_run_t) + manage_files_pattern(mysqld_t, mysqld_var_run_t, mysqld_var_run_t) + manage_sock_files_pattern(mysqld_t, mysqld_var_run_t, mysqld_var_run_t) + files_pid_filetrans(mysqld_t, mysqld_var_run_t, { dir file sock_file }) + +-kernel_read_kernel_sysctls(mysqld_t) ++userdom_dontaudit_use_unpriv_user_fds(mysqld_t) ++ + kernel_read_network_state(mysqld_t) + kernel_read_system_state(mysqld_t) ++kernel_read_kernel_sysctls(mysqld_t) ++ ++corecmd_exec_bin(mysqld_t) ++corecmd_exec_shell(mysqld_t) + +-corenet_all_recvfrom_unlabeled(mysqld_t) + corenet_all_recvfrom_netlabel(mysqld_t) + corenet_tcp_sendrecv_generic_if(mysqld_t) ++corenet_udp_sendrecv_generic_if(mysqld_t) + corenet_tcp_sendrecv_generic_node(mysqld_t) ++corenet_udp_sendrecv_generic_node(mysqld_t) ++corenet_tcp_sendrecv_all_ports(mysqld_t) ++corenet_udp_sendrecv_all_ports(mysqld_t) + corenet_tcp_bind_generic_node(mysqld_t) +- +-corenet_sendrecv_mysqld_server_packets(mysqld_t) + corenet_tcp_bind_mysqld_port(mysqld_t) +-corenet_sendrecv_mysqld_client_packets(mysqld_t) ++corenet_tcp_bind_tram_port(mysqld_t) + corenet_tcp_connect_mysqld_port(mysqld_t) +-corenet_tcp_sendrecv_mysqld_port(mysqld_t) ++corenet_tcp_connect_tram_port(mysqld_t) ++corenet_sendrecv_mysqld_client_packets(mysqld_t) ++corenet_sendrecv_mysqld_server_packets(mysqld_t) + +-corecmd_exec_bin(mysqld_t) +-corecmd_exec_shell(mysqld_t) ++can_exec(mysqld_t, mysqld_exec_t) + + dev_read_sysfs(mysqld_t) + dev_read_urand(mysqld_t) + +-domain_use_interactive_fds(mysqld_t) +- + fs_getattr_all_fs(mysqld_t) + fs_search_auto_mountpoints(mysqld_t) + fs_rw_hugetlbfs_files(mysqld_t) + ++domain_use_interactive_fds(mysqld_t) ++domain_read_all_domains_state(mysqld_t) ++ ++files_getattr_var_lib_dirs(mysqld_t) + files_read_etc_runtime_files(mysqld_t) +-files_read_usr_files(mysqld_t) ++files_search_var_lib(mysqld_t) ++files_search_pids(mysqld_t) ++files_getattr_all_sockets(mysqld_t) + +-auth_use_nsswitch(mysqld_t) ++auth_use_pam(mysqld_t) + + logging_send_syslog_msg(mysqld_t) + +-miscfiles_read_localization(mysqld_t) ++sysnet_read_config(mysqld_t) ++sysnet_exec_ifconfig(mysqld_t) + +-userdom_search_user_home_dirs(mysqld_t) +-userdom_dontaudit_use_unpriv_user_fds(mysqld_t) ++ifdef(`distro_redhat',` ++ filetrans_pattern(mysqld_t, mysqld_db_t, mysqld_var_run_t, sock_file) ++') + + tunable_policy(`mysql_connect_any',` +- corenet_sendrecv_all_client_packets(mysqld_t) + corenet_tcp_connect_all_ports(mysqld_t) +- corenet_tcp_sendrecv_all_ports(mysqld_t) ++ corenet_sendrecv_all_client_packets(mysqld_t) + ') + + optional_policy(` + daemontools_service_domain(mysqld_t, mysqld_exec_t) + ') + ++optional_policy(` ++ openshift_search_lib(mysqld_t) ++') ++ ++optional_policy(` ++ rhcs_manage_cluster_pid_files(mysqld_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(mysqld_t) + ') +@@ -155,21 +175,20 @@ optional_policy(` + + ####################################### + # +-# Safe local policy ++# Local mysqld_safe policy + # + +-allow mysqld_safe_t self:capability { chown dac_override fowner kill }; ++allow mysqld_safe_t self:capability { chown dac_read_search dac_override setgid setuid fowner kill sys_nice sys_resource }; ++dontaudit mysqld_safe_t self:capability sys_ptrace; + allow mysqld_safe_t self:process { setsched getsched setrlimit }; + allow mysqld_safe_t self:fifo_file rw_fifo_file_perms; + +-allow mysqld_safe_t mysqld_t:process signull; ++allow mysqld_safe_t mysqld_t:process { rlimitinh noatsecure }; + + read_lnk_files_pattern(mysqld_safe_t, mysqld_db_t, mysqld_db_t) +-manage_files_pattern(mysqld_safe_t, mysqld_db_t, mysqld_db_t) ++delete_sock_files_pattern(mysqld_safe_t, mysqld_db_t, mysqld_db_t) + +-allow mysqld_safe_t mysqld_etc_t:dir list_dir_perms; +-allow mysqld_safe_t { mysqld_etc_t mysqld_home_t }:file read_file_perms; +-allow mysqld_safe_t mysqld_etc_t:lnk_file read_lnk_file_perms; ++domtrans_pattern(mysqld_safe_t, mysqld_exec_t, mysqld_t) + + list_dirs_pattern(mysqld_safe_t, mysqld_log_t, mysqld_log_t) + manage_files_pattern(mysqld_safe_t, mysqld_log_t, mysqld_log_t) +@@ -177,31 +196,39 @@ manage_lnk_files_pattern(mysqld_safe_t, mysqld_log_t, mysqld_log_t) + logging_log_filetrans(mysqld_safe_t, mysqld_log_t, file) + + manage_files_pattern(mysqld_safe_t, mysqld_var_run_t, mysqld_var_run_t) +-delete_sock_files_pattern(mysqld_safe_t, { mysqld_db_t mysqld_var_run_t }, mysqld_var_run_t) +- +-domtrans_pattern(mysqld_safe_t, mysqld_exec_t, mysqld_t) ++delete_sock_files_pattern(mysqld_safe_t, mysqld_var_run_t, mysqld_var_run_t) + + kernel_read_system_state(mysqld_safe_t) + kernel_read_kernel_sysctls(mysqld_safe_t) + ++can_exec(mysqld_safe_t, mysqld_safe_exec_t) ++ + corecmd_exec_bin(mysqld_safe_t) + corecmd_exec_shell(mysqld_safe_t) + ++dev_read_urand(mysqld_safe_t) + dev_list_sysfs(mysqld_safe_t) + + domain_read_all_domains_state(mysqld_safe_t) + +-files_read_etc_files(mysqld_safe_t) +-files_read_usr_files(mysqld_safe_t) +-files_search_pids(mysqld_safe_t) +-files_dontaudit_getattr_all_dirs(mysqld_safe_t) ++files_dontaudit_access_check_root(mysqld_safe_t) + files_dontaudit_search_all_mountpoints(mysqld_safe_t) ++files_dontaudit_getattr_all_dirs(mysqld_safe_t) + ++files_write_root_dirs(mysqld_safe_t) ++ ++logging_log_filetrans(mysqld_safe_t, mysqld_log_t, file) + logging_send_syslog_msg(mysqld_safe_t) + +-miscfiles_read_localization(mysqld_safe_t) ++auth_use_nsswitch(mysqld_safe_t) ++ ++domain_dontaudit_signull_all_domains(mysqld_safe_t) + +-userdom_search_user_home_dirs(mysqld_safe_t) ++mysql_manage_db_files(mysqld_safe_t) ++mysql_read_config(mysqld_safe_t) ++mysql_search_pid_files(mysqld_safe_t) ++mysql_signull(mysqld_safe_t) ++mysql_write_log(mysqld_safe_t) + + optional_policy(` + hostname_exec(mysqld_safe_t) +@@ -209,20 +236,21 @@ optional_policy(` + + ######################################## + # +-# Manager local policy ++# MySQL Manager Policy + # + +-allow mysqlmanagerd_t self:capability { dac_override kill }; ++allow mysqlmanagerd_t self:capability { dac_read_search dac_override kill }; + allow mysqlmanagerd_t self:process signal; + allow mysqlmanagerd_t self:fifo_file rw_fifo_file_perms; + allow mysqlmanagerd_t self:tcp_socket create_stream_socket_perms; + allow mysqlmanagerd_t self:unix_stream_socket create_stream_socket_perms; + +-allow mysqlmanagerd_t mysqld_t:process signal; +- +-allow mysqlmanagerd_t mysqld_etc_t:dir list_dir_perms; +-allow mysqlmanagerd_t { mysqld_etc_t mysqld_home_t }:file read_file_perms; +-allow mysqlmanagerd_t mysqld_etc_t:lnk_file read_lnk_file_perms; ++mysql_read_config(initrc_t) ++mysql_read_config(mysqlmanagerd_t) ++mysql_read_pid_files(mysqlmanagerd_t) ++mysql_search_db(mysqlmanagerd_t) ++mysql_signal(mysqlmanagerd_t) ++mysql_stream_connect(mysqlmanagerd_t) + + domtrans_pattern(mysqlmanagerd_t, mysqld_exec_t, mysqld_t) + +@@ -230,31 +258,20 @@ manage_files_pattern(mysqlmanagerd_t, mysqld_var_run_t, mysqlmanagerd_var_run_t) + manage_sock_files_pattern(mysqlmanagerd_t, mysqld_var_run_t, mysqlmanagerd_var_run_t) + filetrans_pattern(mysqlmanagerd_t, mysqld_var_run_t, mysqlmanagerd_var_run_t, { file sock_file }) + +-stream_connect_pattern(mysqlmanagerd_t, { mysqld_db_t mysqld_var_run_t }, mysqld_var_run_t, mysqld_t) +- + kernel_read_system_state(mysqlmanagerd_t) + + corecmd_exec_shell(mysqlmanagerd_t) + +-corenet_all_recvfrom_unlabeled(mysqlmanagerd_t) + corenet_all_recvfrom_netlabel(mysqlmanagerd_t) + corenet_tcp_sendrecv_generic_if(mysqlmanagerd_t) + corenet_tcp_sendrecv_generic_node(mysqlmanagerd_t) ++corenet_tcp_sendrecv_all_ports(mysqlmanagerd_t) + corenet_tcp_bind_generic_node(mysqlmanagerd_t) +- +-corenet_sendrecv_mysqlmanagerd_server_packets(mysqlmanagerd_t) + corenet_tcp_bind_mysqlmanagerd_port(mysqlmanagerd_t) +-corenet_sendrecv_mysqlmanagerd_client_packets(mysqlmanagerd_t) + corenet_tcp_connect_mysqlmanagerd_port(mysqlmanagerd_t) +-corenet_tcp_sendrecv_mysqlmanagerd_port(mysqlmanagerd_t) ++corenet_sendrecv_mysqlmanagerd_server_packets(mysqlmanagerd_t) ++corenet_sendrecv_mysqlmanagerd_client_packets(mysqlmanagerd_t) + + dev_read_urand(mysqlmanagerd_t) + +-files_read_etc_files(mysqlmanagerd_t) +-files_read_usr_files(mysqlmanagerd_t) +-files_search_pids(mysqlmanagerd_t) +-files_search_var_lib(mysqlmanagerd_t) +- +-miscfiles_read_localization(mysqlmanagerd_t) +- +-userdom_search_user_home_dirs(mysqlmanagerd_t) ++userdom_getattr_user_home_dirs(mysqlmanagerd_t) +diff --git a/mythtv.fc b/mythtv.fc +new file mode 100644 +index 0000000000..d62cf886e6 +--- /dev/null ++++ b/mythtv.fc +@@ -0,0 +1,9 @@ ++/usr/share/mythweb/mythweb\.pl -- gen_context(system_u:object_r:mythtv_script_exec_t,s0) ++ ++/var/lib/mythtv(/.*)? gen_context(system_u:object_r:mythtv_var_lib_t,s0) ++ ++/var/log/mythtv(/.*)? gen_context(system_u:object_r:mythtv_var_log_t,s0) ++ ++/usr/share/mythtv(/.*)? gen_context(system_u:object_r:mythtv_content_t,s0) ++/usr/share/mythweb(/.*)? gen_context(system_u:object_r:mythtv_content_t,s0) ++/usr/share/mythtv/mythweather/scripts(/.*)? gen_context(system_u:object_r:mythtv_script_exec_t,s0) +diff --git a/mythtv.if b/mythtv.if +new file mode 100644 +index 0000000000..e2403dd506 +--- /dev/null ++++ b/mythtv.if +@@ -0,0 +1,152 @@ ++ ++## policy for mythtv_script ++ ++######################################## ++## ++## Execute TEMPLATE in the mythtv_script domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mythtv_script_domtrans',` ++ gen_require(` ++ type mythtv_script_t, mythtv_script_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, mythtv_script_exec_t, mythtv_script_t) ++') ++ ++####################################### ++## ++## read mythtv libs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mythtv_read_lib',` ++ gen_require(` ++ type mythtv_var_lib_t; ++ ') ++ ++ read_files_pattern($1, mythtv_var_lib_t, mythtv_var_lib_t) ++ files_list_var_lib($1) ++') ++ ++####################################### ++## ++## Create, read, write, and delete ++## mythtv lib content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mythtv_manage_lib',` ++ gen_require(` ++ type mythtv_var_lib_t; ++ ') ++ ++ manage_files_pattern($1, mythtv_var_lib_t, mythtv_var_lib_t) ++ manage_lnk_files_pattern($1, mythtv_var_lib_t, mythtv_var_lib_t) ++ files_list_var_lib($1) ++') ++ ++####################################### ++## ++## read mythtv logs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mythtv_read_log',` ++ gen_require(` ++ type mythtv_var_log_t; ++ ') ++ ++ read_files_pattern($1, mythtv_var_log_t, mythtv_var_log_t) ++ logging_search_logs($1) ++') ++ ++####################################### ++## ++## Append mythtv log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mythtv_append_log',` ++ gen_require(` ++ type mythtv_var_log_t; ++ ') ++ ++ append_files_pattern($1, mythtv_var_log_t, mythtv_var_log_t) ++ logging_search_logs($1) ++') ++ ++####################################### ++## ++## Create, read, write, and delete ++## mythtv log content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`mythtv_manage_log',` ++ gen_require(` ++ type mythtv_var_log_t; ++ ') ++ ++ manage_files_pattern($1, mythtv_var_log_t, mythtv_var_log_t) ++ manage_lnk_files_pattern($1, mythtv_var_log_t, mythtv_var_log_t) ++ logging_search_logs($1) ++') ++ ++######################################## ++## ++## All of the rules required to ++## administrate an mythtv environment. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`mythtv_admin',` ++ gen_require(` ++ type mythtv_script_t, mythtv_var_lib_t; ++ type mythtv_var_log_t; ++ ') ++ ++ allow $1 mythtv_script_t:process signal_perms; ++ ps_process_pattern($1, mythtv_script_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 mythtv_script_t:process ptrace; ++ ') ++ ++ logging_list_logs($1) ++ admin_pattern($1, mythtv_var_log_t) ++ ++ files_list_var_lib($1) ++ admin_pattern($1, mythtv_var_lib_t) ++') +diff --git a/mythtv.te b/mythtv.te +new file mode 100644 +index 0000000000..0e585e3c51 +--- /dev/null ++++ b/mythtv.te +@@ -0,0 +1,47 @@ ++policy_module(mythtv, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++apache_content_template(mythtv) ++apache_content_alias_template(mythtv, mythtv) ++ ++type mythtv_var_lib_t; ++files_type(mythtv_var_lib_t) ++ ++type mythtv_var_log_t; ++logging_log_file(mythtv_var_log_t) ++ ++######################################## ++# ++# mythtv_script local policy ++# ++#============= httpd_mythtv_script_t ============== ++allow httpd_mythtv_script_t self:process setpgid; ++dev_list_sysfs(httpd_mythtv_script_t) ++ ++manage_files_pattern(mythtv_script_t, mythtv_var_lib_t, mythtv_var_lib_t) ++manage_dirs_pattern(mythtv_script_t, mythtv_var_lib_t, mythtv_var_lib_t) ++files_var_lib_filetrans(mythtv_script_t, mythtv_var_lib_t, { dir file }) ++ ++manage_files_pattern(mythtv_script_t, mythtv_var_log_t, mythtv_var_log_t) ++manage_dirs_pattern(mythtv_script_t, mythtv_var_log_t, mythtv_var_log_t) ++logging_log_filetrans(mythtv_script_t, mythtv_var_log_t, file ) ++ ++domain_use_interactive_fds(mythtv_script_t) ++ ++files_read_etc_files(mythtv_script_t) ++ ++fs_read_nfs_files(mythtv_script_t) ++ ++auth_read_passwd(httpd_mythtv_script_t) ++ ++miscfiles_read_localization(httpd_mythtv_script_t) ++ ++optional_policy(` ++ mysql_read_config(mythtv_script_t) ++ mysql_stream_connect(mythtv_script_t) ++ mysql_tcp_connect(mythtv_script_t) ++') +diff --git a/naemon.fc b/naemon.fc +new file mode 100644 +index 0000000000..85407d3376 +--- /dev/null ++++ b/naemon.fc +@@ -0,0 +1,11 @@ ++/etc/rc\.d/init\.d/naemon -- gen_context(system_u:object_r:naemon_initrc_exec_t,s0) ++ ++/usr/bin/naemon -- gen_context(system_u:object_r:naemon_exec_t,s0) ++ ++/var/cache/naemon(/.*)? gen_context(system_u:object_r:naemon_cache_t,s0) ++ ++/var/lib/naemon(/.*)? gen_context(system_u:object_r:naemon_var_lib_t,s0) ++ ++/var/log/naemon(/.*)? gen_context(system_u:object_r:naemon_log_t,s0) ++ ++/var/run/naemon(/.*)? gen_context(system_u:object_r:naemon_var_run_t,s0) +diff --git a/naemon.if b/naemon.if +new file mode 100644 +index 0000000000..e904df0273 +--- /dev/null ++++ b/naemon.if +@@ -0,0 +1,305 @@ ++ ++## New monitoring suite that aims to be faster and more stable, while giving you a clearer view of the state of your network. ++ ++######################################## ++## ++## Execute naemon in the naemon domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`naemon_domtrans',` ++ gen_require(` ++ type naemon_t, naemon_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, naemon_exec_t, naemon_t) ++') ++ ++######################################## ++## ++## Execute naemon server in the naemon domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_initrc_domtrans',` ++ gen_require(` ++ type naemon_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, naemon_initrc_exec_t) ++') ++ ++######################################## ++## ++## Search naemon cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_search_cache',` ++ gen_require(` ++ type naemon_cache_t; ++ ') ++ ++ allow $1 naemon_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read naemon cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_read_cache_files',` ++ gen_require(` ++ type naemon_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, naemon_cache_t, naemon_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## naemon cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_manage_cache_files',` ++ gen_require(` ++ type naemon_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, naemon_cache_t, naemon_cache_t) ++') ++ ++######################################## ++## ++## Manage naemon cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_manage_cache_dirs',` ++ gen_require(` ++ type naemon_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, naemon_cache_t, naemon_cache_t) ++') ++ ++######################################## ++## ++## Read naemon's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`naemon_read_log',` ++ gen_require(` ++ type naemon_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, naemon_log_t, naemon_log_t) ++') ++ ++######################################## ++## ++## Append to naemon log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_append_log',` ++ gen_require(` ++ type naemon_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, naemon_log_t, naemon_log_t) ++') ++ ++######################################## ++## ++## Manage naemon log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_manage_log',` ++ gen_require(` ++ type naemon_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, naemon_log_t, naemon_log_t) ++ manage_files_pattern($1, naemon_log_t, naemon_log_t) ++ manage_lnk_files_pattern($1, naemon_log_t, naemon_log_t) ++') ++ ++######################################## ++## ++## Search naemon lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_search_lib',` ++ gen_require(` ++ type naemon_var_lib_t; ++ ') ++ ++ allow $1 naemon_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read naemon lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_read_lib_files',` ++ gen_require(` ++ type naemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, naemon_var_lib_t, naemon_var_lib_t) ++') ++ ++######################################## ++## ++## Manage naemon lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_manage_lib_files',` ++ gen_require(` ++ type naemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, naemon_var_lib_t, naemon_var_lib_t) ++') ++ ++######################################## ++## ++## Manage naemon lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`naemon_manage_lib_dirs',` ++ gen_require(` ++ type naemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, naemon_var_lib_t, naemon_var_lib_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an naemon environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`naemon_admin',` ++ gen_require(` ++ type naemon_t; ++ type naemon_initrc_exec_t; ++ type naemon_cache_t; ++ type naemon_log_t; ++ type naemon_var_lib_t; ++ ') ++ ++ allow $1 naemon_t:process { signal_perms }; ++ ps_process_pattern($1, naemon_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 naemon_t:process ptrace; ++ ') ++ ++ naemon_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 naemon_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ files_search_var($1) ++ admin_pattern($1, naemon_cache_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, naemon_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, naemon_var_lib_t) ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/naemon.te b/naemon.te +new file mode 100644 +index 0000000000..79f1250ebc +--- /dev/null ++++ b/naemon.te +@@ -0,0 +1,59 @@ ++policy_module(naemon, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type naemon_t; ++type naemon_exec_t; ++init_daemon_domain(naemon_t, naemon_exec_t) ++ ++type naemon_initrc_exec_t; ++init_script_file(naemon_initrc_exec_t) ++ ++type naemon_cache_t; ++files_type(naemon_cache_t) ++ ++type naemon_log_t; ++logging_log_file(naemon_log_t) ++ ++type naemon_var_lib_t; ++files_type(naemon_var_lib_t) ++ ++type naemon_var_run_t; ++files_pid_file(naemon_var_run_t) ++ ++######################################## ++# ++# naemon local policy ++# ++allow naemon_t self:process { fork setpgid setrlimit signal_perms }; ++allow naemon_t self:fifo_file rw_fifo_file_perms; ++allow naemon_t self:unix_stream_socket create_stream_socket_perms; ++allow naemon_t self:unix_stream_socket connectto; ++ ++manage_dirs_pattern(naemon_t, naemon_cache_t, naemon_cache_t) ++manage_files_pattern(naemon_t, naemon_cache_t, naemon_cache_t) ++manage_sock_files_pattern(naemon_t, naemon_cache_t, naemon_cache_t) ++files_var_filetrans(naemon_t, naemon_cache_t, { dir }) ++ ++manage_dirs_pattern(naemon_t, naemon_log_t, naemon_log_t) ++manage_files_pattern(naemon_t, naemon_log_t, naemon_log_t) ++logging_log_filetrans(naemon_t, naemon_log_t, { dir }) ++ ++manage_dirs_pattern(naemon_t, naemon_var_lib_t, naemon_var_lib_t) ++manage_files_pattern(naemon_t, naemon_var_lib_t, naemon_var_lib_t) ++manage_sock_files_pattern(naemon_t, naemon_var_lib_t, naemon_var_lib_t) ++manage_fifo_files_pattern(naemon_t, naemon_var_lib_t, naemon_var_lib_t) ++files_var_lib_filetrans(naemon_t, naemon_var_lib_t, { dir }) ++ ++manage_dirs_pattern(naemon_t, naemon_var_run_t, naemon_var_run_t) ++manage_files_pattern(naemon_t, naemon_var_run_t, naemon_var_run_t) ++files_pid_filetrans(naemon_t, naemon_var_run_t, { dir }) ++ ++kernel_read_system_state(naemon_t) ++ ++auth_read_passwd(naemon_t) ++ ++fs_getattr_xattr_fs(naemon_t) +diff --git a/nagios.fc b/nagios.fc +index d78dfc38d7..c781b72bba 100644 +--- a/nagios.fc ++++ b/nagios.fc +@@ -1,88 +1,113 @@ +-/etc/nagios(/.*)? gen_context(system_u:object_r:nagios_etc_t,s0) +-/etc/nagios/nrpe\.cfg -- gen_context(system_u:object_r:nrpe_etc_t,s0) ++/etc/nagios(/.*)? gen_context(system_u:object_r:nagios_etc_t,s0) ++/etc/icinga(/.*)? gen_context(system_u:object_r:nagios_etc_t,s0) ++/etc/nagios/nrpe\.cfg -- gen_context(system_u:object_r:nrpe_etc_t,s0) ++/etc/pnp4nagios(/.*)? gen_context(system_u:object_r:nagios_etc_t,s0) ++/etc/rc\.d/init\.d/nagios -- gen_context(system_u:object_r:nagios_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/nrpe -- gen_context(system_u:object_r:nagios_initrc_exec_t,s0) + +-/etc/rc\.d/init\.d/nagios -- gen_context(system_u:object_r:nagios_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/nrpe -- gen_context(system_u:object_r:nagios_initrc_exec_t,s0) + +-/usr/bin/nagios -- gen_context(system_u:object_r:nagios_exec_t,s0) +-/usr/bin/nrpe -- gen_context(system_u:object_r:nrpe_exec_t,s0) ++/usr/bin/nagios -- gen_context(system_u:object_r:nagios_exec_t,s0) ++/usr/bin/icinga -- gen_context(system_u:object_r:nagios_exec_t,s0) ++/usr/bin/nrpe -- gen_context(system_u:object_r:nrpe_exec_t,s0) + +-/usr/sbin/nagios -- gen_context(system_u:object_r:nagios_exec_t,s0) +-/usr/sbin/nrpe -- gen_context(system_u:object_r:nrpe_exec_t,s0) ++/usr/sbin/nagios -- gen_context(system_u:object_r:nagios_exec_t,s0) ++/usr/sbin/icinga -- gen_context(system_u:object_r:nagios_exec_t,s0) ++/usr/sbin/nrpe -- gen_context(system_u:object_r:nrpe_exec_t,s0) + +-/usr/lib/cgi-bin/nagios(/.*)? gen_context(system_u:object_r:httpd_nagios_script_exec_t,s0) +-/usr/lib/cgi-bin/netsaint(/.*)? gen_context(system_u:object_r:httpd_nagios_script_exec_t,s0) ++/usr/lib/cgi-bin/netsaint(/.*)? gen_context(system_u:object_r:nagios_script_exec_t,s0) ++/usr/lib/nagios/cgi(/.*)? gen_context(system_u:object_r:nagios_script_exec_t,s0) ++/usr/lib/icinga/cgi(/.*)? gen_context(system_u:object_r:nagios_script_exec_t,s0) + +-/usr/lib/nagios/cgi(/.*)? gen_context(system_u:object_r:httpd_nagios_script_exec_t,s0) +-/usr/lib/nagios/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_nagios_script_exec_t,s0) ++/var/log/nagios(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) ++/var/log/icinga(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) ++/var/log/netsaint(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) ++/var/log/pnp4nagios(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) + +-/usr/lib/nagios/plugins/eventhandlers(/.*) gen_context(system_u:object_r:nagios_eventhandler_plugin_exec_t,s0) ++/var/lib/pnp4nagios(/.*)? gen_context(system_u:object_r:nagios_var_lib_t,s0) ++ ++/var/run/nagios.* gen_context(system_u:object_r:nagios_var_run_t,s0) ++ ++/var/spool/nagios(/.*)? gen_context(system_u:object_r:nagios_spool_t,s0) ++/var/spool/icinga(/.*)? gen_context(system_u:object_r:nagios_spool_t,s0) + ++ifdef(`distro_debian',` ++/usr/sbin/nagios -- gen_context(system_u:object_r:nagios_exec_t,s0) ++') ++/usr/lib/cgi-bin/nagios(/.+)? gen_context(system_u:object_r:nagios_script_exec_t,s0) ++/usr/lib/nagios/cgi-bin(/.*)? gen_context(system_u:object_r:nagios_script_exec_t,s0) ++ ++# admin plugins + /usr/lib/nagios/plugins/check_file_age -- gen_context(system_u:object_r:nagios_admin_plugin_exec_t,s0) + +-/usr/lib/nagios/plugins/check_disk -- gen_context(system_u:object_r:nagios_checkdisk_plugin_exec_t,s0) ++# check disk plugins ++/usr/lib/nagios/plugins/check_disk -- gen_context(system_u:object_r:nagios_checkdisk_plugin_exec_t,s0) + /usr/lib/nagios/plugins/check_disk_smb -- gen_context(system_u:object_r:nagios_checkdisk_plugin_exec_t,s0) + /usr/lib/nagios/plugins/check_ide_smart -- gen_context(system_u:object_r:nagios_checkdisk_plugin_exec_t,s0) + /usr/lib/nagios/plugins/check_linux_raid -- gen_context(system_u:object_r:nagios_checkdisk_plugin_exec_t,s0) + +-/usr/lib/nagios/plugins/check_mailq -- gen_context(system_u:object_r:nagios_mail_plugin_exec_t,s0) +- +-/usr/lib/nagios/plugins/check_breeze -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_dummy -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_flexlm -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ifoperstatus -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ifstatus -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_load -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_log -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_mrtg -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_mrtgtraf -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_nagios -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_nwstat -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_overcr -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_procs -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_sensors -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_swap -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_users -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_wave -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) +- +-/usr/lib/nagios/plugins/check_cluster -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_dhcp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_dig -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_dns -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_game -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_fping -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_hpjd -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_http -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_icmp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ircd -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ldap -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_mysql -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_mysql_query -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_nrpe -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_nt -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ntp.* -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_oracle -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_pgsql -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ping -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_radius -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_real -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_rpc -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_tcp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_time -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_sip -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_smtp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_snmp.* -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ssh -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +-/usr/lib/nagios/plugins/check_ups -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) +- +-/usr/lib/nagios/plugins/check_by_ssh -- gen_context(system_u:object_r:nagios_unconfined_plugin_exec_t,s0) +- +-/usr/lib/pnp4nagios(/.*)? gen_context(system_u:object_r:nagios_var_lib_t,s0) +- +-/var/log/nagios(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) +-/var/log/netsaint(/.*)? gen_context(system_u:object_r:nagios_log_t,s0) +- +-/var/run/nagios.* -- gen_context(system_u:object_r:nagios_var_run_t,s0) +-/var/run/nrpe.* -- gen_context(system_u:object_r:nrpe_var_run_t,s0) +- +-/var/spool/nagios(/.*)? gen_context(system_u:object_r:nagios_spool_t,s0) ++# mail plugins ++/usr/lib/nagios/plugins/check_mailq -- gen_context(system_u:object_r:nagios_mail_plugin_exec_t,s0) ++ ++/usr/lib/pnp4nagios(/.*)? gen_context(system_u:object_r:nagios_var_lib_t,s0) ++ ++# system plugins ++/usr/lib(64)?/nagios/plugins/check_breeze -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_dummy -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_flexlm -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ifoperstatus -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ifstatus -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_load -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_log -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_mrtg -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_mrtgtraf -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_nagios -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_nwstat -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_overcr -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_procs -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_sensors -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_swap -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_users -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_wave -- gen_context(system_u:object_r:nagios_system_plugin_exec_t,s0) ++ ++# services plugins ++/usr/lib(64)?/nagios/plugins/check_cluster -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_dhcp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_dig -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_dns -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_game -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_fping -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_hpjd -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_http -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_icmp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ircd -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ldap -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_mysql -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_mysql_query -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_nrpe -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_nt -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ntp.* -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_oracle -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_pgsql -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ping -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_radius -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_real -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_rpc -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_tcp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_time -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_sip -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_smtp -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_snmp.* -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ssh -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++/usr/lib(64)?/nagios/plugins/check_ups -- gen_context(system_u:object_r:nagios_services_plugin_exec_t,s0) ++ ++# openshift plugins ++/usr/lib64/nagios/plugins/check_node_accept_status -- gen_context(system_u:object_r:nagios_openshift_plugin_exec_t,s0) ++/usr/lib64/nagios/plugins/check_number_openshift_apps -- gen_context(system_u:object_r:nagios_openshift_plugin_exec_t,s0) ++ ++# label all nagios plugin as unconfined by default ++/usr/lib/nagios/plugins/.* -- gen_context(system_u:object_r:nagios_unconfined_plugin_exec_t,s0) ++ ++# eventhandlers ++/usr/lib/nagios/plugins/eventhandlers(/.*) gen_context(system_u:object_r:nagios_eventhandler_plugin_exec_t,s0) ++/usr/lib/icinga/plugins/eventhandlers(/.*) gen_context(system_u:object_r:nagios_eventhandler_plugin_exec_t,s0) ++ +diff --git a/nagios.if b/nagios.if +index 0641e970ff..d012e9b045 100644 +--- a/nagios.if ++++ b/nagios.if +@@ -1,12 +1,13 @@ +-## Network monitoring server. ++## Net Saint / NAGIOS - network monitoring server + +-####################################### ++######################################## + ## +-## The template to define a nagios plugin domain. ++## Create a set of derived types for various ++## nagios plugins, + ## +-## ++## + ## +-## Domain prefix to be used. ++## The name to be used for deriving type names. + ## + ## + # +@@ -16,38 +17,51 @@ template(`nagios_plugin_template',` + type nagios_t, nrpe_t; + ') + +- ######################################## +- # +- # Declarations +- # +- + type nagios_$1_plugin_t, nagios_plugin_domain; + type nagios_$1_plugin_exec_t; + application_domain(nagios_$1_plugin_t, nagios_$1_plugin_exec_t) + role system_r types nagios_$1_plugin_t; + +- ######################################## +- # +- # Policy +- # +- + domtrans_pattern(nrpe_t, nagios_$1_plugin_exec_t, nagios_$1_plugin_t) + allow nagios_t nagios_$1_plugin_exec_t:file ioctl; + ++ # needed by command.cfg + domtrans_pattern(nagios_t, nagios_$1_plugin_exec_t, nagios_$1_plugin_t) ++ ++ kernel_read_system_state(nagios_$1_plugin_t) ++ ++') ++ ++######################################## ++## ++## Execute the nagios unconfined plugins with ++## a domain transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_domtrans_unconfined_plugins',` ++ gen_require(` ++ type nagios_unconfined_plugin_t; ++ type nagios_unconfined_plugin_exec_t; ++ ') ++ ++ domtrans_pattern($1, nagios_unconfined_plugin_exec_t, nagios_unconfined_plugin_t) + ') + + ######################################## + ## +-## Do not audit attempts to read or +-## write nagios unnamed pipes. ++## Do not audit attempts to read or write nagios ++## unnamed pipes. + ## + ## + ## + ## Domain to not audit. + ## + ## +-## + # + interface(`nagios_dontaudit_rw_pipes',` + gen_require(` +@@ -59,7 +73,8 @@ interface(`nagios_dontaudit_rw_pipes',` + + ######################################## + ## +-## Read nagios configuration content. ++## Allow the specified domain to read ++## nagios configuration files. + ## + ## + ## +@@ -73,15 +88,33 @@ interface(`nagios_read_config',` + type nagios_etc_t; + ') + +- files_search_etc($1) + allow $1 nagios_etc_t:dir list_dir_perms; + allow $1 nagios_etc_t:file read_file_perms; +- allow $1 nagios_etc_t:lnk_file read_lnk_file_perms; ++ files_search_etc($1) ++') ++###################################### ++## ++## Read nagios lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_read_lib',` ++ gen_require(` ++ type nagios_var_lib_t; ++ ') ++ ++ files_search_var($1) ++ list_dirs_pattern($1, nagios_var_lib_t, nagios_var_lib_t) ++ read_files_pattern($1, nagios_var_lib_t, nagios_var_lib_t) + ') + + ###################################### + ## +-## Read nagios log files. ++## Read nagios logs. + ## + ## + ## +@@ -100,8 +133,7 @@ interface(`nagios_read_log',` + + ######################################## + ## +-## Do not audit attempts to read or +-## write nagios log files. ++## Do not audit attempts to read or write nagios logs. + ## + ## + ## +@@ -132,13 +164,33 @@ interface(`nagios_search_spool',` + type nagios_spool_t; + ') + +- files_search_spool($1) + allow $1 nagios_spool_t:dir search_dir_perms; ++ files_search_spool($1) ++') ++ ++######################################## ++## ++## Append nagios spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_append_spool',` ++ gen_require(` ++ type nagios_spool_t; ++ ') ++ ++ allow $1 nagios_spool_t:file append_file_perms; ++ files_search_spool($1) + ') + + ######################################## + ## +-## Read nagios temporary files. ++## Allow the specified domain to read ++## nagios temporary files. + ## + ## + ## +@@ -151,13 +203,34 @@ interface(`nagios_read_tmp_files',` + type nagios_tmp_t; + ') + +- files_search_tmp($1) + allow $1 nagios_tmp_t:file read_file_perms; ++ files_search_tmp($1) ++') ++ ++######################################## ++## ++## Allow the specified domain to read ++## nagios temporary files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_rw_inerited_tmp_files',` ++ gen_require(` ++ type nagios_tmp_t; ++ ') ++ ++ allow $1 nagios_tmp_t:file rw_inherited_file_perms; ++ files_search_tmp($1) + ') + + ######################################## + ## +-## Execute nrpe with a domain transition. ++## Execute the nagios NRPE with ++## a domain transition. + ## + ## + ## +@@ -170,14 +243,31 @@ interface(`nagios_domtrans_nrpe',` + type nrpe_t, nrpe_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, nrpe_exec_t, nrpe_t) + ') + ++###################################### ++## ++## Do not audit attempts to write nrpe daemon unnamed pipes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_dontaudit_write_pipes_nrpe',` ++ gen_require(` ++ type nrpe_t; ++ ') ++ ++ dontaudit $1 nrpe_t:fifo_file write; ++') ++ + ######################################## + ## +-## All of the rules required to +-## administrate an nagios environment. ++## All of the rules required to administrate ++## an nagios environment + ## + ## + ## +@@ -186,44 +276,61 @@ interface(`nagios_domtrans_nrpe',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the nagios domain. + ## + ## + ## + # + interface(`nagios_admin',` + gen_require(` +- attribute nagios_plugin_domain; + type nagios_t, nrpe_t, nagios_initrc_exec_t; +- type nagios_tmp_t, nagios_log_t, nagios_var_lib_t; +- type nagios_etc_t, nrpe_etc_t, nrpe_var_run_t; +- type nagios_spool_t, nagios_var_run_t, nagios_system_plugin_tmp_t; +- type nagios_eventhandler_plugin_tmp_t; ++ type nagios_tmp_t, nagios_log_t, nagios_var_run_t; ++ type nagios_etc_t, nrpe_etc_t, nagios_spool_t; + ') + +- allow $1 { nagios_t nrpe_t nagios_plugin_domain }:process { ptrace signal_perms }; +- ps_process_pattern($1, { nagios_t nrpe_t nagios_plugin_domain }) ++ allow $1 nagios_t:process signal_perms; ++ ps_process_pattern($1, nagios_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 nagios_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, nagios_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 nagios_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_tmp($1) +- admin_pattern($1, { nagios_eventhandler_plugin_tmp_t nagios_tmp_t nagios_system_plugin_tmp_t }) ++ files_list_tmp($1) ++ admin_pattern($1, nagios_tmp_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, nagios_log_t) + +- files_search_etc($1) +- admin_pattern($1, { nrpe_etc_t nagios_etc_t }) ++ files_list_etc($1) ++ admin_pattern($1, nagios_etc_t) + +- files_search_spool($1) ++ files_list_spool($1) + admin_pattern($1, nagios_spool_t) + +- files_search_pids($1) +- admin_pattern($1, { nrpe_var_run_t nagios_var_run_t }) ++ files_list_pids($1) ++ admin_pattern($1, nagios_var_run_t) ++ ++ admin_pattern($1, nrpe_etc_t) ++') ++ ++######################################## ++## ++## Send a null signal to nagios_unconfined_plugin. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nagios_unconfined_signull',` ++ gen_require(` ++ type nagios_unconfined_plugin_t; ++ ') + +- files_search_var_lib($1) +- admin_pattern($1, nagios_var_lib_t) ++ allow $1 nagios_unconfined_plugin_t:process signull; + ') +diff --git a/nagios.te b/nagios.te +index 7b3e682e6f..ad6f9cb62b 100644 +--- a/nagios.te ++++ b/nagios.te +@@ -5,6 +5,33 @@ policy_module(nagios, 1.13.0) + # Declarations + # + ++## ++##

      ++## Allow nagios/nrpe to call sudo from NRPE utils scripts. ++##

      ++##
      ++gen_tunable(nagios_run_sudo, false) ++ ++## ++##

      ++## Allow nagios run in conjunction with PNP4Nagios. ++##

      ++##
      ++gen_tunable(nagios_run_pnp4nagios, false) ++ ++## ++##

      ++## Determine whether Nagios, NRPE can ++## access nfs file systems. ++##

      ++##
      ++gen_tunable(nagios_use_nfs, false) ++ ++gen_require(` ++ class passwd rootok; ++ class passwd passwd; ++') ++ + attribute nagios_plugin_domain; + + type nagios_t; +@@ -27,7 +54,7 @@ type nagios_var_run_t; + files_pid_file(nagios_var_run_t) + + type nagios_spool_t; +-files_type(nagios_spool_t) ++files_spool_file(nagios_spool_t) + + type nagios_var_lib_t; + files_type(nagios_var_lib_t) +@@ -39,6 +66,7 @@ nagios_plugin_template(services) + nagios_plugin_template(system) + nagios_plugin_template(unconfined) + nagios_plugin_template(eventhandler) ++nagios_plugin_template(openshift) + + type nagios_eventhandler_plugin_tmp_t; + files_tmp_file(nagios_eventhandler_plugin_tmp_t) +@@ -46,6 +74,9 @@ files_tmp_file(nagios_eventhandler_plugin_tmp_t) + type nagios_system_plugin_tmp_t; + files_tmp_file(nagios_system_plugin_tmp_t) + ++type nagios_openshift_plugin_tmp_t; ++files_tmp_file(nagios_openshift_plugin_tmp_t) ++ + type nrpe_t; + type nrpe_exec_t; + init_daemon_domain(nrpe_t, nrpe_exec_t) +@@ -63,44 +94,52 @@ files_pid_file(nrpe_var_run_t) + + allow nagios_plugin_domain self:fifo_file rw_fifo_file_perms; + ++allow nrpe_t nagios_plugin_domain:process { signal sigkill }; ++ ++allow nagios_t nagios_plugin_domain:process signal_perms; ++allow nagios_plugin_domain nagios_t:process signal_perms; ++ ++# cjp: leaked file descriptor + dontaudit nagios_plugin_domain nrpe_t:tcp_socket { read write }; + dontaudit nagios_plugin_domain nagios_log_t:file { read write }; + +-kernel_read_system_state(nagios_plugin_domain) ++corecmd_exec_bin(nagios_plugin_domain) + + dev_read_urand(nagios_plugin_domain) + dev_read_rand(nagios_plugin_domain) ++dev_read_sysfs(nagios_plugin_domain) + +-files_read_usr_files(nagios_plugin_domain) +- +-miscfiles_read_localization(nagios_plugin_domain) +- +-userdom_use_user_terminals(nagios_plugin_domain) ++userdom_use_inherited_user_ptys(nagios_plugin_domain) ++userdom_use_inherited_user_ttys(nagios_plugin_domain) + + ######################################## + # + # Nagios local policy + # + +-allow nagios_t self:capability { dac_override setgid setuid }; ++allow nagios_t self:capability { chown dac_read_search dac_override setgid setuid }; + dontaudit nagios_t self:capability sys_tty_config; + allow nagios_t self:process { setpgid signal_perms }; + allow nagios_t self:fifo_file rw_fifo_file_perms; + allow nagios_t self:tcp_socket { accept listen }; ++allow nagios_t self:unix_stream_socket { connectto }; + + allow nagios_t nagios_plugin_domain:process signal_perms; + + allow nagios_t nagios_eventhandler_plugin_exec_t:dir list_dir_perms; + + allow nagios_t nagios_etc_t:dir list_dir_perms; +-allow nagios_t nagios_etc_t:file read_file_perms; ++allow nagios_t nagios_etc_t:file { read_file_perms map }; + allow nagios_t nagios_etc_t:lnk_file read_lnk_file_perms; + +-allow nagios_t nagios_log_t:dir setattr_dir_perms; +-append_files_pattern(nagios_t, nagios_log_t, nagios_log_t) +-create_files_pattern(nagios_t, nagios_log_t, nagios_log_t) +-setattr_files_pattern(nagios_t, nagios_log_t, nagios_log_t) +-logging_log_filetrans(nagios_t, nagios_log_t, file) ++#allow nagios_t nagios_log_t:dir setattr_dir_perms; ++#append_files_pattern(nagios_t, nagios_log_t, nagios_log_t) ++#create_files_pattern(nagios_t, nagios_log_t, nagios_log_t) ++#setattr_files_pattern(nagios_t, nagios_log_t, nagios_log_t) ++manage_files_pattern(nagios_t, nagios_log_t, nagios_log_t) ++manage_dirs_pattern(nagios_t, nagios_log_t, nagios_log_t) ++logging_log_filetrans(nagios_t, nagios_log_t, { dir file }) ++allow nagios_t nagios_log_t:file map; + + manage_dirs_pattern(nagios_t, nagios_tmp_t, nagios_tmp_t) + manage_files_pattern(nagios_t, nagios_tmp_t, nagios_tmp_t) +@@ -110,11 +149,15 @@ manage_files_pattern(nagios_t, nagios_var_run_t, nagios_var_run_t) + files_pid_filetrans(nagios_t, nagios_var_run_t, file) + + manage_fifo_files_pattern(nagios_t, nagios_spool_t, nagios_spool_t) +-files_spool_filetrans(nagios_t, nagios_spool_t, fifo_file) ++manage_files_pattern(nagios_t, nagios_spool_t, nagios_spool_t) ++manage_sock_files_pattern(nagios_t, nagios_spool_t, nagios_spool_t) ++files_spool_filetrans(nagios_t, nagios_spool_t, { file fifo_file }) ++allow nagios_t nagios_spool_t:file map; + + manage_files_pattern(nagios_t, nagios_var_lib_t, nagios_var_lib_t) + manage_fifo_files_pattern(nagios_t, nagios_var_lib_t, nagios_var_lib_t) +-files_var_lib_filetrans(nagios_t, nagios_var_lib_t, { file fifo_file }) ++manage_dirs_pattern(nagios_t, nagios_var_lib_t, nagios_var_lib_t) ++files_var_lib_filetrans(nagios_t, nagios_var_lib_t, { dir file fifo_file }) + + kernel_read_system_state(nagios_t) + kernel_read_kernel_sysctls(nagios_t) +@@ -123,7 +166,6 @@ kernel_read_software_raid_state(nagios_t) + corecmd_exec_bin(nagios_t) + corecmd_exec_shell(nagios_t) + +-corenet_all_recvfrom_unlabeled(nagios_t) + corenet_all_recvfrom_netlabel(nagios_t) + corenet_tcp_sendrecv_generic_if(nagios_t) + corenet_tcp_sendrecv_generic_node(nagios_t) +@@ -143,18 +185,16 @@ domain_read_all_domains_state(nagios_t) + + files_read_etc_runtime_files(nagios_t) + files_read_kernel_symbol_table(nagios_t) +-files_read_usr_files(nagios_t) + files_search_spool(nagios_t) + + fs_getattr_all_fs(nagios_t) + fs_search_auto_mountpoints(nagios_t) ++fs_search_cgroup_dirs(nagios_t) + + auth_use_nsswitch(nagios_t) + + logging_send_syslog_msg(nagios_t) + +-miscfiles_read_localization(nagios_t) +- + userdom_dontaudit_use_unpriv_user_fds(nagios_t) + userdom_dontaudit_search_user_home_dirs(nagios_t) + +@@ -162,6 +202,60 @@ mta_send_mail(nagios_t) + mta_signal_system_mail(nagios_t) + mta_kill_system_mail(nagios_t) + ++systemd_exec_systemctl(nagios_t) ++ ++tunable_policy(`nagios_run_sudo',` ++ allow nagios_t self:capability { chown setuid setgid sys_resource sys_ptrace }; ++ allow nagios_t self:process { setrlimit setsched }; ++ ++ allow nagios_t self:key write; ++ ++ allow nagios_t self:passwd { passwd rootok }; ++ ++ auth_rw_lastlog(nagios_t) ++ auth_rw_faillog(nagios_t) ++ ++ auth_domtrans_chkpwd(nagios_t) ++ ++ selinux_compute_access_vector(nagios_t) ++ ++ systemd_write_inherited_logind_sessions_pipes(nagios_t) ++ systemd_dbus_chat_logind(nagios_t) ++ ++ logging_send_audit_msgs(nagios_t) ++') ++ ++optional_policy(` ++ apache_systemctl(nagios_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(nagios_t) ++') ++ ++optional_policy(` ++ tunable_policy(`nagios_run_sudo',` ++ sudo_exec(nagios_t) ++ sudo_manage_db(nagios_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`nagios_run_sudo',` ++ init_read_utmp(nagios_t) ++ ') ++') ++ ++tunable_policy(`nagios_run_pnp4nagios',` ++ allow nagios_t nagios_log_t:file execute; ++') ++ ++tunable_policy(`nagios_use_nfs',` ++ fs_manage_nfs_files(nagios_t) ++ fs_manage_nfs_dirs(nagios_t) ++ fs_manage_nfs_symlinks(nagios_t) ++') ++ + optional_policy(` + netutils_kill_ping(nagios_t) + ') +@@ -178,35 +272,40 @@ optional_policy(` + # + # CGI local policy + # ++ + optional_policy(` + apache_content_template(nagios) +- typealias httpd_nagios_script_t alias nagios_cgi_t; +- typealias httpd_nagios_script_exec_t alias nagios_cgi_exec_t; ++ apache_content_alias_template(nagios, nagios) ++ typealias nagios_script_t alias nagios_cgi_t; ++ typealias nagios_script_exec_t alias nagios_cgi_exec_t; + +- allow httpd_nagios_script_t self:process signal_perms; ++ allow nagios_script_t self:process signal_perms; + +- read_files_pattern(httpd_nagios_script_t, nagios_t, nagios_t) +- read_lnk_files_pattern(httpd_nagios_script_t, nagios_t, nagios_t) ++ read_files_pattern(nagios_script_t, nagios_t, nagios_t) ++ read_lnk_files_pattern(nagios_script_t, nagios_t, nagios_t) + +- allow httpd_nagios_script_t nagios_etc_t:dir list_dir_perms; +- allow httpd_nagios_script_t nagios_etc_t:file read_file_perms; +- allow httpd_nagios_script_t nagios_etc_t:lnk_file read_lnk_file_perms; ++ allow nagios_script_t nagios_etc_t:dir list_dir_perms; ++ allow nagios_script_t nagios_etc_t:file { map read_file_perms }; ++ allow nagios_script_t nagios_etc_t:lnk_file read_lnk_file_perms; + +- files_search_spool(httpd_nagios_script_t) +- rw_fifo_files_pattern(httpd_nagios_script_t, nagios_spool_t, nagios_spool_t) ++ files_search_spool(nagios_script_t) ++ rw_fifo_files_pattern(nagios_script_t, nagios_spool_t, nagios_spool_t) ++ read_files_pattern(nagios_script_t, nagios_spool_t, nagios_spool_t) ++ allow nagios_script_t nagios_spool_t:file map; + +- allow httpd_nagios_script_t nagios_log_t:dir list_dir_perms; +- read_files_pattern(httpd_nagios_script_t, nagios_etc_t, nagios_log_t) +- read_lnk_files_pattern(httpd_nagios_script_t, nagios_etc_t, nagios_log_t) ++ allow nagios_script_t nagios_log_t:dir list_dir_perms; ++ read_files_pattern(nagios_script_t, nagios_etc_t, nagios_log_t) ++ read_lnk_files_pattern(nagios_script_t, nagios_etc_t, nagios_log_t) ++ allow nagios_script_t nagios_log_t:file map; + +- kernel_read_system_state(httpd_nagios_script_t) ++ kernel_read_system_state(nagios_script_t) + +- domain_dontaudit_read_all_domains_state(httpd_nagios_script_t) ++ domain_dontaudit_read_all_domains_state(nagios_script_t) + +- files_read_etc_runtime_files(httpd_nagios_script_t) +- files_read_kernel_symbol_table(httpd_nagios_script_t) ++ files_read_etc_runtime_files(nagios_script_t) ++ files_read_kernel_symbol_table(nagios_script_t) + +- logging_send_syslog_msg(httpd_nagios_script_t) ++ logging_send_syslog_msg(nagios_script_t) + ') + + ######################################## +@@ -214,7 +313,7 @@ optional_policy(` + # Nrpe local policy + # + +-allow nrpe_t self:capability { setuid setgid }; ++allow nrpe_t self:capability { setuid setgid kill }; + dontaudit nrpe_t self:capability { sys_tty_config sys_resource }; + allow nrpe_t self:process { setpgid signal_perms setsched setrlimit }; + allow nrpe_t self:fifo_file rw_fifo_file_perms; +@@ -229,9 +328,11 @@ files_pid_filetrans(nrpe_t, nrpe_var_run_t, file) + + domtrans_pattern(nrpe_t, nagios_checkdisk_plugin_exec_t, nagios_checkdisk_plugin_t) + ++kernel_read_system_state(nrpe_t) + kernel_read_kernel_sysctls(nrpe_t) + kernel_read_software_raid_state(nrpe_t) +-kernel_read_system_state(nrpe_t) ++ ++can_exec(nagios_t, nagios_exec_t) + + corecmd_exec_bin(nrpe_t) + corecmd_exec_shell(nrpe_t) +@@ -252,8 +353,8 @@ dev_read_urand(nrpe_t) + domain_use_interactive_fds(nrpe_t) + domain_read_all_domains_state(nrpe_t) + ++files_list_var(nrpe_t) + files_read_etc_runtime_files(nrpe_t) +-files_read_usr_files(nrpe_t) + + fs_getattr_all_fs(nrpe_t) + fs_search_auto_mountpoints(nrpe_t) +@@ -262,10 +363,56 @@ auth_use_nsswitch(nrpe_t) + + logging_send_syslog_msg(nrpe_t) + +-miscfiles_read_localization(nrpe_t) +- + userdom_dontaudit_use_unpriv_user_fds(nrpe_t) + ++tunable_policy(`nagios_run_sudo',` ++ allow nrpe_t self:capability { setuid setgid sys_resource sys_ptrace }; ++ allow nrpe_t self:process { setrlimit setsched }; ++ ++ allow nrpe_t self:key write; ++ ++ allow nrpe_t self:passwd { passwd rootok }; ++ ++ auth_rw_lastlog(nrpe_t) ++ auth_rw_faillog(nrpe_t) ++ ++ auth_domtrans_chkpwd(nrpe_t) ++ ++ selinux_compute_access_vector(nrpe_t) ++ ++ systemd_write_inherited_logind_sessions_pipes(nrpe_t) ++ systemd_dbus_chat_logind(nrpe_t) ++ systemd_logind_read_state(nrpe_t) ++ ++ logging_send_audit_msgs(nrpe_t) ++') ++ ++optional_policy(` ++ tunable_policy(`nagios_run_sudo',` ++ sudo_exec(nrpe_t) ++ sudo_manage_db(nrpe_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`nagios_run_sudo',` ++ sssd_read_config(nrpe_t) ++ sssd_manage_lib_files(nrpe_t) ++ sssd_read_pid_files(nrpe_t) ++ sssd_signull(nrpe_t) ++ ') ++') ++ ++tunable_policy(`nagios_use_nfs',` ++ fs_manage_nfs_files(nrpe_t) ++ fs_manage_nfs_dirs(nrpe_t) ++ fs_manage_nfs_symlinks(nrpe_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(nrpe_t) ++') ++ + optional_policy(` + inetd_tcp_service_domain(nrpe_t, nrpe_exec_t) + ') +@@ -309,16 +456,16 @@ files_getattr_all_file_type_fs(nagios_admin_plugin_t) + # Mail local policy + # + +-allow nagios_mail_plugin_t self:capability { setuid setgid dac_override }; +-allow nagios_mail_plugin_t self:tcp_socket { accept listen }; ++allow nagios_mail_plugin_t self:capability { setuid setgid dac_read_search dac_override }; ++allow nagios_mail_plugin_t self:netlink_route_socket r_netlink_socket_perms; ++allow nagios_mail_plugin_t self:tcp_socket create_stream_socket_perms; ++allow nagios_mail_plugin_t self:udp_socket create_socket_perms; + + kernel_read_kernel_sysctls(nagios_mail_plugin_t) + + corecmd_read_bin_files(nagios_mail_plugin_t) + corecmd_read_bin_symlinks(nagios_mail_plugin_t) + +-files_read_etc_files(nagios_mail_plugin_t) +- + logging_send_syslog_msg(nagios_mail_plugin_t) + + sysnet_dns_name_resolve(nagios_mail_plugin_t) +@@ -345,9 +492,14 @@ allow nagios_checkdisk_plugin_t self:capability { sys_admin sys_rawio }; + + kernel_read_software_raid_state(nagios_checkdisk_plugin_t) + ++corecmd_exec_bin(nagios_checkdisk_plugin_t) ++ ++files_getattr_all_dirs(nagios_checkdisk_plugin_t) + files_getattr_all_mountpoints(nagios_checkdisk_plugin_t) + files_read_etc_runtime_files(nagios_checkdisk_plugin_t) + ++fs_read_configfs_files(nagios_checkdisk_plugin_t) ++fs_read_configfs_dirs(nagios_checkdisk_plugin_t) + fs_getattr_all_fs(nagios_checkdisk_plugin_t) + + storage_raw_read_fixed_disk(nagios_checkdisk_plugin_t) +@@ -357,9 +509,11 @@ storage_raw_read_fixed_disk(nagios_checkdisk_plugin_t) + # Services local policy + # + +-allow nagios_services_plugin_t self:capability net_raw; ++allow nagios_services_plugin_t self:capability { setuid net_bind_service net_raw }; + allow nagios_services_plugin_t self:process { signal sigkill }; +-allow nagios_services_plugin_t self:tcp_socket { accept listen }; ++allow nagios_services_plugin_t self:tcp_socket create_stream_socket_perms; ++allow nagios_services_plugin_t self:udp_socket create_socket_perms; ++allow nagios_services_plugin_t self:rawip_socket create_socket_perms; + + corecmd_exec_bin(nagios_services_plugin_t) + +@@ -391,6 +545,11 @@ optional_policy(` + + optional_policy(` + mysql_stream_connect(nagios_services_plugin_t) ++ mysql_read_config(nagios_services_plugin_t) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(nagios_services_plugin_t) + ') + + optional_policy(` +@@ -402,32 +561,40 @@ optional_policy(` + # System local policy + # + +-allow nagios_system_plugin_t self:capability dac_override; ++allow nagios_system_plugin_t self:capability { dac_read_search dac_override }; + dontaudit nagios_system_plugin_t self:capability { setuid setgid }; + + read_files_pattern(nagios_system_plugin_t, nagios_log_t, nagios_log_t) ++allow nagios_system_plugin_t nrpe_exec_t:file read_file_perms; ++allow nagios_system_plugin_t nagios_exec_t:file read_file_perms; + + manage_files_pattern(nagios_system_plugin_t, nagios_system_plugin_tmp_t, nagios_system_plugin_tmp_t) + manage_dirs_pattern(nagios_system_plugin_t, nagios_system_plugin_tmp_t, nagios_system_plugin_tmp_t) + files_tmp_filetrans(nagios_system_plugin_t, nagios_system_plugin_tmp_t, { dir file }) + ++kernel_read_system_state(nagios_system_plugin_t) + kernel_read_kernel_sysctls(nagios_system_plugin_t) + + corecmd_exec_bin(nagios_system_plugin_t) + corecmd_exec_shell(nagios_system_plugin_t) ++corecmd_getattr_all_executables(nagios_system_plugin_t) + + dev_read_sysfs(nagios_system_plugin_t) + + domain_read_all_domains_state(nagios_system_plugin_t) + +-files_read_etc_files(nagios_system_plugin_t) +- + fs_getattr_all_fs(nagios_system_plugin_t) + ++auth_read_passwd(nagios_system_plugin_t) ++ + optional_policy(` + init_read_utmp(nagios_system_plugin_t) + ') + ++optional_policy(` ++ mrtg_read_lib_files(nagios_system_plugin_t) ++') ++ + ####################################### + # + # Event local policy +@@ -442,11 +609,45 @@ corecmd_exec_shell(nagios_eventhandler_plugin_t) + + init_domtrans_script(nagios_eventhandler_plugin_t) + ++systemd_exec_systemctl(nagios_eventhandler_plugin_t) ++ ++allow nagios_t nagios_eventhandler_plugin_exec_t:dir list_dir_perms; ++ ++optional_policy(` ++ unconfined_domain(nagios_eventhandler_plugin_t) ++') ++ + ######################################## + # +-# Unconfined plugin policy ++# nagios openshift plugin policy ++# ++ ++allow nagios_openshift_plugin_t self:capability sys_ptrace; ++ ++manage_dirs_pattern(nagios_openshift_plugin_t, nagios_openshift_plugin_tmp_t, nagios_openshift_plugin_tmp_t) ++manage_files_pattern(nagios_openshift_plugin_t, nagios_openshift_plugin_tmp_t, nagios_openshift_plugin_tmp_t) ++files_tmp_filetrans(nagios_openshift_plugin_t, nagios_openshift_plugin_tmp_t, { file dir }) ++ ++corecmd_exec_bin(nagios_openshift_plugin_t) ++corecmd_exec_shell(nagios_openshift_plugin_t) ++ ++domain_read_all_domains_state(nagios_openshift_plugin_t) ++ ++fs_getattr_all_fs(nagios_openshift_plugin_t) ++ ++optional_policy(` ++ apache_read_config(nagios_openshift_plugin_t) ++') ++ ++###################################### ++# ++# nagios plugin domain policy + # + + optional_policy(` + unconfined_domain(nagios_unconfined_plugin_t) + ') ++ ++optional_policy(` ++ systemd_dbus_chat_logind(nagios_unconfined_plugin_t) ++') +diff --git a/namespace.fc b/namespace.fc +new file mode 100644 +index 0000000000..ce51c8d4f1 +--- /dev/null ++++ b/namespace.fc +@@ -0,0 +1,3 @@ ++ ++/etc/security/namespace.init -- gen_context(system_u:object_r:namespace_init_exec_t,s0) ++ +diff --git a/namespace.if b/namespace.if +new file mode 100644 +index 0000000000..8d7c751573 +--- /dev/null ++++ b/namespace.if +@@ -0,0 +1,48 @@ ++ ++## policy for namespace ++ ++######################################## ++## ++## Execute a domain transition to run namespace_init. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`namespace_init_domtrans',` ++ gen_require(` ++ type namespace_init_t, namespace_init_exec_t; ++ ') ++ ++ domtrans_pattern($1, namespace_init_exec_t, namespace_init_t) ++') ++ ++ ++######################################## ++## ++## Execute namespace_init in the namespace_init domain, and ++## allow the specified role the namespace_init domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the namespace_init domain. ++## ++## ++# ++interface(`namespace_init_run',` ++ gen_require(` ++ type namespace_init_t; ++ ') ++ ++ namespace_init_domtrans($1) ++ role $2 types namespace_init_t; ++ ++ seutil_run_setfiles(namespace_init_t, $2) ++') +diff --git a/namespace.te b/namespace.te +new file mode 100644 +index 0000000000..814e62e4fd +--- /dev/null ++++ b/namespace.te +@@ -0,0 +1,41 @@ ++policy_module(namespace,1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type namespace_init_t; ++type namespace_init_exec_t; ++init_system_domain(namespace_init_t, namespace_init_exec_t) ++role system_r types namespace_init_t; ++ ++######################################## ++# ++# namespace_init local policy ++# ++ ++allow namespace_init_t self:capability { dac_read_search dac_override}; ++ ++allow namespace_init_t self:fifo_file manage_fifo_file_perms; ++allow namespace_init_t self:unix_stream_socket create_stream_socket_perms; ++ ++kernel_read_system_state(namespace_init_t) ++ ++corecmd_exec_shell(namespace_init_t) ++ ++domain_use_interactive_fds(namespace_init_t) ++domain_obj_id_change_exemption(namespace_init_t) ++ ++files_polyinstantiate_all(namespace_init_t) ++ ++fs_getattr_xattr_fs(namespace_init_t) ++ ++auth_use_nsswitch(namespace_init_t) ++ ++term_use_console(namespace_init_t) ++ ++userdom_manage_user_home_content(namespace_init_t) ++userdom_relabelto_user_home_dirs(namespace_init_t) ++userdom_relabelto_user_home_files(namespace_init_t) ++userdom_filetrans_home_content(namespace_init_t) +diff --git a/ncftool.if b/ncftool.if +index db9578f4e0..4309e3da55 100644 +--- a/ncftool.if ++++ b/ncftool.if +@@ -38,9 +38,11 @@ interface(`ncftool_domtrans',` + # + interface(`ncftool_run',` + gen_require(` ++ type ncftool_t; + attribute_role ncftool_roles; + ') + + ncftool_domtrans($1) + roleattribute $2 ncftool_roles; + ') ++ +diff --git a/ncftool.te b/ncftool.te +index 71f30ba606..d61686078d 100644 +--- a/ncftool.te ++++ b/ncftool.te +@@ -22,13 +22,14 @@ role ncftool_roles types ncftool_t; + + allow ncftool_t self:capability net_admin; + allow ncftool_t self:process signal; ++ + allow ncftool_t self:fifo_file manage_fifo_file_perms; + allow ncftool_t self:unix_stream_socket create_stream_socket_perms; + allow ncftool_t self:netlink_route_socket create_netlink_socket_perms; + allow ncftool_t self:tcp_socket create_stream_socket_perms; + + kernel_read_kernel_sysctls(ncftool_t) +-kernel_read_modprobe_sysctls(ncftool_t) ++kernel_read_usermodehelper_state(ncftool_t) + kernel_read_network_state(ncftool_t) + kernel_read_system_state(ncftool_t) + kernel_request_load_module(ncftool_t) +@@ -41,11 +42,11 @@ domain_read_all_domains_state(ncftool_t) + + dev_read_sysfs(ncftool_t) + +-files_read_etc_files(ncftool_t) ++files_manage_system_conf_files(ncftool_t) ++files_relabelto_system_conf_files(ncftool_t) + files_read_etc_runtime_files(ncftool_t) +-files_read_usr_files(ncftool_t) + +-miscfiles_read_localization(ncftool_t) ++term_use_all_inherited_terms(ncftool_t) + + sysnet_delete_dhcpc_pid(ncftool_t) + sysnet_run_dhcpc(ncftool_t, ncftool_roles) +@@ -53,6 +54,8 @@ sysnet_run_ifconfig(ncftool_t, ncftool_roles) + sysnet_etc_filetrans_config(ncftool_t) + sysnet_manage_config(ncftool_t) + sysnet_read_dhcpc_state(ncftool_t) ++sysnet_relabelfrom_net_conf(ncftool_t) ++sysnet_relabelto_net_conf(ncftool_t) + sysnet_read_dhcpc_pid(ncftool_t) + sysnet_signal_dhcpc(ncftool_t) + +@@ -73,11 +76,14 @@ optional_policy(` + + optional_policy(` + iptables_initrc_domtrans(ncftool_t) ++ iptables_systemctl(ncftool_t) + ') + + optional_policy(` ++ modutils_list_module_config(ncftool_t) + modutils_read_module_config(ncftool_t) + modutils_run_insmod(ncftool_t, ncftool_roles) ++ + ') + + optional_policy(` +diff --git a/nessus.te b/nessus.te +index fe1068ba59..98166ee0b0 100644 +--- a/nessus.te ++++ b/nessus.te +@@ -58,7 +58,6 @@ kernel_read_kernel_sysctls(nessusd_t) + + corecmd_exec_bin(nessusd_t) + +-corenet_all_recvfrom_unlabeled(nessusd_t) + corenet_all_recvfrom_netlabel(nessusd_t) + corenet_tcp_sendrecv_generic_if(nessusd_t) + corenet_udp_sendrecv_generic_if(nessusd_t) +@@ -82,7 +81,6 @@ dev_read_urand(nessusd_t) + domain_use_interactive_fds(nessusd_t) + + files_list_var_lib(nessusd_t) +-files_read_etc_files(nessusd_t) + files_read_etc_runtime_files(nessusd_t) + + fs_getattr_all_fs(nessusd_t) +@@ -90,8 +88,6 @@ fs_search_auto_mountpoints(nessusd_t) + + logging_send_syslog_msg(nessusd_t) + +-miscfiles_read_localization(nessusd_t) +- + sysnet_read_config(nessusd_t) + + userdom_dontaudit_use_unpriv_user_fds(nessusd_t) +diff --git a/networkmanager.fc b/networkmanager.fc +index 94b9734074..448a7e8364 100644 +--- a/networkmanager.fc ++++ b/networkmanager.fc +@@ -1,44 +1,46 @@ +-/etc/rc\.d/init\.d/wicd -- gen_context(system_u:object_r:NetworkManager_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/wicd -- gen_context(system_u:object_r:NetworkManager_initrc_exec_t,s0) + + /etc/NetworkManager(/.*)? gen_context(system_u:object_r:NetworkManager_etc_t,s0) + /etc/NetworkManager/NetworkManager\.conf gen_context(system_u:object_r:NetworkManager_etc_rw_t,s0) + /etc/NetworkManager/system-connections(/.*)? gen_context(system_u:object_r:NetworkManager_etc_rw_t,s0) + /etc/NetworkManager/dispatcher\.d(/.*)? gen_context(system_u:object_r:NetworkManager_initrc_exec_t,s0) + +-/etc/dhcp/manager-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) +-/etc/dhcp/wireless-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) +-/etc/dhcp/wired-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) ++/etc/dhcp/manager-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) ++/etc/dhcp/wireless-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) ++/etc/dhcp/wired-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) + +-/etc/wicd/manager-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) +-/etc/wicd/wireless-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) +-/etc/wicd/wired-settings\.conf -- gen_context(system_u:object_r:NetworkManager_etc_rw_t, s0) ++/etc/wicd/manager-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) ++/etc/wicd/wireless-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) ++/etc/wicd/wired-settings.conf -- gen_context(system_u:object_r:NetworkManager_var_lib_t, s0) + +-/usr/lib/NetworkManager/nm-dispatcher\.action -- gen_context(system_u:object_r:NetworkManager_initrc_exec_t,s0) +-/usr/libexec/nm-dispatcher\.action -- gen_context(system_u:object_r:NetworkManager_initrc_exec_t,s0) ++/usr/lib/systemd/system/NetworkManager.* -- gen_context(system_u:object_r:NetworkManager_unit_file_t,s0) + +-/sbin/wpa_cli -- gen_context(system_u:object_r:wpa_cli_exec_t,s0) +-/sbin/wpa_supplicant -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++/usr/libexec/nm-dispatcher.* -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) + + /usr/bin/NetworkManager -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) + /usr/bin/wpa_cli -- gen_context(system_u:object_r:wpa_cli_exec_t,s0) + /usr/bin/wpa_supplicant -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) + + /usr/sbin/NetworkManager -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) +-/usr/sbin/NetworkManagerDispatcher -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) +-/usr/sbin/nm-system-settings -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) +-/usr/sbin/wicd -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) +-/usr/sbin/wpa_cli -- gen_context(system_u:object_r:wpa_cli_exec_t,s0) + /usr/sbin/wpa_supplicant -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++/usr/sbin/NetworkManagerDispatcher -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++/usr/sbin/nm-system-settings -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++/usr/bin/teamd -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++/usr/sbin/wicd -- gen_context(system_u:object_r:NetworkManager_exec_t,s0) ++ ++/var/lib/wicd(/.*)? gen_context(system_u:object_r:NetworkManager_var_lib_t,s0) ++/var/lib/NetworkManager(/.*)? gen_context(system_u:object_r:NetworkManager_var_lib_t,s0) + +-/var/lib/wicd(/.*)? gen_context(system_u:object_r:NetworkManager_var_lib_t,s0) +-/var/lib/NetworkManager(/.*)? gen_context(system_u:object_r:NetworkManager_var_lib_t,s0) ++/var/log/wicd.* -- gen_context(system_u:object_r:NetworkManager_log_t,s0) + +-/var/log/wicd(/.*)? gen_context(system_u:object_r:NetworkManager_log_t,s0) + /var/log/wpa_supplicant.* -- gen_context(system_u:object_r:NetworkManager_log_t,s0) + + /var/run/NetworkManager\.pid -- gen_context(system_u:object_r:NetworkManager_var_run_t,s0) +-/var/run/NetworkManager(/.*)? gen_context(system_u:object_r:NetworkManager_var_run_t,s0) +-/var/run/nm-dhclient.* gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/NetworkManager(/.*)? gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/nm-dhclient.* gen_context(system_u:object_r:NetworkManager_var_run_t,s0) + /var/run/nm-dns-dnsmasq\.conf -- gen_context(system_u:object_r:NetworkManager_var_run_t,s0) +-/var/run/wpa_supplicant(/.*)? gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/nm-xl2tpd.conf.* -- gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/teamd(/.*)? gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/wicd\.pid -- gen_context(system_u:object_r:NetworkManager_var_run_t,s0) ++/var/run/wpa_supplicant(/.*)? gen_context(system_u:object_r:NetworkManager_var_run_t,s0) + /var/run/wpa_supplicant-global -s gen_context(system_u:object_r:NetworkManager_var_run_t,s0) +diff --git a/networkmanager.if b/networkmanager.if +index 86dc29dfa8..690cb88a84 100644 +--- a/networkmanager.if ++++ b/networkmanager.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Read and write networkmanager udp sockets. ++## Read and write NetworkManager UDP sockets. + ## + ## + ## +@@ -10,6 +10,7 @@ + ## + ## + # ++# cjp: added for named. + interface(`networkmanager_rw_udp_sockets',` + gen_require(` + type NetworkManager_t; +@@ -20,7 +21,7 @@ interface(`networkmanager_rw_udp_sockets',` + + ######################################## + ## +-## Read and write networkmanager packet sockets. ++## Read and write NetworkManager packet sockets. + ## + ## + ## +@@ -28,6 +29,7 @@ interface(`networkmanager_rw_udp_sockets',` + ## + ## + # ++# cjp: added for named. + interface(`networkmanager_rw_packet_sockets',` + gen_require(` + type NetworkManager_t; +@@ -38,12 +40,12 @@ interface(`networkmanager_rw_packet_sockets',` + + ####################################### + ## +-## Relabel networkmanager tun socket. ++## Allow caller to relabel tun_socket + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`networkmanager_attach_tun_iface',` +@@ -57,7 +59,7 @@ interface(`networkmanager_attach_tun_iface',` + + ######################################## + ## +-## Read and write networkmanager netlink ++## Read and write NetworkManager netlink + ## routing sockets. + ## + ## +@@ -66,6 +68,7 @@ interface(`networkmanager_attach_tun_iface',` + ##
      + ## + # ++# cjp: added for named. + interface(`networkmanager_rw_routing_sockets',` + gen_require(` + type NetworkManager_t; +@@ -76,7 +79,7 @@ interface(`networkmanager_rw_routing_sockets',` + + ######################################## + ## +-## Execute networkmanager with a domain transition. ++## Execute NetworkManager with a domain transition. + ## + ## + ## +@@ -93,10 +96,27 @@ interface(`networkmanager_domtrans',` + domtrans_pattern($1, NetworkManager_exec_t, NetworkManager_t) + ') + ++####################################### ++## ++## Execute NetworkManager scripts with an automatic domain transition to initrc. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`networkmanager_initrc_domtrans',` ++ gen_require(` ++ type NetworkManager_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, NetworkManager_initrc_exec_t) ++') ++ + ######################################## + ## +-## Execute networkmanager scripts with +-## an automatic domain transition to initrc. ++## Execute NetworkManager server in the NetworkManager domain. + ## + ## + ## +@@ -104,18 +124,24 @@ interface(`networkmanager_domtrans',` + ## + ## + # +-interface(`networkmanager_initrc_domtrans',` ++interface(`networkmanager_systemctl',` + gen_require(` +- type NetworkManager_initrc_exec_t; ++ type NetworkManager_unit_file_t; ++ type NetworkManager_t; + ') + +- init_labeled_script_domtrans($1, NetworkManager_initrc_exec_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 NetworkManager_unit_file_t:file read_file_perms; ++ allow $1 NetworkManager_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, NetworkManager_t) + ') + + ######################################## + ## + ## Send and receive messages from +-## networkmanager over dbus. ++## NetworkManager over dbus. + ## + ## + ## +@@ -155,7 +181,29 @@ interface(`networkmanager_read_state',` + + ######################################## + ## +-## Send generic signals to networkmanager. ++## Do not audit attempts to send and ++## receive messages from NetworkManager ++## over dbus. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`networkmanager_dontaudit_dbus_chat',` ++ gen_require(` ++ type NetworkManager_t; ++ class dbus send_msg; ++ ') ++ ++ dontaudit $1 NetworkManager_t:dbus send_msg; ++ dontaudit NetworkManager_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Send a generic signal to NetworkManager + ## + ## + ## +@@ -189,6 +237,7 @@ interface(`networkmanager_manage_lib_files',` + + files_search_var_lib($1) + manage_files_pattern($1, NetworkManager_var_lib_t, NetworkManager_var_lib_t) ++ allow $1 NetworkManager_var_lib_t:file map; + ') + + ######################################## +@@ -209,11 +258,31 @@ interface(`networkmanager_read_lib_files',` + files_search_var_lib($1) + list_dirs_pattern($1, NetworkManager_var_lib_t, NetworkManager_var_lib_t) + read_files_pattern($1, NetworkManager_var_lib_t, NetworkManager_var_lib_t) ++ allow $1 NetworkManager_var_lib_t:file map; ++') ++ ++####################################### ++## ++## Read NetworkManager conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_read_conf',` ++ gen_require(` ++ type NetworkManager_etc_t; ++ ') ++ ++ allow $1 NetworkManager_etc_t:dir list_dir_perms; ++ read_files_pattern($1,NetworkManager_etc_t,NetworkManager_etc_t) + ') + + ######################################## + ## +-## Append networkmanager log files. ++## Read NetworkManager PID files. + ## + ## + ## +@@ -221,19 +290,18 @@ interface(`networkmanager_read_lib_files',` + ## + ## + # +-interface(`networkmanager_append_log_files',` ++interface(`networkmanager_read_pid_files',` + gen_require(` +- type NetworkManager_log_t; ++ type NetworkManager_var_run_t; + ') + +- logging_search_logs($1) +- allow $1 NetworkManager_log_t:dir list_dir_perms; +- append_files_pattern($1, NetworkManager_log_t, NetworkManager_log_t) ++ files_search_pids($1) ++ read_files_pattern($1, NetworkManager_var_run_t, NetworkManager_var_run_t) + ') + + ######################################## + ## +-## Read networkmanager pid files. ++## Manage NetworkManager PID files. + ## + ## + ## +@@ -241,13 +309,66 @@ interface(`networkmanager_append_log_files',` + ## + ## + # +-interface(`networkmanager_read_pid_files',` ++interface(`networkmanager_manage_pid_files',` ++ gen_require(` ++ type NetworkManager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, NetworkManager_var_run_t, NetworkManager_var_run_t) ++') ++ ++######################################## ++## ++## Manage NetworkManager PID sock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_manage_pid_sock_files',` + gen_require(` + type NetworkManager_var_run_t; + ') + + files_search_pids($1) +- allow $1 NetworkManager_var_run_t:file read_file_perms; ++ manage_sock_files_pattern($1, NetworkManager_var_run_t, NetworkManager_var_run_t) ++') ++ ++######################################## ++## ++## Create objects in /etc with a private ++## type using a type_transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Private file type. ++## ++## ++## ++## ++## Object classes to be created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`networkmanager_pid_filetrans',` ++ gen_require(` ++ type NetworkManager_var_run_t; ++ ') ++ ++ filetrans_pattern($1, NetworkManager_var_run_t, $2, $3, $4) + ') + + #################################### +@@ -272,14 +393,33 @@ interface(`networkmanager_stream_connect',` + + ######################################## + ## +-## All of the rules required to +-## administrate an networkmanager environment. ++## Delete NetworkManager PID files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++# ++interface(`networkmanager_delete_pid_files',` ++ gen_require(` ++ type NetworkManager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ delete_files_pattern($1, NetworkManager_var_run_t, NetworkManager_var_run_t) ++') ++ ++######################################## ++## ++## Execute NetworkManager in the NetworkManager domain, and ++## allow the specified role the NetworkManager domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## + ## + ## + ## Role allowed access. +@@ -287,33 +427,194 @@ interface(`networkmanager_stream_connect',` + ## + ## + # +-interface(`networkmanager_admin',` ++interface(`networkmanager_run',` + gen_require(` +- type NetworkManager_t, NetworkManager_initrc_exec_t, NetworkManager_etc_t; +- type NetworkManager_etc_rw_t, NetworkManager_log_t, NetworkManager_tmp_t; +- type NetworkManager_var_lib_t, NetworkManager_var_run_t, wpa_cli_t; ++ type NetworkManager_t, NetworkManager_exec_t; + ') + +- allow $1 { wpa_cli_t NetworkManager_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { wpa_cli_t NetworkManager_t }) +- +- init_labeled_script_domtrans($1, NetworkManager_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 NetworkManager_initrc_exec_t system_r; +- allow $2 system_r; ++ networkmanager_domtrans($1) ++ role $2 types NetworkManager_t; ++') + +- logging_search_etc($1) +- admin_pattern($1, { NetworkManager_etc_t NetworkManager_etc_rw_t }) ++######################################## ++## ++## Allow the specified domain to append ++## to Network Manager log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_append_log',` ++ gen_require(` ++ type NetworkManager_log_t; ++ ') + + logging_search_logs($1) +- admin_pattern($1, NetworkManager_log_t) ++ allow $1 NetworkManager_log_t:dir list_dir_perms; ++ append_files_pattern($1, NetworkManager_log_t, NetworkManager_log_t) ++ allow $1 NetworkManager_var_lib_t:file map; + +- files_search_var_lib($1) +- admin_pattern($1, NetworkManager_var_lib_t) ++') ++ ++####################################### ++## ++## Allow the specified domain to manage ++## to Network Manager lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_manage_lib',` ++ gen_require(` ++ type NetworkManager_var_lib_t; ++ ') ++ ++ manage_files_pattern($1, NetworkManager_var_lib_t, NetworkManager_var_lib_t) ++ allow $1 NetworkManager_var_lib_t:file map; ++ ++') ++ ++####################################### ++## ++## Read the process state (/proc/pid) of NetworkManager. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`NetworkManager_read_state',` ++ gen_require(` ++ type NetworkManager_t; ++ ') ++ ++ allow $1 NetworkManager_t:dir search_dir_perms; ++ allow $1 NetworkManager_t:file read_file_perms; ++ allow $1 NetworkManager_t:lnk_file read_lnk_file_perms; ++') ++ ++####################################### ++## ++## Send to NetworkManager with a unix dgram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_dgram_send',` ++ gen_require(` ++ type NetworkManager_t, NetworkManager_var_run_t; ++ ') + + files_search_pids($1) +- admin_pattern($1, NetworkManager_var_run_t) ++ dgram_send_pattern($1, NetworkManager_var_run_t, NetworkManager_var_run_t, NetworkManager_t) ++') ++ ++######################################## ++## ++## Send sigchld to networkmanager. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# ++interface(`networkmanager_sigchld',` ++ gen_require(` ++ type NetworkManager_t; ++ ') ++ ++ allow $1 NetworkManager_t:process sigchld; ++') ++ ++######################################## ++## ++## Send signull to networkmanager. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# ++interface(`networkmanager_signull',` ++ gen_require(` ++ type NetworkManager_t; ++ ') ++ ++ allow $1 NetworkManager_t:process signull; ++') ++ ++######################################## ++## ++## Send sigkill to networkmanager. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++# ++interface(`networkmanager_sigkill',` ++ gen_require(` ++ type NetworkManager_t; ++ ') ++ ++ allow $1 NetworkManager_t:process sigkill; ++') ++ ++######################################## ++## ++## Transition to networkmanager named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`networkmanager_filetrans_named_content',` ++ gen_require(` ++ type NetworkManager_var_run_t; ++ type NetworkManager_var_lib_t; ++ ') + +- files_search_tmp($1) +- admin_pattern($1, NetworkManager_tmp_t) ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth0.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth1.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth2.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth3.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth4.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth5.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth6.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth7.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth8.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-eth9.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em0.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em1.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em2.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em3.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em4.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em5.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em6.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em7.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "nm-dhclient-em8.conf") ++ files_pid_filetrans($1, NetworkManager_var_run_t, dir, "teamd") ++ files_pid_filetrans($1, NetworkManager_var_run_t, file, "wicd.pid") ++ files_etc_filetrans($1, NetworkManager_var_lib_t, file, "manager-settings.conf") ++ files_etc_filetrans($1, NetworkManager_var_lib_t, file, "wireless-settings.conf") ++ files_etc_filetrans($1, NetworkManager_var_lib_t, file, "wired-settings.conf") ++ logging_log_filetrans($1, NetworkManager_var_lib_t, file, "wpa_supplicant.log") + ') +diff --git a/networkmanager.te b/networkmanager.te +index 55f20095e6..67738f4a88 100644 +--- a/networkmanager.te ++++ b/networkmanager.te +@@ -9,15 +9,18 @@ type NetworkManager_t; + type NetworkManager_exec_t; + init_daemon_domain(NetworkManager_t, NetworkManager_exec_t) + ++type NetworkManager_initrc_exec_t; ++init_script_file(NetworkManager_initrc_exec_t) ++ ++type NetworkManager_unit_file_t; ++systemd_unit_file(NetworkManager_unit_file_t) ++ + type NetworkManager_etc_t; + files_config_file(NetworkManager_etc_t) + + type NetworkManager_etc_rw_t; + files_config_file(NetworkManager_etc_rw_t) + +-type NetworkManager_initrc_exec_t; +-init_script_file(NetworkManager_initrc_exec_t) +- + type NetworkManager_log_t; + logging_log_file(NetworkManager_log_t) + +@@ -39,25 +42,58 @@ init_system_domain(wpa_cli_t, wpa_cli_exec_t) + # Local policy + # + +-allow NetworkManager_t self:capability { fowner chown fsetid kill setgid setuid sys_nice dac_override net_admin net_raw ipc_lock }; +-dontaudit NetworkManager_t self:capability { sys_tty_config sys_module sys_ptrace }; +-allow NetworkManager_t self:process { ptrace getcap setcap setpgid getsched setsched signal_perms }; ++# networkmanager will ptrace itself if gdb is installed ++# and it receives a unexpected signal (rh bug #204161) ++allow NetworkManager_t self:capability { fowner chown fsetid kill setgid setuid sys_admin sys_nice dac_read_search dac_override net_admin net_raw net_bind_service ipc_lock sys_chroot }; ++dontaudit NetworkManager_t self:capability sys_tty_config; ++ ++allow NetworkManager_t self:bpf { map_create map_read map_write prog_load prog_run }; ++ ++ifdef(`hide_broken_symptoms',` ++ # caused by some bogus kernel code ++ dontaudit NetworkManager_t self:capability sys_module; ++') ++ ++allow NetworkManager_t self:process { getcap setcap setpgid getsched setsched signal_perms }; ++ ++allow NetworkManager_t self:process setfscreate; ++selinux_validate_context(NetworkManager_t) ++ ++tunable_policy(`deny_ptrace',`',` ++ allow NetworkManager_t self:capability sys_ptrace; ++ allow NetworkManager_t self:process ptrace; ++') ++ + allow NetworkManager_t self:fifo_file rw_fifo_file_perms; +-allow NetworkManager_t self:unix_dgram_socket sendto; +-allow NetworkManager_t self:unix_stream_socket { accept listen }; ++allow NetworkManager_t self:unix_dgram_socket { sendto create_socket_perms }; ++allow NetworkManager_t self:unix_stream_socket{ create_stream_socket_perms connectto }; ++allow NetworkManager_t self:netlink_generic_socket create_socket_perms; + allow NetworkManager_t self:netlink_route_socket create_netlink_socket_perms; ++allow NetworkManager_t self:netlink_xfrm_socket create_netlink_socket_perms; + allow NetworkManager_t self:netlink_socket create_socket_perms; + allow NetworkManager_t self:netlink_kobject_uevent_socket create_socket_perms; +-allow NetworkManager_t self:tcp_socket { accept listen }; ++allow NetworkManager_t self:tcp_socket create_stream_socket_perms; + allow NetworkManager_t self:tun_socket { create_socket_perms relabelfrom relabelto }; ++allow NetworkManager_t self:udp_socket create_socket_perms; + allow NetworkManager_t self:packet_socket create_socket_perms; ++allow NetworkManager_t self:rawip_socket create_socket_perms; ++allow NetworkManager_t self:socket create_socket_perms; + + allow NetworkManager_t wpa_cli_t:unix_dgram_socket sendto; + +-allow NetworkManager_t NetworkManager_etc_t:dir list_dir_perms; +-allow NetworkManager_t NetworkManager_etc_t:file read_file_perms; +-allow NetworkManager_t NetworkManager_etc_t:lnk_file read_lnk_file_perms; ++can_exec(NetworkManager_t, NetworkManager_exec_t) ++#wicd ++can_exec(NetworkManager_t, wpa_cli_exec_t) + ++list_dirs_pattern(NetworkManager_t, NetworkManager_initrc_exec_t, NetworkManager_initrc_exec_t) ++read_files_pattern(NetworkManager_t, NetworkManager_initrc_exec_t, NetworkManager_initrc_exec_t) ++read_lnk_files_pattern(NetworkManager_t, NetworkManager_initrc_exec_t, NetworkManager_initrc_exec_t) ++ ++list_dirs_pattern(NetworkManager_t, NetworkManager_etc_t, NetworkManager_etc_t) ++read_files_pattern(NetworkManager_t, NetworkManager_etc_t, NetworkManager_etc_t) ++read_lnk_files_pattern(NetworkManager_t, NetworkManager_etc_t, NetworkManager_etc_t) ++ ++read_lnk_files_pattern(NetworkManager_t, NetworkManager_etc_rw_t, NetworkManager_etc_rw_t) + manage_dirs_pattern(NetworkManager_t, NetworkManager_etc_rw_t, NetworkManager_etc_rw_t) + manage_files_pattern(NetworkManager_t, NetworkManager_etc_rw_t, NetworkManager_etc_rw_t) + filetrans_pattern(NetworkManager_t, NetworkManager_etc_t, NetworkManager_etc_rw_t, { dir file }) +@@ -68,6 +104,7 @@ create_files_pattern(NetworkManager_t, NetworkManager_log_t, NetworkManager_log_ + setattr_files_pattern(NetworkManager_t, NetworkManager_log_t, NetworkManager_log_t) + logging_log_filetrans(NetworkManager_t, NetworkManager_log_t, file) + ++can_exec(NetworkManager_t, NetworkManager_tmp_t) + manage_files_pattern(NetworkManager_t, NetworkManager_tmp_t, NetworkManager_tmp_t) + manage_sock_files_pattern(NetworkManager_t, NetworkManager_tmp_t, NetworkManager_tmp_t) + files_tmp_filetrans(NetworkManager_t, NetworkManager_tmp_t, { sock_file file }) +@@ -81,17 +118,17 @@ manage_files_pattern(NetworkManager_t, NetworkManager_var_run_t, NetworkManager_ + manage_sock_files_pattern(NetworkManager_t, NetworkManager_var_run_t, NetworkManager_var_run_t) + files_pid_filetrans(NetworkManager_t, NetworkManager_var_run_t, { dir file sock_file }) + +-can_exec(NetworkManager_t, { NetworkManager_exec_t wpa_cli_exec_t NetworkManager_tmp_t }) +- +-kernel_read_crypto_sysctls(NetworkManager_t) + kernel_read_system_state(NetworkManager_t) + kernel_read_network_state(NetworkManager_t) + kernel_read_kernel_sysctls(NetworkManager_t) + kernel_request_load_module(NetworkManager_t) + kernel_read_debugfs(NetworkManager_t) + kernel_rw_net_sysctls(NetworkManager_t) ++kernel_dontaudit_setsched(NetworkManager_t) ++kernel_signull(NetworkManager_t) + +-corenet_all_recvfrom_unlabeled(NetworkManager_t) ++corenet_ib_manage_subnet_unlabeled_endports(NetworkManager_t) ++corenet_ib_access_unlabeled_pkeys(NetworkManager_t) + corenet_all_recvfrom_netlabel(NetworkManager_t) + corenet_tcp_sendrecv_generic_if(NetworkManager_t) + corenet_udp_sendrecv_generic_if(NetworkManager_t) +@@ -102,36 +139,24 @@ corenet_raw_sendrecv_generic_node(NetworkManager_t) + corenet_tcp_sendrecv_all_ports(NetworkManager_t) + corenet_udp_sendrecv_all_ports(NetworkManager_t) + corenet_udp_bind_generic_node(NetworkManager_t) +- +-corenet_sendrecv_isakmp_server_packets(NetworkManager_t) + corenet_udp_bind_isakmp_port(NetworkManager_t) +- +-corenet_sendrecv_dhcpc_server_packets(NetworkManager_t) + corenet_udp_bind_dhcpc_port(NetworkManager_t) +- +-corenet_sendrecv_all_client_packets(NetworkManager_t) + corenet_tcp_connect_all_ports(NetworkManager_t) +- ++corenet_sendrecv_isakmp_server_packets(NetworkManager_t) ++corenet_sendrecv_dhcpc_server_packets(NetworkManager_t) ++corenet_sendrecv_all_client_packets(NetworkManager_t) + corenet_rw_tun_tap_dev(NetworkManager_t) + corenet_getattr_ppp_dev(NetworkManager_t) + +-corecmd_exec_shell(NetworkManager_t) +-corecmd_exec_bin(NetworkManager_t) +- ++dev_access_check_sysfs(NetworkManager_t) + dev_rw_sysfs(NetworkManager_t) + dev_read_rand(NetworkManager_t) + dev_read_urand(NetworkManager_t) ++dev_write_sysfs_dirs(NetworkManager_t) + dev_dontaudit_getattr_generic_blk_files(NetworkManager_t) + dev_getattr_all_chr_files(NetworkManager_t) + dev_rw_wireless(NetworkManager_t) + +-domain_use_interactive_fds(NetworkManager_t) +-domain_read_all_domains_state(NetworkManager_t) +- +-files_read_etc_runtime_files(NetworkManager_t) +-files_read_usr_files(NetworkManager_t) +-files_read_usr_src_files(NetworkManager_t) +- + fs_getattr_all_fs(NetworkManager_t) + fs_search_auto_mountpoints(NetworkManager_t) + fs_list_inotifyfs(NetworkManager_t) +@@ -140,18 +165,35 @@ mls_file_read_all_levels(NetworkManager_t) + + selinux_dontaudit_search_fs(NetworkManager_t) + ++corecmd_exec_shell(NetworkManager_t) ++corecmd_exec_bin(NetworkManager_t) ++ ++domain_use_interactive_fds(NetworkManager_t) ++domain_read_all_domains_state(NetworkManager_t) ++ ++files_read_etc_runtime_files(NetworkManager_t) ++files_read_system_conf_files(NetworkManager_t) ++files_read_usr_src_files(NetworkManager_t) ++files_read_isid_type_files(NetworkManager_t) ++ + storage_getattr_fixed_disk_dev(NetworkManager_t) + ++term_open_unallocated_ttys(NetworkManager_t) ++ + init_read_utmp(NetworkManager_t) + init_dontaudit_write_utmp(NetworkManager_t) + init_domtrans_script(NetworkManager_t) ++init_signull_script(NetworkManager_t) ++init_signal_script(NetworkManager_t) ++init_sigkill_script(NetworkManager_t) + + auth_use_nsswitch(NetworkManager_t) + ++libs_exec_ldconfig(NetworkManager_t) ++ + logging_send_syslog_msg(NetworkManager_t) + + miscfiles_read_generic_certs(NetworkManager_t) +-miscfiles_read_localization(NetworkManager_t) + + seutil_read_config(NetworkManager_t) + +@@ -166,21 +208,37 @@ sysnet_kill_dhcpc(NetworkManager_t) + sysnet_read_dhcpc_state(NetworkManager_t) + sysnet_delete_dhcpc_state(NetworkManager_t) + sysnet_search_dhcp_state(NetworkManager_t) ++# in /etc created by NetworkManager will be labelled net_conf_t. + sysnet_manage_config(NetworkManager_t) +-sysnet_etc_filetrans_config(NetworkManager_t) ++sysnet_filetrans_named_content(NetworkManager_t) ++sysnet_filetrans_net_conf(NetworkManager_t) + +-# certificates in user home directories (cert_home_t in ~/\.pki) +-userdom_read_user_home_content_files(NetworkManager_t) ++systemd_machined_read_pid_files(NetworkManager_t) ++ ++term_use_unallocated_ttys(NetworkManager_t) + +-userdom_write_user_tmp_sockets(NetworkManager_t) ++userdom_stream_connect(NetworkManager_t) + userdom_dontaudit_use_unpriv_user_fds(NetworkManager_t) + userdom_dontaudit_use_user_ttys(NetworkManager_t) ++# Read gnome-keyring ++userdom_read_home_certs(NetworkManager_t) ++userdom_read_user_home_content_files(NetworkManager_t) ++userdom_dgram_send(NetworkManager_t) ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_read_nfs_files(NetworkManager_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_read_cifs_files(NetworkManager_t) ++') + + optional_policy(` + avahi_domtrans(NetworkManager_t) + avahi_kill(NetworkManager_t) + avahi_signal(NetworkManager_t) + avahi_signull(NetworkManager_t) ++ avahi_dbus_chat(NetworkManager_t) + ') + + optional_policy(` +@@ -195,10 +253,6 @@ optional_policy(` + bluetooth_dontaudit_read_helper_state(NetworkManager_t) + ') + +-optional_policy(` +- consolekit_read_pid_files(NetworkManager_t) +-') +- + optional_policy(` + consoletype_exec(NetworkManager_t) + ') +@@ -210,31 +264,36 @@ optional_policy(` + optional_policy(` + dbus_system_domain(NetworkManager_t, NetworkManager_exec_t) + +- optional_policy(` +- avahi_dbus_chat(NetworkManager_t) +- ') ++ init_dbus_chat(NetworkManager_t) + + optional_policy(` + consolekit_dbus_chat(NetworkManager_t) ++ consolekit_read_pid_files(NetworkManager_t) + ') ++') + +- optional_policy(` +- policykit_dbus_chat(NetworkManager_t) +- ') ++optional_policy(` ++ dnssec_trigger_domtrans(NetworkManager_t) + ') + + optional_policy(` + dnsmasq_read_pid_files(NetworkManager_t) ++ dnsmasq_dbus_chat(NetworkManager_t) + dnsmasq_delete_pid_files(NetworkManager_t) + dnsmasq_domtrans(NetworkManager_t) + dnsmasq_initrc_domtrans(NetworkManager_t) + dnsmasq_kill(NetworkManager_t) + dnsmasq_signal(NetworkManager_t) + dnsmasq_signull(NetworkManager_t) ++ dnsmasq_systemctl(NetworkManager_t) ++') ++ ++optional_policy(` ++ dnssec_trigger_signull(NetworkManager_t) + ') + + optional_policy(` +- gnome_stream_connect_all_gkeyringd(NetworkManager_t) ++ fcoe_dgram_send_fcoemon(NetworkManager_t) + ') + + optional_policy(` +@@ -245,11 +304,27 @@ optional_policy(` + howl_signal(NetworkManager_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(NetworkManager_t) ++') ++ ++optional_policy(` ++ iscsid_domtrans(NetworkManager_t) ++') ++ ++optional_policy(` ++ iodined_domtrans(NetworkManager_t) ++') ++ + optional_policy(` + ipsec_domtrans_mgmt(NetworkManager_t) + ipsec_kill_mgmt(NetworkManager_t) + ipsec_signal_mgmt(NetworkManager_t) + ipsec_signull_mgmt(NetworkManager_t) ++ ipsec_domtrans(NetworkManager_t) ++ ipsec_kill(NetworkManager_t) ++ ipsec_signal(NetworkManager_t) ++ ipsec_signull(NetworkManager_t) + ') + + optional_policy(` +@@ -257,15 +332,19 @@ optional_policy(` + ') + + optional_policy(` +- libs_exec_ldconfig(NetworkManager_t) ++ l2tpd_domtrans(NetworkManager_t) ++ l2tpd_sigkill(NetworkManager_t) ++ l2tpd_signal(NetworkManager_t) ++ l2tpd_signull(NetworkManager_t) + ') + + optional_policy(` +- modutils_domtrans_insmod(NetworkManager_t) ++ lldpad_dgram_send(NetworkManager_t) + ') + + optional_policy(` + netutils_exec_ping(NetworkManager_t) ++ netutils_exec(NetworkManager_t) + ') + + optional_policy(` +@@ -274,10 +353,17 @@ optional_policy(` + nscd_signull(NetworkManager_t) + nscd_kill(NetworkManager_t) + nscd_initrc_domtrans(NetworkManager_t) ++ nscd_systemctl(NetworkManager_t) + ') + + optional_policy(` ++ # Dispatcher starting and stoping ntp + ntp_initrc_domtrans(NetworkManager_t) ++ ntp_systemctl(NetworkManager_t) ++') ++ ++optional_policy(` ++ modutils_domtrans_insmod(NetworkManager_t) + ') + + optional_policy(` +@@ -286,9 +372,12 @@ optional_policy(` + openvpn_kill(NetworkManager_t) + openvpn_signal(NetworkManager_t) + openvpn_signull(NetworkManager_t) ++ openvpn_stream_connect(NetworkManager_t) ++ openvpn_noatsecure(NetworkManager_t) + ') + + optional_policy(` ++ policykit_dbus_chat(NetworkManager_t) + policykit_domtrans_auth(NetworkManager_t) + policykit_read_lib(NetworkManager_t) + policykit_read_reload(NetworkManager_t) +@@ -296,7 +385,7 @@ optional_policy(` + ') + + optional_policy(` +- polipo_initrc_domtrans(NetworkManager_t) ++ polipo_systemctl(NetworkManager_t) + ') + + optional_policy(` +@@ -307,6 +396,7 @@ optional_policy(` + ppp_signal(NetworkManager_t) + ppp_signull(NetworkManager_t) + ppp_read_config(NetworkManager_t) ++ ppp_systemctl(NetworkManager_t) + ') + + optional_policy(` +@@ -320,14 +410,21 @@ optional_policy(` + ') + + optional_policy(` +- udev_exec(NetworkManager_t) +- udev_read_db(NetworkManager_t) +- udev_read_pid_files(NetworkManager_t) ++ systemd_write_inhibit_pipes(NetworkManager_t) ++ systemd_read_logind_sessions_files(NetworkManager_t) ++ systemd_dbus_chat_logind(NetworkManager_t) ++ systemd_dbus_chat_hostnamed(NetworkManager_t) ++ systemd_hostnamed_manage_config(NetworkManager_t) + ') + + optional_policy(` +- # unconfined_dgram_send(NetworkManager_t) +- unconfined_stream_connect(NetworkManager_t) ++ ssh_exec(NetworkManager_t) ++') ++ ++optional_policy(` ++ udev_exec(NetworkManager_t) ++ udev_read_db(NetworkManager_t) ++ udev_read_pid_files(NetworkManager_t) + ') + + optional_policy(` +@@ -338,12 +435,16 @@ optional_policy(` + vpn_relabelfrom_tun_socket(NetworkManager_t) + ') + ++optional_policy(` ++ openvswitch_stream_connect(NetworkManager_t) ++') ++ + ######################################## + # + # wpa_cli local policy + # + +-allow wpa_cli_t self:capability dac_override; ++allow wpa_cli_t self:capability { dac_read_search dac_override }; + allow wpa_cli_t self:unix_dgram_socket create_socket_perms; + + allow wpa_cli_t NetworkManager_t:unix_dgram_socket sendto; +@@ -357,6 +458,4 @@ rw_sock_files_pattern(wpa_cli_t, NetworkManager_var_run_t, NetworkManager_var_ru + init_dontaudit_use_fds(wpa_cli_t) + init_use_script_ptys(wpa_cli_t) + +-miscfiles_read_localization(wpa_cli_t) +- + term_dontaudit_use_console(wpa_cli_t) +diff --git a/ninfod.fc b/ninfod.fc +new file mode 100644 +index 0000000000..cc31b9f273 +--- /dev/null ++++ b/ninfod.fc +@@ -0,0 +1,6 @@ ++/usr/lib/systemd/system/ninfod.* -- gen_context(system_u:object_r:ninfod_unit_file_t,s0) ++ ++/usr/sbin/ninfod -- gen_context(system_u:object_r:ninfod_exec_t,s0) ++ ++/var/run/ninfod.* -- gen_context(system_u:object_r:ninfod_run_t,s0) ++ +diff --git a/ninfod.if b/ninfod.if +new file mode 100644 +index 0000000000..409de8c3ef +--- /dev/null ++++ b/ninfod.if +@@ -0,0 +1,80 @@ ++ ++## Respond to IPv6 Node Information Queries ++ ++######################################## ++## ++## Execute ninfod in the ninfod domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ninfod_domtrans',` ++ gen_require(` ++ type ninfod_t, ninfod_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, ninfod_exec_t, ninfod_t) ++') ++######################################## ++## ++## Execute ninfod server in the ninfod domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ninfod_systemctl',` ++ gen_require(` ++ type ninfod_t; ++ type ninfod_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 ninfod_unit_file_t:file read_file_perms; ++ allow $1 ninfod_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ninfod_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ninfod environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`ninfod_admin',` ++ gen_require(` ++ type ninfod_t; ++ type ninfod_unit_file_t; ++ ') ++ ++ allow $1 ninfod_t:process { signal_perms }; ++ ps_process_pattern($1, ninfod_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ninfod_t:process ptrace; ++ ') ++ ++ ninfod_systemctl($1) ++ admin_pattern($1, ninfod_unit_file_t) ++ allow $1 ninfod_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/ninfod.te b/ninfod.te +new file mode 100644 +index 0000000000..b3aa3ce13e +--- /dev/null ++++ b/ninfod.te +@@ -0,0 +1,36 @@ ++policy_module(ninfod, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type ninfod_t; ++type ninfod_exec_t; ++init_daemon_domain(ninfod_t, ninfod_exec_t) ++ ++type ninfod_run_t; ++files_pid_file(ninfod_run_t) ++ ++type ninfod_unit_file_t; ++systemd_unit_file(ninfod_unit_file_t) ++ ++######################################## ++# ++# ninfod local policy ++# ++allow ninfod_t self:capability { net_raw setuid }; ++allow ninfod_t self:process setcap; ++allow ninfod_t self:fifo_file rw_fifo_file_perms; ++allow ninfod_t self:rawip_socket { create setopt }; ++allow ninfod_t self:unix_stream_socket create_stream_socket_perms; ++allow ninfod_t self:rawip_socket read; ++ ++manage_files_pattern(ninfod_t, ninfod_run_t, ninfod_run_t) ++files_pid_filetrans(ninfod_t,ninfod_run_t, { file }) ++ ++auth_use_nsswitch(ninfod_t) ++ ++logging_send_syslog_msg(ninfod_t) ++ ++sysnet_dns_name_resolve(ninfod_t) +diff --git a/nis.fc b/nis.fc +index 8aa1bfa28e..cd0e015f84 100644 +--- a/nis.fc ++++ b/nis.fc +@@ -2,21 +2,26 @@ + /etc/rc\.d/init\.d/yppasswd -- gen_context(system_u:object_r:nis_initrc_exec_t,s0) + /etc/rc\.d/init\.d/ypserv -- gen_context(system_u:object_r:nis_initrc_exec_t,s0) + /etc/rc\.d/init\.d/ypxfrd -- gen_context(system_u:object_r:nis_initrc_exec_t,s0) +- + /etc/ypserv\.conf -- gen_context(system_u:object_r:ypserv_conf_t,s0) + +-/sbin/ypbind -- gen_context(system_u:object_r:ypbind_exec_t,s0) ++/sbin/ypbind -- gen_context(system_u:object_r:ypbind_exec_t,s0) + + /usr/lib/yp/ypxfr -- gen_context(system_u:object_r:ypxfr_exec_t,s0) + +-/usr/sbin/rpc\.yppasswdd -- gen_context(system_u:object_r:yppasswdd_exec_t,s0) ++/usr/sbin/rpc\.yppasswdd -- gen_context(system_u:object_r:yppasswdd_exec_t,s0) ++/usr/sbin/rpc\.yppasswdd\.env -- gen_context(system_u:object_r:yppasswdd_exec_t,s0) + /usr/sbin/rpc\.ypxfrd -- gen_context(system_u:object_r:ypxfr_exec_t,s0) + /usr/sbin/ypbind -- gen_context(system_u:object_r:ypbind_exec_t,s0) + /usr/sbin/ypserv -- gen_context(system_u:object_r:ypserv_exec_t,s0) + +-/var/yp(/.*)? gen_context(system_u:object_r:var_yp_t,s0) ++/var/yp(/.*)? gen_context(system_u:object_r:var_yp_t,s0) + + /var/run/ypxfrd.* -- gen_context(system_u:object_r:ypxfr_var_run_t,s0) + /var/run/ypbind.* -- gen_context(system_u:object_r:ypbind_var_run_t,s0) + /var/run/ypserv.* -- gen_context(system_u:object_r:ypserv_var_run_t,s0) + /var/run/yppass.* -- gen_context(system_u:object_r:yppasswdd_var_run_t,s0) ++ ++/usr/lib/systemd/system/ypbind.* -- gen_context(system_u:object_r:ypbind_unit_file_t,s0) ++/usr/lib/systemd/system/ypserv.* -- gen_context(system_u:object_r:nis_unit_file_t,s0) ++/usr/lib/systemd/system/yppasswdd.* -- gen_context(system_u:object_r:nis_unit_file_t,s0) ++/usr/lib/systemd/system/ypxfrd.* -- gen_context(system_u:object_r:nis_unit_file_t,s0) +diff --git a/nis.if b/nis.if +index 46e55c3ff1..afe399a0ea 100644 +--- a/nis.if ++++ b/nis.if +@@ -1,4 +1,4 @@ +-## Policy for NIS (YP) servers and clients. ++## Policy for NIS (YP) servers and clients + + ######################################## + ## +@@ -27,18 +27,15 @@ interface(`nis_use_ypbind_uncond',` + gen_require(` + type var_yp_t; + ') +- +- allow $1 self:capability net_bind_service; ++ dontaudit $1 self:capability net_bind_service; + + allow $1 self:tcp_socket create_stream_socket_perms; + allow $1 self:udp_socket create_socket_perms; + + allow $1 var_yp_t:dir list_dir_perms; +- allow $1 var_yp_t:file read_file_perms; + allow $1 var_yp_t:lnk_file read_lnk_file_perms; ++ allow $1 var_yp_t:file read_file_perms; + +- corenet_all_recvfrom_unlabeled($1) +- corenet_all_recvfrom_netlabel($1) + corenet_tcp_sendrecv_generic_if($1) + corenet_udp_sendrecv_generic_if($1) + corenet_tcp_sendrecv_generic_node($1) +@@ -49,14 +46,11 @@ interface(`nis_use_ypbind_uncond',` + corenet_udp_bind_generic_node($1) + corenet_tcp_bind_generic_port($1) + corenet_udp_bind_generic_port($1) +- corenet_dontaudit_tcp_bind_all_reserved_ports($1) +- corenet_dontaudit_udp_bind_all_reserved_ports($1) + corenet_dontaudit_tcp_bind_all_ports($1) + corenet_dontaudit_udp_bind_all_ports($1) + corenet_tcp_connect_portmap_port($1) +- corenet_tcp_connect_reserved_port($1) ++ corenet_tcp_connect_all_reserved_ports($1) + corenet_tcp_connect_generic_port($1) +- corenet_dontaudit_tcp_connect_all_ports($1) + corenet_sendrecv_portmap_client_packets($1) + corenet_sendrecv_generic_client_packets($1) + corenet_sendrecv_generic_server_packets($1) +@@ -88,14 +82,14 @@ interface(`nis_use_ypbind_uncond',` + ## + # + interface(`nis_use_ypbind',` +- tunable_policy(`allow_ypbind',` ++ tunable_policy(`nis_enabled',` + nis_use_ypbind_uncond($1) + ') + ') + + ######################################## + ## +-## Use nis to authenticate passwords. ++## Use the nis to authenticate passwords + ## + ## + ## +@@ -105,7 +99,7 @@ interface(`nis_use_ypbind',` + ## + # + interface(`nis_authenticate',` +- tunable_policy(`allow_ypbind',` ++ tunable_policy(`nis_enabled',` + nis_use_ypbind_uncond($1) + corenet_tcp_bind_all_rpc_ports($1) + corenet_udp_bind_all_rpc_ports($1) +@@ -133,20 +127,19 @@ interface(`nis_domtrans_ypbind',` + + ####################################### + ## +-## Execute ypbind in the caller domain. ++## Execute ypbind in the caller domain. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed to transition. ++## + ## + # + interface(`nis_exec_ypbind',` +- gen_require(` +- type ypbind_exec_t; +- ') ++ gen_require(` ++ type ypbind_t, ypbind_exec_t; ++ ') + +- corecmd_search_bin($1) + can_exec($1, ypbind_exec_t) + ') + +@@ -169,11 +162,11 @@ interface(`nis_exec_ypbind',` + # + interface(`nis_run_ypbind',` + gen_require(` +- attribute_role ypbind_roles; ++ type ypbind_t; + ') + + nis_domtrans_ypbind($1) +- roleattribute $2 ypbind_roles; ++ role $2 types ypbind_t; + ') + + ######################################## +@@ -196,7 +189,7 @@ interface(`nis_signal_ypbind',` + + ######################################## + ## +-## List nis data directories. ++## List the contents of the NIS data directory. + ## + ## + ## +@@ -272,10 +265,11 @@ interface(`nis_read_ypbind_pid',` + # + interface(`nis_delete_ypbind_pid',` + gen_require(` +- type ypbind_var_run_t; ++ type ypbind_t; + ') + +- allow $1 ypbind_var_run_t:file delete_file_perms; ++ # TODO: add delete pid from dir call to files ++ allow $1 ypbind_t:file unlink; + ') + + ######################################## +@@ -355,8 +349,59 @@ interface(`nis_initrc_domtrans_ypbind',` + + ######################################## + ## +-## All of the rules required to +-## administrate an nis environment. ++## Execute ypbind server in the ypbind domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`nis_systemctl_ypbind',` ++ gen_require(` ++ type ypbind_unit_file_t; ++ type ypbind_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 ypbind_unit_file_t:file read_file_perms; ++ allow $1 ypbind_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ypbind_t) ++') ++ ++######################################## ++## ++## Execute ypbind server in the ypbind domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`nis_systemctl',` ++ gen_require(` ++ type nis_unit_file_t, ypbind_unit_file_t; ++ type ypbind_t, yppasswdd_t, ypserv_t, ypxfr_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 nis_unit_file_t:file read_file_perms; ++ allow $1 nis_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ypbind_t) ++ ps_process_pattern($1, yppasswdd_t) ++ ps_process_pattern($1, ypserv_t) ++ ps_process_pattern($1, ypxfr_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an nis environment + ## + ## + ## +@@ -372,32 +417,56 @@ interface(`nis_initrc_domtrans_ypbind',` + # + interface(`nis_admin',` + gen_require(` +- type ypbind_t, yppasswdd_t, ypserv_t, ypxfr_t; +- type ypbind_tmp_t, ypserv_tmp_t, ypserv_conf_t; ++ type ypbind_t, yppasswdd_t, ypserv_t; ++ type ypserv_conf_t; + type ypbind_var_run_t, yppasswdd_var_run_t, ypserv_var_run_t; +- type ypbind_initrc_exec_t, nis_initrc_exec_t, var_yp_t; ++ type ypserv_tmp_t; ++ type ypbind_initrc_exec_t, nis_initrc_exec_t, ypxfr_t; ++ type nis_unit_file_t; ++ type ypbind_unit_file_t; ++ ') ++ ++ allow $1 ypbind_t:process signal_perms; ++ ps_process_pattern($1, ypbind_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ypbind_t:process ptrace; ++ allow $1 yppasswdd_t:process ptrace; ++ allow $1 ypserv_t:process ptrace; ++ allow $1 ypxfr_t:process ptrace; + ') + +- allow $1 { ypbind_t yppasswdd_t ypserv_t ypxfr_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { ypbind_t yppasswdd_t ypserv_t ypxfr_t }) ++ allow $1 yppasswdd_t:process signal_perms; ++ ps_process_pattern($1, yppasswdd_t) ++ ++ allow $1 ypserv_t:process signal_perms; ++ ps_process_pattern($1, ypserv_t) ++ ++ allow $1 ypxfr_t:process signal_perms; ++ ps_process_pattern($1, ypxfr_t) + + nis_initrc_domtrans($1) + nis_initrc_domtrans_ypbind($1) + domain_system_change_exemption($1) +- role_transition $2 { nis_initrc_exec_t ypbind_initrc_exec_t } system_r; ++ role_transition $2 nis_initrc_exec_t system_r; ++ role_transition $2 ypbind_initrc_exec_t system_r; + allow $2 system_r; + +- files_list_tmp($1) +- admin_pattern($1, { ypserv_tmp_t ypbind_tmp_t }) +- + files_list_pids($1) +- admin_pattern($1, { ypserv_var_run_t ypbind_var_run_t yppasswdd_var_run_t }) ++ admin_pattern($1, ypbind_var_run_t) ++ nis_systemctl_ypbind($1) ++ admin_pattern($1, ypbind_unit_file_t) ++ allow $1 ypbind_unit_file_t:service all_service_perms; ++ ++ admin_pattern($1, yppasswdd_var_run_t) + + files_list_etc($1) + admin_pattern($1, ypserv_conf_t) + +- files_search_var($1) +- admin_pattern($1, var_yp_t) ++ admin_pattern($1, ypserv_var_run_t) ++ ++ admin_pattern($1, ypserv_tmp_t) + +- nis_run_ypbind($1, $2) ++ nis_systemctl($1) ++ admin_pattern($1, nis_unit_file_t) ++ allow $1 nis_unit_file_t:service all_service_perms; + ') +diff --git a/nis.te b/nis.te +index 3a6b0352eb..31577d5675 100644 +--- a/nis.te ++++ b/nis.te +@@ -5,8 +5,6 @@ policy_module(nis, 1.12.0) + # Declarations + # + +-attribute_role ypbind_roles; +- + type nis_initrc_exec_t; + init_script_file(nis_initrc_exec_t) + +@@ -16,16 +14,18 @@ files_type(var_yp_t) + type ypbind_t; + type ypbind_exec_t; + init_daemon_domain(ypbind_t, ypbind_exec_t) +-role ypbind_roles types ypbind_t; + + type ypbind_initrc_exec_t; + init_script_file(ypbind_initrc_exec_t) + ++type ypbind_var_run_t; ++files_pid_file(ypbind_var_run_t) ++ + type ypbind_tmp_t; + files_tmp_file(ypbind_tmp_t) + +-type ypbind_var_run_t; +-files_pid_file(ypbind_var_run_t) ++type ypbind_unit_file_t; ++systemd_unit_file(ypbind_unit_file_t) + + type yppasswdd_t; + type yppasswdd_exec_t; +@@ -40,7 +40,7 @@ type ypserv_exec_t; + init_daemon_domain(ypserv_t, ypserv_exec_t) + + type ypserv_conf_t; +-files_type(ypserv_conf_t) ++files_config_file(ypserv_conf_t) + + type ypserv_tmp_t; + files_tmp_file(ypserv_tmp_t) +@@ -55,6 +55,9 @@ init_daemon_domain(ypxfr_t, ypxfr_exec_t) + type ypxfr_var_run_t; + files_pid_file(ypxfr_var_run_t) + ++type nis_unit_file_t; ++systemd_unit_file(nis_unit_file_t) ++ + ######################################## + # + # ypbind local policy +@@ -62,6 +65,7 @@ files_pid_file(ypxfr_var_run_t) + dontaudit ypbind_t self:capability { net_admin sys_tty_config }; + allow ypbind_t self:fifo_file rw_fifo_file_perms; + allow ypbind_t self:process signal_perms; ++allow ypbind_t self:{ unix_dgram_socket unix_stream_socket } create_socket_perms; + allow ypbind_t self:netlink_route_socket r_netlink_socket_perms; + allow ypbind_t self:tcp_socket create_stream_socket_perms; + allow ypbind_t self:udp_socket create_socket_perms; +@@ -78,7 +82,6 @@ manage_files_pattern(ypbind_t, var_yp_t, var_yp_t) + kernel_read_system_state(ypbind_t) + kernel_read_kernel_sysctls(ypbind_t) + +-corenet_all_recvfrom_unlabeled(ypbind_t) + corenet_all_recvfrom_netlabel(ypbind_t) + corenet_tcp_sendrecv_generic_if(ypbind_t) + corenet_udp_sendrecv_generic_if(ypbind_t) +@@ -88,7 +91,6 @@ corenet_tcp_sendrecv_all_ports(ypbind_t) + corenet_udp_sendrecv_all_ports(ypbind_t) + corenet_tcp_bind_generic_node(ypbind_t) + corenet_udp_bind_generic_node(ypbind_t) +- + corenet_tcp_bind_generic_port(ypbind_t) + corenet_udp_bind_generic_port(ypbind_t) + corenet_tcp_bind_reserved_port(ypbind_t) +@@ -96,11 +98,10 @@ corenet_udp_bind_reserved_port(ypbind_t) + corenet_tcp_bind_all_rpc_ports(ypbind_t) + corenet_udp_bind_all_rpc_ports(ypbind_t) + corenet_tcp_connect_all_ports(ypbind_t) +-corenet_sendrecv_all_client_packets(ypbind_t) +-corenet_sendrecv_generic_server_packets(ypbind_t) +- + corenet_dontaudit_tcp_bind_all_reserved_ports(ypbind_t) + corenet_dontaudit_udp_bind_all_reserved_ports(ypbind_t) ++corenet_sendrecv_all_client_packets(ypbind_t) ++corenet_sendrecv_generic_server_packets(ypbind_t) + + dev_read_sysfs(ypbind_t) + +@@ -109,12 +110,11 @@ fs_search_auto_mountpoints(ypbind_t) + + domain_use_interactive_fds(ypbind_t) + +-files_read_etc_files(ypbind_t) + files_list_var(ypbind_t) + +-logging_send_syslog_msg(ypbind_t) ++init_search_pid_dirs(ypbind_t) + +-miscfiles_read_localization(ypbind_t) ++logging_send_syslog_msg(ypbind_t) + + sysnet_read_config(ypbind_t) + +@@ -124,7 +124,6 @@ userdom_dontaudit_search_user_home_dirs(ypbind_t) + optional_policy(` + dbus_system_bus_client(ypbind_t) + dbus_connect_system_bus(ypbind_t) +- + init_dbus_chat_script(ypbind_t) + + optional_policy(` +@@ -145,11 +144,12 @@ optional_policy(` + # yppasswdd local policy + # + +-allow yppasswdd_t self:capability dac_override; ++allow yppasswdd_t self:capability { dac_read_search dac_override }; + dontaudit yppasswdd_t self:capability sys_tty_config; + allow yppasswdd_t self:fifo_file rw_fifo_file_perms; + allow yppasswdd_t self:process { getsched setfscreate signal_perms }; +-allow yppasswdd_t self:unix_stream_socket { accept listen }; ++allow yppasswdd_t self:unix_dgram_socket create_socket_perms; ++allow yppasswdd_t self:unix_stream_socket create_stream_socket_perms; + allow yppasswdd_t self:netlink_route_socket r_netlink_socket_perms; + allow yppasswdd_t self:tcp_socket create_stream_socket_perms; + allow yppasswdd_t self:udp_socket create_socket_perms; +@@ -160,14 +160,13 @@ files_pid_filetrans(yppasswdd_t, yppasswdd_var_run_t, file) + manage_files_pattern(yppasswdd_t, var_yp_t, var_yp_t) + manage_lnk_files_pattern(yppasswdd_t, var_yp_t, var_yp_t) + +-can_exec(yppasswdd_t, yppasswdd_exec_t) ++can_exec(yppasswdd_t,yppasswdd_exec_t) + + kernel_list_proc(yppasswdd_t) + kernel_read_proc_symlinks(yppasswdd_t) + kernel_getattr_proc_files(yppasswdd_t) + kernel_read_kernel_sysctls(yppasswdd_t) + +-corenet_all_recvfrom_unlabeled(yppasswdd_t) + corenet_all_recvfrom_netlabel(yppasswdd_t) + corenet_tcp_sendrecv_generic_if(yppasswdd_t) + corenet_udp_sendrecv_generic_if(yppasswdd_t) +@@ -177,23 +176,13 @@ corenet_tcp_sendrecv_all_ports(yppasswdd_t) + corenet_udp_sendrecv_all_ports(yppasswdd_t) + corenet_tcp_bind_generic_node(yppasswdd_t) + corenet_udp_bind_generic_node(yppasswdd_t) +- + corenet_tcp_bind_all_rpc_ports(yppasswdd_t) + corenet_udp_bind_all_rpc_ports(yppasswdd_t) +-corenet_sendrecv_generic_server_packets(yppasswdd_t) +- + corenet_dontaudit_tcp_bind_all_reserved_ports(yppasswdd_t) + corenet_dontaudit_udp_bind_all_reserved_ports(yppasswdd_t) ++corenet_sendrecv_generic_server_packets(yppasswdd_t) + +-corecmd_exec_bin(yppasswdd_t) +-corecmd_exec_shell(yppasswdd_t) +- +-domain_use_interactive_fds(yppasswdd_t) +- +-files_read_etc_files(yppasswdd_t) +-files_read_etc_runtime_files(yppasswdd_t) +-files_relabel_etc_files(yppasswdd_t) +- ++dev_read_urand(yppasswdd_t) + dev_read_sysfs(yppasswdd_t) + + fs_getattr_all_fs(yppasswdd_t) +@@ -202,12 +191,20 @@ fs_search_auto_mountpoints(yppasswdd_t) + selinux_get_fs_mount(yppasswdd_t) + + auth_manage_shadow(yppasswdd_t) ++auth_manage_passwd(yppasswdd_t) + auth_relabel_shadow(yppasswdd_t) + auth_etc_filetrans_shadow(yppasswdd_t) + ++corecmd_exec_bin(yppasswdd_t) ++corecmd_exec_shell(yppasswdd_t) ++ ++domain_use_interactive_fds(yppasswdd_t) ++ ++files_read_etc_runtime_files(yppasswdd_t) ++files_relabel_etc_files(yppasswdd_t) ++ + logging_send_syslog_msg(yppasswdd_t) + +-miscfiles_read_localization(yppasswdd_t) + + sysnet_read_config(yppasswdd_t) + +@@ -218,6 +215,14 @@ optional_policy(` + hostname_exec(yppasswdd_t) + ') + ++optional_policy(` ++ mta_send_mail(yppasswdd_t) ++') ++ ++optional_policy(` ++ nis_use_ypbind(yppasswdd_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(yppasswdd_t) + ') +@@ -234,12 +239,14 @@ optional_policy(` + dontaudit ypserv_t self:capability sys_tty_config; + allow ypserv_t self:fifo_file rw_fifo_file_perms; + allow ypserv_t self:process signal_perms; +-allow ypserv_t self:unix_stream_socket { accept listen }; ++allow ypserv_t self:unix_dgram_socket create_socket_perms; ++allow ypserv_t self:unix_stream_socket create_stream_socket_perms; + allow ypserv_t self:netlink_route_socket r_netlink_socket_perms; + allow ypserv_t self:tcp_socket connected_stream_socket_perms; + allow ypserv_t self:udp_socket create_socket_perms; + + manage_files_pattern(ypserv_t, var_yp_t, var_yp_t) ++allow ypserv_t var_yp_t:file map; + + allow ypserv_t ypserv_conf_t:file read_file_perms; + +@@ -254,7 +261,6 @@ kernel_read_kernel_sysctls(ypserv_t) + kernel_list_proc(ypserv_t) + kernel_read_proc_symlinks(ypserv_t) + +-corenet_all_recvfrom_unlabeled(ypserv_t) + corenet_all_recvfrom_netlabel(ypserv_t) + corenet_tcp_sendrecv_generic_if(ypserv_t) + corenet_udp_sendrecv_generic_if(ypserv_t) +@@ -264,31 +270,28 @@ corenet_tcp_sendrecv_all_ports(ypserv_t) + corenet_udp_sendrecv_all_ports(ypserv_t) + corenet_tcp_bind_generic_node(ypserv_t) + corenet_udp_bind_generic_node(ypserv_t) +- + corenet_tcp_bind_reserved_port(ypserv_t) + corenet_udp_bind_reserved_port(ypserv_t) + corenet_tcp_bind_all_rpc_ports(ypserv_t) + corenet_udp_bind_all_rpc_ports(ypserv_t) +-corenet_sendrecv_generic_server_packets(ypserv_t) +- + corenet_dontaudit_tcp_bind_all_reserved_ports(ypserv_t) + corenet_dontaudit_udp_bind_all_reserved_ports(ypserv_t) ++corenet_sendrecv_generic_server_packets(ypserv_t) ++corenet_tcp_connect_portmap_port(ypserv_t) + +-corecmd_exec_bin(ypserv_t) ++dev_read_sysfs(ypserv_t) + +-files_read_etc_files(ypserv_t) +-files_read_var_files(ypserv_t) ++fs_getattr_all_fs(ypserv_t) ++fs_search_auto_mountpoints(ypserv_t) + +-dev_read_sysfs(ypserv_t) ++corecmd_exec_bin(ypserv_t) + + domain_use_interactive_fds(ypserv_t) + +-fs_getattr_all_fs(ypserv_t) +-fs_search_auto_mountpoints(ypserv_t) ++files_read_var_files(ypserv_t) + + logging_send_syslog_msg(ypserv_t) + +-miscfiles_read_localization(ypserv_t) + + nis_domtrans_ypxfr(ypserv_t) + +@@ -305,13 +308,17 @@ optional_policy(` + udev_read_db(ypserv_t) + ') + ++optional_policy(` ++ rpcbind_stream_connect(ypserv_t) ++') ++ + ######################################## + # + # ypxfr local policy + # + +-allow ypxfr_t self:unix_stream_socket { accept listen }; +-allow ypxfr_t self:unix_dgram_socket { accept listen }; ++allow ypxfr_t self:unix_stream_socket create_stream_socket_perms; ++allow ypxfr_t self:unix_dgram_socket create_stream_socket_perms; + allow ypxfr_t self:tcp_socket create_stream_socket_perms; + allow ypxfr_t self:udp_socket create_socket_perms; + allow ypxfr_t self:netlink_route_socket r_netlink_socket_perms; +@@ -326,7 +333,6 @@ allow ypxfr_t ypserv_conf_t:file read_file_perms; + manage_files_pattern(ypxfr_t, ypxfr_var_run_t, ypxfr_var_run_t) + files_pid_filetrans(ypxfr_t, ypxfr_var_run_t, file) + +-corenet_all_recvfrom_unlabeled(ypxfr_t) + corenet_all_recvfrom_netlabel(ypxfr_t) + corenet_tcp_sendrecv_generic_if(ypxfr_t) + corenet_udp_sendrecv_generic_if(ypxfr_t) +@@ -336,23 +342,19 @@ corenet_tcp_sendrecv_all_ports(ypxfr_t) + corenet_udp_sendrecv_all_ports(ypxfr_t) + corenet_tcp_bind_generic_node(ypxfr_t) + corenet_udp_bind_generic_node(ypxfr_t) +- + corenet_tcp_bind_reserved_port(ypxfr_t) + corenet_udp_bind_reserved_port(ypxfr_t) + corenet_tcp_bind_all_rpc_ports(ypxfr_t) + corenet_udp_bind_all_rpc_ports(ypxfr_t) ++corenet_dontaudit_tcp_bind_all_reserved_ports(ypxfr_t) ++corenet_dontaudit_udp_bind_all_reserved_ports(ypxfr_t) + corenet_tcp_connect_all_ports(ypxfr_t) + corenet_sendrecv_generic_server_packets(ypxfr_t) + corenet_sendrecv_all_client_packets(ypxfr_t) + +-corenet_dontaudit_tcp_bind_all_reserved_ports(ypxfr_t) +-corenet_dontaudit_udp_bind_all_reserved_ports(ypxfr_t) +- +-files_read_etc_files(ypxfr_t) + files_search_usr(ypxfr_t) + + logging_send_syslog_msg(ypxfr_t) + +-miscfiles_read_localization(ypxfr_t) + + sysnet_read_config(ypxfr_t) +diff --git a/nova.fc b/nova.fc +new file mode 100644 +index 0000000000..b5fab0e6ac +--- /dev/null ++++ b/nova.fc +@@ -0,0 +1,25 @@ ++/usr/bin/nova-ajax-console-proxy -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-console.* -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-direct-api -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-api -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-cert -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-conductor -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr//bin/nova-api-metadata -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-network -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-objectstore -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-scheduler -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-vncproxy -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-volume -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-xvpvncproxy -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-cells -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-novncproxy -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-serialproxy -- gen_context(system_u:object_r:nova_exec_t,s0) ++/usr/bin/nova-api-metadata -- gen_context(system_u:object_r:nova_exec_t,s0) ++ ++/usr/lib/systemd/system/openstack-nova-* -- gen_context(system_u:object_r:nova_unit_file_t,s0) ++ ++/var/lib/nova(/.*)? gen_context(system_u:object_r:nova_var_lib_t,s0) ++ ++/var/log/nova(/.*)? gen_context(system_u:object_r:nova_log_t,s0) ++ ++/var/run/nova(/.*)? gen_context(system_u:object_r:nova_var_run_t,s0) +diff --git a/nova.if b/nova.if +new file mode 100644 +index 0000000000..e328327057 +--- /dev/null ++++ b/nova.if +@@ -0,0 +1,47 @@ ++## openstack-nova ++ ++###################################### ++## ++## Manage nova lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nova_manage_lib_files',` ++ gen_require(` ++ type nova_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, nova_var_lib_t, nova_var_lib_t) ++') ++ ++####################################### ++## ++## Creates types and rules for a basic ++## openstack-nova systemd daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`nova_domain_template',` ++ gen_require(` ++ type nova_t; ++ type nova_exec_t; ++ type nova_unit_file_t; ++ type nova_tmp_t; ++ ++ ') ++ ++ typealias nova_t alias nova_$1_t; ++ typealias nova_exec_t alias nova_$1_exec_t; ++ typealias nova_unit_file_t alias nova_$1_unit_file_t; ++ typealias nova_tmp_t alias nova_$1_tmp_t; ++ ++') +diff --git a/nova.te b/nova.te +new file mode 100644 +index 0000000000..af8dd5527d +--- /dev/null ++++ b/nova.te +@@ -0,0 +1,204 @@ ++policy_module(nova, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++# ++# nova-stack daemons contain security issue with using sudo in the code ++# we make this policy as unconfined until this issue is fixed ++# ++ ++attribute nova_domain; ++attribute nova_sudo_domain; ++ ++nova_domain_template(ajax) ++nova_domain_template(api) ++nova_domain_template(cert) ++nova_domain_template(conductor) ++nova_domain_template(compute) ++nova_domain_template(console) ++nova_domain_template(direct) ++nova_domain_template(network) ++nova_domain_template(objectstore) ++nova_domain_template(scheduler) ++nova_domain_template(vncproxy) ++nova_domain_template(volume) ++ ++typeattribute nova_api_t nova_sudo_domain; ++typeattribute nova_cert_t nova_sudo_domain; ++typeattribute nova_console_t nova_sudo_domain; ++typeattribute nova_network_t nova_sudo_domain; ++typeattribute nova_volume_t nova_sudo_domain; ++ ++type nova_t; ++type nova_exec_t; ++init_daemon_domain(nova_t, nova_exec_t) ++typeattribute nova_t nova_domain; ++ ++type nova_unit_file_t; ++systemd_unit_file(nova_unit_file_t) ++ ++type nova_tmp_t; ++files_tmp_file(nova_tmp_t) ++ ++manage_dirs_pattern(nova_t, nova_tmp_t, nova_tmp_t) ++manage_files_pattern(nova_t, nova_tmp_t, nova_tmp_t) ++manage_lnk_files_pattern(nova_t, nova_tmp_t, nova_tmp_t) ++files_tmp_filetrans(nova_t, nova_tmp_t, { lnk_file file dir }) ++fs_tmpfs_filetrans(nova_t, nova_tmp_t, { lnk_file file dir }) ++can_exec(nova_t, nova_tmp_t) ++ ++type nova_log_t; ++logging_log_file(nova_log_t) ++ ++type nova_var_lib_t; ++files_type(nova_var_lib_t) ++ ++type nova_var_run_t; ++files_pid_file(nova_var_run_t) ++ ++ ++###################################### ++# ++# nova general domain local policy ++# ++ ++allow nova_domain self:capability { dac_read_search dac_override net_admin net_bind_service }; ++allow nova_domain self:process { getcap setcap signal_perms setfscreate }; ++allow nova_domain self:fifo_file rw_fifo_file_perms; ++allow nova_domain self:tcp_socket create_stream_socket_perms; ++allow nova_domain self:unix_stream_socket create_stream_socket_perms; ++allow nova_domain self:udp_socket create_socket_perms; ++allow nova_domain self:key write; ++allow nova_domain self:netlink_route_socket r_netlink_socket_perms; ++ ++manage_dirs_pattern(nova_domain, nova_log_t, nova_log_t) ++manage_files_pattern(nova_domain, nova_log_t, nova_log_t) ++ ++manage_dirs_pattern(nova_domain, nova_var_lib_t, nova_var_lib_t) ++manage_files_pattern(nova_domain, nova_var_lib_t, nova_var_lib_t) ++ ++manage_dirs_pattern(nova_domain, nova_var_run_t, nova_var_run_t) ++manage_files_pattern(nova_domain, nova_var_run_t, nova_var_run_t) ++ ++kernel_read_network_state(nova_domain) ++kernel_read_kernel_sysctls(nova_domain) ++ ++kernel_read_system_state(nova_t) ++ ++logging_send_syslog_msg(nova_t) ++ ++miscfiles_read_generic_certs(nova_t) ++ ++corecmd_exec_bin(nova_domain) ++corecmd_exec_shell(nova_domain) ++ ++corenet_tcp_bind_generic_node(nova_domain) ++corenet_udp_bind_generic_node(nova_domain) ++# should be add to booleans ++corenet_tcp_connect_all_ports(nova_domain) ++corenet_tcp_bind_all_unreserved_ports(nova_domain) ++corenet_tcp_connect_mysqld_port(nova_domain) ++corenet_tcp_connect_amqp_port(nova_domain) ++corenet_tcp_connect_mysqld_port(nova_domain) ++corenet_tcp_connect_memcache_port(nova_domain) ++corenet_tcp_bind_varnishd_port(nova_domain) ++# should be added to boolean or fixed in the code ++# dnsmasq domtrans does not work since then dnsmasq_t wants ++# to do some stuff with nova_lib, nova_tmp ++# nova-dhcpbridge runs in dnsmasq domain ++corenet_all_recvfrom_netlabel(nova_t) ++corenet_tcp_sendrecv_generic_if(nova_domain) ++corenet_udp_sendrecv_generic_if(nova_domain) ++corenet_raw_sendrecv_generic_if(nova_domain) ++corenet_tcp_sendrecv_generic_node(nova_domain) ++corenet_udp_sendrecv_generic_node(nova_domain) ++corenet_raw_sendrecv_generic_node(nova_domain) ++corenet_tcp_sendrecv_all_ports(nova_domain) ++corenet_udp_sendrecv_all_ports(nova_domain) ++corenet_tcp_bind_dns_port(nova_domain) ++corenet_udp_bind_all_ports(nova_domain) ++corenet_sendrecv_dns_server_packets(nova_domain) ++corenet_sendrecv_dhcpd_server_packets(nova_domain) ++ ++auth_use_nsswitch(nova_t) ++auth_use_pam(nova_t) ++auth_read_passwd(nova_domain) ++ ++dev_read_sysfs(nova_domain) ++dev_read_urand(nova_domain) ++dev_read_rand(nova_domain) ++ ++fs_getattr_all_fs(nova_domain) ++ ++init_rw_utmp(nova_domain) ++ ++libs_exec_ldconfig(nova_domain) ++ ++optional_policy(` ++ apache_search_config(nova_domain) ++') ++ ++optional_policy(` ++ mysql_stream_connect(nova_domain) ++ mysql_read_db_lnk_files(nova_domain) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(nova_domain) ++') ++ ++optional_policy(` ++ sysnet_read_config(nova_domain) ++ sysnet_domtrans_ifconfig(nova_domain) ++') ++ ++optional_policy(` ++ iptables_domtrans(nova_domain) ++') ++ ++optional_policy(` ++ ssh_exec_keygen(nova_domain) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(nova_domain) ++') ++ ++optional_policy(` ++ virt_getattr_exec(nova_domain) ++ virt_stream_connect(nova_domain) ++') ++ ++optional_policy(` ++ brctl_domtrans(nova_domain) ++') ++ ++optional_policy(` ++ dnsmasq_exec(nova_domain) ++') ++ ++optional_policy(` ++ lvm_domtrans(nova_domain) ++') ++ ++optional_policy(` ++ lvm_domtrans(nova_domain) ++') ++ ++####################################### ++# ++# nova sudo domain local policy ++# ++ ++ifdef(`hide_broken_symptoms',` ++ optional_policy(` ++ sudo_exec(nova_sudo_domain) ++ allow nova_sudo_domain self:capability { setuid sys_resource setgid audit_write }; ++ allow nova_sudo_domain self:process { setsched setrlimit }; ++ logging_send_audit_msgs(nova_sudo_domain) ++ ') ++') ++ +diff --git a/nscd.fc b/nscd.fc +index ba64485074..429bd799c8 100644 +--- a/nscd.fc ++++ b/nscd.fc +@@ -1,13 +1,15 @@ + /etc/rc\.d/init\.d/nscd -- gen_context(system_u:object_r:nscd_initrc_exec_t,s0) + +-/usr/sbin/nscd -- gen_context(system_u:object_r:nscd_exec_t,s0) ++/usr/sbin/nscd -- gen_context(system_u:object_r:nscd_exec_t,s0) + +-/var/cache/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) +- +-/var/db/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) ++/var/db/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) ++/var/cache/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) + + /var/log/nscd\.log.* -- gen_context(system_u:object_r:nscd_log_t,s0) + +-/var/run/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) + /var/run/nscd\.pid -- gen_context(system_u:object_r:nscd_var_run_t,s0) + /var/run/\.nscd_socket -s gen_context(system_u:object_r:nscd_var_run_t,s0) ++ ++/var/run/nscd(/.*)? gen_context(system_u:object_r:nscd_var_run_t,s0) ++ ++/usr/lib/systemd/system/nscd\.service -- gen_context(system_u:object_r:nscd_unit_file_t,s0) +diff --git a/nscd.if b/nscd.if +index 8f2ab09f51..e05a0c73ef 100644 +--- a/nscd.if ++++ b/nscd.if +@@ -1,8 +1,8 @@ +-## Name service cache daemon. ++## Name service cache daemon + + ######################################## + ## +-## Send generic signals to nscd. ++## Send generic signals to NSCD. + ## + ## + ## +@@ -20,7 +20,7 @@ interface(`nscd_signal',` + + ######################################## + ## +-## Send kill signals to nscd. ++## Send NSCD the kill signal. + ## + ## + ## +@@ -38,7 +38,7 @@ interface(`nscd_kill',` + + ######################################## + ## +-## Send null signals to nscd. ++## Send signulls to NSCD. + ## + ## + ## +@@ -56,7 +56,7 @@ interface(`nscd_signull',` + + ######################################## + ## +-## Execute nscd in the nscd domain. ++## Execute NSCD in the nscd domain. + ## + ## + ## +@@ -71,11 +71,13 @@ interface(`nscd_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, nscd_exec_t, nscd_t) ++ allow $1 nscd_exec_t:file map; + ') + + ######################################## + ## +-## Execute nscd in the caller domain. ++## Allow the specified domain to execute nscd ++## in the caller domain. + ## + ## + ## +@@ -88,14 +90,14 @@ interface(`nscd_exec',` + type nscd_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, nscd_exec_t) ++ allow $1 nscd_exec_t:file map; + ') + + ######################################## + ## +-## Use nscd services by connecting using +-## a unix domain stream socket. ++## Use NSCD services by connecting using ++## a unix stream socket. + ## + ## + ## +@@ -112,22 +114,19 @@ interface(`nscd_socket_use',` + allow $1 self:unix_stream_socket create_socket_perms; + + allow $1 nscd_t:nscd { getpwd getgrp gethost }; +- + dontaudit $1 nscd_t:fd use; + dontaudit $1 nscd_t:nscd { getserv shmempwd shmemgrp shmemhost shmemserv }; +- + files_search_pids($1) + stream_connect_pattern($1, nscd_var_run_t, nscd_var_run_t, nscd_t) ++ allow $1 nscd_t:unix_stream_socket { connectto create_socket_perms }; + dontaudit $1 nscd_var_run_t:file read_file_perms; +- ++ allow $1 nscd_var_run_t:file map; + ps_process_pattern(nscd_t, $1) + ') + + ######################################## + ## +-## Use nscd services by mapping the +-## database from an inherited nscd +-## file descriptor. ++## Use nscd services + ## + ## + ## +@@ -135,28 +134,39 @@ interface(`nscd_socket_use',` + ## + ## + # +-interface(`nscd_shm_use',` ++interface(`nscd_use',` ++ tunable_policy(`nscd_use_shm',` ++ nscd_shm_use($1) ++ ',` ++ nscd_socket_use($1) ++ ') ++') ++ ++######################################## ++## ++## Do not audit attempts to write nscd sock files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`nscd_dontaudit_write_sock_file',` + gen_require(` + type nscd_t, nscd_var_run_t; +- class nscd { getpwd getgrp gethost shmempwd shmemgrp shmemhost }; + ') + +- allow $1 self:unix_stream_socket create_stream_socket_perms; +- +- allow $1 nscd_t:nscd { getpwd getgrp gethost shmempwd shmemgrp shmemhost }; +- allow $1 nscd_t:fd use; +- +- files_search_pids($1) +- stream_connect_pattern($1, nscd_var_run_t, nscd_var_run_t, nscd_t) +- dontaudit $1 nscd_var_run_t:file read_file_perms; ++ dontaudit $1 nscd_t:sock_file write; ++ dontaudit $1 nscd_var_run_t:sock_file write; ++ dontaudit $1 nscd_t:unix_stream_socket connectto; + +- allow $1 nscd_var_run_t:dir list_dir_perms; +- allow $1 nscd_var_run_t:sock_file read_sock_file_perms; + ') + + ######################################## + ## +-## Use nscd services. ++## Use NSCD services by mapping the database from ++## an inherited NSCD file descriptor. + ## + ## + ## +@@ -164,18 +174,34 @@ interface(`nscd_shm_use',` + ## + ## + # +-interface(`nscd_use',` +- tunable_policy(`nscd_use_shm',` +- nscd_shm_use($1) +- ',` +- nscd_socket_use($1) ++interface(`nscd_shm_use',` ++ gen_require(` ++ type nscd_t, nscd_var_run_t; ++ class nscd { getserv getpwd getgrp gethost shmempwd shmemgrp shmemhost shmemserv shmemnetgrp getnetgrp }; + ') ++ ++ allow $1 nscd_var_run_t:dir list_dir_perms; ++ allow $1 nscd_t:nscd { shmempwd shmemgrp shmemhost shmemserv shmemnetgrp}; ++ # Receive fd from nscd and map the backing file with read access. ++ allow $1 nscd_t:fd use; ++ ++ # cjp: these were originally inherited from the ++ # nscd_socket_domain macro. need to investigate ++ # if they are all actually required ++ allow $1 self:unix_stream_socket create_stream_socket_perms; ++ ++ # dg: This may not be required. ++ allow $1 nscd_var_run_t:sock_file read_sock_file_perms; ++ ++ stream_connect_pattern($1, nscd_var_run_t, nscd_var_run_t, nscd_t) ++ files_search_pids($1) ++ allow $1 nscd_t:nscd { getpwd getgrp gethost getserv getnetgrp }; ++ dontaudit $1 nscd_var_run_t:file read_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to search +-## nscd pid directories. ++## Do not audit attempts to search the NSCD pid directory. + ## + ## + ## +@@ -193,7 +219,25 @@ interface(`nscd_dontaudit_search_pid',` + + ######################################## + ## +-## Read nscd pid files. ++## Do not audit attempts to read the NSCD pid directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`nscd_dontaudit_read_pid',` ++ gen_require(` ++ type nscd_var_run_t; ++ ') ++ ++ dontaudit $1 nscd_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Read NSCD pid file. + ## + ## + ## +@@ -212,7 +256,7 @@ interface(`nscd_read_pid',` + + ######################################## + ## +-## Unconfined access to nscd services. ++## Unconfined access to NSCD services. + ## + ## + ## +@@ -244,20 +288,20 @@ interface(`nscd_unconfined',` + ## Role allowed access. + ## + ## ++## + # + interface(`nscd_run',` + gen_require(` +- attribute_role nscd_roles; ++ type nscd_t; + ') + + nscd_domtrans($1) +- roleattribute $2 nscd_roles; ++ role $2 types nscd_t; + ') + + ######################################## + ## +-## Execute the nscd server init +-## script in the initrc domain. ++## Execute the nscd server init script. + ## + ## + ## +@@ -275,8 +319,32 @@ interface(`nscd_initrc_domtrans',` + + ######################################## + ## +-## All of the rules required to +-## administrate an nscd environment. ++## Execute nscd server in the nscd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`nscd_systemctl',` ++ gen_require(` ++ type nscd_unit_file_t; ++ type nscd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 nscd_unit_file_t:file read_file_perms; ++ allow $1 nscd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, nscd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an nscd environment + ## + ## + ## +@@ -285,7 +353,7 @@ interface(`nscd_initrc_domtrans',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the nscd domain. + ## + ## + ## +@@ -294,10 +362,14 @@ interface(`nscd_admin',` + gen_require(` + type nscd_t, nscd_log_t, nscd_var_run_t; + type nscd_initrc_exec_t; ++ type nscd_unit_file_t; + ') + +- allow $1 nscd_t:process { ptrace signal_perms }; ++ allow $1 nscd_t:process signal_perms; + ps_process_pattern($1, nscd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 nscd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, nscd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -310,5 +382,7 @@ interface(`nscd_admin',` + files_list_pids($1) + admin_pattern($1, nscd_var_run_t) + +- nscd_run($1, $2) ++ nscd_systemctl($1) ++ admin_pattern($1, nscd_unit_file_t) ++ allow $1 nscd_unit_file_t:service all_service_perms; + ') +diff --git a/nscd.te b/nscd.te +index bcd7d0a7d5..1cd3a8b62f 100644 +--- a/nscd.te ++++ b/nscd.te +@@ -4,33 +4,34 @@ gen_require(` + class nscd all_nscd_perms; + ') + +-######################################## +-# +-# Declarations +-# +- + ## + ##

      +-## Determine whether confined applications +-## can use nscd shared memory. ++## Allow confined applications to use nscd shared memory. + ##

      + ##
      + gen_tunable(nscd_use_shm, false) + +-attribute_role nscd_roles; ++######################################## ++# ++# Declarations ++# + ++# cjp: this is out of order because of an ++# ordering problem with loadable modules + type nscd_var_run_t; + files_pid_file(nscd_var_run_t) +-init_daemon_run_dir(nscd_var_run_t, "nscd") + ++# nscd is both the client program and the daemon. + type nscd_t; + type nscd_exec_t; + init_daemon_domain(nscd_t, nscd_exec_t) +-role nscd_roles types nscd_t; + + type nscd_initrc_exec_t; + init_script_file(nscd_initrc_exec_t) + ++type nscd_unit_file_t; ++systemd_unit_file(nscd_unit_file_t) ++ + type nscd_log_t; + logging_log_file(nscd_log_t) + +@@ -40,56 +41,61 @@ logging_log_file(nscd_log_t) + # + + allow nscd_t self:capability { kill setgid setuid }; ++allow nscd_t self:capability2 block_suspend; + dontaudit nscd_t self:capability sys_tty_config; + allow nscd_t self:process { getattr getcap setcap setsched signal_perms }; + allow nscd_t self:fifo_file read_fifo_file_perms; +-allow nscd_t self:unix_stream_socket { accept listen }; ++allow nscd_t self:unix_stream_socket create_stream_socket_perms; ++allow nscd_t self:unix_dgram_socket create_socket_perms; + allow nscd_t self:netlink_selinux_socket create_socket_perms; ++allow nscd_t self:tcp_socket create_socket_perms; ++allow nscd_t self:udp_socket create_socket_perms; + ++# For client program operation, invoked from sysadm_t. ++# Transition occurs to nscd_t due to direct_sysadm_daemon. + allow nscd_t self:nscd { admin getstat }; + +-allow nscd_t nscd_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow nscd_t nscd_log_t:file manage_file_perms; + logging_log_filetrans(nscd_t, nscd_log_t, file) + ++manage_dirs_pattern(nscd_t, nscd_var_run_t, nscd_var_run_t) + manage_files_pattern(nscd_t, nscd_var_run_t, nscd_var_run_t) + manage_sock_files_pattern(nscd_t, nscd_var_run_t, nscd_var_run_t) +-files_pid_filetrans(nscd_t, nscd_var_run_t, { file sock_file }) ++allow nscd_t nscd_var_run_t:file map; ++files_pid_filetrans(nscd_t, nscd_var_run_t, { file sock_file dir }) + ++corecmd_search_bin(nscd_t) + can_exec(nscd_t, nscd_exec_t) + +-kernel_list_proc(nscd_t) +-kernel_read_kernel_sysctls(nscd_t) + kernel_read_network_state(nscd_t) ++kernel_read_kernel_sysctls(nscd_t) ++kernel_search_network_sysctl(nscd_t) ++kernel_list_proc(nscd_t) + kernel_read_proc_symlinks(nscd_t) +- +-corecmd_search_bin(nscd_t) ++kernel_read_net_sysctls(nscd_t) + + dev_read_sysfs(nscd_t) + dev_read_rand(nscd_t) + dev_read_urand(nscd_t) + +-domain_search_all_domains_state(nscd_t) +-domain_use_interactive_fds(nscd_t) +- +-files_read_generic_tmp_symlinks(nscd_t) +-files_read_etc_runtime_files(nscd_t) +- + fs_getattr_all_fs(nscd_t) + fs_search_auto_mountpoints(nscd_t) + fs_list_inotifyfs(nscd_t) + ++# for when /etc/passwd has just been updated and has the wrong type + auth_getattr_shadow(nscd_t) + auth_use_nsswitch(nscd_t) + +-corenet_all_recvfrom_unlabeled(nscd_t) + corenet_all_recvfrom_netlabel(nscd_t) + corenet_tcp_sendrecv_generic_if(nscd_t) ++corenet_udp_sendrecv_generic_if(nscd_t) + corenet_tcp_sendrecv_generic_node(nscd_t) +- +-corenet_sendrecv_all_client_packets(nscd_t) +-corenet_tcp_connect_all_ports(nscd_t) ++corenet_udp_sendrecv_generic_node(nscd_t) + corenet_tcp_sendrecv_all_ports(nscd_t) +- ++corenet_udp_sendrecv_all_ports(nscd_t) ++corenet_udp_bind_generic_node(nscd_t) ++corenet_tcp_connect_all_ports(nscd_t) ++corenet_sendrecv_all_client_packets(nscd_t) + corenet_rw_tun_tap_dev(nscd_t) + + selinux_get_fs_mount(nscd_t) +@@ -98,16 +104,24 @@ selinux_compute_access_vector(nscd_t) + selinux_compute_create_context(nscd_t) + selinux_compute_relabel_context(nscd_t) + selinux_compute_user_contexts(nscd_t) ++domain_use_interactive_fds(nscd_t) ++domain_search_all_domains_state(nscd_t) ++ ++files_read_generic_tmp_symlinks(nscd_t) ++# Needed to read files created by firstboot "/etc/hesiod.conf" ++files_read_etc_runtime_files(nscd_t) ++ ++files_map_system_db_files(nscd_t) + + logging_send_audit_msgs(nscd_t) + logging_send_syslog_msg(nscd_t) + +-miscfiles_read_localization(nscd_t) +- + seutil_read_config(nscd_t) + seutil_read_default_contexts(nscd_t) + seutil_sigchld_newrole(nscd_t) + ++sysnet_read_config(nscd_t) ++ + userdom_dontaudit_use_user_terminals(nscd_t) + userdom_dontaudit_use_unpriv_user_fds(nscd_t) + userdom_dontaudit_search_user_home_dirs(nscd_t) +@@ -121,13 +135,11 @@ optional_policy(` + ') + + optional_policy(` +- tunable_policy(`samba_domain_controller',` +- samba_append_log(nscd_t) +- samba_dontaudit_use_fds(nscd_t) +- ') ++ kerberos_use(nscd_t) ++') + +- samba_read_config(nscd_t) +- samba_read_var_files(nscd_t) ++optional_policy(` ++ nis_authenticate(nscd_t) + ') + + optional_policy(` +@@ -138,3 +150,20 @@ optional_policy(` + xen_dontaudit_rw_unix_stream_sockets(nscd_t) + xen_append_log(nscd_t) + ') ++ ++optional_policy(` ++ tunable_policy(`samba_domain_controller',` ++ samba_append_log(nscd_t) ++ samba_dontaudit_use_fds(nscd_t) ++ ') ++') ++ ++optional_policy(` ++ samba_read_config(nscd_t) ++ samba_read_var_files(nscd_t) ++ samba_stream_connect_nmbd(nscd_t) ++') ++ ++optional_policy(` ++ unconfined_dontaudit_rw_packet_sockets(nscd_t) ++') +diff --git a/nsd.fc b/nsd.fc +index 4f2b1b663c..0e24b49a92 100644 +--- a/nsd.fc ++++ b/nsd.fc +@@ -1,16 +1,19 @@ +-/etc/rc\.d/init\.d/nsd -- gen_context(system_u:object_r:nsd_initrc_exec_t,s0) + +-/etc/nsd(/.*)? gen_context(system_u:object_r:nsd_conf_t,s0) +-/etc/nsd/nsd\.db -- gen_context(system_u:object_r:nsd_db_t,s0) +-/etc/nsd/primary(/.*)? gen_context(system_u:object_r:nsd_zone_t,s0) ++/etc/nsd(/.*)? gen_context(system_u:object_r:nsd_conf_t,s0) ++/etc/nsd/nsd\.db -- gen_context(system_u:object_r:nsd_zone_t,s0) ++/etc/nsd/primary(/.*)? gen_context(system_u:object_r:nsd_zone_t,s0) + /etc/nsd/secondary(/.*)? gen_context(system_u:object_r:nsd_zone_t,s0) + +-/usr/sbin/nsd -- gen_context(system_u:object_r:nsd_exec_t,s0) +-/usr/sbin/nsdc -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsd -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsdc -- gen_context(system_u:object_r:nsd_exec_t,s0) + /usr/sbin/nsd-notify -- gen_context(system_u:object_r:nsd_exec_t,s0) +-/usr/sbin/zonec -- gen_context(system_u:object_r:nsd_exec_t,s0) +- +-/var/lib/nsd(/.*)? gen_context(system_u:object_r:nsd_zone_t,s0) +-/var/lib/nsd/nsd\.db -- gen_context(system_u:object_r:nsd_db_t,s0) ++/usr/sbin/zonec -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsd-checkconf -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsd-checkzone -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsd-control -- gen_context(system_u:object_r:nsd_exec_t,s0) ++/usr/sbin/nsd-control-setup -- gen_context(system_u:object_r:nsd_exec_t,s0) + ++/var/lib/nsd(/.*)? gen_context(system_u:object_r:nsd_zone_t,s0) + /var/run/nsd\.pid -- gen_context(system_u:object_r:nsd_var_run_t,s0) ++ ++/var/log/nsd\.log.* -- gen_context(system_u:object_r:nsd_log_t,s0) +diff --git a/nsd.if b/nsd.if +index a9c60ff87b..ad4f14ad60 100644 +--- a/nsd.if ++++ b/nsd.if +@@ -1,8 +1,8 @@ +-## Authoritative only name server. ++## Authoritative only name server + + ######################################## + ## +-## Send and receive datagrams from NSD. (Deprecated) ++## Read NSD pid file. + ## + ## + ## +@@ -10,13 +10,18 @@ + ## + ## + # +-interface(`nsd_udp_chat',` +- refpolicywarn(`$0($*) has been deprecated.') ++interface(`nsd_read_pid',` ++ gen_require(` ++ type nsd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, nsd_var_run_t, nsd_var_run_t) + ') + + ######################################## + ## +-## Connect to NSD over a TCP socket (Deprecated) ++## Send and receive datagrams from NSD. (Deprecated) + ## + ## + ## +@@ -24,47 +29,20 @@ interface(`nsd_udp_chat',` + ## + ## + # +-interface(`nsd_tcp_connect',` ++interface(`nsd_udp_chat',` + refpolicywarn(`$0($*) has been deprecated.') + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an nsd environment. ++## Connect to NSD over a TCP socket (Deprecated) + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # +-interface(`nsd_admin',` +- gen_require(` +- type nsd_t, nsd_conf_t, nsd_var_run_t; +- type nsd_initrc_exec_t, nsd_db_t, nsd_zone_t; +- ') +- +- allow $1 nsd_t:process { ptrace signal_perms }; +- ps_process_pattern($1, nsd_t) +- +- init_labeled_script_domtrans($1, nsd_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 nsd_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_etc($1) +- admin_pattern($1, { nsd_conf_t nsd_db_t }) +- +- files_search_var_lib($1) +- admin_pattern($1, nsd_zone_t) +- +- files_list_pids($1) +- admin_pattern($1, nsd_var_run_t) ++interface(`nsd_tcp_connect',` ++ refpolicywarn(`$0($*) has been deprecated.') + ') +diff --git a/nsd.te b/nsd.te +index 47bb1d2049..94070d2237 100644 +--- a/nsd.te ++++ b/nsd.te +@@ -9,9 +9,7 @@ type nsd_t; + type nsd_exec_t; + init_daemon_domain(nsd_t, nsd_exec_t) + +-type nsd_initrc_exec_t; +-init_script_file(nsd_initrc_exec_t) +- ++# A type for configuration files of nsd + type nsd_conf_t; + files_type(nsd_conf_t) + +@@ -20,40 +18,51 @@ domain_type(nsd_crond_t) + domain_entry_file(nsd_crond_t, nsd_exec_t) + role system_r types nsd_crond_t; + +-type nsd_db_t; +-files_type(nsd_db_t) ++type nsd_log_t; ++logging_log_file(nsd_log_t) + + type nsd_var_run_t; + files_pid_file(nsd_var_run_t) + +-type nsd_zone_t; ++# A type for zone files ++type nsd_zone_t alias nsd_db_t; + files_type(nsd_zone_t) + ++type nsd_tmp_t; ++files_tmp_file(nsd_tmp_t) ++ + ######################################## + # +-# Local policy ++# NSD Local policy + # + +-allow nsd_t self:capability { chown dac_override kill setgid setuid }; ++allow nsd_t self:capability { chown dac_read_search dac_override kill setgid setuid net_admin }; + dontaudit nsd_t self:capability sys_tty_config; + allow nsd_t self:process signal_perms; ++allow nsd_t self:tcp_socket create_stream_socket_perms; ++allow nsd_t self:udp_socket create_socket_perms; + allow nsd_t self:fifo_file rw_fifo_file_perms; +-allow nsd_t self:tcp_socket { accept listen }; + +-allow nsd_t nsd_conf_t:dir list_dir_perms; +-allow nsd_t nsd_conf_t:file read_file_perms; +-allow nsd_t nsd_conf_t:lnk_file read_lnk_file_perms; +- +-allow nsd_t nsd_db_t:file manage_file_perms; +-filetrans_pattern(nsd_t, nsd_zone_t, nsd_db_t, file) ++manage_dirs_pattern(nsd_t, nsd_conf_t, nsd_conf_t) ++manage_files_pattern(nsd_t, nsd_conf_t, nsd_conf_t) ++read_lnk_files_pattern(nsd_t, nsd_conf_t, nsd_conf_t) + + manage_files_pattern(nsd_t, nsd_var_run_t, nsd_var_run_t) + files_pid_filetrans(nsd_t, nsd_var_run_t, file) + ++manage_files_pattern(nsd_t, nsd_log_t, nsd_log_t) ++logging_log_filetrans(nsd_t, nsd_log_t, file) ++ + manage_dirs_pattern(nsd_t, nsd_zone_t, nsd_zone_t) + manage_files_pattern(nsd_t, nsd_zone_t, nsd_zone_t) + manage_lnk_files_pattern(nsd_t, nsd_zone_t, nsd_zone_t) + files_var_lib_filetrans(nsd_t, nsd_zone_t, dir) ++allow nsd_t nsd_zone_t:file { map } ; ++ ++manage_dirs_pattern(nsd_t, nsd_tmp_t, nsd_tmp_t) ++manage_files_pattern(nsd_t, nsd_tmp_t, nsd_tmp_t) ++files_tmp_filetrans(nsd_t, nsd_tmp_t, { file dir }) ++allow nsd_t nsd_tmp_t:file { map } ; + + can_exec(nsd_t, nsd_exec_t) + +@@ -62,7 +71,6 @@ kernel_read_kernel_sysctls(nsd_t) + + corecmd_exec_bin(nsd_t) + +-corenet_all_recvfrom_unlabeled(nsd_t) + corenet_all_recvfrom_netlabel(nsd_t) + corenet_tcp_sendrecv_generic_if(nsd_t) + corenet_udp_sendrecv_generic_if(nsd_t) +@@ -72,16 +80,20 @@ corenet_tcp_sendrecv_all_ports(nsd_t) + corenet_udp_sendrecv_all_ports(nsd_t) + corenet_tcp_bind_generic_node(nsd_t) + corenet_udp_bind_generic_node(nsd_t) +- +-corenet_sendrecv_dns_server_packets(nsd_t) + corenet_tcp_bind_dns_port(nsd_t) + corenet_udp_bind_dns_port(nsd_t) ++corenet_sendrecv_dns_server_packets(nsd_t) ++corenet_tcp_bind_nsd_control_port(nsd_t) ++corenet_sendrecv_nsd_control_server_packets(nsd_t) ++corenet_tcp_connect_nsd_control_port(nsd_t) + + dev_read_sysfs(nsd_t) ++dev_read_urand(nsd_t) + + domain_use_interactive_fds(nsd_t) + + files_read_etc_runtime_files(nsd_t) ++files_search_var_lib(nsd_t) + + fs_getattr_all_fs(nsd_t) + fs_search_auto_mountpoints(nsd_t) +@@ -90,8 +102,6 @@ auth_use_nsswitch(nsd_t) + + logging_send_syslog_msg(nsd_t) + +-miscfiles_read_localization(nsd_t) +- + userdom_dontaudit_use_unpriv_user_fds(nsd_t) + userdom_dontaudit_search_user_home_dirs(nsd_t) + +@@ -105,23 +115,24 @@ optional_policy(` + + ######################################## + # +-# Cron local policy ++# Zone update cron job local policy + # + +-allow nsd_crond_t self:capability { dac_override kill }; ++# kill capability for root cron job and non-root daemon ++allow nsd_crond_t self:capability { dac_read_search dac_override kill }; + dontaudit nsd_crond_t self:capability sys_nice; + allow nsd_crond_t self:process { setsched signal_perms }; + allow nsd_crond_t self:fifo_file rw_fifo_file_perms; ++allow nsd_crond_t self:tcp_socket create_socket_perms; ++allow nsd_crond_t self:udp_socket create_socket_perms; + +-allow nsd_crond_t nsd_t:process signal; +-ps_process_pattern(nsd_crond_t, nsd_t) +- +-allow nsd_crond_t nsd_conf_t:dir list_dir_perms; + allow nsd_crond_t nsd_conf_t:file read_file_perms; +-allow nsd_crond_t nsd_conf_t:lnk_file read_lnk_file_perms; + +-allow nsd_crond_t nsd_db_t:file manage_file_perms; +-filetrans_pattern(nsd_crond_t, nsd_zone_t, nsd_db_t, file) ++files_search_var_lib(nsd_crond_t) ++ ++allow nsd_crond_t nsd_t:process signal; ++ ++ps_process_pattern(nsd_crond_t, nsd_t) + + manage_files_pattern(nsd_crond_t, nsd_zone_t, nsd_zone_t) + filetrans_pattern(nsd_crond_t, nsd_conf_t, nsd_zone_t, file) +@@ -133,29 +144,33 @@ kernel_read_system_state(nsd_crond_t) + corecmd_exec_bin(nsd_crond_t) + corecmd_exec_shell(nsd_crond_t) + +-corenet_all_recvfrom_unlabeled(nsd_crond_t) + corenet_all_recvfrom_netlabel(nsd_crond_t) + corenet_tcp_sendrecv_generic_if(nsd_crond_t) ++corenet_udp_sendrecv_generic_if(nsd_crond_t) + corenet_tcp_sendrecv_generic_node(nsd_crond_t) +- +-corenet_sendrecv_all_client_packets(nsd_crond_t) +-corenet_tcp_connect_all_ports(nsd_crond_t) ++corenet_udp_sendrecv_generic_node(nsd_crond_t) + corenet_tcp_sendrecv_all_ports(nsd_crond_t) ++corenet_udp_sendrecv_all_ports(nsd_crond_t) ++corenet_tcp_connect_all_ports(nsd_crond_t) ++corenet_sendrecv_all_client_packets(nsd_crond_t) + + dev_read_urand(nsd_crond_t) + + domain_dontaudit_read_all_domains_state(nsd_crond_t) + + files_read_etc_runtime_files(nsd_crond_t) ++files_search_var_lib(nsd_t) + + auth_use_nsswitch(nsd_crond_t) + + logging_send_syslog_msg(nsd_crond_t) + +-miscfiles_read_localization(nsd_crond_t) +- + userdom_dontaudit_search_user_home_dirs(nsd_crond_t) + ++optional_policy(` ++ nsd_read_pid(nsd_crond_t) ++') ++ + optional_policy(` + cron_system_entry(nsd_crond_t, nsd_exec_t) + ') +diff --git a/nslcd.fc b/nslcd.fc +index 402100e40f..ce913b2442 100644 +--- a/nslcd.fc ++++ b/nslcd.fc +@@ -1,7 +1,4 @@ +-/etc/nss-ldapd\.conf -- gen_context(system_u:object_r:nslcd_conf_t,s0) +- +-/etc/rc\.d/init\.d/nslcd -- gen_context(system_u:object_r:nslcd_initrc_exec_t,s0) +- +-/usr/sbin/nslcd -- gen_context(system_u:object_r:nslcd_exec_t,s0) +- +-/var/run/nslcd(/.*)? gen_context(system_u:object_r:nslcd_var_run_t,s0) ++/etc/nss-ldapd.conf -- gen_context(system_u:object_r:nslcd_conf_t,s0) ++/etc/rc\.d/init\.d/nslcd -- gen_context(system_u:object_r:nslcd_initrc_exec_t,s0) ++/usr/sbin/nslcd -- gen_context(system_u:object_r:nslcd_exec_t,s0) ++/var/run/nslcd(/.*)? gen_context(system_u:object_r:nslcd_var_run_t,s0) +diff --git a/nslcd.if b/nslcd.if +index 97df768d94..852d1c6c7a 100644 +--- a/nslcd.if ++++ b/nslcd.if +@@ -1,4 +1,4 @@ +-## Local LDAP name service daemon. ++## nslcd - local LDAP name service daemon. + + ######################################## + ## +@@ -15,7 +15,6 @@ interface(`nslcd_domtrans',` + type nslcd_t, nslcd_exec_t; + ') + +- corecmd_searh_bin($1) + domtrans_pattern($1, nslcd_exec_t, nslcd_t) + ') + +@@ -39,7 +38,7 @@ interface(`nslcd_initrc_domtrans',` + + ######################################## + ## +-## Read nslcd pid files. ++## Read nslcd PID files. + ## + ## + ## +@@ -58,8 +57,25 @@ interface(`nslcd_read_pid_files',` + + ######################################## + ## +-## Connect to nslcd over an unix +-## domain stream socket. ++## Dontaudit write to nslcd over an unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nslcd_dontaudit_write_ock_file',` ++ gen_require(` ++ type nslcd_var_run_t; ++ ') ++ ++ dontaudit $1 nslcd_var_run_t:sock_file write; ++') ++ ++######################################## ++## ++## Connect to nslcd over an unix stream socket. + ## + ## + ## +@@ -72,14 +88,33 @@ interface(`nslcd_stream_connect',` + type nslcd_t, nslcd_var_run_t; + ') + +- files_search_pids($1) + stream_connect_pattern($1, nslcd_var_run_t, nslcd_var_run_t, nslcd_t) ++ files_search_pids($1) ++') ++ ++####################################### ++## ++## Do not audit attempts to write nslcd sock files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`nslcd_dontaudit_write_sock_file',` ++ gen_require(` ++ type nslcd_t, nslcd_var_run_t; ++ ') ++ ++ dontaudit $1 nslcd_t:sock_file write; ++ dontaudit $1 nslcd_var_run_t:sock_file write; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an nslcd environment. ++## All of the rules required to administrate ++## an nslcd environment + ## + ## + ## +@@ -99,17 +134,21 @@ interface(`nslcd_admin',` + type nslcd_conf_t; + ') + +- allow $1 nslcd_t:process { ptrace signal_perms }; + ps_process_pattern($1, nslcd_t) ++ allow $1 nslcd_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 nslcd_t:process ptrace; ++ ') + ++ # Allow nslcd_t to restart the apache service + nslcd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 nslcd_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) ++ files_list_etc($1) + admin_pattern($1, nslcd_conf_t) + +- files_search_pids($1) +- admin_pattern($1, nslcd_var_run_t) ++ files_list_pids($1) ++ admin_pattern($1, nslcd_var_run_t, nslcd_var_run_t) + ') +diff --git a/nslcd.te b/nslcd.te +index 421bf1a56c..1be3b6b306 100644 +--- a/nslcd.te ++++ b/nslcd.te +@@ -20,12 +20,12 @@ files_config_file(nslcd_conf_t) + + ######################################## + # +-# Local policy ++# nslcd local policy + # + +-allow nslcd_t self:capability { setgid setuid dac_override }; +-allow nslcd_t self:process signal; +-allow nslcd_t self:unix_stream_socket { accept listen }; ++allow nslcd_t self:capability { chown dac_read_search dac_override setgid setuid sys_nice }; ++allow nslcd_t self:process { setsched signal signull }; ++allow nslcd_t self:unix_stream_socket create_stream_socket_perms; + + allow nslcd_t nslcd_conf_t:file read_file_perms; + +@@ -36,16 +36,17 @@ files_pid_filetrans(nslcd_t, nslcd_var_run_t, { file dir }) + + kernel_read_system_state(nslcd_t) + ++dev_read_sysfs(nslcd_t) ++ + corenet_all_recvfrom_unlabeled(nslcd_t) + corenet_all_recvfrom_netlabel(nslcd_t) +-corenet_tcp_sendrecv_generic_if(nslcd_t) +-corenet_tcp_sendrecv_generic_node(nslcd_t) +- +-corenet_sendrecv_ldap_client_packets(nslcd_t) + corenet_tcp_connect_ldap_port(nslcd_t) +-corenet_tcp_sendrecv_ldap_port(nslcd_t) ++corenet_sendrecv_ldap_client_packets(nslcd_t) + + dev_read_sysfs(nslcd_t) ++dev_read_urand(nslcd_t) ++ ++corecmd_exec_bin(nslcd_t) + + files_read_usr_symlinks(nslcd_t) + files_list_tmp(nslcd_t) +@@ -54,10 +55,13 @@ auth_use_nsswitch(nslcd_t) + + logging_send_syslog_msg(nslcd_t) + +-miscfiles_read_localization(nslcd_t) +- + userdom_read_user_tmp_files(nslcd_t) + ++optional_policy(` ++ dirsrv_stream_connect(nslcd_t) ++') ++ + optional_policy(` + ldap_stream_connect(nslcd_t) + ') ++ +diff --git a/nsplugin.fc b/nsplugin.fc +new file mode 100644 +index 0000000000..22e6c963c0 +--- /dev/null ++++ b/nsplugin.fc +@@ -0,0 +1,11 @@ ++HOME_DIR/\.adobe(/.*)? gen_context(system_u:object_r:nsplugin_home_t,s0) ++HOME_DIR/\.macromedia(/.*)? gen_context(system_u:object_r:nsplugin_home_t,s0) ++HOME_DIR/\.gnash(/.*)? gen_context(system_u:object_r:nsplugin_home_t,s0) ++HOME_DIR/\.gcjwebplugin(/.*)? gen_context(system_u:object_r:nsplugin_home_t,s0) ++HOME_DIR/\.icedteaplugin(/.*)? gen_context(system_u:object_r:nsplugin_home_t,s0) ++ ++/usr/bin/nspluginscan -- gen_context(system_u:object_r:nsplugin_exec_t,s0) ++/usr/bin/nspluginviewer -- gen_context(system_u:object_r:nsplugin_exec_t,s0) ++/usr/lib/nspluginwrapper/npviewer.bin -- gen_context(system_u:object_r:nsplugin_exec_t,s0) ++/usr/lib/nspluginwrapper/plugin-config -- gen_context(system_u:object_r:nsplugin_config_exec_t,s0) ++/usr/lib/mozilla/plugins-wrapped(/.*)? gen_context(system_u:object_r:nsplugin_rw_t,s0) +diff --git a/nsplugin.if b/nsplugin.if +new file mode 100644 +index 0000000000..bceb5271eb +--- /dev/null ++++ b/nsplugin.if +@@ -0,0 +1,474 @@ ++ ++## policy for nsplugin ++ ++######################################## ++## ++## Create, read, write, and delete ++## nsplugin rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_manage_rw_files',` ++ gen_require(` ++ type nsplugin_rw_t; ++ ') ++ ++ allow $1 nsplugin_rw_t:file manage_file_perms; ++ allow $1 nsplugin_rw_t:dir rw_dir_perms; ++') ++ ++######################################## ++## ++## Manage nsplugin rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_manage_rw',` ++ gen_require(` ++ type nsplugin_rw_t; ++ ') ++ ++ manage_dirs_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++ manage_files_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++ manage_lnk_files_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++') ++ ++####################################### ++## ++## The per role template for the nsplugin module. ++## ++## ++## ++## The role associated with the user domain. ++## ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++interface(`nsplugin_role_notrans',` ++ gen_require(` ++ type nsplugin_rw_t; ++ type nsplugin_home_t; ++ type nsplugin_exec_t; ++ type nsplugin_config_exec_t; ++ type nsplugin_t; ++ type nsplugin_config_t; ++ class x_drawable all_x_drawable_perms; ++ class x_resource all_x_resource_perms; ++ class dbus send_msg; ++ ') ++ ++ role $1 types nsplugin_t; ++ role $1 types nsplugin_config_t; ++ ++ allow nsplugin_t $2:process signull; ++ allow nsplugin_t $2:dbus send_msg; ++ allow $2 nsplugin_t:dbus send_msg; ++ ++ list_dirs_pattern($2, nsplugin_rw_t, nsplugin_rw_t) ++ read_files_pattern($2, nsplugin_rw_t, nsplugin_rw_t) ++ read_lnk_files_pattern($2, nsplugin_rw_t, nsplugin_rw_t) ++ can_exec($2, nsplugin_rw_t) ++ ++ #Leaked File Descriptors ++ifdef(`hide_broken_symptoms', ` ++ dontaudit nsplugin_t $2:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit nsplugin_config_t $2:fifo_file rw_inherited_fifo_file_perms; ++') ++ allow nsplugin_t $2:unix_stream_socket connectto; ++ dontaudit nsplugin_t $2:process ptrace; ++ allow nsplugin_t $2:sem rw_sem_perms; ++ allow nsplugin_t $2:shm rw_shm_perms; ++ dontaudit nsplugin_t $2:shm destroy; ++ allow $2 nsplugin_t:sem rw_sem_perms; ++ ++ allow $2 nsplugin_t:process { getattr signal_perms }; ++ allow $2 nsplugin_t:unix_stream_socket connectto; ++ ++ # Connect to pulseaudit server ++ stream_connect_pattern(nsplugin_t, user_home_t, user_home_t, $2) ++ optional_policy(` ++ gnome_stream_connect(nsplugin_t, $2) ++ ') ++ ++ userdom_use_inherited_user_terminals(nsplugin_t) ++ userdom_use_inherited_user_terminals(nsplugin_config_t) ++ userdom_dontaudit_setattr_user_home_content_files(nsplugin_t) ++ userdom_manage_tmp_role($1, nsplugin_t) ++ ++ optional_policy(` ++ pulseaudio_role($1, nsplugin_t) ++ ') ++') ++ ++####################################### ++## ++## Role access for nsplugin ++## ++## ++## ++## The role associated with the user domain. ++## ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++interface(`nsplugin_role',` ++ gen_require(` ++ type nsplugin_exec_t; ++ type nsplugin_config_exec_t; ++ type nsplugin_t; ++ type nsplugin_config_t; ++ ') ++ ++ nsplugin_role_notrans($1, $2) ++ ++ domtrans_pattern($2, nsplugin_exec_t, nsplugin_t) ++ domtrans_pattern($2, nsplugin_config_exec_t, nsplugin_config_t) ++ ++') ++ ++####################################### ++## ++## The per role template for the nsplugin module. ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++interface(`nsplugin_domtrans',` ++ gen_require(` ++ type nsplugin_exec_t; ++ type nsplugin_t; ++ ') ++ ++ domtrans_pattern($1, nsplugin_exec_t, nsplugin_t) ++ allow $1 nsplugin_t:unix_stream_socket connectto; ++ allow nsplugin_t $1:process signal; ++') ++ ++####################################### ++## ++## The per role template for the nsplugin module. ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++interface(`nsplugin_domtrans_config',` ++ gen_require(` ++ type nsplugin_config_exec_t; ++ type nsplugin_config_t; ++ ') ++ ++ domtrans_pattern($1, nsplugin_config_exec_t, nsplugin_config_t) ++') ++ ++######################################## ++## ++## Search nsplugin rw directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_search_rw_dir',` ++ gen_require(` ++ type nsplugin_rw_t; ++ ') ++ ++ allow $1 nsplugin_rw_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Read nsplugin rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_read_rw_files',` ++ gen_require(` ++ type nsplugin_rw_t; ++ ') ++ ++ list_dirs_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++ read_files_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++ read_lnk_files_pattern($1, nsplugin_rw_t, nsplugin_rw_t) ++') ++ ++######################################## ++## ++## Read nsplugin home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_read_home',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ list_dirs_pattern($1, nsplugin_home_t, nsplugin_home_t) ++ read_files_pattern($1, nsplugin_home_t, nsplugin_home_t) ++ read_lnk_files_pattern($1, nsplugin_home_t, nsplugin_home_t) ++') ++ ++######################################## ++## ++## Exec nsplugin rw files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_rw_exec',` ++ gen_require(` ++ type nsplugin_rw_t; ++ ') ++ ++ can_exec($1, nsplugin_rw_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## nsplugin home files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_manage_home_files',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ manage_files_pattern($1, nsplugin_home_t, nsplugin_home_t) ++') ++ ++######################################## ++## ++## manage nnsplugin home dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_manage_home_dirs',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ manage_dirs_pattern($1, nsplugin_home_t, nsplugin_home_t) ++') ++ ++######################################## ++## ++## Allow attempts to read and write to ++## nsplugin named pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`nsplugin_rw_pipes',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ allow $1 nsplugin_home_t:fifo_file rw_fifo_file_perms; ++') ++ ++######################################## ++## ++## Read and write to nsplugin shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_rw_shm',` ++ gen_require(` ++ type nsplugin_t; ++ ') ++ ++ allow $1 nsplugin_t:shm rw_shm_perms; ++') ++ ++##################################### ++## ++## Allow read and write access to nsplugin semaphores. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_rw_semaphores',` ++ gen_require(` ++ type nsplugin_t; ++ ') ++ ++ allow $1 nsplugin_t:sem rw_sem_perms; ++') ++ ++######################################## ++## ++## Execute nsplugin_exec_t ++## in the specified domain. ++## ++## ++##

      ++## Execute a nsplugin_exec_t ++## in the specified domain. ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`nsplugin_exec_domtrans',` ++ gen_require(` ++ type nsplugin_exec_t; ++ ') ++ ++ allow $2 nsplugin_exec_t:file entrypoint; ++ domtrans_pattern($1, nsplugin_exec_t, $2) ++') ++ ++######################################## ++## ++## Send generic signals to user nsplugin processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_signal',` ++ gen_require(` ++ type nsplugin_t; ++ ') ++ ++ allow $1 nsplugin_t:process signal; ++') ++ ++######################################## ++## ++## Create objects in a user home directory ++## with an automatic type transition to ++## the nsplugin home file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++# ++interface(`nsplugin_user_home_dir_filetrans',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, nsplugin_home_t, $2) ++') ++ ++####################################### ++## ++## Create objects in a user home directory ++## with an automatic type transition to ++## the nsplugin home file type. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The class of the object to be created. ++## ++## ++# ++interface(`nsplugin_user_home_filetrans',` ++ gen_require(` ++ type nsplugin_home_t; ++ ') ++ ++ userdom_user_home_content_filetrans($1, nsplugin_home_t, $2) ++') ++ ++######################################## ++## ++## Send signull signal to nsplugin ++## processes. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nsplugin_signull',` ++ gen_require(` ++ type nsplugin_t; ++ ') ++ ++ allow $1 nsplugin_t:process signull; ++') +diff --git a/nsplugin.te b/nsplugin.te +new file mode 100644 +index 0000000000..7d839fe6ec +--- /dev/null ++++ b/nsplugin.te +@@ -0,0 +1,318 @@ ++policy_module(nsplugin, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow nsplugin code to execmem/execstack ++##

      ++##
      ++gen_tunable(nsplugin_execmem, false) ++ ++## ++##

      ++## Allow nsplugin code to connect to unreserved ports ++##

      ++##
      ++gen_tunable(nsplugin_can_network, true) ++ ++type nsplugin_exec_t; ++application_executable_file(nsplugin_exec_t) ++ ++type nsplugin_config_exec_t; ++application_executable_file(nsplugin_config_exec_t) ++ ++type nsplugin_rw_t; ++files_poly_member(nsplugin_rw_t) ++files_type(nsplugin_rw_t) ++ ++type nsplugin_tmp_t; ++files_tmp_file(nsplugin_tmp_t) ++ ++type nsplugin_home_t; ++files_poly_member(nsplugin_home_t) ++userdom_user_home_content(nsplugin_home_t) ++typealias nsplugin_home_t alias user_nsplugin_home_t; ++ ++type nsplugin_t; ++application_domain(nsplugin_t, nsplugin_exec_t) ++ ++type nsplugin_config_t; ++domain_type(nsplugin_config_t) ++domain_entry_file(nsplugin_config_t, nsplugin_config_exec_t) ++ ++######################################## ++# ++# nsplugin local policy ++# ++dontaudit nsplugin_t self:capability { sys_nice sys_tty_config }; ++allow nsplugin_t self:fifo_file rw_file_perms; ++allow nsplugin_t self:process { setpgid getsched setsched signal_perms }; ++ ++allow nsplugin_t self:sem create_sem_perms; ++allow nsplugin_t self:shm create_shm_perms; ++allow nsplugin_t self:msgq create_msgq_perms; ++allow nsplugin_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow nsplugin_t self:unix_stream_socket { connectto create_stream_socket_perms }; ++allow nsplugin_t self:unix_dgram_socket { sendto create_socket_perms }; ++allow nsplugin_t self:tcp_socket create_stream_socket_perms; ++allow nsplugin_t nsplugin_rw_t:dir list_dir_perms; ++read_lnk_files_pattern(nsplugin_t, nsplugin_rw_t, nsplugin_rw_t) ++read_files_pattern(nsplugin_t, nsplugin_rw_t, nsplugin_rw_t) ++ ++tunable_policy(`nsplugin_execmem',` ++ allow nsplugin_t self:process { execstack execmem }; ++ allow nsplugin_config_t self:process { execstack execmem }; ++') ++ ++tunable_policy(`nsplugin_can_network',` ++ corenet_tcp_connect_all_unreserved_ports(nsplugin_t) ++ corenet_tcp_connect_all_ephemeral_ports(nsplugin_t) ++') ++ ++manage_dirs_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++exec_files_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++manage_files_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++manage_fifo_files_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++manage_sock_files_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++manage_lnk_files_pattern(nsplugin_t, nsplugin_home_t, nsplugin_home_t) ++userdom_user_home_dir_filetrans(nsplugin_t, nsplugin_home_t, {file dir}) ++userdom_user_home_content_filetrans(nsplugin_t, nsplugin_home_t, {file dir}) ++userdom_dontaudit_getattr_user_home_content(nsplugin_t) ++userdom_dontaudit_search_user_bin_dirs(nsplugin_t) ++userdom_dontaudit_write_user_home_content_files(nsplugin_t) ++userdom_dontaudit_search_admin_dir(nsplugin_t) ++ ++corecmd_exec_bin(nsplugin_t) ++corecmd_exec_shell(nsplugin_t) ++ ++corenet_all_recvfrom_netlabel(nsplugin_t) ++corenet_tcp_connect_flash_port(nsplugin_t) ++corenet_tcp_connect_ms_streaming_port(nsplugin_t) ++corenet_tcp_connect_rtsp_port(nsplugin_t) ++corenet_tcp_connect_pulseaudio_port(nsplugin_t) ++corenet_tcp_connect_http_port(nsplugin_t) ++corenet_tcp_connect_http_cache_port(nsplugin_t) ++corenet_tcp_connect_squid_port(nsplugin_t) ++corenet_tcp_sendrecv_generic_if(nsplugin_t) ++corenet_tcp_sendrecv_generic_node(nsplugin_t) ++corenet_tcp_connect_ipp_port(nsplugin_t) ++corenet_tcp_connect_speech_port(nsplugin_t) ++ ++domain_dontaudit_read_all_domains_state(nsplugin_t) ++ ++dev_read_urand(nsplugin_t) ++dev_read_rand(nsplugin_t) ++dev_read_sound(nsplugin_t) ++dev_write_sound(nsplugin_t) ++dev_read_video_dev(nsplugin_t) ++dev_write_video_dev(nsplugin_t) ++dev_getattr_dri_dev(nsplugin_t) ++dev_getattr_mouse_dev(nsplugin_t) ++dev_rwx_zero(nsplugin_t) ++dev_read_sysfs(nsplugin_t) ++dev_dontaudit_getattr_all(nsplugin_t) ++ ++kernel_read_kernel_sysctls(nsplugin_t) ++kernel_read_system_state(nsplugin_t) ++kernel_read_network_state(nsplugin_t) ++ ++files_dontaudit_getattr_lost_found_dirs(nsplugin_t) ++files_dontaudit_list_home(nsplugin_t) ++files_read_config_files(nsplugin_t) ++ ++fs_getattr_tmpfs(nsplugin_t) ++fs_getattr_xattr_fs(nsplugin_t) ++fs_search_auto_mountpoints(nsplugin_t) ++fs_rw_anon_inodefs_files(nsplugin_t) ++fs_list_inotifyfs(nsplugin_t) ++fs_dontaudit_list_fusefs(nsplugin_t) ++ ++storage_dontaudit_getattr_fixed_disk_dev(nsplugin_t) ++storage_dontaudit_getattr_removable_dev(nsplugin_t) ++ ++term_dontaudit_getattr_all_ptys(nsplugin_t) ++term_dontaudit_getattr_all_ttys(nsplugin_t) ++ ++auth_use_nsswitch(nsplugin_t) ++ ++libs_exec_ld_so(nsplugin_t) ++ ++miscfiles_read_fonts(nsplugin_t) ++miscfiles_dontaudit_write_fonts(nsplugin_t) ++miscfiles_setattr_fonts_cache_dirs(nsplugin_t) ++ ++userdom_manage_user_tmp_dirs(nsplugin_t) ++userdom_manage_user_tmp_files(nsplugin_t) ++userdom_manage_user_tmp_sockets(nsplugin_t) ++userdom_tmp_filetrans_user_tmp(nsplugin_t, { file dir sock_file }) ++userdom_rw_semaphores(nsplugin_t) ++userdom_dontaudit_rw_user_tmp_pipes(nsplugin_t) ++ ++userdom_read_user_home_content_symlinks(nsplugin_t) ++userdom_read_user_home_content_files(nsplugin_t) ++userdom_read_user_tmp_files(nsplugin_t) ++userdom_write_user_tmp_sockets(nsplugin_t) ++userdom_dontaudit_append_user_home_content_files(nsplugin_t) ++userdom_read_home_audio_files(nsplugin_t) ++ ++optional_policy(` ++ alsa_read_rw_config(nsplugin_t) ++ alsa_read_home_files(nsplugin_t) ++') ++ ++optional_policy(` ++ chrome_dontaudit_sandbox_leaks(nsplugin_t) ++') ++ ++optional_policy(` ++ cups_stream_connect(nsplugin_t) ++') ++ ++optional_policy(` ++ dbus_session_bus_client(nsplugin_t) ++ dbus_connect_session_bus(nsplugin_t) ++ dbus_system_bus_client(nsplugin_t) ++') ++ ++optional_policy(` ++ gnome_exec_gconf(nsplugin_t) ++ gnome_manage_config(nsplugin_t) ++ gnome_read_gconf_home_files(nsplugin_t) ++ gnome_read_usr_config(nsplugin_t) ++') ++ ++optional_policy(` ++ gpm_getattr_gpmctl(nsplugin_t) ++') ++ ++optional_policy(` ++ mozilla_exec_user_home_files(nsplugin_t) ++ mozilla_read_user_home_files(nsplugin_t) ++ mozilla_write_user_home_files(nsplugin_t) ++ mozilla_plugin_delete_tmpfs_files(nsplugin_t) ++') ++ ++optional_policy(` ++ mplayer_exec(nsplugin_t) ++ mplayer_read_user_home_files(nsplugin_t) ++') ++ ++optional_policy(` ++ sandbox_read_tmpfs_files(nsplugin_t) ++') ++ ++optional_policy(` ++ gen_require(` ++ type user_tmpfs_t; ++ ') ++ xserver_user_x_domain_template(nsplugin, nsplugin_t, user_tmpfs_t) ++ xserver_rw_shm(nsplugin_t) ++ xserver_read_xdm_pid(nsplugin_t) ++ xserver_read_xdm_tmp_files(nsplugin_t) ++ xserver_read_user_xauth(nsplugin_t) ++ xserver_read_user_iceauth(nsplugin_t) ++ xserver_use_user_fonts(nsplugin_t) ++ xserver_rw_inherited_user_fonts(nsplugin_t) ++') ++ ++######################################## ++# ++# nsplugin_config local policy ++# ++ ++allow nsplugin_config_t self:capability { dac_override dac_read_search sys_nice setuid setgid }; ++allow nsplugin_config_t self:process { setsched signal_perms getsched execmem }; ++#execing pulseaudio ++dontaudit nsplugin_t self:process { getcap setcap }; ++ ++allow nsplugin_config_t self:fifo_file rw_file_perms; ++allow nsplugin_config_t self:unix_stream_socket create_stream_socket_perms; ++ ++dev_search_sysfs(nsplugin_config_t) ++dev_read_urand(nsplugin_config_t) ++dev_dontaudit_read_rand(nsplugin_config_t) ++dev_dontaudit_rw_dri(nsplugin_config_t) ++ ++fs_search_auto_mountpoints(nsplugin_config_t) ++fs_list_inotifyfs(nsplugin_config_t) ++ ++can_exec(nsplugin_config_t, nsplugin_rw_t) ++manage_dirs_pattern(nsplugin_config_t, nsplugin_rw_t, nsplugin_rw_t) ++manage_files_pattern(nsplugin_config_t, nsplugin_rw_t, nsplugin_rw_t) ++manage_lnk_files_pattern(nsplugin_config_t, nsplugin_rw_t, nsplugin_rw_t) ++ ++manage_dirs_pattern(nsplugin_config_t, nsplugin_home_t, nsplugin_home_t) ++manage_files_pattern(nsplugin_config_t, nsplugin_home_t, nsplugin_home_t) ++manage_lnk_files_pattern(nsplugin_config_t, nsplugin_home_t, nsplugin_home_t) ++ ++corecmd_exec_bin(nsplugin_config_t) ++corecmd_exec_shell(nsplugin_config_t) ++ ++kernel_read_system_state(nsplugin_config_t) ++kernel_request_load_module(nsplugin_config_t) ++ ++domain_use_interactive_fds(nsplugin_config_t) ++ ++files_dontaudit_search_home(nsplugin_config_t) ++files_list_tmp(nsplugin_config_t) ++ ++auth_use_nsswitch(nsplugin_config_t) ++ ++miscfiles_read_fonts(nsplugin_config_t) ++ ++userdom_search_user_home_content(nsplugin_config_t) ++userdom_read_user_home_content_symlinks(nsplugin_config_t) ++userdom_read_user_home_content_files(nsplugin_config_t) ++userdom_dontaudit_search_admin_dir(nsplugin_config_t) ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_getattr_nfs(nsplugin_t) ++ fs_manage_nfs_dirs(nsplugin_t) ++ fs_manage_nfs_files(nsplugin_t) ++ fs_manage_nfs_symlinks(nsplugin_t) ++ fs_manage_nfs_named_pipes(nsplugin_t) ++ fs_manage_nfs_dirs(nsplugin_config_t) ++ fs_manage_nfs_files(nsplugin_config_t) ++ fs_manage_nfs_named_pipes(nsplugin_config_t) ++ fs_manage_nfs_symlinks(nsplugin_config_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_getattr_cifs(nsplugin_t) ++ fs_manage_cifs_dirs(nsplugin_t) ++ fs_manage_cifs_files(nsplugin_t) ++ fs_manage_cifs_symlinks(nsplugin_t) ++ fs_manage_cifs_named_pipes(nsplugin_t) ++ fs_manage_cifs_dirs(nsplugin_config_t) ++ fs_manage_cifs_files(nsplugin_config_t) ++ fs_manage_cifs_named_pipes(nsplugin_config_t) ++ fs_manage_cifs_symlinks(nsplugin_config_t) ++') ++ ++domtrans_pattern(nsplugin_config_t, nsplugin_exec_t, nsplugin_t) ++ ++optional_policy(` ++ xserver_use_user_fonts(nsplugin_config_t) ++') ++ ++optional_policy(` ++ mozilla_read_user_home_files(nsplugin_config_t) ++ mozilla_write_user_home_files(nsplugin_config_t) ++') ++ ++application_signull(nsplugin_t) ++ ++optional_policy(` ++ devicekit_dbus_chat_power(nsplugin_t) ++') ++ ++optional_policy(` ++ pulseaudio_exec(nsplugin_t) ++ pulseaudio_stream_connect(nsplugin_t) ++ pulseaudio_manage_home_files(nsplugin_t) ++ pulseaudio_setattr_home_dir(nsplugin_t) ++') +diff --git a/ntop.te b/ntop.te +index 8ec78595b8..c696f67651 100644 +--- a/ntop.te ++++ b/ntop.te +@@ -29,10 +29,11 @@ files_pid_file(ntop_var_run_t) + # Local Policy + # + +-allow ntop_t self:capability { net_raw setgid setuid sys_admin net_admin }; ++allow ntop_t self:capability { net_raw setgid setuid sys_admin net_admin dac_read_search dac_override }; + dontaudit ntop_t self:capability sys_tty_config; + allow ntop_t self:process signal_perms; + allow ntop_t self:fifo_file rw_fifo_file_perms; ++allow ntop_t self:netlink_socket create_socket_perms; + allow ntop_t self:tcp_socket { accept listen }; + allow ntop_t self:unix_stream_socket { accept listen }; + allow ntop_t self:packet_socket create_socket_perms; +@@ -58,7 +59,6 @@ kernel_read_system_state(ntop_t) + kernel_read_network_state(ntop_t) + kernel_read_kernel_sysctls(ntop_t) + +-corenet_all_recvfrom_unlabeled(ntop_t) + corenet_all_recvfrom_netlabel(ntop_t) + corenet_tcp_sendrecv_generic_if(ntop_t) + corenet_raw_sendrecv_generic_if(ntop_t) +@@ -78,10 +78,11 @@ corenet_tcp_sendrecv_http_port(ntop_t) + + dev_read_sysfs(ntop_t) + dev_rw_generic_usb_dev(ntop_t) ++dev_read_usbmon_dev(ntop_t) ++dev_write_usbmon_dev(ntop_t) + + domain_use_interactive_fds(ntop_t) + +-files_read_usr_files(ntop_t) + + fs_getattr_all_fs(ntop_t) + fs_search_auto_mountpoints(ntop_t) +@@ -100,6 +101,10 @@ optional_policy(` + apache_read_sys_content(ntop_t) + ') + ++optional_policy(` ++ snmp_read_snmp_var_lib_files(ntop_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(ntop_t) + ') +diff --git a/ntp.fc b/ntp.fc +index af3c91e703..3e5f9cfa60 100644 +--- a/ntp.fc ++++ b/ntp.fc +@@ -11,9 +11,13 @@ + + /usr/sbin/ntpd -- gen_context(system_u:object_r:ntpd_exec_t,s0) + /usr/sbin/ntpdate -- gen_context(system_u:object_r:ntpdate_exec_t,s0) ++/usr/libexec/ntpdate-wrapper -- gen_context(system_u:object_r:ntpdate_exec_t,s0) + /usr/sbin/sntp -- gen_context(system_u:object_r:ntpdate_exec_t,s0) + ++/usr/lib/systemd/system/ntpd.* -- gen_context(system_u:object_r:ntpd_unit_file_t,s0) ++ + /var/lib/ntp(/.*)? gen_context(system_u:object_r:ntp_drift_t,s0) ++/var/lib/sntp(/.*)? gen_context(system_u:object_r:ntp_drift_t,s0) + /var/lib/sntp-kod(/.*)? gen_context(system_u:object_r:ntp_drift_t,s0) + + /var/log/ntp.* -- gen_context(system_u:object_r:ntpd_log_t,s0) +diff --git a/ntp.if b/ntp.if +index e96a309a50..42453089c8 100644 +--- a/ntp.if ++++ b/ntp.if +@@ -1,4 +1,4 @@ +-## Network time protocol daemon. ++## Network time protocol daemon + + ######################################## + ## +@@ -35,6 +35,25 @@ interface(`ntp_domtrans',` + domtrans_pattern($1, ntpd_exec_t, ntpd_t) + ') + ++######################################## ++## ++## Execute ntp server in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ntp_exec',` ++ gen_require(` ++ type ntpd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, ntpd_exec_t) ++') ++ + ######################################## + ## + ## Execute ntp in the ntp domain, and +@@ -54,11 +73,11 @@ interface(`ntp_domtrans',` + # + interface(`ntp_run',` + gen_require(` +- attribute_role ntpd_roles; ++ type ntpd_t; + ') + + ntp_domtrans($1) +- roleattribute $2 ntpd_roles; ++ role $2 types ntpd_t; + ') + + ######################################## +@@ -98,6 +117,67 @@ interface(`ntp_initrc_domtrans',` + init_labeled_script_domtrans($1, ntpd_initrc_exec_t) + ') + ++##################################### ++## ++## Allow domain to read ntpd systemd unit files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ntp_read_unit_file',` ++ gen_require(` ++ type ntpd_unit_file_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 ntpd_unit_file_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Execute ntpd server in the ntpd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`ntp_systemctl',` ++ gen_require(` ++ type ntpd_unit_file_t; ++ type ntpd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 ntpd_unit_file_t:file read_file_perms; ++ allow $1 ntpd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, ntpd_t) ++') ++ ++######################################## ++## ++## Send a generic signal to ntpd ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ntp_signal',` ++ gen_require(` ++ type ntpd_t; ++ ') ++ ++ allow $1 ntpd_t:process signal; ++') ++ + ######################################## + ## + ## Read ntp drift files. +@@ -141,8 +221,27 @@ interface(`ntp_rw_shm',` + + ######################################## + ## +-## All of the rules required to +-## administrate an ntp environment. ++## Allow the domain to read ntpd state files in /proc. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ntp_read_state',` ++ gen_require(` ++ type ntpd_t; ++ ') ++ ++ kernel_search_proc($1) ++ ps_process_pattern($1, ntpd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ntp environment + ## + ## + ## +@@ -151,28 +250,32 @@ interface(`ntp_rw_shm',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the ntp domain. + ## + ## + ## + # + interface(`ntp_admin',` + gen_require(` +- type ntpd_t, ntpd_tmp_t, ntpd_log_t; +- type ntpd_key_t, ntpd_var_run_t, ntp_conf_t; +- type ntpd_initrc_exec_t, ntp_drift_t; ++ type ntpd_t, ntpd_tmp_t, ntpd_log_t, ntp_drift_t; ++ type ntpd_key_t, ntpd_var_run_t, ntpd_initrc_exec_t; ++ type ntpd_unit_file_t; + ') + +- allow $1 ntpd_t:process { ptrace signal_perms }; ++ allow $1 ntpd_t:process signal_perms; + ps_process_pattern($1, ntpd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ntpd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, ntpd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 ntpd_initrc_exec_t system_r; + allow $2 system_r; + + files_list_etc($1) +- admin_pattern($1, { ntpd_key_t ntp_conf_t }) ++ admin_pattern($1, ntpd_key_t) + + logging_list_logs($1) + admin_pattern($1, ntpd_log_t) +@@ -186,5 +289,53 @@ interface(`ntp_admin',` + files_list_pids($1) + admin_pattern($1, ntpd_var_run_t) + +- ntp_run($1, $2) ++ ntp_systemctl($1) ++ admin_pattern($1, ntpd_unit_file_t) ++ allow $1 ntpd_unit_file_t:service all_service_perms; ++ ++ ntp_filetrans_named_content($1) + ') ++ ++######################################## ++## ++## Transition content labels to ntp named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ntp_filetrans_named_content',` ++ gen_require(` ++ type ntp_conf_t; ++ type ntp_drift_t; ++ ') ++ ++ files_etc_filetrans($1, ntp_conf_t, file, "ntpd.conf") ++ files_etc_filetrans($1, ntp_conf_t, dir, "ntp") ++ files_var_lib_filetrans($1, ntp_drift_t, file, "sntp-kod") ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## ntp log content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ntp_manage_log',` ++ gen_require(` ++ type ntpd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, ntpd_log_t, ntpd_log_t) ++ manage_files_pattern($1, ntpd_log_t, ntpd_log_t) ++ manage_lnk_files_pattern($1, ntpd_log_t, ntpd_log_t) ++') ++ +diff --git a/ntp.te b/ntp.te +index f81b113c78..bc1e8ce997 100644 +--- a/ntp.te ++++ b/ntp.te +@@ -18,6 +18,9 @@ role ntpd_roles types ntpd_t; + type ntpd_initrc_exec_t; + init_script_file(ntpd_initrc_exec_t) + ++type ntpd_unit_file_t; ++systemd_unit_file(ntpd_unit_file_t) ++ + type ntp_conf_t; + files_config_file(ntp_conf_t) + +@@ -44,7 +47,7 @@ init_system_domain(ntpd_t, ntpdate_exec_t) + # Local policy + # + +-allow ntpd_t self:capability { chown dac_override kill setgid setuid sys_time ipc_lock ipc_owner sys_chroot sys_nice sys_resource }; ++allow ntpd_t self:capability { chown dac_read_search dac_override kill setgid setuid sys_time ipc_lock ipc_owner sys_chroot sys_nice sys_resource }; + dontaudit ntpd_t self:capability { net_admin sys_tty_config fsetid sys_nice }; + allow ntpd_t self:process { signal_perms getcap setcap setsched setrlimit }; + allow ntpd_t self:fifo_file rw_fifo_file_perms; +@@ -53,6 +56,8 @@ allow ntpd_t self:tcp_socket { accept listen }; + + manage_dirs_pattern(ntpd_t, ntp_drift_t, ntp_drift_t) + manage_files_pattern(ntpd_t, ntp_drift_t, ntp_drift_t) ++files_var_lib_filetrans(ntpd_t, ntp_drift_t, dir, "sntp") ++files_var_lib_filetrans(ntpd_t, ntp_drift_t, dir, "sntp-kod") + + allow ntpd_t ntp_conf_t:file read_file_perms; + +@@ -60,9 +65,7 @@ read_files_pattern(ntpd_t, ntpd_key_t, ntpd_key_t) + read_lnk_files_pattern(ntpd_t, ntpd_key_t, ntpd_key_t) + + allow ntpd_t ntpd_log_t:dir setattr_dir_perms; +-append_files_pattern(ntpd_t, ntpd_log_t, ntpd_log_t) +-create_files_pattern(ntpd_t, ntpd_log_t, ntpd_log_t) +-setattr_files_pattern(ntpd_t, ntpd_log_t, ntpd_log_t) ++manage_files_pattern(ntpd_t, ntpd_log_t, ntpd_log_t) + logging_log_filetrans(ntpd_t, ntpd_log_t, { file dir }) + + manage_dirs_pattern(ntpd_t, ntpd_tmp_t, ntpd_tmp_t) +@@ -77,27 +80,23 @@ manage_files_pattern(ntpd_t, ntpd_var_run_t, ntpd_var_run_t) + files_pid_filetrans(ntpd_t, ntpd_var_run_t, file) + + can_exec(ntpd_t, ntpd_exec_t) ++can_exec(ntpd_t, ntpdate_exec_t) + + kernel_read_kernel_sysctls(ntpd_t) + kernel_read_system_state(ntpd_t) + kernel_read_network_state(ntpd_t) + kernel_request_load_module(ntpd_t) + +-corenet_all_recvfrom_unlabeled(ntpd_t) + corenet_all_recvfrom_netlabel(ntpd_t) + corenet_tcp_sendrecv_generic_if(ntpd_t) + corenet_udp_sendrecv_generic_if(ntpd_t) + corenet_tcp_sendrecv_generic_node(ntpd_t) + corenet_udp_sendrecv_generic_node(ntpd_t) + corenet_udp_bind_generic_node(ntpd_t) +- +-corenet_sendrecv_ntp_server_packets(ntpd_t) + corenet_udp_bind_ntp_port(ntpd_t) +-corenet_udp_sendrecv_ntp_port(ntpd_t) +- +-corenet_sendrecv_ntp_client_packets(ntpd_t) + corenet_tcp_connect_ntp_port(ntpd_t) +-corenet_tcp_sendrecv_ntp_port(ntpd_t) ++corenet_sendrecv_ntp_server_packets(ntpd_t) ++corenet_sendrecv_ntp_client_packets(ntpd_t) + + corecmd_exec_bin(ntpd_t) + corecmd_exec_shell(ntpd_t) +@@ -110,13 +109,15 @@ domain_use_interactive_fds(ntpd_t) + domain_dontaudit_list_all_domains_state(ntpd_t) + + files_read_etc_runtime_files(ntpd_t) +-files_read_usr_files(ntpd_t) + files_list_var_lib(ntpd_t) + + fs_getattr_all_fs(ntpd_t) + fs_search_auto_mountpoints(ntpd_t) ++# Necessary to communicate with gpsd devices ++fs_rw_tmpfs_files(ntpd_t) + + term_use_ptmx(ntpd_t) ++term_use_unallocated_ttys(ntpd_t) + + auth_use_nsswitch(ntpd_t) + +@@ -124,11 +125,13 @@ init_exec_script_files(ntpd_t) + + logging_send_syslog_msg(ntpd_t) + +-miscfiles_read_localization(ntpd_t) +- + userdom_dontaudit_use_unpriv_user_fds(ntpd_t) + userdom_list_user_home_dirs(ntpd_t) + ++optional_policy(` ++ clock_domtrans(ntpd_t) ++') ++ + optional_policy(` + cron_system_entry(ntpd_t, ntpdate_exec_t) + ') +@@ -151,10 +154,19 @@ optional_policy(` + logrotate_exec(ntpd_t) + ') + ++optional_policy(` ++ ptp4l_rw_shm(ntpd_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(ntpd_t) + ') + ++optional_policy(` ++ timemaster_read_pid_files(ntpd_t) ++ timemaster_rw_shm(ntpd_t) ++') ++ + optional_policy(` + udev_read_db(ntpd_t) + ') +diff --git a/numad.fc b/numad.fc +index 3488bb0d36..1f97624205 100644 +--- a/numad.fc ++++ b/numad.fc +@@ -1,7 +1,7 @@ +-/etc/rc\.d/init\.d/numad -- gen_context(system_u:object_r:numad_initrc_exec_t,s0) ++/usr/bin/numad -- gen_context(system_u:object_r:numad_exec_t,s0) + +-/usr/bin/numad -- gen_context(system_u:object_r:numad_exec_t,s0) ++/usr/lib/systemd/system/numad.* -- gen_context(system_u:object_r:numad_unit_file_t,s0) + +-/var/log/numad\.log.* -- gen_context(system_u:object_r:numad_log_t,s0) ++/var/log/numad\.log.* -- gen_context(system_u:object_r:numad_var_log_t,s0) + +-/var/run/numad\.pid -- gen_context(system_u:object_r:numad_var_run_t,s0) ++/var/run/numad\.pid -- gen_context(system_u:object_r:numad_var_run_t,s0) +diff --git a/numad.if b/numad.if +index 0d3c270b9e..f307835ce8 100644 +--- a/numad.if ++++ b/numad.if +@@ -1,39 +1,93 @@ +-## Non-Uniform Memory Alignment Daemon. ++ ++## policy for numad ++ ++######################################## ++## ++## Transition to numad. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`numad_domtrans',` ++ gen_require(` ++ type numad_t, numad_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, numad_exec_t, numad_t) ++') ++######################################## ++## ++## Execute numad server in the numad domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`numad_systemctl',` ++ gen_require(` ++ type numad_t; ++ type numad_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 numad_unit_file_t:file read_file_perms; ++ allow $1 numad_unit_file_t:service all_service_perms; ++ ++ ps_process_pattern($1, numad_t) ++') + + ######################################## + ## +-## All of the rules required to +-## administrate an numad environment. ++## Send and receive messages from ++## numad over dbus. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`numad_dbus_chat',` ++ gen_require(` ++ type numad_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 numad_t:dbus send_msg; ++ allow numad_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an numad environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # + interface(`numad_admin',` + gen_require(` +- type numad_t, numad_initrc_exec_t, numad_log_t; +- type numad_var_run_t; ++ type numad_t; ++ type numad_unit_file_t; + ') + + allow $1 numad_t:process { ptrace signal_perms }; + ps_process_pattern($1, numad_t) + +- init_labeled_script_domtrans($1, numad_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 numad_initrc_exec_t system_r; +- allow $2 system_r; +- +- logging_search_logs($1) +- admin_pattern($1, numad_log_t) +- +- files_search_pids($1) +- admin_pattern($1, numad_var_run_t) ++ numad_systemctl($1) ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/numad.te b/numad.te +index b0a1be4825..303a9279f7 100644 +--- a/numad.te ++++ b/numad.te +@@ -8,37 +8,44 @@ policy_module(numad, 1.1.0) + type numad_t; + type numad_exec_t; + init_daemon_domain(numad_t, numad_exec_t) +-application_executable_file(numad_exec_t) + +-type numad_initrc_exec_t; +-init_script_file(numad_initrc_exec_t) ++type numad_unit_file_t; ++systemd_unit_file(numad_unit_file_t) + +-type numad_log_t; +-logging_log_file(numad_log_t) ++type numad_var_log_t; ++logging_log_file(numad_var_log_t) + + type numad_var_run_t; + files_pid_file(numad_var_run_t) + + ######################################## + # +-# Local policy ++# numad local policy + # + ++allow numad_t self:capability sys_ptrace; + allow numad_t self:fifo_file rw_fifo_file_perms; +-allow numad_t self:msg { send receive }; + allow numad_t self:msgq create_msgq_perms; ++allow numad_t self:msg { send receive }; + allow numad_t self:unix_stream_socket create_stream_socket_perms; + +-allow numad_t numad_log_t:file { append_file_perms create_file_perms setattr_file_perms }; +-logging_log_filetrans(numad_t, numad_log_t, file) ++manage_files_pattern(numad_t, numad_var_log_t, numad_var_log_t) ++logging_log_filetrans(numad_t, numad_var_log_t, file) + + manage_files_pattern(numad_t, numad_var_run_t, numad_var_run_t) + files_pid_filetrans(numad_t, numad_var_run_t, file) + + kernel_read_system_state(numad_t) + +-dev_read_sysfs(numad_t) ++dev_rw_sysfs(numad_t) ++ ++domain_use_interactive_fds(numad_t) ++domain_read_all_domains_state(numad_t) ++domain_setpriority_all_domains(numad_t) + +-files_read_etc_files(numad_t) ++fs_manage_cgroup_dirs(numad_t) ++fs_rw_cgroup_files(numad_t) + +-miscfiles_read_localization(numad_t) ++tunable_policy(`deny_ptrace',`',` ++ virt_ptrace(numad_t) ++') +diff --git a/nut.fc b/nut.fc +index 379af962cb..fac7d7bc91 100644 +--- a/nut.fc ++++ b/nut.fc +@@ -1,23 +1,16 @@ +-/etc/nut(/.*)? gen_context(system_u:object_r:nut_conf_t,s0) +-/etc/ups(/.*)? gen_context(system_u:object_r:nut_conf_t,s0) ++/etc/ups(/.*)? gen_context(system_u:object_r:nut_conf_t,s0) + +-/etc/rc\.d/init\.d/nut-driver -- gen_context(system_u:object_r:nut_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/nut-server -- gen_context(system_u:object_r:nut_initrc_exec_t,s0) +- +-/sbin/upsd -- gen_context(system_u:object_r:nut_upsd_exec_t,s0) + /sbin/upsdrvctl -- gen_context(system_u:object_r:nut_upsdrvctl_exec_t,s0) +-/sbin/upsmon -- gen_context(system_u:object_r:nut_upsmon_exec_t,s0) + +-/usr/lib/cgi-bin/nut/upsimage\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) +-/usr/lib/cgi-bin/nut/upsset\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) +-/usr/lib/cgi-bin/nut/upsstats\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) ++/usr/lib/systemd/system/nut.* -- gen_context(system_u:object_r:nut_unit_file_t,s0) + + /usr/sbin/upsd -- gen_context(system_u:object_r:nut_upsd_exec_t,s0) + /usr/sbin/upsdrvctl -- gen_context(system_u:object_r:nut_upsdrvctl_exec_t,s0) +-/usr/sbin/upsmon -- gen_context(system_u:object_r:nut_upsmon_exec_t,s0) ++/usr/sbin/blazer_usb -- gen_context(system_u:object_r:nut_upsdrvctl_exec_t,s0) ++/usr/sbin/upsmon -- gen_context(system_u:object_r:nut_upsmon_exec_t,s0) + + /var/run/nut(/.*)? gen_context(system_u:object_r:nut_var_run_t,s0) + +-/var/www/nut-cgi-bin/upsimage\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) +-/var/www/nut-cgi-bin/upsset\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) +-/var/www/nut-cgi-bin/upsstats\.cgi -- gen_context(system_u:object_r:httpd_nutups_cgi_script_exec_t,s0) ++/var/www/nut-cgi-bin/upsimage\.cgi -- gen_context(system_u:object_r:nutups_cgi_script_exec_t,s0) ++/var/www/nut-cgi-bin/upsset\.cgi -- gen_context(system_u:object_r:nutups_cgi_script_exec_t,s0) ++/var/www/nut-cgi-bin/upsstats\.cgi -- gen_context(system_u:object_r:nutups_cgi_script_exec_t,s0) +diff --git a/nut.if b/nut.if +index 57c0161edb..c554eb6e16 100644 +--- a/nut.if ++++ b/nut.if +@@ -1,39 +1,60 @@ +-## Network UPS Tools ++## nut - Network UPS Tools + +-######################################## ++####################################### + ## +-## All of the rules required to +-## administrate an nut environment. ++## Creates types and rules for a basic ++## Network UPS Tools systemd daemon domain. + ## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## ++## ++## ++## Prefix for the domain. ++## + ## +-## + # +-interface(`nut_admin',` ++template(`nut_domain_template',` + gen_require(` + attribute nut_domain; +- type nut_initrc_exec_t, nut_var_run_t, nut_conf_t; + ') + +- allow $1 nut_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, nut_domain_t) ++ type nut_$1_t, nut_domain; ++ type nut_$1_exec_t; ++ init_daemon_domain(nut_$1_t, nut_$1_exec_t) ++ ++ type nut_$1_tmp_t; ++ files_tmp_file(nut_$1_tmp_t) ++ ++ manage_dirs_pattern(nut_$1_t, nut_$1_tmp_t, nut_$1_tmp_t) ++ manage_files_pattern(nut_$1_t, nut_$1_tmp_t, nut_$1_tmp_t) ++ manage_lnk_files_pattern(nut_$1_t, nut_$1_tmp_t, nut_$1_tmp_t) ++ files_tmp_filetrans(nut_$1_t, nut_$1_tmp_t, { lnk_file file dir }) ++ fs_tmpfs_filetrans(nut_$1_t, nut_$1_tmp_t, { lnk_file file dir }) + +- init_labeled_script_domtrans($1, nut_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 nut_initrc_exec_t system_r; +- allow $2 system_r; ++ auth_use_nsswitch(nut_$1_t) ++ ++ logging_send_syslog_msg(nut_$1_t) ++ ++') ++ ++####################################### ++## ++## Execute swift server in the swift domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`nut_systemctl',` ++ gen_require(` ++ type nut_t; ++ type nut_unit_file_t; ++ ') + +- files_search_etc($1) +- admin_pattern($1, nut_conf_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 nut_unit_file_t:file read_file_perms; ++ allow $1 nut_unit_file_t:service manage_service_perms; + +- files_search_pids($1) +- admin_pattern($1, nut_var_run_t) ++ ps_process_pattern($1, nut_t) + ') +diff --git a/nut.te b/nut.te +index 5b2cb0d595..35b45d22eb 100644 +--- a/nut.te ++++ b/nut.te +@@ -7,154 +7,143 @@ policy_module(nut, 1.3.0) + + attribute nut_domain; + ++nut_domain_template(upsd) ++nut_domain_template(upsmon) ++nut_domain_template(upsdrvctl) ++ + type nut_conf_t; + files_config_file(nut_conf_t) + +-type nut_upsd_t, nut_domain; +-type nut_upsd_exec_t; +-init_daemon_domain(nut_upsd_t, nut_upsd_exec_t) +- +-type nut_upsmon_t, nut_domain; +-type nut_upsmon_exec_t; +-init_daemon_domain(nut_upsmon_t, nut_upsmon_exec_t) +- +-type nut_upsdrvctl_t, nut_domain; +-type nut_upsdrvctl_exec_t; +-init_daemon_domain(nut_upsdrvctl_t, nut_upsdrvctl_exec_t) +- +-type nut_initrc_exec_t; +-init_script_file(nut_initrc_exec_t) +- + type nut_var_run_t; + files_pid_file(nut_var_run_t) +-init_daemon_run_dir(nut_var_run_t, "nut") + +-######################################## ++type nut_unit_file_t; ++systemd_unit_file(nut_unit_file_t) ++ ++####################################### + # +-# Common nut domain local policy ++# Local policy for upsd + # + +-allow nut_domain self:capability { setgid setuid dac_override kill }; ++allow nut_domain self:capability { setgid setuid dac_read_search dac_override }; ++ + allow nut_domain self:process signal_perms; +-allow nut_domain self:fifo_file rw_fifo_file_perms; +-allow nut_domain self:unix_dgram_socket sendto; + +-allow nut_domain nut_conf_t:dir list_dir_perms; +-allow nut_domain nut_conf_t:file read_file_perms; +-allow nut_domain nut_conf_t:lnk_file read_lnk_file_perms; ++allow nut_domain self:fifo_file rw_fifo_file_perms; ++allow nut_domain self:netlink_kobject_uevent_socket create_socket_perms; + ++# pid file + manage_files_pattern(nut_domain, nut_var_run_t, nut_var_run_t) + manage_dirs_pattern(nut_domain, nut_var_run_t, nut_var_run_t) +-files_pid_filetrans(nut_domain, nut_var_run_t, { dir file }) +- +-kernel_read_kernel_sysctls(nut_domain) +- +-logging_send_syslog_msg(nut_domain) +- +-miscfiles_read_localization(nut_domain) ++manage_sock_files_pattern(nut_domain, nut_var_run_t, nut_var_run_t) ++files_pid_filetrans(nut_domain, nut_var_run_t, dir) + + ######################################## + # +-# Upsd local policy ++# Local policy for upsd + # + +-allow nut_upsd_t self:tcp_socket { accept listen }; ++allow nut_upsd_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow nut_upsd_t self:tcp_socket connected_stream_socket_perms; + +-manage_sock_files_pattern(nut_upsd_t, nut_var_run_t, nut_var_run_t) +-files_pid_filetrans(nut_upsd_t, nut_var_run_t, sock_file) ++allow nut_upsd_t nut_upsdrvctl_t:unix_stream_socket connectto; + +-stream_connect_pattern(nut_upsd_t, nut_var_run_t, nut_var_run_t, nut_upsdrvctl_t) ++read_files_pattern(nut_upsd_t, nut_conf_t, nut_conf_t) + +-corenet_all_recvfrom_unlabeled(nut_upsd_t) +-corenet_all_recvfrom_netlabel(nut_upsd_t) +-corenet_tcp_sendrecv_generic_if(nut_upsd_t) +-corenet_tcp_sendrecv_generic_node(nut_upsd_t) +-corenet_tcp_sendrecv_all_ports(nut_upsd_t) +-corenet_tcp_bind_generic_node(nut_upsd_t) ++kernel_read_kernel_sysctls(nut_upsd_t) + +-corenet_sendrecv_ups_server_packets(nut_upsd_t) + corenet_tcp_bind_ups_port(nut_upsd_t) +- +-corenet_sendrecv_generic_server_packets(nut_upsd_t) + corenet_tcp_bind_generic_port(nut_upsd_t) +- +-files_read_usr_files(nut_upsd_t) +- +-auth_use_nsswitch(nut_upsd_t) ++corenet_tcp_bind_all_nodes(nut_upsd_t) + + ######################################## + # +-# Upsmon local policy ++# Local policy for upsmon + # + +-allow nut_upsmon_t self:capability dac_read_search; +-allow nut_upsmon_t self:unix_stream_socket connectto; ++allow nut_upsmon_t self:tcp_socket create_socket_perms; ++allow nut_upsmon_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow nut_upsmon_t self:unix_stream_socket { create_socket_perms connectto }; + ++read_files_pattern(nut_upsmon_t, nut_conf_t, nut_conf_t) ++ ++kernel_read_kernel_sysctls(nut_upsmon_t) + kernel_read_system_state(nut_upsmon_t) + + corecmd_exec_bin(nut_upsmon_t) + corecmd_exec_shell(nut_upsmon_t) + +-corenet_all_recvfrom_unlabeled(nut_upsmon_t) +-corenet_all_recvfrom_netlabel(nut_upsmon_t) +-corenet_tcp_sendrecv_generic_if(nut_upsmon_t) +-corenet_tcp_sendrecv_generic_node(nut_upsmon_t) +-corenet_tcp_sendrecv_all_ports(nut_upsmon_t) +-corenet_tcp_bind_generic_node(nut_upsmon_t) +- +-corenet_sendrecv_ups_client_packets(nut_upsmon_t) + corenet_tcp_connect_ups_port(nut_upsmon_t) +- +-corenet_sendrecv_generic_client_packets(nut_upsmon_t) + corenet_tcp_connect_generic_port(nut_upsmon_t) + ++# Creates /etc/killpower + files_manage_etc_runtime_files(nut_upsmon_t) + files_etc_filetrans_etc_runtime(nut_upsmon_t, file) + files_search_usr(nut_upsmon_t) + ++# /usr/bin/wall + term_write_all_terms(nut_upsmon_t) + +-auth_use_nsswitch(nut_upsmon_t) ++# upsmon runs shutdown, probably need a shutdown domain ++init_rw_utmp(nut_upsmon_t) ++init_telinit(nut_upsmon_t) ++ + + mta_send_mail(nut_upsmon_t) + ++systemd_start_power_services(nut_upsmon_t) ++ + optional_policy(` + shutdown_domtrans(nut_upsmon_t) + ') + + ######################################## + # +-# Upsdrvctl local policy ++# Local policy for upsdrvctl + # + ++allow nut_upsdrvctl_t self:capability { kill }; + allow nut_upsdrvctl_t self:fd use; ++allow nut_upsdrvctl_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow nut_upsdrvctl_t self:udp_socket create_socket_perms; ++ ++can_exec(nut_upsdrvctl_t, nut_upsdrvctl_exec_t) + +-manage_sock_files_pattern(nut_upsdrvctl_t, nut_var_run_t, nut_var_run_t) +-files_pid_filetrans(nut_upsdrvctl_t, nut_var_run_t, sock_file) ++read_files_pattern(nut_upsdrvctl_t, nut_conf_t, nut_conf_t) + ++kernel_read_kernel_sysctls(nut_upsdrvctl_t) ++ ++# /sbin/upsdrvctl executes other drivers + corecmd_exec_bin(nut_upsdrvctl_t) + + dev_read_sysfs(nut_upsdrvctl_t) +-dev_read_urand(nut_upsdrvctl_t) + dev_rw_generic_usb_dev(nut_upsdrvctl_t) + + term_use_unallocated_ttys(nut_upsdrvctl_t) +- +-auth_use_nsswitch(nut_upsdrvctl_t) ++term_use_usb_ttys(nut_upsdrvctl_t) + + init_sigchld(nut_upsdrvctl_t) + + ####################################### + # +-# Cgi local policy ++# Local policy for upscgi scripts ++# requires httpd_enable_cgi and httpd_can_network_connect + # + + optional_policy(` + apache_content_template(nutups_cgi) ++ apache_content_alias_template(nutups_cgi,nutups_cgi) ++ ++ read_files_pattern(nutups_cgi_script_t, nut_conf_t, nut_conf_t) + +- allow httpd_nutups_cgi_script_t nut_conf_t:dir list_dir_perms; +- allow httpd_nutups_cgi_script_t nut_conf_t:file read_file_perms; +- allow httpd_nutups_cgi_script_t nut_conf_t:lnk_file read_lnk_file_perms; ++ corenet_all_recvfrom_netlabel(nutups_cgi_script_t) ++ corenet_tcp_sendrecv_generic_if(nutups_cgi_script_t) ++ corenet_tcp_sendrecv_generic_node(nutups_cgi_script_t) ++ corenet_tcp_sendrecv_all_ports(nutups_cgi_script_t) ++ corenet_tcp_connect_ups_port(nutups_cgi_script_t) ++ corenet_udp_sendrecv_generic_if(nutups_cgi_script_t) ++ corenet_udp_sendrecv_generic_node(nutups_cgi_script_t) ++ corenet_udp_sendrecv_all_ports(nutups_cgi_script_t) + +- sysnet_dns_name_resolve(httpd_nutups_cgi_script_t) ++ sysnet_dns_name_resolve(nutups_cgi_script_t) + ') +diff --git a/nx.if b/nx.if +index 251d6816a0..50ae2a94b9 100644 +--- a/nx.if ++++ b/nx.if +@@ -35,7 +35,9 @@ interface(`nx_read_home_files',` + ') + + files_search_var_lib($1) +- read_files_pattern($1, { nx_server_var_lib_t nx_server_home_ssh_t }, nx_server_home_ssh_t) ++ allow $1 nx_server_var_lib_t:dir search_dir_perms; ++ read_files_pattern($1, nx_server_home_ssh_t, nx_server_home_ssh_t) ++ read_lnk_files_pattern($1, nx_server_home_ssh_t, nx_server_home_ssh_t) + ') + + ######################################## +@@ -90,3 +92,21 @@ interface(`nx_var_lib_filetrans',` + + filetrans_pattern($1, nx_server_var_lib_t, $2, $3, $4) + ') ++ ++######################################## ++## ++## Transition to nx named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`nx_filetrans_named_content',` ++ gen_require(` ++ type nx_server_home_ssh_t, nx_server_var_lib_t; ++ ') ++ ++ filetrans_pattern($1, nx_server_var_lib_t, nx_server_home_ssh_t, dir, ".ssh") ++') +diff --git a/nx.te b/nx.te +index 091f872723..62a0b1229d 100644 +--- a/nx.te ++++ b/nx.te +@@ -27,6 +27,9 @@ files_type(nx_server_var_lib_t) + type nx_server_var_run_t; + files_pid_file(nx_server_var_run_t) + ++type nx_server_home_ssh_t; ++files_type(nx_server_home_ssh_t) ++ + ######################################## + # + # Local policy +@@ -50,13 +53,15 @@ files_var_lib_filetrans(nx_server_t, nx_server_var_lib_t, { file dir }) + manage_files_pattern(nx_server_t, nx_server_var_run_t, nx_server_var_run_t) + files_pid_filetrans(nx_server_t, nx_server_var_run_t, file) + ++manage_dirs_pattern(nx_server_t, nx_server_home_ssh_t, nx_server_home_ssh_t) ++manage_files_pattern(nx_server_t, nx_server_home_ssh_t, nx_server_home_ssh_t) ++ + kernel_read_system_state(nx_server_t) + kernel_read_kernel_sysctls(nx_server_t) + + corecmd_exec_shell(nx_server_t) + corecmd_exec_bin(nx_server_t) + +-corenet_all_recvfrom_unlabeled(nx_server_t) + corenet_all_recvfrom_netlabel(nx_server_t) + corenet_tcp_sendrecv_generic_if(nx_server_t) + corenet_tcp_sendrecv_generic_node(nx_server_t) +@@ -67,13 +72,7 @@ corenet_sendrecv_all_client_packets(nx_server_t) + + dev_read_urand(nx_server_t) + +-files_read_etc_files(nx_server_t) + files_read_etc_runtime_files(nx_server_t) +-files_read_usr_files(nx_server_t) +- +-miscfiles_read_localization(nx_server_t) +- +-seutil_dontaudit_search_config(nx_server_t) + + sysnet_read_config(nx_server_t) + +diff --git a/oav.te b/oav.te +index b09c4c4129..995c3f6a6d 100644 +--- a/oav.te ++++ b/oav.te +@@ -95,7 +95,6 @@ dev_read_sysfs(scannerdaemon_t) + domain_use_interactive_fds(scannerdaemon_t) + + files_exec_etc_files(scannerdaemon_t) +-files_read_etc_files(scannerdaemon_t) + files_read_etc_runtime_files(scannerdaemon_t) + files_search_var_lib(scannerdaemon_t) + +diff --git a/obex.fc b/obex.fc +index 03fa56040a..b254dd1041 100644 +--- a/obex.fc ++++ b/obex.fc +@@ -1 +1,2 @@ +-/usr/bin/obex-data-server -- gen_context(system_u:object_r:obex_exec_t,s0) ++/usr/bin/obex-data-server -- gen_context(system_u:object_r:obex_exec_t,s0) ++/usr/libexec/bluetooth/obexd -- gen_context(system_u:object_r:obex_exec_t,s0) +diff --git a/obex.if b/obex.if +index 8635ea2057..eec20b4134 100644 +--- a/obex.if ++++ b/obex.if +@@ -1,15 +1,50 @@ + ## D-Bus service providing high-level OBEX client and server side functionality. + +-####################################### ++######################################## + ## +-## The role template for obex. ++## Transition to obex. + ## +-## +-## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). +-## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`obex_domtrans',` ++ gen_require(` ++ type obex_t, obex_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, obex_exec_t, obex_t) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## obex over dbus. ++## ++## ++## ++## Domain allowed access. ++## + ## ++# ++interface(`obex_dbus_chat',` ++ gen_require(` ++ type obex_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 obex_t:dbus send_msg; ++ allow obex_t $1:dbus send_msg; ++') ++ ++####################################### ++## ++## Role access for obex domains ++## that executes via dbus-session ++## + ## + ## + ## The role associated with the user domain. +@@ -20,69 +55,34 @@ + ## The type of the user domain. + ## + ## ++## ++## ++## User domain prefix to be used. ++## ++## + # +-template(`obex_role_template',` ++template(`obex_role',` + gen_require(` + attribute_role obex_roles; +- type obex_t, obex_exec_exec_t; ++ type obex_t, obex_exec_t; + ') + + ######################################## +- # ++ # + # Declarations + # + +- roleattribute $2 obex_roles; ++ roleattribute $1 obex_roles; + + ######################################## +- # ++ # + # Policy +- # +- +- allow $3 obex_t:process { ptrace signal_perms }; +- ps_process_pattern($3, obex_t) ++ # + +- dbus_spec_session_domain($1, obex_exec_t, obex_t) +- +- obex_dbus_chat($3) +-') ++ allow $2 obex_t:process signal_perms; ++ ps_process_pattern($2, obex_t) + +-######################################## +-## +-## Execute obex in the obex domain. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-# +-interface(`obex_domtrans',` +- gen_require(` +- type obex_t, obex_exec_t; +- ') +- +- corecmd_search_bin($1) +- domtrans_pattern($1, obex_exec_t, obex_t) +-') +- +-######################################## +-## +-## Send and receive messages from +-## obex over dbus. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`obex_dbus_chat',` +- gen_require(` +- type obex_t; +- class dbus send_msg; +- ') ++ dbus_session_domain($3, obex_exec_t, obex_t) + +- allow $1 obex_t:dbus send_msg; +- allow obex_t $1:dbus send_msg; ++ obex_dbus_chat($2) + ') +diff --git a/obex.te b/obex.te +index cd29ea899a..d01d2c8e61 100644 +--- a/obex.te ++++ b/obex.te +@@ -1,4 +1,4 @@ +-policy_module(obex, 1.0.0) ++policy_module(obex,1.0.0) + + ######################################## + # +@@ -14,30 +14,26 @@ role obex_roles types obex_t; + + ######################################## + # +-# Local policy ++# obex local policy + # + + allow obex_t self:fifo_file rw_fifo_file_perms; + allow obex_t self:socket create_stream_socket_perms; ++allow obex_t self:netlink_kobject_uevent_socket create_socket_perms; + +-dev_read_urand(obex_t) ++kernel_request_load_module(obex_t) + +-files_read_etc_files(obex_t) ++dev_read_urand(obex_t) + + logging_send_syslog_msg(obex_t) + +-miscfiles_read_localization(obex_t) +- + userdom_search_user_home_content(obex_t) + +-optional_policy(` +- bluetooth_stream_connect(obex_t) +-') +- + optional_policy(` + dbus_system_bus_client(obex_t) + + optional_policy(` ++ bluetooth_stream_connect(obex_t) + bluetooth_dbus_chat(obex_t) + ') + ') +diff --git a/oddjob.fc b/oddjob.fc +index dd1d9ef5a3..c48733aa4b 100644 +--- a/oddjob.fc ++++ b/oddjob.fc +@@ -1,10 +1,12 @@ +-/sbin/mkhomedir_helper -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) + +-/usr/lib/oddjob/mkhomedir -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) ++/usr/lib/systemd/system/oddjobd.* -- gen_context(system_u:object_r:oddjob_unit_file_t,s0) + ++/usr/lib/oddjob/mkhomedir -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) + /usr/libexec/oddjob/mkhomedir -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) + +-/usr/sbin/oddjobd -- gen_context(system_u:object_r:oddjob_exec_t,s0) +-/usr/sbin/mkhomedir_helper -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) ++/usr/bin/oddjob_request -- gen_context(system_u:object_r:oddjob_exec_t,s0) ++ ++/usr/sbin/mkhomedir_helper -- gen_context(system_u:object_r:oddjob_mkhomedir_exec_t,s0) ++/usr/sbin/oddjobd -- gen_context(system_u:object_r:oddjob_exec_t,s0) + +-/var/run/oddjobd\.pid gen_context(system_u:object_r:oddjob_var_run_t,s0) ++/var/run/oddjobd\.pid gen_context(system_u:object_r:oddjob_var_run_t,s0) +diff --git a/oddjob.if b/oddjob.if +index c87bd2a301..c7bfd1fdec 100644 +--- a/oddjob.if ++++ b/oddjob.if +@@ -1,4 +1,8 @@ +-## D-BUS service which runs odd jobs on behalf of client applications. ++## ++## Oddjob provides a mechanism by which unprivileged applications can ++## request that specified privileged operations be performed on their ++## behalf. ++## + + ######################################## + ## +@@ -15,14 +19,32 @@ interface(`oddjob_domtrans',` + type oddjob_t, oddjob_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, oddjob_exec_t, oddjob_t) + ') + ++##################################### ++## ++## Do not audit attempts to read and write ++## oddjob fifo file. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`oddjob_dontaudit_rw_fifo_file',` ++ gen_require(` ++ type oddjob_t; ++ ') ++ ++ dontaudit $1 oddjob_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ + ######################################## + ## +-## Make the specified program domain +-## accessable from the oddjob. ++## Make the specified program domain accessable ++## from the oddjob. + ## + ## + ## +@@ -41,6 +63,7 @@ interface(`oddjob_system_entry',` + ') + + domtrans_pattern(oddjob_t, $2, $1) ++ domain_user_exemption_target($1) + ') + + ######################################## +@@ -64,32 +87,46 @@ interface(`oddjob_dbus_chat',` + allow oddjob_t $1:dbus send_msg; + ') + +-######################################## ++###################################### + ## +-## Execute a domain transition to +-## run oddjob mkhomedir. ++## Send a SIGCHLD signal to oddjob. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # ++interface(`oddjob_sigchld',` ++ gen_require(` ++ type oddjob_t; ++ ') ++ ++ allow $1 oddjob_t:process sigchld; ++') ++ ++######################################## ++## ++## Execute a domain transition to run oddjob_mkhomedir. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# + interface(`oddjob_domtrans_mkhomedir',` + gen_require(` + type oddjob_mkhomedir_t, oddjob_mkhomedir_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, oddjob_mkhomedir_exec_t, oddjob_mkhomedir_t) ++ allow $1 oddjob_mkhomedir_exec_t:file map; + ') + + ######################################## + ## +-## Execute oddjob mkhomedir in the +-## oddjob mkhomedir domain and allow +-## the specified role the oddjob +-## mkhomedir domain. ++## Execute the oddjob_mkhomedir program in the oddjob_mkhomedir domain. + ## + ## + ## +@@ -105,46 +142,114 @@ interface(`oddjob_domtrans_mkhomedir',` + # + interface(`oddjob_run_mkhomedir',` + gen_require(` +- attribute_role oddjob_mkhomedir_roles; ++ type oddjob_mkhomedir_t; + ') + + oddjob_domtrans_mkhomedir($1) +- roleattribute $2 oddjob_mkhomedir_roles; ++ role $2 types oddjob_mkhomedir_t; + ') + +-##################################### ++######################################## + ## +-## Do not audit attempts to read and write +-## oddjob fifo files. ++## Execute the oddjob program in the oddjob domain. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed to transition. + ## + ## ++## ++## ++## Role allowed access. ++## ++## ++## + # +-interface(`oddjob_dontaudit_rw_fifo_files',` ++interface(`oddjob_run',` + gen_require(` + type oddjob_t; + ') + +- dontaudit $1 oddjob_t:fifo_file rw_fifo_file_perms; ++ oddjob_domtrans($1) ++ role $2 types oddjob_t; + ') + +-###################################### ++####################################### ++## ++## Execute oddjob in the oddjob domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`oddjob_systemctl',` ++ gen_require(` ++ type oddjob_unit_file_t; ++ type oddjob_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 oddjob_unit_file_t:file read_file_perms; ++ allow $1 oddjob_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, oddjob_t) ++') ++ ++######################################## + ## +-## Send child terminated signals to oddjob. ++## Create a domain which can be started by init, ++## with a range transition. + ## + ## + ## +-## Domain allowed access. ++## Type to be used as a domain. ++## ++## ++## ++## ++## Type of the program to be used as an entry point to this domain. ++## ++## ++## ++## ++## Range for the domain. + ## + ## + # +-interface(`oddjob_sigchld',` ++interface(`oddjob_ranged_domain',` + gen_require(` + type oddjob_t; + ') + +- allow $1 oddjob_t:process sigchld; ++ oddjob_system_entry($1, $2) ++ ++ ifdef(`enable_mcs',` ++ range_transition oddjob_t $2:process $3; ++ ') ++ ++ ifdef(`enable_mls',` ++ range_transition oddjob_t $2:process $3; ++ mls_rangetrans_target($1) ++ ') ++') ++ ++######################################## ++## ++## Allow any oddjob_mkhomedir_exec_t to be an entrypoint of this domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`oddjob_mkhomedir_entrypoint',` ++ gen_require(` ++ type oddjob_mkhomedir_exec_t; ++ ') ++ allow $1 oddjob_mkhomedir_exec_t:file entrypoint; + ') +diff --git a/oddjob.te b/oddjob.te +index e403097c65..4737529c6f 100644 +--- a/oddjob.te ++++ b/oddjob.te +@@ -5,8 +5,6 @@ policy_module(oddjob, 1.10.0) + # Declarations + # + +-attribute_role oddjob_mkhomedir_roles; +- + type oddjob_t; + type oddjob_exec_t; + domain_type(oddjob_t) +@@ -20,18 +18,22 @@ type oddjob_mkhomedir_exec_t; + domain_type(oddjob_mkhomedir_t) + domain_obj_id_change_exemption(oddjob_mkhomedir_t) + init_system_domain(oddjob_mkhomedir_t, oddjob_mkhomedir_exec_t) +-role oddjob_mkhomedir_roles types oddjob_mkhomedir_t; ++oddjob_system_entry(oddjob_mkhomedir_t, oddjob_mkhomedir_exec_t) + ++# pid files + type oddjob_var_run_t; + files_pid_file(oddjob_var_run_t) + ++type oddjob_unit_file_t; ++systemd_unit_file(oddjob_unit_file_t) ++ + ifdef(`enable_mcs',` + init_ranged_daemon_domain(oddjob_t, oddjob_exec_t, s0 - mcs_systemhigh) + ') + + ######################################## + # +-# Local policy ++# oddjob local policy + # + + allow oddjob_t self:capability setgid; +@@ -43,8 +45,6 @@ manage_files_pattern(oddjob_t, oddjob_var_run_t, oddjob_var_run_t) + manage_sock_files_pattern(oddjob_t, oddjob_var_run_t, oddjob_var_run_t) + files_pid_filetrans(oddjob_t, oddjob_var_run_t, { file sock_file }) + +-domtrans_pattern(oddjob_t, oddjob_mkhomedir_exec_t, oddjob_mkhomedir_t) +- + kernel_read_system_state(oddjob_t) + + corecmd_exec_bin(oddjob_t) +@@ -54,9 +54,9 @@ mcs_process_set_categories(oddjob_t) + + selinux_compute_create_context(oddjob_t) + ++ + auth_use_nsswitch(oddjob_t) + +-miscfiles_read_localization(oddjob_t) + + locallogin_dontaudit_use_fds(oddjob_t) + +@@ -66,27 +66,31 @@ optional_policy(` + ') + + optional_policy(` +- unconfined_domtrans(oddjob_t) ++ apache_dbus_chat(oddjob_t) + ') + + ######################################## + # +-# Mkhomedir local policy ++# oddjob_mkhomedir local policy + # + +-allow oddjob_mkhomedir_t self:capability { chown fowner fsetid dac_override }; ++allow oddjob_mkhomedir_t self:capability { chown fowner fsetid dac_read_search dac_override }; + allow oddjob_mkhomedir_t self:process setfscreate; + allow oddjob_mkhomedir_t self:fifo_file rw_fifo_file_perms; +-allow oddjob_mkhomedir_t self:unix_stream_socket { accept listen }; ++allow oddjob_mkhomedir_t self:unix_stream_socket create_stream_socket_perms; ++ ++allow oddjob_t oddjob_mkhomedir_exec_t:file map; + + kernel_read_system_state(oddjob_mkhomedir_t) + ++fs_manage_auto_mountpoints(oddjob_mkhomedir_t) ++ ++mls_file_upgrade(oddjob_mkhomedir_t) ++ + auth_use_nsswitch(oddjob_mkhomedir_t) + + logging_send_syslog_msg(oddjob_mkhomedir_t) + +-miscfiles_read_localization(oddjob_mkhomedir_t) +- + selinux_get_fs_mount(oddjob_mkhomedir_t) + selinux_validate_context(oddjob_mkhomedir_t) + selinux_compute_access_vector(oddjob_mkhomedir_t) +@@ -98,8 +102,11 @@ seutil_read_config(oddjob_mkhomedir_t) + seutil_read_file_contexts(oddjob_mkhomedir_t) + seutil_read_default_contexts(oddjob_mkhomedir_t) + ++# Add/remove user home directories + userdom_home_filetrans_user_home_dir(oddjob_mkhomedir_t) +-userdom_manage_user_home_content_dirs(oddjob_mkhomedir_t) +-userdom_manage_user_home_content_files(oddjob_mkhomedir_t) + userdom_manage_user_home_dirs(oddjob_mkhomedir_t) +-userdom_user_home_dir_filetrans_user_home_content(oddjob_mkhomedir_t, notdevfile_class_set) ++userdom_manage_user_home_content_dirs(oddjob_mkhomedir_t) ++userdom_manage_user_home_content(oddjob_mkhomedir_t) ++userdom_home_manager(oddjob_mkhomedir_t) ++userdom_stream_connect(oddjob_mkhomedir_t) ++ +diff --git a/openct.te b/openct.te +index 3b6920e31a..3e9b17fdea 100644 +--- a/openct.te ++++ b/openct.te +@@ -29,12 +29,12 @@ manage_files_pattern(openct_t, openct_var_run_t, openct_var_run_t) + manage_sock_files_pattern(openct_t, openct_var_run_t, openct_var_run_t) + files_pid_filetrans(openct_t, openct_var_run_t, { dir file sock_file }) + +-can_exec(openct_t, openct_exec_t) +- + kernel_read_kernel_sysctls(openct_t) + kernel_list_proc(openct_t) + kernel_read_proc_symlinks(openct_t) + ++can_exec(openct_t, openct_exec_t) ++ + dev_read_sysfs(openct_t) + dev_rw_usbfs(openct_t) + dev_rw_smartcard(openct_t) +@@ -42,15 +42,12 @@ dev_rw_generic_usb_dev(openct_t) + + domain_use_interactive_fds(openct_t) + +-files_read_etc_files(openct_t) + + fs_getattr_all_fs(openct_t) + fs_search_auto_mountpoints(openct_t) + + logging_send_syslog_msg(openct_t) + +-miscfiles_read_localization(openct_t) +- + userdom_dontaudit_use_unpriv_user_fds(openct_t) + userdom_dontaudit_search_user_home_dirs(openct_t) + +diff --git a/opendnssec.fc b/opendnssec.fc +new file mode 100644 +index 0000000000..08d0e793d7 +--- /dev/null ++++ b/opendnssec.fc +@@ -0,0 +1,14 @@ ++/usr/lib/systemd/system/ods-enforcerd.service -- gen_context(system_u:object_r:opendnssec_unit_file_t,s0) ++ ++/usr/lib/systemd/system/ods-signerd.service -- gen_context(system_u:object_r:opendnssec_unit_file_t,s0) ++ ++/usr/sbin/ods-control -- gen_context(system_u:object_r:opendnssec_exec_t,s0) ++/usr/sbin/ods-enforcerd -- gen_context(system_u:object_r:opendnssec_exec_t,s0) ++/usr/sbin/ods-signer -- gen_context(system_u:object_r:opendnssec_exec_t,s0) ++/usr/sbin/ods-signerd -- gen_context(system_u:object_r:opendnssec_exec_t,s0) ++ ++/etc/opendnssec(/.*)? gen_context(system_u:object_r:opendnssec_conf_t,s0) ++ ++/var/run/opendnssec(/.*)? gen_context(system_u:object_r:opendnssec_var_run_t,s0) ++ ++/var/opendnssec(/.*)? gen_context(system_u:object_r:opendnssec_var_t,s0) +diff --git a/opendnssec.if b/opendnssec.if +new file mode 100644 +index 0000000000..31d6b70698 +--- /dev/null ++++ b/opendnssec.if +@@ -0,0 +1,207 @@ ++ ++## policy for opendnssec ++ ++######################################## ++## ++## Execute opendnssec_exec_t in the opendnssec domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`opendnssec_domtrans',` ++ gen_require(` ++ type opendnssec_t, opendnssec_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, opendnssec_exec_t, opendnssec_t) ++') ++ ++###################################### ++## ++## Execute opendnssec in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opendnssec_exec',` ++ gen_require(` ++ type opendnssec_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, opendnssec_exec_t) ++') ++ ++######################################## ++## ++## Read the opendnssec configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`opendnssec_read_config',` ++ gen_require(` ++ type opendnssec_conf_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 opendnssec_conf_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Read the opendnssec configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`opendnssec_manage_config',` ++ gen_require(` ++ type opendnssec_conf_t; ++ ') ++ ++ files_search_etc($1) ++ allow $1 opendnssec_conf_t:dir manage_dir_perms; ++ allow $1 opendnssec_conf_t:file manage_file_perms; ++') ++ ++######################################## ++## ++## Allow the specified domain to ++## read and write opendnssec /var files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opendnssec_manage_var_files',` ++ gen_require(` ++ type opendnssec_var_t; ++ ') ++ ++ files_search_var($1) ++ files_search_var_lib($1) ++ manage_files_pattern($1, opendnssec_var_t, opendnssec_var_t) ++') ++ ++######################################## ++## ++## Read opendnssec PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opendnssec_read_pid_files',` ++ gen_require(` ++ type opendnssec_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, opendnssec_var_run_t, opendnssec_var_run_t) ++') ++ ++######################################## ++## ++## Execute opendnssec server in the opendnssec domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`opendnssec_systemctl',` ++ gen_require(` ++ type opendnssec_t; ++ type opendnssec_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 opendnssec_unit_file_t:file read_file_perms; ++ allow $1 opendnssec_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, opendnssec_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an opendnssec environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`opendnssec_admin',` ++ gen_require(` ++ type opendnssec_t; ++ type opendnssec_var_run_t; ++ type opendnssec_unit_file_t; ++ ') ++ ++ allow $1 opendnssec_t:process { signal_perms }; ++ ps_process_pattern($1, opendnssec_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 opendnssec_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, opendnssec_var_run_t) ++ ++ opendnssec_systemctl($1) ++ admin_pattern($1, opendnssec_unit_file_t) ++ allow $1 opendnssec_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Transition to quota named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opendnssec_filetrans_etc_content',` ++ gen_require(` ++ type opendnssec_conf_t; ++ ') ++ ++ files_etc_filetrans($1, opendnssec_conf_t, file) ++') +diff --git a/opendnssec.te b/opendnssec.te +new file mode 100644 +index 0000000000..e246d45a5c +--- /dev/null ++++ b/opendnssec.te +@@ -0,0 +1,68 @@ ++policy_module(opendnssec, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type opendnssec_t; ++type opendnssec_exec_t; ++init_daemon_domain(opendnssec_t, opendnssec_exec_t) ++ ++type opendnssec_conf_t; ++files_config_file(opendnssec_conf_t) ++ ++type opendnssec_var_t; ++files_type(opendnssec_var_t) ++ ++type opendnssec_var_run_t; ++files_pid_file(opendnssec_var_run_t) ++ ++type opendnssec_tmp_t; ++files_tmp_file(opendnssec_tmp_t) ++ ++type opendnssec_unit_file_t; ++systemd_unit_file(opendnssec_unit_file_t) ++ ++######################################## ++# ++# opendnssec local policy ++# ++allow opendnssec_t self:capability { chown setgid setuid sys_chroot }; ++allow opendnssec_t self:process { fork signal_perms }; ++allow opendnssec_t self:fifo_file rw_fifo_file_perms; ++allow opendnssec_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++manage_files_pattern(opendnssec_t, opendnssec_conf_t,opendnssec_conf_t) ++manage_dirs_pattern(opendnssec_t, opendnssec_conf_t,opendnssec_conf_t) ++ ++manage_dirs_pattern(opendnssec_t, opendnssec_var_t, opendnssec_var_t) ++manage_files_pattern(opendnssec_t, opendnssec_var_t, opendnssec_var_t) ++files_var_filetrans(opendnssec_t, opendnssec_var_t, dir) ++ ++manage_dirs_pattern(opendnssec_t, opendnssec_var_run_t, opendnssec_var_run_t) ++manage_files_pattern(opendnssec_t, opendnssec_var_run_t, opendnssec_var_run_t) ++manage_lnk_files_pattern(opendnssec_t, opendnssec_var_run_t, opendnssec_var_run_t) ++manage_sock_files_pattern(opendnssec_t, opendnssec_var_run_t, opendnssec_var_run_t) ++files_pid_filetrans(opendnssec_t, opendnssec_var_run_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(opendnssec_t, opendnssec_tmp_t, opendnssec_tmp_t) ++manage_files_pattern(opendnssec_t, opendnssec_tmp_t, opendnssec_tmp_t) ++files_tmp_filetrans(opendnssec_t, opendnssec_tmp_t, { file dir }) ++ ++kernel_read_system_state(opendnssec_t) ++ ++auth_use_nsswitch(opendnssec_t) ++ ++corecmd_exec_bin(opendnssec_t) ++ ++logging_send_syslog_msg(opendnssec_t) ++ ++optional_policy(` ++ bind_manage_cache(opendnssec_t) ++') ++ ++optional_policy(` ++ ipa_manage_lib(opendnssec_t) ++') ++ +diff --git a/openhpi.te b/openhpi.te +index 8de619112d..1a01e99f2c 100644 +--- a/openhpi.te ++++ b/openhpi.te +@@ -38,6 +38,8 @@ files_var_lib_filetrans(openhpid_t, openhpid_var_lib_t, dir) + manage_files_pattern(openhpid_t, openhpid_var_run_t, openhpid_var_run_t) + files_pid_filetrans(openhpid_t, openhpid_var_run_t, file) + ++kernel_read_system_state(openhpid_t) ++ + corenet_all_recvfrom_unlabeled(openhpid_t) + corenet_all_recvfrom_netlabel(openhpid_t) + corenet_tcp_sendrecv_generic_if(openhpid_t) +@@ -50,8 +52,10 @@ corenet_tcp_sendrecv_openhpid_port(openhpid_t) + + dev_read_urand(openhpid_t) + +-files_read_etc_files(openhpid_t) +- + logging_send_syslog_msg(openhpid_t) + + miscfiles_read_localization(openhpid_t) ++ ++optional_policy(` ++ snmp_read_snmp_var_lib_files(openhpid_t) ++') +diff --git a/openhpid.fc b/openhpid.fc +new file mode 100644 +index 0000000000..df219e6efc +--- /dev/null ++++ b/openhpid.fc +@@ -0,0 +1,10 @@ ++ ++/etc/rc\.d/init\.d/openhpid -- gen_context(system_u:object_r:openhpid_initrc_exec_t,s0) ++ ++/usr/sbin/openhpid -- gen_context(system_u:object_r:openhpid_exec_t,s0) ++ ++/var/lib/openhpi(/.*)? gen_context(system_u:object_r:openhpid_var_lib_t,s0) ++ ++/var/log/dynsim[0-9]*\.log -- gen_context(system_u:object_r:openhpid_log_t,s0) ++ ++/var/run/openhpid\.pid -- gen_context(system_u:object_r:openhpid_var_run_t,s0) +diff --git a/openhpid.if b/openhpid.if +new file mode 100644 +index 0000000000..598789a3bb +--- /dev/null ++++ b/openhpid.if +@@ -0,0 +1,159 @@ ++ ++## policy for openhpid ++ ++ ++######################################## ++## ++## Transition to openhpid. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openhpid_domtrans',` ++ gen_require(` ++ type openhpid_t, openhpid_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, openhpid_exec_t, openhpid_t) ++') ++ ++ ++######################################## ++## ++## Execute openhpid server in the openhpid domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openhpid_initrc_domtrans',` ++ gen_require(` ++ type openhpid_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, openhpid_initrc_exec_t) ++') ++ ++ ++######################################## ++## ++## Search openhpid lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openhpid_search_lib',` ++ gen_require(` ++ type openhpid_var_lib_t; ++ ') ++ ++ allow $1 openhpid_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read openhpid lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openhpid_read_lib_files',` ++ gen_require(` ++ type openhpid_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, openhpid_var_lib_t, openhpid_var_lib_t) ++') ++ ++######################################## ++## ++## Manage openhpid lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openhpid_manage_lib_files',` ++ gen_require(` ++ type openhpid_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, openhpid_var_lib_t, openhpid_var_lib_t) ++') ++ ++######################################## ++## ++## Manage openhpid lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openhpid_manage_lib_dirs',` ++ gen_require(` ++ type openhpid_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, openhpid_var_lib_t, openhpid_var_lib_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an openhpid environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`openhpid_admin',` ++ gen_require(` ++ type openhpid_t; ++ type openhpid_initrc_exec_t; ++ type openhpid_var_lib_t; ++ ') ++ ++ allow $1 openhpid_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, openhpid_t) ++ ++ openhpid_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 openhpid_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ files_search_var_lib($1) ++ admin_pattern($1, openhpid_var_lib_t) ++ ++ ++ ++') ++ +diff --git a/openhpid.te b/openhpid.te +new file mode 100644 +index 0000000000..a0e0eafcee +--- /dev/null ++++ b/openhpid.te +@@ -0,0 +1,67 @@ ++policy_module(openhpid, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type openhpid_t; ++type openhpid_exec_t; ++init_daemon_domain(openhpid_t, openhpid_exec_t) ++ ++type openhpid_initrc_exec_t; ++init_script_file(openhpid_initrc_exec_t) ++ ++type openhpid_log_t; ++logging_log_file(openhpid_log_t) ++ ++type openhpid_var_lib_t; ++files_type(openhpid_var_lib_t) ++ ++type openhpid_var_run_t; ++files_pid_file(openhpid_var_run_t) ++ ++######################################## ++# ++# openhpid local policy ++# ++ ++allow openhpid_t self:capability { kill }; ++allow openhpid_t self:process signal_perms; ++ ++allow openhpid_t self:fifo_file rw_fifo_file_perms; ++allow openhpid_t self:netlink_route_socket r_netlink_socket_perms; ++allow openhpid_t self:unix_stream_socket create_stream_socket_perms; ++allow openhpid_t self:tcp_socket create_stream_socket_perms; ++allow openhpid_t self:udp_socket create_socket_perms; ++ ++ ++manage_files_pattern(openhpid_t, openhpid_log_t, openhpid_log_t) ++logging_log_filetrans(openhpid_t, openhpid_log_t, file) ++ ++manage_dirs_pattern(openhpid_t, openhpid_var_lib_t, openhpid_var_lib_t) ++manage_files_pattern(openhpid_t, openhpid_var_lib_t, openhpid_var_lib_t) ++files_var_lib_filetrans(openhpid_t, openhpid_var_lib_t, { dir file }) ++ ++manage_files_pattern(openhpid_t, openhpid_var_run_t, openhpid_var_run_t) ++files_pid_filetrans(openhpid_t, openhpid_var_run_t, { file }) ++ ++kernel_read_system_state(openhpid_t) ++ ++corenet_tcp_bind_generic_node(openhpid_t) ++corenet_tcp_bind_openhpid_port(openhpid_t) ++corenet_tcp_connect_http_port(openhpid_t) ++ ++dev_read_urand(openhpid_t) ++dev_rw_watchdog(openhpid_t) ++ ++logging_send_syslog_msg(openhpid_t) ++ ++miscfiles_read_generic_certs(openhpid_t) ++ ++sysnet_read_config(openhpid_t) ++ ++optional_policy(` ++ snmp_manage_var_lib_files(openhpid_t) ++ snmp_manage_var_lib_dirs(openhpid_t) ++') +diff --git a/openshift-origin.fc b/openshift-origin.fc +new file mode 100644 +index 0000000000..30ca148ee4 +--- /dev/null ++++ b/openshift-origin.fc +@@ -0,0 +1 @@ ++# Left Blank +diff --git a/openshift-origin.if b/openshift-origin.if +new file mode 100644 +index 0000000000..3eb6a3057b +--- /dev/null ++++ b/openshift-origin.if +@@ -0,0 +1 @@ ++## +diff --git a/openshift-origin.te b/openshift-origin.te +new file mode 100644 +index 0000000000..a437f80cae +--- /dev/null ++++ b/openshift-origin.te +@@ -0,0 +1,13 @@ ++policy_module(openshift-origin,1.0.0) ++gen_require(` ++ attribute openshift_domain; ++') ++ ++######################################## ++# ++# openshift origin standard local policy ++# ++allow openshift_domain self:socket_class_set create_socket_perms; ++corenet_tcp_connect_all_ports(openshift_domain) ++corenet_tcp_bind_all_ports(openshift_domain) ++files_read_config_files(openshift_domain) +diff --git a/openshift.fc b/openshift.fc +new file mode 100644 +index 0000000000..5a2f97ef68 +--- /dev/null ++++ b/openshift.fc +@@ -0,0 +1,30 @@ ++/etc/rc\.d/init\.d/libra gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/mcollective gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++ ++/etc/cron.minutely/openshift-facts -- gen_context(system_u:object_r:openshift_cron_exec_t,s0) ++ ++/var/lib/stickshift(/.*)? gen_context(system_u:object_r:openshift_var_lib_t,s0) ++/var/lib/stickshift/.*/data(/.*)? gen_context(system_u:object_r:openshift_rw_file_t,s0) ++/var/lib/containers/home(/.*)? gen_context(system_u:object_r:openshift_var_lib_t,s0) ++/var/lib/openshift(/.*)? gen_context(system_u:object_r:openshift_var_lib_t,s0) ++/var/lib/openshift/.*/data(/.*)? gen_context(system_u:object_r:openshift_rw_file_t,s0) ++ ++/var/lib/stickshift/.*/\.tmp(/.*)? gen_context(system_u:object_r:openshift_tmp_t,s0) ++/var/lib/stickshift/.*/\.sandbox(/.*)? gen_context(system_u:object_r:openshift_tmp_t,s0) ++/var/lib/openshift/.*/\.tmp(/.*)? gen_context(system_u:object_r:openshift_tmp_t,s0) ++/var/lib/openshift/.*/\.sandbox(/.*)? gen_context(system_u:object_r:openshift_tmp_t,s0) ++ ++/var/log/mcollective\.log.* -- gen_context(system_u:object_r:openshift_log_t,s0) ++/var/log/openshift(/.*)? gen_context(system_u:object_r:openshift_log_t,s0) ++ ++/usr/s?bin/(oo|rhc)-cgroup-read -- gen_context(system_u:object_r:openshift_cgroup_read_exec_t,s0) ++ ++/usr/s?bin/oo-lists-ports -- gen_context(system_u:object_r:openshift_net_read_exec_t,s0) ++ ++/usr/s?bin/(oo|rhc)-restorer -- gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++/usr/s?bin/(oo|rhc)-restorer-wrapper.sh -- gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++/usr/s?bin/oo-admin-ctl-gears -- gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++/usr/s?bin/mcollectived -- gen_context(system_u:object_r:openshift_initrc_exec_t,s0) ++ ++/var/run/stickshift(/.*)? gen_context(system_u:object_r:openshift_var_run_t,s0) ++/var/run/openshift(/.*)? gen_context(system_u:object_r:openshift_var_run_t,s0) +diff --git a/openshift.if b/openshift.if +new file mode 100644 +index 0000000000..c20cac3970 +--- /dev/null ++++ b/openshift.if +@@ -0,0 +1,697 @@ ++ ++## policy for openshift ++ ++######################################## ++## ++## Execute openshift server in the openshift domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++# ++interface(`openshift_initrc_domtrans',` ++ gen_require(` ++ type openshift_initrc_t; ++ type openshift_initrc_exec_t; ++ ') ++ ++ domtrans_pattern($1, openshift_initrc_exec_t, openshift_initrc_t) ++') ++ ++####################################### ++## ++## Execute openshift server in the openshift domain. ++## ++## ++## ++## The type of the process performing this action. ++## ++## ++## ++## ++## Role access to this domain. ++## ++## ++# ++interface(`openshift_initrc_run',` ++ gen_require(` ++ type openshift_initrc_t; ++ type openshift_initrc_exec_t; ++ ') ++ ++ openshift_initrc_domtrans($1) ++ role $2 types openshift_initrc_t; ++') ++ ++######################################## ++## ++## Send a null signal to openshift init scripts. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_initrc_signull',` ++ gen_require(` ++ type openshift_initrc_t; ++ ') ++ ++ allow $1 openshift_initrc_t:process signull; ++') ++ ++####################################### ++## ++## Send a signal to openshift init scripts. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_initrc_signal',` ++ gen_require(` ++ type openshift_initrc_t; ++ ') ++ ++ allow $1 openshift_initrc_t:process signal; ++') ++ ++######################################## ++## ++## Search openshift cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_search_cache',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++######################################## ++## ++## Read openshift cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_read_cache_files',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## openshift cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_cache_files',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## openshift cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_cache_dirs',` ++ refpolicywarn(`$0($*) has been deprecated.') ++') ++ ++ ++######################################## ++## ++## Allow the specified domain to read openshift's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`openshift_read_log',` ++ gen_require(` ++ type openshift_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, openshift_log_t, openshift_log_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to append ++## openshift log files. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openshift_append_log',` ++ gen_require(` ++ type openshift_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, openshift_log_t, openshift_log_t) ++') ++ ++######################################## ++## ++## Allow domain to manage openshift log files ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`openshift_manage_log',` ++ gen_require(` ++ type openshift_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, openshift_log_t, openshift_log_t) ++ manage_files_pattern($1, openshift_log_t, openshift_log_t) ++ manage_lnk_files_pattern($1, openshift_log_t, openshift_log_t) ++') ++ ++######################################## ++## ++## Search openshift lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_search_lib',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ search_dirs_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ getattr_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Getattr openshift lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_getattr_lib',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ getattr_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read openshift lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_read_lib_files',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ read_lnk_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++') ++ ++######################################## ++## ++## Read openshift lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_append_lib_files',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ append_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## openshift lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_lib_files',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ manage_lnk_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## openshift lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_lib_dirs',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++') ++ ++######################################## ++## ++## Manage openshift lib content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_content',` ++ gen_require(` ++ attribute openshift_file_type; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, openshift_file_type, openshift_file_type) ++ manage_files_pattern($1, openshift_file_type, openshift_file_type) ++ manage_lnk_files_pattern($1, openshift_file_type, openshift_file_type) ++ manage_sock_files_pattern($1, openshift_file_type, openshift_file_type) ++') ++ ++######################################## ++## ++## Relabel openshift library files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_relabelfrom_lib',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ relabel_dirs_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++ relabel_files_pattern($1, openshift_var_lib_t, openshift_var_lib_t) ++') ++ ++####################################### ++## ++## Create private objects in the ++## mail lib directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the object to be created. ++## ++## ++## ++## ++## The object class of the object being created. ++## ++## ++## ++## ++## The name of the object being created. ++## ++## ++# ++interface(`openshift_lib_filetrans',` ++ gen_require(` ++ type openshift_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ filetrans_pattern($1, openshift_var_lib_t, $2, $3, $4) ++') ++ ++######################################## ++## ++## Read openshift PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_read_pid_files',` ++ gen_require(` ++ type openshift_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 openshift_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an openshift environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`openshift_admin',` ++ gen_require(` ++ attribute openshift_domain; ++ type openshift_initrc_exec_t; ++ type openshift_log_t; ++ type openshift_var_lib_t; ++ type openshift_var_run_t; ++ ') ++ ++ allow $1 openshift_domain:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 openshift_domain:process ptrace; ++ ') ++ ps_process_pattern($1, openshift_domain) ++ ++ openshift_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 openshift_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_search_logs($1) ++ admin_pattern($1, openshift_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, openshift_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, openshift_var_run_t) ++ ++') ++ ++######################################## ++## ++## Make the specified type usable as a openshift domain. ++## ++## ++## ++## The prefix of the domain (e.g., openshift ++## is the prefix for openshift_t). ++## ++## ++# ++template(`openshift_service_domain_template',` ++ gen_require(` ++ attribute openshift_domain; ++ attribute openshift_user_domain; ++ ') ++ ++ type $1_t; ++ typeattribute $1_t openshift_domain, openshift_user_domain; ++ domain_type($1_t) ++ role system_r types $1_t; ++ mcs_constrained($1_t) ++ domain_user_exemption_target($1_t) ++ auth_use_nsswitch($1_t) ++ domain_subj_id_change_exemption($1_t) ++ domain_obj_id_change_exemption($1_t) ++ domain_dyntrans_type($1_t) ++ ++ kernel_read_system_state($1_t) ++ ++ logging_send_syslog_msg($1_t) ++ ++ type $1_app_t; ++ typeattribute $1_app_t openshift_domain; ++ domain_type($1_app_t) ++ role system_r types $1_app_t; ++ mcs_constrained($1_app_t) ++ domain_user_exemption_target($1_app_t) ++ domain_obj_id_change_exemption($1_app_t) ++ domain_dyntrans_type($1_app_t) ++ auth_use_nsswitch($1_app_t) ++ ++ kernel_read_system_state($1_app_t) ++ ++ logging_send_syslog_msg($1_app_t) ++') ++ ++######################################## ++## ++## Make the specified type usable as a openshift domain. ++## ++## ++## ++## Type to be used as a openshift domain type. ++## ++## ++# ++interface(`openshift_net_type',` ++ gen_require(` ++ attribute openshift_net_domain; ++ ') ++ ++ typeattribute $1 openshift_net_domain; ++') ++ ++######################################## ++## ++## Read and write inherited openshift files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_rw_inherited_content',` ++ gen_require(` ++ attribute openshift_file_type; ++ ') ++ ++ allow $1 openshift_file_type:file rw_inherited_file_perms; ++') ++ ++######################################## ++## ++## Manage openshift tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_tmp_files',` ++ gen_require(` ++ type openshift_tmp_t; ++ ') ++ ++ manage_files_pattern($1, openshift_tmp_t, openshift_tmp_t) ++') ++ ++######################################## ++## ++## Manage openshift tmp sockets. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_manage_tmp_sockets',` ++ gen_require(` ++ type openshift_tmp_t; ++ ') ++ ++ manage_sock_files_pattern($1, openshift_tmp_t, openshift_tmp_t) ++') ++ ++######################################## ++## ++## Mounton openshift tmp directory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_mounton_tmp',` ++ gen_require(` ++ type openshift_tmp_t; ++ ') ++ ++ allow $1 openshift_tmp_t:dir mounton; ++') ++ ++######################################## ++## ++## Dontaudit Read and write inherited script fifo files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openshift_dontaudit_rw_inherited_fifo_files',` ++ gen_require(` ++ type openshift_initrc_t; ++ type openshift_t; ++ ') ++ ++ dontaudit $1 openshift_initrc_t:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit $1 openshift_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Allow calling app to transition to an openshift domain ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++# ++interface(`openshift_transition',` ++ gen_require(` ++ attribute openshift_user_domain; ++ ') ++ ++ allow $1 openshift_user_domain:process transition; ++ dontaudit $1 openshift_user_domain:process { noatsecure siginh rlimitinh }; ++ allow openshift_user_domain $1:fd use; ++ allow openshift_user_domain $1:fifo_file rw_inherited_fifo_file_perms; ++ allow openshift_user_domain $1:process sigchld; ++ dontaudit $1 openshift_user_domain:socket_class_set { read write }; ++') ++ ++######################################## ++## ++## Allow calling app to transition to an openshift domain ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++# ++interface(`openshift_dyntransition',` ++ gen_require(` ++ attribute openshift_domain; ++ attribute openshift_user_domain; ++ ') ++ ++ allow $1 openshift_user_domain:process dyntransition; ++ dontaudit openshift_user_domain $1:key view; ++ allow openshift_user_domain $1:unix_stream_socket { connectto rw_socket_perms }; ++ allow openshift_user_domain $1:unix_dgram_socket rw_socket_perms; ++ allow $1 openshift_user_domain:process { rlimitinh signal }; ++ dontaudit openshift_domain $1:tcp_socket { read write getattr setopt getopt shutdown }; ++') ++ ++######################################## ++## ++## Execute openshift in the openshift domain, and ++## allow the specified role the openshift domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++# ++interface(`openshift_run',` ++ gen_require(` ++ type openshift_initrc_exec_t; ++ ') ++ ++ openshift_initrc_domtrans($1) ++ role_transition $2 openshift_initrc_exec_t system_r; ++ openshift_transition($1) ++') +diff --git a/openshift.te b/openshift.te +new file mode 100644 +index 0000000000..a98990f3ab +--- /dev/null ++++ b/openshift.te +@@ -0,0 +1,634 @@ ++policy_module(openshift,1.0.0) ++ ++gen_require(` ++ role system_r; ++') ++ ++## ++##

      ++## Allow openshift to access nfs file systems without labels ++##

      ++##
      ++gen_tunable(openshift_use_nfs, false) ++ ++ ++######################################## ++# ++# Declarations ++# ++ ++ ++# openshift applications that can use the network. ++attribute openshift_net_domain; ++# Attribute representing all openshift user processes (excludes apache processes) ++attribute openshift_user_domain; ++# Attribute representing all openshift processes ++attribute openshift_domain; ++ ++# Attribute for all openshift content ++attribute openshift_file_type; ++ ++# Type of openshift init script ++type openshift_initrc_t; ++type openshift_initrc_exec_t; ++init_daemon_domain(openshift_initrc_t, openshift_initrc_exec_t) ++init_ranged_daemon_domain(openshift_initrc_t, openshift_initrc_exec_t, s0 - mcs_systemhigh) ++domain_obj_id_change_exemption(openshift_initrc_t) ++optional_policy(` ++ oddjob_ranged_domain(openshift_initrc_t, openshift_initrc_exec_t, s0 - mcs_systemhigh) ++') ++ ++type openshift_initrc_tmp_t; ++files_tmp_file(openshift_initrc_tmp_t) ++ ++type openshift_tmpfs_t; ++files_tmpfs_file(openshift_tmpfs_t) ++ ++type openshift_tmp_t, openshift_file_type; ++files_tmp_file(openshift_tmp_t) ++files_mountpoint(openshift_tmp_t) ++files_poly(openshift_tmp_t) ++files_poly_parent(openshift_tmp_t) ++ ++type openshift_var_run_t; ++files_pid_file(openshift_var_run_t) ++ ++type openshift_var_lib_t, openshift_file_type; ++userdom_user_home_content(openshift_var_lib_t) ++files_poly(openshift_var_lib_t) ++files_poly_parent(openshift_var_lib_t) ++files_mountpoint(openshift_var_lib_t) ++ ++type openshift_rw_file_t, openshift_file_type; ++files_poly(openshift_rw_file_t) ++files_poly_parent(openshift_rw_file_t) ++ ++type openshift_log_t; ++logging_log_file(openshift_log_t) ++ ++type openshift_port_t; ++corenet_port(openshift_port_t) ++corenet_reserved_port(openshift_port_t) ++ ++type openshift_cgroup_read_t; ++type openshift_cgroup_read_exec_t; ++application_domain(openshift_cgroup_read_t, openshift_cgroup_read_exec_t) ++ ++type openshift_net_read_t; ++type openshift_net_read_exec_t; ++application_domain(openshift_net_read_t, openshift_net_read_exec_t) ++ ++type openshift_cgroup_read_tmp_t, openshift_file_type; ++files_tmp_file(openshift_cgroup_read_tmp_t) ++ ++type openshift_cron_t; ++type openshift_cron_exec_t; ++domain_type(openshift_cron_t) ++domain_entry_file(openshift_cron_t, openshift_cron_exec_t) ++role system_r types openshift_cron_t; ++ ++optional_policy(` ++ cron_system_entry(openshift_cron_t, openshift_cron_exec_t) ++') ++ ++type openshift_cron_tmp_t, openshift_file_type; ++files_tmp_file(openshift_cron_tmp_t) ++ ++######################################## ++# ++# Template to create openshift_t and openshift_app_t ++# ++ ++openshift_service_domain_template(openshift) ++ ++######################################## ++# ++# openshift initrc local policy ++# ++ ++unconfined_domain_noaudit(openshift_initrc_t) ++mcs_process_set_categories(openshift_initrc_t) ++ ++virt_sandbox_domain(openshift_initrc_t) ++ ++systemd_dbus_chat_logind(openshift_initrc_t) ++ ++manage_dirs_pattern(openshift_initrc_t, openshift_initrc_tmp_t, openshift_initrc_tmp_t) ++manage_files_pattern(openshift_initrc_t, openshift_initrc_tmp_t, openshift_initrc_tmp_t) ++manage_lnk_files_pattern(openshift_initrc_t, openshift_initrc_tmp_t, openshift_initrc_tmp_t) ++files_tmp_filetrans(openshift_initrc_t, openshift_initrc_tmp_t, { file dir }) ++ ++manage_dirs_pattern(openshift_initrc_t, openshift_var_run_t, openshift_var_run_t) ++manage_files_pattern(openshift_initrc_t, openshift_var_run_t, openshift_var_run_t) ++manage_lnk_files_pattern(openshift_initrc_t, openshift_var_run_t, openshift_var_run_t) ++files_pid_filetrans(openshift_initrc_t, openshift_var_run_t, { file dir }) ++ ++manage_dirs_pattern(openshift_initrc_t, openshift_log_t, openshift_log_t) ++manage_files_pattern(openshift_initrc_t, openshift_log_t, openshift_log_t) ++logging_log_filetrans(openshift_initrc_t, openshift_log_t, { file dir }) ++ ++allow openshift_initrc_t openshift_domain:process { getattr getsched setsched transition signal signull sigkill }; ++allow openshift_domain openshift_initrc_t:fd use; ++allow openshift_domain openshift_initrc_t:fifo_file rw_inherited_fifo_file_perms; ++allow openshift_domain openshift_initrc_t:process sigchld; ++dontaudit openshift_domain openshift_initrc_t:key view; ++dontaudit openshift_domain openshift_initrc_t:process signull; ++dontaudit openshift_domain openshift_initrc_t:socket_class_set { read write }; ++ ++init_domtrans_script(openshift_initrc_t) ++init_initrc_domain(openshift_initrc_t) ++ ++optional_policy(` ++ firewalld_dbus_chat(openshift_initrc_t) ++') ++ ++####################################################### ++# ++# Policy for all openshift domains ++# ++allow openshift_domain self:process ~ptrace; ++tunable_policy(`deny_ptrace',`',` ++ allow openshift_domain self:process ptrace; ++') ++ ++allow openshift_domain self:msg all_msg_perms; ++allow openshift_domain self:msgq create_msgq_perms; ++allow openshift_domain self:shm create_shm_perms; ++allow openshift_domain self:sem create_sem_perms; ++dontaudit openshift_domain self:dir write; ++dontaudit openshift_domain self:rawip_socket create_socket_perms; ++ ++dontaudit openshift_t self:unix_stream_socket recvfrom; ++dontaudit openshift_domain self:netlink_tcpdiag_socket create; ++dontaudit openshift_domain self:netlink_route_socket nlmsg_write; ++allow openshift_domain self:tcp_socket create_stream_socket_perms; ++allow openshift_domain self:fifo_file manage_fifo_file_perms; ++allow openshift_domain self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow openshift_domain self:unix_dgram_socket { create_socket_perms sendto }; ++dontaudit openshift_domain self:netlink_audit_socket { create_socket_perms nlmsg_relay }; ++ ++manage_dirs_pattern(openshift_domain, openshift_rw_file_t, openshift_rw_file_t) ++manage_files_pattern(openshift_domain, openshift_rw_file_t, openshift_rw_file_t) ++manage_fifo_files_pattern(openshift_domain, openshift_rw_file_t, openshift_rw_file_t) ++manage_sock_files_pattern(openshift_domain, openshift_rw_file_t, openshift_rw_file_t) ++manage_lnk_files_pattern(openshift_domain, openshift_rw_file_t, openshift_rw_file_t) ++allow openshift_domain openshift_rw_file_t:dir_file_class_set { relabelfrom relabelto }; ++ ++list_dirs_pattern(openshift_domain, openshift_file_type, openshift_file_type) ++read_files_pattern(openshift_domain, openshift_file_type, openshift_file_type) ++rw_fifo_files_pattern(openshift_domain, openshift_file_type, openshift_file_type) ++rw_sock_files_pattern(openshift_domain, openshift_file_type, openshift_file_type) ++read_lnk_files_pattern(openshift_domain, openshift_file_type, openshift_file_type) ++allow openshift_domain openshift_file_type:file execmod; ++can_exec(openshift_domain, openshift_file_type) ++allow openshift_domain openshift_file_type:file entrypoint; ++# Allow users to execute files in their home dir ++allow openshift_domain openshift_file_type:file { execute execute_no_trans }; ++ ++# Dontaudit openshift domains trying to search other openshift domains directories, ++# this happens just when users are probing the system ++dontaudit openshift_domain openshift_file_type:dir search_dir_perms ++; ++ ++manage_dirs_pattern(openshift_domain, openshift_tmpfs_t, openshift_tmpfs_t) ++manage_files_pattern(openshift_domain, openshift_tmpfs_t, openshift_tmpfs_t) ++manage_lnk_files_pattern(openshift_domain, openshift_tmpfs_t, openshift_tmpfs_t) ++manage_sock_files_pattern(openshift_domain, openshift_tmpfs_t, openshift_tmpfs_t) ++manage_fifo_files_pattern(openshift_domain, openshift_tmpfs_t, openshift_tmpfs_t) ++fs_tmpfs_filetrans(openshift_domain, openshift_tmpfs_t, { dir file sock_file lnk_file fifo_file }) ++can_exec(openshift_domain, openshift_tmpfs_t) ++ ++manage_dirs_pattern(openshift_domain, openshift_tmp_t, openshift_tmp_t) ++manage_fifo_files_pattern(openshift_domain, openshift_tmp_t, openshift_tmp_t) ++manage_files_pattern(openshift_domain, openshift_tmp_t, openshift_tmp_t) ++manage_lnk_files_pattern(openshift_domain, openshift_tmp_t, openshift_tmp_t) ++manage_sock_files_pattern(openshift_domain, openshift_tmp_t, openshift_tmp_t) ++files_tmp_filetrans(openshift_domain, openshift_tmp_t, { lnk_file file dir sock_file fifo_file }) ++allow openshift_domain openshift_tmp_t:dir_file_class_set { relabelfrom relabelto }; ++ ++allow openshift_domain openshift_log_t:file { getattr append lock ioctl }; ++ ++#lsof ++allow openshift_domain openshift_initrc_t:tcp_socket getattr; ++ ++dontaudit openshift_domain openshift_initrc_tmp_t:file append; ++dontaudit openshift_domain openshift_var_run_t:file append; ++dontaudit openshift_domain openshift_file_type:sock_file execute; ++ ++kernel_dontaudit_search_network_state(openshift_domain) ++kernel_dontaudit_list_all_proc(openshift_domain) ++kernel_dontaudit_list_all_sysctls(openshift_domain) ++kernel_dontaudit_request_load_module(openshift_domain) ++kernel_get_sysvipc_info(openshift_domain) ++ ++corecmd_shell_entry_type(openshift_domain) ++corecmd_bin_entry_type(openshift_domain) ++corecmd_exec_all_executables(openshift_domain) ++ ++dev_read_sysfs(openshift_domain) ++dev_read_rand(openshift_domain) ++dev_read_urand(openshift_domain) ++dev_dontaudit_append_rand(openshift_domain) ++dev_dontaudit_write_urand(openshift_domain) ++dev_dontaudit_getattr_all_blk_files(openshift_domain) ++dev_dontaudit_getattr_all_chr_files(openshift_domain) ++dev_dontaudit_all_access_check(openshift_domain) ++ ++domain_use_interactive_fds(openshift_domain) ++domain_dontaudit_read_all_domains_state(openshift_domain) ++ ++files_read_var_lib_symlinks(openshift_domain) ++ ++fs_rw_hugetlbfs_files(openshift_domain) ++fs_rw_anon_inodefs_files(openshift_domain) ++fs_search_tmpfs(openshift_domain) ++fs_getattr_all_fs(openshift_domain) ++fs_dontaudit_getattr_all_fs(openshift_domain) ++fs_list_inotifyfs(openshift_domain) ++fs_dontaudit_list_auto_mountpoints(openshift_domain) ++fs_dontaudit_list_tmpfs(openshift_domain) ++storage_dontaudit_getattr_fixed_disk_dev(openshift_domain) ++storage_getattr_fixed_disk_dev(openshift_domain) ++fs_get_xattr_fs_quotas(openshift_domain) ++fs_rw_inherited_tmpfs_files(openshift_domain) ++fs_dontaudit_rw_anon_inodefs_files(openshift_domain) ++ ++dontaudit openshift_domain file_type:dir read; ++files_dontaudit_list_home(openshift_domain) ++files_dontaudit_search_all_pids(openshift_domain) ++files_dontaudit_getattr_all_dirs(openshift_domain) ++files_dontaudit_getattr_all_files(openshift_domain) ++files_dontaudit_list_mnt(openshift_domain) ++files_dontaudit_list_var(openshift_domain) ++files_dontaudit_getattr_lost_found_dirs(openshift_domain) ++files_dontaudit_search_all_mountpoints(openshift_domain) ++files_dontaudit_search_spool(openshift_domain) ++files_dontaudit_search_all_dirs(openshift_domain) ++files_exec_etc_files(openshift_domain) ++files_exec_usr_files(openshift_domain) ++files_dontaudit_getattr_non_security_sockets(openshift_domain) ++files_dontaudit_setattr_non_security_dirs(openshift_domain) ++files_dontaudit_setattr_non_security_files(openshift_domain) ++files_dontaudit_rw_inherited_locks(openshift_domain) ++ ++libs_exec_lib_files(openshift_domain) ++libs_exec_ld_so(openshift_domain) ++ ++selinux_validate_context(openshift_domain) ++ ++logging_inherit_append_all_logs(openshift_domain) ++ ++init_dontaudit_read_utmp(openshift_domain) ++ ++miscfiles_read_fonts(openshift_domain) ++miscfiles_dontaudit_setattr_fonts_cache_dirs(openshift_domain) ++ ++mta_dontaudit_read_spool_symlinks(openshift_domain) ++ ++term_dontaudit_search_ptys(openshift_domain) ++term_use_generic_ptys(openshift_domain) ++term_dontaudit_getattr_generic_ptys(openshift_domain) ++term_use_ptmx(openshift_domain) ++ ++userdom_use_inherited_user_ptys(openshift_domain) ++userdom_dontaudit_search_admin_dir(openshift_domain) ++ ++application_exec(openshift_domain) ++ ++optional_policy(` ++ apache_exec_modules(openshift_domain) ++ apache_list_modules(openshift_domain) ++ apache_read_config(openshift_domain) ++ apache_search_config(openshift_domain) ++ apache_read_sys_content(openshift_domain) ++ apache_exec_sys_script(openshift_domain) ++ apache_entrypoint(openshift_domain) ++ apache_dontaudit_read_log(openshift_domain) ++') ++ ++optional_policy(` ++ ############################################# ++ # ++ # openshift cgi script policy ++ # ++ apache_content_template(openshift) ++ apache_content_alias_template(openshift, openshift) ++ domtrans_pattern(openshift_script_t, openshift_initrc_exec_t, openshift_initrc_t) ++ ++ optional_policy(` ++ dbus_system_bus_client(openshift_script_t) ++ ++ optional_policy(` ++ oddjob_dbus_chat(openshift_script_t) ++ oddjob_dontaudit_rw_fifo_file(openshift_domain) ++ ') ++ ') ++') ++ ++optional_policy(` ++ cron_role(system_r, openshift_domain) ++') ++ ++optional_policy(` ++ gear_search_lib(openshift_domain) ++') ++ ++optional_policy(` ++ gpg_entry_type(openshift_domain) ++') ++ ++optional_policy(` ++ mysql_search_db(openshift_domain) ++') ++ ++optional_policy(` ++ screen_exec(openshift_domain) ++') ++ ++optional_policy(` ++ ssh_use_ptys(openshift_domain) ++ ssh_getattr_user_home_dir(openshift_domain) ++ ssh_dontaudit_search_user_home_dir(openshift_domain) ++') ++ ++optional_policy(` ++ udev_read_pid_files(openshift_domain) ++') ++ ++####################################################### ++# ++# Policy for openshift user domain process ++# ++manage_dirs_pattern(openshift_user_domain, openshift_file_type, openshift_file_type) ++manage_files_pattern(openshift_user_domain, openshift_file_type, openshift_file_type) ++manage_fifo_files_pattern(openshift_user_domain, openshift_file_type, openshift_file_type) ++manage_sock_files_pattern(openshift_user_domain, openshift_file_type, openshift_file_type) ++manage_lnk_files_pattern(openshift_user_domain, openshift_file_type, openshift_file_type) ++allow openshift_user_domain openshift_file_type:dir_file_class_set { relabelfrom relabelto }; ++ ++allow openshift_user_domain openshift_domain:process transition; ++allow openshift_domain openshift_user_domain:fd use; ++allow openshift_domain openshift_user_domain:fifo_file rw_inherited_fifo_file_perms; ++allow openshift_domain openshift_user_domain:process sigchld; ++dontaudit openshift_domain openshift_user_domain:key view; ++dontaudit openshift_domain openshift_user_domain:process signull; ++dontaudit openshift_domain openshift_user_domain:socket_class_set { read write }; ++ ++tunable_policy(`deny_ptrace',`',` ++ allow openshift_user_domain openshift_domain:process ptrace; ++') ++ ++mta_signal_user_agent(openshift_user_domain) ++ ++optional_policy(` ++ ssh_rw_tcp_sockets(openshift_user_domain) ++') ++ ++############################################################################ ++# ++# Rules specific to openshift_net_domains ++# ++allow openshift_net_domain openshift_port_t:tcp_socket { name_connect name_bind }; ++allow openshift_net_domain openshift_port_t:udp_socket name_bind; ++ ++corenet_tcp_connect_mssql_port(openshift_net_domain) ++corenet_tcp_connect_mysqld_port(openshift_net_domain) ++corenet_tcp_connect_postgresql_port(openshift_net_domain) ++corenet_tcp_connect_git_port(openshift_net_domain) ++corenet_tcp_connect_oracle_port(openshift_net_domain) ++corenet_tcp_connect_flash_port(openshift_net_domain) ++corenet_tcp_connect_http_port(openshift_net_domain) ++corenet_tcp_connect_ftp_port(openshift_net_domain) ++#/* These ports are the ephemeral ports needed for ftp */ ++corenet_tcp_connect_virt_migration_port(openshift_net_domain) ++corenet_tcp_connect_ssh_port(openshift_net_domain) ++corenet_tcp_connect_jacorb_port(openshift_net_domain) ++corenet_tcp_connect_jboss_management_port(openshift_net_domain) ++corenet_tcp_connect_jboss_debug_port(openshift_net_domain) ++corenet_tcp_connect_jboss_messaging_port(openshift_net_domain) ++corenet_tcp_connect_memcache_port(openshift_net_domain) ++corenet_tcp_connect_http_cache_port(openshift_net_domain) ++corenet_tcp_connect_amqp_port(openshift_net_domain) ++corenet_tcp_connect_generic_port(openshift_net_domain) ++corenet_tcp_connect_mongod_port(openshift_net_domain) ++corenet_tcp_connect_munin_port(openshift_net_domain) ++corenet_tcp_connect_pop_port(openshift_net_domain) ++corenet_tcp_connect_pulseaudio_port(openshift_net_domain) ++corenet_tcp_connect_smtp_port(openshift_net_domain) ++corenet_tcp_connect_whois_port(openshift_net_domain) ++corenet_udp_bind_generic_port(openshift_net_domain) ++corenet_tcp_bind_http_cache_port(openshift_domain) ++corenet_tcp_bind_jacorb_port(openshift_net_domain) ++corenet_tcp_bind_jboss_management_port(openshift_net_domain) ++corenet_tcp_bind_jboss_messaging_port(openshift_net_domain) ++corenet_tcp_bind_jboss_debug_port(openshift_net_domain) ++corenet_tcp_bind_mongod_port(openshift_net_domain) ++corenet_tcp_bind_mysqld_port(openshift_domain) ++corenet_tcp_bind_pulseaudio_port(openshift_net_domain) ++corenet_tcp_bind_postgresql_port(openshift_net_domain) ++ ++############################################################################ ++# ++# Rules specific to openshift and openshift_app_t ++# ++kernel_read_vm_sysctls(openshift_t) ++kernel_read_vm_sysctls(openshift_app_t) ++kernel_search_vm_sysctl(openshift_t) ++kernel_search_vm_sysctl(openshift_app_t) ++netutils_domtrans_ping(openshift_t) ++netutils_kill_ping(openshift_t) ++netutils_signal_ping(openshift_t) ++ ++openshift_net_type(openshift_app_t) ++openshift_net_type(openshift_t) ++ ++optional_policy(` ++ postfix_rw_public_pipes(openshift_t) ++ postfix_manage_spool_maildrop_files(openshift_t) ++') ++ ++######################################## ++# ++# openshift_cgroup_read local policy ++# ++ ++allow openshift_cgroup_read_t self:process { getattr signal_perms }; ++allow openshift_cgroup_read_t self:fifo_file rw_fifo_file_perms; ++allow openshift_cgroup_read_t self:unix_stream_socket create_stream_socket_perms; ++allow openshift_cgroup_read_t openshift_initrc_t:fifo_file rw_inherited_fifo_file_perms; ++ ++allow openshift_cgroup_read_t openshift_file_type:file rw_inherited_file_perms; ++ ++manage_dirs_pattern(openshift_cgroup_read_t, openshift_cgroup_read_tmp_t, openshift_cgroup_read_tmp_t) ++manage_files_pattern(openshift_cgroup_read_t, openshift_cgroup_read_tmp_t, openshift_cgroup_read_tmp_t) ++files_tmp_filetrans(openshift_cgroup_read_t, openshift_cgroup_read_tmp_t, { file dir }) ++ ++kernel_read_system_state(openshift_cgroup_read_t) ++ ++term_dontaudit_use_generic_ptys(openshift_cgroup_read_t) ++ ++auth_read_passwd(openshift_cgroup_read_t) ++ ++miscfiles_read_localization(openshift_cgroup_read_t) ++ ++optional_policy(` ++ ssh_use_ptys(openshift_cgroup_read_t) ++') ++ ++corecmd_exec_bin(openshift_cgroup_read_t) ++corecmd_exec_shell(openshift_cgroup_read_t) ++ ++dev_read_urand(openshift_cgroup_read_t) ++ ++domain_use_interactive_fds(openshift_cgroup_read_t) ++ ++fs_dontaudit_rw_anon_inodefs_files(openshift_cgroup_read_t) ++ ++userdom_use_inherited_user_ptys(openshift_cgroup_read_t) ++ ++miscfiles_read_generic_certs(openshift_cgroup_read_t) ++ ++domtrans_pattern(openshift_domain, openshift_cgroup_read_exec_t, openshift_cgroup_read_t) ++role system_r types openshift_cgroup_read_t; ++ ++allow openshift_domain openshift_cgroup_read_t:process { getattr signal signull sigkill }; ++ ++fs_list_cgroup_dirs(openshift_cgroup_read_t) ++fs_read_cgroup_files(openshift_cgroup_read_t) ++ ++allow openshift_cgroup_read_t openshift_var_lib_t:dir list_dir_perms; ++manage_files_pattern(openshift_cgroup_read_t, openshift_var_lib_t, openshift_var_lib_t) ++allow openshift_cgroup_read_t openshift_file_type:file rw_inherited_file_perms; ++ ++######################################## ++# ++# openshift_net_read local policy ++# ++ ++allow openshift_net_read_t self:process { getattr signal_perms }; ++allow openshift_net_read_t self:fifo_file rw_fifo_file_perms; ++allow openshift_net_read_t self:unix_stream_socket create_stream_socket_perms; ++allow openshift_net_read_t openshift_initrc_t:fifo_file rw_inherited_fifo_file_perms; ++ ++allow openshift_net_read_t openshift_file_type:file rw_inherited_file_perms; ++ ++kernel_read_network_state(openshift_net_read_t) ++kernel_read_system_state(openshift_net_read_t) ++ ++corecmd_exec_bin(openshift_net_read_t) ++corecmd_exec_shell(openshift_net_read_t) ++ ++dev_read_urand(openshift_net_read_t) ++ ++domain_use_interactive_fds(openshift_net_read_t) ++ ++fs_dontaudit_rw_anon_inodefs_files(openshift_net_read_t) ++ ++term_dontaudit_use_generic_ptys(openshift_net_read_t) ++ ++auth_read_passwd(openshift_net_read_t) ++ ++userdom_use_inherited_user_ptys(openshift_net_read_t) ++ ++miscfiles_read_generic_certs(openshift_net_read_t) ++miscfiles_read_localization(openshift_net_read_t) ++ ++optional_policy(` ++ ssh_use_ptys(openshift_net_read_t) ++') ++ ++domtrans_pattern(openshift_domain, openshift_net_read_exec_t, openshift_net_read_t) ++role system_r types openshift_net_read_t; ++ ++allow openshift_domain openshift_net_read_t:process { getattr signal signull sigkill }; ++ ++allow openshift_net_read_t openshift_var_lib_t:dir list_dir_perms; ++manage_files_pattern(openshift_net_read_t, openshift_var_lib_t, openshift_var_lib_t) ++allow openshift_net_read_t openshift_file_type:file rw_inherited_file_perms; ++ ++######################################## ++# ++# openshift_cron local policy ++# ++allow openshift_cron_t self:capability { dac_read_search dac_override net_admin sys_admin }; ++allow openshift_cron_t self:process signal_perms; ++allow openshift_cron_t self:tcp_socket create_stream_socket_perms; ++allow openshift_cron_t self:udp_socket create_socket_perms; ++allow openshift_cron_t self:unix_dgram_socket create_socket_perms; ++allow openshift_cron_t self:netlink_route_socket rw_netlink_socket_perms; ++ ++append_files_pattern(openshift_cron_t, openshift_log_t, openshift_log_t) ++manage_dirs_pattern(openshift_cron_t, openshift_cron_tmp_t, openshift_cron_tmp_t) ++manage_fifo_files_pattern(openshift_cron_t, openshift_cron_tmp_t, openshift_cron_tmp_t) ++manage_files_pattern(openshift_cron_t, openshift_cron_tmp_t, openshift_cron_tmp_t) ++manage_lnk_files_pattern(openshift_cron_t, openshift_cron_tmp_t, openshift_cron_tmp_t) ++manage_sock_files_pattern(openshift_cron_t, openshift_cron_tmp_t, openshift_cron_tmp_t) ++files_tmp_filetrans(openshift_cron_t, openshift_cron_tmp_t, { lnk_file file dir sock_file fifo_file }) ++ ++openshift_manage_lib_dirs(openshift_cron_t) ++openshift_manage_lib_files(openshift_cron_t) ++ ++kernel_search_network_sysctl(openshift_cron_t) ++kernel_read_network_state(openshift_cron_t) ++kernel_read_system_state(openshift_cron_t) ++ ++files_dontaudit_search_all_mountpoints(openshift_cron_t) ++ ++corecmd_exec_bin(openshift_cron_t) ++corecmd_exec_shell(openshift_cron_t) ++ ++dev_read_raw_memory(openshift_cron_t) ++dev_read_urand(openshift_cron_t) ++ ++corenet_udp_bind_generic_node(openshift_cron_t) ++corenet_udp_bind_generic_port(openshift_cron_t) ++ ++dev_getattr_fs(openshift_cron_t) ++dev_list_sysfs(openshift_cron_t) ++dev_read_sysfs(openshift_cron_t) ++ ++files_getattr_home_dir(openshift_cron_t) ++files_manage_etc_files(openshift_cron_t) ++ ++fs_getattr_tmpfs_dirs(openshift_cron_t) ++fs_getattr_all_fs(openshift_cron_t) ++fs_list_hugetlbfs(openshift_cron_t) ++fs_search_cgroup_dirs(openshift_cron_t) ++ ++seutil_domtrans_setfiles(openshift_cron_t) ++ ++term_getattr_pty_fs(openshift_cron_t) ++term_search_ptys(openshift_cron_t) ++ ++auth_use_nsswitch(openshift_cron_t) ++ ++miscfiles_read_generic_certs(openshift_cron_t) ++miscfiles_read_hwdata(openshift_cron_t) ++ ++sysnet_exec_ifconfig(openshift_cron_t) ++sysnet_read_config(openshift_cron_t) ++ ++optional_policy(` ++ dmidecode_exec(openshift_cron_t) ++') ++ ++optional_policy(` ++ hostname_exec(openshift_cron_t) ++') ++ ++optional_policy(` ++ quota_read_db(openshift_cron_t) ++') ++ ++optional_policy(` ++ ssh_domtrans_keygen(openshift_cron_t) ++ ssh_dontaudit_read_server_keys(openshift_cron_t) ++') ++ ++tunable_policy(`openshift_use_nfs',` ++ fs_list_auto_mountpoints(openshift_domain) ++ fs_manage_nfs_dirs(openshift_domain) ++ fs_manage_nfs_files(openshift_domain) ++ fs_manage_nfs_symlinks(openshift_domain) ++ fs_exec_nfs_files(openshift_domain) ++') +diff --git a/opensm.fc b/opensm.fc +new file mode 100644 +index 0000000000..65511ed7af +--- /dev/null ++++ b/opensm.fc +@@ -0,0 +1,7 @@ ++/usr/lib/systemd/system/opensm.* -- gen_context(system_u:object_r:opensm_unit_file_t,s0) ++ ++/usr/libexec/opensm-launch -- gen_context(system_u:object_r:opensm_exec_t,s0) ++ ++/var/cache/opensm(/.*)? gen_context(system_u:object_r:opensm_cache_t,s0) ++ ++/var/log/opensm.* -- gen_context(system_u:object_r:opensm_log_t,s0) +diff --git a/opensm.if b/opensm.if +new file mode 100644 +index 0000000000..45de664777 +--- /dev/null ++++ b/opensm.if +@@ -0,0 +1,224 @@ ++ ++## Opensm is an InfiniBand compliant Subnet Manager and Administration, and runs on top of OpenIB ++ ++######################################## ++## ++## Execute opensm in the opensm domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`opensm_domtrans',` ++ gen_require(` ++ type opensm_t, opensm_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, opensm_exec_t, opensm_t) ++') ++ ++######################################## ++## ++## Search opensm cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_search_cache',` ++ gen_require(` ++ type opensm_cache_t; ++ ') ++ ++ allow $1 opensm_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read opensm cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_read_cache_files',` ++ gen_require(` ++ type opensm_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, opensm_cache_t, opensm_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## opensm cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_manage_cache_files',` ++ gen_require(` ++ type opensm_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, opensm_cache_t, opensm_cache_t) ++') ++ ++######################################## ++## ++## Manage opensm cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_manage_cache_dirs',` ++ gen_require(` ++ type opensm_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, opensm_cache_t, opensm_cache_t) ++') ++ ++######################################## ++## ++## Read opensm's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_read_log',` ++ gen_require(` ++ type opensm_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, opensm_log_t, opensm_log_t) ++') ++ ++######################################## ++## ++## Append to opensm log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_append_log',` ++ gen_require(` ++ type opensm_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, opensm_log_t, opensm_log_t) ++') ++ ++######################################## ++## ++## Manage opensm log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`opensm_manage_log',` ++ gen_require(` ++ type opensm_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, opensm_log_t, opensm_log_t) ++ manage_files_pattern($1, opensm_log_t, opensm_log_t) ++ manage_lnk_files_pattern($1, opensm_log_t, opensm_log_t) ++') ++######################################## ++## ++## Execute opensm server in the opensm domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`opensm_systemctl',` ++ gen_require(` ++ type opensm_t; ++ type opensm_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 opensm_unit_file_t:file read_file_perms; ++ allow $1 opensm_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, opensm_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an opensm environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`opensm_admin',` ++ gen_require(` ++ type opensm_t; ++ type opensm_cache_t; ++ type opensm_log_t; ++ type opensm_unit_file_t; ++ ') ++ ++ allow $1 opensm_t:process { signal_perms }; ++ ps_process_pattern($1, opensm_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 opensm_t:process ptrace; ++ ') ++ ++ files_search_var($1) ++ admin_pattern($1, opensm_cache_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, opensm_log_t) ++ ++ opensm_systemctl($1) ++ admin_pattern($1, opensm_unit_file_t) ++ allow $1 opensm_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/opensm.te b/opensm.te +new file mode 100644 +index 0000000000..81c7870cf5 +--- /dev/null ++++ b/opensm.te +@@ -0,0 +1,49 @@ ++policy_module(opensm, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type opensm_t; ++type opensm_exec_t; ++init_daemon_domain(opensm_t, opensm_exec_t) ++ ++type opensm_cache_t; ++files_type(opensm_cache_t) ++ ++type opensm_log_t; ++logging_log_file(opensm_log_t) ++ ++type opensm_unit_file_t; ++systemd_unit_file(opensm_unit_file_t) ++ ++######################################## ++# ++# opensm local policy ++# ++allow opensm_t self:process { signal fork }; ++allow opensm_t self:fifo_file rw_fifo_file_perms; ++allow opensm_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(opensm_t, opensm_cache_t, opensm_cache_t) ++manage_files_pattern(opensm_t, opensm_cache_t, opensm_cache_t) ++files_var_filetrans(opensm_t, opensm_cache_t, { dir file }) ++ ++manage_files_pattern(opensm_t, opensm_log_t, opensm_log_t) ++logging_log_filetrans(opensm_t, opensm_log_t, file ) ++ ++kernel_read_system_state(opensm_t) ++ ++auth_use_nsswitch(opensm_t) ++ ++corenet_ib_access_unlabeled_pkeys(opensm_t) ++corenet_ib_manage_subnet_unlabeled_endports(opensm_t) ++ ++corecmd_exec_bin(opensm_t) ++ ++dev_read_sysfs(opensm_t) ++dev_rw_infiniband_dev(opensm_t) ++dev_rw_infiniband_mgmt_dev(opensm_t) ++ ++logging_send_syslog_msg(opensm_t) +diff --git a/openvpn.fc b/openvpn.fc +index 300213f834..4cdfe097c1 100644 +--- a/openvpn.fc ++++ b/openvpn.fc +@@ -1,10 +1,13 @@ + /etc/openvpn(/.*)? gen_context(system_u:object_r:openvpn_etc_t,s0) ++/etc/openvpn/scripts(/.*)? gen_context(system_u:object_r:openvpn_unconfined_script_exec_t,s0) + /etc/openvpn/ipp\.txt -- gen_context(system_u:object_r:openvpn_etc_rw_t,s0) + + /etc/rc\.d/init\.d/openvpn -- gen_context(system_u:object_r:openvpn_initrc_exec_t,s0) + + /usr/sbin/openvpn -- gen_context(system_u:object_r:openvpn_exec_t,s0) + ++/var/lib/openvpn(/.*)? gen_context(system_u:object_r:openvpn_var_lib_t,s0) ++ + /var/log/openvpn-status\.log.* -- gen_context(system_u:object_r:openvpn_status_t,s0) + /var/log/openvpn.* gen_context(system_u:object_r:openvpn_var_log_t,s0) + +diff --git a/openvpn.if b/openvpn.if +index 6837e9a2bd..8d6e33b005 100644 +--- a/openvpn.if ++++ b/openvpn.if +@@ -20,6 +20,25 @@ interface(`openvpn_domtrans',` + domtrans_pattern($1, openvpn_exec_t, openvpn_t) + ') + ++######################################## ++## ++## Execute openvpn clients in the ++## caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openvpn_exec',` ++ gen_require(` ++ type openvpn_exec_t; ++ ') ++ ++ can_exec($1, openvpn_exec_t) ++') ++ + ######################################## + ## + ## Execute openvpn clients in the +@@ -123,6 +142,44 @@ interface(`openvpn_read_config',` + allow $1 openvpn_etc_t:lnk_file read_lnk_file_perms; + ') + ++#################################### ++## ++## Connect to openvpn over ++## a unix domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvpn_stream_connect',` ++ gen_require(` ++ type openvpn_t, openvpn_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, openvpn_var_run_t, openvpn_var_run_t, openvpn_t) ++') ++ ++######################################## ++## ++## Read and write to sopenvpn_image devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvpn_noatsecure',` ++ gen_require(` ++ type openvpn_t; ++ ') ++ ++ allow $1 openvpn_t:process noatsecure; ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -147,9 +204,13 @@ interface(`openvpn_admin',` + type openvpn_status_t; + ') + +- allow $1 openvpn_t:process { ptrace signal_perms }; ++ allow $1 openvpn_t:process signal_perms; + ps_process_pattern($1, openvpn_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 openvpn_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, openvpn_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 openvpn_initrc_exec_t system_r; +diff --git a/openvpn.te b/openvpn.te +index 63957a3627..91dead6e7f 100644 +--- a/openvpn.te ++++ b/openvpn.te +@@ -5,6 +5,13 @@ policy_module(openvpn, 1.12.2) + # Declarations + # + ++## ++##

      ++## Allow openvpn to run unconfined scripts ++##

      ++##
      ++gen_tunable(openvpn_run_unconfined, false) ++ + ## + ##

      + ## Determine whether openvpn can +@@ -19,7 +26,7 @@ gen_tunable(openvpn_enable_homedirs, false) + ## connect to the TCP network. + ##

      + ##
      +-gen_tunable(openvpn_can_network_connect, false) ++gen_tunable(openvpn_can_network_connect, true) + + attribute_role openvpn_roles; + +@@ -40,6 +47,9 @@ init_script_file(openvpn_initrc_exec_t) + type openvpn_status_t; + logging_log_file(openvpn_status_t) + ++type openvpn_var_lib_t; ++files_type(openvpn_var_lib_t) ++ + type openvpn_tmp_t; + files_tmp_file(openvpn_tmp_t) + +@@ -54,7 +64,7 @@ files_pid_file(openvpn_var_run_t) + # Local policy + # + +-allow openvpn_t self:capability { dac_read_search dac_override ipc_lock net_admin setgid setuid sys_chroot sys_tty_config sys_nice }; ++allow openvpn_t self:capability { dac_read_search dac_override ipc_lock net_bind_service net_admin setgid setuid sys_chroot sys_tty_config sys_nice }; + allow openvpn_t self:process { signal getsched setsched }; + allow openvpn_t self:fifo_file rw_fifo_file_perms; + allow openvpn_t self:unix_dgram_socket sendto; +@@ -63,6 +73,8 @@ allow openvpn_t self:tcp_socket server_stream_socket_perms; + allow openvpn_t self:tun_socket { create_socket_perms relabelfrom relabelto }; + allow openvpn_t self:netlink_route_socket nlmsg_write; + ++dontaudit openvpn_t self:capability2 block_suspend ; ++ + allow openvpn_t openvpn_etc_t:dir list_dir_perms; + allow openvpn_t openvpn_etc_t:file read_file_perms; + allow openvpn_t openvpn_etc_t:lnk_file read_lnk_file_perms; +@@ -73,18 +85,23 @@ filetrans_pattern(openvpn_t, openvpn_etc_t, openvpn_etc_rw_t, file) + allow openvpn_t openvpn_status_t:file manage_file_perms; + logging_log_filetrans(openvpn_t, openvpn_status_t, file, "openvpn-status.log") + ++manage_files_pattern(openvpn_t, openvpn_tmp_t, openvpn_tmp_t) ++files_tmp_filetrans(openvpn_t, openvpn_tmp_t, file) ++ ++manage_files_pattern(openvpn_t, openvpn_var_lib_t, openvpn_var_lib_t) ++files_var_lib_filetrans(openvpn_t, openvpn_var_lib_t, { dir file }) ++ + allow openvpn_t openvpn_tmp_t:file manage_file_perms; + files_tmp_filetrans(openvpn_t, openvpn_tmp_t, file) + + manage_dirs_pattern(openvpn_t, openvpn_var_log_t, openvpn_var_log_t) +-append_files_pattern(openvpn_t, openvpn_var_log_t, openvpn_var_log_t) +-create_files_pattern(openvpn_t, openvpn_var_log_t, openvpn_var_log_t) +-setattr_files_pattern(openvpn_t, openvpn_var_log_t, openvpn_var_log_t) ++manage_files_pattern(openvpn_t, openvpn_var_log_t, openvpn_var_log_t) + logging_log_filetrans(openvpn_t, openvpn_var_log_t, file) + + manage_dirs_pattern(openvpn_t, openvpn_var_run_t, openvpn_var_run_t) + manage_files_pattern(openvpn_t, openvpn_var_run_t, openvpn_var_run_t) +-files_pid_filetrans(openvpn_t, openvpn_var_run_t, { file dir }) ++manage_sock_files_pattern(openvpn_t, openvpn_var_run_t, openvpn_var_run_t) ++files_pid_filetrans(openvpn_t, openvpn_var_run_t, { sock_file file dir }) + + can_exec(openvpn_t, openvpn_etc_t) + +@@ -97,7 +114,6 @@ kernel_request_load_module(openvpn_t) + corecmd_exec_bin(openvpn_t) + corecmd_exec_shell(openvpn_t) + +-corenet_all_recvfrom_unlabeled(openvpn_t) + corenet_all_recvfrom_netlabel(openvpn_t) + corenet_tcp_sendrecv_generic_if(openvpn_t) + corenet_udp_sendrecv_generic_if(openvpn_t) +@@ -117,13 +133,15 @@ corenet_udp_sendrecv_openvpn_port(openvpn_t) + corenet_sendrecv_http_server_packets(openvpn_t) + corenet_tcp_bind_http_port(openvpn_t) + corenet_sendrecv_http_client_packets(openvpn_t) ++corenet_tcp_connect_squid_port(openvpn_t) + corenet_tcp_connect_http_port(openvpn_t) + corenet_tcp_sendrecv_http_port(openvpn_t) +- + corenet_sendrecv_http_cache_client_packets(openvpn_t) + corenet_tcp_connect_http_cache_port(openvpn_t) + corenet_tcp_sendrecv_http_cache_port(openvpn_t) + ++corenet_tcp_connect_tor_port(openvpn_t) ++ + corenet_rw_tun_tap_dev(openvpn_t) + + dev_read_rand(openvpn_t) +@@ -132,21 +150,31 @@ files_read_etc_runtime_files(openvpn_t) + + fs_getattr_all_fs(openvpn_t) + fs_search_auto_mountpoints(openvpn_t) ++fs_list_cgroup_dirs(openvpn_t) + + auth_use_pam(openvpn_t) + +-miscfiles_read_localization(openvpn_t) ++logging_send_syslog_msg(openvpn_t) ++ + miscfiles_read_all_certs(openvpn_t) + ++sysnet_dns_name_resolve(openvpn_t) + sysnet_exec_ifconfig(openvpn_t) + sysnet_manage_config(openvpn_t) + sysnet_etc_filetrans_config(openvpn_t) + sysnet_use_ldap(openvpn_t) + +-userdom_use_user_terminals(openvpn_t) ++systemd_passwd_agent_domtrans(openvpn_t) ++systemd_manage_passwd_run(openvpn_t) ++ ++userdom_use_inherited_user_terminals(openvpn_t) ++userdom_read_home_certs(openvpn_t) ++userdom_attach_admin_tun_iface(openvpn_t) ++userdom_read_inherited_user_tmp_files(openvpn_t) ++userdom_read_inherited_user_home_content_files(openvpn_t) + + tunable_policy(`openvpn_enable_homedirs',` +- userdom_read_user_home_content_files(openvpn_t) ++ userdom_search_user_home_dirs(openvpn_t) + ') + + tunable_policy(`openvpn_enable_homedirs && use_nfs_home_dirs',` +@@ -163,10 +191,20 @@ tunable_policy(`openvpn_can_network_connect',` + corenet_tcp_sendrecv_all_ports(openvpn_t) + ') + ++optional_policy(` ++ brctl_domtrans(openvpn_t) ++') ++ + optional_policy(` + daemontools_service_domain(openvpn_t, openvpn_exec_t) + ') + ++optional_policy(` ++ networkmanager_stream_connect(openvpn_t) ++ networkmanager_manage_pid_files(openvpn_t) ++ networkmanager_manage_pid_sock_files(openvpn_t) ++') ++ + optional_policy(` + dbus_system_bus_client(openvpn_t) + dbus_connect_system_bus(openvpn_t) +@@ -175,3 +213,27 @@ optional_policy(` + networkmanager_dbus_chat(openvpn_t) + ') + ') ++ ++optional_policy(` ++ unconfined_attach_tun_iface(openvpn_t) ++') ++ ++type openvpn_unconfined_script_t; ++type openvpn_unconfined_script_exec_t; ++domain_type(openvpn_unconfined_script_t) ++domain_entry_file(openvpn_unconfined_script_t, openvpn_unconfined_script_exec_t) ++corecmd_shell_entry_type(openvpn_unconfined_script_t) ++role system_r types openvpn_unconfined_script_t; ++ ++allow openvpn_t openvpn_unconfined_script_exec_t:dir search_dir_perms; ++allow openvpn_t openvpn_unconfined_script_exec_t:file ioctl; ++ ++optional_policy(` ++ unconfined_domain(openvpn_unconfined_script_t) ++') ++ ++tunable_policy(`openvpn_run_unconfined',` ++ domtrans_pattern(openvpn_t, openvpn_unconfined_script_exec_t, openvpn_unconfined_script_t) ++',` ++ can_exec(openvpn_t, openvpn_unconfined_script_exec_t) ++') +diff --git a/openvswitch.fc b/openvswitch.fc +index 45d7cc5080..c5b9607c12 100644 +--- a/openvswitch.fc ++++ b/openvswitch.fc +@@ -1,12 +1,16 @@ +-/etc/rc\.d/init\.d/openvswitch -- gen_context(system_u:object_r:openvswitch_initrc_exec_t,s0) ++/usr/lib/systemd/system/openvswitch.service -- gen_context(system_u:object_r:openvswitch_unit_file_t,s0) + +-/etc/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_conf_t,s0) ++/usr/share/openvswitch/scripts/ovs-ctl -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/usr/bin/ovs-vsctl -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/usr/sbin/ovsdb-ctl -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/usr/sbin/ovsdb-server -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/usr/sbin/ovs-vswitchd -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/usr/bin/ovs-appctl -- gen_context(system_u:object_r:openvswitch_exec_t,s0) + +-/usr/share/openvswitch/scripts/ovs-ctl -- gen_context(system_u:object_r:openvswitch_exec_t,s0) +-/usr/share/openvswitch/scripts/openvswitch\.init -- gen_context(system_u:object_r:openvswitch_exec_t,s0) ++/var/lib/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_var_lib_t,s0) + +-/var/lib/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_var_lib_t,s0) ++/var/log/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_log_t,s0) + +-/var/log/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_log_t,s0) ++/var/run/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_var_run_t,s0) + +-/var/run/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_var_run_t,s0) ++/etc/openvswitch(/.*)? gen_context(system_u:object_r:openvswitch_rw_t,s0) +diff --git a/openvswitch.if b/openvswitch.if +index 9b157305b1..cb00f200a4 100644 +--- a/openvswitch.if ++++ b/openvswitch.if +@@ -1,13 +1,14 @@ +-## Multilayer virtual switch. ++ ++## policy for openvswitch + + ######################################## + ## +-## Execute openvswitch in the openvswitch domain. ++## Execute TEMPLATE in the openvswitch domin. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`openvswitch_domtrans',` +@@ -18,10 +19,145 @@ interface(`openvswitch_domtrans',` + corecmd_search_bin($1) + domtrans_pattern($1, openvswitch_exec_t, openvswitch_t) + ') ++######################################## ++## ++## Read openvswitch's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`openvswitch_read_log',` ++ gen_require(` ++ type openvswitch_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, openvswitch_log_t, openvswitch_log_t) ++') ++ ++######################################## ++## ++## Append to openvswitch log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_append_log',` ++ gen_require(` ++ type openvswitch_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, openvswitch_log_t, openvswitch_log_t) ++') + + ######################################## + ## +-## Read openvswitch pid files. ++## Manage openvswitch log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_manage_log',` ++ gen_require(` ++ type openvswitch_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, openvswitch_log_t, openvswitch_log_t) ++ manage_files_pattern($1, openvswitch_log_t, openvswitch_log_t) ++ manage_lnk_files_pattern($1, openvswitch_log_t, openvswitch_log_t) ++') ++ ++######################################## ++## ++## Search openvswitch lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_search_lib',` ++ gen_require(` ++ type openvswitch_var_lib_t; ++ ') ++ ++ allow $1 openvswitch_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read openvswitch lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_read_lib_files',` ++ gen_require(` ++ type openvswitch_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, openvswitch_var_lib_t, openvswitch_var_lib_t) ++') ++ ++######################################## ++## ++## Manage openvswitch lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_manage_lib_files',` ++ gen_require(` ++ type openvswitch_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, openvswitch_var_lib_t, openvswitch_var_lib_t) ++') ++ ++######################################## ++## ++## Manage openvswitch lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`openvswitch_manage_lib_dirs',` ++ gen_require(` ++ type openvswitch_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, openvswitch_var_lib_t, openvswitch_var_lib_t) ++') ++ ++######################################## ++## ++## Read openvswitch PID files. + ## + ## + ## +@@ -40,44 +176,87 @@ interface(`openvswitch_read_pid_files',` + + ######################################## + ## +-## All of the rules required to +-## administrate an openvswitch environment. ++## Allow stream connect to openvswitch. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++ ++interface(`openvswitch_stream_connect',` ++ gen_require(` ++ type openvswitch_t, openvswitch_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, openvswitch_var_run_t, openvswitch_var_run_t, openvswitch_t) ++') ++ ++######################################## ++## ++## Execute openvswitch server in the openvswitch domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openvswitch_systemctl',` ++ gen_require(` ++ type openvswitch_t; ++ type openvswitch_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 openvswitch_unit_file_t:file read_file_perms; ++ allow $1 openvswitch_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, openvswitch_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an openvswitch environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## + # + interface(`openvswitch_admin',` + gen_require(` +- type openvswitch_t, openvswitch_initrc_exec_t, openvswitch_conf_t; +- type openvswitch_var_lib_t, openvswitch_log_t, openvswitch_var_run_t; ++ type openvswitch_t, openvswitch_log_t, openvswitch_var_lib_t; ++ type openvswitch_rw_t, openvswitch_var_run_t, openvswitch_unit_file_t; + ') + + allow $1 openvswitch_t:process { ptrace signal_perms }; + ps_process_pattern($1, openvswitch_t) + +- init_labeled_script_domtrans($1, openvswitch_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 openvswitch_initrc_exec_t system_r; +- allow $2 system_r; ++ logging_search_logs($1) ++ admin_pattern($1, openvswitch_rw_t) + +- files_search_etc($1) +- admin_pattern($1, openvswitch_conf_t) ++ logging_search_logs($1) ++ admin_pattern($1, openvswitch_log_t) + + files_search_var_lib($1) + admin_pattern($1, openvswitch_var_lib_t) + +- logging_search_logs($1) +- admin_pattern($1, openvswitch_log_t) +- + files_search_pids($1) + admin_pattern($1, openvswitch_var_run_t) ++ ++ openvswitch_systemctl($1) ++ admin_pattern($1, openvswitch_unit_file_t) ++ allow $1 openvswitch_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/openvswitch.te b/openvswitch.te +index 44dbc99ab8..f2c2370993 100644 +--- a/openvswitch.te ++++ b/openvswitch.te +@@ -9,11 +9,8 @@ type openvswitch_t; + type openvswitch_exec_t; + init_daemon_domain(openvswitch_t, openvswitch_exec_t) + +-type openvswitch_initrc_exec_t; +-init_script_file(openvswitch_initrc_exec_t) +- +-type openvswitch_conf_t; +-files_config_file(openvswitch_conf_t) ++type openvswitch_rw_t; ++files_config_file(openvswitch_rw_t) + + type openvswitch_var_lib_t; + files_type(openvswitch_var_lib_t) +@@ -27,20 +24,31 @@ files_tmp_file(openvswitch_tmp_t) + type openvswitch_var_run_t; + files_pid_file(openvswitch_var_run_t) + ++type openvswitch_unit_file_t; ++systemd_unit_file(openvswitch_unit_file_t) ++ + ######################################## + # +-# Local policy ++# openvswitch local policy + # + +-allow openvswitch_t self:capability { net_admin sys_nice sys_resource ipc_lock }; +-allow openvswitch_t self:process { setrlimit setsched signal }; ++allow openvswitch_t self:capability { dac_override dac_read_search net_admin ipc_lock sys_module sys_nice sys_rawio sys_resource chown setgid setpcap setuid kill }; ++allow openvswitch_t self:capability2 block_suspend; ++allow openvswitch_t self:process { fork setsched setrlimit signal setcap }; + allow openvswitch_t self:fifo_file rw_fifo_file_perms; +-allow openvswitch_t self:rawip_socket create_socket_perms; +-allow openvswitch_t self:unix_stream_socket { accept connectto listen }; ++allow openvswitch_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow openvswitch_t self:tcp_socket create_stream_socket_perms; ++allow openvswitch_t self:netlink_socket create_socket_perms; ++allow openvswitch_t self:netlink_route_socket rw_netlink_socket_perms; ++allow openvswitch_t self:netlink_generic_socket create_socket_perms; ++allow openvswitch_t self:tun_socket { create_socket_perms relabelfrom relabelto }; ++allow openvswitch_t self:system { module_load }; ++ ++can_exec(openvswitch_t, openvswitch_exec_t) + +-manage_dirs_pattern(openvswitch_t, openvswitch_conf_t, openvswitch_conf_t) +-manage_files_pattern(openvswitch_t, openvswitch_conf_t, openvswitch_conf_t) +-manage_lnk_files_pattern(openvswitch_t, openvswitch_conf_t, openvswitch_conf_t) ++manage_dirs_pattern(openvswitch_t, openvswitch_rw_t, openvswitch_rw_t) ++manage_files_pattern(openvswitch_t, openvswitch_rw_t, openvswitch_rw_t) ++manage_lnk_files_pattern(openvswitch_t, openvswitch_rw_t, openvswitch_rw_t) + + manage_dirs_pattern(openvswitch_t, openvswitch_var_lib_t, openvswitch_var_lib_t) + manage_files_pattern(openvswitch_t, openvswitch_var_lib_t, openvswitch_var_lib_t) +@@ -48,50 +56,103 @@ manage_lnk_files_pattern(openvswitch_t, openvswitch_var_lib_t, openvswitch_var_l + files_var_lib_filetrans(openvswitch_t, openvswitch_var_lib_t, { dir file lnk_file }) + + manage_dirs_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) +-append_files_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) +-create_files_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) +-setattr_files_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) ++manage_files_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) + manage_lnk_files_pattern(openvswitch_t, openvswitch_log_t, openvswitch_log_t) + logging_log_filetrans(openvswitch_t, openvswitch_log_t, { dir file lnk_file }) + + manage_dirs_pattern(openvswitch_t, openvswitch_tmp_t, openvswitch_tmp_t) + manage_files_pattern(openvswitch_t, openvswitch_tmp_t, openvswitch_tmp_t) + manage_lnk_files_pattern(openvswitch_t, openvswitch_tmp_t, openvswitch_tmp_t) +-files_tmp_filetrans(openvswitch_t, openvswitch_tmp_t, { file dir }) ++manage_sock_files_pattern(openvswitch_t, openvswitch_tmp_t, openvswitch_tmp_t) ++files_tmp_filetrans(openvswitch_t, openvswitch_tmp_t, { file dir sock_file }) + + manage_dirs_pattern(openvswitch_t, openvswitch_var_run_t, openvswitch_var_run_t) + manage_files_pattern(openvswitch_t, openvswitch_var_run_t, openvswitch_var_run_t) + manage_sock_files_pattern(openvswitch_t, openvswitch_var_run_t, openvswitch_var_run_t) + manage_lnk_files_pattern(openvswitch_t, openvswitch_var_run_t, openvswitch_var_run_t) +-files_pid_filetrans(openvswitch_t, openvswitch_var_run_t, { dir file lnk_file }) +- +-can_exec(openvswitch_t, openvswitch_exec_t) ++files_pid_filetrans(openvswitch_t, openvswitch_var_run_t, { dir file lnk_file sock_file }) + ++kernel_load_module(openvswitch_t) + kernel_read_network_state(openvswitch_t) + kernel_read_system_state(openvswitch_t) ++kernel_request_load_module(openvswitch_t) ++files_map_kernel_modules(openvswitch_t) ++kernel_read_net_sysctls(openvswitch_t) + +-corenet_all_recvfrom_unlabeled(openvswitch_t) +-corenet_all_recvfrom_netlabel(openvswitch_t) +-corenet_raw_sendrecv_generic_if(openvswitch_t) +-corenet_raw_sendrecv_generic_node(openvswitch_t) ++corenet_tcp_connect_xodbc_connect_port(openvswitch_t) ++corenet_tcp_connect_ovsdb_port(openvswitch_t) ++corenet_tcp_connect_openflow_port(openvswitch_t) ++corenet_tcp_connect_openvswitch_port(openvswitch_t) ++corenet_tcp_bind_generic_node(openvswitch_t) ++corenet_tcp_bind_openvswitch_port(openvswitch_t) + + corecmd_exec_bin(openvswitch_t) ++corecmd_exec_shell(openvswitch_t) + ++dev_read_rand(openvswitch_t) + dev_read_urand(openvswitch_t) ++dev_rw_sysfs(openvswitch_t) ++dev_rw_vfio_dev(openvswitch_t) ++corenet_rw_tun_tap_dev(openvswitch_t) ++dev_rw_infiniband_dev(openvswitch_t) ++dev_read_cpuid(openvswitch_t) + + domain_use_interactive_fds(openvswitch_t) + +-files_read_etc_files(openvswitch_t) ++files_read_kernel_modules(openvswitch_t) ++files_load_kernel_modules(openvswitch_t) + + fs_getattr_all_fs(openvswitch_t) + fs_search_cgroup_dirs(openvswitch_t) ++fs_manage_hugetlbfs_files(openvswitch_t) ++fs_manage_hugetlbfs_dirs(openvswitch_t) ++ ++auth_use_nsswitch(openvswitch_t) + + logging_send_syslog_msg(openvswitch_t) + +-miscfiles_read_localization(openvswitch_t) ++init_read_script_state(openvswitch_t) ++ ++modutils_exec_insmod(openvswitch_t) ++modutils_list_module_config(openvswitch_t) ++modutils_read_module_config(openvswitch_t) ++modutils_read_module_deps(openvswitch_t) + + sysnet_dns_name_resolve(openvswitch_t) + ++logging_send_audit_msgs(openvswitch_t) ++ ++write_sock_files_pattern(init_t, openvswitch_var_run_t, openvswitch_var_run_t) ++ ++storage_rw_inherited_fixed_disk_dev(openvswitch_t) ++ ++optional_policy(` ++ hostname_exec(openvswitch_t) ++') ++ + optional_policy(` + iptables_domtrans(openvswitch_t) + ') ++ ++optional_policy(` ++ plymouthd_exec_plymouth(openvswitch_t) ++') ++ ++optional_policy(` ++ neutron_read_state(openvswitch_t) ++') ++ ++optional_policy(` ++ networkmanager_read_state(openvswitch_t) ++') ++ ++optional_policy(` ++ virt_svirt_manage_tmp(openvswitch_t) ++ virt_rw_svirt_image(openvswitch_t) ++ virt_stream_connect_svirt(openvswitch_t) ++ virt_rw_stream_sockets_svirt(openvswitch_t) ++') ++ ++optional_policy(` ++ seutil_domtrans_setfiles(openvswitch_t) ++') +diff --git a/openwsman.fc b/openwsman.fc +new file mode 100644 +index 0000000000..00d0643d9f +--- /dev/null ++++ b/openwsman.fc +@@ -0,0 +1,7 @@ ++/usr/lib/systemd/system/openwsmand.* -- gen_context(system_u:object_r:openwsman_unit_file_t,s0) ++ ++/usr/sbin/openwsmand -- gen_context(system_u:object_r:openwsman_exec_t,s0) ++ ++/var/log/wsmand.* -- gen_context(system_u:object_r:openwsman_log_t,s0) ++ ++/var/run/wsmand.* -- gen_context(system_u:object_r:openwsman_run_t,s0) +diff --git a/openwsman.if b/openwsman.if +new file mode 100644 +index 0000000000..747853a1ac +--- /dev/null ++++ b/openwsman.if +@@ -0,0 +1,79 @@ ++## WS-Management Server ++ ++######################################## ++## ++## Execute openwsman in the openwsman domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openwsman_domtrans',` ++ gen_require(` ++ type openwsman_t, openwsman_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, openwsman_exec_t, openwsman_t) ++') ++######################################## ++## ++## Execute openwsman server in the openwsman domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`openwsman_systemctl',` ++ gen_require(` ++ type openwsman_t; ++ type openwsman_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 openwsman_unit_file_t:file read_file_perms; ++ allow $1 openwsman_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, openwsman_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an openwsman environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`openwsman_admin',` ++ gen_require(` ++ type openwsman_t; ++ type openwsman_unit_file_t; ++ ') ++ ++ allow $1 openwsman_t:process { signal_perms }; ++ ps_process_pattern($1, openwsman_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 openwsman_t:process ptrace; ++ ') ++ ++ openwsman_systemctl($1) ++ admin_pattern($1, openwsman_unit_file_t) ++ allow $1 openwsman_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/openwsman.te b/openwsman.te +new file mode 100644 +index 0000000000..3bcd32cdf7 +--- /dev/null ++++ b/openwsman.te +@@ -0,0 +1,74 @@ ++policy_module(openwsman, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type openwsman_t; ++type openwsman_exec_t; ++init_daemon_domain(openwsman_t, openwsman_exec_t) ++ ++type openwsman_tmp_t; ++files_tmp_file(openwsman_tmp_t) ++ ++type openwsman_tmpfs_t; ++files_tmpfs_file(openwsman_tmpfs_t) ++ ++type openwsman_log_t; ++logging_log_file(openwsman_log_t) ++ ++type openwsman_run_t; ++files_pid_file(openwsman_run_t) ++ ++type openwsman_unit_file_t; ++systemd_unit_file(openwsman_unit_file_t) ++ ++######################################## ++# ++# openwsman local policy ++# ++ ++allow openwsman_t self:capability setuid; ++ ++allow openwsman_t self:process { fork }; ++allow openwsman_t self:fifo_file rw_fifo_file_perms; ++allow openwsman_t self:unix_stream_socket create_stream_socket_perms; ++allow openwsman_t self:tcp_socket { create_socket_perms accept listen }; ++ ++manage_files_pattern(openwsman_t, openwsman_tmp_t, openwsman_tmp_t) ++manage_dirs_pattern(openwsman_t, openwsman_tmp_t, openwsman_tmp_t) ++files_tmp_filetrans(openwsman_t, openwsman_tmp_t, { dir file }) ++ ++manage_files_pattern(openwsman_t, openwsman_tmpfs_t, openwsman_tmpfs_t) ++manage_dirs_pattern(openwsman_t, openwsman_tmpfs_t, openwsman_tmpfs_t) ++fs_tmpfs_filetrans(openwsman_t, openwsman_tmpfs_t, { dir file }) ++ ++manage_files_pattern(openwsman_t, openwsman_log_t, openwsman_log_t) ++logging_log_filetrans(openwsman_t, openwsman_log_t, { file }) ++ ++manage_files_pattern(openwsman_t, openwsman_run_t, openwsman_run_t) ++files_pid_filetrans(openwsman_t, openwsman_run_t, { file }) ++ ++auth_use_nsswitch(openwsman_t) ++auth_domtrans_chkpwd(openwsman_t) ++ ++corenet_tcp_connect_pegasus_https_port(openwsman_t) ++corenet_tcp_bind_vnc_port(openwsman_t) ++corenet_tcp_bind_http_port(openwsman_t) ++ ++dev_read_urand(openwsman_t) ++ ++logging_send_syslog_msg(openwsman_t) ++logging_send_audit_msgs(openwsman_t) ++ ++optional_policy(` ++ sblim_stream_connect_sfcbd(openwsman_t) ++ sblim_rw_semaphores_sfcbd(openwsman_t) ++ sblim_getattr_exec_sfcbd(openwsman_t) ++') ++ ++optional_policy(` ++ unconfined_domain(openwsman_t) ++') ++ +diff --git a/oracleasm.fc b/oracleasm.fc +new file mode 100644 +index 0000000000..5655facf09 +--- /dev/null ++++ b/oracleasm.fc +@@ -0,0 +1,8 @@ ++ ++/etc/rc\.d/init\.d/oracleasm -- gen_context(system_u:object_r:oracleasm_initrc_exec_t,s0) ++ ++/etc/sysconfig/oracleasm(/.*)? gen_context(system_u:object_r:oracleasm_conf_t,s0) ++ ++/etc/sysconfig/oracleasm-_dev_oracleasm -- gen_context(system_u:object_r:oracleasm_conf_t,s0) ++ ++/usr/sbin/oracleasm -- gen_context(system_u:object_r:oracleasm_exec_t,s0) +diff --git a/oracleasm.if b/oracleasm.if +new file mode 100644 +index 0000000000..6ae382cb90 +--- /dev/null ++++ b/oracleasm.if +@@ -0,0 +1,75 @@ ++ ++## policy for oracleasm ++ ++######################################## ++## ++## Transition to oracleasm. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`oracleasm_domtrans',` ++ gen_require(` ++ type oracleasm_t, oracleasm_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, oracleasm_exec_t, oracleasm_t) ++') ++ ++ ++######################################## ++## ++## Execute oracleasm server in the oracleasm domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`oracleasm_initrc_domtrans',` ++ gen_require(` ++ type oracleasm_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, oracleasm_initrc_exec_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an oracleasm environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`oracleasm_admin',` ++ gen_require(` ++ type oracleasm_t; ++ type oracleasm_initrc_exec_t; ++ ') ++ ++ allow $1 oracleasm_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, oracleasm_t) ++ ++ oracleasm_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 oracleasm_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++') ++ +diff --git a/oracleasm.te b/oracleasm.te +new file mode 100644 +index 0000000000..76250e0c66 +--- /dev/null ++++ b/oracleasm.te +@@ -0,0 +1,67 @@ ++policy_module(oracleasm, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type oracleasm_t; ++type oracleasm_exec_t; ++init_daemon_domain(oracleasm_t, oracleasm_exec_t) ++ ++type oracleasm_initrc_exec_t; ++init_script_file(oracleasm_initrc_exec_t) ++ ++type oracleasm_tmp_t; ++files_tmp_file(oracleasm_tmp_t) ++ ++type oracleasm_conf_t; ++files_config_file(oracleasm_conf_t) ++ ++######################################## ++# ++# oracleasm local policy ++# ++ ++allow oracleasm_t self:capability { dac_read_search dac_override fsetid fowner chown }; ++allow oracleasm_t self:fifo_file rw_fifo_file_perms; ++allow oracleasm_t self:unix_stream_socket create_stream_socket_perms; ++dontaudit oracleasm_t self:capability { sys_admin }; ++ ++allow oracleasm_t oracleasm_conf_t:file manage_file_perms; ++allow oracleasm_t oracleasm_conf_t:dir manage_dir_perms; ++ ++manage_dirs_pattern(oracleasm_t, oracleasm_tmp_t, oracleasm_tmp_t) ++manage_files_pattern(oracleasm_t, oracleasm_tmp_t, oracleasm_tmp_t) ++files_tmp_filetrans(oracleasm_t, oracleasm_tmp_t, { file dir }) ++ ++kernel_read_system_state(oracleasm_t) ++ ++auth_read_passwd(oracleasm_t) ++ ++dev_rw_sysfs(oracleasm_t) ++ ++domain_use_interactive_fds(oracleasm_t) ++ ++corecmd_exec_shell(oracleasm_t) ++corecmd_exec_bin(oracleasm_t) ++ ++fs_getattr_xattr_fs(oracleasm_t) ++fs_list_oracleasmfs(oracleasm_t) ++fs_getattr_oracleasmfs(oracleasm_t) ++fs_getattr_oracleasmfs_fs(oracleasm_t) ++fs_setattr_oracleasmfs(oracleasm_t) ++fs_setattr_oracleasmfs_dirs(oracleasm_t) ++fs_manage_oracleasm(oracleasm_t) ++ ++storage_raw_read_fixed_disk(oracleasm_t) ++storage_raw_read_removable_device(oracleasm_t) ++storage_rw_inherited_fixed_disk_dev(oracleasm_t) ++ ++optional_policy(` ++ mount_domtrans(oracleasm_t) ++') ++ ++optional_policy(` ++ modutils_domtrans_insmod(oracleasm_t) ++') +diff --git a/osad.fc b/osad.fc +new file mode 100644 +index 0000000000..cf911d54ea +--- /dev/null ++++ b/osad.fc +@@ -0,0 +1,7 @@ ++/etc/rc\.d/init\.d/osad -- gen_context(system_u:object_r:osad_initrc_exec_t,s0) ++ ++/usr/sbin/osad -- gen_context(system_u:object_r:osad_exec_t,s0) ++ ++/var/log/osad.* -- gen_context(system_u:object_r:osad_log_t,s0) ++ ++/var/run/osad.* -- gen_context(system_u:object_r:osad_var_run_t,s0) +diff --git a/osad.if b/osad.if +new file mode 100644 +index 0000000000..05648bd2a2 +--- /dev/null ++++ b/osad.if +@@ -0,0 +1,165 @@ ++ ++## Client-side service written in Python that responds to pings and runs rhn_check when told to by osa-dispatcher. ++ ++######################################## ++## ++## Execute osad in the osad domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`osad_domtrans',` ++ gen_require(` ++ type osad_t, osad_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, osad_exec_t, osad_t) ++') ++ ++######################################## ++## ++## Execute osad server in the osad domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`osad_initrc_domtrans',` ++ gen_require(` ++ type osad_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, osad_initrc_exec_t) ++') ++######################################## ++## ++## Read osad's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`osad_read_log',` ++ gen_require(` ++ type osad_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, osad_log_t, osad_log_t) ++') ++ ++######################################## ++## ++## Append to osad log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`osad_append_log',` ++ gen_require(` ++ type osad_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, osad_log_t, osad_log_t) ++') ++ ++######################################## ++## ++## Manage osad log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`osad_manage_log',` ++ gen_require(` ++ type osad_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, osad_log_t, osad_log_t) ++ manage_files_pattern($1, osad_log_t, osad_log_t) ++ manage_lnk_files_pattern($1, osad_log_t, osad_log_t) ++') ++######################################## ++## ++## Read osad PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`osad_read_pid_files',` ++ gen_require(` ++ type osad_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, osad_var_run_t, osad_var_run_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an osad environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`osad_admin',` ++ gen_require(` ++ type osad_t; ++ type osad_initrc_exec_t; ++ type osad_log_t; ++ type osad_var_run_t; ++ ') ++ ++ allow $1 osad_t:process { signal_perms }; ++ ps_process_pattern($1, osad_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 osad_t:process ptrace; ++ ') ++ ++ osad_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 osad_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_search_logs($1) ++ admin_pattern($1, osad_log_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, osad_var_run_t) ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/osad.te b/osad.te +new file mode 100644 +index 0000000000..6c2f264423 +--- /dev/null ++++ b/osad.te +@@ -0,0 +1,56 @@ ++policy_module(osad, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type osad_t; ++type osad_exec_t; ++init_daemon_domain(osad_t, osad_exec_t) ++ ++type osad_initrc_exec_t; ++init_script_file(osad_initrc_exec_t) ++ ++type osad_log_t; ++logging_log_file(osad_log_t) ++ ++type osad_var_run_t; ++files_pid_file(osad_var_run_t) ++ ++######################################## ++# ++# osad local policy ++# ++ ++allow osad_t self:process setpgid; ++ ++manage_files_pattern(osad_t, osad_log_t, osad_log_t) ++logging_log_filetrans(osad_t, osad_log_t, file) ++ ++manage_files_pattern(osad_t, osad_var_run_t, osad_var_run_t) ++files_pid_filetrans(osad_t, osad_var_run_t, file) ++ ++kernel_read_system_state(osad_t) ++ ++corecmd_exec_bin(osad_t) ++ ++corenet_tcp_connect_http_port(osad_t) ++corenet_tcp_connect_jabber_client_port(osad_t) ++ ++dev_read_urand(osad_t) ++ ++auth_use_nsswitch(osad_t) ++ ++optional_policy(` ++ gnome_dontaudit_search_config(osad_t) ++') ++ ++optional_policy(` ++ rhnsd_manage_config(osad_t) ++') ++ ++# execute rhn_check ++optional_policy(` ++ rpm_domtrans(osad_t) ++') +diff --git a/pacemaker.fc b/pacemaker.fc +index 2f0ad56d67..d4da0b8d00 100644 +--- a/pacemaker.fc ++++ b/pacemaker.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/pacemaker -- gen_context(system_u:object_r:pacemaker_initrc_exec_t,s0) + ++/usr/lib/systemd/system/pacemaker.* -- gen_context(system_u:object_r:pacemaker_unit_file_t,s0) ++ + /usr/sbin/pacemakerd -- gen_context(system_u:object_r:pacemaker_exec_t,s0) + + /var/lib/heartbeat/crm(/.*)? gen_context(system_u:object_r:pacemaker_var_lib_t,s0) +diff --git a/pacemaker.if b/pacemaker.if +index 9682d9af84..f1f421f9e4 100644 +--- a/pacemaker.if ++++ b/pacemaker.if +@@ -1,9 +1,167 @@ +-## A scalable high-availability cluster resource manager. ++## >A scalable high-availability cluster resource manager. + + ######################################## + ## +-## All of the rules required to +-## administrate an pacemaker environment. ++## Transition to pacemaker. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pacemaker_domtrans',` ++ gen_require(` ++ type pacemaker_t, pacemaker_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, pacemaker_exec_t, pacemaker_t) ++') ++ ++######################################## ++## ++## Execute pacemaker server in the pacemaker domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_initrc_domtrans',` ++ gen_require(` ++ type pacemaker_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, pacemaker_initrc_exec_t) ++') ++ ++######################################## ++## ++## Search pacemaker lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_search_lib',` ++ gen_require(` ++ type pacemaker_var_lib_t; ++ ') ++ ++ allow $1 pacemaker_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read pacemaker lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_read_lib_files',` ++ gen_require(` ++ type pacemaker_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, pacemaker_var_lib_t, pacemaker_var_lib_t) ++') ++ ++######################################## ++## ++## Manage pacemaker lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_manage_lib_files',` ++ gen_require(` ++ type pacemaker_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, pacemaker_var_lib_t, pacemaker_var_lib_t) ++') ++ ++######################################## ++## ++## Manage pacemaker lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_manage_lib_dirs',` ++ gen_require(` ++ type pacemaker_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, pacemaker_var_lib_t, pacemaker_var_lib_t) ++') ++ ++######################################## ++## ++## Read pacemaker PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pacemaker_read_pid_files',` ++ gen_require(` ++ type pacemaker_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 pacemaker_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Execute pacemaker server in the pacemaker domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pacemaker_systemctl',` ++ gen_require(` ++ type pacemaker_t; ++ type pacemaker_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 pacemaker_unit_file_t:file read_file_perms; ++ allow $1 pacemaker_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, pacemaker_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an pacemaker environment + ## + ## + ## +@@ -19,14 +177,17 @@ + # + interface(`pacemaker_admin',` + gen_require(` +- type pacemaker_t, pacemaker_initrc_exec_t, pacemaker_var_lib_t; ++ type pacemaker_t; ++ type pacemaker_initrc_exec_t; ++ type pacemaker_var_lib_t; + type pacemaker_var_run_t; ++ type pacemaker_unit_file_t; + ') + + allow $1 pacemaker_t:process { ptrace signal_perms }; + ps_process_pattern($1, pacemaker_t) + +- init_labeled_script_domtrans($1, pacemaker_initrc_exec_t) ++ pacemaker_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 pacemaker_initrc_exec_t system_r; + allow $2 system_r; +@@ -36,4 +197,13 @@ interface(`pacemaker_admin',` + + files_search_pids($1) + admin_pattern($1, pacemaker_var_run_t) ++ ++ pacemaker_systemctl($1) ++ admin_pattern($1, pacemaker_unit_file_t) ++ allow $1 pacemaker_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/pacemaker.te b/pacemaker.te +index 6e6efb6421..d56c04963a 100644 +--- a/pacemaker.te ++++ b/pacemaker.te +@@ -5,6 +5,13 @@ policy_module(pacemaker, 1.1.0) + # Declarations + # + ++## ++##

      ++## Allow pacemaker memcheck-amd64- to use executable memory ++##

      ++##
      ++gen_tunable(pacemaker_use_execmem, false) ++ + type pacemaker_t; + type pacemaker_exec_t; + init_daemon_domain(pacemaker_t, pacemaker_exec_t) +@@ -12,31 +19,36 @@ init_daemon_domain(pacemaker_t, pacemaker_exec_t) + type pacemaker_initrc_exec_t; + init_script_file(pacemaker_initrc_exec_t) + ++type pacemaker_var_lib_t; ++files_type(pacemaker_var_lib_t) ++ ++type pacemaker_var_run_t; ++files_pid_file(pacemaker_var_run_t) ++ + type pacemaker_tmp_t; + files_tmp_file(pacemaker_tmp_t) + + type pacemaker_tmpfs_t; + files_tmpfs_file(pacemaker_tmpfs_t) + +-type pacemaker_var_lib_t; +-files_type(pacemaker_var_lib_t) +- +-type pacemaker_var_run_t; +-files_pid_file(pacemaker_var_run_t) ++type pacemaker_unit_file_t; ++systemd_unit_file(pacemaker_unit_file_t) + + ######################################## + # + # Local policy + # + +-allow pacemaker_t self:capability { fowner fsetid kill chown dac_override setuid }; ++allow pacemaker_t self:capability { fowner fsetid kill chown dac_read_search dac_override setuid }; ++allow pacemaker_t self:capability2 block_suspend; + allow pacemaker_t self:process { setrlimit signal setpgid }; + allow pacemaker_t self:fifo_file rw_fifo_file_perms; + allow pacemaker_t self:unix_stream_socket { connectto accept listen }; + + manage_dirs_pattern(pacemaker_t, pacemaker_tmp_t, pacemaker_tmp_t) + manage_files_pattern(pacemaker_t, pacemaker_tmp_t, pacemaker_tmp_t) +-files_tmp_filetrans(pacemaker_t, pacemaker_tmp_t, { file dir }) ++manage_fifo_files_pattern(pacemaker_t, pacemaker_tmp_t, pacemaker_tmp_t) ++files_tmp_filetrans(pacemaker_t, pacemaker_tmp_t, { fifo_file file dir }) + + manage_dirs_pattern(pacemaker_t, pacemaker_tmpfs_t, pacemaker_tmpfs_t) + manage_files_pattern(pacemaker_t, pacemaker_tmpfs_t, pacemaker_tmpfs_t) +@@ -60,13 +72,13 @@ kernel_read_system_state(pacemaker_t) + corecmd_exec_bin(pacemaker_t) + corecmd_exec_shell(pacemaker_t) + ++domain_use_interactive_fds(pacemaker_t) ++domain_read_all_domains_state(pacemaker_t) ++ + dev_getattr_mtrr_dev(pacemaker_t) + dev_read_rand(pacemaker_t) + dev_read_urand(pacemaker_t) + +-domain_read_all_domains_state(pacemaker_t) +-domain_use_interactive_fds(pacemaker_t) +- + files_read_kernel_symbol_table(pacemaker_t) + + fs_getattr_all_fs(pacemaker_t) +@@ -75,9 +87,20 @@ auth_use_nsswitch(pacemaker_t) + + logging_send_syslog_msg(pacemaker_t) + +-miscfiles_read_localization(pacemaker_t) ++sysnet_domtrans_ifconfig(pacemaker_t) ++ ++tunable_policy(`pacemaker_use_execmem',` ++ allow pacemaker_t self:process { execmem }; ++') + + optional_policy(` + corosync_read_log(pacemaker_t) ++ corosync_setattr_log(pacemaker_t) + corosync_stream_connect(pacemaker_t) ++ corosync_rw_tmpfs(pacemaker_t) ++') ++ ++optional_policy(` ++ #executes heartbeat lib files ++ rgmanager_execute_lib(pacemaker_t) + ') +diff --git a/pads.if b/pads.if +index 6e097c9194..503c97a2d9 100644 +--- a/pads.if ++++ b/pads.if +@@ -17,15 +17,19 @@ + ## + ## + # +-interface(`pads_admin', ` ++interface(`pads_admin',` + gen_require(` + type pads_t, pads_config_t, pads_var_run_t; + type pads_initrc_exec_t; + ') + +- allow $1 pads_t:process { ptrace signal_perms }; ++ allow $1 pads_t:process signal_perms; + ps_process_pattern($1, pads_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 pads_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, pads_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 pads_initrc_exec_t system_r; +diff --git a/pads.te b/pads.te +index 078adc4783..f0c65e5dec 100644 +--- a/pads.te ++++ b/pads.te +@@ -24,9 +24,12 @@ files_pid_file(pads_var_run_t) + # Declarations + # + +-allow pads_t self:capability { dac_override net_raw }; ++allow pads_t self:capability { dac_read_search dac_override net_raw }; ++allow pads_t self:netlink_route_socket create_netlink_socket_perms; + allow pads_t self:packet_socket create_socket_perms; + allow pads_t self:socket create_socket_perms; ++allow pads_t self:udp_socket create_socket_perms; ++allow pads_t self:unix_dgram_socket create_socket_perms; + + allow pads_t pads_config_t:file manage_file_perms; + files_etc_filetrans(pads_t, pads_config_t, file) +@@ -39,7 +42,6 @@ kernel_read_network_state(pads_t) + + corecmd_search_bin(pads_t) + +-corenet_all_recvfrom_unlabeled(pads_t) + corenet_all_recvfrom_netlabel(pads_t) + corenet_tcp_sendrecv_generic_if(pads_t) + corenet_tcp_sendrecv_generic_node(pads_t) +@@ -52,11 +54,8 @@ dev_read_rand(pads_t) + dev_read_urand(pads_t) + dev_read_sysfs(pads_t) + +-files_read_etc_files(pads_t) + files_search_spool(pads_t) + +-miscfiles_read_localization(pads_t) +- + logging_send_syslog_msg(pads_t) + + sysnet_dns_name_resolve(pads_t) +diff --git a/passenger.fc b/passenger.fc +index 2c389ea7cc..9155bd0dd4 100644 +--- a/passenger.fc ++++ b/passenger.fc +@@ -1,10 +1,12 @@ +-/usr/.*/gems/.*/passenger-.*/ext/apache2/ApplicationPoolServerExecutable -- gen_context(system_u:object_r:passenger_exec_t,s0) +-/usr/.*/gems/.*/passenger-.*/agents/PassengerWatchdog -- gen_context(system_u:object_r:passenger_exec_t,s0) +-/usr/.*/gems/.*/passenger-.*/agents/PassengerLoggingAgent -- gen_context(system_u:object_r:passenger_exec_t,s0) +-/usr/.*/gems/.*/passenger-.*/agents/apache2/PassengerHelperAgent -- gen_context(system_u:object_r:passenger_exec_t,s0) ++/usr/share/gems/.*/Passenger.* -- gen_context(system_u:object_r:passenger_exec_t,s0) ++/usr/share/gems/.*/ApplicationPoolServerExecutable -- gen_context(system_u:object_r:passenger_exec_t,s0) ++/usr/lib/gems/.*/Passenger.* -- gen_context(system_u:object_r:passenger_exec_t,s0) ++/usr/lib/gems/.*/ApplicationPoolServerExecutable -- gen_context(system_u:object_r:passenger_exec_t,s0) + +-/var/lib/passenger(/.*)? gen_context(system_u:object_r:passenger_var_lib_t,s0) ++/usr/share/.*/gems/.*/helper-scripts/prespawn -- gen_context(system_u:object_r:passenger_exec_t,s0) + +-/var/log/passenger.* gen_context(system_u:object_r:passenger_log_t,s0) ++/var/lib/passenger(/.*)? gen_context(system_u:object_r:passenger_var_lib_t,s0) + +-/var/run/passenger(/.*)? gen_context(system_u:object_r:passenger_var_run_t,s0) ++/var/log/passenger.* gen_context(system_u:object_r:passenger_log_t,s0) ++ ++/var/run/passenger(/.*)? gen_context(system_u:object_r:passenger_var_run_t,s0) +diff --git a/passenger.if b/passenger.if +index bf59ef7312..0e333279cd 100644 +--- a/passenger.if ++++ b/passenger.if +@@ -15,17 +15,17 @@ interface(`passenger_domtrans',` + type passenger_t, passenger_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, passenger_exec_t, passenger_t) ++ allow passenger_t $1:unix_stream_socket { accept getattr read write }; + ') + + ###################################### + ## +-## Execute passenger in the caller domain. ++## Execute passenger in the current domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +@@ -34,13 +34,30 @@ interface(`passenger_exec',` + type passenger_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, passenger_exec_t) + ') + ++####################################### ++## ++## Getattr passenger log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_getattr_log_files',` ++ gen_require(` ++ type passenger_log_t; ++ ') ++ ++ getattr_files_pattern($1, passenger_log_t, passenger_log_t) ++') ++ + ######################################## + ## +-## Read passenger lib files. ++## Read passenger lib files + ## + ## + ## +@@ -53,6 +70,112 @@ interface(`passenger_read_lib_files',` + type passenger_var_lib_t; + ') + +- files_search_var_lib($1) + read_files_pattern($1, passenger_var_lib_t, passenger_var_lib_t) ++ read_lnk_files_pattern($1, passenger_var_lib_t, passenger_var_lib_t) ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Manage passenger lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_manage_lib_files',` ++ gen_require(` ++ type passenger_var_lib_t; ++ ') ++ ++ manage_dirs_pattern($1, passenger_var_lib_t, passenger_var_lib_t) ++ manage_files_pattern($1, passenger_var_lib_t, passenger_var_lib_t) ++ manage_lnk_files_pattern($1, passenger_var_lib_t, passenger_var_lib_t) ++ files_search_var_lib($1) + ') ++ ++##################################### ++## ++## Manage passenger var_run content. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_manage_pid_content',` ++ gen_require(` ++ type passenger_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_dirs_pattern($1, passenger_var_run_t, passenger_var_run_t) ++ manage_files_pattern($1, passenger_var_run_t, passenger_var_run_t) ++ manage_fifo_files_pattern($1, passenger_var_run_t, passenger_var_run_t) ++ manage_sock_files_pattern($1, passenger_var_run_t, passenger_var_run_t) ++') ++ ++######################################## ++## ++## Connect to passenger unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_stream_connect',` ++ gen_require(` ++ type passenger_t; ++ type passenger_tmp_t; ++ type passenger_var_run_t; ++ ') ++ ++ ++ ++ stream_connect_pattern($1, passenger_var_run_t, passenger_var_run_t, passenger_t) ++ stream_connect_pattern($1, passenger_tmp_t, passenger_tmp_t, passenger_t) ++') ++ ++####################################### ++## ++## Allow to manage passenger tmp files/dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_manage_tmp_files',` ++ gen_require(` ++ type passenger_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ manage_files_pattern($1, passenger_tmp_t, passenger_tmp_t) ++ manage_dirs_pattern($1, passenger_tmp_t, passenger_tmp_t) ++') ++ ++######################################## ++## ++## Send kill signals to passenger. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`passenger_kill',` ++ gen_require(` ++ type passenger_t; ++ ') ++ ++ allow $1 passenger_t:process sigkill; ++') ++ +diff --git a/passenger.te b/passenger.te +index 08ec33bf21..175a4ed46d 100644 +--- a/passenger.te ++++ b/passenger.te +@@ -1,4 +1,4 @@ +-policy_module(passanger, 1.1.1) ++policy_module(passenger, 1.1.1) + + ######################################## + # +@@ -14,6 +14,9 @@ role system_r types passenger_t; + type passenger_log_t; + logging_log_file(passenger_log_t) + ++type passenger_tmp_t; ++files_tmp_file(passenger_tmp_t) ++ + type passenger_var_lib_t; + files_type(passenger_var_lib_t) + +@@ -22,22 +25,25 @@ files_pid_file(passenger_var_run_t) + + ######################################## + # +-# Local policy ++# passanger local policy + # + +-allow passenger_t self:capability { chown dac_override fsetid fowner kill setuid setgid sys_nice sys_ptrace sys_resource }; +-allow passenger_t self:process { setpgid setsched sigkill signal }; ++allow passenger_t self:capability { chown dac_read_search dac_override fsetid fowner kill setuid setgid sys_nice sys_ptrace sys_resource }; ++allow passenger_t self:capability2 block_suspend; ++allow passenger_t self:process { setpgid setsched getsession signal_perms }; + allow passenger_t self:fifo_file rw_fifo_file_perms; +-allow passenger_t self:unix_stream_socket { accept connectto listen }; ++allow passenger_t self:tcp_socket { accept listen }; ++allow passenger_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++can_exec(passenger_t, passenger_exec_t) + + manage_dirs_pattern(passenger_t, passenger_log_t, passenger_log_t) +-append_files_pattern(passenger_t, passenger_log_t, passenger_log_t) +-create_files_pattern(passenger_t, passenger_log_t, passenger_log_t) +-setattr_files_pattern(passenger_t, passenger_log_t, passenger_log_t) +-logging_log_filetrans(passenger_t, passenger_log_t, file) ++manage_files_pattern(passenger_t, passenger_log_t, passenger_log_t) ++logging_log_filetrans(passenger_t, passenger_log_t, { dir file }) + + manage_dirs_pattern(passenger_t, passenger_var_lib_t, passenger_var_lib_t) + manage_files_pattern(passenger_t, passenger_var_lib_t, passenger_var_lib_t) ++files_search_var_lib(passenger_t) + + manage_dirs_pattern(passenger_t, passenger_var_run_t, passenger_var_run_t) + manage_files_pattern(passenger_t, passenger_var_run_t, passenger_var_run_t) +@@ -45,7 +51,11 @@ manage_fifo_files_pattern(passenger_t, passenger_var_run_t, passenger_var_run_t) + manage_sock_files_pattern(passenger_t, passenger_var_run_t, passenger_var_run_t) + files_pid_filetrans(passenger_t, passenger_var_run_t, { file dir sock_file }) + +-can_exec(passenger_t, passenger_exec_t) ++#needed by puppet ++manage_dirs_pattern(passenger_t, passenger_tmp_t, passenger_tmp_t) ++manage_files_pattern(passenger_t, passenger_tmp_t, passenger_tmp_t) ++manage_sock_files_pattern(passenger_t, passenger_tmp_t, passenger_tmp_t) ++files_tmp_filetrans(passenger_t, passenger_tmp_t, { file dir sock_file }) + + kernel_read_system_state(passenger_t) + kernel_read_kernel_sysctls(passenger_t) +@@ -53,13 +63,11 @@ kernel_read_network_state(passenger_t) + kernel_read_net_sysctls(passenger_t) + + corenet_all_recvfrom_netlabel(passenger_t) +-corenet_all_recvfrom_unlabeled(passenger_t) + corenet_tcp_sendrecv_generic_if(passenger_t) + corenet_tcp_sendrecv_generic_node(passenger_t) +- +-corenet_sendrecv_http_client_packets(passenger_t) + corenet_tcp_connect_http_port(passenger_t) +-corenet_tcp_sendrecv_http_port(passenger_t) ++corenet_tcp_connect_postgresql_port(passenger_t) ++corenet_tcp_connect_mysqld_port(passenger_t) + + corecmd_exec_bin(passenger_t) + corecmd_exec_shell(passenger_t) +@@ -68,10 +76,10 @@ dev_read_urand(passenger_t) + + domain_read_all_domains_state(passenger_t) + +-files_read_etc_files(passenger_t) +- + auth_use_nsswitch(passenger_t) + ++fs_getattr_xattr_fs(passenger_t) ++ + logging_send_syslog_msg(passenger_t) + + miscfiles_read_localization(passenger_t) +@@ -83,6 +91,7 @@ userdom_dontaudit_use_user_terminals(passenger_t) + optional_policy(` + apache_append_log(passenger_t) + apache_read_sys_content(passenger_t) ++ apache_rw_stream_sockets(passenger_t) + ') + + optional_policy(` +@@ -94,14 +103,21 @@ optional_policy(` + ') + + optional_policy(` +- puppet_manage_lib_files(passenger_t) ++ mysql_stream_connect(passenger_t) ++ mysql_list_db(passenger_t) ++') ++ ++optional_policy(` ++ puppet_domtrans_master(passenger_t) ++ puppet_manage_lib(passenger_t) + puppet_read_config(passenger_t) +- puppet_append_log_files(passenger_t) +- puppet_create_log_files(passenger_t) +- puppet_read_log_files(passenger_t) ++ puppet_append_log(passenger_t) ++ puppet_create_log(passenger_t) ++ puppet_read_log(passenger_t) ++ puppet_search_pid(passenger_t) + ') + + optional_policy(` +- rpm_exec(passenger_t) +- rpm_read_db(passenger_t) ++ rpm_exec(passenger_t) ++ rpm_read_db(passenger_t) + ') +diff --git a/pcmcia.te b/pcmcia.te +index 8176e4aa4b..2df178919a 100644 +--- a/pcmcia.te ++++ b/pcmcia.te +@@ -88,20 +88,17 @@ libs_exec_lib_files(cardmgr_t) + + logging_send_syslog_msg(cardmgr_t) + +-miscfiles_read_localization(cardmgr_t) +- + modutils_domtrans_insmod(cardmgr_t) + + sysnet_domtrans_ifconfig(cardmgr_t) + sysnet_etc_filetrans_config(cardmgr_t) + sysnet_manage_config(cardmgr_t) + +-userdom_use_user_terminals(cardmgr_t) ++userdom_use_inherited_user_terminals(cardmgr_t) + userdom_dontaudit_use_unpriv_user_fds(cardmgr_t) + userdom_dontaudit_search_user_home_dirs(cardmgr_t) + + optional_policy(` +- seutil_dontaudit_read_config(cardmgr_t) + seutil_sigchld_newrole(cardmgr_t) + ') + +diff --git a/pcp.fc b/pcp.fc +new file mode 100644 +index 0000000000..de7c78ca04 +--- /dev/null ++++ b/pcp.fc +@@ -0,0 +1,33 @@ ++/etc/rc\.d/init\.d/pmcd -- gen_context(system_u:object_r:pcp_pmcd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pmlogger -- gen_context(system_u:object_r:pcp_pmlogger_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pmproxy -- gen_context(system_u:object_r:pcp_pmproxy_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pmwebd -- gen_context(system_u:object_r:pcp_pmwebd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pmie -- gen_context(system_u:object_r:pcp_pmie_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pmmgr -- gen_context(system_u:object_r:pcp_pmmgr_initrc_exec_t,s0) ++ ++/usr/bin/pmie -- gen_context(system_u:object_r:pcp_pmie_exec_t,s0) ++/usr/bin/pmcd -- gen_context(system_u:object_r:pcp_pmcd_exec_t,s0) ++/usr/bin/pmlogger -- gen_context(system_u:object_r:pcp_pmlogger_exec_t,s0) ++/usr/bin/pmproxy -- gen_context(system_u:object_r:pcp_pmproxy_exec_t,s0) ++/usr/bin/pmwebd -- gen_context(system_u:object_r:pcp_pmwebd_exec_t,s0) ++/usr/bin/pmmgr -- gen_context(system_u:object_r:pcp_pmmgr_exec_t,s0) ++ ++ ++/usr/libexec/pcp/bin/pmcd -- gen_context(system_u:object_r:pcp_pmcd_exec_t,s0) ++/usr/libexec/pcp/bin/pmlogger -- gen_context(system_u:object_r:pcp_pmlogger_exec_t,s0) ++/usr/libexec/pcp/bin/pmproxy -- gen_context(system_u:object_r:pcp_pmproxy_exec_t,s0) ++/usr/libexec/pcp/bin/pmwebd -- gen_context(system_u:object_r:pcp_pmwebd_exec_t,s0) ++/usr/libexec/pcp/bin/pmie -- gen_context(system_u:object_r:pcp_pmie_exec_t,s0) ++/usr/libexec/pcp/bin/pmmgr -- gen_context(system_u:object_r:pcp_pmmgr_exec_t,s0) ++ ++/usr/share/pcp/lib/pmie -- gen_context(system_u:object_r:pcp_pmie_exec_t,s0) ++ ++/usr/share/pcp/lib/pmlogger -- gen_context(system_u:object_r:pcp_pmlogger_exec_t,s0) ++ ++/var/lib/pcp(/.*)? gen_context(system_u:object_r:pcp_var_lib_t,s0) ++ ++/var/log/pcp(/.*)? gen_context(system_u:object_r:pcp_log_t,s0) ++ ++/var/run/pcp(/.*)? gen_context(system_u:object_r:pcp_var_run_t,s0) ++/var/run/pmcd\.socket -- gen_context(system_u:object_r:pcp_var_run_t,s0) ++/var/run/pmlogger\.primary\.socket -l gen_context(system_u:object_r:pcp_var_run_t,s0) +diff --git a/pcp.if b/pcp.if +new file mode 100644 +index 0000000000..abb250dbaf +--- /dev/null ++++ b/pcp.if +@@ -0,0 +1,160 @@ ++## The pcp command summarizes the status of a Performance Co-Pilot (PCP) installation ++ ++###################################### ++## ++## Creates types and rules for a basic ++## pcp daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`pcp_domain_template',` ++ gen_require(` ++ attribute pcp_domain; ++ ') ++ ++ type pcp_$1_t, pcp_domain; ++ type pcp_$1_exec_t; ++ init_daemon_domain(pcp_$1_t, pcp_$1_exec_t) ++ ++ type pcp_$1_initrc_exec_t; ++ init_script_file(pcp_$1_initrc_exec_t) ++ ++ auth_use_nsswitch(pcp_$1_t) ++ ++ optional_policy(` ++ cron_system_entry(pcp_$1_t, pcp_$1_exec_t) ++ ') ++') ++ ++###################################### ++## ++## Allow domain to read pcp lib files ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++interface(`pcp_read_lib_files',` ++ gen_require(` ++ type pcp_var_lib_t; ++ ') ++ files_search_var_lib($1) ++ read_files_pattern($1,pcp_var_lib_t,pcp_var_lib_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an pcp environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`pcp_admin',` ++ gen_require(` ++ type pcp_pmcd_t; ++ type pcp_pmlogger_t; ++ type pcp_pmproxy_t; ++ type pcp_pmwebd_t; ++ type pcp_pmie_t; ++ type pcp_pmmgr_t; ++ type pcp_var_run_t; ++ ') ++ ++ allow $1 pcp_pmcd_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmcd_t) ++ ++ allow $1 pcp_pmlogger_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmlogger_t) ++ ++ allow $1 pcp_pmproxy_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmproxy_t) ++ ++ allow $1 pcp_pmwebd_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmwebd_t) ++ ++ allow $1 pcp_pmie_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmie_t) ++ ++ allow $1 pcp_pmmgr_t:process signal_perms; ++ ps_process_pattern($1, pcp_pmmgr_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 pcp_pmcd_t:process ptrace; ++ allow $1 pcp_pmlogger_t:process ptrace; ++ allow $1 pcp_pmproxy_t:process ptrace; ++ allow $1 pcp_pmwebd_t:process ptrace; ++ allow $1 pcp_pmie_t:process ptrace; ++ allow $1 pcp_pmmgr_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, pcp_var_run_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to execute pcp_pmie ++## in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pcp_pmie_exec',` ++ gen_require(` ++ type pcp_pmie_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, pcp_pmie_exec_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to execute pcp_pmlogger ++## in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pcp_pmlogger_exec',` ++ gen_require(` ++ type pcp_pmlogger_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, pcp_pmlogger_exec_t) ++') ++ ++####################################### ++## ++## Transition to pcp named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pcp_filetrans_named_content',` ++ gen_require(` ++ type pcp_var_run_t; ++ ') ++ files_pid_filetrans($1, pcp_var_run_t, dir, "pcp") ++') +diff --git a/pcp.pp b/pcp.pp +new file mode 100644 +index 0000000000..fa4cfaa88c +Binary files /dev/null and b/pcp.pp differ +diff --git a/pcp.te b/pcp.te +new file mode 100644 +index 0000000000..ba4aa47696 +--- /dev/null ++++ b/pcp.te +@@ -0,0 +1,318 @@ ++policy_module(pcp, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++ ++## ++##

      ++## Allow pcp to bind to all unreserved_ports ++##

      ++##
      ++gen_tunable(pcp_bind_all_unreserved_ports, false) ++ ++## ++##

      ++## Allow pcp to read generic logs ++##

      ++##
      ++gen_tunable(pcp_read_generic_logs, false) ++ ++attribute pcp_domain; ++ ++pcp_domain_template(pmcd) ++pcp_domain_template(pmlogger) ++pcp_domain_template(pmproxy) ++pcp_domain_template(pmwebd) ++pcp_domain_template(pmie) ++pcp_domain_template(pmmgr) ++ ++type pcp_log_t; ++logging_log_file(pcp_log_t) ++ ++type pcp_var_lib_t; ++files_type(pcp_var_lib_t) ++ ++type pcp_var_run_t; ++files_pid_file(pcp_var_run_t) ++ ++type pcp_tmp_t; ++files_tmp_file(pcp_tmp_t) ++ ++type pcp_tmpfs_t; ++files_tmpfs_file(pcp_tmpfs_t) ++ ++######################################## ++# ++# pcp domain local policy ++# ++ ++allow pcp_domain self:capability { setuid setgid dac_read_search dac_override }; ++allow pcp_domain self:process signal_perms; ++allow pcp_domain self:tcp_socket create_stream_socket_perms; ++allow pcp_domain self:udp_socket create_socket_perms; ++allow pcp_domain self:netlink_route_socket create_socket_perms; ++allow pcp_domain self:unix_stream_socket connectto; ++ ++corenet_tcp_connect_all_ephemeral_ports(pcp_domain) ++ ++manage_dirs_pattern(pcp_domain, pcp_log_t, pcp_log_t) ++manage_files_pattern(pcp_domain, pcp_log_t, pcp_log_t) ++logging_log_filetrans(pcp_domain, pcp_log_t, { dir }) ++ ++manage_dirs_pattern(pcp_domain, pcp_var_lib_t, pcp_var_lib_t) ++manage_files_pattern(pcp_domain, pcp_var_lib_t, pcp_var_lib_t) ++manage_sock_files_pattern(pcp_domain, pcp_var_lib_t, pcp_var_lib_t) ++manage_lnk_files_pattern(pcp_domain, pcp_var_lib_t, pcp_var_lib_t) ++exec_files_pattern(pcp_domain, pcp_var_lib_t, pcp_var_lib_t) ++files_var_lib_filetrans(pcp_domain, pcp_var_lib_t, { dir}) ++ ++manage_dirs_pattern(pcp_domain, pcp_var_run_t, pcp_var_run_t) ++manage_files_pattern(pcp_domain, pcp_var_run_t, pcp_var_run_t) ++manage_sock_files_pattern(pcp_domain, pcp_var_run_t, pcp_var_run_t) ++manage_lnk_files_pattern(pcp_domain, pcp_var_run_t, pcp_var_run_t) ++files_pid_filetrans(pcp_domain, pcp_var_run_t, { dir file sock_file lnk_file }) ++ ++manage_dirs_pattern(pcp_domain, pcp_tmp_t, pcp_tmp_t) ++manage_files_pattern(pcp_domain, pcp_tmp_t, pcp_tmp_t) ++manage_sock_files_pattern(pcp_domain, pcp_tmp_t, pcp_tmp_t) ++files_tmp_filetrans(pcp_domain, pcp_tmp_t, { dir file sock_file }) ++ ++manage_dirs_pattern(pcp_domain, pcp_tmpfs_t, pcp_tmpfs_t) ++manage_files_pattern(pcp_domain, pcp_tmpfs_t, pcp_tmpfs_t) ++fs_tmpfs_filetrans(pcp_domain, pcp_tmpfs_t, { dir file }) ++ ++dev_read_urand(pcp_domain) ++ ++files_read_etc_files(pcp_domain) ++ ++fs_getattr_all_fs(pcp_domain) ++ ++miscfiles_read_generic_certs(pcp_domain) ++ ++sysnet_read_config(pcp_domain) ++ ++tunable_policy(`pcp_bind_all_unreserved_ports',` ++ corenet_sendrecv_all_server_packets(pcp_pmcd_t) ++ corenet_sendrecv_all_server_packets(pcp_pmlogger_t) ++ corenet_tcp_bind_all_unreserved_ports(pcp_pmcd_t) ++ corenet_tcp_bind_all_unreserved_ports(pcp_pmlogger_t) ++ ++') ++ ++ ++######################################## ++# ++# pcp_pmcd local policy ++# ++ ++allow pcp_pmcd_t self:capability { net_admin sys_admin sys_ptrace }; ++allow pcp_pmcd_t self:process { setsched }; ++allow pcp_pmcd_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_get_sysvipc_info(pcp_pmcd_t) ++kernel_read_network_state(pcp_pmcd_t) ++kernel_read_system_state(pcp_pmcd_t) ++kernel_read_state(pcp_pmcd_t) ++kernel_read_fs_sysctls(pcp_pmcd_t) ++kernel_read_rpc_sysctls(pcp_pmcd_t) ++kernel_search_network_sysctl(pcp_pmcd_t) ++kernel_read_net_sysctls(pcp_pmcd_t) ++ ++corecmd_exec_bin(pcp_pmcd_t) ++ ++corenet_tcp_bind_amqp_port(pcp_pmcd_t) ++corenet_tcp_connect_amqp_port(pcp_pmcd_t) ++corenet_tcp_connect_http_port(pcp_pmcd_t) ++ ++dev_read_sysfs(pcp_pmcd_t) ++dev_rw_lvm_control(pcp_pmcd_t) ++ ++domain_read_all_domains_state(pcp_pmcd_t) ++domain_getattr_all_domains(pcp_pmcd_t) ++ ++dev_getattr_all_blk_files(pcp_pmcd_t) ++dev_getattr_all_chr_files(pcp_pmcd_t) ++dev_read_sysfs(pcp_pmcd_t) ++dev_read_urand(pcp_pmcd_t) ++ ++fs_getattr_all_fs(pcp_pmcd_t) ++fs_getattr_all_dirs(pcp_pmcd_t) ++fs_list_cgroup_dirs(pcp_pmcd_t) ++fs_read_cgroup_files(pcp_pmcd_t) ++ ++init_read_utmp(pcp_pmcd_t) ++ ++logging_send_syslog_msg(pcp_pmcd_t) ++ ++lvm_domtrans(pcp_pmcd_t) ++ ++storage_getattr_fixed_disk_dev(pcp_pmcd_t) ++ ++userdom_read_user_tmp_files(pcp_pmcd_t) ++ ++optional_policy(` ++ cron_read_pid_files(pcp_pmcd_t) ++') ++ ++optional_policy(` ++ container_manage_lib_files(pcp_pmcd_t) ++') ++ ++optional_policy(` ++ mysql_stream_connect(pcp_pmcd_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(pcp_pmcd_t) ++ ++ optional_policy(` ++ avahi_dbus_chat(pcp_pmcd_t) ++ ') ++') ++ ++optional_policy(` ++ postfix_read_config(pcp_pmcd_t) ++ postfix_search_spool(pcp_pmcd_t) ++') ++ ++tunable_policy(`pcp_read_generic_logs',` ++ logging_read_generic_logs(pcp_pmcd_t) ++ ++') ++ ++######################################## ++# ++# pcp_pmproxy local policy ++# ++ ++allow pcp_pmproxy_t self:process setsched; ++allow pcp_pmproxy_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_search_network_sysctl(pcp_pmproxy_t) ++ ++logging_send_syslog_msg(pcp_pmproxy_t) ++ ++optional_policy(` ++ dbus_system_bus_client(pcp_pmproxy_t) ++ ++ optional_policy(` ++ avahi_dbus_chat(pcp_pmproxy_t) ++ ') ++') ++ ++######################################## ++# ++# pcp_pmwebd local policy ++# ++ ++corenet_tcp_bind_generic_node(pcp_pmwebd_t) ++ ++optional_policy(` ++ dbus_system_bus_client(pcp_pmwebd_t) ++ ++ optional_policy(` ++ avahi_dbus_chat(pcp_pmwebd_t) ++ ') ++') ++ ++######################################## ++# ++# pcp_pmmgr local policy ++# ++ ++allow pcp_pmmgr_t self:process { setpgid }; ++allow pcp_pmmgr_t self:unix_dgram_socket create_socket_perms; ++allow pcp_pmmgr_t pcp_pmcd_t:unix_stream_socket connectto; ++ ++kernel_read_system_state(pcp_pmmgr_t) ++ ++corenet_udp_bind_dey_sapi_port(pcp_pmmgr_t) ++ ++corenet_tcp_bind_commplex_link_port(pcp_pmmgr_t) ++corenet_tcp_bind_dey_sapi_port(pcp_pmmgr_t) ++ ++corecmd_exec_bin(pcp_pmmgr_t) ++ ++logging_send_syslog_msg(pcp_pmmgr_t) ++ ++optional_policy(` ++ pcp_pmie_exec(pcp_pmmgr_t) ++ pcp_pmlogger_exec(pcp_pmmgr_t) ++') ++ ++######################################## ++# ++# pcp_pmie local policy ++# ++allow pcp_pmie_t self:capability { chown sys_ptrace }; ++allow pcp_pmie_t self:netlink_route_socket { create_socket_perms nlmsg_read }; ++allow pcp_pmie_t self:unix_dgram_socket { create_socket_perms sendto }; ++ ++allow pcp_pmie_t pcp_pmcd_t:unix_stream_socket connectto; ++ ++allow pcp_pmie_t pcp_pmcd_t:process signal; ++ ++kernel_read_system_state(pcp_pmie_t) ++ ++corecmd_exec_bin(pcp_pmie_t) ++corecmd_getattr_all_executables(pcp_pmie_t) ++ ++domain_read_all_domains_state(pcp_pmie_t) ++ ++fs_search_cgroup_dirs(pcp_pmie_t) ++ ++init_status(pcp_pmie_t) ++ ++logging_send_syslog_msg(pcp_pmie_t) ++ ++systemd_exec_systemctl(pcp_pmie_t) ++systemd_read_unit_files(pcp_pmie_t) ++systemd_search_unit_dirs(pcp_pmie_t) ++ ++userdom_read_user_tmp_files(pcp_pmie_t) ++ ++######################################## ++# ++# pcp_pmlogger local policy ++# ++ ++allow pcp_pmlogger_t self:capability { kill sys_ptrace chown }; ++allow pcp_pmlogger_t self:process setpgid; ++allow pcp_pmlogger_t self:netlink_route_socket {create_socket_perms nlmsg_read }; ++ ++allow pcp_pmlogger_t pcp_pmcd_t:unix_stream_socket connectto; ++allow pcp_pmlogger_t self:unix_dgram_socket create_socket_perms; ++ ++kernel_read_system_state(pcp_pmlogger_t) ++kernel_read_network_state(pcp_pmlogger_t) ++ ++corecmd_exec_bin(pcp_pmlogger_t) ++ ++corenet_tcp_bind_dey_sapi_port(pcp_pmlogger_t) ++corenet_tcp_bind_commplex_link_port(pcp_pmlogger_t) ++corenet_tcp_bind_generic_node(pcp_pmlogger_t) ++ ++domain_read_all_domains_state(pcp_pmlogger_t) ++ ++init_read_utmp(pcp_pmlogger_t) ++init_status(pcp_pmlogger_t) ++ ++logging_send_syslog_msg(pcp_pmlogger_t) ++ ++systemd_exec_systemctl(pcp_pmlogger_t) ++systemd_getattr_unit_files(pcp_pmlogger_t) ++ ++optional_policy(` ++ hostname_exec(pcp_pmlogger_t) ++') ++ ++optional_policy(` ++ unconfined_signal(pcp_pmlogger_t) ++') ++ ++optional_policy(` ++ xserver_dontaudit_search_log(pcp_pmlogger_t) ++') +diff --git a/pcscd.if b/pcscd.if +index 43d50f95bd..6b1544f621 100644 +--- a/pcscd.if ++++ b/pcscd.if +@@ -17,6 +17,8 @@ interface(`pcscd_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, pcscd_exec_t, pcscd_t) ++ ++ ps_process_pattern(pcscd_t, $1) + ') + + ######################################## +@@ -50,7 +52,7 @@ interface(`pcscd_read_pid_files',` + ') + + files_search_pids($1) +- allow $1 pcscd_var_run_t:file read_file_perms; ++ read_files_pattern($1, pcscd_var_run_t, pcscd_var_run_t) + ') + + ######################################## +diff --git a/pcscd.te b/pcscd.te +index 1fb1964107..5212cd2030 100644 +--- a/pcscd.te ++++ b/pcscd.te +@@ -22,10 +22,11 @@ init_daemon_run_dir(pcscd_var_run_t, "pcscd") + # + + allow pcscd_t self:capability { dac_override dac_read_search fsetid }; +-allow pcscd_t self:process signal; ++allow pcscd_t self:process { signal signull }; + allow pcscd_t self:fifo_file rw_fifo_file_perms; +-allow pcscd_t self:unix_stream_socket { accept listen }; +-allow pcscd_t self:tcp_socket { accept listen }; ++allow pcscd_t self:unix_stream_socket create_stream_socket_perms; ++allow pcscd_t self:unix_dgram_socket create_socket_perms; ++allow pcscd_t self:tcp_socket create_stream_socket_perms; + allow pcscd_t self:netlink_kobject_uevent_socket create_socket_perms; + + manage_dirs_pattern(pcscd_t, pcscd_var_run_t, pcscd_var_run_t) +@@ -36,7 +37,6 @@ files_pid_filetrans(pcscd_t, pcscd_var_run_t, { file sock_file dir }) + + kernel_read_system_state(pcscd_t) + +-corenet_all_recvfrom_unlabeled(pcscd_t) + corenet_all_recvfrom_netlabel(pcscd_t) + corenet_tcp_sendrecv_generic_if(pcscd_t) + corenet_tcp_sendrecv_generic_node(pcscd_t) +@@ -45,12 +45,13 @@ corenet_sendrecv_http_client_packets(pcscd_t) + corenet_tcp_connect_http_port(pcscd_t) + corenet_tcp_sendrecv_http_port(pcscd_t) + ++domain_read_all_domains_state(pcscd_t) ++ + dev_rw_generic_usb_dev(pcscd_t) + dev_rw_smartcard(pcscd_t) + dev_rw_usbfs(pcscd_t) + dev_read_sysfs(pcscd_t) + +-files_read_etc_files(pcscd_t) + files_read_etc_runtime_files(pcscd_t) + + term_use_unallocated_ttys(pcscd_t) +@@ -60,16 +61,26 @@ locallogin_use_fds(pcscd_t) + + logging_send_syslog_msg(pcscd_t) + +-miscfiles_read_localization(pcscd_t) +- + sysnet_dns_name_resolve(pcscd_t) + ++userdom_read_all_users_state(pcscd_t) ++ + optional_policy(` + dbus_system_bus_client(pcscd_t) + + optional_policy(` + hal_dbus_chat(pcscd_t) + ') ++ ++ optional_policy(` ++ policykit_dbus_chat(pcscd_t) ++ policykit_dbus_chat_auth(pcscd_t) ++ ') ++ ++') ++ ++optional_policy(` ++ policykit_dbus_chat(pcscd_t) + ') + + optional_policy(` +@@ -85,3 +96,8 @@ optional_policy(` + optional_policy(` + udev_read_db(pcscd_t) + ') ++ ++optional_policy(` ++ virt_rw_svirt_dev(pcscd_t) ++') ++ +diff --git a/pegasus.fc b/pegasus.fc +index dfd46e4126..feaa8e174c 100644 +--- a/pegasus.fc ++++ b/pegasus.fc +@@ -1,15 +1,33 @@ +-/etc/Pegasus(/.*)? gen_context(system_u:object_r:pegasus_conf_t,s0) ++ ++/etc/Pegasus(/.*)? gen_context(system_u:object_r:pegasus_conf_t,s0) + /etc/Pegasus/pegasus_current\.conf gen_context(system_u:object_r:pegasus_data_t,s0) ++/etc/Pegasus/cimserver_current\.conf gen_context(system_u:object_r:pegasus_data_t,s0) + +-/etc/rc\.d/init\.d/tog-pegasus -- gen_context(system_u:object_r:pegasus_initrc_exec_t,s0) ++/usr/sbin/cimserver -- gen_context(system_u:object_r:pegasus_exec_t,s0) ++/usr/sbin/init_repository -- gen_context(system_u:object_r:pegasus_exec_t,s0) + +-/usr/sbin/cimserver -- gen_context(system_u:object_r:pegasus_exec_t,s0) +-/usr/sbin/init_repository -- gen_context(system_u:object_r:pegasus_exec_t,s0) ++/var/lib/Pegasus(/.*)? gen_context(system_u:object_r:pegasus_data_t,s0) + +-/var/cache/Pegasus(/.*)? gen_context(system_u:object_r:pegasus_cache_t,s0) ++/var/run/tog-pegasus(/.*)? gen_context(system_u:object_r:pegasus_var_run_t,s0) + +-/var/lib/Pegasus(/.*)? gen_context(system_u:object_r:pegasus_data_t,s0) ++/usr/share/Pegasus/mof(/.*)?/.*\.mof gen_context(system_u:object_r:pegasus_mof_t,s0) + +-/var/run/tog-pegasus(/.*)? gen_context(system_u:object_r:pegasus_var_run_t,s0) ++/var/lib/openlmi-storage(/.*)? gen_context(system_u:object_r:pegasus_openlmi_storage_lib_t,s0) + +-/usr/share/Pegasus/mof(/.*)?/.*\.mof gen_context(system_u:object_r:pegasus_mof_t,s0) ++/var/run/openlmi-storage(/.*)? gen_context(system_u:object_r:pegasus_openlmi_storage_var_run_t,s0) ++ ++/usr/libexec/pegasus/cmpiLMI_Account-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_account_exec_t,s0) ++ ++/usr/libexec/pegasus/cmpiLMI_LogicalFile-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_logicalfile_exec_t,s0) ++ ++/usr/libexec/pegasus/cmpiLMI_Fan-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_system_exec_t,s0) ++/usr/libexec/pegasus/cmpiLMI_Networking-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_system_exec_t,s0) ++/usr/libexec/pegasus/cmpiLMI_PowerManagement-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_system_exec_t,s0) ++ ++/usr/libexec/pegasus/cmpiLMI_Realmd-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_services_exec_t,s0) ++ ++/usr/libexec/pegasus/cmpiLMI_Service-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_admin_exec_t,s0) ++/usr/libexec/pegasus/cmpiLMI_Journald-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_admin_exec_t,s0) ++ ++/usr/libexec/pegasus/pycmpiLMI_Storage-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_storage_exec_t,s0) ++/usr/libexec/pegasus/cmpiLMI_Hardware-cimprovagt -- gen_context(system_u:object_r:pegasus_openlmi_storage_exec_t,s0) +diff --git a/pegasus.if b/pegasus.if +index d2fc677c11..86dce34a22 100644 +--- a/pegasus.if ++++ b/pegasus.if +@@ -1,52 +1,60 @@ + ## The Open Group Pegasus CIM/WBEM Server. + ++###################################### ++## ++## Creates types and rules for a basic ++## openlmi init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`pegasus_openlmi_domain_template',` ++ gen_require(` ++ attribute pegasus_openlmi_domain; ++ type pegasus_t; ++ ') ++ ++ ############################## ++ # ++ # Declarations ++ # ++ ++ type pegasus_openlmi_$1_t, pegasus_openlmi_domain; ++ type pegasus_openlmi_$1_exec_t; ++ init_daemon_domain(pegasus_openlmi_$1_t, pegasus_openlmi_$1_exec_t) ++ ++ ############################## ++ # ++ # Local policy ++ # ++ ++ domtrans_pattern(pegasus_t, pegasus_openlmi_$1_exec_t, pegasus_openlmi_$1_t) ++ allow pegasus_t pegasus_openlmi_$1_exec_t:file ioctl; ++ ++ kernel_read_system_state(pegasus_openlmi_$1_t) ++ logging_send_syslog_msg(pegasus_openlmi_$1_t) ++') ++ + ######################################## + ## +-## All of the rules required to +-## administrate an pegasus environment. ++## Connect to pegasus over a unix stream socket. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # +-interface(`pegasus_admin',` ++interface(`pegasus_stream_connect',` + gen_require(` +- type pegasus_t, pegasus_initrc_exec_t, pegasus_tmp_t; +- type pegasus_cache_t, pegasus_data_t, pegasus_conf_t; +- type pegasus_mof_t, pegasus_var_run_t; ++ type pegasus_t, pegasus_var_run_t, pegasus_tmp_t; + ') + +- allow $1 pegasus_t:process { ptrace signal_perms }; +- ps_process_pattern($1, pegasus_t) +- +- init_labeled_script_domtrans($1, pegasus_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 pegasus_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_etc($1) +- admin_pattern($1, pegasus_conf_t) +- +- files_search_usr($1) +- admin_pattern($1, pegasus_mof_t) +- +- files_search_tmp($1) +- admin_pattern($1, pegasus_tmp_t) +- +- files_search_var($1) +- admin_pattern($1, pegasus_cache_t) +- +- files_search_var_lib($1) +- admin_pattern($1, pegasus_data_t) +- + files_search_pids($1) +- admin_pattern($1, pegasus_var_run_t) ++ stream_connect_pattern($1, pegasus_var_run_t, pegasus_var_run_t, pegasus_t) ++ stream_connect_pattern($1, pegasus_tmp_t, pegasus_tmp_t, pegasus_t) + ') ++ +diff --git a/pegasus.te b/pegasus.te +index 608f454d8e..a78b356aa7 100644 +--- a/pegasus.te ++++ b/pegasus.te +@@ -5,13 +5,12 @@ policy_module(pegasus, 1.9.0) + # Declarations + # + ++attribute pegasus_openlmi_domain; ++ + type pegasus_t; + type pegasus_exec_t; + init_daemon_domain(pegasus_t, pegasus_exec_t) + +-type pegasus_initrc_exec_t; +-init_script_file(pegasus_initrc_exec_t) +- + type pegasus_cache_t; + files_type(pegasus_cache_t) + +@@ -30,20 +29,337 @@ files_type(pegasus_mof_t) + type pegasus_var_run_t; + files_pid_file(pegasus_var_run_t) + ++# pegasus openlmi providers ++pegasus_openlmi_domain_template(admin) ++typealias pegasus_openlmi_admin_t alias pegasus_openlmi_service_t; ++typealias pegasus_openlmi_admin_exec_t alias pegasus_openlmi_service_exec_t; ++ ++pegasus_openlmi_domain_template(account) ++domain_obj_id_change_exemption(pegasus_openlmi_account_t) ++domain_system_change_exemption(pegasus_openlmi_account_t) ++ ++pegasus_openlmi_domain_template(logicalfile) ++pegasus_openlmi_domain_template(services) ++ ++pegasus_openlmi_domain_template(storage) ++type pegasus_openlmi_storage_tmp_t; ++files_tmp_file(pegasus_openlmi_storage_tmp_t) ++ ++type pegasus_openlmi_storage_lib_t; ++files_type(pegasus_openlmi_storage_lib_t) ++ ++type pegasus_openlmi_storage_var_run_t; ++files_pid_file(pegasus_openlmi_storage_var_run_t) ++ ++pegasus_openlmi_domain_template(system) ++typealias pegasus_openlmi_system_t alias pegasus_openlmi_networking_t; ++pegasus_openlmi_domain_template(unconfined) ++ ++####################################### ++# ++# pegasus openlmi providers local policy ++# ++ ++allow pegasus_openlmi_domain self:capability { setuid setgid }; ++ ++allow pegasus_openlmi_domain self:fifo_file rw_fifo_file_perms; ++allow pegasus_openlmi_domain self:udp_socket create_socket_perms; ++ ++manage_files_pattern(pegasus_openlmi_domain, pegasus_data_t, pegasus_data_t) ++manage_dirs_pattern(pegasus_openlmi_domain, pegasus_data_t, pegasus_data_t) ++ ++corecmd_exec_bin(pegasus_openlmi_domain) ++corecmd_exec_shell(pegasus_openlmi_domain) ++ ++dev_read_sysfs(pegasus_openlmi_domain) ++ ++auth_read_passwd(pegasus_openlmi_domain) ++ ++sysnet_read_config(pegasus_openlmi_domain) ++ ++optional_policy(` ++ pegasus_stream_connect(pegasus_openlmi_domain) ++') ++ ++###################################### ++# ++# pegasus openlmi account local policy ++# ++ ++allow pegasus_openlmi_account_t self:capability { chown dac_read_search dac_override fowner fsetid }; ++allow pegasus_openlmi_account_t self:process setfscreate; ++ ++auth_manage_passwd(pegasus_openlmi_account_t) ++auth_manage_shadow(pegasus_openlmi_account_t) ++auth_relabel_shadow(pegasus_openlmi_account_t) ++auth_read_login_records(pegasus_openlmi_account_t) ++auth_etc_filetrans_shadow(pegasus_openlmi_account_t) ++ ++logging_send_audit_msgs(pegasus_openlmi_account_t) ++logging_send_syslog_msg(pegasus_openlmi_account_t) ++ ++init_rw_utmp(pegasus_openlmi_account_t) ++ ++seutil_semanage_policy(pegasus_openlmi_account_t) ++ ++logging_send_syslog_msg(pegasus_openlmi_account_t) ++ ++seutil_read_config(pegasus_openlmi_account_t) ++seutil_read_file_contexts(pegasus_openlmi_account_t) ++seutil_read_default_contexts(pegasus_openlmi_account_t) ++ ++# Add/remove user home directories ++userdom_home_filetrans_user_home_dir(pegasus_openlmi_account_t) ++userdom_manage_home_role(system_r, pegasus_openlmi_account_t) ++userdom_delete_all_user_home_content(pegasus_openlmi_account_t) ++ ++optional_policy(` ++ # run userdel ++ usermanage_domtrans_useradd(pegasus_openlmi_account_t) ++') ++ ++###################################### ++# ++# pegasus openlmi logicalfile local policy ++# ++ ++allow pegasus_openlmi_logicalfile_t self:capability { dac_read_search dac_override }; ++files_manage_non_security_dirs(pegasus_openlmi_logicalfile_t) ++files_manage_non_security_files(pegasus_openlmi_logicalfile_t) ++ ++dev_getattr_all_blk_files(pegasus_openlmi_logicalfile_t) ++dev_getattr_all_chr_files(pegasus_openlmi_logicalfile_t) ++ ++files_list_all(pegasus_openlmi_logicalfile_t) ++files_read_all_files(pegasus_openlmi_logicalfile_t) ++files_read_all_symlinks(pegasus_openlmi_logicalfile_t) ++files_read_all_blk_files(pegasus_openlmi_logicalfile_t) ++files_read_all_chr_files(pegasus_openlmi_logicalfile_t) ++files_getattr_all_pipes(pegasus_openlmi_logicalfile_t) ++files_getattr_all_sockets(pegasus_openlmi_logicalfile_t) ++ ++# Add/remove user home directories ++userdom_home_filetrans_user_home_dir(pegasus_openlmi_logicalfile_t) ++userdom_manage_home_role(system_r, pegasus_openlmi_logicalfile_t) ++userdom_delete_all_user_home_content(pegasus_openlmi_logicalfile_t) ++ ++optional_policy(` ++ # it can delete/create empty dirs ++ # so we want to have unconfined_domain attribute for filename rules ++ unconfined_domain(pegasus_openlmi_logicalfile_t) ++') ++ ++###################################### ++# ++# pegasus openlmi services local policy ++# ++ ++allow pegasus_openlmi_services_t self:netlink_route_socket r_netlink_socket_perms; ++ ++kernel_read_network_state(pegasus_openlmi_services_t) ++ ++miscfiles_read_certs(pegasus_openlmi_services_t) ++ ++optional_policy(` ++ dbus_system_bus_client(pegasus_openlmi_services_t) ++') ++ ++optional_policy(` ++ realmd_dbus_chat(pegasus_openlmi_services_t) ++') ++ ++optional_policy(` ++ sssd_read_public_files(pegasus_openlmi_services_t) ++ sssd_stream_connect(pegasus_openlmi_services_t) ++') ++ ++###################################### ++# ++# pegasus openlmi system (networking) local policy ++# ++ ++allow pegasus_openlmi_system_t self:capability { net_admin sys_boot }; ++allow pegasus_openlmi_system_t self:process signal_perms; ++ ++allow pegasus_openlmi_system_t self:netlink_route_socket r_netlink_socket_perms; ++ ++kernel_read_network_state(pegasus_openlmi_system_t) ++ ++auth_use_nsswitch(pegasus_openlmi_system_t) ++ ++dev_rw_sysfs(pegasus_openlmi_system_t) ++dev_read_urand(pegasus_openlmi_system_t) ++ ++fs_getattr_all_fs(pegasus_openlmi_system_t) ++ ++init_read_utmp(pegasus_openlmi_system_t) ++ ++systemd_config_power_services(pegasus_openlmi_system_t) ++systemd_dbus_chat_logind(pegasus_openlmi_system_t) ++ ++optional_policy(` ++ dbus_system_bus_client(pegasus_openlmi_system_t) ++') ++ ++optional_policy(` ++ networkmanager_dbus_chat(pegasus_openlmi_system_t) ++') ++ ++###################################### ++# ++# pegasus openlmi service local policy ++# ++ ++fs_getattr_all_fs(pegasus_openlmi_admin_t) ++ ++init_manage_transient_unit(pegasus_openlmi_admin_t) ++init_disable_services(pegasus_openlmi_admin_t) ++init_enable_services(pegasus_openlmi_admin_t) ++init_reload_services(pegasus_openlmi_admin_t) ++init_status(pegasus_openlmi_admin_t) ++init_reboot(pegasus_openlmi_admin_t) ++init_exec(pegasus_openlmi_admin_t) ++ ++systemd_config_all_services(pegasus_openlmi_admin_t) ++systemd_manage_all_unit_files(pegasus_openlmi_admin_t) ++systemd_manage_all_unit_lnk_files(pegasus_openlmi_admin_t) ++ ++allow pegasus_openlmi_service_t self:udp_socket create_socket_perms; ++ ++logging_read_syslog_pid(pegasus_openlmi_admin_t) ++logging_read_generic_logs(pegasus_openlmi_admin_t) ++ ++optional_policy(` ++ dbus_system_bus_client(pegasus_openlmi_admin_t) ++ ++ optional_policy(` ++ init_dbus_chat(pegasus_openlmi_admin_t) ++ ') ++') ++ ++optional_policy(` ++ sssd_stream_connect(pegasus_openlmi_admin_t) ++') ++ ++###################################### ++# ++# pegasus openlmi storage local policy ++# ++ ++allow pegasus_openlmi_storage_t self:capability { sys_admin sys_rawio sys_resource ipc_lock }; ++allow pegasus_openlmi_storage_t self:process setrlimit; ++ ++allow pegasus_openlmi_storage_t self:netlink_route_socket r_netlink_socket_perms; ++ ++manage_files_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_lib_t, pegasus_openlmi_storage_lib_t) ++manage_dirs_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_lib_t, pegasus_openlmi_storage_lib_t) ++files_var_lib_filetrans(pegasus_openlmi_storage_t, pegasus_openlmi_storage_lib_t, file) ++ ++manage_files_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_tmp_t, pegasus_openlmi_storage_tmp_t) ++manage_dirs_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_tmp_t, pegasus_openlmi_storage_tmp_t) ++files_tmp_filetrans(pegasus_openlmi_storage_tmp_t, pegasus_openlmi_storage_tmp_t, { file dir}) ++ ++manage_files_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_var_run_t, pegasus_openlmi_storage_var_run_t) ++manage_dirs_pattern(pegasus_openlmi_storage_t, pegasus_openlmi_storage_var_run_t, pegasus_openlmi_storage_var_run_t) ++files_pid_filetrans(pegasus_openlmi_storage_t, pegasus_openlmi_storage_var_run_t, dir, "openlmi-storage") ++ ++kernel_read_all_sysctls(pegasus_openlmi_storage_t) ++kernel_read_network_state(pegasus_openlmi_storage_t) ++kernel_get_sysvipc_info(pegasus_openlmi_storage_t) ++kernel_request_load_module(pegasus_openlmi_storage_t) ++ ++auth_use_nsswitch(pegasus_openlmi_storage_t) ++ ++dev_read_raw_memory(pegasus_openlmi_storage_t) ++dev_read_rand(pegasus_openlmi_storage_t) ++dev_read_urand(pegasus_openlmi_storage_t) ++ ++dev_rw_lvm_control(pegasus_openlmi_storage_t) ++dev_rw_sysfs(pegasus_openlmi_storage_t) ++ ++selinux_validate_context(pegasus_openlmi_storage_t) ++ ++seutil_read_file_contexts(pegasus_openlmi_storage_t) ++ ++storage_raw_read_removable_device(pegasus_openlmi_storage_t) ++storage_raw_write_removable_device(pegasus_openlmi_storage_t) ++storage_raw_read_fixed_disk(pegasus_openlmi_storage_t) ++storage_raw_write_fixed_disk(pegasus_openlmi_storage_t) ++ ++files_read_kernel_modules(pegasus_openlmi_storage_t) ++ ++fs_getattr_all_fs(pegasus_openlmi_storage_t) ++ ++modutils_domtrans_insmod(pegasus_openlmi_storage_t) ++ ++udev_domtrans(pegasus_openlmi_storage_t) ++udev_read_pid_files(pegasus_openlmi_storage_t) ++ ++init_read_state(pegasus_openlmi_storage_t) ++ ++miscfiles_read_hwdata(pegasus_openlmi_storage_t) ++ ++optional_policy(` ++ dmidecode_domtrans(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ iscsi_manage_lock(pegasus_openlmi_storage_t) ++ iscsi_read_lib_files(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ libs_exec_ldconfig(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ lvm_domtrans(pegasus_openlmi_storage_t) ++ lvm_read_metadata(pegasus_openlmi_storage_t) ++ lvm_write_metadata(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ mount_domtrans(pegasus_openlmi_storage_t) ++') ++ ++optional_policy(` ++ raid_domtrans_mdadm(pegasus_openlmi_storage_t) ++ raid_filetrans_named_content(pegasus_openlmi_storage_t) ++ raid_manage_conf_files(pegasus_openlmi_storage_t) ++') ++ ++###################################### ++# ++# pegasus openlmi unconfined local policy ++# ++ ++optional_policy(` ++ unconfined_domain(pegasus_openlmi_unconfined_t) ++') ++ + ######################################## + # +-# Local policy ++# pegasus local policy + # + +-allow pegasus_t self:capability { chown kill ipc_lock sys_nice setuid setgid dac_override net_admin net_bind_service }; +-dontaudit pegasus_t self:capability sys_tty_config; +-allow pegasus_t self:process signal; ++allow pegasus_t self:capability { chown kill ipc_lock sys_nice setuid setgid dac_read_search dac_override net_admin net_bind_service sys_ptrace }; ++dontaudit pegasus_t self:capability { sys_admin sys_tty_config }; ++allow pegasus_t self:process { setsched signal }; + allow pegasus_t self:fifo_file rw_fifo_file_perms; +-allow pegasus_t self:unix_stream_socket { connectto accept listen }; +-allow pegasus_t self:tcp_socket { accept listen }; ++allow pegasus_t self:unix_dgram_socket create_socket_perms; ++allow pegasus_t self:unix_stream_socket { connectto create_stream_socket_perms }; ++allow pegasus_t self:tcp_socket create_stream_socket_perms; + + allow pegasus_t pegasus_conf_t:dir rw_dir_perms; +-allow pegasus_t pegasus_conf_t:file { read_file_perms delete_file_perms rename_file_perms }; ++allow pegasus_t pegasus_conf_t:file { read_file_perms link delete_file_perms rename_file_perms }; + allow pegasus_t pegasus_conf_t:lnk_file read_lnk_file_perms; + + manage_dirs_pattern(pegasus_t, pegasus_cache_t, pegasus_cache_t) +@@ -54,25 +370,26 @@ files_var_filetrans(pegasus_t, pegasus_cache_t, { dir file lnk_file }) + manage_dirs_pattern(pegasus_t, pegasus_data_t, pegasus_data_t) + manage_files_pattern(pegasus_t, pegasus_data_t, pegasus_data_t) + manage_lnk_files_pattern(pegasus_t, pegasus_data_t, pegasus_data_t) +-filetrans_pattern(pegasus_t, pegasus_conf_t, pegasus_data_t, { dir file }) ++filetrans_pattern(pegasus_t, pegasus_conf_t, pegasus_data_t, { file dir }) ++ ++can_exec(pegasus_t, pegasus_exec_t) + + allow pegasus_t pegasus_mof_t:dir list_dir_perms; +-allow pegasus_t pegasus_mof_t:file read_file_perms; +-allow pegasus_t pegasus_mof_t:lnk_file read_lnk_file_perms; ++read_files_pattern(pegasus_t, pegasus_mof_t, pegasus_mof_t) ++read_lnk_files_pattern(pegasus_t, pegasus_mof_t, pegasus_mof_t) + + manage_dirs_pattern(pegasus_t, pegasus_tmp_t, pegasus_tmp_t) + manage_files_pattern(pegasus_t, pegasus_tmp_t, pegasus_tmp_t) +-files_tmp_filetrans(pegasus_t, pegasus_tmp_t, { dir file }) ++files_tmp_filetrans(pegasus_t, pegasus_tmp_t, { file dir }) + ++manage_sock_files_pattern(pegasus_t, pegasus_var_run_t, pegasus_var_run_t) + manage_dirs_pattern(pegasus_t, pegasus_var_run_t, pegasus_var_run_t) + manage_files_pattern(pegasus_t, pegasus_var_run_t, pegasus_var_run_t) +-manage_sock_files_pattern(pegasus_t, pegasus_var_run_t, pegasus_var_run_t) +-files_pid_filetrans(pegasus_t, pegasus_var_run_t, { dir file sock_file }) +- +-can_exec(pegasus_t, pegasus_exec_t) ++files_pid_filetrans(pegasus_t, pegasus_var_run_t, { file dir }) + + kernel_read_network_state(pegasus_t) + kernel_read_kernel_sysctls(pegasus_t) ++kernel_read_sysctl(pegasus_t) + kernel_read_fs_sysctls(pegasus_t) + kernel_read_system_state(pegasus_t) + kernel_search_vm_sysctl(pegasus_t) +@@ -80,43 +397,42 @@ kernel_read_net_sysctls(pegasus_t) + kernel_read_xen_state(pegasus_t) + kernel_write_xen_state(pegasus_t) + +-corenet_all_recvfrom_unlabeled(pegasus_t) + corenet_all_recvfrom_netlabel(pegasus_t) + corenet_tcp_sendrecv_generic_if(pegasus_t) + corenet_tcp_sendrecv_generic_node(pegasus_t) + corenet_tcp_sendrecv_all_ports(pegasus_t) + corenet_tcp_bind_generic_node(pegasus_t) +- +-corenet_sendrecv_pegasus_http_server_packets(pegasus_t) + corenet_tcp_bind_pegasus_http_port(pegasus_t) +- +-corenet_sendrecv_pegasus_https_server_packets(pegasus_t) + corenet_tcp_bind_pegasus_https_port(pegasus_t) +- +-corenet_sendrecv_pegasus_http_client_packets(pegasus_t) + corenet_tcp_connect_pegasus_http_port(pegasus_t) +- +-corenet_sendrecv_pegasus_https_client_packets(pegasus_t) + corenet_tcp_connect_pegasus_https_port(pegasus_t) +- +-corenet_sendrecv_generic_client_packets(pegasus_t) + corenet_tcp_connect_generic_port(pegasus_t) ++corenet_sendrecv_generic_client_packets(pegasus_t) ++corenet_sendrecv_pegasus_http_client_packets(pegasus_t) ++corenet_sendrecv_pegasus_http_server_packets(pegasus_t) ++corenet_sendrecv_pegasus_https_client_packets(pegasus_t) ++corenet_sendrecv_pegasus_https_server_packets(pegasus_t) + + corecmd_exec_bin(pegasus_t) + corecmd_exec_shell(pegasus_t) + + dev_rw_sysfs(pegasus_t) + dev_read_urand(pegasus_t) ++dev_rw_lvm_control(pegasus_t) + + fs_getattr_all_fs(pegasus_t) + fs_search_auto_mountpoints(pegasus_t) ++fs_mount_tracefs(pegasus_t) ++fs_unmount_tracefs(pegasus_t) + files_getattr_all_dirs(pegasus_t) + + auth_use_nsswitch(pegasus_t) + auth_domtrans_chk_passwd(pegasus_t) ++auth_read_shadow(pegasus_t) + + domain_use_interactive_fds(pegasus_t) + domain_read_all_domains_state(pegasus_t) ++domain_named_filetrans(pegasus_t) + + files_list_var_lib(pegasus_t) + files_read_var_lib_files(pegasus_t) +@@ -128,18 +444,29 @@ init_stream_connect_script(pegasus_t) + logging_send_audit_msgs(pegasus_t) + logging_send_syslog_msg(pegasus_t) + +-miscfiles_read_localization(pegasus_t) ++mount_domtrans(pegasus_t) ++ ++sysnet_read_config(pegasus_t) ++sysnet_domtrans_ifconfig(pegasus_t) + + userdom_dontaudit_use_unpriv_user_fds(pegasus_t) + userdom_dontaudit_search_user_home_dirs(pegasus_t) + + optional_policy(` +- dbus_system_bus_client(pegasus_t) +- dbus_connect_system_bus(pegasus_t) ++ dmidecode_domtrans(pegasus_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(pegasus_t) ++ dbus_connect_system_bus(pegasus_t) ++ ++ optional_policy(` ++ networkmanager_dbus_chat(pegasus_t) ++ ') ++') + +- optional_policy(` +- networkmanager_dbus_chat(pegasus_t) +- ') ++optional_policy(` ++ rhcs_stream_connect_cluster(pegasus_t) + ') + + optional_policy(` +@@ -151,16 +478,28 @@ optional_policy(` + ') + + optional_policy(` +- rpm_exec(pegasus_t) ++ lvm_exec(pegasus_t) + ') + + optional_policy(` +- samba_manage_config(pegasus_t) ++ ricci_stream_connect_modclusterd(pegasus_t) + ') + + optional_policy(` +- seutil_sigchld_newrole(pegasus_t) +- seutil_dontaudit_read_config(pegasus_t) ++ realmd_dbus_chat(pegasus_t) ++') ++ ++optional_policy(` ++ rpc_read_exports(pegasus_t) ++ rpc_read_nfs_state_data(pegasus_t) ++') ++ ++optional_policy(` ++ rpm_domtrans(pegasus_t) ++') ++ ++optional_policy(` ++ samba_manage_config(pegasus_t) + ') + + optional_policy(` +@@ -168,7 +507,7 @@ optional_policy(` + ') + + optional_policy(` +- sysnet_domtrans_ifconfig(pegasus_t) ++ seutil_sigchld_newrole(pegasus_t) + ') + + optional_policy(` +@@ -180,11 +519,16 @@ optional_policy(` + ') + + optional_policy(` ++ virt_getattr_images(pegasus_t) + virt_domtrans(pegasus_t) + virt_stream_connect(pegasus_t) + virt_manage_config(pegasus_t) + ') + ++optional_policy(` ++ qemu_getattr_exec(pegasus_t) ++') ++ + optional_policy(` + xen_stream_connect(pegasus_t) + xen_stream_connect_xenstore(pegasus_t) +diff --git a/pesign.fc b/pesign.fc +new file mode 100644 +index 0000000000..7b54c3926b +--- /dev/null ++++ b/pesign.fc +@@ -0,0 +1,6 @@ ++/usr/bin/pesign -- gen_context(system_u:object_r:pesign_exec_t,s0) ++ ++/usr/lib/systemd/system/pesign.service -- gen_context(system_u:object_r:pesign_unit_file_t,s0) ++ ++/var/run/pesign(/.*)? gen_context(system_u:object_r:pesign_var_run_t,s0) ++/var/run/pesign\.pid -- gen_context(system_u:object_r:pesign_var_run_t,s0) +diff --git a/pesign.if b/pesign.if +new file mode 100644 +index 0000000000..4d531cb9dc +--- /dev/null ++++ b/pesign.if +@@ -0,0 +1,99 @@ ++ ++## pesign utility for signing UEFI binaries as well as other associated tools ++ ++######################################## ++## ++## Execute TEMPLATE in the pesign domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pesign_domtrans',` ++ gen_require(` ++ type pesign_t, pesign_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, pesign_exec_t, pesign_t) ++') ++######################################## ++## ++## Read pesign PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pesign_read_pid_files',` ++ gen_require(` ++ type pesign_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, pesign_var_run_t, pesign_var_run_t) ++') ++ ++######################################## ++## ++## Execute pesign server in the pesign domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pesign_systemctl',` ++ gen_require(` ++ type pesign_t; ++ type pesign_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 pesign_unit_file_t:file read_file_perms; ++ allow $1 pesign_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, pesign_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an pesign environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`pesign_admin',` ++ gen_require(` ++ type pesign_t; ++ type pesign_var_run_t; ++ type pesign_unit_file_t; ++ ') ++ ++ allow $1 pesign_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, pesign_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, pesign_var_run_t) ++ ++ pesign_systemctl($1) ++ admin_pattern($1, pesign_unit_file_t) ++ allow $1 pesign_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/pesign.te b/pesign.te +new file mode 100644 +index 0000000000..55d7442b04 +--- /dev/null ++++ b/pesign.te +@@ -0,0 +1,54 @@ ++policy_module(pesign, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type pesign_t; ++type pesign_exec_t; ++init_daemon_domain(pesign_t, pesign_exec_t) ++ ++type pesign_var_run_t; ++files_pid_file(pesign_var_run_t) ++ ++type pesign_unit_file_t; ++systemd_unit_file(pesign_unit_file_t) ++ ++type pesign_tmp_t; ++files_tmp_file(pesign_tmp_t) ++ ++######################################## ++# ++# pesign local policy ++# ++ ++allow pesign_t self:capability { dac_read_search dac_override setgid setuid }; ++allow pesign_t self:process setsched; ++allow pesign_t self:fifo_file rw_fifo_file_perms; ++allow pesign_t self:unix_stream_socket create_stream_socket_perms; ++allow pesign_t self:netlink_kobject_uevent_socket create_socket_perms; ++ ++manage_dirs_pattern(pesign_t, pesign_var_run_t, pesign_var_run_t) ++manage_files_pattern(pesign_t, pesign_var_run_t, pesign_var_run_t) ++manage_lnk_files_pattern(pesign_t, pesign_var_run_t, pesign_var_run_t) ++manage_sock_files_pattern(pesign_t, pesign_var_run_t, pesign_var_run_t) ++files_pid_filetrans(pesign_t, pesign_var_run_t, { file dir }) ++ ++manage_dirs_pattern(pesign_t, pesign_tmp_t, pesign_tmp_t) ++manage_files_pattern(pesign_t, pesign_tmp_t, pesign_tmp_t) ++files_tmp_filetrans(pesign_t, pesign_tmp_t, { file dir }) ++ ++dev_read_urand(pesign_t) ++dev_read_rand(pesign_t) ++ ++files_dontaudit_list_tmp(pesign_t) ++ ++fs_getattr_all_fs(pesign_t) ++ ++auth_use_nsswitch(pesign_t) ++ ++logging_send_syslog_msg(pesign_t) ++ ++miscfiles_read_certs(pesign_t) ++miscfiles_read_localization(pesign_t) +diff --git a/pingd.if b/pingd.if +index 21a6ecbe79..b99e4cb0b5 100644 +--- a/pingd.if ++++ b/pingd.if +@@ -55,7 +55,8 @@ interface(`pingd_manage_config',` + ') + + files_search_etc($1) +- allow $1 pingd_etc_t:file manage_file_perms; ++ manage_dirs_pattern($1, pingd_etc_t, pingd_etc_t) ++ manage_files_pattern($1, pingd_etc_t, pingd_etc_t) + ') + + ####################################### +@@ -81,9 +82,13 @@ interface(`pingd_admin',` + type pingd_initrc_exec_t; + ') + +- allow $1 pingd_t:process { ptrace signal_perms }; ++ allow $1 pingd_t:process signal_perms; + ps_process_pattern($1, pingd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 pingd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, pingd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 pingd_initrc_exec_t system_r; +diff --git a/pingd.te b/pingd.te +index ab01060275..778c8eb12c 100644 +--- a/pingd.te ++++ b/pingd.te +@@ -10,7 +10,7 @@ type pingd_exec_t; + init_daemon_domain(pingd_t, pingd_exec_t) + + type pingd_etc_t; +-files_type(pingd_etc_t) ++files_config_file(pingd_etc_t) + + type pingd_initrc_exec_t; + init_script_file(pingd_initrc_exec_t) +@@ -45,10 +45,10 @@ corenet_tcp_bind_generic_node(pingd_t) + corenet_sendrecv_pingd_server_packets(pingd_t) + corenet_tcp_bind_pingd_port(pingd_t) + ++dev_read_urand(pingd_t) ++ + auth_use_nsswitch(pingd_t) + + files_search_usr(pingd_t) + + logging_send_syslog_msg(pingd_t) +- +-miscfiles_read_localization(pingd_t) +diff --git a/piranha.fc b/piranha.fc +new file mode 100644 +index 0000000000..20ea9f54b2 +--- /dev/null ++++ b/piranha.fc +@@ -0,0 +1,24 @@ ++ ++/etc/rc\.d/init\.d/pulse -- gen_context(system_u:object_r:piranha_pulse_initrc_exec_t,s0) ++ ++# RHEL6 ++#/etc/sysconfig/ha/lvs\.cf -- gen_context(system_u:object_r:piranha_etc_rw_t,s0) ++ ++/etc/piranha/lvs\.cf -- gen_context(system_u:object_r:piranha_etc_rw_t,s0) ++ ++/usr/sbin/fos -- gen_context(system_u:object_r:piranha_fos_exec_t,s0) ++/usr/sbin/lvsd -- gen_context(system_u:object_r:piranha_lvs_exec_t,s0) ++/usr/sbin/piranha_gui -- gen_context(system_u:object_r:piranha_web_exec_t,s0) ++/usr/sbin/pulse -- gen_context(system_u:object_r:piranha_pulse_exec_t,s0) ++ ++/var/lib/luci(/.*)? gen_context(system_u:object_r:piranha_web_data_t,s0) ++/var/lib/luci/cert(/.*)? gen_context(system_u:object_r:piranha_web_conf_t,s0) ++/var/lib/luci/etc(/.*)? gen_context(system_u:object_r:piranha_web_conf_t,s0) ++ ++/var/log/piranha(/.*)? gen_context(system_u:object_r:piranha_log_t,s0) ++ ++/var/run/fos\.pid -- gen_context(system_u:object_r:piranha_fos_var_run_t,s0) ++/var/run/lvs\.pid -- gen_context(system_u:object_r:piranha_lvs_var_run_t,s0) ++/var/run/piranha-httpd\.pid -- gen_context(system_u:object_r:piranha_web_var_run_t,s0) ++/var/run/pulse\.pid -- gen_context(system_u:object_r:piranha_pulse_var_run_t,s0) ++ +diff --git a/piranha.if b/piranha.if +new file mode 100644 +index 0000000000..cf54103b6a +--- /dev/null ++++ b/piranha.if +@@ -0,0 +1,187 @@ ++## policy for piranha ++ ++####################################### ++## ++## Creates types and rules for a basic ++## cluster init daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`piranha_domain_template',` ++ gen_require(` ++ attribute piranha_domain; ++ ') ++ ++ ############################## ++ # ++ # piranha_$1_t declarations ++ # ++ ++ type piranha_$1_t, piranha_domain; ++ type piranha_$1_exec_t; ++ init_daemon_domain(piranha_$1_t, piranha_$1_exec_t) ++ ++ # tmpfs files ++ type piranha_$1_tmpfs_t, piranha_tmpfs; ++ files_tmpfs_file(piranha_$1_tmpfs_t) ++ ++ # pid files ++ type piranha_$1_var_run_t; ++ files_pid_file(piranha_$1_var_run_t) ++ ++ ############################## ++ # ++ # piranha_$1_t local policy ++ # ++ ++ manage_dirs_pattern(piranha_$1_t, piranha_$1_tmpfs_t, piranha_$1_tmpfs_t) ++ manage_files_pattern(piranha_$1_t, piranha_$1_tmpfs_t, piranha_$1_tmpfs_t) ++ fs_tmpfs_filetrans(piranha_$1_t, piranha_$1_tmpfs_t, { dir file }) ++ ++ manage_files_pattern(piranha_$1_t, piranha_$1_var_run_t, piranha_$1_var_run_t) ++ manage_dirs_pattern(piranha_$1_t, piranha_$1_var_run_t, piranha_$1_var_run_t) ++ files_pid_filetrans(piranha_$1_t, piranha_$1_var_run_t, { dir file }) ++ ++ kernel_read_system_state(piranha_$1_t) ++ ++ auth_use_nsswitch(piranha_$1_t) ++ ++ logging_send_syslog_msg(piranha_$1_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run fos. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`piranha_domtrans_fos',` ++ gen_require(` ++ type piranha_fos_t, piranha_fos_exec_t; ++ ') ++ ++ domtrans_pattern($1, piranha_fos_exec_t, piranha_fos_t) ++') ++ ++####################################### ++## ++## Execute a domain transition to run lvsd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`piranha_domtrans_lvs',` ++ gen_require(` ++ type piranha_lvs_t, piranha_lvs_exec_t; ++ ') ++ ++ domtrans_pattern($1, piranha_lvs_exec_t, piranha_lvs_t) ++') ++ ++####################################### ++## ++## Execute a domain transition to run pulse. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`piranha_domtrans_pulse',` ++ gen_require(` ++ type piranha_pulse_t, piranha_pulse_exec_t; ++ ') ++ ++ domtrans_pattern($1, piranha_pulse_exec_t, piranha_pulse_t) ++') ++ ++####################################### ++## ++## Execute pulse server in the pulse domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`piranha_pulse_initrc_domtrans',` ++ gen_require(` ++ type piranha_pulse_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, piranha_pulse_initrc_exec_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read piranha's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`piranha_read_log',` ++ gen_require(` ++ type piranha_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, piranha_log_t, piranha_log_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to append ++## piranha log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`piranha_append_log',` ++ gen_require(` ++ type piranha_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, piranha_log_t, piranha_log_t) ++') ++ ++######################################## ++## ++## Allow domain to manage piranha log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`piranha_manage_log',` ++ gen_require(` ++ type piranha_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, piranha_log_t, piranha_log_t) ++ manage_files_pattern($1, piranha_log_t, piranha_log_t) ++ manage_lnk_files_pattern($1, piranha_log_t, piranha_log_t) ++') +diff --git a/piranha.te b/piranha.te +new file mode 100644 +index 0000000000..a989aea2e1 +--- /dev/null ++++ b/piranha.te +@@ -0,0 +1,292 @@ ++policy_module(piranha, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow piranha-lvs domain to connect to the network using TCP. ++##

      ++##
      ++gen_tunable(piranha_lvs_can_network_connect, false) ++ ++attribute piranha_domain; ++attribute piranha_tmpfs; ++ ++piranha_domain_template(fos) ++ ++piranha_domain_template(lvs) ++ ++piranha_domain_template(pulse) ++ ++type piranha_pulse_initrc_exec_t; ++init_script_file(piranha_pulse_initrc_exec_t) ++ ++piranha_domain_template(web) ++ ++type piranha_web_conf_t; ++files_config_file(piranha_web_conf_t) ++ ++type piranha_web_data_t; ++files_type(piranha_web_data_t) ++ ++type piranha_web_tmp_t; ++files_tmp_file(piranha_web_tmp_t) ++ ++type piranha_etc_rw_t; ++files_config_file(piranha_etc_rw_t) ++ ++type piranha_log_t; ++logging_log_file(piranha_log_t) ++ ++####################################### ++# ++# piranha-fos local policy ++# ++ ++kernel_read_kernel_sysctls(piranha_fos_t) ++ ++domain_read_all_domains_state(piranha_fos_t) ++ ++optional_policy(` ++ consoletype_exec(piranha_fos_t) ++') ++ ++# start and stop services ++init_domtrans_script(piranha_fos_t) ++ ++######################################## ++# ++# piranha-gui local policy ++# ++ ++allow piranha_web_t self:capability { setuid sys_nice kill setgid }; ++allow piranha_web_t self:process { getsched setsched signal signull }; ++ ++allow piranha_web_t self:rawip_socket create_socket_perms; ++allow piranha_web_t self:netlink_route_socket r_netlink_socket_perms; ++allow piranha_web_t self:sem create_sem_perms; ++allow piranha_web_t self:shm create_shm_perms; ++ ++manage_files_pattern(piranha_web_t, piranha_web_data_t, piranha_web_data_t) ++manage_dirs_pattern(piranha_web_t, piranha_web_data_t, piranha_web_data_t) ++files_var_lib_filetrans(piranha_web_t, piranha_web_data_t, file) ++ ++read_files_pattern(piranha_web_t, piranha_web_conf_t, piranha_web_conf_t) ++ ++rw_files_pattern(piranha_web_t, piranha_etc_rw_t, piranha_etc_rw_t) ++ ++manage_dirs_pattern(piranha_web_t, piranha_log_t, piranha_log_t) ++manage_files_pattern(piranha_web_t, piranha_log_t, piranha_log_t) ++logging_log_filetrans(piranha_web_t, piranha_log_t, { dir file }) ++ ++can_exec(piranha_web_t, piranha_web_tmp_t) ++manage_dirs_pattern(piranha_web_t, piranha_web_tmp_t, piranha_web_tmp_t) ++manage_files_pattern(piranha_web_t, piranha_web_tmp_t, piranha_web_tmp_t) ++files_tmp_filetrans(piranha_web_t, piranha_web_tmp_t, { file dir }) ++ ++piranha_pulse_initrc_domtrans(piranha_web_t) ++ ++kernel_read_kernel_sysctls(piranha_web_t) ++ ++corenet_tcp_bind_http_cache_port(piranha_web_t) ++corenet_tcp_bind_luci_port(piranha_web_t) ++corenet_tcp_bind_servistaitsm_port(piranha_web_t) ++corenet_tcp_connect_ricci_port(piranha_web_t) ++ ++dev_read_rand(piranha_web_t) ++dev_read_urand(piranha_web_t) ++ ++domain_read_all_domains_state(piranha_web_t) ++ ++ ++optional_policy(` ++ consoletype_exec(piranha_web_t) ++') ++ ++optional_policy(` ++ apache_read_config(piranha_web_t) ++ apache_exec_modules(piranha_web_t) ++ apache_exec(piranha_web_t) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(piranha_web_t) ++') ++ ++optional_policy(` ++ sasl_connect(piranha_web_t) ++') ++ ++optional_policy(` ++ snmp_dontaudit_read_snmp_var_lib_files(piranha_web_t) ++ snmp_dontaudit_write_snmp_var_lib_files(piranha_web_t) ++') ++ ++###################################### ++# ++# piranha-lvs local policy ++# ++ ++# neede by nanny ++allow piranha_lvs_t self:capability { net_raw sys_nice }; ++allow piranha_lvs_t self:process signal; ++allow piranha_lvs_t self:unix_dgram_socket create_socket_perms; ++allow piranha_lvs_t self:rawip_socket create_socket_perms; ++ ++manage_files_pattern(piranha_lvs_t, piranha_pulse_tmpfs_t,piranha_pulse_tmpfs_t) ++manage_dirs_pattern(piranha_lvs_t, piranha_pulse_tmpfs_t,piranha_pulse_tmpfs_t) ++ ++kernel_read_kernel_sysctls(piranha_lvs_t) ++ ++# needed by nanny ++corenet_tcp_connect_ftp_port(piranha_lvs_t) ++corenet_tcp_connect_http_port(piranha_lvs_t) ++corenet_tcp_connect_smtp_port(piranha_lvs_t) ++ ++sysnet_dns_name_resolve(piranha_lvs_t) ++ ++# needed by nanny ++tunable_policy(`piranha_lvs_can_network_connect',` ++ corenet_tcp_connect_all_ports(piranha_lvs_t) ++') ++ ++# needed by ipvsadm ++optional_policy(` ++ iptables_domtrans(piranha_lvs_t) ++') ++ ++####################################### ++# ++# piranha-pulse local policy ++# ++ ++allow piranha_pulse_t self:capability net_admin; ++ ++allow piranha_pulse_t self:packet_socket create_socket_perms; ++ ++# pulse starts fos and lvs daemon ++domtrans_pattern(piranha_pulse_t, piranha_fos_exec_t, piranha_fos_t) ++allow piranha_pulse_t piranha_fos_t:process signal; ++ ++domtrans_pattern(piranha_pulse_t, piranha_lvs_exec_t, piranha_lvs_t) ++allow piranha_pulse_t piranha_lvs_t:process signal; ++ ++kernel_read_kernel_sysctls(piranha_pulse_t) ++kernel_read_rpc_sysctls(piranha_pulse_t) ++kernel_rw_rpc_sysctls(piranha_pulse_t) ++kernel_search_debugfs(piranha_pulse_t) ++kernel_search_network_state(piranha_pulse_t) ++ ++corecmd_exec_bin(piranha_pulse_t) ++corecmd_exec_shell(piranha_pulse_t) ++optional_policy(` ++ consoletype_exec(piranha_pulse_t) ++') ++ ++corenet_udp_bind_apertus_ldp_port(piranha_pulse_t) ++corenet_udp_bind_cma_port(piranha_pulse_t) ++ ++domain_read_all_domains_state(piranha_pulse_t) ++domain_getattr_all_domains(piranha_pulse_t) ++ ++fs_getattr_all_fs(piranha_pulse_t) ++ ++init_initrc_domain(piranha_pulse_t) ++ ++logging_send_syslog_msg(piranha_pulse_t) ++ ++# various services to failover ++ ++optional_policy(` ++ apache_domtrans(piranha_pulse_t) ++ apache_signal(piranha_pulse_t) ++') ++ ++optional_policy(` ++ ftp_domtrans(piranha_pulse_t) ++ ftp_initrc_domtrans(piranha_pulse_t) ++ ftp_systemctl(piranha_pulse_t) ++') ++ ++optional_policy(` ++ hostname_exec(piranha_pulse_t) ++') ++ ++optional_policy(` ++ iptables_domtrans(piranha_pulse_t) ++') ++ ++optional_policy(` ++ ldap_systemctl(piranha_pulse_t) ++ ldap_initrc_domtrans(piranha_pulse_t) ++ ldap_domtrans(piranha_pulse_t) ++') ++ ++optional_policy(` ++ mysql_domtrans_mysql_safe(piranha_pulse_t) ++ mysql_stream_connect(piranha_pulse_t) ++') ++ ++optional_policy(` ++ netutils_domtrans(piranha_pulse_t) ++ netutils_domtrans_ping(piranha_pulse_t) ++') ++ ++optional_policy(` ++ postgresql_domtrans(piranha_pulse_t) ++ postgresql_signal(piranha_pulse_t) ++') ++ ++optional_policy(` ++ samba_initrc_domtrans(piranha_pulse_t) ++ samba_systemctl(piranha_pulse_t) ++ samba_domtrans_smbd(piranha_pulse_t) ++ samba_domtrans_nmbd(piranha_pulse_t) ++ samba_manage_var_files(piranha_pulse_t) ++ samba_rw_config(piranha_pulse_t) ++ samba_signal_smbd(piranha_pulse_t) ++ samba_signal_nmbd(piranha_pulse_t) ++') ++ ++optional_policy(` ++ sysnet_domtrans_ifconfig(piranha_pulse_t) ++') ++ ++optional_policy(` ++ udev_read_db(piranha_pulse_t) ++') ++ ++#################################### ++# ++# piranha domains common policy ++# ++ ++allow piranha_domain self:process signal_perms; ++allow piranha_domain self:fifo_file rw_fifo_file_perms; ++allow piranha_domain self:tcp_socket create_stream_socket_perms; ++allow piranha_domain self:udp_socket create_socket_perms; ++allow piranha_domain self:unix_stream_socket create_stream_socket_perms; ++ ++read_files_pattern(piranha_domain, piranha_etc_rw_t, piranha_etc_rw_t) ++ ++manage_files_pattern(piranha_pulse_t, piranha_tmpfs,piranha_tmpfs) ++manage_dirs_pattern(piranha_pulse_t, piranha_tmpfs ,piranha_tmpfs) ++ ++kernel_read_network_state(piranha_domain) ++ ++corenet_tcp_sendrecv_generic_if(piranha_domain) ++corenet_udp_sendrecv_generic_if(piranha_domain) ++corenet_tcp_sendrecv_generic_node(piranha_domain) ++corenet_udp_sendrecv_generic_node(piranha_domain) ++corenet_tcp_sendrecv_all_ports(piranha_domain) ++corenet_udp_sendrecv_all_ports(piranha_domain) ++corenet_tcp_bind_generic_node(piranha_domain) ++corenet_udp_bind_generic_node(piranha_domain) ++ ++corecmd_exec_bin(piranha_domain) ++corecmd_exec_shell(piranha_domain) ++ ++sysnet_read_config(piranha_domain) +diff --git a/pkcs.fc b/pkcs.fc +index 9a72226e38..b2968942f7 100644 +--- a/pkcs.fc ++++ b/pkcs.fc +@@ -4,4 +4,8 @@ + + /var/lib/opencryptoki(/.*)? gen_context(system_u:object_r:pkcs_slotd_var_lib_t,s0) + ++/var/log/opencryptoki(/.*)? gen_context(system_u:object_r:pkcs_slotd_log_t,s0) ++ ++/var/lock/opencryptoki(/.*)? gen_context(system_u:object_r:pkcs_slotd_lock_t,s0) ++ + /var/run/pkcsslotd.* gen_context(system_u:object_r:pkcs_slotd_var_run_t,s0) +diff --git a/pkcs.if b/pkcs.if +index 69be2aaf28..2d7b3f656c 100644 +--- a/pkcs.if ++++ b/pkcs.if +@@ -19,7 +19,7 @@ + # + interface(`pkcs_admin_slotd',` + gen_require(` +- type pkcs_slotd_t, pkcs_slotd_initrc_exec_t, pkcs_slotd_var_lib_t; ++ type pkcs_slotd_t, pkcs_slotd_initrc_exec_t, pkcs_slotd_var_lib_t, pkcs_slotd_lock_t; + type pkcs_slotd_var_run_t, pkcs_slotd_tmp_t, pkcs_slotd_tmpfs_t; + ') + +@@ -34,6 +34,9 @@ interface(`pkcs_admin_slotd',` + files_search_var_lib($1) + admin_pattern($1, pkcs_slotd_var_lib_t) + ++ files_search_locks($1) ++ admin_pattern($1, pkcs_slotd_lock_t) ++ + files_search_pids($1) + admin_pattern($1, pkcs_slotd_var_run_t) + +diff --git a/pkcs.te b/pkcs.te +index 8eb3f7bc1e..1b79ed4541 100644 +--- a/pkcs.te ++++ b/pkcs.te +@@ -7,21 +7,34 @@ policy_module(pkcs, 1.0.1) + + type pkcs_slotd_t; + type pkcs_slotd_exec_t; ++typealias pkcs_slotd_t alias pkcsslotd_t; ++typealias pkcs_slotd_exec_t alias pkcsslotd_exec_t; + init_daemon_domain(pkcs_slotd_t, pkcs_slotd_exec_t) + + type pkcs_slotd_initrc_exec_t; + init_script_file(pkcs_slotd_initrc_exec_t) + + type pkcs_slotd_var_lib_t; ++typealias pkcs_slotd_var_lib_t alias pkcsslotd_var_lib_t; + files_type(pkcs_slotd_var_lib_t) + ++type pkcs_slotd_lock_t; ++typealias pkcs_slotd_lock_t alias pkcsslotd_lock_t; ++files_lock_file(pkcs_slotd_lock_t) ++ ++type pkcs_slotd_log_t; ++logging_log_file(pkcs_slotd_log_t) ++ + type pkcs_slotd_var_run_t; ++typealias pkcs_slotd_var_run_t alias pkcsslotd_var_run_t; + files_pid_file(pkcs_slotd_var_run_t) + + type pkcs_slotd_tmp_t; ++typealias pkcs_slotd_tmp_t alias pkcsslotd_tmp_t; + files_tmp_file(pkcs_slotd_tmp_t) + + type pkcs_slotd_tmpfs_t; ++typealias pkcs_slotd_tmpfs_t alias pkcsslotd_tmpfs_t; + files_tmpfs_file(pkcs_slotd_tmpfs_t) + + ######################################## +@@ -40,6 +53,14 @@ manage_files_pattern(pkcs_slotd_t, pkcs_slotd_var_lib_t, pkcs_slotd_var_lib_t) + manage_lnk_files_pattern(pkcs_slotd_t, pkcs_slotd_var_lib_t, pkcs_slotd_var_lib_t) + files_var_lib_filetrans(pkcs_slotd_t, pkcs_slotd_var_lib_t, dir) + ++manage_files_pattern(pkcs_slotd_t, pkcs_slotd_lock_t, pkcs_slotd_lock_t) ++manage_dirs_pattern(pkcs_slotd_t, pkcs_slotd_lock_t, pkcs_slotd_lock_t) ++files_lock_filetrans(pkcs_slotd_t, pkcs_slotd_lock_t, dir) ++ ++manage_files_pattern(pkcs_slotd_t, pkcs_slotd_log_t, pkcs_slotd_log_t) ++manage_dirs_pattern(pkcs_slotd_t, pkcs_slotd_log_t, pkcs_slotd_log_t) ++logging_log_filetrans(pkcs_slotd_t, pkcs_slotd_log_t, dir) ++ + manage_dirs_pattern(pkcs_slotd_t, pkcs_slotd_var_run_t, pkcs_slotd_var_run_t) + manage_files_pattern(pkcs_slotd_t, pkcs_slotd_var_run_t, pkcs_slotd_var_run_t) + manage_sock_files_pattern(pkcs_slotd_t, pkcs_slotd_var_run_t, pkcs_slotd_var_run_t) +@@ -51,10 +72,13 @@ files_tmp_filetrans(pkcs_slotd_t, pkcs_slotd_tmp_t, dir) + + manage_dirs_pattern(pkcs_slotd_t, pkcs_slotd_tmpfs_t, pkcs_slotd_tmpfs_t) + manage_files_pattern(pkcs_slotd_t, pkcs_slotd_tmpfs_t, pkcs_slotd_tmpfs_t) +-fs_tmpfs_filetrans(pkcs_slotd_t, pkcs_slotd_tmpfs_t, dir) ++fs_tmpfs_filetrans(pkcs_slotd_t, pkcs_slotd_tmpfs_t, { file dir }) ++allow pkcs_slotd_t pkcs_slotd_tmpfs_t:file map; ++ ++auth_use_nsswitch(pkcs_slotd_t) + +-files_read_etc_files(pkcs_slotd_t) ++files_search_locks(pkcs_slotd_t) + + logging_send_syslog_msg(pkcs_slotd_t) + +-miscfiles_read_localization(pkcs_slotd_t) ++userdom_read_all_users_state(pkcs_slotd_t) +diff --git a/pki.fc b/pki.fc +new file mode 100644 +index 0000000000..47cd0f8ba9 +--- /dev/null ++++ b/pki.fc +@@ -0,0 +1,57 @@ ++/etc/pki/pki-tomcat(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/etc/pki/pki-tomcat/ca(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++/var/lib/pki/pki-tomcat(/.*)? gen_context(system_u:object_r:pki_tomcat_var_lib_t,s0) ++/var/run/pki/tomcat(/.*)? gen_context(system_u:object_r:pki_tomcat_var_run_t,s0) ++/var/log/pki/pki-tomcat(/.*)? gen_context(system_u:object_r:pki_tomcat_log_t,s0) ++/etc/sysconfig/pki/tomcat(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/var/log/pki(/.*)? gen_context(system_u:object_r:pki_log_t,s0) ++/usr/bin/pkidaemon gen_context(system_u:object_r:pki_tomcat_exec_t,s0) ++/etc/pki/pki-tomcat/alias(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++ ++/etc/pki-ra(/.*)? gen_context(system_u:object_r:pki_ra_etc_rw_t,s0) ++/var/lib/pki-ra(/.*)? gen_context(system_u:object_r:pki_ra_var_lib_t,s0) ++/var/log/pki-ra(/.*)? gen_context(system_u:object_r:pki_ra_log_t,s0) ++/var/run/pki/ra(/.*)? gen_context(system_u:object_r:pki_ra_var_run_t,s0) ++/etc/sysconfig/pki/ra(/.*)? gen_context(system_u:object_r:pki_ra_etc_rw_t,s0) ++/var/lib/pki-ra/pki-ra gen_context(system_u:object_r:pki_ra_exec_t,s0) ++ ++/etc/pki-tps(/.*)? gen_context(system_u:object_r:pki_tps_etc_rw_t,s0) ++/var/lib/pki-tps(/.*)? gen_context(system_u:object_r:pki_tps_var_lib_t,s0) ++/var/log/pki-tps(/.*)? gen_context(system_u:object_r:pki_tps_log_t,s0) ++/var/run/pki/tps(/.*)? gen_context(system_u:object_r:pki_tps_var_run_t,s0) ++/etc/sysconfig/pki/tps(/.*)? gen_context(system_u:object_r:pki_tps_etc_rw_t,s0) ++/var/lib/pki-tps/pki-tps gen_context(system_u:object_r:pki_tps_exec_t,s0) ++ ++# default labeling for nCipher ++/opt/nfast/scripts/init.d/(.*) gen_context(system_u:object_r:initrc_exec_t, s0) ++/opt/nfast/sbin/init.d-ncipher gen_context(system_u:object_r:initrc_exec_t, s0) ++/opt/nfast(/.*)? gen_context(system_u:object_r:pki_common_t, s0) ++/dev/nfast(/.*)? gen_context(system_u:object_r:pki_common_dev_t, s0) ++ ++# old paths (for migration) ++/etc/pki-ca(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/var/lib/pki-ca(/.*)? gen_context(system_u:object_r:pki_tomcat_var_lib_t,s0) ++/var/run/pki-ca.pid gen_context(system_u:object_r:pki_tomcat_var_run_t,s0) ++/var/log/pki-ca(/.*)? gen_context(system_u:object_r:pki_tomcat_log_t,s0) ++/var/lib/pki-ca/alias(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++/var/lib/ipa/pki-ca/publish(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++/etc/pki-kra(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/var/lib/pki-kra(/.*)? gen_context(system_u:object_r:pki_tomcat_var_lib_t,s0) ++/var/run/pki-kra.pid gen_context(system_u:object_r:pki_tomcat_var_run_t,s0) ++/var/log/pki-kra(/.*)? gen_context(system_u:object_r:pki_tomcat_log_t,s0) ++/var/lib/pki-kra/alias(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++/etc/pki-ocsp(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/var/lib/pki-ocsp(/.*)? gen_context(system_u:object_r:pki_tomcat_var_lib_t,s0) ++/var/run/pki-ocsp.pid gen_context(system_u:object_r:pki_tomcat_var_run_t,s0) ++/var/log/pki-ocsp(/.*)? gen_context(system_u:object_r:pki_tomcat_log_t,s0) ++/var/lib/pki-ocsp/alias(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++/etc/pki-tks(/.*)? gen_context(system_u:object_r:pki_tomcat_etc_rw_t,s0) ++/var/lib/pki-tks(/.*)? gen_context(system_u:object_r:pki_tomcat_var_lib_t,s0) ++/var/run/pki-tks.pid gen_context(system_u:object_r:pki_tomcat_var_run_t,s0) ++/var/log/pki-tks(/.*)? gen_context(system_u:object_r:pki_tomcat_log_t,s0) ++/var/lib/pki-tks/alias(/.*)? gen_context(system_u:object_r:pki_tomcat_cert_t,s0) ++ ++/var/lock/subsys/pkidaemon -- gen_context(system_u:object_r:pki_tomcat_lock_t,s0) ++ ++#/etc/systemd/system/pki-tomcatd\.target\.wants(/.*)? gen_context(system_u:object_r:pki_tomcat_unit_file_t,s0) ++/usr/lib/systemd/system/pki-tomcat.* gen_context(system_u:object_r:pki_tomcat_unit_file_t,s0) +diff --git a/pki.if b/pki.if +new file mode 100644 +index 0000000000..0a79513588 +--- /dev/null ++++ b/pki.if +@@ -0,0 +1,523 @@ ++ ++## policy for pki ++ ++######################################## ++## ++## Allow read and write pki cert files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_rw_tomcat_cert',` ++ gen_require(` ++ type pki_tomcat_cert_t; ++ type pki_tomcat_etc_rw_t; ++ ') ++ ++ allow $1 pki_tomcat_etc_rw_t:dir search_dir_perms; ++ rw_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++ create_lnk_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++') ++ ++######################################## ++## ++## Allow read and write pki cert files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_tomcat_cert',` ++ gen_require(` ++ type pki_tomcat_cert_t; ++ type pki_tomcat_etc_rw_t; ++ ') ++ ++ allow $1 pki_tomcat_etc_rw_t:dir manage_dir_perms; ++ manage_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++ manage_lnk_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++') ++ ++######################################## ++## ++## Allow read and write pki cert files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_tomcat_etc_rw',` ++ gen_require(` ++ type pki_tomcat_etc_rw_t; ++ ') ++ ++ manage_files_pattern($1, pki_tomcat_etc_rw_t, pki_tomcat_etc_rw_t) ++ manage_lnk_files_pattern($1, pki_tomcat_etc_rw_t, pki_tomcat_etc_rw_t) ++') ++ ++######################################## ++## ++## Allow domain to read pki cert files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_read_tomcat_cert',` ++ gen_require(` ++ type pki_tomcat_cert_t; ++ ') ++ ++ read_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++ read_lnk_files_pattern($1, pki_tomcat_cert_t, pki_tomcat_cert_t) ++') ++ ++######################################## ++## ++## Create a set of derived types for apache ++## web content. ++## ++## ++## ++## The prefix to be used for deriving type names. ++## ++## ++# ++template(`pki_apache_template',` ++ gen_require(` ++ attribute pki_apache_domain; ++ attribute pki_apache_config, pki_apache_var_lib, pki_apache_var_run; ++ attribute pki_apache_executable, pki_apache_script, pki_apache_var_log; ++ ') ++ ++ ######################################## ++ # ++ # Declarations ++ # ++ ++ type $1_t, pki_apache_domain; ++ type $1_exec_t, pki_apache_executable; ++ domain_type($1_t) ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ type $1_script_exec_t, pki_apache_script; ++ init_script_file($1_script_exec_t) ++ ++ type $1_etc_rw_t, pki_apache_config; ++ files_type($1_etc_rw_t) ++ ++ type $1_var_run_t, pki_apache_var_run; ++ files_pid_file($1_var_run_t) ++ ++ type $1_var_lib_t, pki_apache_var_lib; ++ files_type($1_var_lib_t) ++ ++ type $1_log_t, pki_apache_var_log; ++ logging_log_file($1_log_t) ++ ++ type $1_lock_t; ++ files_lock_file($1_lock_t) ++ ++ type $1_tmp_t; ++ files_tmpfs_file($1_tmp_t) ++ ++ ######################################## ++ # ++ # $1 local policy ++ # ++ ++ files_read_etc_files($1_t) ++ allow $1_t $1_etc_rw_t:lnk_file read; ++ ++ manage_dirs_pattern($1_t, $1_etc_rw_t, $1_etc_rw_t) ++ manage_files_pattern($1_t, $1_etc_rw_t, $1_etc_rw_t) ++ files_etc_filetrans($1_t,$1_etc_rw_t, { file dir }) ++ ++ manage_dirs_pattern($1_t, $1_var_run_t, $1_var_run_t) ++ manage_files_pattern($1_t, $1_var_run_t, $1_var_run_t) ++ files_pid_filetrans($1_t,$1_var_run_t, { file dir }) ++ ++ manage_dirs_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ manage_files_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ read_lnk_files_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ files_var_lib_filetrans($1_t, $1_var_lib_t, { file dir } ) ++ ++ manage_dirs_pattern($1_t, $1_log_t, $1_log_t) ++ manage_files_pattern($1_t, $1_log_t, $1_log_t) ++ logging_log_filetrans($1_t, $1_log_t, { file dir } ) ++ ++ manage_dirs_pattern($1_t, $1_lock_t, $1_lock_t) ++ manage_files_pattern($1_t, $1_lock_t, $1_lock_t) ++ manage_lnk_files_pattern($1_t, $1_lock_t, $1_lock_t) ++ files_lock_filetrans($1_t, $1_lock_t, { dir file lnk_file }) ++ ++ manage_files_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ manage_dirs_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ files_tmp_filetrans($1_t, $1_tmp_t, { file dir }) ++ ++ #talk to lunasa hsm ++ logging_send_syslog_msg($1_t) ++ ++ kernel_read_kernel_sysctls($1_t) ++ kernel_read_system_state($1_t) ++ ++ corenet_all_recvfrom_unlabeled($1_t) ++ ++ # need to resolve addresses? ++ auth_use_nsswitch($1_t) ++') ++ ++####################################### ++## ++## Send a null signal to pki apache domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_apache_domain_signal',` ++ gen_require(` ++ attribute pki_apache_domain; ++ ') ++ ++ allow $1 pki_apache_domain:process signal; ++') ++ ++####################################### ++## ++## Send a null signal to pki apache domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_apache_domain_signull',` ++ gen_require(` ++ attribute pki_apache_domain; ++ ') ++ ++ allow $1 pki_apache_domain:process signull; ++') ++ ++################################### ++## ++## Allow domain to read pki apache subsystem pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_apache_run',` ++ gen_require(` ++ attribute pki_apache_var_run; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, pki_apache_var_run, pki_apache_var_run) ++') ++ ++#################################### ++## ++## Allow domain to manage pki apache subsystem lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_apache_lib',` ++ gen_require(` ++ attribute pki_apache_var_lib; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, pki_apache_var_lib, pki_apache_var_lib) ++ manage_lnk_files_pattern($1, pki_apache_var_lib, pki_apache_var_lib) ++') ++ ++################################## ++## ++## Dontaudit domain to write pki log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_search_log_dirs',` ++ gen_require(` ++ type pki_log_t; ++ ') ++ ++ search_dirs_pattern($1, pki_log_t, pki_log_t) ++ ++') ++ ++################################## ++## ++## Dontaudit domain to write pki log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_dontaudit_write_log',` ++ gen_require(` ++ type pki_log_t; ++ ') ++ ++ dontaudit $1 pki_log_t:file write; ++') ++ ++################################### ++## ++## Allow domain to manage pki apache subsystem log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_apache_log_files',` ++ gen_require(` ++ attribute pki_apache_var_log; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, pki_apache_var_log, pki_apache_var_log) ++') ++ ++################################## ++## ++## Allow domain to manage pki apache subsystem config files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_apache_config_files',` ++ gen_require(` ++ attribute pki_apache_config; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, pki_apache_config, pki_apache_config) ++') ++ ++################################# ++## ++## Allow domain to read pki tomcat lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_read_tomcat_lib_files',` ++ gen_require(` ++ type pki_tomcat_var_lib_t; ++ ') ++ ++ read_files_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++ read_lnk_files_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++') ++ ++ ++################################# ++## ++## Allow domain to manage pki tomcat lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_tomcat_lib',` ++ gen_require(` ++ type pki_tomcat_var_lib_t; ++ ') ++ ++ manage_dirs_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++ manage_files_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++ manage_lnk_files_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++') ++ ++################################# ++## ++## Allow domain to manage pki tomcat lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_tomcat_log',` ++ gen_require(` ++ type pki_tomcat_log_t; ++ ') ++ ++ manage_dirs_pattern($1, pki_tomcat_log_t, pki_tomcat_log_t) ++ manage_files_pattern($1, pki_tomcat_log_t, pki_tomcat_log_t) ++') ++ ++################################# ++## ++## Allow domain to read pki tomcat lib dirs ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_read_tomcat_lib_dirs',` ++ gen_require(` ++ type pki_tomcat_var_lib_t; ++ ') ++ ++ list_dirs_pattern($1, pki_tomcat_var_lib_t, pki_tomcat_var_lib_t) ++') ++ ++######################################## ++## ++## Allow read pki_common_t files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_read_common_files',` ++ gen_require(` ++ type pki_common_t; ++ ') ++ ++ read_files_pattern($1, pki_common_t, pki_common_t) ++') ++ ++######################################## ++## ++## Allow execute pki_common_t files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_exec_common_files',` ++ gen_require(` ++ type pki_common_t; ++ ') ++ ++ exec_files_pattern($1, pki_common_t, pki_common_t) ++') ++ ++######################################## ++## ++## Allow read pki_common_t files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_common_files',` ++ gen_require(` ++ type pki_common_t; ++ ') ++ ++ manage_files_pattern($1, pki_common_t, pki_common_t) ++ manage_dirs_pattern($1, pki_common_t, pki_common_t) ++') ++ ++######################################## ++## ++## Connect to pki over an unix ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_stream_connect',` ++ gen_require(` ++ type pki_tomcat_t, pki_common_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, pki_common_t, pki_common_t, pki_tomcat_t) ++') ++ ++######################################## ++## ++## Execute pki in the pkit_tomcat_t domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`pki_tomcat_systemctl',` ++ gen_require(` ++ type pki_tomcat_t; ++ type pki_tomcat_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 pki_tomcat_unit_file_t:file read_file_perms; ++ allow $1 pki_tomcat_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, pki_tomcat_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## pki tomcat pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`pki_manage_tomcat_pid',` ++ gen_require(` ++ type pki_tomcat_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, pki_tomcat_var_run_t, pki_tomcat_var_run_t) ++') +diff --git a/pki.te b/pki.te +new file mode 100644 +index 0000000000..67e7036fbb +--- /dev/null ++++ b/pki.te +@@ -0,0 +1,285 @@ ++policy_module(pki,10.0.11) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute pki_apache_domain; ++attribute pki_apache_config; ++attribute pki_apache_executable; ++attribute pki_apache_var_lib; ++attribute pki_apache_var_log; ++attribute pki_apache_var_run; ++attribute pki_apache_pidfiles; ++attribute pki_apache_script; ++ ++type pki_log_t; ++logging_log_file(pki_log_t) ++ ++type pki_common_t; ++files_type(pki_common_t) ++ ++type pki_common_dev_t; ++files_type(pki_common_dev_t) ++ ++type pki_tomcat_etc_rw_t; ++files_type(pki_tomcat_etc_rw_t) ++ ++type pki_tomcat_cert_t; ++miscfiles_cert_type(pki_tomcat_cert_t) ++ ++tomcat_domain_template(pki_tomcat) ++domain_obj_id_change_exemption(pki_tomcat_t) ++ ++type pki_tomcat_unit_file_t; ++systemd_unit_file(pki_tomcat_unit_file_t) ++ ++type pki_tomcat_lock_t; ++files_lock_file(pki_tomcat_lock_t) ++ ++# old type aliases for migration ++typealias pki_tomcat_t alias { pki_ca_t pki_kra_t pki_ocsp_t pki_tks_t }; ++typealias pki_tomcat_etc_rw_t alias { pki_ca_etc_rw_t pki_kra_etc_rw_t pki_ocsp_etc_rw_t pki_tks_etc_rw_t }; ++typealias pki_tomcat_var_lib_t alias { pki_ca_var_lib_t pki_kra_var_lib_t pki_ocsp_var_lib_t pki_tks_var_lib_t }; ++typealias pki_tomcat_var_run_t alias { pki_ca_var_run_t pki_kra_var_run_t pki_ocsp_var_run_t pki_tks_var_run_t }; ++typealias pki_tomcat_log_t alias { pki_ca_log_t pki_kra_log_t pki_ocsp_log_t pki_tks_log_t }; ++ ++ ++# pki policy types ++type pki_tps_tomcat_exec_t; ++files_type(pki_tps_tomcat_exec_t) ++ ++pki_apache_template(pki_tps) ++ ++# ra policy types ++type pki_ra_tomcat_exec_t; ++files_type(pki_ra_tomcat_exec_t) ++ ++pki_apache_template(pki_ra) ++ ++# needed for dogtag 9 style instances ++type pki_tomcat_script_t; ++domain_type(pki_tomcat_script_t) ++role system_r types pki_tomcat_script_t; ++ ++optional_policy(` ++ unconfined_domain(pki_tomcat_script_t) ++') ++ ++######################################## ++# ++# pki-tomcat local policy ++# ++ ++allow pki_tomcat_t self:capability { setuid chown setgid fowner audit_write dac_read_search dac_override sys_nice fsetid }; ++dontaudit pki_tomcat_t self:capability net_admin; ++allow pki_tomcat_t self:process { signal setsched signull execmem setfscreate }; ++ ++allow pki_tomcat_t self:netlink_audit_socket { nlmsg_relay create }; ++allow pki_tomcat_t self:tcp_socket { accept listen }; ++ ++# allow writing to the kernel keyring ++allow pki_tomcat_t self:key { write read }; ++ ++manage_dirs_pattern(pki_tomcat_t, pki_tomcat_etc_rw_t, pki_tomcat_etc_rw_t) ++manage_files_pattern(pki_tomcat_t, pki_tomcat_etc_rw_t, pki_tomcat_etc_rw_t) ++manage_lnk_files_pattern(pki_tomcat_t, pki_tomcat_etc_rw_t, pki_tomcat_etc_rw_t) ++allow pki_tomcat_t pki_tomcat_etc_rw_t:file relabel_file_perms; ++ ++manage_dirs_pattern(pki_tomcat_t, pki_tomcat_cert_t, pki_tomcat_cert_t) ++manage_files_pattern(pki_tomcat_t, pki_tomcat_cert_t, pki_tomcat_cert_t) ++manage_lnk_files_pattern(pki_tomcat_t, pki_tomcat_cert_t, pki_tomcat_cert_t) ++ ++manage_dirs_pattern(pki_tomcat_t, pki_tomcat_lock_t, pki_tomcat_lock_t) ++manage_files_pattern(pki_tomcat_t, pki_tomcat_lock_t, pki_tomcat_lock_t) ++manage_lnk_files_pattern(pki_tomcat_t, pki_tomcat_lock_t, pki_tomcat_lock_t) ++files_lock_filetrans(pki_tomcat_t, pki_tomcat_lock_t, { dir file lnk_file }) ++ ++read_files_pattern(pki_tomcat_t, pki_tomcat_unit_file_t,pki_tomcat_unit_file_t) ++read_lnk_files_pattern(pki_tomcat_t, pki_tomcat_unit_file_t, pki_tomcat_unit_file_t) ++allow pki_tomcat_t pki_tomcat_unit_file_t:file setattr; ++allow pki_tomcat_t pki_tomcat_unit_file_t:lnk_file setattr; ++systemd_search_unit_dirs(pki_tomcat_t) ++ ++# allow java subsystems to talk to the ncipher hsm ++allow pki_tomcat_t pki_common_dev_t:sock_file write; ++allow pki_tomcat_t pki_common_dev_t:dir search; ++allow pki_tomcat_t pki_common_t:dir create_dir_perms; ++manage_files_pattern(pki_tomcat_t, pki_common_t, pki_common_t) ++can_exec(pki_tomcat_t, pki_common_t) ++init_stream_connect_script(pki_tomcat_t) ++ ++auth_use_nsswitch(pki_tomcat_t) ++ ++search_dirs_pattern(pki_tomcat_t, pki_log_t, pki_log_t) ++ ++kernel_read_kernel_sysctls(pki_tomcat_t) ++kernel_read_net_sysctls(pki_tomcat_t) ++ ++corenet_tcp_connect_http_cache_port(pki_tomcat_t) ++corenet_tcp_connect_ldap_port(pki_tomcat_t) ++corenet_tcp_connect_smtp_port(pki_tomcat_t) ++corenet_tcp_connect_pki_ca_port(pki_tomcat_t) ++ ++selinux_get_enforce_mode(pki_tomcat_t) ++ ++libs_exec_ldconfig(pki_tomcat_t) ++ ++logging_send_audit_msgs(pki_tomcat_t) ++ ++miscfiles_read_hwdata(pki_tomcat_t) ++ ++# is this really needed? ++userdom_manage_user_tmp_dirs(pki_tomcat_t) ++userdom_manage_user_tmp_files(pki_tomcat_t) ++ ++# for crl publishing ++allow pki_tomcat_t pki_tomcat_var_lib_t:lnk_file { rename create unlink }; ++ ++# for ECC ++auth_getattr_shadow(pki_tomcat_t) ++ ++optional_policy(` ++ consoletype_exec(pki_tomcat_t) ++') ++ ++optional_policy(` ++ dirsrv_manage_var_lib(pki_tomcat_t) ++') ++ ++optional_policy(` ++ hostname_exec(pki_tomcat_t) ++') ++ ++optional_policy(` ++ ipa_read_lib(pki_tomcat_t) ++') ++ ++####################################### ++# ++# tps local policy ++# ++ ++# used to serve cgi web pages under /var/lib/pki-tps, formatting, enrollment ++allow pki_tps_t pki_tps_var_lib_t:file {execute execute_no_trans}; ++ ++corenet_tcp_bind_pki_tps_port(pki_tps_t) ++# customer may run an ldap server on 389 ++corenet_tcp_connect_ldap_port(pki_tps_t) ++# connect to other subsystems ++corenet_tcp_connect_pki_ca_port(pki_tps_t) ++corenet_tcp_connect_pki_kra_port(pki_tps_t) ++corenet_tcp_connect_pki_tks_port(pki_tps_t) ++ ++files_exec_usr_files(pki_tps_t) ++ ++###################################### ++# ++# ra local policy ++# ++ ++# RA specific? talking to mysql? ++allow pki_ra_t self:udp_socket { write read create connect }; ++allow pki_ra_t self:unix_dgram_socket { write create connect }; ++ ++corenet_tcp_bind_pki_ra_port(pki_ra_t) ++# talk to other subsystems ++corenet_tcp_connect_http_port(pki_ra_t) ++corenet_tcp_connect_pki_ca_port(pki_ra_t) ++corenet_tcp_connect_smtp_port(pki_ra_t) ++ ++fs_getattr_xattr_fs(pki_ra_t) ++ ++files_search_spool(pki_ra_t) ++files_exec_usr_files(pki_ra_t) ++ ++optional_policy(` ++ mta_send_mail(pki_ra_t) ++ mta_manage_spool(pki_ra_t) ++ mta_manage_queue(pki_ra_t) ++ mta_read_config(pki_ra_t) ++') ++ ++##################################### ++# ++# pki_apache_domain local policy ++# ++ ++ ++allow pki_apache_domain self:capability { setuid sys_nice setgid dac_read_search dac_override fowner fsetid kill chown}; ++allow pki_apache_domain self:process { setsched signal getsched signull execstack execmem sigkill}; ++ ++allow pki_apache_domain self:sem all_sem_perms; ++allow pki_apache_domain self:tcp_socket create_stream_socket_perms; ++allow pki_apache_domain self:netlink_route_socket { write getattr read bind create nlmsg_read }; ++ ++# allow writing to the kernel keyring ++allow pki_apache_domain self:key { write read }; ++ ++## internal communication is often done using fifo and unix sockets. ++allow pki_apache_domain self:fifo_file rw_file_perms; ++allow pki_apache_domain self:unix_stream_socket create_stream_socket_perms; ++ ++# talk to the hsm ++allow pki_apache_domain pki_common_dev_t:sock_file write; ++allow pki_apache_domain pki_common_dev_t:dir search; ++allow pki_apache_domain pki_common_t:dir create_dir_perms; ++manage_files_pattern(pki_apache_domain, pki_common_t, pki_common_t) ++can_exec(pki_apache_domain, pki_common_t) ++init_stream_connect_script(pki_apache_domain) ++ ++corenet_sendrecv_unlabeled_packets(pki_apache_domain) ++corenet_tcp_bind_all_nodes(pki_apache_domain) ++corenet_tcp_sendrecv_all_if(pki_apache_domain) ++corenet_tcp_sendrecv_all_nodes(pki_apache_domain) ++corenet_tcp_sendrecv_all_ports(pki_apache_domain) ++#corenet_all_recvfrom_unlabeled(pki_apache_domain) ++corenet_tcp_connect_generic_port(pki_apache_domain) ++ ++# Init script handling ++domain_use_interactive_fds(pki_apache_domain) ++ ++seutil_exec_setfiles(pki_apache_domain) ++ ++init_dontaudit_write_utmp(pki_apache_domain) ++ ++libs_use_ld_so(pki_apache_domain) ++libs_use_shared_libs(pki_apache_domain) ++libs_exec_ld_so(pki_apache_domain) ++libs_exec_lib_files(pki_apache_domain) ++ ++fs_search_cgroup_dirs(pki_apache_domain) ++ ++corecmd_exec_bin(pki_apache_domain) ++corecmd_exec_shell(pki_apache_domain) ++ ++dev_read_urand(pki_apache_domain) ++dev_read_rand(pki_apache_domain) ++ ++# shutdown script uses ps ++domain_dontaudit_read_all_domains_state(pki_apache_domain) ++ps_process_pattern(pki_apache_domain, pki_apache_domain) ++ ++sysnet_read_config(pki_apache_domain) ++ ++ifdef(`targeted_policy',` ++ term_dontaudit_use_unallocated_ttys(pki_apache_domain) ++ term_dontaudit_use_generic_ptys(pki_apache_domain) ++') ++ ++optional_policy(` ++ # apache permissions ++ apache_exec_modules(pki_apache_domain) ++ apache_list_modules(pki_apache_domain) ++ apache_read_config(pki_apache_domain) ++ apache_exec(pki_apache_domain) ++ apache_exec_suexec(pki_apache_domain) ++ apache_entrypoint(pki_apache_domain) ++') ++ ++# allow rpm -q in init scripts ++optional_policy(` ++ rpm_exec(pki_apache_domain) ++') ++ +diff --git a/plymouthd.fc b/plymouthd.fc +index 735500fd14..7f694728c3 100644 +--- a/plymouthd.fc ++++ b/plymouthd.fc +@@ -1,15 +1,14 @@ +-/bin/plymouth -- gen_context(system_u:object_r:plymouth_exec_t,s0) ++/bin/plymouth -- gen_context(system_u:object_r:plymouth_exec_t,s0) + +-/sbin/plymouthd -- gen_context(system_u:object_r:plymouthd_exec_t,s0) ++/sbin/plymouthd -- gen_context(system_u:object_r:plymouthd_exec_t,s0) + +-/usr/bin/plymouth -- gen_context(system_u:object_r:plymouth_exec_t,s0) ++/usr/bin/plymouth -- gen_context(system_u:object_r:plymouth_exec_t,s0) + +-/usr/sbin/plymouthd -- gen_context(system_u:object_r:plymouthd_exec_t,s0) ++/var/lib/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_var_lib_t,s0) + +-/var/lib/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_var_lib_t,s0) ++/var/run/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_var_run_t,s0) ++/var/log/boot\.log.* gen_context(system_u:object_r:plymouthd_var_log_t,mls_systemhigh) + +-/var/log/boot\.log.* -- gen_context(system_u:object_r:plymouthd_var_log_t,mls_systemhigh) ++/usr/sbin/plymouthd -- gen_context(system_u:object_r:plymouthd_exec_t,s0) + +-/var/run/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_var_run_t,s0) +- +-/var/spool/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_spool_t,s0) ++/var/spool/plymouth(/.*)? gen_context(system_u:object_r:plymouthd_spool_t,s0) +diff --git a/plymouthd.if b/plymouthd.if +index 30e751f18b..61feb3a812 100644 +--- a/plymouthd.if ++++ b/plymouthd.if +@@ -1,4 +1,4 @@ +-## Plymouth graphical boot. ++## Plymouth graphical boot + + ######################################## + ## +@@ -10,18 +10,17 @@ + ## + ## + # +-interface(`plymouthd_domtrans',` ++interface(`plymouthd_domtrans', ` + gen_require(` + type plymouthd_t, plymouthd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, plymouthd_exec_t, plymouthd_t) + ') + + ######################################## + ## +-## Execute plymouthd in the caller domain. ++## Execute the plymoth daemon in the current domain + ## + ## + ## +@@ -29,19 +28,18 @@ interface(`plymouthd_domtrans',` + ## + ## + # +-interface(`plymouthd_exec',` ++interface(`plymouthd_exec', ` + gen_require(` + type plymouthd_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, plymouthd_exec_t) + ') + + ######################################## + ## +-## Connect to plymouthd using a unix +-## domain stream socket. ++## Allow domain to Stream socket connect ++## to Plymouth daemon. + ## + ## + ## +@@ -49,18 +47,17 @@ interface(`plymouthd_exec',` + ## + ## + # +-interface(`plymouthd_stream_connect',` ++interface(`plymouthd_stream_connect', ` + gen_require(` +- type plymouthd_t, plymouthd_spool_t; ++ type plymouthd_t; + ') + +- files_search_spool($1) +- stream_connect_pattern($1, plymouthd_spool_t, plymouthd_spool_t, plymouthd_t) ++ allow $1 plymouthd_t:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Execute plymouth in the caller domain. ++## Execute the plymoth command in the current domain + ## + ## + ## +@@ -68,18 +65,17 @@ interface(`plymouthd_stream_connect',` + ## + ## + # +-interface(`plymouthd_exec_plymouth',` ++interface(`plymouthd_exec_plymouth', ` + gen_require(` + type plymouth_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, plymouth_exec_t) + ') + + ######################################## + ## +-## Execute a domain transition to run plymouth. ++## Execute a domain transition to run plymouthd. + ## + ## + ## +@@ -87,12 +83,11 @@ interface(`plymouthd_exec_plymouth',` + ## + ## + # +-interface(`plymouthd_domtrans_plymouth',` ++interface(`plymouthd_domtrans_plymouth', ` + gen_require(` + type plymouth_t, plymouth_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, plymouth_exec_t, plymouth_t) + ') + +@@ -106,13 +101,13 @@ interface(`plymouthd_domtrans_plymouth',` + ##
      + ## + # +-interface(`plymouthd_search_spool',` ++interface(`plymouthd_search_spool', ` + gen_require(` + type plymouthd_spool_t; + ') + +- files_search_spool($1) + allow $1 plymouthd_spool_t:dir search_dir_perms; ++ files_search_spool($1) + ') + + ######################################## +@@ -145,7 +140,7 @@ interface(`plymouthd_read_spool_files',` + ##
      + ## + # +-interface(`plymouthd_manage_spool_files',` ++interface(`plymouthd_manage_spool_files', ` + gen_require(` + type plymouthd_spool_t; + ') +@@ -164,13 +159,13 @@ interface(`plymouthd_manage_spool_files',` + ##
      + ## + # +-interface(`plymouthd_search_lib',` ++interface(`plymouthd_search_lib', ` + gen_require(` + type plymouthd_var_lib_t; + ') + +- files_search_var_lib($1) + allow $1 plymouthd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## +@@ -183,7 +178,7 @@ interface(`plymouthd_search_lib',` + ##
      + ## + # +-interface(`plymouthd_read_lib_files',` ++interface(`plymouthd_read_lib_files', ` + gen_require(` + type plymouthd_var_lib_t; + ') +@@ -203,7 +198,7 @@ interface(`plymouthd_read_lib_files',` + ##
      + ## + # +-interface(`plymouthd_manage_lib_files',` ++interface(`plymouthd_manage_lib_files', ` + gen_require(` + type plymouthd_var_lib_t; + ') +@@ -214,7 +209,7 @@ interface(`plymouthd_manage_lib_files',` + + ######################################## + ## +-## Read plymouthd pid files. ++## Read plymouthd PID files. + ## + ## + ## +@@ -222,7 +217,7 @@ interface(`plymouthd_manage_lib_files',` + ## + ## + # +-interface(`plymouthd_read_pid_files',` ++interface(`plymouthd_read_pid_files', ` + gen_require(` + type plymouthd_var_run_t; + ') +@@ -233,36 +228,112 @@ interface(`plymouthd_read_pid_files',` + + ######################################## + ## +-## All of the rules required to +-## administrate an plymouthd environment. ++## Allow the specified domain to read ++## to plymouthd log files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`plymouthd_read_log',` ++ gen_require(` ++ type plymouthd_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, plymouthd_var_log_t, plymouthd_var_log_t) ++') ++ ++##################################### ++## ++## Allow the specified domain to create plymouthd's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`plymouthd_create_log',` ++ gen_require(` ++ type plymouthd_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ create_files_pattern($1, plymouthd_var_log_t, plymouthd_var_log_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to manage ++## to plymouthd log files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`plymouthd_admin',` ++interface(`plymouthd_manage_log',` ++ gen_require(` ++ type plymouthd_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, plymouthd_var_log_t, plymouthd_var_log_t) ++ manage_files_pattern($1, plymouthd_var_log_t, plymouthd_var_log_t) ++ read_lnk_files_pattern($1, plymouthd_var_log_t, plymouthd_var_log_t) ++') ++ ++####################################### ++## ++## Allow domain to create boot.log ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`plymouthd_filetrans_named_content',` ++ ++ gen_require(` ++ type plymouthd_var_log_t; ++ ') ++ ++ logging_log_named_filetrans($1, plymouthd_var_log_t, file, "boot.log") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an plymouthd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`plymouthd_admin', ` + gen_require(` + type plymouthd_t, plymouthd_spool_t, plymouthd_var_lib_t; + type plymouthd_var_run_t; + ') + +- allow $1 plymouthd_t:process { ptrace signal_perms }; +- read_files_pattern($1, plymouthd_t, plymouthd_t) ++ allow $1 plymouthd_t:process signal_perms; ++ ps_process_pattern($1, plymouthd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 plymouthd_t:process ptrace; ++ ') + +- files_search_spool($1) ++ files_list_var_lib($1) + admin_pattern($1, plymouthd_spool_t) + +- files_search_var_lib($1) + admin_pattern($1, plymouthd_var_lib_t) + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, plymouthd_var_run_t) + ') +diff --git a/plymouthd.te b/plymouthd.te +index 3078ce9055..39e5a88ee4 100644 +--- a/plymouthd.te ++++ b/plymouthd.te +@@ -15,7 +15,7 @@ type plymouthd_exec_t; + init_daemon_domain(plymouthd_t, plymouthd_exec_t) + + type plymouthd_spool_t; +-files_type(plymouthd_spool_t) ++files_spool_file(plymouthd_spool_t) + + type plymouthd_var_lib_t; + files_type(plymouthd_var_lib_t) +@@ -28,13 +28,14 @@ files_pid_file(plymouthd_var_run_t) + + ######################################## + # +-# Daemon local policy ++# Plymouthd private policy + # + + allow plymouthd_t self:capability { sys_admin sys_tty_config }; +-dontaudit plymouthd_t self:capability dac_override; + allow plymouthd_t self:capability2 block_suspend; ++dontaudit plymouthd_t self:capability{ dac_read_search dac_override }; + allow plymouthd_t self:process { signal getsched }; ++allow plymouthd_t self:netlink_kobject_uevent_socket create_socket_perms; + allow plymouthd_t self:fifo_file rw_fifo_file_perms; + allow plymouthd_t self:unix_stream_socket create_stream_socket_perms; + +@@ -48,9 +49,7 @@ manage_files_pattern(plymouthd_t, plymouthd_var_lib_t, plymouthd_var_lib_t) + files_var_lib_filetrans(plymouthd_t, plymouthd_var_lib_t, { file dir }) + + manage_dirs_pattern(plymouthd_t, plymouthd_var_log_t, plymouthd_var_log_t) +-append_files_pattern(plymouthd_t, plymouthd_var_log_t, plymouthd_var_log_t) +-create_files_pattern(plymouthd_t, plymouthd_var_log_t, plymouthd_var_log_t) +-setattr_files_pattern(plymouthd_t, plymouthd_var_log_t, plymouthd_var_log_t) ++manage_files_pattern(plymouthd_t, plymouthd_var_log_t, plymouthd_var_log_t) + logging_log_filetrans(plymouthd_t, plymouthd_var_log_t, { file dir }) + + manage_dirs_pattern(plymouthd_t, plymouthd_var_run_t, plymouthd_var_run_t) +@@ -65,24 +64,33 @@ dev_rw_dri(plymouthd_t) + dev_read_sysfs(plymouthd_t) + dev_read_framebuffer(plymouthd_t) + dev_write_framebuffer(plymouthd_t) ++dev_map_framebuffer(plymouthd_t) + + domain_use_interactive_fds(plymouthd_t) + + fs_getattr_all_fs(plymouthd_t) + +-files_read_etc_files(plymouthd_t) +-files_read_usr_files(plymouthd_t) +- + term_getattr_pty_fs(plymouthd_t) + term_use_all_terms(plymouthd_t) + term_use_ptmx(plymouthd_t) ++term_use_usb_ttys(plymouthd_t) ++ ++init_signal(plymouthd_t) ++ ++logging_link_generic_logs(plymouthd_t) ++logging_delete_generic_logs(plymouthd_t) ++ ++auth_use_nsswitch(plymouthd_t) + +-miscfiles_read_localization(plymouthd_t) + miscfiles_read_fonts(plymouthd_t) + miscfiles_manage_fonts_cache(plymouthd_t) + ++userdom_read_admin_home_files(plymouthd_t) ++ ++term_use_unallocated_ttys(plymouthd_t) ++ + optional_policy(` +- gnome_read_generic_home_content(plymouthd_t) ++ gnome_read_config(plymouthd_t) + ') + + optional_policy(` +@@ -90,35 +98,37 @@ optional_policy(` + ') + + optional_policy(` +- xserver_manage_xdm_spool_files(plymouthd_t) +- xserver_read_xdm_state(plymouthd_t) ++ udev_read_pid_files(plymouthd_t) ++') ++ ++optional_policy(` ++ xserver_xdm_manage_spool(plymouthd_t) ++ xserver_read_state_xdm(plymouthd_t) + ') + + ######################################## + # +-# Client local policy ++# Plymouth private policy + # + + allow plymouth_t self:process signal; +-allow plymouth_t self:fifo_file rw_fifo_file_perms; ++allow plymouth_t self:fifo_file rw_file_perms; + allow plymouth_t self:unix_stream_socket create_stream_socket_perms; + +-stream_connect_pattern(plymouth_t, plymouthd_spool_t, plymouthd_spool_t, plymouthd_t) +- + kernel_read_system_state(plymouth_t) + kernel_stream_connect(plymouth_t) + + domain_use_interactive_fds(plymouth_t) + +-files_read_etc_files(plymouth_t) + + term_use_ptmx(plymouth_t) + +-miscfiles_read_localization(plymouth_t) + + sysnet_read_config(plymouth_t) + +-ifdef(`hide_broken_symptoms',` ++plymouthd_stream_connect(plymouth_t) ++ ++ifdef(`hide_broken_symptoms', ` + optional_policy(` + hal_dontaudit_write_log(plymouth_t) + hal_dontaudit_rw_pipes(plymouth_t) +diff --git a/podsleuth.te b/podsleuth.te +index 9123f71529..232e28a758 100644 +--- a/podsleuth.te ++++ b/podsleuth.te +@@ -28,8 +28,9 @@ userdom_user_tmpfs_file(podsleuth_tmpfs_t) + # Local policy + # + +-allow podsleuth_t self:capability { kill dac_override sys_admin sys_rawio }; +-allow podsleuth_t self:process { ptrace signal signull getsched execheap execmem execstack }; ++allow podsleuth_t self:capability { kill dac_read_search dac_override sys_admin sys_rawio }; ++allow podsleuth_t self:process { signal signull getsched execheap execmem execstack }; ++ + allow podsleuth_t self:fifo_file rw_fifo_file_perms; + allow podsleuth_t self:unix_stream_socket create_stream_socket_perms; + allow podsleuth_t self:sem create_sem_perms; +@@ -65,7 +66,6 @@ corenet_tcp_sendrecv_http_port(podsleuth_t) + + dev_read_urand(podsleuth_t) + +-files_read_etc_files(podsleuth_t) + + fs_mount_dos_fs(podsleuth_t) + fs_unmount_dos_fs(podsleuth_t) +@@ -76,13 +76,11 @@ fs_getattr_tmpfs(podsleuth_t) + fs_list_tmpfs(podsleuth_t) + fs_rw_removable_blk_files(podsleuth_t) + +-miscfiles_read_localization(podsleuth_t) +- + sysnet_dns_name_resolve(podsleuth_t) + + userdom_signal_unpriv_users(podsleuth_t) + userdom_signull_unpriv_users(podsleuth_t) +-userdom_read_user_tmpfs_files(podsleuth_t) ++userdom_read_user_tmp_files(podsleuth_t) + + optional_policy(` + dbus_system_bus_client(podsleuth_t) +diff --git a/policykit.fc b/policykit.fc +index 1d76c7288a..93d09d92fa 100644 +--- a/policykit.fc ++++ b/policykit.fc +@@ -1,23 +1,22 @@ +-/usr/lib/polkit-1/polkitd -- gen_context(system_u:object_r:policykit_exec_t,s0) +-/usr/lib/polkit-1/polkit-agent-helper-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) +- +-/usr/lib/policykit/polkit-read-auth-helper -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) +-/usr/lib/policykit/polkit-grant-helper.* -- gen_context(system_u:object_r:policykit_grant_exec_t,s0) +-/usr/lib/policykit/polkit-resolve-exe-helper.* -- gen_context(system_u:object_r:policykit_resolve_exec_t,s0) +-/usr/lib/policykit/polkitd -- gen_context(system_u:object_r:policykit_exec_t,s0) +-/usr/lib/policykit-1/polkit-agent-helper-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) +-/usr/lib/policykit-1/polkitd -- gen_context(system_u:object_r:policykit_exec_t,s0) ++/usr/lib/policykit/polkit-read-auth-helper -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) ++/usr/bin/pkla-check-authorization -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) ++/usr/lib/policykit/polkit-grant-helper.* -- gen_context(system_u:object_r:policykit_grant_exec_t,s0) ++/usr/lib/policykit/polkit-resolve-exe-helper.* -- gen_context(system_u:object_r:policykit_resolve_exec_t,s0) ++/usr/lib/policykit/polkitd -- gen_context(system_u:object_r:policykit_exec_t,s0) ++/usr/lib/polkit-1/polkitd -- gen_context(system_u:object_r:policykit_exec_t,s0) + + /usr/libexec/polkit-read-auth-helper -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) + /usr/libexec/polkit-grant-helper.* -- gen_context(system_u:object_r:policykit_grant_exec_t,s0) +-/usr/libexec/polkit-resolve-exe-helper.* -- gen_context(system_u:object_r:policykit_resolve_exec_t,s0) +-/usr/libexec/polkitd.* -- gen_context(system_u:object_r:policykit_exec_t,s0) +-/usr/libexec/polkit-1/polkit-agent-helper-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) +-/usr/libexec/polkit-1/polkitd.* -- gen_context(system_u:object_r:policykit_exec_t,s0) ++/usr/libexec/polkit-resolve-exe-helper.* -- gen_context(system_u:object_r:policykit_resolve_exec_t,s0) ++/usr/libexec/polkitd.* -- gen_context(system_u:object_r:policykit_exec_t,s0) ++/usr/libexec/polkit-1/polkit-agent-helper-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) ++/usr/lib/polkit-1/polkit-agent-helper-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) ++/usr/libexec/kde4/polkit-kde-authentication-agent-1 -- gen_context(system_u:object_r:policykit_auth_exec_t,s0) ++/usr/libexec/polkit-1/polkitd.* -- gen_context(system_u:object_r:policykit_exec_t,s0) + +-/var/lib/misc/PolicyKit.reload gen_context(system_u:object_r:policykit_reload_t,s0) +-/var/lib/PolicyKit(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) +-/var/lib/polkit-1(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) +-/var/lib/PolicyKit-public(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) ++/var/lib/misc/PolicyKit.reload gen_context(system_u:object_r:policykit_reload_t,s0) ++/var/lib/PolicyKit(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) ++/var/lib/polkit-1(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) ++/var/lib/PolicyKit-public(/.*)? gen_context(system_u:object_r:policykit_var_lib_t,s0) ++/var/run/PolicyKit(/.*)? gen_context(system_u:object_r:policykit_var_run_t,s0) + +-/var/run/PolicyKit(/.*)? gen_context(system_u:object_r:policykit_var_run_t,s0) +diff --git a/policykit.if b/policykit.if +index 032a84d1c4..be00a65f17 100644 +--- a/policykit.if ++++ b/policykit.if +@@ -17,6 +17,8 @@ interface(`policykit_dbus_chat',` + class dbus send_msg; + ') + ++ ps_process_pattern(policykit_t, $1) ++ + allow $1 policykit_t:dbus send_msg; + allow policykit_t $1:dbus send_msg; + ') +@@ -24,7 +26,7 @@ interface(`policykit_dbus_chat',` + ######################################## + ## + ## Send and receive messages from +-## policykit auth over dbus. ++## policykit over dbus. + ## + ## + ## +@@ -38,6 +40,8 @@ interface(`policykit_dbus_chat_auth',` + class dbus send_msg; + ') + ++ ps_process_pattern(policykit_auth_t, $1) ++ + allow $1 policykit_auth_t:dbus send_msg; + allow policykit_auth_t $1:dbus send_msg; + ') +@@ -47,9 +51,9 @@ interface(`policykit_dbus_chat_auth',` + ## Execute a domain transition to run polkit_auth. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`policykit_domtrans_auth',` +@@ -57,15 +61,13 @@ interface(`policykit_domtrans_auth',` + type policykit_auth_t, policykit_auth_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, policykit_auth_exec_t, policykit_auth_t) + ') + + ######################################## + ## +-## Execute a policy_auth in the policy +-## auth domain, and allow the specified +-## role the policy auth domain. ++## Execute a policy_auth in the policy_auth domain, and ++## allow the specified role the policy_auth domain, + ## + ## + ## +@@ -77,24 +79,28 @@ interface(`policykit_domtrans_auth',` + ## Role allowed access. + ## + ## ++## + # + interface(`policykit_run_auth',` + gen_require(` +- attribute_role policykit_auth_roles; ++ type policykit_auth_t; + ') + + policykit_domtrans_auth($1) +- roleattribute $2 policykit_auth_roles; ++ role $2 types policykit_auth_t; ++ ++ allow $1 policykit_auth_t:process signal; ++ ps_process_pattern(policykit_auth_t, $1) + ') + + ######################################## + ## +-## Execute a domain transition to run polkit grant. ++## Execute a domain transition to run polkit_grant. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`policykit_domtrans_grant',` +@@ -102,15 +108,13 @@ interface(`policykit_domtrans_grant',` + type policykit_grant_t, policykit_grant_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, policykit_grant_exec_t, policykit_grant_t) + ') + + ######################################## + ## +-## Execute a policy_grant in the policy +-## grant domain, and allow the specified +-## role the policy grant domain. ++## Execute a policy_grant in the policy_grant domain, and ++## allow the specified role the policy_grant domain, + ## + ## + ## +@@ -126,16 +130,20 @@ interface(`policykit_domtrans_grant',` + # + interface(`policykit_run_grant',` + gen_require(` +- attribute_role policykit_grant_roles; ++ type policykit_grant_t; + ') + + policykit_domtrans_grant($1) +- roleattribute $2 policykit_grant_roles; ++ role $2 types policykit_grant_t; ++ ++ allow $1 policykit_grant_t:process signal; ++ ++ ps_process_pattern(policykit_grant_t, $1) + ') + + ######################################## + ## +-## Read policykit reload files. ++## read policykit reload files + ## + ## + ## +@@ -154,7 +162,7 @@ interface(`policykit_read_reload',` + + ######################################## + ## +-## Read and write policykit reload files. ++## rw policykit reload files + ## + ## + ## +@@ -173,12 +181,12 @@ interface(`policykit_rw_reload',` + + ######################################## + ## +-## Execute a domain transition to run polkit resolve. ++## Execute a domain transition to run polkit_resolve. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`policykit_domtrans_resolve',` +@@ -186,8 +194,9 @@ interface(`policykit_domtrans_resolve',` + type policykit_resolve_t, policykit_resolve_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, policykit_resolve_exec_t, policykit_resolve_t) ++ ++ ps_process_pattern(policykit_resolve_t, $1) + ') + + ######################################## +@@ -205,13 +214,13 @@ interface(`policykit_search_lib',` + type policykit_var_lib_t; + ') + +- files_search_var_lib($1) + allow $1 policykit_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## + ## +-## Read policykit lib files. ++## read policykit lib files + ## + ## + ## +@@ -226,4 +235,50 @@ interface(`policykit_read_lib',` + + files_search_var_lib($1) + read_files_pattern($1, policykit_var_lib_t, policykit_var_lib_t) ++ ++ optional_policy(` ++ # Broken placement ++ cron_read_system_job_lib_files($1) ++ ') ++') ++ ++####################################### ++## ++## The per role template for the policykit module. ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++template(`policykit_role',` ++ policykit_run_auth($2, $1) ++ policykit_run_grant($2, $1) ++ policykit_read_lib($2) ++ policykit_read_reload($2) ++ policykit_dbus_chat($2) ++') ++ ++######################################## ++## ++## Send generic signal to policy_auth ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`policykit_signal_auth',` ++ gen_require(` ++ type policykit_auth_t; ++ ') ++ ++ allow $1 policykit_auth_t:process signal; + ') +diff --git a/policykit.te b/policykit.te +index ee91778f72..5e92592f0b 100644 +--- a/policykit.te ++++ b/policykit.te +@@ -7,9 +7,6 @@ policy_module(policykit, 1.3.0) + + attribute policykit_domain; + +-attribute_role policykit_auth_roles; +-attribute_role policykit_grant_roles; +- + type policykit_t, policykit_domain; + type policykit_exec_t; + init_daemon_domain(policykit_t, policykit_exec_t) +@@ -17,12 +14,10 @@ init_daemon_domain(policykit_t, policykit_exec_t) + type policykit_auth_t, policykit_domain; + type policykit_auth_exec_t; + init_daemon_domain(policykit_auth_t, policykit_auth_exec_t) +-role policykit_auth_roles types policykit_auth_t; + + type policykit_grant_t, policykit_domain; + type policykit_grant_exec_t; + init_system_domain(policykit_grant_t, policykit_grant_exec_t) +-role policykit_grant_roles types policykit_grant_t; + + type policykit_resolve_t, policykit_domain; + type policykit_resolve_exec_t; +@@ -42,63 +37,74 @@ files_pid_file(policykit_var_run_t) + + ####################################### + # +-# Common policykit domain local policy ++# policykit_domain local policy + # + + allow policykit_domain self:process { execmem getattr }; + allow policykit_domain self:fifo_file rw_fifo_file_perms; + +-kernel_search_proc(policykit_domain) +- +-corecmd_exec_bin(policykit_domain) +- + dev_read_sysfs(policykit_domain) + +-files_read_usr_files(policykit_domain) +- +-logging_send_syslog_msg(policykit_domain) +- +-miscfiles_read_localization(policykit_domain) +- + ######################################## + # +-# Local policy ++# policykit local policy + # + + allow policykit_t self:capability { dac_override dac_read_search setgid setuid sys_nice sys_ptrace }; + allow policykit_t self:process { getsched setsched signal }; +-allow policykit_t self:unix_stream_socket { accept connectto listen }; ++allow policykit_t self:unix_dgram_socket create_socket_perms; ++allow policykit_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++policykit_domtrans_auth(policykit_t) ++allow policykit_t policykit_auth_exec_t:file map; ++ ++allow policykit_t policykit_auth_t:process signal; ++ ++can_exec(policykit_t, policykit_exec_t) ++corecmd_exec_bin(policykit_t) ++ ++dev_read_sysfs(policykit_t) + + rw_files_pattern(policykit_t, policykit_reload_t, policykit_reload_t) + ++policykit_domtrans_resolve(policykit_t) ++ + manage_files_pattern(policykit_t, policykit_var_lib_t, policykit_var_lib_t) + + manage_dirs_pattern(policykit_t, policykit_var_run_t, policykit_var_run_t) + manage_files_pattern(policykit_t, policykit_var_run_t, policykit_var_run_t) + files_pid_filetrans(policykit_t, policykit_var_run_t, { file dir }) + +-can_exec(policykit_t, policykit_exec_t) +- +-domtrans_pattern(policykit_t, policykit_auth_exec_t, policykit_auth_t) +-domtrans_pattern(policykit_t, policykit_resolve_exec_t, policykit_resolve_t) +- +-kernel_read_kernel_sysctls(policykit_t) + kernel_read_system_state(policykit_t) ++kernel_read_kernel_sysctls(policykit_t) + + domain_read_all_domains_state(policykit_t) + + files_dontaudit_search_all_mountpoints(policykit_t) + ++fs_getattr_all_fs(policykit_t) + fs_list_inotifyfs(policykit_t) ++fs_list_cgroup_dirs(policykit_t) + + auth_use_nsswitch(policykit_t) + ++init_list_pid_dirs(policykit_t) ++ ++logging_send_syslog_msg(policykit_t) ++ ++systemd_machined_read_pid_files(policykit_t) ++ + userdom_getattr_all_users(policykit_t) + userdom_read_all_users_state(policykit_t) ++userdom_dontaudit_search_admin_dir(policykit_t) + + optional_policy(` + dbus_system_domain(policykit_t, policykit_exec_t) + ++ init_dbus_chat(policykit_t) ++ ++ sysnet_dbus_chat_dhcpc(policykit_t) ++ + optional_policy(` + consolekit_dbus_chat(policykit_t) + ') +@@ -109,29 +115,43 @@ optional_policy(` + ') + + optional_policy(` ++ consolekit_list_pid_files(policykit_t) + consolekit_read_pid_files(policykit_t) + ') + + optional_policy(` +- gnome_read_generic_home_content(policykit_t) ++ kerberos_tmp_filetrans_host_rcache(policykit_t, "host_0") ++ kerberos_manage_host_rcache(policykit_t) + ') + + optional_policy(` +- kerberos_manage_host_rcache(policykit_t) +- kerberos_tmp_filetrans_host_rcache(policykit_t, file, "host_0") ++ gnome_read_config(policykit_t) ++') ++ ++optional_policy(` ++ systemd_read_logind_sessions_files(policykit_t) ++ systemd_login_list_pid_dirs(policykit_t) ++ systemd_login_read_pid_files(policykit_t) + ') + + ######################################## + # +-# Auth local policy ++# polkit_auth local policy + # + +-allow policykit_auth_t self:capability { ipc_lock setgid setuid sys_nice }; ++allow policykit_auth_t self:capability { sys_nice ipc_lock setgid setuid }; + dontaudit policykit_auth_t self:capability sys_tty_config; +-allow policykit_auth_t self:process { getsched setsched signal }; +-allow policykit_auth_t self:unix_stream_socket { accept listen }; ++allow policykit_auth_t self:process { setsched getsched signal }; + +-ps_process_pattern(policykit_auth_t, policykit_domain) ++allow policykit_auth_t self:unix_dgram_socket create_socket_perms; ++allow policykit_auth_t self:unix_stream_socket create_stream_socket_perms; ++ ++policykit_dbus_chat(policykit_auth_t) ++ ++kernel_read_system_state(policykit_auth_t) ++ ++can_exec(policykit_auth_t, policykit_auth_exec_t) ++corecmd_exec_bin(policykit_auth_t) + + rw_files_pattern(policykit_auth_t, policykit_reload_t, policykit_reload_t) + +@@ -145,65 +165,80 @@ manage_dirs_pattern(policykit_auth_t, policykit_var_run_t, policykit_var_run_t) + manage_files_pattern(policykit_auth_t, policykit_var_run_t, policykit_var_run_t) + files_pid_filetrans(policykit_auth_t, policykit_var_run_t, { file dir }) + +-can_exec(policykit_auth_t, policykit_auth_exec_t) +- +-kernel_read_system_state(policykit_auth_t) + kernel_dontaudit_search_kernel_sysctl(policykit_auth_t) + + dev_read_video_dev(policykit_auth_t) + + files_read_etc_runtime_files(policykit_auth_t) + files_search_home(policykit_auth_t) ++files_dontaudit_access_check_home_dir(policykit_auth_t) + + fs_getattr_all_fs(policykit_auth_t) + fs_search_tmpfs(policykit_auth_t) ++fs_dontaudit_append_ecryptfs_files(policykit_auth_t) + + auth_rw_var_auth(policykit_auth_t) + auth_use_nsswitch(policykit_auth_t) + auth_domtrans_chk_passwd(policykit_auth_t) + ++logging_send_syslog_msg(policykit_auth_t) ++ + miscfiles_read_fonts(policykit_auth_t) + miscfiles_setattr_fonts_cache_dirs(policykit_auth_t) + + userdom_dontaudit_read_user_home_content_files(policykit_auth_t) ++userdom_dontaudit_write_user_tmp_files(policykit_auth_t) ++userdom_dontaudit_access_check_user_content(policykit_auth_t) ++userdom_read_admin_home_files(policykit_auth_t) + + optional_policy(` +- dbus_system_domain(policykit_auth_t, policykit_auth_exec_t) +- dbus_all_session_bus_client(policykit_auth_t) ++ dbus_system_domain( policykit_auth_t, policykit_auth_exec_t) ++ dbus_session_bus_client(policykit_auth_t) + + optional_policy(` + consolekit_dbus_chat(policykit_auth_t) + ') ++') + +- optional_policy(` +- policykit_dbus_chat(policykit_auth_t) +- ') ++optional_policy(` ++ gnome_read_config(policykit_auth_t) ++ gnome_access_check_usr_config(policykit_auth_t) + ') + + optional_policy(` ++ kernel_search_proc(policykit_auth_t) + hal_read_state(policykit_auth_t) + ') + + optional_policy(` +- kerberos_manage_host_rcache(policykit_auth_t) +- kerberos_tmp_filetrans_host_rcache(policykit_auth_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(policykit_auth_t, "host_0") ++ kerberos_manage_host_rcache(policykit_auth_t) + ') + + optional_policy(` + xserver_stream_connect(policykit_auth_t) ++ xserver_xdm_append_log(policykit_auth_t) + xserver_read_xdm_pid(policykit_auth_t) ++ xserver_search_xdm_lib(policykit_auth_t) ++ xserver_create_xdm_tmp_sockets(policykit_auth_t) + ') + + ######################################## + # +-# Grant local policy ++# polkit_grant local policy + # + + allow policykit_grant_t self:capability setuid; ++ + allow policykit_grant_t self:unix_dgram_socket create_socket_perms; + allow policykit_grant_t self:unix_stream_socket create_stream_socket_perms; + +-ps_process_pattern(policykit_grant_t, policykit_domain) ++policykit_domtrans_auth(policykit_grant_t) ++ ++policykit_domtrans_resolve(policykit_grant_t) ++ ++can_exec(policykit_grant_t, policykit_grant_exec_t) ++corecmd_search_bin(policykit_grant_t) + + rw_files_pattern(policykit_grant_t, policykit_reload_t, policykit_reload_t) + +@@ -211,23 +246,20 @@ manage_files_pattern(policykit_grant_t, policykit_var_run_t, policykit_var_run_t + + manage_files_pattern(policykit_grant_t, policykit_var_lib_t, policykit_var_lib_t) + +-can_exec(policykit_grant_t, policykit_grant_exec_t) +- +-domtrans_pattern(policykit_grant_t, policykit_auth_exec_t, policykit_auth_t) +-domtrans_pattern(policykit_grant_t, policykit_resolve_exec_t, policykit_resolve_t) + + auth_domtrans_chk_passwd(policykit_grant_t) + auth_use_nsswitch(policykit_grant_t) + ++logging_send_syslog_msg(policykit_grant_t) ++ + userdom_read_all_users_state(policykit_grant_t) + + optional_policy(` + cron_manage_system_job_lib_files(policykit_grant_t) + ') + +-optional_policy(` ++ optional_policy(` + dbus_system_bus_client(policykit_grant_t) +- + optional_policy(` + consolekit_dbus_chat(policykit_grant_t) + ') +@@ -235,26 +267,28 @@ optional_policy(` + + ######################################## + # +-# Resolve local policy ++# polkit_resolve local policy + # + + allow policykit_resolve_t self:capability { setuid sys_nice }; +-allow policykit_resolve_t self:unix_stream_socket { accept listen }; + +-ps_process_pattern(policykit_resolve_t, policykit_domain) ++allow policykit_resolve_t self:unix_dgram_socket create_socket_perms; ++allow policykit_resolve_t self:unix_stream_socket create_stream_socket_perms; ++ ++policykit_domtrans_auth(policykit_resolve_t) + + read_files_pattern(policykit_resolve_t, policykit_reload_t, policykit_reload_t) + + read_files_pattern(policykit_resolve_t, policykit_var_lib_t, policykit_var_lib_t) + + can_exec(policykit_resolve_t, policykit_resolve_exec_t) ++corecmd_search_bin(policykit_resolve_t) + +-domtrans_pattern(policykit_resolve_t, policykit_auth_exec_t, policykit_auth_t) +- +-mcs_ptrace_all(policykit_resolve_t) + + auth_use_nsswitch(policykit_resolve_t) + ++logging_send_syslog_msg(policykit_resolve_t) ++ + userdom_read_all_users_state(policykit_resolve_t) + + optional_policy(` +@@ -266,6 +300,6 @@ optional_policy(` + ') + + optional_policy(` ++ kernel_search_proc(policykit_resolve_t) + hal_read_state(policykit_resolve_t) + ') +- +diff --git a/polipo.fc b/polipo.fc +index d35614b78a..11f77ee326 100644 +--- a/polipo.fc ++++ b/polipo.fc +@@ -1,15 +1,16 @@ +-HOME_DIR/\.forbidden -- gen_context(system_u:object_r:polipo_config_home_t,s0) + HOME_DIR/\.polipo -- gen_context(system_u:object_r:polipo_config_home_t,s0) + HOME_DIR/\.polipo-cache(/.*)? gen_context(system_u:object_r:polipo_cache_home_t,s0) + +-/etc/polipo(/.*)? gen_context(system_u:object_r:polipo_conf_t,s0) ++/etc/polipo(/.*)? gen_context(system_u:object_r:polipo_etc_t,s0) + + /etc/rc\.d/init\.d/polipo -- gen_context(system_u:object_r:polipo_initrc_exec_t,s0) + ++/usr/lib/systemd/system/polipo.* -- gen_context(system_u:object_r:polipo_unit_file_t,s0) ++ + /usr/bin/polipo -- gen_context(system_u:object_r:polipo_exec_t,s0) + + /var/cache/polipo(/.*)? gen_context(system_u:object_r:polipo_cache_t,s0) + + /var/log/polipo.* -- gen_context(system_u:object_r:polipo_log_t,s0) + +-/var/run/polipo(/.*)? gen_context(system_u:object_r:polipo_var_run_t,s0) ++/var/run/polipo(/.*)? gen_context(system_u:object_r:polipo_pid_t,s0) +diff --git a/polipo.if b/polipo.if +index ae27bb7fec..10a778780c 100644 +--- a/polipo.if ++++ b/polipo.if +@@ -1,8 +1,8 @@ +-## Lightweight forwarding and caching proxy server. ++## Caching web proxy. + + ######################################## + ## +-## Role access for Polipo session. ++## Role access for polipo session. + ## + ## + ## +@@ -11,14 +11,13 @@ + ## + ## + ## +-## User domain for the role. ++## Domain allowed access. + ## + ## + # + template(`polipo_role',` + gen_require(` +- type polipo_session_t, polipo_exec_t, polipo_config_home_t; +- type polipo_cache_home_t; ++ type polipo_session_t, polipo_exec_t; + ') + + ######################################## +@@ -33,15 +32,11 @@ template(`polipo_role',` + # Policy + # + +- allow $2 polipo_cache_home_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { polipo_cache_home_t polipo_config_home_t }:file { manage_file_perms relabel_file_perms }; +- +- userdom_user_home_dir_filetrans($2, polipo_config_home_t, file, ".forbidden") +- userdom_user_home_dir_filetrans($2, polipo_config_home_t, file, ".polipo") +- userdom_user_home_dir_filetrans($2, polipo_cache_home_t, dir, ".polipo-cache") +- +- allow $2 polipo_session_t:process { ptrace signal_perms }; ++ allow $2 polipo_session_t:process signal_perms; + ps_process_pattern($2, polipo_session_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 polipo_session_t:process ptrace; ++ ') + + tunable_policy(`polipo_session_users',` + domtrans_pattern($2, polipo_exec_t, polipo_session_t) +@@ -52,57 +47,130 @@ template(`polipo_role',` + + ######################################## + ## +-## Execute Polipo in the Polipo +-## system domain. ++## Create configuration files in user ++## home directories with a named file ++## type transition. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`polipo_initrc_domtrans',` ++interface(`polipo_named_filetrans_config_home_files',` + gen_require(` +- type polipo_initrc_exec_t; ++ type polipo_config_home_t; + ') + +- init_labeled_script_domtrans($1, polipo_initrc_exec_t) ++ userdom_user_home_dir_filetrans($1, polipo_config_home_t, file, ".polipo") ++') ++ ++######################################## ++## ++## Create cache directories in user ++## home directories with a named file ++## type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`polipo_named_filetrans_cache_home_dirs',` ++ gen_require(` ++ type polipo_cache_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, polipo_cache_home_t, dir, ".polipo-cache") + ') + + ######################################## + ## +-## Create specified objects in generic +-## log directories with the polipo +-## log file type. ++## Create configuration files in admin ++## home directories with a named file ++## type transition. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`polipo_named_filetrans_admin_config_home_files',` ++ gen_require(` ++ type polipo_config_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, polipo_config_home_t, file, ".polipo") ++') ++ ++######################################## ++## ++## Create cache directories in admin ++## home directories with a named file ++## type transition. ++## ++## + ## +-## Class of the object being created. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`polipo_named_filetrans_admin_cache_home_dirs',` ++ gen_require(` ++ type polipo_cache_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, polipo_cache_home_t, dir, ".polipo-cache") ++') ++ ++######################################## ++## ++## Create log files with a named file ++## type transition. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## + # +-interface(`polipo_log_filetrans_log',` ++interface(`polipo_named_filetrans_log_files',` + gen_require(` + type polipo_log_t; + ') + +- logging_log_filetrans($1, polipo_log_t, $2, $3) ++ logging_log_named_filetrans($1, polipo_log_t, file, "polipo") ++') ++ ++######################################## ++## ++## Execute polipo server in the polipo domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`polipo_systemctl',` ++ gen_require(` ++ type polipo_t; ++ type polipo_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 polipo_unit_file_t:file read_file_perms; ++ allow $1 polipo_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, polipo_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an polipo environment. ++## Administrate an polipo environment. + ## + ## + ## +@@ -118,27 +186,35 @@ interface(`polipo_log_filetrans_log',` + # + interface(`polipo_admin',` + gen_require(` +- type polipo_system_t, polipo_initrc_exec_t, polipo_cache_t; +- type polipo_conf_t, polipo_log_t, polipo_var_run_t; ++ type polipo_t, polipo_pid_t, polipo_cache_t; ++ type polipo_etc_t, polipo_log_t, polipo_initrc_exec_t; ++ type polipo_unit_file_t; + ') + +- allow $1 polipo_system_t:process { ptrace signal_perms }; +- ps_process_pattern($1, polipo_system_t) ++ allow $1 polipo_t:process signal_perms; ++ ps_process_pattern($1, polipo_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 polipo_t:process ptrace; ++ ') + +- polipo_initrc_domtrans($1) ++ init_labeled_script_domtrans($1, polipo_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 polipo_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_var($1) +- admin_pattern($1, polipo_cache_t) +- +- files_search_etc($1) +- admin_pattern($1, polipo_conf_t) ++ files_list_etc($1) ++ admin_pattern($1, polipo_etc_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, polipo_log_t) + +- files_search_pids($1) +- admin_pattern($1, polipo_var_run_t) ++ files_list_var($1) ++ admin_pattern($1, polipo_cache_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, polipo_pid_t) ++ ++ polipo_systemctl($1) ++ admin_pattern($1, polipo_unit_file_t) ++ allow $1 polipo_unit_file_t:service all_service_perms; + ') +diff --git a/polipo.te b/polipo.te +index 9764bfef85..8870de7133 100644 +--- a/polipo.te ++++ b/polipo.te +@@ -7,19 +7,27 @@ policy_module(polipo, 1.1.1) + + ## + ##

      +-## Determine whether Polipo system +-## daemon can access CIFS file systems. ++## Determine whether polipo can ++## access cifs file systems. + ##

      + ##
      +-gen_tunable(polipo_system_use_cifs, false) ++gen_tunable(polipo_use_cifs, false) + + ## + ##

      +-## Determine whether Polipo system +-## daemon can access NFS file systems. ++## Determine whether Polipo can ++## access nfs file systems. + ##

      + ##
      +-gen_tunable(polipo_system_use_nfs, false) ++gen_tunable(polipo_use_nfs, false) ++ ++## ++##

      ++## Determine whether Polipo session daemon ++## can bind tcp sockets to all unreserved ports. ++##

      ++##
      ++gen_tunable(polipo_session_bind_all_unreserved_ports, false) + + ## + ##

      +@@ -31,24 +39,23 @@ gen_tunable(polipo_system_use_nfs, false) + gen_tunable(polipo_session_users, false) + + ## +-##

      +-## Determine whether Polipo session daemon +-## can send syslog messages. +-##

      ++##

      ++## Allow polipo to connect to all ports > 1023 ++##

      + ##
      +-gen_tunable(polipo_session_send_syslog_msg, false) ++gen_tunable(polipo_connect_all_unreserved, false) + + attribute polipo_daemon; + +-type polipo_system_t, polipo_daemon; ++type polipo_t, polipo_daemon; + type polipo_exec_t; +-init_daemon_domain(polipo_system_t, polipo_exec_t) ++init_daemon_domain(polipo_t, polipo_exec_t) + + type polipo_initrc_exec_t; + init_script_file(polipo_initrc_exec_t) + +-type polipo_conf_t; +-files_config_file(polipo_conf_t) ++type polipo_etc_t; ++files_config_file(polipo_etc_t) + + type polipo_cache_t; + files_type(polipo_cache_t) +@@ -56,116 +63,104 @@ files_type(polipo_cache_t) + type polipo_log_t; + logging_log_file(polipo_log_t) + +-type polipo_var_run_t; +-files_pid_file(polipo_var_run_t) ++type polipo_pid_t; ++files_pid_file(polipo_pid_t) + + type polipo_session_t, polipo_daemon; +-userdom_user_application_domain(polipo_session_t, polipo_exec_t) ++application_domain(polipo_session_t, polipo_exec_t) ++ubac_constrained(polipo_session_t) ++ ++type polipo_config_home_t; ++userdom_user_home_content(polipo_config_home_t) + + type polipo_cache_home_t; + userdom_user_home_content(polipo_cache_home_t) + +-type polipo_config_home_t; +-userdom_user_home_content(polipo_config_home_t) ++type polipo_unit_file_t; ++systemd_unit_file(polipo_unit_file_t) + + ######################################## + # +-# Session local policy ++# Global local policy + # + +-allow polipo_session_t polipo_config_home_t:file read_file_perms; +- +-manage_dirs_pattern(polipo_session_t, polipo_cache_home_t, polipo_cache_home_t) +-manage_files_pattern(polipo_session_t, polipo_cache_home_t, polipo_cache_home_t) +-userdom_user_home_dir_filetrans(polipo_session_t, polipo_cache_home_t, dir, ".polipo-cache") +- +-auth_use_nsswitch(polipo_session_t) +- +-userdom_use_user_terminals(polipo_session_t) ++allow polipo_daemon self:fifo_file rw_fifo_file_perms; ++allow polipo_daemon self:tcp_socket { listen accept }; + +-tunable_policy(`polipo_session_send_syslog_msg',` +- logging_send_syslog_msg(polipo_session_t) +-') ++corenet_tcp_bind_generic_node(polipo_daemon) ++corenet_tcp_sendrecv_generic_if(polipo_daemon) ++corenet_tcp_sendrecv_generic_node(polipo_daemon) ++corenet_tcp_sendrecv_http_cache_port(polipo_daemon) ++corenet_tcp_bind_http_cache_port(polipo_daemon) ++corenet_sendrecv_http_cache_server_packets(polipo_daemon) ++corenet_tcp_connect_http_port(polipo_daemon) ++corenet_tcp_connect_http_cache_port(polipo_daemon) ++corenet_tcp_connect_tor_port(polipo_daemon) ++corenet_tcp_connect_flash_port(polipo_daemon) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(polipo_session_t) +-',` +- fs_dontaudit_read_nfs_files(polipo_session_t) +-') ++fs_search_auto_mountpoints(polipo_daemon) + +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(polipo_session_t) +-',` +- fs_dontaudit_read_cifs_files(polipo_session_t) +-') + + ######################################## + # +-# System local policy ++# Polipo local policy + # + +-read_files_pattern(polipo_system_t, polipo_conf_t, polipo_conf_t) ++read_files_pattern(polipo_t, polipo_etc_t, polipo_etc_t) + +-manage_files_pattern(polipo_system_t, polipo_cache_t, polipo_cache_t) +-manage_dirs_pattern(polipo_system_t, polipo_cache_t, polipo_cache_t) +-files_var_filetrans(polipo_system_t, polipo_cache_t, dir) ++manage_files_pattern(polipo_t, polipo_cache_t, polipo_cache_t) ++manage_dirs_pattern(polipo_t, polipo_cache_t, polipo_cache_t) ++files_var_filetrans(polipo_t, polipo_cache_t, dir) + +-append_files_pattern(polipo_system_t, polipo_log_t, polipo_log_t) +-create_files_pattern(polipo_system_t, polipo_log_t, polipo_log_t) +-setattr_files_pattern(polipo_system_t, polipo_log_t, polipo_log_t) +-logging_log_filetrans(polipo_system_t, polipo_log_t, file) ++manage_files_pattern(polipo_t, polipo_log_t, polipo_log_t) ++logging_log_filetrans(polipo_t, polipo_log_t, file) + +-manage_files_pattern(polipo_system_t, polipo_var_run_t, polipo_var_run_t) +-files_pid_filetrans(polipo_system_t, polipo_var_run_t, file) ++manage_files_pattern(polipo_t, polipo_pid_t, polipo_pid_t) ++files_pid_filetrans(polipo_t, polipo_pid_t, file) + +-auth_use_nsswitch(polipo_system_t) ++auth_use_nsswitch(polipo_t) + +-logging_send_syslog_msg(polipo_system_t) ++logging_send_syslog_msg(polipo_t) + + optional_policy(` +- cron_system_entry(polipo_system_t, polipo_exec_t) ++ cron_system_entry(polipo_t, polipo_exec_t) ++') ++ ++tunable_policy(`polipo_connect_all_unreserved',` ++ corenet_tcp_connect_all_unreserved_ports(polipo_t) + ') + +-tunable_policy(`polipo_system_use_cifs',` +- fs_manage_cifs_files(polipo_system_t) +-',` +- fs_dontaudit_read_cifs_files(polipo_system_t) ++tunable_policy(`polipo_use_cifs',` ++ fs_manage_cifs_files(polipo_t) + ') + +-tunable_policy(`polipo_system_use_nfs',` +- fs_manage_nfs_files(polipo_system_t) +-',` +- fs_dontaudit_read_nfs_files(polipo_system_t) ++tunable_policy(`polipo_use_nfs',` ++ fs_manage_nfs_files(polipo_t) + ') + + ######################################## + # +-# Polipo global local policy ++# Polipo session local policy + # + +-allow polipo_daemon self:fifo_file rw_fifo_file_perms; +-allow polipo_daemon self:tcp_socket { listen accept }; +- +-corenet_all_recvfrom_unlabeled(polipo_daemon) +-corenet_all_recvfrom_netlabel(polipo_daemon) +-corenet_tcp_sendrecv_generic_if(polipo_daemon) +-corenet_tcp_sendrecv_generic_node(polipo_daemon) +-corenet_tcp_bind_generic_node(polipo_daemon) ++read_files_pattern(polipo_session_t, polipo_config_home_t, polipo_config_home_t) ++manage_files_pattern(polipo_session_t, polipo_cache_home_t, polipo_cache_home_t) + +-corenet_sendrecv_http_client_packets(polipo_daemon) +-corenet_tcp_sendrecv_http_port(polipo_daemon) +-corenet_tcp_connect_http_port(polipo_daemon) ++auth_use_nsswitch(polipo_session_t) + +-corenet_sendrecv_http_cache_server_packets(polipo_daemon) +-corenet_tcp_sendrecv_http_cache_port(polipo_daemon) +-corenet_tcp_bind_http_cache_port(polipo_daemon) ++userdom_use_user_terminals(polipo_session_t) + + corenet_sendrecv_tor_client_packets(polipo_daemon) + corenet_tcp_sendrecv_tor_port(polipo_daemon) + corenet_tcp_connect_tor_port(polipo_daemon) ++corenet_tcp_connect_all_ephemeral_ports(polipo_daemon) + +-files_read_usr_files(polipo_daemon) ++logging_send_syslog_msg(polipo_session_t) + +-fs_search_auto_mountpoints(polipo_daemon) ++userdom_home_manager(polipo_session_t) ++ ++tunable_policy(`polipo_session_bind_all_unreserved_ports',` ++ corenet_tcp_sendrecv_all_ports(polipo_session_t) ++ corenet_tcp_bind_all_unreserved_ports(polipo_session_t) ++') + +-miscfiles_read_localization(polipo_daemon) +diff --git a/portage.if b/portage.if +index 67e8c12c49..058c994812 100644 +--- a/portage.if ++++ b/portage.if +@@ -67,9 +67,10 @@ interface(`portage_compile_domain',` + class dbus send_msg; + type portage_devpts_t, portage_log_t, portage_srcrepo_t, portage_tmp_t; + type portage_tmpfs_t; ++ type portage_sandbox_t; + ') + +- allow $1 self:capability { fowner fsetid mknod setgid setuid chown dac_override net_raw }; ++ allow $1 self:capability { fowner fsetid mknod setgid setuid chown dac_read_search dac_override net_raw }; + dontaudit $1 self:capability sys_chroot; + allow $1 self:process { setpgid setsched setrlimit signal_perms execmem setfscreate }; + allow $1 self:process ~{ ptrace setcurrent setexec setrlimit execmem execstack execheap }; +diff --git a/portage.te b/portage.te +index b410c67c19..f1ec41d393 100644 +--- a/portage.te ++++ b/portage.te +@@ -108,7 +108,6 @@ domain_use_interactive_fds(gcc_config_t) + + files_manage_etc_files(gcc_config_t) + files_rw_etc_runtime_files(gcc_config_t) +-files_read_usr_files(gcc_config_t) + files_search_var_lib(gcc_config_t) + files_search_pids(gcc_config_t) + # complains loudly about not being able to list +@@ -239,7 +238,7 @@ dontaudit portage_t device_type:blk_file read_blk_file_perms; + # + + allow portage_fetch_t self:process signal; +-allow portage_fetch_t self:capability { dac_override fowner fsetid chown }; ++allow portage_fetch_t self:capability { dac_read_search dac_override fowner fsetid chown }; + allow portage_fetch_t self:fifo_file rw_fifo_file_perms; + allow portage_fetch_t self:tcp_socket { accept listen }; + allow portage_fetch_t self:unix_stream_socket create_socket_perms; +@@ -291,7 +290,6 @@ dev_dontaudit_read_rand(portage_fetch_t) + domain_use_interactive_fds(portage_fetch_t) + + files_read_etc_runtime_files(portage_fetch_t) +-files_read_usr_files(portage_fetch_t) + files_dontaudit_search_pids(portage_fetch_t) + + fs_search_auto_mountpoints(portage_fetch_t) +diff --git a/portmap.fc b/portmap.fc +index cd45831ca8..69406ee171 100644 +--- a/portmap.fc ++++ b/portmap.fc +@@ -4,9 +4,14 @@ + /sbin/pmap_set -- gen_context(system_u:object_r:portmap_helper_exec_t,s0) + /sbin/portmap -- gen_context(system_u:object_r:portmap_exec_t,s0) + ++ifdef(`distro_debian',` ++/sbin/pmap_dump -- gen_context(system_u:object_r:portmap_helper_exec_t,s0) ++/sbin/pmap_set -- gen_context(system_u:object_r:portmap_helper_exec_t,s0) ++', ` + /usr/sbin/pmap_dump -- gen_context(system_u:object_r:portmap_helper_exec_t,s0) + /usr/sbin/pmap_set -- gen_context(system_u:object_r:portmap_helper_exec_t,s0) + /usr/sbin/portmap -- gen_context(system_u:object_r:portmap_exec_t,s0) ++') + + /var/run/portmap\.upgrade-state -- gen_context(system_u:object_r:portmap_var_run_t,s0) + /var/run/portmap_mapping -- gen_context(system_u:object_r:portmap_var_run_t,s0) +diff --git a/portmap.te b/portmap.te +index 18b255e7a4..e75c4ec240 100644 +--- a/portmap.te ++++ b/portmap.te +@@ -45,7 +45,6 @@ files_pid_filetrans(portmap_t, portmap_var_run_t, file) + kernel_read_system_state(portmap_t) + kernel_read_kernel_sysctls(portmap_t) + +-corenet_all_recvfrom_unlabeled(portmap_t) + corenet_all_recvfrom_netlabel(portmap_t) + corenet_tcp_sendrecv_generic_if(portmap_t) + corenet_udp_sendrecv_generic_if(portmap_t) +@@ -80,9 +79,11 @@ fs_search_auto_mountpoints(portmap_t) + + domain_use_interactive_fds(portmap_t) + ++auth_use_nsswitch(portmap_t) ++ + logging_send_syslog_msg(portmap_t) + +-miscfiles_read_localization(portmap_t) ++sysnet_read_config(portmap_t) + + userdom_dontaudit_use_unpriv_user_fds(portmap_t) + userdom_dontaudit_search_user_home_dirs(portmap_t) +@@ -106,7 +107,6 @@ allow portmap_helper_t self:tcp_socket { accept listen }; + allow portmap_helper_t portmap_var_run_t:file manage_file_perms; + files_pid_filetrans(portmap_helper_t, portmap_var_run_t, file) + +-corenet_all_recvfrom_unlabeled(portmap_helper_t) + corenet_all_recvfrom_netlabel(portmap_helper_t) + corenet_tcp_sendrecv_generic_if(portmap_helper_t) + corenet_udp_sendrecv_generic_if(portmap_helper_t) +@@ -138,5 +138,7 @@ init_rw_utmp(portmap_helper_t) + + logging_send_syslog_msg(portmap_helper_t) + +-userdom_use_user_terminals(portmap_helper_t) ++sysnet_read_config(portmap_helper_t) ++ ++userdom_use_inherited_user_terminals(portmap_helper_t) + userdom_dontaudit_use_all_users_fds(portmap_helper_t) +diff --git a/portreserve.fc b/portreserve.fc +index 1b2b4f908f..575b7d69bf 100644 +--- a/portreserve.fc ++++ b/portreserve.fc +@@ -1,6 +1,6 @@ + /etc/portreserve(/.*)? gen_context(system_u:object_r:portreserve_etc_t,s0) + +-/etc/rc\.d/init\.d/portreserve -- gen_context(system_u:object_r:portreserve_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/portreserve -- gen_context(system_u:object_r:portreserve_initrc_exec_t,s0) + + /sbin/portreserve -- gen_context(system_u:object_r:portreserve_exec_t,s0) + +diff --git a/portreserve.if b/portreserve.if +index 5ad5291544..7f1ae2a784 100644 +--- a/portreserve.if ++++ b/portreserve.if +@@ -105,8 +105,11 @@ interface(`portreserve_admin',` + type portreserve_initrc_exec_t; + ') + +- allow $1 portreserve_t:process { ptrace signal_perms }; ++ allow $1 portreserve_t:process signal_perms; + ps_process_pattern($1, portreserve_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 portreserve_t:process ptrace; ++ ') + + portreserve_initrc_domtrans($1) + domain_system_change_exemption($1) +diff --git a/portreserve.te b/portreserve.te +index 00b01e2ea2..10b45127a5 100644 +--- a/portreserve.te ++++ b/portreserve.te +@@ -41,7 +41,6 @@ files_pid_filetrans(portreserve_t, portreserve_var_run_t, { file sock_file dir } + + corecmd_getattr_bin_files(portreserve_t) + +-corenet_all_recvfrom_unlabeled(portreserve_t) + corenet_all_recvfrom_netlabel(portreserve_t) + corenet_tcp_sendrecv_generic_if(portreserve_t) + corenet_udp_sendrecv_generic_if(portreserve_t) +@@ -56,6 +55,7 @@ corenet_sendrecv_all_server_packets(portreserve_t) + corenet_tcp_bind_all_ports(portreserve_t) + corenet_udp_bind_all_ports(portreserve_t) + +-files_read_etc_files(portreserve_t) +- + userdom_dontaudit_search_user_home_content(portreserve_t) ++ ++auth_use_nsswitch(portreserve_t) ++ +diff --git a/portslave.te b/portslave.te +index cbe36c1d0b..8ebeb87d25 100644 +--- a/portslave.te ++++ b/portslave.te +@@ -48,7 +48,6 @@ kernel_read_kernel_sysctls(portslave_t) + corecmd_exec_bin(portslave_t) + corecmd_exec_shell(portslave_t) + +-corenet_all_recvfrom_unlabeled(portslave_t) + corenet_all_recvfrom_netlabel(portslave_t) + corenet_tcp_sendrecv_generic_if(portslave_t) + corenet_udp_sendrecv_generic_if(portslave_t) +@@ -72,7 +71,7 @@ fs_getattr_xattr_fs(portslave_t) + + term_use_unallocated_ttys(portslave_t) + term_setattr_unallocated_ttys(portslave_t) +-term_use_all_ttys(portslave_t) ++term_use_all_inherited_ttys(portslave_t) + term_search_ptys(portslave_t) + + auth_domtrans_chk_passwd(portslave_t) +diff --git a/postfix.fc b/postfix.fc +index c0e878537c..3070aa0669 100644 +--- a/postfix.fc ++++ b/postfix.fc +@@ -1,38 +1,38 @@ +-/etc/postfix.* gen_context(system_u:object_r:postfix_etc_t,s0) +-/etc/postfix/postfix-script.* -- gen_context(system_u:object_r:postfix_exec_t,s0) +-/etc/postfix/prng_exch -- gen_context(system_u:object_r:postfix_prng_t,s0) +- +-/etc/rc\.d/init\.d/postfix -- gen_context(system_u:object_r:postfix_initrc_exec_t,s0) +- ++# postfix ++/etc/rc\.d/init\.d/postfix -- gen_context(system_u:object_r:postfix_initrc_exec_t,s0) ++/etc/postfix.* gen_context(system_u:object_r:postfix_etc_t,s0) ++ifdef(`distro_redhat', ` ++/usr/libexec/postfix/.* -- gen_context(system_u:object_r:postfix_exec_t,s0) ++/usr/libexec/postfix/cleanup -- gen_context(system_u:object_r:postfix_cleanup_exec_t,s0) ++/usr/libexec/postfix/lmtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) ++/usr/libexec/postfix/local -- gen_context(system_u:object_r:postfix_local_exec_t,s0) ++/usr/libexec/postfix/master -- gen_context(system_u:object_r:postfix_master_exec_t,s0) ++/usr/libexec/postfix/pickup -- gen_context(system_u:object_r:postfix_pickup_exec_t,s0) ++/usr/libexec/postfix/(n)?qmgr -- gen_context(system_u:object_r:postfix_qmgr_exec_t,s0) ++/usr/libexec/postfix/showq -- gen_context(system_u:object_r:postfix_showq_exec_t,s0) ++/usr/libexec/postfix/smtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) ++/usr/libexec/postfix/scache -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) ++/usr/libexec/postfix/smtpd -- gen_context(system_u:object_r:postfix_smtpd_exec_t,s0) ++/usr/libexec/postfix/bounce -- gen_context(system_u:object_r:postfix_bounce_exec_t,s0) ++/usr/libexec/postfix/pipe -- gen_context(system_u:object_r:postfix_pipe_exec_t,s0) ++/usr/libexec/postfix/virtual -- gen_context(system_u:object_r:postfix_virtual_exec_t,s0) ++', ` + /usr/lib/postfix/.* -- gen_context(system_u:object_r:postfix_exec_t,s0) +-/usr/lib/postfix/cleanup -- gen_context(system_u:object_r:postfix_cleanup_exec_t,s0) ++/usr/lib/postfix/cleanup -- gen_context(system_u:object_r:postfix_cleanup_exec_t,s0) + /usr/lib/postfix/local -- gen_context(system_u:object_r:postfix_local_exec_t,s0) + /usr/lib/postfix/master -- gen_context(system_u:object_r:postfix_master_exec_t,s0) + /usr/lib/postfix/pickup -- gen_context(system_u:object_r:postfix_pickup_exec_t,s0) +-/usr/lib/postfix/(n)?qmgr -- gen_context(system_u:object_r:postfix_qmgr_exec_t,s0) ++/usr/lib/postfix/(n)?qmgr -- gen_context(system_u:object_r:postfix_qmgr_exec_t,s0) ++/usr/lib/postfix/showq -- gen_context(system_u:object_r:postfix_showq_exec_t,s0) + /usr/lib/postfix/smtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) + /usr/lib/postfix/lmtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) + /usr/lib/postfix/scache -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) + /usr/lib/postfix/smtpd -- gen_context(system_u:object_r:postfix_smtpd_exec_t,s0) + /usr/lib/postfix/bounce -- gen_context(system_u:object_r:postfix_bounce_exec_t,s0) + /usr/lib/postfix/pipe -- gen_context(system_u:object_r:postfix_pipe_exec_t,s0) +-/usr/lib/postfix/virtual -- gen_context(system_u:object_r:postfix_virtual_exec_t,s0) +- +-/usr/libexec/postfix/.* -- gen_context(system_u:object_r:postfix_exec_t,s0) +-/usr/libexec/postfix/cleanup -- gen_context(system_u:object_r:postfix_cleanup_exec_t,s0) +-/usr/libexec/postfix/lmtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) +-/usr/libexec/postfix/local -- gen_context(system_u:object_r:postfix_local_exec_t,s0) +-/usr/libexec/postfix/master -- gen_context(system_u:object_r:postfix_master_exec_t,s0) +-/usr/libexec/postfix/pickup -- gen_context(system_u:object_r:postfix_pickup_exec_t,s0) +-/usr/libexec/postfix/(n)?qmgr -- gen_context(system_u:object_r:postfix_qmgr_exec_t,s0) +-/usr/libexec/postfix/showq -- gen_context(system_u:object_r:postfix_showq_exec_t,s0) +-/usr/libexec/postfix/smtp -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) +-/usr/libexec/postfix/scache -- gen_context(system_u:object_r:postfix_smtp_exec_t,s0) +-/usr/libexec/postfix/smtpd -- gen_context(system_u:object_r:postfix_smtpd_exec_t,s0) +-/usr/libexec/postfix/bounce -- gen_context(system_u:object_r:postfix_bounce_exec_t,s0) +-/usr/libexec/postfix/pipe -- gen_context(system_u:object_r:postfix_pipe_exec_t,s0) +-/usr/libexec/postfix/virtual -- gen_context(system_u:object_r:postfix_virtual_exec_t,s0) +- ++') ++/etc/postfix/postfix-script.* -- gen_context(system_u:object_r:postfix_exec_t,s0) ++/etc/postfix/prng_exch -- gen_context(system_u:object_r:postfix_prng_t,s0) + /usr/sbin/postalias -- gen_context(system_u:object_r:postfix_master_exec_t,s0) + /usr/sbin/postcat -- gen_context(system_u:object_r:postfix_master_exec_t,s0) + /usr/sbin/postdrop -- gen_context(system_u:object_r:postfix_postdrop_exec_t,s0) +@@ -44,14 +44,14 @@ + /usr/sbin/postqueue -- gen_context(system_u:object_r:postfix_postqueue_exec_t,s0) + /usr/sbin/postsuper -- gen_context(system_u:object_r:postfix_master_exec_t,s0) + +-/var/lib/postfix.* gen_context(system_u:object_r:postfix_data_t,s0) ++/var/lib/postfix.* gen_context(system_u:object_r:postfix_data_t,s0) + +-/var/spool/postfix.* gen_context(system_u:object_r:postfix_spool_t,s0) +-/var/spool/postfix/deferred(/.*)? -d gen_context(system_u:object_r:postfix_spool_maildrop_t,s0) +-/var/spool/postfix/defer(/.*)? gen_context(system_u:object_r:postfix_spool_maildrop_t,s0) +-/var/spool/postfix/maildrop(/.*)? gen_context(system_u:object_r:postfix_spool_maildrop_t,s0) +-/var/spool/postfix/pid(/.*)? gen_context(system_u:object_r:postfix_var_run_t,s0) +-/var/spool/postfix/private(/.*)? gen_context(system_u:object_r:postfix_private_t,s0) +-/var/spool/postfix/public(/.*)? gen_context(system_u:object_r:postfix_public_t,s0) +-/var/spool/postfix/bounce(/.*)? gen_context(system_u:object_r:postfix_spool_bounce_t,s0) +-/var/spool/postfix/flush(/.*)? gen_context(system_u:object_r:postfix_spool_flush_t,s0) ++/var/spool/postfix.* gen_context(system_u:object_r:postfix_spool_t,s0) ++/var/spool/postfix/deferred(/.*)? gen_context(system_u:object_r:postfix_spool_t,s0) ++/var/spool/postfix/defer(/.*)? gen_context(system_u:object_r:postfix_spool_t,s0) ++/var/spool/postfix/maildrop(/.*)? gen_context(system_u:object_r:postfix_spool_t,s0) ++/var/spool/postfix/pid/.* gen_context(system_u:object_r:postfix_var_run_t,s0) ++/var/spool/postfix/private(/.*)? gen_context(system_u:object_r:postfix_private_t,s0) ++/var/spool/postfix/public(/.*)? gen_context(system_u:object_r:postfix_public_t,s0) ++/var/spool/postfix/bounce(/.*)? gen_context(system_u:object_r:postfix_spool_bounce_t,s0) ++/var/spool/postfix/flush(/.*)? gen_context(system_u:object_r:postfix_spool_t,s0) +diff --git a/postfix.if b/postfix.if +index ded95ec3a4..137ae2d3d2 100644 +--- a/postfix.if ++++ b/postfix.if +@@ -1,4 +1,4 @@ +-## Postfix email server. ++## Postfix email server + + ######################################## + ## +@@ -16,13 +16,14 @@ interface(`postfix_stub',` + ') + ') + +-####################################### ++######################################## + ## +-## The template to define a postfix domain. ++## Creates types and rules for a basic ++## postfix process domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # +@@ -31,73 +32,69 @@ template(`postfix_domain_template',` + attribute postfix_domain; + ') + +- ######################################## +- # +- # Declarations +- # +- + type postfix_$1_t, postfix_domain; + type postfix_$1_exec_t; + domain_type(postfix_$1_t) + domain_entry_file(postfix_$1_t, postfix_$1_exec_t) + role system_r types postfix_$1_t; + +- ######################################## +- # +- # Policy +- # +- +- can_exec(postfix_$1_t, postfix_$1_exec_t) ++ kernel_read_system_state(postfix_$1_t) + + auth_use_nsswitch(postfix_$1_t) ++ ++ logging_send_syslog_msg(postfix_$1_t) ++ ++ can_exec(postfix_$1_t, postfix_$1_exec_t) + ') + +-####################################### ++######################################## + ## +-## The template to define a postfix server domain. ++## Creates a postfix server process domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix of the domain. + ## + ## + # + template(`postfix_server_domain_template',` +- gen_require(` +- attribute postfix_server_domain, postfix_server_tmp_content; +- ') +- +- ######################################## +- # +- # Declarations +- # +- + postfix_domain_template($1) + +- typeattribute postfix_$1_t postfix_server_domain; +- +- type postfix_$1_tmp_t, postfix_server_tmp_content; ++ type postfix_$1_tmp_t; + files_tmp_file(postfix_$1_tmp_t) + +- ######################################## +- # +- # Declarations +- # ++ allow postfix_$1_t self:capability { setuid setgid sys_chroot dac_read_search dac_override }; ++ allow postfix_$1_t postfix_master_t:unix_stream_socket { connectto rw_stream_socket_perms }; ++ allow postfix_$1_t self:tcp_socket create_socket_perms; ++ allow postfix_$1_t self:udp_socket create_socket_perms; + + manage_dirs_pattern(postfix_$1_t, postfix_$1_tmp_t, postfix_$1_tmp_t) + manage_files_pattern(postfix_$1_t, postfix_$1_tmp_t, postfix_$1_tmp_t) + files_tmp_filetrans(postfix_$1_t, postfix_$1_tmp_t, { file dir }) + + domtrans_pattern(postfix_master_t, postfix_$1_exec_t, postfix_$1_t) ++ ++ corenet_all_recvfrom_netlabel(postfix_$1_t) ++ corenet_tcp_sendrecv_generic_if(postfix_$1_t) ++ corenet_udp_sendrecv_generic_if(postfix_$1_t) ++ corenet_tcp_sendrecv_generic_node(postfix_$1_t) ++ corenet_udp_sendrecv_generic_node(postfix_$1_t) ++ corenet_tcp_sendrecv_all_ports(postfix_$1_t) ++ corenet_udp_sendrecv_all_ports(postfix_$1_t) ++ corenet_tcp_bind_generic_node(postfix_$1_t) ++ corenet_udp_bind_generic_node(postfix_$1_t) ++ corenet_tcp_connect_all_ports(postfix_$1_t) ++ corenet_sendrecv_all_client_packets(postfix_$1_t) + ') + +-####################################### ++######################################## + ## +-## The template to define a postfix user domain. ++## Creates a process domain for programs ++## that are ran by users. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix of the domain. + ## + ## + # +@@ -106,30 +103,22 @@ template(`postfix_user_domain_template',` + attribute postfix_user_domains, postfix_user_domtrans; + ') + +- ######################################## +- # +- # Declarations +- # +- + postfix_domain_template($1) + + typeattribute postfix_$1_t postfix_user_domains; + +- ######################################## +- # +- # Policy +- # +- +- allow postfix_$1_t self:capability dac_override; ++ allow postfix_$1_t self:capability { dac_read_search dac_override }; + + domtrans_pattern(postfix_user_domtrans, postfix_$1_exec_t, postfix_$1_t) + + domain_use_interactive_fds(postfix_$1_t) ++ ++ application_domain(postfix_$1_t, postfix_$1_exec_t) + ') + + ######################################## + ## +-## Read postfix configuration content. ++## Read postfix configuration files. + ## + ## + ## +@@ -143,16 +132,15 @@ interface(`postfix_read_config',` + type postfix_etc_t; + ') + ++ read_files_pattern($1, postfix_etc_t, postfix_etc_t) ++ read_lnk_files_pattern($1, postfix_etc_t, postfix_etc_t) + files_search_etc($1) +- allow $1 postfix_etc_t:dir list_dir_perms; +- allow $1 postfix_etc_t:file read_file_perms; +- allow $1 postfix_etc_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## +-## Create specified object in postfix +-## etc directories with a type transition. ++## Create files with the specified type in ++## the postfix configuration directories. + ## + ## + ## +@@ -180,6 +168,7 @@ interface(`postfix_config_filetrans',` + type postfix_etc_t; + ') + ++ files_search_etc($1) + filetrans_pattern($1, postfix_etc_t, $2, $3, $4) + ') + +@@ -205,7 +194,8 @@ interface(`postfix_dontaudit_rw_local_tcp_sockets',` + + ######################################## + ## +-## Read and write postfix local pipes. ++## Allow read/write postfix local pipes ++## TCP sockets. + ## + ## + ## +@@ -221,30 +211,28 @@ interface(`postfix_rw_local_pipes',` + allow $1 postfix_local_t:fifo_file rw_fifo_file_perms; + ') + +-######################################## ++####################################### + ## +-## Read postfix local process state files. ++## Allow read/write postfix public pipes ++## TCP sockets. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`postfix_read_local_state',` +- gen_require(` +- type postfix_local_t; +- ') ++interface(`postfix_rw_public_pipes',` ++ gen_require(` ++ type postfix_public_t; ++ ') + +- kernel_search_proc($1) +- allow $1 postfix_local_t:dir list_dir_perms; +- allow $1 postfix_local_t:file read_file_perms; +- allow $1 postfix_local_t:lnk_file read_lnk_file_perms; ++ allow $1 postfix_public_t:fifo_file rw_fifo_file_perms; + ') + + ######################################## + ## +-## Read and write inherited postfix master pipes. ++## Allow domain to read postfix local process state + ## + ## + ## +@@ -252,18 +240,18 @@ interface(`postfix_read_local_state',` + ## + ## + # +-interface(`postfix_rw_inherited_master_pipes',` ++interface(`postfix_read_local_state',` + gen_require(` +- type postfix_master_t; ++ type postfix_local_t; + ') + +- allow $1 postfix_master_t:fd use; +- allow $1 postfix_master_t:fifo_file { getattr write append lock ioctl read }; ++ kernel_search_proc($1) ++ ps_process_pattern($1, postfix_local_t) + ') + + ######################################## + ## +-## Read postfix master process state files. ++## Allow domain to read postfix master process state + ## + ## + ## +@@ -277,14 +265,13 @@ interface(`postfix_read_master_state',` + ') + + kernel_search_proc($1) +- allow $1 postfix_master_t:dir list_dir_perms; +- allow $1 postfix_master_t:file read_file_perms; +- allow $1 postfix_master_t:lnk_file read_lnk_file_perms; ++ ps_process_pattern($1, postfix_master_t) + ') + + ######################################## + ## +-## Use postfix master file descriptors. ++## Use postfix master process file ++## file descriptors. + ## + ## + ## +@@ -335,15 +322,13 @@ interface(`postfix_domtrans_map',` + type postfix_map_t, postfix_map_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, postfix_map_exec_t, postfix_map_t) + ') + + ######################################## + ## +-## Execute postfix map in the postfix +-## map domain, and allow the specified +-## role the postfix_map domain. ++## Execute postfix_map in the postfix_map domain, and ++## allow the specified role the postfix_map domain. + ## + ## + ## +@@ -359,17 +344,17 @@ interface(`postfix_domtrans_map',` + # + interface(`postfix_run_map',` + gen_require(` +- attribute_role postfix_map_roles; ++ type postfix_map_t; + ') + + postfix_domtrans_map($1) +- roleattribute $2 postfix_map_roles; ++ role $2 types postfix_map_t; + ') + + ######################################## + ## +-## Execute the master postfix program +-## in the postfix_master domain. ++## Execute the master postfix program in the ++## postfix_master domain. + ## + ## + ## +@@ -380,16 +365,36 @@ interface(`postfix_run_map',` + interface(`postfix_domtrans_master',` + gen_require(` + type postfix_master_t, postfix_master_exec_t; ++ attribute postfix_domain; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, postfix_master_exec_t, postfix_master_t) ++ allow $1 postfix_master_exec_t:file map; + ') + ++ + ######################################## + ## +-## Execute the master postfix program +-## in the caller domain. ++## Execute the master postfix in the postfix master domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postfix_initrc_domtrans',` ++ gen_require(` ++ type postfix_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, postfix_initrc_exec_t) ++') ++ ++######################################## ++## ++## Execute the master postfix program in the ++## caller domain. + ## + ## + ## +@@ -402,21 +407,18 @@ interface(`postfix_exec_master',` + type postfix_master_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, postfix_master_exec_t) + ') + + ####################################### + ## +-## Connect to postfix master process +-## using a unix domain stream socket. ++## Connect to postfix master process using a unix domain stream socket. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## + # + interface(`postfix_stream_connect_master',` + gen_require(` +@@ -428,8 +430,7 @@ interface(`postfix_stream_connect_master',` + + ######################################## + ## +-## Read and write postfix master +-## unnamed pipes. (Deprecated) ++## Allow read/write postfix master pipes + ## + ## + ## +@@ -437,15 +438,18 @@ interface(`postfix_stream_connect_master',` + ## + ## + # +-interface(`postfix_rw_master_pipes',` +- refpolicywarn(`$0($*) has been deprecated, use postfix_rw_inherited_master_pipes() instead.') +- postfix_rw_inherited_master_pipes($1) ++interface(`postfix_rw_inherited_master_pipes',` ++ gen_require(` ++ type postfix_master_t; ++ ') ++ ++ allow $1 postfix_master_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## + ## Execute the master postdrop in the +-## postfix postdrop domain. ++## postfix_postdrop domain. + ## + ## + ## +@@ -458,14 +462,14 @@ interface(`postfix_domtrans_postdrop',` + type postfix_postdrop_t, postfix_postdrop_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, postfix_postdrop_exec_t, postfix_postdrop_t) ++ allow $1 postfix_postdrop_exec_t:file map; + ') + + ######################################## + ## + ## Execute the master postqueue in the +-## postfix postqueue domain. ++## postfix_postqueue domain. + ## + ## + ## +@@ -478,30 +482,85 @@ interface(`postfix_domtrans_postqueue',` + type postfix_postqueue_t, postfix_postqueue_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, postfix_postqueue_exec_t, postfix_postqueue_t) + ') + +-####################################### ++######################################## + ## +-## Execute the master postqueue in +-## the caller domain. (Deprecated) ++## Execute the master postqueue in the ++## postfix_postdrop domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to be allowed the iptables domain. ++## ++## ++## ++# ++ ++interface(`postfix_run_postqueue',` ++ gen_require(` ++ type postfix_postqueue_t; ++ ') ++ ++ postfix_domtrans_postqueue($1) ++ role $2 types postfix_postqueue_t; ++ allow postfix_postqueue_t $1:unix_stream_socket { read write getattr }; ++') ++ ++######################################## ++## ++## Execute postfix_postgqueue in the postfix_postgqueue domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`postfix_domtrans_postgqueue',` ++ gen_require(` ++ type postfix_postgqueue_t; ++ type postfix_postgqueue_exec_t; ++ ') ++ domtrans_pattern($1, postfix_postgqueue_exec_t,postfix_postgqueue_t) ++') ++ ++######################################## ++## ++## Execute postfix_postgqueue in the postfix_postgqueue domain, and ++## allow the specified role the postfix_postgqueue domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. + ## + ## ++## + # +-interface(`posftix_exec_postqueue',` +- refpolicywarn(`$0($*) has been deprecated.') +- postfix_exec_postqueue($1) ++interface(`postfix_run_postgqueue',` ++ gen_require(` ++ type postfix_postgqueue_t; ++ ') ++ ++ postfix_domtrans_postgqueue($1) ++ role $2 types postfix_postgqueue_t; + ') + ++ + ####################################### + ## +-## Execute postfix postqueue in +-## the caller domain. ++## Execute the master postqueue in the caller domain. + ## + ## + ## +@@ -514,13 +573,12 @@ interface(`postfix_exec_postqueue',` + type postfix_postqueue_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, postfix_postqueue_exec_t) + ') + + ######################################## + ## +-## Create postfix private sock files. ++## Create a named socket in a postfix private directory. + ## + ## + ## +@@ -533,13 +591,13 @@ interface(`postfix_create_private_sockets',` + type postfix_private_t; + ') + ++ allow $1 postfix_private_t:dir list_dir_perms; + create_sock_files_pattern($1, postfix_private_t, postfix_private_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## postfix private sock files. ++## manage named socket in a postfix private directory. + ## + ## + ## +@@ -552,13 +610,14 @@ interface(`postfix_manage_private_sockets',` + type postfix_private_t; + ') + ++ allow $1 postfix_private_t:dir list_dir_perms; + manage_sock_files_pattern($1, postfix_private_t, postfix_private_t) + ') + + ######################################## + ## +-## Execute the smtp postfix program +-## in the postfix smtp domain. ++## Execute the master postfix program in the ++## postfix_master domain. + ## + ## + ## +@@ -571,14 +630,12 @@ interface(`postfix_domtrans_smtp',` + type postfix_smtp_t, postfix_smtp_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, postfix_smtp_exec_t, postfix_smtp_t) + ') + + ######################################## + ## +-## Get attributes of all postfix mail +-## spool files. ++## Getattr postfix mail spool files. + ## + ## + ## +@@ -586,7 +643,7 @@ interface(`postfix_domtrans_smtp',` + ## + ## + # +-interface(`postfix_getattr_all_spool_files',` ++interface(`postfix_getattr_spool_files',` + gen_require(` + attribute postfix_spool_type; + ') +@@ -607,11 +664,11 @@ interface(`postfix_getattr_all_spool_files',` + # + interface(`postfix_search_spool',` + gen_require(` +- type postfix_spool_t; ++ attribute postfix_spool_type; + ') + ++ allow $1 postfix_spool_type:dir search_dir_perms; + files_search_spool($1) +- allow $1 postfix_spool_t:dir search_dir_perms; + ') + + ######################################## +@@ -626,11 +683,11 @@ interface(`postfix_search_spool',` + # + interface(`postfix_list_spool',` + gen_require(` +- type postfix_spool_t; ++ attribute postfix_spool_type; + ') + ++ allow $1 postfix_spool_type:dir list_dir_perms; + files_search_spool($1) +- allow $1 postfix_spool_t:dir list_dir_perms; + ') + + ######################################## +@@ -645,17 +702,16 @@ interface(`postfix_list_spool',` + # + interface(`postfix_read_spool_files',` + gen_require(` +- type postfix_spool_t; ++ attribute postfix_spool_type; + ') + + files_search_spool($1) +- read_files_pattern($1, postfix_spool_t, postfix_spool_t) ++ read_files_pattern($1, postfix_spool_type, postfix_spool_type) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## postfix mail spool files. ++## Create, read, write, and delete postfix mail spool files. + ## + ## + ## +@@ -665,11 +721,50 @@ interface(`postfix_read_spool_files',` + # + interface(`postfix_manage_spool_files',` + gen_require(` +- type postfix_spool_t; ++ attribute postfix_spool_type; + ') + + files_search_spool($1) +- manage_files_pattern($1, postfix_spool_t, postfix_spool_t) ++ manage_files_pattern($1, postfix_spool_type, postfix_spool_type) ++') ++ ++####################################### ++## ++## Read, write, and delete postfix maildrop spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postfix_rw_spool_maildrop_files',` ++ gen_require(` ++ type postfix_spool_maildrop_t; ++ ') ++ ++ files_search_spool($1) ++ rw_files_pattern($1, postfix_spool_maildrop_t, postfix_spool_maildrop_t) ++') ++ ++####################################### ++## ++## Create, read, write, and delete postfix maildrop spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postfix_manage_spool_maildrop_files',` ++ gen_require(` ++ type postfix_spool_maildrop_t; ++ ') ++ ++ files_search_spool($1) ++ manage_dirs_pattern($1, postfix_spool_maildrop_t, postfix_spool_maildrop_t) ++ manage_files_pattern($1, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + ') + + ######################################## +@@ -693,8 +788,8 @@ interface(`postfix_domtrans_user_mail_handler',` + + ######################################## + ## +-## All of the rules required to +-## administrate an postfix environment. ++## All of the rules required to administrate ++## an postfix environment. + ## + ## + ## +@@ -710,38 +805,137 @@ interface(`postfix_domtrans_user_mail_handler',` + # + interface(`postfix_admin',` + gen_require(` +- attribute postfix_domain, postfix_spool_type, postfix_server_tmp_content; +- type postfix_initrc_exec_t, postfix_prng_t, postfix_etc_t; +- type postfix_data_t, postfix_var_run_t, postfix_public_t; +- type postfix_private_t, postfix_map_tmp_t, postfix_exec_t; +- type postfix_keytab_t; ++ attribute postfix_spool_type; ++ type postfix_bounce_t, postfix_cleanup_t, postfix_local_t; ++ type postfix_master_t, postfix_pickup_t, postfix_qmgr_t; ++ type postfix_initrc_exec_t, postfix_data_t, postfix_etc_t; ++ type postfix_map_tmp_t, postfix_prng_t, postfix_public_t; ++ type postfix_smtpd_t, postfix_var_run_t; ++ ') ++ ++ allow $1 postfix_bounce_t:process signal_perms; ++ ps_process_pattern($1, postfix_bounce_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 postfix_bounce_t:process ptrace; + ') + +- allow $1 postfix_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, postfix_domain) ++ allow $1 postfix_cleanup_t:process signal_perms; ++ ps_process_pattern($1, postfix_cleanup_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 postfix_cleanup_t:process ptrace; ++ allow $1 postfix_local_t:process ptrace; ++ allow $1 postfix_master_t:process ptrace; ++ allow $1 postfix_pickup_t:process ptrace; ++ allow $1 postfix_qmgr_t:process ptrace; ++ allow $1 postfix_smtpd_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, postfix_initrc_exec_t) ++ allow $1 postfix_local_t:process signal_perms; ++ ps_process_pattern($1, postfix_local_t) ++ ++ allow $1 postfix_master_t:process signal_perms; ++ ps_process_pattern($1, postfix_master_t) ++ ++ allow $1 postfix_pickup_t:process signal_perms; ++ ps_process_pattern($1, postfix_pickup_t) ++ ++ allow $1 postfix_qmgr_t:process signal_perms; ++ ps_process_pattern($1, postfix_qmgr_t) ++ ++ allow $1 postfix_smtpd_t:process signal_perms; ++ ps_process_pattern($1, postfix_smtpd_t) ++ ++ postfix_run_map($1, $2) ++ postfix_run_postdrop($1, $2) ++ postfix_run_postqueue($1, $2) ++ ++ postfix_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 postfix_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) +- admin_pattern($1, { postfix_prng_t postfix_etc_t postfix_exec_t postfix_keytab_t }) ++ admin_pattern($1, postfix_data_t) + +- files_search_spool($1) +- admin_pattern($1, { postfix_public_t postfix_private_t postfix_spool_type }) ++ files_list_etc($1) ++ admin_pattern($1, postfix_etc_t) + +- files_search_var_lib($1) +- admin_pattern($1, postfix_data_t) ++ files_list_spool($1) ++ admin_pattern($1, postfix_spool_type) + +- files_search_pids($1) + admin_pattern($1, postfix_var_run_t) + +- files_search_tmp($1) +- admin_pattern($1, { postfix_server_tmp_content postfix_map_tmp_t }) ++ files_list_tmp($1) ++ admin_pattern($1, postfix_map_tmp_t) ++ ++ admin_pattern($1, postfix_prng_t) + +- postfix_exec_master($1) +- postfix_exec_postqueue($1) +- postfix_stream_connect_master($1) +- postfix_run_map($1, $2) ++ admin_pattern($1, postfix_public_t) ++ ++ postfix_filetrans_named_content($1) ++') ++ ++######################################## ++## ++## Execute the master postdrop in the ++## postfix_postdrop domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to be allowed the iptables domain. ++## ++## ++## ++# ++interface(`postfix_run_postdrop',` ++ gen_require(` ++ type postfix_postdrop_t; ++ ') ++ ++ postfix_domtrans_postdrop($1) ++ role $2 types postfix_postdrop_t; ++ allow postfix_postdrop_t $1:unix_stream_socket { read write getattr }; ++') ++ ++ ++######################################## ++## ++## Execute postfix exec in the users domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postfix_exec',` ++ gen_require(` ++ type postfix_exec_t; ++ ') ++ ++ can_exec($1, postfix_exec_t) ++') ++ ++######################################## ++## ++## Transition to postfix named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`postfix_filetrans_named_content',` ++ gen_require(` ++ type postfix_exec_t; ++ type postfix_prng_t; ++ ') ++ ++ postfix_config_filetrans($1, postfix_exec_t, file, "postfix-script") ++ postfix_config_filetrans($1, postfix_prng_t, file, "prng_exch") + ') +diff --git a/postfix.te b/postfix.te +index 5cfb83eca2..921fcfe701 100644 +--- a/postfix.te ++++ b/postfix.te +@@ -6,27 +6,23 @@ policy_module(postfix, 1.15.1) + # + + ## +-##

      +-## Determine whether postfix local +-## can manage mail spool content. +-##

      ++##

      ++## Allow postfix_local domain full write access to mail_spool directories ++##

      + ##
      + gen_tunable(postfix_local_write_mail_spool, true) + + attribute postfix_domain; +-attribute postfix_server_domain; +-attribute postfix_server_tmp_content; + attribute postfix_spool_type; + attribute postfix_user_domains; ++# domains that transition to the ++# postfix user domains + attribute postfix_user_domtrans; + +-attribute_role postfix_map_roles; +-roleattribute system_r postfix_map_roles; +- + postfix_server_domain_template(bounce) + + type postfix_spool_bounce_t, postfix_spool_type; +-files_type(postfix_spool_bounce_t) ++files_spool_file(postfix_spool_bounce_t) + + postfix_server_domain_template(cleanup) + +@@ -42,16 +38,19 @@ files_type(postfix_keytab_t) + postfix_server_domain_template(local) + mta_mailserver_delivery(postfix_local_t) + ++# Program for creating database files + type postfix_map_t; + type postfix_map_exec_t; + application_domain(postfix_map_t, postfix_map_exec_t) +-role postfix_map_roles types postfix_map_t; ++role system_r types postfix_map_t; + + type postfix_map_tmp_t; + files_tmp_file(postfix_map_tmp_t) + + postfix_domain_template(master) + typealias postfix_master_t alias postfix_t; ++# alias is a hack to make the disable trans bool ++# generation macro work + mta_mailserver(postfix_t, postfix_master_exec_t) + + type postfix_initrc_exec_t; +@@ -63,6 +62,7 @@ postfix_server_domain_template(pipe) + + postfix_user_domain_template(postdrop) + mta_mailserver_user_agent(postfix_postdrop_t) ++mta_agent_executable(postfix_postdrop_t) + + postfix_user_domain_template(postqueue) + mta_mailserver_user_agent(postfix_postqueue_t) +@@ -83,13 +83,13 @@ mta_mailserver_sender(postfix_smtp_t) + postfix_server_domain_template(smtpd) + + type postfix_spool_t, postfix_spool_type; +-files_type(postfix_spool_t) ++files_spool_file(postfix_spool_t) + +-type postfix_spool_maildrop_t, postfix_spool_type; +-files_type(postfix_spool_maildrop_t) ++typealias postfix_spool_t alias postfix_spool_maildrop_t; ++files_spool_file(postfix_spool_maildrop_t) + +-type postfix_spool_flush_t, postfix_spool_type; +-files_type(postfix_spool_flush_t) ++typealias postfix_spool_t alias postfix_spool_flush_t; ++files_spool_file(postfix_spool_flush_t) + + type postfix_public_t; + files_type(postfix_public_t) +@@ -97,6 +97,7 @@ files_type(postfix_public_t) + type postfix_var_run_t; + files_pid_file(postfix_var_run_t) + ++# the data_directory config parameter + type postfix_data_t; + files_type(postfix_data_t) + +@@ -105,109 +106,23 @@ mta_mailserver_delivery(postfix_virtual_t) + + ######################################## + # +-# Common postfix domain local policy +-# +- +-allow postfix_domain self:capability { sys_nice sys_chroot }; +-dontaudit postfix_domain self:capability sys_tty_config; +-allow postfix_domain self:process { signal_perms setpgid setsched }; +-allow postfix_domain self:fifo_file rw_fifo_file_perms; +-allow postfix_domain self:unix_stream_socket { accept connectto listen }; +- +-allow postfix_domain postfix_etc_t:dir list_dir_perms; +-allow postfix_domain postfix_etc_t:file read_file_perms; +-allow postfix_domain postfix_etc_t:lnk_file read_lnk_file_perms; +- +-allow postfix_domain postfix_master_t:file read_file_perms; +- +-allow postfix_domain postfix_exec_t:file { mmap_file_perms lock }; +- +-allow postfix_domain postfix_master_t:process sigchld; +- +-allow postfix_domain postfix_spool_t:dir list_dir_perms; +- +-manage_files_pattern(postfix_domain, postfix_var_run_t, postfix_var_run_t) +-files_pid_filetrans(postfix_domain, postfix_var_run_t, file) +- +-kernel_read_system_state(postfix_domain) +-kernel_read_network_state(postfix_domain) +-kernel_read_all_sysctls(postfix_domain) +- +-dev_read_sysfs(postfix_domain) +-dev_read_rand(postfix_domain) +-dev_read_urand(postfix_domain) +- +-fs_search_auto_mountpoints(postfix_domain) +-fs_getattr_all_fs(postfix_domain) +-fs_rw_anon_inodefs_files(postfix_domain) +- +-term_dontaudit_use_console(postfix_domain) +- +-corecmd_exec_shell(postfix_domain) +- +-files_read_etc_runtime_files(postfix_domain) +-files_read_usr_files(postfix_domain) +-files_search_spool(postfix_domain) +-files_getattr_tmp_dirs(postfix_domain) +-files_search_all_mountpoints(postfix_domain) +- +-init_dontaudit_use_fds(postfix_domain) +-init_sigchld(postfix_domain) +- +-logging_send_syslog_msg(postfix_domain) +- +-miscfiles_read_localization(postfix_domain) +-miscfiles_read_generic_certs(postfix_domain) +- +-userdom_dontaudit_use_unpriv_user_fds(postfix_domain) +- +-optional_policy(` +- udev_read_db(postfix_domain) +-') +- +-######################################## +-# +-# Common postfix server domain local policy ++# Postfix master process local policy + # + +-allow postfix_server_domain self:capability { setuid setgid dac_override }; +- +-allow postfix_server_domain postfix_master_t:unix_stream_socket { connectto rw_stream_socket_perms }; +- +-corenet_all_recvfrom_unlabeled(postfix_server_domain) +-corenet_all_recvfrom_netlabel(postfix_server_domain) +-corenet_tcp_sendrecv_generic_if(postfix_server_domain) +-corenet_tcp_sendrecv_generic_node(postfix_server_domain) +- +-corenet_sendrecv_all_client_packets(postfix_server_domain) +-corenet_tcp_connect_all_ports(postfix_server_domain) +-corenet_tcp_sendrecv_all_ports(postfix_server_domain) +- +-######################################## +-# +-# Common postfix user domain local policy +-# +- +-allow postfix_user_domains self:capability dac_override; +- +-domain_use_interactive_fds(postfix_user_domains) +- +-######################################## +-# +-# Master local policy +-# +- +-allow postfix_master_t self:capability { chown dac_override kill fowner setgid setuid sys_tty_config }; ++dontaudit postfix_master_t self:capability { net_admin }; ++# chown is to set the correct ownership of queue dirs ++allow postfix_master_t self:capability { chown dac_read_search dac_override kill setgid setuid net_bind_service sys_tty_config }; + allow postfix_master_t self:capability2 block_suspend; ++ + allow postfix_master_t self:process setrlimit; + allow postfix_master_t self:tcp_socket create_stream_socket_perms; + allow postfix_master_t self:udp_socket create_socket_perms; + +-allow postfix_master_t postfix_domain:fifo_file rw_fifo_file_perms; +-allow postfix_master_t postfix_domain:process signal; +- + allow postfix_master_t postfix_etc_t:dir rw_dir_perms; + allow postfix_master_t postfix_etc_t:file rw_file_perms; ++mta_filetrans_aliases(postfix_master_t, postfix_etc_t) ++ ++can_exec(postfix_master_t, postfix_exec_t) + + allow postfix_master_t postfix_data_t:dir manage_dir_perms; + allow postfix_master_t postfix_data_t:file manage_file_perms; +@@ -216,34 +131,36 @@ allow postfix_master_t postfix_keytab_t:file read_file_perms; + + allow postfix_master_t postfix_map_exec_t:file { mmap_file_perms ioctl lock }; + +-allow postfix_master_t { postfix_postdrop_exec_t postfix_postqueue_exec_t }:file getattr_file_perms; ++allow postfix_master_t postfix_postqueue_exec_t:file getattr_file_perms; ++ ++manage_files_pattern(postfix_master_t, postfix_private_t, postfix_private_t) ++manage_fifo_files_pattern(postfix_master_t, postfix_private_t, postfix_private_t) ++manage_sock_files_pattern(postfix_master_t, postfix_private_t, postfix_private_t) ++ ++domtrans_pattern(postfix_master_t, postfix_postqueue_exec_t, postfix_postqueue_t) + + allow postfix_master_t postfix_prng_t:file rw_file_perms; + ++manage_fifo_files_pattern(postfix_master_t, postfix_public_t, postfix_public_t) ++manage_sock_files_pattern(postfix_master_t, postfix_public_t, postfix_public_t) ++ ++domtrans_pattern(postfix_master_t, postfix_showq_exec_t, postfix_showq_t) ++ ++allow postfix_master_t postfix_cleanup_exec_t:file map; ++allow postfix_master_t postfix_showq_exec_t:file map; ++allow postfix_master_t postfix_smtp_exec_t:file map; ++ ++# allow access to deferred queue and allow removing bogus incoming entries + manage_dirs_pattern(postfix_master_t, postfix_spool_t, postfix_spool_t) + manage_files_pattern(postfix_master_t, postfix_spool_t, postfix_spool_t) + files_spool_filetrans(postfix_master_t, postfix_spool_t, dir) + + allow postfix_master_t postfix_spool_bounce_t:dir manage_dir_perms; + allow postfix_master_t postfix_spool_bounce_t:file getattr_file_perms; +-filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_spool_bounce_t, dir, "bounce") + + manage_dirs_pattern(postfix_master_t, postfix_spool_flush_t, postfix_spool_flush_t) + manage_files_pattern(postfix_master_t, postfix_spool_flush_t, postfix_spool_flush_t) + manage_lnk_files_pattern(postfix_master_t, postfix_spool_flush_t, postfix_spool_flush_t) +-filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_spool_flush_t, dir, "flush") +- +-create_dirs_pattern(postfix_master_t, postfix_spool_t, postfix_private_t) +-manage_fifo_files_pattern(postfix_master_t, postfix_private_t, postfix_private_t) +-manage_sock_files_pattern(postfix_master_t, postfix_private_t, postfix_private_t) +-setattr_dirs_pattern(postfix_master_t, postfix_private_t, postfix_private_t) +-filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_private_t, dir, "private") +- +-create_dirs_pattern(postfix_master_t, postfix_spool_t, postfix_public_t) +-manage_fifo_files_pattern(postfix_master_t, postfix_public_t, postfix_public_t) +-manage_sock_files_pattern(postfix_master_t, postfix_public_t, postfix_public_t) +-setattr_dirs_pattern(postfix_master_t, postfix_public_t, postfix_public_t) +-filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_public_t, dir, "public") + + create_dirs_pattern(postfix_master_t, postfix_spool_t, postfix_spool_maildrop_t) + delete_files_pattern(postfix_master_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) +@@ -253,16 +170,8 @@ filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_spool_maildrop_t, d + filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_spool_maildrop_t, dir, "deferred") + filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_spool_maildrop_t, dir, "maildrop") + +-create_dirs_pattern(postfix_master_t, postfix_spool_t, postfix_var_run_t) +-setattr_dirs_pattern(postfix_master_t, postfix_var_run_t, postfix_var_run_t) +-filetrans_pattern(postfix_master_t, postfix_spool_t, postfix_var_run_t, dir, "pid") +- +-can_exec(postfix_master_t, postfix_exec_t) +- +-domtrans_pattern(postfix_master_t, postfix_postqueue_exec_t, postfix_postqueue_t) +-domtrans_pattern(postfix_master_t, postfix_showq_exec_t, postfix_showq_t) ++kernel_read_all_sysctls(postfix_master_t) + +-corenet_all_recvfrom_unlabeled(postfix_master_t) + corenet_all_recvfrom_netlabel(postfix_master_t) + corenet_tcp_sendrecv_generic_if(postfix_master_t) + corenet_udp_sendrecv_generic_if(postfix_master_t) +@@ -270,50 +179,47 @@ corenet_tcp_sendrecv_generic_node(postfix_master_t) + corenet_udp_sendrecv_generic_node(postfix_master_t) + corenet_tcp_sendrecv_all_ports(postfix_master_t) + corenet_udp_sendrecv_all_ports(postfix_master_t) ++corenet_udp_bind_generic_node(postfix_master_t) ++corenet_udp_bind_all_unreserved_ports(postfix_master_t) ++corenet_dontaudit_udp_bind_all_ports(postfix_master_t) + corenet_tcp_bind_generic_node(postfix_master_t) +- +-corenet_sendrecv_amavisd_send_server_packets(postfix_master_t) + corenet_tcp_bind_amavisd_send_port(postfix_master_t) +- +-corenet_sendrecv_smtp_server_packets(postfix_master_t) + corenet_tcp_bind_smtp_port(postfix_master_t) +- +-corenet_sendrecv_spamd_server_packets(postfix_master_t) +-corenet_tcp_bind_spamd_port(postfix_master_t) +- +-corenet_sendrecv_all_client_packets(postfix_master_t) + corenet_tcp_connect_all_ports(postfix_master_t) ++corenet_sendrecv_amavisd_send_server_packets(postfix_master_t) ++corenet_sendrecv_smtp_server_packets(postfix_master_t) ++corenet_sendrecv_all_client_packets(postfix_master_t) ++# for spampd ++corenet_tcp_bind_spamd_port(postfix_master_t) + +-# Can this be conditional? +-corenet_sendrecv_all_server_packets(postfix_master_t) +-corenet_udp_bind_all_unreserved_ports(postfix_master_t) +-corenet_dontaudit_udp_bind_all_ports(postfix_master_t) +- ++# for a find command + selinux_dontaudit_search_fs(postfix_master_t) + ++corecmd_exec_shell(postfix_master_t) + corecmd_exec_bin(postfix_master_t) + + domain_use_interactive_fds(postfix_master_t) + ++files_search_var_lib(postfix_master_t) + files_search_tmp(postfix_master_t) + +-mcs_file_read_all(postfix_master_t) + +-term_dontaudit_search_ptys(postfix_master_t) ++init_stream_connect(postfix_master_t) + +-miscfiles_read_man_pages(postfix_master_t) ++term_dontaudit_search_ptys(postfix_master_t) + + seutil_sigchld_newrole(postfix_master_t) +-seutil_dontaudit_search_config(postfix_master_t) + +-mta_manage_aliases(postfix_master_t) +-mta_etc_filetrans_aliases(postfix_master_t, file, "aliases") +-mta_etc_filetrans_aliases(postfix_master_t, file, "aliases.db") +-mta_etc_filetrans_aliases(postfix_master_t, file, "aliasesdb-stamp") +-mta_spec_filetrans_aliases(postfix_master_t, postfix_etc_t, file) ++mta_rw_aliases(postfix_master_t) + mta_read_sendmail_bin(postfix_master_t) + mta_getattr_spool(postfix_master_t) + ++ifdef(`distro_redhat',` ++ # for newer main.cf that uses /etc/aliases ++ mta_manage_aliases(postfix_master_t) ++ mta_etc_filetrans_aliases(postfix_master_t) ++') ++ + optional_policy(` + cyrus_stream_connect(postfix_master_t) + ') +@@ -323,14 +229,6 @@ optional_policy(` + kerberos_use(postfix_master_t) + ') + +-optional_policy(` +- mailman_manage_data_files(postfix_master_t) +-') +- +-optional_policy(` +- mysql_stream_connect(postfix_master_t) +-') +- + optional_policy(` + postgrey_search_spool(postfix_master_t) + ') +@@ -341,12 +239,14 @@ optional_policy(` + + ######################################## + # +-# Bounce local policy ++# Postfix bounce local policy + # + + allow postfix_bounce_t self:capability dac_read_search; ++allow postfix_bounce_t self:tcp_socket create_socket_perms; + +-write_sock_files_pattern(postfix_bounce_t, postfix_public_t, postfix_public_t) ++allow postfix_bounce_t postfix_public_t:sock_file write; ++allow postfix_bounce_t postfix_public_t:dir search_dir_perms; + + manage_dirs_pattern(postfix_bounce_t, postfix_spool_t, postfix_spool_t) + manage_files_pattern(postfix_bounce_t, postfix_spool_t, postfix_spool_t) +@@ -363,74 +263,89 @@ manage_lnk_files_pattern(postfix_bounce_t, postfix_spool_bounce_t, postfix_spool + + ######################################## + # +-# Cleanup local policy ++# Postfix cleanup local policy + # + + allow postfix_cleanup_t self:process setrlimit; +- + allow postfix_cleanup_t postfix_smtpd_t:tcp_socket rw_stream_socket_perms; +-allow postfix_cleanup_t postfix_smtpd_t:unix_stream_socket rw_socket_perms; +- +-allow postfix_cleanup_t postfix_spool_maildrop_t:dir list_dir_perms; +-allow postfix_cleanup_t postfix_spool_maildrop_t:file read_file_perms; +-allow postfix_cleanup_t postfix_spool_maildrop_t:lnk_file read_lnk_file_perms; + ++# connect to master process + stream_connect_pattern(postfix_cleanup_t, postfix_private_t, postfix_private_t, postfix_master_t) + + rw_fifo_files_pattern(postfix_cleanup_t, postfix_public_t, postfix_public_t) + write_sock_files_pattern(postfix_cleanup_t, postfix_public_t, postfix_public_t) ++allow postfix_cleanup_t postfix_smtpd_t:unix_stream_socket rw_socket_perms; + + manage_dirs_pattern(postfix_cleanup_t, postfix_spool_t, postfix_spool_t) + manage_files_pattern(postfix_cleanup_t, postfix_spool_t, postfix_spool_t) + manage_lnk_files_pattern(postfix_cleanup_t, postfix_spool_t, postfix_spool_t) + files_spool_filetrans(postfix_cleanup_t, postfix_spool_t, dir) + ++allow postfix_cleanup_t postfix_spool_maildrop_t:dir list_dir_perms; ++allow postfix_cleanup_t postfix_spool_maildrop_t:file read_file_perms; ++allow postfix_cleanup_t postfix_spool_maildrop_t:lnk_file read_lnk_file_perms; ++ + allow postfix_cleanup_t postfix_spool_bounce_t:dir list_dir_perms; + + corecmd_exec_bin(postfix_cleanup_t) + +-corenet_sendrecv_kismet_client_packets(postfix_cleanup_t) +-corenet_tcp_connect_kismet_port(postfix_cleanup_t) +-corenet_tcp_sendrecv_kismet_port(postfix_cleanup_t) +- +-mta_read_aliases(postfix_cleanup_t) ++# allow postfix to connect to sqlgrey ++corenet_tcp_connect_rtsclient_port(postfix_cleanup_t) + + optional_policy(` + mailman_read_data_files(postfix_cleanup_t) + ') + ++optional_policy(` ++ milter_stream_connect_all(postfix_cleanup_t) ++') ++ + ######################################## + # +-# Local local policy ++# Postfix local local policy + # + +-allow postfix_local_t self:capability chown; +-allow postfix_local_t self:process setrlimit; ++allow postfix_local_t self:process { setsched setrlimit }; + ++# connect to master process + stream_connect_pattern(postfix_local_t, postfix_public_t, postfix_public_t, postfix_master_t) + ++# for .forward - maybe we need a new type for it? + rw_sock_files_pattern(postfix_local_t, postfix_private_t, postfix_private_t) +- +-allow postfix_local_t postfix_spool_t:file rw_file_perms; ++rw_files_pattern(postfix_local_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + + domtrans_pattern(postfix_local_t, postfix_postdrop_exec_t, postfix_postdrop_t) + ++allow postfix_local_t postfix_spool_t:file rw_file_perms; ++ ++corecmd_exec_shell(postfix_local_t) + corecmd_exec_bin(postfix_local_t) + + logging_dontaudit_search_logs(postfix_local_t) + + mta_delete_spool(postfix_local_t) +-mta_read_aliases(postfix_local_t) +-mta_read_config(postfix_local_t) ++# Handle vacation script + mta_send_mail(postfix_local_t) + ++userdom_read_user_home_content_files(postfix_local_t) ++userdom_exec_user_bin_files(postfix_local_t) ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_exec_nfs_files(postfix_local_t) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_exec_cifs_files(postfix_local_t) ++') ++ + tunable_policy(`postfix_local_write_mail_spool',` + mta_manage_spool(postfix_local_t) + ') + + optional_policy(` +- clamav_search_lib(postfix_local_t) +- clamav_exec_clamscan(postfix_local_t) ++ antivirus_search_db(postfix_local_t) ++ antivirus_exec(postfix_local_t) ++ antivirus_stream_connect(postfix_domain) + ') + + optional_policy(` +@@ -442,15 +357,24 @@ optional_policy(` + ') + + optional_policy(` ++# for postalias + mailman_manage_data_files(postfix_local_t) + mailman_append_log(postfix_local_t) + mailman_read_log(postfix_local_t) + ') + ++optional_policy(` ++ munin_search_lib(postfix_local_t) ++') ++ + optional_policy(` + nagios_search_spool(postfix_local_t) + ') + ++optional_policy(` ++ openshift_search_lib(postfix_local_t) ++') ++ + optional_policy(` + procmail_domtrans(postfix_local_t) + ') +@@ -466,15 +390,17 @@ optional_policy(` + + ######################################## + # +-# Map local policy ++# Postfix map local policy + # ++allow postfix_map_t self:capability { dac_read_search dac_override setgid setuid }; ++allow postfix_map_t self:unix_stream_socket create_stream_socket_perms; ++allow postfix_map_t self:unix_dgram_socket create_socket_perms; ++allow postfix_map_t self:tcp_socket create_stream_socket_perms; ++allow postfix_map_t self:udp_socket create_socket_perms; + +-allow postfix_map_t self:capability { dac_override setgid setuid }; +-allow postfix_map_t self:tcp_socket { accept listen }; +- +-allow postfix_map_t postfix_etc_t:dir manage_dir_perms; +-allow postfix_map_t postfix_etc_t:file manage_file_perms; +-allow postfix_map_t postfix_etc_t:lnk_file manage_lnk_file_perms; ++manage_dirs_pattern(postfix_map_t, postfix_etc_t, postfix_etc_t) ++manage_files_pattern(postfix_map_t, postfix_etc_t, postfix_etc_t) ++manage_lnk_files_pattern(postfix_map_t, postfix_etc_t, postfix_etc_t) + + manage_dirs_pattern(postfix_map_t, postfix_map_tmp_t, postfix_map_tmp_t) + manage_files_pattern(postfix_map_t, postfix_map_tmp_t, postfix_map_tmp_t) +@@ -484,14 +410,15 @@ kernel_read_kernel_sysctls(postfix_map_t) + kernel_dontaudit_list_proc(postfix_map_t) + kernel_dontaudit_read_system_state(postfix_map_t) + +-corenet_all_recvfrom_unlabeled(postfix_map_t) + corenet_all_recvfrom_netlabel(postfix_map_t) + corenet_tcp_sendrecv_generic_if(postfix_map_t) ++corenet_udp_sendrecv_generic_if(postfix_map_t) + corenet_tcp_sendrecv_generic_node(postfix_map_t) +- +-corenet_sendrecv_all_client_packets(postfix_map_t) +-corenet_tcp_connect_all_ports(postfix_map_t) ++corenet_udp_sendrecv_generic_node(postfix_map_t) + corenet_tcp_sendrecv_all_ports(postfix_map_t) ++corenet_udp_sendrecv_all_ports(postfix_map_t) ++corenet_tcp_connect_all_ports(postfix_map_t) ++corenet_sendrecv_all_client_packets(postfix_map_t) + + corecmd_list_bin(postfix_map_t) + corecmd_read_bin_symlinks(postfix_map_t) +@@ -500,7 +427,6 @@ corecmd_read_bin_pipes(postfix_map_t) + corecmd_read_bin_sockets(postfix_map_t) + + files_list_home(postfix_map_t) +-files_read_usr_files(postfix_map_t) + files_read_etc_runtime_files(postfix_map_t) + files_dontaudit_search_var(postfix_map_t) + +@@ -508,21 +434,24 @@ auth_use_nsswitch(postfix_map_t) + + logging_send_syslog_msg(postfix_map_t) + +-miscfiles_read_localization(postfix_map_t) +- + optional_policy(` + locallogin_dontaudit_use_fds(postfix_map_t) + ') + + optional_policy(` ++# for postalias + mailman_manage_data_files(postfix_map_t) + ') + + ######################################## + # +-# Pickup local policy ++# Postfix pickup local policy + # + ++dontaudit postfix_pickup_t self:capability net_admin; ++ ++allow postfix_pickup_t self:tcp_socket create_socket_perms; ++ + stream_connect_pattern(postfix_pickup_t, postfix_private_t, postfix_private_t, postfix_master_t) + + rw_fifo_files_pattern(postfix_pickup_t, postfix_public_t, postfix_public_t) +@@ -532,21 +461,21 @@ allow postfix_pickup_t postfix_spool_t:dir list_dir_perms; + read_files_pattern(postfix_pickup_t, postfix_spool_t, postfix_spool_t) + delete_files_pattern(postfix_pickup_t, postfix_spool_t, postfix_spool_t) + ++postfix_list_spool(postfix_pickup_t) ++ + allow postfix_pickup_t postfix_spool_maildrop_t:dir list_dir_perms; + read_files_pattern(postfix_pickup_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + delete_files_pattern(postfix_pickup_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + +-mcs_file_read_all(postfix_pickup_t) +-mcs_file_write_all(postfix_pickup_t) +- + ######################################## + # +-# Pipe local policy ++# Postfix pipe local policy + # + + allow postfix_pipe_t self:process setrlimit; + + write_sock_files_pattern(postfix_pipe_t, postfix_private_t, postfix_private_t) ++write_sock_files_pattern(postfix_pipe_t, postfix_public_t, postfix_public_t) + + write_fifo_files_pattern(postfix_pipe_t, postfix_public_t, postfix_public_t) + +@@ -556,6 +485,10 @@ domtrans_pattern(postfix_pipe_t, postfix_postdrop_exec_t, postfix_postdrop_t) + + corecmd_exec_bin(postfix_pipe_t) + ++optional_policy(` ++ cyrus_stream_connect(postfix_pipe_t) ++') ++ + optional_policy(` + dovecot_domtrans_deliver(postfix_pipe_t) + ') +@@ -584,19 +517,28 @@ optional_policy(` + + ######################################## + # +-# Postdrop local policy ++# Postfix postdrop local policy + # + ++# usually it does not need a UDP socket + allow postfix_postdrop_t self:capability sys_resource; ++allow postfix_postdrop_t self:tcp_socket create; ++allow postfix_postdrop_t self:udp_socket create_socket_perms; ++ ++# Might be a leak, but I need a postfix expert to explain ++allow postfix_postdrop_t postfix_local_t:unix_stream_socket { read write }; ++allow postfix_postdrop_t postfix_master_t:unix_stream_socket connectto; + + rw_fifo_files_pattern(postfix_postdrop_t, postfix_public_t, postfix_public_t) ++rw_sock_files_pattern(postfix_postdrop_t, postfix_public_t, postfix_public_t) + +-manage_files_pattern(postfix_postdrop_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) ++rw_fifo_files_pattern(postfix_postdrop_t, postfix_master_t, postfix_master_t) + +-allow postfix_postdrop_t postfix_local_t:unix_stream_socket { read write }; ++postfix_list_spool(postfix_postdrop_t) ++manage_files_pattern(postfix_postdrop_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + +-mcs_file_read_all(postfix_postdrop_t) +-mcs_file_write_all(postfix_postdrop_t) ++corenet_udp_sendrecv_generic_if(postfix_postdrop_t) ++corenet_udp_sendrecv_generic_node(postfix_postdrop_t) + + term_dontaudit_use_all_ptys(postfix_postdrop_t) + term_dontaudit_use_all_ttys(postfix_postdrop_t) +@@ -611,10 +553,7 @@ optional_policy(` + cron_system_entry(postfix_postdrop_t, postfix_postdrop_exec_t) + ') + +-optional_policy(` +- fail2ban_dontaudit_use_fds(postfix_postdrop_t) +-') +- ++# https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=239951 + optional_policy(` + fstools_read_pipes(postfix_postdrop_t) + ') +@@ -629,17 +568,24 @@ optional_policy(` + + ####################################### + # +-# Postqueue local policy ++# Postfix postqueue local policy + # + ++allow postfix_postqueue_t self:capability2 block_suspend; ++allow postfix_postqueue_t self:tcp_socket create; ++allow postfix_postqueue_t self:udp_socket { create ioctl }; ++ ++# wants to write to /var/spool/postfix/public/showq + stream_connect_pattern(postfix_postqueue_t, postfix_public_t, postfix_public_t, postfix_master_t) + ++# write to /var/spool/postfix/public/qmgr + write_fifo_files_pattern(postfix_postqueue_t, postfix_public_t, postfix_public_t) + + domtrans_pattern(postfix_postqueue_t, postfix_showq_exec_t, postfix_showq_t) + +-term_use_all_ptys(postfix_postqueue_t) +-term_use_all_ttys(postfix_postqueue_t) ++# to write the mailq output, it really should not need read access! ++term_use_all_inherited_ptys(postfix_postqueue_t) ++term_use_all_inherited_ttys(postfix_postqueue_t) + + init_sigchld_script(postfix_postqueue_t) + init_use_script_fds(postfix_postqueue_t) +@@ -655,69 +601,84 @@ optional_policy(` + + ######################################## + # +-# Qmgr local policy ++# Postfix qmgr local policy + # + +-allow postfix_qmgr_t postfix_spool_bounce_t:dir list_dir_perms; +-allow postfix_qmgr_t postfix_spool_bounce_t:file read_file_perms; +-allow postfix_qmgr_t postfix_spool_bounce_t:lnk_file read_lnk_file_perms; ++dontaudit postfix_qmgr_t self:capability { net_admin }; + + stream_connect_pattern(postfix_qmgr_t, { postfix_private_t postfix_public_t }, { postfix_private_t postfix_public_t }, postfix_master_t) + + rw_fifo_files_pattern(postfix_qmgr_t, postfix_public_t, postfix_public_t) + +-manage_files_pattern(postfix_qmgr_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) +-manage_dirs_pattern(postfix_qmgr_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) +-allow postfix_qmgr_t postfix_spool_maildrop_t:lnk_file read_lnk_file_perms; +- ++# for /var/spool/postfix/active + manage_dirs_pattern(postfix_qmgr_t, postfix_spool_t, postfix_spool_t) + manage_files_pattern(postfix_qmgr_t, postfix_spool_t, postfix_spool_t) + manage_lnk_files_pattern(postfix_qmgr_t, postfix_spool_t, postfix_spool_t) + files_spool_filetrans(postfix_qmgr_t, postfix_spool_t, dir) + ++allow postfix_qmgr_t postfix_spool_bounce_t:dir list_dir_perms; ++allow postfix_qmgr_t postfix_spool_bounce_t:file read_file_perms; ++allow postfix_qmgr_t postfix_spool_bounce_t:lnk_file read_lnk_file_perms; ++ ++manage_files_pattern(postfix_qmgr_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) ++manage_dirs_pattern(postfix_qmgr_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) ++allow postfix_qmgr_t postfix_spool_maildrop_t:lnk_file read_lnk_file_perms; ++ + corecmd_exec_bin(postfix_qmgr_t) + + ######################################## + # +-# Showq local policy ++# Postfix showq local policy + # + + allow postfix_showq_t self:capability { setuid setgid }; ++allow postfix_showq_t self:tcp_socket create_socket_perms; + + allow postfix_showq_t postfix_master_t:unix_stream_socket { accept rw_socket_perms }; + ++allow postfix_showq_t postfix_spool_t:file read_file_perms; ++ ++postfix_list_spool(postfix_showq_t) ++ + allow postfix_showq_t postfix_spool_maildrop_t:dir list_dir_perms; + allow postfix_showq_t postfix_spool_maildrop_t:file read_file_perms; + allow postfix_showq_t postfix_spool_maildrop_t:lnk_file read_lnk_file_perms; + +-allow postfix_showq_t postfix_spool_t:file read_file_perms; +- +-mcs_file_read_all(postfix_showq_t) +- ++# to write the mailq output, it really should not need read access! + term_use_all_ptys(postfix_showq_t) + term_use_all_ttys(postfix_showq_t) + ++optional_policy(` ++ logwatch_dontaudit_leaks(postfix_showq_t) ++') ++ + ######################################## + # +-# Smtp delivery local policy ++# Postfix smtp delivery local policy + # + ++# connect to master process + allow postfix_smtp_t self:capability sys_chroot; +- + stream_connect_pattern(postfix_smtp_t, { postfix_private_t postfix_public_t }, { postfix_private_t postfix_public_t }, postfix_master_t) + +-allow postfix_smtp_t { postfix_prng_t postfix_spool_t }:file rw_file_perms; ++allow postfix_smtp_t postfix_prng_t:file rw_file_perms; ++ ++allow postfix_smtp_t postfix_spool_t:file rw_file_perms; + + rw_files_pattern(postfix_smtp_t, postfix_spool_maildrop_t, postfix_spool_maildrop_t) + + corenet_tcp_bind_generic_node(postfix_smtp_t) ++# for spampd ++corenet_tcp_connect_spamd_port(postfix_master_t) ++ ++files_search_all_mountpoints(postfix_smtp_t) + + optional_policy(` + cyrus_stream_connect(postfix_smtp_t) + ') + + optional_policy(` +- dovecot_stream_connect(postfix_smtp_t) ++ dovecot_stream_connect(postfix_smtp_t) + ') + + optional_policy(` +@@ -730,28 +691,32 @@ optional_policy(` + + ######################################## + # +-# Smtpd local policy ++# Postfix smtpd local policy + # +- + allow postfix_smtpd_t postfix_master_t:tcp_socket rw_stream_socket_perms; + ++# connect to master process + stream_connect_pattern(postfix_smtpd_t, { postfix_private_t postfix_public_t }, { postfix_private_t postfix_public_t }, postfix_master_t) + ++# Connect to policy server ++corenet_tcp_connect_postfix_policyd_port(postfix_smtpd_t) ++ ++# for prng_exch + manage_dirs_pattern(postfix_smtpd_t, postfix_spool_t, postfix_spool_t) + manage_files_pattern(postfix_smtpd_t, postfix_spool_t, postfix_spool_t) + manage_lnk_files_pattern(postfix_smtpd_t, postfix_spool_t, postfix_spool_t) + allow postfix_smtpd_t postfix_prng_t:file rw_file_perms; + +-corenet_sendrecv_postfix_policyd_client_packets(postfix_smtpd_t) +-corenet_tcp_connect_postfix_policyd_port(postfix_smtpd_t) +-corenet_tcp_sendrecv_postfix_policyd_port(postfix_smtpd_t) +- + corecmd_exec_bin(postfix_smtpd_t) + ++# for OpenSSL certificates ++ ++# postfix checks the size of all mounted file systems + fs_getattr_all_dirs(postfix_smtpd_t) +-fs_getattr_all_fs(postfix_smtpd_t) + +-mta_read_aliases(postfix_smtpd_t) ++optional_policy(` ++ antivirus_stream_connect(postfix_smtpd_t) ++') + + optional_policy(` + dovecot_stream_connect_auth(postfix_smtpd_t) +@@ -764,6 +729,7 @@ optional_policy(` + + optional_policy(` + milter_stream_connect_all(postfix_smtpd_t) ++ spamassassin_read_pid_files(postfix_smtpd_t) + ') + + optional_policy(` +@@ -774,31 +740,105 @@ optional_policy(` + sasl_connect(postfix_smtpd_t) + ') + +-optional_policy(` +- spamassassin_read_spamd_pid_files(postfix_smtpd_t) +- spamassassin_stream_connect_spamd(postfix_smtpd_t) +-') +- + ######################################## + # +-# Virtual local policy ++# Postfix virtual local policy + # + +-allow postfix_virtual_t self:process setrlimit; ++allow postfix_virtual_t self:process { setsched setrlimit }; + +-allow postfix_virtual_t postfix_spool_t:file rw_file_perms; ++manage_files_pattern(postfix_virtual_t, postfix_spool_t, postfix_spool_t) + ++# connect to master process + stream_connect_pattern(postfix_virtual_t, { postfix_private_t postfix_public_t }, { postfix_private_t postfix_public_t }, postfix_master_t) + ++corecmd_exec_shell(postfix_virtual_t) + corecmd_exec_bin(postfix_virtual_t) + +-mta_read_aliases(postfix_virtual_t) + mta_delete_spool(postfix_virtual_t) +-mta_read_config(postfix_virtual_t) + mta_manage_spool(postfix_virtual_t) + + userdom_manage_user_home_dirs(postfix_virtual_t) +-userdom_manage_user_home_content_dirs(postfix_virtual_t) +-userdom_manage_user_home_content_files(postfix_virtual_t) +-userdom_home_filetrans_user_home_dir(postfix_virtual_t) +-userdom_user_home_dir_filetrans_user_home_content(postfix_virtual_t, { file dir }) ++userdom_manage_user_home_content(postfix_virtual_t) ++userdom_filetrans_home_content(postfix_virtual_t) ++ ++######################################## ++# ++# postfix_domain common policy ++# ++allow postfix_domain self:capability { sys_nice sys_chroot }; ++dontaudit postfix_domain self:capability sys_tty_config; ++allow postfix_domain self:process { signal_perms setpgid setsched }; ++allow postfix_domain self:unix_dgram_socket create_socket_perms; ++allow postfix_domain self:unix_stream_socket create_stream_socket_perms; ++allow postfix_domain self:unix_stream_socket connectto; ++allow postfix_domain self:fifo_file rw_fifo_file_perms; ++ ++allow postfix_master_t postfix_domain:fifo_file { read write }; ++allow postfix_master_t postfix_domain:process signal; ++#https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=244456 ++allow postfix_domain postfix_master_t:file read; ++allow postfix_domain postfix_etc_t:dir list_dir_perms; ++read_files_pattern(postfix_domain, postfix_etc_t, postfix_etc_t) ++read_lnk_files_pattern(postfix_domain, postfix_etc_t, postfix_etc_t) ++ ++allow postfix_domain postfix_exec_t:file { mmap_file_perms lock }; ++ ++allow postfix_domain postfix_pickup_exec_t:file map; ++allow postfix_domain postfix_qmgr_exec_t:file map; ++ ++allow postfix_domain postfix_master_t:process sigchld; ++ ++allow postfix_domain postfix_spool_t:dir list_dir_perms; ++ ++manage_files_pattern(postfix_domain, postfix_var_run_t, postfix_var_run_t) ++files_pid_filetrans(postfix_domain, postfix_var_run_t, file) ++ ++kernel_read_network_state(postfix_domain) ++kernel_read_all_sysctls(postfix_domain) ++kernel_dontaudit_request_load_module(postfix_domain) ++ ++dev_read_sysfs(postfix_domain) ++dev_read_rand(postfix_domain) ++dev_read_urand(postfix_domain) ++ ++fs_search_auto_mountpoints(postfix_domain) ++fs_getattr_all_fs(postfix_domain) ++fs_rw_anon_inodefs_files(postfix_domain) ++ ++term_dontaudit_use_console(postfix_domain) ++ ++corecmd_exec_shell(postfix_domain) ++corecmd_getattr_all_executables(postfix_domain) ++ ++files_read_etc_runtime_files(postfix_domain) ++files_read_usr_symlinks(postfix_domain) ++files_search_spool(postfix_domain) ++files_list_tmp(postfix_domain) ++files_search_all_mountpoints(postfix_domain) ++ ++init_dontaudit_use_fds(postfix_domain) ++init_sigchld(postfix_domain) ++init_dontaudit_rw_stream_socket(postfix_domain) ++ ++# For reading spamassasin ++mta_read_config(postfix_domain) ++mta_read_aliases(postfix_domain) ++ ++miscfiles_read_generic_certs(postfix_domain) ++ ++userdom_dontaudit_use_unpriv_user_fds(postfix_domain) ++ ++optional_policy(` ++ mysql_stream_connect(postfix_domain) ++ mysql_rw_db_sockets(postfix_domain) ++') ++ ++optional_policy(` ++ spamd_stream_connect(postfix_domain) ++ spamassassin_domtrans_client(postfix_domain) ++') ++ ++optional_policy(` ++ udev_read_db(postfix_domain) ++') +diff --git a/postfixpolicyd.if b/postfixpolicyd.if +index 5de817368f..985b877ab9 100644 +--- a/postfixpolicyd.if ++++ b/postfixpolicyd.if +@@ -23,8 +23,11 @@ interface(`postfixpolicyd_admin',` + type postfix_policyd_var_run_t, postfix_policyd_initrc_exec_t; + ') + +- allow $1 postfix_policyd_t:process { ptrace signal_perms }; ++ allow $1 postfix_policyd_t:process signal_perms; + ps_process_pattern($1, postfix_policyd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 postfix_policyd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, postfix_policyd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/postfixpolicyd.te b/postfixpolicyd.te +index ea1582a3a9..0c1a05983c 100644 +--- a/postfixpolicyd.te ++++ b/postfixpolicyd.te +@@ -34,7 +34,6 @@ allow postfix_policyd_t postfix_policyd_conf_t:lnk_file read_lnk_file_perms; + manage_files_pattern(postfix_policyd_t, postfix_policyd_var_run_t, postfix_policyd_var_run_t) + files_pid_filetrans(postfix_policyd_t, postfix_policyd_var_run_t, file) + +-corenet_all_recvfrom_unlabeled(postfix_policyd_t) + corenet_tcp_sendrecv_generic_if(postfix_policyd_t) + corenet_tcp_sendrecv_generic_node(postfix_policyd_t) + corenet_tcp_bind_generic_node(postfix_policyd_t) +@@ -47,11 +46,7 @@ corenet_sendrecv_mysqld_server_packets(postfix_policyd_t) + corenet_tcp_bind_mysqld_port(postfix_policyd_t) + corenet_tcp_sendrecv_mysqld_port(postfix_policyd_t) + +-files_read_etc_files(postfix_policyd_t) +-files_read_usr_files(postfix_policyd_t) + + logging_send_syslog_msg(postfix_policyd_t) + +-miscfiles_read_localization(postfix_policyd_t) +- + sysnet_dns_name_resolve(postfix_policyd_t) +diff --git a/postgrey.if b/postgrey.if +index b9e71b5373..a7502cd0e7 100644 +--- a/postgrey.if ++++ b/postgrey.if +@@ -16,9 +16,9 @@ interface(`postgrey_stream_connect',` + type postgrey_var_run_t, postgrey_t, postgrey_spool_t; + ') + ++ stream_connect_pattern($1, { postgrey_spool_t postgrey_var_run_t }, { postgrey_spool_t postgrey_var_run_t }, postgrey_t) + files_search_pids($1) + files_search_spool($1) +- stream_connect_pattern($1, { postgrey_spool_t postgrey_var_run_t }, { postgrey_spool_t postgrey_var_run_t }, postgrey_t) + ') + + ######################################## +@@ -59,14 +59,17 @@ interface(`postgrey_search_spool',` + # + interface(`postgrey_admin',` + gen_require(` +- type postgrey_t, postgrey_etc_t, postgrey_spool_t; +- type postgrey_var_lib_t, postgrey_var_run_t; +- type postgrey_initrc_exec_t; ++ type postgrey_t, postgrey_etc_t, postgrey_initrc_exec_t; ++ type postgrey_spool_t, postgrey_var_lib_t, postgrey_var_run_t; + ') + +- allow $1 postgrey_t:process { ptrace signal_perms }; ++ allow $1 postgrey_t:process signal_perms; + ps_process_pattern($1, postgrey_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 postgrey_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, postgrey_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 postgrey_initrc_exec_t system_r; +diff --git a/postgrey.te b/postgrey.te +index fd58805e54..fbb01fc232 100644 +--- a/postgrey.te ++++ b/postgrey.te +@@ -16,7 +16,7 @@ type postgrey_initrc_exec_t; + init_script_file(postgrey_initrc_exec_t) + + type postgrey_spool_t; +-files_type(postgrey_spool_t) ++files_spool_file(postgrey_spool_t) + + type postgrey_var_lib_t; + files_type(postgrey_var_lib_t) +@@ -29,7 +29,7 @@ files_pid_file(postgrey_var_run_t) + # Local policy + # + +-allow postgrey_t self:capability { chown dac_override setgid setuid }; ++allow postgrey_t self:capability { chown dac_read_search dac_override setgid setuid }; + dontaudit postgrey_t self:capability sys_tty_config; + allow postgrey_t self:process signal_perms; + allow postgrey_t self:fifo_file create_fifo_file_perms; +@@ -43,6 +43,7 @@ manage_dirs_pattern(postgrey_t, postgrey_spool_t, postgrey_spool_t) + manage_files_pattern(postgrey_t, postgrey_spool_t, postgrey_spool_t) + manage_fifo_files_pattern(postgrey_t, postgrey_spool_t, postgrey_spool_t) + manage_sock_files_pattern(postgrey_t, postgrey_spool_t, postgrey_spool_t) ++allow postgrey_t postgrey_spool_t:file map; + + manage_files_pattern(postgrey_t, postgrey_var_lib_t, postgrey_var_lib_t) + files_var_lib_filetrans(postgrey_t, postgrey_var_lib_t, file) +@@ -55,9 +56,10 @@ files_pid_filetrans(postgrey_t, postgrey_var_run_t, { dir file sock_file }) + kernel_read_system_state(postgrey_t) + kernel_read_kernel_sysctls(postgrey_t) + +-corecmd_search_bin(postgrey_t) ++auth_use_nsswitch(postgrey_t) ++ ++corecmd_exec_bin(postgrey_t) + +-corenet_all_recvfrom_unlabeled(postgrey_t) + corenet_all_recvfrom_netlabel(postgrey_t) + corenet_tcp_sendrecv_generic_if(postgrey_t) + corenet_tcp_sendrecv_generic_node(postgrey_t) +@@ -72,17 +74,15 @@ dev_read_sysfs(postgrey_t) + + domain_use_interactive_fds(postgrey_t) + +-files_read_etc_files(postgrey_t) + files_read_etc_runtime_files(postgrey_t) +-files_read_usr_files(postgrey_t) + files_getattr_tmp_dirs(postgrey_t) + + fs_getattr_all_fs(postgrey_t) + fs_search_auto_mountpoints(postgrey_t) + +-logging_send_syslog_msg(postgrey_t) ++auth_read_passwd(postgrey_t) + +-miscfiles_read_localization(postgrey_t) ++logging_send_syslog_msg(postgrey_t) + + sysnet_read_config(postgrey_t) + +diff --git a/ppp.fc b/ppp.fc +index efcb6532d3..ff2c96adb5 100644 +--- a/ppp.fc ++++ b/ppp.fc +@@ -1,30 +1,45 @@ +-HOME_DIR/\.ppprc -- gen_context(system_u:object_r:ppp_home_t,s0) ++# ++# /etc ++# ++/etc/rc\.d/init\.d/ppp -- gen_context(system_u:object_r:pppd_initrc_exec_t,s0) + +-/etc/rc\.d/init\.d/ppp -- gen_context(system_u:object_r:pppd_initrc_exec_t,s0) ++/etc/ppp -d gen_context(system_u:object_r:pppd_etc_t,s0) ++/etc/ppp(/.*)? -- gen_context(system_u:object_r:pppd_etc_rw_t,s0) ++/etc/ppp/peers(/.*)? gen_context(system_u:object_r:pppd_etc_rw_t,s0) ++/etc/ppp/.*secrets -- gen_context(system_u:object_r:pppd_secret_t,s0) ++/etc/ppp/resolv\.conf -- gen_context(system_u:object_r:pppd_etc_rw_t,s0) ++# Fix /etc/ppp {up,down} family scripts (see man pppd) ++/etc/ppp/(auth|ip(v6|x)?)-(up|down) -- gen_context(system_u:object_r:pppd_initrc_exec_t,s0) + +-/etc/ppp -d gen_context(system_u:object_r:pppd_etc_t,s0) +-/etc/ppp(/.*)? -- gen_context(system_u:object_r:pppd_etc_rw_t,s0) +-/etc/ppp/peers(/.*)? gen_context(system_u:object_r:pppd_etc_rw_t,s0) +-/etc/ppp/.*secrets -- gen_context(system_u:object_r:pppd_secret_t,s0) +-/etc/ppp/resolv\.conf -- gen_context(system_u:object_r:pppd_etc_rw_t,s0) +-/etc/ppp/(auth|ip(v6|x)?)-(up|down) -- gen_context(system_u:object_r:pppd_initrc_exec_t,s0) ++/usr/lib/systemd/system/ppp.* -- gen_context(system_u:object_r:iptables_unit_file_t,s0) + +-/sbin/ppp-watch -- gen_context(system_u:object_r:pppd_exec_t,s0) +-/sbin/pppoe-server -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/root/.ppprc -- gen_context(system_u:object_r:pppd_etc_t,s0) + +-/usr/sbin/ipppd -- gen_context(system_u:object_r:pppd_exec_t,s0) +-/usr/sbin/ppp-watch -- gen_context(system_u:object_r:pppd_exec_t,s0) +-/usr/sbin/pppd -- gen_context(system_u:object_r:pppd_exec_t,s0) +-/usr/sbin/pppoe-server -- gen_context(system_u:object_r:pppd_exec_t,s0) +-/usr/sbin/pptp -- gen_context(system_u:object_r:pptp_exec_t,s0) ++# ++# /sbin ++# ++/sbin/pppoe-server -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/sbin/ppp-watch -- gen_context(system_u:object_r:pppd_exec_t,s0) + +-/var/lock/ppp(/.*)? gen_context(system_u:object_r:pppd_lock_t,s0) +- +-/var/log/ppp-connect-errors.* -- gen_context(system_u:object_r:pppd_log_t,s0) +-/var/log/ppp/.* -- gen_context(system_u:object_r:pppd_log_t,s0) +-/var/log/pptp.* -- gen_context(system_u:object_r:pptp_log_t,s0) ++# ++# /usr ++# ++/usr/sbin/ipppd -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/usr/sbin/ppp-watch -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/usr/sbin/pppd -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/usr/sbin/pppoe-server -- gen_context(system_u:object_r:pppd_exec_t,s0) ++/usr/sbin/pptp -- gen_context(system_u:object_r:pptp_exec_t,s0) + ++# ++# /var ++# + /var/run/(i)?ppp.*pid[^/]* -- gen_context(system_u:object_r:pppd_var_run_t,s0) + /var/run/pppd[0-9]*\.tdb -- gen_context(system_u:object_r:pppd_var_run_t,s0) +-/var/run/ppp(/.*)? gen_context(system_u:object_r:pppd_var_run_t,s0) +-/var/run/pptp(/.*)? gen_context(system_u:object_r:pptp_var_run_t,s0) ++/var/run/ppp(/.*)? gen_context(system_u:object_r:pppd_var_run_t,s0) ++# Fix pptp sockets ++/var/run/pptp(/.*)? gen_context(system_u:object_r:pptp_var_run_t,s0) ++ ++/var/lock/ppp(/.*)? gen_context(system_u:object_r:pppd_lock_t,s0) ++ ++/var/log/ppp-connect-errors.* -- gen_context(system_u:object_r:pppd_log_t,s0) ++/var/log/ppp(/.*)? gen_context(system_u:object_r:pppd_log_t,s0) +diff --git a/ppp.if b/ppp.if +index cd8b8b9cbd..ad8424ba33 100644 +--- a/ppp.if ++++ b/ppp.if +@@ -1,110 +1,91 @@ +-## Point to Point Protocol daemon creates links in ppp networks. ++## Point to Point Protocol daemon creates links in ppp networks + +-######################################## +-## +-## Role access for ppp. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-interface(`ppp_role',` +- refpolicywarn(`$0($*) has been deprecated') +-') +- +-######################################## ++####################################### + ## +-## Create, read, write, and delete +-## ppp home files. ++## Create, read, write, and delete ++## ppp home files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`ppp_manage_home_files',` +- gen_require(` +- type ppp_home_t; +- ') ++ gen_require(` ++ type ppp_home_t; ++ ') + +- userdom_search_user_home_dirs($1) +- allow $1 ppp_home_t:file manage_file_perms; ++ userdom_search_user_home_dirs($1) ++ allow $1 ppp_home_t:file manage_file_perms; + ') + +-######################################## ++####################################### + ## +-## Read ppp user home content files. ++## Read ppp user home content files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`ppp_read_home_files',` +- gen_require(` +- type ppp_home_t; ++ gen_require(` ++ type ppp_home_t; + +- ') ++ ') + +- userdom_search_user_home_dirs($1) +- allow $1 ppp_home_t:file read_file_perms; ++ userdom_search_user_home_dirs($1) ++ allow $1 ppp_home_t:file read_file_perms; + ') + +-######################################## ++####################################### + ## +-## Relabel ppp home files. ++## Relabel ppp home files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`ppp_relabel_home_files',` +- gen_require(` +- type ppp_home_t; +- ') ++ gen_require(` ++ type ppp_home_t; ++ ') + +- userdom_search_user_home_dirs($1) +- allow $1 ppp_home_t:file relabel_file_perms; ++ userdom_search_user_home_dirs($1) ++ allow $1 ppp_home_t:file relabel_file_perms; + ') + +-######################################## ++####################################### + ## +-## Create objects in user home +-## directories with the ppp home type. ++## Create objects in user home ++## directories with the ppp home type. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + ## +-## +-## Class of the object being created. +-## ++## ++## Class of the object being created. ++## + ## + ## +-## +-## The name of the object being created. +-## ++## ++## The name of the object being created. ++## + ## + # + interface(`ppp_home_filetrans_ppp_home',` +- gen_require(` +- type ppp_home_t; +- ') ++ gen_require(` ++ type ppp_home_t; ++ ') + +- userdom_user_home_dir_filetrans($1, ppp_home_t, $2, $3) ++ userdom_user_home_dir_filetrans($1, ppp_home_t, $2, $3) + ') + + ######################################## +@@ -128,7 +109,7 @@ interface(`ppp_use_fds',` + ######################################## + ## + ## Do not audit attempts to inherit +-## and use ppp file discriptors. ++## and use PPP file discriptors. + ## + ## + ## +@@ -146,7 +127,7 @@ interface(`ppp_dontaudit_use_fds',` + + ######################################## + ## +-## Send child terminated signals to ppp. ++## Send a SIGCHLD signal to PPP. + ## + ## + ## +@@ -165,7 +146,7 @@ interface(`ppp_sigchld',` + + ######################################## + ## +-## Send kill signals to ppp. ++## Send ppp a kill signal + ## + ## + ## +@@ -173,7 +154,6 @@ interface(`ppp_sigchld',` + ## + ## + # +-# + interface(`ppp_kill',` + gen_require(` + type pppd_t; +@@ -184,7 +164,7 @@ interface(`ppp_kill',` + + ######################################## + ## +-## Send generic signals to ppp. ++## Send a generic signal to PPP. + ## + ## + ## +@@ -202,7 +182,7 @@ interface(`ppp_signal',` + + ######################################## + ## +-## Send null signals to ppp. ++## Send a generic signull to PPP. + ## + ## + ## +@@ -220,7 +200,7 @@ interface(`ppp_signull',` + + ######################################## + ## +-## Execute pppd in the pppd domain. ++## Execute domain in the ppp domain. + ## + ## + ## +@@ -239,8 +219,7 @@ interface(`ppp_domtrans',` + + ######################################## + ## +-## Conditionally execute pppd on +-## behalf of a user or staff type. ++## Conditionally execute ppp daemon on behalf of a user or staff type. + ## + ## + ## +@@ -249,7 +228,7 @@ interface(`ppp_domtrans',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the ppp domain. + ## + ## + ## +@@ -268,8 +247,7 @@ interface(`ppp_run_cond',` + + ######################################## + ## +-## Unconditionally execute ppp daemon +-## on behalf of a user or staff type. ++## Unconditionally execute ppp daemon on behalf of a user or staff type. + ## + ## + ## +@@ -278,7 +256,7 @@ interface(`ppp_run_cond',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the ppp domain. + ## + ## + ## +@@ -294,7 +272,7 @@ interface(`ppp_run',` + + ######################################## + ## +-## Execute domain in the caller domain. ++## Execute domain in the ppp caller. + ## + ## + ## +@@ -326,13 +304,13 @@ interface(`ppp_read_config',` + type pppd_etc_t; + ') + +- files_search_etc($1) + read_files_pattern($1, pppd_etc_t, pppd_etc_t) ++ files_search_etc($1) + ') + + ######################################## + ## +-## Read ppp writable configuration content. ++## Read PPP-writable configuration files. + ## + ## + ## +@@ -345,15 +323,14 @@ interface(`ppp_read_rw_config',` + type pppd_etc_t, pppd_etc_rw_t; + ') + +- files_search_etc($1) +- allow $1 { pppd_etc_t pppd_etc_rw_t }:dir list_dir_perms; ++ allow $1 pppd_etc_t:dir list_dir_perms; + allow $1 pppd_etc_rw_t:file read_file_perms; +- allow $1 { pppd_etc_t pppd_etc_rw_t }:lnk_file read_lnk_file_perms; ++ files_search_etc($1) + ') + + ######################################## + ## +-## Read ppp secret files. ++## Read PPP secrets. + ## + ## + ## +@@ -366,15 +343,14 @@ interface(`ppp_read_secrets',` + type pppd_etc_t, pppd_secret_t; + ') + +- files_search_etc($1) + allow $1 pppd_etc_t:dir list_dir_perms; + allow $1 pppd_secret_t:file read_file_perms; +- allow $1 pppd_etc_t:lnk_file read_lnk_file_perms; ++ files_search_etc($1) + ') + + ######################################## + ## +-## Read ppp pid files. ++## Read PPP pid files. + ## + ## + ## +@@ -388,13 +364,12 @@ interface(`ppp_read_pid_files',` + ') + + files_search_pids($1) +- allow $1 pppd_var_run_t:file read_file_perms; ++ read_files_pattern($1, pppd_var_run_t, pppd_var_run_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## ppp pid files. ++## Create, read, write, and delete PPP pid files. + ## + ## + ## +@@ -408,42 +383,30 @@ interface(`ppp_manage_pid_files',` + ') + + files_search_pids($1) +- allow $1 pppd_var_run_t:file manage_file_perms; ++ manage_files_pattern($1, pppd_var_run_t, pppd_var_run_t) + ') + + ######################################## + ## +-## Create specified pppd pid objects +-## with a type transition. ++## Create, read, write, and delete PPP pid files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # + interface(`ppp_pid_filetrans',` + gen_require(` + type pppd_var_run_t; + ') + +- files_pid_filetrans($1, pppd_var_run_t, $2, $3) ++ files_pid_filetrans($1, pppd_var_run_t, file) + ') + + ######################################## + ## +-## Execute pppd init script in +-## the initrc domain. ++## Execute ppp server in the ntpd domain. + ## + ## + ## +@@ -461,31 +424,82 @@ interface(`ppp_initrc_domtrans',` + + ######################################## + ## +-## All of the rules required to +-## administrate an ppp environment. ++## Execute pppd server in the pppd domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## ++# ++interface(`ppp_systemctl',` ++ gen_require(` ++ type pppd_unit_file_t; ++ type pppd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 pppd_unit_file_t:file read_file_perms; ++ allow $1 pppd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, pppd_t) ++') ++ ++ ++######################################## ++## ++## Transition to ppp named content ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## ++# ++interface(`ppp_filetrans_named_content',` ++ gen_require(` ++ type pppd_lock_t; ++ ') ++ ++ files_lock_filetrans($1, pppd_lock_t, dir, "ppp") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an ppp environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## + ## + # + interface(`ppp_admin',` + gen_require(` + type pppd_t, pppd_tmp_t, pppd_log_t, pppd_lock_t; +- type pppd_etc_t, pppd_secret_t, pppd_etc_rw_t; +- type pppd_var_run_t, pppd_initrc_exec_t; ++ type pppd_etc_t, pppd_secret_t, pppd_var_run_t; + type pptp_t, pptp_log_t, pptp_var_run_t; ++ type pppd_initrc_exec_t, pppd_etc_rw_t; ++ type pppd_unit_file_t; ++ ') ++ ++ allow $1 pppd_t:process signal_perms; ++ ps_process_pattern($1, pppd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 pppd_t:process ptrace; ++ allow $1 pptp_t:process ptrace; + ') + +- allow $1 { pptp_t pppd_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { pptp_t pppd_t }) ++ allow $1 pptp_t:process signal_perms; ++ ps_process_pattern($1, pptp_t) + + ppp_initrc_domtrans($1) + domain_system_change_exemption($1) +@@ -496,14 +510,26 @@ interface(`ppp_admin',` + admin_pattern($1, pppd_tmp_t) + + logging_list_logs($1) +- admin_pattern($1, { pptp_log_t pppd_log_t }) ++ admin_pattern($1, pppd_log_t) + + files_list_locks($1) + admin_pattern($1, pppd_lock_t) + + files_list_etc($1) +- admin_pattern($1, { pppd_etc_rw_t pppd_secret_t pppd_etc_t }) ++ admin_pattern($1, pppd_etc_t) ++ ++ admin_pattern($1, pppd_etc_rw_t) ++ ++ admin_pattern($1, pppd_secret_t) + + files_list_pids($1) +- admin_pattern($1, { pptp_var_run_t pppd_var_run_t }) ++ admin_pattern($1, pppd_var_run_t) ++ ++ admin_pattern($1, pptp_log_t) ++ ++ admin_pattern($1, pptp_var_run_t) ++ ++ ppp_systemctl($1) ++ admin_pattern($1, pppd_unit_file_t) ++ allow $1 pppd_unit_file_t:service all_service_perms; + ') +diff --git a/ppp.te b/ppp.te +index d616ca3e38..7910fb8895 100644 +--- a/ppp.te ++++ b/ppp.te +@@ -6,41 +6,47 @@ policy_module(ppp, 1.14.0) + # + + ## +-##

      +-## Determine whether pppd can +-## load kernel modules. +-##

      ++##

      ++## Allow pppd to load kernel modules for certain modems ++##

      + ##
      + gen_tunable(pppd_can_insmod, false) + + ## +-##

      +-## Determine whether common users can +-## run pppd with a domain transition. +-##

      ++##

      ++## Allow pppd to be run for a regular user ++##

      + ##
      + gen_tunable(pppd_for_user, false) + + attribute_role pppd_roles; +-attribute_role pptp_roles; + ++# pppd_t is the domain for the pppd program. ++# pppd_exec_t is the type of the pppd executable. + type pppd_t; + type pppd_exec_t; + init_daemon_domain(pppd_t, pppd_exec_t) + role pppd_roles types pppd_t; ++role system_r types pppd_t; + + type pppd_devpts_t; + term_pty(pppd_devpts_t) + ++# Define a separate type for /etc/ppp + type pppd_etc_t; + files_config_file(pppd_etc_t) + ++# Define a separate type for writable files under /etc/ppp + type pppd_etc_rw_t; + files_type(pppd_etc_rw_t) + + type pppd_initrc_exec_t alias pppd_script_exec_t; + init_script_file(pppd_initrc_exec_t) + ++type pppd_unit_file_t; ++systemd_unit_file(pppd_unit_file_t) ++ ++# pppd_secret_t is the type of the pap and chap password files + type pppd_secret_t; + files_type(pppd_secret_t) + +@@ -59,7 +65,8 @@ files_pid_file(pppd_var_run_t) + type pptp_t; + type pptp_exec_t; + init_daemon_domain(pptp_t, pptp_exec_t) +-role pptp_roles types pptp_t; ++#role pppd_roles types pptp_t; ++role system_r types pptp_t; + + type pptp_log_t; + logging_log_file(pptp_log_t) +@@ -67,54 +74,61 @@ logging_log_file(pptp_log_t) + type pptp_var_run_t; + files_pid_file(pptp_var_run_t) + +-type ppp_home_t; +-userdom_user_home_content(ppp_home_t) +- + ######################################## + # +-# PPPD local policy ++# PPPD Local policy + # + +-allow pppd_t self:capability { kill net_admin setuid setgid sys_admin fsetid fowner net_raw dac_override sys_nice }; ++allow pppd_t self:capability { kill net_admin setuid setgid sys_admin fsetid fowner net_raw dac_read_search dac_override sys_nice sys_chroot }; + dontaudit pppd_t self:capability sys_tty_config; +-allow pppd_t self:process { getsched setsched signal }; ++dontaudit pppd_t self:capability2 block_suspend; ++allow pppd_t self:process { getsched setsched signal_perms }; + allow pppd_t self:fifo_file rw_fifo_file_perms; + allow pppd_t self:socket create_socket_perms; +-allow pppd_t self:netlink_route_socket nlmsg_write; +-allow pppd_t self:tcp_socket { accept listen }; ++allow pppd_t self:unix_dgram_socket create_socket_perms; ++allow pppd_t self:unix_stream_socket { connectto create_socket_perms }; ++allow pppd_t self:netlink_route_socket rw_netlink_socket_perms; ++allow pppd_t self:tcp_socket create_stream_socket_perms; ++allow pppd_t self:udp_socket { connect connected_socket_perms }; + allow pppd_t self:packet_socket create_socket_perms; + ++domtrans_pattern(pppd_t, pptp_exec_t, pptp_t) ++ + allow pppd_t pppd_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms }; + + allow pppd_t pppd_etc_t:dir rw_dir_perms; +-allow pppd_t { pppd_etc_t ppp_home_t }:file read_file_perms; ++allow pppd_t pppd_etc_t:file read_file_perms; + allow pppd_t pppd_etc_t:lnk_file read_lnk_file_perms; + + manage_files_pattern(pppd_t, pppd_etc_rw_t, pppd_etc_rw_t) ++# Automatically label newly created files under /etc/ppp with this type + filetrans_pattern(pppd_t, pppd_etc_t, pppd_etc_rw_t, file) + +-allow pppd_t pppd_lock_t:file manage_file_perms; +-files_lock_filetrans(pppd_t, pppd_lock_t, file) ++manage_files_pattern(pppd_t, pppd_lock_t, pppd_lock_t) ++files_lock_filetrans(pppd_t, pppd_lock_t, dir) ++files_search_locks(pppd_t) + +-allow pppd_t pppd_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(pppd_t, pppd_log_t, pppd_log_t) + logging_log_filetrans(pppd_t, pppd_log_t, file) + + manage_dirs_pattern(pppd_t, pppd_tmp_t, pppd_tmp_t) + manage_files_pattern(pppd_t, pppd_tmp_t, pppd_tmp_t) +-files_tmp_filetrans(pppd_t, pppd_tmp_t, { dir file}) ++files_tmp_filetrans(pppd_t, pppd_tmp_t, { file dir }) + + manage_dirs_pattern(pppd_t, pppd_var_run_t, pppd_var_run_t) + manage_files_pattern(pppd_t, pppd_var_run_t, pppd_var_run_t) ++manage_sock_files_pattern(pppd_t, pppd_var_run_t, pppd_var_run_t) + files_pid_filetrans(pppd_t, pppd_var_run_t, { dir file }) +- +-can_exec(pppd_t, pppd_exec_t) +- +-domtrans_pattern(pppd_t, pptp_exec_t, pptp_t) ++allow pppd_t pppd_var_run_t:file map; + + allow pppd_t pptp_t:process signal; + ++# for SSP ++# Access secret files + allow pppd_t pppd_secret_t:file read_file_perms; + ++ppp_initrc_domtrans(pppd_t) ++ + kernel_read_kernel_sysctls(pppd_t) + kernel_read_system_state(pppd_t) + kernel_rw_net_sysctls(pppd_t) +@@ -122,10 +136,10 @@ kernel_read_network_state(pppd_t) + kernel_request_load_module(pppd_t) + + dev_read_urand(pppd_t) ++dev_search_sysfs(pppd_t) + dev_read_sysfs(pppd_t) + dev_rw_modem(pppd_t) + +-corenet_all_recvfrom_unlabeled(pppd_t) + corenet_all_recvfrom_netlabel(pppd_t) + corenet_tcp_sendrecv_generic_if(pppd_t) + corenet_raw_sendrecv_generic_if(pppd_t) +@@ -135,9 +149,22 @@ corenet_raw_sendrecv_generic_node(pppd_t) + corenet_udp_sendrecv_generic_node(pppd_t) + corenet_tcp_sendrecv_all_ports(pppd_t) + corenet_udp_sendrecv_all_ports(pppd_t) +- ++corenet_tcp_connect_http_port(pppd_t) ++# Access /dev/ppp. + corenet_rw_ppp_dev(pppd_t) + ++fs_getattr_all_fs(pppd_t) ++fs_search_auto_mountpoints(pppd_t) ++ ++term_use_unallocated_ttys(pppd_t) ++term_use_usb_ttys(pppd_t) ++term_setattr_unallocated_ttys(pppd_t) ++term_ioctl_generic_ptys(pppd_t) ++# for pppoe ++term_create_pty(pppd_t, pppd_devpts_t) ++term_use_generic_ptys(pppd_t) ++ ++# allow running ip-up and ip-down scripts and running chat. + corecmd_exec_bin(pppd_t) + corecmd_exec_shell(pppd_t) + +@@ -147,36 +174,31 @@ files_exec_etc_files(pppd_t) + files_manage_etc_runtime_files(pppd_t) + files_dontaudit_write_etc_files(pppd_t) + +-fs_getattr_all_fs(pppd_t) +-fs_search_auto_mountpoints(pppd_t) ++# for scripts + +-term_use_unallocated_ttys(pppd_t) +-term_setattr_unallocated_ttys(pppd_t) +-term_ioctl_generic_ptys(pppd_t) +-term_create_pty(pppd_t, pppd_devpts_t) +-term_use_generic_ptys(pppd_t) +- +-init_labeled_script_domtrans(pppd_t, pppd_initrc_exec_t) + init_read_utmp(pppd_t) +-init_signal_script(pppd_t) + init_dontaudit_write_utmp(pppd_t) ++init_signal_script(pppd_t) + +-auth_run_chk_passwd(pppd_t, pppd_roles) + auth_use_nsswitch(pppd_t) ++auth_domtrans_chk_passwd(pppd_t) ++#auth_run_chk_passwd(pppd_t,pppd_roles) + auth_write_login_records(pppd_t) + + logging_send_syslog_msg(pppd_t) + logging_send_audit_msgs(pppd_t) + +-miscfiles_read_localization(pppd_t) +- + sysnet_exec_ifconfig(pppd_t) + sysnet_manage_config(pppd_t) + sysnet_etc_filetrans_config(pppd_t) ++sysnet_filetrans_config_fromdir(pppd_t, pppd_var_run_t, file, "resolv.conf") + +-userdom_use_user_terminals(pppd_t) ++userdom_use_inherited_user_terminals(pppd_t) + userdom_dontaudit_use_unpriv_user_fds(pppd_t) + userdom_search_user_home_dirs(pppd_t) ++userdom_search_admin_dir(pppd_t) ++ ++ppp_exec(pppd_t) + + optional_policy(` + ddclient_run(pppd_t, pppd_roles) +@@ -186,11 +208,13 @@ optional_policy(` + l2tpd_dgram_send(pppd_t) + l2tpd_rw_socket(pppd_t) + l2tpd_stream_connect(pppd_t) ++ l2tpd_read_pid_files(pppd_t) ++ l2tpd_dbus_chat(pppd_t) + ') + + optional_policy(` + tunable_policy(`pppd_can_insmod',` +- modutils_domtrans_insmod(pppd_t) ++ modutils_domtrans_insmod_uncond(pppd_t) + ') + ') + +@@ -218,16 +242,19 @@ optional_policy(` + + ######################################## + # +-# PPTP local policy ++# PPTP Local policy + # + + allow pptp_t self:capability { dac_override dac_read_search net_raw net_admin }; + dontaudit pptp_t self:capability sys_tty_config; + allow pptp_t self:process signal; + allow pptp_t self:fifo_file rw_fifo_file_perms; +-allow pptp_t self:unix_stream_socket { accept connectto listen }; ++allow pptp_t self:unix_dgram_socket create_socket_perms; ++allow pptp_t self:unix_stream_socket { connectto create_stream_socket_perms }; + allow pptp_t self:rawip_socket create_socket_perms; +-allow pptp_t self:netlink_route_socket nlmsg_write; ++allow pptp_t self:tcp_socket create_socket_perms; ++allow pptp_t self:udp_socket create_socket_perms; ++allow pptp_t self:netlink_route_socket rw_netlink_socket_perms; + + allow pptp_t pppd_etc_t:dir list_dir_perms; + allow pptp_t pppd_etc_t:file read_file_perms; +@@ -236,45 +263,43 @@ allow pptp_t pppd_etc_t:lnk_file read_lnk_file_perms; + allow pptp_t pppd_etc_rw_t:dir list_dir_perms; + allow pptp_t pppd_etc_rw_t:file read_file_perms; + allow pptp_t pppd_etc_rw_t:lnk_file read_lnk_file_perms; ++can_exec(pptp_t, pppd_etc_rw_t) + ++# Allow pptp to append to pppd log files + allow pptp_t pppd_log_t:file append_file_perms; + +-allow pptp_t pptp_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow pptp_t pptp_log_t:file manage_file_perms; + logging_log_filetrans(pptp_t, pptp_log_t, file) + ++manage_dirs_pattern(pptp_t, pptp_var_run_t, pptp_var_run_t) + manage_files_pattern(pptp_t, pptp_var_run_t, pptp_var_run_t) + manage_sock_files_pattern(pptp_t, pptp_var_run_t, pptp_var_run_t) +-files_pid_filetrans(pptp_t, pptp_var_run_t, file) +- +-can_exec(pptp_t, pppd_etc_rw_t) ++files_pid_filetrans(pptp_t, pptp_var_run_t, { file dir }) + ++kernel_list_proc(pptp_t) + kernel_read_kernel_sysctls(pptp_t) + kernel_read_network_state(pptp_t) ++kernel_read_proc_symlinks(pptp_t) + kernel_read_system_state(pptp_t) + kernel_signal(pptp_t) + ++dev_read_sysfs(pptp_t) ++ + corecmd_exec_shell(pptp_t) + corecmd_read_bin_symlinks(pptp_t) + +-corenet_all_recvfrom_unlabeled(pptp_t) + corenet_all_recvfrom_netlabel(pptp_t) + corenet_tcp_sendrecv_generic_if(pptp_t) + corenet_raw_sendrecv_generic_if(pptp_t) + corenet_tcp_sendrecv_generic_node(pptp_t) + corenet_raw_sendrecv_generic_node(pptp_t) + corenet_tcp_sendrecv_all_ports(pptp_t) +- +-corenet_tcp_connect_all_reserved_ports(pptp_t) ++corenet_tcp_bind_generic_node(pptp_t) + corenet_tcp_connect_generic_port(pptp_t) ++corenet_tcp_connect_all_reserved_ports(pptp_t) + corenet_sendrecv_generic_client_packets(pptp_t) +- +-corenet_sendrecv_pptp_client_packets(pptp_t) + corenet_tcp_connect_pptp_port(pptp_t) + +-dev_read_sysfs(pptp_t) +- +-domain_use_interactive_fds(pptp_t) +- + fs_getattr_all_fs(pptp_t) + fs_search_auto_mountpoints(pptp_t) + +@@ -282,12 +307,12 @@ term_ioctl_generic_ptys(pptp_t) + term_search_ptys(pptp_t) + term_use_ptmx(pptp_t) + ++domain_use_interactive_fds(pptp_t) ++ + auth_use_nsswitch(pptp_t) + + logging_send_syslog_msg(pptp_t) + +-miscfiles_read_localization(pptp_t) +- + sysnet_exec_ifconfig(pptp_t) + + userdom_dontaudit_use_unpriv_user_fds(pptp_t) +@@ -298,6 +323,10 @@ optional_policy(` + consoletype_exec(pppd_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(pppd_t) ++') ++ + optional_policy(` + dbus_system_domain(pppd_t, pppd_exec_t) + +diff --git a/prelink.fc b/prelink.fc +index a90d6231f5..62af9a4a03 100644 +--- a/prelink.fc ++++ b/prelink.fc +@@ -1,11 +1,11 @@ + /etc/cron\.daily/prelink -- gen_context(system_u:object_r:prelink_cron_system_exec_t,s0) + +-/etc/prelink\.cache -- gen_context(system_u:object_r:prelink_cache_t,s0) ++/etc/prelink\.cache -- gen_context(system_u:object_r:prelink_cache_t,s0) + + /usr/sbin/prelink(\.bin)? -- gen_context(system_u:object_r:prelink_exec_t,s0) + +-/var/log/prelink\.log.* -- gen_context(system_u:object_r:prelink_log_t,s0) +-/var/log/prelink(/.*)? gen_context(system_u:object_r:prelink_log_t,s0) ++/var/log/prelink\.log.* -- gen_context(system_u:object_r:prelink_log_t,s0) ++/var/log/prelink(/.*)? gen_context(system_u:object_r:prelink_log_t,s0) + +-/var/lib/misc/prelink.* -- gen_context(system_u:object_r:prelink_var_lib_t,s0) +-/var/lib/prelink(/.*)? gen_context(system_u:object_r:prelink_var_lib_t,s0) ++/var/lib/misc/prelink.* -- gen_context(system_u:object_r:prelink_var_lib_t,s0) ++/var/lib/prelink(/.*)? gen_context(system_u:object_r:prelink_var_lib_t,s0) +diff --git a/prelink.if b/prelink.if +index 20d469793f..e6605c1008 100644 +--- a/prelink.if ++++ b/prelink.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Execute prelink in the prelink domain. ++## Execute the prelink program in the prelink domain. + ## + ## + ## +@@ -18,15 +18,15 @@ interface(`prelink_domtrans',` + corecmd_search_bin($1) + domtrans_pattern($1, prelink_exec_t, prelink_t) + +- ifdef(`hide_broken_symptoms',` ++ ifdef(`hide_broken_symptoms', ` + dontaudit prelink_t $1:socket_class_set { read write }; +- dontaudit prelink_t $1:fifo_file setattr_fifo_file_perms; ++ dontaudit prelink_t $1:fifo_file setattr; + ') + ') + + ######################################## + ## +-## Execute prelink in the caller domain. ++## Execute the prelink program in the current domain. + ## + ## + ## +@@ -45,9 +45,7 @@ interface(`prelink_exec',` + + ######################################## + ## +-## Execute prelink in the prelink +-## domain, and allow the specified role +-## the prelink domain. ++## Execute the prelink program in the prelink domain. + ## + ## + ## +@@ -56,18 +54,18 @@ interface(`prelink_exec',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the prelink domain. + ## + ## + ## + # + interface(`prelink_run',` + gen_require(` +- attribute_role prelink_roles; ++ type prelink_t; + ') + + prelink_domtrans($1) +- roleattribute $2 prelink_roles; ++ role $2 types prelink_t; + ') + + ######################################## +@@ -80,6 +78,7 @@ interface(`prelink_run',` + ## + ## + # ++# cjp: added for misc non-entrypoint objects + interface(`prelink_object_file',` + gen_require(` + attribute prelink_object; +@@ -90,7 +89,7 @@ interface(`prelink_object_file',` + + ######################################## + ## +-## Read prelink cache files. ++## Read the prelink cache. + ## + ## + ## +@@ -109,7 +108,7 @@ interface(`prelink_read_cache',` + + ######################################## + ## +-## Delete prelink cache files. ++## Delete the prelink cache. + ## + ## + ## +@@ -122,8 +121,8 @@ interface(`prelink_delete_cache',` + type prelink_cache_t; + ') + ++ allow $1 prelink_cache_t:file unlink; + files_rw_etc_dirs($1) +- allow $1 prelink_cache_t:file delete_file_perms; + ') + + ######################################## +@@ -168,7 +167,7 @@ interface(`prelink_manage_lib',` + + ######################################## + ## +-## Relabel from prelink lib files. ++## Relabel from files in the /boot directory. + ## + ## + ## +@@ -187,7 +186,7 @@ interface(`prelink_relabelfrom_lib',` + + ######################################## + ## +-## Relabel prelink lib files. ++## Relabel from files in the /boot directory. + ## + ## + ## +@@ -203,3 +202,21 @@ interface(`prelink_relabel_lib',` + files_search_var_lib($1) + relabel_files_pattern($1, prelink_var_lib_t, prelink_var_lib_t) + ') ++ ++######################################## ++## ++## Transition to prelink named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prelink_filetrans_named_content',` ++ gen_require(` ++ type prelink_cache_t; ++ ') ++ ++ files_etc_filetrans($1, prelink_cache_t, file, "prelink.cache") ++') +diff --git a/prelink.te b/prelink.te +index 8e262163b3..6facb34654 100644 +--- a/prelink.te ++++ b/prelink.te +@@ -6,13 +6,10 @@ policy_module(prelink, 1.11.0) + + attribute prelink_object; + +-attribute_role prelink_roles; +- + type prelink_t; + type prelink_exec_t; + init_system_domain(prelink_t, prelink_exec_t) + domain_obj_id_change_exemption(prelink_t) +-role prelink_roles types prelink_t; + + type prelink_cache_t; + files_type(prelink_cache_t) +@@ -40,31 +37,34 @@ files_type(prelink_var_lib_t) + # Local policy + # + +-allow prelink_t self:capability { chown dac_override fowner fsetid setfcap sys_resource }; ++allow prelink_t self:capability { chown dac_read_search dac_override fowner fsetid setfcap sys_resource }; + allow prelink_t self:process { execheap execmem execstack signal }; + allow prelink_t self:fifo_file rw_fifo_file_perms; + + allow prelink_t prelink_cache_t:file manage_file_perms; + files_etc_filetrans(prelink_t, prelink_cache_t, file) + +-allow prelink_t prelink_log_t:dir setattr_dir_perms; ++allow prelink_t prelink_log_t:dir setattr; + create_files_pattern(prelink_t, prelink_log_t, prelink_log_t) + append_files_pattern(prelink_t, prelink_log_t, prelink_log_t) + read_lnk_files_pattern(prelink_t, prelink_log_t, prelink_log_t) + logging_log_filetrans(prelink_t, prelink_log_t, file) + +-allow prelink_t prelink_tmp_t:file { manage_file_perms mmap_file_perms relabel_file_perms execmod }; ++allow prelink_t prelink_tmp_t:file { manage_file_perms execute relabelfrom execmod }; + files_tmp_filetrans(prelink_t, prelink_tmp_t, file) + +-allow prelink_t prelink_tmpfs_t:file { manage_file_perms mmap_file_perms relabel_file_perms execmod }; ++allow prelink_t prelink_tmpfs_t:file { manage_file_perms execute relabelfrom execmod }; + fs_tmpfs_filetrans(prelink_t, prelink_tmpfs_t, file) + + manage_dirs_pattern(prelink_t, prelink_var_lib_t, prelink_var_lib_t) + manage_files_pattern(prelink_t, prelink_var_lib_t, prelink_var_lib_t) + relabel_files_pattern(prelink_t, prelink_var_lib_t, prelink_var_lib_t) + files_var_lib_filetrans(prelink_t, prelink_var_lib_t, { dir file }) ++files_search_var_lib(prelink_t) + +-allow prelink_t prelink_object:file { manage_file_perms mmap_file_perms relabel_file_perms }; ++# prelink misc objects that are not system ++# libraries or entrypoints ++allow prelink_t prelink_object:file { manage_file_perms execute relabel_file_perms }; + + kernel_read_system_state(prelink_t) + kernel_read_kernel_sysctls(prelink_t) +@@ -75,25 +75,23 @@ corecmd_mmap_all_executables(prelink_t) + corecmd_read_bin_symlinks(prelink_t) + + dev_read_urand(prelink_t) ++dev_getattr_all_chr_files(prelink_t) + +-files_getattr_all_files(prelink_t) + files_list_all(prelink_t) ++files_getattr_all_files(prelink_t) ++files_write_non_security_dirs(prelink_t) ++files_read_etc_runtime_files(prelink_t) ++files_dontaudit_read_all_symlinks(prelink_t) + files_manage_usr_files(prelink_t) + files_manage_var_files(prelink_t) +-files_read_etc_files(prelink_t) +-files_read_etc_runtime_files(prelink_t) + files_relabelfrom_usr_files(prelink_t) +-files_search_var_lib(prelink_t) +-files_write_non_security_dirs(prelink_t) +-files_dontaudit_read_all_symlinks(prelink_t) + +-fs_getattr_all_fs(prelink_t) +-fs_search_auto_mountpoints(prelink_t) +- +-selinux_get_enforce_mode(prelink_t) ++fs_getattr_xattr_fs(prelink_t) + + storage_getattr_fixed_disk_dev(prelink_t) + ++selinux_get_enforce_mode(prelink_t) ++ + libs_exec_ld_so(prelink_t) + libs_legacy_use_shared_libs(prelink_t) + libs_manage_ld_so(prelink_t) +@@ -102,32 +100,16 @@ libs_manage_shared_libs(prelink_t) + libs_relabel_shared_libs(prelink_t) + libs_delete_lib_symlinks(prelink_t) + +-miscfiles_read_localization(prelink_t) + +-userdom_use_user_terminals(prelink_t) +-userdom_manage_user_home_content_files(prelink_t) +-# pending +-# userdom_relabel_user_home_content_files(prelink_t) +-# userdom_execmod_user_home_content_files(prelink_t) ++userdom_use_inherited_user_terminals(prelink_t) ++userdom_manage_user_home_content(prelink_t) ++userdom_relabel_user_home_files(prelink_t) ++userdom_execmod_user_home_files(prelink_t) + userdom_exec_user_home_content_files(prelink_t) + +-ifdef(`hide_broken_symptoms',` +- miscfiles_read_man_pages(prelink_t) ++systemd_read_unit_files(prelink_t) + +- optional_policy(` +- dbus_read_config(prelink_t) +- ') +-') +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_exec_nfs_files(prelink_t) +- fs_manage_nfs_files(prelink_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_exec_cifs_files(prelink_t) +- fs_manage_cifs_files(prelink_t) +-') ++term_use_all_inherited_terms(prelink_t) + + optional_policy(` + amanda_manage_lib(prelink_t) +@@ -138,11 +120,12 @@ optional_policy(` + ') + + optional_policy(` ++ gnome_dontaudit_read_config(prelink_t) + gnome_dontaudit_read_inherited_gconf_config_files(prelink_t) + ') + + optional_policy(` +- mozilla_manage_plugin_rw_files(prelink_t) ++ mozilla_plugin_manage_rw_files(prelink_t) + ') + + optional_policy(` +@@ -155,17 +138,18 @@ optional_policy(` + + ######################################## + # +-# Cron system local policy ++# Prelink Cron system Policy + # + + optional_policy(` + allow prelink_cron_system_t self:capability setuid; + allow prelink_cron_system_t self:process { setsched setfscreate signal }; + allow prelink_cron_system_t self:fifo_file rw_fifo_file_perms; +- allow prelink_cron_system_t self:unix_dgram_socket create_socket_perms; ++ allow prelink_cron_system_t self:unix_dgram_socket { write bind create setopt }; + + read_files_pattern(prelink_cron_system_t, prelink_cache_t, prelink_cache_t) +- allow prelink_cron_system_t prelink_cache_t:file delete_file_perms; ++ allow prelink_cron_system_t prelink_cache_t:file unlink; ++ files_delete_etc_dir_entry(prelink_cron_system_t) + + domtrans_pattern(prelink_cron_system_t, prelink_exec_t, prelink_t) + allow prelink_cron_system_t prelink_t:process noatsecure; +@@ -174,7 +158,7 @@ optional_policy(` + + manage_files_pattern(prelink_cron_system_t, prelink_var_lib_t, prelink_var_lib_t) + files_var_lib_filetrans(prelink_cron_system_t, prelink_var_lib_t, file) +- allow prelink_cron_system_t prelink_var_lib_t:file relabel_file_perms; ++ allow prelink_cron_system_t prelink_var_lib_t:file { relabelfrom relabelto }; + + kernel_read_system_state(prelink_cron_system_t) + +@@ -184,23 +168,36 @@ optional_policy(` + dev_list_sysfs(prelink_cron_system_t) + dev_read_sysfs(prelink_cron_system_t) + +- files_rw_etc_dirs(prelink_cron_system_t) + files_dontaudit_search_all_mountpoints(prelink_cron_system_t) ++ files_search_var_lib(prelink_cron_system_t) ++ files_dontaudit_list_non_security(prelink_cron_system_t) ++ ++ fs_search_cgroup_dirs(prelink_cron_system_t) + + auth_use_nsswitch(prelink_cron_system_t) + + init_telinit(prelink_cron_system_t) + init_exec(prelink_cron_system_t) ++ init_reload_services(prelink_cron_system_t) + + libs_exec_ld_so(prelink_cron_system_t) + + logging_search_logs(prelink_cron_system_t) + +- miscfiles_read_localization(prelink_cron_system_t) ++ init_stream_connect(prelink_cron_system_t) ++ + + cron_system_entry(prelink_cron_system_t, prelink_cron_system_exec_t) + ++ userdom_dontaudit_list_admin_dir(prelink_cron_system_t) ++ + optional_policy(` + rpm_read_db(prelink_cron_system_t) + ') + ') ++ ++ifdef(`hide_broken_symptoms', ` ++ optional_policy(` ++ dbus_read_config(prelink_t) ++ ') ++') +diff --git a/prelude.fc b/prelude.fc +index 8dbc763724..b580f852b4 100644 +--- a/prelude.fc ++++ b/prelude.fc +@@ -12,7 +12,7 @@ + + /usr/sbin/audisp-prelude -- gen_context(system_u:object_r:prelude_audisp_exec_t,s0) + +-/usr/share/prewikka/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_prewikka_script_exec_t,s0) ++/usr/share/prewikka/cgi-bin(/.*)? gen_context(system_u:object_r:prewikka_script_exec_t,s0) + + /var/lib/prelude-lml(/.*)? gen_context(system_u:object_r:prelude_var_lib_t,s0) + +diff --git a/prelude.if b/prelude.if +index c83a838d76..f41a4f7dd9 100644 +--- a/prelude.if ++++ b/prelude.if +@@ -1,13 +1,13 @@ +-## Prelude hybrid intrusion detection system. ++## Prelude hybrid intrusion detection system + + ######################################## + ## + ## Execute a domain transition to run prelude. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`prelude_domtrans',` +@@ -15,19 +15,17 @@ interface(`prelude_domtrans',` + type prelude_t, prelude_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, prelude_exec_t, prelude_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run prelude audisp. ++## Execute a domain transition to run prelude_audisp. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`prelude_domtrans_audisp',` +@@ -35,18 +33,17 @@ interface(`prelude_domtrans_audisp',` + type prelude_audisp_t, prelude_audisp_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, prelude_audisp_exec_t, prelude_audisp_t) + ') + + ######################################## + ## +-## Send generic signals to prelude audisp. ++## Signal the prelude_audisp domain. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed acccess. ++## + ## + # + interface(`prelude_signal_audisp',` +@@ -59,7 +56,7 @@ interface(`prelude_signal_audisp',` + + ######################################## + ## +-## Read prelude spool files. ++## Read the prelude spool files + ## + ## + ## +@@ -78,13 +75,12 @@ interface(`prelude_read_spool',` + + ######################################## + ## +-## Create, read, write, and delete +-## prelude manager spool files. ++## Manage to prelude-manager spool files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`prelude_manage_spool',` +@@ -99,8 +95,8 @@ interface(`prelude_manage_spool',` + + ######################################## + ## +-## All of the rules required to +-## administrate an prelude environment. ++## All of the rules required to administrate ++## an prelude environment + ## + ## + ## +@@ -116,32 +112,42 @@ interface(`prelude_manage_spool',` + # + interface(`prelude_admin',` + gen_require(` +- type prelude_t, prelude_spool_t, prelude_lml_var_run_t; +- type prelude_var_run_t, prelude_var_lib_t, prelude_log_t; +- type prelude_audisp_t, prelude_audisp_var_run_t; +- type prelude_initrc_exec_t, prelude_lml_t, prelude_lml_tmp_t; ++ type prelude_t, prelude_spool_t, prelude_initrc_exec_t; ++ type prelude_var_run_t, prelude_var_lib_t, prelude_lml_var_run_t; ++ type prelude_audisp_t, prelude_audisp_var_run_t, prelude_lml_tmp_t; ++ type prelude_lml_t; + ') + +- allow $1 { prelude_t prelude_audisp_t prelude_lml_t prelude_correlator_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { prelude_t prelude_audisp_t prelude_lml_t prelude_correlator_t }) ++ allow $1 prelude_t:process signal_perms; ++ ps_process_pattern($1, prelude_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 prelude_t:process ptrace; ++ allow $1 prelude_audisp_t:process ptrace; ++ allow $1 prelude_lml_t:process ptrace; ++ ') ++ ++ allow $1 prelude_audisp_t:process signal_perms; ++ ps_process_pattern($1, prelude_audisp_t) ++ ++ allow $1 prelude_lml_t:process signal_perms; ++ ps_process_pattern($1, prelude_lml_t) + + init_labeled_script_domtrans($1, prelude_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 prelude_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_spool($1) ++ files_list_spool($1) + admin_pattern($1, prelude_spool_t) + +- logging_search_logs($1) +- admin_pattern($1, prelude_log_t) +- +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, prelude_var_lib_t) + +- files_search_pids($1) +- admin_pattern($1, { prelude_audisp_var_run_t prelude_var_run_t prelude_lml_var_run_t }) ++ files_list_pids($1) ++ admin_pattern($1, prelude_var_run_t) ++ admin_pattern($1, prelude_audisp_var_run_t) ++ admin_pattern($1, prelude_lml_var_run_t) + +- files_search_tmp($1) ++ files_list_tmp($1) + admin_pattern($1, prelude_lml_tmp_t) + ') +diff --git a/prelude.te b/prelude.te +index 8f44609286..dd70653563 100644 +--- a/prelude.te ++++ b/prelude.te +@@ -13,7 +13,7 @@ type prelude_initrc_exec_t; + init_script_file(prelude_initrc_exec_t) + + type prelude_spool_t; +-files_type(prelude_spool_t) ++files_spool_file(prelude_spool_t) + + type prelude_log_t; + logging_log_file(prelude_log_t) +@@ -54,7 +54,7 @@ files_pid_file(prelude_lml_var_run_t) + # Prelude local policy + # + +-allow prelude_t self:capability { dac_override sys_tty_config }; ++allow prelude_t self:capability { dac_read_search dac_override sys_tty_config }; + allow prelude_t self:fifo_file rw_fifo_file_perms; + allow prelude_t self:unix_stream_socket { accept listen }; + allow prelude_t self:tcp_socket { accept listen }; +@@ -81,7 +81,6 @@ kernel_read_sysctl(prelude_t) + + corecmd_search_bin(prelude_t) + +-corenet_all_recvfrom_unlabeled(prelude_t) + corenet_all_recvfrom_netlabel(prelude_t) + corenet_tcp_sendrecv_generic_if(prelude_t) + corenet_tcp_sendrecv_generic_node(prelude_t) +@@ -97,7 +96,6 @@ dev_read_rand(prelude_t) + dev_read_urand(prelude_t) + + files_read_etc_runtime_files(prelude_t) +-files_read_usr_files(prelude_t) + files_search_spool(prelude_t) + files_search_tmp(prelude_t) + +@@ -108,8 +106,6 @@ auth_use_nsswitch(prelude_t) + logging_send_audit_msgs(prelude_t) + logging_send_syslog_msg(prelude_t) + +-miscfiles_read_localization(prelude_t) +- + optional_policy(` + mysql_stream_connect(prelude_t) + mysql_tcp_connect(prelude_t) +@@ -125,7 +121,7 @@ optional_policy(` + # Audisp local policy + # + +-allow prelude_audisp_t self:capability { dac_override ipc_lock setpcap }; ++allow prelude_audisp_t self:capability { dac_read_search dac_override ipc_lock setpcap }; + allow prelude_audisp_t self:process { getcap setcap }; + allow prelude_audisp_t self:fifo_file rw_fifo_file_perms; + allow prelude_audisp_t self:unix_stream_socket { accept listen }; +@@ -141,7 +137,6 @@ kernel_read_system_state(prelude_audisp_t) + + corecmd_search_bin(prelude_audisp_t) + +-corenet_all_recvfrom_unlabeled(prelude_audisp_t) + corenet_all_recvfrom_netlabel(prelude_audisp_t) + corenet_tcp_sendrecv_generic_if(prelude_audisp_t) + corenet_tcp_sendrecv_generic_node(prelude_audisp_t) +@@ -155,15 +150,12 @@ dev_read_urand(prelude_audisp_t) + + domain_use_interactive_fds(prelude_audisp_t) + +-files_read_etc_files(prelude_audisp_t) + files_read_etc_runtime_files(prelude_audisp_t) + files_search_spool(prelude_audisp_t) + files_search_tmp(prelude_audisp_t) + + logging_send_syslog_msg(prelude_audisp_t) + +-miscfiles_read_localization(prelude_audisp_t) +- + sysnet_dns_name_resolve(prelude_audisp_t) + + ######################################## +@@ -171,7 +163,7 @@ sysnet_dns_name_resolve(prelude_audisp_t) + # Correlator local policy + # + +-allow prelude_correlator_t self:capability dac_override; ++allow prelude_correlator_t self:capability { dac_read_search dac_override }; + allow prelude_correlator_t self:tcp_socket { accept listen }; + + manage_dirs_pattern(prelude_correlator_t, prelude_spool_t, prelude_spool_t) +@@ -184,7 +176,6 @@ kernel_read_sysctl(prelude_correlator_t) + + corecmd_search_bin(prelude_correlator_t) + +-corenet_all_recvfrom_unlabeled(prelude_correlator_t) + corenet_all_recvfrom_netlabel(prelude_correlator_t) + corenet_tcp_sendrecv_generic_if(prelude_correlator_t) + corenet_tcp_sendrecv_generic_node(prelude_correlator_t) +@@ -196,14 +187,10 @@ corenet_tcp_sendrecv_prelude_port(prelude_correlator_t) + dev_read_rand(prelude_correlator_t) + dev_read_urand(prelude_correlator_t) + +-files_read_etc_files(prelude_correlator_t) +-files_read_usr_files(prelude_correlator_t) + files_search_spool(prelude_correlator_t) + + logging_send_syslog_msg(prelude_correlator_t) + +-miscfiles_read_localization(prelude_correlator_t) +- + sysnet_dns_name_resolve(prelude_correlator_t) + + ######################################## +@@ -211,7 +198,9 @@ sysnet_dns_name_resolve(prelude_correlator_t) + # Lml local declarations + # + +-allow prelude_lml_t self:capability dac_override; ++allow prelude_lml_t self:capability { dac_read_search dac_override }; ++allow prelude_lml_t self:tcp_socket { setopt create_socket_perms }; ++allow prelude_lml_t self:unix_dgram_socket create_socket_perms; + allow prelude_lml_t self:fifo_file rw_fifo_file_perms; + allow prelude_lml_t self:unix_stream_socket connectto; + +@@ -262,8 +251,6 @@ libs_read_lib_files(prelude_lml_t) + logging_send_syslog_msg(prelude_lml_t) + logging_read_generic_logs(prelude_lml_t) + +-miscfiles_read_localization(prelude_lml_t) +- + userdom_read_all_users_state(prelude_lml_t) + + optional_policy(` +@@ -278,27 +265,28 @@ optional_policy(` + + optional_policy(` + apache_content_template(prewikka) ++ apache_content_alias_template(prewikka, prewikka) + +- can_exec(httpd_prewikka_script_t, httpd_prewikka_script_exec_t) ++ can_exec(prewikka_script_t, prewikka_script_exec_t) + +- files_search_tmp(httpd_prewikka_script_t) ++ files_search_tmp(prewikka_script_t) + +- kernel_read_sysctl(httpd_prewikka_script_t) +- kernel_search_network_sysctl(httpd_prewikka_script_t) ++ kernel_read_sysctl(prewikka_script_t) ++ kernel_search_network_sysctl(prewikka_script_t) + +- auth_use_nsswitch(httpd_prewikka_script_t) ++ auth_use_nsswitch(prewikka_script_t) + +- logging_send_syslog_msg(httpd_prewikka_script_t) ++ logging_send_syslog_msg(prewikka_script_t) + +- apache_search_sys_content(httpd_prewikka_script_t) ++ apache_search_sys_content(prewikka_script_t) + + optional_policy(` +- mysql_stream_connect(httpd_prewikka_script_t) +- mysql_tcp_connect(httpd_prewikka_script_t) ++ mysql_stream_connect(prewikka_script_t) ++ mysql_tcp_connect(prewikka_script_t) + ') + + optional_policy(` +- postgresql_stream_connect(httpd_prewikka_script_t) +- postgresql_tcp_connect(httpd_prewikka_script_t) ++ postgresql_stream_connect(prewikka_script_t) ++ postgresql_tcp_connect(prewikka_script_t) + ') + ') +diff --git a/privoxy.if b/privoxy.if +index bdcee30f54..34f3143441 100644 +--- a/privoxy.if ++++ b/privoxy.if +@@ -23,8 +23,11 @@ interface(`privoxy_admin',` + type privoxy_etc_rw_t, privoxy_var_run_t; + ') + +- allow $1 privoxy_t:process { ptrace signal_perms }; ++ allow $1 privoxy_t:process signal_perms; + ps_process_pattern($1, privoxy_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 privoxy_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, privoxy_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/privoxy.te b/privoxy.te +index ec21f80d77..a9f650a1f3 100644 +--- a/privoxy.te ++++ b/privoxy.te +@@ -85,6 +85,7 @@ corenet_sendrecv_tor_client_packets(privoxy_t) + corenet_tcp_connect_tor_port(privoxy_t) + corenet_tcp_sendrecv_tor_port(privoxy_t) + ++ + dev_read_sysfs(privoxy_t) + + domain_use_interactive_fds(privoxy_t) +@@ -96,8 +97,6 @@ auth_use_nsswitch(privoxy_t) + + logging_send_syslog_msg(privoxy_t) + +-miscfiles_read_localization(privoxy_t) +- + userdom_dontaudit_use_unpriv_user_fds(privoxy_t) + userdom_dontaudit_search_user_home_dirs(privoxy_t) + +diff --git a/procmail.fc b/procmail.fc +index bdff6c931f..4b36a13de3 100644 +--- a/procmail.fc ++++ b/procmail.fc +@@ -1,6 +1,7 @@ +-HOME_DIR/\.procmailrc -- gen_context(system_u:object_r:procmail_home_t,s0) ++HOME_DIR/\.procmailrc -- gen_context(system_u:object_r:procmail_home_t, s0) ++/root/\.procmailrc -- gen_context(system_u:object_r:procmail_home_t, s0) + + /usr/bin/procmail -- gen_context(system_u:object_r:procmail_exec_t,s0) + +-/var/log/procmail\.log.* -- gen_context(system_u:object_r:procmail_log_t,s0) +-/var/log/procmail(/.*)? gen_context(system_u:object_r:procmail_log_t,s0) ++/var/log/procmail\.log.* -- gen_context(system_u:object_r:procmail_log_t,s0) ++/var/log/procmail(/.*)? gen_context(system_u:object_r:procmail_log_t,s0) +diff --git a/procmail.if b/procmail.if +index 00edeab17d..cb6c0edbfd 100644 +--- a/procmail.if ++++ b/procmail.if +@@ -1,4 +1,4 @@ +-## Procmail mail delivery agent. ++## Procmail mail delivery agent + + ######################################## + ## +@@ -15,8 +15,11 @@ interface(`procmail_domtrans',` + type procmail_exec_t, procmail_t; + ') + ++ files_search_usr($1) + corecmd_search_bin($1) + domtrans_pattern($1, procmail_exec_t, procmail_t) ++ ++ allow $1 procmail_exec_t:file map; + ') + + ######################################## +@@ -34,101 +37,33 @@ interface(`procmail_exec',` + type procmail_exec_t; + ') + ++ files_search_usr($1) + corecmd_search_bin($1) + can_exec($1, procmail_exec_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## procmail home files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`procmail_manage_home_files',` +- gen_require(` +- type procmail_home_t; +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 procmail_home_t:file manage_file_perms; +-') +- +-######################################## +-## +-## Read procmail user home content files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`procmail_read_home_files',` +- gen_require(` +- type procmail_home_t; +- +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 procmail_home_t:file read_file_perms; +-') +- +-######################################## +-## +-## Relabel procmail home files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`procmail_relabel_home_files',` +- gen_require(` +- type ppp_home_t; +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 procmail_home_t:file relabel_file_perms; +-') +- +-######################################## +-## +-## Create objects in user home +-## directories with the procmail home type. ++## Read procmail tmp files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`procmail_home_filetrans_procmail_home',` ++interface(`procmail_read_tmp_files',` + gen_require(` +- type procmail_home_t; ++ type procmail_tmp_t; + ') + +- userdom_user_home_dir_filetrans($1, procmail_home_t, $2, $3) ++ files_search_tmp($1) ++ allow $1 procmail_tmp_t:file read_file_perms; + ') + + ######################################## + ## +-## Read procmail tmp files. ++## Read/write procmail tmp files. + ## + ## + ## +@@ -136,18 +71,18 @@ interface(`procmail_home_filetrans_procmail_home',` + ## + ## + # +-interface(`procmail_read_tmp_files',` ++interface(`procmail_rw_tmp_files',` + gen_require(` + type procmail_tmp_t; + ') + + files_search_tmp($1) +- allow $1 procmail_tmp_t:file read_file_perms; ++ rw_files_pattern($1, procmail_tmp_t, procmail_tmp_t) + ') + + ######################################## + ## +-## Read and write procmail tmp files. ++## Read procmail home directory content + ## + ## + ## +@@ -155,11 +90,11 @@ interface(`procmail_read_tmp_files',` + ## + ## + # +-interface(`procmail_rw_tmp_files',` ++interface(`procmail_read_home_files',` + gen_require(` +- type procmail_tmp_t; ++ type procmail_home_t; + ') + +- files_search_tmp($1) +- rw_files_pattern($1, procmail_tmp_t, procmail_tmp_t) ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, procmail_home_t, procmail_home_t) + ') +diff --git a/procmail.te b/procmail.te +index cc426e62ad..91a1f537eb 100644 +--- a/procmail.te ++++ b/procmail.te +@@ -14,7 +14,7 @@ type procmail_home_t; + userdom_user_home_content(procmail_home_t) + + type procmail_log_t; +-logging_log_file(procmail_log_t) ++logging_log_file(procmail_log_t) + + type procmail_tmp_t; + files_tmp_file(procmail_tmp_t) +@@ -24,13 +24,17 @@ files_tmp_file(procmail_tmp_t) + # Local policy + # + +-allow procmail_t self:capability { sys_nice chown fsetid setuid setgid dac_override }; ++allow procmail_t self:capability { sys_nice chown fsetid setuid setgid dac_read_search dac_override }; + allow procmail_t self:process { setsched signal signull }; + allow procmail_t self:fifo_file rw_fifo_file_perms; +-allow procmail_t self:tcp_socket { accept listen }; ++allow procmail_t self:unix_stream_socket create_socket_perms; ++allow procmail_t self:unix_dgram_socket create_socket_perms; ++allow procmail_t self:tcp_socket create_stream_socket_perms; ++allow procmail_t self:udp_socket create_socket_perms; + +-allow procmail_t procmail_home_t:file read_file_perms; ++can_exec(procmail_t, procmail_exec_t) + ++# Write log to /var/log/procmail.log or /var/log/procmail/.* + allow procmail_t procmail_log_t:dir setattr_dir_perms; + create_files_pattern(procmail_t, procmail_log_t, procmail_log_t) + append_files_pattern(procmail_t, procmail_log_t, procmail_log_t) +@@ -40,83 +44,98 @@ logging_log_filetrans(procmail_t, procmail_log_t, { file dir }) + allow procmail_t procmail_tmp_t:file manage_file_perms; + files_tmp_filetrans(procmail_t, procmail_tmp_t, file) + +-can_exec(procmail_t, procmail_exec_t) +- ++kernel_read_network_state(procmail_t) + kernel_read_system_state(procmail_t) + kernel_read_kernel_sysctls(procmail_t) + +-corenet_all_recvfrom_unlabeled(procmail_t) + corenet_all_recvfrom_netlabel(procmail_t) + corenet_tcp_sendrecv_generic_if(procmail_t) ++corenet_udp_sendrecv_generic_if(procmail_t) + corenet_tcp_sendrecv_generic_node(procmail_t) +- +-corenet_sendrecv_spamd_client_packets(procmail_t) ++corenet_udp_sendrecv_generic_node(procmail_t) ++corenet_tcp_sendrecv_all_ports(procmail_t) ++corenet_udp_sendrecv_all_ports(procmail_t) ++corenet_udp_bind_generic_node(procmail_t) + corenet_tcp_connect_spamd_port(procmail_t) +-corenet_tcp_sendrecv_spamd_port(procmail_t) +- ++corenet_sendrecv_spamd_client_packets(procmail_t) + corenet_sendrecv_comsat_client_packets(procmail_t) +-corenet_tcp_connect_comsat_port(procmail_t) +-corenet_tcp_sendrecv_comsat_port(procmail_t) +- +-corecmd_exec_bin(procmail_t) +-corecmd_exec_shell(procmail_t) + ++dev_read_rand(procmail_t) + dev_read_urand(procmail_t) + +-fs_getattr_all_fs(procmail_t) ++fs_getattr_xattr_fs(procmail_t) + fs_search_auto_mountpoints(procmail_t) + fs_rw_anon_inodefs_files(procmail_t) + + auth_use_nsswitch(procmail_t) + ++corecmd_exec_bin(procmail_t) ++corecmd_exec_shell(procmail_t) ++ + files_read_etc_runtime_files(procmail_t) +-files_read_usr_files(procmail_t) ++files_search_pids(procmail_t) ++# for spamassasin + +-logging_send_syslog_msg(procmail_t) ++application_exec_all(procmail_t) + +-miscfiles_read_localization(procmail_t) ++init_read_utmp(procmail_t) + ++logging_send_syslog_msg(procmail_t) ++logging_append_all_logs(procmail_t) ++ ++list_dirs_pattern(procmail_t, procmail_home_t, procmail_home_t) ++read_files_pattern(procmail_t, procmail_home_t, procmail_home_t) + userdom_search_user_home_dirs(procmail_t) ++userdom_search_admin_dir(procmail_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(procmail_t) +- fs_manage_nfs_files(procmail_t) +- fs_manage_nfs_symlinks(procmail_t) +-') ++# only works until we define a different type for maildir ++userdom_manage_user_home_content_dirs(procmail_t) ++userdom_manage_user_home_content_files(procmail_t) ++userdom_manage_user_home_content_symlinks(procmail_t) ++userdom_manage_user_home_content_pipes(procmail_t) ++userdom_manage_user_home_content_sockets(procmail_t) ++userdom_filetrans_home_content(procmail_t) ++ ++userdom_manage_user_tmp_dirs(procmail_t) ++userdom_manage_user_tmp_files(procmail_t) ++userdom_manage_user_tmp_symlinks(procmail_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(procmail_t) +- fs_manage_cifs_files(procmail_t) +- fs_manage_cifs_symlinks(procmail_t) ++# Execute user executables ++userdom_exec_user_bin_files(procmail_t) ++ ++mta_manage_spool(procmail_t) ++mta_read_queue(procmail_t) ++ ++ifdef(`hide_broken_symptoms',` ++ mta_dontaudit_rw_queue(procmail_t) + ') + ++userdom_home_manager(procmail_t) ++ + optional_policy(` +- clamav_domtrans_clamscan(procmail_t) +- clamav_search_lib(procmail_t) ++ antivirus_domtrans(procmail_t) ++ antivirus_search_db(procmail_t) + ') + + optional_policy(` +- cyrus_stream_connect(procmail_t) ++ dovecot_stream_connect(procmail_t) ++ dovecot_read_config(procmail_t) + ') + + optional_policy(` +- mta_manage_spool(procmail_t) +- mta_read_config(procmail_t) +- mta_read_queue(procmail_t) +- mta_manage_mail_home_rw_content(procmail_t) +- mta_home_filetrans_mail_home_rw(procmail_t, dir, "Maildir") +- mta_home_filetrans_mail_home_rw(procmail_t, dir, ".maildir") ++ cyrus_stream_connect(procmail_t) + ') + + optional_policy(` +- munin_dontaudit_search_lib(procmail_t) ++ gnome_manage_data(procmail_t) + ') + + optional_policy(` +- nagios_search_spool(procmail_t) ++ munin_dontaudit_search_lib(procmail_t) + ') + + optional_policy(` ++ # for a bug in the postfix local program + postfix_dontaudit_rw_local_tcp_sockets(procmail_t) + postfix_dontaudit_use_fds(procmail_t) + postfix_read_spool_files(procmail_t) +@@ -125,12 +144,19 @@ optional_policy(` + postfix_rw_inherited_master_pipes(procmail_t) + ') + ++optional_policy(` ++ nagios_search_spool(procmail_t) ++') ++ + optional_policy(` + pyzor_domtrans(procmail_t) + pyzor_signal(procmail_t) + ') + + optional_policy(` ++ mta_read_config(procmail_t) ++ mta_mailserver_delivery(procmail_t) ++ mta_manage_home_rw(procmail_t) + sendmail_domtrans(procmail_t) + sendmail_signal(procmail_t) + sendmail_dontaudit_rw_tcp_sockets(procmail_t) +@@ -145,3 +171,8 @@ optional_policy(` + spamassassin_domtrans_client(procmail_t) + spamassassin_read_lib_files(procmail_t) + ') ++ ++optional_policy(` ++ zarafa_stream_connect_server(procmail_t) ++ zarafa_domtrans_deliver(procmail_t) ++') +diff --git a/prosody.fc b/prosody.fc +new file mode 100644 +index 0000000000..c056a2fb33 +--- /dev/null ++++ b/prosody.fc +@@ -0,0 +1,10 @@ ++/usr/bin/prosody -- gen_context(system_u:object_r:prosody_exec_t,s0) ++/usr/bin/prosodyctl -- gen_context(system_u:object_r:prosody_exec_t,s0) ++ ++/usr/lib/systemd/system/prosody.service -- gen_context(system_u:object_r:prosody_unit_file_t,s0) ++ ++/var/lib/prosody(/.*)? gen_context(system_u:object_r:prosody_var_lib_t,s0) ++ ++/var/run/prosody(/.*)? gen_context(system_u:object_r:prosody_var_run_t,s0) ++ ++/var/log/prosody(/.*)? gen_context(system_u:object_r:prosody_log_t,s0) +diff --git a/prosody.if b/prosody.if +new file mode 100644 +index 0000000000..8231f4ff5e +--- /dev/null ++++ b/prosody.if +@@ -0,0 +1,255 @@ ++ ++## policy for prosody ++ ++######################################## ++## ++## Execute TEMPLATE in the prosody domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`prosody_domtrans',` ++ gen_require(` ++ type prosody_t, prosody_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, prosody_exec_t, prosody_t) ++') ++ ++######################################## ++## ++## Search prosody lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_search_lib',` ++ gen_require(` ++ type prosody_var_lib_t; ++ ') ++ ++ allow $1 prosody_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read prosody lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_read_lib_files',` ++ gen_require(` ++ type prosody_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, prosody_var_lib_t, prosody_var_lib_t) ++') ++ ++######################################## ++## ++## Manage prosody lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_manage_lib_files',` ++ gen_require(` ++ type prosody_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, prosody_var_lib_t, prosody_var_lib_t) ++') ++ ++######################################## ++## ++## Manage prosody lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_manage_lib_dirs',` ++ gen_require(` ++ type prosody_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, prosody_var_lib_t, prosody_var_lib_t) ++') ++ ++######################################## ++## ++## Read prosody PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_read_pid_files',` ++ gen_require(` ++ type prosody_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, prosody_var_run_t, prosody_var_run_t) ++') ++ ++######################################## ++## ++## Execute prosody server in the prosody domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`prosody_systemctl',` ++ gen_require(` ++ type prosody_t; ++ type prosody_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 prosody_unit_file_t:file read_file_perms; ++ allow $1 prosody_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, prosody_t) ++') ++ ++ ++######################################## ++## ++## Execute prosody in the prosody domain, and ++## allow the specified role the prosody domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the prosody domain. ++## ++## ++# ++interface(`prosody_run',` ++ gen_require(` ++ type prosody_t; ++ attribute_role prosody_roles; ++ ') ++ ++ prosody_domtrans($1) ++ roleattribute $2 prosody_roles; ++') ++ ++###################################### ++## ++## Connect to prosody with a unix ++## domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`prosody_stream_connect',` ++ gen_require(` ++ type prosody_t, prosody_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, prosody_var_run_t, prosody_var_run_t, prosody_t) ++') ++ ++######################################## ++## ++## Role access for prosody ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`prosody_role',` ++ gen_require(` ++ type prosody_t; ++ attribute_role prosody_roles; ++ ') ++ ++ roleattribute $1 prosody_roles; ++ ++ prosody_domtrans($2) ++ ++ ps_process_pattern($2, prosody_t) ++ allow $2 prosody_t:process { signull signal sigkill }; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an prosody environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`prosody_admin',` ++ gen_require(` ++ type prosody_t; ++ type prosody_var_lib_t; ++ type prosody_var_run_t; ++ type prosody_unit_file_t; ++ ') ++ ++ allow $1 prosody_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, prosody_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, prosody_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, prosody_var_run_t) ++ ++ prosody_systemctl($1) ++ admin_pattern($1, prosody_unit_file_t) ++ allow $1 prosody_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/prosody.te b/prosody.te +new file mode 100644 +index 0000000000..5a9f1d42cd +--- /dev/null ++++ b/prosody.te +@@ -0,0 +1,99 @@ ++policy_module(prosody, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Permit to prosody to bind apache port. ++## Need to be activated to use BOSH. ++##

      ++##
      ++gen_tunable(prosody_bind_http_port, false) ++ ++type prosody_t; ++type prosody_exec_t; ++init_daemon_domain(prosody_t, prosody_exec_t) ++ ++type prosody_log_t; ++logging_log_file(prosody_log_t) ++ ++type prosody_var_lib_t; ++files_type(prosody_var_lib_t) ++ ++type prosody_var_run_t; ++files_pid_file(prosody_var_run_t) ++ ++type prosody_tmp_t; ++files_tmp_file(prosody_tmp_t) ++ ++type prosody_unit_file_t; ++systemd_unit_file(prosody_unit_file_t) ++ ++######################################## ++# ++# prosody local policy ++# ++allow prosody_t self:capability { setuid setgid dac_read_search dac_override }; ++allow prosody_t self:process { signal_perms execmem }; ++allow prosody_t self:tcp_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(prosody_t, prosody_var_lib_t, prosody_var_lib_t) ++manage_files_pattern(prosody_t, prosody_var_lib_t, prosody_var_lib_t) ++manage_lnk_files_pattern(prosody_t, prosody_var_lib_t, prosody_var_lib_t) ++files_var_lib_filetrans(prosody_t, prosody_var_lib_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(prosody_t, prosody_var_run_t, prosody_var_run_t) ++manage_files_pattern(prosody_t, prosody_var_run_t, prosody_var_run_t) ++manage_lnk_files_pattern(prosody_t, prosody_var_run_t, prosody_var_run_t) ++files_pid_filetrans(prosody_t, prosody_var_run_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(prosody_t, prosody_log_t, prosody_log_t) ++manage_files_pattern(prosody_t, prosody_log_t, prosody_log_t) ++setattr_files_pattern(prosody_t, prosody_log_t, prosody_log_t) ++logging_log_filetrans(prosody_t, prosody_log_t, { file dir }) ++ ++manage_dirs_pattern(prosody_t, prosody_tmp_t, prosody_tmp_t) ++manage_files_pattern(prosody_t, prosody_tmp_t, prosody_tmp_t) ++files_tmp_filetrans(prosody_t, prosody_tmp_t, { dir file }) ++ ++can_exec(prosody_t, prosody_exec_t) ++ ++kernel_read_system_state(prosody_t) ++ ++corecmd_exec_bin(prosody_t) ++corecmd_exec_shell(prosody_t) ++ ++corenet_udp_bind_generic_node(prosody_t) ++corenet_tcp_connect_postgresql_port(prosody_t) ++corenet_tcp_connect_jabber_interserver_port(prosody_t) ++corenet_tcp_connect_jabber_client_port(prosody_t) ++corenet_tcp_bind_prosody_port(prosody_t) ++corenet_tcp_bind_jabber_client_port(prosody_t) ++corenet_tcp_bind_jabber_interserver_port(prosody_t) ++corenet_tcp_bind_jabber_router_port(prosody_t) ++corenet_tcp_bind_commplex_main_port(prosody_t) ++corenet_tcp_bind_fac_restore_port(prosody_t) ++ ++tunable_policy(`prosody_bind_http_port',` ++ corenet_tcp_bind_http_port(prosody_t) ++') ++ ++dev_read_urand(prosody_t) ++ ++domain_use_interactive_fds(prosody_t) ++ ++files_read_etc_files(prosody_t) ++ ++auth_use_nsswitch(prosody_t) ++sysnet_read_config(prosody_t) ++ ++logging_send_syslog_msg(prosody_t) ++ ++miscfiles_read_localization(prosody_t) ++ ++optional_policy(` ++ sasl_connect(prosody_t) ++') +diff --git a/psad.if b/psad.if +index d4dcf782ce..3cce82e500 100644 +--- a/psad.if ++++ b/psad.if +@@ -93,9 +93,8 @@ interface(`psad_manage_config',` + ') + + files_search_etc($1) +- allow $1 psad_etc_t:dir manage_dir_perms; +- allow $1 psad_etc_t:file manage_file_perms; +- allow $1 psad_etc_t:lnk_file manage_lnk_file_perms; ++ manage_dirs_pattern($1, psad_etc_t, psad_etc_t) ++ manage_files_pattern($1, psad_etc_t, psad_etc_t) + ') + + ######################################## +@@ -119,7 +118,7 @@ interface(`psad_read_pid_files',` + + ######################################## + ## +-## Read and write psad pid files. ++## Read and write psad PID files. + ## + ## + ## +@@ -177,6 +176,45 @@ interface(`psad_append_log',` + append_files_pattern($1, psad_var_log_t, psad_var_log_t) + ') + ++######################################## ++## ++## Allow the specified domain to write to psad's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`psad_write_log',` ++ gen_require(` ++ type psad_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ write_files_pattern($1, psad_var_log_t, psad_var_log_t) ++') ++ ++####################################### ++## ++## Allow the specified domain to setattr to psad's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`psad_setattr_log',` ++ gen_require(` ++ type psad_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ setattr_files_pattern($1, psad_var_log_t, psad_var_log_t) ++') ++ + ######################################## + ## + ## Read and write psad fifo files. +@@ -196,6 +234,45 @@ interface(`psad_rw_fifo_file',` + rw_fifo_files_pattern($1, psad_var_lib_t, psad_var_lib_t) + ') + ++####################################### ++## ++## Allow setattr to psad fifo files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`psad_setattr_fifo_file',` ++ gen_require(` ++ type psad_t, psad_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 psad_var_lib_t:fifo_file setattr; ++ search_dirs_pattern($1, psad_var_lib_t, psad_var_lib_t) ++') ++ ++####################################### ++## ++## Allow search to psad lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`psad_search_lib_files',` ++ gen_require(` ++ type psad_t, psad_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ search_dirs_pattern($1, psad_var_lib_t, psad_var_lib_t) ++') ++ + ####################################### + ## + ## Read and write psad temporary files. +@@ -235,30 +312,34 @@ interface(`psad_rw_tmp_files',` + interface(`psad_admin',` + gen_require(` + type psad_t, psad_var_run_t, psad_var_log_t; +- type psad_initrc_exec_t, psad_var_lib_t; ++ type psad_initrc_exec_t, psad_var_lib_t, psad_etc_t; + type psad_tmp_t; + ') + +- allow $1 psad_t:process { ptrace signal_perms }; ++ allow $1 psad_t:process signal_perms; + ps_process_pattern($1, psad_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 psad_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, psad_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 psad_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) ++ files_list_etc($1) + admin_pattern($1, psad_etc_t) + +- files_search_pids($1) ++ files_list_pids($1) + admin_pattern($1, psad_var_run_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, psad_var_log_t) + +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, psad_var_lib_t) + +- files_search_tmp($1) ++ files_list_tmp($1) + admin_pattern($1, psad_tmp_t) + ') +diff --git a/psad.te b/psad.te +index b5d717b091..e716d9d2c5 100644 +--- a/psad.te ++++ b/psad.te +@@ -32,7 +32,7 @@ files_tmp_file(psad_tmp_t) + # Local policy + # + +-allow psad_t self:capability { net_admin net_raw setuid setgid dac_override }; ++allow psad_t self:capability { net_admin net_raw setuid setgid dac_read_search dac_override }; + dontaudit psad_t self:capability sys_tty_config; + allow psad_t self:process signal_perms; + allow psad_t self:fifo_file rw_fifo_file_perms; +@@ -66,7 +66,6 @@ kernel_read_net_sysctls(psad_t) + corecmd_exec_bin(psad_t) + corecmd_exec_shell(psad_t) + +-corenet_all_recvfrom_unlabeled(psad_t) + corenet_all_recvfrom_netlabel(psad_t) + corenet_tcp_sendrecv_generic_if(psad_t) + corenet_tcp_sendrecv_generic_node(psad_t) +@@ -77,8 +76,9 @@ corenet_tcp_sendrecv_whois_port(psad_t) + + dev_read_urand(psad_t) + ++domain_read_all_domains_state(psad_t) ++ + files_read_etc_runtime_files(psad_t) +-files_read_usr_files(psad_t) + + fs_getattr_all_fs(psad_t) + +@@ -88,8 +88,6 @@ logging_read_generic_logs(psad_t) + logging_read_syslog_config(psad_t) + logging_send_syslog_msg(psad_t) + +-miscfiles_read_localization(psad_t) +- + sysnet_exec_ifconfig(psad_t) + + optional_policy(` +diff --git a/ptchown.te b/ptchown.te +index 28d2abc03b..c2cfb5eaab 100644 +--- a/ptchown.te ++++ b/ptchown.te +@@ -21,7 +21,6 @@ role ptchown_roles types ptchown_t; + allow ptchown_t self:capability { chown fowner fsetid setuid }; + allow ptchown_t self:process { getcap setcap }; + +-files_read_etc_files(ptchown_t) + + fs_rw_anon_inodefs_files(ptchown_t) + +@@ -31,4 +30,4 @@ term_setattr_all_ptys(ptchown_t) + term_use_generic_ptys(ptchown_t) + term_use_ptmx(ptchown_t) + +-miscfiles_read_localization(ptchown_t) ++auth_read_passwd(ptchown_t) +diff --git a/publicfile.te b/publicfile.te +index 3246befff7..dd66a21cbb 100644 +--- a/publicfile.te ++++ b/publicfile.te +@@ -17,7 +17,7 @@ files_type(publicfile_content_t) + # Local policy + # + +-allow publicfile_t self:capability { dac_override setgid setuid sys_chroot }; ++allow publicfile_t self:capability { dac_read_search dac_override setgid setuid sys_chroot }; + + allow publicfile_t publicfile_content_t:dir list_dir_perms; + allow publicfile_t publicfile_content_t:file read_file_perms; +diff --git a/pulseaudio.fc b/pulseaudio.fc +index 6864479a79..0e7d875135 100644 +--- a/pulseaudio.fc ++++ b/pulseaudio.fc +@@ -1,9 +1,14 @@ + HOME_DIR/\.esd_auth -- gen_context(system_u:object_r:pulseaudio_home_t,s0) +-HOME_DIR/\.pulse(/.*)? gen_context(system_u:object_r:pulseaudio_home_t,s0) + HOME_DIR/\.pulse-cookie -- gen_context(system_u:object_r:pulseaudio_home_t,s0) ++HOME_DIR/\.pulse(/.*)? gen_context(system_u:object_r:pulseaudio_home_t,s0) ++HOME_DIR/\.config/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_home_t,s0) + +-/usr/bin/pulseaudio -- gen_context(system_u:object_r:pulseaudio_exec_t,s0) ++/root/\.esd_auth -- gen_context(system_u:object_r:pulseaudio_home_t,s0) ++/root/\.pulse-cookie -- gen_context(system_u:object_r:pulseaudio_home_t,s0) ++/root/\.pulse(/.*)? gen_context(system_u:object_r:pulseaudio_home_t,s0) ++/root/\.config/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_home_t,s0) + +-/var/lib/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_var_lib_t,s0) ++/usr/bin/pulseaudio -- gen_context(system_u:object_r:pulseaudio_exec_t,s0) + +-/var/run/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_var_run_t,s0) ++/var/lib/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_var_lib_t,s0) ++/var/run/pulse(/.*)? gen_context(system_u:object_r:pulseaudio_var_run_t,s0) +diff --git a/pulseaudio.if b/pulseaudio.if +index 45843b55c2..4d1adace56 100644 +--- a/pulseaudio.if ++++ b/pulseaudio.if +@@ -2,43 +2,47 @@ + + ######################################## + ## +-## Role access for pulseaudio. ++## Role access for pulseaudio + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## + # + interface(`pulseaudio_role',` + gen_require(` +- attribute pulseaudio_tmpfsfile; +- type pulseaudio_t, pulseaudio_home_t, pulseaudio_tmpfs_t; +- type pulseaudio_tmp_t; ++ attribute pulseaudio_tmpfsfile; ++ type pulseaudio_t, pulseaudio_exec_t, pulseaudio_tmpfs_t; ++ class dbus { acquire_svc send_msg }; + ') + +- pulseaudio_run($2, $1) ++ role $1 types pulseaudio_t; ++ ++ # Transition from the user domain to the derived domain. ++ domtrans_pattern($2, pulseaudio_exec_t, pulseaudio_t) + +- allow $2 pulseaudio_t:process { ptrace signal_perms }; + ps_process_pattern($2, pulseaudio_t) + +- allow $2 pulseaudio_home_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 pulseaudio_home_t:file { manage_file_perms relabel_file_perms }; +- allow $2 pulseaudio_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; ++ allow pulseaudio_t $2:process { signal signull }; ++ allow $2 pulseaudio_t:process { signal signull sigkill }; ++ ps_process_pattern(pulseaudio_t, $2) ++ ++ allow pulseaudio_t $2:unix_stream_socket connectto; ++ allow $2 pulseaudio_t:unix_stream_socket connectto; + + allow $2 { pulseaudio_tmpfs_t pulseaudio_tmpfsfile }:dir { manage_dir_perms relabel_dir_perms }; + allow $2 { pulseaudio_tmpfs_t pulseaudio_tmpfsfile }:file { manage_file_perms relabel_file_perms }; + +- allow $2 pulseaudio_tmp_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 pulseaudio_tmp_t:file { manage_file_perms relabel_file_perms }; +- allow $2 pulseaudio_tmp_t:sock_file { manage_sock_file_perms relabel_sock_file_perms }; ++ userdom_manage_tmp_role($1, pulseaudio_t) + +- allow pulseaudio_t $2:unix_stream_socket connectto; ++ allow $2 pulseaudio_t:dbus send_msg; ++ allow pulseaudio_t $2:dbus { acquire_svc send_msg }; + ') + + ######################################## +@@ -65,9 +69,8 @@ interface(`pulseaudio_domtrans',` + + ######################################## + ## +-## Execute pulseaudio in the pulseaudio +-## domain, and allow the specified role +-## the pulseaudio domain. ++## Execute pulseaudio in the pulseaudio domain, and ++## allow the specified role the pulseaudio domain. + ## + ## + ## +@@ -82,16 +85,16 @@ interface(`pulseaudio_domtrans',` + # + interface(`pulseaudio_run',` + gen_require(` +- attribute_role pulseaudio_roles; ++ type pulseaudio_t; + ') + + pulseaudio_domtrans($1) +- roleattribute $2 pulseaudio_roles; ++ role $2 types pulseaudio_t; + ') + + ######################################## + ## +-## Execute pulseaudio in the caller domain. ++## Execute a pulseaudio in the current domain. + ## + ## + ## +@@ -104,13 +107,12 @@ interface(`pulseaudio_exec',` + type pulseaudio_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, pulseaudio_exec_t) + ') + + ######################################## + ## +-## Do not audit attempts to execute pulseaudio. ++## Do not audit to execute a pulseaudio. + ## + ## + ## +@@ -128,7 +130,7 @@ interface(`pulseaudio_dontaudit_exec',` + + ######################################## + ## +-## Send null signals to pulseaudio. ++## Send signull signal to pulseaudio + ## processes. + ## + ## +@@ -147,8 +149,8 @@ interface(`pulseaudio_signull',` + + ##################################### + ## +-## Connect to pulseaudio with a unix +-## domain stream socket. ++## Connect to pulseaudio over a unix domain ++## stream socket. + ## + ## + ## +@@ -158,11 +160,15 @@ interface(`pulseaudio_signull',` + # + interface(`pulseaudio_stream_connect',` + gen_require(` +- type pulseaudio_t, pulseaudio_var_run_t, pulseaudio_tmp_t; ++ type pulseaudio_t, pulseaudio_var_run_t; ++ type pulseaudio_home_t; + ') + + files_search_pids($1) +- stream_connect_pattern($1, { pulseaudio_tmp_t pulseaudio_var_run_t }, { pulseaudio_tmp_t pulseaudio_var_run_t }, pulseaudio_t) ++ allow $1 pulseaudio_t:process signull; ++ allow pulseaudio_t $1:process signull; ++ stream_connect_pattern($1, pulseaudio_var_run_t, pulseaudio_var_run_t, pulseaudio_t) ++ stream_connect_pattern($1, pulseaudio_home_t, pulseaudio_home_t, pulseaudio_t) + ') + + ######################################## +@@ -188,9 +194,9 @@ interface(`pulseaudio_dbus_chat',` + + ######################################## + ## +-## Set attributes of pulseaudio home directories. ++## Set the attributes of the pulseaudio homedir. + ## +-## ++## + ## + ## Domain allowed access. + ## +@@ -201,148 +207,190 @@ interface(`pulseaudio_setattr_home_dir',` + type pulseaudio_home_t; + ') + +- allow $1 pulseaudio_home_t:dir setattr_dir_perms; ++ allow $1 pulseaudio_home_t:dir setattr; + ') + + ######################################## + ## +-## Read pulseaudio home content. ++## Read pulseaudio homedir files. + ## +-## ++## + ## + ## Domain allowed access. + ## + ## + # + interface(`pulseaudio_read_home_files',` +- refpolicywarn(`$0($*) has been deprecated, use pulseaudio_read_home() instead.') +- pulseaudio_read_home($1) ++ gen_require(` ++ type pulseaudio_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ read_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) ++ read_lnk_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) + ') + + ######################################## + ## +-## Read pulseaudio home content. ++## Read and write Pulse Audio files. + ## +-## ++## + ## + ## Domain allowed access. + ## + ## + # +-interface(`pulseaudio_read_home',` ++interface(`pulseaudio_rw_home_files',` + gen_require(` + type pulseaudio_home_t; + ') + ++ rw_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) ++ read_lnk_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) + userdom_search_user_home_dirs($1) +- allow $1 pulseaudio_home_t:dir list_dir_perms; +- allow $1 pulseaudio_home_t:file read_file_perms; +- allow $1 pulseaudio_home_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## +-## Read and write Pulse Audio files. ++## Create, read, write, and delete pulseaudio ++## home directories. + ## +-## ++## + ## + ## Domain allowed access. + ## + ## + # +-interface(`pulseaudio_rw_home_files',` ++interface(`pulseaudio_manage_home_dirs',` + gen_require(` + type pulseaudio_home_t; + ') + + userdom_search_user_home_dirs($1) +- rw_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) +- read_lnk_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) ++ manage_dirs_pattern($1, pulseaudio_home_t, pulseaudio_home_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## pulseaudio home content. ++## Create, read, write, and delete pulseaudio ++## home directory files. + ## +-## ++## + ## + ## Domain allowed access. + ## + ## + # + interface(`pulseaudio_manage_home_files',` +- refpolicywarn(`$0($*) has been deprecated, use pulseaudio_manage_home() instead.') +- pulseaudio_manage_home($1) ++ gen_require(` ++ type pulseaudio_home_t; ++ ') ++ ++ userdom_search_user_home_dirs($1) ++ manage_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) ++ read_lnk_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) ++ pulseaudio_filetrans_home_content($1) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## pulseaudio home content. ++## Create, read, write, and delete pulseaudio ++## home directory symlinks. + ## +-## ++## + ## + ## Domain allowed access. + ## + ## + # +-interface(`pulseaudio_manage_home',` ++interface(`pulseaudio_manage_home_symlinks',` + gen_require(` + type pulseaudio_home_t; + ') + + userdom_search_user_home_dirs($1) +- allow $1 pulseaudio_home_t:dir manage_dir_perms; +- allow $1 pulseaudio_home_t:file manage_file_perms; +- allow $1 pulseaudio_home_t:lnk_file manage_lnk_file_perms; ++ manage_lnk_files_pattern($1, pulseaudio_home_t, pulseaudio_home_t) + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the pulseaudio +-## home type. ++## Create pulseaudio content in the user home directory ++## with an correct label. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## ++# ++interface(`pulseaudio_filetrans_home_content',` ++ gen_require(` ++ type pulseaudio_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, pulseaudio_home_t, dir, ".pulse") ++ userdom_user_home_dir_filetrans($1, pulseaudio_home_t, file, ".pulse-cookie") ++ userdom_user_home_dir_filetrans($1, pulseaudio_home_t, file, ".esd_auth") ++ optional_policy(` ++ gnome_config_filetrans($1, pulseaudio_home_t, dir, "pulse") ++ ') ++') ++ ++######################################## ++## ++## Create pulseaudio content in the admin home directory ++## with an correct label. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## + # +-interface(`pulseaudio_home_filetrans_pulseaudio_home',` ++interface(`pulseaudio_filetrans_admin_home_content',` + gen_require(` + type pulseaudio_home_t; + ') + +- userdom_user_home_dir_filetrans($1, pulseaudio_home_t, $2, $3) ++ userdom_admin_home_dir_filetrans($1, pulseaudio_home_t, dir, ".pulse") ++ userdom_admin_home_dir_filetrans($1, pulseaudio_home_t, file, ".pulse-cookie") ++ userdom_admin_home_dir_filetrans($1, pulseaudio_home_t, file, ".esd_auth") + ') + +-######################################## ++####################################### + ## +-## Make the specified tmpfs file type +-## pulseaudio tmpfs content. ++## Make the specified tmpfs file type ++## pulseaudio tmpfs content. + ## + ## ++## ++## File type to make pulseaudio tmpfs content. ++## ++## ++# ++interface(`pulseaudio_tmpfs_content',` ++ gen_require(` ++ attribute pulseaudio_tmpfsfile; ++ ') ++ ++ typeattribute $1 pulseaudio_tmpfsfile; ++') ++ ++######################################## ++## ++## Allow the domain to read pulseaudio state files in /proc. ++## ++## + ## +-## File type to make pulseaudio tmpfs content. ++## Domain allowed access. + ## + ## + # +-interface(`pulseaudio_tmpfs_content',` ++interface(`pulseaudio_read_state',` + gen_require(` +- attribute pulseaudio_tmpfsfile; ++ type pulseaudio_t; + ') + +- typeattribute $1 pulseaudio_tmpfsfile; ++ kernel_search_proc($1) ++ ps_process_pattern($1, pulseaudio_t) + ') +diff --git a/pulseaudio.te b/pulseaudio.te +index 6643b49c2a..6c374240b0 100644 +--- a/pulseaudio.te ++++ b/pulseaudio.te +@@ -8,61 +8,51 @@ policy_module(pulseaudio, 1.6.0) + attribute pulseaudio_client; + attribute pulseaudio_tmpfsfile; + +-attribute_role pulseaudio_roles; +- + type pulseaudio_t; + type pulseaudio_exec_t; + # init_daemon_domain(pulseaudio_t, pulseaudio_exec_t) + userdom_user_application_domain(pulseaudio_t, pulseaudio_exec_t) +-role pulseaudio_roles types pulseaudio_t; ++role system_r types pulseaudio_t; + + type pulseaudio_home_t; + userdom_user_home_content(pulseaudio_home_t) + +-type pulseaudio_tmp_t; +-userdom_user_tmp_file(pulseaudio_tmp_t) +- + type pulseaudio_tmpfs_t; + userdom_user_tmpfs_file(pulseaudio_tmpfs_t) + + type pulseaudio_var_lib_t; + files_type(pulseaudio_var_lib_t) ++ubac_constrained(pulseaudio_var_lib_t) + + type pulseaudio_var_run_t; + files_pid_file(pulseaudio_var_run_t) ++ubac_constrained(pulseaudio_var_run_t) + + ######################################## + # +-# Local policy ++# pulseaudio local policy + # + + allow pulseaudio_t self:capability { fowner fsetid chown setgid setuid sys_nice sys_resource sys_tty_config }; + allow pulseaudio_t self:process { getcap setcap setrlimit setsched getsched signal signull }; +-allow pulseaudio_t self:fifo_file rw_fifo_file_perms; +-allow pulseaudio_t self:unix_stream_socket { accept connectto listen }; +-allow pulseaudio_t self:unix_dgram_socket sendto; +-allow pulseaudio_t self:tcp_socket { accept listen }; ++allow pulseaudio_t self:fifo_file rw_file_perms; ++allow pulseaudio_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow pulseaudio_t self:unix_dgram_socket { sendto create_socket_perms }; ++allow pulseaudio_t self:tcp_socket create_stream_socket_perms; ++allow pulseaudio_t self:udp_socket create_socket_perms; + allow pulseaudio_t self:netlink_kobject_uevent_socket create_socket_perms; + +-allow pulseaudio_t pulseaudio_home_t:dir manage_dir_perms; +-allow pulseaudio_t pulseaudio_home_t:file manage_file_perms; +-allow pulseaudio_t pulseaudio_home_t:lnk_file manage_lnk_file_perms; +- +-userdom_user_home_dir_filetrans(pulseaudio_t, pulseaudio_home_t, dir, ".pulse") +-userdom_user_home_dir_filetrans(pulseaudio_t, pulseaudio_home_t, file, ".esd_auth") +-userdom_user_home_dir_filetrans(pulseaudio_t, pulseaudio_home_t, file, ".pulse-cookie") +- +-manage_dirs_pattern(pulseaudio_t, pulseaudio_tmp_t, pulseaudio_tmp_t) +-manage_files_pattern(pulseaudio_t, pulseaudio_tmp_t, pulseaudio_tmp_t) +-manage_sock_files_pattern(pulseaudio_t, pulseaudio_tmp_t, pulseaudio_tmp_t) +-files_tmp_filetrans(pulseaudio_t, pulseaudio_tmp_t, dir) +-userdom_user_tmp_filetrans(pulseaudio_t, pulseaudio_tmp_t, file, "pid") +-userdom_user_tmp_filetrans(pulseaudio_t, pulseaudio_tmp_t, sock_file, "dbus-socket") +-userdom_user_tmp_filetrans(pulseaudio_t, pulseaudio_tmp_t, sock_file, "native") ++manage_dirs_pattern(pulseaudio_t, pulseaudio_home_t, pulseaudio_home_t) ++manage_files_pattern(pulseaudio_t, pulseaudio_home_t, pulseaudio_home_t) ++manage_lnk_files_pattern(pulseaudio_t, pulseaudio_home_t, pulseaudio_home_t) ++userdom_search_user_home_dirs(pulseaudio_t) ++pulseaudio_filetrans_home_content(pulseaudio_t) ++allow pulseaudio_t pulseaudio_home_t:file map; + +-manage_dirs_pattern(pulseaudio_t, pulseaudio_tmpfs_t, pulseaudio_tmpfs_t) +-manage_files_pattern(pulseaudio_t, pulseaudio_tmpfs_t, pulseaudio_tmpfs_t) +-fs_tmpfs_filetrans(pulseaudio_t, pulseaudio_tmpfs_t, { dir file }) ++# ~/.esd_auth - maybe we should label this pulseaudio_home_t? ++userdom_read_user_home_content_files(pulseaudio_t) ++userdom_search_admin_dir(pulseaudio_t) ++userdom_map_tmp_files(pulseaudio_t) + + manage_dirs_pattern(pulseaudio_t, pulseaudio_var_lib_t, pulseaudio_var_lib_t) + manage_files_pattern(pulseaudio_t, pulseaudio_var_lib_t, pulseaudio_var_lib_t) +@@ -72,10 +62,7 @@ files_var_lib_filetrans(pulseaudio_t, pulseaudio_var_lib_t, { dir file }) + manage_dirs_pattern(pulseaudio_t, pulseaudio_var_run_t, pulseaudio_var_run_t) + manage_files_pattern(pulseaudio_t, pulseaudio_var_run_t, pulseaudio_var_run_t) + manage_sock_files_pattern(pulseaudio_t, pulseaudio_var_run_t, pulseaudio_var_run_t) +-files_pid_filetrans(pulseaudio_t, pulseaudio_var_run_t, { dir file }) +- +-allow pulseaudio_t pulseaudio_client:process signull; +-ps_process_pattern(pulseaudio_t, pulseaudio_client) ++files_pid_filetrans(pulseaudio_t, pulseaudio_var_run_t, { file dir }) + + can_exec(pulseaudio_t, pulseaudio_exec_t) + +@@ -85,62 +72,58 @@ kernel_read_kernel_sysctls(pulseaudio_t) + + corecmd_exec_bin(pulseaudio_t) + +-corenet_all_recvfrom_unlabeled(pulseaudio_t) + corenet_all_recvfrom_netlabel(pulseaudio_t) +-corenet_tcp_sendrecv_generic_if(pulseaudio_t) +-corenet_udp_sendrecv_generic_if(pulseaudio_t) +-corenet_tcp_sendrecv_generic_node(pulseaudio_t) +-corenet_udp_sendrecv_generic_node(pulseaudio_t) +- +-corenet_sendrecv_pulseaudio_server_packets(pulseaudio_t) + corenet_tcp_bind_pulseaudio_port(pulseaudio_t) +-corenet_tcp_sendrecv_pulseaudio_port(pulseaudio_t) +- +-corenet_sendrecv_soundd_server_packets(pulseaudio_t) + corenet_tcp_bind_soundd_port(pulseaudio_t) +-corenet_tcp_sendrecv_soundd_port(pulseaudio_t) +- +-corenet_sendrecv_sap_server_packets(pulseaudio_t) ++corenet_tcp_sendrecv_generic_if(pulseaudio_t) ++corenet_tcp_sendrecv_generic_node(pulseaudio_t) + corenet_udp_bind_sap_port(pulseaudio_t) +-corenet_udp_sendrecv_sap_port(pulseaudio_t) ++corenet_udp_sendrecv_generic_if(pulseaudio_t) ++corenet_udp_sendrecv_generic_node(pulseaudio_t) ++corenet_dontaudit_tcp_connect_xserver_port(pulseaudio_t) + + dev_read_sound(pulseaudio_t) + dev_write_sound(pulseaudio_t) + dev_read_sysfs(pulseaudio_t) + dev_read_urand(pulseaudio_t) + +-files_read_usr_files(pulseaudio_t) + ++fs_rw_anon_inodefs_files(pulseaudio_t) + fs_getattr_tmpfs(pulseaudio_t) +-fs_getattr_all_fs(pulseaudio_t) + fs_list_inotifyfs(pulseaudio_t) +-fs_rw_anon_inodefs_files(pulseaudio_t) +-fs_search_auto_mountpoints(pulseaudio_t) + +-term_use_all_ttys(pulseaudio_t) +-term_use_all_ptys(pulseaudio_t) ++term_use_all_inherited_ttys(pulseaudio_t) ++term_use_all_inherited_ptys(pulseaudio_t) + + auth_use_nsswitch(pulseaudio_t) + + logging_send_syslog_msg(pulseaudio_t) + +-miscfiles_read_localization(pulseaudio_t) +- +-userdom_read_user_tmpfs_files(pulseaudio_t) ++userdom_read_user_tmp_files(pulseaudio_t) + + userdom_search_user_home_dirs(pulseaudio_t) + userdom_write_user_tmp_sockets(pulseaudio_t) ++userdom_manage_user_tmp_files(pulseaudio_t) ++userdom_execute_user_tmp_files(pulseaudio_t) + + tunable_policy(`use_nfs_home_dirs',` ++ fs_mount_nfs(pulseaudio_t) ++ fs_mounton_nfs(pulseaudio_t) + fs_manage_nfs_dirs(pulseaudio_t) + fs_manage_nfs_files(pulseaudio_t) + fs_manage_nfs_symlinks(pulseaudio_t) ++ fs_manage_nfs_named_sockets(pulseaudio_t) ++ fs_manage_nfs_named_pipes(pulseaudio_t) + ') + + tunable_policy(`use_samba_home_dirs',` ++ fs_mount_cifs(pulseaudio_t) ++ fs_mounton_cifs(pulseaudio_t) + fs_manage_cifs_dirs(pulseaudio_t) + fs_manage_cifs_files(pulseaudio_t) + fs_manage_cifs_symlinks(pulseaudio_t) ++ fs_manage_cifs_named_sockets(pulseaudio_t) ++ fs_manage_cifs_named_pipes(pulseaudio_t) + ') + + optional_policy(` +@@ -153,8 +136,9 @@ optional_policy(` + + optional_policy(` + dbus_system_domain(pulseaudio_t, pulseaudio_exec_t) +- dbus_all_session_bus_client(pulseaudio_t) +- dbus_connect_all_session_bus(pulseaudio_t) ++ dbus_system_bus_client(pulseaudio_t) ++ dbus_session_bus_client(pulseaudio_t) ++ dbus_connect_session_bus(pulseaudio_t) + + optional_policy(` + consolekit_dbus_chat(pulseaudio_t) +@@ -173,16 +157,33 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ gnome_read_gkeyringd_state(pulseaudio_t) ++ gnome_signull_gkeyringd(pulseaudio_t) ++ gnome_manage_gstreamer_home_files(pulseaudio_t) ++ gnome_exec_gstreamer_home_files(pulseaudio_t) ++') ++ + optional_policy(` + rtkit_scheduled(pulseaudio_t) + ') + ++optional_policy(` ++ mozilla_plugin_delete_tmpfs_files(pulseaudio_t) ++ mozilla_plugin_read_tmpfs_files(pulseaudio_t) ++') ++ + optional_policy(` + policykit_domtrans_auth(pulseaudio_t) + policykit_read_lib(pulseaudio_t) + policykit_read_reload(pulseaudio_t) + ') + ++optional_policy(` ++ systemd_read_logind_sessions_files(pulseaudio_t) ++ systemd_login_read_pid_files(pulseaudio_t) ++') ++ + optional_policy(` + udev_read_state(pulseaudio_t) + udev_read_db(pulseaudio_t) +@@ -190,13 +191,16 @@ optional_policy(` + + optional_policy(` + xserver_stream_connect(pulseaudio_t) +- xserver_manage_xdm_tmp_files(pulseaudio_t) + xserver_read_xdm_lib_files(pulseaudio_t) + xserver_read_xdm_pid(pulseaudio_t) + xserver_user_x_domain_template(pulseaudio, pulseaudio_t, pulseaudio_tmpfs_t) + ') + +-######################################## ++optional_policy(` ++ virt_manage_tmpfs_files(pulseaudio_t) ++') ++ ++####################################### + # + # Client local policy + # +@@ -210,8 +214,6 @@ delete_files_pattern(pulseaudio_client, pulseaudio_tmpfsfile, pulseaudio_tmpfsfi + + fs_getattr_tmpfs(pulseaudio_client) + +-corenet_all_recvfrom_unlabeled(pulseaudio_client) +-corenet_all_recvfrom_netlabel(pulseaudio_client) + corenet_tcp_sendrecv_generic_if(pulseaudio_client) + corenet_tcp_sendrecv_generic_node(pulseaudio_client) + +@@ -220,38 +222,33 @@ corenet_tcp_connect_pulseaudio_port(pulseaudio_client) + corenet_tcp_sendrecv_pulseaudio_port(pulseaudio_client) + + pulseaudio_stream_connect(pulseaudio_client) +-pulseaudio_manage_home(pulseaudio_client) +-pulseaudio_home_filetrans_pulseaudio_home(pulseaudio_client, dir, ".pulse") +-pulseaudio_home_filetrans_pulseaudio_home(pulseaudio_client, file, ".esd_auth") +-pulseaudio_home_filetrans_pulseaudio_home(pulseaudio_client, file, ".pulse-cookie") ++pulseaudio_manage_home_files(pulseaudio_client) + pulseaudio_signull(pulseaudio_client) + +-# TODO: ~/.cache + userdom_manage_user_home_content_files(pulseaudio_client) + +-userdom_read_user_tmpfs_files(pulseaudio_client) +-# userdom_delete_user_tmpfs_files(pulseaudio_client) ++userdom_read_user_tmp_files(pulseaudio_client) + + tunable_policy(`use_nfs_home_dirs',` +- fs_getattr_nfs(pulseaudio_client) +- fs_manage_nfs_dirs(pulseaudio_client) +- fs_manage_nfs_files(pulseaudio_client) +- fs_read_nfs_symlinks(pulseaudio_client) ++ fs_getattr_nfs(pulseaudio_client) ++ fs_manage_nfs_dirs(pulseaudio_client) ++ fs_manage_nfs_files(pulseaudio_client) ++ fs_read_nfs_symlinks(pulseaudio_client) + ') + + tunable_policy(`use_samba_home_dirs',` +- fs_getattr_cifs(pulseaudio_client) +- fs_manage_cifs_dirs(pulseaudio_client) +- fs_manage_cifs_files(pulseaudio_client) +- fs_read_cifs_symlinks(pulseaudio_client) ++ fs_getattr_cifs(pulseaudio_client) ++ fs_manage_cifs_dirs(pulseaudio_client) ++ fs_manage_cifs_files(pulseaudio_client) ++ fs_read_cifs_symlinks(pulseaudio_client) + ') + + optional_policy(` +- pulseaudio_dbus_chat(pulseaudio_client) ++ pulseaudio_dbus_chat(pulseaudio_client) + ') + + optional_policy(` +- rtkit_scheduled(pulseaudio_client) ++ rtkit_scheduled(pulseaudio_client) + ') + + optional_policy(` +diff --git a/puppet.fc b/puppet.fc +index d68e26d1fe..3b08cfd9d8 100644 +--- a/puppet.fc ++++ b/puppet.fc +@@ -1,18 +1,23 @@ +-/etc/puppet(/.*)? gen_context(system_u:object_r:puppet_etc_t,s0) ++/etc/puppet(/.*)? gen_context(system_u:object_r:puppet_etc_t,s0) ++/etc/puppetlabs(/.*)? gen_context(system_u:object_r:puppet_etc_t,s0) + +-/etc/rc\.d/init\.d/puppet -- gen_context(system_u:object_r:puppet_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/puppetmaster -- gen_context(system_u:object_r:puppetmaster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/puppet -- gen_context(system_u:object_r:puppetagent_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/puppetmaster -- gen_context(system_u:object_r:puppetmaster_initrc_exec_t,s0) + +-/usr/bin/puppetca -- gen_context(system_u:object_r:puppetca_exec_t,s0) +-/usr/bin/puppetd -- gen_context(system_u:object_r:puppet_exec_t,s0) +-/usr/bin/puppetmasterd -- gen_context(system_u:object_r:puppetmaster_exec_t,s0) ++#helper scripts ++/usr/bin/start-puppet-agent -- gen_context(system_u:object_r:puppetagent_exec_t,s0) ++/usr/bin/start-puppet-master -- gen_context(system_u:object_r:puppetmaster_exec_t,s0) ++/usr/bin/start-puppet-ca -- gen_context(system_u:object_r:puppetca_exec_t,s0) + +-/usr/sbin/puppetca -- gen_context(system_u:object_r:puppetca_exec_t,s0) +-/usr/sbin/puppetd -- gen_context(system_u:object_r:puppet_exec_t,s0) +-/usr/sbin/puppetmasterd -- gen_context(system_u:object_r:puppetmaster_exec_t,s0) ++/usr/bin/puppetca -- gen_context(system_u:object_r:puppetca_exec_t,s0) ++/usr/bin/puppet -- gen_context(system_u:object_r:puppetagent_exec_t,s0) ++/usr/bin/puppetd -- gen_context(system_u:object_r:puppetagent_exec_t,s0) ++/usr/bin/puppetmasterd -- gen_context(system_u:object_r:puppetmaster_exec_t,s0) + +-/var/lib/puppet(/.*)? gen_context(system_u:object_r:puppet_var_lib_t,s0) ++/usr/sbin/puppetca -- gen_context(system_u:object_r:puppetca_exec_t,s0) ++/usr/sbin/puppetd -- gen_context(system_u:object_r:puppetagent_exec_t,s0) ++/usr/sbin/puppetmasterd -- gen_context(system_u:object_r:puppetmaster_exec_t,s0) + +-/var/log/puppet(/.*)? gen_context(system_u:object_r:puppet_log_t,s0) +- +-/var/run/puppet(/.*)? gen_context(system_u:object_r:puppet_var_run_t,s0) ++/var/lib/puppet(/.*)? gen_context(system_u:object_r:puppet_var_lib_t,s0) ++/var/log/puppet(/.*)? gen_context(system_u:object_r:puppet_log_t,s0) ++/var/run/puppet(/.*)? gen_context(system_u:object_r:puppet_var_run_t,s0) +diff --git a/puppet.if b/puppet.if +index 7cb8b1f9c9..173bc5b0e5 100644 +--- a/puppet.if ++++ b/puppet.if +@@ -1,4 +1,52 @@ +-## Configuration management system. ++## Puppet client daemon ++## ++##

      ++## Puppet is a configuration management system written in Ruby. ++## The client daemon is responsible for periodically requesting the ++## desired system state from the server and ensuring the state of ++## the client system matches. ++##

      ++##
      ++ ++######################################## ++## ++## Execute puppet_master in the puppet_master ++## domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`puppet_domtrans_master',` ++ gen_require(` ++ type puppetmaster_t, puppetmaster_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, puppetmaster_exec_t, puppetmaster_t) ++') ++ ++######################################## ++## ++## Execute puppet in the puppet ++## domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`puppet_domtrans',` ++ gen_require(` ++ type puppet_t, puppet_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, puppet_exec_t, puppet_t) ++') + + ######################################## + ## +@@ -22,7 +70,7 @@ interface(`puppet_domtrans_puppetca',` + + ##################################### + ## +-## Execute puppetca in the puppetca ++## Execute puppet in the puppet + ## domain and allow the specified + ## role the puppetca domain. + ## +@@ -38,39 +86,49 @@ interface(`puppet_domtrans_puppetca',` + ## + ## + # +-interface(`puppet_run_puppetca',` ++interface(`puppet_run',` + gen_require(` +- attribute_role puppetca_roles; ++ type puppet_t, puppet_exec_t; + ') + +- puppet_domtrans_puppetca($1) +- roleattribute $2 puppetca_roles; ++ puppet_domtrans($1) ++ role $2 types puppet_t; + ') + +-#################################### ++##################################### + ## +-## Read puppet configuration content. ++## Execute puppetca in the puppetca ++## domain and allow the specified ++## role the puppetca domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## ++## ++## ++## Role allowed access. ++## ++## ++## + # +-interface(`puppet_read_config',` ++interface(`puppet_run_puppetca',` + gen_require(` +- type puppet_etc_t; ++ type puppetca_t, puppetca_exec_t; + ') + +- files_search_etc($1) +- allow $1 puppet_etc_t:dir list_dir_perms; +- allow $1 puppet_etc_t:file read_file_perms; +- allow $1 puppet_etc_t:lnk_file read_lnk_file_perms; ++ puppet_domtrans_puppetca($1) ++ role $2 types puppetca_t; + ') + ++ + ################################################ + ## +-## Read Puppet lib files. ++## Read / Write to Puppet temp files. Puppet uses ++## some system binaries (groupadd, etc) that run in ++## a non-puppet domain and redirects output into temp ++## files. + ## + ## + ## +@@ -78,19 +136,18 @@ interface(`puppet_read_config',` + ## + ## + # +-interface(`puppet_read_lib_files',` ++interface(`puppet_rw_tmp', ` + gen_require(` +- type puppet_var_lib_t; ++ type puppet_tmp_t; + ') + +- files_search_var_lib($1) +- read_files_pattern($1, puppet_var_lib_t, puppet_var_lib_t) ++ allow $1 puppet_tmp_t:file rw_inherited_file_perms; ++ files_search_tmp($1) + ') + +-############################################### ++################################################ + ## +-## Create, read, write, and delete +-## puppet lib files. ++## Read Puppet lib files. + ## + ## + ## +@@ -98,138 +155,164 @@ interface(`puppet_read_lib_files',` + ## + ## + # +-interface(`puppet_manage_lib_files',` ++interface(`puppet_read_lib',` + gen_require(` + type puppet_var_lib_t; + ') + ++ read_files_pattern($1, puppet_var_lib_t, puppet_var_lib_t) + files_search_var_lib($1) +- manage_files_pattern($1, puppet_var_lib_t, puppet_var_lib_t) + ') + +-##################################### ++############################################### + ## +-## Append puppet log files. ++## Manage Puppet lib files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`puppet_append_log_files',` +- gen_require(` +- type puppet_log_t; +- ') ++interface(`puppet_manage_lib',` ++ gen_require(` ++ type puppet_var_lib_t; ++ ') + +- logging_search_logs($1) +- append_files_pattern($1, puppet_log_t, puppet_log_t) ++ manage_files_pattern($1, puppet_var_lib_t, puppet_var_lib_t) ++ files_search_var_lib($1) + ') + +-##################################### ++###################################### + ## +-## Create puppet log files. ++## Allow the specified domain to search puppet's log files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`puppet_create_log_files',` +- gen_require(` +- type puppet_log_t; +- ') ++interface(`puppet_search_log',` ++ gen_require(` ++ type puppet_log_t; ++ ') + +- logging_search_logs($1) +- create_files_pattern($1, puppet_log_t, puppet_log_t) ++ logging_search_logs($1) ++ allow $1 puppet_log_t:dir search_dir_perms; + ') + + ##################################### + ## +-## Read puppet log files. ++## Allow the specified domain to read puppet's log files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`puppet_read_log_files',` +- gen_require(` +- type puppet_log_t; +- ') ++interface(`puppet_read_log',` ++ gen_require(` ++ type puppet_log_t; ++ ') + +- logging_search_logs($1) ++ logging_search_logs($1) + read_files_pattern($1, puppet_log_t, puppet_log_t) + ') + +-################################################ ++##################################### + ## +-## Read and write to puppet tempoprary files. ++## Allow the specified domain to create puppet's log files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # +-interface(`puppet_rw_tmp', ` +- gen_require(` +- type puppet_tmp_t; +- ') ++interface(`puppet_create_log',` ++ gen_require(` ++ type puppet_log_t; ++ ') + +- files_search_tmp($1) +- allow $1 puppet_tmp_t:file rw_file_perms; ++ logging_search_logs($1) ++ create_files_pattern($1, puppet_log_t, puppet_log_t) + ') + +-######################################## ++#################################### + ## +-## All of the rules required to +-## administrate an puppet environment. ++## Allow the specified domain to append puppet's log files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # +-interface(`puppet_admin',` +- gen_require(` +- type puppet_initrc_exec_t, puppetmaster_initrc_exec_t, puppet_log_t; +- type puppet_var_lib_t, puppet_tmp_t, puppet_etc_t; +- type puppet_var_run_t, puppetmaster_tmp_t; +- type puppet_t, puppetca_t, puppetmaster_t; +- ') ++interface(`puppet_append_log',` ++ gen_require(` ++ type puppet_log_t; ++ ') + +- allow $1 { puppet_t puppetca_t puppetmaster_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { puppet_t puppetca_t puppetmaster_t }) ++ logging_search_logs($1) ++ append_files_pattern($1, puppet_log_t, puppet_log_t) ++') + +- init_labeled_script_domtrans($1, { puppet_initrc_exec_t puppetmaster_initrc_exec_t }) +- domain_system_change_exemption($1) +- role_transition $2 { puppet_initrc_exec_t puppetmaster_initrc_exec_t } system_r; +- allow $2 system_r; ++#################################### ++## ++## Allow the specified domain to manage puppet's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`puppet_manage_log',` ++ gen_require(` ++ type puppet_log_t; ++ ') + +- files_search_etc($1) +- admin_pattern($1, puppet_etc_t) ++ logging_search_logs($1) ++ manage_files_pattern($1, puppet_log_t, puppet_log_t) ++') + +- logging_search_logs($1) +- admin_pattern($1, puppet_log_t) ++#################################### ++## ++## Allow the specified domain to read puppet's config files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`puppet_read_config',` ++ gen_require(` ++ type puppet_etc_t; ++ ') + +- files_search_var_lib($1) +- admin_pattern($1, puppet_var_lib_t) ++ files_search_etc($1) ++ list_dirs_pattern($1, puppet_etc_t, puppet_etc_t) ++ read_files_pattern($1, puppet_etc_t, puppet_etc_t) ++') + ++##################################### ++## ++## Allow the specified domain to search puppet's pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`puppet_search_pid',` ++ gen_require(` ++ type puppet_var_run_t; ++ ') ++ + files_search_pids($1) +- admin_pattern($1, puppet_var_run_t) +- +- files_search_tmp($1) +- admin_pattern($1, { puppet_tmp_t puppetmaster_tmp_t }) +- +- puppet_run_puppetca($1, $2) ++ allow $1 puppet_var_run_t:dir search_dir_perms; + ') +diff --git a/puppet.te b/puppet.te +index 618dcfeedb..6bd7543ae9 100644 +--- a/puppet.te ++++ b/puppet.te +@@ -6,25 +6,32 @@ policy_module(puppet, 1.4.0) + # + + ## +-##

      +-## Determine whether puppet can +-## manage all non-security files. +-##

      ++##

      ++## Allow Puppet client to manage all file ++## types. ++##

      + ##
      +-gen_tunable(puppet_manage_all_files, false) ++gen_tunable(puppetagent_manage_all_files, false) + +-attribute_role puppetca_roles; +-roleattribute system_r puppetca_roles; ++## ++##

      ++## Allow Puppet master to use connect to MySQL and PostgreSQL database ++##

      ++##
      ++gen_tunable(puppetmaster_use_db, false) + +-type puppet_t; +-type puppet_exec_t; +-init_daemon_domain(puppet_t, puppet_exec_t) ++type puppetagent_t; ++type puppetagent_exec_t; ++typealias puppetagent_exec_t alias puppet_exec_t; ++typealias puppetagent_t alias puppet_t; ++init_daemon_domain(puppetagent_t, puppetagent_exec_t) + + type puppet_etc_t; + files_config_file(puppet_etc_t) + +-type puppet_initrc_exec_t; +-init_script_file(puppet_initrc_exec_t) ++type puppetagent_initrc_exec_t; ++typealias puppetagent_initrc_exec_t alias puppet_initrc_exec_t; ++init_script_file(puppetagent_initrc_exec_t) + + type puppet_log_t; + logging_log_file(puppet_log_t) +@@ -37,12 +44,11 @@ files_type(puppet_var_lib_t) + + type puppet_var_run_t; + files_pid_file(puppet_var_run_t) +-init_daemon_run_dir(puppet_var_run_t, "puppet") + + type puppetca_t; + type puppetca_exec_t; + application_domain(puppetca_t, puppetca_exec_t) +-role puppetca_roles types puppetca_t; ++role system_r types puppetca_t; + + type puppetmaster_t; + type puppetmaster_exec_t; +@@ -56,161 +62,170 @@ files_tmp_file(puppetmaster_tmp_t) + + ######################################## + # +-# Local policy ++# Puppet personal policy + # + +-allow puppet_t self:capability { chown fowner fsetid setuid setgid dac_override sys_admin sys_nice sys_tty_config }; +-allow puppet_t self:process { signal signull getsched setsched }; +-allow puppet_t self:fifo_file rw_fifo_file_perms; +-allow puppet_t self:netlink_route_socket create_netlink_socket_perms; +-allow puppet_t self:tcp_socket { accept listen }; +-allow puppet_t self:udp_socket create_socket_perms; +- +-allow puppet_t puppet_etc_t:dir list_dir_perms; +-allow puppet_t puppet_etc_t:file read_file_perms; +-allow puppet_t puppet_etc_t:lnk_file read_lnk_file_perms; +- +-manage_dirs_pattern(puppet_t, puppet_var_lib_t, puppet_var_lib_t) +-manage_files_pattern(puppet_t, puppet_var_lib_t, puppet_var_lib_t) +-can_exec(puppet_t, puppet_var_lib_t) +- +-setattr_dirs_pattern(puppet_t, puppet_var_run_t, puppet_var_run_t) +-manage_files_pattern(puppet_t, puppet_var_run_t, puppet_var_run_t) +-files_pid_filetrans(puppet_t, puppet_var_run_t, { file dir }) +- +-allow puppet_t puppet_log_t:dir { create_dir_perms setattr_dir_perms }; +-append_files_pattern(puppet_t, puppet_log_t, puppet_log_t) +-create_files_pattern(puppet_t, puppet_log_t, puppet_log_t) +-read_files_pattern(puppet_t, puppet_log_t, puppet_log_t) +-setattr_files_pattern(puppet_t, puppet_log_t, puppet_log_t) +-logging_log_filetrans(puppet_t, puppet_log_t, { file dir }) +- +-manage_dirs_pattern(puppet_t, puppet_tmp_t, puppet_tmp_t) +-manage_files_pattern(puppet_t, puppet_tmp_t, puppet_tmp_t) +-files_tmp_filetrans(puppet_t, puppet_tmp_t, { file dir }) +- +-kernel_dontaudit_search_sysctl(puppet_t) +-kernel_dontaudit_search_kernel_sysctl(puppet_t) +-kernel_read_crypto_sysctls(puppet_t) +-kernel_read_kernel_sysctls(puppet_t) +-kernel_read_net_sysctls(puppet_t) +-kernel_read_network_state(puppet_t) +- +-corecmd_exec_bin(puppet_t) +-corecmd_exec_shell(puppet_t) +-corecmd_read_all_executables(puppet_t) +- +-corenet_all_recvfrom_netlabel(puppet_t) +-corenet_all_recvfrom_unlabeled(puppet_t) +-corenet_tcp_sendrecv_generic_if(puppet_t) +-corenet_tcp_sendrecv_generic_node(puppet_t) +- +-corenet_sendrecv_puppet_client_packets(puppet_t) +-corenet_tcp_connect_puppet_port(puppet_t) +-corenet_tcp_sendrecv_puppet_port(puppet_t) +- +-dev_read_rand(puppet_t) +-dev_read_sysfs(puppet_t) +-dev_read_urand(puppet_t) +- +-domain_interactive_fd(puppet_t) +-domain_read_all_domains_state(puppet_t) +- +-files_manage_config_files(puppet_t) +-files_manage_config_dirs(puppet_t) +-files_manage_etc_dirs(puppet_t) +-files_manage_etc_files(puppet_t) +-files_read_usr_files(puppet_t) +-files_read_usr_symlinks(puppet_t) +-files_relabel_config_dirs(puppet_t) +-files_relabel_config_files(puppet_t) +-files_search_var_lib(puppet_t) +- +-selinux_get_fs_mount(puppet_t) +-selinux_search_fs(puppet_t) +-selinux_set_all_booleans(puppet_t) +-selinux_set_generic_booleans(puppet_t) +-selinux_validate_context(puppet_t) +- +-term_dontaudit_getattr_unallocated_ttys(puppet_t) +-term_dontaudit_getattr_all_ttys(puppet_t) +- +-init_all_labeled_script_domtrans(puppet_t) +-init_domtrans_script(puppet_t) +-init_read_utmp(puppet_t) +-init_signull_script(puppet_t) +- +-logging_send_syslog_msg(puppet_t) +- +-miscfiles_read_hwdata(puppet_t) +-miscfiles_read_localization(puppet_t) +- +-mount_domtrans(puppet_t) +- +-seutil_domtrans_setfiles(puppet_t) +-seutil_domtrans_semanage(puppet_t) +- +-sysnet_run_ifconfig(puppet_t, system_r) +-sysnet_use_ldap(puppet_t) +- +-tunable_policy(`puppet_manage_all_files',` +- files_manage_non_auth_files(puppet_t) ++allow puppetagent_t self:capability { fowner fsetid setuid setgid dac_read_search dac_override sys_nice sys_tty_config }; ++allow puppetagent_t self:process { signal signull getsched setsched }; ++allow puppetagent_t self:fifo_file rw_fifo_file_perms; ++allow puppetagent_t self:netlink_route_socket create_netlink_socket_perms; ++allow puppetagent_t self:tcp_socket create_stream_socket_perms; ++allow puppetagent_t self:udp_socket create_socket_perms; ++ ++read_files_pattern(puppetagent_t, puppet_etc_t, puppet_etc_t) ++read_lnk_files_pattern(puppetagent_t, puppet_etc_t, puppet_etc_t) ++ ++manage_dirs_pattern(puppetagent_t, puppet_var_lib_t, puppet_var_lib_t) ++manage_files_pattern(puppetagent_t, puppet_var_lib_t, puppet_var_lib_t) ++files_search_var_lib(puppetagent_t) ++ ++manage_dirs_pattern(puppetagent_t, puppet_var_run_t, puppet_var_run_t) ++manage_files_pattern(puppetagent_t, puppet_var_run_t, puppet_var_run_t) ++files_pid_filetrans(puppetagent_t, puppet_var_run_t, { file dir }) ++ ++create_dirs_pattern(puppetagent_t, var_log_t, puppet_log_t) ++create_files_pattern(puppetagent_t, puppet_log_t, puppet_log_t) ++append_files_pattern(puppetagent_t, puppet_log_t, puppet_log_t) ++logging_log_filetrans(puppetagent_t, puppet_log_t, { file dir }) ++ ++manage_dirs_pattern(puppetagent_t, puppet_tmp_t, puppet_tmp_t) ++manage_files_pattern(puppetagent_t, puppet_tmp_t, puppet_tmp_t) ++files_tmp_filetrans(puppetagent_t, puppet_tmp_t, { file dir }) ++ ++kernel_dontaudit_search_sysctl(puppetagent_t) ++kernel_dontaudit_search_kernel_sysctl(puppetagent_t) ++kernel_read_system_state(puppetagent_t) ++kernel_read_crypto_sysctls(puppetagent_t) ++kernel_read_kernel_sysctls(puppetagent_t) ++ ++corecmd_read_all_executables(puppetagent_t) ++corecmd_dontaudit_access_all_executables(puppetagent_t) ++corecmd_exec_bin(puppetagent_t) ++corecmd_exec_shell(puppetagent_t) ++ ++corenet_all_recvfrom_netlabel(puppetagent_t) ++corenet_tcp_sendrecv_generic_if(puppetagent_t) ++corenet_tcp_sendrecv_generic_node(puppetagent_t) ++corenet_tcp_bind_generic_node(puppetagent_t) ++corenet_tcp_connect_puppet_port(puppetagent_t) ++corenet_sendrecv_puppet_client_packets(puppetagent_t) ++ ++dev_read_rand(puppetagent_t) ++dev_read_sysfs(puppetagent_t) ++dev_read_urand(puppetagent_t) ++ ++domain_read_all_domains_state(puppetagent_t) ++domain_interactive_fd(puppetagent_t) ++domain_named_filetrans(puppetagent_t) ++ ++files_manage_config_files(puppetagent_t) ++files_manage_config_dirs(puppetagent_t) ++files_manage_etc_dirs(puppetagent_t) ++files_manage_etc_files(puppetagent_t) ++files_read_usr_symlinks(puppetagent_t) ++files_relabel_config_dirs(puppetagent_t) ++files_relabel_config_files(puppetagent_t) ++ ++selinux_set_all_booleans(puppetagent_t) ++selinux_set_generic_booleans(puppetagent_t) ++selinux_validate_context(puppetagent_t) ++ ++term_dontaudit_getattr_unallocated_ttys(puppetagent_t) ++term_dontaudit_getattr_all_ttys(puppetagent_t) ++ ++auth_use_nsswitch(puppetagent_t) ++ ++init_all_labeled_script_domtrans(puppetagent_t) ++init_domtrans_script(puppetagent_t) ++init_read_utmp(puppetagent_t) ++init_signull_script(puppetagent_t) ++ ++logging_send_syslog_msg(puppetagent_t) ++ ++miscfiles_read_hwdata(puppetagent_t) ++ ++seutil_domtrans_setfiles(puppetagent_t) ++seutil_domtrans_semanage(puppetagent_t) ++seutil_read_file_contexts(puppetagent_t) ++ ++sysnet_run_ifconfig(puppetagent_t, system_r) ++ ++usermanage_access_check_groupadd(puppetagent_t) ++usermanage_access_check_passwd(puppetagent_t) ++usermanage_access_check_useradd(puppetagent_t) ++ ++tunable_policy(`puppetagent_manage_all_files',` ++ files_manage_non_security_files(puppetagent_t) ++') ++ ++optional_policy(` ++ mysql_stream_connect(puppetagent_t) ++') ++ ++optional_policy(` ++ postgresql_stream_connect(puppetagent_t) ++') ++ ++optional_policy(` ++ cfengine_read_lib_files(puppetagent_t) ++') ++ ++optional_policy(` ++ consoletype_exec(puppetagent_t) + ') + + optional_policy(` +- cfengine_read_lib_files(puppet_t) ++ hostname_exec(puppetagent_t) + ') + + optional_policy(` +- consoletype_exec(puppet_t) ++ mount_domtrans(puppetagent_t) + ') + + optional_policy(` +- hostname_exec(puppet_t) ++ mta_send_mail(puppetagent_t) + ') + + optional_policy(` +- mount_domtrans(puppet_t) ++ networkmanager_dbus_chat(puppetagent_t) + ') + + optional_policy(` +- mta_send_mail(puppet_t) ++ firewalld_dbus_chat(puppetagent_t) + ') + + optional_policy(` +- portage_domtrans(puppet_t) +- portage_domtrans_fetch(puppet_t) +- portage_domtrans_gcc_config(puppet_t) ++ portage_domtrans(puppetagent_t) ++ portage_domtrans_fetch(puppetagent_t) ++ portage_domtrans_gcc_config(puppetagent_t) + ') + + optional_policy(` +- files_rw_var_files(puppet_t) ++ files_rw_var_files(puppetagent_t) + +- rpm_domtrans(puppet_t) +- rpm_manage_db(puppet_t) +- rpm_manage_log(puppet_t) ++ rpm_domtrans(puppetagent_t) ++ rpm_manage_db(puppetagent_t) ++ rpm_manage_log(puppetagent_t) + ') + + optional_policy(` +- unconfined_domain(puppet_t) ++ unconfined_domain_noaudit(puppetagent_t) + ') + + optional_policy(` +- usermanage_domtrans_groupadd(puppet_t) +- usermanage_domtrans_useradd(puppet_t) ++ rhsmcertd_dbus_chat(puppetagent_t) + ') + + ######################################## + # +-# Ca local policy ++# PuppetCA personal policy + # + +-allow puppetca_t self:capability { dac_override setgid setuid }; ++allow puppetca_t self:capability { dac_read_search dac_override setgid setuid }; + allow puppetca_t self:fifo_file rw_fifo_file_perms; + +-allow puppetca_t puppet_etc_t:dir list_dir_perms; +-allow puppetca_t puppet_etc_t:file read_file_perms; +-allow puppetca_t puppet_etc_t:lnk_file read_lnk_file_perms; ++read_files_pattern(puppetca_t, puppet_etc_t, puppet_etc_t) ++read_lnk_files_pattern(puppetca_t, puppet_etc_t, puppet_etc_t) + + allow puppetca_t puppet_var_lib_t:dir list_dir_perms; + manage_files_pattern(puppetca_t, puppet_var_lib_t, puppet_var_lib_t) +@@ -221,6 +236,7 @@ allow puppetca_t puppet_log_t:dir search_dir_perms; + allow puppetca_t puppet_var_run_t:dir search_dir_perms; + + kernel_read_system_state(puppetca_t) ++# Maybe dontaudit this like we did with other puppet domains? + kernel_read_kernel_sysctls(puppetca_t) + + corecmd_exec_bin(puppetca_t) +@@ -229,15 +245,12 @@ corecmd_exec_shell(puppetca_t) + dev_read_urand(puppetca_t) + dev_search_sysfs(puppetca_t) + +-files_read_etc_files(puppetca_t) +-files_search_pids(puppetca_t) + files_search_var_lib(puppetca_t) + + selinux_validate_context(puppetca_t) + + logging_search_logs(puppetca_t) + +-miscfiles_read_localization(puppetca_t) + miscfiles_read_generic_certs(puppetca_t) + + seutil_read_file_contexts(puppetca_t) +@@ -246,38 +259,50 @@ optional_policy(` + hostname_exec(puppetca_t) + ') + ++optional_policy(` ++ mta_sendmail_access_check(puppetca_t) ++') ++ ++ + ######################################## + # +-# Master local policy ++# Pupper master personal policy + # + + allow puppetmaster_t self:capability { dac_read_search dac_override setuid setgid fowner chown fsetid sys_tty_config }; + allow puppetmaster_t self:process { signal_perms getsched setsched }; + allow puppetmaster_t self:fifo_file rw_fifo_file_perms; +-allow puppetmaster_t self:netlink_route_socket nlmsg_write; ++allow puppetmaster_t self:netlink_route_socket create_netlink_socket_perms; + allow puppetmaster_t self:socket create; +-allow puppetmaster_t self:tcp_socket { accept listen }; ++allow puppetmaster_t self:tcp_socket create_stream_socket_perms; ++allow puppetmaster_t self:udp_socket create_socket_perms; + +-allow puppetmaster_t puppet_etc_t:dir list_dir_perms; +-allow puppetmaster_t puppet_etc_t:file read_file_perms; +-allow puppetmaster_t puppet_etc_t:lnk_file read_lnk_file_perms; ++domtrans_pattern(puppetmaster_t, puppetagent_exec_t, puppetagent_t) + +-allow puppetmaster_t puppet_log_t:dir setattr_dir_perms; +-append_files_pattern(puppetmaster_t, puppet_log_t, puppet_log_t) +-create_files_pattern(puppetmaster_t, puppet_log_t, puppet_log_t) +-setattr_files_pattern(puppetmaster_t, puppet_log_t, puppet_log_t) ++list_dirs_pattern(puppetmaster_t, puppet_etc_t, puppet_etc_t) ++read_files_pattern(puppetmaster_t, puppet_etc_t, puppet_etc_t) ++read_lnk_files_pattern(puppetmaster_t, puppet_etc_t, puppet_etc_t) ++ ++allow puppetmaster_t puppet_log_t:dir { rw_dir_perms setattr_dir_perms }; ++allow puppetmaster_t puppet_log_t:file { rw_file_perms create_file_perms setattr_file_perms }; + logging_log_filetrans(puppetmaster_t, puppet_log_t, { file dir }) ++allow puppetmaster_t puppet_log_t:file relabel_file_perms; + +-allow puppetmaster_t puppet_var_lib_t:dir { manage_dir_perms relabel_dir_perms }; +-allow puppetmaster_t puppet_var_lib_t:file { manage_file_perms relabel_file_perms }; ++manage_dirs_pattern(puppetmaster_t, puppet_var_lib_t, puppet_var_lib_t) ++manage_files_pattern(puppetmaster_t, puppet_var_lib_t, puppet_var_lib_t) ++allow puppetmaster_t puppet_var_lib_t:dir relabel_dir_perms; ++allow puppetmaster_t puppet_var_lib_t:file relabel_file_perms; + +-allow puppetmaster_t puppet_var_run_t:dir { create_dir_perms setattr_dir_perms relabel_dir_perms }; +-allow puppetmaster_t puppet_var_run_t:file manage_file_perms; ++setattr_dirs_pattern(puppetmaster_t, puppet_var_run_t, puppet_var_run_t) ++create_dirs_pattern(puppetmaster_t, puppet_var_run_t, puppet_var_run_t) ++manage_files_pattern(puppetmaster_t, puppet_var_run_t, puppet_var_run_t) + files_pid_filetrans(puppetmaster_t, puppet_var_run_t, { file dir }) ++allow puppetmaster_t puppet_var_run_t:dir relabel_dir_perms; + +-allow puppetmaster_t puppetmaster_tmp_t:dir { manage_dir_perms relabel_dir_perms }; +-allow puppetmaster_t puppetmaster_tmp_t:file manage_file_perms; ++manage_dirs_pattern(puppetmaster_t, puppetmaster_tmp_t, puppetmaster_tmp_t) ++manage_files_pattern(puppetmaster_t, puppetmaster_tmp_t, puppetmaster_tmp_t) + files_tmp_filetrans(puppetmaster_t, puppetmaster_tmp_t, { file dir }) ++allow puppetmaster_t puppet_tmp_t:dir relabel_dir_perms; + + kernel_dontaudit_search_kernel_sysctl(puppetmaster_t) + kernel_read_network_state(puppetmaster_t) +@@ -289,23 +314,24 @@ corecmd_exec_bin(puppetmaster_t) + corecmd_exec_shell(puppetmaster_t) + + corenet_all_recvfrom_netlabel(puppetmaster_t) +-corenet_all_recvfrom_unlabeled(puppetmaster_t) + corenet_tcp_sendrecv_generic_if(puppetmaster_t) + corenet_tcp_sendrecv_generic_node(puppetmaster_t) + corenet_tcp_bind_generic_node(puppetmaster_t) +- +-corenet_sendrecv_puppet_server_packets(puppetmaster_t) + corenet_tcp_bind_puppet_port(puppetmaster_t) +-corenet_tcp_sendrecv_puppet_port(puppetmaster_t) ++corenet_sendrecv_puppet_server_packets(puppetmaster_t) ++corenet_tcp_connect_ntop_port(puppetmaster_t) ++ ++# This needs investigation. Puppermasterd is confirmed to bind udp sockets to random high ports. ++corenet_udp_bind_generic_node(puppetmaster_t) ++corenet_udp_bind_generic_port(puppetmaster_t) + + dev_read_rand(puppetmaster_t) + dev_read_urand(puppetmaster_t) + dev_search_sysfs(puppetmaster_t) + +-domain_obj_id_change_exemption(puppetmaster_t) + domain_read_all_domains_state(puppetmaster_t) ++domain_obj_id_change_exemption(puppetmaster_t) + +-files_read_usr_files(puppetmaster_t) + + selinux_validate_context(puppetmaster_t) + +@@ -314,26 +340,32 @@ auth_use_nsswitch(puppetmaster_t) + logging_send_syslog_msg(puppetmaster_t) + + miscfiles_read_generic_certs(puppetmaster_t) +-miscfiles_read_localization(puppetmaster_t) + + seutil_read_file_contexts(puppetmaster_t) + + sysnet_run_ifconfig(puppetmaster_t, system_r) + ++mta_send_mail(puppetmaster_t) ++ + optional_policy(` +- hostname_exec(puppetmaster_t) ++ tunable_policy(`puppetmaster_use_db',` ++ mysql_stream_connect(puppetmaster_t) ++ ') + ') + + optional_policy(` +- mta_send_mail(puppetmaster_t) ++ tunable_policy(`puppetmaster_use_db',` ++ postgresql_stream_connect(puppetmaster_t) ++ ') + ') + + optional_policy(` +- mysql_stream_connect(puppetmaster_t) ++ systemd_dbus_chat_timedated(puppetagent_t) ++ systemd_dbus_chat_timedated(puppetmaster_t) + ') + + optional_policy(` +- postgresql_stream_connect(puppetmaster_t) ++ hostname_exec(puppetmaster_t) + ') + + optional_policy(` +@@ -342,3 +374,9 @@ optional_policy(` + rpm_exec(puppetmaster_t) + rpm_read_db(puppetmaster_t) + ') ++ ++optional_policy(` ++ usermanage_access_check_groupadd(puppetmaster_t) ++ usermanage_access_check_passwd(puppetmaster_t) ++ usermanage_access_check_useradd(puppetmaster_t) ++') +diff --git a/pwauth.fc b/pwauth.fc +index 7e7b44434e..e2f8687dbd 100644 +--- a/pwauth.fc ++++ b/pwauth.fc +@@ -1,3 +1,3 @@ +-/usr/bin/pwauth -- gen_context(system_u:object_r:pwauth_exec_t,s0) ++/usr/bin/pwauth -- gen_context(system_u:object_r:pwauth_exec_t,s0) + +-/var/run/pwauth\.lock -- gen_context(system_u:object_r:pwauth_var_run_t,s0) ++/var/run/pwauth.lock -- gen_context(system_u:object_r:pwauth_var_run_t,s0) +diff --git a/pwauth.if b/pwauth.if +index 1148dce1ae..86d25ea260 100644 +--- a/pwauth.if ++++ b/pwauth.if +@@ -1,72 +1,74 @@ +-## External plugin for mod_authnz_external authenticator. ++ ++## policy for pwauth + + ######################################## + ## +-## Role access for pwauth. ++## Transition to pwauth. + ## +-## +-## +-## Role allowed access. +-## +-## + ## +-## +-## User domain for the role. +-## ++## ++## Domain allowed to transition. ++## + ## + # +-interface(`pwauth_role',` ++interface(`pwauth_domtrans',` + gen_require(` +- type pwauth_t; ++ type pwauth_t, pwauth_exec_t; + ') + +- pwauth_run($2, $1) +- +- ps_process_pattern($2, pwauth_t) +- allow $2 pwauth_t:process { ptrace signal_perms }; ++ corecmd_search_bin($1) ++ domtrans_pattern($1, pwauth_exec_t, pwauth_t) + ') + + ######################################## + ## +-## Execute pwauth in the pwauth domain. ++## Execute pwauth in the pwauth domain, and ++## allow the specified role the pwauth domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the pwauth domain. + ## + ## + # +-interface(`pwauth_domtrans',` ++interface(`pwauth_run',` + gen_require(` +- type pwauth_t, pwauth_exec_t; ++ type pwauth_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, pwauth_exec_t, pwauth_t) ++ pwauth_domtrans($1) ++ role $2 types pwauth_t; + ') + + ######################################## + ## +-## Execute pwauth in the pwauth +-## domain, and allow the specified +-## role the pwauth domain. ++## Role access for pwauth + ## +-## ++## + ## +-## Domain allowed to transition. ++## Role allowed access + ## + ## +-## ++## + ## +-## Role allowed access. ++## User domain for the role + ## + ## + # +-interface(`pwauth_run',` ++interface(`pwauth_role',` + gen_require(` +- attribute_role pwauth_roles; ++ type pwauth_t; + ') + +- pwauth_domtrans($1) +- roleattribute $2 pwauth_roles; ++ role $1 types pwauth_t; ++ ++ pwauth_domtrans($2) ++ ++ ps_process_pattern($2, pwauth_t) ++ allow $2 pwauth_t:process signal; + ') +diff --git a/pwauth.te b/pwauth.te +index 3078e349e4..215df880c5 100644 +--- a/pwauth.te ++++ b/pwauth.te +@@ -5,26 +5,23 @@ policy_module(pwauth, 1.0.0) + # Declarations + # + +-attribute_role pwauth_roles; +-roleattribute system_r pwauth_roles; +- + type pwauth_t; + type pwauth_exec_t; + application_domain(pwauth_t, pwauth_exec_t) +-role pwauth_roles types pwauth_t; ++role system_r types pwauth_t; + + type pwauth_var_run_t; + files_pid_file(pwauth_var_run_t) + + ######################################## + # +-# Local policy ++# pwauth local policy + # +- + allow pwauth_t self:capability setuid; + allow pwauth_t self:process setrlimit; ++ + allow pwauth_t self:fifo_file manage_fifo_file_perms; +-allow pwauth_t self:unix_stream_socket { accept listen }; ++allow pwauth_t self:unix_stream_socket create_stream_socket_perms; + + manage_files_pattern(pwauth_t, pwauth_var_run_t, pwauth_var_run_t) + files_pid_filetrans(pwauth_t, pwauth_var_run_t, file) +@@ -33,10 +30,10 @@ domain_use_interactive_fds(pwauth_t) + + auth_domtrans_chkpwd(pwauth_t) + auth_use_nsswitch(pwauth_t) ++auth_read_shadow(pwauth_t) ++auth_rw_lastlog(pwauth_t) + + init_read_utmp(pwauth_t) + + logging_send_syslog_msg(pwauth_t) + logging_send_audit_msgs(pwauth_t) +- +-miscfiles_read_localization(pwauth_t) +diff --git a/pxe.te b/pxe.te +index 06bec9ba91..1b32632dcc 100644 +--- a/pxe.te ++++ b/pxe.te +@@ -50,15 +50,12 @@ dev_read_sysfs(pxe_t) + + domain_use_interactive_fds(pxe_t) + +-files_read_etc_files(pxe_t) + + fs_getattr_all_fs(pxe_t) + fs_search_auto_mountpoints(pxe_t) + + logging_send_syslog_msg(pxe_t) + +-miscfiles_read_localization(pxe_t) +- + userdom_dontaudit_use_unpriv_user_fds(pxe_t) + userdom_dontaudit_search_user_home_dirs(pxe_t) + +diff --git a/pyicqt.fc b/pyicqt.fc +deleted file mode 100644 +index 0c143e3e87..0000000000 +--- a/pyicqt.fc ++++ /dev/null +@@ -1,11 +0,0 @@ +-/etc/pyicq-t(/.*)? gen_context(system_u:object_r:pyicqt_conf_t,s0) +- +-/etc/rc\.d/init\.d/pyicq-t -- gen_context(system_u:object_r:pyicqt_initrc_exec_t,s0) +- +-/usr/share/pyicq-t/PyICQt\.py -- gen_context(system_u:object_r:pyicqt_exec_t,s0) +- +-/var/log/pyicq-t\.log.* -- gen_context(system_u:object_r:pyicqt_log_t,s0) +- +-/var/run/pyicq-t(/.*)? gen_context(system_u:object_r:pyicqt_var_run_t,s0) +- +-/var/spool/pyicq-t(/.*)? gen_context(system_u:object_r:pyicqt_spool_t,s0) +diff --git a/pyicqt.if b/pyicqt.if +deleted file mode 100644 +index 0ccea828aa..0000000000 +--- a/pyicqt.if ++++ /dev/null +@@ -1,45 +0,0 @@ +-## ICQ transport for XMPP server. +- +-######################################## +-## +-## All of the rules required to +-## administrate an pyicqt environment. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-# +-interface(`pyicqt_admin',` +- gen_require(` +- type pyicqt_t, pyicqt_log_t, pyicqt_spool_t; +- type pyicqt_var_run_t, pyicqt_initrc_exec_t, pyicqt_conf_t; +- ') +- +- allow $1 pyicqt_t:process { ptrace signal_perms }; +- ps_process_pattern($1, pyicqt_t) +- +- init_labeled_script_domtrans($1, pyicqt_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 pyicqt_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_etc($1) +- admin_pattern($1, pyicqt_conf_t) +- +- logging_search_logs($1) +- admin_pattern($1, pyicqt_log_t) +- +- files_search_spool($1) +- admin_pattern($1, pyicqt_spool_t) +- +- files_search_pids($1) +- admin_pattern($1, pyicqt_var_run_t) +-') +diff --git a/pyicqt.te b/pyicqt.te +deleted file mode 100644 +index f2863ded4a..0000000000 +--- a/pyicqt.te ++++ /dev/null +@@ -1,92 +0,0 @@ +-policy_module(pyicqt, 1.1.0) +- +-######################################## +-# +-# Declarations +-# +- +-type pyicqt_t; +-type pyicqt_exec_t; +-init_daemon_domain(pyicqt_t, pyicqt_exec_t) +- +-type pyicqt_initrc_exec_t; +-init_script_file(pyicqt_initrc_exec_t) +- +-type pyicqt_conf_t; +-files_config_file(pyicqt_conf_t) +- +-type pyicqt_log_t; +-logging_log_file(pyicqt_log_t) +- +-type pyicqt_spool_t; +-files_type(pyicqt_spool_t) +- +-type pyicqt_var_run_t; +-files_pid_file(pyicqt_var_run_t) +- +-######################################## +-# +-# Local policy +-# +- +-allow pyicqt_t self:process signal_perms; +-allow pyicqt_t self:fifo_file rw_fifo_file_perms; +-allow pyicqt_t self:tcp_socket { accept listen }; +- +-read_files_pattern(pyicqt_t, pyicqt_conf_t, pyicqt_conf_t) +- +-allow pyicqt_t pyicqt_log_t:file append_file_perms; +-allow pyicqt_t pyicqt_log_t:file create_file_perms; +-allow pyicqt_t pyicqt_log_t:file setattr_file_perms; +-logging_log_filetrans(pyicqt_t, pyicqt_log_t, file) +- +-manage_dirs_pattern(pyicqt_t, pyicqt_spool_t, pyicqt_spool_t) +-manage_files_pattern(pyicqt_t, pyicqt_spool_t, pyicqt_spool_t) +-files_spool_filetrans(pyicqt_t, pyicqt_spool_t, dir) +- +-manage_files_pattern(pyicqt_t, pyicqt_var_run_t, pyicqt_var_run_t) +-files_pid_filetrans(pyicqt_t, pyicqt_var_run_t, file) +- +-kernel_read_system_state(pyicqt_t) +- +-corecmd_exec_bin(pyicqt_t) +- +-corenet_all_recvfrom_unlabeled(pyicqt_t) +-corenet_all_recvfrom_netlabel(pyicqt_t) +-corenet_tcp_sendrecv_generic_if(pyicqt_t) +-corenet_tcp_sendrecv_generic_node(pyicqt_t) +-corenet_tcp_bind_generic_node(pyicqt_t) +- +-# corenet_sendrecv_jabber_router_server_packets(pyicqt_t) +-# corenet_tcp_bind_jabber_router_port(pyicqt_t) +-# corenet_sendrecv_jabber_router_client_packets(pyicqt_t) +-# corenet_tcp_connect_jabber_router_port(pyicqt_t) +-# corenet_tcp_sendrecv_jabber_router_port(pyicqt_t) +- +-dev_read_sysfs(pyicqt_t) +-dev_read_urand(pyicqt_t) +- +-files_read_usr_files(pyicqt_t) +- +-fs_getattr_all_fs(pyicqt_t) +- +-auth_use_nsswitch(pyicqt_t) +- +-libs_read_lib_files(pyicqt_t) +- +-logging_send_syslog_msg(pyicqt_t) +- +-miscfiles_read_localization(pyicqt_t) +- +-optional_policy(` +- jabber_manage_lib_files(pyicqt_t) +-') +- +-optional_policy(` +- mysql_stream_connect(pyicqt_t) +- mysql_tcp_connect(pyicqt_t) +-') +- +-optional_policy(` +- seutil_sigchld_newrole(pyicqt_t) +-') +diff --git a/pyzor.fc b/pyzor.fc +index af13139a14..a927c5a156 100644 +--- a/pyzor.fc ++++ b/pyzor.fc +@@ -1,12 +1,13 @@ +-HOME_DIR/\.pyzor(/.*)? gen_context(system_u:object_r:pyzor_home_t,s0) +- +-/etc/pyzor(/.*)? gen_context(system_u:object_r:pyzor_etc_t, s0) +- ++/etc/pyzor(/.*)? gen_context(system_u:object_r:pyzor_etc_t, s0) + /etc/rc\.d/init\.d/pyzord -- gen_context(system_u:object_r:pyzord_initrc_exec_t,s0) + +-/usr/bin/pyzor -- gen_context(system_u:object_r:pyzor_exec_t,s0) +-/usr/bin/pyzord -- gen_context(system_u:object_r:pyzord_exec_t,s0) ++HOME_DIR/\.pyzor(/.*)? gen_context(system_u:object_r:pyzor_home_t,s0) ++HOME_DIR/\.spamd(/.*)? gen_context(system_u:object_r:pyzor_home_t,s0) ++/root/\.pyzor(/.*)? gen_context(system_u:object_r:pyzor_home_t,s0) ++/root/\.spamd(/.*)? gen_context(system_u:object_r:pyzor_home_t,s0) + +-/var/lib/pyzord(/.*)? gen_context(system_u:object_r:pyzor_var_lib_t,s0) ++/usr/bin/pyzor -- gen_context(system_u:object_r:pyzor_exec_t,s0) ++/usr/bin/pyzord -- gen_context(system_u:object_r:pyzord_exec_t,s0) + ++/var/lib/pyzord(/.*)? gen_context(system_u:object_r:pyzor_var_lib_t,s0) + /var/log/pyzord\.log.* -- gen_context(system_u:object_r:pyzord_log_t,s0) +diff --git a/pyzor.if b/pyzor.if +index 593c03d098..2c411af3ee 100644 +--- a/pyzor.if ++++ b/pyzor.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Role access for pyzor. ++## Role access for pyzor + ## + ## + ## +@@ -14,31 +14,30 @@ + ## User domain for the role + ## + ## ++## + # + interface(`pyzor_role',` + gen_require(` +- attribute_role pyzor_roles; +- type pyzor_t, pyzor_exec_t, pyzor_home_t; +- type pyzor_tmp_t; ++ type pyzor_t, pyzor_exec_t; ++ type pyzor_home_t, pyzor_var_lib_t, pyzor_tmp_t; + ') + +- roleattribute $1 pyzor_roles; ++ role $1 types pyzor_t; + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, pyzor_exec_t, pyzor_t) + +- allow $2 pyzor_t:process { ptrace signal_perms }; ++ # allow ps to show pyzor and allow the user to kill it + ps_process_pattern($2, pyzor_t) +- +- allow $2 { pyzor_home_t pyzor_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { pyzor_home_t pyzor_tmp_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 pyzor_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- +- userdom_user_home_dir_filetrans($2, pyzor_home_t, dir, ".pyzor") ++ allow $2 pyzor_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 pyzor_t:process ptrace; ++ ') + ') + + ######################################## + ## +-## Send generic signals to pyzor. ++## Send generic signals to pyzor + ## + ## + ## +@@ -69,6 +68,7 @@ interface(`pyzor_domtrans',` + type pyzor_exec_t, pyzor_t; + ') + ++ files_search_usr($1) + corecmd_search_bin($1) + domtrans_pattern($1, pyzor_exec_t, pyzor_t) + ') +@@ -88,14 +88,15 @@ interface(`pyzor_exec',` + type pyzor_exec_t; + ') + ++ files_search_usr($1) + corecmd_search_bin($1) + can_exec($1, pyzor_exec_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an pyzor environment. ++## All of the rules required to administrate ++## an pyzor environment + ## + ## + ## +@@ -104,33 +105,37 @@ interface(`pyzor_exec',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the pyzor domain. + ## + ## + ## + # + interface(`pyzor_admin',` + gen_require(` +- type pyzord_t, pyzord_initrc_exec_t, pyzord_log_t; +- type pyzor_var_lib_t, pyzor_etc_t; ++ type pyzord_t, pyzor_tmp_t, pyzord_log_t; ++ type pyzor_etc_t, pyzor_var_lib_t, pyzord_initrc_exec_t; + ') + +- allow $1 pyzord_t:process { ptrace signal_perms }; ++ allow $1 pyzord_t:process signal_perms; + ps_process_pattern($1, pyzord_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 pyzord_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, pyzord_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 pyzord_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) +- admin_pattern($1, pyzor_etc_t) ++ files_list_tmp($1) ++ admin_pattern($1, pyzor_tmp_t) + +- logging_search_logs($1) ++ logging_list_logs($1) + admin_pattern($1, pyzord_log_t) + +- files_search_var_lib($1) +- admin_pattern($1, pyzor_var_lib_t) ++ files_list_etc($1) ++ admin_pattern($1, pyzor_etc_t) + +- pyzor_role($2, $1) ++ files_list_var_lib($1) ++ admin_pattern($1, pyzor_var_lib_t) + ') +diff --git a/pyzor.te b/pyzor.te +index 2439d1304e..d7bd6e9a10 100644 +--- a/pyzor.te ++++ b/pyzor.te +@@ -5,57 +5,78 @@ policy_module(pyzor, 2.3.0) + # Declarations + # + +-attribute_role pyzor_roles; +-roleattribute system_r pyzor_roles; +- +-type pyzor_t; +-type pyzor_exec_t; +-typealias pyzor_t alias { user_pyzor_t staff_pyzor_t sysadm_pyzor_t }; +-typealias pyzor_t alias { auditadm_pyzor_t secadm_pyzor_t }; +-userdom_user_application_domain(pyzor_t, pyzor_exec_t) +-role pyzor_roles types pyzor_t; +- +-type pyzor_etc_t; +-files_type(pyzor_etc_t) +- +-type pyzor_home_t; +-typealias pyzor_home_t alias { user_pyzor_home_t staff_pyzor_home_t sysadm_pyzor_home_t }; +-typealias pyzor_home_t alias { auditadm_pyzor_home_t secadm_pyzor_home_t }; +-userdom_user_home_content(pyzor_home_t) +- +-type pyzor_tmp_t; +-typealias pyzor_tmp_t alias { user_pyzor_tmp_t staff_pyzor_tmp_t sysadm_pyzor_tmp_t }; +-typealias pyzor_tmp_t alias { auditadm_pyzor_tmp_t secadm_pyzor_tmp_t }; +-userdom_user_tmp_file(pyzor_tmp_t) +- +-type pyzor_var_lib_t; +-typealias pyzor_var_lib_t alias { user_pyzor_var_lib_t staff_pyzor_var_lib_t sysadm_pyzor_var_lib_t }; +-typealias pyzor_var_lib_t alias { auditadm_pyzor_var_lib_t secadm_pyzor_var_lib_t }; +-files_type(pyzor_var_lib_t) +-ubac_constrained(pyzor_var_lib_t) +- +-type pyzord_t; +-type pyzord_exec_t; +-init_daemon_domain(pyzord_t, pyzord_exec_t) +- +-type pyzord_initrc_exec_t; +-init_script_file(pyzord_initrc_exec_t) +- +-type pyzord_log_t; +-logging_log_file(pyzord_log_t) ++ifdef(`distro_redhat',` ++ gen_require(` ++ type spamc_t, spamc_exec_t, spamd_t; ++ type spamd_initrc_exec_t, spamd_exec_t, spamc_tmp_t; ++ type spamd_log_t, spamd_var_lib_t, spamd_etc_t; ++ type spamc_tmp_t, spamc_home_t; ++ ') ++ ++ typealias spamc_t alias pyzor_t; ++ typealias spamc_exec_t alias pyzor_exec_t; ++ typealias spamd_t alias pyzord_t; ++ typealias spamd_initrc_exec_t alias pyzord_initrc_exec_t; ++ typealias spamd_exec_t alias pyzord_exec_t; ++ typealias spamc_tmp_t alias pyzor_tmp_t; ++ typealias spamd_log_t alias pyzor_log_t; ++ typealias spamd_log_t alias pyzord_log_t; ++ typealias spamd_var_lib_t alias pyzor_var_lib_t; ++ typealias spamd_etc_t alias pyzor_etc_t; ++ typealias spamc_home_t alias pyzor_home_t; ++ typealias spamc_home_t alias user_pyzor_home_t; ++',` ++ type pyzor_t; ++ type pyzor_exec_t; ++ typealias pyzor_t alias { user_pyzor_t staff_pyzor_t sysadm_pyzor_t }; ++ typealias pyzor_t alias { auditadm_pyzor_t secadm_pyzor_t }; ++ application_domain(pyzor_t, pyzor_exec_t) ++ ubac_constrained(pyzor_t) ++ role system_r types pyzor_t; ++ ++ type pyzor_etc_t; ++ files_config_file(pyzor_etc_t) ++ ++ type pyzor_home_t; ++ typealias pyzor_home_t alias { user_pyzor_home_t staff_pyzor_home_t sysadm_pyzor_home_t }; ++ typealias pyzor_home_t alias { auditadm_pyzor_home_t secadm_pyzor_home_t }; ++ userdom_user_home_content(pyzor_home_t) ++ ++ type pyzor_tmp_t; ++ typealias pyzor_tmp_t alias { user_pyzor_tmp_t staff_pyzor_tmp_t sysadm_pyzor_tmp_t }; ++ typealias pyzor_tmp_t alias { auditadm_pyzor_tmp_t secadm_pyzor_tmp_t }; ++ files_tmp_file(pyzor_tmp_t) ++ ubac_constrained(pyzor_tmp_t) ++ ++ type pyzor_var_lib_t; ++ typealias pyzor_var_lib_t alias { user_pyzor_var_lib_t staff_pyzor_var_lib_t sysadm_pyzor_var_lib_t }; ++ typealias pyzor_var_lib_t alias { auditadm_pyzor_var_lib_t secadm_pyzor_var_lib_t }; ++ files_type(pyzor_var_lib_t) ++ ubac_constrained(pyzor_var_lib_t) ++ ++ type pyzord_t; ++ type pyzord_exec_t; ++ init_daemon_domain(pyzord_t, pyzord_exec_t) ++ ++ type pyzord_log_t; ++ logging_log_file(pyzord_log_t) ++') + + ######################################## + # +-# Local policy ++# Pyzor client local policy + # + ++allow pyzor_t self:udp_socket create_socket_perms; ++ + manage_dirs_pattern(pyzor_t, pyzor_home_t, pyzor_home_t) + manage_files_pattern(pyzor_t, pyzor_home_t, pyzor_home_t) + manage_lnk_files_pattern(pyzor_t, pyzor_home_t, pyzor_home_t) +-userdom_user_home_dir_filetrans(pyzor_t, pyzor_home_t, dir, ".pyzor") ++userdom_user_home_dir_filetrans(pyzor_t, pyzor_home_t, { dir file lnk_file }) + + allow pyzor_t pyzor_var_lib_t:dir list_dir_perms; + read_files_pattern(pyzor_t, pyzor_var_lib_t, pyzor_var_lib_t) ++files_search_var_lib(pyzor_t) + + manage_files_pattern(pyzor_t, pyzor_tmp_t, pyzor_tmp_t) + manage_dirs_pattern(pyzor_t, pyzor_tmp_t, pyzor_tmp_t) +@@ -67,41 +88,28 @@ kernel_read_system_state(pyzor_t) + corecmd_list_bin(pyzor_t) + corecmd_getattr_bin_files(pyzor_t) + +-corenet_all_recvfrom_unlabeled(pyzor_t) +-corenet_all_recvfrom_netlabel(pyzor_t) + corenet_tcp_sendrecv_generic_if(pyzor_t) ++corenet_udp_sendrecv_generic_if(pyzor_t) + corenet_tcp_sendrecv_generic_node(pyzor_t) +- +-corenet_sendrecv_http_client_packets(pyzor_t) ++corenet_udp_sendrecv_generic_node(pyzor_t) ++corenet_tcp_sendrecv_all_ports(pyzor_t) ++corenet_udp_sendrecv_all_ports(pyzor_t) + corenet_tcp_connect_http_port(pyzor_t) +-corenet_tcp_sendrecv_http_port(pyzor_t) + + dev_read_urand(pyzor_t) + +-fs_getattr_all_fs(pyzor_t) +-fs_search_auto_mountpoints(pyzor_t) ++fs_getattr_xattr_fs(pyzor_t) ++ + + auth_use_nsswitch(pyzor_t) + +-miscfiles_read_localization(pyzor_t) + + mta_read_queue(pyzor_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(pyzor_t) +- fs_manage_nfs_files(pyzor_t) +- fs_manage_nfs_symlinks(pyzor_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(pyzor_t) +- fs_manage_cifs_files(pyzor_t) +- fs_manage_cifs_symlinks(pyzor_t) +-') ++userdom_dontaudit_search_user_home_dirs(pyzor_t) + + optional_policy(` +- amavis_manage_lib_files(pyzor_t) +- amavis_manage_spool_files(pyzor_t) ++ antivirus_manage_db(pyzor_t) + ') + + optional_policy(` +@@ -111,25 +119,24 @@ optional_policy(` + + ######################################## + # +-# Daemon local policy ++# Pyzor server local policy + # + +-allow pyzord_t pyzor_var_lib_t:dir setattr_dir_perms; ++allow pyzord_t self:udp_socket create_socket_perms; ++ + manage_files_pattern(pyzord_t, pyzor_var_lib_t, pyzor_var_lib_t) ++allow pyzord_t pyzor_var_lib_t:dir setattr; + files_var_lib_filetrans(pyzord_t, pyzor_var_lib_t, { file dir }) + ++read_files_pattern(pyzord_t, pyzor_etc_t, pyzor_etc_t) + allow pyzord_t pyzor_etc_t:dir list_dir_perms; +-allow pyzord_t pyzor_etc_t:file read_file_perms; +-allow pyzord_t pyzor_etc_t:lnk_file read_lnk_file_perms; + ++can_exec(pyzord_t, pyzor_exec_t) ++ ++manage_files_pattern(pyzord_t, pyzord_log_t, pyzord_log_t) + allow pyzord_t pyzord_log_t:dir setattr_dir_perms; +-append_files_pattern(pyzord_t, pyzord_log_t, pyzord_log_t) +-create_files_pattern(pyzord_t, pyzord_log_t, pyzord_log_t) +-setattr_files_pattern(pyzord_t, pyzord_log_t, pyzord_log_t) + logging_log_filetrans(pyzord_t, pyzord_log_t, { file dir }) + +-can_exec(pyzord_t, pyzor_exec_t) +- + kernel_read_kernel_sysctls(pyzord_t) + kernel_read_system_state(pyzord_t) + +@@ -137,24 +144,25 @@ dev_read_urand(pyzord_t) + + corecmd_exec_bin(pyzord_t) + +-corenet_all_recvfrom_unlabeled(pyzord_t) + corenet_all_recvfrom_netlabel(pyzord_t) + corenet_udp_sendrecv_generic_if(pyzord_t) + corenet_udp_sendrecv_generic_node(pyzord_t) ++corenet_udp_sendrecv_all_ports(pyzord_t) + corenet_udp_bind_generic_node(pyzord_t) +- +-corenet_sendrecv_pyzor_server_packets(pyzord_t) + corenet_udp_bind_pyzor_port(pyzord_t) +-corenet_udp_sendrecv_pyzor_port(pyzord_t) ++corenet_sendrecv_pyzor_server_packets(pyzord_t) + +-auth_use_nsswitch(pyzord_t) + +-logging_send_syslog_msg(pyzord_t) ++auth_use_nsswitch(pyzord_t) + + locallogin_dontaudit_use_fds(pyzord_t) + +-miscfiles_read_localization(pyzord_t) + ++# Do not audit attempts to access /root. + userdom_dontaudit_search_user_home_dirs(pyzord_t) + + mta_manage_spool(pyzord_t) ++ ++optional_policy(` ++ logging_send_syslog_msg(pyzord_t) ++') +diff --git a/qemu.fc b/qemu.fc +index 86ea53ce18..a2dcf7bb2f 100644 +--- a/qemu.fc ++++ b/qemu.fc +@@ -1,4 +1,4 @@ +-/usr/bin/qemu -- gen_context(system_u:object_r:qemu_exec_t,s0) ++/usr/bin/qemu -- gen_context(system_u:object_r:qemu_exec_t,s0) + /usr/bin/qemu-system-.* -- gen_context(system_u:object_r:qemu_exec_t,s0) + /usr/bin/qemu-kvm -- gen_context(system_u:object_r:qemu_exec_t,s0) + /usr/bin/kvm -- gen_context(system_u:object_r:qemu_exec_t,s0) +diff --git a/qemu.if b/qemu.if +index eaf56b8b02..8894726888 100644 +--- a/qemu.if ++++ b/qemu.if +@@ -1,19 +1,21 @@ +-## QEMU machine emulator and virtualizer. ++## QEMU machine emulator and virtualizer + +-####################################### ++######################################## + ## +-## The template to define a qemu domain. ++## Creates types and rules for a basic ++## qemu process domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # + template(`qemu_domain_template',` ++ + ############################## + # +- # Declarations ++ # Local Policy + # + + type $1_t; +@@ -22,9 +24,12 @@ template(`qemu_domain_template',` + type $1_tmp_t; + files_tmp_file($1_tmp_t) + ++ type $1_tmpfs_t; ++ files_tmpfs_file($1_tmpfs_t) ++ + ############################## + # +- # Policy ++ # Local Policy + # + + allow $1_t self:capability { dac_read_search dac_override }; +@@ -39,9 +44,12 @@ template(`qemu_domain_template',` + manage_files_pattern($1_t, $1_tmp_t, $1_tmp_t) + files_tmp_filetrans($1_t, $1_tmp_t, { file dir }) + ++ manage_dirs_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) ++ manage_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) ++ fs_tmpfs_filetrans($1_t, $1_tmpfs_t, { file dir }) ++ + kernel_read_system_state($1_t) + +- corenet_all_recvfrom_unlabeled($1_t) + corenet_all_recvfrom_netlabel($1_t) + corenet_tcp_sendrecv_generic_if($1_t) + corenet_tcp_sendrecv_generic_node($1_t) +@@ -61,7 +69,6 @@ template(`qemu_domain_template',` + + fs_list_inotifyfs($1_t) + fs_rw_anon_inodefs_files($1_t) +- fs_rw_tmpfs_files($1_t) + + storage_raw_write_removable_device($1_t) + storage_raw_read_removable_device($1_t) +@@ -70,11 +77,10 @@ template(`qemu_domain_template',` + term_getattr_pty_fs($1_t) + term_use_generic_ptys($1_t) + +- miscfiles_read_localization($1_t) + + sysnet_read_config($1_t) + +- userdom_use_user_terminals($1_t) ++ userdom_use_inherited_user_terminals($1_t) + userdom_attach_admin_tun_iface($1_t) + + optional_policy(` +@@ -96,40 +102,14 @@ template(`qemu_domain_template',` + ') + ') + +-######################################## +-## +-## Role access for qemu. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-template(`qemu_role',` +- gen_require(` +- type qemu_t; +- ') +- +- qemu_run($2, $1) +- +- allow $2 qemu_t:process { ptrace signal_perms }; +- ps_process_pattern($2, qemu_t) +-') +- + ######################################## + ## + ## Execute a domain transition to run qemu. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`qemu_domtrans',` +@@ -137,18 +117,17 @@ interface(`qemu_domtrans',` + type qemu_t, qemu_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, qemu_exec_t, qemu_t) + ') + + ######################################## + ## +-## Execute a qemu in the caller domain. ++## Execute a qemu in the callers domain + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`qemu_exec',` +@@ -156,15 +135,12 @@ interface(`qemu_exec',` + type qemu_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, qemu_exec_t) + ') + + ######################################## + ## +-## Execute qemu in the qemu domain, +-## and allow the specified role the +-## qemu domain. ++## Execute qemu in the qemu domain. + ## + ## + ## +@@ -173,23 +149,25 @@ interface(`qemu_exec',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the qemu domain. + ## + ## + ## + # + interface(`qemu_run',` + gen_require(` +- attribute_role qemu_roles; ++ type qemu_t; + ') + + qemu_domtrans($1) +- roleattribute $2 qemu_roles; ++ role $2 types qemu_t; ++ allow qemu_t $1:process signull; ++ allow $1 qemu_t:process signull; + ') + + ######################################## + ## +-## Read qemu process state files. ++## Allow the domain to read state files in /proc. + ## + ## + ## +@@ -202,15 +180,12 @@ interface(`qemu_read_state',` + type qemu_t; + ') + +- kernel_search_proc($1) +- allow $1 qemu_t:dir list_dir_perms; +- allow $1 qemu_t:file read_file_perms; +- allow $1 qemu_t:lnk_file read_lnk_file_perms; ++ read_files_pattern($1, qemu_t, qemu_t) + ') + + ######################################## + ## +-## Set qemu scheduler. ++## Set the schedule on qemu. + ## + ## + ## +@@ -228,7 +203,7 @@ interface(`qemu_setsched',` + + ######################################## + ## +-## Send generic signals to qemu. ++## Send a signal to qemu. + ## + ## + ## +@@ -246,7 +221,7 @@ interface(`qemu_signal',` + + ######################################## + ## +-## Send kill signals to qemu. ++## Send a sigill to qemu + ## + ## + ## +@@ -264,28 +239,68 @@ interface(`qemu_kill',` + + ######################################## + ## +-## Execute a domain transition to +-## run qemu unconfined. ++## Execute qemu_exec_t ++## in the specified domain but do not ++## do it automatically. This is an explicit ++## transition, requiring the caller to use setexeccon(). + ## ++## ++##

      ++## Execute qemu_exec_t ++## in the specified domain. This allows ++## the specified domain to qemu programs ++## on these filesystems in the specified ++## domain. ++##

      ++##
      + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. ++## ++## ++## ++## ++## The type of the new process. + ## + ## + # +-interface(`qemu_domtrans_unconfined',` ++interface(`qemu_spec_domtrans',` + gen_require(` +- type unconfined_qemu_t, qemu_exec_t; ++ type qemu_exec_t; + ') ++ ++ read_lnk_files_pattern($1, qemu_exec_t, qemu_exec_t) ++ domain_transition_pattern($1, qemu_exec_t, $2) ++ domain_entry_file($2,qemu_exec_t) ++ can_exec($1,qemu_exec_t) ++ ++ allow $2 $1:fd use; ++ allow $2 $1:fifo_file rw_fifo_file_perms; ++ allow $2 $1:process sigchld; ++') + +- corecmd_search_bin($1) +- domtrans_pattern($1, qemu_exec_t, unconfined_qemu_t) ++######################################## ++## ++## Execute qemu unconfined programs in the role. ++## ++## ++## ++## The role to allow the qemu unconfined domain. ++## ++## ++# ++interface(`qemu_unconfined_role',` ++ gen_require(` ++ type unconfined_qemu_t; ++ type qemu_t; ++ ') ++ role $1 types unconfined_qemu_t; ++ role $1 types qemu_t; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## qemu temporary directories. ++## Manage qemu temporary dirs. + ## + ## + ## +@@ -298,14 +313,12 @@ interface(`qemu_manage_tmp_dirs',` + type qemu_tmp_t; + ') + +- files_search_tmp($1) + manage_dirs_pattern($1, qemu_tmp_t, qemu_tmp_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## qemu temporary files. ++## Manage qemu temporary files. + ## + ## + ## +@@ -318,59 +331,42 @@ interface(`qemu_manage_tmp_files',` + type qemu_tmp_t; + ') + +- files_search_tmp($1) + manage_files_pattern($1, qemu_tmp_t, qemu_tmp_t) + ') + + ######################################## + ## +-## Execute qemu in a specified domain. ++## Make qemu_exec_t an entrypoint for ++## the specified domain. + ## +-## +-##

      +-## Execute qemu in a specified domain. +-##

      +-##

      +-## No interprocess communication (signals, pipes, +-## etc.) is provided by this interface since +-## the domains are not owned by this module. +-##

      +-##
      +-## +-## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Domain to transition to. +-## ++## ++## ++## The domain for which qemu_exec_t is an entrypoint. ++## + ## + # +-interface(`qemu_spec_domtrans',` ++interface(`qemu_entry_type',` + gen_require(` + type qemu_exec_t; + ') + +- corecmd_search_bin($1) +- domain_auto_trans($1, qemu_exec_t, $2) ++ domain_entry_file($1, qemu_exec_t) + ') + +-###################################### ++####################################### + ## +-## Make qemu executable files an +-## entrypoint for the specified domain. ++## Getattr on qemu executable. + ## + ## +-## +-## The domain for which qemu_exec_t is an entrypoint. +-## ++## ++## Domain allowed to transition. ++## + ## + # +-interface(`qemu_entry_type',` +- gen_require(` +- type qemu_exec_t; +- ') ++interface(`qemu_getattr_exec',` ++ gen_require(` ++ type qemu_exec_t; ++ ') + +- domain_entry_file($1, qemu_exec_t) ++ allow $1 qemu_exec_t:file getattr; + ') +diff --git a/qemu.te b/qemu.te +index 4f90743435..958c0ef1e1 100644 +--- a/qemu.te ++++ b/qemu.te +@@ -6,28 +6,58 @@ policy_module(qemu, 1.8.0) + # + + ## +-##

      +-## Determine whether qemu has full +-## access to the network. +-##

      ++##

      ++## Allow qemu to connect fully to the network ++##

      + ##
      + gen_tunable(qemu_full_network, false) + +-attribute_role qemu_roles; +-roleattribute system_r qemu_roles; ++## ++##

      ++## Allow qemu to use cifs/Samba file systems ++##

      ++##
      ++gen_tunable(qemu_use_cifs, true) ++ ++## ++##

      ++## Allow qemu to use serial/parallel communication ports ++##

      ++##
      ++gen_tunable(qemu_use_comm, false) + +-type qemu_exec_t; +-application_executable_file(qemu_exec_t) ++## ++##

      ++## Allow qemu to use nfs file systems ++##

      ++##
      ++gen_tunable(qemu_use_nfs, true) ++ ++## ++##

      ++## Allow qemu to use usb devices ++##

      ++##
      ++gen_tunable(qemu_use_usb, true) + + virt_domain_template(qemu) +-role qemu_roles types qemu_t; ++role system_r types qemu_t; + + ######################################## + # +-# Local policy ++# qemu local policy + # + ++storage_raw_write_removable_device(qemu_t) ++storage_raw_read_removable_device(qemu_t) ++ ++userdom_search_user_home_content(qemu_t) ++userdom_read_user_tmp_files(qemu_t) ++userdom_stream_connect(qemu_t) ++ + tunable_policy(`qemu_full_network',` ++ allow qemu_t self:udp_socket create_socket_perms; ++ + corenet_udp_sendrecv_generic_if(qemu_t) + corenet_udp_sendrecv_generic_node(qemu_t) + corenet_udp_sendrecv_all_ports(qemu_t) +@@ -37,21 +67,57 @@ tunable_policy(`qemu_full_network',` + corenet_tcp_connect_all_ports(qemu_t) + ') + ++tunable_policy(`qemu_use_cifs',` ++ fs_manage_cifs_dirs(qemu_t) ++ fs_manage_cifs_files(qemu_t) ++') ++ ++tunable_policy(`qemu_use_comm',` ++ term_use_unallocated_ttys(qemu_t) ++ dev_rw_printer(qemu_t) ++') ++ ++tunable_policy(`qemu_use_nfs',` ++ fs_manage_nfs_dirs(qemu_t) ++ fs_manage_nfs_files(qemu_t) ++') ++ ++tunable_policy(`qemu_use_usb',` ++ dev_rw_usbfs(qemu_t) ++ fs_manage_dos_dirs(qemu_t) ++ fs_manage_dos_files(qemu_t) ++') ++ + optional_policy(` +- xserver_user_x_domain_template(qemu, qemu_t, qemu_tmpfs_t) ++ dbus_read_lib_files(qemu_t) + ') + +-######################################## +-# +-# Unconfined local policy +-# ++optional_policy(` ++ pulseaudio_manage_home_files(qemu_t) ++ pulseaudio_stream_connect(qemu_t) ++') ++ ++optional_policy(` ++ tunable_policy(`qemu_use_cifs',` ++ samba_domtrans_smbd(qemu_t) ++ ') ++') + + optional_policy(` +- type unconfined_qemu_t; +- typealias unconfined_qemu_t alias qemu_unconfined_t; +- application_type(unconfined_qemu_t) +- unconfined_domain(unconfined_qemu_t) ++ virt_domtrans_bridgehelper(qemu_t) ++') ++ ++optional_policy(` ++ virt_manage_home_files(qemu_t) ++ virt_manage_images(qemu_t) ++ virt_append_log(qemu_t) ++') + +- allow unconfined_qemu_t self:process { execstack execmem }; +- allow unconfined_qemu_t qemu_exec_t:file execmod; ++optional_policy(` ++ xen_rw_image_files(qemu_t) ++') ++ ++optional_policy(` ++ xserver_read_xdm_pid(qemu_t) ++ xserver_stream_connect(qemu_t) + ') +diff --git a/qmail.fc b/qmail.fc +index e53fe5a975..edee505d72 100644 +--- a/qmail.fc ++++ b/qmail.fc +@@ -1,22 +1,6 @@ +-/etc/qmail(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) +- +-/usr/bin/tcp-env -- gen_context(system_u:object_r:qmail_tcp_env_exec_t,s0) +- +-/usr/sbin/qmail-clean -- gen_context(system_u:object_r:qmail_clean_exec_t,s0) +-/usr/sbin/qmail-getpw -- gen_context(system_u:object_r:qmail_exec_t,s0) +-/usr/sbin/qmail-inject -- gen_context(system_u:object_r:qmail_inject_exec_t,s0) +-/usr/sbin/qmail-local -- gen_context(system_u:object_r:qmail_local_exec_t,s0) +-/usr/sbin/qmail-lspawn -- gen_context(system_u:object_r:qmail_lspawn_exec_t,s0) +-/usr/sbin/qmail-queue -- gen_context(system_u:object_r:qmail_queue_exec_t,s0) +-/usr/sbin/qmail-remote -- gen_context(system_u:object_r:qmail_remote_exec_t,s0) +-/usr/sbin/qmail-rspawn -- gen_context(system_u:object_r:qmail_rspawn_exec_t,s0) +-/usr/sbin/qmail-send -- gen_context(system_u:object_r:qmail_send_exec_t,s0) +-/usr/sbin/qmail-smtpd -- gen_context(system_u:object_r:qmail_smtpd_exec_t,s0) +-/usr/sbin/qmail-start -- gen_context(system_u:object_r:qmail_start_exec_t,s0) +-/usr/sbin/splogger -- gen_context(system_u:object_r:qmail_splogger_exec_t,s0) +- +-/var/qmail/alias -d gen_context(system_u:object_r:qmail_alias_home_t,s0) +-/var/qmail/alias(/.*)? gen_context(system_u:object_r:qmail_alias_home_t,s0) ++ ++/var/qmail/alias -d gen_context(system_u:object_r:qmail_alias_home_t,s0) ++/var/qmail/alias(/.*)? gen_context(system_u:object_r:qmail_alias_home_t,s0) + + /var/qmail/bin/qmail-clean -- gen_context(system_u:object_r:qmail_clean_exec_t,s0) + /var/qmail/bin/qmail-getpw -- gen_context(system_u:object_r:qmail_exec_t,s0) +@@ -29,9 +13,36 @@ + /var/qmail/bin/qmail-send -- gen_context(system_u:object_r:qmail_send_exec_t,s0) + /var/qmail/bin/qmail-smtpd -- gen_context(system_u:object_r:qmail_smtpd_exec_t,s0) + /var/qmail/bin/qmail-start -- gen_context(system_u:object_r:qmail_start_exec_t,s0) +-/var/qmail/bin/splogger -- gen_context(system_u:object_r:qmail_splogger_exec_t,s0) +-/var/qmail/bin/tcp-env -- gen_context(system_u:object_r:qmail_tcp_env_exec_t,s0) ++/var/qmail/bin/splogger -- gen_context(system_u:object_r:qmail_splogger_exec_t,s0) ++/var/qmail/bin/tcp-env -- gen_context(system_u:object_r:qmail_tcp_env_exec_t,s0) ++ ++/var/qmail/control(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) ++/var/qmail/owners(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) ++ ++/var/qmail/queue(/.*)? gen_context(system_u:object_r:qmail_spool_t,s0) ++ ++ifdef(`distro_debian', ` ++/etc/qmail(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) ++ ++/usr/bin/tcp-env -- gen_context(system_u:object_r:qmail_tcp_env_exec_t,s0) ++ ++#/usr/bin/serialmail/.* -- gen_context(system_u:object_r:qmail_serialmail_exec_t,s0) ++ ++/usr/sbin/qmail-clean -- gen_context(system_u:object_r:qmail_clean_exec_t,s0) ++/usr/sbin/qmail-getpw -- gen_context(system_u:object_r:qmail_exec_t,s0) ++/usr/sbin/qmail-inject -- gen_context(system_u:object_r:qmail_inject_exec_t,s0) ++/usr/sbin/qmail-local -- gen_context(system_u:object_r:qmail_local_exec_t,s0) ++/usr/sbin/qmail-lspawn -- gen_context(system_u:object_r:qmail_lspawn_exec_t,s0) ++/usr/sbin/qmail-queue -- gen_context(system_u:object_r:qmail_queue_exec_t,s0) ++/usr/sbin/qmail-remote -- gen_context(system_u:object_r:qmail_remote_exec_t,s0) ++/usr/sbin/qmail-rspawn -- gen_context(system_u:object_r:qmail_rspawn_exec_t,s0) ++/usr/sbin/qmail-send -- gen_context(system_u:object_r:qmail_send_exec_t,s0) ++/usr/sbin/qmail-smtpd -- gen_context(system_u:object_r:qmail_smtpd_exec_t,s0) ++/usr/sbin/qmail-start -- gen_context(system_u:object_r:qmail_start_exec_t,s0) ++/usr/sbin/splogger -- gen_context(system_u:object_r:qmail_splogger_exec_t,s0) ++ ++/var/qmail(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) + +-/var/qmail(/.*)? gen_context(system_u:object_r:qmail_etc_t,s0) ++/var/spool/qmail(/.*)? gen_context(system_u:object_r:qmail_spool_t,s0) ++') + +-/var/spool/qmail(/.*)? gen_context(system_u:object_r:qmail_spool_t,s0) +diff --git a/qmail.if b/qmail.if +index e4f0000e5e..05e219e13d 100644 +--- a/qmail.if ++++ b/qmail.if +@@ -1,12 +1,12 @@ +-## Qmail Mail Server. ++## Qmail Mail Server + + ######################################## + ## +-## Template for qmail parent/sub-domain pairs. ++## Template for qmail parent/sub-domain pairs + ## + ## + ## +-## The prefix of the child domain. ++## The prefix of the child domain + ## + ## + ## +@@ -16,35 +16,39 @@ + ## + # + template(`qmail_child_domain_template',` +- gen_require(` +- attribute qmail_child_domain; +- ') +- +- ######################################## +- # +- # Declarations +- # +- +- type $1_t, qmail_child_domain; +- type $1_exec_t; ++ type $1_t; + domain_type($1_t) ++ type $1_exec_t; + domain_entry_file($1_t, $1_exec_t) +- ++ domain_auto_trans($2, $1_exec_t, $1_t) + role system_r types $1_t; + +- ######################################## +- # +- # Policy +- # ++ allow $1_t self:process signal_perms; ++ ++ allow $1_t $2:fd use; ++ allow $1_t $2:fifo_file rw_file_perms; ++ allow $1_t $2:process sigchld; ++ ++ allow $1_t qmail_etc_t:dir list_dir_perms; ++ allow $1_t qmail_etc_t:file read_file_perms; ++ allow $1_t qmail_etc_t:lnk_file read_lnk_file_perms; ++ ++ allow $1_t qmail_start_t:fd use; ++ ++ kernel_list_proc($2) ++ kernel_read_proc_symlinks($2) + +- domtrans_pattern($2, $1_exec_t, $1_t) ++ corecmd_search_bin($1_t) ++ ++ files_search_var($1_t) ++ ++ fs_getattr_xattr_fs($1_t) + +- kernel_read_system_state($2) + ') + + ######################################## + ## +-## Transition to qmail_inject_t. ++## Transition to qmail_inject_t + ## + ## + ## +@@ -57,11 +61,11 @@ interface(`qmail_domtrans_inject',` + type qmail_inject_t, qmail_inject_exec_t; + ') + ++ corecmd_search_bin($1) + domtrans_pattern($1, qmail_inject_exec_t, qmail_inject_t) + + ifdef(`distro_debian',` + files_search_usr($1) +- corecmd_search_bin($1) + ',` + files_search_var($1) + ') +@@ -69,7 +73,7 @@ interface(`qmail_domtrans_inject',` + + ######################################## + ## +-## Transition to qmail_queue_t. ++## Transition to qmail_queue_t + ## + ## + ## +@@ -82,11 +86,11 @@ interface(`qmail_domtrans_queue',` + type qmail_queue_t, qmail_queue_exec_t; + ') + ++ corecmd_search_bin($1) + domtrans_pattern($1, qmail_queue_exec_t, qmail_queue_t) + + ifdef(`distro_debian',` + files_search_usr($1) +- corecmd_search_bin($1) + ',` + files_search_var($1) + ') +@@ -108,20 +112,21 @@ interface(`qmail_read_config',` + type qmail_etc_t; + ') + +- files_search_var($1) + allow $1 qmail_etc_t:dir list_dir_perms; + allow $1 qmail_etc_t:file read_file_perms; + allow $1 qmail_etc_t:lnk_file read_lnk_file_perms; ++ files_search_var($1) + + ifdef(`distro_debian',` ++ # handle /etc/qmail + files_search_etc($1) + ') + ') + + ######################################## + ## +-## Define the specified domain as a +-## qmail-smtp service. ++## Define the specified domain as a qmail-smtp service. ++## Needed by antivirus/antispam filters. + ## + ## + ## +@@ -141,3 +146,59 @@ interface(`qmail_smtpd_service_domain',` + + domtrans_pattern(qmail_smtpd_t, $2, $1) + ') ++ ++######################################## ++## ++## Create, read, write, and delete qmail ++## spool directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`qmail_manage_spool_dirs',` ++ gen_require(` ++ type qmail_spool_t; ++ ') ++ ++ manage_dirs_pattern($1, qmail_spool_t, qmail_spool_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete qmail ++## spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`qmail_manage_spool_files',` ++ gen_require(` ++ type qmail_spool_t; ++ ') ++ ++ manage_files_pattern($1, qmail_spool_t, qmail_spool_t) ++') ++ ++######################################## ++## ++## Read and write to qmail spool pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`qmail_rw_spool_pipes',` ++ gen_require(` ++ type qmail_spool_t; ++ ') ++ ++ allow $1 qmail_spool_t:fifo_file rw_fifo_file_perms; ++') +diff --git a/qmail.te b/qmail.te +index 87429441ca..53a2fe597d 100644 +--- a/qmail.te ++++ b/qmail.te +@@ -5,7 +5,7 @@ policy_module(qmail, 1.6.1) + # Declarations + # + +-attribute qmail_child_domain; ++attribute qmail_user_domains; + + type qmail_alias_home_t; + files_type(qmail_alias_home_t) +@@ -18,7 +18,7 @@ files_config_file(qmail_etc_t) + type qmail_exec_t; + files_type(qmail_exec_t) + +-type qmail_inject_t; ++type qmail_inject_t, qmail_user_domains; + type qmail_inject_exec_t; + domain_type(qmail_inject_t) + domain_entry_file(qmail_inject_t, qmail_inject_exec_t) +@@ -32,21 +32,25 @@ qmail_child_domain_template(qmail_lspawn, qmail_start_t) + mta_mailserver_delivery(qmail_lspawn_t) + + qmail_child_domain_template(qmail_queue, qmail_inject_t) ++typeattribute qmail_queue_t qmail_user_domains; + mta_mailserver_user_agent(qmail_queue_t) + + qmail_child_domain_template(qmail_remote, qmail_rspawn_t) + mta_mailserver_sender(qmail_remote_t) + + qmail_child_domain_template(qmail_rspawn, qmail_start_t) ++ + qmail_child_domain_template(qmail_send, qmail_start_t) ++ + qmail_child_domain_template(qmail_smtpd, qmail_tcp_env_t) ++ + qmail_child_domain_template(qmail_splogger, qmail_start_t) + + type qmail_keytab_t; + files_type(qmail_keytab_t) + + type qmail_spool_t; +-files_type(qmail_spool_t) ++files_spool_file(qmail_spool_t) + + type qmail_start_t; + type qmail_start_exec_t; +@@ -58,28 +62,8 @@ application_domain(qmail_tcp_env_t, qmail_tcp_env_exec_t) + + ######################################## + # +-# Common qmail child domain local policy +-# +- +-allow qmail_child_domain self:process signal_perms; +- +-allow qmail_child_domain qmail_etc_t:dir list_dir_perms; +-allow qmail_child_domain qmail_etc_t:file read_file_perms; +-allow qmail_child_domain qmail_etc_t:lnk_file read_lnk_file_perms; +- +-allow qmail_child_domain qmail_start_t:fd use; +- +-corecmd_search_bin(qmail_child_domain) +- +-files_search_var(qmail_child_domain) +- +-fs_getattr_xattr_fs(qmail_child_domain) +- +-miscfiles_read_localization(qmail_child_domain) +- +-######################################## +-# +-# Clean local policy ++# qmail-clean local policy ++# this component cleans up the queue directory + # + + read_files_pattern(qmail_clean_t, qmail_spool_t, qmail_spool_t) +@@ -87,11 +71,12 @@ delete_files_pattern(qmail_clean_t, qmail_spool_t, qmail_spool_t) + + ######################################## + # +-# Inject local policy ++# qmail-inject local policy ++# this component preprocesses mail from stdin and invokes qmail-queue + # + +-allow qmail_inject_t self:fifo_file write_fifo_file_perms; + allow qmail_inject_t self:process signal_perms; ++allow qmail_inject_t self:fifo_file write_fifo_file_perms; + + allow qmail_inject_t qmail_queue_exec_t:file read_file_perms; + +@@ -99,18 +84,18 @@ corecmd_search_bin(qmail_inject_t) + + files_search_var(qmail_inject_t) + +-miscfiles_read_localization(qmail_inject_t) + + qmail_read_config(qmail_inject_t) + + ######################################## + # +-# Local local policy ++# qmail-local local policy ++# this component delivers a mail message + # + +-allow qmail_local_t self:fifo_file write_fifo_file_perms; + allow qmail_local_t self:process signal_perms; +-allow qmail_local_t self:unix_stream_socket { accept listen }; ++allow qmail_local_t self:fifo_file write_file_perms; ++allow qmail_local_t self:unix_stream_socket create_stream_socket_perms; + + manage_dirs_pattern(qmail_local_t, qmail_alias_home_t, qmail_alias_home_t) + manage_files_pattern(qmail_local_t, qmail_alias_home_t, qmail_alias_home_t) +@@ -136,13 +121,18 @@ mta_append_spool(qmail_local_t) + + qmail_domtrans_queue(qmail_local_t) + ++optional_policy(` ++ uucp_domtrans(qmail_local_t) ++') ++ + optional_policy(` + spamassassin_domtrans_client(qmail_local_t) + ') + + ######################################## + # +-# Lspawn local policy ++# qmail-lspawn local policy ++# this component schedules local deliveries + # + + allow qmail_lspawn_t self:capability { setuid setgid }; +@@ -156,21 +146,23 @@ allow qmail_lspawn_t qmail_local_exec_t:file read_file_perms; + + read_files_pattern(qmail_lspawn_t, qmail_spool_t, qmail_spool_t) + +-files_read_etc_files(qmail_lspawn_t) ++corecmd_search_bin(qmail_lspawn_t) ++ + files_search_pids(qmail_lspawn_t) + files_search_tmp(qmail_lspawn_t) + + ######################################## + # +-# Queue local policy ++# qmail-queue local policy ++# this component places a mail in a delivery queue, later to be processed by qmail-send + # + + allow qmail_queue_t qmail_lspawn_t:fd use; + allow qmail_queue_t qmail_lspawn_t:fifo_file write_fifo_file_perms; + ++allow qmail_queue_t qmail_smtpd_t:process sigchld; + allow qmail_queue_t qmail_smtpd_t:fd use; + allow qmail_queue_t qmail_smtpd_t:fifo_file read_fifo_file_perms; +-allow qmail_queue_t qmail_smtpd_t:process sigchld; + + manage_dirs_pattern(qmail_queue_t, qmail_spool_t, qmail_spool_t) + manage_files_pattern(qmail_queue_t, qmail_spool_t, qmail_spool_t) +@@ -186,28 +178,34 @@ optional_policy(` + + ######################################## + # +-# Remote local policy ++# qmail-remote local policy ++# this component sends mail via SMTP + # + ++allow qmail_remote_t self:tcp_socket create_socket_perms; ++allow qmail_remote_t self:udp_socket create_socket_perms; ++ + rw_files_pattern(qmail_remote_t, qmail_spool_t, qmail_spool_t) + +-corenet_all_recvfrom_unlabeled(qmail_remote_t) + corenet_all_recvfrom_netlabel(qmail_remote_t) + corenet_tcp_sendrecv_generic_if(qmail_remote_t) ++corenet_udp_sendrecv_generic_if(qmail_remote_t) + corenet_tcp_sendrecv_generic_node(qmail_remote_t) +- +-corenet_sendrecv_smtp_client_packets(qmail_remote_t) +-corenet_tcp_connect_smtp_port(qmail_remote_t) ++corenet_udp_sendrecv_generic_node(qmail_remote_t) + corenet_tcp_sendrecv_smtp_port(qmail_remote_t) ++corenet_udp_sendrecv_dns_port(qmail_remote_t) ++corenet_tcp_connect_smtp_port(qmail_remote_t) ++corenet_sendrecv_smtp_client_packets(qmail_remote_t) + + dev_read_rand(qmail_remote_t) + dev_read_urand(qmail_remote_t) + +-sysnet_dns_name_resolve(qmail_remote_t) ++sysnet_read_config(qmail_remote_t) + + ######################################## + # +-# Rspawn local policy ++# qmail-rspawn local policy ++# this component scedules remote deliveries + # + + allow qmail_rspawn_t self:process signal_perms; +@@ -217,9 +215,12 @@ allow qmail_rspawn_t qmail_remote_exec_t:file read_file_perms; + + rw_files_pattern(qmail_rspawn_t, qmail_spool_t, qmail_spool_t) + ++corecmd_search_bin(qmail_rspawn_t) ++ + ######################################## + # +-# Send local policy ++# qmail-send local policy ++# this component delivers mail messages from the queue + # + + allow qmail_send_t self:process signal_perms; +@@ -237,7 +238,8 @@ optional_policy(` + + ######################################## + # +-# Smtpd local policy ++# qmail-smtpd local policy ++# this component receives mails via SMTP + # + + allow qmail_smtpd_t self:process signal_perms; +@@ -268,26 +270,26 @@ optional_policy(` + + ######################################## + # +-# Splogger local policy ++# splogger local policy ++# this component creates entries in syslog + # + + allow qmail_splogger_t self:unix_dgram_socket create_socket_perms; + +-files_read_etc_files(qmail_splogger_t) + + init_dontaudit_use_script_fds(qmail_splogger_t) + +-miscfiles_read_localization(qmail_splogger_t) + + ######################################## + # +-# Start local policy ++# qmail-start local policy ++# this component starts up the mail delivery component + # + + allow qmail_start_t self:capability { setgid setuid }; + dontaudit qmail_start_t self:capability sys_tty_config; +-allow qmail_start_t self:fifo_file rw_fifo_file_perms; + allow qmail_start_t self:process signal_perms; ++allow qmail_start_t self:fifo_file rw_fifo_file_perms; + + can_exec(qmail_start_t, qmail_start_exec_t) + +@@ -304,7 +306,8 @@ optional_policy(` + + ######################################## + # +-# Tcp-env local policy ++# tcp-env local policy ++# this component sets up TCP-related environment variables + # + + allow qmail_tcp_env_t qmail_smtpd_exec_t:file read_file_perms; +diff --git a/qpid.if b/qpid.if +index fe2adf8ae7..f7e9c70b02 100644 +--- a/qpid.if ++++ b/qpid.if +@@ -1,4 +1,4 @@ +-## Apache QPID AMQP messaging server. ++## policy for qpidd + + ######################################## + ## +@@ -15,13 +15,12 @@ interface(`qpidd_domtrans',` + type qpidd_t, qpidd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, qpidd_exec_t, qpidd_t) + ') + +-##################################### ++######################################## + ## +-## Read and write access qpidd semaphores. ++## Execute qpidd server in the qpidd domain. + ## + ## + ## +@@ -29,17 +28,17 @@ interface(`qpidd_domtrans',` + ## + ## + # +-interface(`qpidd_rw_semaphores',` ++interface(`qpidd_initrc_domtrans',` + gen_require(` +- type qpidd_t; ++ type qpidd_initrc_exec_t; + ') + +- allow $1 qpidd_t:sem rw_sem_perms; ++ init_labeled_script_domtrans($1, qpidd_initrc_exec_t) + ') + + ######################################## + ## +-## Read and write qpidd shared memory. ++## Read qpidd PID files. + ## + ## + ## +@@ -47,36 +46,39 @@ interface(`qpidd_rw_semaphores',` + ## + ## + # +-interface(`qpidd_rw_shm',` ++interface(`qpidd_read_pid_files',` + gen_require(` +- type qpidd_t; ++ type qpidd_var_run_t; + ') + +- allow $1 qpidd_t:shm rw_shm_perms; ++ files_search_pids($1) ++ allow $1 qpidd_var_run_t:file read_file_perms; + ') + + ######################################## + ## +-## Execute qpidd init script in +-## the initrc domain. ++## Manage qpidd var_run files. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`qpidd_initrc_domtrans',` ++interface(`qpidd_manage_var_run',` + gen_require(` +- type qpidd_initrc_exec_t; ++ type qpidd_var_run_t; + ') + +- init_labeled_script_domtrans($1, qpidd_initrc_exec_t) ++ files_search_pids($1) ++ manage_dirs_pattern($1, qpidd_var_run_t, qpidd_var_run_t) ++ manage_files_pattern($1, qpidd_var_run_t, qpidd_var_run_t) ++ manage_lnk_files_pattern($1, qpidd_var_run_t, qpidd_var_run_t) + ') + + ######################################## + ## +-## Read qpidd pid files. ++## Search qpidd lib directories. + ## + ## + ## +@@ -84,18 +86,18 @@ interface(`qpidd_initrc_domtrans',` + ## + ## + # +-interface(`qpidd_read_pid_files',` ++interface(`qpidd_search_lib',` + gen_require(` +- type qpidd_var_run_t; ++ type qpidd_var_lib_t; + ') + +- files_search_pids($1) +- allow $1 qpidd_var_run_t:file read_file_perms; ++ allow $1 qpidd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## + ## +-## Search qpidd lib directories. ++## Read qpidd lib files. + ## + ## + ## +@@ -103,18 +105,19 @@ interface(`qpidd_read_pid_files',` + ## + ## + # +-interface(`qpidd_search_lib',` ++interface(`qpidd_read_lib_files',` + gen_require(` + type qpidd_var_lib_t; + ') + + files_search_var_lib($1) +- allow $1 qpidd_var_lib_t:dir search_dir_perms; ++ read_files_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) + ') + + ######################################## + ## +-## Read qpidd lib files. ++## Create, read, write, and delete ++## qpidd lib files. + ## + ## + ## +@@ -122,19 +125,18 @@ interface(`qpidd_search_lib',` + ## + ## + # +-interface(`qpidd_read_lib_files',` ++interface(`qpidd_manage_lib_files',` + gen_require(` + type qpidd_var_lib_t; + ') + + files_search_var_lib($1) +- read_files_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) ++ manage_files_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## qpidd lib files. ++## Manage qpidd var_lib files. + ## + ## + ## +@@ -142,49 +144,94 @@ interface(`qpidd_read_lib_files',` + ## + ## + # +-interface(`qpidd_manage_lib_files',` ++interface(`qpidd_manage_var_lib',` + gen_require(` + type qpidd_var_lib_t; + ') + + files_search_var_lib($1) ++ manage_dirs_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) + manage_files_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) ++ manage_lnk_files_pattern($1, qpidd_var_lib_t, qpidd_var_lib_t) + ') + +-######################################## ++##################################### + ## +-## All of the rules required to +-## administrate an qpidd environment. ++## Allow read and write access to qpidd semaphores. + ## + ## + ## + ## Domain allowed access. + ## + ## ++# ++interface(`qpidd_rw_semaphores',` ++ gen_require(` ++ type qpidd_t; ++ ') ++ ++ allow $1 qpidd_t:sem rw_sem_perms; ++') ++ ++####################################### ++## ++## Read and write to qpidd shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`qpidd_rw_shm',` ++ gen_require(` ++ type qpidd_t; ++ type qpidd_tmpfs_t; ++ ') ++ ++ allow $1 qpidd_t:shm rw_shm_perms; ++ fs_search_tmpfs($1) ++ manage_files_pattern($1, qpidd_tmpfs_t, qpidd_tmpfs_t) ++') ++ ++####################################### ++## ++## All of the rules required to ++## administrate an qpidd environment. ++## ++## ++## ++## Domain allowed access. ++## ++## + ## +-## +-## Role allowed access. +-## ++## ++## Role allowed access. ++## + ## + ## + # + interface(`qpidd_admin',` +- gen_require(` +- type qpidd_t, qpidd_initrc_exec_t, qpidd_var_lib_t; +- type qpidd_var_run_t; +- ') ++ gen_require(` ++ type qpidd_t, qpidd_initrc_exec_t, qpidd_var_lib_t; ++ type qpidd_var_run_t; ++ ') + +- allow $1 qpidd_t:process { ptrace signal_perms }; +- ps_process_pattern($1, qpidd_t) ++ allow $1 qpidd_t:process { signal_perms }; ++ ps_process_pattern($1, qpidd_t) + +- qpidd_initrc_domtrans($1) +- domain_system_change_exemption($1) +- role_transition $2 qpidd_initrc_exec_t system_r; +- allow $2 system_r; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 qpidd_t:process ptrace; ++ ') + +- files_search_var_lib($1) +- admin_pattern($1, qpidd_var_lib_t) ++ qpidd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 qpidd_initrc_exec_t system_r; ++ allow $2 system_r; + +- files_search_pids($1) +- admin_pattern($1, qpidd_var_run_t) ++ files_search_var_lib($1) ++ admin_pattern($1, qpidd_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, qpidd_var_run_t) + ') +diff --git a/qpid.te b/qpid.te +index 83eb09ef63..a5e7068f6a 100644 +--- a/qpid.te ++++ b/qpid.te +@@ -12,6 +12,9 @@ init_daemon_domain(qpidd_t, qpidd_exec_t) + type qpidd_initrc_exec_t; + init_script_file(qpidd_initrc_exec_t) + ++type qpidd_tmp_t; ++files_tmp_file(qpidd_tmp_t) ++ + type qpidd_tmpfs_t; + files_tmpfs_file(qpidd_tmpfs_t) + +@@ -33,41 +36,58 @@ allow qpidd_t self:shm create_shm_perms; + allow qpidd_t self:tcp_socket { accept listen }; + allow qpidd_t self:unix_stream_socket { accept listen }; + ++manage_dirs_pattern(qpidd_t, qpidd_tmp_t, qpidd_tmp_t) ++manage_files_pattern(qpidd_t, qpidd_tmp_t, qpidd_tmp_t) ++files_tmp_filetrans(qpidd_t, qpidd_tmp_t, { dir file }) ++ + manage_dirs_pattern(qpidd_t, qpidd_tmpfs_t, qpidd_tmpfs_t) + manage_files_pattern(qpidd_t, qpidd_tmpfs_t, qpidd_tmpfs_t) + fs_tmpfs_filetrans(qpidd_t, qpidd_tmpfs_t, { dir file }) + +-manage_dirs_pattern(qpidd_t, qpidd_var_lib_t, qpidd_var_lib_t) +-manage_files_pattern(qpidd_t, qpidd_var_lib_t, qpidd_var_lib_t) +-files_var_lib_filetrans(qpidd_t, qpidd_var_lib_t, { file dir }) ++manage_dirs_pattern(qpidd_t, qpidd_var_lib_t, qpidd_var_lib_t) ++manage_files_pattern(qpidd_t, qpidd_var_lib_t, qpidd_var_lib_t) ++manage_lnk_files_pattern(qpidd_t, qpidd_var_lib_t, qpidd_var_lib_t) ++files_var_lib_filetrans(qpidd_t, qpidd_var_lib_t, { file dir lnk_file }) ++allow qpidd_t qpidd_var_lib_t:file map; + +-manage_dirs_pattern(qpidd_t, qpidd_var_run_t, qpidd_var_run_t) +-manage_files_pattern(qpidd_t, qpidd_var_run_t, qpidd_var_run_t) ++manage_dirs_pattern(qpidd_t, qpidd_var_run_t, qpidd_var_run_t) ++manage_files_pattern(qpidd_t, qpidd_var_run_t, qpidd_var_run_t) + files_pid_filetrans(qpidd_t, qpidd_var_run_t, { file dir }) + + kernel_read_system_state(qpidd_t) ++kernel_read_network_state(qpidd_t) ++ ++auth_read_passwd(qpidd_t) + +-corenet_all_recvfrom_unlabeled(qpidd_t) + corenet_all_recvfrom_netlabel(qpidd_t) ++corenet_tcp_bind_generic_node(qpidd_t) + corenet_tcp_sendrecv_generic_if(qpidd_t) + corenet_tcp_sendrecv_generic_node(qpidd_t) +-corenet_tcp_bind_generic_node(qpidd_t) + + corenet_sendrecv_amqp_server_packets(qpidd_t) + corenet_tcp_bind_amqp_port(qpidd_t) + corenet_tcp_sendrecv_amqp_port(qpidd_t) ++corenet_tcp_connect_amqp_port(qpidd_t) ++ ++corenet_tcp_bind_matahari_port(qpidd_t) ++corenet_tcp_connect_matahari_port(qpidd_t) + + dev_read_sysfs(qpidd_t) + dev_read_urand(qpidd_t) ++dev_read_rand(qpidd_t) + +-files_read_etc_files(qpidd_t) ++# needed by ssl ++files_list_tmp(qpidd_t) + + logging_send_syslog_msg(qpidd_t) + +-miscfiles_read_localization(qpidd_t) +- + sysnet_dns_name_resolve(qpidd_t) + + optional_policy(` +- corosync_stream_connect(qpidd_t) ++ kerberos_use(qpidd_t) + ') ++ ++optional_policy(` ++ rhcs_stream_connect_cluster(qpidd_t) ++') ++ +diff --git a/quantum.fc b/quantum.fc +index 70ab68b02f..b985b65703 100644 +--- a/quantum.fc ++++ b/quantum.fc +@@ -1,10 +1,34 @@ +-/etc/rc\.d/init\.d/quantum.* -- gen_context(system_u:object_r:quantum_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/neutron.* -- gen_context(system_u:object_r:neutron_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/quantum.* -- gen_context(system_u:object_r:neutron_initrc_exec_t,s0) + +-/usr/bin/quantum-server -- gen_context(system_u:object_r:quantum_exec_t,s0) +-/usr/bin/quantum-openvswitch-agent -- gen_context(system_u:object_r:quantum_exec_t,s0) +-/usr/bin/quantum-linuxbridge-agent -- gen_context(system_u:object_r:quantum_exec_t,s0) +-/usr/bin/quantum-ryu-agent -- gen_context(system_u:object_r:quantum_exec_t,s0) ++/usr/bin/neutron-dhcp-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-l3-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-lbaas-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-metadata-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-netns-cleanup -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-ns-metadata-proxy -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-rootwrap -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-linuxbridge-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-openvswitch-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-ovs-cleanup -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-ryu-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/neutron-server -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-dhcp-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-l3-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-linuxbridge-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-openvswitch-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-ovs-cleanup -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-ryu-agent -- gen_context(system_u:object_r:neutron_exec_t,s0) ++/usr/bin/quantum-server -- gen_context(system_u:object_r:neutron_exec_t,s0) + +-/var/lib/quantum(/.*)? gen_context(system_u:object_r:quantum_var_lib_t,s0) ++/usr/lib/systemd/system/neutron.* -- gen_context(system_u:object_r:neutron_unit_file_t,s0) ++/usr/lib/systemd/system/quantum.* -- gen_context(system_u:object_r:neutron_unit_file_t,s0) + +-/var/log/quantum(/.*)? gen_context(system_u:object_r:quantum_log_t,s0) ++/var/lib/neutron(/.*)? gen_context(system_u:object_r:neutron_var_lib_t,s0) ++/var/lib/quantum(/.*)? gen_context(system_u:object_r:neutron_var_lib_t,s0) ++ ++/var/log/neutron(/.*)? gen_context(system_u:object_r:neutron_log_t,s0) ++/var/log/quantum(/.*)? gen_context(system_u:object_r:neutron_log_t,s0) ++ ++/var/run/neutron(/.*)? gen_context(system_u:object_r:neutron_var_run_t,s0) ++/var/run/quantum(/.*)? gen_context(system_u:object_r:neutron_var_run_t,s0) +diff --git a/quantum.if b/quantum.if +index afc00688df..e974fad4b5 100644 +--- a/quantum.if ++++ b/quantum.if +@@ -2,41 +2,314 @@ + + ######################################## + ## +-## All of the rules required to +-## administrate an quantum environment. ++## Transition to neutron. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`neutron_domtrans',` ++ gen_require(` ++ type neutron_t, neutron_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, neutron_exec_t, neutron_t) ++') ++ ++######################################## ++## ++## Allow read/write neutron pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_rw_inherited_pipes',` ++ gen_require(` ++ type neutron_t; ++ ') ++ ++ allow $1 neutron_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Send sigchld to neutron. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++# ++interface(`neutron_sigchld',` ++ gen_require(` ++ type neutron_t; ++ ') ++ ++ allow $1 neutron_t:process sigchld; ++') ++ ++######################################## ++## ++## Read neutron's log files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## + # +-interface(`quantum_admin',` ++interface(`neutron_read_log',` ++ gen_require(` ++ type neutron_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, neutron_log_t, neutron_log_t) ++') ++ ++######################################## ++## ++## Append to neutron log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_append_log',` ++ gen_require(` ++ type neutron_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, neutron_log_t, neutron_log_t) ++') ++ ++######################################## ++## ++## Manage neutron log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_manage_log',` ++ gen_require(` ++ type neutron_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, neutron_log_t, neutron_log_t) ++ manage_files_pattern($1, neutron_log_t, neutron_log_t) ++ manage_lnk_files_pattern($1, neutron_log_t, neutron_log_t) ++') ++ ++######################################## ++## ++## Search neutron lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_search_lib',` ++ gen_require(` ++ type neutron_var_lib_t; ++ ') ++ ++ allow $1 neutron_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read neutron lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_read_lib_files',` + gen_require(` +- type quantum_t, quantum_initrc_exec_t, quantum_log_t; +- type quantum_var_lib_t, quantum_tmp_t; ++ type neutron_var_lib_t; + ') + +- allow $1 quantum_t:process { ptrace signal_perms }; +- ps_process_pattern($1, quantum_t) ++ files_search_var_lib($1) ++ read_files_pattern($1, neutron_var_lib_t, neutron_var_lib_t) ++') ++ ++######################################## ++## ++## Manage neutron lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_manage_lib_files',` ++ gen_require(` ++ type neutron_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, neutron_var_lib_t, neutron_var_lib_t) ++ manage_sock_files_pattern($1, neutron_var_lib_t, neutron_var_lib_t) ++') ++ ++######################################## ++## ++## Manage neutron lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_manage_lib_dirs',` ++ gen_require(` ++ type neutron_var_lib_t; ++ ') + +- init_labeled_script_domtrans($1, quantum_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 quantum_initrc_exec_t system_r; +- allow $2 system_r; ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, neutron_var_lib_t, neutron_var_lib_t) ++') ++ ++######################################## ++## ++## Read and write neutron fifo files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_rw_fifo_file',` ++ gen_require(` ++ type neutron_t; ++ ') ++ ++ allow $1 neutron_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++##################################### ++## ++## Connect to neutron over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_stream_connect',` ++ gen_require(` ++ type neutron_t; ++ type neutron_var_lib_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, neutron_var_lib_t, neutron_var_lib_t, neutron_t ) ++') ++ ++######################################## ++## ++## Execute neutron server in the neutron domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`neutron_systemctl',` ++ gen_require(` ++ type neutron_t; ++ type neutron_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 neutron_unit_file_t:file read_file_perms; ++ allow $1 neutron_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, neutron_t) ++') ++ ++####################################### ++## ++## Read neutron process state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_read_state',` ++ gen_require(` ++ type neutron_t; ++ ') ++ ++ allow $1 neutron_t:dir search_dir_perms; ++ allow $1 neutron_t:file read_file_perms; ++ allow $1 neutron_t:lnk_file read_lnk_file_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an neutron environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`neutron_admin',` ++ gen_require(` ++ type neutron_t; ++ type neutron_log_t; ++ type neutron_var_lib_t; ++ type neutron_unit_file_t; ++ ') ++ ++ allow $1 neutron_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, neutron_t) + + logging_search_logs($1) +- admin_pattern($1, quantum_log_t) ++ admin_pattern($1, neutron_log_t) + + files_search_var_lib($1) +- admin_pattern($1, quantum_var_lib_t) ++ admin_pattern($1, neutron_var_lib_t) + +- files_search_tmp($1) +- admin_pattern($1, quantum_tmp_t) ++ neutron_systemctl($1) ++ admin_pattern($1, neutron_unit_file_t) ++ allow $1 neutron_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/quantum.te b/quantum.te +index 8644d8b3fb..6c415e8b98 100644 +--- a/quantum.te ++++ b/quantum.te +@@ -5,92 +5,185 @@ policy_module(quantum, 1.1.0) + # Declarations + # + +-type quantum_t; +-type quantum_exec_t; +-init_daemon_domain(quantum_t, quantum_exec_t) ++## ++##

      ++## Determine whether neutron can ++## connect to all TCP ports ++##

      ++##
      ++gen_tunable(neutron_can_network, false) + +-type quantum_initrc_exec_t; +-init_script_file(quantum_initrc_exec_t) ++type neutron_t alias quantum_t; ++type neutron_exec_t alias quantum_exec_t; ++init_daemon_domain(neutron_t, neutron_exec_t) + +-type quantum_log_t; +-logging_log_file(quantum_log_t) ++type neutron_initrc_exec_t alias quantum_initrc_exec_t; ++init_script_file(neutron_initrc_exec_t) + +-type quantum_tmp_t; +-files_tmp_file(quantum_tmp_t) ++type neutron_log_t alias quantum_log_t; ++logging_log_file(neutron_log_t) + +-type quantum_var_lib_t; +-files_type(quantum_var_lib_t) ++type neutron_tmp_t alias quantum_tmp_t; ++files_tmp_file(neutron_tmp_t) ++ ++type neutron_var_lib_t alias quantum_var_lib_t; ++files_type(neutron_var_lib_t) ++ ++type neutron_var_run_t alias quantum_var_run_t; ++files_pid_file(neutron_var_run_t) ++ ++type neutron_unit_file_t alias quantum_unit_file_t; ++systemd_unit_file(neutron_unit_file_t) + + ######################################## + # + # Local policy + # + +-allow quantum_t self:capability { setgid setuid sys_resource }; +-allow quantum_t self:process { setsched setrlimit }; +-allow quantum_t self:fifo_file rw_fifo_file_perms; +-allow quantum_t self:key manage_key_perms; +-allow quantum_t self:tcp_socket { accept listen }; +-allow quantum_t self:unix_stream_socket { accept listen }; +- +-manage_dirs_pattern(quantum_t, quantum_log_t, quantum_log_t) +-append_files_pattern(quantum_t, quantum_log_t, quantum_log_t) +-create_files_pattern(quantum_t, quantum_log_t, quantum_log_t) +-setattr_files_pattern(quantum_t, quantum_log_t, quantum_log_t) +-logging_log_filetrans(quantum_t, quantum_log_t, dir) +- +-manage_files_pattern(quantum_t, quantum_tmp_t, quantum_tmp_t) +-files_tmp_filetrans(quantum_t, quantum_tmp_t, file) +- +-manage_dirs_pattern(quantum_t, quantum_var_lib_t, quantum_var_lib_t) +-manage_files_pattern(quantum_t, quantum_var_lib_t, quantum_var_lib_t) +-files_var_lib_filetrans(quantum_t, quantum_var_lib_t, dir) +- +-can_exec(quantum_t, quantum_tmp_t) +- +-kernel_read_kernel_sysctls(quantum_t) +-kernel_read_system_state(quantum_t) +- +-corecmd_exec_shell(quantum_t) +-corecmd_exec_bin(quantum_t) +- +-corenet_all_recvfrom_unlabeled(quantum_t) +-corenet_all_recvfrom_netlabel(quantum_t) +-corenet_tcp_sendrecv_generic_if(quantum_t) +-corenet_tcp_sendrecv_generic_node(quantum_t) +-corenet_tcp_sendrecv_all_ports(quantum_t) +-corenet_tcp_bind_generic_node(quantum_t) +- +-dev_list_sysfs(quantum_t) +-dev_read_urand(quantum_t) ++allow neutron_t self:capability { chown dac_read_search dac_override sys_ptrace kill setgid setuid sys_resource net_admin sys_admin net_raw net_bind_service}; ++allow neutron_t self:capability2 block_suspend; ++allow neutron_t self:process { setsched setrlimit setcap signal_perms }; ++ ++allow neutron_t self:fifo_file rw_fifo_file_perms; ++allow neutron_t self:key manage_key_perms; ++allow neutron_t self:tcp_socket { accept listen }; ++allow neutron_t self:unix_stream_socket { accept listen connectto }; ++allow neutron_t self:netlink_route_socket rw_netlink_socket_perms; ++allow neutron_t self:rawip_socket create_socket_perms; ++allow neutron_t self:packet_socket create_socket_perms; ++ ++manage_dirs_pattern(neutron_t, neutron_log_t, neutron_log_t) ++append_files_pattern(neutron_t, neutron_log_t, neutron_log_t) ++create_files_pattern(neutron_t, neutron_log_t, neutron_log_t) ++setattr_files_pattern(neutron_t, neutron_log_t, neutron_log_t) ++logging_log_filetrans(neutron_t, neutron_log_t, dir) ++ ++manage_files_pattern(neutron_t, neutron_tmp_t, neutron_tmp_t) ++manage_dirs_pattern(neutron_t, neutron_tmp_t, neutron_tmp_t) ++files_tmp_filetrans(neutron_t, neutron_tmp_t, { file dir }) ++ ++manage_files_pattern(neutron_t, neutron_var_run_t, neutron_var_run_t) ++manage_dirs_pattern(neutron_t, neutron_var_run_t, neutron_var_run_t) ++files_pid_filetrans(neutron_t, neutron_var_run_t, { file dir }) ++ ++manage_dirs_pattern(neutron_t, neutron_var_lib_t, neutron_var_lib_t) ++manage_files_pattern(neutron_t, neutron_var_lib_t, neutron_var_lib_t) ++manage_sock_files_pattern(neutron_t, neutron_var_lib_t, neutron_var_lib_t) ++files_var_lib_filetrans(neutron_t, neutron_var_lib_t, dir) ++ ++can_exec(neutron_t, neutron_tmp_t) ++ ++kernel_rw_kernel_sysctl(neutron_t) ++kernel_rw_net_sysctls(neutron_t) ++kernel_read_system_state(neutron_t) ++kernel_read_network_state(neutron_t) ++kernel_request_load_module(neutron_t) ++ ++corecmd_exec_shell(neutron_t) ++corecmd_exec_bin(neutron_t) ++ ++corenet_all_recvfrom_unlabeled(neutron_t) ++corenet_all_recvfrom_netlabel(neutron_t) ++corenet_tcp_sendrecv_generic_if(neutron_t) ++corenet_tcp_sendrecv_generic_node(neutron_t) ++corenet_tcp_sendrecv_all_ports(neutron_t) ++corenet_tcp_bind_generic_node(neutron_t) ++ ++corenet_tcp_bind_neutron_port(neutron_t) ++corenet_tcp_connect_neutron_port(neutron_t) ++corenet_tcp_connect_keystone_port(neutron_t) ++corenet_tcp_connect_amqp_port(neutron_t) ++corenet_tcp_connect_mysqld_port(neutron_t) ++corenet_tcp_connect_osapi_compute_port(neutron_t) ++ ++domain_read_all_domains_state(neutron_t) ++domain_named_filetrans(neutron_t) ++ ++dev_read_sysfs(neutron_t) ++dev_read_urand(neutron_t) ++dev_mounton_sysfs(neutron_t) ++dev_mount_sysfs_fs(neutron_t) ++dev_unmount_sysfs_fs(neutron_t) ++ ++files_mounton_non_security(neutron_t) ++ ++auth_use_pam(neutron_t) ++ ++init_rw_utmp(neutron_t) ++ ++libs_exec_ldconfig(neutron_t) ++ ++logging_send_audit_msgs(neutron_t) ++logging_send_syslog_msg(neutron_t) ++ ++netutils_exec(neutron_t) ++ ++# need to stay in neutron ++sysnet_exec_ifconfig(neutron_t) ++sysnet_manage_ifconfig_run(neutron_t) ++sysnet_filetrans_named_content_ifconfig(neutron_t) ++ ++tunable_policy(`neutron_can_network',` ++ corenet_sendrecv_all_client_packets(neutron_t) ++ corenet_tcp_connect_all_ports(neutron_t) ++ corenet_tcp_sendrecv_all_ports(neutron_t) ++') + +-files_read_usr_files(quantum_t) ++optional_policy(` ++ dbus_system_bus_client(neutron_t) ++') + +-auth_use_nsswitch(quantum_t) ++optional_policy(` ++ brctl_domtrans(neutron_t) ++') + +-libs_exec_ldconfig(quantum_t) ++optional_policy(` ++ dnsmasq_domtrans(neutron_t) ++ dnsmasq_signal(neutron_t) ++ dnsmasq_kill(neutron_t) ++ dnsmasq_read_state(neutron_t) ++') + +-logging_send_audit_msgs(quantum_t) +-logging_send_syslog_msg(quantum_t) ++optional_policy(` ++ rhcs_domtrans_haproxy(neutron_t) ++ rhcs_stream_connect_haproxy(neutron_t) ++') + +-miscfiles_read_localization(quantum_t) ++optional_policy(` ++ iptables_domtrans(neutron_t) ++') + +-sysnet_domtrans_ifconfig(quantum_t) ++optional_policy(` ++ modutils_domtrans_insmod(neutron_t) ++') + + optional_policy(` +- brctl_domtrans(quantum_t) ++ mysql_stream_connect(neutron_t) ++ mysql_read_db_lnk_files(neutron_t) ++ mysql_read_config(neutron_t) ++ mysql_tcp_connect(neutron_t) + ') + + optional_policy(` +- mysql_stream_connect(quantum_t) +- mysql_read_config(quantum_t) ++ postgresql_stream_connect(neutron_t) ++ postgresql_unpriv_client(neutron_t) ++ postgresql_tcp_connect(neutron_t) ++') + +- mysql_tcp_connect(quantum_t) ++optional_policy(` ++ openvswitch_domtrans(neutron_t) ++ openvswitch_stream_connect(neutron_t) + ') + + optional_policy(` +- postgresql_stream_connect(quantum_t) +- postgresql_unpriv_client(quantum_t) ++ rpm_exec(neutron_t) ++ rpm_read_db(neutron_t) ++') + +- postgresql_tcp_connect(quantum_t) ++optional_policy(` ++ sudo_exec(neutron_t) + ') ++ ++optional_policy(` ++ udev_domtrans(neutron_t) ++') +diff --git a/quota.fc b/quota.fc +index cadabe3605..54ba01d0d4 100644 +--- a/quota.fc ++++ b/quota.fc +@@ -1,6 +1,5 @@ + HOME_ROOT/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) +- +-HOME_DIR/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++HOME_DIR/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + + /a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + +@@ -8,24 +7,24 @@ HOME_DIR/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + + /etc/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + +-/etc/rc\.d/init\.d/quota_nld -- gen_context(system_u:object_r:quota_nld_initrc_exec_t,s0) +- +-/sbin/convertquota -- gen_context(system_u:object_r:quota_exec_t,s0) +-/sbin/quota(check|on) -- gen_context(system_u:object_r:quota_exec_t,s0) ++/sbin/quota(check|on) -- gen_context(system_u:object_r:quota_exec_t,s0) + +-/usr/sbin/convertquota -- gen_context(system_u:object_r:quota_exec_t,s0) + /usr/sbin/quota(check|on) -- gen_context(system_u:object_r:quota_exec_t,s0) +-/usr/sbin/quota_nld -- gen_context(system_u:object_r:quota_nld_exec_t,s0) + + /var/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++/var/lib/quota(/.*)? gen_context(system_u:object_r:quota_flag_t,s0) ++/var/spool/cron/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++/var/spool/(.*/)?a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + +-/var/lib/quota(/.*)? gen_context(system_u:object_r:quota_flag_t,s0) ++ifdef(`distro_redhat',` ++/usr/sbin/convertquota -- gen_context(system_u:object_r:quota_exec_t,s0) ++',` ++/sbin/convertquota -- gen_context(system_u:object_r:quota_exec_t,s0) ++') + +-/var/run/quota_nld\.pid -- gen_context(system_u:object_r:quota_nld_var_run_t,s0) ++/usr/sbin/quota_nld -- gen_context(system_u:object_r:quota_nld_exec_t,s0) + +-/var/spool/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++/var/lib/stickshift/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++/var/lib/openshift/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) + +-/var/spool/imap/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) +-/var/spool/(client)?mqueue/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) +-/var/spool/mqueue\.in/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) +-/var/spool/mail/a?quota\.(user|group) -- gen_context(system_u:object_r:quota_db_t,s0) ++/var/run/quota_nld\.pid -- gen_context(system_u:object_r:quota_nld_var_run_t,s0) +diff --git a/quota.if b/quota.if +index da6421861b..3fb8575ca8 100644 +--- a/quota.if ++++ b/quota.if +@@ -1,4 +1,4 @@ +-## File system quota management. ++## File system quota management + + ######################################## + ## +@@ -21,9 +21,8 @@ interface(`quota_domtrans',` + + ######################################## + ## +-## Execute quota management tools in +-## the quota domain, and allow the +-## specified role the quota domain. ++## Execute quota management tools in the quota domain, and ++## allow the specified role the quota domain. + ## + ## + ## +@@ -39,90 +38,54 @@ interface(`quota_domtrans',` + # + interface(`quota_run',` + gen_require(` +- attribute_role quota_roles; ++ type quota_t; + ') + + quota_domtrans($1) +- roleattribute $2 quota_roles; ++ role $2 types quota_t; + ') + + ####################################### + ## +-## Execute quota nld in the quota nld domain. ++## Alow to read of filesystem quota data files. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain to not audit. ++## + ## + # +-interface(`quota_domtrans_nld',` +- gen_require(` +- type quota_nld_t, quota_nld_exec_t; +- ') ++interface(`quota_read_db',` ++ gen_require(` ++ type quota_db_t; ++ ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, quota_nld_exec_t, quota_nld_t) ++ allow $1 quota_db_t:file read_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## quota db files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`quota_manage_db_files',` +- gen_require(` +- type quota_db_t; +- ') +- +- allow $1 quota_db_t:file manage_file_perms; +-') +- +-######################################## +-## +-## Create specified objects in specified +-## directories with a type transition to +-## the quota db file type. ++## Do not audit attempts to get the attributes ++## of filesystem quota data files. + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Directory to transition on. +-## +-## +-## +-## +-## The object class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain to not audit. + ## + ## + # +-interface(`quota_spec_filetrans_db',` ++interface(`quota_dontaudit_getattr_db',` + gen_require(` + type quota_db_t; + ') + +- filetrans_pattern($1, $2, quota_db_t, $3, $4) ++ dontaudit $1 quota_db_t:file getattr_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to get attributes +-## of filesystem quota data files. ++## Create, read, write, and delete quota ++## db files. + ## + ## + ## +@@ -130,18 +93,18 @@ interface(`quota_spec_filetrans_db',` + ## + ## + # +-interface(`quota_dontaudit_getattr_db',` ++interface(`quota_manage_db',` + gen_require(` + type quota_db_t; + ') + +- dontaudit $1 quota_db_t:file getattr_file_perms; ++ allow $1 quota_db_t:file manage_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## quota flag files. ++## Create, read, write, and delete quota ++## flag files. + ## + ## + ## +@@ -160,37 +123,56 @@ interface(`quota_manage_flags',` + + ######################################## + ## +-## All of the rules required to +-## administrate an quota environment. ++## Transition to quota named content + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`quota_admin',` ++interface(`quota_filetrans_named_content',` + gen_require(` +- type quota_nld_t, quota_t, quota_db_t; +- type quota_nld_initrc_exec_t, quota_flag_t, quota_nld_var_run_t; ++ type quota_db_t; + ') + +- allow $1 { quota_nld_t quota_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { quota_nld_t quota_t }) +- +- init_labeled_script_domtrans($1, quota_nld_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 quota_nld_initrc_exec_t system_r; +- allow $2 system_r; ++ files_root_filetrans($1, quota_db_t, file, "aquota.user") ++ files_root_filetrans($1, quota_db_t, file, "aquota.group") ++ files_boot_filetrans($1, quota_db_t, file, "aquota.user") ++ files_boot_filetrans($1, quota_db_t, file, "aquota.group") ++ files_etc_filetrans($1, quota_db_t, file, "aquota.user") ++ files_etc_filetrans($1, quota_db_t, file, "aquota.group") ++ files_tmp_filetrans($1, quota_db_t, file, "aquota.user") ++ files_tmp_filetrans($1, quota_db_t, file, "aquota.group") ++ files_home_filetrans($1, quota_db_t, file, "aquota.user") ++ files_home_filetrans($1, quota_db_t, file, "aquota.group") ++ files_usr_filetrans($1, quota_db_t, file, "aquota.user") ++ files_usr_filetrans($1, quota_db_t, file, "aquota.group") ++ files_var_filetrans($1, quota_db_t, file, "aquota.user") ++ files_var_filetrans($1, quota_db_t, file, "aquota.group") ++ files_spool_filetrans($1, quota_db_t, file, "aquota.user") ++ files_spool_filetrans($1, quota_db_t, file, "aquota.group") ++ mta_spool_filetrans($1, quota_db_t, file, "aquota.user") ++ mta_spool_filetrans($1, quota_db_t, file, "aquota.group") ++ mta_spool_filetrans_queue($1, quota_db_t, file, "aquota.user") ++ mta_spool_filetrans_queue($1, quota_db_t, file, "aquota.group") ++') + +- files_list_all($1) +- admin_pattern($1, { quota_db_t quota_flag quota_nld_var_run_t }) ++####################################### ++## ++## Transition to quota_nld. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`quota_domtrans_nld',` ++ gen_require(` ++ type quota_nld_t, quota_nld_exec_t; ++ ') + +- quota_run($1, $2) ++ corecmd_search_bin($1) ++ domtrans_pattern($1, quota_nld_exec_t, quota_nld_t) + ') +diff --git a/quota.te b/quota.te +index f47c8e81fc..0f0b0b43f4 100644 +--- a/quota.te ++++ b/quota.te +@@ -5,12 +5,10 @@ policy_module(quota, 1.6.0) + # Declarations + # + +-attribute_role quota_roles; +- + type quota_t; + type quota_exec_t; +-init_system_domain(quota_t, quota_exec_t) +-role quota_roles types quota_t; ++application_domain(quota_t, quota_exec_t) ++#init_system_domain(quota_t, quota_exec_t) + + type quota_db_t; + files_type(quota_db_t) +@@ -22,9 +20,6 @@ type quota_nld_t; + type quota_nld_exec_t; + init_daemon_domain(quota_nld_t, quota_nld_exec_t) + +-type quota_nld_initrc_exec_t; +-init_script_file(quota_nld_initrc_exec_t) +- + type quota_nld_var_run_t; + files_pid_file(quota_nld_var_run_t) + +@@ -33,10 +28,11 @@ files_pid_file(quota_nld_var_run_t) + # Local policy + # + +-allow quota_t self:capability { sys_admin dac_override }; ++allow quota_t self:capability { sys_admin dac_read_search dac_override }; + dontaudit quota_t self:capability sys_tty_config; + allow quota_t self:process signal_perms; + ++# for /quota.* + allow quota_t quota_db_t:file { manage_file_perms quotaon }; + files_root_filetrans(quota_t, quota_db_t, file) + files_boot_filetrans(quota_t, quota_db_t, file) +@@ -48,24 +44,15 @@ files_var_filetrans(quota_t, quota_db_t, file) + files_spool_filetrans(quota_t, quota_db_t, file) + userdom_user_home_dir_filetrans(quota_t, quota_db_t, file) + +-kernel_request_load_module(quota_t) + kernel_list_proc(quota_t) + kernel_read_proc_symlinks(quota_t) + kernel_read_kernel_sysctls(quota_t) +-kernel_setsched(quota_t) ++kernel_dontaudit_setsched(quota_t) + + dev_read_sysfs(quota_t) + dev_getattr_all_blk_files(quota_t) + dev_getattr_all_chr_files(quota_t) + +-files_list_all(quota_t) +-files_read_all_files(quota_t) +-files_read_all_symlinks(quota_t) +-files_getattr_all_pipes(quota_t) +-files_getattr_all_sockets(quota_t) +-files_getattr_all_file_type_fs(quota_t) +-files_read_etc_runtime_files(quota_t) +- + fs_get_xattr_fs_quotas(quota_t) + fs_set_xattr_fs_quotas(quota_t) + fs_getattr_xattr_fs(quota_t) +@@ -80,17 +67,28 @@ term_dontaudit_use_console(quota_t) + + domain_use_interactive_fds(quota_t) + ++files_list_all(quota_t) ++files_read_all_files(quota_t) ++files_read_all_symlinks(quota_t) ++files_getattr_all_pipes(quota_t) ++files_getattr_all_sockets(quota_t) ++files_getattr_all_file_type_fs(quota_t) ++# Read /etc/mtab. ++files_read_etc_runtime_files(quota_t) ++ + init_use_fds(quota_t) + init_use_script_ptys(quota_t) + + logging_send_syslog_msg(quota_t) + +-userdom_use_user_terminals(quota_t) ++mta_spool_filetrans(quota_t, quota_db_t, file) ++mta_spool_filetrans_queue(quota_t, quota_db_t, file) ++ ++userdom_use_inherited_user_terminals(quota_t) + userdom_dontaudit_use_unpriv_user_fds(quota_t) + + optional_policy(` +- mta_queue_filetrans(quota_t, quota_db_t, file) +- mta_spool_filetrans(quota_t, quota_db_t, file) ++ openshift_lib_filetrans(quota_t, quota_db_t, file) + ') + + optional_policy(` +@@ -103,12 +101,13 @@ optional_policy(` + + ####################################### + # +-# Nld local policy ++# Local policy + # + + allow quota_nld_t self:fifo_file rw_fifo_file_perms; + allow quota_nld_t self:netlink_socket create_socket_perms; +-allow quota_nld_t self:unix_stream_socket { accept listen }; ++allow quota_nld_t self:netlink_generic_socket create_socket_perms; ++allow quota_nld_t self:unix_stream_socket create_stream_socket_perms; + + manage_files_pattern(quota_nld_t, quota_nld_var_run_t, quota_nld_var_run_t) + files_pid_filetrans(quota_nld_t, quota_nld_var_run_t, { file }) +@@ -121,11 +120,9 @@ init_read_utmp(quota_nld_t) + + logging_send_syslog_msg(quota_nld_t) + +-miscfiles_read_localization(quota_nld_t) +- + userdom_use_user_terminals(quota_nld_t) + + optional_policy(` +- dbus_system_bus_client(quota_nld_t) +- dbus_connect_system_bus(quota_nld_t) ++ dbus_system_bus_client(quota_nld_t) ++ dbus_connect_system_bus(quota_nld_t) + ') +diff --git a/rabbitmq.fc b/rabbitmq.fc +index c5ad6de765..af2d46f13d 100644 +--- a/rabbitmq.fc ++++ b/rabbitmq.fc +@@ -1,10 +1,18 @@ + /etc/rc\.d/init\.d/rabbitmq-server -- gen_context(system_u:object_r:rabbitmq_initrc_exec_t,s0) + +-/usr/lib/erlang/erts.*/bin/beam.* -- gen_context(system_u:object_r:rabbitmq_beam_exec_t,s0) +-/usr/lib/erlang/erts.*/bin/epmd -- gen_context(system_u:object_r:rabbitmq_epmd_exec_t,s0) ++/usr/lib/systemd/system/rabbitmq-server.* -- gen_context(system_u:object_r:rabbitmq_unit_file_t,s0) ++/usr/lib/systemd/system/ejabberd.* -- gen_context(system_u:object_r:rabbitmq_unit_file_t,s0) ++ ++/usr/lib/rabbitmq/lib/rabbitmq_server-.*/sbin/rabbitmq-server -- gen_context(system_u:object_r:rabbitmq_exec_t,s0) ++ ++/usr/bin/ejabberdctl -- gen_context(system_u:object_r:rabbitmq_exec_t,s0) + + /var/lib/rabbitmq(/.*)? gen_context(system_u:object_r:rabbitmq_var_lib_t,s0) ++/var/lib/ejabberd(/.*)? gen_context(system_u:object_r:rabbitmq_var_lib_t,s0) ++ ++/var/lock/ejabberdctl(/.*)? gen_context(system_u:object_r:rabbitmq_var_lock_t,s0) + + /var/log/rabbitmq(/.*)? gen_context(system_u:object_r:rabbitmq_var_log_t,s0) ++/var/log/ejabberd(/.*)? gen_context(system_u:object_r:rabbitmq_var_log_t,s0) + + /var/run/rabbitmq(/.*)? gen_context(system_u:object_r:rabbitmq_var_run_t,s0) +diff --git a/rabbitmq.if b/rabbitmq.if +index 2c3d338961..7d49554ebe 100644 +--- a/rabbitmq.if ++++ b/rabbitmq.if +@@ -38,12 +38,12 @@ interface(`rabbitmq_domtrans',` + # + interface(`rabbitmq_admin',` + gen_require(` +- type rabbitmq_epmd_t, rabbitmq_beam_t, rabbitmq_initrc_exec_t; ++ type rabbitmq_t, rabbitmq_initrc_exec_t; + type rabbitmq_var_lib_t, rabbitmq_var_log_t, rabbitmq_var_run_t; + ') + +- allow $1 { rabbitmq_epmd_t rabbitmq_beam_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { rabbitmq_epmd_t rabbitmq_beam_t }) ++ allow $1 { rabbitmq_t }:process { ptrace signal_perms }; ++ ps_process_pattern($1, rabbitmq_t) + + init_labeled_script_domtrans($1, rabbitmq_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/rabbitmq.te b/rabbitmq.te +index dc3b0ed876..f14522964a 100644 +--- a/rabbitmq.te ++++ b/rabbitmq.te +@@ -5,13 +5,14 @@ policy_module(rabbitmq, 1.0.2) + # Declarations + # + +-type rabbitmq_epmd_t; +-type rabbitmq_epmd_exec_t; +-init_daemon_domain(rabbitmq_epmd_t, rabbitmq_epmd_exec_t) ++type rabbitmq_t; ++type rabbitmq_exec_t; ++init_daemon_domain(rabbitmq_t, rabbitmq_exec_t) + +-type rabbitmq_beam_t; +-type rabbitmq_beam_exec_t; +-init_daemon_domain(rabbitmq_beam_t, rabbitmq_beam_exec_t) ++typealias rabbitmq_t alias {rabbitmq_beam_t rabbitmq_epmd_t}; ++ ++type rabbitmq_unit_file_t; ++systemd_unit_file(rabbitmq_unit_file_t) + + type rabbitmq_initrc_exec_t; + init_script_file(rabbitmq_initrc_exec_t) +@@ -19,106 +20,111 @@ init_script_file(rabbitmq_initrc_exec_t) + type rabbitmq_var_lib_t; + files_type(rabbitmq_var_lib_t) + ++type rabbitmq_var_lock_t; ++files_lock_file(rabbitmq_var_lock_t) ++ + type rabbitmq_var_log_t; + logging_log_file(rabbitmq_var_log_t) + + type rabbitmq_var_run_t; + files_pid_file(rabbitmq_var_run_t) + +-###################################### +-# +-# Beam local policy +-# +- +-allow rabbitmq_beam_t self:process { setsched signal signull }; +-allow rabbitmq_beam_t self:fifo_file rw_fifo_file_perms; +-allow rabbitmq_beam_t self:tcp_socket { accept listen }; +- +-manage_dirs_pattern(rabbitmq_beam_t, rabbitmq_var_lib_t, rabbitmq_var_lib_t) +-manage_files_pattern(rabbitmq_beam_t, rabbitmq_var_lib_t, rabbitmq_var_lib_t) +- +-manage_dirs_pattern(rabbitmq_beam_t, rabbitmq_var_log_t, rabbitmq_var_log_t) +-append_files_pattern(rabbitmq_beam_t, rabbitmq_var_log_t, rabbitmq_var_log_t) +-create_files_pattern(rabbitmq_beam_t, rabbitmq_var_log_t, rabbitmq_var_log_t) +-setattr_files_pattern(rabbitmq_beam_t, rabbitmq_var_log_t, rabbitmq_var_log_t) +- +-manage_dirs_pattern(rabbitmq_beam_t, rabbitmq_var_run_t, rabbitmq_var_run_t) +-manage_files_pattern(rabbitmq_beam_t, rabbitmq_var_run_t, rabbitmq_var_run_t) +- +-can_exec(rabbitmq_beam_t, rabbitmq_beam_exec_t) +- +-domtrans_pattern(rabbitmq_beam_t, rabbitmq_epmd_exec_t, rabbitmq_epmd_t) +- +-kernel_read_system_state(rabbitmq_beam_t) +-kernel_read_fs_sysctls(rabbitmq_beam_t) +- +-corecmd_exec_bin(rabbitmq_beam_t) +-corecmd_exec_shell(rabbitmq_beam_t) +- +-corenet_all_recvfrom_unlabeled(rabbitmq_beam_t) +-corenet_all_recvfrom_netlabel(rabbitmq_beam_t) +-corenet_tcp_sendrecv_generic_if(rabbitmq_beam_t) +-corenet_tcp_sendrecv_generic_node(rabbitmq_beam_t) +-corenet_tcp_bind_generic_node(rabbitmq_beam_t) +- +-corenet_sendrecv_amqp_server_packets(rabbitmq_beam_t) +-corenet_tcp_bind_amqp_port(rabbitmq_beam_t) +-corenet_tcp_sendrecv_amqp_port(rabbitmq_beam_t) +- +-corenet_sendrecv_epmd_client_packets(rabbitmq_beam_t) +-corenet_tcp_connect_epmd_port(rabbitmq_beam_t) +-corenet_tcp_sendrecv_epmd_port(rabbitmq_beam_t) ++type rabbitmq_tmp_t; ++files_tmp_file(rabbitmq_tmp_t) + +-corenet_sendrecv_couchdb_server_packets(rabbitmq_beam_t) +-corenet_tcp_bind_couchdb_port(rabbitmq_beam_t) +-corenet_tcp_sendrecv_couchdb_port(rabbitmq_beam_t) +- +-dev_read_sysfs(rabbitmq_beam_t) +-dev_read_urand(rabbitmq_beam_t) +- +-fs_getattr_all_fs(rabbitmq_beam_t) +-fs_search_cgroup_dirs(rabbitmq_beam_t) +- +-files_read_etc_files(rabbitmq_beam_t) +- +-storage_getattr_fixed_disk_dev(rabbitmq_beam_t) +- +-miscfiles_read_localization(rabbitmq_beam_t) +- +-sysnet_dns_name_resolve(rabbitmq_beam_t) +- +- optional_policy(` +- couchdb_manage_lib_files(rabbitmq_beam_t) +- couchdb_read_conf_files(rabbitmq_beam_t) +- couchdb_read_log_files(rabbitmq_beam_t) +- couchdb_read_pid_files(rabbitmq_beam_t) +- ') +- +-######################################## ++###################################### + # +-# Epmd local policy ++# Rabbitmq local policy + # + ++allow rabbitmq_t self:capability setuid; ++ ++allow rabbitmq_t self:process { setsched signal signull }; ++allow rabbitmq_t self:fifo_file rw_fifo_file_perms; ++allow rabbitmq_t self:tcp_socket { accept listen }; ++ ++manage_dirs_pattern(rabbitmq_t, rabbitmq_var_lib_t, rabbitmq_var_lib_t) ++manage_files_pattern(rabbitmq_t, rabbitmq_var_lib_t, rabbitmq_var_lib_t) ++manage_lnk_files_pattern(rabbitmq_t, rabbitmq_var_lib_t, rabbitmq_var_lib_t) ++files_var_lib_filetrans(rabbitmq_t, rabbitmq_var_lib_t, { dir file }) ++ ++manage_dirs_pattern(rabbitmq_t, rabbitmq_var_log_t, rabbitmq_var_log_t) ++manage_files_pattern(rabbitmq_t, rabbitmq_var_log_t, rabbitmq_var_log_t) ++manage_lnk_files_pattern(rabbitmq_t, rabbitmq_var_log_t, rabbitmq_var_log_t) ++logging_log_filetrans(rabbitmq_t, rabbitmq_var_log_t, { dir file }) ++ ++manage_dirs_pattern(rabbitmq_t, rabbitmq_var_lock_t, rabbitmq_var_lock_t) ++manage_files_pattern(rabbitmq_t, rabbitmq_var_lock_t, rabbitmq_var_lock_t) ++files_lock_filetrans(rabbitmq_t, rabbitmq_var_lock_t, file) ++ ++manage_dirs_pattern(rabbitmq_t, rabbitmq_var_run_t, rabbitmq_var_run_t) ++manage_files_pattern(rabbitmq_t, rabbitmq_var_run_t, rabbitmq_var_run_t) ++manage_lnk_files_pattern(rabbitmq_t, rabbitmq_var_run_t, rabbitmq_var_run_t) ++files_pid_filetrans(rabbitmq_t, rabbitmq_var_run_t, { dir file }) ++ ++manage_dirs_pattern(rabbitmq_t, rabbitmq_tmp_t, rabbitmq_tmp_t) ++manage_files_pattern(rabbitmq_t, rabbitmq_tmp_t, rabbitmq_tmp_t) ++files_tmp_filetrans(rabbitmq_t, rabbitmq_tmp_t, { file dir }) ++ ++kernel_read_system_state(rabbitmq_t) ++kernel_read_fs_sysctls(rabbitmq_t) ++ ++corecmd_exec_bin(rabbitmq_t) ++corecmd_exec_shell(rabbitmq_t) ++ ++corenet_tcp_bind_generic_node(rabbitmq_t) ++corenet_udp_bind_generic_node(rabbitmq_t) ++corenet_all_recvfrom_unlabeled(rabbitmq_t) ++corenet_all_recvfrom_netlabel(rabbitmq_t) ++corenet_tcp_sendrecv_generic_if(rabbitmq_t) ++corenet_tcp_sendrecv_generic_node(rabbitmq_t) ++corenet_tcp_bind_generic_node(rabbitmq_t) ++corenet_tcp_connect_all_ephemeral_ports(rabbitmq_t) ++corenet_tcp_bind_all_ephemeral_ports(rabbitmq_t) ++corenet_sendrecv_amqp_server_packets(rabbitmq_t) ++corenet_sendrecv_epmd_client_packets(rabbitmq_t) ++corenet_tcp_sendrecv_amqp_port(rabbitmq_t) ++corenet_tcp_bind_amqp_port(rabbitmq_t) ++corenet_tcp_bind_epmd_port(rabbitmq_t) ++corenet_tcp_bind_jabber_client_port(rabbitmq_t) ++corenet_tcp_bind_jabber_interserver_port(rabbitmq_t) ++corenet_tcp_bind_rabbitmq_port(rabbitmq_t) ++corenet_tcp_connect_amqp_port(rabbitmq_t) ++corenet_tcp_connect_epmd_port(rabbitmq_t) ++corenet_tcp_connect_jabber_interserver_port(rabbitmq_t) ++corenet_tcp_sendrecv_epmd_port(rabbitmq_t) ++corenet_tcp_connect_http_port(rabbitmq_t) ++corenet_tcp_connect_rabbitmq_port(rabbitmq_t) ++ ++domain_read_all_domains_state(rabbitmq_t) ++ ++auth_read_passwd(rabbitmq_t) ++auth_use_pam(rabbitmq_t) ++files_getattr_all_mountpoints(rabbitmq_t) ++ ++fs_getattr_all_fs(rabbitmq_t) ++fs_getattr_all_dirs(rabbitmq_t) ++fs_getattr_cgroup(rabbitmq_t) ++fs_search_cgroup_dirs(rabbitmq_t) ++ ++dev_read_sysfs(rabbitmq_t) ++dev_read_urand(rabbitmq_t) ++ ++storage_getattr_fixed_disk_dev(rabbitmq_t) ++ ++sysnet_dns_name_resolve(rabbitmq_t) ++ ++logging_send_syslog_msg(rabbitmq_t) ++ ++optional_policy(` ++ dbus_system_bus_client(rabbitmq_t) ++') ++ ++optional_policy(` ++ hostname_exec(rabbitmq_t) ++') ++ ++optional_policy(` ++ rpc_read_nfs_state_data(rabbitmq_t) ++') + +-allow rabbitmq_epmd_t self:process signal; +-allow rabbitmq_epmd_t self:fifo_file rw_fifo_file_perms; +-allow rabbitmq_epmd_t self:tcp_socket create_stream_socket_perms; +-allow rabbitmq_epmd_t self:unix_stream_socket { accept listen }; +- +-allow rabbitmq_epmd_t rabbitmq_var_log_t:file append_file_perms; +- +-corenet_all_recvfrom_unlabeled(rabbitmq_epmd_t) +-corenet_all_recvfrom_netlabel(rabbitmq_epmd_t) +-corenet_tcp_sendrecv_generic_if(rabbitmq_epmd_t) +-corenet_tcp_sendrecv_generic_node(rabbitmq_epmd_t) +-corenet_tcp_bind_generic_node(rabbitmq_epmd_t) +- +-corenet_sendrecv_epmd_server_packets(rabbitmq_epmd_t) +-corenet_tcp_bind_epmd_port(rabbitmq_epmd_t) +-corenet_tcp_sendrecv_epmd_port(rabbitmq_epmd_t) +- +-files_read_etc_files(rabbitmq_epmd_t) +- +-logging_send_syslog_msg(rabbitmq_epmd_t) +- +-miscfiles_read_localization(rabbitmq_epmd_t) +diff --git a/radius.fc b/radius.fc +index d447e85488..76ed794ce2 100644 +--- a/radius.fc ++++ b/radius.fc +@@ -9,7 +9,9 @@ + /usr/sbin/radiusd -- gen_context(system_u:object_r:radiusd_exec_t,s0) + /usr/sbin/freeradius -- gen_context(system_u:object_r:radiusd_exec_t,s0) + +-/var/lib/radiousd(/.*)? gen_context(system_u:object_r:radiusd_var_lib_t,s0) ++/usr/lib/systemd/system/radiusd.* -- gen_context(system_u:object_r:radiusd_unit_file_t,s0) ++ ++/var/lib/radiusd(/.*)? gen_context(system_u:object_r:radiusd_var_lib_t,s0) + + /var/log/freeradius(/.*)? gen_context(system_u:object_r:radiusd_log_t,s0) + /var/log/radacct(/.*)? gen_context(system_u:object_r:radiusd_log_t,s0) +diff --git a/radius.if b/radius.if +index 44605825c5..4c66c2502f 100644 +--- a/radius.if ++++ b/radius.if +@@ -14,6 +14,30 @@ interface(`radius_use',` + refpolicywarn(`$0($*) has been deprecated.') + ') + ++####################################### ++## ++## Execute radiusd server in the radiusd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`radiusd_systemctl',` ++ gen_require(` ++ type radiusd_unit_file_t; ++ type radiusd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 radiusd_unit_file_t:file read_file_perms; ++ allow $1 radiusd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, radiusd_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -35,11 +59,14 @@ interface(`radius_admin',` + gen_require(` + type radiusd_t, radiusd_etc_t, radiusd_log_t; + type radiusd_etc_rw_t, radiusd_var_lib_t, radiusd_var_run_t; +- type radiusd_initrc_exec_t; ++ type radiusd_initrc_exec_t, radiusd_unit_file_t; + ') + +- allow $1 radiusd_t:process { ptrace signal_perms }; ++ allow $1 radiusd_t:process signal_perms; + ps_process_pattern($1, radiusd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 radiusd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, radiusd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -57,4 +84,9 @@ interface(`radius_admin',` + + files_list_pids($1) + admin_pattern($1, radiusd_var_run_t) ++ ++ admin_pattern($1, radiusd_unit_file_t) ++ bind_systemctl($1) ++ allow $1 radiusd_unit_file_t:service all_service_perms; ++ + ') +diff --git a/radius.te b/radius.te +index 403a4fed12..9de0a3d776 100644 +--- a/radius.te ++++ b/radius.te +@@ -5,6 +5,13 @@ policy_module(radius, 1.13.0) + # Declarations + # + ++## ++##

      ++## Determine whether radius can use JIT compiler. ++##

      ++##
      ++gen_tunable(radius_use_jit, false) ++ + type radiusd_t; + type radiusd_exec_t; + init_daemon_domain(radiusd_t, radiusd_exec_t) +@@ -27,14 +34,17 @@ files_type(radiusd_var_lib_t) + type radiusd_var_run_t; + files_pid_file(radiusd_var_run_t) + ++type radiusd_unit_file_t; ++systemd_unit_file(radiusd_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow radiusd_t self:capability { chown dac_override fsetid kill setgid setuid sys_resource sys_tty_config }; ++allow radiusd_t self:capability { chown dac_read_search dac_override fsetid kill setgid setuid sys_resource sys_tty_config sys_ptrace }; + dontaudit radiusd_t self:capability sys_tty_config; +-allow radiusd_t self:process { getsched setrlimit setsched sigkill signal }; ++allow radiusd_t self:process { getsched setrlimit setsched sigkill signal}; + allow radiusd_t self:fifo_file rw_fifo_file_perms; + allow radiusd_t self:unix_stream_socket { accept listen }; + allow radiusd_t self:tcp_socket { accept listen }; +@@ -43,15 +53,18 @@ allow radiusd_t radiusd_etc_t:dir list_dir_perms; + allow radiusd_t radiusd_etc_t:file read_file_perms; + allow radiusd_t radiusd_etc_t:lnk_file read_lnk_file_perms; + ++tunable_policy(`deny_ptrace',`',` ++ allow radiusd_t self:process ptrace; ++') ++ + manage_dirs_pattern(radiusd_t, radiusd_etc_rw_t, radiusd_etc_rw_t) + manage_files_pattern(radiusd_t, radiusd_etc_rw_t, radiusd_etc_rw_t) + manage_lnk_files_pattern(radiusd_t, radiusd_etc_rw_t, radiusd_etc_rw_t) + filetrans_pattern(radiusd_t, radiusd_etc_t, radiusd_etc_rw_t, { dir file lnk_file }) ++allow radiusd_t radiusd_etc_rw_t:file map; + + manage_dirs_pattern(radiusd_t, radiusd_log_t, radiusd_log_t) +-append_files_pattern(radiusd_t, radiusd_log_t, radiusd_log_t) +-create_files_pattern(radiusd_t, radiusd_log_t, radiusd_log_t) +-setattr_files_pattern(radiusd_t, radiusd_log_t, radiusd_log_t) ++manage_files_pattern(radiusd_t, radiusd_log_t, radiusd_log_t) + logging_log_filetrans(radiusd_t, radiusd_log_t, { file dir }) + + manage_files_pattern(radiusd_t, radiusd_var_lib_t, radiusd_var_lib_t) +@@ -60,11 +73,13 @@ manage_sock_files_pattern(radiusd_t, radiusd_var_run_t, radiusd_var_run_t) + manage_dirs_pattern(radiusd_t, radiusd_var_run_t, radiusd_var_run_t) + manage_files_pattern(radiusd_t, radiusd_var_run_t, radiusd_var_run_t) + files_pid_filetrans(radiusd_t, radiusd_var_run_t, { file sock_file dir }) ++files_dontaudit_list_tmp(radiusd_t) + + kernel_read_kernel_sysctls(radiusd_t) + kernel_read_system_state(radiusd_t) ++kernel_read_net_sysctls(radiusd_t) ++kernel_search_network_sysctl(radiusd_t) + +-corenet_all_recvfrom_unlabeled(radiusd_t) + corenet_all_recvfrom_netlabel(radiusd_t) + corenet_tcp_sendrecv_generic_if(radiusd_t) + corenet_udp_sendrecv_generic_if(radiusd_t) +@@ -74,12 +89,22 @@ corenet_tcp_sendrecv_all_ports(radiusd_t) + corenet_udp_sendrecv_all_ports(radiusd_t) + corenet_udp_bind_generic_node(radiusd_t) + ++corenet_tcp_connect_postgresql_port(radiusd_t) ++corenet_tcp_connect_http_port(radiusd_t) ++ + corenet_sendrecv_radacct_server_packets(radiusd_t) ++corenet_tcp_bind_radacct_port(radiusd_t) + corenet_udp_bind_radacct_port(radiusd_t) + + corenet_sendrecv_radius_server_packets(radiusd_t) ++corenet_tcp_bind_radius_port(radiusd_t) + corenet_udp_bind_radius_port(radiusd_t) + ++corenet_sendrecv_radsec_server_packets(radiusd_t) ++corenet_tcp_bind_radsec_port(radiusd_t) ++corenet_udp_bind_radsec_port(radiusd_t) ++corenet_tcp_connect_radsec_port(radiusd_t) ++ + corenet_sendrecv_snmp_client_packets(radiusd_t) + corenet_tcp_connect_snmp_port(radiusd_t) + +@@ -97,7 +122,6 @@ domain_use_interactive_fds(radiusd_t) + fs_getattr_all_fs(radiusd_t) + fs_search_auto_mountpoints(radiusd_t) + +-files_read_usr_files(radiusd_t) + files_read_etc_runtime_files(radiusd_t) + files_dontaudit_list_tmp(radiusd_t) + +@@ -109,7 +133,6 @@ libs_exec_lib_files(radiusd_t) + + logging_send_syslog_msg(radiusd_t) + +-miscfiles_read_localization(radiusd_t) + miscfiles_read_generic_certs(radiusd_t) + + sysnet_use_ldap(radiusd_t) +@@ -117,10 +140,21 @@ sysnet_use_ldap(radiusd_t) + userdom_dontaudit_use_unpriv_user_fds(radiusd_t) + userdom_dontaudit_search_user_home_dirs(radiusd_t) + ++tunable_policy(`radius_use_jit',` ++ allow radiusd_t self:process execmem; ++',` ++ dontaudit radiusd_t self:process execmem; ++') ++ + optional_policy(` + cron_system_entry(radiusd_t, radiusd_exec_t) + ') + ++optional_policy(` ++ kerberos_tmp_filetrans_host_rcache(radiusd_t, "host_0") ++ kerberos_manage_host_rcache(radiusd_t) ++') ++ + optional_policy(` + logrotate_exec(radiusd_t) + ') +@@ -131,6 +165,11 @@ optional_policy(` + mysql_tcp_connect(radiusd_t) + ') + ++optional_policy(` ++ postgresql_stream_connect(radiusd_t) ++ postgresql_tcp_connect(radiusd_t) ++') ++ + optional_policy(` + samba_domtrans_winbind_helper(radiusd_t) + ') +@@ -139,6 +178,11 @@ optional_policy(` + seutil_sigchld_newrole(radiusd_t) + ') + ++optional_policy(` ++ snmp_read_snmp_var_lib_files(radiusd_t) ++ snmp_read_snmp_var_lib_files(radiusd_t) ++') ++ + optional_policy(` + udev_read_db(radiusd_t) + ') +diff --git a/radvd.if b/radvd.if +index ac7058d1e8..48739ac1bf 100644 +--- a/radvd.if ++++ b/radvd.if +@@ -1,5 +1,24 @@ + ## IPv6 router advertisement daemon. + ++###################################### ++## ++## Read radvd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`radvd_read_pid_files',` ++ gen_require(` ++ type radvd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, radvd_var_run_t, radvd_var_run_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -23,8 +42,11 @@ interface(`radvd_admin',` + type radvd_var_run_t; + ') + +- allow $1 radvd_t:process { ptrace signal_perms }; ++ allow $1 radvd_t:process signal_perms; + ps_process_pattern($1, radvd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 radvd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, radvd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/radvd.te b/radvd.te +index 6d162e4e64..889c0ed5f4 100644 +--- a/radvd.te ++++ b/radvd.te +@@ -65,8 +65,6 @@ auth_use_nsswitch(radvd_t) + + logging_send_syslog_msg(radvd_t) + +-miscfiles_read_localization(radvd_t) +- + userdom_dontaudit_use_unpriv_user_fds(radvd_t) + userdom_dontaudit_search_user_home_dirs(radvd_t) + +diff --git a/raid.fc b/raid.fc +index 5806046b13..2a4769ff4f 100644 +--- a/raid.fc ++++ b/raid.fc +@@ -3,6 +3,12 @@ + + /etc/rc\.d/init\.d/mdmonitor -- gen_context(system_u:object_r:mdadm_initrc_exec_t,s0) + ++/etc/mdadm\.conf -- gen_context(system_u:object_r:mdadm_conf_t,s0) ++/etc/mdadm\.conf\.anacbak -- gen_context(system_u:object_r:mdadm_conf_t,s0) ++ ++/usr/lib/systemd/system/mdmon@.* -- gen_context(system_u:object_r:mdadm_unit_file_t,s0) ++/usr/lib/systemd/system/mdmonitor.* -- gen_context(system_u:object_r:mdadm_unit_file_t,s0) ++ + /sbin/iprdump -- gen_context(system_u:object_r:mdadm_exec_t,s0) + /sbin/iprinit -- gen_context(system_u:object_r:mdadm_exec_t,s0) + /sbin/iprupdate -- gen_context(system_u:object_r:mdadm_exec_t,s0) +@@ -16,6 +22,10 @@ + /usr/sbin/iprupdate -- gen_context(system_u:object_r:mdadm_exec_t,s0) + /usr/sbin/mdadm -- gen_context(system_u:object_r:mdadm_exec_t,s0) + /usr/sbin/mdmpd -- gen_context(system_u:object_r:mdadm_exec_t,s0) ++/usr/sbin/mdmon -- gen_context(system_u:object_r:mdadm_exec_t,s0) + /usr/sbin/raid-check -- gen_context(system_u:object_r:mdadm_exec_t,s0) + ++/var/log/iprdbg -- gen_context(system_u:object_r:mdadm_log_t,s0) ++/var/log/iprdump.* -- gen_context(system_u:object_r:mdadm_log_t,s0) ++ + /var/run/mdadm(/.*)? gen_context(system_u:object_r:mdadm_var_run_t,s0) +diff --git a/raid.if b/raid.if +index 951db7f1be..00e699da47 100644 +--- a/raid.if ++++ b/raid.if +@@ -1,9 +1,8 @@ +-## RAID array management tools. ++## RAID array management tools + + ######################################## + ## +-## Execute software raid tools in +-## the mdadm domain. ++## Execute software raid tools in the mdadm domain. + ## + ## + ## +@@ -22,34 +21,57 @@ interface(`raid_domtrans_mdadm',` + + ###################################### + ## +-## Execute mdadm in the mdadm +-## domain, and allow the specified +-## role the mdadm domain. ++## Execute a domain transition to mdadm_t for the ++## specified role, allowing it to use the mdadm_t ++## domain + ## + ## + ## +-## Role allowed access. ++## Role allowed to access mdadm_t domain + ## + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed to transition to mdadm_t + ## + ## + # + interface(`raid_run_mdadm',` + gen_require(` +- attribute_role mdadm_roles; ++ type mdadm_t; + ') + ++ role $1 types mdadm_t; + raid_domtrans_mdadm($2) +- roleattribute $1 mdadm_roles; ++') ++ ++###################################### ++## ++## Execute mdadm server in the mdadm domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`mdadm_systemctl',` ++ gen_require(` ++ type mdadm_t; ++ type mdadm_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 mdadm_unit_file_t:file read_file_perms; ++ allow $1 mdadm_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, mdadm_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## mdadm pid files. ++## read the mdadm pid files. + ## + ## + ## +@@ -57,47 +79,113 @@ interface(`raid_run_mdadm',` + ## + ## + # +-interface(`raid_manage_mdadm_pid',` ++interface(`raid_read_mdadm_pid',` + gen_require(` + type mdadm_var_run_t; + ') + +- files_search_pids($1) +- allow $1 mdadm_var_run_t:file manage_file_perms; ++ read_files_pattern($1, mdadm_var_run_t, mdadm_var_run_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an mdadm environment. ++## Create, read, write, and delete the mdadm pid files. + ## ++## ++##

      ++## Create, read, write, and delete the mdadm pid files. ++##

      ++##

      ++## Added for use in the init module. ++##

      ++##
      + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`raid_manage_mdadm_pid',` ++ gen_require(` ++ type mdadm_var_run_t; ++ ') ++ ++ # FIXME: maybe should have a type_transition. not ++ # clear what this is doing, from the original ++ # mdadm policy ++ allow $1 mdadm_var_run_t:file manage_file_perms; ++') ++ ++####################################### ++## ++## Check access to the mdadm executable. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`raid_access_check_mdadm',` ++ gen_require(` ++ type mdadm_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ allow $1 mdadm_exec_t:file { getattr_file_perms execute }; ++') ++ ++######################################## ++## ++## Read mdadm config files. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`raid_admin_mdadm',` ++interface(`raid_read_conf_files',` + gen_require(` +- type mdadm_t, mdadm_initrc_exec_t, mdadm_var_run_t; ++ type mdadm_conf_t; + ') + +- allow $1 mdadm_t:process { ptrace signal_perms }; +- ps_process_pattern($1, mdadm_t) ++ read_files_pattern($1, mdadm_conf_t, mdadm_conf_t) ++') ++ ++######################################## ++## ++## Manage mdadm config files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`raid_manage_conf_files',` ++ gen_require(` ++ type mdadm_conf_t; ++ ') + +- init_labeled_script_domtrans($1, mdadm_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 mdadm_initrc_exec_t system_r; +- allow $2 system_r; ++ manage_files_pattern($1, mdadm_conf_t, mdadm_conf_t) ++') + +- files_search_pids($1) +- admin_pattern($1, mdadm_var_run_t) ++######################################## ++## ++## Transition to mdadm named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`raid_filetrans_named_content',` ++ gen_require(` ++ type mdadm_conf_t; ++ ') + +- raid_run_mdadm($2, $1) ++ files_etc_filetrans($1, mdadm_conf_t, file, "mdadm.conf") ++ files_etc_filetrans($1, mdadm_conf_t, file, "mdadm.conf.anacbak") + ') +diff --git a/raid.te b/raid.te +index c99753f2c5..55294acec9 100644 +--- a/raid.te ++++ b/raid.te +@@ -15,54 +15,104 @@ role mdadm_roles types mdadm_t; + type mdadm_initrc_exec_t; + init_script_file(mdadm_initrc_exec_t) + ++type mdadm_conf_t; ++files_config_file(mdadm_conf_t) ++ ++type mdadm_unit_file_t; ++systemd_unit_file(mdadm_unit_file_t) ++ ++type mdadm_tmp_t; ++files_tmp_file(mdadm_tmp_t) ++ ++type mdadm_tmpfs_t; ++files_tmpfs_file(mdadm_tmpfs_t) ++ + type mdadm_var_run_t alias mdadm_map_t; + files_pid_file(mdadm_var_run_t) + dev_associate(mdadm_var_run_t) + ++type mdadm_log_t; ++logging_log_file(mdadm_log_t) ++ + ######################################## + # + # Local policy + # + +-allow mdadm_t self:capability { dac_override sys_admin ipc_lock }; +-dontaudit mdadm_t self:capability sys_tty_config; +-allow mdadm_t self:process { getsched setsched signal_perms }; ++allow mdadm_t self:capability { dac_read_search dac_override sys_admin ipc_lock }; ++dontaudit mdadm_t self:capability { sys_tty_config sys_ptrace }; ++allow mdadm_t self:process { getsched setsched sigchld sigkill sigstop signull signal }; + allow mdadm_t self:fifo_file rw_fifo_file_perms; + allow mdadm_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow mdadm_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++ ++manage_files_pattern(mdadm_t, mdadm_conf_t, mdadm_conf_t) ++files_etc_filetrans(mdadm_t, mdadm_conf_t, file, "mdadm.conf") ++files_etc_filetrans(mdadm_t, mdadm_conf_t, file, "mdadm.conf.anacbak") ++ ++manage_files_pattern(mdadm_t, mdadm_tmp_t, mdadm_tmp_t) ++manage_dirs_pattern(mdadm_t, mdadm_tmp_t, mdadm_tmp_t) ++files_tmp_filetrans(mdadm_t, mdadm_tmp_t, file) ++ ++manage_files_pattern(mdadm_t, mdadm_tmpfs_t, mdadm_tmpfs_t) ++manage_dirs_pattern(mdadm_t, mdadm_tmpfs_t, mdadm_tmpfs_t) ++fs_tmpfs_filetrans(mdadm_t, mdadm_tmpfs_t, { dir file }) + + manage_dirs_pattern(mdadm_t, mdadm_var_run_t, mdadm_var_run_t) + manage_files_pattern(mdadm_t, mdadm_var_run_t, mdadm_var_run_t) + manage_lnk_files_pattern(mdadm_t, mdadm_var_run_t, mdadm_var_run_t) + manage_sock_files_pattern(mdadm_t, mdadm_var_run_t, mdadm_var_run_t) +-dev_filetrans(mdadm_t, mdadm_var_run_t, file) +-files_pid_filetrans(mdadm_t, mdadm_var_run_t, { dir file }) ++files_pid_filetrans(mdadm_t, mdadm_var_run_t, { file dir }) ++dev_filetrans(mdadm_t, mdadm_var_run_t, { file dir sock_file }) ++ ++manage_files_pattern(mdadm_t, mdadm_log_t, mdadm_log_t) ++logging_log_filetrans(mdadm_t, mdadm_log_t, file) ++ ++can_exec(mdadm_t, mdadm_exec_t) + + kernel_getattr_core_if(mdadm_t) + kernel_read_system_state(mdadm_t) + kernel_read_kernel_sysctls(mdadm_t) + kernel_request_load_module(mdadm_t) + kernel_rw_software_raid_state(mdadm_t) ++kernel_dontaudit_setsched(mdadm_t) ++kernel_signal(mdadm_t) ++kernel_signull(mdadm_t) ++kernel_stream_connect(mdadm_t) + + corecmd_exec_bin(mdadm_t) + corecmd_exec_shell(mdadm_t) + + dev_rw_sysfs(mdadm_t) +-dev_dontaudit_getattr_all_blk_files(mdadm_t) +-dev_dontaudit_getattr_all_chr_files(mdadm_t) ++dev_dontaudit_read_all_blk_files(mdadm_t) ++dev_dontaudit_read_all_chr_files(mdadm_t) ++dev_getattr_all(mdadm_t) ++dev_read_crash(mdadm_t) ++dev_read_framebuffer(mdadm_t) + dev_read_realtime_clock(mdadm_t) + dev_read_raw_memory(mdadm_t) +- ++dev_read_kvm(mdadm_t) ++dev_read_mei(mdadm_t) ++dev_read_nvram(mdadm_t) ++dev_read_generic_files(mdadm_t) ++dev_read_generic_usb_dev(mdadm_t) ++dev_read_urand(mdadm_t) ++dev_read_rand(mdadm_t) ++dev_rw_nvme(mdadm_t) ++ ++domain_read_all_domains_state(mdadm_t) + domain_use_interactive_fds(mdadm_t) + +-files_read_etc_files(mdadm_t) + files_read_etc_runtime_files(mdadm_t) +-files_dontaudit_getattr_all_files(mdadm_t) ++files_dontaudit_getattr_tmpfs_files(mdadm_t) + + fs_getattr_all_fs(mdadm_t) + fs_list_auto_mountpoints(mdadm_t) + fs_list_hugetlbfs(mdadm_t) + fs_rw_cgroup_files(mdadm_t) + fs_dontaudit_list_tmpfs(mdadm_t) ++fs_manage_cgroup_files(mdadm_t) ++fs_read_efivarfs_files(mdadm_t) + + mls_file_read_all_levels(mdadm_t) + mls_file_write_all_levels(mdadm_t) +@@ -71,15 +121,25 @@ storage_dev_filetrans_fixed_disk(mdadm_t) + storage_manage_fixed_disk(mdadm_t) + storage_read_scsi_generic(mdadm_t) + storage_write_scsi_generic(mdadm_t) ++storage_raw_read_removable_device(mdadm_t) ++storage_tmp_filetrans_fixed_disk(mdadm_t) + + term_dontaudit_list_ptys(mdadm_t) + term_dontaudit_use_unallocated_ttys(mdadm_t) + ++auth_use_nsswitch(mdadm_t) ++ + init_dontaudit_getattr_initctl(mdadm_t) ++init_getattr_script_status_files(mdadm_t) + ++logging_dontaudit_getattr_all_logs(mdadm_t) + logging_send_syslog_msg(mdadm_t) + +-miscfiles_read_localization(mdadm_t) ++systemd_exec_systemctl(mdadm_t) ++systemd_start_systemd_services(mdadm_t) ++ ++term_use_generic_ptys(mdadm_t) ++term_use_unallocated_ttys(mdadm_t) + + userdom_dontaudit_use_unpriv_user_fds(mdadm_t) + userdom_dontaudit_search_user_home_content(mdadm_t) +@@ -89,14 +149,27 @@ optional_policy(` + cron_system_entry(mdadm_t, mdadm_exec_t) + ') + ++optional_policy(` ++ dbus_system_bus_client(mdadm_t) ++') ++ + optional_policy(` + gpm_dontaudit_getattr_gpmctl(mdadm_t) + ') + ++optional_policy(` ++ kdump_manage_kdumpctl_tmp_files(mdadm_t) ++ kdump_rw_lock(mdadm_t) ++') ++ + optional_policy(` + mta_send_mail(mdadm_t) + ') + ++optional_policy(` ++ mdadm_systemctl(mdadm_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(mdadm_t) + ') +@@ -104,3 +177,11 @@ optional_policy(` + optional_policy(` + udev_read_db(mdadm_t) + ') ++ ++optional_policy(` ++ virt_read_blk_images(mdadm_t) ++') ++ ++optional_policy(` ++ xserver_dontaudit_search_log(mdadm_t) ++') +diff --git a/rasdaemon.fc b/rasdaemon.fc +new file mode 100644 +index 0000000000..8e31dd0426 +--- /dev/null ++++ b/rasdaemon.fc +@@ -0,0 +1,9 @@ ++/usr/lib/systemd/system/ras-mc-ctl.* -- gen_context(system_u:object_r:rasdaemon_unit_file_t,s0) ++ ++/usr/lib/systemd/system/rasdaemon.* -- gen_context(system_u:object_r:rasdaemon_unit_file_t,s0) ++ ++/usr/sbin/rasdaemon -- gen_context(system_u:object_r:rasdaemon_exec_t,s0) ++ ++/usr/sbin/ras-mc-ctl -- gen_context(system_u:object_r:rasdaemon_exec_t,s0) ++ ++/var/lib/rasdaemon(/.*)? gen_context(system_u:object_r:rasdaemon_var_lib_t,s0) +diff --git a/rasdaemon.if b/rasdaemon.if +new file mode 100644 +index 0000000000..d57006d9cf +--- /dev/null ++++ b/rasdaemon.if +@@ -0,0 +1,157 @@ ++ ++## The rasdaemon program is a daemon with monitors the RAS trace events from /sys/kernel/debug/tracing ++ ++######################################## ++## ++## Execute TEMPLATE in the rasdaemon domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rasdaemon_domtrans',` ++ gen_require(` ++ type rasdaemon_t, rasdaemon_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, rasdaemon_exec_t, rasdaemon_t) ++') ++ ++######################################## ++## ++## Search rasdaemon lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rasdaemon_search_lib',` ++ gen_require(` ++ type rasdaemon_var_lib_t; ++ ') ++ ++ allow $1 rasdaemon_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read rasdaemon lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rasdaemon_read_lib_files',` ++ gen_require(` ++ type rasdaemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, rasdaemon_var_lib_t, rasdaemon_var_lib_t) ++') ++ ++######################################## ++## ++## Manage rasdaemon lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rasdaemon_manage_lib_files',` ++ gen_require(` ++ type rasdaemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, rasdaemon_var_lib_t, rasdaemon_var_lib_t) ++') ++ ++######################################## ++## ++## Manage rasdaemon lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rasdaemon_manage_lib_dirs',` ++ gen_require(` ++ type rasdaemon_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, rasdaemon_var_lib_t, rasdaemon_var_lib_t) ++') ++ ++######################################## ++## ++## Execute rasdaemon server in the rasdaemon domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rasdaemon_systemctl',` ++ gen_require(` ++ type rasdaemon_t; ++ type rasdaemon_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 rasdaemon_unit_file_t:file read_file_perms; ++ allow $1 rasdaemon_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rasdaemon_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rasdaemon environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`rasdaemon_admin',` ++ gen_require(` ++ type rasdaemon_t; ++ type rasdaemon_var_lib_t; ++ type rasdaemon_unit_file_t; ++ ') ++ ++ allow $1 rasdaemon_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, rasdaemon_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, rasdaemon_var_lib_t) ++ ++ rasdaemon_systemctl($1) ++ admin_pattern($1, rasdaemon_unit_file_t) ++ allow $1 rasdaemon_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/rasdaemon.te b/rasdaemon.te +new file mode 100644 +index 0000000000..dcdca44483 +--- /dev/null ++++ b/rasdaemon.te +@@ -0,0 +1,51 @@ ++policy_module(rasdaemon, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type rasdaemon_t; ++type rasdaemon_exec_t; ++init_daemon_domain(rasdaemon_t, rasdaemon_exec_t) ++ ++type rasdaemon_var_lib_t; ++files_type(rasdaemon_var_lib_t) ++ ++type rasdaemon_unit_file_t; ++systemd_unit_file(rasdaemon_unit_file_t) ++ ++######################################## ++# ++# rasdaemon local policy ++# ++allow rasdaemon_t self:fifo_file rw_fifo_file_perms; ++allow rasdaemon_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(rasdaemon_t, rasdaemon_var_lib_t, rasdaemon_var_lib_t) ++manage_files_pattern(rasdaemon_t, rasdaemon_var_lib_t, rasdaemon_var_lib_t) ++files_var_lib_filetrans(rasdaemon_t, rasdaemon_var_lib_t, { dir file }) ++ ++kernel_read_system_state(rasdaemon_t) ++kernel_manage_debugfs(rasdaemon_t) ++ ++dev_read_raw_memory(rasdaemon_t) ++dev_read_sysfs(rasdaemon_t) ++dev_read_urand(rasdaemon_t) ++dev_rw_cpu_microcode(rasdaemon_t) ++ ++fs_rw_tracefs_files(rasdaemon_t) ++fs_manage_tracefs_dirs(rasdaemon_t) ++fs_mount_tracefs(rasdaemon_t) ++fs_unmount_tracefs(rasdaemon_t) ++ ++modutils_dontaudit_exec_insmod(rasdaemon_t) # more info here #1030277 ++ ++auth_use_nsswitch(rasdaemon_t) ++ ++logging_send_syslog_msg(rasdaemon_t) ++ ++optional_policy(` ++ dmidecode_exec(rasdaemon_t) ++') ++ +diff --git a/razor.fc b/razor.fc +index 6723f4d3bc..6e2667392d 100644 +--- a/razor.fc ++++ b/razor.fc +@@ -1,9 +1,9 @@ +-HOME_DIR/\.razor(/.*)? gen_context(system_u:object_r:razor_home_t,s0) ++#/root/\.razor(/.*)? gen_context(system_u:object_r:razor_home_t,s0) ++#HOME_DIR/\.razor(/.*)? gen_context(system_u:object_r:razor_home_t,s0) + +-/etc/razor(/.*)? gen_context(system_u:object_r:razor_etc_t,s0) ++#/etc/razor(/.*)? gen_context(system_u:object_r:razor_etc_t,s0) + +-/usr/bin/razor.* -- gen_context(system_u:object_r:razor_exec_t,s0) ++#/usr/bin/razor.* -- gen_context(system_u:object_r:razor_exec_t,s0) + +-/var/lib/razor(/.*)? gen_context(system_u:object_r:razor_var_lib_t,s0) +- +-/var/log/razor-agent\.log.* -- gen_context(system_u:object_r:razor_log_t,s0) ++#/var/lib/razor(/.*)? gen_context(system_u:object_r:razor_var_lib_t,s0) ++#/var/log/razor-agent\.log.* -- gen_context(system_u:object_r:razor_log_t,s0) +diff --git a/razor.if b/razor.if +index 1e4b523bf7..fee3b7cd16 100644 +--- a/razor.if ++++ b/razor.if +@@ -1,72 +1,147 @@ + ## A distributed, collaborative, spam detection and filtering network. ++## ++##

      ++## A distributed, collaborative, spam detection and filtering network. ++##

      ++##

      ++## This policy will work with either the ATrpms provided config ++## file in /etc/razor, or with the default of dumping everything into ++## $HOME/.razor. ++##

      ++##
      + + ####################################### + ## +-## The template to define a razor domain. ++## Template to create types and rules common to ++## all razor domains. + ## +-## ++## + ## +-## Domain prefix to be used. ++## The prefix of the domain (e.g., user ++## is the prefix for user_t). + ## + ## + # + template(`razor_common_domain_template',` + gen_require(` +- attribute razor_domain; +- type razor_exec_t; ++ type razor_exec_t, razor_etc_t, razor_log_t, razor_var_lib_t; + ') + +- ######################################## +- # +- # Declarations +- # +- +- type $1_t, razor_domain; ++ type $1_t; + domain_type($1_t) + domain_entry_file($1_t, razor_exec_t) + +- ######################################## +- # +- # Declarations +- # +- +- auth_use_nsswitch($1_t) ++ allow $1_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++ allow $1_t self:fd use; ++ allow $1_t self:fifo_file rw_fifo_file_perms; ++ allow $1_t self:unix_dgram_socket create_socket_perms; ++ allow $1_t self:unix_stream_socket create_stream_socket_perms; ++ allow $1_t self:unix_dgram_socket sendto; ++ allow $1_t self:unix_stream_socket connectto; ++ allow $1_t self:shm create_shm_perms; ++ allow $1_t self:sem create_sem_perms; ++ allow $1_t self:msgq create_msgq_perms; ++ allow $1_t self:msg { send receive }; ++ allow $1_t self:tcp_socket create_socket_perms; ++ ++ # Read system config file ++ allow $1_t razor_etc_t:dir list_dir_perms; ++ allow $1_t razor_etc_t:file read_file_perms; ++ allow $1_t razor_etc_t:lnk_file read_lnk_file_perms; ++ ++ manage_dirs_pattern($1_t, razor_log_t, razor_log_t) ++ manage_files_pattern($1_t, razor_log_t, razor_log_t) ++ manage_lnk_files_pattern($1_t, razor_log_t, razor_log_t) ++ logging_log_filetrans($1_t, razor_log_t, file) ++ ++ manage_dirs_pattern($1_t, razor_var_lib_t, razor_var_lib_t) ++ manage_files_pattern($1_t, razor_var_lib_t, razor_var_lib_t) ++ manage_lnk_files_pattern($1_t, razor_var_lib_t, razor_var_lib_t) ++ files_search_var_lib($1_t) ++ ++ # Razor is one executable and several symlinks ++ allow $1_t razor_exec_t:file read_file_perms; ++ allow $1_t razor_exec_t:lnk_file read_lnk_file_perms; ++ ++ kernel_read_system_state($1_t) ++ kernel_read_network_state($1_t) ++ kernel_read_software_raid_state($1_t) ++ kernel_getattr_core_if($1_t) ++ kernel_getattr_message_if($1_t) ++ kernel_read_kernel_sysctls($1_t) ++ ++ corecmd_exec_bin($1_t) ++ ++ corenet_all_recvfrom_unlabeled($1_t) ++ corenet_all_recvfrom_netlabel($1_t) ++ corenet_tcp_sendrecv_generic_if($1_t) ++ corenet_raw_sendrecv_generic_if($1_t) ++ corenet_tcp_sendrecv_generic_node($1_t) ++ corenet_raw_sendrecv_generic_node($1_t) ++ corenet_tcp_sendrecv_razor_port($1_t) ++ ++ # mktemp and other randoms ++ dev_read_rand($1_t) ++ dev_read_urand($1_t) ++ ++ files_search_pids($1_t) ++ # Allow access to various files in the /etc/directory including mtab ++ # and nsswitch ++ files_read_etc_files($1_t) ++ files_read_etc_runtime_files($1_t) ++ ++ fs_search_auto_mountpoints($1_t) ++ ++ libs_read_lib_files($1_t) ++ ++ ++ sysnet_read_config($1_t) ++ sysnet_dns_name_resolve($1_t) ++ ++ optional_policy(` ++ nis_use_ypbind($1_t) ++ ') + ') + + ######################################## + ## +-## Role access for razor. ++## Role access for razor + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## ++## + # + interface(`razor_role',` + gen_require(` +- attribute_role razor_roles; + type razor_t, razor_exec_t, razor_home_t; +- type razor_tmp_t; + ') + +- roleattribute $1 razor_roles; ++ role $1 types razor_t; + ++ # Transition from the user domain to the derived domain. + domtrans_pattern($2, razor_exec_t, razor_t) + ++ # allow ps to show razor and allow the user to kill it + ps_process_pattern($2, razor_t) +- allow $2 razor_t:process signal; +- +- allow $2 { razor_home_t razor_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { razor_home_t razor_tmp_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 razor_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; ++ allow $2 razor_t:process signal_perms; ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 razor_t:process ptrace; ++ ') + +- userdom_user_home_dir_filetrans($2, razor_home_t, dir, ".razor") ++ manage_dirs_pattern($2, razor_home_t, razor_home_t) ++ manage_files_pattern($2, razor_home_t, razor_home_t) ++ manage_lnk_files_pattern($2, razor_home_t, razor_home_t) ++ relabel_dirs_pattern($2, razor_home_t, razor_home_t) ++ relabel_files_pattern($2, razor_home_t, razor_home_t) ++ relabel_lnk_files_pattern($2, razor_home_t, razor_home_t) + ') + + ######################################## +@@ -81,17 +156,16 @@ interface(`razor_role',` + # + interface(`razor_domtrans',` + gen_require(` +- type system_razor_t, razor_exec_t; ++ type razor_t, razor_exec_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, razor_exec_t, system_razor_t) ++ domtrans_pattern($1, razor_exec_t, razor_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## razor home content. ++## Create, read, write, and delete razor files ++## in a user home subdirectory. + ## + ## + ## +@@ -99,20 +173,19 @@ interface(`razor_domtrans',` + ## + ## + # +-interface(`razor_manage_home_content',` ++interface(`razor_manage_user_home_files',` + gen_require(` + type razor_home_t; + ') + + userdom_search_user_home_dirs($1) +- allow $1 razor_home_t:dir manage_dir_perms; +- allow $1 razor_home_t:file manage_file_perms; +- allow $1 razor_home_t:lnk_file manage_lnk_file_perms; ++ manage_files_pattern($1, razor_home_t, razor_home_t) ++ read_lnk_files_pattern($1, razor_home_t, razor_home_t) + ') + + ######################################## + ## +-## Read razor lib files. ++## read razor lib files. + ## + ## + ## +diff --git a/razor.te b/razor.te +index 68455f9093..38f69685c2 100644 +--- a/razor.te ++++ b/razor.te +@@ -5,135 +5,124 @@ policy_module(razor, 2.4.0) + # Declarations + # + +-attribute razor_domain; ++ifdef(`distro_redhat',` ++ gen_require(` ++ type spamc_t, spamc_exec_t, spamd_log_t; ++ type spamd_spool_t, spamd_var_lib_t, spamd_etc_t; ++ type spamc_home_t, spamc_tmp_t; ++ ') ++ ++ typealias spamc_t alias razor_t; ++ typealias spamc_exec_t alias razor_exec_t; ++ typealias spamd_log_t alias razor_log_t; ++ typealias spamd_var_lib_t alias razor_var_lib_t; ++ typealias spamd_etc_t alias razor_etc_t; ++ typealias spamc_home_t alias razor_home_t; ++ typealias spamc_home_t alias { user_razor_home_t staff_razor_home_t sysadm_razor_home_t }; ++ typealias spamc_home_t alias { auditadm_razor_home_t secadm_razor_home_t }; ++ typealias spamc_tmp_t alias { user_razor_tmp_t staff_razor_tmp_t sysadm_razor_tmp_t }; ++ typealias spamc_tmp_t alias { auditadm_razor_tmp_t secadm_razor_tmp_t }; ++',` ++ type razor_exec_t; ++ corecmd_executable_file(razor_exec_t) ++ ++ type razor_etc_t; ++ files_config_file(razor_etc_t) ++ ++ type razor_home_t; ++ typealias razor_home_t alias { user_razor_home_t staff_razor_home_t sysadm_razor_home_t }; ++ typealias razor_home_t alias { auditadm_razor_home_t secadm_razor_home_t }; ++ userdom_user_home_content(razor_home_t) ++ ++ type razor_log_t; ++ logging_log_file(razor_log_t) ++ ++ type razor_tmp_t; ++ typealias razor_tmp_t alias { user_razor_tmp_t staff_razor_tmp_t sysadm_razor_tmp_t }; ++ typealias razor_tmp_t alias { auditadm_razor_tmp_t secadm_razor_tmp_t }; ++ files_tmp_file(razor_tmp_t) ++ ubac_constrained(razor_tmp_t) ++ ++ type razor_var_lib_t; ++ files_type(razor_var_lib_t) ++ ++ # these are here due to ordering issues: ++ razor_common_domain_template(razor) ++ typealias razor_t alias { user_razor_t staff_razor_t sysadm_razor_t }; ++ typealias razor_t alias { auditadm_razor_t secadm_razor_t }; ++ ubac_constrained(razor_t) ++ ++ razor_common_domain_template(system_razor) ++ role system_r types system_razor_t; ++ ++ ######################################## ++ # ++ # System razor local policy ++ # ++ ++ # this version of razor is invoked typically ++ # via the system spam filter ++ ++ allow system_razor_t self:tcp_socket create_socket_perms; ++ ++ manage_dirs_pattern(system_razor_t, razor_etc_t, razor_etc_t) ++ manage_files_pattern(system_razor_t, razor_etc_t, razor_etc_t) ++ manage_lnk_files_pattern(system_razor_t, razor_etc_t, razor_etc_t) ++ files_search_etc(system_razor_t) ++ ++ allow system_razor_t razor_log_t:file manage_file_perms; ++ logging_log_filetrans(system_razor_t, razor_log_t, file) ++ ++ manage_files_pattern(system_razor_t, razor_var_lib_t, razor_var_lib_t) ++ files_var_lib_filetrans(system_razor_t, razor_var_lib_t, file) ++ ++ corenet_all_recvfrom_netlabel(system_razor_t) ++ corenet_tcp_sendrecv_generic_if(system_razor_t) ++ corenet_raw_sendrecv_generic_if(system_razor_t) ++ corenet_tcp_sendrecv_generic_node(system_razor_t) ++ corenet_raw_sendrecv_generic_node(system_razor_t) ++ corenet_tcp_sendrecv_razor_port(system_razor_t) ++ corenet_tcp_connect_razor_port(system_razor_t) ++ corenet_sendrecv_razor_client_packets(system_razor_t) ++ ++ auth_use_nsswitch(system_razor_t) ++ ++ # cjp: this shouldn't be needed ++ userdom_use_unpriv_users_fds(system_razor_t) ++ ++ optional_policy(` ++ logging_send_syslog_msg(system_razor_t) ++ ') ++ ++ ######################################## ++ # ++ # User razor local policy ++ # ++ ++ # Allow razor to be run by hand. Needed by any action other than ++ # invocation from a spam filter. ++ ++ allow razor_t self:unix_stream_socket create_stream_socket_perms; ++ ++ manage_dirs_pattern(razor_t, razor_home_t, razor_home_t) ++ manage_files_pattern(razor_t, razor_home_t, razor_home_t) ++ manage_lnk_files_pattern(razor_t, razor_home_t, razor_home_t) ++ userdom_user_home_dir_filetrans(razor_t, razor_home_t, dir) ++ ++ manage_dirs_pattern(razor_t, razor_tmp_t, razor_tmp_t) ++ manage_files_pattern(razor_t, razor_tmp_t, razor_tmp_t) ++ files_tmp_filetrans(razor_t, razor_tmp_t, { file dir }) ++ ++ auth_use_nsswitch(razor_t) + +-attribute_role razor_roles; ++ logging_send_syslog_msg(razor_t) + +-type razor_exec_t; +-corecmd_executable_file(razor_exec_t) ++ userdom_search_user_home_dirs(razor_t) ++ userdom_use_inherited_user_terminals(razor_t) + +-type razor_etc_t; +-files_config_file(razor_etc_t) ++ userdom_home_manager(razor_t) + +-type razor_home_t; +-typealias razor_home_t alias { user_razor_home_t staff_razor_home_t sysadm_razor_home_t }; +-typealias razor_home_t alias { auditadm_razor_home_t secadm_razor_home_t }; +-userdom_user_home_content(razor_home_t) +- +-type razor_log_t; +-logging_log_file(razor_log_t) +- +-type razor_tmp_t; +-typealias razor_tmp_t alias { user_razor_tmp_t staff_razor_tmp_t sysadm_razor_tmp_t }; +-typealias razor_tmp_t alias { auditadm_razor_tmp_t secadm_razor_tmp_t }; +-userdom_user_tmp_file(razor_tmp_t) +- +-type razor_var_lib_t; +-files_type(razor_var_lib_t) +- +-razor_common_domain_template(razor) +-typealias razor_t alias { user_razor_t staff_razor_t sysadm_razor_t }; +-typealias razor_t alias { auditadm_razor_t secadm_razor_t }; +-userdom_user_application_type(razor_t) +-role razor_roles types razor_t; +- +-razor_common_domain_template(system_razor) +-role system_r types system_razor_t; +- +-######################################## +-# +-# Common razor domain local policy +-# +- +-allow razor_domain self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; +-allow razor_domain self:fd use; +-allow razor_domain self:fifo_file rw_fifo_file_perms; +-allow razor_domain self:unix_dgram_socket sendto; +-allow razor_domain self:unix_stream_socket { accept connectto listen }; +- +-allow razor_domain razor_etc_t:dir list_dir_perms; +-allow razor_domain razor_etc_t:file read_file_perms; +-allow razor_domain razor_etc_t:lnk_file read_lnk_file_perms; +- +-allow razor_domain razor_exec_t:file read_file_perms; +-allow razor_domain razor_exec_t:lnk_file read_lnk_file_perms; +- +-kernel_read_system_state(razor_domain) +-kernel_read_network_state(razor_domain) +-kernel_read_software_raid_state(razor_domain) +-kernel_getattr_core_if(razor_domain) +-kernel_getattr_message_if(razor_domain) +-kernel_read_kernel_sysctls(razor_domain) +- +-corecmd_exec_bin(razor_domain) +- +-corenet_all_recvfrom_unlabeled(razor_domain) +-corenet_all_recvfrom_netlabel(razor_domain) +-corenet_tcp_sendrecv_generic_if(razor_domain) +-corenet_tcp_sendrecv_generic_node(razor_domain) +- +-corenet_tcp_sendrecv_razor_port(razor_domain) +-corenet_tcp_connect_razor_port(razor_domain) +-corenet_sendrecv_razor_client_packets(razor_domain) +- +-dev_read_rand(razor_domain) +-dev_read_urand(razor_domain) +- +-files_read_etc_runtime_files(razor_domain) +- +-libs_read_lib_files(razor_domain) +- +-miscfiles_read_localization(razor_domain) +- +-######################################## +-# +-# System local policy +-# +- +-manage_dirs_pattern(system_razor_t, razor_etc_t, razor_etc_t) +-manage_files_pattern(system_razor_t, razor_etc_t, razor_etc_t) +-manage_lnk_files_pattern(system_razor_t, razor_etc_t, razor_etc_t) +- +-manage_dirs_pattern(system_razor_t, razor_log_t, razor_log_t) +-append_files_pattern(system_razor_t, razor_log_t, razor_log_t) +-create_files_pattern(system_razor_t, razor_log_t, razor_log_t) +-setattr_files_pattern(system_razor_t, razor_log_t, razor_log_t) +-manage_lnk_files_pattern(system_razor_t, razor_log_t, razor_log_t) +-logging_log_filetrans(system_razor_t, razor_log_t, file) +- +-manage_dirs_pattern(system_razor_t, razor_var_lib_t, razor_var_lib_t) +-manage_files_pattern(system_razor_t, razor_var_lib_t, razor_var_lib_t) +-manage_lnk_files_pattern(system_razor_t, razor_var_lib_t, razor_var_lib_t) +-files_var_lib_filetrans(system_razor_t, razor_var_lib_t, file) +- +-######################################## +-# +-# Session local policy +-# +- +-manage_dirs_pattern(razor_t, razor_home_t, razor_home_t) +-manage_files_pattern(razor_t, razor_home_t, razor_home_t) +-manage_lnk_files_pattern(razor_t, razor_home_t, razor_home_t) +-userdom_user_home_dir_filetrans(razor_t, razor_home_t, dir, ".razor") +- +-manage_dirs_pattern(razor_t, razor_tmp_t, razor_tmp_t) +-manage_files_pattern(razor_t, razor_tmp_t, razor_tmp_t) +-files_tmp_filetrans(razor_t, razor_tmp_t, { file dir }) +- +-fs_getattr_all_fs(razor_t) +-fs_search_auto_mountpoints(razor_t) +- +-userdom_use_unpriv_users_fds(razor_t) +-userdom_use_user_terminals(razor_t) +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(razor_t) +- fs_manage_nfs_files(razor_t) +- fs_manage_nfs_symlinks(razor_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(razor_t) +- fs_manage_cifs_files(razor_t) +- fs_manage_cifs_symlinks(razor_t) ++ optional_policy(` ++ milter_manage_spamass_state(razor_t) ++ ') + ') +diff --git a/rdisc.fc b/rdisc.fc +index e9765c0f22..ea21331d80 100644 +--- a/rdisc.fc ++++ b/rdisc.fc +@@ -1,3 +1,3 @@ +-/sbin/rdisc -- gen_context(system_u:object_r:rdisc_exec_t,s0) ++/usr/lib/systemd/system/rdisc.* -- gen_context(system_u:object_r:rdisc_unit_file_t,s0) + + /usr/sbin/rdisc -- gen_context(system_u:object_r:rdisc_exec_t,s0) +diff --git a/rdisc.if b/rdisc.if +index 170ef52fbe..28ccc4a75c 100644 +--- a/rdisc.if ++++ b/rdisc.if +@@ -18,3 +18,58 @@ interface(`rdisc_exec',` + corecmd_search_bin($1) + can_exec($1, rdisc_exec_t) + ') ++ ++######################################## ++## ++## Execute rdisc server in the rdisc domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rdisc_systemctl',` ++ gen_require(` ++ type rdisc_t; ++ type rdisc_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 rdisc_unit_file_t:file read_file_perms; ++ allow $1 rdisc_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rdisc_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rdisc environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`rdisc_admin',` ++ gen_require(` ++ type rdisc_t; ++ type rdisc_unit_file_t; ++ ') ++ ++ allow $1 rdisc_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, rdisc_t) ++ ++ rdisc_systemctl($1) ++ admin_pattern($1, rdisc_unit_file_t) ++ allow $1 rdisc_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/rdisc.te b/rdisc.te +index 9196c1dbb4..b7759316f7 100644 +--- a/rdisc.te ++++ b/rdisc.te +@@ -9,6 +9,9 @@ type rdisc_t; + type rdisc_exec_t; + init_daemon_domain(rdisc_t, rdisc_exec_t) + ++type rdisc_unit_file_t; ++systemd_unit_file(rdisc_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -25,7 +28,6 @@ kernel_list_proc(rdisc_t) + kernel_read_proc_symlinks(rdisc_t) + kernel_read_kernel_sysctls(rdisc_t) + +-corenet_all_recvfrom_unlabeled(rdisc_t) + corenet_all_recvfrom_netlabel(rdisc_t) + corenet_udp_sendrecv_generic_if(rdisc_t) + corenet_raw_sendrecv_generic_if(rdisc_t) +@@ -39,12 +41,9 @@ fs_search_auto_mountpoints(rdisc_t) + + domain_use_interactive_fds(rdisc_t) + +-files_read_etc_files(rdisc_t) + + logging_send_syslog_msg(rdisc_t) + +-miscfiles_read_localization(rdisc_t) +- + sysnet_read_config(rdisc_t) + + userdom_dontaudit_use_unpriv_user_fds(rdisc_t) +diff --git a/readahead.fc b/readahead.fc +index f01b32fe20..46279e853b 100644 +--- a/readahead.fc ++++ b/readahead.fc +@@ -1,7 +1,11 @@ +-/sbin/readahead.* -- gen_context(system_u:object_r:readahead_exec_t,s0) ++/dev/\.systemd/readahead(/.*)? gen_context(system_u:object_r:readahead_var_run_t,s0) + ++/sbin/readahead.* -- gen_context(system_u:object_r:readahead_exec_t,s0) + /usr/sbin/readahead.* -- gen_context(system_u:object_r:readahead_exec_t,s0) + ++/usr/lib/systemd/systemd-readahead.* -- gen_context(system_u:object_r:readahead_exec_t,s0) ++ + /var/lib/readahead(/.*)? gen_context(system_u:object_r:readahead_var_lib_t,s0) + ++/var/run/systemd/readahead(/.*)? gen_context(system_u:object_r:readahead_var_run_t,s0) + /var/run/readahead.* gen_context(system_u:object_r:readahead_var_run_t,s0) +diff --git a/readahead.if b/readahead.if +index 661bb88fda..06f69c4ada 100644 +--- a/readahead.if ++++ b/readahead.if +@@ -19,3 +19,27 @@ interface(`readahead_domtrans',` + corecmd_search_bin($1) + domtrans_pattern($1, readahead_exec_t, readahead_t) + ') ++ ++######################################## ++## ++## Manage readahead var_run files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`readahead_manage_pid_files',` ++ gen_require(` ++ type readahead_var_run_t; ++ ') ++ ++ manage_dirs_pattern($1, readahead_var_run_t, readahead_var_run_t) ++ manage_files_pattern($1, readahead_var_run_t, readahead_var_run_t) ++ dev_filetrans($1, readahead_var_run_t, { dir file }) ++ init_pid_filetrans($1, readahead_var_run_t, { dir file }) ++ files_search_pids($1) ++ init_search_pid_dirs($1) ++') ++ +diff --git a/readahead.te b/readahead.te +index c0b02c91c1..f4705559c6 100644 +--- a/readahead.te ++++ b/readahead.te +@@ -15,6 +15,7 @@ typealias readahead_var_lib_t alias readahead_etc_rw_t; + + type readahead_var_run_t; + files_pid_file(readahead_var_run_t) ++dev_associate(readahead_var_run_t) + init_daemon_run_dir(readahead_var_run_t, "readahead") + + ######################################## +@@ -31,13 +32,19 @@ manage_files_pattern(readahead_t, readahead_var_lib_t, readahead_var_lib_t) + + manage_dirs_pattern(readahead_t, readahead_var_run_t, readahead_var_run_t) + manage_files_pattern(readahead_t, readahead_var_run_t, readahead_var_run_t) ++dev_filetrans(readahead_t, readahead_var_run_t, { dir file }) + files_pid_filetrans(readahead_t, readahead_var_run_t, { dir file }) ++allow readahead_t readahead_var_run_t:file map; + + kernel_read_all_sysctls(readahead_t) + kernel_read_system_state(readahead_t) + kernel_dontaudit_getattr_core_if(readahead_t) ++kernel_list_all_proc(readahead_t) + +-dev_read_sysfs(readahead_t) ++dev_rw_sysfs(readahead_t) ++dev_read_kmsg(readahead_t) ++dev_read_urand(readahead_t) ++dev_write_kmsg(readahead_t) + dev_getattr_generic_chr_files(readahead_t) + dev_getattr_generic_blk_files(readahead_t) + dev_getattr_all_chr_files(readahead_t) +@@ -51,12 +58,22 @@ domain_use_interactive_fds(readahead_t) + domain_read_all_domains_state(readahead_t) + + files_create_boot_flag(readahead_t) ++files_delete_root_files(readahead_t) + files_getattr_all_pipes(readahead_t) + files_list_non_security(readahead_t) + files_read_non_security_files(readahead_t) + files_search_var_lib(readahead_t) + files_dontaudit_getattr_all_sockets(readahead_t) + files_dontaudit_getattr_non_security_blk_files(readahead_t) ++files_dontaudit_all_access_check(readahead_t) ++files_dontaudit_read_security_files(readahead_t) ++files_dontaudit_read_all_sockets(readahead_t) ++ ++ifdef(`hide_broken_symptoms', ` ++ files_dontaudit_write_all_files(readahead_t) ++ dev_dontaudit_write_all_chr_files(readahead_t) ++ dev_dontaudit_write_all_blk_files(readahead_t) ++') + + fs_getattr_all_fs(readahead_t) + fs_search_auto_mountpoints(readahead_t) +@@ -66,13 +83,12 @@ fs_read_cgroup_files(readahead_t) + fs_read_tmpfs_files(readahead_t) + fs_read_tmpfs_symlinks(readahead_t) + fs_list_inotifyfs(readahead_t) ++fs_dontaudit_read_tmpfs_blk_dev(readahead_t) + fs_dontaudit_search_ramfs(readahead_t) + fs_dontaudit_read_ramfs_pipes(readahead_t) + fs_dontaudit_read_ramfs_files(readahead_t) + fs_dontaudit_use_tmpfs_chr_dev(readahead_t) + +-mcs_file_read_all(readahead_t) +- + mls_file_read_all_levels(readahead_t) + + storage_raw_read_fixed_disk(readahead_t) +@@ -84,13 +100,15 @@ auth_dontaudit_read_shadow(readahead_t) + init_use_fds(readahead_t) + init_use_script_ptys(readahead_t) + init_getattr_initctl(readahead_t) ++# needs to write to /run/systemd/notify ++init_write_pid_socket(readahead_t) ++init_create_pid_dirs(readahead_t) ++init_pid_filetrans(readahead_t, readahead_var_run_t, dir, "readahead") + + logging_send_syslog_msg(readahead_t) + logging_set_audit_parameters(readahead_t) + logging_dontaudit_search_audit_config(readahead_t) + +-miscfiles_read_localization(readahead_t) +- + userdom_dontaudit_use_unpriv_user_fds(readahead_t) + userdom_dontaudit_search_user_home_dirs(readahead_t) + +diff --git a/realmd.fc b/realmd.fc +index 04babe3d5b..3b92679bbb 100644 +--- a/realmd.fc ++++ b/realmd.fc +@@ -1 +1,5 @@ +-/usr/lib/realmd/realmd -- gen_context(system_u:object_r:realmd_exec_t,s0) ++/usr/lib/realmd/realmd -- gen_context(system_u:object_r:realmd_exec_t,s0) ++ ++/var/cache/realmd(/.*)? gen_context(system_u:object_r:realmd_var_cache_t,s0) ++ ++/var/lib/ipa-client(/.*)? gen_context(system_u:object_r:realmd_var_lib_t,s0) +diff --git a/realmd.if b/realmd.if +index bff31dfd2a..1663054d93 100644 +--- a/realmd.if ++++ b/realmd.if +@@ -1,8 +1,9 @@ +-## Dbus system service which manages discovery and enrollment in realms and domains like Active Directory or IPA. ++ ++## dbus system service which manages discovery and enrollment in realms and domains like Active Directory or IPA + + ######################################## + ## +-## Execute realmd in the realmd domain. ++## Execute realmd in the realmd_t domain. + ## + ## + ## +@@ -39,3 +40,120 @@ interface(`realmd_dbus_chat',` + allow $1 realmd_t:dbus send_msg; + allow realmd_t $1:dbus send_msg; + ') ++ ++######################################## ++## ++## Search realmd cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_search_cache',` ++ gen_require(` ++ type realmd_var_cache_t; ++ ') ++ ++ allow $1 realmd_var_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read realmd cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_read_cache_files',` ++ gen_require(` ++ type realmd_var_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, realmd_var_cache_t, realmd_var_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## realmd cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_manage_cache_files',` ++ gen_require(` ++ type realmd_var_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, realmd_var_cache_t, realmd_var_cache_t) ++') ++ ++######################################## ++## ++## Manage realmd cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_manage_cache_dirs',` ++ gen_require(` ++ type realmd_var_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, realmd_var_cache_t, realmd_var_cache_t) ++') ++ ++ ++######################################## ++## ++## Read realmd tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_read_tmp_files',` ++ gen_require(` ++ type realmd_tmp_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, realmd_tmp_t, realmd_tmp_t) ++') ++ ++####################################### ++## ++## Read realmd library files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`realmd_read_var_lib',` ++ gen_require(` ++ type realmd_var_lib_t; ++ ') ++ ++ list_dirs_pattern($1, realmd_var_lib_t, realmd_var_lib_t) ++ read_files_pattern($1, realmd_var_lib_t, realmd_var_lib_t) ++ ++') +diff --git a/realmd.te b/realmd.te +index 5bc878b29d..573620309b 100644 +--- a/realmd.te ++++ b/realmd.te +@@ -7,46 +7,88 @@ policy_module(realmd, 1.1.0) + + type realmd_t; + type realmd_exec_t; +-init_system_domain(realmd_t, realmd_exec_t) ++init_daemon_domain(realmd_t, realmd_exec_t) ++application_domain(realmd_t, realmd_exec_t) ++role system_r types realmd_t; ++ ++type realmd_tmp_t; ++files_tmp_file(realmd_tmp_t) ++ ++type realmd_var_cache_t; ++files_type(realmd_var_cache_t) ++ ++type realmd_var_lib_t; ++files_type(realmd_var_lib_t) + + ######################################## + # +-# Local policy ++# realmd local policy + # + +-allow realmd_t self:capability sys_nice; ++allow realmd_t self:capability { sys_nice }; ++allow realmd_t self:capability2 block_suspend; + allow realmd_t self:process setsched; ++allow realmd_t self:key manage_key_perms; ++ ++manage_dirs_pattern(realmd_t, realmd_tmp_t, realmd_tmp_t) ++manage_files_pattern(realmd_t, realmd_tmp_t, realmd_tmp_t) ++files_tmp_filetrans(realmd_t, realmd_tmp_t, { dir file }) ++ ++manage_files_pattern(realmd_t, realmd_var_cache_t, realmd_var_cache_t) ++manage_dirs_pattern(realmd_t, realmd_var_cache_t, realmd_var_cache_t) ++ ++manage_dirs_pattern(realmd_t, realmd_var_lib_t, realmd_var_lib_t) ++manage_files_pattern(realmd_t, realmd_var_lib_t, realmd_var_lib_t) ++files_var_lib_filetrans(realmd_t, realmd_var_lib_t, dir) + + kernel_read_system_state(realmd_t) ++kernel_read_network_state(realmd_t) + + corecmd_exec_bin(realmd_t) + corecmd_exec_shell(realmd_t) + +-corenet_all_recvfrom_unlabeled(realmd_t) +-corenet_all_recvfrom_netlabel(realmd_t) +-corenet_tcp_sendrecv_generic_if(realmd_t) +-corenet_tcp_sendrecv_generic_node(realmd_t) +- +-corenet_sendrecv_http_client_packets(realmd_t) + corenet_tcp_connect_http_port(realmd_t) +-corenet_tcp_sendrecv_http_port(realmd_t) ++corenet_tcp_connect_ldap_port(realmd_t) ++corenet_tcp_connect_smbd_port(realmd_t) + + domain_use_interactive_fds(realmd_t) + + dev_read_rand(realmd_t) + dev_read_urand(realmd_t) + +-fs_getattr_all_fs(realmd_t) ++files_manage_etc_files(realmd_t) + +-files_read_usr_files(realmd_t) ++fs_getattr_all_fs(realmd_t) + + auth_use_nsswitch(realmd_t) + ++init_filetrans_named_content(realmd_t) ++ ++logging_manage_generic_logs(realmd_t) + logging_send_syslog_msg(realmd_t) + ++miscfiles_manage_generic_cert_files(realmd_t) ++ ++seutil_domtrans_setfiles(realmd_t) ++seutil_read_file_contexts(realmd_t) ++ ++sysnet_dns_name_resolve(realmd_t) ++systemd_exec_systemctl(realmd_t) ++ ++#userdom_admin_home_dir_filetrans(realmd_t, cache_home_t, dir, ".cache") ++#userdom_user_home_dir_filetrans(realmd_t, cache_home_t, dir, ".cache") ++ ++optional_policy(` ++ authconfig_domtrans(realmd_t) ++') ++ + optional_policy(` + dbus_system_domain(realmd_t, realmd_exec_t) + ++ optional_policy(` ++ certmonger_dbus_chat(realmd_t) ++ ') ++ + optional_policy(` + networkmanager_dbus_chat(realmd_t) + ') +@@ -63,21 +105,40 @@ optional_policy(` + optional_policy(` + kerberos_use(realmd_t) + kerberos_rw_keytab(realmd_t) ++ kerberos_rw_config(realmd_t) ++ kerberos_filetrans_named_content(realmd_t) ++') ++ ++optional_policy(` ++ ntp_domtrans_ntpdate(realmd_t) ++') ++ ++optional_policy(` ++ ssh_domtrans(realmd_t) ++ ssh_systemctl(realmd_t) + ') + + optional_policy(` + nis_exec_ypbind(realmd_t) +- nis_initrc_domtrans(realmd_t) ++ nis_systemctl_ypbind(realmd_t) + ') + + optional_policy(` +- gnome_read_generic_home_content(realmd_t) ++ gnome_read_config(realmd_t) ++ gnome_read_generic_cache_files(realmd_t) ++ gnome_write_generic_cache_files(realmd_t) ++ gnome_manage_cache_home_dir(realmd_t) ++ + ') + + optional_policy(` + samba_domtrans_net(realmd_t) + samba_manage_config(realmd_t) +- samba_getattr_winbind_exec(realmd_t) ++ samba_getattr_winbind(realmd_t) ++') ++ ++optional_policy(` ++ rpm_dbus_chat(realmd_t) + ') + + optional_policy(` +@@ -86,5 +147,27 @@ optional_policy(` + sssd_manage_lib_files(realmd_t) + sssd_manage_public_files(realmd_t) + sssd_read_pid_files(realmd_t) +- sssd_initrc_domtrans(realmd_t) ++ sssd_systemctl(realmd_t) ++') ++ ++optional_policy(` ++ xserver_read_state_xdm(realmd_t) ++') ++ ++optional_policy(` ++ unconfined_domain(realmd_t) ++') ++ ++##################################### ++# ++# realmd consolehelper local policy ++# ++ ++optional_policy(` ++ userhelper_console_role_template(realmd, system_r, realmd_t) ++ authconfig_manage_lib_files(realmd_consolehelper_t) ++ ++ oddjob_systemctl(realmd_consolehelper_t) ++ ++ unconfined_domain_noaudit(realmd_consolehelper_t) + ') +diff --git a/redis.fc b/redis.fc +index e240ac99cc..83edd1be24 100644 +--- a/redis.fc ++++ b/redis.fc +@@ -1,9 +1,16 @@ + /etc/rc\.d/init\.d/redis -- gen_context(system_u:object_r:redis_initrc_exec_t,s0) + +-/usr/sbin/redis-server -- gen_context(system_u:object_r:redis_exec_t,s0) ++/etc/redis-sentinel.* -- gen_context(system_u:object_r:redis_conf_t,s0) + +-/var/lib/redis(/.*)? gen_context(system_u:object_r:redis_var_lib_t,s0) ++/usr/lib/systemd/system/redis.* -- gen_context(system_u:object_r:redis_unit_file_t,s0) + +-/var/log/redis(/.*)? gen_context(system_u:object_r:redis_log_t,s0) ++/usr/bin/redis-server -- gen_context(system_u:object_r:redis_exec_t,s0) + +-/var/run/redis(/.*)? gen_context(system_u:object_r:redis_var_run_t,s0) ++/var/lib/redis(/.*)? gen_context(system_u:object_r:redis_var_lib_t,s0) ++ ++/var/log/redis(/.*)? gen_context(system_u:object_r:redis_log_t,s0) ++ ++/var/run/redis(/.*)? gen_context(system_u:object_r:redis_var_run_t,s0) ++ ++ ++/var/opt/rh/rh-redis32/redis(/.*)? -- gen_context(system_u:object_r:redis_exec_t,s0) +diff --git a/redis.if b/redis.if +index 16c8ecbe3d..4e021eca71 100644 +--- a/redis.if ++++ b/redis.if +@@ -1,9 +1,225 @@ +-## Advanced key-value store. ++## Advanced key-value store + + ######################################## + ## +-## All of the rules required to +-## administrate an redis environment. ++## Execute redis server in the redis domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`redis_domtrans',` ++ gen_require(` ++ type redis_t, redis_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, redis_exec_t, redis_t) ++') ++ ++######################################## ++## ++## Execute redis server in the redis domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_initrc_domtrans',` ++ gen_require(` ++ type redis_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, redis_initrc_exec_t) ++') ++ ++######################################## ++## ++## Read redis's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_read_log',` ++ gen_require(` ++ type redis_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, redis_log_t, redis_log_t) ++') ++ ++######################################## ++## ++## Append to redis log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_append_log',` ++ gen_require(` ++ type redis_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, redis_log_t, redis_log_t) ++') ++ ++######################################## ++## ++## Manage redis log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_manage_log',` ++ gen_require(` ++ type redis_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, redis_log_t, redis_log_t) ++ manage_files_pattern($1, redis_log_t, redis_log_t) ++ manage_lnk_files_pattern($1, redis_log_t, redis_log_t) ++') ++ ++######################################## ++## ++## Search redis lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_search_lib',` ++ gen_require(` ++ type redis_var_lib_t; ++ ') ++ ++ allow $1 redis_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read redis lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_read_lib_files',` ++ gen_require(` ++ type redis_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, redis_var_lib_t, redis_var_lib_t) ++') ++ ++######################################## ++## ++## Manage redis lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_manage_lib_files',` ++ gen_require(` ++ type redis_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, redis_var_lib_t, redis_var_lib_t) ++') ++ ++######################################## ++## ++## Manage redis lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_manage_lib_dirs',` ++ gen_require(` ++ type redis_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, redis_var_lib_t, redis_var_lib_t) ++') ++ ++######################################## ++## ++## Read redis PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`redis_read_pid_files',` ++ gen_require(` ++ type redis_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, redis_var_run_t, redis_var_run_t) ++') ++ ++######################################## ++## ++## Execute redis server in the redis domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`redis_systemctl',` ++ gen_require(` ++ type redis_t; ++ type redis_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 redis_unit_file_t:file read_file_perms; ++ allow $1 redis_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, redis_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an redis environment + ## + ## + ## +@@ -20,7 +236,7 @@ + interface(`redis_admin',` + gen_require(` + type redis_t, redis_initrc_exec_t, redis_var_lib_t; +- type redis_log_t, redis_var_run_t; ++ type redis_log_t, redis_var_run_t, redis_unit_file_t; + ') + + allow $1 redis_t:process { ptrace signal_perms }; +@@ -32,11 +248,20 @@ interface(`redis_admin',` + allow $2 system_r; + + logging_search_logs($1) +- admin_pattern($!, redis_log_t) ++ admin_pattern($1, redis_log_t) + + files_search_var_lib($1) + admin_pattern($1, redis_var_lib_t) + + files_search_pids($1) + admin_pattern($1, redis_var_run_t) ++ ++ redis_systemctl($1) ++ admin_pattern($1, redis_unit_file_t) ++ allow $1 redis_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/redis.te b/redis.te +index 25cd4175fe..bbf421ec39 100644 +--- a/redis.te ++++ b/redis.te +@@ -5,6 +5,13 @@ policy_module(redis, 1.0.1) + # Declarations + # + ++## ++##

      ++## Allow Redis to run redis-sentinal notification scripts. ++##

      ++##
      ++gen_tunable(redis_enable_notify, false) ++ + type redis_t; + type redis_exec_t; + init_daemon_domain(redis_t, redis_exec_t) +@@ -12,6 +19,9 @@ init_daemon_domain(redis_t, redis_exec_t) + type redis_initrc_exec_t; + init_script_file(redis_initrc_exec_t) + ++type redis_conf_t; ++files_config_file(redis_conf_t) ++ + type redis_log_t; + logging_log_file(redis_log_t) + +@@ -21,6 +31,12 @@ files_type(redis_var_lib_t) + type redis_var_run_t; + files_pid_file(redis_var_run_t) + ++type redis_tmp_t; ++files_tmp_file(redis_tmp_t) ++ ++type redis_unit_file_t; ++systemd_unit_file(redis_unit_file_t) ++ + ######################################## + # + # Local policy +@@ -31,6 +47,8 @@ allow redis_t self:fifo_file rw_fifo_file_perms; + allow redis_t self:unix_stream_socket create_stream_socket_perms; + allow redis_t self:tcp_socket create_stream_socket_perms; + ++manage_files_pattern(redis_t, redis_conf_t, redis_conf_t) ++ + manage_dirs_pattern(redis_t, redis_log_t, redis_log_t) + manage_files_pattern(redis_t, redis_log_t, redis_log_t) + manage_lnk_files_pattern(redis_t, redis_log_t, redis_log_t) +@@ -42,14 +60,22 @@ manage_lnk_files_pattern(redis_t, redis_var_lib_t, redis_var_lib_t) + manage_dirs_pattern(redis_t, redis_var_run_t, redis_var_run_t) + manage_files_pattern(redis_t, redis_var_run_t, redis_var_run_t) + manage_lnk_files_pattern(redis_t, redis_var_run_t, redis_var_run_t) ++manage_sock_files_pattern(redis_t, redis_var_run_t, redis_var_run_t) ++ ++ ++manage_dirs_pattern(redis_t, redis_tmp_t, redis_tmp_t) ++manage_files_pattern(redis_t, redis_tmp_t, redis_tmp_t) ++files_tmp_filetrans(redis_t, redis_tmp_t, { dir file }) + + kernel_read_system_state(redis_t) ++kernel_read_net_sysctls(redis_t) + + corenet_all_recvfrom_unlabeled(redis_t) + corenet_all_recvfrom_netlabel(redis_t) + corenet_tcp_sendrecv_generic_if(redis_t) + corenet_tcp_sendrecv_generic_node(redis_t) + corenet_tcp_bind_generic_node(redis_t) ++corenet_tcp_connect_redis_port(redis_t) + + corenet_sendrecv_redis_server_packets(redis_t) + corenet_tcp_bind_redis_port(redis_t) +@@ -60,6 +86,28 @@ dev_read_urand(redis_t) + + logging_send_syslog_msg(redis_t) + +-miscfiles_read_localization(redis_t) +- + sysnet_dns_name_resolve(redis_t) ++ ++tunable_policy(`redis_enable_notify',` ++ # allow httpd to connect to mail servers ++ corenet_tcp_connect_smtp_port(redis_t) ++ corenet_sendrecv_smtp_client_packets(redis_t) ++ corenet_tcp_connect_pop_port(redis_t) ++ corenet_sendrecv_pop_client_packets(redis_t) ++ ++ corecmd_exec_bin(redis_t) ++ corecmd_exec_shell(redis_t) ++') ++ ++optional_policy(` ++ tunable_policy(`redis_enable_notify',` ++ mta_send_mail(redis_t) ++ mta_signal_system_mail(redis_t) ++ ') ++') ++ ++optional_policy(` ++ tunable_policy(`redis_enable_notify',` ++ postfix_rw_spool_maildrop_files(redis_t) ++ ') ++') +diff --git a/remotelogin.fc b/remotelogin.fc +index 327baf059e..d8691bd142 100644 +--- a/remotelogin.fc ++++ b/remotelogin.fc +@@ -1 +1,2 @@ ++ + # Remote login currently has no file contexts. +diff --git a/remotelogin.if b/remotelogin.if +index a9ce68e339..92520aa921 100644 +--- a/remotelogin.if ++++ b/remotelogin.if +@@ -1,4 +1,4 @@ +-## Rshd, rlogind, and telnetd. ++## Policy for rshd, rlogind, and telnetd. + + ######################################## + ## +@@ -15,13 +15,12 @@ interface(`remotelogin_domtrans',` + type remote_login_t; + ') + +- corecmd_search_bin($1) + auth_domtrans_login_program($1, remote_login_t) + ') + + ######################################## + ## +-## Send generic signals to remote login. ++## allow Domain to signal remote login domain. + ## + ## + ## +@@ -39,8 +38,7 @@ interface(`remotelogin_signal',` + + ######################################## + ## +-## Create, read, write, and delete +-## remote login temporary content. ++## allow Domain to signal remote login domain. + ## + ## + ## +@@ -48,32 +46,10 @@ interface(`remotelogin_signal',` + ## + ## + # +-interface(`remotelogin_manage_tmp_content',` ++interface(`remotelogin_signull',` + gen_require(` +- type remote_login_tmp_t; +- ') +- +- files_search_tmp($1) +- allow $1 remote_login_tmp_t:dir manage_dir_perms; +- allow $1 remote_login_tmp_t:file manage_file_perms; +-') +- +-######################################## +-## +-## Relabel remote login temporary content. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`remotelogin_relabel_tmp_content',` +- gen_require(` +- type remote_login_tmp_t; ++ type remote_login_t; + ') + +- files_search_tmp($1) +- allow $1 remote_login_tmp_t:dir relabel_dir_perms; +- allow $1 remote_login_tmp_t:file relabel_file_perms; ++ allow $1 remote_login_t:process signull; + ') +diff --git a/remotelogin.te b/remotelogin.te +index ae308717f5..15a669cd42 100644 +--- a/remotelogin.te ++++ b/remotelogin.te +@@ -10,81 +10,89 @@ domain_interactive_fd(remote_login_t) + auth_login_pgm_domain(remote_login_t) + auth_login_entry_type(remote_login_t) + +-type remote_login_tmp_t; +-files_tmp_file(remote_login_tmp_t) +- + ######################################## + # +-# Local policy ++# Remote login remote policy + # + +-allow remote_login_t self:capability { dac_override chown fowner fsetid kill setgid setuid net_bind_service sys_nice sys_resource sys_tty_config }; ++allow remote_login_t self:capability { dac_read_search dac_read_search dac_override chown fowner fsetid kill setgid setuid net_bind_service sys_nice sys_resource sys_tty_config }; + allow remote_login_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow remote_login_t self:process { setrlimit setexec }; + allow remote_login_t self:fd use; + allow remote_login_t self:fifo_file rw_fifo_file_perms; ++allow remote_login_t self:sock_file read_sock_file_perms; ++allow remote_login_t self:unix_dgram_socket create_socket_perms; ++allow remote_login_t self:unix_stream_socket create_stream_socket_perms; + allow remote_login_t self:unix_dgram_socket sendto; +-allow remote_login_t self:unix_stream_socket { accept connectto listen }; +- +-manage_dirs_pattern(remote_login_t, remote_login_tmp_t, remote_login_tmp_t) +-manage_files_pattern(remote_login_t, remote_login_tmp_t, remote_login_tmp_t) +-files_tmp_filetrans(remote_login_t, remote_login_tmp_t, { file dir }) ++allow remote_login_t self:unix_stream_socket connectto; ++allow remote_login_t self:shm create_shm_perms; ++allow remote_login_t self:sem create_sem_perms; ++allow remote_login_t self:msgq create_msgq_perms; ++allow remote_login_t self:msg { send receive }; ++allow remote_login_t self:key write; + + kernel_read_system_state(remote_login_t) + kernel_read_kernel_sysctls(remote_login_t) + + dev_getattr_mouse_dev(remote_login_t) + dev_setattr_mouse_dev(remote_login_t) ++dev_dontaudit_search_sysfs(remote_login_t) + + fs_getattr_xattr_fs(remote_login_t) ++fs_search_auto_mountpoints(remote_login_t) + + term_relabel_all_ptys(remote_login_t) + term_use_all_ptys(remote_login_t) + term_setattr_all_ptys(remote_login_t) + +-auth_manage_pam_console_data(remote_login_t) +-auth_domtrans_pam_console(remote_login_t) + auth_rw_login_records(remote_login_t) + auth_rw_faillog(remote_login_t) ++auth_manage_pam_console_data(remote_login_t) ++auth_domtrans_pam_console(remote_login_t) + + corecmd_list_bin(remote_login_t) + corecmd_read_bin_symlinks(remote_login_t) ++# cjp: these are probably not needed: ++corecmd_read_bin_files(remote_login_t) ++corecmd_read_bin_pipes(remote_login_t) ++corecmd_read_bin_sockets(remote_login_t) + + domain_read_all_entry_files(remote_login_t) + + files_read_etc_runtime_files(remote_login_t) + files_list_home(remote_login_t) +-files_read_usr_files(remote_login_t) + files_list_world_readable(remote_login_t) + files_read_world_readable_files(remote_login_t) + files_read_world_readable_symlinks(remote_login_t) + files_read_world_readable_pipes(remote_login_t) + files_read_world_readable_sockets(remote_login_t) + files_list_mnt(remote_login_t) ++# for when /var/mail is a sym-link + files_read_var_symlinks(remote_login_t) + +-miscfiles_read_localization(remote_login_t) ++auth_use_nsswitch(remote_login_t) ++ + + userdom_use_unpriv_users_fds(remote_login_t) + userdom_search_user_home_content(remote_login_t) ++# Only permit unprivileged user domains to be entered via rlogin, ++# since very weak authentication is used. + userdom_signal_unpriv_users(remote_login_t) + userdom_spec_domtrans_unpriv_users(remote_login_t) ++userdom_use_user_ptys(remote_login_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(remote_login_t) +- fs_read_nfs_symlinks(remote_login_t) +-') ++userdom_manage_user_tmp_dirs(remote_login_t) ++userdom_manage_user_tmp_files(remote_login_t) ++userdom_tmp_filetrans_user_tmp(remote_login_t, { file dir }) + +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(remote_login_t) +- fs_read_cifs_symlinks(remote_login_t) +-') ++userdom_home_reader(remote_login_t) + + optional_policy(` + alsa_domtrans(remote_login_t) + ') + + optional_policy(` ++ # Search for mail spool file. + mta_getattr_spool(remote_login_t) + ') + +diff --git a/resmgr.te b/resmgr.te +index f6eb358ad3..b6319191cf 100644 +--- a/resmgr.te ++++ b/resmgr.te +@@ -23,7 +23,7 @@ files_pid_file(resmgrd_var_run_t) + # Local policy + # + +-allow resmgrd_t self:capability { dac_override sys_admin sys_rawio }; ++allow resmgrd_t self:capability { dac_read_search dac_override sys_admin sys_rawio }; + dontaudit resmgrd_t self:capability sys_tty_config; + allow resmgrd_t self:process signal_perms; + +@@ -42,7 +42,6 @@ dev_getattr_scanner_dev(resmgrd_t) + + domain_use_interactive_fds(resmgrd_t) + +-files_read_etc_files(resmgrd_t) + + fs_search_auto_mountpoints(resmgrd_t) + +@@ -54,8 +53,6 @@ storage_write_scsi_generic(resmgrd_t) + + logging_send_syslog_msg(resmgrd_t) + +-miscfiles_read_localization(resmgrd_t) +- + userdom_dontaudit_use_unpriv_user_fds(resmgrd_t) + + optional_policy(` +diff --git a/rgmanager.fc b/rgmanager.fc +index 5421af0b68..91e69b8690 100644 +--- a/rgmanager.fc ++++ b/rgmanager.fc +@@ -1,12 +1,22 @@ +-/etc/rc\.d/init\.d/rgmanager -- gen_context(system_u:object_r:rgmanager_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/cpglockd -- gen_context(system_u:object_r:rgmanager_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/rgmanager -- gen_context(system_u:object_r:rgmanager_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/heartbeat -- gen_context(system_u:object_r:rgmanager_initrc_exec_t,s0) + +-/usr/sbin/rgmanager -- gen_context(system_u:object_r:rgmanager_exec_t,s0) ++/usr/sbin/cpglockd -- gen_context(system_u:object_r:rgmanager_exec_t,s0) ++/usr/sbin/rgmanager -- gen_context(system_u:object_r:rgmanager_exec_t,s0) + +-/usr/sbin/ccs_tool -- gen_context(system_u:object_r:rgmanager_exec_t,s0) +-/usr/sbin/cman_tool -- gen_context(system_u:object_r:rgmanager_exec_t,s0) ++/usr/sbin/ccs_tool -- gen_context(system_u:object_r:rgmanager_exec_t,s0) ++/usr/sbin/cman_tool -- gen_context(system_u:object_r:rgmanager_exec_t,s0) + +-/var/log/cluster/rgmanager\.log.* -- gen_context(system_u:object_r:rgmanager_var_log_t,s0) ++/usr/lib/heartbeat(/.*)? gen_context(system_u:object_r:rgmanager_var_lib_t,s0) ++/usr/lib/heartbeat/heartbeat -- gen_context(system_u:object_r:rgmanager_exec_t,s0) ++/var/lib/heartbeat(/.*)? gen_context(system_u:object_r:rgmanager_var_lib_t,s0) + +-/var/run/cluster/rgmanager\.sk -s gen_context(system_u:object_r:rgmanager_var_run_t,s0) ++/var/log/cluster/cpglockd\.log.* -- gen_context(system_u:object_r:rgmanager_var_log_t,s0) ++/var/log/cluster/rgmanager\.log.* -- gen_context(system_u:object_r:rgmanager_var_log_t,s0) + +-/var/run/rgmanager\.pid -- gen_context(system_u:object_r:rgmanager_var_run_t,s0) ++/var/run/cluster/rgmanager\.sk -s gen_context(system_u:object_r:rgmanager_var_run_t,s0) ++ ++/var/run/cpglockd\.pid -- gen_context(system_u:object_r:rgmanager_var_run_t,s0) ++/var/run/heartbeat(/.*)? gen_context(system_u:object_r:rgmanager_var_run_t,s0) ++/var/run/rgmanager\.pid -- gen_context(system_u:object_r:rgmanager_var_run_t,s0) +diff --git a/rgmanager.if b/rgmanager.if +index 1c2f9aa127..a4133dc921 100644 +--- a/rgmanager.if ++++ b/rgmanager.if +@@ -1,13 +1,13 @@ +-## Resource Group Manager. ++## rgmanager - Resource Group Manager + + ####################################### + ## + ## Execute a domain transition to run rgmanager. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`rgmanager_domtrans',` +@@ -21,8 +21,7 @@ interface(`rgmanager_domtrans',` + + ######################################## + ## +-## Connect to rgmanager with a unix +-## domain stream socket. ++## Connect to rgmanager over a unix stream socket. + ## + ## + ## +@@ -39,10 +38,28 @@ interface(`rgmanager_stream_connect',` + stream_connect_pattern($1, rgmanager_var_run_t, rgmanager_var_run_t, rgmanager_t) + ') + ++######################################## ++## ++## Manage rgmanager pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rgmanager_manage_pid_files',` ++ gen_require(` ++ type rgmanager_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, rgmanager_var_run_t, rgmanager_var_run_t) ++') ++ + ###################################### + ## +-## Create, read, write, and delete +-## rgmanager tmp files. ++## Allow manage rgmanager tmp files. + ## + ## + ## +@@ -61,8 +78,7 @@ interface(`rgmanager_manage_tmp_files',` + + ###################################### + ## +-## Create, read, write, and delete +-## rgmanager tmpfs files. ++## Allow manage rgmanager tmpfs files. + ## + ## + ## +@@ -79,10 +95,28 @@ interface(`rgmanager_manage_tmpfs_files',` + manage_files_pattern($1, rgmanager_tmpfs_t, rgmanager_tmpfs_t) + ') + ++####################################### ++## ++## Allow read and write access to rgmanager semaphores. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rgmanager_rw_semaphores',` ++ gen_require(` ++ type rgmanager_t; ++ ') ++ ++ allow $1 rgmanager_t:sem rw_sem_perms; ++') ++ + ###################################### + ## +-## All of the rules required to +-## administrate an rgmanager environment. ++## All of the rules required to administrate ++## an rgmanager environment + ## + ## + ## +@@ -91,7 +125,7 @@ interface(`rgmanager_manage_tmpfs_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the rgmanager domain. + ## + ## + ## +@@ -102,8 +136,11 @@ interface(`rgmanager_admin',` + type rgmanager_tmpfs_t, rgmanager_var_log_t, rgmanager_var_run_t; + ') + +- allow $1 rgmanager_t:process { ptrace signal_perms }; ++ allow $1 rgmanager_t:process signal_perms; + ps_process_pattern($1, rgmanager_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rgmanager_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, rgmanager_initrc_exec_t) + domain_system_change_exemption($1) +@@ -121,3 +158,66 @@ interface(`rgmanager_admin',` + files_list_pids($1) + admin_pattern($1, rgmanager_var_run_t) + ') ++ ++ ++###################################### ++## ++## Allow the specified domain to manage rgmanager's lib/run files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rgmanager_manage_files',` ++ gen_require(` ++ type rgmanager_var_lib_t; ++ type rgmanager_var_run_t; ++ ') ++ ++ files_list_var_lib($1) ++ admin_pattern($1, rgmanager_var_lib_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, rgmanager_var_run_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to execute rgmanager's lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rgmanager_execute_lib',` ++ gen_require(` ++ type rgmanager_var_lib_t; ++ ') ++ ++ files_list_var_lib($1) ++ allow $1 rgmanager_var_lib_t:dir search_dir_perms; ++ can_exec($1, rgmanager_var_lib_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to search rgmanager's lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rgmanager_search_lib',` ++ gen_require(` ++ type rgmanager_var_lib_t; ++ ') ++ ++ files_list_var_lib($1) ++ allow $1 rgmanager_var_lib_t:dir search_dir_perms; ++') +diff --git a/rgmanager.te b/rgmanager.te +index c8a1e16e45..f9d6fb3412 100644 +--- a/rgmanager.te ++++ b/rgmanager.te +@@ -6,10 +6,9 @@ policy_module(rgmanager, 1.3.0) + # + + ## +-##

      +-## Determine whether rgmanager can +-## connect to the network using TCP. +-##

      ++##

      ++## Allow rgmanager domain to connect to the network using TCP. ++##

      + ##
      + gen_tunable(rgmanager_can_network_connect, false) + +@@ -26,6 +25,9 @@ files_tmp_file(rgmanager_tmp_t) + type rgmanager_tmpfs_t; + files_tmpfs_file(rgmanager_tmpfs_t) + ++type rgmanager_var_lib_t; ++files_type(rgmanager_var_lib_t) ++ + type rgmanager_var_log_t; + logging_log_file(rgmanager_var_log_t) + +@@ -34,14 +36,16 @@ files_pid_file(rgmanager_var_run_t) + + ######################################## + # +-# Local policy ++# rgmanager local policy + # + +-allow rgmanager_t self:capability { dac_override net_raw sys_resource sys_admin sys_nice ipc_lock }; ++allow rgmanager_t self:capability { dac_read_search dac_override net_raw sys_resource sys_admin sys_nice ipc_lock }; + allow rgmanager_t self:process { setsched signal }; ++ + allow rgmanager_t self:fifo_file rw_fifo_file_perms; +-allow rgmanager_t self:unix_stream_socket { accept listen }; +-allow rgmanager_t self:tcp_socket { accept listen }; ++allow rgmanager_t self:unix_stream_socket { create_stream_socket_perms }; ++allow rgmanager_t self:unix_dgram_socket create_socket_perms; ++allow rgmanager_t self:tcp_socket create_stream_socket_perms; + + manage_dirs_pattern(rgmanager_t, rgmanager_tmp_t, rgmanager_tmp_t) + manage_files_pattern(rgmanager_t, rgmanager_tmp_t, rgmanager_tmp_t) +@@ -51,77 +55,93 @@ manage_dirs_pattern(rgmanager_t, rgmanager_tmpfs_t, rgmanager_tmpfs_t) + manage_files_pattern(rgmanager_t, rgmanager_tmpfs_t, rgmanager_tmpfs_t) + fs_tmpfs_filetrans(rgmanager_t, rgmanager_tmpfs_t, { dir file }) + +-allow rgmanager_t rgmanager_var_log_t:file { append_file_perms create_file_perms setattr_file_perms }; +-logging_log_filetrans(rgmanager_t, rgmanager_var_log_t, file) ++# var/lib files ++# # needed by hearbeat ++can_exec(rgmanager_t, rgmanager_var_lib_t) ++manage_files_pattern(rgmanager_t, rgmanager_var_lib_t,rgmanager_var_lib_t) ++manage_dirs_pattern(rgmanager_t, rgmanager_var_lib_t,rgmanager_var_lib_t) ++manage_sock_files_pattern(rgmanager_t, rgmanager_var_lib_t,rgmanager_var_lib_t) ++manage_fifo_files_pattern(rgmanager_t, rgmanager_var_lib_t,rgmanager_var_lib_t) ++files_var_lib_filetrans(rgmanager_t,rgmanager_var_lib_t, { file dir fifo_file sock_file }) ++ ++ ++manage_files_pattern(rgmanager_t, rgmanager_var_log_t, rgmanager_var_log_t) ++logging_log_filetrans(rgmanager_t, rgmanager_var_log_t, { file }) + ++manage_dirs_pattern(rgmanager_t, rgmanager_var_run_t, rgmanager_var_run_t) + manage_files_pattern(rgmanager_t, rgmanager_var_run_t, rgmanager_var_run_t) + manage_sock_files_pattern(rgmanager_t, rgmanager_var_run_t, rgmanager_var_run_t) +-files_pid_filetrans(rgmanager_t, rgmanager_var_run_t, { file sock_file }) ++files_pid_filetrans(rgmanager_t, rgmanager_var_run_t, { file sock_file dir }) + ++kernel_kill(rgmanager_t) + kernel_read_kernel_sysctls(rgmanager_t) ++kernel_read_rpc_sysctls(rgmanager_t) + kernel_read_system_state(rgmanager_t) + kernel_rw_rpc_sysctls(rgmanager_t) + kernel_search_debugfs(rgmanager_t) + kernel_search_network_state(rgmanager_t) + +-corenet_all_recvfrom_unlabeled(rgmanager_t) +-corenet_all_recvfrom_netlabel(rgmanager_t) +-corenet_tcp_sendrecv_generic_if(rgmanager_t) +-corenet_tcp_sendrecv_generic_node(rgmanager_t) +- + corecmd_exec_bin(rgmanager_t) + corecmd_exec_shell(rgmanager_t) + ++# need to write to /dev/misc/dlm-control + dev_rw_dlm_control(rgmanager_t) + dev_setattr_dlm_control(rgmanager_t) + dev_search_sysfs(rgmanager_t) + + domain_read_all_domains_state(rgmanager_t) + domain_getattr_all_domains(rgmanager_t) +-domain_dontaudit_ptrace_all_domains(rgmanager_t) + +-files_list_all(rgmanager_t) ++files_create_var_run_dirs(rgmanager_t) + files_getattr_all_symlinks(rgmanager_t) ++files_list_all(rgmanager_t) + files_manage_mnt_dirs(rgmanager_t) ++files_manage_mnt_files(rgmanager_t) ++files_manage_mnt_symlinks(rgmanager_t) ++files_manage_isid_type_files(rgmanager_t) + files_manage_isid_type_dirs(rgmanager_t) +-files_read_non_security_files(rgmanager_t) + ++fs_getattr_xattr_fs(rgmanager_t) + fs_getattr_all_fs(rgmanager_t) + + storage_raw_read_fixed_disk(rgmanager_t) ++storage_getattr_fixed_disk_dev(rgmanager_t) + + term_getattr_pty_fs(rgmanager_t) + ++# needed by resources scripts ++files_read_non_security_files(rgmanager_t) + auth_dontaudit_getattr_shadow(rgmanager_t) + auth_use_nsswitch(rgmanager_t) + + init_domtrans_script(rgmanager_t) ++init_initrc_domain(rgmanager_t) + + logging_send_syslog_msg(rgmanager_t) + +-miscfiles_read_localization(rgmanager_t) ++userdom_kill_all_users(rgmanager_t) + + tunable_policy(`rgmanager_can_network_connect',` +- corenet_sendrecv_all_client_packets(rgmanager_t) + corenet_tcp_connect_all_ports(rgmanager_t) +- corenet_tcp_sendrecv_all_ports(rgmanager_t) + ') + ++# rgmanager can run resource scripts + optional_policy(` + aisexec_stream_connect(rgmanager_t) ++ corosync_stream_connect(rgmanager_t) + ') + + optional_policy(` +- consoletype_exec(rgmanager_t) ++ apache_domtrans(rgmanager_t) ++ apache_signal(rgmanager_t) + ') + + optional_policy(` +- corosync_stream_connect(rgmanager_t) ++ consoletype_exec(rgmanager_t) + ') + + optional_policy(` +- apache_domtrans(rgmanager_t) +- apache_signal(rgmanager_t) ++ dbus_system_bus_client(rgmanager_t) + ') + + optional_policy(` +@@ -130,7 +150,6 @@ optional_policy(` + + optional_policy(` + rhcs_stream_connect_groupd(rgmanager_t) +- rhcs_stream_connect_gfs_controld(rgmanager_t) + ') + + optional_policy(` +@@ -140,12 +159,19 @@ optional_policy(` + optional_policy(` + ccs_manage_config(rgmanager_t) + ccs_stream_connect(rgmanager_t) ++ rhcs_stream_connect_gfs_controld(rgmanager_t) + ') + + optional_policy(` + lvm_domtrans(rgmanager_t) + ') + ++optional_policy(` ++ ldap_initrc_domtrans(rgmanager_t) ++ ldap_systemctl(rgmanager_t) ++ ldap_domtrans(rgmanager_t) ++') ++ + optional_policy(` + mount_domtrans(rgmanager_t) + ') +@@ -174,12 +200,18 @@ optional_policy(` + ') + + optional_policy(` ++ rpc_initrc_domtrans_nfsd(rgmanager_t) ++ rpc_initrc_domtrans_rpcd(rgmanager_t) ++ rpc_systemctl_nfsd(rgmanager_t) ++ rpc_systemctl_rpcd(rgmanager_t) ++ + rpc_domtrans_nfsd(rgmanager_t) + rpc_domtrans_rpcd(rgmanager_t) + rpc_manage_nfs_state_data(rgmanager_t) + ') + + optional_policy(` ++ samba_initrc_domtrans(rgmanager_t) + samba_domtrans_smbd(rgmanager_t) + samba_domtrans_nmbd(rgmanager_t) + samba_manage_var_files(rgmanager_t) +@@ -200,6 +232,10 @@ optional_policy(` + virt_stream_connect(rgmanager_t) + ') + ++optional_policy(` ++ unconfined_domain(rgmanager_t) ++') ++ + optional_policy(` + xen_domtrans_xm(rgmanager_t) + ') +diff --git a/rhcs.fc b/rhcs.fc +index 47de2d6813..c06395f39b 100644 +--- a/rhcs.fc ++++ b/rhcs.fc +@@ -1,31 +1,107 @@ +-/etc/rc\.d/init\.d/dlm -- gen_context(system_u:object_r:dlm_controld_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/foghorn -- gen_context(system_u:object_r:foghorn_initrc_exec_t,s0) ++/usr/sbin/dlm_controld -- gen_context(system_u:object_r:dlm_controld_exec_t,s0) ++/usr/sbin/fenced -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/sbin/fence_node -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/sbin/fence_sanlockd -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/sbin/fence_tool -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/sbin/fence_virtd -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/sbin/gfs_controld -- gen_context(system_u:object_r:gfs_controld_exec_t,s0) ++/usr/sbin/foghorn -- gen_context(system_u:object_r:foghorn_exec_t,s0) ++/usr/sbin/groupd -- gen_context(system_u:object_r:groupd_exec_t,s0) ++/usr/sbin/haproxy -- gen_context(system_u:object_r:haproxy_exec_t,s0) ++/usr/sbin/haproxy-systemd-wrapper -- gen_context(system_u:object_r:haproxy_exec_t,s0) ++/usr/sbin/qdiskd -- gen_context(system_u:object_r:qdiskd_exec_t,s0) + +-/usr/sbin/dlm_controld -- gen_context(system_u:object_r:dlm_controld_exec_t,s0) +-/usr/sbin/fenced -- gen_context(system_u:object_r:fenced_exec_t,s0) +-/usr/sbin/fence_node -- gen_context(system_u:object_r:fenced_exec_t,s0) +-/usr/sbin/fence_tool -- gen_context(system_u:object_r:fenced_exec_t,s0) +-/usr/sbin/foghorn -- gen_context(system_u:object_r:foghorn_exec_t,s0) +-/usr/sbin/gfs_controld -- gen_context(system_u:object_r:gfs_controld_exec_t,s0) +-/usr/sbin/groupd -- gen_context(system_u:object_r:groupd_exec_t,s0) +-/usr/sbin/qdiskd -- gen_context(system_u:object_r:qdiskd_exec_t,s0) ++/usr/lib/systemd/system/haproxy.* -- gen_context(system_u:object_r:haproxy_unit_file_t,s0) + +-/var/lock/fence_manual\.lock -- gen_context(system_u:object_r:fenced_lock_t,s0) ++/var/lock/fence_manual\.lock -- gen_context(system_u:object_r:fenced_lock_t,s0) + +-/var/lib/qdiskd(/.*)? gen_context(system_u:object_r:qdiskd_var_lib_t,s0) ++/var/lib/cluster(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/haproxy(/.*)? gen_context(system_u:object_r:haproxy_var_lib_t,s0) ++/var/lib/qdiskd(/.*)? gen_context(system_u:object_r:qdiskd_var_lib_t,s0) + +-/var/log/cluster/.*\.*log <> ++/var/log/cluster/.*\.*log <> + /var/log/cluster/dlm_controld\.log.* -- gen_context(system_u:object_r:dlm_controld_var_log_t,s0) +-/var/log/cluster/fenced\.log.* -- gen_context(system_u:object_r:fenced_var_log_t,s0) ++/var/log/cluster/fenced\.log.* -- gen_context(system_u:object_r:fenced_var_log_t,s0) + /var/log/cluster/gfs_controld\.log.* -- gen_context(system_u:object_r:gfs_controld_var_log_t,s0) +-/var/log/cluster/qdiskd\.log.* -- gen_context(system_u:object_r:qdiskd_var_log_t,s0) +-/var/log/dlm_controld(/.*)? gen_context(system_u:object_r:dlm_controld_var_log_t,s0) ++/var/log/cluster/qdiskd\.log.* -- gen_context(system_u:object_r:qdiskd_var_log_t,s0) ++/var/log/dlm_controld(/.*)? gen_context(system_u:object_r:dlm_controld_var_log_t,s0) + + /var/run/cluster/fenced_override -- gen_context(system_u:object_r:fenced_var_run_t,s0) +-/var/run/cluster/fence_scsi.* -- gen_context(system_u:object_r:fenced_var_run_t,s0) +-/var/run/dlm_controld\.pid -- gen_context(system_u:object_r:dlm_controld_var_run_t,s0) +-/var/run/dlm_controld(/.*)? gen_context(system_u:object_r:dlm_controld_var_run_t,s0) +-/var/run/fenced\.pid -- gen_context(system_u:object_r:fenced_var_run_t,s0) +-/var/run/gfs_controld\.pid -- gen_context(system_u:object_r:gfs_controld_var_run_t,s0) +-/var/run/groupd\.pid -- gen_context(system_u:object_r:groupd_var_run_t,s0) +-/var/run/qdiskd\.pid -- gen_context(system_u:object_r:qdiskd_var_run_t,s0) ++/var/run/cluster/fence_scsi.* -- gen_context(system_u:object_r:fenced_var_run_t,s0) ++/var/run/cluster/mpath\.devices -- gen_context(system_u:object_r:fenced_var_run_t,s0) ++/var/run/dlm_controld\.pid -- gen_context(system_u:object_r:dlm_controld_var_run_t,s0) ++/var/run/dlm_controld(/.*)? gen_context(system_u:object_r:dlm_controld_var_run_t,s0) ++/var/run/fence.* gen_context(system_u:object_r:fenced_var_run_t,s0) ++/var/run/gfs_controld\.pid -- gen_context(system_u:object_r:gfs_controld_var_run_t,s0) ++/var/run/groupd\.pid -- gen_context(system_u:object_r:groupd_var_run_t,s0) ++/var/run/haproxy\.pid -- gen_context(system_u:object_r:haproxy_var_run_t,s0) ++/var/run/haproxy\.stat.* -- gen_context(system_u:object_r:haproxy_var_run_t,s0) ++/var/run/haproxy\.sock.* -s gen_context(system_u:object_r:haproxy_var_run_t,s0) ++/var/run/qdiskd\.pid -- gen_context(system_u:object_r:qdiskd_var_run_t,s0) ++ ++# cluster administrative domains file spec ++/etc/rc\.d/init\.d/openais -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/cpglockd -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/corosync -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/rgmanager -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/heartbeat -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/pacemaker -- gen_context(system_u:object_r:cluster_initrc_exec_t,s0) ++ ++/usr/lib/systemd/system/corosync.* -- gen_context(system_u:object_r:cluster_unit_file_t,s0) ++/usr/lib/systemd/system/corosync-qnetd.* -- gen_context(system_u:object_r:cluster_unit_file_t,s0) ++/usr/lib/systemd/system/corosync-qdevice.* -- gen_context(system_u:object_r:cluster_unit_file_t,s0) ++ ++/usr/lib/systemd/system/pacemaker.* -- gen_context(system_u:object_r:cluster_unit_file_t,s0) ++/usr/lib/systemd/system/pcsd.* -- gen_context(system_u:object_r:cluster_unit_file_t,s0) ++ ++/usr/sbin/aisexec -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/corosync -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/corosync-notifyd -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/bin/corosync-qnetd -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/cpglockd -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/ccs_tool -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/cman_tool -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/ldirectord -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/rgmanager -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/pacemakerd -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/sbin/pacemaker_remoted -- gen_context(system_u:object_r:cluster_exec_t,s0) ++ ++/usr/share/corosync/corosync -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/usr/share/corosync/corosync-qdevice -- gen_context(system_u:object_r:cluster_exec_t,s0) ++ ++/usr/share/cluster/fence_scsi_check\.pl -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/share/cluster/fence_scsi_check -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/share/cluster/fence_scsi_check_hardreboot -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/share/cluster/fence_mpath_check -- gen_context(system_u:object_r:fenced_exec_t,s0) ++/usr/share/cluster/fence_mpath_check_hardreboot -- gen_context(system_u:object_r:fenced_exec_t,s0) ++ ++/usr/lib/pcsd/pcsd -- gen_context(system_u:object_r:cluster_exec_t,s0) ++ ++/usr/lib/heartbeat(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/usr/lib/heartbeat/heartbeat -- gen_context(system_u:object_r:cluster_exec_t,s0) ++/var/lib/heartbeat(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/corosync(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/openais(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/pacemaker(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/pcsd(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++/var/lib/pengine(/.*)? gen_context(system_u:object_r:cluster_var_lib_t,s0) ++ ++/var/run/aisexec.* gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/cman_.* -s gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/cluster/rgmanager\.sk -s gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/cpglockd\.pid -- gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/corosync\.pid -- gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/crm(/.*)? gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/heartbeat(/.*)? gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/rgmanager\.pid -- gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/rsctmp(/.*)? gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/corosync-qdevice(/.*)? gen_context(system_u:object_r:cluster_var_run_t,s0) ++/var/run/corosync-qnetd(/.*)? gen_context(system_u:object_r:cluster_var_run_t,s0) ++ ++ ++/var/log/cluster/aisexec\.log.* -- gen_context(system_u:object_r:cluster_var_log_t,s0) ++/var/log/cluster/cpglockd\.log.* -- gen_context(system_u:object_r:cluster_var_log_t,s0) ++/var/log/cluster/corosync\.log.* -- gen_context(system_u:object_r:cluster_var_log_t,s0) ++/var/log/cluster/rgmanager\.log.* -- gen_context(system_u:object_r:cluster_var_log_t,s0) ++/var/log/pacemaker\.log.* -- gen_context(system_u:object_r:cluster_var_log_t,s0) ++/var/log/pcsd(/.*)? gen_context(system_u:object_r:cluster_var_log_t,s0) +diff --git a/rhcs.if b/rhcs.if +index c8bdea28d4..0f8b732c4c 100644 +--- a/rhcs.if ++++ b/rhcs.if +@@ -1,19 +1,19 @@ +-## Red Hat Cluster Suite. ++## RHCS - Red Hat Cluster Suite + + ####################################### + ## +-## The template to define a rhcs domain. ++## Creates types and rules for a basic ++## rhcs init daemon domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # + template(`rhcs_domain_template',` + gen_require(` +- attribute cluster_domain, cluster_pid, cluster_tmpfs; +- attribute cluster_log; ++ attribute cluster_domain, cluster_tmpfs, cluster_pid, cluster_log; + ') + + ############################## +@@ -43,11 +43,6 @@ template(`rhcs_domain_template',` + manage_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) + fs_tmpfs_filetrans($1_t, $1_tmpfs_t, { dir file }) + +- manage_dirs_pattern($1_t, $1_var_log_t, $1_var_log_t) +- append_files_pattern($1_t, $1_var_log_t, $1_var_log_t) +- create_files_pattern($1_t, $1_var_log_t, $1_var_log_t) +- setattr_files_pattern($1_t, $1_var_log_t, $1_var_log_t) +- manage_sock_files_pattern($1_t, $1_var_log_t, $1_var_log_t) + logging_log_filetrans($1_t, $1_var_log_t, { dir file sock_file }) + + manage_dirs_pattern($1_t, $1_var_run_t, $1_var_run_t) +@@ -56,20 +51,21 @@ template(`rhcs_domain_template',` + manage_sock_files_pattern($1_t, $1_var_run_t, $1_var_run_t) + files_pid_filetrans($1_t, $1_var_run_t, { dir file sock_file fifo_file }) + +- optional_policy(` +- dbus_system_bus_client($1_t) +- ') ++ kernel_read_system_state($1_t) ++ ++ auth_use_nsswitch($1_t) ++ ++ logging_send_syslog_msg($1_t) + ') + + ###################################### + ## +-## Execute a domain transition to +-## run dlm_controld. ++## Execute a domain transition to run dlm_controld. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`rhcs_domtrans_dlm_controld',` +@@ -83,8 +79,8 @@ interface(`rhcs_domtrans_dlm_controld',` + + ##################################### + ## +-## Get attributes of fenced +-## executable files. ++## Connect to dlm_controld over a unix domain ++## stream socket. + ## + ## + ## +@@ -92,18 +88,19 @@ interface(`rhcs_domtrans_dlm_controld',` + ## + ## + # +-interface(`rhcs_getattr_fenced_exec_files',` ++interface(`rhcs_stream_connect_dlm_controld',` + gen_require(` +- type fenced_exec_t; ++ type dlm_controld_t, dlm_controld_var_run_t; + ') + +- allow $1 fenced_exec_t:file getattr_file_perms; ++ files_search_pids($1) ++ stream_connect_pattern($1, dlm_controld_var_run_t, dlm_controld_var_run_t, dlm_controld_t) + ') + + ##################################### + ## +-## Connect to dlm_controld with a +-## unix domain stream socket. ++## Connect to haproxy over a unix domain ++## stream socket. + ## + ## + ## +@@ -111,18 +108,36 @@ interface(`rhcs_getattr_fenced_exec_files',` + ## + ## + # +-interface(`rhcs_stream_connect_dlm_controld',` ++interface(`rhcs_stream_connect_haproxy',` + gen_require(` +- type dlm_controld_t, dlm_controld_var_run_t; ++ type haproxy_t, haproxy_var_run_t; + ') + + files_search_pids($1) +- stream_connect_pattern($1, dlm_controld_var_run_t, dlm_controld_var_run_t, dlm_controld_t) ++ stream_connect_pattern($1, haproxy_var_run_t, haproxy_var_run_t, haproxy_t) ++') ++ ++######################################## ++## ++## Send a null signal to haproxy. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_signull_haproxy',` ++ gen_require(` ++ type haproxy_t; ++ ') ++ ++ allow $1 haproxy_t:process signull; + ') + + ##################################### + ## +-## Read and write dlm_controld semaphores. ++## Allow read and write access to dlm_controld semaphores. + ## + ## + ## +@@ -160,9 +175,27 @@ interface(`rhcs_domtrans_fenced',` + domtrans_pattern($1, fenced_exec_t, fenced_t) + ') + ++##################################### ++## ++## Allow a domain to getattr on fenced executable. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_getattr_fenced',` ++ gen_require(` ++ type fenced_t, fenced_exec_t; ++ ') ++ ++ allow $1 fenced_exec_t:file getattr; ++') ++ + ###################################### + ## +-## Read and write fenced semaphores. ++## Allow read and write access to fenced semaphores. + ## + ## + ## +@@ -181,10 +214,9 @@ interface(`rhcs_rw_fenced_semaphores',` + manage_files_pattern($1, fenced_tmpfs_t, fenced_tmpfs_t) + ') + +-#################################### ++###################################### + ## +-## Connect to all cluster domains +-## with a unix domain stream socket. ++## Read fenced PID files. + ## + ## + ## +@@ -192,19 +224,18 @@ interface(`rhcs_rw_fenced_semaphores',` + ## + ## + # +-interface(`rhcs_stream_connect_cluster',` ++interface(`rhcs_read_fenced_pid_files',` + gen_require(` +- attribute cluster_domain, cluster_pid; ++ type fenced_var_run_t; + ') + + files_search_pids($1) +- stream_connect_pattern($1, cluster_pid, cluster_pid, cluster_domain) ++ read_files_pattern($1, fenced_var_run_t, fenced_var_run_t) + ') + + ###################################### + ## +-## Connect to fenced with an unix +-## domain stream socket. ++## Connect to fenced over a unix domain stream socket. + ## + ## + ## +@@ -221,10 +252,28 @@ interface(`rhcs_stream_connect_fenced',` + stream_connect_pattern($1, fenced_var_run_t, fenced_var_run_t, fenced_t) + ') + ++###################################### ++## ++## Execute a domain transition to run fenced. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_domtrans_haproxy',` ++ gen_require(` ++ type haproxy_t, haproxy_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, haproxy_exec_t, haproxy_t) ++') ++ + ##################################### + ## +-## Execute a domain transition +-## to run gfs_controld. ++## Execute a domain transition to run gfs_controld. + ## + ## + ## +@@ -243,7 +292,7 @@ interface(`rhcs_domtrans_gfs_controld',` + + #################################### + ## +-## Read and write gfs_controld semaphores. ++## Allow read and write access to gfs_controld semaphores. + ## + ## + ## +@@ -264,7 +313,7 @@ interface(`rhcs_rw_gfs_controld_semaphores',` + + ######################################## + ## +-## Read and write gfs_controld_t shared memory. ++## Read and write to gfs_controld_t shared memory. + ## + ## + ## +@@ -285,8 +334,7 @@ interface(`rhcs_rw_gfs_controld_shm',` + + ##################################### + ## +-## Connect to gfs_controld_t with +-## a unix domain stream socket. ++## Connect to gfs_controld_t over a unix domain stream socket. + ## + ## + ## +@@ -324,8 +372,8 @@ interface(`rhcs_domtrans_groupd',` + + ##################################### + ## +-## Connect to groupd with a unix +-## domain stream socket. ++## Connect to groupd over a unix domain ++## stream socket. + ## + ## + ## +@@ -342,10 +390,51 @@ interface(`rhcs_stream_connect_groupd',` + stream_connect_pattern($1, groupd_var_run_t, groupd_var_run_t, groupd_t) + ') + ++##################################### ++## ++## Allow read and write access to groupd semaphores. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_rw_groupd_semaphores',` ++ gen_require(` ++ type groupd_t, groupd_tmpfs_t; ++ ') ++ ++ allow $1 groupd_t:sem { rw_sem_perms destroy }; ++ ++ fs_search_tmpfs($1) ++ manage_files_pattern($1, groupd_tmpfs_t, groupd_tmpfs_t) ++') ++ ++######################################## ++## ++## Read and write to group shared memory. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_rw_groupd_shm',` ++ gen_require(` ++ type groupd_t, groupd_tmpfs_t; ++ ') ++ ++ allow $1 groupd_t:shm { rw_shm_perms destroy }; ++ ++ fs_search_tmpfs($1) ++ manage_files_pattern($1, groupd_tmpfs_t, groupd_tmpfs_t) ++') ++ + ######################################## + ## +-## Read and write all cluster domains +-## shared memory. ++## Read and write to group shared memory. + ## + ## + ## +@@ -362,12 +451,12 @@ interface(`rhcs_rw_cluster_shm',` + + fs_search_tmpfs($1) + manage_files_pattern($1, cluster_tmpfs, cluster_tmpfs) ++ allow $1 cluster_tmpfs_t:file map; + ') + + #################################### + ## +-## Read and write all cluster +-## domains semaphores. ++## Read and write access to cluster domains semaphores. + ## + ## + ## +@@ -383,9 +472,10 @@ interface(`rhcs_rw_cluster_semaphores',` + allow $1 cluster_domain:sem { rw_sem_perms destroy }; + ') + +-##################################### ++#################################### + ## +-## Read and write groupd semaphores. ++## Connect to cluster domains over a unix domain ++## stream socket. + ## + ## + ## +@@ -393,20 +483,44 @@ interface(`rhcs_rw_cluster_semaphores',` + ## + ## + # +-interface(`rhcs_rw_groupd_semaphores',` ++interface(`rhcs_stream_connect_cluster',` + gen_require(` +- type groupd_t, groupd_tmpfs_t; ++ attribute cluster_domain, cluster_pid; + ') + +- allow $1 groupd_t:sem { rw_sem_perms destroy }; ++ files_search_pids($1) ++ stream_connect_pattern($1, cluster_pid, cluster_pid, cluster_domain) ++') + +- fs_search_tmpfs($1) +- manage_files_pattern($1, groupd_tmpfs_t, groupd_tmpfs_t) ++##################################### ++## ++## Connect to cluster domains over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_stream_connect_cluster_to',` ++ gen_require(` ++ attribute cluster_domain; ++ attribute cluster_pid; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, cluster_pid, cluster_pid, $2) + ') + + ######################################## + ## +-## Read and write groupd shared memory. ++## Send a null signal to cluster. + ## + ## + ## +@@ -414,15 +528,12 @@ interface(`rhcs_rw_groupd_semaphores',` + ## + ## + # +-interface(`rhcs_rw_groupd_shm',` ++interface(`rhcs_signull_cluster',` + gen_require(` +- type groupd_t, groupd_tmpfs_t; ++ type cluster_t; + ') + +- allow $1 groupd_t:shm { rw_shm_perms destroy }; +- +- fs_search_tmpfs($1) +- manage_files_pattern($1, groupd_tmpfs_t, groupd_tmpfs_t) ++ allow $1 cluster_t:process signull; + ') + + ###################################### +@@ -446,52 +557,424 @@ interface(`rhcs_domtrans_qdiskd',` + + ######################################## + ## +-## All of the rules required to +-## administrate an rhcs environment. ++## Allow domain to read qdiskd tmpfs files + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`rhcs_read_qdiskd_tmpfs_files',` ++ gen_require(` ++ type qdiskd_tmpfs_t; ++ ') ++ ++ fs_search_tmpfs($1) ++ allow $1 qdiskd_tmpfs_t:file read_file_perms; ++') ++ ++###################################### ++## ++## Allow domain to read cluster lib files ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`rhcs_admin',` ++interface(`rhcs_read_cluster_lib_files',` + gen_require(` +- attribute cluster_domain, cluster_pid, cluster_tmpfs; +- attribute cluster_log; +- type dlm_controld_initrc_exec_t, foghorn_initrc_exec_t, fenced_lock_t; +- type fenced_tmp_t, qdiskd_var_lib_t; ++ type cluster_var_lib_t; + ') + +- allow $1 cluster_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, cluster_domain) ++ files_search_var_lib($1) ++ read_files_pattern($1, cluster_var_lib_t, cluster_var_lib_t) ++') + +- init_labeled_script_domtrans($1, { dlm_controld_initrc_exec_t foghorn_initrc_exec_t }) +- domain_system_change_exemption($1) +- role_transition $2 { dlm_controld_initrc_exec_t foghorn_initrc_exec_t } system_r; +- allow $2 system_r; ++##################################### ++## ++## Allow domain to manage cluster lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_manage_cluster_lib_files',` ++ gen_require(` ++ type cluster_var_lib_t; ++ ') + +- files_search_pids($1) +- admin_pattern($1, cluster_pid) ++ files_search_var_lib($1) ++ manage_files_pattern($1, cluster_var_lib_t, cluster_var_lib_t) ++') + +- files_search_locks($1) +- admin_pattern($1, fenced_lock_t) ++#################################### ++## ++## Allow domain to relabel cluster lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_relabel_cluster_lib_files',` ++ gen_require(` ++ type cluster_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ relabelto_files_pattern($1, cluster_var_lib_t, cluster_var_lib_t) ++ relabelfrom_files_pattern($1, cluster_var_lib_t, cluster_var_lib_t) ++') + +- files_search_tmp($1) +- admin_pattern($1, fenced_tmp_t) ++###################################### ++## ++## Execute a domain transition to run cluster administrative domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_domtrans_cluster',` ++ gen_require(` ++ type cluster_t, cluster_exec_t; ++ ') + +- files_search_var_lib($1) +- admin_pattern($1, qdiskd_var_lib_t) ++ corecmd_search_bin($1) ++ domtrans_pattern($1, cluster_exec_t, cluster_t) ++') + +- fs_search_tmpfs($1) +- admin_pattern($1, cluster_tmpfs) ++####################################### ++## ++## Execute cluster init scripts in ++## the init script domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_initrc_domtrans_cluster',` ++ gen_require(` ++ type cluster_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, cluster_initrc_exec_t) ++') ++ ++##################################### ++## ++## Execute cluster in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_exec_cluster',` ++ gen_require(` ++ type cluster_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, cluster_exec_t) ++') ++ ++###################################### ++## ++## Read cluster log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_read_log_cluster',` ++ gen_require(` ++ type cluster_var_log_t; ++ ') ++ ++ logging_search_logs($1) ++ list_dirs_pattern($1, cluster_var_log_t, cluster_var_log_t) ++ read_files_pattern($1, cluster_var_log_t, cluster_var_log_t) ++') ++ ++###################################### ++## ++## Setattr cluster log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_setattr_log_cluster',` ++ gen_require(` ++ type cluster_var_log_t; ++ ') ++ ++ setattr_files_pattern($1, cluster_var_log_t, cluster_var_log_t) ++') ++ ++##################################### ++## ++## Allow the specified domain to read/write inherited cluster's tmpf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_rw_inherited_cluster_tmp_files',` ++ gen_require(` ++ type cluster_tmp_t; ++ ') ++ ++ allow $1 cluster_tmp_t:file rw_inherited_file_perms; ++') ++ ++##################################### ++## ++## Allow manage cluster tmp files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_manage_cluster_tmp_files',` ++ gen_require(` ++ type cluster_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ manage_files_pattern($1, cluster_tmp_t, cluster_tmp_t) ++') ++ ++##################################### ++## ++## Allow the specified domain to read/write cluster's tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_rw_cluster_tmpfs',` ++ gen_require(` ++ type cluster_tmpfs_t; ++ ') ++ ++ rw_files_pattern($1, cluster_tmpfs_t, cluster_tmpfs_t) ++ delete_files_pattern($1, cluster_tmpfs_t, cluster_tmpfs_t) ++ allow $1 cluster_tmpfs_t:file map; ++') ++ ++##################################### ++## ++## Allow manage cluster tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_manage_cluster_tmpfs_files',` ++ gen_require(` ++ type cluster_tmpfs_t; ++ ') ++ ++ fs_search_tmpfs($1) ++ manage_files_pattern($1, cluster_tmpfs_t, cluster_tmpfs_t) ++') ++ ++##################################### ++## ++## Allow read cluster pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_read_cluster_pid_files',` ++ gen_require(` ++ type cluster_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, cluster_var_run_t, cluster_var_run_t) ++') ++ ++ ++##################################### ++## ++## Allow manage cluster pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_manage_cluster_pid_files',` ++ gen_require(` ++ type cluster_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, cluster_var_run_t, cluster_var_run_t) ++') ++ ++####################################### ++## ++## Execute cluster server in the cluster domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_systemctl_cluster',` ++ gen_require(` ++ type cluster_t; ++ type cluster_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 cluster_unit_file_t:file read_file_perms; ++ allow $1 cluster_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, cluster_t) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## a cluster service over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_dbus_chat_cluster',` ++ gen_require(` ++ type cluster_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 cluster_t:dbus send_msg; ++ allow cluster_t $1:dbus send_msg; ++') ++ ++ ++ ++##################################### ++## ++## All of the rules required to administrate ++## an cluster environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed to manage the rgmanager domain. ++## ++## ++## ++# ++interface(`rhcs_admin_cluster',` ++ gen_require(` ++ type cluster_t, cluster_initrc_exec_t, cluster_tmp_t; ++ type cluster_tmpfs_t, cluster_var_log_t, cluster_var_run_t; ++ type cluster_unit_file_t; ++ ') ++ ++ allow $1 cluster_t:process signal_perms; ++ ps_process_pattern($1, cluster_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 cluster_t:process ptrace; ++ ') ++ ++ init_labeled_script_domtrans($1, cluster_initrc_exec_t) ++ domain_system_change_exemption($1) ++ role_transition $2 cluster_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ files_list_tmp($1) ++ admin_pattern($1, cluster_tmp_t) ++ ++ admin_pattern($1, cluster_tmpfs_t) ++ ++ logging_list_logs($1) ++ admin_pattern($1, cluster_var_log_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, cluster_var_run_t) ++ ++ rhcs_systemctl_cluster($1) ++ admin_pattern($1, cluster_unit_file_t) ++ allow $1 cluster_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Start haproxy unit files domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhcs_start_haproxy_services',` ++ gen_require(` ++ type haproxy_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ allow $1 haproxy_unit_file_t:service {status start}; ++') ++ ++######################################## ++## ++## Create log files with a named file ++## type transition. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhcs_named_filetrans_log_dir',` ++ gen_require(` ++ type var_log_t; ++ ') + +- logging_search_logs($1) +- admin_pattern($1, cluster_log) ++ logging_log_named_filetrans($1, var_log_t, dir, "bundles") + ') +diff --git a/rhcs.te b/rhcs.te +index 6cf79c449b..c029ccd715 100644 +--- a/rhcs.te ++++ b/rhcs.te +@@ -20,6 +20,35 @@ gen_tunable(fenced_can_network_connect, false) + ## + gen_tunable(fenced_can_ssh, false) + ++## ++##

      ++## Allow cluster administrative domains to connect to the network using TCP. ++##

      ++##
      ++gen_tunable(cluster_can_network_connect, false) ++ ++## ++##

      ++## Allow cluster administrative domains to manage all files on a system. ++##

      ++##
      ++gen_tunable(cluster_manage_all_files, false) ++ ++## ++##

      ++## Allow cluster administrative cluster domains memcheck-amd64- to use executable memory ++##

      ++##
      ++gen_tunable(cluster_use_execmem, false) ++ ++## ++##

      ++## Determine whether haproxy can ++## connect to all TCP ports. ++##

      ++##
      ++gen_tunable(haproxy_connect_any, false) ++ + attribute cluster_domain; + attribute cluster_log; + attribute cluster_pid; +@@ -44,34 +73,295 @@ type foghorn_initrc_exec_t; + init_script_file(foghorn_initrc_exec_t) + + rhcs_domain_template(gfs_controld) ++rhcs_domain_template(haproxy) ++ ++type haproxy_var_lib_t; ++files_type(haproxy_var_lib_t) ++ ++type haproxy_unit_file_t; ++systemd_unit_file(haproxy_unit_file_t) ++ + rhcs_domain_template(groupd) + rhcs_domain_template(qdiskd) + + type qdiskd_var_lib_t; + files_type(qdiskd_var_lib_t) + ++# cluster_t is a new domain for administrative generic cluster services ++# (rgmanager, corosync, hearbeat, cman, pacemaker) ++rhcs_domain_template(cluster) ++ ++typealias cluster_t alias { aisexec_t corosync_t pacemaker_t rgmanager_t }; ++typealias cluster_exec_t alias { aisexec_exec_t corosync_exec_t pacemaker_exec_t rgmanager_exec_t }; ++typealias cluster_tmpfs_t alias { aisexec_tmpfs_t corosync_tmpfs_t pacemaker_tmpfs_t rgmanager_tmpfs_t }; ++typealias cluster_var_log_t alias { aisexec_var_log_t corosync_var_log_t rgmanager_var_log_t }; ++typealias cluster_var_run_t alias { aisexec_var_run_t corosync_var_run_t pacemaker_var_run_t rgmanager_var_run_t }; ++ ++type cluster_initrc_exec_t; ++typealias cluster_initrc_exec_t alias { aisexec_initrc_exec_t corosync_initrc_exec_t pacemaker_initrc_exec_t rgmanager_initrc_exec_t }; ++init_script_file(cluster_initrc_exec_t) ++ ++type cluster_tmp_t; ++typealias cluster_tmp_t alias { aisexec_tmp_t corosync_tmp_t pacemaker_tmp_t rgmanager_tmp_t }; ++files_tmp_file(cluster_tmp_t) ++ ++type cluster_var_lib_t; ++typealias cluster_var_lib_t alias { aisexec_var_lib_t corosync_var_lib_t pacemaker_var_lib_t rgmanager_var_lib_t }; ++files_type(cluster_var_lib_t) ++ ++type cluster_unit_file_t; ++typealias cluster_unit_file_t alias { corosync_unit_file_t pacemaker_unit_file_t }; ++systemd_unit_file(cluster_unit_file_t) ++ + ##################################### + # + # Common cluster domains local policy + # + + allow cluster_domain self:capability sys_nice; +-allow cluster_domain self:process setsched; ++allow cluster_domain self:process { signal setsched }; + allow cluster_domain self:sem create_sem_perms; + allow cluster_domain self:fifo_file rw_fifo_file_perms; + allow cluster_domain self:unix_stream_socket create_stream_socket_perms; + allow cluster_domain self:unix_dgram_socket create_socket_perms; + +-logging_send_syslog_msg(cluster_domain) ++manage_dirs_pattern(cluster_domain, cluster_log, cluster_log) ++manage_files_pattern(cluster_domain, cluster_log, cluster_log) ++manage_sock_files_pattern(cluster_domain, cluster_log, cluster_log) + +-miscfiles_read_localization(cluster_domain) ++tunable_policy(`cluster_use_execmem',` ++ allow cluster_domain self:process execmem; ++') + + optional_policy(` + ccs_stream_connect(cluster_domain) + ') + + optional_policy(` +- corosync_stream_connect(cluster_domain) ++ dbus_system_bus_client(cluster_domain) ++') ++ ++##################################### ++# ++# cluster domain local policy ++# ++ ++allow cluster_t self:capability { dac_read_search dac_override fowner setuid setgid sys_nice sys_admin sys_resource ipc_lock ipc_owner }; ++# for hearbeat ++allow cluster_t self:capability { net_raw chown }; ++allow cluster_t self:capability2 block_suspend; ++allow cluster_t self:process { setpgid setrlimit setsched signull }; ++ ++allow cluster_t self:tcp_socket create_stream_socket_perms; ++allow cluster_t self:shm create_shm_perms; ++ ++manage_dirs_pattern(cluster_t, cluster_tmp_t, cluster_tmp_t) ++manage_files_pattern(cluster_t, cluster_tmp_t, cluster_tmp_t) ++files_tmp_filetrans(cluster_t, cluster_tmp_t, { file dir }) ++ ++can_exec(cluster_t, cluster_var_lib_t) ++manage_files_pattern(cluster_t, cluster_var_lib_t,cluster_var_lib_t) ++manage_dirs_pattern(cluster_t, cluster_var_lib_t,cluster_var_lib_t) ++manage_sock_files_pattern(cluster_t, cluster_var_lib_t,cluster_var_lib_t) ++manage_fifo_files_pattern(cluster_t, cluster_var_lib_t,cluster_var_lib_t) ++files_var_lib_filetrans(cluster_t,cluster_var_lib_t, { file dir fifo_file sock_file }) ++ ++can_exec(cluster_t, cluster_exec_t) ++ ++kernel_kill(cluster_t) ++kernel_read_all_sysctls(cluster_t) ++kernel_rw_rpc_sysctls(cluster_t) ++kernel_search_debugfs(cluster_t) ++kernel_search_network_state(cluster_t) ++ ++corecmd_exec_bin(cluster_t) ++corecmd_exec_shell(cluster_t) ++ ++corenet_all_recvfrom_unlabeled(cluster_t) ++corenet_all_recvfrom_netlabel(cluster_t) ++corenet_udp_sendrecv_generic_if(cluster_t) ++corenet_udp_sendrecv_generic_node(cluster_t) ++corenet_udp_bind_generic_node(cluster_t) ++ ++corenet_sendrecv_netsupport_server_packets(cluster_t) ++corenet_udp_bind_netsupport_port(cluster_t) ++corenet_udp_sendrecv_netsupport_port(cluster_t) ++ ++corenet_sendrecv_cluster_server_packets(cluster_t) ++corenet_udp_bind_cluster_port(cluster_t) ++corenet_udp_sendrecv_cluster_port(cluster_t) ++ ++# need to write to /dev/misc/dlm-contro ++dev_rw_dlm_control(cluster_t) ++dev_setattr_dlm_control(cluster_t) ++dev_read_sysfs(cluster_t) ++dev_read_rand(cluster_t) ++dev_read_urand(cluster_t) ++ ++domain_read_all_domains_state(cluster_t) ++ ++fs_getattr_xattr_fs(cluster_t) ++fs_getattr_all_fs(cluster_t) ++ ++storage_raw_read_fixed_disk(cluster_t) ++ ++term_getattr_pty_fs(cluster_t) ++ ++files_manage_mounttab(cluster_t) ++# needed by resources scripts ++files_read_non_security_files(cluster_t) ++auth_dontaudit_getattr_shadow(cluster_t) ++ ++init_domtrans_script(cluster_t) ++init_initrc_domain(cluster_t) ++init_read_script_state(cluster_t) ++init_rw_script_tmp_files(cluster_t) ++init_manage_script_status_files(cluster_t) ++ ++systemd_dbus_chat_logind(cluster_t) ++ ++userdom_delete_user_tmp_files(cluster_t) ++userdom_rw_user_tmp_files(cluster_t) ++userdom_kill_all_users(cluster_t) ++ ++tunable_policy(`cluster_can_network_connect',` ++ corenet_tcp_connect_all_ports(cluster_t) ++') ++ ++# we need to have dirs created with var_run_t in /run/cluster ++files_create_var_run_dirs(cluster_t) ++ ++tunable_policy(`cluster_manage_all_files',` ++ files_getattr_all_symlinks(cluster_t) ++ files_list_all(cluster_t) ++ files_manage_mnt_dirs(cluster_t) ++ files_manage_mnt_files(cluster_t) ++ files_manage_mnt_symlinks(cluster_t) ++ files_manage_isid_type_files(cluster_t) ++ files_manage_isid_type_dirs(cluster_t) ++ fs_manage_tmpfs_files(cluster_t) ++') ++ ++optional_policy(` ++ ccs_read_config(cluster_t) ++') ++ ++optional_policy(` ++ cmirrord_rw_shm(cluster_t) ++') ++ ++optional_policy(` ++ consoletype_exec(cluster_t) ++') ++ ++optional_policy(` ++ lvm_domtrans(cluster_t) ++ lvm_rw_clvmd_tmpfs_files(cluster_t) ++ lvm_delete_clvmd_tmpfs_files(cluster_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(cluster_t) ++') ++ ++optional_policy(` ++ ganesha_dbus_chat(cluster_t) ++') ++ ++optional_policy(` ++ hostname_exec(cluster_t) ++') ++ ++optional_policy(` ++ ccs_manage_config(cluster_t) ++ ccs_stream_connect(cluster_t) ++') ++ ++optional_policy(` ++ fprintd_dbus_chat(cluster_t) ++') ++ ++optional_policy(` ++ ldap_systemctl(cluster_t) ++') ++ ++optional_policy(` ++ mount_domtrans(cluster_t) ++') ++ ++optional_policy(` ++ mysql_domtrans_mysql_safe(cluster_t) ++ mysql_stream_connect(cluster_t) ++') ++ ++optional_policy(` ++ netutils_domtrans(cluster_t) ++ netutils_domtrans_ping(cluster_t) ++') ++ ++optional_policy(` ++ postgresql_signal(cluster_t) ++') ++ ++optional_policy(` ++ rhcs_getattr_fenced(cluster_t) ++ rhcs_rw_cluster_shm(cluster_t) ++ rhcs_rw_cluster_semaphores(cluster_t) ++ rhcs_stream_connect_cluster(cluster_t) ++ rhcs_relabel_cluster_lib_files(cluster_t) ++') ++ ++optional_policy(` ++ rdisc_exec(cluster_t) ++') ++ ++optional_policy(` ++ ricci_dontaudit_rw_modcluster_pipes(cluster_t) ++') ++ ++optional_policy(` ++ rhcs_named_filetrans_log_dir(cluster_t) ++') ++ ++optional_policy(` ++ rpc_systemctl_nfsd(cluster_t) ++ rpc_systemctl_rpcd(cluster_t) ++ ++ rpc_domtrans_nfsd(cluster_t) ++ rpc_domtrans_rpcd(cluster_t) ++ rpc_manage_nfs_state_data(cluster_t) ++ rpc_filetrans_var_lib_nfs_content(cluster_t) ++') ++ ++optional_policy(` ++ samba_manage_var_files(cluster_t) ++ samba_rw_config(cluster_t) ++ samba_signal_smbd(cluster_t) ++ samba_signal_nmbd(cluster_t) ++') ++ ++optional_policy(` ++ sysnet_domtrans_ifconfig(cluster_t) ++') ++ ++optional_policy(` ++ udev_read_db(cluster_t) ++') ++ ++optional_policy(` ++ virt_stream_connect(cluster_t) ++') ++ ++optional_policy(` ++ unconfined_domain(cluster_t) ++') ++ ++optional_policy(` ++ wdmd_rw_tmpfs(cluster_t) ++') ++ ++optional_policy(` ++ xen_domtrans_xm(cluster_t) + ') + + ##################################### +@@ -79,13 +369,16 @@ optional_policy(` + # dlm_controld local policy + # + +-allow dlm_controld_t self:capability { net_admin sys_admin sys_resource }; ++allow dlm_controld_t self:capability { dac_read_search dac_override net_admin sys_admin sys_resource }; + allow dlm_controld_t self:netlink_kobject_uevent_socket create_socket_perms; + ++allow dlm_controld_t cluster_t:process { signull }; ++ ++files_pid_filetrans(dlm_controld_t, dlm_controld_var_run_t, dir) ++ + stream_connect_pattern(dlm_controld_t, fenced_var_run_t, fenced_var_run_t, fenced_t) + stream_connect_pattern(dlm_controld_t, groupd_var_run_t, groupd_var_run_t, groupd_t) + +-kernel_read_system_state(dlm_controld_t) + kernel_rw_net_sysctls(dlm_controld_t) + + corecmd_exec_bin(dlm_controld_t) +@@ -98,16 +391,30 @@ fs_manage_configfs_dirs(dlm_controld_t) + + init_rw_script_tmp_files(dlm_controld_t) + ++logging_send_syslog_msg(dlm_controld_t) ++ ++optional_policy(` ++ rhcs_rw_cluster_tmpfs(dlm_controld_t) ++') ++ ++optional_policy(` ++ rhcs_stream_connect_cluster(dlm_controld_t) ++') ++ + ####################################### + # + # fenced local policy + # + +-allow fenced_t self:capability { sys_rawio sys_resource }; +-allow fenced_t self:process { getsched signal_perms }; +-allow fenced_t self:tcp_socket { accept listen }; ++allow fenced_t self:capability { net_admin sys_boot sys_rawio sys_resource sys_admin }; ++allow fenced_t self:process { getsched setcap setpgid signal_perms }; ++ ++allow fenced_t self:tcp_socket create_stream_socket_perms; ++allow fenced_t self:udp_socket create_socket_perms; + allow fenced_t self:unix_stream_socket connectto; + ++can_exec(fenced_t, fenced_exec_t) ++ + manage_files_pattern(fenced_t, fenced_lock_t, fenced_lock_t) + files_lock_filetrans(fenced_t, fenced_lock_t, file) + +@@ -118,9 +425,8 @@ files_tmp_filetrans(fenced_t, fenced_tmp_t, { file fifo_file dir }) + + stream_connect_pattern(fenced_t, groupd_var_run_t, groupd_var_run_t, groupd_t) + +-can_exec(fenced_t, fenced_exec_t) +- +-kernel_read_system_state(fenced_t) ++kernel_read_network_state(fenced_t) ++kernel_read_fs_sysctls(fenced_t) + + corecmd_exec_bin(fenced_t) + corecmd_exec_shell(fenced_t) +@@ -140,6 +446,8 @@ corenet_udp_sendrecv_ionixnetmon_port(fenced_t) + + corenet_sendrecv_zented_server_packets(fenced_t) + corenet_tcp_bind_zented_port(fenced_t) ++corenet_udp_bind_zented_port(fenced_t) ++corenet_tcp_connect_zented_port(fenced_t) + corenet_tcp_sendrecv_zented_port(fenced_t) + + corenet_sendrecv_http_client_packets(fenced_t) +@@ -148,9 +456,8 @@ corenet_tcp_sendrecv_http_port(fenced_t) + + dev_read_sysfs(fenced_t) + dev_read_urand(fenced_t) +- +-files_read_usr_files(fenced_t) +-files_read_usr_symlinks(fenced_t) ++dev_read_rand(fenced_t) ++dev_rw_lvm_control(fenced_t) + + storage_raw_read_fixed_disk(fenced_t) + storage_raw_write_fixed_disk(fenced_t) +@@ -160,7 +467,7 @@ term_getattr_pty_fs(fenced_t) + term_use_generic_ptys(fenced_t) + term_use_ptmx(fenced_t) + +-auth_use_nsswitch(fenced_t) ++logging_send_syslog_msg(fenced_t) + + tunable_policy(`fenced_can_network_connect',` + corenet_sendrecv_all_client_packets(fenced_t) +@@ -182,7 +489,8 @@ optional_policy(` + ') + + optional_policy(` +- corosync_exec(fenced_t) ++ rhcs_exec_cluster(fenced_t) ++ rhcs_rw_cluster_tmpfs(fenced_t) + ') + + optional_policy(` +@@ -190,12 +498,17 @@ optional_policy(` + ') + + optional_policy(` +- gnome_read_generic_home_content(fenced_t) ++ libs_exec_ldconfig(fenced_t) + ') + + optional_policy(` + lvm_domtrans(fenced_t) + lvm_read_config(fenced_t) ++ lvm_stream_connect(fenced_t) ++') ++ ++optional_policy(` ++ sanlock_domtrans(fenced_t) + ') + + optional_policy(` +@@ -203,6 +516,21 @@ optional_policy(` + snmp_manage_var_lib_dirs(fenced_t) + ') + ++optional_policy(` ++ virt_domtrans(fenced_t) ++ virt_read_config(fenced_t) ++ virt_read_pid_files(fenced_t) ++ virt_stream_connect(fenced_t) ++') ++ ++optional_policy(` ++ watchdog_unconfined_exec_read_lnk_files(fenced_t) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(fenced_t) ++') ++ + ####################################### + # + # foghorn local policy +@@ -221,16 +549,18 @@ corenet_sendrecv_agentx_client_packets(foghorn_t) + corenet_tcp_connect_agentx_port(foghorn_t) + corenet_tcp_sendrecv_agentx_port(foghorn_t) + ++corenet_tcp_connect_snmp_port(foghorn_t) ++ + dev_read_urand(foghorn_t) + +-files_read_usr_files(foghorn_t) ++logging_send_syslog_msg(foghorn_t) + + optional_policy(` + dbus_connect_system_bus(foghorn_t) + ') + + optional_policy(` +- snmp_read_snmp_var_lib_files(foghorn_t) ++ snmp_manage_var_lib_files(foghorn_t) + snmp_stream_connect(foghorn_t) + ') + +@@ -247,16 +577,20 @@ stream_connect_pattern(gfs_controld_t, dlm_controld_var_run_t, dlm_controld_var_ + stream_connect_pattern(gfs_controld_t, fenced_var_run_t, fenced_var_run_t, fenced_t) + stream_connect_pattern(gfs_controld_t, groupd_var_run_t, groupd_var_run_t, groupd_t) + +-kernel_read_system_state(gfs_controld_t) + + dev_rw_dlm_control(gfs_controld_t) + dev_setattr_dlm_control(gfs_controld_t) + dev_rw_sysfs(gfs_controld_t) ++storage_getattr_fixed_disk_dev(gfs_controld_t) ++ ++fs_getattr_all_fs(gfs_controld_t) + + storage_getattr_removable_dev(gfs_controld_t) + + init_rw_script_tmp_files(gfs_controld_t) + ++logging_send_syslog_msg(gfs_controld_t) ++ + optional_policy(` + lvm_exec(gfs_controld_t) + dev_rw_lvm_control(gfs_controld_t) +@@ -275,10 +609,59 @@ domtrans_pattern(groupd_t, fenced_exec_t, fenced_t) + + dev_list_sysfs(groupd_t) + +-files_read_etc_files(groupd_t) +- + init_rw_script_tmp_files(groupd_t) + ++logging_send_syslog_msg(groupd_t) ++ ++######################################## ++# ++# haproxy local policy ++# ++ ++# bug in haproxy and process vs pid owner ++allow haproxy_t self:capability { dac_read_search dac_override kill }; ++ ++allow haproxy_t self:capability { chown fowner setgid setuid sys_chroot sys_resource net_admin net_raw }; ++allow haproxy_t self:capability2 block_suspend; ++allow haproxy_t self:process { fork setrlimit signal_perms }; ++allow haproxy_t self:fifo_file rw_fifo_file_perms; ++allow haproxy_t self:unix_stream_socket create_stream_socket_perms; ++allow haproxy_t self:tcp_socket create_stream_socket_perms; ++allow haproxy_t self: udp_socket create_socket_perms; ++ ++manage_dirs_pattern(haproxy_t, haproxy_var_lib_t, haproxy_var_lib_t) ++manage_files_pattern(haproxy_t, haproxy_var_lib_t, haproxy_var_lib_t) ++manage_lnk_files_pattern(haproxy_t, haproxy_var_lib_t, haproxy_var_lib_t) ++manage_sock_files_pattern(haproxy_t, haproxy_var_lib_t, haproxy_var_lib_t) ++files_var_lib_filetrans(haproxy_t, haproxy_var_lib_t, { dir file lnk_file }) ++ ++can_exec(haproxy_t, haproxy_exec_t) ++ ++corenet_sendrecv_unlabeled_packets(haproxy_t) ++ ++corenet_tcp_connect_commplex_link_port(haproxy_t) ++corenet_tcp_connect_commplex_main_port(haproxy_t) ++corenet_tcp_bind_commplex_main_port(haproxy_t) ++corenet_tcp_bind_http_port(haproxy_t) ++corenet_tcp_bind_http_cache_port(haproxy_t) ++ ++corenet_tcp_connect_fmpro_internal_port(haproxy_t) ++corenet_tcp_connect_http_port(haproxy_t) ++corenet_tcp_connect_http_cache_port(haproxy_t) ++corenet_tcp_connect_rtp_media_port(haproxy_t) ++ ++dev_read_rand(haproxy_t) ++dev_read_urand(haproxy_t) ++ ++sysnet_dns_name_resolve(haproxy_t) ++ ++tunable_policy(`haproxy_connect_any',` ++ corenet_tcp_connect_all_ports(haproxy_t) ++ corenet_tcp_bind_all_ports(haproxy_t) ++ corenet_sendrecv_all_packets(haproxy_t) ++ corenet_tcp_sendrecv_all_ports(haproxy_t) ++') ++ + ###################################### + # + # qdiskd local policy +@@ -292,7 +675,6 @@ manage_dirs_pattern(qdiskd_t, qdiskd_var_lib_t, qdiskd_var_lib_t) + manage_sock_files_pattern(qdiskd_t, qdiskd_var_lib_t, qdiskd_var_lib_t) + files_var_lib_filetrans(qdiskd_t, qdiskd_var_lib_t, { file dir sock_file }) + +-kernel_read_system_state(qdiskd_t) + kernel_read_software_raid_state(qdiskd_t) + kernel_getattr_core_if(qdiskd_t) + +@@ -321,6 +703,8 @@ storage_raw_write_fixed_disk(qdiskd_t) + + auth_use_nsswitch(qdiskd_t) + ++logging_send_syslog_msg(qdiskd_t) ++ + optional_policy(` + netutils_domtrans_ping(qdiskd_t) + ') +diff --git a/rhev.fc b/rhev.fc +new file mode 100644 +index 0000000000..4b66adfddf +--- /dev/null ++++ b/rhev.fc +@@ -0,0 +1,13 @@ ++/usr/share/rhev-agent/rhev-agentd\.py -- gen_context(system_u:object_r:rhev_agentd_exec_t,s0) ++/usr/share/ovirt-guest-agent -- gen_context(system_u:object_r:rhev_agentd_exec_t,s0) ++ ++/usr/share/rhev-agent/LockActiveSession\.py -- gen_context(system_u:object_r:rhev_agentd_exec_t,s0) ++/usr/share/ovirt-guest-agent/LockActiveSession\.py -- gen_context(system_u:object_r:rhev_agentd_exec_t,s0) ++ ++/usr/lib/systemd/system/ovirt-guest-agent.* -- gen_context(system_u:object_r:rhev_agentd_unit_file_t,s0) ++ ++/var/run/rhev-agentd\.pid -- gen_context(system_u:object_r:rhev_agentd_var_run_t,s0) ++/var/run/ovirt-guest-agent\.pid -- gen_context(system_u:object_r:rhev_agentd_var_run_t,s0) ++ ++/var/log/rhev-agent(/.*)? gen_context(system_u:object_r:rhev_agentd_log_t,s0) ++/var/log/ovirt-guest-agent(/.*)? gen_context(system_u:object_r:rhev_agentd_log_t,s0) +diff --git a/rhev.if b/rhev.if +new file mode 100644 +index 0000000000..bf11e25630 +--- /dev/null ++++ b/rhev.if +@@ -0,0 +1,76 @@ ++## rhev polic module contains policies for rhev apps ++ ++##################################### ++## ++## Execute rhev-agentd in the rhev_agentd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhev_domtrans_agentd',` ++ gen_require(` ++ type rhev_agentd_t, rhev_agentd_exec_t; ++ ') ++ ++ domtrans_pattern($1, rhev_agentd_exec_t, rhev_agentd_t) ++') ++ ++#################################### ++## ++## Read rhev-agentd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhev_read_pid_files_agentd',` ++ gen_require(` ++ type rhev_agentd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, rhev_agentd_var_run_t, rhev_agentd_var_run_t) ++') ++ ++##################################### ++## ++## Connect to rhev_agentd over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhev_stream_connect_agentd',` ++ gen_require(` ++ type rhev_agentd_var_run_t, rhev_agentd_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, rhev_agentd_var_run_t, rhev_agentd_var_run_t, rhev_agentd_t) ++') ++ ++###################################### ++## ++## Send sigchld to rhev-agentd ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`rhev_sigchld_agentd',` ++ gen_require(` ++ type rhev_agentd_t; ++ ') ++ ++ allow $1 rhev_agentd_t:process sigchld; ++') +diff --git a/rhev.te b/rhev.te +new file mode 100644 +index 0000000000..8b7aa12d8e +--- /dev/null ++++ b/rhev.te +@@ -0,0 +1,128 @@ ++policy_module(rhev,1.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type rhev_agentd_t; ++type rhev_agentd_exec_t; ++init_daemon_domain(rhev_agentd_t, rhev_agentd_exec_t) ++ ++type rhev_agentd_unit_file_t; ++systemd_unit_file(rhev_agentd_unit_file_t) ++ ++type rhev_agentd_var_run_t; ++files_pid_file(rhev_agentd_var_run_t) ++ ++type rhev_agentd_tmp_t; ++files_tmp_file(rhev_agentd_tmp_t) ++ ++type rhev_agentd_log_t; ++logging_log_file(rhev_agentd_log_t) ++ ++######################################## ++# ++# rhev_agentd_t local policy ++# ++ ++allow rhev_agentd_t self:capability { setuid setgid sys_nice }; ++allow rhev_agentd_t self:process setsched; ++ ++allow rhev_agentd_t self:fifo_file rw_fifo_file_perms; ++allow rhev_agentd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(rhev_agentd_t, rhev_agentd_var_run_t, rhev_agentd_var_run_t) ++manage_files_pattern(rhev_agentd_t, rhev_agentd_var_run_t, rhev_agentd_var_run_t) ++manage_sock_files_pattern(rhev_agentd_t, rhev_agentd_var_run_t, rhev_agentd_var_run_t) ++files_pid_filetrans(rhev_agentd_t, rhev_agentd_var_run_t, { dir file sock_file }) ++ ++manage_files_pattern(rhev_agentd_t, rhev_agentd_log_t, rhev_agentd_log_t) ++manage_dirs_pattern(rhev_agentd_t, rhev_agentd_log_t, rhev_agentd_log_t) ++logging_log_filetrans(rhev_agentd_t, rhev_agentd_log_t, { dir file }) ++ ++manage_dirs_pattern(rhev_agentd_t, rhev_agentd_tmp_t, rhev_agentd_tmp_t) ++manage_files_pattern(rhev_agentd_t, rhev_agentd_tmp_t, rhev_agentd_tmp_t) ++files_tmp_filetrans(rhev_agentd_t, rhev_agentd_tmp_t, { file dir }) ++can_exec(rhev_agentd_t, rhev_agentd_tmp_t) ++ ++kernel_read_system_state(rhev_agentd_t) ++kernel_read_kernel_sysctls(rhev_agentd_t) ++ ++corecmd_exec_bin(rhev_agentd_t) ++corecmd_exec_shell(rhev_agentd_t) ++ ++dev_read_urand(rhev_agentd_t) ++ ++term_use_virtio_console(rhev_agentd_t) ++ ++fs_getattr_all_fs(rhev_agentd_t) ++ ++files_getattr_all_mountpoints(rhev_agentd_t) ++files_search_all_mountpoints(rhev_agentd_t) ++ ++auth_use_nsswitch(rhev_agentd_t) ++ ++init_read_utmp(rhev_agentd_t) ++ ++libs_exec_ldconfig(rhev_agentd_t) ++logging_send_syslog_msg(rhev_agentd_t) ++ ++optional_policy(` ++ rpm_read_db(rhev_agentd_t) ++ rpm_dontaudit_manage_db(rhev_agentd_t) ++') ++ ++optional_policy(` ++ ssh_signull(rhev_agentd_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(rhev_agentd_t) ++ dbus_connect_system_bus(rhev_agentd_t) ++ dbus_session_bus_client(rhev_agentd_t) ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(rhev_agentd_t) ++ ') ++ ++ optional_policy(` ++ xserver_dbus_chat_xdm(rhev_agentd_t) ++ ') ++ ++') ++ ++optional_policy(` ++ udev_read_db(rhev_agentd_t) ++') ++ ++optional_policy(` ++ xserver_stream_connect(rhev_agentd_t) ++') ++ ++###################################### ++# ++# rhev_agentd_t consolehelper local policy ++# ++ ++optional_policy(` ++ userhelper_console_role_template(rhev_agentd, system_r, rhev_agentd_t) ++ ++ allow rhev_agentd_consolehelper_t rhev_agentd_log_t:file rw_inherited_file_perms; ++ allow rhev_agentd_consolehelper_t rhev_agentd_tmp_t:file rw_inherited_file_perms; ++ ++ can_exec(rhev_agentd_consolehelper_t, rhev_agentd_exec_t) ++ kernel_read_system_state(rhev_agentd_consolehelper_t) ++ ++ term_use_virtio_console(rhev_agentd_consolehelper_t) ++ ++ corenet_tcp_connect_xserver_port(rhev_agentd_consolehelper_t) ++ ++ optional_policy(` ++ dbus_session_bus_client(rhev_agentd_consolehelper_t) ++ ') ++ ++ optional_policy(` ++ unconfined_dbus_chat(rhev_agentd_consolehelper_t) ++ ') ++') +diff --git a/rhgb.if b/rhgb.if +index 1a134a72ef..793a29f88c 100644 +--- a/rhgb.if ++++ b/rhgb.if +@@ -1,4 +1,4 @@ +-## Red Hat Graphical Boot. ++## Red Hat Graphical Boot + + ######################################## + ## +@@ -18,7 +18,7 @@ interface(`rhgb_stub',` + + ######################################## + ## +-## Inherit and use rhgb file descriptors. ++## Use a rhgb file descriptor. + ## + ## + ## +@@ -54,7 +54,7 @@ interface(`rhgb_getpgid',` + + ######################################## + ## +-## Send generic signals to rhgb. ++## Send a signal to rhgb. + ## + ## + ## +@@ -72,8 +72,7 @@ interface(`rhgb_signal',` + + ######################################## + ## +-## Read and write inherited rhgb unix +-## domain stream sockets. ++## Read and write to unix stream sockets. + ## + ## + ## +@@ -110,8 +109,7 @@ interface(`rhgb_dontaudit_rw_stream_sockets',` + + ######################################## + ## +-## Connected to rhgb with a unix +-## domain stream socket. ++## Connected to rhgb unix stream socket. + ## + ## + ## +@@ -121,11 +119,10 @@ interface(`rhgb_dontaudit_rw_stream_sockets',` + # + interface(`rhgb_stream_connect',` + gen_require(` +- type rhgb_t, rhgb_tmpfs_t; ++ type rhgb_t; + ') + +- fs_search_tmpfs($1) +- stream_connect_pattern($1, rhgb_tmpfs_t, rhgb_tmpfs_t, rhgb_t) ++ allow $1 rhgb_t:unix_stream_socket connectto; + ') + + ######################################## +@@ -148,7 +145,7 @@ interface(`rhgb_rw_shm',` + + ######################################## + ## +-## Read and write rhgb pty devices. ++## Read from and write to the rhgb devpts. + ## + ## + ## +@@ -161,14 +158,12 @@ interface(`rhgb_use_ptys',` + type rhgb_devpts_t; + ') + +- dev_list_all_dev_nodes($1) + allow $1 rhgb_devpts_t:chr_file rw_term_perms; + ') + + ######################################## + ## +-## Do not audit attempts to read and +-## write rhgb pty devices. ++## dontaudit Read from and write to the rhgb devpts. + ## + ## + ## +@@ -186,7 +181,7 @@ interface(`rhgb_dontaudit_use_ptys',` + + ######################################## + ## +-## Read and write to rhgb tmpfs files. ++## Read and write to rhgb temporary file system. + ## + ## + ## +@@ -199,7 +194,6 @@ interface(`rhgb_rw_tmpfs_files',` + type rhgb_tmpfs_t; + ') + +- + fs_search_tmpfs($1) + allow $1 rhgb_tmpfs_t:file rw_file_perms; + ') +diff --git a/rhgb.te b/rhgb.te +index 3f32e4bb36..f97ea42f88 100644 +--- a/rhgb.te ++++ b/rhgb.te +@@ -43,7 +43,6 @@ kernel_read_system_state(rhgb_t) + corecmd_exec_bin(rhgb_t) + corecmd_exec_shell(rhgb_t) + +-corenet_all_recvfrom_unlabeled(rhgb_t) + corenet_all_recvfrom_netlabel(rhgb_t) + corenet_tcp_sendrecv_generic_if(rhgb_t) + corenet_tcp_sendrecv_generic_node(rhgb_t) +@@ -57,11 +56,9 @@ dev_read_urand(rhgb_t) + + domain_use_interactive_fds(rhgb_t) + +-files_read_etc_files(rhgb_t) + files_read_var_files(rhgb_t) + files_read_etc_runtime_files(rhgb_t) + files_search_tmp(rhgb_t) +-files_read_usr_files(rhgb_t) + files_mounton_mnt(rhgb_t) + files_dontaudit_rw_root_dir(rhgb_t) + files_dontaudit_read_default_files(rhgb_t) +@@ -89,7 +86,6 @@ libs_read_lib_files(rhgb_t) + + logging_send_syslog_msg(rhgb_t) + +-miscfiles_read_localization(rhgb_t) + miscfiles_read_fonts(rhgb_t) + miscfiles_dontaudit_write_fonts(rhgb_t) + +diff --git a/rhnsd.fc b/rhnsd.fc +new file mode 100644 +index 0000000000..860a91df85 +--- /dev/null ++++ b/rhnsd.fc +@@ -0,0 +1,9 @@ ++/etc/rc\.d/init\.d/rhnsd -- gen_context(system_u:object_r:rhnsd_initrc_exec_t,s0) ++ ++/usr/lib/systemd/system/rhnsd.* -- gen_context(system_u:object_r:rhnsd_unit_file_t,s0) ++ ++/usr/sbin/rhnsd -- gen_context(system_u:object_r:rhnsd_exec_t,s0) ++ ++/var/run/rhnsd\.pid -- gen_context(system_u:object_r:rhnsd_var_run_t,s0) ++ ++/etc/sysconfig/rhn(/.*)? gen_context(system_u:object_r:rhnsd_conf_t,s0) +diff --git a/rhnsd.if b/rhnsd.if +new file mode 100644 +index 0000000000..a161c70f9f +--- /dev/null ++++ b/rhnsd.if +@@ -0,0 +1,120 @@ ++## policy for rhnsd ++ ++######################################## ++## ++## Transition to rhnsd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhnsd_domtrans',` ++ gen_require(` ++ type rhnsd_t, rhnsd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, rhnsd_exec_t, rhnsd_t) ++') ++ ++######################################## ++## ++## Execute rhnsd server in the rhnsd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhnsd_initrc_domtrans',` ++ gen_require(` ++ type rhnsd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, rhnsd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Execute rhnsd server in the rhnsd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rhnsd_systemctl',` ++ gen_require(` ++ type rhnsd_t; ++ type rhnsd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 rhnsd_unit_file_t:file read_file_perms; ++ allow $1 rhnsd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rhnsd_t) ++') ++ ++###################################### ++## ++## Allow the specified domain to manage ++## rhnsd configuration files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhnsd_manage_config',` ++ gen_require(` ++ type rhnsd_conf_t; ++ ') ++ ++ files_search_etc($1) ++ manage_files_pattern( $1, rhnsd_conf_t, rhnsd_conf_t) ++ manage_lnk_files_pattern($1, rhnsd_conf_t, rhnsd_conf_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rhnsd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`rhnsd_admin',` ++ gen_require(` ++ type rhnsd_t; ++ type rhnsd_initrc_exec_t; ++ ') ++ ++ allow $1 rhnsd_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, rhnsd_t) ++ ++ rhnsd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 rhnsd_initrc_exec_t system_r; ++ allow $2 system_r; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/rhnsd.te b/rhnsd.te +new file mode 100644 +index 0000000000..b947f092ac +--- /dev/null ++++ b/rhnsd.te +@@ -0,0 +1,48 @@ ++policy_module(rhnsd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type rhnsd_t; ++type rhnsd_exec_t; ++init_daemon_domain(rhnsd_t, rhnsd_exec_t) ++ ++type rhnsd_var_run_t; ++files_pid_file(rhnsd_var_run_t) ++ ++type rhnsd_initrc_exec_t; ++init_script_file(rhnsd_initrc_exec_t) ++ ++type rhnsd_unit_file_t; ++systemd_unit_file(rhnsd_unit_file_t) ++ ++type rhnsd_conf_t; ++files_config_file(rhnsd_conf_t) ++ ++######################################## ++# ++# rhnsd local policy ++# ++ ++allow rhnsd_t self:capability { kill }; ++allow rhnsd_t self:process { fork signal }; ++allow rhnsd_t self:fifo_file rw_fifo_file_perms; ++allow rhnsd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(rhnsd_t, rhnsd_var_run_t, rhnsd_var_run_t) ++manage_files_pattern(rhnsd_t, rhnsd_var_run_t, rhnsd_var_run_t) ++files_pid_filetrans(rhnsd_t, rhnsd_var_run_t, { dir file }) ++ ++manage_files_pattern(rhnsd_t, rhnsd_conf_t, rhnsd_conf_t) ++manage_lnk_files_pattern(rhnsd_t, rhnsd_conf_t, rhnsd_conf_t) ++ ++corecmd_exec_bin(rhnsd_t) ++ ++logging_send_syslog_msg(rhnsd_t) ++ ++optional_policy(` ++ # execute rhn_check ++ rpm_domtrans(rhnsd_t) ++') +diff --git a/rhsmcertd.fc b/rhsmcertd.fc +index 8c02804181..92b10f62ab 100644 +--- a/rhsmcertd.fc ++++ b/rhsmcertd.fc +@@ -1,7 +1,11 @@ + /etc/rc\.d/init\.d/rhsmcertd -- gen_context(system_u:object_r:rhsmcertd_initrc_exec_t,s0) + ++/etc/rhsm(/.*)? gen_context(system_u:object_r:rhsmcertd_config_t,s0) ++ + /usr/bin/rhsmcertd -- gen_context(system_u:object_r:rhsmcertd_exec_t,s0) + ++/usr/libexec/rhsmd -- gen_context(system_u:object_r:rhsmcertd_exec_t,s0) ++ + /var/lib/rhsm(/.*)? gen_context(system_u:object_r:rhsmcertd_var_lib_t,s0) + + /var/lock/subsys/rhsmcertd -- gen_context(system_u:object_r:rhsmcertd_lock_t,s0) +diff --git a/rhsmcertd.if b/rhsmcertd.if +index 6dbc905b33..42e4306c83 100644 +--- a/rhsmcertd.if ++++ b/rhsmcertd.if +@@ -1,8 +1,8 @@ +-## Subscription Management Certificate Daemon. ++## Subscription Management Certificate Daemon policy + + ######################################## + ## +-## Execute rhsmcertd in the rhsmcertd domain. ++## Transition to rhsmcertd. + ## + ## + ## +@@ -21,12 +21,11 @@ interface(`rhsmcertd_domtrans',` + + ######################################## + ## +-## Execute rhsmcertd init scripts +-## in the initrc domain. ++## Execute rhsmcertd server in the rhsmcertd domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +@@ -40,7 +39,7 @@ interface(`rhsmcertd_initrc_domtrans',` + + ######################################## + ## +-## Read rhsmcertd log files. ++## Read rhsmcertd's log files. + ## + ## + ## +@@ -60,7 +59,7 @@ interface(`rhsmcertd_read_log',` + + ######################################## + ## +-## Append rhsmcertd log files. ++## Append to rhsmcertd log files. + ## + ## + ## +@@ -79,8 +78,7 @@ interface(`rhsmcertd_append_log',` + + ######################################## + ## +-## Create, read, write, and delete +-## rhsmcertd log files. ++## Manage rhsmcertd log files + ## + ## + ## +@@ -114,8 +112,8 @@ interface(`rhsmcertd_search_lib',` + type rhsmcertd_var_lib_t; + ') + +- files_search_var_lib($1) + allow $1 rhsmcertd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## +@@ -139,8 +137,7 @@ interface(`rhsmcertd_read_lib_files',` + + ######################################## + ## +-## Create, read, write, and delete +-## rhsmcertd lib files. ++## Manage rhsmcertd lib files. + ## + ## + ## +@@ -159,8 +156,7 @@ interface(`rhsmcertd_manage_lib_files',` + + ######################################## + ## +-## Create, read, write, and delete +-## rhsmcertd lib directories. ++## Manage rhsmcertd lib directories. + ## + ## + ## +@@ -179,7 +175,7 @@ interface(`rhsmcertd_manage_lib_dirs',` + + ######################################## + ## +-## Read rhsmcertd pid files. ++## Read rhsmcertd PID files. + ## + ## + ## +@@ -196,10 +192,47 @@ interface(`rhsmcertd_read_pid_files',` + allow $1 rhsmcertd_var_run_t:file read_file_perms; + ') + +-#################################### ++######################################## ++## ++## Read rhsmcertd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhsmcertd_manage_pid_files',` ++ gen_require(` ++ type rhsmcertd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, rhsmcertd_var_run_t, rhsmcertd_var_run_t) ++') ++ ++######################################## ++## ++## Read/wirte inherited lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rhsmcertd_rw_inherited_lock_files',` ++ gen_require(` ++ type rhsmcertd_lock_t; ++ ') ++ ++ files_search_locks($1) ++ allow $1 rhsmcertd_lock_t:file rw_inherited_file_perms; ++') ++ ++######################################## + ## +-## Connect to rhsmcertd with a +-## unix domain stream socket. ++## Read/wirte lock files. + ## + ## + ## +@@ -207,6 +240,26 @@ interface(`rhsmcertd_read_pid_files',` + ## + ## + # ++interface(`rhsmcertd_rw_lock_files',` ++ gen_require(` ++ type rhsmcertd_lock_t; ++ ') ++ ++ files_search_locks($1) ++ allow $1 rhsmcertd_lock_t:file rw_file_perms; ++') ++ ++#################################### ++## ++## Connect to rhsmcertd over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# + interface(`rhsmcertd_stream_connect',` + gen_require(` + type rhsmcertd_t, rhsmcertd_var_run_t; +@@ -239,30 +292,29 @@ interface(`rhsmcertd_dbus_chat',` + + ###################################### + ## +-## Do not audit attempts to send +-## and receive messages from +-## rhsmcertd over dbus. ++## Dontaudit Send and receive messages from ++## rhsmcertd over dbus. + ## + ## +-## +-## Domain to not audit. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`rhsmcertd_dontaudit_dbus_chat',` +- gen_require(` +- type rhsmcertd_t; +- class dbus send_msg; +- ') ++ gen_require(` ++ type rhsmcertd_t; ++ class dbus send_msg; ++ ') + +- dontaudit $1 rhsmcertd_t:dbus send_msg; +- dontaudit rhsmcertd_t $1:dbus send_msg; ++ dontaudit $1 rhsmcertd_t:dbus send_msg; ++ dontaudit rhsmcertd_t $1:dbus send_msg; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an rhsmcertd environment. ++## All of the rules required to administrate ++## an rhsmcertd environment + ## + ## + ## +@@ -270,35 +322,41 @@ interface(`rhsmcertd_dontaudit_dbus_chat',` + ## + ## + ## +-## +-## Role allowed access. +-## ++## ++## Role allowed access. ++## + ## + ## + # ++ + interface(`rhsmcertd_admin',` + gen_require(` + type rhsmcertd_t, rhsmcertd_initrc_exec_t, rhsmcertd_log_t; +- type rhsmcertd_var_lib_t, rhsmcertd_var_run_t, rhsmcertd_lock_t; ++ type rhsmcertd_var_lib_t, rhsmcertd_lock_t, rhsmcertd_var_run_t; + ') + +- allow $1 rhsmcertd_t:process { ptrace signal_perms }; ++ allow $1 rhsmcertd_t:process signal_perms; + ps_process_pattern($1, rhsmcertd_t) + +- rhsmcertd_initrc_domtrans($1) +- domain_system_change_exemption($1) +- role_transition $2 rhsmcertd_initrc_exec_t system_r; +- allow $2 system_r; ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rhsmcertd_t:process ptrace; ++ ') + +- logging_search_logs($1) +- admin_pattern($1, rhsmcertd_log_t) ++ rhsmcertd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 rhsmcertd_initrc_exec_t system_r; ++ allow $2 system_r; + +- files_search_var_lib($1) +- admin_pattern($1, rhsmcertd_var_lib_t) ++ logging_search_logs($1) ++ admin_pattern($1, rhsmcertd_log_t) + +- files_search_pids($1) +- admin_pattern($1, rhsmcertd_var_run_t) ++ files_search_var_lib($1) ++ admin_pattern($1, rhsmcertd_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, rhsmcertd_var_run_t) ++ ++ files_search_locks($1) ++ admin_pattern($1, rhsmcertd_lock_t) + +- files_search_locks($1) +- admin_pattern($1, rhsmcertd_lock_t) + ') +diff --git a/rhsmcertd.te b/rhsmcertd.te +index d32e1a2796..12c6f61ad2 100644 +--- a/rhsmcertd.te ++++ b/rhsmcertd.te +@@ -18,30 +18,43 @@ logging_log_file(rhsmcertd_log_t) + type rhsmcertd_lock_t; + files_lock_file(rhsmcertd_lock_t) + ++type rhsmcertd_tmp_t; ++files_tmp_file(rhsmcertd_tmp_t) ++ + type rhsmcertd_var_lib_t; + files_type(rhsmcertd_var_lib_t) + + type rhsmcertd_var_run_t; + files_pid_file(rhsmcertd_var_run_t) + ++type rhsmcertd_config_t; ++files_config_file(rhsmcertd_config_t) ++ + ######################################## + # + # Local policy + # + +-allow rhsmcertd_t self:capability sys_nice; +-allow rhsmcertd_t self:process { signal setsched }; ++allow rhsmcertd_t self:capability { kill sys_nice }; ++allow rhsmcertd_t self:process { signal_perms setsched }; ++ + allow rhsmcertd_t self:fifo_file rw_fifo_file_perms; + allow rhsmcertd_t self:unix_stream_socket create_stream_socket_perms; + ++manage_dirs_pattern(rhsmcertd_t, rhsmcertd_config_t, rhsmcertd_config_t) ++manage_files_pattern(rhsmcertd_t, rhsmcertd_config_t, rhsmcertd_config_t) ++files_etc_filetrans(rhsmcertd_t, rhsmcertd_config_t, { dir file }) ++ + manage_dirs_pattern(rhsmcertd_t, rhsmcertd_log_t, rhsmcertd_log_t) +-append_files_pattern(rhsmcertd_t, rhsmcertd_log_t, rhsmcertd_log_t) +-create_files_pattern(rhsmcertd_t, rhsmcertd_log_t, rhsmcertd_log_t) +-setattr_files_pattern(rhsmcertd_t, rhsmcertd_log_t, rhsmcertd_log_t) ++manage_files_pattern(rhsmcertd_t, rhsmcertd_log_t, rhsmcertd_log_t) + + manage_files_pattern(rhsmcertd_t, rhsmcertd_lock_t, rhsmcertd_lock_t) + files_lock_filetrans(rhsmcertd_t, rhsmcertd_lock_t, file) + ++manage_dirs_pattern(rhsmcertd_t, rhsmcertd_tmp_t, rhsmcertd_tmp_t) ++manage_files_pattern(rhsmcertd_t, rhsmcertd_tmp_t, rhsmcertd_tmp_t) ++files_tmp_filetrans(rhsmcertd_t, rhsmcertd_tmp_t, { dir file }) ++ + manage_dirs_pattern(rhsmcertd_t, rhsmcertd_var_lib_t, rhsmcertd_var_lib_t) + manage_files_pattern(rhsmcertd_t, rhsmcertd_var_lib_t, rhsmcertd_var_lib_t) + +@@ -50,25 +63,82 @@ manage_files_pattern(rhsmcertd_t, rhsmcertd_var_run_t, rhsmcertd_var_run_t) + files_pid_filetrans(rhsmcertd_t, rhsmcertd_var_run_t, { file dir }) + + kernel_read_network_state(rhsmcertd_t) ++kernel_read_net_sysctls(rhsmcertd_t) ++kernel_read_state(rhsmcertd_t) + kernel_read_system_state(rhsmcertd_t) ++kernel_read_sysctl(rhsmcertd_t) ++kernel_signull(rhsmcertd_t) ++ ++corenet_tcp_connect_http_port(rhsmcertd_t) ++corenet_tcp_connect_http_cache_port(rhsmcertd_t) ++corenet_tcp_connect_squid_port(rhsmcertd_t) ++corenet_tcp_connect_netport_port(rhsmcertd_t) ++corenet_tcp_connect_websm_port(rhsmcertd_t) + + corecmd_exec_bin(rhsmcertd_t) ++corecmd_exec_shell(rhsmcertd_t) + + dev_read_sysfs(rhsmcertd_t) + dev_read_rand(rhsmcertd_t) + dev_read_urand(rhsmcertd_t) ++dev_read_raw_memory(rhsmcertd_t) + ++domain_read_all_domains_state(rhsmcertd_t) ++domain_signull_all_domains(rhsmcertd_t) + files_list_tmp(rhsmcertd_t) +-files_read_etc_files(rhsmcertd_t) +-files_read_usr_files(rhsmcertd_t) ++files_manage_generic_locks(rhsmcertd_t) ++files_manage_system_conf_files(rhsmcertd_t) ++files_create_boot_flag(rhsmcertd_t) ++files_dontaudit_write_all_mountpoints(rhsmcertd_t) ++ ++fs_dontaudit_write_configfs_dirs(rhsmcertd_t) ++fs_read_xenfs_files(rhsmcertd_t) ++ ++auth_read_passwd(rhsmcertd_t) ++ ++libs_exec_ldconfig(rhsmcertd_t) + + init_read_state(rhsmcertd_t) + +-miscfiles_read_localization(rhsmcertd_t) +-miscfiles_read_generic_certs(rhsmcertd_t) ++logging_send_syslog_msg(rhsmcertd_t) ++ ++miscfiles_manage_generic_cert_files(rhsmcertd_t) ++miscfiles_manage_generic_cert_dirs(rhsmcertd_t) ++ ++nis_use_ypbind(rhsmcertd_t) + + sysnet_dns_name_resolve(rhsmcertd_t) + ++ifdef(`hide_broken_symptoms',` ++ exec_files_pattern(rhsmcertd_t, rhsmcertd_tmp_t, rhsmcertd_tmp_t) ++ exec_files_pattern(rhsmcertd_t, rhsmcertd_var_run_t, rhsmcertd_var_run_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(rhsmcertd_t,rhsmcertd_exec_t) ++') ++ ++optional_policy(` ++ dmidecode_domtrans(rhsmcertd_t) ++') ++ ++optional_policy(` ++ gnome_dontaudit_search_config(rhsmcertd_t) ++') ++ ++optional_policy(` ++ container_rw_config(rhsmcertd_t) ++') ++ ++optional_policy(` ++ hostname_exec(rhsmcertd_t) ++') ++ ++optional_policy(` ++ rhnsd_manage_config(rhsmcertd_t) ++') ++ + optional_policy(` +- rpm_read_db(rhsmcertd_t) ++ rpm_manage_db(rhsmcertd_t) ++ rpm_read_log(rhsmcertd_t) + ') +diff --git a/ricci.if b/ricci.if +index 2ab3ed1d4c..23d579cde4 100644 +--- a/ricci.if ++++ b/ricci.if +@@ -1,13 +1,13 @@ +-## Ricci cluster management agent. ++## Ricci cluster management agent + + ######################################## + ## + ## Execute a domain transition to run ricci. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`ricci_domtrans',` +@@ -15,19 +15,35 @@ interface(`ricci_domtrans',` + type ricci_t, ricci_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_exec_t, ricci_t) + ') + +-######################################## ++####################################### + ## +-## Execute a domain transition to +-## run ricci modcluster. ++## Execute ricci server in the ricci domain. + ## + ## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ricci_initrc_domtrans',` ++ gen_require(` ++ type ricci_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, ricci_initrc_exec_t) ++') ++ ++######################################## + ## +-## Domain allowed to transition. ++## Execute a domain transition to run ricci_modcluster. + ## ++## ++## ++## Domain allowed to transition. ++## + ## + # + interface(`ricci_domtrans_modcluster',` +@@ -35,14 +51,13 @@ interface(`ricci_domtrans_modcluster',` + type ricci_modcluster_t, ricci_modcluster_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_modcluster_exec_t, ricci_modcluster_t) + ') + + ######################################## + ## + ## Do not audit attempts to use +-## ricci modcluster file descriptors. ++## ricci_modcluster file descriptors. + ## + ## + ## +@@ -61,7 +76,7 @@ interface(`ricci_dontaudit_use_modcluster_fds',` + ######################################## + ## + ## Do not audit attempts to read write +-## ricci modcluster unamed pipes. ++## ricci_modcluster unamed pipes. + ## + ## + ## +@@ -74,13 +89,12 @@ interface(`ricci_dontaudit_rw_modcluster_pipes',` + type ricci_modcluster_t; + ') + +- dontaudit $1 ricci_modcluster_t:fifo_file { read write }; ++ dontaudit $1 ricci_modcluster_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Connect to ricci_modclusterd with +-## a unix domain stream socket. ++## Connect to ricci_modclusterd over a unix stream socket. + ## + ## + ## +@@ -99,8 +113,26 @@ interface(`ricci_stream_connect_modclusterd',` + + ######################################## + ## +-## Execute a domain transition to +-## run ricci modlog. ++## Read and write to ricci_modcluserd temporary file system. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ricci_rw_modclusterd_tmpfs_files',` ++ gen_require(` ++ type ricci_modclusterd_tmpfs_t; ++ ') ++ ++ fs_search_tmpfs($1) ++ allow $1 ricci_modclusterd_tmpfs_t:file rw_file_perms; ++') ++ ++######################################## ++## ++## Execute a domain transition to run ricci_modlog. + ## + ## + ## +@@ -113,14 +145,12 @@ interface(`ricci_domtrans_modlog',` + type ricci_modlog_t, ricci_modlog_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_modlog_exec_t, ricci_modlog_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run ricci modrpm. ++## Execute a domain transition to run ricci_modrpm. + ## + ## + ## +@@ -133,14 +163,12 @@ interface(`ricci_domtrans_modrpm',` + type ricci_modrpm_t, ricci_modrpm_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_modrpm_exec_t, ricci_modrpm_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run ricci modservice. ++## Execute a domain transition to run ricci_modservice. + ## + ## + ## +@@ -153,14 +181,12 @@ interface(`ricci_domtrans_modservice',` + type ricci_modservice_t, ricci_modservice_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_modservice_exec_t, ricci_modservice_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run ricci modstorage. ++## Execute a domain transition to run ricci_modstorage. + ## + ## + ## +@@ -173,14 +199,33 @@ interface(`ricci_domtrans_modstorage',` + type ricci_modstorage_t, ricci_modstorage_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, ricci_modstorage_exec_t, ricci_modstorage_t) + ') + ++#################################### ++## ++## Allow the specified domain to manage ricci's lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`ricci_manage_lib_files',` ++ gen_require(` ++ type ricci_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, ricci_var_lib_t, ricci_var_lib_t) ++ manage_files_pattern($1, ricci_var_lib_t, ricci_var_lib_t) ++') ++ + ######################################## + ## +-## All of the rules required to +-## administrate an ricci environment. ++## All of the rules required to administrate ++## an ricci environment + ## + ## + ## +@@ -200,10 +245,13 @@ interface(`ricci_admin',` + type ricci_var_lib_t, ricci_var_log_t, ricci_var_run_t; + ') + +- allow $1 ricci_t:process { ptrace signal_perms }; ++ allow $1 ricci_t:process signal_perms; + ps_process_pattern($1, ricci_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ricci_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, ricci_initrc_exec_t) ++ ricci_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 ricci_initrc_exec_t system_r; + allow $2 system_r; +diff --git a/ricci.te b/ricci.te +index 0ba2569a5f..161850d419 100644 +--- a/ricci.te ++++ b/ricci.te +@@ -115,7 +115,6 @@ kernel_read_system_state(ricci_t) + + corecmd_exec_bin(ricci_t) + +-corenet_all_recvfrom_unlabeled(ricci_t) + corenet_all_recvfrom_netlabel(ricci_t) + corenet_tcp_sendrecv_generic_if(ricci_t) + corenet_tcp_sendrecv_generic_node(ricci_t) +@@ -136,7 +135,6 @@ dev_read_urand(ricci_t) + + domain_read_all_domains_state(ricci_t) + +-files_read_etc_files(ricci_t) + files_read_etc_runtime_files(ricci_t) + files_create_boot_flag(ricci_t) + +@@ -149,7 +147,7 @@ locallogin_dontaudit_use_fds(ricci_t) + + logging_send_syslog_msg(ricci_t) + +-miscfiles_read_localization(ricci_t) ++systemd_start_power_services(ricci_t) + + sysnet_dns_name_resolve(ricci_t) + +@@ -235,13 +233,8 @@ init_domtrans_script(ricci_modcluster_t) + + logging_send_syslog_msg(ricci_modcluster_t) + +-miscfiles_read_localization(ricci_modcluster_t) +- +-ricci_stream_connect_modclusterd(ricci_modcluster_t) +- + optional_policy(` +- aisexec_stream_connect(ricci_modcluster_t) +- corosync_stream_connect(ricci_modcluster_t) ++ ricci_stream_connect_modclusterd(ricci_modcluster_t) + ') + + optional_policy(` +@@ -271,7 +264,7 @@ optional_policy(` + ') + + optional_policy(` +- rgmanager_stream_connect(ricci_modcluster_t) ++ rhcs_stream_connect_cluster(ricci_modcluster_t) + ') + + ######################################## +@@ -336,15 +329,8 @@ locallogin_dontaudit_use_fds(ricci_modclusterd_t) + + logging_send_syslog_msg(ricci_modclusterd_t) + +-miscfiles_read_localization(ricci_modclusterd_t) +- + sysnet_domtrans_ifconfig(ricci_modclusterd_t) + +-optional_policy(` +- aisexec_stream_connect(ricci_modclusterd_t) +- corosync_stream_connect(ricci_modclusterd_t) +-') +- + optional_policy(` + ccs_domtrans(ricci_modclusterd_t) + ccs_stream_connect(ricci_modclusterd_t) +@@ -352,7 +338,7 @@ optional_policy(` + ') + + optional_policy(` +- rgmanager_stream_connect(ricci_modclusterd_t) ++ rhcs_stream_connect_cluster(ricci_modclusterd_t) + ') + + optional_policy(` +@@ -374,12 +360,10 @@ corecmd_exec_bin(ricci_modlog_t) + + domain_read_all_domains_state(ricci_modlog_t) + +-files_read_etc_files(ricci_modlog_t) + files_search_usr(ricci_modlog_t) + + logging_read_generic_logs(ricci_modlog_t) + +-miscfiles_read_localization(ricci_modlog_t) + + optional_policy(` + nscd_dontaudit_search_pid(ricci_modlog_t) +@@ -401,9 +385,8 @@ kernel_read_kernel_sysctls(ricci_modrpm_t) + corecmd_exec_bin(ricci_modrpm_t) + + files_search_usr(ricci_modrpm_t) +-files_read_etc_files(ricci_modrpm_t) + +-miscfiles_read_localization(ricci_modrpm_t) ++logging_send_syslog_msg(ricci_modrpm_t) + + optional_policy(` + oddjob_system_entry(ricci_modrpm_t, ricci_modrpm_exec_t) +@@ -418,7 +401,7 @@ optional_policy(` + # Modservice local policy + # + +-allow ricci_modservice_t self:capability { dac_override sys_nice }; ++allow ricci_modservice_t self:capability {dac_read_search dac_override sys_nice }; + allow ricci_modservice_t self:process setsched; + allow ricci_modservice_t self:fifo_file rw_fifo_file_perms; + +@@ -428,14 +411,13 @@ kernel_read_system_state(ricci_modservice_t) + corecmd_exec_bin(ricci_modservice_t) + corecmd_exec_shell(ricci_modservice_t) + +-files_read_etc_files(ricci_modservice_t) + files_read_etc_runtime_files(ricci_modservice_t) + files_search_usr(ricci_modservice_t) + files_manage_etc_symlinks(ricci_modservice_t) + + init_domtrans_script(ricci_modservice_t) + +-miscfiles_read_localization(ricci_modservice_t) ++logging_send_syslog_msg(ricci_modservice_t) + + optional_policy(` + ccs_read_config(ricci_modservice_t) +@@ -460,7 +442,6 @@ optional_policy(` + + allow ricci_modstorage_t self:capability { mknod sys_nice }; + allow ricci_modstorage_t self:process { setsched signal }; +-dontaudit ricci_modstorage_t self:process ptrace; + allow ricci_modstorage_t self:fifo_file rw_fifo_file_perms; + + kernel_read_kernel_sysctls(ricci_modstorage_t) +@@ -480,21 +461,21 @@ domain_read_all_domains_state(ricci_modstorage_t) + + files_manage_etc_files(ricci_modstorage_t) + files_read_etc_runtime_files(ricci_modstorage_t) +-files_read_usr_files(ricci_modstorage_t) + files_read_kernel_modules(ricci_modstorage_t) + ++files_create_default_dir(ricci_modstorage_t) ++files_root_filetrans_default(ricci_modstorage_t, dir) ++files_mounton_default(ricci_modstorage_t) ++files_manage_default_dirs(ricci_modstorage_t) ++files_manage_default_files(ricci_modstorage_t) ++ + storage_raw_read_fixed_disk(ricci_modstorage_t) + + term_dontaudit_use_console(ricci_modstorage_t) + +-logging_send_syslog_msg(ricci_modstorage_t) +- +-miscfiles_read_localization(ricci_modstorage_t) ++auth_use_nsswitch(ricci_modstorage_t) + +-optional_policy(` +- aisexec_stream_connect(ricci_modstorage_t) +- corosync_stream_connect(ricci_modstorage_t) +-') ++logging_send_syslog_msg(ricci_modstorage_t) + + optional_policy(` + ccs_stream_connect(ricci_modstorage_t) +diff --git a/rkhunter.fc b/rkhunter.fc +new file mode 100644 +index 0000000000..645a9cc1a5 +--- /dev/null ++++ b/rkhunter.fc +@@ -0,0 +1 @@ ++/var/lib/rkhunter(/.*)? gen_context(system_u:object_r:rkhunter_var_lib_t,s0) +diff --git a/rkhunter.if b/rkhunter.if +new file mode 100644 +index 0000000000..0be4ceec01 +--- /dev/null ++++ b/rkhunter.if +@@ -0,0 +1,39 @@ ++## policy for rkhunter ++ ++######################################## ++## ++## Append rkhunter lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rkhunter_append_lib_files',` ++ gen_require(` ++ type rkhunter_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ append_files_pattern($1, rkhunter_var_lib_t, rkhunter_var_lib_t) ++') ++ ++######################################## ++## ++## Manage rkhunter lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rkhunter_manage_lib_files',` ++ gen_require(` ++ type rkhunter_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, rkhunter_var_lib_t, rkhunter_var_lib_t) ++') +diff --git a/rkhunter.te b/rkhunter.te +new file mode 100644 +index 0000000000..630f92bf9b +--- /dev/null ++++ b/rkhunter.te +@@ -0,0 +1,4 @@ ++policy_module(rkhunter, 1.0) ++ ++type rkhunter_var_lib_t; ++files_type(rkhunter_var_lib_t) +diff --git a/rlogin.fc b/rlogin.fc +index f111877209..e361ee9e2e 100644 +--- a/rlogin.fc ++++ b/rlogin.fc +@@ -1,5 +1,7 @@ +-HOME_DIR/\.rhosts -- gen_context(system_u:object_r:rlogind_home_t,s0) +-HOME_DIR/\.rlogin -- gen_context(system_u:object_r:rlogind_home_t,s0) ++HOME_DIR/\.rlogin -- gen_context(system_u:object_r:rlogind_home_t,s0) ++HOME_DIR/\.rhosts -- gen_context(system_u:object_r:rlogind_home_t,s0) ++/root/\.rlogin -- gen_context(system_u:object_r:rlogind_home_t,s0) ++/root/\.rhosts -- gen_context(system_u:object_r:rlogind_home_t,s0) + + /usr/kerberos/sbin/klogind -- gen_context(system_u:object_r:rlogind_exec_t,s0) + +diff --git a/rlogin.if b/rlogin.if +index 050479dea0..0e1b364fb4 100644 +--- a/rlogin.if ++++ b/rlogin.if +@@ -29,7 +29,7 @@ interface(`rlogin_domtrans',` + ## + ## + # +-template(`rlogin_read_home_content',` ++interface(`rlogin_read_home_content',` + gen_require(` + type rlogind_home_t; + ') +diff --git a/rlogin.te b/rlogin.te +index ee27948589..34d2ee96f3 100644 +--- a/rlogin.te ++++ b/rlogin.te +@@ -31,10 +31,12 @@ files_pid_file(rlogind_var_run_t) + # Local policy + # + +-allow rlogind_t self:capability { fsetid chown fowner setuid setgid sys_tty_config dac_override }; ++allow rlogind_t self:capability { fsetid chown fowner setuid setgid sys_tty_config dac_read_search dac_override }; + allow rlogind_t self:process signal_perms; + allow rlogind_t self:fifo_file rw_fifo_file_perms; +-allow rlogind_t self:tcp_socket { accept listen }; ++allow rlogind_t self:tcp_socket connected_stream_socket_perms; ++# for identd; cjp: this should probably only be inetd_child rules? ++allow rlogind_t self:netlink_tcpdiag_socket r_netlink_socket_perms; + + allow rlogind_t rlogind_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms }; + term_create_pty(rlogind_t, rlogind_devpts_t) +@@ -45,7 +47,6 @@ allow rlogind_t rlogind_keytab_t:file read_file_perms; + + manage_dirs_pattern(rlogind_t, rlogind_tmp_t, rlogind_tmp_t) + manage_files_pattern(rlogind_t, rlogind_tmp_t, rlogind_tmp_t) +-files_tmp_filetrans(rlogind_t, rlogind_tmp_t, { dir file }) + + manage_files_pattern(rlogind_t, rlogind_var_run_t, rlogind_var_run_t) + files_pid_filetrans(rlogind_t, rlogind_var_run_t, file) +@@ -56,7 +57,6 @@ kernel_read_kernel_sysctls(rlogind_t) + kernel_read_system_state(rlogind_t) + kernel_read_network_state(rlogind_t) + +-corenet_all_recvfrom_unlabeled(rlogind_t) + corenet_all_recvfrom_netlabel(rlogind_t) + corenet_tcp_sendrecv_generic_if(rlogind_t) + corenet_tcp_sendrecv_generic_node(rlogind_t) +@@ -65,6 +65,10 @@ corenet_sendrecv_rlogind_server_packets(rlogind_t) + corenet_tcp_bind_rlogind_port(rlogind_t) + corenet_tcp_sendrecv_rlogind_port(rlogind_t) + ++corenet_sendrecv_rlogin_server_packets(rlogind_t) ++corenet_tcp_bind_rlogin_port(rlogind_t) ++corenet_tcp_sendrecv_rlogin_port(rlogind_t) ++ + dev_read_urand(rlogind_t) + + domain_interactive_fd(rlogind_t) +@@ -73,6 +77,7 @@ fs_getattr_all_fs(rlogind_t) + fs_search_auto_mountpoints(rlogind_t) + + auth_domtrans_chk_passwd(rlogind_t) ++auth_signal_chk_passwd(rlogind_t) + auth_rw_login_records(rlogind_t) + auth_use_nsswitch(rlogind_t) + +@@ -83,29 +88,23 @@ init_rw_utmp(rlogind_t) + + logging_send_syslog_msg(rlogind_t) + +-miscfiles_read_localization(rlogind_t) +- + seutil_read_config(rlogind_t) + + userdom_search_user_home_dirs(rlogind_t) + userdom_setattr_user_ptys(rlogind_t) ++# cjp: this is egregious ++userdom_read_user_home_content_files(rlogind_t) ++userdom_search_admin_dir(rlogind_t) ++userdom_manage_user_tmp_files(rlogind_t) ++userdom_tmp_filetrans_user_tmp(rlogind_t, file) + userdom_use_user_terminals(rlogind_t) ++userdom_home_reader(rlogind_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_list_nfs(rlogind_t) +- fs_read_nfs_files(rlogind_t) +- fs_read_nfs_symlinks(rlogind_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_list_cifs(rlogind_t) +- fs_read_cifs_files(rlogind_t) +- fs_read_cifs_symlinks(rlogind_t) +-') ++rlogin_read_home_content(rlogind_t) + + optional_policy(` + kerberos_read_keytab(rlogind_t) +- kerberos_tmp_filetrans_host_rcache(rlogind_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(rlogind_t, "host_0") + kerberos_manage_host_rcache(rlogind_t) + kerberos_use(rlogind_t) + ') +diff --git a/rngd.fc b/rngd.fc +index fa19aa8ded..90eb481c16 100644 +--- a/rngd.fc ++++ b/rngd.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/rngd -- gen_context(system_u:object_r:rngd_initrc_exec_t,s0) + ++/usr/lib/systemd/system/rngd.* -- gen_context(system_u:object_r:rngd_unit_file_t,s0) ++ + /usr/sbin/rngd -- gen_context(system_u:object_r:rngd_exec_t,s0) + + /var/run/rngd\.pid -- gen_context(system_u:object_r:rngd_var_run_t,s0) +diff --git a/rngd.if b/rngd.if +index 13f788fd57..10e2033015 100644 +--- a/rngd.if ++++ b/rngd.if +@@ -1,5 +1,28 @@ + ## Check and feed random data from hardware device to kernel random device. + ++######################################## ++## ++## Execute rngd in the rngd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rng_systemctl_rngd',` ++ gen_require(` ++ type rngd_t, rngd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 rngd_unit_file_t:file read_file_perms; ++ allow $1 rngd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rngd_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -17,14 +40,18 @@ + ## + ## + # +-interface(`rngd_admin',` ++interface(`rng_admin',` + gen_require(` +- type rngd_t, rngd_initrc_exec_t, rngd_var_run_t; ++ type rngd_t, rngd_initrc_exec_t, rngd_var_run_t, rngd_unit_file_t; + ') + +- allow $1 rngd_t:process { ptrace signal_perms }; ++ allow $1 rngd_t:process signal_perms; + ps_process_pattern($1, rngd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rngd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, rngd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 rngd_initrc_exec_t system_r; +@@ -32,4 +59,8 @@ interface(`rngd_admin',` + + files_search_pids($1) + admin_pattern($1, rngd_var_run_t) ++ ++ rng_systemctl_rngd($1) ++ admin_pattern($1, rngd_unit_file_t) ++ allow $1 rngd_unit_file_t:service all_service_perms; + ') +diff --git a/rngd.te b/rngd.te +index a7b7717b7f..6023a77e9e 100644 +--- a/rngd.te ++++ b/rngd.te +@@ -12,6 +12,9 @@ init_daemon_domain(rngd_t, rngd_exec_t) + type rngd_initrc_exec_t; + init_script_file(rngd_initrc_exec_t) + ++type rngd_unit_file_t; ++systemd_unit_file(rngd_unit_file_t) ++ + type rngd_var_run_t; + files_pid_file(rngd_var_run_t) + +@@ -34,9 +37,10 @@ dev_read_rand(rngd_t) + dev_read_urand(rngd_t) + dev_rw_tpm(rngd_t) + dev_write_rand(rngd_t) +- +-files_read_etc_files(rngd_t) ++dev_read_sysfs(rngd_t) + + logging_send_syslog_msg(rngd_t) + +-miscfiles_read_localization(rngd_t) ++miscfiles_read_certs(rngd_t) ++ ++term_use_usb_ttys(rngd_t) +diff --git a/rolekit.fc b/rolekit.fc +new file mode 100644 +index 0000000000..504b6e13e7 +--- /dev/null ++++ b/rolekit.fc +@@ -0,0 +1,3 @@ ++/usr/lib/systemd/system/rolekit.* -- gen_context(system_u:object_r:rolekit_unit_file_t,s0) ++ ++/usr/sbin/roled -- gen_context(system_u:object_r:rolekit_exec_t,s0) +diff --git a/rolekit.if b/rolekit.if +new file mode 100644 +index 0000000000..b11fb8f6d9 +--- /dev/null ++++ b/rolekit.if +@@ -0,0 +1,120 @@ ++## Daemon for Linux systems providing a stable D-BUS interface to manage the deployment of Server Roles. ++ ++######################################## ++## ++## Execute rolekit in the rolekit domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rolekit_domtrans',` ++ gen_require(` ++ type rolekit_t, rolekit_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, rolekit_exec_t, rolekit_t) ++') ++ ++######################################## ++## ++## Execute rolekit server in the rolekit domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rolekit_systemctl',` ++ gen_require(` ++ type rolekit_t; ++ type rolekit_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 rolekit_unit_file_t:file read_file_perms; ++ allow $1 rolekit_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rolekit_t) ++') ++####################################### ++## ++## Manage rolekit kernel keyrings. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rolekit_manage_keys',` ++ gen_require(` ++ type rolekit_t; ++ ') ++ ++ allow $1 rolekit_t:key manage_key_perms; ++ allow rolekit_t $1:key manage_key_perms; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## policykit over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rolekit_dbus_chat',` ++ gen_require(` ++ type rolekit_t; ++ class dbus send_msg; ++ ') ++ ++ ps_process_pattern(rolekit_t, $1) ++ ++ allow $1 rolekit_t:dbus send_msg; ++ allow rolekit_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rolekit environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`rolekit_admin',` ++ gen_require(` ++ type rolekit_t; ++ type rolekit_unit_file_t; ++ ') ++ ++ allow $1 rolekit_t:process { signal_perms }; ++ ps_process_pattern($1, rolekit_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rolekit_t:process ptrace; ++ ') ++ ++ rolekit_systemctl($1) ++ admin_pattern($1, rolekit_unit_file_t) ++ allow $1 rolekit_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/rolekit.te b/rolekit.te +new file mode 100644 +index 0000000000..da944537bb +--- /dev/null ++++ b/rolekit.te +@@ -0,0 +1,47 @@ ++policy_module(rolekit, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type rolekit_t; ++type rolekit_exec_t; ++init_daemon_domain(rolekit_t, rolekit_exec_t) ++ ++type rolekit_tmp_t; ++files_tmp_file(rolekit_tmp_t) ++ ++type rolekit_unit_file_t; ++systemd_unit_file(rolekit_unit_file_t) ++ ++######################################## ++# ++# rolekit local policy ++# ++ ++allow rolekit_t self:fifo_file rw_fifo_file_perms; ++allow rolekit_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_files_pattern(rolekit_t, rolekit_tmp_t, rolekit_tmp_t) ++manage_dirs_pattern(rolekit_t, rolekit_tmp_t, rolekit_tmp_t) ++files_tmp_filetrans(rolekit_t, rolekit_tmp_t, { file dir }) ++ ++kernel_read_system_state(rolekit_t) ++ ++auth_use_nsswitch(rolekit_t) ++ ++optional_policy(` ++ sssd_domtrans(rolekit_t) ++') ++ ++optional_policy(` ++ rpm_transition_script(rolekit_t, system_r) ++') ++ ++optional_policy(` ++ unconfined_domain_noaudit(rolekit_t) ++ #should be changed for debugging ++ #unconfined_domain(rolekit_t) ++ domain_named_filetrans(rolekit_t) ++') +diff --git a/roundup.if b/roundup.if +index 975bb6a457..ce4f5ead8d 100644 +--- a/roundup.if ++++ b/roundup.if +@@ -23,8 +23,11 @@ interface(`roundup_admin',` + type roundup_initrc_exec_t; + ') + +- allow $1 roundup_t:process { ptrace signal_perms }; ++ allow $1 roundup_t:process signal_perms; + ps_process_pattern($1, roundup_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 roundup_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, roundup_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/roundup.te b/roundup.te +index ccb5991ed5..189ac011c7 100644 +--- a/roundup.te ++++ b/roundup.te +@@ -41,7 +41,6 @@ kernel_read_proc_symlinks(roundup_t) + + corecmd_exec_bin(roundup_t) + +-corenet_all_recvfrom_unlabeled(roundup_t) + corenet_all_recvfrom_netlabel(roundup_t) + corenet_tcp_sendrecv_generic_if(roundup_t) + corenet_tcp_sendrecv_generic_node(roundup_t) +@@ -60,16 +59,11 @@ dev_read_urand(roundup_t) + + domain_use_interactive_fds(roundup_t) + +-files_read_etc_files(roundup_t) +-files_read_usr_files(roundup_t) +- + fs_getattr_all_fs(roundup_t) + fs_search_auto_mountpoints(roundup_t) + + logging_send_syslog_msg(roundup_t) + +-miscfiles_read_localization(roundup_t) +- + sysnet_dns_name_resolve(roundup_t) + + userdom_dontaudit_use_unpriv_user_fds(roundup_t) +diff --git a/rpc.fc b/rpc.fc +index a6fb30cb3a..38a2f09112 100644 +--- a/rpc.fc ++++ b/rpc.fc +@@ -1,12 +1,23 @@ +-/etc/exports -- gen_context(system_u:object_r:exports_t,s0) ++# ++# /etc ++# ++/etc/exports -- gen_context(system_u:object_r:exports_t,s0) ++/etc/rc\.d/init\.d/nfs -- gen_context(system_u:object_r:nfsd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/nfslock -- gen_context(system_u:object_r:rpcd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/rpcidmapd -- gen_context(system_u:object_r:rpcd_initrc_exec_t,s0) + +-/etc/rc\.d/init\.d/nfs -- gen_context(system_u:object_r:nfsd_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/nfslock -- gen_context(system_u:object_r:rpcd_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/rpcidmapd -- gen_context(system_u:object_r:rpcd_initrc_exec_t,s0) ++/usr/lib/systemd/system/nfs.* -- gen_context(system_u:object_r:nfsd_unit_file_t,s0) ++/usr/lib/systemd/system/rpc.* -- gen_context(system_u:object_r:rpcd_unit_file_t,s0) + +-/sbin/rpc\..* -- gen_context(system_u:object_r:rpcd_exec_t,s0) +-/sbin/sm-notify -- gen_context(system_u:object_r:rpcd_exec_t,s0) ++# ++# /sbin ++# ++/sbin/rpc\..* -- gen_context(system_u:object_r:rpcd_exec_t,s0) ++/sbin/sm-notify -- gen_context(system_u:object_r:rpcd_exec_t,s0) + ++# ++# /usr ++# + /usr/sbin/rpc\..* -- gen_context(system_u:object_r:rpcd_exec_t,s0) + /usr/sbin/rpc\.idmapd -- gen_context(system_u:object_r:rpcd_exec_t,s0) + /usr/sbin/rpc\.gssd -- gen_context(system_u:object_r:gssd_exec_t,s0) +@@ -16,7 +27,12 @@ + /usr/sbin/rpc\.svcgssd -- gen_context(system_u:object_r:gssd_exec_t,s0) + /usr/sbin/sm-notify -- gen_context(system_u:object_r:rpcd_exec_t,s0) + +-/var/lib/nfs(/.*)? gen_context(system_u:object_r:var_lib_nfs_t,s0) ++# ++# /var ++# ++/var/lib/nfs(/.*)? gen_context(system_u:object_r:var_lib_nfs_t,s0) + ++/var/run/sm-notify.* gen_context(system_u:object_r:rpcd_var_run_t,s0) + /var/run/rpc\.statd(/.*)? gen_context(system_u:object_r:rpcd_var_run_t,s0) +-/var/run/rpc\.statd\.pid -- gen_context(system_u:object_r:rpcd_var_run_t,s0) ++/var/run/rpc\.statd\.pid -- gen_context(system_u:object_r:rpcd_var_run_t,s0) ++ +diff --git a/rpc.if b/rpc.if +index 0bf13c2207..79a2a9c48a 100644 +--- a/rpc.if ++++ b/rpc.if +@@ -1,4 +1,4 @@ +-## Remote Procedure Call Daemon. ++## Remote Procedure Call Daemon for managment of network based process communication + + ######################################## + ## +@@ -20,15 +20,21 @@ interface(`rpc_stub',` + ## + ## The template to define a rpc domain. + ## +-## ++## ++##

      ++## This template creates a domain to be used for ++## a new rpc daemon. ++##

      ++##
      ++## + ## +-## Domain prefix to be used. ++## The type of daemon to be used. + ## + ## + # + template(`rpc_domain_template',` + gen_require(` +- attribute rpc_domain; ++ attribute rpc_domain; + ') + + ######################################## +@@ -42,12 +48,19 @@ template(`rpc_domain_template',` + + domain_use_interactive_fds($1_t) + +- ######################################## ++ #################################### + # +- # Policy ++ # Local Policy + # + ++ kernel_read_system_state($1_t) ++ ++ corenet_all_recvfrom_unlabeled($1_t) ++ corenet_all_recvfrom_netlabel($1_t) ++ + auth_use_nsswitch($1_t) ++ ++ logging_send_syslog_msg($1_t) + ') + + ######################################## +@@ -66,8 +79,8 @@ interface(`rpc_udp_send',` + + ######################################## + ## +-## Do not audit attempts to get +-## attributes of export files. ++## Do not audit attempts to get the attributes ++## of the NFS export file. + ## + ## + ## +@@ -80,12 +93,12 @@ interface(`rpc_dontaudit_getattr_exports',` + type exports_t; + ') + +- dontaudit $1 exports_t:file getattr; ++ dontaudit $1 exports_t:file getattr_file_perms; + ') + + ######################################## + ## +-## Read export files. ++## Allow read access to exports. + ## + ## + ## +@@ -103,7 +116,7 @@ interface(`rpc_read_exports',` + + ######################################## + ## +-## Write export files. ++## Allow write access to exports. + ## + ## + ## +@@ -116,12 +129,12 @@ interface(`rpc_write_exports',` + type exports_t; + ') + +- allow $1 exports_t:file write; ++ allow $1 exports_t:file write_file_perms; + ') + + ######################################## + ## +-## Execute nfsd in the nfsd domain. ++## Execute domain in nfsd domain. + ## + ## + ## +@@ -134,14 +147,12 @@ interface(`rpc_domtrans_nfsd',` + type nfsd_t, nfsd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, nfsd_exec_t, nfsd_t) + ') + + ####################################### + ## +-## Execute nfsd init scripts in +-## the initrc domain. ++## Execute domain in nfsd domain. + ## + ## + ## +@@ -159,7 +170,7 @@ interface(`rpc_initrc_domtrans_nfsd',` + + ######################################## + ## +-## Execute rpcd in the rpcd domain. ++## Execute nfsd server in the nfsd domain. + ## + ## + ## +@@ -167,120 +178,128 @@ interface(`rpc_initrc_domtrans_nfsd',` + ## + ## + # +-interface(`rpc_domtrans_rpcd',` ++interface(`rpc_systemctl_nfsd',` + gen_require(` +- type rpcd_t, rpcd_exec_t; ++ type nfsd_unit_file_t; ++ type nfsd_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, rpcd_exec_t, rpcd_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 nfsd_unit_file_t:file read_file_perms; ++ allow $1 nfsd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, nfsd_t) + ') + +-####################################### ++######################################## + ## +-## Execute rpcd init scripts in +-## the initrc domain. ++## Send kill signals to rpcd. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`rpc_initrc_domtrans_rpcd',` ++interface(`rpc_kill_rpcd',` + gen_require(` +- type rpcd_initrc_exec_t; ++ type rpcd_t; + ') + +- init_labeled_script_domtrans($1, rpcd_initrc_exec_t) ++ allow $1 rpcd_t:process sigkill; + ') + + ######################################## + ## +-## Read nfs exported content. ++## Execute domain in rpcd domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## + # +-interface(`rpc_read_nfs_content',` ++interface(`rpc_domtrans_rpcd',` + gen_require(` +- type nfsd_ro_t, nfsd_rw_t; ++ type rpcd_t, rpcd_exec_t; + ') + +- allow $1 { nfsd_ro_t nfsd_rw_t }:dir list_dir_perms; +- allow $1 { nfsd_ro_t nfsd_rw_t }:file read_file_perms; +- allow $1 { nfsd_ro_t nfsd_rw_t }:lnk_file read_lnk_file_perms; ++ domtrans_pattern($1, rpcd_exec_t, rpcd_t) ++ allow rpcd_t $1:process signal; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## nfs exported read write content. ++## Execute rpcd in the rcpd domain, and ++## allow the specified role the rpcd domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## ++## ++## ++## Role allowed access. ++## ++## + ## + # +-interface(`rpc_manage_nfs_rw_content',` ++interface(`rpc_run_rpcd',` + gen_require(` +- type nfsd_rw_t; ++ type rpcd_t; + ') + +- manage_dirs_pattern($1, nfsd_rw_t, nfsd_rw_t) +- manage_files_pattern($1, nfsd_rw_t, nfsd_rw_t) +- manage_lnk_files_pattern($1, nfsd_rw_t, nfsd_rw_t) ++ rpc_domtrans_rpcd($1) ++ role $2 types rpcd_t; + ') + +-######################################## ++####################################### + ## +-## Create, read, write, and delete +-## nfs exported read only content. ++## Execute domain in rpcd domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## + # +-interface(`rpc_manage_nfs_ro_content',` ++interface(`rpc_initrc_domtrans_rpcd',` + gen_require(` +- type nfsd_ro_t; ++ type rpcd_initrc_exec_t; + ') + +- manage_dirs_pattern($1, nfsd_ro_t, nfsd_ro_t) +- manage_files_pattern($1, nfsd_ro_t, nfsd_ro_t) +- manage_lnk_files_pattern($1, nfsd_ro_t, nfsd_ro_t) ++ init_labeled_script_domtrans($1, rpcd_initrc_exec_t) + ') + + ######################################## + ## +-## Read and write to nfsd tcp sockets. ++## Execute rpcd server in the rpcd domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`rpc_tcp_rw_nfs_sockets',` ++interface(`rpc_systemctl_rpcd',` + gen_require(` +- type nfsd_t; ++ type rpcd_unit_file_t; ++ type rpcd_t; + ') + +- allow $1 nfsd_t:tcp_socket rw_socket_perms; ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 rpcd_unit_file_t:file read_file_perms; ++ allow $1 rpcd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rpcd_t) + ') + + ######################################## + ## +-## Read and write to nfsd udp sockets. ++## Allow domain to read and write to an NFS UDP socket. + ## + ## + ## +@@ -312,7 +331,7 @@ interface(`rpc_udp_send_nfs',` + + ######################################## + ## +-## Search nfs lib directories. ++## Search NFS state data in /var/lib/nfs. + ## + ## + ## +@@ -326,12 +345,50 @@ interface(`rpc_search_nfs_state_data',` + ') + + files_search_var_lib($1) +- allow $1 var_lib_nfs_t:dir search; ++ allow $1 var_lib_nfs_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## List NFS state data in /var/lib/nfs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpc_list_nfs_state_data',` ++ gen_require(` ++ type var_lib_nfs_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 var_lib_nfs_t:dir list_dir_perms; + ') + + ######################################## + ## +-## Read nfs lib files. ++## Manage NFS state data in /var/lib/nfs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpc_manage_nfs_state_data_dir',` ++ gen_require(` ++ type var_lib_nfs_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 var_lib_nfs_t:dir manage_dir_perms; ++') ++ ++######################################## ++## ++## Read NFS state data in /var/lib/nfs. + ## + ## + ## +@@ -346,12 +403,12 @@ interface(`rpc_read_nfs_state_data',` + + files_search_var_lib($1) + read_files_pattern($1, var_lib_nfs_t, var_lib_nfs_t) ++ read_lnk_files_pattern($1, var_lib_nfs_t, var_lib_nfs_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## nfs lib files. ++## Manage NFS state data in /var/lib/nfs. + ## + ## + ## +@@ -366,31 +423,68 @@ interface(`rpc_manage_nfs_state_data',` + + files_search_var_lib($1) + manage_files_pattern($1, var_lib_nfs_t, var_lib_nfs_t) ++ allow $1 var_lib_nfs_t:file relabel_file_perms; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an rpc environment. ++## Write keys for all user domains. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`rpc_rw_gssd_keys',` ++ gen_require(` ++ type gssd_t; ++ ') ++ ++ allow $1 gssd_t:key { read search setattr view write }; ++') ++ ++######################################## ++## ++## Transition to alsa named content ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## ++# ++interface(`rpc_filetrans_var_lib_nfs_content',` ++ gen_require(` ++ type var_lib_nfs_t; ++ ') ++ ++ files_var_lib_filetrans($1, var_lib_nfs_t, lnk_file, "nfs") ++') ++ ++####################################### ++## ++## All of the rules required to ++## administrate an rpc environment. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## + ## + # + interface(`rpc_admin',` +- gen_require(` ++ gen_require(` + attribute rpc_domain; + type nfsd_initrc_exec_t, rpcd_initrc_exec_t, exports_t; + type var_lib_nfs_t, rpcd_var_run_t, gssd_tmp_t; +- type nfsd_ro_t, nfsd_rw_t, gssd_keytab_t; ++ type nfsd_rw_t, gssd_keytab_t; + ') + + allow $1 rpc_domain:process { ptrace signal_perms }; +@@ -411,10 +505,28 @@ interface(`rpc_admin',` + admin_pattern($1, rpcd_var_run_t) + + files_list_all($1) +- admin_pattern($1, { nfsd_ro_t nfsd_rw_t }) ++ admin_pattern($1, nfsd_rw_t ) + + files_list_tmp($1) + admin_pattern($1, gssd_tmp_t) + + fs_search_nfsd_fs($1) + ') ++ ++######################################## ++## ++## Read and write to svirt_image devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpc_gssd_noatsecure',` ++ gen_require(` ++ type gssd_t; ++ ') ++ ++ allow $1 gssd_t:process { noatsecure rlimitinh }; ++') +diff --git a/rpc.te b/rpc.te +index 2da9fca2f7..bbd2099408 100644 +--- a/rpc.te ++++ b/rpc.te +@@ -6,22 +6,27 @@ policy_module(rpc, 1.15.1) + # + + ## +-##

      +-## Determine whether gssd can read +-## generic user temporary content. +-##

      ++##

      ++## Allow gssd to list tmp directories and read the kerberos credential cache. ++##

      + ##
      +-gen_tunable(allow_gssd_read_tmp, false) ++gen_tunable(gssd_read_tmp, true) + + ## +-##

      +-## Determine whether nfs can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      ++##

      ++## Allow nfs servers to modify public files ++## used for public file transfer services. Files/Directories must be ++## labeled public_content_rw_t. ++##

      + ##
      +-gen_tunable(allow_nfsd_anon_write, false) ++gen_tunable(nfsd_anon_write, false) ++ ++## ++##

      ++## Allow rpcd_t to manage fuse files ++##

      ++##
      ++gen_tunable(rpcd_use_fusefs, false) + + attribute rpc_domain; + +@@ -39,21 +44,23 @@ files_tmp_file(gssd_tmp_t) + type rpcd_var_run_t; + files_pid_file(rpcd_var_run_t) + ++# rpcd_t is the domain of rpc daemons. ++# rpc_exec_t is the type of rpc daemon programs. + rpc_domain_template(rpcd) + + type rpcd_initrc_exec_t; + init_script_file(rpcd_initrc_exec_t) + ++type rpcd_unit_file_t; ++systemd_unit_file(rpcd_unit_file_t) ++ + rpc_domain_template(nfsd) + + type nfsd_initrc_exec_t; + init_script_file(nfsd_initrc_exec_t) + +-type nfsd_rw_t; +-files_type(nfsd_rw_t) +- +-type nfsd_ro_t; +-files_type(nfsd_ro_t) ++type nfsd_unit_file_t; ++systemd_unit_file(nfsd_unit_file_t) + + type var_lib_nfs_t; + files_mountpoint(var_lib_nfs_t) +@@ -71,7 +78,6 @@ allow rpc_domain self:tcp_socket { accept listen }; + manage_dirs_pattern(rpc_domain, var_lib_nfs_t, var_lib_nfs_t) + manage_files_pattern(rpc_domain, var_lib_nfs_t, var_lib_nfs_t) + +-kernel_read_system_state(rpc_domain) + kernel_read_kernel_sysctls(rpc_domain) + kernel_rw_rpc_sysctls(rpc_domain) + +@@ -79,8 +85,6 @@ dev_read_sysfs(rpc_domain) + dev_read_urand(rpc_domain) + dev_read_rand(rpc_domain) + +-corenet_all_recvfrom_unlabeled(rpc_domain) +-corenet_all_recvfrom_netlabel(rpc_domain) + corenet_tcp_sendrecv_generic_if(rpc_domain) + corenet_udp_sendrecv_generic_if(rpc_domain) + corenet_tcp_sendrecv_generic_node(rpc_domain) +@@ -108,41 +112,45 @@ files_read_etc_runtime_files(rpc_domain) + files_read_usr_files(rpc_domain) + files_list_home(rpc_domain) + +-logging_send_syslog_msg(rpc_domain) +- +-miscfiles_read_localization(rpc_domain) +- + userdom_dontaudit_use_unpriv_user_fds(rpc_domain) + + optional_policy(` +- rpcbind_stream_connect(rpc_domain) ++ rpcbind_stream_connect(rpc_domain) + ') + + optional_policy(` +- seutil_sigchld_newrole(rpc_domain) ++ seutil_sigchld_newrole(rpc_domain) + ') + + optional_policy(` +- udev_read_db(rpc_domain) ++ udev_read_db(rpc_domain) + ') + + ######################################## + # +-# Local policy ++# RPC local policy + # + +-allow rpcd_t self:capability { setpcap sys_admin chown dac_override setgid setuid }; ++allow rpcd_t self:capability { setpcap sys_admin chown dac_read_search dac_override setgid setuid }; + allow rpcd_t self:capability2 block_suspend; ++ + allow rpcd_t self:process { getcap setcap }; + allow rpcd_t self:fifo_file rw_fifo_file_perms; + ++allow rpcd_t rpcd_var_run_t:dir setattr_dir_perms; + manage_dirs_pattern(rpcd_t, rpcd_var_run_t, rpcd_var_run_t) + manage_files_pattern(rpcd_t, rpcd_var_run_t, rpcd_var_run_t) + files_pid_filetrans(rpcd_t, rpcd_var_run_t, { file dir }) + ++read_lnk_files_pattern(rpcd_t, var_lib_nfs_t, var_lib_nfs_t) ++ ++# rpc.statd executes sm-notify + can_exec(rpcd_t, rpcd_exec_t) + ++kernel_read_system_state(rpcd_t) ++kernel_write_proc_files(rpcd_t) + kernel_read_network_state(rpcd_t) ++# for rpc.rquotad + kernel_read_sysctl(rpcd_t) + kernel_rw_fs_sysctls(rpcd_t) + kernel_dontaudit_getattr_core_if(rpcd_t) +@@ -163,13 +171,21 @@ fs_getattr_all_fs(rpcd_t) + + storage_getattr_fixed_disk_dev(rpcd_t) + ++init_read_utmp(rpcd_t) ++ + selinux_dontaudit_read_fs(rpcd_t) + + miscfiles_read_generic_certs(rpcd_t) + +-seutil_dontaudit_search_config(rpcd_t) ++userdom_signal_unpriv_users(rpcd_t) ++userdom_read_user_home_content_files(rpcd_t) + +-userdom_signal_all_users(rpcd_t) ++tunable_policy(`rpcd_use_fusefs',` ++ fs_manage_fusefs_dirs(rpcd_t) ++ fs_manage_fusefs_files(rpcd_t) ++ fs_read_fusefs_symlinks(rpcd_t) ++ fs_getattr_fusefs(rpcd_t) ++') + + ifdef(`distro_debian',` + term_dontaudit_use_unallocated_ttys(rpcd_t) +@@ -180,20 +196,28 @@ optional_policy(` + automount_dontaudit_write_pipes(rpcd_t) + ') + ++optional_policy(` ++ domain_unconfined_signal(rpcd_t) ++') ++ ++optional_policy(` ++ quota_manage_db(rpcd_t) ++') ++ + optional_policy(` + nis_read_ypserv_config(rpcd_t) + ') + + optional_policy(` +- quota_manage_db_files(rpcd_t) ++ quota_read_db(rpcd_t) + ') + + optional_policy(` +- rgmanager_manage_tmp_files(rpcd_t) ++ rhcs_manage_cluster_tmp_files(rpcd_t) + ') + + optional_policy(` +- unconfined_signal(rpcd_t) ++ samba_stream_connect_nmbd(rpcd_t) + ') + + ######################################## +@@ -201,42 +225,62 @@ optional_policy(` + # NFSD local policy + # + +-allow nfsd_t self:capability { dac_override dac_read_search sys_admin sys_resource }; ++allow nfsd_t self:capability { dac_read_search dac_override sys_admin sys_rawio sys_resource }; + + allow nfsd_t exports_t:file read_file_perms; +-allow nfsd_t { nfsd_rw_t nfsd_ro_t }:dir list_dir_perms; + ++# for /proc/fs/nfs/exports - should we have a new type? ++kernel_read_system_state(nfsd_t) + kernel_read_network_state(nfsd_t) + kernel_dontaudit_getattr_core_if(nfsd_t) +-kernel_setsched(nfsd_t) ++kernel_dontaudit_setsched(nfsd_t) + kernel_request_load_module(nfsd_t) +-# kernel_mounton_proc(nfsd_t) ++kernel_mounton_proc(nfsd_t) ++kernel_rw_rpc_sysctls_dirs(nfsd_t) ++kernel_create_rpc_sysctls(nfsd_t) ++kernel_rw_fs_sysctls(nfsd_t) + +-corenet_sendrecv_nfs_server_packets(nfsd_t) ++corecmd_exec_shell(nfsd_t) ++ ++corenet_tcp_bind_all_rpc_ports(nfsd_t) ++corenet_udp_bind_all_rpc_ports(nfsd_t) + corenet_tcp_bind_nfs_port(nfsd_t) + corenet_udp_bind_nfs_port(nfsd_t) +- +-corecmd_exec_shell(nfsd_t) ++corenet_udp_bind_mountd_port(nfsd_t) ++corenet_tcp_bind_mountd_port(nfsd_t) + + dev_dontaudit_getattr_all_blk_files(nfsd_t) + dev_dontaudit_getattr_all_chr_files(nfsd_t) + dev_rw_lvm_control(nfsd_t) ++dev_read_nvme(nfsd_t) + ++# does not really need this, but it is easier to just allow it ++files_search_pids(nfsd_t) ++# for exportfs and rpc.mountd + files_getattr_tmp_dirs(nfsd_t) ++# cjp: this should really have its own type + files_manage_mounttab(nfsd_t) ++files_read_etc_runtime_files(nfsd_t) + ++fs_read_configfs_files(nfsd_t) ++fs_read_configfs_dirs(nfsd_t) ++fs_mounton_nfsd_fs(nfsd_t) + fs_mount_nfsd_fs(nfsd_t) + fs_getattr_all_fs(nfsd_t) + fs_getattr_all_dirs(nfsd_t) +-fs_rw_nfsd_fs(nfsd_t) +-# fs_manage_nfsd_fs(nfsd_t) ++fs_manage_nfsd_fs(nfsd_t) + +-storage_dontaudit_read_fixed_disk(nfsd_t) ++storage_raw_read_fixed_disk(nfsd_t) + storage_raw_read_removable_device(nfsd_t) + ++# Read access to public_content_t and public_content_rw_t + miscfiles_read_public_files(nfsd_t) + +-tunable_policy(`allow_nfsd_anon_write',` ++userdom_filetrans_home_content(nfsd_t) ++userdom_list_user_tmp(nfsd_t) ++ ++# Write access to public_content_t and public_content_rw_t ++tunable_policy(`nfsd_anon_write',` + miscfiles_manage_public_files(nfsd_t) + ') + +@@ -245,7 +289,6 @@ tunable_policy(`nfs_export_all_rw',` + dev_getattr_all_chr_files(nfsd_t) + + fs_read_noxattr_fs_files(nfsd_t) +- files_manage_non_auth_files(nfsd_t) + ') + + tunable_policy(`nfs_export_all_ro',` +@@ -257,12 +300,12 @@ tunable_policy(`nfs_export_all_ro',` + + fs_read_noxattr_fs_files(nfsd_t) + +- files_list_non_auth_dirs(nfsd_t) +- files_read_non_auth_files(nfsd_t) ++ files_read_non_security_files(nfsd_t) + ') + + optional_policy(` + mount_exec(nfsd_t) ++ mount_manage_pid_files(nfsd_t) + ') + + ######################################## +@@ -270,7 +313,7 @@ optional_policy(` + # GSSD local policy + # + +-allow gssd_t self:capability { dac_override dac_read_search setuid sys_nice }; ++allow gssd_t self:capability { dac_override dac_read_search setuid setgid sys_nice }; + allow gssd_t self:process { getsched setsched }; + allow gssd_t self:fifo_file rw_fifo_file_perms; + +@@ -280,6 +323,7 @@ manage_dirs_pattern(gssd_t, gssd_tmp_t, gssd_tmp_t) + manage_files_pattern(gssd_t, gssd_tmp_t, gssd_tmp_t) + files_tmp_filetrans(gssd_t, gssd_tmp_t, { file dir }) + ++kernel_read_system_state(gssd_t) + kernel_read_network_state(gssd_t) + kernel_read_network_state_symlinks(gssd_t) + kernel_request_load_module(gssd_t) +@@ -288,35 +332,46 @@ kernel_signal(gssd_t) + + corecmd_exec_bin(gssd_t) + +-fs_list_inotifyfs(gssd_t) ++domain_manage_all_domains_keyrings(gssd_t) ++ + fs_list_rpc(gssd_t) + fs_rw_rpc_sockets(gssd_t) + fs_read_rpc_files(gssd_t) +-fs_read_nfs_files(gssd_t) ++fs_read_nfsd_files(gssd_t) + ++fs_list_inotifyfs(gssd_t) + files_list_tmp(gssd_t) ++files_read_usr_symlinks(gssd_t) + files_dontaudit_write_var_dirs(gssd_t) + ++auth_use_nsswitch(gssd_t) + auth_manage_cache(gssd_t) ++auth_login_manage_key(gssd_t) + + miscfiles_read_generic_certs(gssd_t) + + userdom_signal_all_users(gssd_t) ++userdom_manage_all_users_keys(gssd_t) + +-tunable_policy(`allow_gssd_read_tmp',` ++tunable_policy(`gssd_read_tmp',` + userdom_list_user_tmp(gssd_t) + userdom_read_user_tmp_files(gssd_t) + userdom_read_user_tmp_symlinks(gssd_t) ++ userdom_manage_user_tmp_files(gssd_t) ++ files_read_generic_tmp_files(gssd_t) + ') + + optional_policy(` + automount_signal(gssd_t) + ') + ++optional_policy(` ++ gssproxy_stream_connect(gssd_t) ++') + optional_policy(` + kerberos_manage_host_rcache(gssd_t) + kerberos_read_keytab(gssd_t) +- kerberos_tmp_filetrans_host_rcache(gssd_t, file, "nfs_0") ++ kerberos_tmp_filetrans_host_rcache(gssd_t, "nfs_0") + kerberos_use(gssd_t) + ') + +diff --git a/rpcbind.if b/rpcbind.if +index 3b5e9eed60..ff1163ff60 100644 +--- a/rpcbind.if ++++ b/rpcbind.if +@@ -1,4 +1,4 @@ +-## Universal Addresses to RPC Program Number Mapper. ++## Universal Addresses to RPC Program Number Mapper + + ######################################## + ## +@@ -15,14 +15,12 @@ interface(`rpcbind_domtrans',` + type rpcbind_t, rpcbind_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, rpcbind_exec_t, rpcbind_t) + ') + + ######################################## + ## +-## Connect to rpcbindd with a +-## unix domain stream socket. ++## Connect to rpcbindd over an unix stream socket. + ## + ## + ## +@@ -41,7 +39,7 @@ interface(`rpcbind_stream_connect',` + + ######################################## + ## +-## Read rpcbind pid files. ++## Read rpcbind PID files. + ## + ## + ## +@@ -73,8 +71,8 @@ interface(`rpcbind_search_lib',` + type rpcbind_var_lib_t; + ') + +- files_search_var_lib($1) + allow $1 rpcbind_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## +@@ -92,8 +90,8 @@ interface(`rpcbind_read_lib_files',` + type rpcbind_var_lib_t; + ') + +- files_search_var_lib($1) + read_files_pattern($1, rpcbind_var_lib_t, rpcbind_var_lib_t) ++ files_search_var_lib($1) + ') + + ######################################## +@@ -112,13 +110,13 @@ interface(`rpcbind_manage_lib_files',` + type rpcbind_var_lib_t; + ') + +- files_search_var_lib($1) + manage_files_pattern($1, rpcbind_var_lib_t, rpcbind_var_lib_t) ++ files_search_var_lib($1) + ') + + ######################################## + ## +-## Send null signals to rpcbind. ++## Send a null signal to rpcbind. + ## + ## + ## +@@ -136,8 +134,44 @@ interface(`rpcbind_signull',` + + ######################################## + ## +-## All of the rules required to +-## administrate an rpcbind environment. ++## Transition to rpcbind named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpcbind_filetrans_named_content',` ++ gen_require(` ++ type rpcbind_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, rpcbind_var_run_t, sock_file, "rpcbind.sock") ++') ++ ++######################################## ++## ++## Relabel from rpcbind sock file. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpcbind_relabel_sock_file',` ++ gen_require(` ++ type rpcbind_var_run_t; ++ ') ++ ++ allow $1 rpcbind_var_run_t:sock_file relabel_sock_file_perms; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rpcbind environment + ## + ## + ## +@@ -146,7 +180,7 @@ interface(`rpcbind_signull',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the rpcbind domain. + ## + ## + ## +@@ -157,17 +191,20 @@ interface(`rpcbind_admin',` + type rpcbind_initrc_exec_t; + ') + +- allow $1 rpcbind_t:process { ptrace signal_perms }; ++ allow $1 rpcbind_t:process signal_perms; + ps_process_pattern($1, rpcbind_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rpcbind_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, rbcbind_initrc_exec_t) ++ init_labeled_script_domtrans($1, rpcbind_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 rpcbind_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_pids($1) +- admin_pattern($1, rpcbind_var_run_t) +- +- files_search_var_lib($1) ++ files_list_var_lib($1) + admin_pattern($1, rpcbind_var_lib_t) ++ ++ files_list_pids($1) ++ admin_pattern($1, rpcbind_var_run_t) + ') +diff --git a/rpcbind.te b/rpcbind.te +index 54de77ccd8..a17c004c33 100644 +--- a/rpcbind.te ++++ b/rpcbind.te +@@ -12,6 +12,9 @@ init_daemon_domain(rpcbind_t, rpcbind_exec_t) + type rpcbind_initrc_exec_t; + init_script_file(rpcbind_initrc_exec_t) + ++type rpcbind_tmp_t; ++files_tmp_file(rpcbind_tmp_t) ++ + type rpcbind_var_run_t; + files_pid_file(rpcbind_var_run_t) + init_daemon_run_dir(rpcbind_var_run_t, "rpcbind") +@@ -24,11 +27,15 @@ files_type(rpcbind_var_lib_t) + # Local policy + # + +-allow rpcbind_t self:capability { dac_override setgid setuid sys_tty_config }; ++allow rpcbind_t self:capability { chown dac_read_search dac_override setgid setuid sys_tty_config }; + allow rpcbind_t self:fifo_file rw_fifo_file_perms; + allow rpcbind_t self:unix_stream_socket { accept listen }; + allow rpcbind_t self:tcp_socket { accept listen }; + ++manage_files_pattern(rpcbind_t, rpcbind_tmp_t, rpcbind_tmp_t) ++manage_dirs_pattern(rpcbind_t, rpcbind_tmp_t, rpcbind_tmp_t) ++files_tmp_filetrans(rpcbind_t, rpcbind_tmp_t, { file dir }) ++ + manage_files_pattern(rpcbind_t, rpcbind_var_run_t, rpcbind_var_run_t) + manage_sock_files_pattern(rpcbind_t, rpcbind_var_run_t, rpcbind_var_run_t) + files_pid_filetrans(rpcbind_t, rpcbind_var_run_t, { file sock_file }) +@@ -42,7 +49,6 @@ kernel_read_system_state(rpcbind_t) + kernel_read_network_state(rpcbind_t) + kernel_request_load_module(rpcbind_t) + +-corenet_all_recvfrom_unlabeled(rpcbind_t) + corenet_all_recvfrom_netlabel(rpcbind_t) + corenet_tcp_sendrecv_generic_if(rpcbind_t) + corenet_udp_sendrecv_generic_if(rpcbind_t) +@@ -68,7 +74,11 @@ auth_use_nsswitch(rpcbind_t) + + logging_send_syslog_msg(rpcbind_t) + +-miscfiles_read_localization(rpcbind_t) ++sysnet_dns_name_resolve(rpcbind_t) ++ ++optional_policy(` ++ nis_use_ypbind(rpcbind_t) ++') + + ifdef(`distro_debian',` + term_dontaudit_use_unallocated_ttys(rpcbind_t) +diff --git a/rpm.fc b/rpm.fc +index ebe91fc70b..27beed27d7 100644 +--- a/rpm.fc ++++ b/rpm.fc +@@ -1,61 +1,81 @@ +-/bin/rpm -- gen_context(system_u:object_r:rpm_exec_t,s0) + +-/etc/rc\.d/init\.d/bcfg2 -- gen_context(system_u:object_r:rpm_initrc_exec_t,s0) +- +-/sbin/yast2 -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/bin/rpm -- gen_context(system_u:object_r:rpm_exec_t,s0) + ++/usr/bin/anaconda-yum -- gen_context(system_u:object_r:rpm_exec_t,s0) + /usr/bin/debuginfo-install -- gen_context(system_u:object_r:debuginfo_exec_t,s0) +-/usr/bin/fedora-rmdevelrpms -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/online_update -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/rpmdev-rmdevelrpms -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/rpm -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/smart -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/yum -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/zif -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/dnf -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/dnf-automatic -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/dnf-[0-9]+ -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/rpm -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/smart -- gen_context(system_u:object_r:rpm_exec_t,s0) ++ ++/bin/yum-builddep -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/yum -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/yum-builddep -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/yum-deprecated -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/repoquery -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/zif -- gen_context(system_u:object_r:rpm_exec_t,s0) + + /usr/libexec/packagekitd -- gen_context(system_u:object_r:rpm_exec_t,s0) + /usr/libexec/yumDBUSBackend.py -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/libexec/pegasus/pycmpiLMI_Software-cimprovagt -- gen_context(system_u:object_r:rpm_exec_t,s0) ++ ++/usr/sbin/yum-complete-transaction -- gen_context(system_u:object_r:rpm_exec_t,s0) ++ ++/usr/sbin/system-install-packages -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/yum-updatesd -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/yum-cron -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/packagekitd -- gen_context(system_u:object_r:rpm_exec_t,s0) + +-/usr/sbin/bcfg2 -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/pirut -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/pup -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/rhn_check -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/up2date -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/yum-complete-transaction -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/system-install-packages -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/yum-updatesd -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/packagekitd -- gen_context(system_u:object_r:rpm_exec_t,s0) +- +-ifdef(`distro_redhat',` +-/usr/bin/apt-get -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/apt-shell -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/bin/aptitude -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/sbin/synaptic -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/var/cache/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) +-/var/lib/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/usr/share/yumex/yumex-yum-backend -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/share/yumex/yum_childtask\.py -- gen_context(system_u:object_r:rpm_exec_t,s0) ++ ++/usr/share/rpm(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++ ++ifdef(`distro_redhat', ` ++/usr/sbin/bcfg2 -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/package-cleanup -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/fedora-rmdevelrpms -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/rpmdev-rmdevelrpms -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/pirut -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/pup -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/rhn_check -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/rhn_check-[0-9]+\.[0-9]+ -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/rhnreg_ks -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/up2date -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/sbin/synaptic -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/apt-get -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/usr/bin/apt-shell -- gen_context(system_u:object_r:rpm_exec_t,s0) + ') + +-/usr/share/yumex/yumex-yum-backend -- gen_context(system_u:object_r:rpm_exec_t,s0) +-/usr/share/yumex/yum_childtask\.py -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/var/cache/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) ++/var/cache/yum(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) ++/var/cache/dnf(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) + +-/var/cache/bcfg2(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) +-/var/cache/yum(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) ++/var/lib/alternatives(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/lib/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/lib/rpm(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/lib/rpmrebuilddb.*(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/lib/yum(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/lib/dnf(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) + +-/var/lib/alternatives(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) +-/var/lib/rpm(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) +-/var/lib/YaST2(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) +-/var/lib/yum(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/log/yum\.log.* -- gen_context(system_u:object_r:rpm_log_t,s0) ++/var/log/up2date.* -- gen_context(system_u:object_r:rpm_log_t,s0) + +-/var/lock/bcfg2\.run -- gen_context(system_u:object_r:rpm_lock_t,s0) + +-/var/log/YaST2(/.*)? gen_context(system_u:object_r:rpm_log_t,s0) +-/var/log/yum\.log.* -- gen_context(system_u:object_r:rpm_log_t,s0) ++/var/spool/up2date(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) + +-/var/spool/up2date(/.*)? gen_context(system_u:object_r:rpm_var_cache_t,s0) ++/var/run/yum.* -- gen_context(system_u:object_r:rpm_var_run_t,s0) ++/var/run/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_run_t,s0) + +-/var/run/yum.* -- gen_context(system_u:object_r:rpm_var_run_t,s0) +-/var/run/PackageKit(/.*)? gen_context(system_u:object_r:rpm_var_run_t,s0) ++# SuSE ++ifdef(`distro_suse', ` ++/usr/bin/online_update -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/sbin/yast2 -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/var/lib/YaST2(/.*)? gen_context(system_u:object_r:rpm_var_lib_t,s0) ++/var/log/YaST2(/.*)? gen_context(system_u:object_r:rpm_log_t,s0) ++') + + ifdef(`enable_mls',` +-/usr/sbin/cpio -- gen_context(system_u:object_r:rpm_exec_t,s0) ++/sbin/cpio -- gen_context(system_u:object_r:rpm_exec_t,s0) + ') +diff --git a/rpm.if b/rpm.if +index ef3b225073..98dfc781ae 100644 +--- a/rpm.if ++++ b/rpm.if +@@ -1,8 +1,8 @@ +-## Redhat package manager. ++## Policy for the RPM package manager. + + ######################################## + ## +-## Execute rpm in the rpm domain. ++## Execute rpm programs in the rpm domain. + ## + ## + ## +@@ -13,16 +13,18 @@ + interface(`rpm_domtrans',` + gen_require(` + type rpm_t, rpm_exec_t; ++ attribute rpm_transition_domain; + ') + + corecmd_search_bin($1) + domtrans_pattern($1, rpm_exec_t, rpm_t) ++ typeattribute $1 rpm_transition_domain; ++ rpm_debuginfo_domtrans($1) + ') + + ######################################## + ## +-## Execute debuginfo install +-## in the rpm domain. ++## Execute debuginfo_install programs in the rpm domain. + ## + ## + ## +@@ -37,11 +39,12 @@ interface(`rpm_debuginfo_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, debuginfo_exec_t, rpm_t) ++ read_lnk_files_pattern($1, debuginfo_exec_t, debuginfo_exec_t) + ') + + ######################################## + ## +-## Execute rpm scripts in the rpm script domain. ++## Execute rpm_script programs in the rpm_script domain. + ## + ## + ## +@@ -54,18 +57,16 @@ interface(`rpm_domtrans_script',` + type rpm_script_t; + ') + ++ # transition to rpm script: + corecmd_shell_domtrans($1, rpm_script_t) +- + allow rpm_script_t $1:fd use; +- allow rpm_script_t $1:fifo_file rw_fifo_file_perms; ++ allow rpm_script_t $1:fifo_file rw_file_perms; + allow rpm_script_t $1:process sigchld; + ') + + ######################################## + ## +-## Execute rpm in the rpm domain, +-## and allow the specified roles the +-## rpm domain. ++## Execute RPM programs in the RPM domain. + ## + ## + ## +@@ -74,23 +75,28 @@ interface(`rpm_domtrans_script',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the RPM domain. + ## + ## + ## + # + interface(`rpm_run',` + gen_require(` +- attribute_role rpm_roles; ++ type rpm_t, rpm_script_t; ++ attribute_role rpm_script_roles; + ') + + rpm_domtrans($1) +- roleattribute $2 rpm_roles; ++ roleattribute $2 rpm_script_roles; ++ ++ domain_system_change_exemption($1) ++ ++ rpm_transition_script($1, $2) + ') + + ######################################## + ## +-## Execute the rpm in the caller domain. ++## Execute the rpm client in the caller domain. + ## + ## + ## +@@ -109,7 +115,25 @@ interface(`rpm_exec',` + + ######################################## + ## +-## Send null signals to rpm. ++## Do not audit to execute a rpm. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`rpm_dontaudit_exec',` ++ gen_require(` ++ type rpm_exec_t; ++ ') ++ ++ dontaudit $1 rpm_exec_t:file exec_file_perms; ++') ++ ++######################################## ++## ++## Send a null signal to rpm. + ## + ## + ## +@@ -127,7 +151,7 @@ interface(`rpm_signull',` + + ######################################## + ## +-## Inherit and use file descriptors from rpm. ++## Inherit and use file descriptors from RPM. + ## + ## + ## +@@ -145,7 +169,7 @@ interface(`rpm_use_fds',` + + ######################################## + ## +-## Read rpm unnamed pipes. ++## Read from an unnamed RPM pipe. + ## + ## + ## +@@ -163,7 +187,7 @@ interface(`rpm_read_pipes',` + + ######################################## + ## +-## Read and write rpm unnamed pipes. ++## Read and write an unnamed RPM pipe. + ## + ## + ## +@@ -179,6 +203,60 @@ interface(`rpm_rw_pipes',` + allow $1 rpm_t:fifo_file rw_fifo_file_perms; + ') + ++######################################## ++## ++## Read and write an unnamed RPM script pipe. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpm_rw_script_inherited_pipes',` ++ gen_require(` ++ type rpm_script_tmp_t; ++ ') ++ ++ allow $1 rpm_script_tmp_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## dontaudit read and write an leaked file descriptors ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`rpm_dontaudit_leaks',` ++ gen_require(` ++ type rpm_t, rpm_var_cache_t; ++ type rpm_script_t, rpm_var_run_t, rpm_tmp_t; ++ type rpm_tmpfs_t, rpm_script_tmp_t, rpm_var_lib_t; ++ ') ++ ++ dontaudit $1 rpm_t:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit $1 rpm_t:tcp_socket { read write }; ++ dontaudit $1 rpm_t:unix_dgram_socket { read write }; ++ dontaudit $1 rpm_t:shm rw_shm_perms; ++ ++ dontaudit $1 rpm_script_t:fd use; ++ dontaudit $1 rpm_script_t:fifo_file rw_inherited_fifo_file_perms; ++ ++ dontaudit $1 rpm_var_run_t:file rw_inherited_file_perms; ++ ++ dontaudit $1 rpm_tmp_t:file rw_inherited_file_perms; ++ dontaudit $1 rpm_tmpfs_t:dir rw_dir_perms; ++ dontaudit $1 rpm_tmpfs_t:file rw_inherited_file_perms; ++ dontaudit $1 rpm_script_tmp_t:file rw_inherited_file_perms; ++ dontaudit $1 rpm_var_lib_t:dir getattr; ++ dontaudit $1 rpm_var_lib_t:file rw_inherited_file_perms; ++ dontaudit $1 rpm_var_cache_t:file rw_inherited_file_perms; ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -224,7 +302,7 @@ interface(`rpm_dontaudit_dbus_chat',` + ######################################## + ## + ## Send and receive messages from +-## rpm script over dbus. ++## rpm_script over dbus. + ## + ## + ## +@@ -244,7 +322,7 @@ interface(`rpm_script_dbus_chat',` + + ######################################## + ## +-## Search rpm log directories. ++## Search RPM log directory. + ## + ## + ## +@@ -263,7 +341,8 @@ interface(`rpm_search_log',` + + ##################################### + ## +-## Append rpm log files. ++## Allow the specified domain to append ++## to rpm log files. + ## + ## + ## +@@ -276,14 +355,30 @@ interface(`rpm_append_log',` + type rpm_log_t; + ') + +- logging_search_logs($1) +- append_files_pattern($1, rpm_log_t, rpm_log_t) ++ allow $1 rpm_log_t:file append_inherited_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete the RPM log. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpm_read_log',` ++ gen_require(` ++ type rpm_log_t; ++ ') ++ ++ read_files_pattern($1, rpm_log_t, rpm_log_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## rpm log files. ++## Create, read, write, and delete the RPM log. + ## + ## + ## +@@ -302,7 +397,32 @@ interface(`rpm_manage_log',` + + ######################################## + ## +-## Inherit and use rpm script file descriptors. ++## Create rpm logs with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rpm_named_filetrans',` ++ gen_require(` ++ type rpm_log_t; ++ type rpm_var_lib_t; ++ ') ++ logging_log_named_filetrans($1, rpm_log_t, file, "yum.log") ++ logging_log_named_filetrans($1, rpm_log_t, file, "up2date") ++ files_var_filetrans($1, rpm_var_lib_t, dir, "dnf") ++ files_var_filetrans($1, rpm_var_lib_t, dir, "yum") ++ files_var_filetrans($1, rpm_var_lib_t, dir, "rpm") ++ files_var_lib_filetrans($1, rpm_var_lib_t, dir, "dnf") ++ files_var_lib_filetrans($1, rpm_var_lib_t, dir, "yum") ++ files_var_lib_filetrans($1, rpm_var_lib_t, dir, "rpm") ++') ++ ++######################################## ++## ++## Inherit and use file descriptors from RPM scripts. + ## + ## + ## +@@ -320,8 +440,8 @@ interface(`rpm_use_script_fds',` + + ######################################## + ## +-## Create, read, write, and delete +-## rpm script temporary files. ++## Create, read, write, and delete RPM ++## script temporary files. + ## + ## + ## +@@ -335,12 +455,15 @@ interface(`rpm_manage_script_tmp_files',` + ') + + files_search_tmp($1) ++ manage_dirs_pattern($1, rpm_script_tmp_t, rpm_script_tmp_t) + manage_files_pattern($1, rpm_script_tmp_t, rpm_script_tmp_t) ++ manage_lnk_files_pattern($1, rpm_script_tmp_t, rpm_script_tmp_t) + ') + + ##################################### + ## +-## Append rpm temporary files. ++## Allow the specified domain to append ++## to rpm tmp files. + ## + ## + ## +@@ -353,14 +476,13 @@ interface(`rpm_append_tmp_files',` + type rpm_tmp_t; + ') + +- files_search_tmp($1) +- append_files_pattern($1, rpm_tmp_t, rpm_tmp_t) ++ allow $1 rpm_tmp_t:file append_inherited_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## rpm temporary files. ++## Create, read, write, and delete RPM ++## temporary files. + ## + ## + ## +@@ -374,12 +496,14 @@ interface(`rpm_manage_tmp_files',` + ') + + files_search_tmp($1) ++ manage_dirs_pattern($1, rpm_tmp_t, rpm_tmp_t) + manage_files_pattern($1, rpm_tmp_t, rpm_tmp_t) ++ manage_lnk_files_pattern($1, rpm_tmp_t, rpm_tmp_t) + ') + + ######################################## + ## +-## Read rpm script temporary files. ++## Read RPM script temporary files. + ## + ## + ## +@@ -399,7 +523,7 @@ interface(`rpm_read_script_tmp_files',` + + ######################################## + ## +-## Read rpm cache content. ++## Read the RPM cache. + ## + ## + ## +@@ -420,8 +544,7 @@ interface(`rpm_read_cache',` + + ######################################## + ## +-## Create, read, write, and delete +-## rpm cache content. ++## Create, read, write, and delete the RPM package database. + ## + ## + ## +@@ -442,7 +565,7 @@ interface(`rpm_manage_cache',` + + ######################################## + ## +-## Read rpm lib content. ++## Read the RPM package database. + ## + ## + ## +@@ -459,11 +582,13 @@ interface(`rpm_read_db',` + allow $1 rpm_var_lib_t:dir list_dir_perms; + read_files_pattern($1, rpm_var_lib_t, rpm_var_lib_t) + read_lnk_files_pattern($1, rpm_var_lib_t, rpm_var_lib_t) ++ allow $1 rpm_var_lib_t:file map; ++ rpm_read_cache($1) + ') + + ######################################## + ## +-## Delete rpm lib files. ++## Delete the RPM package database. + ## + ## + ## +@@ -482,8 +607,7 @@ interface(`rpm_delete_db',` + + ######################################## + ## +-## Create, read, write, and delete +-## rpm lib files. ++## Create, read, write, and delete the RPM package database. + ## + ## + ## +@@ -499,12 +623,33 @@ interface(`rpm_manage_db',` + files_search_var_lib($1) + manage_files_pattern($1, rpm_var_lib_t, rpm_var_lib_t) + manage_lnk_files_pattern($1, rpm_var_lib_t, rpm_var_lib_t) ++ allow $1 rpm_var_lib_t:file map; ++') ++ ++######################################## ++## ++## Do not audit attempts to create, read,the RPM package database. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`rpm_dontaudit_read_db',` ++ gen_require(` ++ type rpm_var_lib_t; ++ ') ++ ++ dontaudit $1 rpm_var_lib_t:dir list_dir_perms; ++ dontaudit $1 rpm_var_lib_t:file read_file_perms; ++ dontaudit $1 rpm_var_lib_t:lnk_file read_lnk_file_perms; + ') + + ######################################## + ## + ## Do not audit attempts to create, read, +-## write, and delete rpm lib content. ++## write, and delete the RPM package database. + ## + ## + ## +@@ -517,9 +662,10 @@ interface(`rpm_dontaudit_manage_db',` + type rpm_var_lib_t; + ') + +- dontaudit $1 rpm_var_lib_t:dir rw_dir_perms; ++ dontaudit $1 rpm_var_lib_t:dir manage_dir_perms; + dontaudit $1 rpm_var_lib_t:file manage_file_perms; + dontaudit $1 rpm_var_lib_t:lnk_file manage_lnk_file_perms; ++ dontaudit $1 rpm_var_lib_t:file map; + ') + + ##################################### +@@ -543,8 +689,7 @@ interface(`rpm_read_pid_files',` + + ##################################### + ## +-## Create, read, write, and delete +-## rpm pid files. ++## Create, read, write, and delete rpm pid files. + ## + ## + ## +@@ -563,8 +708,7 @@ interface(`rpm_manage_pid_files',` + + ###################################### + ## +-## Create files in pid directories +-## with the rpm pid file type. ++## Create files in /var/run with the rpm pid file type. + ## + ## + ## +@@ -573,43 +717,54 @@ interface(`rpm_manage_pid_files',` + ## + # + interface(`rpm_pid_filetrans',` +- refpolicywarn(`$0($*) has been deprecated, rpm_pid_filetrans_rpm_pid() instead.') +- rpm_pid_filetrans_rpm_pid($1, file) ++ gen_require(` ++ type rpm_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, rpm_var_run_t, file) + ') + + ######################################## + ## +-## Create specified objects in pid directories +-## with the rpm pid file type. ++## Send a null signal to rpm. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## ++# ++interface(`rpm_inherited_fifo',` ++ gen_require(` ++ attribute rpm_transition_domain; ++ ') ++ ++ allow $1 rpm_transition_domain:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++ ++######################################## ++## ++## Make rpm_exec_t an entry point for ++## the specified domain. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## +-# +-interface(`rpm_pid_filetrans_rpm_pid',` ++# ++interface(`rpm_entry_type',` + gen_require(` +- type rpm_var_run_t; ++ type rpm_exec_t; + ') + +- files_pid_filetrans($1, rpm_var_run_t, $3, $4) ++ domain_entry_file($1, rpm_exec_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an rpm environment. ++## Allow application to transition to rpm_script domain. + ## + ## + ## +@@ -617,22 +772,57 @@ interface(`rpm_pid_filetrans_rpm_pid',` + ## + ## + ## +-## +-## Role allowed access. +-## ++## ++## Role allowed access. ++## + ## +-## + # +-interface(`rpm_admin',` ++interface(`rpm_transition_script',` + gen_require(` +- type rpm_t, rpm_script_t, rpm_initrc_exec_t; +- type rpm_var_cache_t, rpm_var_lib_t, rpm_lock_t; +- type rpm_log_t, rpm_tmpfs_t, rpm_tmp_t; +- type rpm_script_tmp_t, rpm_script_tmpfs_t, rpm_file_t; ++ type rpm_script_t; ++ attribute rpm_transition_domain; ++ attribute_role rpm_script_roles; + ') + +- allow $1 { rpm_t rpm_script_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { rpm_t rpm_script_t }) ++ typeattribute $1 rpm_transition_domain; ++ allow $1 rpm_script_t:process transition; ++ roleattribute $2 rpm_script_roles; ++ ++ allow $1 rpm_script_t:fd use; ++ allow rpm_script_t $1:fd use; ++ allow rpm_script_t $1:fifo_file rw_fifo_file_perms; ++ allow rpm_script_t $1:process sigchld; ++') ++ ++####################################### ++## ++## All of the rules required to ++## administrate an rpm environment. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`rpm_admin',` ++ gen_require(` ++ type rpm_t, rpm_script_t, rpm_initrc_exec_t; ++ type rpm_var_cache_t, rpm_var_lib_t, rpm_lock_t; ++ ++ type rpm_log_t, rpm_tmpfs_t, rpm_tmp_t; ++ type rpm_script_tmp_t, rpm_script_tmpfs_t, rpm_file_t; ++ type rpm_var_run_t; ++ ') ++ ++ allow $1 { rpm_t rpm_script_t }:process { ptrace signal_perms }; ++ ps_process_pattern($1, { rpm_t rpm_script_t }) + + init_labeled_script_domtrans($1, rpm_initrc_exec_t) + domain_system_change_exemption($1) +@@ -641,9 +831,6 @@ interface(`rpm_admin',` + + admin_pattern($1, rpm_file_t) + +- files_list_var($1) +- admin_pattern($1, rpm_cache_t) +- + files_list_tmp($1) + admin_pattern($1, { rpm_tmp_t rpm_script_tmp_t }) + +diff --git a/rpm.te b/rpm.te +index 6fc360e602..4402cbe093 100644 +--- a/rpm.te ++++ b/rpm.te +@@ -1,15 +1,13 @@ + policy_module(rpm, 1.16.0) + ++attribute rpm_transition_domain; ++attribute_role rpm_script_roles; ++roleattribute system_r rpm_script_roles; ++ + ######################################## + # + # Declarations + # +- +-attribute_role rpm_roles; +- +-type debuginfo_exec_t; +-domain_entry_file(rpm_t, debuginfo_exec_t) +- + type rpm_t; + type rpm_exec_t; + init_system_domain(rpm_t, rpm_exec_t) +@@ -17,10 +15,10 @@ domain_obj_id_change_exemption(rpm_t) + domain_role_change_exemption(rpm_t) + domain_system_change_exemption(rpm_t) + domain_interactive_fd(rpm_t) +-role rpm_roles types rpm_t; ++role rpm_script_roles types rpm_t; + +-type rpm_initrc_exec_t; +-init_script_file(rpm_initrc_exec_t) ++type debuginfo_exec_t; ++domain_entry_file(rpm_t, debuginfo_exec_t) + + type rpm_file_t; + files_type(rpm_file_t) +@@ -31,14 +29,12 @@ files_tmp_file(rpm_tmp_t) + type rpm_tmpfs_t; + files_tmpfs_file(rpm_tmpfs_t) + +-type rpm_lock_t; +-files_lock_file(rpm_lock_t) +- + type rpm_log_t; + logging_log_file(rpm_log_t) + + type rpm_var_lib_t; + files_type(rpm_var_lib_t) ++files_mountpoint(rpm_var_lib_t) + typealias rpm_var_lib_t alias var_lib_rpm_t; + + type rpm_var_cache_t; +@@ -56,8 +52,7 @@ corecmd_bin_entry_type(rpm_script_t) + domain_type(rpm_script_t) + domain_entry_file(rpm_t, rpm_script_exec_t) + domain_interactive_fd(rpm_script_t) +-role rpm_roles types rpm_script_t; +-role system_r types rpm_script_t; ++role rpm_script_roles types rpm_script_t; + + type rpm_script_tmp_t; + files_tmp_file(rpm_script_tmp_t) +@@ -70,28 +65,35 @@ files_tmpfs_file(rpm_script_tmpfs_t) + # rpm Local policy + # + +-allow rpm_t self:capability { chown dac_override fowner setfcap fsetid ipc_lock setgid setuid sys_chroot sys_nice sys_tty_config mknod }; ++allow rpm_t self:capability2 block_suspend; ++allow rpm_t self:capability { audit_write chown dac_read_search dac_override fowner setfcap fsetid ipc_lock setgid setuid sys_chroot sys_nice sys_tty_config mknod }; + allow rpm_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execstack execheap }; + allow rpm_t self:process { getattr setexec setfscreate setrlimit }; + allow rpm_t self:fd use; + allow rpm_t self:fifo_file rw_fifo_file_perms; ++allow rpm_t self:unix_dgram_socket create_socket_perms; ++allow rpm_t self:unix_stream_socket rw_stream_socket_perms; + allow rpm_t self:unix_dgram_socket sendto; +-allow rpm_t self:unix_stream_socket { accept connectto listen }; +-allow rpm_t self:udp_socket connect; +-allow rpm_t self:tcp_socket { accept listen }; ++allow rpm_t self:unix_stream_socket connectto; ++allow rpm_t self:udp_socket { connect }; ++allow rpm_t self:udp_socket create_socket_perms; ++allow rpm_t self:tcp_socket create_stream_socket_perms; + allow rpm_t self:shm create_shm_perms; + allow rpm_t self:sem create_sem_perms; + allow rpm_t self:msgq create_msgq_perms; + allow rpm_t self:msg { send receive }; +-allow rpm_t self:file rw_file_perms; ++allow rpm_t self:dir search; ++allow rpm_t self:file rw_file_perms;; + allow rpm_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow rpm_t self:netlink_audit_socket { nlmsg_relay create_socket_perms }; + +-allow rpm_t rpm_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow rpm_t rpm_log_t:file manage_file_perms; + logging_log_filetrans(rpm_t, rpm_log_t, file) + + manage_dirs_pattern(rpm_t, rpm_tmp_t, rpm_tmp_t) + manage_files_pattern(rpm_t, rpm_tmp_t, rpm_tmp_t) + files_tmp_filetrans(rpm_t, rpm_tmp_t, { file dir }) ++can_exec(rpm_t, rpm_tmp_t) + + manage_dirs_pattern(rpm_t, rpm_tmpfs_t, rpm_tmpfs_t) + manage_files_pattern(rpm_t, rpm_tmpfs_t, rpm_tmpfs_t) +@@ -99,23 +101,20 @@ manage_lnk_files_pattern(rpm_t, rpm_tmpfs_t, rpm_tmpfs_t) + manage_fifo_files_pattern(rpm_t, rpm_tmpfs_t, rpm_tmpfs_t) + manage_sock_files_pattern(rpm_t, rpm_tmpfs_t, rpm_tmpfs_t) + fs_tmpfs_filetrans(rpm_t, rpm_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++can_exec(rpm_t, rpm_tmpfs_t) + + manage_dirs_pattern(rpm_t, rpm_var_cache_t, rpm_var_cache_t) + manage_files_pattern(rpm_t, rpm_var_cache_t, rpm_var_cache_t) + files_var_filetrans(rpm_t, rpm_var_cache_t, dir) + +-manage_files_pattern(rpm_t, rpm_lock_t, rpm_lock_t) +-files_lock_filetrans(rpm_t, rpm_lock_t, file) +- +-manage_dirs_pattern(rpm_t, rpm_var_lib_t, rpm_var_lib_t) ++# Access /var/lib/rpm files + manage_files_pattern(rpm_t, rpm_var_lib_t, rpm_var_lib_t) +-files_var_lib_filetrans(rpm_t, rpm_var_lib_t, { dir file }) ++files_var_lib_filetrans(rpm_t, rpm_var_lib_t, dir) ++allow rpm_t rpm_var_lib_t:file map; + + manage_dirs_pattern(rpm_t, rpm_var_run_t, rpm_var_run_t) + manage_files_pattern(rpm_t, rpm_var_run_t, rpm_var_run_t) +-files_pid_filetrans(rpm_t, rpm_var_run_t, { dir file }) +- +-can_exec(rpm_t, { rpm_tmp_t rpm_tmpfs_t }) ++files_pid_filetrans(rpm_t, rpm_var_run_t, { file dir }) + + kernel_read_crypto_sysctls(rpm_t) + kernel_read_network_state(rpm_t) +@@ -126,41 +125,34 @@ kernel_rw_irq_sysctls(rpm_t) + + corecmd_exec_all_executables(rpm_t) + +-corenet_all_recvfrom_unlabeled(rpm_t) + corenet_all_recvfrom_netlabel(rpm_t) + corenet_tcp_sendrecv_generic_if(rpm_t) ++corenet_raw_sendrecv_generic_if(rpm_t) ++corenet_udp_sendrecv_generic_if(rpm_t) + corenet_tcp_sendrecv_generic_node(rpm_t) ++corenet_raw_sendrecv_generic_node(rpm_t) ++corenet_udp_sendrecv_generic_node(rpm_t) + corenet_tcp_sendrecv_all_ports(rpm_t) +- +-corenet_sendrecv_all_client_packets(rpm_t) ++corenet_udp_sendrecv_all_ports(rpm_t) + corenet_tcp_connect_all_ports(rpm_t) ++corenet_sendrecv_all_client_packets(rpm_t) + + dev_list_sysfs(rpm_t) + dev_list_usbfs(rpm_t) + dev_read_urand(rpm_t) + dev_read_raw_memory(rpm_t) +- + dev_manage_all_dev_nodes(rpm_t) +-dev_relabel_all_dev_nodes(rpm_t) + ++#devices_manage_all_device_types(rpm_t) + dev_create_generic_blk_files(rpm_t) + dev_create_generic_chr_files(rpm_t) +- +-domain_read_all_domains_state(rpm_t) +-domain_getattr_all_domains(rpm_t) +-domain_use_interactive_fds(rpm_t) +-domain_dontaudit_getattr_all_pipes(rpm_t) +-domain_dontaudit_getattr_all_tcp_sockets(rpm_t) +-domain_dontaudit_getattr_all_udp_sockets(rpm_t) +-domain_dontaudit_getattr_all_packet_sockets(rpm_t) +-domain_dontaudit_getattr_all_raw_sockets(rpm_t) +-domain_dontaudit_getattr_all_stream_sockets(rpm_t) +-domain_dontaudit_getattr_all_dgram_sockets(rpm_t) +-domain_signull_all_domains(rpm_t) +- +-files_exec_etc_files(rpm_t) +-files_relabel_non_auth_files(rpm_t) +-files_manage_non_auth_files(rpm_t) ++dev_delete_all_blk_files(rpm_t) ++dev_delete_all_chr_files(rpm_t) ++dev_relabel_all_dev_nodes(rpm_t) ++dev_rename_generic_blk_files(rpm_t) ++dev_rename_generic_chr_files(rpm_t) ++dev_setattr_all_blk_files(rpm_t) ++dev_setattr_all_chr_files(rpm_t) + + fs_getattr_all_dirs(rpm_t) + fs_list_inotifyfs(rpm_t) +@@ -183,29 +175,49 @@ selinux_compute_relabel_context(rpm_t) + selinux_compute_user_contexts(rpm_t) + + storage_raw_write_fixed_disk(rpm_t) ++# for installing kernel packages + storage_raw_read_fixed_disk(rpm_t) + + term_list_ptys(rpm_t) + ++files_relabel_all_files(rpm_t) ++files_manage_all_files(rpm_t) + auth_dontaudit_read_shadow(rpm_t) + auth_use_nsswitch(rpm_t) + ++# transition to rpm script: + rpm_domtrans_script(rpm_t) + ++domain_read_all_domains_state(rpm_t) ++domain_getattr_all_domains(rpm_t) ++domain_use_interactive_fds(rpm_t) ++domain_dontaudit_getattr_all_pipes(rpm_t) ++domain_dontaudit_getattr_all_tcp_sockets(rpm_t) ++domain_dontaudit_getattr_all_udp_sockets(rpm_t) ++domain_dontaudit_getattr_all_packet_sockets(rpm_t) ++domain_dontaudit_getattr_all_raw_sockets(rpm_t) ++domain_dontaudit_getattr_all_stream_sockets(rpm_t) ++domain_dontaudit_getattr_all_dgram_sockets(rpm_t) ++domain_signull_all_domains(rpm_t) ++ ++files_exec_etc_files(rpm_t) ++ + init_domtrans_script(rpm_t) + init_use_script_ptys(rpm_t) + init_signull_script(rpm_t) + + libs_exec_ld_so(rpm_t) + libs_exec_lib_files(rpm_t) +-libs_run_ldconfig(rpm_t, rpm_roles) + + logging_send_syslog_msg(rpm_t) + ++miscfiles_filetrans_named_content(rpm_t) ++ ++# allow compiling and loading new policy + seutil_manage_src_policy(rpm_t) + seutil_manage_bin_policy(rpm_t) + +-userdom_use_user_terminals(rpm_t) ++userdom_use_inherited_user_terminals(rpm_t) + userdom_use_unpriv_users_fds(rpm_t) + + optional_policy(` +@@ -224,13 +236,17 @@ optional_policy(` + networkmanager_dbus_chat(rpm_t) + ') + +- optional_policy(` +- unconfined_dbus_chat(rpm_t) +- ') + ') + + optional_policy(` +- prelink_run(rpm_t, rpm_roles) ++ prelink_domtrans(rpm_t) ++') ++ ++optional_policy(` ++ unconfined_domain_noaudit(rpm_t) ++ # yum-updatesd requires this ++ unconfined_dbus_chat(rpm_t) ++ unconfined_dbus_chat(rpm_script_t) + ') + + ######################################## +@@ -239,18 +255,20 @@ optional_policy(` + # + + allow rpm_script_t self:capability { chown dac_override dac_read_search fowner fsetid setgid setuid ipc_lock sys_admin sys_chroot sys_rawio sys_nice mknod kill net_admin }; ++ + allow rpm_script_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execheap }; + allow rpm_script_t self:fd use; + allow rpm_script_t self:fifo_file rw_fifo_file_perms; ++allow rpm_script_t self:unix_dgram_socket create_socket_perms; ++allow rpm_script_t self:unix_stream_socket rw_stream_socket_perms; + allow rpm_script_t self:unix_dgram_socket sendto; +-allow rpm_script_t self:unix_stream_socket { accept connectto listen }; ++allow rpm_script_t self:unix_stream_socket connectto; + allow rpm_script_t self:shm create_shm_perms; + allow rpm_script_t self:sem create_sem_perms; + allow rpm_script_t self:msgq create_msgq_perms; + allow rpm_script_t self:msg { send receive }; + allow rpm_script_t self:netlink_kobject_uevent_socket create_socket_perms; +- +-allow rpm_script_t rpm_t:netlink_route_socket { read write }; ++allow rpm_script_t self:netlink_audit_socket { create_socket_perms nlmsg_relay }; + + allow rpm_script_t rpm_tmp_t:file read_file_perms; + +@@ -267,8 +285,9 @@ manage_lnk_files_pattern(rpm_script_t, rpm_script_tmpfs_t, rpm_script_tmpfs_t) + manage_fifo_files_pattern(rpm_script_t, rpm_script_tmpfs_t, rpm_script_tmpfs_t) + manage_sock_files_pattern(rpm_script_t, rpm_script_tmpfs_t, rpm_script_tmpfs_t) + fs_tmpfs_filetrans(rpm_script_t, rpm_script_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++can_exec(rpm_script_t, rpm_script_tmpfs_t) + +-can_exec(rpm_script_t, { rpm_script_tmp_t rpm_script_tmpfs_t }) ++allow rpm_script_t rpm_t:netlink_route_socket { read write }; + + kernel_read_crypto_sysctls(rpm_script_t) + kernel_read_kernel_sysctls(rpm_script_t) +@@ -277,45 +296,29 @@ kernel_read_network_state(rpm_script_t) + kernel_list_all_proc(rpm_script_t) + kernel_read_software_raid_state(rpm_script_t) + +-corenet_all_recvfrom_unlabeled(rpm_script_t) +-corenet_all_recvfrom_netlabel(rpm_script_t) +-corenet_tcp_sendrecv_generic_if(rpm_script_t) +-corenet_tcp_sendrecv_generic_node(rpm_script_t) +- +-corenet_sendrecv_http_client_packets(rpm_script_t) ++# needed by rhn_check + corenet_tcp_connect_http_port(rpm_script_t) +-corenet_tcp_sendrecv_http_port(rpm_script_t) +- +-corecmd_exec_all_executables(rpm_script_t) ++# needed by unbound-anchor ++corenet_udp_bind_all_unreserved_ports(rpm_script_t) + + dev_list_sysfs(rpm_script_t) ++ ++# ideally we would not need this + dev_manage_generic_blk_files(rpm_script_t) + dev_manage_generic_chr_files(rpm_script_t) + dev_manage_all_blk_files(rpm_script_t) + dev_manage_all_chr_files(rpm_script_t) + +-domain_read_all_domains_state(rpm_script_t) +-domain_getattr_all_domains(rpm_script_t) +-domain_use_interactive_fds(rpm_script_t) +-domain_signal_all_domains(rpm_script_t) +-domain_signull_all_domains(rpm_script_t) +- +-files_exec_etc_files(rpm_script_t) +-files_exec_usr_files(rpm_script_t) +-files_manage_non_auth_files(rpm_script_t) +-files_relabel_non_auth_files(rpm_script_t) +- + fs_manage_nfs_files(rpm_script_t) + fs_getattr_nfs(rpm_script_t) + fs_search_all(rpm_script_t) + fs_getattr_all_fs(rpm_script_t) ++# why is this not using mount? + fs_getattr_xattr_fs(rpm_script_t) + fs_mount_xattr_fs(rpm_script_t) + fs_unmount_xattr_fs(rpm_script_t) + fs_search_auto_mountpoints(rpm_script_t) + +-mcs_killall(rpm_script_t) +- + mls_file_read_all_levels(rpm_script_t) + mls_file_write_all_levels(rpm_script_t) + +@@ -331,73 +334,129 @@ storage_raw_write_fixed_disk(rpm_script_t) + + term_getattr_unallocated_ttys(rpm_script_t) + term_list_ptys(rpm_script_t) +-term_use_all_terms(rpm_script_t) ++term_use_all_inherited_terms(rpm_script_t) + + auth_dontaudit_getattr_shadow(rpm_script_t) + auth_use_nsswitch(rpm_script_t) + ++corecmd_exec_all_executables(rpm_script_t) ++can_exec(rpm_script_t, rpm_script_tmp_t) ++can_exec(rpm_script_t, rpm_script_tmpfs_t) ++ ++domain_read_all_domains_state(rpm_script_t) ++domain_getattr_all_domains(rpm_script_t) ++domain_use_interactive_fds(rpm_script_t) ++domain_signal_all_domains(rpm_script_t) ++domain_signull_all_domains(rpm_script_t) ++ ++# ideally we would not need this ++files_manage_all_files(rpm_script_t) ++files_exec_etc_files(rpm_script_t) ++files_read_etc_runtime_files(rpm_script_t) ++files_exec_usr_files(rpm_script_t) ++files_relabel_all_files(rpm_script_t) ++ ++init_disable_services(rpm_script_t) ++init_enable_services(rpm_script_t) ++init_reload_services(rpm_script_t) ++init_manage_transient_unit(rpm_script_t) + init_domtrans_script(rpm_script_t) + init_telinit(rpm_script_t) + ++systemd_config_all_services(rpm_script_t) ++ + libs_exec_ld_so(rpm_script_t) + libs_exec_lib_files(rpm_script_t) +-libs_run_ldconfig(rpm_script_t, rpm_roles) ++libs_ldconfig_exec_entry_type(rpm_script_t) + + logging_send_syslog_msg(rpm_script_t) ++logging_send_audit_msgs(rpm_script_t) + +-miscfiles_read_localization(rpm_script_t) +- +-modutils_run_depmod(rpm_script_t, rpm_roles) +-modutils_run_insmod(rpm_script_t, rpm_roles) ++miscfiles_filetrans_named_content(rpm_script_t) + +-seutil_run_loadpolicy(rpm_script_t, rpm_roles) +-seutil_run_setfiles(rpm_script_t, rpm_roles) +-seutil_run_semanage(rpm_script_t, rpm_roles) ++seutil_run_loadpolicy(rpm_script_t, rpm_script_roles) ++seutil_run_setfiles(rpm_script_t, rpm_script_roles) ++seutil_run_semanage(rpm_script_t, rpm_script_roles) ++seutil_run_setsebool(rpm_script_t, rpm_script_roles) + + userdom_use_all_users_fds(rpm_script_t) ++userdom_exec_admin_home_files(rpm_script_t) + + ifdef(`distro_redhat',` + optional_policy(` + mta_send_mail(rpm_script_t) ++ mta_role_access_system_mail(rpm_script_roles) + mta_system_content(rpm_var_run_t) + ') + ') + +-tunable_policy(`allow_execmem',` ++tunable_policy(`deny_execmem',`',` + allow rpm_script_t self:process execmem; + ') + + optional_policy(` +- bootloader_run(rpm_script_t, rpm_roles) ++ bootloader_run(rpm_script_t, rpm_script_roles) ++') ++ ++optional_policy(` ++ bind_systemctl(rpm_script_t) ++') ++ ++optional_policy(` ++ certmonger_dbus_chat(rpm_script_t) ++') ++ ++optional_policy(` ++ cups_filetrans_named_content(rpm_script_t) ++') ++ ++optional_policy(` ++ glusterd_filetrans_named_pid(rpm_script_t) ++') ++ ++optional_policy(` ++ sblim_filetrans_named_content(rpm_script_t) + ') + + optional_policy(` + dbus_system_bus_client(rpm_script_t) + +- optional_policy(` +- unconfined_dbus_chat(rpm_script_t) +- ') ++ optional_policy(` ++ systemd_dbus_chat_logind(rpm_script_t) ++ systemd_dbus_chat_timedated(rpm_script_t) ++ systemd_dbus_chat_localed(rpm_script_t) ++ ') ++') ++ ++optional_policy(` ++ lvm_domtrans(rpm_script_t, rpm_script_roles) ++') ++ ++optional_policy(` ++ ntp_run(rpm_script_t, rpm_script_roles) + ') + + optional_policy(` +- lvm_run(rpm_script_t, rpm_roles) ++ modutils_run_depmod(rpm_script_t, rpm_script_roles) ++ modutils_run_insmod(rpm_script_t, rpm_script_roles) + ') + + optional_policy(` +- ntp_domtrans(rpm_script_t) ++ openshift_initrc_run(rpm_script_t, rpm_script_roles) + ') + + optional_policy(` +- tzdata_run(rpm_t, rpm_roles) +- tzdata_run(rpm_script_t, rpm_roles) ++ tzdata_domtrans(rpm_t) ++ tzdata_run(rpm_script_t, rpm_script_roles) + ') + + optional_policy(` +- udev_domtrans(rpm_script_t) ++ udev_run(rpm_script_t, rpm_script_roles) + ') + + optional_policy(` +- unconfined_domtrans(rpm_script_t) ++ unconfined_domain_noaudit(rpm_script_t) ++ domain_named_filetrans(rpm_script_t) + + optional_policy(` + java_domtrans_unconfined(rpm_script_t) +@@ -409,6 +468,6 @@ optional_policy(` + ') + + optional_policy(` +- usermanage_run_groupadd(rpm_script_t, rpm_roles) +- usermanage_run_useradd(rpm_script_t, rpm_roles) ++ usermanage_run_groupadd(rpm_script_t, rpm_script_roles) ++ usermanage_run_useradd(rpm_script_t, rpm_script_roles) + ') +diff --git a/rshd.fc b/rshd.fc +index 9ad0d58dcf..6a4db031ff 100644 +--- a/rshd.fc ++++ b/rshd.fc +@@ -1,3 +1,4 @@ ++ + /usr/kerberos/sbin/kshd -- gen_context(system_u:object_r:rshd_exec_t,s0) + + /usr/sbin/in\.rexecd -- gen_context(system_u:object_r:rshd_exec_t,s0) +diff --git a/rshd.if b/rshd.if +index 7ad29c0467..2e87d76b4e 100644 +--- a/rshd.if ++++ b/rshd.if +@@ -2,7 +2,7 @@ + + ######################################## + ## +-## Execute rshd in the rshd domain. ++## Domain transition to rshd. + ## + ## + ## +@@ -15,6 +15,7 @@ interface(`rshd_domtrans',` + type rshd_exec_t, rshd_t; + ') + ++ files_search_usr($1) + corecmd_search_bin($1) + domtrans_pattern($1, rshd_exec_t, rshd_t) + ') +diff --git a/rshd.te b/rshd.te +index 864e089a07..f919bc5373 100644 +--- a/rshd.te ++++ b/rshd.te +@@ -4,11 +4,12 @@ policy_module(rshd, 1.8.1) + # + # Declarations + # +- + type rshd_t; + type rshd_exec_t; +-auth_login_pgm_domain(rshd_t) + inetd_tcp_service_domain(rshd_t, rshd_exec_t) ++domain_subj_id_change_exemption(rshd_t) ++domain_role_change_exemption(rshd_t) ++role system_r types rshd_t; + + type rshd_keytab_t; + files_type(rshd_keytab_t) +@@ -17,51 +18,66 @@ files_type(rshd_keytab_t) + # + # Local policy + # +- +-allow rshd_t self:capability { kill setuid setgid fowner fsetid chown dac_override }; +-allow rshd_t self:process { signal_perms setsched setpgid setexec }; ++allow rshd_t self:capability { kill setuid setgid fowner fsetid chown dac_read_search dac_override }; ++allow rshd_t self:process { signal_perms fork setsched setpgid setexec }; + allow rshd_t self:fifo_file rw_fifo_file_perms; + allow rshd_t self:tcp_socket create_stream_socket_perms; + + allow rshd_t rshd_keytab_t:file read_file_perms; + + kernel_read_kernel_sysctls(rshd_t) ++kernel_read_net_sysctls(rshd_t) + +-corenet_all_recvfrom_unlabeled(rshd_t) + corenet_all_recvfrom_netlabel(rshd_t) + corenet_tcp_sendrecv_generic_if(rshd_t) ++corenet_udp_sendrecv_generic_if(rshd_t) + corenet_tcp_sendrecv_generic_node(rshd_t) ++corenet_udp_sendrecv_generic_node(rshd_t) + corenet_tcp_sendrecv_all_ports(rshd_t) ++corenet_udp_sendrecv_all_ports(rshd_t) + corenet_tcp_bind_generic_node(rshd_t) +- +-corenet_sendrecv_all_server_packets(rshd_t) + corenet_tcp_bind_rsh_port(rshd_t) + corenet_tcp_bind_all_rpc_ports(rshd_t) + corenet_tcp_connect_all_ports(rshd_t) + corenet_tcp_connect_all_rpc_ports(rshd_t) ++corenet_sendrecv_rsh_server_packets(rshd_t) ++ ++dev_read_urand(rshd_t) ++ ++domain_interactive_fd(rshd_t) ++ ++selinux_get_fs_mount(rshd_t) ++selinux_validate_context(rshd_t) ++selinux_compute_access_vector(rshd_t) ++selinux_compute_create_context(rshd_t) ++selinux_compute_relabel_context(rshd_t) ++selinux_compute_user_contexts(rshd_t) + + corecmd_read_bin_symlinks(rshd_t) + + files_list_home(rshd_t) ++files_search_tmp(rshd_t) ++ ++auth_login_pgm_domain(rshd_t) ++auth_write_login_records(rshd_t) + ++init_rw_utmp(rshd_t) ++ ++logging_send_syslog_msg(rshd_t) + logging_search_logs(rshd_t) + +-miscfiles_read_localization(rshd_t) ++seutil_read_config(rshd_t) ++seutil_read_default_contexts(rshd_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_read_nfs_files(rshd_t) +- fs_read_nfs_symlinks(rshd_t) +-') ++userdom_search_user_home_content(rshd_t) ++userdom_manage_tmp_role(system_r, rshd_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_read_cifs_files(rshd_t) +- fs_read_cifs_symlinks(rshd_t) +-') ++userdom_home_reader(rshd_t) + + optional_policy(` + kerberos_manage_host_rcache(rshd_t) + kerberos_read_keytab(rshd_t) +- kerberos_tmp_filetrans_host_rcache(rshd_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(rshd_t, "host_0") + kerberos_use(rshd_t) + ') + +diff --git a/rssh.te b/rssh.te +index 5c5465feb7..60059323f4 100644 +--- a/rssh.te ++++ b/rssh.te +@@ -60,18 +60,14 @@ manage_files_pattern(rssh_t, rssh_rw_t, rssh_rw_t) + kernel_read_system_state(rssh_t) + kernel_read_kernel_sysctls(rssh_t) + +-files_read_etc_files(rssh_t) + files_read_etc_runtime_files(rssh_t) + files_list_home(rssh_t) +-files_read_usr_files(rssh_t) + files_list_var(rssh_t) + + fs_search_auto_mountpoints(rssh_t) + + logging_send_syslog_msg(rssh_t) + +-miscfiles_read_localization(rssh_t) +- + rssh_domtrans_chroot_helper(rssh_t) + + ssh_rw_tcp_sockets(rssh_t) +@@ -95,5 +91,3 @@ domain_use_interactive_fds(rssh_chroot_helper_t) + auth_use_nsswitch(rssh_chroot_helper_t) + + logging_send_syslog_msg(rssh_chroot_helper_t) +- +-miscfiles_read_localization(rssh_chroot_helper_t) +diff --git a/rsync.fc b/rsync.fc +index d25301b85b..f3eeec7b6b 100644 +--- a/rsync.fc ++++ b/rsync.fc +@@ -1,7 +1,8 @@ + /etc/rsyncd\.conf -- gen_context(system_u:object_r:rsync_etc_t, s0) + +-/usr/bin/rsync -- gen_context(system_u:object_r:rsync_exec_t,s0) ++/usr/bin/rsync -- gen_context(system_u:object_r:rsync_exec_t,s0) + +-/var/log/rsync\.log.* -- gen_context(system_u:object_r:rsync_log_t,s0) ++/var/log/rsync.* gen_context(system_u:object_r:rsync_log_t,s0) + + /var/run/rsyncd\.lock -- gen_context(system_u:object_r:rsync_var_run_t,s0) ++/var/run/swift_server\.lock -- gen_context(system_u:object_r:rsync_var_run_t,s0) +diff --git a/rsync.if b/rsync.if +index f1140efe48..642e062f41 100644 +--- a/rsync.if ++++ b/rsync.if +@@ -1,16 +1,32 @@ +-## Fast incremental file transfer for synchronization. ++## Fast incremental file transfer for synchronization ++ ++####################################### ++## ++## Sendmail stub interface. No access allowed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rsync_stub',` ++ gen_require(` ++ type rsync_t; ++ ') ++') + + ######################################## + ## +-## Make rsync executable file an +-## entry point for the specified domain. ++## Make rsync an entry point for ++## the specified domain. + ## + ## + ## +-## The domain for which rsync_exec_t is an entrypoint. ++## The domain for which init scripts are an entrypoint. + ## + ## +-# ++# cjp: added for portage + interface(`rsync_entry_type',` + gen_require(` + type rsync_exec_t; +@@ -43,14 +59,13 @@ interface(`rsync_entry_type',` + ## Domain to transition to. + ## + ## +-# ++# cjp: added for portage + interface(`rsync_entry_spec_domtrans',` + gen_require(` + type rsync_exec_t; + ') + +- corecmd_search_bin($1) +- auto_trans($1, rsync_exec_t, $2) ++ domain_trans($1, rsync_exec_t, $2) + ') + + ######################################## +@@ -77,82 +92,56 @@ interface(`rsync_entry_spec_domtrans',` + ## Domain to transition to. + ## + ## +-# ++# cjp: added for portage + interface(`rsync_entry_domtrans',` + gen_require(` + type rsync_exec_t; + ') + +- corecmd_search_bin($1) + domain_auto_trans($1, rsync_exec_t, $2) + ') + + ######################################## + ## +-## Execute the rsync program in the rsync domain. ++## Execute rsync in the caller domain domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## ++## + # +-interface(`rsync_domtrans',` ++interface(`rsync_exec',` + gen_require(` +- type rsync_t, rsync_exec_t; ++ type rsync_exec_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, rsync_exec_t, rsync_t) ++ can_exec($1, rsync_exec_t) + ') + + ######################################## + ## +-## Execute rsync in the rsync domain, and +-## allow the specified role the rsync domain. ++## Read rsync config files. + ## + ## +-## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-# +-interface(`rsync_run',` +- gen_require(` +- attribute_role rsync_roles; +- ') +- +- rsync_domtrans($1) +- roleattribute $2 rsync_roles; +-') +- +-######################################## + ## +-## Execute rsync in the caller domain. +-## +-## +-## + ## Domain allowed access. +-## ++## + ## + # +-interface(`rsync_exec',` ++interface(`rsync_read_config',` + gen_require(` +- type rsync_exec_t; ++ type rsync_etc_t; + ') + +- corecmd_search_bin($1) +- can_exec($1, rsync_exec_t) ++ read_files_pattern($1, rsync_etc_t, rsync_etc_t) ++ files_search_etc($1) + ') + + ######################################## + ## +-## Read rsync config files. ++## Read rsync data files. + ## + ## + ## +@@ -160,23 +149,23 @@ interface(`rsync_exec',` + ## + ## + # +-interface(`rsync_read_config',` ++interface(`rsync_read_data',` + gen_require(` +- type rsync_etc_t; ++ type rsync_data_t; + ') + +- files_search_etc($1) +- allow $1 rsync_etc_t:file read_file_perms; ++ read_files_pattern($1, rsync_data_t, rsync_data_t) + ') + ++ + ######################################## + ## +-## Write rsync config files. ++## Write to rsync config files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`rsync_write_config',` +@@ -184,14 +173,13 @@ interface(`rsync_write_config',` + type rsync_etc_t; + ') + ++ write_files_pattern($1, rsync_etc_t, rsync_etc_t) + files_search_etc($1) +- allow $1 rsync_etc_t:file write_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## rsync config files. ++## Manage rsync config files. + ## + ## + ## +@@ -199,18 +187,18 @@ interface(`rsync_write_config',` + ## + ## + # +-interface(`rsync_manage_config_files',` ++interface(`rsync_manage_config',` + gen_require(` + type rsync_etc_t; + ') + +- files_search_etc($1) + manage_files_pattern($1, rsync_etc_t, rsync_etc_t) ++ files_search_etc($1) + ') + + ######################################## + ## +-## Create specified objects in etc directories ++## Create objects in etc directories + ## with rsync etc type. + ## + ## +@@ -239,43 +227,21 @@ interface(`rsync_etc_filetrans_config',` + + ######################################## + ## +-## All of the rules required to +-## administrate an rsync environment. ++## Transition to rsync named content + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`rsync_admin',` ++interface(`rsync_filetrans_named_content',` + gen_require(` +- type rsync_t, rsync_etc_t, rsync_data_t; +- type rsync_log_t, rsync_tmp_t. rsync_var_run_t; ++ type rsync_etc_t; ++ type rsync_var_run_t; + ') + +- allow $1 rsync_t:process { ptrace signal_perms }; +- ps_process_pattern($1, rsync_t) +- +- files_search_etc($1) +- admin_pattern($1, rsync_etc_t) +- +- admin_pattern($1, rsync_data_t) +- +- logging_search_logs($1) +- admin_pattern($1, rsync_log_t) +- +- files_search_tmp($1) +- admin_pattern($1, rsync_tmp_t) +- +- files_search_pids($1) +- admin_pattern($1, rsync_var_run_t) +- +- rsync_run($1, $2) ++ files_etc_filetrans($1, rsync_etc_t, file, "rsyncd.cond") ++ files_pid_filetrans($1, rsync_var_run_t, file, "swift_server.lock") ++ files_pid_filetrans($1, rsync_var_run_t, file, "rsyncd.lock") + ') +diff --git a/rsync.te b/rsync.te +index abeb302a74..6836678c82 100644 +--- a/rsync.te ++++ b/rsync.te +@@ -6,67 +6,45 @@ policy_module(rsync, 1.13.0) + # + + ## +-##

      +-## Determine whether rsync can use +-## cifs file systems. +-##

      ++##

      ++## Allow rsync to run as a client ++##

      + ##
      +-gen_tunable(rsync_use_cifs, false) ++gen_tunable(rsync_client, false) + + ## +-##

      +-## Determine whether rsync can +-## use fuse file systems. +-##

      ++##

      ++## Allow rsync to export any files/directories read only. ++##

      + ##
      +-gen_tunable(rsync_use_fusefs, false) ++gen_tunable(rsync_export_all_ro, false) + + ## +-##

      +-## Determine whether rsync can use +-## nfs file systems. +-##

      ++##

      ++## Allow rsync to modify public files ++## used for public file transfer services. Files/Directories must be ++## labeled public_content_rw_t. ++##

      + ##
      +-gen_tunable(rsync_use_nfs, false) ++gen_tunable(rsync_anon_write, false) + + ## + ##

      +-## Determine whether rsync can +-## run as a client ++## Allow rsync server to manage all files/directories on the system. + ##

      + ##
      +-gen_tunable(rsync_client, false) ++gen_tunable(rsync_full_access, false) + +-## +-##

      +-## Determine whether rsync can +-## export all content read only. +-##

      +-##
      +-gen_tunable(rsync_export_all_ro, false) +- +-## +-##

      +-## Determine whether rsync can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      +-##
      +-gen_tunable(allow_rsync_anon_write, false) +- +-attribute_role rsync_roles; + + type rsync_t; + type rsync_exec_t; +-init_daemon_domain(rsync_t, rsync_exec_t) +-application_domain(rsync_t, rsync_exec_t) +-role rsync_roles types rsync_t; ++application_executable_file(rsync_exec_t) ++role system_r types rsync_t; + + type rsync_etc_t; + files_config_file(rsync_etc_t) + +-type rsync_data_t; # customizable ++type rsync_data_t; + files_type(rsync_data_t) + + type rsync_log_t; +@@ -86,15 +64,25 @@ files_pid_file(rsync_var_run_t) + allow rsync_t self:capability { chown dac_read_search dac_override fowner fsetid setuid setgid sys_chroot }; + allow rsync_t self:process signal_perms; + allow rsync_t self:fifo_file rw_fifo_file_perms; +-allow rsync_t self:tcp_socket { accept listen }; ++allow rsync_t self:tcp_socket create_stream_socket_perms; ++allow rsync_t self:udp_socket connected_socket_perms; ++ ++# for identd ++# cjp: this should probably only be inetd_child_t rules? ++# search home and kerberos also. ++allow rsync_t self:netlink_tcpdiag_socket r_netlink_socket_perms; ++#end for identd + +-allow rsync_t rsync_etc_t:file read_file_perms; ++read_files_pattern(rsync_t, rsync_etc_t, rsync_etc_t) + + allow rsync_t rsync_data_t:dir list_dir_perms; +-allow rsync_t rsync_data_t:file read_file_perms; +-allow rsync_t rsync_data_t:lnk_file read_lnk_file_perms; ++read_files_pattern(rsync_t, rsync_data_t, rsync_data_t) ++read_lnk_files_pattern(rsync_t, rsync_data_t, rsync_data_t) ++allow rsync_t rsync_data_t:dir_file_class_set getattr; ++allow rsync_t rsync_data_t:socket_class_set getattr; ++allow rsync_t rsync_data_t:sock_file setattr; + +-allow rsync_t rsync_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(rsync_t, rsync_log_t, rsync_log_t) + logging_log_filetrans(rsync_t, rsync_log_t, file) + + manage_dirs_pattern(rsync_t, rsync_tmp_t, rsync_tmp_t) +@@ -108,46 +96,55 @@ kernel_read_kernel_sysctls(rsync_t) + kernel_read_system_state(rsync_t) + kernel_read_network_state(rsync_t) + +-corenet_all_recvfrom_unlabeled(rsync_t) + corenet_all_recvfrom_netlabel(rsync_t) + corenet_tcp_sendrecv_generic_if(rsync_t) ++corenet_udp_sendrecv_generic_if(rsync_t) + corenet_tcp_sendrecv_generic_node(rsync_t) ++corenet_udp_sendrecv_generic_node(rsync_t) ++corenet_tcp_sendrecv_all_ports(rsync_t) ++corenet_udp_sendrecv_all_ports(rsync_t) + corenet_tcp_bind_generic_node(rsync_t) +- +-corenet_sendrecv_rsync_server_packets(rsync_t) + corenet_tcp_bind_rsync_port(rsync_t) +-corenet_tcp_sendrecv_rsync_port(rsync_t) ++corenet_sendrecv_rsync_server_packets(rsync_t) + + dev_read_urand(rsync_t) + +-fs_getattr_all_fs(rsync_t) ++fs_getattr_xattr_fs(rsync_t) + fs_search_auto_mountpoints(rsync_t) + + files_search_home(rsync_t) + +-auth_can_read_shadow_passwords(rsync_t) + auth_use_nsswitch(rsync_t) + + logging_send_syslog_msg(rsync_t) + +-miscfiles_read_localization(rsync_t) + miscfiles_read_public_files(rsync_t) + +-tunable_policy(`allow_rsync_anon_write',` +- miscfiles_manage_public_files(rsync_t) ++userdom_home_manager(rsync_t) ++ ++optional_policy(` ++ daemontools_service_domain(rsync_t, rsync_exec_t) + ') + +-tunable_policy(`rsync_client',` +- corenet_sendrecv_rsync_client_packets(rsync_t) +- corenet_tcp_connect_rsync_port(rsync_t) ++optional_policy(` ++ kerberos_use(rsync_t) ++') + +- corenet_sendrecv_ssh_client_packets(rsync_t) +- corenet_tcp_connect_ssh_port(rsync_t) +- corenet_tcp_sendrecv_ssh_port(rsync_t) ++optional_policy(` ++ inetd_service_domain(rsync_t, rsync_exec_t) ++') + +- manage_dirs_pattern(rsync_t, rsync_data_t, rsync_data_t) +- manage_files_pattern(rsync_t, rsync_data_t, rsync_data_t) +- manage_lnk_files_pattern(rsync_t, rsync_data_t, rsync_data_t) ++optional_policy(` ++ mta_send_mail(rsync_t) ++') ++ ++tunable_policy(`rsync_anon_write',` ++ miscfiles_manage_public_files(rsync_t) ++') ++ ++tunable_policy(`rsync_full_access',` ++ allow rsync_t self:capability { dac_override dac_read_search }; ++ files_manage_non_auth_files(rsync_t) + ') + + tunable_policy(`rsync_export_all_ro',` +@@ -161,38 +158,24 @@ tunable_policy(`rsync_export_all_ro',` + auth_tunable_read_shadow(rsync_t) + ') + +-tunable_policy(`rsync_use_cifs',` +- fs_list_cifs(rsync_t) +- fs_read_cifs_files(rsync_t) +- fs_read_cifs_symlinks(rsync_t) +-') +- +-tunable_policy(`rsync_use_fusefs',` +- fs_search_fusefs(rsync_t) +- fs_read_fusefs_files(rsync_t) +- fs_read_fusefs_symlinks(rsync_t) +-') +- +-tunable_policy(`rsync_use_nfs',` +- fs_list_nfs(rsync_t) +- fs_read_nfs_files(rsync_t) +- fs_read_nfs_symlinks(rsync_t) ++tunable_policy(`rsync_client',` ++ corenet_tcp_connect_rsync_port(rsync_t) ++ corenet_tcp_connect_ssh_port(rsync_t) ++ manage_dirs_pattern(rsync_t, rsync_data_t, rsync_data_t) ++ manage_files_pattern(rsync_t, rsync_data_t, rsync_data_t) ++ manage_lnk_files_pattern(rsync_t, rsync_data_t, rsync_data_t) + ') + + optional_policy(` + tunable_policy(`rsync_client',` +- ssh_exec(rsync_t) ++ ssh_exec(rsync_t) + ') + ') + +-optional_policy(` +- daemontools_service_domain(rsync_t, rsync_exec_t) +-') +- +-optional_policy(` +- kerberos_use(rsync_t) +-') ++auth_can_read_shadow_passwords(rsync_t) + + optional_policy(` +- inetd_service_domain(rsync_t, rsync_exec_t) ++ swift_manage_data_files(rsync_t) ++ swift_manage_lock(rsync_t) ++ swift_filetrans_named_lock(rsync_t) + ') +diff --git a/rtas.fc b/rtas.fc +new file mode 100644 +index 0000000000..8d12521d29 +--- /dev/null ++++ b/rtas.fc +@@ -0,0 +1,14 @@ ++/usr/lib/systemd/system/rtas_errd.* -- gen_context(system_u:object_r:rtas_errd_unit_file_t,s0) ++ ++/usr/sbin/rtas_errd -- gen_context(system_u:object_r:rtas_errd_exec_t,s0) ++/usr/libexec/ppc64-diag/rtas_errd -- gen_context(system_u:object_r:rtas_errd_exec_t,s0) ++ ++/var/lock/subsys/rtas_errd -- gen_context(system_u:object_r:rtas_errd_var_lock_t) ++/var/lock/.*librtas -- gen_context(system_u:object_r:rtas_errd_var_lock_t) ++ ++/var/log/rtas_errd.* -- gen_context(system_u:object_r:rtas_errd_log_t) ++/var/log/platform.* -- gen_context(system_u:object_r:rtas_errd_log_t) ++/var/log/epow_status.* -- gen_context(system_u:object_r:rtas_errd_log_t) ++ ++/var/run/rtas_errd.* -- gen_context(system_u:object_r:rtas_errd_var_run_t,s0) ++ +diff --git a/rtas.if b/rtas.if +new file mode 100644 +index 0000000000..92cc49d7ff +--- /dev/null ++++ b/rtas.if +@@ -0,0 +1,163 @@ ++ ++## Platform diagnostics report firmware events. ++ ++######################################## ++## ++## Execute rtas_errd in the rtas_errd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rtas_errd_domtrans',` ++ gen_require(` ++ type rtas_errd_t, rtas_errd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, rtas_errd_exec_t, rtas_errd_t) ++') ++ ++######################################## ++## ++## Read rtas_errd's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`rtas_errd_read_log',` ++ gen_require(` ++ type rtas_errd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, rtas_errd_log_t, rtas_errd_log_t) ++') ++ ++######################################## ++## ++## Append to rtas_errd log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rtas_errd_append_log',` ++ gen_require(` ++ type rtas_errd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, rtas_errd_log_t, rtas_errd_log_t) ++') ++ ++######################################## ++## ++## Manage rtas_errd log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rtas_errd_manage_log',` ++ gen_require(` ++ type rtas_errd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, rtas_errd_log_t, rtas_errd_log_t) ++ manage_files_pattern($1, rtas_errd_log_t, rtas_errd_log_t) ++ manage_lnk_files_pattern($1, rtas_errd_log_t, rtas_errd_log_t) ++') ++ ++######################################## ++## ++## Read rtas_errd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rtas_errd_read_pid_files',` ++ gen_require(` ++ type rtas_errd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, rtas_errd_var_run_t, rtas_errd_var_run_t) ++') ++ ++######################################## ++## ++## Execute rtas_errd server in the rtas_errd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`rtas_errd_systemctl',` ++ gen_require(` ++ type rtas_errd_t; ++ type rtas_errd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 rtas_errd_unit_file_t:file read_file_perms; ++ allow $1 rtas_errd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, rtas_errd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an rtas_errd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`rtas_errd_admin',` ++ gen_require(` ++ type rtas_errd_t; ++ type rtas_errd_log_t, rtas_errd_var_run_t; ++ type rtas_errd_unit_file_t; ++ ') ++ ++ allow $1 rtas_errd_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, rtas_errd_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, rtas_errd_log_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, rtas_errd_var_run_t) ++ ++ rtas_errd_systemctl($1) ++ admin_pattern($1, rtas_errd_unit_file_t) ++ allow $1 rtas_errd_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/rtas.te b/rtas.te +new file mode 100644 +index 0000000000..9a5164c7e1 +--- /dev/null ++++ b/rtas.te +@@ -0,0 +1,95 @@ ++policy_module(rtas, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type rtas_errd_t; ++type rtas_errd_exec_t; ++init_daemon_domain(rtas_errd_t, rtas_errd_exec_t) ++ ++type rtas_errd_log_t; ++logging_log_file(rtas_errd_log_t) ++ ++type rtas_errd_var_run_t; ++files_pid_file(rtas_errd_var_run_t) ++ ++type rtas_errd_var_lock_t; ++files_lock_file(rtas_errd_var_lock_t) ++ ++type rtas_errd_unit_file_t; ++systemd_unit_file(rtas_errd_unit_file_t) ++ ++type rtas_errd_tmp_t; ++files_tmp_file(rtas_errd_tmp_t) ++ ++type rtas_errd_tmpfs_t; ++files_tmpfs_file(rtas_errd_tmpfs_t) ++ ++######################################## ++# ++# rtas_errd local policy ++# ++ ++allow rtas_errd_t self:capability { net_admin chown sys_admin }; ++allow rtas_errd_t self:process { fork signull }; ++allow rtas_errd_t self:fifo_file rw_fifo_file_perms; ++allow rtas_errd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(rtas_errd_t, rtas_errd_log_t, rtas_errd_log_t) ++manage_files_pattern(rtas_errd_t, rtas_errd_log_t, rtas_errd_log_t) ++manage_lnk_files_pattern(rtas_errd_t, rtas_errd_log_t, rtas_errd_log_t) ++logging_log_filetrans(rtas_errd_t, rtas_errd_log_t, { dir file lnk_file }) ++ ++manage_files_pattern(rtas_errd_t,rtas_errd_var_lock_t,rtas_errd_var_lock_t) ++manage_lnk_files_pattern(rtas_errd_t,rtas_errd_var_lock_t,rtas_errd_var_lock_t) ++files_lock_filetrans(rtas_errd_t,rtas_errd_var_lock_t, { dir file } ) ++ ++manage_dirs_pattern(rtas_errd_t, rtas_errd_var_run_t, rtas_errd_var_run_t) ++manage_files_pattern(rtas_errd_t, rtas_errd_var_run_t, rtas_errd_var_run_t) ++manage_lnk_files_pattern(rtas_errd_t, rtas_errd_var_run_t, rtas_errd_var_run_t) ++files_pid_filetrans(rtas_errd_t, rtas_errd_var_run_t, { dir file lnk_file }) ++ ++manage_files_pattern(rtas_errd_t, rtas_errd_tmp_t, rtas_errd_tmp_t) ++manage_dirs_pattern(rtas_errd_t, rtas_errd_tmp_t, rtas_errd_tmp_t) ++files_tmp_filetrans(rtas_errd_t, rtas_errd_tmp_t, { file dir }) ++ ++manage_files_pattern(rtas_errd_t, rtas_errd_tmpfs_t, rtas_errd_tmpfs_t) ++manage_dirs_pattern(rtas_errd_t, rtas_errd_tmpfs_t, rtas_errd_tmpfs_t) ++fs_tmpfs_filetrans(rtas_errd_t, rtas_errd_tmpfs_t, { file dir }) ++ ++kernel_read_all_sysctls(rtas_errd_t) ++kernel_read_system_state(rtas_errd_t) ++kernel_read_network_state(rtas_errd_t) ++ ++domain_read_all_domains_state(rtas_errd_t) ++ ++auth_use_nsswitch(rtas_errd_t) ++ ++corecmd_exec_bin(rtas_errd_t) ++ ++dev_read_rand(rtas_errd_t) ++dev_read_urand(rtas_errd_t) ++dev_read_raw_memory(rtas_errd_t) ++dev_write_raw_memory(rtas_errd_t) ++dev_read_sysfs(rtas_errd_t) ++dev_rw_nvram(rtas_errd_t) ++ ++files_manage_system_db_files(rtas_errd_t) ++ ++logging_send_syslog_msg(rtas_errd_t) ++logging_read_generic_logs(rtas_errd_t) ++ ++optional_policy(` ++ hostname_exec(rtas_errd_t) ++') ++ ++optional_policy(` ++ rpm_exec(rtas_errd_t) ++ rpm_dontaudit_manage_db(rtas_errd_t) ++') ++ ++optional_policy(` ++ unconfined_domain(rtas_errd_t) ++') +diff --git a/rtkit.if b/rtkit.if +index e904ec472f..e0dd20eeb1 100644 +--- a/rtkit.if ++++ b/rtkit.if +@@ -15,7 +15,6 @@ interface(`rtkit_daemon_domtrans',` + type rtkit_daemon_t, rtkit_daemon_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, rtkit_daemon_exec_t, rtkit_daemon_t) + ') + +@@ -42,56 +41,47 @@ interface(`rtkit_daemon_dbus_chat',` + + ######################################## + ## +-## Allow rtkit to control scheduling for your process. ++## Do not audit send and receive messages from ++## rtkit_daemon over dbus. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`rtkit_scheduled',` ++interface(`rtkit_daemon_dontaudit_dbus_chat',` + gen_require(` + type rtkit_daemon_t; ++ class dbus send_msg; + ') + +- allow rtkit_daemon_t $1:process { getsched setsched }; +- +- kernel_search_proc($1) +- ps_process_pattern(rtkit_daemon_t, $1) +- +- optional_policy(` +- rtkit_daemon_dbus_chat($1) +- ') ++ dontaudit $1 rtkit_daemon_t:dbus send_msg; ++ dontaudit rtkit_daemon_t $1:dbus send_msg; ++ dontaudit rtkit_daemon_t $1:process { getsched setsched }; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an rtkit environment. ++## Allow rtkit to control scheduling for your process + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## +-## + # +-interface(`rtkit_admin',` ++interface(`rtkit_scheduled',` + gen_require(` +- type rtkit_daemon_t, rtkit_daemon_initrc_exec_t; ++ type rtkit_daemon_t; + ') + +- allow $1 rtkit_daemon_t:process { ptrace signal_perms }; +- ps_process_pattern($1, rtkit_daemon_t) ++ allow rtkit_daemon_t $1:process { getsched setsched }; ++ ++ kernel_search_proc($1) ++ ps_process_pattern(rtkit_daemon_t, $1) + +- init_labeled_script_domtrans($1, rtkit_daemon_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 rtkit_daemon_initrc_exec_t system_r; +- allow $2 system_r; ++ optional_policy(` ++ rtkit_daemon_dbus_chat($1) ++ ') + ') +diff --git a/rtkit.te b/rtkit.te +index 7eea21f3fa..7140646330 100644 +--- a/rtkit.te ++++ b/rtkit.te +@@ -31,8 +31,6 @@ auth_use_nsswitch(rtkit_daemon_t) + + logging_send_syslog_msg(rtkit_daemon_t) + +-miscfiles_read_localization(rtkit_daemon_t) +- + optional_policy(` + dbus_system_domain(rtkit_daemon_t, rtkit_daemon_exec_t) + +diff --git a/rwho.if b/rwho.if +index 0360ff0139..e6cb34f717 100644 +--- a/rwho.if ++++ b/rwho.if +@@ -139,8 +139,11 @@ interface(`rwho_admin',` + type rwho_initrc_exec_t; + ') + +- allow $1 rwho_t:process { ptrace signal_perms }; ++ allow $1 rwho_t:process signal_perms; + ps_process_pattern($1, rwho_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 rwho_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, rwho_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/rwho.te b/rwho.te +index 7fb75f457b..eafd70620a 100644 +--- a/rwho.te ++++ b/rwho.te +@@ -16,7 +16,7 @@ type rwho_log_t; + files_type(rwho_log_t) + + type rwho_spool_t; +-files_type(rwho_spool_t) ++files_spool_file(rwho_spool_t) + + ######################################## + # +@@ -38,7 +38,6 @@ files_spool_filetrans(rwho_t, rwho_spool_t, { file dir }) + + kernel_read_system_state(rwho_t) + +-corenet_all_recvfrom_unlabeled(rwho_t) + corenet_all_recvfrom_netlabel(rwho_t) + corenet_udp_sendrecv_generic_if(rwho_t) + corenet_udp_sendrecv_generic_node(rwho_t) +@@ -50,15 +49,15 @@ corenet_udp_sendrecv_rwho_port(rwho_t) + + domain_use_interactive_fds(rwho_t) + +-files_read_etc_files(rwho_t) + + init_read_utmp(rwho_t) + init_dontaudit_write_utmp(rwho_t) + +-logging_send_syslog_msg(rwho_t) ++auth_use_nsswitch(rwho_t) + +-miscfiles_read_localization(rwho_t) ++logging_send_syslog_msg(rwho_t) + + sysnet_dns_name_resolve(rwho_t) + +-# userdom_getattr_user_terminals(rwho_t) ++userdom_getattr_user_terminals(rwho_t) ++ +diff --git a/samba.fc b/samba.fc +index b8b66ff4d0..a93346efee 100644 +--- a/samba.fc ++++ b/samba.fc +@@ -1,42 +1,55 @@ +-/etc/rc\.d/init\.d/nmb -- gen_context(system_u:object_r:samba_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/smb -- gen_context(system_u:object_r:samba_initrc_exec_t,s0) ++ ++# ++# /etc ++# ++/etc/rc\.d/init\.d/nmb -- gen_context(system_u:object_r:samba_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/smb -- gen_context(system_u:object_r:samba_initrc_exec_t,s0) + /etc/rc\.d/init\.d/winbind -- gen_context(system_u:object_r:samba_initrc_exec_t,s0) ++/etc/samba/MACHINE\.SID -- gen_context(system_u:object_r:samba_secrets_t,s0) ++/etc/samba/passdb\.tdb -- gen_context(system_u:object_r:samba_secrets_t,s0) ++/etc/samba/secrets\.tdb -- gen_context(system_u:object_r:samba_secrets_t,s0) ++/etc/samba/smbpasswd -- gen_context(system_u:object_r:samba_secrets_t,s0) ++/etc/samba(/.*)? gen_context(system_u:object_r:samba_etc_t,s0) + +-/etc/samba/MACHINE\.SID -- gen_context(system_u:object_r:samba_secrets_t,s0) +-/etc/samba/passdb\.tdb -- gen_context(system_u:object_r:samba_secrets_t,s0) +-/etc/samba/secrets\.tdb -- gen_context(system_u:object_r:samba_secrets_t,s0) +-/etc/samba/smbpasswd -- gen_context(system_u:object_r:samba_secrets_t,s0) +-/etc/samba(/.*)? gen_context(system_u:object_r:samba_etc_t,s0) ++# ++# /usr ++# ++/usr/lib/systemd/system/smb.* -- gen_context(system_u:object_r:samba_unit_file_t,s0) ++/usr/lib/systemd/system/nmb.* -- gen_context(system_u:object_r:samba_unit_file_t,s0) ++/usr/lib/systemd/system/winbind.* -- gen_context(system_u:object_r:samba_unit_file_t,s0) + +-/usr/bin/net -- gen_context(system_u:object_r:samba_net_exec_t,s0) +-/usr/bin/ntlm_auth -- gen_context(system_u:object_r:winbind_helper_exec_t,s0) +-/usr/bin/smbcontrol -- gen_context(system_u:object_r:smbcontrol_exec_t,s0) +-/usr/bin/smbmount -- gen_context(system_u:object_r:smbmount_exec_t,s0) +-/usr/bin/smbmnt -- gen_context(system_u:object_r:smbmount_exec_t,s0) ++/usr/bin/net -- gen_context(system_u:object_r:samba_net_exec_t,s0) ++/usr/bin/ntlm_auth -- gen_context(system_u:object_r:winbind_helper_exec_t,s0) ++/usr/bin/smbcontrol -- gen_context(system_u:object_r:smbcontrol_exec_t,s0) ++/usr/bin/smbmount -- gen_context(system_u:object_r:smbmount_exec_t,s0) ++/usr/bin/smbmnt -- gen_context(system_u:object_r:smbmount_exec_t,s0) + +-/usr/sbin/swat -- gen_context(system_u:object_r:swat_exec_t,s0) +-/usr/sbin/nmbd -- gen_context(system_u:object_r:nmbd_exec_t,s0) +-/usr/sbin/smbd -- gen_context(system_u:object_r:smbd_exec_t,s0) +-/usr/sbin/winbindd -- gen_context(system_u:object_r:winbind_exec_t,s0) ++/usr/sbin/swat -- gen_context(system_u:object_r:swat_exec_t,s0) ++/usr/sbin/nmbd -- gen_context(system_u:object_r:nmbd_exec_t,s0) ++/usr/sbin/smbd -- gen_context(system_u:object_r:smbd_exec_t,s0) ++/usr/sbin/winbindd -- gen_context(system_u:object_r:winbind_exec_t,s0) + +-/var/cache/samba(/.*)? gen_context(system_u:object_r:samba_var_t,s0) +-/var/cache/samba/winbindd_privileged(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) ++# ++# /var ++# ++/var/cache/samba(/.*)? gen_context(system_u:object_r:samba_var_t,s0) ++/var/cache/samba/winbindd_privileged(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) + +-/var/lib/samba(/.*)? gen_context(system_u:object_r:samba_var_t,s0) +-/var/lib/samba/winbindd_privileged(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) ++/var/nmbd(/.*)? gen_context(system_u:object_r:samba_var_t,s0) + +-/var/log/samba(/.*)? gen_context(system_u:object_r:samba_log_t,s0) ++/var/lib/samba(/.*)? gen_context(system_u:object_r:samba_var_t,s0) ++/var/lib/samba/winbindd_privileged(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) + +-/var/nmbd(/.*)? gen_context(system_u:object_r:samba_var_t,s0) ++/var/log/samba(/.*)? gen_context(system_u:object_r:samba_log_t,s0) + +-/var/run/nmbd(/.*)? gen_context(system_u:object_r:nmbd_var_run_t,s0) +-/var/run/samba/nmbd(/.*)? gen_context(system_u:object_r:nmbd_var_run_t,s0) ++/var/run/nmbd(/.*)? gen_context(system_u:object_r:nmbd_var_run_t,s0) ++/var/run/samba/nmbd(/.*)? gen_context(system_u:object_r:nmbd_var_run_t,s0) + +-/var/run/samba(/.*)? gen_context(system_u:object_r:smbd_var_run_t,s0) ++/var/run/samba(/.*)? gen_context(system_u:object_r:smbd_var_run_t,s0) + /var/run/samba/brlock\.tdb -- gen_context(system_u:object_r:smbd_var_run_t,s0) + /var/run/samba/connections\.tdb -- gen_context(system_u:object_r:smbd_var_run_t,s0) + /var/run/samba/gencache\.tdb -- gen_context(system_u:object_r:smbd_var_run_t,s0) +-/var/run/samba/locking\.tdb -- gen_context(system_u:object_r:smbd_var_run_t,s0) ++/var/run/samba/locking\.tdb -- gen_context(system_u:object_r:smbd_var_run_t,s0) + /var/run/samba/messages\.tdb -- gen_context(system_u:object_r:nmbd_var_run_t,s0) + /var/run/samba/namelist\.debug -- gen_context(system_u:object_r:nmbd_var_run_t,s0) + /var/run/samba/nmbd\.pid -- gen_context(system_u:object_r:nmbd_var_run_t,s0) +@@ -45,7 +58,11 @@ + /var/run/samba/smbd\.pid -- gen_context(system_u:object_r:smbd_var_run_t,s0) + /var/run/samba/unexpected\.tdb -- gen_context(system_u:object_r:nmbd_var_run_t,s0) + +-/var/run/winbindd(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) +-/var/run/samba/winbindd(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) ++/var/run/samba/winbindd(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) ++/var/run/winbindd(/.*)? gen_context(system_u:object_r:winbind_var_run_t,s0) ++ ++/var/spool/samba(/.*)? gen_context(system_u:object_r:samba_spool_t,s0) + +-/var/spool/samba(/.*)? gen_context(system_u:object_r:samba_var_t,s0) ++ifndef(`enable_mls',` ++/var/lib/samba/scripts(/.*)? gen_context(system_u:object_r:samba_unconfined_script_exec_t,s0) ++') +diff --git a/samba.if b/samba.if +index 50d07fb2e5..e4de70769f 100644 +--- a/samba.if ++++ b/samba.if +@@ -1,8 +1,12 @@ +-## SMB and CIFS client/server programs. ++## ++## SMB and CIFS client/server programs for UNIX and ++## name Service Switch daemon for resolving names ++## from Windows NT servers. ++## + + ######################################## + ## +-## Execute nmbd in the nmbd domain. ++## Execute nmbd net in the nmbd_t domain. + ## + ## + ## +@@ -21,7 +25,7 @@ interface(`samba_domtrans_nmbd',` + + ####################################### + ## +-## Send generic signals to nmbd. ++## Allow domain to signal samba + ## + ## + ## +@@ -38,8 +42,26 @@ interface(`samba_signal_nmbd',` + + ######################################## + ## +-## Connect to nmbd with a unix domain +-## stream socket. ++## Search the samba pid directory. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`samba_search_pid',` ++ gen_require(` ++ type smbd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 smbd_var_run_t:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Connect to nmbd. + ## + ## + ## +@@ -49,17 +71,16 @@ interface(`samba_signal_nmbd',` + # + interface(`samba_stream_connect_nmbd',` + gen_require(` +- type samba_var_t, nmbd_t, nmbd_var_run_t, smbd_var_run_t; ++ type nmbd_t, nmbd_var_run_t; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, { smbd_var_run_t samba_var_t nmbd_var_run_t }, nmbd_var_run_t, nmbd_t) ++ samba_search_pid($1) ++ stream_connect_pattern($1, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) + ') + + ######################################## + ## +-## Execute samba init scripts in +-## the init script domain. ++## Execute samba server in the samba domain. + ## + ## + ## +@@ -77,7 +98,31 @@ interface(`samba_initrc_domtrans',` + + ######################################## + ## +-## Execute samba net in the samba net domain. ++## Execute samba server in the samba domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`samba_systemctl',` ++ gen_require(` ++ type samba_unit_file_t; ++ type smbd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 samba_unit_file_t:file read_file_perms; ++ allow $1 samba_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, smbd_t) ++') ++ ++######################################## ++## ++## Execute samba net in the samba_net domain. + ## + ## + ## +@@ -96,9 +141,27 @@ interface(`samba_domtrans_net',` + + ######################################## + ## +-## Execute samba net in the samba net +-## domain, and allow the specified +-## role the samba net domain. ++## Execute samba net in the samba_unconfined_net domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`samba_domtrans_unconfined_net',` ++ gen_require(` ++ type samba_unconfined_net_t, samba_net_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, samba_net_exec_t, samba_unconfined_net_t) ++') ++ ++######################################## ++## ++## Execute samba net in the samba_net domain, and ++## allow the specified role the samba_net domain. + ## + ## + ## +@@ -114,11 +177,56 @@ interface(`samba_domtrans_net',` + # + interface(`samba_run_net',` + gen_require(` +- attribute_role samba_net_roles; ++ type samba_net_t; + ') + + samba_domtrans_net($1) +- roleattribute $2 samba_net_roles; ++ role $2 types samba_net_t; ++') ++ ++####################################### ++## ++## The role for the samba module. ++## ++## ++## ++## The role to be allowed the samba_net domain. ++## ++## ++## ++# ++interface(`samba_role_notrans',` ++ gen_require(` ++ type smbd_t; ++ ') ++ ++ role $1 types smbd_t; ++') ++ ++######################################## ++## ++## Execute samba net in the samba_unconfined_net domain, and ++## allow the specified role the samba_unconfined_net domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The role to be allowed the samba_unconfined_net domain. ++## ++## ++## ++# ++interface(`samba_run_unconfined_net',` ++ gen_require(` ++ type samba_unconfined_net_t; ++ ') ++ ++ samba_domtrans_unconfined_net($1) ++ role $2 types samba_unconfined_net_t; + ') + + ######################################## +@@ -142,9 +250,8 @@ interface(`samba_domtrans_smbmount',` + + ######################################## + ## +-## Execute smbmount in the smbmount +-## domain, and allow the specified +-## role the smbmount domain. ++## Execute smbmount interactively and do ++## a domain transition to the smbmount domain. + ## + ## + ## +@@ -160,16 +267,17 @@ interface(`samba_domtrans_smbmount',` + # + interface(`samba_run_smbmount',` + gen_require(` +- attribute_role smbmount_roles; ++ type smbmount_t; + ') + + samba_domtrans_smbmount($1) +- roleattribute $2 smbmount_roles; ++ role $2 types smbmount_t; + ') + + ######################################## + ## +-## Read samba configuration files. ++## Allow the specified domain to read ++## samba configuration files. + ## + ## + ## +@@ -184,12 +292,14 @@ interface(`samba_read_config',` + ') + + files_search_etc($1) ++ list_dirs_pattern($1, samba_etc_t, samba_etc_t) + read_files_pattern($1, samba_etc_t, samba_etc_t) + ') + + ######################################## + ## +-## Read and write samba configuration files. ++## Allow the specified domain to read ++## and write samba configuration files. + ## + ## + ## +@@ -209,8 +319,8 @@ interface(`samba_rw_config',` + + ######################################## + ## +-## Create, read, write, and delete +-## samba configuration files. ++## Allow the specified domain to read ++## and write samba configuration files. + ## + ## + ## +@@ -231,7 +341,7 @@ interface(`samba_manage_config',` + + ######################################## + ## +-## Read samba log files. ++## Allow the specified domain to read samba's log files. + ## + ## + ## +@@ -252,7 +362,7 @@ interface(`samba_read_log',` + + ######################################## + ## +-## Append to samba log files. ++## Allow the specified domain to append to samba's log files. + ## + ## + ## +@@ -273,7 +383,7 @@ interface(`samba_append_log',` + + ######################################## + ## +-## Execute samba log files in the caller domain. ++## Execute samba log in the caller domain. + ## + ## + ## +@@ -292,7 +402,7 @@ interface(`samba_exec_log',` + + ######################################## + ## +-## Read samba secret files. ++## Allow the specified domain to read samba's secrets. + ## + ## + ## +@@ -311,7 +421,7 @@ interface(`samba_read_secrets',` + + ######################################## + ## +-## Read samba share files. ++## Allow the specified domain to read samba's shares + ## + ## + ## +@@ -330,7 +440,8 @@ interface(`samba_read_share_files',` + + ######################################## + ## +-## Search samba var directories. ++## Allow the specified domain to search ++## samba /var directories. + ## + ## + ## +@@ -343,13 +454,15 @@ interface(`samba_search_var',` + type samba_var_t; + ') + ++ files_search_var($1) + files_search_var_lib($1) + allow $1 samba_var_t:dir search_dir_perms; + ') + + ######################################## + ## +-## Read samba var files. ++## Allow the specified domain to ++## read samba /var files. + ## + ## + ## +@@ -362,14 +475,15 @@ interface(`samba_read_var_files',` + type samba_var_t; + ') + ++ files_search_var($1) + files_search_var_lib($1) + read_files_pattern($1, samba_var_t, samba_var_t) + ') + + ######################################## + ## +-## Do not audit attempts to write +-## samba var files. ++## Do not audit attempts to write samba ++## /var files. + ## + ## + ## +@@ -387,7 +501,8 @@ interface(`samba_dontaudit_write_var_files',` + + ######################################## + ## +-## Read and write samba var files. ++## Allow the specified domain to ++## read and write samba /var files. + ## + ## + ## +@@ -400,14 +515,16 @@ interface(`samba_rw_var_files',` + type samba_var_t; + ') + ++ files_search_var($1) + files_search_var_lib($1) + rw_files_pattern($1, samba_var_t, samba_var_t) ++ allow $1 samba_var_t:file { map}; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## samba var files. ++## Allow the specified domain to ++## read and write samba /var files. + ## + ## + ## +@@ -420,34 +537,58 @@ interface(`samba_manage_var_files',` + type samba_var_t; + ') + ++ files_search_var_lib($1) + files_search_var_lib($1) + manage_files_pattern($1, samba_var_t, samba_var_t) ++ manage_lnk_files_pattern($1, samba_var_t, samba_var_t) ++ manage_sock_files_pattern($1, samba_var_t, samba_var_t) ++ allow $1 samba_var_t:file { map }; + ') + + ######################################## + ## +-## Execute smbcontrol in the smbcontrol domain. ++## Allow the specified domain to ++## read and write samba /var directories. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # ++interface(`samba_manage_var_dirs',` ++ gen_require(` ++ type samba_var_t; ++ ') ++ ++ files_search_var_lib($1) ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, samba_var_t, samba_var_t) ++') ++ ++######################################## ++## ++## Execute a domain transition to run smbcontrol. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# + interface(`samba_domtrans_smbcontrol',` + gen_require(` +- type smbcontrol_t, smbcontrol_exec_t; ++ type smbcontrol_t; ++ type smbcontrol_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, smbcontrol_exec_t, smbcontrol_t) + ') + + ######################################## + ## +-## Execute smbcontrol in the smbcontrol +-## domain, and allow the specified +-## role the smbcontrol domain. ++## Execute smbcontrol in the smbcontrol domain, and ++## allow the specified role the smbcontrol domain. + ## + ## + ## +@@ -462,16 +603,16 @@ interface(`samba_domtrans_smbcontrol',` + # + interface(`samba_run_smbcontrol',` + gen_require(` +- attribute_role smbcontrol_roles; ++ type smbcontrol_t; + ') + + samba_domtrans_smbcontrol($1) +- roleattribute $2 smbcontrol_roles; ++ role $2 types smbcontrol_t; + ') + + ######################################## + ## +-## Execute smbd in the smbd domain. ++## Execute smbd in the smbd_t domain. + ## + ## + ## +@@ -488,9 +629,27 @@ interface(`samba_domtrans_smbd',` + domtrans_pattern($1, smbd_exec_t, smbd_t) + ') + ++######################################## ++## ++## Set attributes of samba_share directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`samba_setattr_samba_share_dirs',` ++ gen_require(` ++ type samba_share_t; ++ ') ++ ++ allow $1 samba_share_t:dir setattr_dir_perms; ++') ++ + ###################################### + ## +-## Send generic signals to smbd. ++## Allow domain to signal samba + ## + ## + ## +@@ -505,10 +664,26 @@ interface(`samba_signal_smbd',` + allow $1 smbd_t:process signal; + ') + ++###################################### ++## ++## Allow domain to signull samba ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`samba_signull_smbd',` ++ gen_require(` ++ type smbd_t; ++ ') ++ allow $1 smbd_t:process signull; ++') ++ + ######################################## + ## +-## Do not audit attempts to inherit +-## and use smbd file descriptors. ++## Do not audit attempts to use file descriptors from samba. + ## + ## + ## +@@ -526,7 +701,7 @@ interface(`samba_dontaudit_use_fds',` + + ######################################## + ## +-## Write smbmount tcp sockets. ++## Allow the specified domain to write to smbmount tcp sockets. + ## + ## + ## +@@ -544,7 +719,7 @@ interface(`samba_write_smbmount_tcp_sockets',` + + ######################################## + ## +-## Read and write smbmount tcp sockets. ++## Allow the specified domain to read and write to smbmount tcp sockets. + ## + ## + ## +@@ -560,49 +735,47 @@ interface(`samba_rw_smbmount_tcp_sockets',` + allow $1 smbmount_t:tcp_socket { read write }; + ') + +-######################################## ++####################################### + ## +-## Execute winbind helper in the +-## winbind helper domain. ++## Allow to getattr on winbind binary. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed to transition. ++## + ## + # +-interface(`samba_domtrans_winbind_helper',` +- gen_require(` +- type winbind_helper_t, winbind_helper_exec_t; +- ') ++interface(`samba_getattr_winbind',` ++ gen_require(` ++ type winbind_exec_t; ++ ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, winbind_helper_exec_t, winbind_helper_t) ++ allow $1 winbind_exec_t:file getattr; + ') + +-####################################### ++######################################## + ## +-## Get attributes of winbind executable files. ++## Execute winbind_helper in the winbind_helper domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`samba_getattr_winbind_exec',` ++interface(`samba_domtrans_winbind_helper',` + gen_require(` +- type winbind_exec_t; ++ type winbind_helper_t, winbind_helper_exec_t; + ') + +- allow $1 winbind_exec_t:file getattr_file_perms; ++ domtrans_pattern($1, winbind_helper_exec_t, winbind_helper_t) ++ allow $1 winbind_helper_t:process signal; + ') + + ######################################## + ## +-## Execute winbind helper in the winbind +-## helper domain, and allow the specified +-## role the winbind helper domain. ++## Execute winbind_helper in the winbind_helper domain, and ++## allow the specified role the winbind_helper domain. + ## + ## + ## +@@ -618,16 +791,16 @@ interface(`samba_getattr_winbind_exec',` + # + interface(`samba_run_winbind_helper',` + gen_require(` +- attribute_role winbind_helper_roles; ++ type winbind_helper_t; + ') + + samba_domtrans_winbind_helper($1) +- roleattribute $2 winbind_helper_roles; ++ role $2 types winbind_helper_t; + ') + + ######################################## + ## +-## Read winbind pid files. ++## Allow the specified domain to read the winbind pid files. + ## + ## + ## +@@ -637,17 +810,71 @@ interface(`samba_run_winbind_helper',` + # + interface(`samba_read_winbind_pid',` + gen_require(` +- type winbind_var_run_t, smbd_var_run_t; ++ type winbind_var_run_t; ++ ') ++ ++ samba_search_pid($1) ++ allow $1 winbind_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Manage winbind PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`samba_manage_winbind_pid',` ++ gen_require(` ++ type winbind_var_run_t; + ') + + files_search_pids($1) +- read_files_pattern($1, { smbd_var_run_t winbind_var_run_t }, winbind_var_run_t) ++ manage_dirs_pattern($1, winbind_var_run_t, winbind_var_run_t) ++ manage_files_pattern($1, winbind_var_run_t, winbind_var_run_t) ++ manage_sock_files_pattern($1, winbind_var_run_t, winbind_var_run_t) ++') ++ ++###################################### ++## ++## Allow domain to signull winbind ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`samba_signull_winbind',` ++ gen_require(` ++ type winbind_t; ++ ') ++ allow $1 winbind_t:process signull; ++') ++ ++###################################### ++## ++## Allow domain to signull samba_unconfined_net ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`samba_signull_unconfined_net',` ++ gen_require(` ++ type samba_unconfined_net_t; ++ ') ++ allow $1 samba_unconfined_net_t:process signull; + ') + + ######################################## + ## +-## Connect to winbind with a unix +-## domain stream socket. ++## Connect to winbind. + ## + ## + ## +@@ -657,17 +884,61 @@ interface(`samba_read_winbind_pid',` + # + interface(`samba_stream_connect_winbind',` + gen_require(` +- type samba_var_t, winbind_t, winbind_var_run_t, smbd_var_run_t; ++ type samba_var_t, winbind_t, winbind_var_run_t; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, { smbd_var_run_t samba_var_t winbind_var_run_t }, winbind_var_run_t, winbind_t) ++ samba_search_pid($1) ++ allow $1 samba_var_t:dir search_dir_perms; ++ stream_connect_pattern($1, winbind_var_run_t, winbind_var_run_t, winbind_t) ++ samba_read_config($1) ++ ++ ifndef(`distro_redhat',` ++ gen_require(` ++ type winbind_tmp_t; ++ ') ++ ++ # the default for the socket is (poorly named): ++ # /tmp/.winbindd/pipe ++ files_search_tmp($1) ++ stream_connect_pattern($1, winbind_tmp_t, winbind_tmp_t, winbind_t) ++ ') ++') ++ ++######################################## ++## ++## Create a set of derived types for apache ++## web content. ++## ++## ++## ++## The prefix to be used for deriving type names. ++## ++## ++# ++template(`samba_helper_template',` ++ gen_require(` ++ type smbd_t; ++ role system_r; ++ ') ++ ++ #This type is for samba helper scripts ++ type samba_$1_script_t; ++ domain_type(samba_$1_script_t) ++ role system_r types samba_$1_script_t; ++ ++ # This type is used for executable scripts files ++ type samba_$1_script_exec_t; ++ corecmd_shell_entry_type(samba_$1_script_t) ++ domain_entry_file(samba_$1_script_t, samba_$1_script_exec_t) ++ ++ domtrans_pattern(smbd_t, samba_$1_script_exec_t, samba_$1_script_t) ++ allow smbd_t samba_$1_script_exec_t:file ioctl; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an samba environment. ++## All of the rules required to administrate ++## an samba environment + ## + ## + ## +@@ -676,7 +947,7 @@ interface(`samba_stream_connect_winbind',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the samba domain. + ## + ## + ## +@@ -689,11 +960,30 @@ interface(`samba_admin',` + type samba_etc_t, samba_share_t, samba_initrc_exec_t; + type swat_var_run_t, swat_tmp_t, winbind_log_t; + type winbind_var_run_t, winbind_tmp_t; +- type smbd_keytab_t; ++ type smbd_keytab_t, samba_unit_file_t; ++ type samba_unconfined_script_t; ++ type samba_unconfined_script_exec_t; + ') + +- allow $1 { nmbd_t smbd_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { nmbd_t smbd_t }) ++ allow $1 smbd_t:process signal_perms; ++ ps_process_pattern($1, smbd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 smbd_t:process ptrace; ++ allow $1 nmbd_t:process ptrace; ++ allow $1 samba_unconfined_script_t:process ptrace; ++ ') ++ ++ allow $1 nmbd_t:process signal_perms; ++ ps_process_pattern($1, nmbd_t) ++ ++ allow $1 samba_unconfined_script_t:process signal_perms; ++ ps_process_pattern($1, samba_unconfined_script_t) ++ ++ samba_run_smbcontrol($1, $2) ++ samba_run_winbind_helper($1, $2) ++ samba_run_smbmount($1, $2) ++ samba_run_net($1, $2) + + init_labeled_script_domtrans($1, samba_initrc_exec_t) + domain_system_change_exemption($1) +@@ -703,23 +993,34 @@ interface(`samba_admin',` + files_list_etc($1) + admin_pattern($1, { samba_etc_t smbd_keytab_t }) + ++ admin_pattern($1, samba_log_t) + logging_list_logs($1) +- admin_pattern($1, { samba_log_t winbind_log_t }) + +- files_list_var($1) +- admin_pattern($1, { samba_share_t samba_var_t samba_secrets_t }) ++ admin_pattern($1, samba_secrets_t) + +- files_list_spool($1) +- admin_pattern($1, smbd_spool_t) ++ admin_pattern($1, samba_share_t) + ++ admin_pattern($1, samba_var_t) ++ files_list_var($1) ++ ++ admin_pattern($1, smbd_var_run_t) + files_list_pids($1) +- admin_pattern($1, { winbind_var_run_t smbd_var_run_t swat_var_run_t nmbd_var_run_t }) + ++ admin_pattern($1, smbd_tmp_t) + files_list_tmp($1) +- admin_pattern($1, { swat_tmp_t smbd_tmp_t winbind_tmp_t }) + +- samba_run_smbcontrol($1, $2) +- samba_run_winbind_helper($1, $2) +- samba_run_smbmount($1, $2) +- samba_run_net($1, $2) ++ admin_pattern($1, swat_var_run_t) ++ ++ admin_pattern($1, swat_tmp_t) ++ ++ admin_pattern($1, winbind_log_t) ++ ++ admin_pattern($1, winbind_tmp_t) ++ ++ admin_pattern($1, winbind_var_run_t) ++ admin_pattern($1, samba_unconfined_script_exec_t) ++ ++ samba_systemctl($1) ++ admin_pattern($1, samba_unit_file_t) ++ allow $1 samba_unit_file_t:service all_service_perms; + ') +diff --git a/samba.te b/samba.te +index 2b7c441e70..3bc2124af6 100644 +--- a/samba.te ++++ b/samba.te +@@ -6,99 +6,86 @@ policy_module(samba, 1.16.3) + # + + ## +-##

      +-## Determine whether samba can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      ++##

      ++## Allow samba to modify public files used for public file ++## transfer services. Files/Directories must be labeled ++## public_content_rw_t. ++##

      + ##
      +-gen_tunable(allow_smbd_anon_write, false) ++gen_tunable(smbd_anon_write, false) + + ## +-##

      +-## Determine whether samba can +-## create home directories via pam. +-##

      ++##

      ++## Allow samba to create new home directories (e.g. via PAM) ++##

      + ##
      + gen_tunable(samba_create_home_dirs, false) + + ## +-##

      +-## Determine whether samba can act as the +-## domain controller, add users, groups +-## and change passwords. +-##

      ++##

      ++## Allow samba to act as the domain controller, add users, ++## groups and change passwords. ++## ++##

      + ##
      + gen_tunable(samba_domain_controller, false) + + ## +-##

      +-## Determine whether samba can +-## act as a portmapper. +-##

      ++##

      ++## Allow samba to act as a portmapper ++## ++##

      + ##
      + gen_tunable(samba_portmapper, false) + + ## +-##

      +-## Determine whether samba can share +-## users home directories. +-##

      ++##

      ++## Allow samba to share users home directories. ++##

      + ##
      + gen_tunable(samba_enable_home_dirs, false) + + ## +-##

      +-## Determine whether samba can share +-## any content read only. +-##

      ++##

      ++## Allow samba to share any file/directory read only. ++##

      + ##
      + gen_tunable(samba_export_all_ro, false) + + ## +-##

      +-## Determine whether samba can share any +-## content readable and writable. +-##

      ++##

      ++## Allow samba to share any file/directory read/write. ++##

      + ##
      + gen_tunable(samba_export_all_rw, false) + + ## +-##

      +-## Determine whether samba can +-## run unconfined scripts. +-##

      ++##

      ++## Allow samba to run unconfined scripts ++##

      + ##
      + gen_tunable(samba_run_unconfined, false) + + ## +-##

      +-## Determine whether samba can +-## use nfs file systems. +-##

      ++##

      ++## Allow samba to export NFS volumes. ++##

      + ##
      + gen_tunable(samba_share_nfs, false) + + ## +-##

      +-## Determine whether samba can +-## use fuse file systems. +-##

      ++##

      ++## Allow samba to export ntfs/fusefs volumes. ++##

      + ##
      + gen_tunable(samba_share_fusefs, false) + +-attribute_role samba_net_roles; +-roleattribute system_r samba_net_roles; +- +-attribute_role smbcontrol_roles; +-roleattribute system_r smbcontrol_roles; +- +-attribute_role smbmount_roles; +-roleattribute system_r smbmount_roles; +- +-attribute_role winbind_helper_roles; +-roleattribute system_r winbind_helper_roles; ++## ++##

      ++## Allow smbd to load libgfapi from gluster. ++##

      ++##
      ++gen_tunable(samba_load_libgfapi, false) + + type nmbd_t; + type nmbd_exec_t; +@@ -113,13 +100,16 @@ files_config_file(samba_etc_t) + type samba_initrc_exec_t; + init_script_file(samba_initrc_exec_t) + ++type samba_unit_file_t; ++systemd_unit_file(samba_unit_file_t) ++ + type samba_log_t; + logging_log_file(samba_log_t) + + type samba_net_t; + type samba_net_exec_t; + application_domain(samba_net_t, samba_net_exec_t) +-role samba_net_roles types samba_net_t; ++role system_r types samba_net_t; + + type samba_net_tmp_t; + files_tmp_file(samba_net_tmp_t) +@@ -130,13 +120,16 @@ files_type(samba_secrets_t) + type samba_share_t; # customizable + files_type(samba_share_t) + ++type samba_spool_t; ++files_type(samba_spool_t) ++ + type samba_var_t; + files_type(samba_var_t) + + type smbcontrol_t; + type smbcontrol_exec_t; + application_domain(smbcontrol_t, smbcontrol_exec_t) +-role smbcontrol_roles types smbcontrol_t; ++role system_r types smbcontrol_t; + + type smbd_t; + type smbd_exec_t; +@@ -148,13 +141,17 @@ files_type(smbd_keytab_t) + type smbd_tmp_t; + files_tmp_file(smbd_tmp_t) + ++type smbd_tmpfs_t; ++files_tmpfs_file(smbd_tmpfs_t) ++ + type smbd_var_run_t; + files_pid_file(smbd_var_run_t) + + type smbmount_t; ++domain_type(smbmount_t) ++ + type smbmount_exec_t; +-application_domain(smbmount_t, smbmount_exec_t) +-role smbmount_roles types smbmount_t; ++domain_entry_file(smbmount_t, smbmount_exec_t) + + type swat_t; + type swat_exec_t; +@@ -173,28 +170,29 @@ type winbind_exec_t; + init_daemon_domain(winbind_t, winbind_exec_t) + + type winbind_helper_t; ++domain_type(winbind_helper_t) ++role system_r types winbind_helper_t; ++ + type winbind_helper_exec_t; +-application_domain(winbind_helper_t, winbind_helper_exec_t) +-role winbind_helper_roles types winbind_helper_t; ++domain_entry_file(winbind_helper_t, winbind_helper_exec_t) + + type winbind_log_t; + logging_log_file(winbind_log_t) + +-type winbind_tmp_t; +-files_tmp_file(winbind_tmp_t) +- + type winbind_var_run_t; + files_pid_file(winbind_var_run_t) + + ######################################## + # +-# Net local policy ++# Samba net local policy + # +- + allow samba_net_t self:capability { sys_chroot sys_nice dac_read_search dac_override }; + allow samba_net_t self:capability2 block_suspend; + allow samba_net_t self:process { getsched setsched }; +-allow samba_net_t self:unix_stream_socket { accept listen }; ++allow samba_net_t self:unix_dgram_socket create_socket_perms; ++allow samba_net_t self:unix_stream_socket create_stream_socket_perms; ++allow samba_net_t self:udp_socket create_socket_perms; ++allow samba_net_t self:tcp_socket create_socket_perms; + + allow samba_net_t samba_etc_t:file read_file_perms; + +@@ -208,19 +206,26 @@ files_tmp_filetrans(samba_net_t, samba_net_tmp_t, { file dir }) + manage_dirs_pattern(samba_net_t, samba_var_t, samba_var_t) + manage_files_pattern(samba_net_t, samba_var_t, samba_var_t) + manage_lnk_files_pattern(samba_net_t, samba_var_t, samba_var_t) ++manage_sock_files_pattern(samba_net_t, samba_var_t, samba_var_t) + files_var_filetrans(samba_net_t, samba_var_t, dir, "samba") ++allow samba_net_t samba_var_t:file { map } ; + ++kernel_read_proc_symlinks(samba_net_t) + kernel_read_system_state(samba_net_t) + kernel_read_network_state(samba_net_t) + +-corenet_all_recvfrom_unlabeled(samba_net_t) + corenet_all_recvfrom_netlabel(samba_net_t) ++corenet_tcp_sendrecv_generic_if(samba_net_t) + corenet_udp_sendrecv_generic_if(samba_net_t) ++corenet_raw_sendrecv_generic_if(samba_net_t) + corenet_tcp_sendrecv_generic_node(samba_net_t) +- +-corenet_sendrecv_smbd_client_packets(samba_net_t) ++corenet_udp_sendrecv_generic_node(samba_net_t) ++corenet_raw_sendrecv_generic_node(samba_net_t) ++corenet_tcp_sendrecv_all_ports(samba_net_t) ++corenet_udp_sendrecv_all_ports(samba_net_t) ++corenet_tcp_bind_generic_node(samba_net_t) ++corenet_udp_bind_generic_node(samba_net_t) + corenet_tcp_connect_smbd_port(samba_net_t) +-corenet_tcp_sendrecv_smbd_port(samba_net_t) + + dev_read_urand(samba_net_t) + +@@ -233,63 +238,86 @@ auth_manage_cache(samba_net_t) + + logging_send_syslog_msg(samba_net_t) + +-miscfiles_read_localization(samba_net_t) +- + samba_read_var_files(samba_net_t) + +-userdom_use_user_terminals(samba_net_t) ++sysnet_use_ldap(samba_net_t) ++ ++userdom_use_inherited_user_terminals(samba_net_t) + userdom_list_user_home_dirs(samba_net_t) + + optional_policy(` +- ldap_stream_connect(samba_net_t) ++ ctdbd_stream_connect(samba_net_t) ++ ctdbd_manage_lib_dirs(samba_net_t) ++ ctdbd_manage_lib_files(samba_net_t) ++') ++ ++optional_policy(` ++ ldap_stream_connect(samba_net_t) ++ dirsrv_stream_connect(samba_net_t) + ') + + optional_policy(` + pcscd_read_pid_files(samba_net_t) + ') + ++optional_policy(` ++ realmd_manage_cache_files(samba_net_t) ++ realmd_read_tmp_files(samba_net_t) ++') ++ + optional_policy(` + kerberos_use(samba_net_t) +- kerberos_etc_filetrans_keytab(samba_net_t, file) ++ kerberos_etc_filetrans_keytab(samba_net_t) + ') + + ######################################## + # +-# Smbd Local policy ++# smbd Local policy + # + +-allow smbd_t self:capability { chown fowner kill fsetid setgid setuid sys_chroot sys_nice sys_admin sys_resource lease dac_override dac_read_search }; ++allow smbd_t self:capability { chown fowner kill fsetid setgid setuid sys_chroot sys_nice sys_admin sys_resource lease dac_override dac_read_search net_admin }; + dontaudit smbd_t self:capability sys_tty_config; +-allow smbd_t self:process ~{ ptrace setcurrent setexec setfscreate execmem execstack execheap }; ++dontaudit smbd_t self:capability2 block_suspend; ++allow smbd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++allow smbd_t self:process setrlimit; + allow smbd_t self:fd use; + allow smbd_t self:fifo_file rw_fifo_file_perms; + allow smbd_t self:msg { send receive }; + allow smbd_t self:msgq create_msgq_perms; + allow smbd_t self:sem create_sem_perms; + allow smbd_t self:shm create_shm_perms; +-allow smbd_t self:tcp_socket { accept listen }; +-allow smbd_t self:unix_dgram_socket sendto; +-allow smbd_t self:unix_stream_socket { accept connectto listen }; ++allow smbd_t self:key manage_key_perms; ++allow smbd_t self:sock_file read_sock_file_perms; ++allow smbd_t self:tcp_socket create_stream_socket_perms; ++allow smbd_t self:udp_socket create_socket_perms; ++allow smbd_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow smbd_t self:unix_stream_socket { create_stream_socket_perms connectto }; + +-allow smbd_t { swat_t winbind_t smbcontrol_t nmbd_t }:process { signal signull }; ++allow smbd_t nmbd_t:process { signal signull }; + +-allow smbd_t samba_etc_t:file { rw_file_perms setattr_file_perms }; ++allow smbd_t nmbd_t:unix_dgram_socket sendto; ++ ++allow smbd_t nmbd_var_run_t:file rw_file_perms; ++stream_connect_pattern(smbd_t, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) ++ ++allow smbd_t samba_etc_t:file { rw_file_perms setattr }; + + allow smbd_t smbd_keytab_t:file read_file_perms; + + manage_dirs_pattern(smbd_t, samba_log_t, samba_log_t) +-append_files_pattern(smbd_t, samba_log_t, samba_log_t) +-create_files_pattern(smbd_t, samba_log_t, samba_log_t) +-setattr_files_pattern(smbd_t, samba_log_t, samba_log_t) ++manage_files_pattern(smbd_t, samba_log_t, samba_log_t) + +-allow smbd_t samba_net_tmp_t:file getattr_file_perms; ++allow smbd_t samba_net_tmp_t:file getattr; + + manage_files_pattern(smbd_t, samba_secrets_t, samba_secrets_t) + filetrans_pattern(smbd_t, samba_etc_t, samba_secrets_t, file) + + manage_dirs_pattern(smbd_t, samba_share_t, samba_share_t) + manage_files_pattern(smbd_t, samba_share_t, samba_share_t) ++manage_fifo_files_pattern(smbd_t, samba_share_t, samba_share_t) ++manage_sock_files_pattern(smbd_t, samba_share_t, samba_share_t) + manage_lnk_files_pattern(smbd_t, samba_share_t, samba_share_t) ++allow smbd_t samba_share_t:file { map }; + allow smbd_t samba_share_t:filesystem { getattr quotaget }; + + manage_dirs_pattern(smbd_t, samba_var_t, samba_var_t) +@@ -297,66 +325,76 @@ manage_files_pattern(smbd_t, samba_var_t, samba_var_t) + manage_lnk_files_pattern(smbd_t, samba_var_t, samba_var_t) + manage_sock_files_pattern(smbd_t, samba_var_t, samba_var_t) + files_var_filetrans(smbd_t, samba_var_t, dir, "samba") ++allow smbd_t samba_var_t:file { map } ; ++ ++manage_dirs_pattern(smbd_t, samba_spool_t, samba_spool_t) ++manage_files_pattern(smbd_t, samba_spool_t, samba_spool_t) ++manage_lnk_files_pattern(smbd_t, samba_spool_t, samba_spool_t) ++manage_sock_files_pattern(smbd_t, samba_spool_t, samba_spool_t) ++files_spool_filetrans(smbd_t, samba_spool_t, dir, "samba") ++ ++allow smbd_t smbcontrol_t:process { signal signull }; ++allow smbd_t smbcontrol_t:unix_dgram_socket sendto; ++ ++allow smbd_t winbind_t:unix_dgram_socket sendto; + + manage_dirs_pattern(smbd_t, smbd_tmp_t, smbd_tmp_t) + manage_files_pattern(smbd_t, smbd_tmp_t, smbd_tmp_t) + files_tmp_filetrans(smbd_t, smbd_tmp_t, { file dir }) + ++manage_dirs_pattern(smbd_t, smbd_tmpfs_t, smbd_tmpfs_t) ++manage_files_pattern(smbd_t, smbd_tmpfs_t, smbd_tmpfs_t) ++fs_tmpfs_filetrans(smbd_t, smbd_tmpfs_t, { file dir }) ++ + manage_dirs_pattern(smbd_t, smbd_var_run_t, smbd_var_run_t) + manage_files_pattern(smbd_t, smbd_var_run_t, smbd_var_run_t) + manage_sock_files_pattern(smbd_t, smbd_var_run_t, smbd_var_run_t) + files_pid_filetrans(smbd_t, smbd_var_run_t, { dir file }) + +-allow smbd_t winbind_var_run_t:sock_file read_sock_file_perms; +-stream_connect_pattern(smbd_t, winbind_var_run_t, winbind_var_run_t, winbind_t) ++allow smbd_t swat_t:process signal; + +-allow smbd_t nmbd_var_run_t:file read_file_perms; +-stream_connect_pattern(smbd_t, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) ++allow smbd_t winbind_var_run_t:sock_file rw_sock_file_perms; ++ ++allow smbd_t winbind_t:process { signal signull }; + + kernel_getattr_core_if(smbd_t) + kernel_getattr_message_if(smbd_t) + kernel_read_network_state(smbd_t) ++kernel_read_net_sysctls(smbd_t) + kernel_read_fs_sysctls(smbd_t) + kernel_read_kernel_sysctls(smbd_t) ++kernel_read_usermodehelper_state(smbd_t) + kernel_read_software_raid_state(smbd_t) + kernel_read_system_state(smbd_t) + +-corecmd_exec_bin(smbd_t) + corecmd_exec_shell(smbd_t) ++corecmd_exec_bin(smbd_t) + +-corenet_all_recvfrom_unlabeled(smbd_t) + corenet_all_recvfrom_netlabel(smbd_t) + corenet_tcp_sendrecv_generic_if(smbd_t) ++corenet_udp_sendrecv_generic_if(smbd_t) ++corenet_raw_sendrecv_generic_if(smbd_t) + corenet_tcp_sendrecv_generic_node(smbd_t) ++corenet_udp_sendrecv_generic_node(smbd_t) ++corenet_raw_sendrecv_generic_node(smbd_t) ++corenet_tcp_sendrecv_all_ports(smbd_t) ++corenet_udp_sendrecv_all_ports(smbd_t) + corenet_tcp_bind_generic_node(smbd_t) +- +-corenet_sendrecv_smbd_client_packets(smbd_t) +-corenet_tcp_connect_smbd_port(smbd_t) +-corenet_sendrecv_smbd_server_packets(smbd_t) ++corenet_udp_bind_generic_node(smbd_t) + corenet_tcp_bind_smbd_port(smbd_t) +-corenet_tcp_sendrecv_smbd_port(smbd_t) +- +-corenet_sendrecv_ipp_client_packets(smbd_t) + corenet_tcp_connect_ipp_port(smbd_t) +-corenet_tcp_sendrecv_ipp_port(smbd_t) ++corenet_tcp_connect_smbd_port(smbd_t) + + dev_read_sysfs(smbd_t) + dev_read_urand(smbd_t) ++dev_dontaudit_write_urand(smbd_t) + dev_getattr_mtrr_dev(smbd_t) + dev_dontaudit_getattr_usbfs_dirs(smbd_t) ++# For redhat bug 566984 + dev_getattr_all_blk_files(smbd_t) + dev_getattr_all_chr_files(smbd_t) + +-domain_use_interactive_fds(smbd_t) +-domain_dontaudit_list_all_domains_state(smbd_t) +- +-files_list_var_lib(smbd_t) +-files_read_etc_runtime_files(smbd_t) +-files_read_usr_files(smbd_t) +-files_search_spool(smbd_t) +-files_dontaudit_getattr_all_dirs(smbd_t) +-files_dontaudit_list_all_mountpoints(smbd_t) +-files_list_mnt(smbd_t) ++domain_dontaudit_signull_all_domains(smbd_t) + + fs_getattr_all_fs(smbd_t) + fs_getattr_all_dirs(smbd_t) +@@ -366,44 +404,53 @@ fs_getattr_rpc_dirs(smbd_t) + fs_list_inotifyfs(smbd_t) + fs_get_all_fs_quotas(smbd_t) + +-term_use_ptmx(smbd_t) +- + auth_use_nsswitch(smbd_t) + auth_domtrans_chk_passwd(smbd_t) + auth_domtrans_upd_passwd(smbd_t) + auth_manage_cache(smbd_t) + auth_write_login_records(smbd_t) + ++domain_use_interactive_fds(smbd_t) ++domain_dontaudit_list_all_domains_state(smbd_t) ++ ++files_list_var_lib(smbd_t) ++files_read_etc_runtime_files(smbd_t) ++files_search_spool(smbd_t) ++# smbd seems to getattr all mountpoints ++files_dontaudit_getattr_all_dirs(smbd_t) ++files_dontaudit_list_all_mountpoints(smbd_t) ++# Allow samba to list mnt_t for potential mounted dirs ++files_list_mnt(smbd_t) ++ + init_rw_utmp(smbd_t) + + logging_search_logs(smbd_t) + logging_send_syslog_msg(smbd_t) + +-miscfiles_read_localization(smbd_t) + miscfiles_read_public_files(smbd_t) + + sysnet_use_ldap(smbd_t) + + userdom_use_unpriv_users_fds(smbd_t) ++userdom_search_user_home_content(smbd_t) + userdom_signal_all_users(smbd_t) +-userdom_home_filetrans_user_home_dir(smbd_t) +-userdom_user_home_dir_filetrans_user_home_content(smbd_t, { dir file lnk_file sock_file fifo_file }) + + usermanage_read_crack_db(smbd_t) + +-ifdef(`hide_broken_symptoms',` ++term_use_ptmx(smbd_t) ++ ++ifdef(`hide_broken_symptoms', ` + files_dontaudit_getattr_default_dirs(smbd_t) + files_dontaudit_getattr_boot_dirs(smbd_t) +- fs_dontaudit_getattr_tmpfs_dirs(smbd_t) + ') + +-tunable_policy(`allow_smbd_anon_write',` ++tunable_policy(`smbd_anon_write',` + miscfiles_manage_public_files(smbd_t) +-') ++') + +-tunable_policy(`samba_create_home_dirs',` +- allow smbd_t self:capability chown; +- userdom_create_user_home_dirs(smbd_t) ++tunable_policy(`samba_portmapper',` ++ corenet_tcp_bind_epmap_port(smbd_t) ++ corenet_tcp_bind_all_unreserved_ports(smbd_t) + ') + + tunable_policy(`samba_domain_controller',` +@@ -419,20 +466,16 @@ tunable_policy(`samba_domain_controller',` + ') + + tunable_policy(`samba_enable_home_dirs',` +- userdom_manage_user_home_content_dirs(smbd_t) +- userdom_manage_user_home_content_files(smbd_t) +- userdom_manage_user_home_content_symlinks(smbd_t) +- userdom_manage_user_home_content_sockets(smbd_t) +- userdom_manage_user_home_content_pipes(smbd_t) ++ userdom_manage_user_home_content(smbd_t) + ') + +-tunable_policy(`samba_portmapper',` +- corenet_sendrecv_all_server_packets(smbd_t) +- corenet_tcp_bind_epmap_port(smbd_t) +- corenet_tcp_bind_all_unreserved_ports(smbd_t) +- corenet_tcp_sendrecv_all_ports(smbd_t) ++optional_policy(` ++ tunable_policy(`samba_enable_home_dirs',` ++ apache_manage_user_content(smbd_t) ++ ') + ') + ++# Support Samba sharing of NFS mount points + tunable_policy(`samba_share_nfs',` + fs_manage_nfs_dirs(smbd_t) + fs_manage_nfs_files(smbd_t) +@@ -441,6 +484,7 @@ tunable_policy(`samba_share_nfs',` + fs_manage_nfs_named_sockets(smbd_t) + ') + ++# Support Samba sharing of ntfs/fusefs mount points + tunable_policy(`samba_share_fusefs',` + fs_manage_fusefs_dirs(smbd_t) + fs_manage_fusefs_files(smbd_t) +@@ -448,15 +492,14 @@ tunable_policy(`samba_share_fusefs',` + fs_search_fusefs(smbd_t) + ') + +-tunable_policy(`samba_export_all_ro',` +- fs_read_noxattr_fs_files(smbd_t) +- files_list_non_auth_dirs(smbd_t) +- files_read_non_auth_files(smbd_t) ++tunable_policy(`samba_load_libgfapi',` ++ corenet_tcp_connect_all_ports(smbd_t) ++ corenet_tcp_bind_all_ports(smbd_t) ++ corenet_sendrecv_all_packets(smbd_t) + ') + +-tunable_policy(`samba_export_all_rw',` +- fs_read_noxattr_fs_files(smbd_t) +- files_manage_non_auth_files(smbd_t) ++optional_policy(` ++ avahi_dbus_chat(smbd_t) + ') + + optional_policy(` +@@ -466,6 +509,7 @@ optional_policy(` + optional_policy(` + ctdbd_stream_connect(smbd_t) + ctdbd_manage_lib_files(smbd_t) ++ ctdbd_manage_lib_dirs(smbd_t) + ') + + optional_policy(` +@@ -473,9 +517,31 @@ optional_policy(` + cups_stream_connect(smbd_t) + ') + ++optional_policy(` ++ dbus_system_bus_client(smbd_t) ++ ++ optional_policy(` ++ oddjob_dbus_chat(smbd_t) ++ oddjob_domtrans_mkhomedir(smbd_t) ++ ') ++') ++ ++optional_policy(` ++ glusterd_read_conf(smbd_t) ++ glusterd_rw_lib(smbd_t) ++ glusterd_manage_pid(smbd_t) ++') ++ + optional_policy(` + kerberos_read_keytab(smbd_t) + kerberos_use(smbd_t) ++ kerberos_tmp_filetrans_host_rcache(smbd_t, "host_0") ++ kerberos_manage_host_rcache(smbd_t) ++') ++ ++optional_policy(` ++ ldap_stream_connect(smbd_t) ++ dirsrv_stream_connect(smbd_t) + ') + + optional_policy(` +@@ -487,6 +553,10 @@ optional_policy(` + qemu_manage_tmp_files(smbd_t) + ') + ++optional_policy(` ++ rhcs_signull_cluster(smbd_t) ++') ++ + optional_policy(` + rpc_search_nfs_state_data(smbd_t) + ') +@@ -499,12 +569,53 @@ optional_policy(` + udev_read_db(smbd_t) + ') + ++tunable_policy(`samba_create_home_dirs',` ++ allow smbd_t self:capability chown; ++ userdom_create_user_home_dirs(smbd_t) ++') ++ ++userdom_home_filetrans_user_home_dir(smbd_t) ++ ++tunable_policy(`samba_export_all_ro',` ++ allow nmbd_t self:capability { dac_read_search dac_override }; ++ fs_read_noxattr_fs_files(smbd_t) ++ files_read_non_security_files(smbd_t) ++ files_dontaudit_list_security_dirs(smbd_t) ++ files_dontaudit_search_security_files(smbd_t) ++ files_dontaudit_read_security_files(smbd_t) ++ fs_read_noxattr_fs_files(nmbd_t) ++ files_read_non_security_files(nmbd_t) ++ files_dontaudit_list_security_dirs(nmbd_t) ++ files_dontaudit_search_security_files(nmbd_t) ++ files_dontaudit_read_security_files(nmbd_t) ++') ++ ++tunable_policy(`samba_export_all_rw',` ++ allow nmbd_t self:capability { dac_read_search dac_override }; ++ fs_manage_noxattr_fs_files(smbd_t) ++ files_manage_non_security_files(smbd_t) ++ files_manage_non_security_dirs(smbd_t) ++ files_dontaudit_list_security_dirs(smbd_t) ++ files_dontaudit_search_security_files(smbd_t) ++ files_dontaudit_read_security_files(smbd_t) ++ fs_manage_noxattr_fs_files(nmbd_t) ++ files_manage_non_security_files(nmbd_t) ++ files_manage_non_security_dirs(nmbd_t) ++ files_dontaudit_list_security_dirs(nmbd_t) ++ files_dontaudit_search_security_files(nmbd_t) ++ files_dontaudit_read_security_files(nmbd_t) ++') ++ ++userdom_filetrans_home_content(nmbd_t) ++ + ######################################## + # +-# Nmbd Local policy ++# nmbd Local policy + # + + dontaudit nmbd_t self:capability sys_tty_config; ++allow nmbd_t self:capability {net_admin}; ++allow nmbd_t self:capability2 block_suspend; + allow nmbd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow nmbd_t self:fd use; + allow nmbd_t self:fifo_file rw_fifo_file_perms; +@@ -512,9 +623,11 @@ allow nmbd_t self:msg { send receive }; + allow nmbd_t self:msgq create_msgq_perms; + allow nmbd_t self:sem create_sem_perms; + allow nmbd_t self:shm create_shm_perms; +-allow nmbd_t self:tcp_socket { accept listen }; +-allow nmbd_t self:unix_dgram_socket sendto; +-allow nmbd_t self:unix_stream_socket { accept connectto listen }; ++allow nmbd_t self:sock_file read_sock_file_perms; ++allow nmbd_t self:tcp_socket create_stream_socket_perms; ++allow nmbd_t self:udp_socket create_socket_perms; ++allow nmbd_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow nmbd_t self:unix_stream_socket { create_stream_socket_perms connectto }; + + manage_dirs_pattern(nmbd_t, { smbd_var_run_t nmbd_var_run_t }, nmbd_var_run_t) + manage_files_pattern(nmbd_t, nmbd_var_run_t, nmbd_var_run_t) +@@ -526,20 +639,17 @@ read_files_pattern(nmbd_t, samba_etc_t, samba_etc_t) + read_lnk_files_pattern(nmbd_t, samba_etc_t, samba_etc_t) + + manage_dirs_pattern(nmbd_t, samba_log_t, samba_log_t) +-append_files_pattern(nmbd_t, samba_log_t, samba_log_t) +-create_files_pattern(nmbd_t, samba_log_t, samba_log_t) +-setattr_files_pattern(nmbd_t, samba_log_t, samba_log_t) ++manage_files_pattern(nmbd_t, samba_log_t, samba_log_t) + +-manage_files_pattern(nmbd_t, samba_var_t, samba_var_t) ++manage_dirs_pattern(nmbd_t, samba_var_t, samba_var_t) + manage_files_pattern(nmbd_t, samba_var_t, samba_var_t) + manage_lnk_files_pattern(nmbd_t, samba_var_t, samba_var_t) + manage_sock_files_pattern(nmbd_t, samba_var_t, samba_var_t) +-files_var_filetrans(nmbd_t, samba_var_t, dir, "nmbd") + files_var_filetrans(nmbd_t, samba_var_t, dir, "samba") ++allow nmbd_t samba_var_t:file map; + +-allow nmbd_t { swat_t smbcontrol_t }:process signal; +- +-allow nmbd_t smbd_var_run_t:dir rw_dir_perms; ++allow nmbd_t smbcontrol_t:process signal; ++allow nmbd_t smbcontrol_t:unix_dgram_socket sendto; + + kernel_getattr_core_if(nmbd_t) + kernel_getattr_message_if(nmbd_t) +@@ -547,53 +657,44 @@ kernel_read_kernel_sysctls(nmbd_t) + kernel_read_network_state(nmbd_t) + kernel_read_software_raid_state(nmbd_t) + kernel_read_system_state(nmbd_t) ++kernel_read_usermodehelper_state(nmbd_t) + +-corenet_all_recvfrom_unlabeled(nmbd_t) + corenet_all_recvfrom_netlabel(nmbd_t) + corenet_tcp_sendrecv_generic_if(nmbd_t) + corenet_udp_sendrecv_generic_if(nmbd_t) + corenet_tcp_sendrecv_generic_node(nmbd_t) + corenet_udp_sendrecv_generic_node(nmbd_t) ++corenet_tcp_sendrecv_all_ports(nmbd_t) ++corenet_udp_sendrecv_all_ports(nmbd_t) + corenet_udp_bind_generic_node(nmbd_t) +- +-corenet_sendrecv_nmbd_server_packets(nmbd_t) + corenet_udp_bind_nmbd_port(nmbd_t) +-corenet_udp_sendrecv_nmbd_port(nmbd_t) +- +-corenet_sendrecv_smbd_client_packets(nmbd_t) ++corenet_sendrecv_nmbd_server_packets(nmbd_t) ++corenet_sendrecv_nmbd_client_packets(nmbd_t) + corenet_tcp_connect_smbd_port(nmbd_t) +-corenet_tcp_sendrecv_smbd_port(nmbd_t) + +-dev_read_sysfs(nmbd_t) + dev_getattr_mtrr_dev(nmbd_t) ++dev_read_sysfs(nmbd_t) ++dev_read_urand(nmbd_t) ++ ++fs_getattr_all_fs(nmbd_t) ++fs_search_auto_mountpoints(nmbd_t) + + domain_use_interactive_fds(nmbd_t) + +-files_read_usr_files(nmbd_t) + files_list_var_lib(nmbd_t) + +-fs_getattr_all_fs(nmbd_t) +-fs_search_auto_mountpoints(nmbd_t) +- + auth_use_nsswitch(nmbd_t) + + logging_search_logs(nmbd_t) + logging_send_syslog_msg(nmbd_t) + +-miscfiles_read_localization(nmbd_t) +- + userdom_use_unpriv_users_fds(nmbd_t) +-userdom_user_home_dir_filetrans_user_home_content(nmbd_t, { file dir }) +- +-tunable_policy(`samba_export_all_ro',` +- fs_read_noxattr_fs_files(nmbd_t) +- files_list_non_auth_dirs(nmbd_t) +- files_read_non_auth_files(nmbd_t) +-') ++userdom_dontaudit_search_user_home_dirs(nmbd_t) + +-tunable_policy(`samba_export_all_rw',` +- fs_read_noxattr_fs_files(nmbd_t) +- files_manage_non_auth_files(nmbd_t) ++optional_policy(` ++ ctdbd_stream_connect(nmbd_t) ++ ctdbd_manage_lib_dirs(nmbd_t) ++ ctdbd_manage_lib_files(nmbd_t) + ') + + optional_policy(` +@@ -606,18 +707,31 @@ optional_policy(` + + ######################################## + # +-# Smbcontrol local policy ++# smbcontrol local policy + # + +-allow smbcontrol_t self:process signal; +-allow smbcontrol_t self:fifo_file rw_fifo_file_perms; +-allow smbcontrol_t self:unix_stream_socket create_stream_socket_perms; ++allow smbcontrol_t self:capability2 block_suspend; + allow smbcontrol_t self:process { signal signull }; ++# internal communication is often done using fifo and unix sockets. ++allow smbcontrol_t self:fifo_file rw_file_perms; ++allow smbcontrol_t self:unix_stream_socket create_stream_socket_perms; ++allow smbcontrol_t self:unix_dgram_socket create_socket_perms; ++ ++allow smbcontrol_t nmbd_t:process { signal signull }; ++read_files_pattern(smbcontrol_t, nmbd_var_run_t, nmbd_var_run_t) + +-allow smbcontrol_t { winbind_t nmbd_t smbd_t }:process { signal signull }; +-read_files_pattern(smbcontrol_t, { nmbd_var_run_t smbd_var_run_t }, { nmbd_var_run_t smbd_var_run_t }) ++allow smbcontrol_t smbd_t:process { signal signull }; ++read_files_pattern(smbcontrol_t, smbd_var_run_t, smbd_var_run_t) ++allow smbcontrol_t winbind_t:process { signal signull }; + + manage_files_pattern(smbcontrol_t, samba_var_t, samba_var_t) ++manage_dirs_pattern(smbcontrol_t, samba_var_t, samba_var_t) ++manage_sock_files_pattern(smbcontrol_t, samba_var_t, samba_var_t) ++allow smbcontrol_t samba_var_t:file map; ++ ++allow smbcontrol_t nmbd_t:unix_dgram_socket sendto; ++allow smbcontrol_t smbd_t:unix_dgram_socket sendto; ++allow smbcontrol_t winbind_t:unix_dgram_socket sendto; + + samba_read_config(smbcontrol_t) + samba_search_var(smbcontrol_t) +@@ -627,39 +741,38 @@ domain_use_interactive_fds(smbcontrol_t) + + dev_read_urand(smbcontrol_t) + +-files_read_etc_files(smbcontrol_t) +-files_search_var_lib(smbcontrol_t) +- + term_use_console(smbcontrol_t) + +-miscfiles_read_localization(smbcontrol_t) ++auth_read_passwd(smbcontrol_t) + + sysnet_use_ldap(smbcontrol_t) + +-userdom_use_user_terminals(smbcontrol_t) ++userdom_use_inherited_user_terminals(smbcontrol_t) + + optional_policy(` + ctdbd_stream_connect(smbcontrol_t) ++ ctdbd_sigchld(smbcontrol_t) + ') + + ######################################## + # +-# Smbmount Local policy ++# smbmount Local policy + # + +-allow smbmount_t self:capability { sys_rawio sys_admin dac_override chown }; +-allow smbmount_t self:process signal_perms; +-allow smbmount_t self:tcp_socket { accept listen }; ++allow smbmount_t self:capability { sys_rawio sys_admin dac_read_search dac_override chown }; # FIXME: is all of this really necessary? ++allow smbmount_t self:process { fork signal_perms }; ++allow smbmount_t self:tcp_socket create_stream_socket_perms; ++allow smbmount_t self:udp_socket connect; + allow smbmount_t self:unix_dgram_socket create_socket_perms; + allow smbmount_t self:unix_stream_socket create_socket_perms; + + allow smbmount_t samba_etc_t:dir list_dir_perms; + allow smbmount_t samba_etc_t:file read_file_perms; + +-allow smbmount_t samba_log_t:dir list_dir_perms; +-append_files_pattern(smbmount_t, samba_log_t, samba_log_t) +-create_files_pattern(smbmount_t, samba_log_t, samba_log_t) +-setattr_files_pattern(smbmount_t, samba_log_t, samba_log_t) ++can_exec(smbmount_t, smbmount_exec_t) ++ ++allow smbmount_t samba_log_t:dir list_dir_perms; ++allow smbmount_t samba_log_t:file manage_file_perms; + + allow smbmount_t samba_secrets_t:file manage_file_perms; + +@@ -668,26 +781,22 @@ manage_files_pattern(smbmount_t, samba_var_t, samba_var_t) + manage_lnk_files_pattern(smbmount_t, samba_var_t, samba_var_t) + files_var_filetrans(smbmount_t, samba_var_t, dir, "samba") + +-can_exec(smbmount_t, smbmount_exec_t) ++files_list_var_lib(smbmount_t) + + kernel_read_system_state(smbmount_t) + +-corenet_all_recvfrom_unlabeled(smbmount_t) + corenet_all_recvfrom_netlabel(smbmount_t) + corenet_tcp_sendrecv_generic_if(smbmount_t) ++corenet_raw_sendrecv_generic_if(smbmount_t) ++corenet_udp_sendrecv_generic_if(smbmount_t) + corenet_tcp_sendrecv_generic_node(smbmount_t) +- +-corenet_sendrecv_all_client_packets(smbmount_t) +-corenet_tcp_connect_all_ports(smbmount_t) ++corenet_raw_sendrecv_generic_node(smbmount_t) ++corenet_udp_sendrecv_generic_node(smbmount_t) + corenet_tcp_sendrecv_all_ports(smbmount_t) +- +-corecmd_list_bin(smbmount_t) +- +-files_list_mnt(smbmount_t) +-files_list_var_lib(smbmount_t) +-files_mounton_mnt(smbmount_t) +-files_manage_etc_runtime_files(smbmount_t) +-files_etc_filetrans_etc_runtime(smbmount_t, file) ++corenet_udp_sendrecv_all_ports(smbmount_t) ++corenet_tcp_bind_generic_node(smbmount_t) ++corenet_udp_bind_generic_node(smbmount_t) ++corenet_tcp_connect_all_ports(smbmount_t) + + fs_getattr_cifs(smbmount_t) + fs_mount_cifs(smbmount_t) +@@ -699,58 +808,77 @@ fs_read_cifs_files(smbmount_t) + storage_raw_read_fixed_disk(smbmount_t) + storage_raw_write_fixed_disk(smbmount_t) + +-auth_use_nsswitch(smbmount_t) ++corecmd_list_bin(smbmount_t) ++ ++files_list_mnt(smbmount_t) ++files_mounton_mnt(smbmount_t) ++files_manage_etc_runtime_files(smbmount_t) ++files_etc_filetrans_etc_runtime(smbmount_t, file) + +-miscfiles_read_localization(smbmount_t) ++auth_use_nsswitch(smbmount_t) + +-mount_use_fds(smbmount_t) + + locallogin_use_fds(smbmount_t) + + logging_search_logs(smbmount_t) + +-userdom_use_user_terminals(smbmount_t) ++userdom_use_inherited_user_terminals(smbmount_t) + userdom_use_all_users_fds(smbmount_t) + + optional_policy(` + cups_read_rw_config(smbmount_t) + ') + ++optional_policy(` ++ mount_use_fds(smbmount_t) ++') ++ + ######################################## + # +-# Swat Local policy ++# SWAT Local policy + # + +-allow swat_t self:capability { dac_override setuid setgid sys_resource }; ++allow swat_t self:capability { dac_read_search dac_override setuid setgid sys_resource }; ++allow swat_t self:capability2 block_suspend; + allow swat_t self:process { setrlimit signal_perms }; + allow swat_t self:fifo_file rw_fifo_file_perms; + allow swat_t self:netlink_tcpdiag_socket r_netlink_socket_perms; +-allow swat_t self:tcp_socket { accept listen }; ++allow swat_t self:tcp_socket create_stream_socket_perms; ++allow swat_t self:udp_socket create_socket_perms; + allow swat_t self:unix_stream_socket connectto; + +-allow swat_t { nmbd_t smbd_t }:process { signal signull }; ++samba_domtrans_smbd(swat_t) ++allow swat_t smbd_t:process { signal signull }; + +-allow swat_t smbd_var_run_t:file read_file_perms; +-allow swat_t smbd_var_run_t:file { lock delete_file_perms }; ++samba_domtrans_nmbd(swat_t) ++allow swat_t nmbd_t:process { signal signull }; ++allow nmbd_t swat_t:process signal; ++ ++read_files_pattern(swat_t, nmbd_var_run_t, nmbd_var_run_t) ++stream_connect_pattern(swat_t, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) ++ ++allow swat_t smbd_port_t:tcp_socket name_bind; ++ ++allow swat_t nmbd_port_t:udp_socket name_bind; + + rw_files_pattern(swat_t, samba_etc_t, samba_etc_t) + read_lnk_files_pattern(swat_t, samba_etc_t, samba_etc_t) + + manage_dirs_pattern(swat_t, samba_log_t, samba_log_t) +-append_files_pattern(swat_t, samba_log_t, samba_log_t) +-create_files_pattern(swat_t, samba_log_t, samba_log_t) +-setattr_files_pattern(swat_t, samba_log_t, samba_log_t) ++manage_files_pattern(swat_t, samba_log_t, samba_log_t) + + manage_files_pattern(swat_t, samba_etc_t, samba_secrets_t) + + manage_dirs_pattern(swat_t, samba_var_t, samba_var_t) + manage_files_pattern(swat_t, samba_var_t, samba_var_t) +-manage_lnk_files_pattern(swat_t, samba_var_t, samba_var_t) + files_var_filetrans(swat_t, samba_var_t, dir, "samba") + + allow swat_t smbd_exec_t:file mmap_file_perms ; + +-allow swat_t { winbind_t smbd_t }:process { signal signull }; ++allow swat_t smbd_t:process signull; ++ ++allow swat_t smbd_var_run_t:file read_file_perms; ++allow swat_t smbd_var_run_t:file { lock unlink }; + + manage_dirs_pattern(swat_t, swat_tmp_t, swat_tmp_t) + manage_files_pattern(swat_t, swat_tmp_t, swat_tmp_t) +@@ -759,17 +887,13 @@ files_tmp_filetrans(swat_t, swat_tmp_t, { file dir }) + manage_files_pattern(swat_t, swat_var_run_t, swat_var_run_t) + files_pid_filetrans(swat_t, swat_var_run_t, file) + +-read_files_pattern(swat_t, winbind_var_run_t, winbind_var_run_t) +-allow swat_t winbind_var_run_t:dir { add_entry_dir_perms del_entry_dir_perms }; +-allow swat_t winbind_var_run_t:sock_file { create_sock_file_perms delete_sock_file_perms }; +- +-read_files_pattern(swat_t, nmbd_var_run_t, nmbd_var_run_t) +-stream_connect_pattern(swat_t, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) +- +-samba_domtrans_smbd(swat_t) +-samba_domtrans_nmbd(swat_t) +- ++allow swat_t winbind_exec_t:file mmap_file_perms; + domtrans_pattern(swat_t, winbind_exec_t, winbind_t) ++allow swat_t winbind_t:process { signal signull }; ++ ++read_files_pattern(swat_t, winbind_var_run_t, winbind_var_run_t) ++allow swat_t winbind_var_run_t:dir { write add_name remove_name }; ++allow swat_t winbind_var_run_t:sock_file { create unlink }; + + kernel_read_kernel_sysctls(swat_t) + kernel_read_system_state(swat_t) +@@ -777,36 +901,25 @@ kernel_read_network_state(swat_t) + + corecmd_search_bin(swat_t) + +-corenet_all_recvfrom_unlabeled(swat_t) + corenet_all_recvfrom_netlabel(swat_t) + corenet_tcp_sendrecv_generic_if(swat_t) + corenet_udp_sendrecv_generic_if(swat_t) ++corenet_raw_sendrecv_generic_if(swat_t) + corenet_tcp_sendrecv_generic_node(swat_t) + corenet_udp_sendrecv_generic_node(swat_t) +-corenet_tcp_bind_generic_node(swat_t) +-corenet_udp_bind_generic_node(swat_t) +- +-corenet_sendrecv_nmbd_server_packets(swat_t) +-corenet_udp_bind_nmbd_port(swat_t) +-corenet_udp_sendrecv_nmbd_port(swat_t) +- +-corenet_sendrecv_smbd_client_packets(swat_t) ++corenet_raw_sendrecv_generic_node(swat_t) ++corenet_tcp_sendrecv_all_ports(swat_t) ++corenet_udp_sendrecv_all_ports(swat_t) + corenet_tcp_connect_smbd_port(swat_t) +-corenet_sendrecv_smbd_server_packets(swat_t) +-corenet_tcp_bind_smbd_port(swat_t) +-corenet_tcp_sendrecv_smbd_port(swat_t) +- +-corenet_sendrecv_ipp_client_packets(swat_t) + corenet_tcp_connect_ipp_port(swat_t) +-corenet_tcp_sendrecv_ipp_port(swat_t) ++corenet_sendrecv_smbd_client_packets(swat_t) ++corenet_sendrecv_ipp_client_packets(swat_t) + + dev_read_urand(swat_t) + + files_list_var_lib(swat_t) + files_search_home(swat_t) +-files_read_usr_files(swat_t) + fs_getattr_xattr_fs(swat_t) +-files_list_var_lib(swat_t) + + auth_domtrans_chk_passwd(swat_t) + auth_use_nsswitch(swat_t) +@@ -818,10 +931,11 @@ logging_send_syslog_msg(swat_t) + logging_send_audit_msgs(swat_t) + logging_search_logs(swat_t) + +-miscfiles_read_localization(swat_t) +- + sysnet_use_ldap(swat_t) + ++ ++userdom_dontaudit_search_admin_dir(swat_t) ++ + optional_policy(` + cups_read_rw_config(swat_t) + cups_stream_connect(swat_t) +@@ -840,17 +954,21 @@ optional_policy(` + # Winbind local policy + # + +-allow winbind_t self:capability { dac_override ipc_lock setuid sys_nice }; ++allow winbind_t self:capability { kill dac_read_search dac_override ipc_lock setuid sys_nice }; ++allow winbind_t self:capability2 block_suspend; + dontaudit winbind_t self:capability sys_tty_config; + allow winbind_t self:process { signal_perms getsched setsched }; + allow winbind_t self:fifo_file rw_fifo_file_perms; +-allow winbind_t self:unix_stream_socket { accept listen }; +-allow winbind_t self:tcp_socket { accept listen }; ++allow winbind_t self:unix_dgram_socket { create_socket_perms sendto }; ++allow winbind_t self:unix_stream_socket create_stream_socket_perms; ++allow winbind_t self:tcp_socket create_stream_socket_perms; ++allow winbind_t self:udp_socket create_socket_perms; ++allow winbind_t self:socket create_socket_perms; + + allow winbind_t nmbd_t:process { signal signull }; + +-allow winbind_t nmbd_var_run_t:file read_file_perms; +-stream_connect_pattern(winbind_t, nmbd_var_run_t, nmbd_var_run_t, nmbd_t) ++read_files_pattern(winbind_t, nmbd_var_run_t, nmbd_var_run_t) ++samba_stream_connect_nmbd(winbind_t) + + allow winbind_t samba_etc_t:dir list_dir_perms; + read_files_pattern(winbind_t, samba_etc_t, samba_etc_t) +@@ -860,9 +978,7 @@ manage_files_pattern(winbind_t, samba_etc_t, samba_secrets_t) + filetrans_pattern(winbind_t, samba_etc_t, samba_secrets_t, file) + + manage_dirs_pattern(winbind_t, samba_log_t, samba_log_t) +-append_files_pattern(winbind_t, samba_log_t, samba_log_t) +-create_files_pattern(winbind_t, samba_log_t, samba_log_t) +-setattr_files_pattern(winbind_t, samba_log_t, samba_log_t) ++manage_files_pattern(winbind_t, samba_log_t, samba_log_t) + manage_lnk_files_pattern(winbind_t, samba_log_t, samba_log_t) + + manage_dirs_pattern(winbind_t, samba_var_t, samba_var_t) +@@ -870,41 +986,46 @@ manage_files_pattern(winbind_t, samba_var_t, samba_var_t) + manage_lnk_files_pattern(winbind_t, samba_var_t, samba_var_t) + manage_sock_files_pattern(winbind_t, samba_var_t, samba_var_t) + files_var_filetrans(winbind_t, samba_var_t, dir, "samba") ++allow winbind_t samba_var_t:file { map } ; + +-rw_files_pattern(winbind_t, smbd_tmp_t, smbd_tmp_t) ++manage_files_pattern(winbind_t, smbd_tmp_t, smbd_tmp_t) + +-# This needs a file context specification +-allow winbind_t winbind_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++allow winbind_t winbind_log_t:file manage_file_perms; + logging_log_filetrans(winbind_t, winbind_log_t, file) + +-manage_dirs_pattern(winbind_t, winbind_tmp_t, winbind_tmp_t) +-manage_files_pattern(winbind_t, winbind_tmp_t, winbind_tmp_t) +-manage_sock_files_pattern(winbind_t, winbind_tmp_t, winbind_tmp_t) +-files_tmp_filetrans(winbind_t, winbind_tmp_t, { file dir }) ++userdom_manage_user_tmp_dirs(winbind_t) ++userdom_manage_user_tmp_files(winbind_t) ++userdom_tmp_filetrans_user_tmp(winbind_t, { file dir }) + + manage_dirs_pattern(winbind_t, { smbd_var_run_t winbind_var_run_t }, winbind_var_run_t) + manage_files_pattern(winbind_t, winbind_var_run_t, winbind_var_run_t) + manage_sock_files_pattern(winbind_t, winbind_var_run_t, winbind_var_run_t) + files_pid_filetrans(winbind_t, winbind_var_run_t, { sock_file file dir }) + filetrans_pattern(winbind_t, smbd_var_run_t, winbind_var_run_t, dir) +- +-manage_dirs_pattern(winbind_t, smbd_var_run_t, smbd_var_run_t) ++# /run/samba/krb5cc_samba + manage_files_pattern(winbind_t, smbd_var_run_t, smbd_var_run_t) ++manage_dirs_pattern(winbind_t, smbd_var_run_t, smbd_var_run_t) + manage_sock_files_pattern(winbind_t, smbd_var_run_t, smbd_var_run_t) + + kernel_read_network_state(winbind_t) + kernel_read_kernel_sysctls(winbind_t) + kernel_read_system_state(winbind_t) ++kernel_read_usermodehelper_state(winbind_t) ++kernel_request_load_module(winbind_t) + + corecmd_exec_bin(winbind_t) + +-corenet_all_recvfrom_unlabeled(winbind_t) + corenet_all_recvfrom_netlabel(winbind_t) + corenet_tcp_sendrecv_generic_if(winbind_t) ++corenet_udp_sendrecv_generic_if(winbind_t) ++corenet_raw_sendrecv_generic_if(winbind_t) + corenet_tcp_sendrecv_generic_node(winbind_t) ++corenet_udp_sendrecv_generic_node(winbind_t) ++corenet_raw_sendrecv_generic_node(winbind_t) + corenet_tcp_sendrecv_all_ports(winbind_t) +- +-corenet_sendrecv_all_client_packets(winbind_t) ++corenet_udp_sendrecv_all_ports(winbind_t) ++corenet_tcp_bind_generic_node(winbind_t) ++corenet_udp_bind_generic_node(winbind_t) + corenet_tcp_connect_smbd_port(winbind_t) + corenet_tcp_connect_epmap_port(winbind_t) + corenet_tcp_connect_all_unreserved_ports(winbind_t) +@@ -912,38 +1033,52 @@ corenet_tcp_connect_all_unreserved_ports(winbind_t) + dev_read_sysfs(winbind_t) + dev_read_urand(winbind_t) + +-domain_use_interactive_fds(winbind_t) +- +-files_read_usr_symlinks(winbind_t) +-files_list_var_lib(winbind_t) + + fs_getattr_all_fs(winbind_t) + fs_search_auto_mountpoints(winbind_t) ++fs_read_anon_inodefs_files(winbind_t) + + auth_domtrans_chk_passwd(winbind_t) + auth_use_nsswitch(winbind_t) + auth_manage_cache(winbind_t) + ++domain_use_interactive_fds(winbind_t) ++ ++files_read_usr_symlinks(winbind_t) ++files_list_var_lib(winbind_t) ++ + logging_send_syslog_msg(winbind_t) + +-miscfiles_read_localization(winbind_t) + miscfiles_read_generic_certs(winbind_t) + ++sysnet_use_ldap(winbind_t) ++ + userdom_dontaudit_use_unpriv_user_fds(winbind_t) + userdom_manage_user_home_content_dirs(winbind_t) + userdom_manage_user_home_content_files(winbind_t) + userdom_manage_user_home_content_symlinks(winbind_t) + userdom_manage_user_home_content_pipes(winbind_t) + userdom_manage_user_home_content_sockets(winbind_t) +-userdom_user_home_dir_filetrans_user_home_content(winbind_t, { dir file lnk_file fifo_file sock_file }) ++userdom_filetrans_home_content(winbind_t) + + optional_policy(` + ctdbd_stream_connect(winbind_t) + ctdbd_manage_lib_files(winbind_t) ++ ctdbd_manage_lib_dirs(winbind_t) ++') ++ ++ ++optional_policy(` ++ dirsrv_stream_connect(winbind_t) + ') + + optional_policy(` + kerberos_use(winbind_t) ++ kerberos_filetrans_named_content(winbind_t) ++') ++ ++optional_policy(` ++ nis_authenticate(winbind_t) + ') + + optional_policy(` +@@ -959,31 +1094,36 @@ optional_policy(` + # Winbind helper local policy + # + +-allow winbind_helper_t self:unix_stream_socket { accept listen }; ++allow winbind_helper_t self:unix_dgram_socket create_socket_perms; ++allow winbind_helper_t self:unix_stream_socket create_stream_socket_perms; + + allow winbind_helper_t samba_etc_t:dir list_dir_perms; + read_files_pattern(winbind_helper_t, samba_etc_t, samba_etc_t) + read_lnk_files_pattern(winbind_helper_t, samba_etc_t, samba_etc_t) + + allow winbind_helper_t samba_var_t:dir search_dir_perms; ++files_list_var_lib(winbind_helper_t) + + allow winbind_t smbcontrol_t:process signal; ++allow winbind_t smbcontrol_t:unix_dgram_socket sendto; + + stream_connect_pattern(winbind_helper_t, winbind_var_run_t, winbind_var_run_t, winbind_t) + +-domain_use_interactive_fds(winbind_helper_t) +- +-files_list_var_lib(winbind_helper_t) ++dev_read_urand(winbind_helper_t) + + term_list_ptys(winbind_helper_t) + ++corecmd_exec_bin(winbind_helper_t) ++ ++domain_use_interactive_fds(winbind_helper_t) ++ ++files_list_tmp(winbind_helper_t) ++ + auth_use_nsswitch(winbind_helper_t) + + logging_send_syslog_msg(winbind_helper_t) + +-miscfiles_read_localization(winbind_helper_t) +- +-userdom_use_user_terminals(winbind_helper_t) ++userdom_use_inherited_user_terminals(winbind_helper_t) + + optional_policy(` + apache_append_log(winbind_helper_t) +@@ -997,25 +1137,38 @@ optional_policy(` + + ######################################## + # +-# Unconfined script local policy ++# samba_unconfined_script_t local policy + # + + optional_policy(` +- type samba_unconfined_script_t; +- type samba_unconfined_script_exec_t; +- domain_type(samba_unconfined_script_t) +- domain_entry_file(samba_unconfined_script_t, samba_unconfined_script_exec_t) +- corecmd_shell_entry_type(samba_unconfined_script_t) +- role system_r types samba_unconfined_script_t; ++ type samba_unconfined_net_t; ++ domain_type(samba_unconfined_net_t) ++ domain_entry_file(samba_unconfined_net_t, samba_net_exec_t) ++ role system_r types samba_unconfined_net_t; ++ ++ unconfined_domain(samba_unconfined_net_t) + +- allow smbd_t samba_unconfined_script_exec_t:dir search_dir_perms; +- allow smbd_t samba_unconfined_script_exec_t:file ioctl; ++ manage_files_pattern(samba_unconfined_net_t, samba_etc_t, samba_secrets_t) ++ filetrans_pattern(samba_unconfined_net_t, samba_etc_t, samba_secrets_t, file) ++ userdom_use_inherited_user_terminals(samba_unconfined_net_t) ++') + ++type samba_unconfined_script_t; ++type samba_unconfined_script_exec_t; ++domain_type(samba_unconfined_script_t) ++domain_entry_file(samba_unconfined_script_t, samba_unconfined_script_exec_t) ++corecmd_shell_entry_type(samba_unconfined_script_t) ++role system_r types samba_unconfined_script_t; ++ ++allow smbd_t samba_unconfined_script_exec_t:dir search_dir_perms; ++allow smbd_t samba_unconfined_script_exec_t:file ioctl; ++ ++optional_policy(` + unconfined_domain(samba_unconfined_script_t) ++') + +- tunable_policy(`samba_run_unconfined',` ++tunable_policy(`samba_run_unconfined',` + domtrans_pattern(smbd_t, samba_unconfined_script_exec_t, samba_unconfined_script_t) +- ',` +- can_exec(smbd_t, samba_unconfined_script_exec_t) +- ') ++',` ++ can_exec(smbd_t, samba_unconfined_script_exec_t) + ') +diff --git a/sambagui.te b/sambagui.te +index e18b0a2844..f497f5eb5b 100644 +--- a/sambagui.te ++++ b/sambagui.te +@@ -18,7 +18,7 @@ role sambagui_roles types sambagui_t; + # Local policy + # + +-allow sambagui_t self:capability dac_override; ++allow sambagui_t self:capability { dac_read_search dac_override }; + allow sambagui_t self:fifo_file rw_fifo_file_perms; + + kernel_read_system_state(sambagui_t) +@@ -28,14 +28,14 @@ corecmd_exec_shell(sambagui_t) + + dev_dontaudit_read_urand(sambagui_t) + +-files_read_usr_files(sambagui_t) ++files_search_var_lib(sambagui_t) + + auth_use_nsswitch(sambagui_t) + auth_dontaudit_read_shadow(sambagui_t) + +-logging_send_syslog_msg(sambagui_t) ++init_access_check(sambagui_t) + +-miscfiles_read_localization(sambagui_t) ++logging_send_syslog_msg(sambagui_t) + + sysnet_use_ldap(sambagui_t) + +@@ -61,6 +61,7 @@ optional_policy(` + samba_manage_var_files(sambagui_t) + samba_read_secrets(sambagui_t) + samba_initrc_domtrans(sambagui_t) ++ samba_systemctl(sambagui_t) + samba_domtrans_smbd(sambagui_t) + samba_domtrans_nmbd(sambagui_t) + ') +diff --git a/samhain.if b/samhain.if +index f0236d67d5..37665a1b68 100644 +--- a/samhain.if ++++ b/samhain.if +@@ -23,6 +23,8 @@ template(`samhain_service_template',` + files_read_all_files($1_t) + + mls_file_write_all_levels($1_t) ++ ++ logging_send_syslog_msg($1_t) + ') + + ######################################## +diff --git a/samhain.te b/samhain.te +index c41ce4bffc..8837e4c41a 100644 +--- a/samhain.te ++++ b/samhain.te +@@ -88,8 +88,6 @@ auth_read_login_records(samhain_domain) + + init_read_utmp(samhain_domain) + +-logging_send_syslog_msg(samhain_domain) +- + ######################################## + # + # Client local policy +@@ -102,7 +100,7 @@ domain_use_interactive_fds(samhain_t) + + seutil_sigchld_newrole(samhain_t) + +-userdom_use_user_terminals(samhain_t) ++userdom_use_inherited_user_terminals(samhain_t) + + ######################################## + # +diff --git a/sandbox.fc b/sandbox.fc +new file mode 100644 +index 0000000000..b7db25411d +--- /dev/null ++++ b/sandbox.fc +@@ -0,0 +1 @@ ++# Empty +diff --git a/sandbox.if b/sandbox.if +new file mode 100644 +index 0000000000..1e7c447a07 +--- /dev/null ++++ b/sandbox.if +@@ -0,0 +1,80 @@ ++ ++## policy for sandbox ++ ++######################################## ++## ++## Execute sandbox in the sandbox domain, and ++## allow the specified role the sandbox domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the sandbox domain. ++## ++## ++# ++interface(`sandbox_transition',` ++ gen_require(` ++ attribute sandbox_domain; ++ ') ++ ++ sandbox_dyntransition($1) #885288 ++ allow $1 sandbox_domain:process transition; ++ dontaudit $1 sandbox_domain:process { noatsecure siginh rlimitinh }; ++ ++ role $2 types sandbox_domain; ++ ++ allow sandbox_domain $1:process { sigchld signull }; ++ allow sandbox_domain $1:fifo_file rw_inherited_fifo_file_perms; ++ ++ dontaudit sandbox_domain $1:process signal; ++ dontaudit sandbox_domain $1:key { link read search view }; ++ dontaudit sandbox_domain $1:unix_stream_socket rw_socket_perms; ++') ++ ++######################################## ++## ++## Execute sandbox in the sandbox domain, and ++## allow the specified role the sandbox domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_dyntransition',` ++ gen_require(` ++ attribute sandbox_domain; ++ ') ++ ++ allow $1 sandbox_domain:process dyntransition; ++') ++ ++######################################## ++## ++## Creates types and rules for a basic ++## sandbox process domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`sandbox_domain_template',` ++ ++ gen_require(` ++ attribute sandbox_domain; ++ ') ++ type $1_t, sandbox_domain; ++ ++ application_type($1_t) ++ ++ mls_rangetrans_target($1_t) ++ mcs_constrained($1_t) ++') +diff --git a/sandbox.te b/sandbox.te +new file mode 100644 +index 0000000000..eb990f6a45 +--- /dev/null ++++ b/sandbox.te +@@ -0,0 +1,64 @@ ++policy_module(sandbox,1.0.0) ++ ++attribute sandbox_domain; ++ ++######################################## ++# ++# Declarations ++# ++sandbox_domain_template(sandbox) ++ ++######################################## ++# ++# sandbox local policy ++# ++allow sandbox_domain self:process { getattr signal_perms getsched setsched setpgid execstack }; ++tunable_policy(`deny_execmem',`',` ++ allow sandbox_domain self:process execmem; ++') ++ ++allow sandbox_domain self:fifo_file manage_file_perms; ++allow sandbox_domain self:sem create_sem_perms; ++allow sandbox_domain self:shm create_shm_perms; ++allow sandbox_domain self:msgq create_msgq_perms; ++allow sandbox_domain self:unix_stream_socket create_stream_socket_perms; ++allow sandbox_domain self:unix_dgram_socket { sendto create_socket_perms }; ++dontaudit sandbox_domain self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; ++ ++dev_rw_all_inherited_chr_files(sandbox_domain) ++dev_rw_all_inherited_blk_files(sandbox_domain) ++ ++# sandbox_file_t was moved to sandboxX.te ++optional_policy(` ++ sandbox_exec_file(sandbox_domain) ++ sandbox_manage_content(sandbox_domain) ++ sandbox_dontaudit_mounton(sandbox_domain) ++ sandbox_manage_tmpfs_files(sandbox_domain) ++') ++ ++gen_require(` ++ type usr_t, lib_t, locale_t, device_t; ++ type var_t, var_run_t, rpm_log_t, locale_t; ++ attribute exec_type, configfile; ++') ++ ++kernel_dontaudit_read_system_state(sandbox_domain) ++kernel_dontaudit_getattr_core_if(sandbox_domain) ++ ++corecmd_exec_all_executables(sandbox_domain) ++ ++dev_dontaudit_getattr_all(sandbox_domain) ++ ++files_rw_all_inherited_files(sandbox_domain, -exec_type -configfile -usr_t -lib_t -locale_t -var_t -var_run_t -device_t -rpm_log_t ) ++files_entrypoint_all_files(sandbox_domain) ++ ++files_read_config_files(sandbox_domain) ++files_read_var_files(sandbox_domain) ++files_read_all_mountpoint_symlinks(sandbox_domain) ++files_dontaudit_search_all_dirs(sandbox_domain) ++ ++fs_dontaudit_getattr_all_fs(sandbox_domain) ++ ++userdom_use_inherited_user_terminals(sandbox_domain) ++ ++mta_dontaudit_read_spool_symlinks(sandbox_domain) +diff --git a/sandboxX.fc b/sandboxX.fc +new file mode 100644 +index 0000000000..6caef63264 +--- /dev/null ++++ b/sandboxX.fc +@@ -0,0 +1,2 @@ ++ ++/usr/share/sandbox/start -- gen_context(system_u:object_r:sandbox_exec_t,s0) +diff --git a/sandboxX.if b/sandboxX.if +new file mode 100644 +index 0000000000..885d799743 +--- /dev/null ++++ b/sandboxX.if +@@ -0,0 +1,397 @@ ++ ++## policy for sandboxX ++ ++######################################## ++## ++## Execute sandbox in the sandbox domain, and ++## allow the specified role the sandbox domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the sandbox domain. ++## ++## ++# ++interface(`sandbox_x_transition',` ++ gen_require(` ++ type sandbox_xserver_t; ++ type sandbox_file_t; ++ attribute sandbox_x_domain; ++ attribute sandbox_tmpfs_type; ++ ') ++ ++ allow $1 sandbox_x_domain:process { signal_perms transition }; ++ allow $1 sandbox_x_domain:process dyntransition; ++ dontaudit $1 sandbox_x_domain:process { noatsecure siginh rlimitinh }; ++ allow sandbox_x_domain $1:process { sigchld signull }; ++ allow { sandbox_x_domain sandbox_xserver_t } $1:fd use; ++ role $2 types sandbox_x_domain; ++ role $2 types sandbox_xserver_t; ++ allow $1 sandbox_xserver_t:process signal_perms; ++ dontaudit sandbox_xserver_t $1:fifo_file rw_inherited_fifo_file_perms; ++ dontaudit sandbox_xserver_t $1:tcp_socket rw_socket_perms; ++ dontaudit sandbox_xserver_t $1:udp_socket rw_socket_perms; ++ allow sandbox_xserver_t $1:unix_stream_socket { connectto rw_socket_perms }; ++ dontaudit sandbox_xserver_t $1:file read; ++ allow sandbox_x_domain sandbox_x_domain:process signal; ++ # Dontaudit leaked file descriptors ++ dontaudit sandbox_x_domain $1:key { link read search view }; ++ dontaudit sandbox_x_domain $1:fifo_file { read write }; ++ dontaudit sandbox_x_domain $1:tcp_socket rw_socket_perms; ++ dontaudit sandbox_x_domain $1:udp_socket rw_socket_perms; ++ dontaudit sandbox_x_domain $1:unix_stream_socket rw_socket_perms; ++ dontaudit sandbox_x_domain $1:process { signal sigkill }; ++ ++ allow $1 sandbox_tmpfs_type:file manage_file_perms; ++ dontaudit $1 sandbox_tmpfs_type:file manage_file_perms; ++ ++ can_exec($1, sandbox_file_t) ++ allow $1 sandbox_file_t:filesystem getattr; ++ manage_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_dirs_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_sock_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_fifo_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_lnk_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ relabel_dirs_pattern($1, sandbox_file_t, sandbox_file_t) ++ relabel_files_pattern($1, sandbox_file_t, sandbox_file_t) ++ relabel_lnk_files_pattern($1, sandbox_file_t, sandbox_file_t) ++ relabel_fifo_files_pattern($1, sandbox_file_t, sandbox_file_t) ++ relabel_sock_files_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## Creates types and rules for a basic ++## sandbox process domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`sandbox_x_domain_template',` ++ gen_require(` ++ type xserver_exec_t, sandbox_devpts_t; ++ type sandbox_xserver_t; ++ type sandbox_exec_t; ++ attribute sandbox_x_domain; ++ attribute sandbox_tmpfs_type; ++ attribute sandbox_type; ++ attribute sandbox_web_type; ++ ') ++ ++ type $1_t, sandbox_x_domain, sandbox_type, sandbox_web_type; ++ application_type($1_t) ++ mcs_constrained($1_t) ++ ++ kernel_read_system_state($1_t) ++ selinux_get_fs_mount($1_t) ++ ++ auth_use_nsswitch($1_t) ++ ++ logging_send_syslog_msg($1_t) ++ ++ # window manager ++ miscfiles_setattr_fonts_cache_dirs($1_t) ++ allow $1_t self:capability setuid; ++ ++ type $1_client_t, sandbox_x_domain; ++ application_type($1_client_t) ++ kernel_read_system_state($1_client_t) ++ ++ mcs_constrained($1_t) ++ ++ type $1_client_tmpfs_t, sandbox_tmpfs_type; ++ files_tmpfs_file($1_client_tmpfs_t) ++ ++ manage_files_pattern($1_client_t, $1_client_tmpfs_t, $1_client_tmpfs_t) ++ manage_files_pattern($1_t, $1_client_tmpfs_t, $1_client_tmpfs_t) ++ fs_tmpfs_filetrans($1_client_t, $1_client_tmpfs_t, file ) ++ fs_tmpfs_filetrans($1_t, $1_client_tmpfs_t, file ) ++ # Pulseaudio tmpfs files with different MCS labels ++ dontaudit $1_client_t $1_client_tmpfs_t:file { read write }; ++ dontaudit $1_t $1_client_tmpfs_t:file { read write map }; ++ allow sandbox_xserver_t $1_client_tmpfs_t:file { read write }; ++ allow $1_client_t $1_client_tmpfs_t:file { map }; ++ ++ domtrans_pattern($1_t, xserver_exec_t, sandbox_xserver_t) ++ allow $1_t sandbox_xserver_t:process signal_perms; ++ ++ domtrans_pattern($1_t, sandbox_exec_t, $1_client_t) ++ domain_entry_file($1_client_t, sandbox_exec_t) ++ allow $1_client_t $1_t:shm { unix_read unix_write }; ++ ++ ps_process_pattern(sandbox_xserver_t, $1_client_t) ++ ps_process_pattern(sandbox_xserver_t, $1_t) ++ allow sandbox_xserver_t $1_client_t:shm rw_shm_perms; ++ allow sandbox_xserver_t $1_t:shm rw_shm_perms; ++ allow $1_client_t $1_t:unix_stream_socket connectto; ++ allow $1_t $1_client_t:unix_stream_socket connectto; ++') ++ ++######################################## ++## ++## allow domain to read, ++## write sandbox_xserver tmp files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_rw_xserver_tmpfs_files',` ++ gen_require(` ++ type sandbox_xserver_tmpfs_t; ++ ') ++ ++ allow $1 sandbox_xserver_tmpfs_t:file rw_file_perms; ++') ++ ++######################################## ++## ++## allow domain to read ++## sandbox tmpfs files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_read_tmpfs_files',` ++ gen_require(` ++ attribute sandbox_tmpfs_type; ++ ') ++ ++ allow $1 sandbox_tmpfs_type:file read_file_perms; ++') ++ ++######################################## ++## ++## allow domain to manage ++## sandbox tmpfs files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_manage_tmpfs_files',` ++ gen_require(` ++ attribute sandbox_tmpfs_type; ++ ') ++ ++ allow $1 sandbox_tmpfs_type:file manage_file_perms; ++') ++ ++######################################## ++## ++## Delete sandbox files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_delete_files',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ delete_files_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## Manage sandbox content ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_manage_content',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ allow $1 sandbox_file_t:filesystem getattr; ++ manage_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_dirs_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_sock_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_fifo_files_pattern($1, sandbox_file_t, sandbox_file_t); ++ manage_lnk_files_pattern($1, sandbox_file_t, sandbox_file_t); ++') ++ ++######################################## ++## ++## Delete sandbox symbolic links ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_delete_lnk_files',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ delete_lnk_files_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## Delete sandbox fifo files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_delete_pipes',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ delete_fifo_files_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## Delete sandbox sock files ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_delete_sock_files',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ delete_sock_files_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## Allow domain to set the attributes ++## of the sandbox directory. ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_setattr_dirs',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ allow $1 sandbox_file_t:dir setattr; ++') ++ ++######################################## ++## ++## Delete sandbox directories ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_delete_dirs',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ delete_dirs_pattern($1, sandbox_file_t, sandbox_file_t) ++') ++ ++######################################## ++## ++## allow domain to list sandbox dirs ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`sandbox_list',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ allow $1 sandbox_file_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Read and write a sandbox domain pty. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sandbox_use_ptys',` ++ gen_require(` ++ type sandbox_devpts_t; ++ ') ++ ++ allow $1 sandbox_devpts_t:chr_file rw_inherited_term_perms; ++') ++ ++####################################### ++## ++## Allow domain to execute sandbox_file_t in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sandbox_exec_file',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ can_exec($1, sandbox_file_t) ++') ++ ++###################################### ++## ++## Allow domain to execute sandbox_file_t in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sandbox_dontaudit_mounton',` ++ gen_require(` ++ type sandbox_file_t; ++ ') ++ ++ dontaudit $1 sandbox_file_t:dir mounton; ++') +diff --git a/sandboxX.te b/sandboxX.te +new file mode 100644 +index 0000000000..7d126f9fd1 +--- /dev/null ++++ b/sandboxX.te +@@ -0,0 +1,531 @@ ++policy_module(sandboxX,1.0.0) ++ ++dbus_stub() ++attribute sandbox_x_domain; ++attribute sandbox_web_type; ++attribute sandbox_file_type; ++attribute sandbox_tmpfs_type; ++attribute sandbox_type; ++ ++type sandbox_exec_t; ++files_type(sandbox_exec_t) ++ ++type sandbox_file_t, sandbox_file_type; ++userdom_user_home_content(sandbox_file_t) ++ ++typealias sandbox_file_t alias { sandbox_x_file_t sandbox_web_file_t sandbox_net_file_t sandbox_min_file_t }; ++ ++######################################## ++# ++# Declarations ++# ++sandbox_x_domain_template(sandbox_min) ++sandbox_x_domain_template(sandbox_x) ++sandbox_x_domain_template(sandbox_web) ++sandbox_x_domain_template(sandbox_net) ++ ++type sandbox_xserver_t; ++domain_type(sandbox_xserver_t) ++xserver_user_x_domain_template(sandbox_xserver, sandbox_xserver_t, sandbox_xserver_tmpfs_t) ++ ++type sandbox_xserver_tmpfs_t; ++files_tmpfs_file(sandbox_xserver_tmpfs_t) ++ ++type sandbox_devpts_t; ++term_pty(sandbox_devpts_t) ++files_type(sandbox_devpts_t) ++ ++######################################## ++# ++# sandbox xserver policy ++# ++allow sandbox_xserver_t self:process { signal_perms execstack }; ++ ++allow sandbox_web_t sandbox_xserver_t:process2 nnp_transition; ++ ++tunable_policy(`deny_execmem',`',` ++ allow sandbox_xserver_t self:process execmem; ++') ++ ++allow sandbox_xserver_t self:fifo_file manage_fifo_file_perms; ++allow sandbox_xserver_t self:shm create_shm_perms; ++allow sandbox_xserver_t self:tcp_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(sandbox_xserver_t, sandbox_file_t, sandbox_file_t) ++manage_files_pattern(sandbox_xserver_t, sandbox_file_t, sandbox_file_t) ++manage_sock_files_pattern(sandbox_xserver_t, sandbox_file_t, sandbox_file_t) ++allow sandbox_xserver_t sandbox_file_t:sock_file create_sock_file_perms; ++ ++manage_dirs_pattern(sandbox_xserver_t, sandbox_xserver_tmpfs_t, sandbox_xserver_tmpfs_t) ++manage_files_pattern(sandbox_xserver_t, sandbox_xserver_tmpfs_t, sandbox_xserver_tmpfs_t) ++manage_lnk_files_pattern(sandbox_xserver_t, sandbox_xserver_tmpfs_t, sandbox_xserver_tmpfs_t) ++manage_fifo_files_pattern(sandbox_xserver_t, sandbox_xserver_tmpfs_t, sandbox_xserver_tmpfs_t) ++manage_sock_files_pattern(sandbox_xserver_t, sandbox_xserver_tmpfs_t, sandbox_xserver_tmpfs_t) ++fs_tmpfs_filetrans(sandbox_xserver_t, sandbox_xserver_tmpfs_t, { dir file lnk_file sock_file fifo_file }) ++ ++kernel_dontaudit_request_load_module(sandbox_xserver_t) ++kernel_read_system_state(sandbox_xserver_t) ++ ++corecmd_exec_bin(sandbox_xserver_t) ++corecmd_exec_shell(sandbox_xserver_t) ++ ++corenet_all_recvfrom_netlabel(sandbox_xserver_t) ++corenet_tcp_sendrecv_generic_if(sandbox_xserver_t) ++corenet_udp_sendrecv_generic_if(sandbox_xserver_t) ++corenet_tcp_sendrecv_generic_node(sandbox_xserver_t) ++corenet_udp_sendrecv_generic_node(sandbox_xserver_t) ++corenet_tcp_sendrecv_all_ports(sandbox_xserver_t) ++corenet_udp_sendrecv_all_ports(sandbox_xserver_t) ++corenet_tcp_bind_generic_node(sandbox_xserver_t) ++corenet_tcp_bind_xserver_port(sandbox_xserver_t) ++corenet_sendrecv_xserver_server_packets(sandbox_xserver_t) ++corenet_sendrecv_all_client_packets(sandbox_xserver_t) ++ ++dev_read_sysfs(sandbox_xserver_t) ++dev_rwx_zero(sandbox_xserver_t) ++dev_read_urand(sandbox_xserver_t) ++ ++domain_use_interactive_fds(sandbox_xserver_t) ++ ++files_read_config_files(sandbox_xserver_t) ++files_search_home(sandbox_xserver_t) ++fs_dontaudit_rw_tmpfs_files(sandbox_xserver_t) ++fs_list_inotifyfs(sandbox_xserver_t) ++fs_search_auto_mountpoints(sandbox_xserver_t) ++ ++miscfiles_read_fonts(sandbox_xserver_t) ++ ++selinux_validate_context(sandbox_xserver_t) ++selinux_compute_access_vector(sandbox_xserver_t) ++selinux_compute_create_context(sandbox_xserver_t) ++ ++auth_use_nsswitch(sandbox_xserver_t) ++ ++logging_send_syslog_msg(sandbox_xserver_t) ++logging_send_audit_msgs(sandbox_xserver_t) ++ ++userdom_use_inherited_user_terminals(sandbox_xserver_t) ++userdom_dontaudit_search_user_home_content(sandbox_xserver_t) ++userdom_dontaudit_rw_user_tmp_pipes(sandbox_xserver_t) ++userdom_map_tmp_files(sandbox_xserver_t) ++userdom_rw_user_tmp_files(sandbox_xserver_t) ++ ++xserver_read_xkb_libs(sandbox_xserver_t) ++xserver_dontaudit_xkb_libs_access(sandbox_xserver_t) ++xserver_entry_type(sandbox_xserver_t) ++ ++optional_policy(` ++ dbus_system_bus_client(sandbox_xserver_t) ++ ++ optional_policy(` ++ hal_dbus_chat(sandbox_xserver_t) ++ ') ++') ++ ++######################################## ++# ++# sandbox_x_t local policy ++# ++ ++allow sandbox_x_t sandbox_x_client_t:process2 nnp_transition; ++allow sandbox_x_t sandbox_xserver_t:process2 nnp_transition; ++ ++files_search_home(sandbox_x_t) ++userdom_use_user_ptys(sandbox_x_t) ++ ++# This access is needed due to Wayland ++userdom_manage_user_tmp_dirs(sandbox_x_t) ++userdom_map_tmp_files(sandbox_x_t) ++userdom_manage_user_tmp_files(sandbox_x_t) ++ ++######################################## ++# ++# sandbox_x_domain local policy ++# ++allow sandbox_x_domain self:process { getattr signal_perms getsched setsched setpgid execstack getcap setcap }; ++tunable_policy(`deny_execmem',`',` ++ allow sandbox_x_domain self:process execmem; ++') ++ ++allow sandbox_x_domain self:fifo_file manage_file_perms; ++allow sandbox_x_domain self:sem create_sem_perms; ++allow sandbox_x_domain self:shm create_shm_perms; ++allow sandbox_x_domain self:msgq create_msgq_perms; ++allow sandbox_x_domain self:netlink_selinux_socket create_socket_perms; ++allow sandbox_x_domain self:unix_dgram_socket { sendto create_socket_perms }; ++allow sandbox_x_domain self:unix_stream_socket { connectto create_stream_socket_perms }; ++ ++dontaudit sandbox_x_domain sandbox_x_domain:process signal; ++dontaudit sandbox_x_domain sandbox_xserver_t:process signal; ++dontaudit sandbox_x_domain self:netlink_audit_socket { create_netlink_socket_perms nlmsg_relay }; ++ ++allow sandbox_x_domain sandbox_xserver_t:unix_stream_socket connectto; ++ ++allow sandbox_x_domain sandbox_devpts_t:chr_file { rw_term_perms setattr }; ++term_create_pty(sandbox_x_domain,sandbox_devpts_t) ++ ++can_exec(sandbox_x_domain, sandbox_file_t) ++allow sandbox_x_domain sandbox_file_t:filesystem getattr; ++manage_files_pattern(sandbox_x_domain, sandbox_file_t, sandbox_file_t); ++manage_dirs_pattern(sandbox_x_domain, sandbox_file_t, sandbox_file_t); ++manage_sock_files_pattern(sandbox_x_domain, sandbox_file_t, sandbox_file_t); ++manage_fifo_files_pattern(sandbox_x_domain, sandbox_file_t, sandbox_file_t); ++manage_lnk_files_pattern(sandbox_x_domain, sandbox_file_t, sandbox_file_t); ++dontaudit sandbox_x_domain sandbox_file_t:dir mounton; ++allow sandbox_x_domain sandbox_file_t:file execmod; ++ ++kernel_getattr_proc(sandbox_x_domain) ++kernel_read_network_state(sandbox_x_domain) ++kernel_dontaudit_search_kernel_sysctl(sandbox_x_domain) ++ ++domain_dontaudit_read_all_domains_state(sandbox_x_domain) ++ ++corecmd_exec_all_executables(sandbox_x_domain) ++ ++dev_read_urand(sandbox_x_domain) ++dev_dontaudit_read_rand(sandbox_x_domain) ++dev_read_sysfs(sandbox_x_domain) ++dev_dontaudit_rw_dri(sandbox_x_domain) ++ ++files_search_home(sandbox_x_domain) ++files_dontaudit_list_all_mountpoints(sandbox_x_domain) ++files_entrypoint_all_files(sandbox_x_domain) ++files_read_config_files(sandbox_x_domain) ++files_read_usr_symlinks(sandbox_x_domain) ++ ++fs_getattr_tmpfs(sandbox_x_domain) ++fs_getattr_xattr_fs(sandbox_x_domain) ++fs_list_inotifyfs(sandbox_x_domain) ++fs_dontaudit_getattr_xattr_fs(sandbox_x_domain) ++fs_get_xattr_fs_quotas(sandbox_x_domain) ++ ++auth_dontaudit_read_login_records(sandbox_x_domain) ++auth_dontaudit_write_login_records(sandbox_x_domain) ++auth_search_pam_console_data(sandbox_x_domain) ++ ++init_read_utmp(sandbox_x_domain) ++init_dontaudit_write_utmp(sandbox_x_domain) ++ ++libs_dontaudit_setattr_lib_files(sandbox_x_domain) ++ ++miscfiles_dontaudit_setattr_fonts_cache_dirs(sandbox_x_domain) ++ ++mta_dontaudit_read_spool_symlinks(sandbox_x_domain) ++ ++selinux_validate_context(sandbox_x_domain) ++selinux_compute_access_vector(sandbox_x_domain) ++selinux_compute_create_context(sandbox_x_domain) ++selinux_compute_relabel_context(sandbox_x_domain) ++selinux_compute_user_contexts(sandbox_x_domain) ++seutil_read_default_contexts(sandbox_x_domain) ++ ++term_getattr_pty_fs(sandbox_x_domain) ++term_use_ptmx(sandbox_x_domain) ++term_search_ptys(sandbox_x_domain) ++ ++application_dontaudit_signal(sandbox_x_domain) ++application_dontaudit_sigkill(sandbox_x_domain) ++ ++logging_dontaudit_search_logs(sandbox_x_domain) ++ ++miscfiles_read_fonts(sandbox_x_domain) ++ ++storage_dontaudit_rw_fuse(sandbox_x_domain) ++ ++optional_policy(` ++ bluetooth_dbus_chat(sandbox_x_domain) ++') ++ ++optional_policy(` ++ consolekit_dbus_chat(sandbox_x_domain) ++') ++ ++optional_policy(` ++ cups_stream_connect(sandbox_x_domain) ++ cups_read_rw_config(sandbox_x_domain) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(sandbox_x_domain) ++') ++ ++optional_policy(` ++ devicekit_dontaudit_dbus_chat_disk(sandbox_x_domain) ++') ++ ++optional_policy(` ++ gnome_read_gconf_config(sandbox_x_domain) ++ gnome_dontaudit_rw_inherited_config(sandbox_x_domain) ++ gnome_dontaudit_rw_inherited_config(sandbox_xserver_t) ++') ++ ++optional_policy(` ++ nscd_dontaudit_search_pid(sandbox_x_domain) ++') ++ ++optional_policy(` ++ sssd_dontaudit_search_lib(sandbox_x_domain) ++') ++ ++optional_policy(` ++ udev_read_db(sandbox_x_domain) ++') ++ ++userdom_use_inherited_user_terminals(sandbox_x_domain) ++userdom_read_user_home_content_symlinks(sandbox_x_domain) ++userdom_search_user_home_content(sandbox_x_domain) ++userdom_dontaudit_rw_user_tmp_pipes(sandbox_x_domain) ++ ++fs_search_auto_mountpoints(sandbox_x_domain) ++fs_read_hugetlbfs_files(sandbox_x_domain) ++ ++tunable_policy(`use_nfs_home_dirs',` ++ fs_search_auto_mountpoints(sandbox_x_domain) ++ fs_search_nfs(sandbox_xserver_t) ++ fs_read_nfs_files(sandbox_xserver_t) ++ fs_manage_nfs_dirs(sandbox_x_domain) ++ fs_manage_nfs_files(sandbox_x_domain) ++ fs_exec_nfs_files(sandbox_x_domain) ++') ++ ++tunable_policy(`use_samba_home_dirs',` ++ fs_search_cifs(sandbox_xserver_t) ++ fs_read_cifs_files(sandbox_xserver_t) ++ fs_manage_cifs_dirs(sandbox_x_domain) ++ fs_manage_cifs_files(sandbox_x_domain) ++ fs_exec_cifs_files(sandbox_x_domain) ++') ++ ++tunable_policy(`use_fusefs_home_dirs',` ++ fs_search_fusefs(sandbox_xserver_t) ++ fs_read_fusefs_files(sandbox_xserver_t) ++ fs_manage_fusefs_dirs(sandbox_x_domain) ++ fs_manage_fusefs_files(sandbox_x_domain) ++ fs_exec_fusefs_files(sandbox_x_domain) ++') ++ ++optional_policy(` ++ networkmanager_dontaudit_dbus_chat(sandbox_x_domain) ++') ++ ++#1103622 ++corenet_tcp_connect_xserver_port(sandbox_x_domain) ++xserver_stream_connect(sandbox_x_domain) ++ ++######################################## ++# ++# sandbox_x_client_t local policy ++# ++allow sandbox_x_client_t self:tcp_socket create_stream_socket_perms; ++allow sandbox_x_client_t self:udp_socket create_socket_perms; ++allow sandbox_x_client_t self:dbus { acquire_svc send_msg }; ++ ++dev_read_rand(sandbox_x_client_t) ++ ++corenet_tcp_connect_ipp_port(sandbox_x_client_t) ++corenet_dontaudit_tcp_connect_xserver_port(sandbox_x_client_t) ++ ++auth_use_nsswitch(sandbox_x_client_t) ++ ++logging_send_syslog_msg(sandbox_x_client_t) ++ ++# This access is needed due to Wayland ++userdom_manage_user_tmp_dirs(sandbox_x_client_t) ++userdom_map_tmp_files(sandbox_x_client_t) ++userdom_manage_user_tmp_files(sandbox_x_client_t) ++ ++optional_policy(` ++ avahi_dbus_chat(sandbox_x_client_t) ++') ++ ++optional_policy(` ++ colord_dbus_chat(sandbox_x_client_t) ++') ++ ++optional_policy(` ++ hal_dbus_chat(sandbox_x_client_t) ++') ++ ++optional_policy(` ++ nsplugin_read_rw_files(sandbox_x_client_t) ++') ++ ++######################################## ++# ++# sandbox_web_client_t local policy ++# ++typeattribute sandbox_web_client_t sandbox_web_type; ++ ++allow sandbox_web_t sandbox_web_client_t:process2 nnp_transition; ++ ++selinux_get_fs_mount(sandbox_web_client_t) ++ ++auth_use_nsswitch(sandbox_web_client_t) ++ ++logging_send_syslog_msg(sandbox_web_client_t) ++ ++miscfiles_map_generic_certs(sandbox_web_client_t) ++ ++allow sandbox_web_type self:capability { setuid setgid }; ++allow sandbox_web_type self:netlink_audit_socket nlmsg_relay; ++dontaudit sandbox_web_type self:process setrlimit; ++ ++allow sandbox_web_type self:tcp_socket create_stream_socket_perms; ++allow sandbox_web_type self:udp_socket create_socket_perms; ++allow sandbox_web_type self:dbus { acquire_svc send_msg }; ++ ++kernel_dontaudit_search_kernel_sysctl(sandbox_web_type) ++kernel_request_load_module(sandbox_web_type) ++ ++dev_read_rand(sandbox_web_type) ++dev_write_sound(sandbox_web_type) ++dev_read_sound(sandbox_web_type) ++ ++corenet_tcp_sendrecv_generic_if(sandbox_web_type) ++corenet_raw_sendrecv_generic_if(sandbox_web_type) ++corenet_tcp_sendrecv_generic_node(sandbox_web_type) ++corenet_raw_sendrecv_generic_node(sandbox_web_type) ++corenet_tcp_sendrecv_http_port(sandbox_web_type) ++corenet_tcp_sendrecv_http_cache_port(sandbox_web_type) ++corenet_tcp_sendrecv_squid_port(sandbox_web_type) ++corenet_tcp_sendrecv_ftp_port(sandbox_web_type) ++corenet_tcp_sendrecv_ipp_port(sandbox_web_type) ++corenet_tcp_connect_all_ephemeral_ports(sandbox_web_type) ++corenet_tcp_connect_aol_port(sandbox_web_type) ++corenet_tcp_connect_asterisk_port(sandbox_web_type) ++corenet_tcp_connect_commplex_link_port(sandbox_web_type) ++corenet_tcp_connect_couchdb_port(sandbox_web_type) ++corenet_tcp_connect_flash_port(sandbox_web_type) ++corenet_tcp_connect_ftp_port(sandbox_web_type) ++corenet_tcp_connect_gatekeeper_port(sandbox_web_type) ++corenet_tcp_connect_generic_port(sandbox_web_type) ++corenet_tcp_connect_http_cache_port(sandbox_web_type) ++corenet_tcp_connect_http_port(sandbox_web_type) ++corenet_tcp_connect_ipp_port(sandbox_web_type) ++corenet_tcp_connect_ipsecnat_port(sandbox_web_type) ++corenet_tcp_connect_ircd_port(sandbox_web_type) ++corenet_tcp_connect_jabber_client_port(sandbox_web_type) ++corenet_tcp_connect_jboss_management_port(sandbox_web_type) ++corenet_tcp_connect_mmcc_port(sandbox_web_type) ++corenet_tcp_connect_monopd_port(sandbox_web_type) ++corenet_tcp_connect_msnp_port(sandbox_web_type) ++corenet_tcp_connect_ms_streaming_port(sandbox_web_type) ++corenet_tcp_connect_pulseaudio_port(sandbox_web_type) ++corenet_tcp_connect_rtsp_port(sandbox_web_type) ++corenet_tcp_connect_soundd_port(sandbox_web_type) ++corenet_tcp_connect_speech_port(sandbox_web_type) ++corenet_tcp_connect_squid_port(sandbox_web_type) ++corenet_tcp_connect_tor_port(sandbox_web_type) ++corenet_tcp_connect_transproxy_port(sandbox_web_type) ++corenet_tcp_connect_vnc_port(sandbox_web_type) ++corenet_tcp_connect_whois_port(sandbox_web_type) ++corenet_sendrecv_http_client_packets(sandbox_web_type) ++corenet_sendrecv_http_cache_client_packets(sandbox_web_type) ++corenet_sendrecv_squid_client_packets(sandbox_web_type) ++corenet_sendrecv_ftp_client_packets(sandbox_web_type) ++corenet_sendrecv_ipp_client_packets(sandbox_web_type) ++corenet_sendrecv_generic_client_packets(sandbox_web_type) ++corenet_dontaudit_tcp_connect_xserver_port(sandbox_web_type) ++ ++corenet_dontaudit_tcp_sendrecv_generic_port(sandbox_web_type) ++corenet_dontaudit_tcp_bind_generic_port(sandbox_web_type) ++ ++files_dontaudit_getattr_all_dirs(sandbox_web_type) ++ ++fs_dontaudit_rw_anon_inodefs_files(sandbox_web_type) ++fs_dontaudit_getattr_all_fs(sandbox_web_type) ++ ++storage_dontaudit_getattr_fixed_disk_dev(sandbox_web_type) ++ ++dbus_system_bus_client(sandbox_web_type) ++dbus_read_config(sandbox_web_type) ++selinux_validate_context(sandbox_web_type) ++selinux_compute_access_vector(sandbox_web_type) ++selinux_compute_create_context(sandbox_web_type) ++selinux_compute_relabel_context(sandbox_web_type) ++selinux_compute_user_contexts(sandbox_web_type) ++seutil_read_default_contexts(sandbox_web_type) ++ ++userdom_rw_user_tmp_files(sandbox_web_type) ++userdom_delete_user_tmp_files(sandbox_web_type) ++ ++optional_policy(` ++ alsa_read_rw_config(sandbox_web_type) ++') ++ ++optional_policy(` ++ avahi_dbus_chat(sandbox_web_type) ++') ++ ++optional_policy(` ++ bluetooth_dontaudit_dbus_chat(sandbox_web_type) ++') ++ ++optional_policy(` ++ hal_dbus_chat(sandbox_web_type) ++') ++ ++optional_policy(` ++ chrome_domtrans_sandbox(sandbox_web_type) ++') ++ ++optional_policy(` ++ mozilla_plugin_rw_sem(sandbox_web_type) ++') ++ ++optional_policy(` ++ nsplugin_manage_rw(sandbox_web_type) ++ nsplugin_read_rw_files(sandbox_web_type) ++ nsplugin_rw_exec(sandbox_web_type) ++') ++ ++optional_policy(` ++ pulseaudio_stream_connect(sandbox_web_type) ++ allow sandbox_web_type self:netlink_kobject_uevent_socket create_socket_perms; ++') ++ ++optional_policy(` ++ rtkit_daemon_dontaudit_dbus_chat(sandbox_web_type) ++') ++ ++optional_policy(` ++ # needed by pulseaudio ++ systemd_read_logind_sessions_files(sandbox_web_type) ++ systemd_login_read_pid_files(sandbox_web_type) ++') ++ ++optional_policy(` ++ udev_read_state(sandbox_web_type) ++') ++ ++######################################## ++# ++# sandbox_net_client_t local policy ++# ++typeattribute sandbox_net_client_t sandbox_web_type; ++ ++corenet_tcp_sendrecv_generic_if(sandbox_net_client_t) ++corenet_udp_sendrecv_generic_if(sandbox_net_client_t) ++corenet_tcp_sendrecv_generic_node(sandbox_net_client_t) ++corenet_udp_sendrecv_generic_node(sandbox_net_client_t) ++corenet_tcp_sendrecv_all_ports(sandbox_net_client_t) ++corenet_udp_sendrecv_all_ports(sandbox_net_client_t) ++corenet_tcp_connect_all_ports(sandbox_net_client_t) ++corenet_sendrecv_all_client_packets(sandbox_net_client_t) ++ ++selinux_get_fs_mount(sandbox_net_client_t) ++ ++auth_use_nsswitch(sandbox_net_client_t) ++ ++logging_send_syslog_msg(sandbox_net_client_t) ++ ++optional_policy(` ++ mozilla_plugin_rw_tmpfs_files(sandbox_x_domain) ++ mozilla_dontaudit_rw_user_home_files(sandbox_x_t) ++ mozilla_dontaudit_rw_user_home_files(sandbox_xserver_t) ++ mozilla_dontaudit_rw_user_home_files(sandbox_x_domain) ++ mozilla_plugin_rw_sem(sandbox_x_domain) ++ mozilla_plugin_dontaudit_leaks(sandbox_x_domain) ++') ++userdom_dontaudit_open_user_ptys(sandbox_x_domain) ++ +diff --git a/sanlock.fc b/sanlock.fc +index 3df2a0f14e..7264d8ae19 100644 +--- a/sanlock.fc ++++ b/sanlock.fc +@@ -1,7 +1,18 @@ ++ + /etc/rc\.d/init\.d/sanlock -- gen_context(system_u:object_r:sanlock_initrc_exec_t,s0) + +-/usr/sbin/sanlock -- gen_context(system_u:object_r:sanlock_exec_t,s0) ++/etc/sanlock(/.*)? gen_context(system_u:object_r:sanlock_conf_t,s0) ++ ++/var/run/sanlock(/.*)? gen_context(system_u:object_r:sanlock_var_run_t,s0) ++ ++/var/run/sanlk-resetd(/.*)? gen_context(system_u:object_r:sanlock_var_run_t,s0) ++ ++/var/log/sanlock\.log.* gen_context(system_u:object_r:sanlock_log_t,s0) ++ ++/usr/sbin/sanlock -- gen_context(system_u:object_r:sanlock_exec_t,s0) ++ ++/usr/sbin/sanlk-resetd -- gen_context(system_u:object_r:sanlk_resetd_exec_t,s0) + +-/var/run/sanlock(/.*)? gen_context(system_u:object_r:sanlock_var_run_t,s0) ++/usr/lib/systemd/system/sanlock\.service -- gen_context(system_u:object_r:sanlock_unit_file_t,s0) + +-/var/log/sanlock\.log.* -- gen_context(system_u:object_r:sanlock_log_t,s0) ++/usr/lib/systemd/system/sanlk-resetd\.service -- gen_context(system_u:object_r:sanlk_resetd_unit_file_t,s0) +diff --git a/sanlock.if b/sanlock.if +index cd6c213d2c..9becdddccd 100644 +--- a/sanlock.if ++++ b/sanlock.if +@@ -1,4 +1,6 @@ +-## shared storage lock manager. ++ ++## Sanlock - lock manager built on shared storage. ++ + + ######################################## + ## +@@ -15,18 +17,17 @@ interface(`sanlock_domtrans',` + type sanlock_t, sanlock_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, sanlock_exec_t, sanlock_t) + ') + ++ + ######################################## + ## +-## Execute sanlock init scripts in +-## the initrc domain. ++## Execute sanlock server in the sanlock domain. + ## + ## + ## +-## Domain allowed to transition. ++## The type of the process performing this action. + ## + ## + # +@@ -40,8 +41,7 @@ interface(`sanlock_initrc_domtrans',` + + ###################################### + ## +-## Create, read, write, and delete +-## sanlock pid files. ++## Create, read, write, and delete sanlock PID files. + ## + ## + ## +@@ -60,28 +60,51 @@ interface(`sanlock_manage_pid_files',` + + ######################################## + ## +-## Connect to sanlock with a unix +-## domain stream socket. ++## Connect to sanlock over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sanlock_stream_connect',` ++ gen_require(` ++ type sanlock_t, sanlock_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, sanlock_var_run_t, sanlock_var_run_t, sanlock_t) ++') ++ ++######################################## ++## ++## Execute virt server in the virt domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## + # +-interface(`sanlock_stream_connect',` ++interface(`sanlock_systemctl',` + gen_require(` +- type sanlock_t, sanlock_var_run_t; ++ type sanlock_unit_file_t; ++ type sanlock_t; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, sanlock_var_run_t, sanlock_var_run_t, sanlock_t) ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 sanlock_unit_file_t:file read_file_perms; ++ allow $1 sanlock_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sanlock_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an sanlock environment. ++## All of the rules required to administrate ++## an sanlock environment + ## + ## + ## +@@ -97,21 +120,139 @@ interface(`sanlock_stream_connect',` + # + interface(`sanlock_admin',` + gen_require(` +- type sanlock_t, sanlock_initrc_exec_t, sanlock_var_run_t; +- type sanlock_log_t; ++ type sanlock_t; ++ type sanlock_initrc_exec_t; ++ type sanlock_unit_file_t; + ') + +- allow $1 sanlock_t:process { ptrace signal_perms }; ++ allow $1 sanlock_t:process signal_perms; + ps_process_pattern($1, sanlock_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sanlock_t:process ptrace; ++ ') + + sanlock_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 sanlock_initrc_exec_t system_r; + allow $2 system_r; + ++ virt_systemctl($1) ++ admin_pattern($1, sanlock_unit_file_t) ++ allow $1 sanlock_unit_file_t:service all_service_perms; ++') ++ ++######################################## ++## ++## Execute sanlk_resetd_exec_t in the sanlk_resetd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sanlock_domtrans_sanlk_resetd',` ++ gen_require(` ++ type sanlk_resetd_t, sanlk_resetd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, sanlk_resetd_exec_t, sanlk_resetd_t) ++') ++ ++###################################### ++## ++## Execute sanlk_resetd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sanlock_exec_sanlk_resetd',` ++ gen_require(` ++ type sanlk_resetd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, sanlk_resetd_exec_t) ++') ++ ++######################################## ++## ++## Execute sanlk_resetd server in the sanlk_resetd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sanlock_systemctl_sanlk_resetd',` ++ gen_require(` ++ type sanlk_resetd_t; ++ type sanlk_resetd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 sanlk_resetd_unit_file_t:file read_file_perms; ++ allow $1 sanlk_resetd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sanlk_resetd_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an sanlk_resetd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sanlock_admin_sanlk_resetd',` ++ gen_require(` ++ type sanlk_resetd_t; ++ type sanlk_resetd_unit_file_t; ++ type sanlk_resetd_unit_file_t; ++ ') ++ ++ allow $1 sanlk_resetd_t:process { signal_perms }; ++ ps_process_pattern($1, sanlk_resetd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sanlk_resetd_t:process ptrace; ++ ') ++ + files_search_pids($1) +- admin_pattern($1, sanlock_var_run_t) + +- logging_search_logs($1) +- admin_pattern($1, sanlock_log_t) ++ sanlock_systemctl_sanlk_resetd($1) ++ admin_pattern($1, sanlk_resetd_unit_file_t) ++ allow $1 sanlk_resetd_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Read sanlock process state files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sanlock_read_state',` ++ gen_require(` ++ type sanlock_t; ++ ') ++ ++ ps_process_pattern($1, sanlock_t) + ') +diff --git a/sanlock.te b/sanlock.te +index 0045465a0b..f5f6921368 100644 +--- a/sanlock.te ++++ b/sanlock.te +@@ -6,25 +6,44 @@ policy_module(sanlock, 1.1.0) + # + + ## +-##

      +-## Determine whether sanlock can use +-## nfs file systems. +-##

      ++##

      ++## Allow sanlock to manage nfs files ++##

      + ##
      + gen_tunable(sanlock_use_nfs, false) + ++## ++##

      ++## Allow sanlock to manage cifs files ++##

      ++##
      ++gen_tunable(sanlock_use_samba, false) ++ ++## ++##

      ++## Allow sanlock to read/write fuse files ++##

      ++##
      ++gen_tunable(sanlock_use_fusefs, false) ++ + ## + ##

      +-## Determine whether sanlock can use +-## cifs file systems. ++## Allow sanlock to read/write user home directories. + ##

      + ##
      +-gen_tunable(sanlock_use_samba, false) ++gen_tunable(sanlock_enable_home_dirs, false) + + type sanlock_t; + type sanlock_exec_t; + init_daemon_domain(sanlock_t, sanlock_exec_t) + ++type sanlk_resetd_t; ++type sanlk_resetd_exec_t; ++init_daemon_domain(sanlk_resetd_t, sanlk_resetd_exec_t) ++ ++type sanlock_conf_t; ++files_config_file(sanlock_conf_t) ++ + type sanlock_var_run_t; + files_pid_file(sanlock_var_run_t) + +@@ -34,6 +53,12 @@ logging_log_file(sanlock_log_t) + type sanlock_initrc_exec_t; + init_script_file(sanlock_initrc_exec_t) + ++type sanlock_unit_file_t; ++systemd_unit_file(sanlock_unit_file_t) ++ ++type sanlk_resetd_unit_file_t; ++systemd_unit_file(sanlk_resetd_unit_file_t) ++ + ifdef(`enable_mcs',` + init_ranged_daemon_domain(sanlock_t, sanlock_exec_t, s0 - mcs_systemhigh) + ') +@@ -44,17 +69,18 @@ ifdef(`enable_mls',` + + ######################################## + # +-# Local policy ++# sanlock local policy + # +- +-allow sanlock_t self:capability { chown dac_override ipc_lock kill setgid setuid sys_nice sys_resource }; ++allow sanlock_t self:capability { chown dac_read_search dac_override ipc_lock kill setgid setuid sys_nice sys_resource }; + allow sanlock_t self:process { setrlimit setsched signull signal sigkill }; ++ + allow sanlock_t self:fifo_file rw_fifo_file_perms; +-allow sanlock_t self:unix_stream_socket { accept listen }; ++allow sanlock_t self:unix_stream_socket { connectto create_stream_socket_perms }; ++ ++manage_files_pattern(sanlock_t, sanlock_conf_t, sanlock_conf_t) ++manage_dirs_pattern(sanlock_t, sanlock_conf_t, sanlock_conf_t) + +-append_files_pattern(sanlock_t, sanlock_log_t, sanlock_log_t) +-create_files_pattern(sanlock_t, sanlock_log_t, sanlock_log_t) +-setattr_files_pattern(sanlock_t, sanlock_log_t, sanlock_log_t) ++manage_files_pattern(sanlock_t, sanlock_log_t, sanlock_log_t) + logging_log_filetrans(sanlock_t, sanlock_log_t, file) + + manage_dirs_pattern(sanlock_t, sanlock_var_run_t, sanlock_var_run_t) +@@ -65,13 +91,18 @@ files_pid_filetrans(sanlock_t, sanlock_var_run_t, { file dir sock_file }) + kernel_read_system_state(sanlock_t) + kernel_read_kernel_sysctls(sanlock_t) + +-dev_read_rand(sanlock_t) +-dev_read_urand(sanlock_t) +- + domain_use_interactive_fds(sanlock_t) + ++files_read_mnt_symlinks(sanlock_t) ++ ++fs_rw_cephfs_files(sanlock_t) ++ + storage_raw_rw_fixed_disk(sanlock_t) + ++dev_read_rand(sanlock_t) ++dev_read_urand(sanlock_t) ++dev_read_sysfs(sanlock_t) ++ + auth_use_nsswitch(sanlock_t) + + init_read_utmp(sanlock_t) +@@ -79,20 +110,35 @@ init_dontaudit_write_utmp(sanlock_t) + + logging_send_syslog_msg(sanlock_t) + +-miscfiles_read_localization(sanlock_t) ++tunable_policy(`sanlock_use_fusefs',` ++ fs_manage_fusefs_dirs(sanlock_t) ++ fs_manage_fusefs_files(sanlock_t) ++ fs_read_fusefs_symlinks(sanlock_t) ++ fs_getattr_fusefs(sanlock_t) ++') + + tunable_policy(`sanlock_use_nfs',` +- fs_manage_nfs_dirs(sanlock_t) +- fs_manage_nfs_files(sanlock_t) +- fs_manage_nfs_named_sockets(sanlock_t) +- fs_read_nfs_symlinks(sanlock_t) ++ fs_manage_nfs_dirs(sanlock_t) ++ fs_manage_nfs_files(sanlock_t) ++ fs_manage_nfs_named_sockets(sanlock_t) ++ fs_read_nfs_symlinks(sanlock_t) + ') + + tunable_policy(`sanlock_use_samba',` +- fs_manage_cifs_dirs(sanlock_t) +- fs_manage_cifs_files(sanlock_t) +- fs_manage_cifs_named_sockets(sanlock_t) +- fs_read_cifs_symlinks(sanlock_t) ++ fs_manage_cifs_dirs(sanlock_t) ++ fs_manage_cifs_files(sanlock_t) ++ fs_manage_cifs_named_sockets(sanlock_t) ++ fs_read_cifs_symlinks(sanlock_t) ++') ++ ++tunable_policy(`sanlock_enable_home_dirs',` ++ userdom_manage_user_home_content_dirs(sanlock_t) ++ userdom_manage_user_home_content_files(sanlock_t) ++ userdom_manage_user_home_content_symlinks(sanlock_t) ++') ++ ++optional_policy(` ++ rhcs_domtrans_fenced(sanlock_t) + ') + + optional_policy(` +@@ -100,7 +146,34 @@ optional_policy(` + ') + + optional_policy(` +- virt_kill_all_virt_domains(sanlock_t) ++ virt_kill_svirt(sanlock_t) ++ virt_kill(sanlock_t) ++ virt_signal(sanlock_t) + virt_manage_lib_files(sanlock_t) +- virt_signal_all_virt_domains(sanlock_t) ++ virt_signal_svirt(sanlock_t) ++ virt_read_pid_files(sanlock_t) ++') ++ ++######################################## ++# ++# sanlk_resetd local policy ++# ++ ++allow sanlk_resetd_t self:capability { dac_read_search dac_override }; ++allow sanlk_resetd_t self:fifo_file rw_fifo_file_perms; ++allow sanlk_resetd_t sanlock_t:unix_stream_socket connectto; ++ ++manage_dirs_pattern(sanlk_resetd_t, sanlock_var_run_t, sanlock_var_run_t) ++manage_files_pattern(sanlk_resetd_t, sanlock_var_run_t, sanlock_var_run_t) ++manage_sock_files_pattern(sanlk_resetd_t, sanlock_var_run_t, sanlock_var_run_t) ++files_pid_filetrans(sanlk_resetd_t, sanlock_var_run_t, dir) ++ ++kernel_dgram_send(sanlk_resetd_t) ++ ++domain_use_interactive_fds(sanlk_resetd_t) ++ ++logging_send_syslog_msg(sanlk_resetd_t) ++ ++optional_policy(` ++ wdmd_stream_connect(sanlk_resetd_t) + ') +diff --git a/sasl.fc b/sasl.fc +index 54f41c2b75..7e58679685 100644 +--- a/sasl.fc ++++ b/sasl.fc +@@ -1,7 +1,12 @@ + /etc/rc\.d/init\.d/sasl -- gen_context(system_u:object_r:saslauthd_initrc_exec_t,s0) + ++# ++# /usr ++# + /usr/sbin/saslauthd -- gen_context(system_u:object_r:saslauthd_exec_t,s0) + +-/var/lib/sasl2(/.*)? gen_context(system_u:object_r:saslauthd_var_run_t,s0) +- ++# ++# /var ++# ++/var/lib/sasl2(/.*)? gen_context(system_u:object_r:saslauthd_var_run_t,s0) + /var/run/saslauthd(/.*)? gen_context(system_u:object_r:saslauthd_var_run_t,s0) +diff --git a/sasl.if b/sasl.if +index 8c3c151cbf..93b7227892 100644 +--- a/sasl.if ++++ b/sasl.if +@@ -1,4 +1,4 @@ +-## SASL authentication server. ++## SASL authentication server + + ######################################## + ## +@@ -21,8 +21,8 @@ interface(`sasl_connect',` + + ######################################## + ## +-## All of the rules required to +-## administrate an sasl environment. ++## All of the rules required to administrate ++## an sasl environment + ## + ## + ## +@@ -42,9 +42,13 @@ interface(`sasl_admin',` + type saslauthd_keytab_t; + ') + +- allow $1 saslauthd_t:process { ptrace signal_perms }; ++ allow $1 saslauthd_t:process signal_perms; + ps_process_pattern($1, saslauthd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 saslauthd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, saslauthd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 saslauthd_initrc_exec_t system_r; +diff --git a/sasl.te b/sasl.te +index 6c3bc20594..eb05a49202 100644 +--- a/sasl.te ++++ b/sasl.te +@@ -6,12 +6,11 @@ policy_module(sasl, 1.15.1) + # + + ## +-##

      +-## Determine whether sasl can +-## read shadow files. +-##

      ++##

      ++## Allow sasl to read shadow ++##

      + ##
      +-gen_tunable(allow_saslauthd_read_shadow, false) ++gen_tunable(saslauthd_read_shadow, false) + + type saslauthd_t; + type saslauthd_exec_t; +@@ -35,7 +34,9 @@ allow saslauthd_t self:capability { setgid setuid sys_nice }; + dontaudit saslauthd_t self:capability sys_tty_config; + allow saslauthd_t self:process { setsched signal_perms }; + allow saslauthd_t self:fifo_file rw_fifo_file_perms; +-allow saslauthd_t self:unix_stream_socket { accept listen }; ++allow saslauthd_t self:unix_dgram_socket create_socket_perms; ++allow saslauthd_t self:unix_stream_socket create_stream_socket_perms; ++allow saslauthd_t self:tcp_socket create_socket_perms; + + allow saslauthd_t saslauthd_keytab_t:file read_file_perms; + +@@ -48,29 +49,20 @@ kernel_read_kernel_sysctls(saslauthd_t) + kernel_read_system_state(saslauthd_t) + kernel_rw_afs_state(saslauthd_t) + +-corenet_all_recvfrom_unlabeled(saslauthd_t) ++#577519 ++corecmd_exec_bin(saslauthd_t) ++ + corenet_all_recvfrom_netlabel(saslauthd_t) + corenet_tcp_sendrecv_generic_if(saslauthd_t) + corenet_tcp_sendrecv_generic_node(saslauthd_t) +- +-corenet_sendrecv_pop_client_packets(saslauthd_t) ++corenet_tcp_sendrecv_all_ports(saslauthd_t) ++corenet_tcp_connect_ldap_port(saslauthd_t) + corenet_tcp_connect_pop_port(saslauthd_t) +-corenet_tcp_sendrecv_pop_port(saslauthd_t) +- +-corenet_sendrecv_zarafa_client_packets(saslauthd_t) + corenet_tcp_connect_zarafa_port(saslauthd_t) +-corenet_tcp_sendrecv_zarafa_port(saslauthd_t) +- +-corecmd_exec_bin(saslauthd_t) ++corenet_sendrecv_pop_client_packets(saslauthd_t) + + dev_read_urand(saslauthd_t) + +-domain_use_interactive_fds(saslauthd_t) +- +-files_dontaudit_read_etc_runtime_files(saslauthd_t) +-files_dontaudit_getattr_home_dir(saslauthd_t) +-files_dontaudit_getattr_tmp_dirs(saslauthd_t) +- + fs_getattr_all_fs(saslauthd_t) + fs_search_auto_mountpoints(saslauthd_t) + +@@ -78,34 +70,39 @@ selinux_compute_access_vector(saslauthd_t) + + auth_use_pam(saslauthd_t) + ++domain_use_interactive_fds(saslauthd_t) ++ ++files_dontaudit_read_etc_runtime_files(saslauthd_t) ++files_search_var_lib(saslauthd_t) ++files_dontaudit_getattr_home_dir(saslauthd_t) ++files_dontaudit_getattr_tmp_dirs(saslauthd_t) ++ + init_dontaudit_stream_connect_script(saslauthd_t) + + logging_send_syslog_msg(saslauthd_t) + +-miscfiles_read_localization(saslauthd_t) + miscfiles_read_generic_certs(saslauthd_t) + +-seutil_dontaudit_read_config(saslauthd_t) +- + userdom_dontaudit_use_unpriv_user_fds(saslauthd_t) + userdom_dontaudit_search_user_home_dirs(saslauthd_t) + ++# cjp: typeattribute doesnt work in conditionals + auth_can_read_shadow_passwords(saslauthd_t) +-tunable_policy(`allow_saslauthd_read_shadow',` +- allow saslauthd_t self:capability dac_override; ++tunable_policy(`saslauthd_read_shadow',` ++ allow saslauthd_t self:capability { dac_read_search dac_override }; + auth_tunable_read_shadow(saslauthd_t) + ') + + optional_policy(` + kerberos_read_keytab(saslauthd_t) + kerberos_manage_host_rcache(saslauthd_t) +- kerberos_tmp_filetrans_host_rcache(saslauthd_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(saslauthd_t, "host_0") + kerberos_use(saslauthd_t) + ') + + optional_policy(` ++ mysql_search_db(saslauthd_t) + mysql_stream_connect(saslauthd_t) +- mysql_tcp_connect(saslauthd_t) + ') + + optional_policy(` +diff --git a/sbd.fc b/sbd.fc +new file mode 100644 +index 0000000000..41768eed0f +--- /dev/null ++++ b/sbd.fc +@@ -0,0 +1,7 @@ ++/usr/lib/systemd/system/sbd.service -- gen_context(system_u:object_r:sbd_unit_file_t,s0) ++ ++/usr/lib/systemd/system/sbd_remote.service -- gen_context(system_u:object_r:sbd_unit_file_t,s0) ++ ++/usr/sbin/sbd -- gen_context(system_u:object_r:sbd_exec_t,s0) ++ ++/var/run/sbd.* -- gen_context(system_u:object_r:sbd_var_run_t,s0) +diff --git a/sbd.if b/sbd.if +new file mode 100644 +index 0000000000..7a058a82aa +--- /dev/null ++++ b/sbd.if +@@ -0,0 +1,126 @@ ++ ++## policy for sbd ++ ++######################################## ++## ++## Execute sbd_exec_t in the sbd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sbd_domtrans',` ++ gen_require(` ++ type sbd_t, sbd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, sbd_exec_t, sbd_t) ++') ++ ++###################################### ++## ++## Execute sbd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sbd_exec',` ++ gen_require(` ++ type sbd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, sbd_exec_t) ++') ++######################################## ++## ++## Read sbd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sbd_read_pid_files',` ++ gen_require(` ++ type sbd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, sbd_var_run_t, sbd_var_run_t) ++') ++ ++######################################## ++## ++## Execute sbd server in the sbd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sbd_systemctl',` ++ gen_require(` ++ type sbd_t; ++ type sbd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 sbd_unit_file_t:file read_file_perms; ++ allow $1 sbd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sbd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an sbd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`sbd_admin',` ++ gen_require(` ++ type sbd_t; ++ type sbd_var_run_t; ++ type sbd_unit_file_t; ++ ') ++ ++ allow $1 sbd_t:process { signal_perms }; ++ ps_process_pattern($1, sbd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sbd_t:process ptrace; ++ ') ++ ++ files_search_pids($1) ++ admin_pattern($1, sbd_var_run_t) ++ ++ sbd_systemctl($1) ++ admin_pattern($1, sbd_unit_file_t) ++ allow $1 sbd_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/sbd.te b/sbd.te +new file mode 100644 +index 0000000000..5aea5cbe1d +--- /dev/null ++++ b/sbd.te +@@ -0,0 +1,71 @@ ++policy_module(sbd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type sbd_t; ++type sbd_exec_t; ++init_daemon_domain(sbd_t, sbd_exec_t) ++ ++type sbd_var_run_t; ++files_pid_file(sbd_var_run_t) ++ ++type sbd_unit_file_t; ++systemd_unit_file(sbd_unit_file_t) ++ ++type sbd_tmpfs_t; ++userdom_user_tmpfs_file(sbd_tmpfs_t) ++ ++######################################## ++# ++# sbd local policy ++# ++allow sbd_t self:capability { dac_read_search dac_override ipc_lock kill sys_boot sys_nice sys_admin}; ++allow sbd_t self:process { fork setsched signal_perms }; ++allow sbd_t self:fifo_file rw_fifo_file_perms; ++allow sbd_t self:unix_stream_socket create_stream_socket_perms; ++allow sbd_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(sbd_t, sbd_var_run_t, sbd_var_run_t) ++manage_files_pattern(sbd_t, sbd_var_run_t, sbd_var_run_t) ++manage_lnk_files_pattern(sbd_t, sbd_var_run_t, sbd_var_run_t) ++files_pid_filetrans(sbd_t, sbd_var_run_t, { dir file lnk_file }) ++ ++manage_files_pattern(sbd_t, sbd_tmpfs_t, sbd_tmpfs_t) ++manage_dirs_pattern(sbd_t, sbd_tmpfs_t, sbd_tmpfs_t) ++fs_tmpfs_filetrans(sbd_t, sbd_tmpfs_t, { file dir }) ++ ++auth_use_nsswitch(sbd_t) ++ ++kernel_read_system_state(sbd_t) ++kernel_dgram_send(sbd_t) ++kernel_rw_all_sysctls(sbd_t) ++kernel_create_rpc_sysctls(sbd_t) ++ ++dev_read_rand(sbd_t) ++dev_write_watchdog(sbd_t) ++dev_getattr_all_chr_files(sbd_t) ++dev_read_sysfs(sbd_t) ++ ++domain_read_all_domains_state(sbd_t) ++ ++files_read_etc_files(sbd_t) ++ ++fs_read_tmpfs_symlinks(sbd_t) ++fs_manage_cgroup_files(sbd_t) ++fs_manage_cgroup_dirs(sbd_t) ++ ++miscfiles_read_localization(sbd_t) ++ ++logging_send_syslog_msg(sbd_t) ++ ++storage_raw_rw_fixed_disk(sbd_t) ++ ++optional_policy(` ++ rhcs_rw_cluster_tmpfs(sbd_t) ++ rhcs_stream_connect_cluster(sbd_t) ++ rhcs_signull_cluster(sbd_t) ++ ++') +diff --git a/sblim.fc b/sblim.fc +index 68a550d54b..e976fc62e8 100644 +--- a/sblim.fc ++++ b/sblim.fc +@@ -1,6 +1,10 @@ + /etc/rc\.d/init\.d/gatherer -- gen_context(system_u:object_r:sblim_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/sblim-sfcbd -- gen_context(system_u:object_r:sblim_initrc_exec_t,s0) + + /usr/sbin/gatherd -- gen_context(system_u:object_r:sblim_gatherd_exec_t,s0) + /usr/sbin/reposd -- gen_context(system_u:object_r:sblim_reposd_exec_t,s0) ++/usr/sbin/sfcbd -- gen_context(system_u:object_r:sblim_sfcbd_exec_t,s0) ++ ++/var/lib/sfcb(/.*)? gen_context(system_u:object_r:sblim_var_lib_t,s0) + + /var/run/gather(/.*)? gen_context(system_u:object_r:sblim_var_run_t,s0) +diff --git a/sblim.if b/sblim.if +index 98c9e0a884..562666e065 100644 +--- a/sblim.if ++++ b/sblim.if +@@ -1,8 +1,36 @@ +-## Standards Based Linux Instrumentation for Manageability. ++## Standards Based Linux Instrumentation for Manageability. ++ ++###################################### ++## ++## Creates types and rules for a basic ++## sblim daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`sblim_domain_template',` ++ gen_require(` ++ attribute sblim_domain; ++ ') ++ ++ type sblim_$1_t, sblim_domain; ++ type sblim_$1_exec_t; ++ init_daemon_domain(sblim_$1_t, sblim_$1_exec_t) ++ ++ kernel_read_system_state(sblim_$1_t) ++ ++ corenet_all_recvfrom_unlabeled(sblim_$1_t) ++ corenet_all_recvfrom_netlabel(sblim_$1_t) ++ ++ logging_send_syslog_msg(sblim_$1_t) ++') + + ######################################## + ## +-## Execute gatherd in the gatherd domain. ++## Transition to gatherd. + ## + ## + ## +@@ -21,7 +49,7 @@ interface(`sblim_domtrans_gatherd',` + + ######################################## + ## +-## Read gatherd pid files. ++## Read gatherd PID files. + ## + ## + ## +@@ -40,34 +68,129 @@ interface(`sblim_read_pid_files',` + + ######################################## + ## +-## All of the rules required to +-## administrate an sblim environment. ++## Transition to sblim named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sblim_filetrans_named_content',` ++ gen_require(` ++ type sblim_var_run_t; ++ ') ++ ++ files_pid_filetrans($1, sblim_var_run_t, dir, "gather") ++') ++ ++######################################## ++## ++## Connect to sblim_sfcb over a unix stream socket. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`sblim_stream_connect_sfcbd',` ++ gen_require(` ++ type sblim_sfcb_t, sblim_var_lib_t; ++ type sblim_tmp_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, sblim_var_lib_t, sblim_var_lib_t, sblim_sfcb_t) ++ stream_connect_pattern($1, sblim_var_lib_t, sblim_tmp_t, sblim_tmp_t) ++') ++ ++####################################### ++## ++## Getattr on sblim executable. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sblim_getattr_exec_sfcbd',` ++ gen_require(` ++ type sblim_sfcbd_exec_t; ++ ') ++ ++ allow $1 sblim_sfcbd_exec_t:file getattr; ++') ++ ++ ++######################################## ++## ++## Connect to sblim_sfcb over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sblim_stream_connect_sfcb',` ++ gen_require(` ++ type sblim_sfcb_t, sblim_var_lib_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, sblim_var_lib_t, sblim_var_lib_t, sblim_sfcb_t) ++') ++ ++####################################### ++## ++## Allow read and write access to sblim semaphores. ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. ++## ++## ++# ++interface(`sblim_rw_semaphores_sfcbd',` ++ gen_require(` ++ type sblim_sfcbd_t; ++ ') ++ ++ allow $1 sblim_sfcbd_t:sem rw_sem_perms; ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an gatherd environment ++## ++## ++## ++## Domain allowed access. + ## + ## + ## + # + interface(`sblim_admin',` + gen_require(` +- attribute sblim_domain; +- type sblim_initrc_exec_t, sblim_var_run_t; ++ type sblim_gatherd_t; ++ type sblim_reposd_t; ++ type sblim_var_run_t; + ') + +- allow $1 sblim_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, sblim_domain) ++ allow $1 sblim_gatherd_t:process signal_perms; ++ ps_process_pattern($1, sblim_gatherd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sblim_gatherd_t:process ptrace; ++ allow $1 sblim_reposd_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, sblim_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 sblim_initrc_exec_t system_r; +- allow $2 system_r; ++ allow $1 sblim_reposd_t:process signal_perms; ++ ps_process_pattern($1, sblim_reposd_t) + + files_search_pids($1) + admin_pattern($1, sblim_var_run_t) +diff --git a/sblim.te b/sblim.te +index 299756bc85..6a6dc53c71 100644 +--- a/sblim.te ++++ b/sblim.te +@@ -7,13 +7,11 @@ policy_module(sblim, 1.1.0) + + attribute sblim_domain; + +-type sblim_gatherd_t, sblim_domain; +-type sblim_gatherd_exec_t; +-init_daemon_domain(sblim_gatherd_t, sblim_gatherd_exec_t) ++sblim_domain_template(gatherd) + +-type sblim_reposd_t, sblim_domain; +-type sblim_reposd_exec_t; +-init_daemon_domain(sblim_reposd_t, sblim_reposd_exec_t) ++sblim_domain_template(reposd) ++ ++sblim_domain_template(sfcbd) + + type sblim_initrc_exec_t; + init_script_file(sblim_initrc_exec_t) +@@ -21,6 +19,15 @@ init_script_file(sblim_initrc_exec_t) + type sblim_var_run_t; + files_pid_file(sblim_var_run_t) + ++type sblim_var_lib_t; ++files_type(sblim_var_lib_t) ++ ++type sblim_tmp_t; ++files_tmp_file(sblim_tmp_t) ++ ++type sblim_sfcb_tmpfs_t; ++files_tmpfs_file(sblim_sfcb_tmpfs_t) ++ + ###################################### + # + # Common sblim domain local policy +@@ -31,32 +38,39 @@ allow sblim_domain self:tcp_socket create_stream_socket_perms; + manage_dirs_pattern(sblim_domain, sblim_var_run_t, sblim_var_run_t) + manage_files_pattern(sblim_domain, sblim_var_run_t, sblim_var_run_t) + manage_sock_files_pattern(sblim_domain, sblim_var_run_t, sblim_var_run_t) ++files_pid_filetrans(sblim_domain, sblim_var_run_t,dir,"gather") ++ ++manage_dirs_pattern(sblim_domain, sblim_var_lib_t, sblim_var_lib_t) ++manage_files_pattern(sblim_domain, sblim_var_lib_t, sblim_var_lib_t) ++manage_lnk_files_pattern(sblim_domain, sblim_var_lib_t, sblim_var_lib_t) ++files_var_lib_filetrans(sblim_domain, sblim_var_lib_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(sblim_domain, sblim_tmp_t, sblim_tmp_t) ++manage_files_pattern(sblim_domain, sblim_tmp_t, sblim_tmp_t) ++manage_sock_files_pattern(sblim_domain, sblim_tmp_t, sblim_tmp_t) ++files_tmp_filetrans(sblim_domain, sblim_tmp_t, { dir file sock_file}) + + kernel_read_network_state(sblim_domain) +-kernel_read_system_state(sblim_domain) ++kernel_read_sysctl(sblim_domain) + +-corenet_all_recvfrom_unlabeled(sblim_domain) +-corenet_all_recvfrom_netlabel(sblim_domain) + corenet_tcp_sendrecv_generic_if(sblim_domain) + corenet_tcp_sendrecv_generic_node(sblim_domain) + + corenet_tcp_sendrecv_repository_port(sblim_domain) + + dev_read_sysfs(sblim_domain) ++dev_read_rand(sblim_domain) ++dev_read_urand(sblim_domain) + +-logging_send_syslog_msg(sblim_domain) +- +-files_read_etc_files(sblim_domain) +- +-miscfiles_read_localization(sblim_domain) ++auth_read_passwd(sblim_domain) + + ######################################## + # + # Gatherd local policy + # + +-allow sblim_gatherd_t self:capability dac_override; +-allow sblim_gatherd_t self:process signal; ++allow sblim_gatherd_t self:capability { dac_read_search dac_override sys_nice sys_ptrace }; ++allow sblim_gatherd_t self:process { setsched signal }; + allow sblim_gatherd_t self:fifo_file rw_fifo_file_perms; + allow sblim_gatherd_t self:unix_stream_socket { accept listen }; + +@@ -82,8 +96,12 @@ fs_search_cgroup_dirs(sblim_gatherd_t) + storage_raw_read_fixed_disk(sblim_gatherd_t) + storage_raw_read_removable_device(sblim_gatherd_t) + ++auth_use_nsswitch(sblim_gatherd_t) ++ + init_read_utmp(sblim_gatherd_t) + ++logging_send_syslog_msg(sblim_gatherd_t) ++ + sysnet_dns_name_resolve(sblim_gatherd_t) + + term_getattr_pty_fs(sblim_gatherd_t) +@@ -103,8 +121,9 @@ optional_policy(` + ') + + optional_policy(` +- virt_getattr_virtd_exec_files(sblim_gatherd_t) ++ virt_read_config(sblim_gatherd_t) + virt_stream_connect(sblim_gatherd_t) ++ virt_getattr_exec(sblim_gatherd_t) + ') + + optional_policy(` +@@ -117,6 +136,64 @@ optional_policy(` + # Reposd local policy + # + ++corenet_tcp_bind_generic_node(sblim_reposd_t) ++ + corenet_sendrecv_repository_server_packets(sblim_reposd_t) + corenet_tcp_bind_repository_port(sblim_reposd_t) +-corenet_tcp_bind_generic_node(sblim_domain) ++ ++logging_send_syslog_msg(sblim_reposd_t) ++ ++####################################### ++# ++# Sfcbd local policy ++# ++ ++allow sblim_sfcbd_t self:capability { sys_ptrace setgid setuid }; ++allow sblim_sfcbd_t self:process signal; ++allow sblim_sfcbd_t self:unix_stream_socket connectto; ++ ++manage_dirs_pattern(sblim_sfcbd_t, sblim_sfcb_tmpfs_t, sblim_sfcb_tmpfs_t) ++manage_files_pattern(sblim_sfcbd_t, sblim_sfcb_tmpfs_t, sblim_sfcb_tmpfs_t) ++fs_tmpfs_filetrans(sblim_sfcbd_t, sblim_sfcb_tmpfs_t, { dir file }) ++allow sblim_sfcbd_t sblim_sfcb_tmpfs_t:file map; ++ ++auth_use_nsswitch(sblim_sfcbd_t) ++auth_domtrans_chkpwd(sblim_sfcbd_t) ++ ++corenet_tcp_bind_pegasus_http_port(sblim_sfcbd_t) ++corenet_tcp_connect_pegasus_http_port(sblim_sfcbd_t) ++corenet_tcp_bind_pegasus_https_port(sblim_sfcbd_t) ++corenet_tcp_connect_pegasus_https_port(sblim_sfcbd_t) ++ ++corenet_tcp_connect_http_port(sblim_sfcbd_t) ++ ++corecmd_exec_shell(sblim_sfcbd_t) ++corecmd_exec_bin(sblim_sfcbd_t) ++ ++dev_read_rand(sblim_sfcbd_t) ++dev_read_urand(sblim_sfcbd_t) ++ ++domain_read_all_domains_state(sblim_sfcbd_t) ++domain_use_interactive_fds(sblim_sfcbd_t) ++ ++logging_send_audit_msgs(sblim_sfcbd_t) ++ ++optional_policy(` ++ setroubleshoot_signull(sblim_sfcbd_t) ++') ++ ++optional_policy(` ++ rpm_exec(sblim_sfcbd_t) ++ rpm_dontaudit_manage_db(sblim_sfcbd_t) ++') ++ ++optional_policy(` ++ virt_manage_config(sblim_sfcbd_t) ++ virt_stream_connect(sblim_sfcbd_t) ++ virt_search_images(sblim_sfcbd_t) ++ virt_getattr_images(sblim_sfcbd_t) ++') ++ ++optional_policy(` ++ qemu_getattr_exec(sblim_sfcbd_t) ++') +diff --git a/screen.fc b/screen.fc +index e7c2cf74fa..435aaa61cf 100644 +--- a/screen.fc ++++ b/screen.fc +@@ -2,8 +2,10 @@ HOME_DIR/\.screen(/.*)? gen_context(system_u:object_r:screen_home_t,s0) + HOME_DIR/\.screenrc -- gen_context(system_u:object_r:screen_home_t,s0) + HOME_DIR/\.tmux\.conf -- gen_context(system_u:object_r:screen_home_t,s0) + +-/usr/bin/screen -- gen_context(system_u:object_r:screen_exec_t,s0) +-/usr/bin/tmux -- gen_context(system_u:object_r:screen_exec_t,s0) ++/root/\.screen(/.*)? gen_context(system_u:object_r:screen_home_t,s0) + +-/var/run/screen(/.*)? gen_context(system_u:object_r:screen_var_run_t,s0) +-/var/run/tmux(/.*)? gen_context(system_u:object_r:screen_var_run_t,s0) ++/usr/bin/screen -- gen_context(system_u:object_r:screen_exec_t,s0) ++/usr/bin/tmux -- gen_context(system_u:object_r:screen_exec_t,s0) ++ ++/var/run/screen(/.*)? gen_context(system_u:object_r:screen_var_run_t,s0) ++/var/run/tmux(/.*)? gen_context(system_u:object_r:screen_var_run_t,s0) +diff --git a/screen.if b/screen.if +index be5cce2d37..7b4d6294c3 100644 +--- a/screen.if ++++ b/screen.if +@@ -1,4 +1,4 @@ +-## GNU terminal multiplexer. ++## GNU terminal multiplexer + + ####################################### + ## +@@ -23,10 +23,9 @@ + # + template(`screen_role_template',` + gen_require(` +- attribute screen_domain; +- attribute_role screen_roles; + type screen_exec_t, screen_tmp_t; + type screen_home_t, screen_var_run_t; ++ attribute screen_domain; + ') + + ######################################## +@@ -35,50 +34,54 @@ template(`screen_role_template',` + # + + type $1_screen_t, screen_domain; +- userdom_user_application_domain($1_screen_t, screen_exec_t) ++ application_domain($1_screen_t, screen_exec_t) + domain_interactive_fd($1_screen_t) +- role screen_roles types $1_screen_t; ++ ubac_constrained($1_screen_t) ++ role $2 types $1_screen_t; + +- roleattribute $2 screen_roles; ++ tunable_policy(`deny_ptrace',`',` ++ allow $3 $1_screen_t:process ptrace; ++ ') + +- ######################################## +- # +- # Local policy +- # ++ userdom_home_reader($1_screen_t) + + domtrans_pattern($3, screen_exec_t, $1_screen_t) +- +- ps_process_pattern($3, $1_screen_t) +- allow $3 $1_screen_t:process { ptrace signal_perms }; +- ++ allow $3 $1_screen_t:process { signal sigchld }; + dontaudit $3 $1_screen_t:unix_stream_socket { read write }; ++ allow $1_screen_t $3:unix_stream_socket { connectto }; + allow $1_screen_t $3:process signal; ++ allow $3 screen_exec_t:file entrypoint; ++ ps_process_pattern($1_screen_t, $3) + +- allow $3 screen_tmp_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 screen_tmp_t:file { manage_file_perms relabel_file_perms }; +- allow $3 screen_tmp_t:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; +- +- allow $3 screen_home_t:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 screen_home_t:file { manage_file_perms relabel_file_perms }; +- allow $3 screen_home_t:fifo_file { manage_fifo_file_perms relabel_fifo_file_perms }; +- allow $3 screen_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; ++ manage_fifo_files_pattern($3, screen_home_t, screen_home_t) ++ manage_dirs_pattern($3, screen_home_t, screen_home_t) ++ manage_files_pattern($3, screen_home_t, screen_home_t) ++ manage_lnk_files_pattern($3, screen_home_t, screen_home_t) ++ relabel_dirs_pattern($3, screen_home_t, screen_home_t) ++ relabel_files_pattern($3, screen_home_t, screen_home_t) ++ relabel_lnk_files_pattern($3, screen_home_t, screen_home_t) + + userdom_user_home_dir_filetrans($3, screen_home_t, dir, ".screen") + userdom_user_home_dir_filetrans($3, screen_home_t, file, ".screenrc") + userdom_user_home_dir_filetrans($3, screen_home_t, file, ".tmux.conf") + + manage_dirs_pattern($3, screen_var_run_t, screen_var_run_t) +- manage_files_pattern($3, screen_var_run_t, screen_var_run_t) +- manage_lnk_files_pattern($3, screen_var_run_t, screen_var_run_t) + manage_fifo_files_pattern($3, screen_var_run_t, screen_var_run_t) ++ manage_sock_files_pattern($3, screen_var_run_t, screen_var_run_t) + +- corecmd_bin_domtrans($1_screen_t, $3) ++ kernel_read_system_state($1_screen_t) ++ ++ # Revert to the user domain when a shell is executed. + corecmd_shell_domtrans($1_screen_t, $3) ++ corecmd_bin_domtrans($1_screen_t, $3) + + auth_domtrans_chk_passwd($1_screen_t) + auth_use_nsswitch($1_screen_t) + ++ logging_send_syslog_msg($1_screen_t) ++ + userdom_user_home_domtrans($1_screen_t, $3) ++ userdom_manage_tmp_role($2, $1_screen_t) + + tunable_policy(`use_samba_home_dirs',` + fs_cifs_domtrans($1_screen_t, $3) +@@ -88,3 +91,41 @@ template(`screen_role_template',` + fs_nfs_domtrans($1_screen_t, $3) + ') + ') ++ ++####################################### ++## ++## Execute the rssh program ++## in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`screen_exec',` ++ gen_require(` ++ type screen_exec_t; ++ ') ++ ++ can_exec($1, screen_exec_t) ++') ++ ++######################################## ++## ++## Send a SIGCHLD signal to the screen domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`screen_sigchld',` ++ gen_require(` ++ attribute screen_domain; ++ ') ++ ++ allow $1 screen_domain:process sigchld; ++') ++ +diff --git a/screen.te b/screen.te +index 5466a73277..33598f3b33 100644 +--- a/screen.te ++++ b/screen.te +@@ -5,9 +5,7 @@ policy_module(screen, 2.6.0) + # Declarations + # + +-attribute screen_domain; +- +-attribute_role screen_roles; ++attribute screen_domain; + + type screen_exec_t; + application_executable_file(screen_exec_t) +@@ -17,11 +15,6 @@ typealias screen_home_t alias { user_screen_home_t staff_screen_home_t sysadm_sc + typealias screen_home_t alias { auditadm_screen_home_t secadm_screen_home_t }; + userdom_user_home_content(screen_home_t) + +-type screen_tmp_t; +-typealias screen_tmp_t alias { user_screen_tmp_t staff_screen_tmp_t sysadm_screen_tmp_t }; +-typealias screen_tmp_t alias { auditadm_screen_tmp_t secadm_screen_tmp_t }; +-userdom_user_tmp_file(screen_tmp_t) +- + type screen_var_run_t; + typealias screen_var_run_t alias { user_screen_var_run_t staff_screen_var_run_t sysadm_screen_var_run_t }; + typealias screen_var_run_t alias { auditadm_screen_var_run_t secadm_screen_var_run_t screen_dir_t }; +@@ -30,34 +23,35 @@ ubac_constrained(screen_var_run_t) + + ######################################## + # +-# Common screen domain local policy ++# Local policy + # + +-allow screen_domain self:capability { setuid setgid fsetid }; ++allow screen_domain self:capability { fsetid setgid setuid sys_tty_config }; ++dontaudit screen_domain self:capability { dac_read_search dac_override }; + allow screen_domain self:process signal_perms; +-allow screen_domain self:fd use; + allow screen_domain self:fifo_file rw_fifo_file_perms; +-allow screen_domain self:tcp_socket { accept listen }; +-allow screen_domain self:unix_stream_socket { accept connectto listen }; +- +-manage_dirs_pattern(screen_domain, screen_tmp_t, screen_tmp_t) +-manage_files_pattern(screen_domain, screen_tmp_t, screen_tmp_t) +-manage_fifo_files_pattern(screen_domain, screen_tmp_t, screen_tmp_t) +-files_tmp_filetrans(screen_domain, screen_tmp_t, { file dir }) +-filetrans_pattern(screen_domain, screen_tmp_t, screen_var_run_t, sock_file) ++allow screen_domain self:tcp_socket create_stream_socket_perms; ++allow screen_domain self:udp_socket create_socket_perms; ++# Internal screen networking ++allow screen_domain self:fd use; ++allow screen_domain self:unix_stream_socket { create_socket_perms connectto }; ++allow screen_domain self:unix_dgram_socket create_socket_perms; + ++# Create fifo + manage_fifo_files_pattern(screen_domain, screen_var_run_t, screen_var_run_t) + manage_dirs_pattern(screen_domain, screen_var_run_t, screen_var_run_t) + manage_sock_files_pattern(screen_domain, screen_var_run_t, screen_var_run_t) + files_pid_filetrans(screen_domain, screen_var_run_t, dir) + ++allow screen_domain screen_home_t:dir list_dir_perms; + manage_dirs_pattern(screen_domain, screen_home_t, screen_home_t) +-read_files_pattern(screen_domain, screen_home_t, screen_home_t) + manage_fifo_files_pattern(screen_domain, screen_home_t, screen_home_t) ++manage_sock_files_pattern(screen_domain, screen_home_t, screen_home_t) ++userdom_user_home_dir_filetrans(screen_domain, screen_home_t, dir) ++userdom_admin_home_dir_filetrans(screen_domain, screen_home_t, dir) ++read_files_pattern(screen_domain, screen_home_t, screen_home_t) + read_lnk_files_pattern(screen_domain, screen_home_t, screen_home_t) +-userdom_user_home_dir_filetrans(screen_domain, screen_home_t, dir, ".screen") + +-kernel_read_system_state(screen_domain) + kernel_read_kernel_sysctls(screen_domain) + + corecmd_list_bin(screen_domain) +@@ -66,55 +60,39 @@ corecmd_read_bin_symlinks(screen_domain) + corecmd_read_bin_pipes(screen_domain) + corecmd_read_bin_sockets(screen_domain) + +-corenet_all_recvfrom_unlabeled(screen_domain) +-corenet_all_recvfrom_netlabel(screen_domain) + corenet_tcp_sendrecv_generic_if(screen_domain) ++corenet_udp_sendrecv_generic_if(screen_domain) + corenet_tcp_sendrecv_generic_node(screen_domain) ++corenet_udp_sendrecv_generic_node(screen_domain) + corenet_tcp_sendrecv_all_ports(screen_domain) +- +-corenet_sendrecv_all_client_packets(screen_domain) ++corenet_udp_sendrecv_all_ports(screen_domain) + corenet_tcp_connect_all_ports(screen_domain) + + dev_dontaudit_getattr_all_chr_files(screen_domain) + dev_dontaudit_getattr_all_blk_files(screen_domain) ++# for SSP + dev_read_urand(screen_domain) + +-domain_use_interactive_fds(screen_domain) + domain_sigchld_interactive_fds(screen_domain) ++domain_use_interactive_fds(screen_domain) + domain_read_all_domains_state(screen_domain) + ++files_search_tmp(screen_domain) ++files_search_home(screen_domain) + files_list_home(screen_domain) +-files_read_usr_files(screen_domain) + + fs_search_auto_mountpoints(screen_domain) +-fs_getattr_all_fs(screen_domain) ++fs_getattr_xattr_fs(screen_domain) + + auth_dontaudit_read_shadow(screen_domain) + auth_dontaudit_exec_utempter(screen_domain) + ++# Write to utmp. + init_rw_utmp(screen_domain) + +-logging_send_syslog_msg(screen_domain) +- +-miscfiles_read_localization(screen_domain) +- + seutil_read_config(screen_domain) + + userdom_use_user_terminals(screen_domain) + userdom_create_user_pty(screen_domain) + userdom_setattr_user_ptys(screen_domain) + userdom_setattr_user_ttys(screen_domain) +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(screen_domain) +- fs_read_cifs_files(screen_domain) +- fs_manage_cifs_named_pipes(screen_domain) +- fs_read_cifs_symlinks(screen_domain) +-') +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(screen_domain) +- fs_read_nfs_files(screen_domain) +- fs_manage_nfs_named_pipes(screen_domain) +- fs_read_nfs_symlinks(screen_domain) +-') +diff --git a/sectoolm.fc b/sectoolm.fc +index 64a239453e..3f1dac59aa 100644 +--- a/sectoolm.fc ++++ b/sectoolm.fc +@@ -1,5 +1,4 @@ + /usr/libexec/sectool-mechanism\.py -- gen_context(system_u:object_r:sectoolm_exec_t,s0) + +-/var/lib/sectool(/.*)? gen_context(system_u:object_r:sectool_var_lib_t,s0) +- +-/var/log/sectool\.log.* -- gen_context(system_u:object_r:sectool_var_log_t,s0) ++/var/lib/sectool(/.*)? gen_context(system_u:object_r:sectool_var_lib_t,s0) ++/var/log/sectool\.log.* -- gen_context(system_u:object_r:sectool_var_log_t,s0) +diff --git a/sectoolm.if b/sectoolm.if +index c78a569c3b..9007451188 100644 +--- a/sectoolm.if ++++ b/sectoolm.if +@@ -1,24 +1,2 @@ +-## Sectool security audit tool. ++## Sectool security audit tool + +-######################################## +-## +-## Role access for sectoolm. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-interface(`sectoolm_role',` +- gen_require(` +- type sectoolm_t; +- ') +- +- allow sectoolm_t $2:unix_dgram_socket sendto; +-') +diff --git a/sectoolm.te b/sectoolm.te +index 4bc8c13eab..e05d74d48a 100644 +--- a/sectoolm.te ++++ b/sectoolm.te +@@ -7,7 +7,7 @@ policy_module(sectoolm, 1.1.0) + + type sectoolm_t; + type sectoolm_exec_t; +-init_system_domain(sectoolm_t, sectoolm_exec_t) ++init_daemon_domain(sectoolm_t, sectoolm_exec_t) + + type sectool_var_lib_t; + files_type(sectool_var_lib_t) +@@ -20,14 +20,14 @@ files_tmp_file(sectool_tmp_t) + + ######################################## + # +-# Local policy ++# sectool local policy + # + +-allow sectoolm_t self:capability { dac_override net_admin sys_nice }; ++allow sectoolm_t self:capability { dac_read_search dac_override net_admin sys_nice sys_ptrace }; + allow sectoolm_t self:process { getcap getsched signull setsched }; + dontaudit sectoolm_t self:process { execstack execmem }; + allow sectoolm_t self:fifo_file rw_fifo_file_perms; +-allow sectoolm_t self:unix_dgram_socket sendto; ++allow sectoolm_t self:unix_dgram_socket { create_socket_perms sendto }; + + manage_dirs_pattern(sectoolm_t, sectool_tmp_t, sectool_tmp_t) + manage_files_pattern(sectoolm_t, sectool_tmp_t, sectool_tmp_t) +@@ -37,7 +37,7 @@ manage_files_pattern(sectoolm_t, sectool_var_lib_t, sectool_var_lib_t) + manage_dirs_pattern(sectoolm_t, sectool_var_lib_t, sectool_var_lib_t) + files_var_lib_filetrans(sectoolm_t, sectool_var_lib_t, { file dir }) + +-allow sectoolm_t sectool_var_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(sectoolm_t, sectool_var_log_t, sectool_var_log_t) + logging_log_filetrans(sectoolm_t, sectool_var_log_t, file) + + kernel_read_net_sysctls(sectoolm_t) +@@ -65,6 +65,7 @@ fs_list_noxattr_fs(sectoolm_t) + + selinux_validate_context(sectoolm_t) + ++# tcp_wrappers test + application_exec_all(sectoolm_t) + + auth_use_nsswitch(sectoolm_t) +@@ -73,30 +74,36 @@ libs_exec_ld_so(sectoolm_t) + + logging_send_syslog_msg(sectoolm_t) + ++# tests related to network + sysnet_domtrans_ifconfig(sectoolm_t) + +-userdom_write_user_tmp_sockets(sectoolm_t) ++userdom_manage_user_tmp_sockets(sectoolm_t) ++userdom_dgram_send(sectoolm_t) + + optional_policy(` +- mount_exec(sectoolm_t) ++ dbus_system_domain(sectoolm_t, sectoolm_exec_t) + ') + + optional_policy(` +- dbus_system_domain(sectoolm_t, sectoolm_exec_t) ++ # tests related to network ++ hostname_exec(sectoolm_t) ++') + +- optional_policy(` +- policykit_dbus_chat(sectoolm_t) +- ') ++optional_policy(` ++ # tests related to network ++ iptables_domtrans(sectoolm_t) + ') + + optional_policy(` +- hostname_exec(sectoolm_t) ++ mount_exec(sectoolm_t) + ') + + optional_policy(` +- iptables_domtrans(sectoolm_t) ++ policykit_dbus_chat(sectoolm_t) + ') + ++# suid test using ++# rpm -Vf option + optional_policy(` + prelink_domtrans(sectoolm_t) + ') +diff --git a/sendmail.fc b/sendmail.fc +index d14b6bfc7b..da5d41d5c0 100644 +--- a/sendmail.fc ++++ b/sendmail.fc +@@ -1,7 +1,8 @@ +-/etc/rc\.d/init\.d/sendmail -- gen_context(system_u:object_r:sendmail_initrc_exec_t,s0) + +-/var/log/sendmail\.st.* -- gen_context(system_u:object_r:sendmail_log_t,s0) +-/var/log/mail(/.*)? gen_context(system_u:object_r:sendmail_log_t,s0) ++/etc/rc\.d/init\.d/sendmail -- gen_context(system_u:object_r:sendmail_initrc_exec_t,s0) + +-/var/run/sendmail\.pid -- gen_context(system_u:object_r:sendmail_var_run_t,s0) +-/var/run/sm-client\.pid -- gen_context(system_u:object_r:sendmail_var_run_t,s0) ++/var/log/sendmail\.st.* -- gen_context(system_u:object_r:sendmail_log_t,s0) ++/var/log/mail(/.*)? gen_context(system_u:object_r:sendmail_log_t,s0) ++ ++/var/run/sendmail\.pid -- gen_context(system_u:object_r:sendmail_var_run_t,s0) ++/var/run/sm-client\.pid -- gen_context(system_u:object_r:sendmail_var_run_t,s0) +diff --git a/sendmail.if b/sendmail.if +index 35ad2a733b..afdc7da29e 100644 +--- a/sendmail.if ++++ b/sendmail.if +@@ -1,4 +1,4 @@ +-## Internetwork email routing facility. ++## Policy for sendmail. + + ######################################## + ## +@@ -18,7 +18,8 @@ interface(`sendmail_stub',` + + ######################################## + ## +-## Read and write sendmail unnamed pipes. ++## Allow attempts to read and write to ++## sendmail unnamed pipes. + ## + ## + ## +@@ -36,7 +37,7 @@ interface(`sendmail_rw_pipes',` + + ######################################## + ## +-## Execute a domain transition to run sendmail. ++## Domain transition to sendmail. + ## + ## + ## +@@ -49,19 +50,30 @@ interface(`sendmail_domtrans',` + type sendmail_t; + ') + +- corecmd_search_bin($1) + mta_sendmail_domtrans($1, sendmail_t) ++') + +- allow sendmail_t $1:fd use; +- allow sendmail_t $1:fifo_file rw_fifo_file_perms; +- allow sendmail_t $1:process sigchld; ++####################################### ++## ++## Execute sendmail in the sendmail domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sendmail_initrc_domtrans',` ++ gen_require(` ++ type sendmail_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, sendmail_initrc_exec_t) + ') + + ######################################## + ## +-## Execute the sendmail program in the +-## sendmail domain, and allow the +-## specified role the sendmail domain. ++## Execute the sendmail program in the sendmail domain. + ## + ## + ## +@@ -70,7 +82,7 @@ interface(`sendmail_domtrans',` + ## + ## + ## +-## Role allowed access. ++## The role to allow the sendmail domain. + ## + ## + ## +@@ -81,7 +93,7 @@ interface(`sendmail_run',` + ') + + sendmail_domtrans($1) +- roleattribute $2 sendmail_roles; ++ roleattribute $2 sendmail_roles; + ') + + ######################################## +@@ -102,6 +114,53 @@ interface(`sendmail_signal',` + allow $1 sendmail_t:process signal; + ') + ++######################################## ++## ++## Execute sendmail in the sendmail_unconfined domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sendmail_domtrans_unconfined',` ++ gen_require(` ++ type unconfined_sendmail_t, sendmail_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, sendmail_exec_t, unconfined_sendmail_t) ++') ++ ++####################################### ++## ++## Execute sendmail in the unconfined ++## sendmail domain, and allow the ++## specified role the unconfined ++## sendmail domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`sendmail_run_unconfined',` ++ gen_require(` ++ attribute_role sendmail_unconfined_roles; ++ ') ++ ++ sendmail_domtrans_unconfined($1) ++ roleattribute $2 sendmail_unconfined_roles; ++') ++ + ######################################## + ## + ## Read and write sendmail TCP sockets. +@@ -141,8 +200,7 @@ interface(`sendmail_dontaudit_rw_tcp_sockets',` + + ######################################## + ## +-## Read and write sendmail unix +-## domain stream sockets. ++## Read and write sendmail unix_stream_sockets. + ## + ## + ## +@@ -179,7 +237,7 @@ interface(`sendmail_dontaudit_rw_unix_stream_sockets',` + + ######################################## + ## +-## Read sendmail log files. ++## Read sendmail logs. + ## + ## + ## +@@ -199,8 +257,7 @@ interface(`sendmail_read_log',` + + ######################################## + ## +-## Create, read, write, and delete +-## sendmail log files. ++## Create, read, write, and delete sendmail logs. + ## + ## + ## +@@ -220,8 +277,7 @@ interface(`sendmail_manage_log',` + + ######################################## + ## +-## Create specified objects in generic +-## log directories sendmail log file type. ++## Create sendmail logs with the correct type. + ## + ## + ## +@@ -231,7 +287,6 @@ interface(`sendmail_manage_log',` + # + interface(`sendmail_create_log',` + refpolicywarn(`$0($*) has been deprecated, use sendmail_log_filetrans_sendmail_log() instead.') +- sendmail_log_filetrans_sendmail_log($1, $2, $3) + ') + + ######################################## +@@ -265,8 +320,7 @@ interface(`sendmail_log_filetrans_sendmail_log',` + + ######################################## + ## +-## Create, read, write, and delete +-## sendmail tmp files. ++## Manage sendmail tmp files. + ## + ## + ## +@@ -285,58 +339,27 @@ interface(`sendmail_manage_tmp_files',` + + ######################################## + ## +-## Execute sendmail in the unconfined sendmail domain. +-## +-## +-## +-## Domain allowed to transition. +-## +-## +-# +-interface(`sendmail_domtrans_unconfined',` +- gen_require(` +- type unconfined_sendmail_t; +- ') +- +- mta_sendmail_domtrans($1, unconfined_sendmail_t) +- +- allow unconfined_sendmail_t $1:fd use; +- allow unconfined_sendmail_t $1:fifo_file rw_fifo_file_perms; +- allow unconfined_sendmail_t $1:process sigchld; +-') +- +-######################################## +-## +-## Execute sendmail in the unconfined +-## sendmail domain, and allow the +-## specified role the unconfined +-## sendmail domain. ++## Set the attributes of sendmail pid files. + ## + ## + ## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # +-interface(`sendmail_run_unconfined',` ++interface(`sendmail_setattr_pid_files',` + gen_require(` +- attribute_role sendmail_unconfined_roles; ++ type sendmail_var_run_t; + ') + +- sendmail_domtrans_unconfined($1) +- roleattribute $2 sendmail_unconfined_roles; ++ allow $1 sendmail_var_run_t:file setattr_file_perms; ++ files_search_pids($1) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an sendmail environment. ++## All of the rules required to administrate ++## an sendmail environment + ## + ## + ## +@@ -355,12 +378,17 @@ interface(`sendmail_admin',` + type sendmail_t, sendmail_initrc_exec_t, sendmail_log_t; + type sendmail_tmp_t, sendmail_var_run_t, unconfined_sendmail_t; + type sendmail_keytab_t; ++ type mail_spool_t; + ') + +- allow $1 { unconfined_sendmail_t sendmail_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { unconfined_sendmail_t sendmail_t }) ++ allow $1 sendmail_t:process signal_perms; ++ ps_process_pattern($1, sendmail_t) + +- init_labeled_script_domtrans($1, sendmail_initrc_exec_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sendmail_t:process ptrace; ++ ') ++ ++ sendmail_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 sendmail_initrc_exec_t system_r; + +@@ -376,6 +404,6 @@ interface(`sendmail_admin',` + files_list_pids($1) + admin_pattern($1, sendmail_var_run_t) + +- sendmail_run($1, $2) +- sendmail_run_unconfined($1, $2) ++ files_list_spool($1) ++ admin_pattern($1, mail_spool_t) + ') +diff --git a/sendmail.te b/sendmail.te +index 12700b4133..8ba2995151 100644 +--- a/sendmail.te ++++ b/sendmail.te +@@ -37,21 +37,23 @@ role sendmail_unconfined_roles types unconfined_sendmail_t; + + ######################################## + # +-# Local policy ++# Sendmail local policy + # + +-allow sendmail_t self:capability { dac_override setuid setgid sys_nice chown sys_tty_config }; ++allow sendmail_t self:capability { dac_read_search dac_override setuid setgid net_bind_service sys_nice chown sys_tty_config }; ++dontaudit sendmail_t self:capability net_admin; ++dontaudit sendmail_t self:capability2 block_suspend; + allow sendmail_t self:process { setsched setpgid setrlimit signal signull }; + allow sendmail_t self:fifo_file rw_fifo_file_perms; +-allow sendmail_t self:unix_stream_socket { accept listen }; +-allow sendmail_t self:tcp_socket { accept listen }; ++allow sendmail_t self:unix_stream_socket create_stream_socket_perms; ++allow sendmail_t self:unix_dgram_socket create_socket_perms; ++allow sendmail_t self:tcp_socket create_stream_socket_perms; ++allow sendmail_t self:udp_socket create_socket_perms; + ++allow sendmail_t sendmail_log_t:dir setattr_dir_perms; ++manage_files_pattern(sendmail_t, sendmail_log_t, sendmail_log_t) + allow sendmail_t sendmail_keytab_t:file read_file_perms; + +-allow sendmail_t sendmail_log_t:dir setattr_dir_perms; +-append_files_pattern(sendmail_t, sendmail_log_t, sendmail_log_t) +-create_files_pattern(sendmail_t, sendmail_log_t, sendmail_log_t) +-setattr_files_pattern(sendmail_t, sendmail_log_t, sendmail_log_t) + logging_log_filetrans(sendmail_t, sendmail_log_t, { file dir }) + + manage_dirs_pattern(sendmail_t, sendmail_tmp_t, sendmail_tmp_t) +@@ -63,33 +65,24 @@ files_pid_filetrans(sendmail_t, sendmail_var_run_t, file) + + kernel_read_network_state(sendmail_t) + kernel_read_kernel_sysctls(sendmail_t) ++# for piping mail to a command + kernel_read_system_state(sendmail_t) ++kernel_search_network_sysctl(sendmail_t) ++kernel_read_kernel_sysctls(sendmail_t) ++kernel_read_net_sysctls(sendmail_t) + +-corenet_all_recvfrom_unlabeled(sendmail_t) + corenet_all_recvfrom_netlabel(sendmail_t) + corenet_tcp_sendrecv_generic_if(sendmail_t) + corenet_tcp_sendrecv_generic_node(sendmail_t) + corenet_tcp_sendrecv_all_ports(sendmail_t) + corenet_tcp_bind_generic_node(sendmail_t) +- +-corenet_sendrecv_smtp_server_packets(sendmail_t) + corenet_tcp_bind_smtp_port(sendmail_t) +- +-corenet_sendrecv_all_client_packets(sendmail_t) + corenet_tcp_connect_all_ports(sendmail_t) ++corenet_sendrecv_smtp_server_packets(sendmail_t) ++corenet_sendrecv_smtp_client_packets(sendmail_t) + +-corecmd_exec_bin(sendmail_t) +-corecmd_exec_shell(sendmail_t) +- +-dev_read_sysfs(sendmail_t) + dev_read_urand(sendmail_t) +- +-domain_use_interactive_fds(sendmail_t) +- +-files_read_all_tmp_files(sendmail_t) +-files_read_etc_runtime_files(sendmail_t) +-files_read_usr_files(sendmail_t) +-files_search_spool(sendmail_t) ++dev_read_sysfs(sendmail_t) + + fs_getattr_all_fs(sendmail_t) + fs_search_auto_mountpoints(sendmail_t) +@@ -98,35 +91,49 @@ fs_rw_anon_inodefs_files(sendmail_t) + term_dontaudit_use_console(sendmail_t) + term_dontaudit_use_generic_ptys(sendmail_t) + ++# for piping mail to a command ++corecmd_exec_shell(sendmail_t) ++corecmd_exec_bin(sendmail_t) ++ ++domain_use_interactive_fds(sendmail_t) ++ ++files_search_spool(sendmail_t) ++# for piping mail to a command ++files_read_etc_runtime_files(sendmail_t) ++files_read_all_tmp_files(sendmail_t) ++ + init_use_fds(sendmail_t) + init_use_script_ptys(sendmail_t) ++# sendmail wants to read /var/run/utmp if the controlling tty is /dev/console + init_read_utmp(sendmail_t) + init_dontaudit_write_utmp(sendmail_t) + init_rw_script_tmp_files(sendmail_t) + + auth_use_nsswitch(sendmail_t) + ++# Read /usr/lib/sasl2/.* + libs_read_lib_files(sendmail_t) + + logging_send_syslog_msg(sendmail_t) + logging_dontaudit_write_generic_logs(sendmail_t) + + miscfiles_read_generic_certs(sendmail_t) +-miscfiles_read_localization(sendmail_t) + + userdom_dontaudit_use_unpriv_user_fds(sendmail_t) ++userdom_read_user_home_content_files(sendmail_t) ++userdom_dontaudit_list_user_home_dirs(sendmail_t) + +-mta_etc_filetrans_aliases(sendmail_t, file, "aliases") +-mta_etc_filetrans_aliases(sendmail_t, file, "aliases.db") +-mta_etc_filetrans_aliases(sendmail_t, file, "aliasesdb-stamp") ++mta_read_config(sendmail_t) ++mta_etc_filetrans_aliases(sendmail_t) ++# Write to /etc/aliases and /etc/mail. + mta_manage_aliases(sendmail_t) ++# Write to /var/spool/mail and /var/spool/mqueue. + mta_manage_queue(sendmail_t) + mta_manage_spool(sendmail_t) +-mta_read_config(sendmail_t) + mta_sendmail_exec(sendmail_t) + + optional_policy(` +- cfengine_dontaudit_write_log_files(sendmail_t) ++ cfengine_dontaudit_write_log(sendmail_t) + ') + + optional_policy(` +@@ -134,8 +141,8 @@ optional_policy(` + ') + + optional_policy(` +- clamav_search_lib(sendmail_t) +- clamav_stream_connect(sendmail_t) ++ antivirus_search_db(sendmail_t) ++ antivirus_stream_connect(sendmail_t) + ') + + optional_policy(` +@@ -163,6 +170,10 @@ optional_policy(` + kerberos_use(sendmail_t) + ') + ++optional_policy(` ++ inn_write_inherited_news_lib(sendmail_t) ++') ++ + optional_policy(` + milter_stream_connect_all(sendmail_t) + ') +@@ -171,6 +182,11 @@ optional_policy(` + munin_dontaudit_search_lib(sendmail_t) + ') + ++optional_policy(` ++ openshift_dontaudit_rw_inherited_fifo_files(sendmail_t) ++ openshift_rw_inherited_content(sendmail_t) ++') ++ + optional_policy(` + postfix_domtrans_postdrop(sendmail_t) + postfix_domtrans_master(sendmail_t) +@@ -192,6 +208,10 @@ optional_policy(` + sasl_connect(sendmail_t) + ') + ++optional_policy(` ++ spamd_stream_connect(sendmail_t) ++') ++ + optional_policy(` + udev_read_db(sendmail_t) + ') +@@ -206,8 +226,6 @@ optional_policy(` + # + + optional_policy(` +- mta_etc_filetrans_aliases(unconfined_sendmail_t, file, "aliases") +- mta_etc_filetrans_aliases(unconfined_sendmail_t, file, "aliases.db") +- mta_etc_filetrans_aliases(unconfined_sendmail_t, file, "aliasesdb-stamp") ++ mta_filetrans_named_content(unconfined_sendmail_t) + unconfined_domain(unconfined_sendmail_t) + ') +diff --git a/sensord.fc b/sensord.fc +index 8185d5a6be..9be989a082 100644 +--- a/sensord.fc ++++ b/sensord.fc +@@ -1,5 +1,9 @@ ++/lib/systemd/system/sensord.service -- gen_context(system_u:object_r:sensord_unit_file_t,s0) ++ + /etc/rc\.d/init\.d/sensord -- gen_context(system_u:object_r:sensord_initrc_exec_t,s0) + + /usr/sbin/sensord -- gen_context(system_u:object_r:sensord_exec_t,s0) + ++/var/log/sensor.* gen_context(system_u:object_r:sensord_log_t,s0) ++ + /var/run/sensord\.pid -- gen_context(system_u:object_r:sensord_var_run_t,s0) +diff --git a/sensord.if b/sensord.if +index d204752b3a..85631b346f 100644 +--- a/sensord.if ++++ b/sensord.if +@@ -1,35 +1,81 @@ +-## Sensor information logging daemon. ++ ++## Sensor information logging daemon + + ######################################## + ## +-## All of the rules required to +-## administrate an sensord environment. ++## Execute sensord in the sensord domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sensord_domtrans',` ++ gen_require(` ++ type sensord_t, sensord_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, sensord_exec_t, sensord_t) ++') ++######################################## ++## ++## Execute sensord server in the sensord domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed to transition. + ## + ## +-## ++# ++interface(`sensord_systemctl',` ++ gen_require(` ++ type sensord_t; ++ type sensord_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 sensord_unit_file_t:file read_file_perms; ++ allow $1 sensord_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sensord_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an sensord environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## + ## + # + interface(`sensord_admin',` + gen_require(` +- type sensord_t, sensord_initrc_exec_t, sensord_var_run_t; ++ type sensord_t; ++ type sensord_unit_file_t; ++ type sensord_log_t; ++ type sensord_var_run_t; + ') + + allow $1 sensord_t:process { ptrace signal_perms }; + ps_process_pattern($1, sensord_t) + +- init_labeled_script_domtrans($1, sensord_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 sensord_initrc_exec_t system_r; +- allow $2 system_r; ++ sensord_systemctl($1) ++ admin_pattern($1, sensord_unit_file_t) ++ allow $1 sensord_unit_file_t:service all_service_perms; + +- files_search_pids($1) ++ admin_pattern($1, sensord_log_t) + admin_pattern($1, sensord_var_run_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/sensord.te b/sensord.te +index 5e82fd616c..ddb249dfbe 100644 +--- a/sensord.te ++++ b/sensord.te +@@ -9,27 +9,38 @@ type sensord_t; + type sensord_exec_t; + init_daemon_domain(sensord_t, sensord_exec_t) + ++type sensord_unit_file_t; ++systemd_unit_file(sensord_unit_file_t) ++ + type sensord_initrc_exec_t; + init_script_file(sensord_initrc_exec_t) + + type sensord_var_run_t; + files_pid_file(sensord_var_run_t) + ++type sensord_log_t; ++logging_log_file(sensord_log_t) ++ + ######################################## + # + # Local policy + # + ++allow sensord_t self:process { signal execmem }; ++ + allow sensord_t self:fifo_file rw_fifo_file_perms; + allow sensord_t self:unix_stream_socket create_stream_socket_perms; + ++manage_files_pattern(sensord_t, sensord_log_t, sensord_log_t) ++logging_log_filetrans(sensord_t, sensord_log_t, file) ++ + manage_files_pattern(sensord_t, sensord_var_run_t, sensord_var_run_t) + files_pid_filetrans(sensord_t, sensord_var_run_t, file) + +-dev_read_sysfs(sensord_t) ++kernel_read_system_state(sensord_t) + +-files_read_etc_files(sensord_t) ++dev_read_sysfs(sensord_t) ++dev_getattr_sysfs_fs(sensord_t) + + logging_send_syslog_msg(sensord_t) + +-miscfiles_read_localization(sensord_t) +diff --git a/setroubleshoot.fc b/setroubleshoot.fc +index 0b3a971f4d..397a5225b0 100644 +--- a/setroubleshoot.fc ++++ b/setroubleshoot.fc +@@ -1,9 +1,9 @@ + /usr/sbin/setroubleshootd -- gen_context(system_u:object_r:setroubleshootd_exec_t,s0) + +-/usr/share/setroubleshoot/SetroubleshootFixit\.py* -- gen_context(system_u:object_r:setroubleshoot_fixit_exec_t,s0) ++/usr/share/setroubleshoot/SetroubleshootFixit\.py* -- gen_context(system_u:object_r:setroubleshoot_fixit_exec_t,s0) + +-/var/run/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_run_t,s0) ++/var/run/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_run_t,s0) + +-/var/log/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_log_t,s0) ++/var/log/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_log_t,s0) + +-/var/lib/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_lib_t,s0) ++/var/lib/setroubleshoot(/.*)? gen_context(system_u:object_r:setroubleshoot_var_lib_t,s0) +diff --git a/setroubleshoot.if b/setroubleshoot.if +index 3a9a70befb..903109c987 100644 +--- a/setroubleshoot.if ++++ b/setroubleshoot.if +@@ -1,9 +1,8 @@ +-## SELinux troubleshooting service. ++## SELinux troubleshooting service + + ######################################## + ## +-## Connect to setroubleshootd with a +-## unix domain stream socket. ++## Connect to setroubleshootd over a unix stream socket. + ## + ## + ## +@@ -23,9 +22,8 @@ interface(`setroubleshoot_stream_connect',` + + ######################################## + ## +-## Do not audit attempts to connect to +-## setroubleshootd with a unix +-## domain stream socket. ++## Dontaudit attempts to connect to setroubleshootd ++## over a unix stream socket. + ## + ## + ## +@@ -42,6 +40,24 @@ interface(`setroubleshoot_dontaudit_stream_connect',` + dontaudit $1 setroubleshootd_t:unix_stream_socket connectto; + ') + ++####################################### ++## ++## Send null signals to setroubleshoot. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`setroubleshoot_signull',` ++ gen_require(` ++ type setroubleshootd_t; ++ ') ++ ++ allow $1 setroubleshootd_t:process signull; ++') ++ + ######################################## + ## + ## Send and receive messages from +@@ -107,8 +123,27 @@ interface(`setroubleshoot_dbus_chat_fixit',` + + ######################################## + ## +-## All of the rules required to +-## administrate an setroubleshoot environment. ++## Dontaudit read/write to a setroubleshoot leaked sockets. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`setroubleshoot_fixit_dontaudit_leaks',` ++ gen_require(` ++ type setroubleshoot_fixit_t; ++ ') ++ ++ dontaudit $1 setroubleshoot_fixit_t:unix_dgram_socket { read write }; ++ dontaudit $1 setroubleshoot_fixit_t:unix_stream_socket { read write }; ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an setroubleshoot environment + ## + ## + ## +@@ -119,12 +154,15 @@ interface(`setroubleshoot_dbus_chat_fixit',` + # + interface(`setroubleshoot_admin',` + gen_require(` +- type setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_fixit_t; +- type setroubleshoot_var_lib_t, setroubleshoot_var_run_t; ++ type setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_run_t; ++ type setroubleshoot_var_lib_t; + ') + +- allow $1 { setroubleshoot_fixit_t setroubleshootd_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { setroubleshootd_t setroubleshoot_fixit_t }) ++ allow $1 setroubleshootd_t:process signal_perms; ++ ps_process_pattern($1, setroubleshootd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 setroubleshootd_t:process ptrace; ++ ') + + logging_list_logs($1) + admin_pattern($1, setroubleshoot_var_log_t) +diff --git a/setroubleshoot.te b/setroubleshoot.te +index ce6793506e..130eca9f16 100644 +--- a/setroubleshoot.te ++++ b/setroubleshoot.te +@@ -7,43 +7,52 @@ policy_module(setroubleshoot, 1.12.1) + + type setroubleshootd_t alias setroubleshoot_t; + type setroubleshootd_exec_t; +-init_system_domain(setroubleshootd_t, setroubleshootd_exec_t) ++domain_type(setroubleshootd_t) ++init_daemon_domain(setroubleshootd_t, setroubleshootd_exec_t) + + type setroubleshoot_fixit_t; + type setroubleshoot_fixit_exec_t; +-init_system_domain(setroubleshoot_fixit_t, setroubleshoot_fixit_exec_t) ++init_daemon_domain(setroubleshoot_fixit_t, setroubleshoot_fixit_exec_t) + + type setroubleshoot_var_lib_t; + files_type(setroubleshoot_var_lib_t) + ++# log files + type setroubleshoot_var_log_t; + logging_log_file(setroubleshoot_var_log_t) + ++# pid files + type setroubleshoot_var_run_t; + files_pid_file(setroubleshoot_var_run_t) + + ######################################## + # +-# Local policy ++# setroubleshootd local policy + # + +-allow setroubleshootd_t self:capability { dac_override sys_nice sys_ptrace sys_tty_config }; +-allow setroubleshootd_t self:process { getattr getsched setsched sigkill signull signal execmem execstack }; ++allow setroubleshootd_t self:capability { sys_nice sys_ptrace sys_tty_config }; ++dontaudit setroubleshootd_t self:capability net_admin; ++ ++allow setroubleshootd_t self:process { getattr getsched setsched sigkill signull signal }; ++# if bad library causes setroubleshoot to require these, we want to give it so setroubleshoot can continue to run ++allow setroubleshootd_t self:process { execmem execstack }; + allow setroubleshootd_t self:fifo_file rw_fifo_file_perms; +-allow setroubleshootd_t self:tcp_socket { accept listen }; +-allow setroubleshootd_t self:unix_stream_socket { accept connectto listen }; ++allow setroubleshootd_t self:tcp_socket create_stream_socket_perms; ++allow setroubleshootd_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow setroubleshootd_t self:unix_dgram_socket create_socket_perms; + +-allow setroubleshootd_t setroubleshoot_var_lib_t:dir setattr_dir_perms; ++# database files ++allow setroubleshootd_t setroubleshoot_var_lib_t:dir setattr; + manage_files_pattern(setroubleshootd_t, setroubleshoot_var_lib_t, setroubleshoot_var_lib_t) + files_var_lib_filetrans(setroubleshootd_t, setroubleshoot_var_lib_t, { file dir }) + +-allow setroubleshootd_t setroubleshoot_var_log_t:dir setattr_dir_perms; +-append_files_pattern(setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_log_t) +-create_files_pattern(setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_log_t) +-setattr_files_pattern(setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_log_t) ++# log files ++allow setroubleshootd_t setroubleshoot_var_log_t:dir setattr; ++manage_files_pattern(setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_log_t) + manage_sock_files_pattern(setroubleshootd_t, setroubleshoot_var_log_t, setroubleshoot_var_log_t) + logging_log_filetrans(setroubleshootd_t, setroubleshoot_var_log_t, { file dir }) + ++# pid file + manage_dirs_pattern(setroubleshootd_t, setroubleshoot_var_run_t, setroubleshoot_var_run_t) + manage_files_pattern(setroubleshootd_t, setroubleshoot_var_run_t, setroubleshoot_var_run_t) + manage_sock_files_pattern(setroubleshootd_t, setroubleshoot_var_run_t, setroubleshoot_var_run_t) +@@ -55,20 +64,20 @@ kernel_read_net_sysctls(setroubleshootd_t) + kernel_read_network_state(setroubleshootd_t) + kernel_dontaudit_list_all_proc(setroubleshootd_t) + kernel_read_irq_sysctls(setroubleshootd_t) ++kernel_read_rpc_sysctls(setroubleshootd_t) + kernel_read_unlabeled_state(setroubleshootd_t) + + corecmd_exec_bin(setroubleshootd_t) + corecmd_exec_shell(setroubleshootd_t) + corecmd_read_all_executables(setroubleshootd_t) + +-corenet_all_recvfrom_unlabeled(setroubleshootd_t) + corenet_all_recvfrom_netlabel(setroubleshootd_t) + corenet_tcp_sendrecv_generic_if(setroubleshootd_t) + corenet_tcp_sendrecv_generic_node(setroubleshootd_t) +- +-corenet_sendrecv_smtp_client_packets(setroubleshootd_t) ++corenet_tcp_sendrecv_all_ports(setroubleshootd_t) ++corenet_tcp_bind_generic_node(setroubleshootd_t) + corenet_tcp_connect_smtp_port(setroubleshootd_t) +-corenet_tcp_sendrecv_smtp_port(setroubleshootd_t) ++corenet_sendrecv_smtp_client_packets(setroubleshootd_t) + + dev_read_urand(setroubleshootd_t) + dev_read_sysfs(setroubleshootd_t) +@@ -76,10 +85,9 @@ dev_getattr_all_blk_files(setroubleshootd_t) + dev_getattr_all_chr_files(setroubleshootd_t) + dev_getattr_mtrr_dev(setroubleshootd_t) + +-domain_dontaudit_search_all_domains_state(setroubleshootd_t) ++domain_read_all_domains_state(setroubleshootd_t) + domain_signull_all_domains(setroubleshootd_t) + +-files_read_usr_files(setroubleshootd_t) + files_list_all(setroubleshootd_t) + files_getattr_all_files(setroubleshootd_t) + files_getattr_all_pipes(setroubleshootd_t) +@@ -109,37 +117,42 @@ init_read_utmp(setroubleshootd_t) + init_dontaudit_write_utmp(setroubleshootd_t) + + libs_exec_ld_so(setroubleshootd_t) ++libs_exec_ldconfig(setroubleshootd_t) + + locallogin_dontaudit_use_fds(setroubleshootd_t) + + logging_send_audit_msgs(setroubleshootd_t) + logging_send_syslog_msg(setroubleshootd_t) + logging_stream_connect_dispatcher(setroubleshootd_t) ++logging_stream_connect_syslog(setroubleshootd_t) + +-miscfiles_read_localization(setroubleshootd_t) +- ++seutil_read_bin_policy(setroubleshootd_t) + seutil_read_config(setroubleshootd_t) ++seutil_read_default_contexts(setroubleshootd_t) + seutil_read_file_contexts(setroubleshootd_t) +-seutil_read_bin_policy(setroubleshootd_t) + + userdom_dontaudit_read_user_home_content_files(setroubleshootd_t) + + optional_policy(` +- dbus_system_domain(setroubleshootd_t, setroubleshootd_exec_t) +- +- optional_policy(` +- abrt_dbus_chat(setroubleshootd_t) +- ') ++ abrt_dbus_chat(setroubleshootd_t) + ') + + optional_policy(` + locate_read_lib_files(setroubleshootd_t) + ') + ++optional_policy(` ++ mock_getattr_lib(setroubleshootd_t) ++') ++ + optional_policy(` + modutils_read_module_config(setroubleshootd_t) + ') + ++optional_policy(` ++ dbus_system_domain(setroubleshootd_t, setroubleshootd_exec_t) ++') ++ + optional_policy(` + rpm_exec(setroubleshootd_t) + rpm_signull(setroubleshootd_t) +@@ -150,26 +163,36 @@ optional_policy(` + + ######################################## + # +-# Fixit local policy ++# setroubleshoot_fixit local policy + # + + allow setroubleshoot_fixit_t self:capability sys_nice; + allow setroubleshoot_fixit_t self:process { setsched getsched }; ++dontaudit setroubleshoot_fixit_t self:process execmem; + allow setroubleshoot_fixit_t self:fifo_file rw_fifo_file_perms; ++allow setroubleshoot_fixit_t self:unix_dgram_socket create_socket_perms; + + allow setroubleshoot_fixit_t setroubleshootd_t:process signull; + ++setroubleshoot_dbus_chat(setroubleshoot_fixit_t) + setroubleshoot_stream_connect(setroubleshoot_fixit_t) + + kernel_read_system_state(setroubleshoot_fixit_t) ++kernel_read_network_state(setroubleshoot_fixit_t) + + corecmd_exec_bin(setroubleshoot_fixit_t) + corecmd_exec_shell(setroubleshoot_fixit_t) + corecmd_getattr_all_executables(setroubleshoot_fixit_t) + ++dev_read_sysfs(setroubleshoot_fixit_t) ++dev_read_urand(setroubleshoot_fixit_t) ++ ++selinux_read_policy(setroubleshoot_fixit_t) ++ + seutil_domtrans_setfiles(setroubleshoot_fixit_t) ++seutil_domtrans_setsebool(setroubleshoot_fixit_t) ++seutil_read_module_store(setroubleshoot_fixit_t) + +-files_read_usr_files(setroubleshoot_fixit_t) + files_list_tmp(setroubleshoot_fixit_t) + + auth_use_nsswitch(setroubleshoot_fixit_t) +@@ -177,23 +200,26 @@ auth_use_nsswitch(setroubleshoot_fixit_t) + logging_send_audit_msgs(setroubleshoot_fixit_t) + logging_send_syslog_msg(setroubleshoot_fixit_t) + +-miscfiles_read_localization(setroubleshoot_fixit_t) +- +-userdom_read_all_users_state(setroubleshoot_fixit_t) ++userdom_dontaudit_search_admin_dir(setroubleshoot_fixit_t) + userdom_signull_unpriv_users(setroubleshoot_fixit_t) + + optional_policy(` + dbus_system_domain(setroubleshoot_fixit_t, setroubleshoot_fixit_exec_t) +- setroubleshoot_dbus_chat(setroubleshoot_fixit_t) ++') + +- optional_policy(` +- policykit_dbus_chat(setroubleshoot_fixit_t) +- ') ++optional_policy(` ++ gnome_dontaudit_search_config(setroubleshoot_fixit_t) + ') + + optional_policy(` ++ rpm_exec(setroubleshoot_fixit_t) + rpm_signull(setroubleshoot_fixit_t) + rpm_read_db(setroubleshoot_fixit_t) + rpm_dontaudit_manage_db(setroubleshoot_fixit_t) + rpm_use_script_fds(setroubleshoot_fixit_t) + ') ++ ++optional_policy(` ++ policykit_dbus_chat(setroubleshoot_fixit_t) ++ userdom_read_all_users_state(setroubleshoot_fixit_t) ++') +diff --git a/sge.fc b/sge.fc +new file mode 100644 +index 0000000000..160ddc2b8a +--- /dev/null ++++ b/sge.fc +@@ -0,0 +1,6 @@ ++ ++/usr/bin/sge_execd -- gen_context(system_u:object_r:sge_execd_exec_t,s0) ++/usr/bin/sge_shepherd -- gen_context(system_u:object_r:sge_shepherd_exec_t,s0) ++ ++/var/spool/gridengine(/.*)? gen_context(system_u:object_r:sge_spool_t,s0) ++ +diff --git a/sge.if b/sge.if +new file mode 100644 +index 0000000000..30f0ec3526 +--- /dev/null ++++ b/sge.if +@@ -0,0 +1,43 @@ ++## Policy for gridengine MPI jobs ++ ++###################################### ++## ++## Creates types and rules for a basic ++## sge domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`sge_basic_types_template',` ++ gen_require(` ++ attribute sge_domain; ++ ') ++ ++ type $1_t, sge_domain; ++ type $1_exec_t; ++ ++ kernel_read_system_state($1_t) ++') ++ ++######################################## ++## ++## read/write sge_shepherd per tcp_socket ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sge_rw_tcp_sockets',` ++ gen_require(` ++ type sge_shepherd_t; ++ type sge_job_ssh_t; ++ ') ++ ++ allow $1 sge_shepherd_t:tcp_socket rw_socket_perms; ++ allow $1 sge_job_ssh_t:tcp_socket rw_socket_perms; ++') +diff --git a/sge.te b/sge.te +new file mode 100644 +index 0000000000..ba26713d2b +--- /dev/null ++++ b/sge.te +@@ -0,0 +1,203 @@ ++policy_module(sge, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow sge to access nfs file systems. ++##

      ++##
      ++gen_tunable(sge_use_nfs, false) ++ ++## ++##

      ++## Allow sge to connect to the network using any TCP port ++##

      ++##
      ++gen_tunable(sge_domain_can_network_connect, false) ++ ++attribute sge_domain; ++ ++sge_basic_types_template(sge_execd) ++init_daemon_domain(sge_execd_t, sge_execd_exec_t) ++ ++type sge_spool_t; ++files_type(sge_spool_t) ++ ++type sge_tmp_t; ++files_tmp_file(sge_tmp_t) ++ ++sge_basic_types_template(sge_shepherd) ++application_domain(sge_shepherd_t, sge_shepherd_exec_t) ++role system_r types sge_shepherd_t; ++ ++sge_basic_types_template(sge_job) ++application_domain(sge_job_t, sge_job_exec_t) ++corecmd_shell_entry_type(sge_job_t) ++role system_r types sge_job_t; ++ ++####################################### ++# ++# sge_execd local policy ++# ++ ++allow sge_execd_t self:capability { dac_read_search dac_override kill setuid chown setgid }; ++allow sge_execd_t self:process { setsched signal setpgid }; ++ ++allow sge_execd_t sge_shepherd_t:process signal; ++ ++ ++relabelfrom_files_pattern(sge_execd_t, sge_tmp_t, sge_tmp_t) ++ ++kernel_read_kernel_sysctls(sge_execd_t) ++ ++corenet_tcp_bind_sge_port(sge_execd_t) ++corenet_tcp_connect_sge_port(sge_execd_t) ++ ++dev_read_sysfs(sge_execd_t) ++ ++files_exec_usr_files(sge_execd_t) ++files_search_spool(sge_execd_t) ++ ++fs_getattr_xattr_fs(sge_execd_t) ++fs_read_cgroup_files(sge_execd_t) ++ ++auth_use_nsswitch(sge_execd_t) ++ ++libs_exec_ld_so(sge_execd_t) ++ ++logging_send_syslog_msg(sge_execd_t) ++ ++init_read_utmp(sge_execd_t) ++ ++userdom_relabel_user_tmp_files(sge_execd_t) ++ ++optional_policy(` ++ sendmail_domtrans(sge_execd_t) ++') ++ ++###################################### ++# ++# sge_shepherd local policy ++# ++ ++allow sge_shepherd_t self:capability { setuid sys_nice chown kill setgid dac_read_search dac_override }; ++allow sge_shepherd_t self:process { setsched setrlimit setpgid }; ++allow sge_shepherd_t self:process signal_perms; ++ ++domtrans_pattern(sge_execd_t, sge_shepherd_exec_t, sge_shepherd_t) ++ ++kernel_read_sysctl(sge_shepherd_t) ++kernel_read_kernel_sysctls(sge_shepherd_t) ++ ++dev_read_sysfs(sge_shepherd_t) ++ ++fs_getattr_all_fs(sge_shepherd_t) ++ ++logging_send_syslog_msg(sge_shepherd_t) ++ ++optional_policy(` ++ mta_send_mail(sge_shepherd_t) ++') ++ ++optional_policy(` ++ ssh_domtrans(sge_shepherd_t) ++') ++ ++optional_policy(` ++ unconfined_domain(sge_shepherd_t) ++') ++ ++##################################### ++# ++# sge_job local policy ++# ++ ++allow sge_shepherd_t sge_job_t:process signal_perms; ++ ++corecmd_shell_domtrans(sge_shepherd_t, sge_job_t) ++ ++kernel_read_kernel_sysctls(sge_job_t) ++ ++term_use_all_terms(sge_job_t) ++ ++logging_send_syslog_msg(sge_job_t) ++ ++optional_policy(` ++ ssh_basic_client_template(sge_job, sge_job_t, system_r) ++ ssh_domtrans(sge_job_t) ++ ++ allow sge_job_t sge_job_ssh_t:process sigkill; ++ allow sge_shepherd_t sge_job_ssh_t:process sigkill; ++ ++ xserver_exec_xauth(sge_job_ssh_t) ++ ++ tunable_policy(`sge_use_nfs',` ++ fs_list_auto_mountpoints(sge_job_ssh_t) ++ fs_manage_nfs_dirs(sge_job_ssh_t) ++ fs_manage_nfs_files(sge_job_ssh_t) ++ fs_read_nfs_symlinks(sge_job_ssh_t) ++ ') ++ ') ++ ++optional_policy(` ++ xserver_domtrans_xauth(sge_job_t) ++') ++ ++optional_policy(` ++ unconfined_domain(sge_job_t) ++') ++ ++##################################### ++# ++# sge_domain local policy ++# ++ ++allow sge_domain self:fifo_file rw_fifo_file_perms; ++allow sge_domain self:tcp_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(sge_domain, sge_spool_t, sge_spool_t) ++manage_files_pattern(sge_domain, sge_spool_t, sge_spool_t) ++manage_lnk_files_pattern(sge_domain, sge_spool_t, sge_spool_t) ++ ++manage_files_pattern(sge_domain, sge_tmp_t, sge_tmp_t) ++manage_lnk_files_pattern(sge_domain, sge_tmp_t, sge_tmp_t) ++manage_dirs_pattern(sge_domain, sge_tmp_t, sge_tmp_t) ++files_tmp_filetrans(sge_domain, sge_tmp_t, { file dir }) ++ ++kernel_read_network_state(sge_domain) ++ ++corecmd_exec_bin(sge_domain) ++corecmd_exec_shell(sge_domain) ++ ++domain_read_all_domains_state(sge_domain) ++ ++ ++dev_read_urand(sge_domain) ++ ++tunable_policy(`sge_domain_can_network_connect',` ++ corenet_tcp_connect_all_ports(sge_domain) ++') ++ ++tunable_policy(`sge_use_nfs',` ++ fs_list_auto_mountpoints(sge_domain) ++ fs_manage_nfs_dirs(sge_domain) ++ fs_manage_nfs_files(sge_domain) ++ fs_read_nfs_symlinks(sge_domain) ++ fs_exec_nfs_files(sge_domain) ++') ++ ++optional_policy(` ++ sysnet_dns_name_resolve(sge_domain) ++') ++ ++optional_policy(` ++ hostname_exec(sge_domain) ++') ++ ++optional_policy(` ++ nslcd_stream_connect(sge_domain) ++') +diff --git a/shorewall.if b/shorewall.if +index 1aeef8ac39..d5ce40a96d 100644 +--- a/shorewall.if ++++ b/shorewall.if +@@ -1,4 +1,4 @@ +-## Shoreline Firewall high-level tool for configuring netfilter. ++## Shoreline Firewall high-level tool for configuring netfilter + + ######################################## + ## +@@ -15,7 +15,6 @@ interface(`shorewall_domtrans',` + type shorewall_t, shorewall_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, shorewall_exec_t, shorewall_t) + ') + +@@ -34,13 +33,12 @@ interface(`shorewall_lib_domtrans',` + type shorewall_t, shorewall_var_lib_t; + ') + +- files_search_var_lib($1) + domtrans_pattern($1, shorewall_var_lib_t, shorewall_t) + ') + + ####################################### + ## +-## Read shorewall configuration files. ++## Read shorewall etc configuration files. + ## + ## + ## +@@ -57,47 +55,9 @@ interface(`shorewall_read_config',` + read_files_pattern($1, shorewall_etc_t, shorewall_etc_t) + ') + +-####################################### +-## +-## Read shorewall pid files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`shorewall_read_pid_files',` +- gen_require(` +- type shorewall_var_run_t; +- ') +- +- files_search_pids($1) +- read_files_pattern($1, shorewall_var_run_t, shorewall_var_run_t) +-') +- +-####################################### +-## +-## Read and write shorewall pid files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`shorewall_rw_pid_files',` +- gen_require(` +- type shorewall_var_run_t; +- ') +- +- files_search_pids($1) +- rw_files_pattern($1, shorewall_var_run_t, shorewall_var_run_t) +-') +- + ###################################### + ## +-## Read shorewall lib files. ++## Read shorewall /var/lib files. + ## + ## + ## +@@ -106,36 +66,38 @@ interface(`shorewall_rw_pid_files',` + ## + # + interface(`shorewall_read_lib_files',` +- gen_require(` ++ gen_require(` + type shorewall_var_lib_t; +- ') ++ ') + +- files_search_var_lib($1) +- read_files_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) ++ files_search_var_lib($1) ++ search_dirs_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) ++ read_files_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) + ') + + ####################################### + ## +-## Read and write shorewall lib files. ++## Read and write shorewall /var/lib files. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`shorewall_rw_lib_files',` +- gen_require(` +- type shorewall_var_lib_t; +- ') ++ gen_require(` ++ type shorewall_var_lib_t; ++ ') + +- files_search_var_lib($1) +- rw_files_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) ++ files_search_var_lib($1) ++ search_dirs_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) ++ rw_files_pattern($1, shorewall_var_lib_t, shorewall_var_lib_t) + ') + + ####################################### + ## +-## Read shorewall temporary files. ++## Read shorewall tmp files. + ## + ## + ## +@@ -154,8 +116,8 @@ interface(`shorewall_read_tmp_files',` + + ####################################### + ## +-## All of the rules required to +-## administrate an shorewall environment. ++## All of the rules required to administrate ++## an shorewall environment + ## + ## + ## +@@ -164,28 +126,30 @@ interface(`shorewall_read_tmp_files',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the syslog domain. + ## + ## + ## + # + interface(`shorewall_admin',` + gen_require(` +- type shorewall_t, shorewall_lock_t, shorewall_log_t; +- type shorewall_exec_t, shorewall_initrc_exec_t, shorewall_var_lib_t; ++ type shorewall_t, shorewall_lock_t; ++ type shorewall_log_t; ++ type shorewall_initrc_exec_t, shorewall_var_lib_t; + type shorewall_tmp_t, shorewall_etc_t; + ') + +- allow $1 shorewall_t:process { ptrace signal_perms }; ++ allow $1 shorewall_t:process signal_perms; + ps_process_pattern($1, shorewall_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 shorewall_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, shorewall_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 shorewall_initrc_exec_t system_r; + allow $2 system_r; + +- can_exec($1, shorewall_exec_t) +- + files_list_etc($1) + admin_pattern($1, shorewall_etc_t) + +diff --git a/shorewall.te b/shorewall.te +index 7710b9f76b..04af4ec4d0 100644 +--- a/shorewall.te ++++ b/shorewall.te +@@ -32,8 +32,9 @@ logging_log_file(shorewall_log_t) + # Local policy + # + +-allow shorewall_t self:capability { dac_override net_admin net_raw setuid setgid sys_nice sys_admin }; ++allow shorewall_t self:capability { dac_read_search dac_override net_admin net_raw setuid setgid sys_nice sys_admin }; + dontaudit shorewall_t self:capability sys_tty_config; ++allow shorewall_t self:process signal_perms; + allow shorewall_t self:fifo_file rw_fifo_file_perms; + allow shorewall_t self:netlink_socket create_socket_perms; + +@@ -44,9 +45,7 @@ manage_files_pattern(shorewall_t, shorewall_lock_t, shorewall_lock_t) + files_lock_filetrans(shorewall_t, shorewall_lock_t, file) + + manage_dirs_pattern(shorewall_t, shorewall_log_t, shorewall_log_t) +-append_files_pattern(shorewall_t, shorewall_log_t, shorewall_log_t) +-create_files_pattern(shorewall_t, shorewall_log_t, shorewall_log_t) +-setattr_files_pattern(shorewall_t, shorewall_log_t, shorewall_log_t) ++manage_files_pattern(shorewall_t, shorewall_log_t, shorewall_log_t) + logging_log_filetrans(shorewall_t, shorewall_log_t, { file dir }) + + manage_dirs_pattern(shorewall_t, shorewall_tmp_t, shorewall_tmp_t) +@@ -57,6 +56,9 @@ exec_files_pattern(shorewall_t, shorewall_var_lib_t, shorewall_var_lib_t) + manage_dirs_pattern(shorewall_t, shorewall_var_lib_t, shorewall_var_lib_t) + manage_files_pattern(shorewall_t, shorewall_var_lib_t, shorewall_var_lib_t) + files_var_lib_filetrans(shorewall_t, shorewall_var_lib_t, { dir file }) ++allow shorewall_t shorewall_var_lib_t:file entrypoint; ++ ++allow shorewall_t shorewall_initrc_exec_t:file read_file_perms; + + allow shorewall_t shorewall_initrc_exec_t:file read_file_perms; + +@@ -74,7 +76,6 @@ dev_read_urand(shorewall_t) + domain_read_all_domains_state(shorewall_t) + + files_getattr_kernel_modules(shorewall_t) +-files_read_usr_files(shorewall_t) + files_search_kernel_modules(shorewall_t) + + fs_getattr_all_fs(shorewall_t) +@@ -86,12 +87,11 @@ init_rw_utmp(shorewall_t) + logging_read_generic_logs(shorewall_t) + logging_send_syslog_msg(shorewall_t) + +-miscfiles_read_localization(shorewall_t) +- + sysnet_domtrans_ifconfig(shorewall_t) + +-userdom_dontaudit_list_user_home_dirs(shorewall_t) +-userdom_use_user_terminals(shorewall_t) ++userdom_dontaudit_list_admin_dir(shorewall_t) ++userdom_use_inherited_user_ttys(shorewall_t) ++userdom_use_inherited_user_ptys(shorewall_t) + + optional_policy(` + brctl_domtrans(shorewall_t) +@@ -109,6 +109,10 @@ optional_policy(` + modutils_domtrans_insmod(shorewall_t) + ') + ++optional_policy(` ++ netutils_domtrans(shorewall_t) ++') ++ + optional_policy(` + ulogd_search_log(shorewall_t) + ') +diff --git a/shutdown.fc b/shutdown.fc +index a91f33b0ff..631dbc1dc9 100644 +--- a/shutdown.fc ++++ b/shutdown.fc +@@ -8,4 +8,4 @@ + + /usr/sbin/shutdown -- gen_context(system_u:object_r:shutdown_exec_t,s0) + +-/var/run/shutdown\.pid -- gen_context(system_u:object_r:shutdown_var_run_t,s0) ++/var/run/shutdown\.pid -- gen_context(system_u:object_r:shutdown_var_run_t,s0) +diff --git a/shutdown.if b/shutdown.if +index d1706bf87f..3aa7c9fd14 100644 +--- a/shutdown.if ++++ b/shutdown.if +@@ -1,30 +1,4 @@ +-## System shutdown command. +- +-######################################## +-## +-## Role access for shutdown. +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-## +-## User domain for the role. +-## +-## +-# +-interface(`shutdown_role',` +- gen_require(` +- type shutdown_t; +- ') +- +- shutdown_run($2, $1) +- +- allow $2 shutdown_t:process { ptrace signal_perms }; +- ps_process_pattern($2, shutdown_t) +-') ++## System shutdown command + + ######################################## + ## +@@ -43,13 +17,27 @@ interface(`shutdown_domtrans',` + + corecmd_search_bin($1) + domtrans_pattern($1, shutdown_exec_t, shutdown_t) ++ ++ init_reboot($1) ++ init_halt($1) ++ ++ optional_policy(` ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ init_stream_connect($1) ++ systemd_login_reboot($1) ++ systemd_login_halt($1) ++ ') ++ ++ ifdef(`hide_broken_symptoms', ` ++ dontaudit shutdown_t $1:fifo_file rw_inherited_fifo_file_perms; ++ ') + ') + + ######################################## + ## +-## Execute shutdown in the shutdown +-## domain, and allow the specified role +-## the shutdown domain. ++## Execute shutdown in the shutdown domain, and ++## allow the specified role the shutdown domain. + ## + ## + ## +@@ -64,16 +52,62 @@ interface(`shutdown_domtrans',` + # + interface(`shutdown_run',` + gen_require(` ++ type shutdown_t; + attribute_role shutdown_roles; + ') + +- shutdown_domtrans($1) +- roleattribute $2 shutdown_roles; ++ shutdown_domtrans($1) ++ roleattribute $2 shutdown_roles; + ') + + ######################################## + ## +-## Send generic signals to shutdown. ++## Role access for shutdown ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`shutdown_role',` ++ gen_require(` ++ type shutdown_t; ++ ') ++ ++ shutdown_run($2, $1) ++ ++ allow $2 shutdown_t:process { ptrace signal_perms }; ++ ps_process_pattern($2, shutdown_t) ++') ++ ++######################################## ++## ++## Recieve sigchld from shutdown ++## ++## ++## ++## Domain allowed access ++## ++## ++# ++interface(`shutdown_send_sigchld',` ++ gen_require(` ++ type shutdown_t; ++ ') ++ ++ allow shutdown_t $1:process signal; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## shutdown over dbus. + ## + ## + ## +@@ -81,17 +115,19 @@ interface(`shutdown_run',` + ## + ## + # +-interface(`shutdown_signal',` ++interface(`shutdown_dbus_chat',` + gen_require(` + type shutdown_t; ++ class dbus send_msg; + ') + +- allow shutdown_t $1:process signal; ++ allow $1 shutdown_t:dbus send_msg; ++ allow shutdown_t $1:dbus send_msg; + ') + + ######################################## + ## +-## Get attributes of shutdown executable files. ++## Get attributes of shutdown executable. + ## + ## + ## +diff --git a/shutdown.te b/shutdown.te +index e2544e147c..2196974f59 100644 +--- a/shutdown.te ++++ b/shutdown.te +@@ -24,7 +24,7 @@ files_pid_file(shutdown_var_run_t) + # Local policy + # + +-allow shutdown_t self:capability { dac_override kill setuid sys_nice sys_tty_config }; ++allow shutdown_t self:capability { dac_read_search dac_override kill setuid sys_nice sys_tty_config }; + allow shutdown_t self:process { setsched signal signull }; + allow shutdown_t self:fifo_file manage_fifo_file_perms; + allow shutdown_t self:unix_stream_socket create_stream_socket_perms; +@@ -44,7 +44,7 @@ files_read_generic_pids(shutdown_t) + + mls_file_write_to_clearance(shutdown_t) + +-term_use_all_terms(shutdown_t) ++term_use_all_inherited_terms(shutdown_t) + + auth_use_nsswitch(shutdown_t) + auth_write_login_records(shutdown_t) +@@ -56,8 +56,6 @@ init_telinit(shutdown_t) + logging_search_logs(shutdown_t) + logging_send_audit_msgs(shutdown_t) + +-miscfiles_read_localization(shutdown_t) +- + optional_policy(` + cron_system_entry(shutdown_t, shutdown_exec_t) + ') +@@ -68,10 +66,15 @@ optional_policy(` + ') + + optional_policy(` +- oddjob_dontaudit_rw_fifo_files(shutdown_t) +- oddjob_sigchld(shutdown_t) ++ oddjob_dontaudit_rw_fifo_file(shutdown_t) ++ oddjob_sigchld(shutdown_t) ++') ++ ++optional_policy(` ++ rhev_sigchld_agentd(shutdown_t) + ') + + optional_policy(` + xserver_dontaudit_write_log(shutdown_t) ++ xserver_xdm_append_log(shutdown_t) + ') +diff --git a/slocate.te b/slocate.te +index 7292dc0645..26fc8f4bc9 100644 +--- a/slocate.te ++++ b/slocate.te +@@ -44,8 +44,12 @@ dev_getattr_all_blk_files(locate_t) + dev_getattr_all_chr_files(locate_t) + + files_list_all(locate_t) ++files_list_isid_type_dirs(locate_t) ++files_getattr_isid_type(locate_t) + files_dontaudit_read_all_symlinks(locate_t) + files_getattr_all_files(locate_t) ++files_getattr_all_chr_files(locate_t) ++files_getattr_all_blk_files(locate_t) + files_getattr_all_pipes(locate_t) + files_getattr_all_sockets(locate_t) + files_read_etc_runtime_files(locate_t) +@@ -62,7 +66,6 @@ fs_read_noxattr_fs_symlinks(locate_t) + + auth_use_nsswitch(locate_t) + +-miscfiles_read_localization(locate_t) + + ifdef(`enable_mls',` + files_dontaudit_getattr_all_dirs(locate_t) +@@ -71,3 +74,8 @@ ifdef(`enable_mls',` + optional_policy(` + cron_system_entry(locate_t, locate_exec_t) + ') ++ ++optional_policy(` ++ mock_getattr_lib(locate_t) ++') ++ +diff --git a/slpd.if b/slpd.if +index ca32e89463..98278dd2cd 100644 +--- a/slpd.if ++++ b/slpd.if +@@ -1,5 +1,42 @@ + ## OpenSLP server daemon to dynamically register services. + ++######################################## ++## ++## Transition to slpd. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`slpd_domtrans',` ++ gen_require(` ++ type slpd_t, slpd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, slpd_exec_t, slpd_t) ++') ++ ++######################################## ++## ++## Execute slpd server in the slpd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`slpd_initrc_domtrans',` ++ gen_require(` ++ type slpd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, slpd_initrc_exec_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -26,7 +63,7 @@ interface(`slpd_admin',` + allow $1 slpd_t:process { ptrace signal_perms }; + ps_process_pattern($1, slpd_t) + +- init_labeled_script_domtrans($1, slpd_initrc_exec_t) ++ slpd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 slpd_initrc_exec_t system_r; + allow $2 system_r; +@@ -36,4 +73,10 @@ interface(`slpd_admin',` + + files_search_pids($1) + admin_pattern($1, slpd_var_run_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++ + ') +diff --git a/slpd.te b/slpd.te +index 731512a664..4ce76cd9c3 100644 +--- a/slpd.te ++++ b/slpd.te +@@ -23,7 +23,7 @@ files_pid_file(slpd_var_run_t) + # Local policy + # + +-allow slpd_t self:capability { kill setgid setuid }; ++allow slpd_t self:capability { kill net_admin setgid setuid }; + allow slpd_t self:process signal; + allow slpd_t self:fifo_file rw_fifo_file_perms; + allow slpd_t self:tcp_socket { accept listen }; +@@ -35,6 +35,9 @@ logging_log_filetrans(slpd_t, slpd_log_t, file) + manage_files_pattern(slpd_t, slpd_var_run_t, slpd_var_run_t) + files_pid_filetrans(slpd_t, slpd_var_run_t, file) + ++kernel_read_system_state(slpd_t) ++kernel_read_network_state(slpd_t) ++ + corenet_all_recvfrom_unlabeled(slpd_t) + corenet_all_recvfrom_netlabel(slpd_t) + corenet_tcp_sendrecv_generic_if(slpd_t) +@@ -50,6 +53,12 @@ corenet_sendrecv_svrloc_server_packets(slpd_t) + corenet_tcp_bind_svrloc_port(slpd_t) + corenet_udp_bind_svrloc_port(slpd_t) + ++corenet_udp_bind_dhcpc_port(slpd_t) ++ ++dev_read_urand(slpd_t) ++ + auth_use_nsswitch(slpd_t) + +-miscfiles_read_localization(slpd_t) ++logging_send_syslog_msg(slpd_t) ++ ++sysnet_dns_name_resolve(slpd_t) +diff --git a/slrnpull.te b/slrnpull.te +index 59eb07fa94..4626942ae2 100644 +--- a/slrnpull.te ++++ b/slrnpull.te +@@ -13,7 +13,7 @@ type slrnpull_var_run_t; + files_pid_file(slrnpull_var_run_t) + + type slrnpull_spool_t; +-files_type(slrnpull_spool_t) ++files_spool_file(slrnpull_spool_t) + + type slrnpull_log_t; + logging_log_file(slrnpull_log_t) +@@ -44,7 +44,6 @@ dev_read_sysfs(slrnpull_t) + + domain_use_interactive_fds(slrnpull_t) + +-files_read_etc_files(slrnpull_t) + files_search_spool(slrnpull_t) + + fs_getattr_all_fs(slrnpull_t) +@@ -52,8 +51,6 @@ fs_search_auto_mountpoints(slrnpull_t) + + logging_send_syslog_msg(slrnpull_t) + +-miscfiles_read_localization(slrnpull_t) +- + userdom_dontaudit_use_unpriv_user_fds(slrnpull_t) + userdom_dontaudit_search_user_home_dirs(slrnpull_t) + +diff --git a/smartmon.if b/smartmon.if +index e0644b5cfc..ea347ccd52 100644 +--- a/smartmon.if ++++ b/smartmon.if +@@ -42,9 +42,13 @@ interface(`smartmon_admin',` + type fsdaemon_var_lib_t, fsdaemon_initrc_exec_t; + ') + +- allow $1 fsdaemon_t:process { ptrace signal_perms }; ++ allow $1 fsdaemon_t:process signal_perms; + ps_process_pattern($1, fsdaemon_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 fsdaemon_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, fsdaemon_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 fsdaemon_initrc_exec_t system_r; +diff --git a/smartmon.te b/smartmon.te +index 9cf6582d27..052179c3fa 100644 +--- a/smartmon.te ++++ b/smartmon.te +@@ -38,7 +38,7 @@ ifdef(`enable_mls',` + # Local policy + # + +-allow fsdaemon_t self:capability { dac_override kill setpcap setgid sys_rawio sys_admin }; ++allow fsdaemon_t self:capability { dac_read_search dac_override kill setpcap setgid sys_rawio sys_admin }; + dontaudit fsdaemon_t self:capability sys_tty_config; + allow fsdaemon_t self:process { getcap setcap signal_perms }; + allow fsdaemon_t self:fifo_file rw_fifo_file_perms; +@@ -60,21 +60,27 @@ kernel_read_system_state(fsdaemon_t) + + corecmd_exec_all_executables(fsdaemon_t) + ++corenet_all_recvfrom_netlabel(fsdaemon_t) ++corenet_udp_sendrecv_generic_if(fsdaemon_t) ++corenet_udp_sendrecv_generic_node(fsdaemon_t) ++corenet_udp_sendrecv_all_ports(fsdaemon_t) ++ + dev_read_sysfs(fsdaemon_t) + dev_read_urand(fsdaemon_t) + + domain_use_interactive_fds(fsdaemon_t) + + files_exec_etc_files(fsdaemon_t) +-files_read_etc_files(fsdaemon_t) + files_read_etc_runtime_files(fsdaemon_t) +-files_read_usr_files(fsdaemon_t) + + fs_getattr_all_fs(fsdaemon_t) + fs_search_auto_mountpoints(fsdaemon_t) ++fs_read_removable_files(fsdaemon_t) + + mls_file_read_all_levels(fsdaemon_t) + ++storage_create_fixed_disk_dev(fsdaemon_t) ++storage_dev_filetrans_named_fixed_disk(fsdaemon_t) + storage_raw_read_fixed_disk(fsdaemon_t) + storage_raw_write_fixed_disk(fsdaemon_t) + storage_raw_read_removable_device(fsdaemon_t) +@@ -83,7 +89,9 @@ storage_write_scsi_generic(fsdaemon_t) + + term_dontaudit_search_ptys(fsdaemon_t) + +-application_signull(fsdaemon_t) ++domain_signull_all_domains(fsdaemon_t) ++ ++auth_read_passwd(fsdaemon_t) + + init_read_utmp(fsdaemon_t) + +@@ -92,12 +100,13 @@ libs_exec_lib_files(fsdaemon_t) + + logging_send_syslog_msg(fsdaemon_t) + +-miscfiles_read_localization(fsdaemon_t) ++seutil_sigchld_newrole(fsdaemon_t) + + sysnet_dns_name_resolve(fsdaemon_t) + + userdom_dontaudit_use_unpriv_user_fds(fsdaemon_t) + userdom_dontaudit_search_user_home_dirs(fsdaemon_t) ++userdom_use_user_terminals(fsdaemon_t) + + tunable_policy(`smartmon_3ware',` + allow fsdaemon_t self:process setfscreate; +@@ -116,9 +125,9 @@ optional_policy(` + ') + + optional_policy(` +- seutil_sigchld_newrole(fsdaemon_t) ++ udev_read_db(fsdaemon_t) + ') + + optional_policy(` +- udev_read_db(fsdaemon_t) ++ virt_read_images(fsdaemon_t) + ') +diff --git a/smokeping.fc b/smokeping.fc +index 335981945e..a231ecb561 100644 +--- a/smokeping.fc ++++ b/smokeping.fc +@@ -2,7 +2,7 @@ + + /usr/sbin/smokeping -- gen_context(system_u:object_r:smokeping_exec_t,s0) + +-/usr/share/smokeping/cgi(/.*)? gen_context(system_u:object_r:httpd_smokeping_cgi_script_exec_t,s0) ++/usr/share/smokeping/cgi(/.*)? gen_context(system_u:object_r:smokeping_cgi_script_exec_t,s0) + + /var/lib/smokeping(/.*)? gen_context(system_u:object_r:smokeping_var_lib_t,s0) + +diff --git a/smokeping.if b/smokeping.if +index 1fa51c11ff..82e111c80e 100644 +--- a/smokeping.if ++++ b/smokeping.if +@@ -158,8 +158,11 @@ interface(`smokeping_admin',` + type smokeping_var_run_t; + ') + +- allow $1 smokeping_t:process { ptrace signal_perms }; ++ allow $1 smokeping_t:process signal_perms; + ps_process_pattern($1, smokeping_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 smokeping_t:process ptrace; ++ ') + + smokeping_initrc_domtrans($1) + domain_system_change_exemption($1) +diff --git a/smokeping.te b/smokeping.te +index ec031a0310..61a9f8c081 100644 +--- a/smokeping.te ++++ b/smokeping.te +@@ -24,6 +24,7 @@ files_type(smokeping_var_lib_t) + # + + dontaudit smokeping_t self:capability { dac_read_search dac_override }; ++allow smokeping_t self:process signal_perms; + allow smokeping_t self:fifo_file rw_fifo_file_perms; + allow smokeping_t self:unix_stream_socket { accept listen }; + +@@ -39,7 +40,6 @@ corecmd_exec_bin(smokeping_t) + + dev_read_urand(smokeping_t) + +-files_read_usr_files(smokeping_t) + files_search_tmp(smokeping_t) + + auth_use_nsswitch(smokeping_t) +@@ -47,8 +47,6 @@ auth_dontaudit_read_shadow(smokeping_t) + + logging_send_syslog_msg(smokeping_t) + +-miscfiles_read_localization(smokeping_t) +- + mta_send_mail(smokeping_t) + + netutils_domtrans_ping(smokeping_t) +@@ -60,17 +58,22 @@ netutils_domtrans_ping(smokeping_t) + + optional_policy(` + apache_content_template(smokeping_cgi) ++ apache_content_alias_template(smokeping_cgi, smokeping_cgi) ++ ++ manage_dirs_pattern(smokeping_cgi_script_t, smokeping_var_lib_t, smokeping_var_lib_t) ++ manage_files_pattern(smokeping_cgi_script_t, smokeping_var_lib_t, smokeping_var_lib_t) ++ ++ getattr_files_pattern(smokeping_cgi_script_t, smokeping_var_run_t, smokeping_var_run_t) + +- manage_dirs_pattern(httpd_smokeping_cgi_script_t, smokeping_var_lib_t, smokeping_var_lib_t) +- manage_files_pattern(httpd_smokeping_cgi_script_t, smokeping_var_lib_t, smokeping_var_lib_t) ++ files_read_etc_files(smokeping_cgi_script_t) ++ files_search_tmp(smokeping_cgi_script_t) ++ files_search_var_lib(smokeping_cgi_script_t) + +- getattr_files_pattern(httpd_smokeping_cgi_script_t, smokeping_var_run_t, smokeping_var_run_t) ++ auth_read_passwd(smokeping_cgi_script_t) + +- files_read_etc_files(httpd_smokeping_cgi_script_t) +- files_search_tmp(httpd_smokeping_cgi_script_t) +- files_search_var_lib(httpd_smokeping_cgi_script_t) ++ logging_send_syslog_msg(smokeping_cgi_script_t) + +- sysnet_dns_name_resolve(httpd_smokeping_cgi_script_t) ++ sysnet_dns_name_resolve(smokeping_cgi_script_t) + +- netutils_domtrans_ping(httpd_smokeping_cgi_script_t) ++ netutils_domtrans_ping(smokeping_cgi_script_t) + ') +diff --git a/smoltclient.te b/smoltclient.te +index b3f2c6f260..4e629a10bc 100644 +--- a/smoltclient.te ++++ b/smoltclient.te +@@ -40,6 +40,7 @@ corenet_tcp_sendrecv_generic_node(smoltclient_t) + + corenet_sendrecv_http_client_packets(smoltclient_t) + corenet_tcp_connect_http_port(smoltclient_t) ++corenet_tcp_connect_http_cache_port(smoltclient_t) + corenet_tcp_sendrecv_http_port(smoltclient_t) + + dev_read_sysfs(smoltclient_t) +@@ -51,14 +52,12 @@ fs_list_auto_mountpoints(smoltclient_t) + + files_getattr_generic_locks(smoltclient_t) + files_read_etc_runtime_files(smoltclient_t) +-files_read_usr_files(smoltclient_t) + + auth_use_nsswitch(smoltclient_t) + + logging_send_syslog_msg(smoltclient_t) + + miscfiles_read_hwdata(smoltclient_t) +-miscfiles_read_localization(smoltclient_t) + + optional_policy(` + abrt_stream_connect(smoltclient_t) +@@ -76,6 +75,10 @@ optional_policy(` + ') + ') + ++optional_policy(` ++ libs_exec_ldconfig(smoltclient_t) ++') ++ + optional_policy(` + rpm_exec(smoltclient_t) + rpm_read_db(smoltclient_t) +diff --git a/smsd.fc b/smsd.fc +new file mode 100644 +index 0000000000..4c3fcec7da +--- /dev/null ++++ b/smsd.fc +@@ -0,0 +1,11 @@ ++/etc/rc\.d/init\.d/smsd -- gen_context(system_u:object_r:smsd_initrc_exec_t,s0) ++ ++/usr/sbin/smsd -- gen_context(system_u:object_r:smsd_exec_t,s0) ++ ++/var/lib/smstools(/.*)? gen_context(system_u:object_r:smsd_var_lib_t,s0) ++ ++/var/log/smsd(/.*)? gen_context(system_u:object_r:smsd_log_t,s0) ++ ++/var/run/smsd(/.*)? gen_context(system_u:object_r:smsd_var_run_t,s0) ++ ++/var/spool/sms(/.*)? gen_context(system_u:object_r:smsd_spool_t,s0) +diff --git a/smsd.if b/smsd.if +new file mode 100644 +index 0000000000..52450c7003 +--- /dev/null ++++ b/smsd.if +@@ -0,0 +1,240 @@ ++## The SMS Server Tools are made to send and receive short messages through GSM modems. It supports easy file interfaces and it can run external programs for automatic actions. ++ ++######################################## ++## ++## Execute smsd in the smsd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`smsd_domtrans',` ++ gen_require(` ++ type smsd_t, smsd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, smsd_exec_t, smsd_t) ++') ++ ++######################################## ++## ++## Execute smsd server in the smsd domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_initrc_domtrans',` ++ gen_require(` ++ type smsd_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, smsd_initrc_exec_t) ++') ++ ++######################################## ++## ++## Read smsd's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_read_log',` ++ gen_require(` ++ type smsd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, smsd_log_t, smsd_log_t) ++') ++ ++######################################## ++## ++## Append to smsd log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_append_log',` ++ gen_require(` ++ type smsd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, smsd_log_t, smsd_log_t) ++') ++ ++######################################## ++## ++## Manage smsd log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_manage_log',` ++ gen_require(` ++ type smsd_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, smsd_log_t, smsd_log_t) ++ manage_files_pattern($1, smsd_log_t, smsd_log_t) ++ manage_lnk_files_pattern($1, smsd_log_t, smsd_log_t) ++') ++######################################## ++## ++## Read smsd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_read_pid_files',` ++ gen_require(` ++ type smsd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, smsd_var_run_t, smsd_var_run_t) ++') ++ ++######################################## ++## ++## Search smsd spool directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_search_spool',` ++ gen_require(` ++ type smsd_spool_t; ++ ') ++ ++ allow $1 smsd_spool_t:dir search_dir_perms; ++ files_search_spool($1) ++') ++ ++######################################## ++## ++## Read smsd spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_read_spool_files',` ++ gen_require(` ++ type smsd_spool_t; ++ ') ++ ++ files_search_spool($1) ++ read_files_pattern($1, smsd_spool_t, smsd_spool_t) ++') ++ ++######################################## ++## ++## Manage smsd spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_manage_spool_files',` ++ gen_require(` ++ type smsd_spool_t; ++ ') ++ ++ files_search_spool($1) ++ manage_files_pattern($1, smsd_spool_t, smsd_spool_t) ++') ++ ++######################################## ++## ++## Manage smsd spool dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_manage_spool_dirs',` ++ gen_require(` ++ type smsd_spool_t; ++ ') ++ ++ files_search_spool($1) ++ manage_dirs_pattern($1, smsd_spool_t, smsd_spool_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an smsd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`smsd_admin',` ++ gen_require(` ++ type smsd_t; ++ type smsd_initrc_exec_t; ++ type smsd_log_t; ++ type smsd_var_run_t; ++ type smsd_spool_t; ++ ') ++ ++ allow $1 smsd_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, smsd_t) ++ ++ smsd_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 smsd_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_search_logs($1) ++ admin_pattern($1, smsd_log_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, smsd_var_run_t) ++ ++ files_search_spool($1) ++ admin_pattern($1, smsd_spool_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/smsd.te b/smsd.te +new file mode 100644 +index 0000000000..1fad7b8dae +--- /dev/null ++++ b/smsd.te +@@ -0,0 +1,73 @@ ++policy_module(smsd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type smsd_t; ++type smsd_exec_t; ++init_daemon_domain(smsd_t, smsd_exec_t) ++ ++type smsd_initrc_exec_t; ++init_script_file(smsd_initrc_exec_t) ++ ++type smsd_log_t; ++logging_log_file(smsd_log_t) ++ ++type smsd_var_lib_t; ++files_type(smsd_var_lib_t) ++ ++type smsd_var_run_t; ++files_pid_file(smsd_var_run_t) ++ ++type smsd_spool_t; ++files_type(smsd_spool_t) ++ ++type smsd_tmp_t; ++files_tmp_file(smsd_tmp_t) ++ ++######################################## ++# ++# smsd local policy ++# ++ ++allow smsd_t self:capability { kill setgid setuid }; ++allow smsd_t self:process { fork signal }; ++allow smsd_t self:fifo_file rw_fifo_file_perms; ++allow smsd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_dirs_pattern(smsd_t, smsd_log_t, smsd_log_t) ++manage_files_pattern(smsd_t, smsd_log_t, smsd_log_t) ++manage_lnk_files_pattern(smsd_t, smsd_log_t, smsd_log_t) ++logging_log_filetrans(smsd_t, smsd_log_t, { dir }) ++ ++manage_dirs_pattern(smsd_t, smsd_var_lib_t, smsd_var_lib_t) ++manage_files_pattern(smsd_t, smsd_var_lib_t, smsd_var_lib_t) ++manage_lnk_files_pattern(smsd_t, smsd_var_lib_t, smsd_var_lib_t) ++ ++manage_dirs_pattern(smsd_t, smsd_var_run_t, smsd_var_run_t) ++manage_files_pattern(smsd_t, smsd_var_run_t, smsd_var_run_t) ++manage_lnk_files_pattern(smsd_t, smsd_var_run_t, smsd_var_run_t) ++files_pid_filetrans(smsd_t, smsd_var_run_t, { dir }) ++ ++manage_dirs_pattern(smsd_t, smsd_spool_t, smsd_spool_t) ++manage_files_pattern(smsd_t, smsd_spool_t, smsd_spool_t) ++manage_lnk_files_pattern(smsd_t, smsd_spool_t, smsd_spool_t) ++files_spool_filetrans(smsd_t, smsd_spool_t, { dir }) ++can_exec(smsd_t, smsd_spool_t) ++ ++manage_dirs_pattern(smsd_t, smsd_tmp_t, smsd_tmp_t) ++manage_files_pattern(smsd_t, smsd_tmp_t, smsd_tmp_t) ++files_tmp_filetrans(smsd_t, smsd_tmp_t, { file dir }) ++ ++kernel_read_system_state(smsd_t) ++kernel_read_kernel_sysctls(smsd_t) ++ ++corecmd_exec_shell(smsd_t) ++ ++auth_use_nsswitch(smsd_t) ++ ++logging_send_syslog_msg(smsd_t) ++ ++sysnet_dns_name_resolve(smsd_t) +diff --git a/smstools.if b/smstools.if +index cbfe369a69..6594af373d 100644 +--- a/smstools.if ++++ b/smstools.if +@@ -1,5 +1,81 @@ + ## Tools to send and receive short messages through GSM modems or mobile phones. + ++####################################### ++## ++## Search smsd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_search_lib',` ++ gen_require(` ++ type smsd_var_lib_t; ++ ') ++ ++ allow $1 smsd_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++####################################### ++## ++## Read smsd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_read_lib_files',` ++ gen_require(` ++ type smsd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, smsd_var_lib_t, smsd_var_lib_t) ++') ++ ++####################################### ++## ++## Manage smsd lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_manage_lib_files',` ++ gen_require(` ++ type smsd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, smsd_var_lib_t, smsd_var_lib_t) ++') ++ ++####################################### ++## ++## Manage smsd lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`smsd_manage_lib_dirs',` ++ gen_require(` ++ type smsd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, smsd_var_lib_t, smsd_var_lib_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -32,7 +108,7 @@ interface(`smstools_admin',` + role_transition $2 smsd_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_config($1) ++ files_search_etc($1) + admin_pattern($1, smsd_conf_t) + + files_search_var_lib($1) +diff --git a/snapper.fc b/snapper.fc +new file mode 100644 +index 0000000000..0a43846a86 +--- /dev/null ++++ b/snapper.fc +@@ -0,0 +1,15 @@ ++/usr/sbin/snapperd -- gen_context(system_u:object_r:snapperd_exec_t,s0) ++ ++/etc/snapper(/.*)? gen_context(system_u:object_r:snapperd_conf_t,s0) ++/etc/sysconfig/snapper -- gen_context(system_u:object_r:snapperd_conf_t,s0) ++ ++/var/log/snapper\.log.* -- gen_context(system_u:object_r:snapperd_log_t,s0) ++ ++/mnt/(.*/)?\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++/\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++ ++/usr/\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++/var/\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++/etc/\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++/home/\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) ++/home/(.*/)?\.snapshots(/.*)? gen_context(system_u:object_r:snapperd_data_t,s0) +diff --git a/snapper.if b/snapper.if +new file mode 100644 +index 0000000000..6e3a54de7f +--- /dev/null ++++ b/snapper.if +@@ -0,0 +1,81 @@ ++ ++## policy for snapperd ++ ++######################################## ++## ++## Execute TEMPLATE in the snapperd domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`snapper_domtrans',` ++ gen_require(` ++ type snapperd_t, snapperd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, snapperd_exec_t, snapperd_t) ++ allow $1 snapperd_exec_t:file map; ++') ++ ++######################################## ++## ++## Send and receive messages from ++## snapperd over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snapper_dbus_chat',` ++ gen_require(` ++ type snapperd_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 snapperd_t:dbus send_msg; ++ allow snapperd_t $1:dbus send_msg; ++') ++ ++######################################## ++## ++## Allow a domain to read inherited snapper pipe. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snapper_read_inherited_pipe',` ++ gen_require(` ++ type snapperd_t; ++ ') ++ ++ allow $1 snapperd_t:fifo_file read_inherited_file_perms; ++') ++ ++####################################### ++## ++## Allow domain to create .smapshot ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snapper_filetrans_named_content',` ++ ++ gen_require(` ++ type snapperd_data_t; ++ ') ++ ++ files_mountpoint_filetrans($1, snapperd_data_t, dir, ".snapshots") ++') ++ +diff --git a/snapper.te b/snapper.te +new file mode 100644 +index 0000000000..5be6d3542b +--- /dev/null ++++ b/snapper.te +@@ -0,0 +1,88 @@ ++policy_module(snapper, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type snapperd_t; ++type snapperd_exec_t; ++init_daemon_domain(snapperd_t, snapperd_exec_t) ++ ++type snapperd_log_t; ++logging_log_file(snapperd_log_t) ++ ++type snapperd_conf_t; ++files_config_file(snapperd_conf_t) ++ ++type snapperd_data_t; ++files_type(snapperd_data_t) ++ ++######################################## ++# ++# snapperd local policy ++# ++allow snapperd_t self:capability { dac_read_search dac_override fowner sys_admin }; ++allow snapperd_t self:process setsched; ++ ++allow snapperd_t self:fifo_file rw_fifo_file_perms; ++allow snapperd_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_files_pattern(snapperd_t, snapperd_log_t, snapperd_log_t) ++logging_log_filetrans(snapperd_t, snapperd_log_t, file) ++ ++manage_files_pattern(snapperd_t, snapperd_conf_t, snapperd_conf_t) ++manage_dirs_pattern(snapperd_t, snapperd_conf_t, snapperd_conf_t) ++manage_lnk_files_pattern(snapperd_t, snapperd_conf_t, snapperd_conf_t) ++ ++manage_files_pattern(snapperd_t, snapperd_data_t, snapperd_data_t) ++manage_dirs_pattern(snapperd_t, snapperd_data_t, snapperd_data_t) ++manage_lnk_files_pattern(snapperd_t, snapperd_data_t, snapperd_data_t) ++allow snapperd_t snapperd_data_t:file relabelfrom; ++allow snapperd_t snapperd_data_t:dir { relabelfrom relabelto mounton }; ++snapper_filetrans_named_content(snapperd_t) ++ ++kernel_setsched(snapperd_t) ++ ++domain_read_all_domains_state(snapperd_t) ++ ++corecmd_exec_shell(snapperd_t) ++corecmd_exec_bin(snapperd_t) ++ ++files_write_all_dirs(snapperd_t) ++files_setattr_all_mountpoints(snapperd_t) ++files_relabelto_all_mountpoints(snapperd_t) ++files_relabelfrom_isid_type(snapperd_t) ++files_read_all_files(snapperd_t) ++files_read_all_symlinks(snapperd_t) ++files_list_all(snapperd_t) ++files_manage_isid_type_dirs(snapperd_t) ++files_manage_non_security_dirs(snapperd_t) ++files_relabel_non_security_files(snapperd_t) ++ ++fs_getattr_all_fs(snapperd_t) ++fs_mount_xattr_fs(snapperd_t) ++fs_unmount_xattr_fs(snapperd_t) ++ ++storage_raw_read_fixed_disk(snapperd_t) ++ ++auth_use_nsswitch(snapperd_t) ++ ++optional_policy(` ++ cron_system_entry(snapperd_t, snapperd_exec_t) ++') ++ ++optional_policy(` ++ dbus_system_domain(snapperd_t, snapperd_exec_t) ++ dbus_system_bus_client(snapperd_t) ++ dbus_connect_system_bus(snapperd_t) ++') ++ ++optional_policy(` ++ mount_domtrans(snapperd_t) ++') ++ ++optional_policy(` ++ lvm_domtrans(snapperd_t) ++') ++ +diff --git a/snmp.fc b/snmp.fc +index 2f0a2f2059..1569e33695 100644 +--- a/snmp.fc ++++ b/snmp.fc +@@ -1,6 +1,6 @@ + /etc/rc\.d/init\.d/(snmpd|snmptrapd) -- gen_context(system_u:object_r:snmpd_initrc_exec_t,s0) + +-/usr/sbin/snmptrap -- gen_context(system_u:object_r:snmpd_exec_t,s0) ++/usr/sbin/snmpd -- gen_context(system_u:object_r:snmpd_exec_t,s0) + /usr/sbin/snmptrapd -- gen_context(system_u:object_r:snmpd_exec_t,s0) + + /usr/share/snmp/mibs/\.index -- gen_context(system_u:object_r:snmpd_var_lib_t,s0) +@@ -10,9 +10,12 @@ + + /var/lib/net-snmp(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0) + /var/lib/snmp(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0) ++/var/spool/snmptt(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0) + + /var/log/snmpd\.log.* -- gen_context(system_u:object_r:snmpd_log_t,s0) + +-/var/run/net-snmpd(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0) +-/var/run/snmpd(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0) ++/var/net-snmp(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0) ++ ++/var/run/net-snmp(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0) ++/var/run/snmpd(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0) + /var/run/snmpd\.pid -- gen_context(system_u:object_r:snmpd_var_run_t,s0) +diff --git a/snmp.if b/snmp.if +index 7a9cc9df74..6085a4160d 100644 +--- a/snmp.if ++++ b/snmp.if +@@ -1,5 +1,23 @@ + ## Simple network management protocol services. + ++######################################## ++## ++## Send null signals to snmp. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snmp_signull',` ++ gen_require(` ++ type snmpd_t; ++ ') ++ ++ allow $1 snmpd_t:process signull; ++') ++ + ######################################## + ## + ## Connect to snmpd with a unix +@@ -57,8 +75,7 @@ interface(`snmp_udp_chat',` + + ######################################## + ## +-## Create, read, write, and delete +-## snmp lib directories. ++## Read snmpd lib content. + ## + ## + ## +@@ -66,19 +83,57 @@ interface(`snmp_udp_chat',` + ## + ## + # +-interface(`snmp_manage_var_lib_dirs',` ++interface(`snmp_read_snmp_var_lib_files',` + gen_require(` + type snmpd_var_lib_t; + ') + + files_search_var_lib($1) ++ allow $1 snmpd_var_lib_t:dir list_dir_perms; ++ read_files_pattern($1, snmpd_var_lib_t, snmpd_var_lib_t) ++ read_lnk_files_pattern($1, snmpd_var_lib_t, snmpd_var_lib_t) ++') ++ ++####################################### ++## ++## Read snmpd libraries directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snmp_read_snmp_var_lib_dirs',` ++ gen_require(` ++ type snmpd_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ allow $1 snmpd_var_lib_t:dir list_dir_perms; ++') ++ ++######################################## ++## ++## Manage snmpd libraries directories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`snmp_manage_var_lib_dirs',` ++ gen_require(` ++ type snmpd_var_lib_t; ++ ') ++ + allow $1 snmpd_var_lib_t:dir manage_dir_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## snmp lib files. ++## Manage snmpd libraries. + ## + ## + ## +@@ -98,7 +153,7 @@ interface(`snmp_manage_var_lib_files',` + + ######################################## + ## +-## Read snmpd lib content. ++## Manage snmpd libraries. + ## + ## + ## +@@ -106,14 +161,35 @@ interface(`snmp_manage_var_lib_files',` + ## + ## + # +-interface(`snmp_read_snmp_var_lib_files',` ++interface(`snmp_manage_var_lib_sock_files',` + gen_require(` + type snmpd_var_lib_t; + ') + ++ files_search_var_lib($1) + allow $1 snmpd_var_lib_t:dir list_dir_perms; +- read_files_pattern($1, snmpd_var_lib_t, snmpd_var_lib_t) +- read_lnk_files_pattern($1, snmpd_var_lib_t, snmpd_var_lib_t) ++ manage_sock_files_pattern($1, snmpd_var_lib_t, snmpd_var_lib_t) ++') ++ ++######################################## ++## ++## Do not audit attempts to manage ++## snmpd lib content. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`snmp_dontaudit_manage_snmp_var_lib_files',` ++ gen_require(` ++ type snmpd_var_lib_t; ++ ') ++ ++ dontaudit $1 snmpd_var_lib_t:dir manage_dir_perms; ++ dontaudit $1 snmpd_var_lib_t:file manage_file_perms; ++ dontaudit $1 snmpd_var_lib_t:lnk_file manage_lnk_file_perms; + ') + + ######################################## +@@ -179,8 +255,12 @@ interface(`snmp_admin',` + type snmpd_var_lib_t, snmpd_var_run_t; + ') + +- allow $1 snmpd_t:process { ptrace signal_perms }; ++ allow $1 snmpd_t:process signal_perms; ++ + ps_process_pattern($1, snmpd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 snmpd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, snmpd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/snmp.te b/snmp.te +index 9dcaeb8757..e8446db05e 100644 +--- a/snmp.te ++++ b/snmp.te +@@ -26,15 +26,17 @@ files_type(snmpd_var_lib_t) + # Local policy + # + +-allow snmpd_t self:capability { chown dac_override kill ipc_lock setgid setuid net_admin sys_nice sys_tty_config sys_ptrace }; ++allow snmpd_t self:capability { chown dac_read_search dac_override kill ipc_lock setgid setuid net_admin sys_nice sys_tty_config sys_ptrace }; ++ + dontaudit snmpd_t self:capability { sys_module sys_tty_config }; + allow snmpd_t self:process { signal_perms getsched setsched }; + allow snmpd_t self:fifo_file rw_fifo_file_perms; +-allow snmpd_t self:unix_stream_socket { accept connectto listen }; +-allow snmpd_t self:tcp_socket { accept listen }; ++allow snmpd_t self:unix_dgram_socket create_socket_perms; ++allow snmpd_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow snmpd_t self:tcp_socket create_stream_socket_perms; + allow snmpd_t self:udp_socket connected_stream_socket_perms; + +-allow snmpd_t snmpd_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(snmpd_t, snmpd_log_t, snmpd_log_t) + logging_log_filetrans(snmpd_t, snmpd_log_t, file) + + manage_dirs_pattern(snmpd_t, snmpd_var_lib_t, snmpd_var_lib_t) +@@ -53,12 +55,13 @@ kernel_read_kernel_sysctls(snmpd_t) + kernel_read_fs_sysctls(snmpd_t) + kernel_read_net_sysctls(snmpd_t) + kernel_read_network_state(snmpd_t) ++kernel_read_proc_symlinks(snmpd_t) ++kernel_read_all_proc(snmpd_t) + kernel_read_system_state(snmpd_t) + + corecmd_exec_bin(snmpd_t) + corecmd_exec_shell(snmpd_t) + +-corenet_all_recvfrom_unlabeled(snmpd_t) + corenet_all_recvfrom_netlabel(snmpd_t) + corenet_tcp_sendrecv_generic_if(snmpd_t) + corenet_udp_sendrecv_generic_if(snmpd_t) +@@ -75,9 +78,7 @@ corenet_udp_bind_snmp_port(snmpd_t) + corenet_tcp_sendrecv_snmp_port(snmpd_t) + corenet_udp_sendrecv_snmp_port(snmpd_t) + +-corenet_sendrecv_snmp_client_packets(snmpd_t) + corenet_tcp_connect_agentx_port(snmpd_t) +-corenet_sendrecv_snmp_server_packets(snmpd_t) + corenet_tcp_bind_agentx_port(snmpd_t) + corenet_udp_bind_agentx_port(snmpd_t) + corenet_tcp_sendrecv_agentx_port(snmpd_t) +@@ -94,7 +95,6 @@ domain_signull_all_domains(snmpd_t) + domain_read_all_domains_state(snmpd_t) + domain_exec_all_entry_files(snmpd_t) + +-files_read_usr_files(snmpd_t) + files_read_etc_runtime_files(snmpd_t) + files_search_home(snmpd_t) + +@@ -107,15 +107,19 @@ fs_search_auto_mountpoints(snmpd_t) + storage_dontaudit_read_fixed_disk(snmpd_t) + storage_dontaudit_read_removable_device(snmpd_t) + storage_dontaudit_write_removable_device(snmpd_t) ++storage_getattr_fixed_disk_dev(snmpd_t) ++storage_getattr_removable_dev(snmpd_t) + + auth_use_nsswitch(snmpd_t) + + init_read_utmp(snmpd_t) + init_dontaudit_write_utmp(snmpd_t) ++# need write to /var/run/systemd/notify ++init_write_pid_socket(snmpd_t) + + logging_send_syslog_msg(snmpd_t) + +-miscfiles_read_localization(snmpd_t) ++sysnet_read_config(snmpd_t) + + seutil_dontaudit_search_config(snmpd_t) + +@@ -131,7 +135,11 @@ optional_policy(` + ') + + optional_policy(` +- corosync_stream_connect(snmpd_t) ++ fstools_domtrans(snmpd_t) ++') ++ ++optional_policy(` ++ rhcs_stream_connect_cluster(snmpd_t) + ') + + optional_policy(` +@@ -140,6 +148,7 @@ optional_policy(` + + optional_policy(` + mta_read_config(snmpd_t) ++ mta_read_aliases(snmpd_t) + mta_search_queue(snmpd_t) + ') + +diff --git a/snort.if b/snort.if +index 7d86b34857..5f581804e2 100644 +--- a/snort.if ++++ b/snort.if +@@ -42,8 +42,11 @@ interface(`snort_admin',` + type snort_etc_t, snort_initrc_exec_t; + ') + +- allow $1 snort_t:process { ptrace signal_perms }; ++ allow $1 snort_t:process signal_perms; + ps_process_pattern($1, snort_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 snort_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, snort_initrc_exec_t) + domain_system_change_exemption($1) +@@ -51,11 +54,11 @@ interface(`snort_admin',` + allow $2 system_r; + + admin_pattern($1, snort_etc_t) +- files_search_etc($1) ++ files_list_etc($1) + + admin_pattern($1, snort_log_t) +- logging_search_logs($1) ++ logging_list_logs($1) + + admin_pattern($1, snort_var_run_t) +- files_search_pids($1) ++ files_list_pids($1) + ') +diff --git a/snort.te b/snort.te +index 1af72df55e..d545f2aea9 100644 +--- a/snort.te ++++ b/snort.te +@@ -29,13 +29,16 @@ files_pid_file(snort_var_run_t) + # Local policy + # + +-allow snort_t self:capability { setgid setuid net_admin net_raw dac_override }; ++allow snort_t self:capability { setgid setuid net_admin net_raw dac_read_search dac_override }; + dontaudit snort_t self:capability sys_tty_config; + allow snort_t self:process signal_perms; ++allow snort_t self:netlink_route_socket create_netlink_socket_perms; + allow snort_t self:netlink_socket create_socket_perms; +-allow snort_t self:tcp_socket { accept listen }; ++allow snort_t self:tcp_socket create_stream_socket_perms; ++allow snort_t self:udp_socket create_socket_perms; + allow snort_t self:packet_socket create_socket_perms; + allow snort_t self:socket create_socket_perms; ++# Snort IPS node. unverified. + allow snort_t self:netlink_firewall_socket create_socket_perms; + + allow snort_t snort_etc_t:dir list_dir_perms; +@@ -43,9 +46,7 @@ allow snort_t snort_etc_t:file read_file_perms; + allow snort_t snort_etc_t:lnk_file read_lnk_file_perms; + + manage_dirs_pattern(snort_t, snort_log_t, snort_log_t) +-append_files_pattern(snort_t, snort_log_t, snort_log_t) +-create_files_pattern(snort_t, snort_log_t, snort_log_t) +-setattr_files_pattern(snort_t, snort_log_t, snort_log_t) ++manage_files_pattern(snort_t, snort_log_t, snort_log_t) + logging_log_filetrans(snort_t, snort_log_t, { file dir }) + + manage_dirs_pattern(snort_t, snort_tmp_t, snort_tmp_t) +@@ -63,7 +64,6 @@ kernel_request_load_module(snort_t) + kernel_dontaudit_read_system_state(snort_t) + kernel_read_network_state(snort_t) + +-corenet_all_recvfrom_unlabeled(snort_t) + corenet_all_recvfrom_netlabel(snort_t) + corenet_tcp_sendrecv_generic_if(snort_t) + corenet_udp_sendrecv_generic_if(snort_t) +@@ -86,18 +86,19 @@ dev_rw_generic_usb_dev(snort_t) + + domain_use_interactive_fds(snort_t) + +-files_read_etc_files(snort_t) + files_dontaudit_read_etc_runtime_files(snort_t) + + fs_getattr_all_fs(snort_t) + fs_search_auto_mountpoints(snort_t) + ++auth_read_passwd(snort_t) ++ ++auth_use_nsswitch(snort_t) ++ + init_read_utmp(snort_t) + + logging_send_syslog_msg(snort_t) + +-miscfiles_read_localization(snort_t) +- + sysnet_dns_name_resolve(snort_t) + + userdom_dontaudit_use_unpriv_user_fds(snort_t) +diff --git a/sosreport.if b/sosreport.if +index 634c6b4fa5..f6db7a796d 100644 +--- a/sosreport.if ++++ b/sosreport.if +@@ -42,7 +42,7 @@ interface(`sosreport_run',` + ') + + sosreport_domtrans($1) +- roleattribute $2 sospreport_roles; ++ roleattribute $2 sosreport_roles; + ') + + ######################################## +@@ -127,3 +127,22 @@ interface(`sosreport_delete_tmp_files',` + files_delete_tmp_dir_entry($1) + delete_files_pattern($1, sosreport_tmp_t, sosreport_tmp_t) + ') ++ ++######################################## ++## ++## Send a null signal to sosreport. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sosreport_signull',` ++ gen_require(` ++ type sosreport_t; ++ ') ++ ++ allow $1 sosreport_t:process signull; ++') ++ +diff --git a/sosreport.te b/sosreport.te +index f2f507dae3..ff7df2c9d3 100644 +--- a/sosreport.te ++++ b/sosreport.te +@@ -13,15 +13,15 @@ type sosreport_exec_t; + application_domain(sosreport_t, sosreport_exec_t) + role sosreport_roles types sosreport_t; + +-type sosreport_var_run_t; +-files_pid_file(sosreport_var_run_t) +- + type sosreport_tmp_t; + files_tmp_file(sosreport_tmp_t) + + type sosreport_tmpfs_t; + files_tmpfs_file(sosreport_tmpfs_t) + ++type sosreport_var_run_t; ++files_pid_file(sosreport_var_run_t) ++ + optional_policy(` + pulseaudio_tmpfs_content(sosreport_tmpfs_t) + ') +@@ -31,12 +31,14 @@ optional_policy(` + # Local policy + # + +-allow sosreport_t self:capability { kill net_admin net_raw setuid sys_admin sys_nice dac_override }; ++allow sosreport_t self:capability { kill net_admin net_raw setuid sys_admin sys_nice dac_read_search dac_override }; + dontaudit sosreport_t self:capability sys_ptrace; +-allow sosreport_t self:process { setsched signull }; ++allow sosreport_t self:process { setpgid setsched signal_perms }; + allow sosreport_t self:fifo_file rw_fifo_file_perms; + allow sosreport_t self:tcp_socket { accept listen }; + allow sosreport_t self:unix_stream_socket { accept listen }; ++allow sosreport_t self:rawip_socket create_socket_perms; ++allow sosreport_t self:netlink_kobject_uevent_socket create_socket_perms; + + manage_dirs_pattern(sosreport_t, sosreport_tmp_t, sosreport_tmp_t) + manage_files_pattern(sosreport_t, sosreport_tmp_t, sosreport_tmp_t) +@@ -44,6 +46,12 @@ manage_lnk_files_pattern(sosreport_t, sosreport_tmp_t, sosreport_tmp_t) + files_root_filetrans(sosreport_t, sosreport_tmp_t, file, ".ismount-test-file") + files_tmp_filetrans(sosreport_t, sosreport_tmp_t, { file dir }) + ++manage_files_pattern(sosreport_t, sosreport_var_run_t, sosreport_var_run_t) ++manage_dirs_pattern(sosreport_t, sosreport_var_run_t, sosreport_var_run_t) ++manage_sock_files_pattern(sosreport_t, sosreport_var_run_t, sosreport_var_run_t) ++manage_lnk_files_pattern(sosreport_t, sosreport_var_run_t, sosreport_var_run_t) ++files_pid_filetrans(sosreport_t, sosreport_var_run_t, { file dir sock_file }) ++ + manage_files_pattern(sosreport_t, sosreport_tmpfs_t, sosreport_tmpfs_t) + fs_tmpfs_filetrans(sosreport_t, sosreport_tmpfs_t, file) + +@@ -58,6 +66,18 @@ kernel_read_all_sysctls(sosreport_t) + kernel_read_software_raid_state(sosreport_t) + kernel_search_debugfs(sosreport_t) + kernel_read_messages(sosreport_t) ++kernel_request_load_module(sosreport_t) ++ ++corenet_all_recvfrom_netlabel(sosreport_t) ++corenet_tcp_sendrecv_generic_if(sosreport_t) ++corenet_tcp_sendrecv_generic_node(sosreport_t) ++corenet_tcp_sendrecv_generic_port(sosreport_t) ++corenet_tcp_bind_generic_node(sosreport_t) ++corenet_tcp_bind_all_rpc_ports(sosreport_t) ++corenet_udp_bind_all_rpc_ports(sosreport_t) ++corenet_tcp_connect_http_port(sosreport_t) ++corenet_tcp_connect_all_ports(sosreport_t) ++corenet_sendrecv_http_client_packets(sosreport_t) + + corecmd_exec_all_executables(sosreport_t) + +@@ -69,6 +89,9 @@ dev_read_urand(sosreport_t) + dev_read_raw_memory(sosreport_t) + dev_read_sysfs(sosreport_t) + dev_rw_generic_usb_dev(sosreport_t) ++dev_rw_lvm_control(sosreport_t) ++dev_getattr_all_chr_files(sosreport_t) ++dev_getattr_all_blk_files(sosreport_t) + + domain_getattr_all_domains(sosreport_t) + domain_read_all_domains_state(sosreport_t) +@@ -83,7 +106,6 @@ files_list_all(sosreport_t) + files_read_config_files(sosreport_t) + files_read_generic_tmp_files(sosreport_t) + files_read_non_auth_files(sosreport_t) +-files_read_usr_files(sosreport_t) + files_read_var_lib_files(sosreport_t) + files_read_var_symlinks(sosreport_t) + files_read_kernel_modules(sosreport_t) +@@ -92,25 +114,35 @@ files_manage_etc_runtime_files(sosreport_t) + files_etc_filetrans_etc_runtime(sosreport_t, file) + + fs_getattr_all_fs(sosreport_t) ++fs_getattr_all_dirs(sosreport_t) + fs_list_inotifyfs(sosreport_t) + + storage_dontaudit_read_fixed_disk(sosreport_t) + storage_dontaudit_read_removable_device(sosreport_t) + ++term_getattr_pty_fs(sosreport_t) ++term_getattr_all_ptys(sosreport_t) + term_use_generic_ptys(sosreport_t) + ++# some config files do not have configfile attribute ++# sosreport needs to read various files on system ++files_read_non_security_files(sosreport_t) ++ + auth_use_nsswitch(sosreport_t) ++auth_dontaudit_read_shadow(sosreport_t) + + init_domtrans_script(sosreport_t) ++init_getattr_initctl(sosreport_t) ++init_status(sosreport_t) ++init_stream_connect(sosreport_t) + + libs_domtrans_ldconfig(sosreport_t) ++libs_use_ld_so(sosreport_t) + + logging_read_all_logs(sosreport_t) + logging_send_syslog_msg(sosreport_t) + +-miscfiles_read_localization(sosreport_t) +- +-modutils_read_module_deps(sosreport_t) ++sysnet_read_config(sosreport_t) + + optional_policy(` + abrt_manage_pid_files(sosreport_t) +@@ -118,6 +150,14 @@ optional_policy(` + abrt_stream_connect(sosreport_t) + ') + ++optional_policy(` ++ bootloader_exec(sosreport_t) ++') ++ ++optional_policy(` ++ brctl_domtrans(sosreport_t) ++') ++ + optional_policy(` + cups_stream_connect(sosreport_t) + ') +@@ -126,6 +166,20 @@ optional_policy(` + dmesg_domtrans(sosreport_t) + ') + ++optional_policy(` ++ iptables_domtrans(sosreport_t) ++') ++ ++optional_policy(` ++ lvm_read_config(sosreport_t) ++ lvm_dontaudit_access_check_lock(sosreport_t) ++') ++ ++optional_policy(` ++ # needed by modinfo ++ modutils_read_module_deps(sosreport_t) ++') ++ + optional_policy(` + fstools_domtrans(sosreport_t) + ') +@@ -136,6 +190,14 @@ optional_policy(` + optional_policy(` + hal_dbus_chat(sosreport_t) + ') ++ ++ optional_policy(` ++ rpm_dbus_chat(sosreport_t) ++ ') ++ ++ optional_policy(` ++ networkmanager_dbus_chat(sosreport_t) ++ ') + ') + + optional_policy(` +@@ -146,14 +208,40 @@ optional_policy(` + mount_domtrans(sosreport_t) + ') + ++optional_policy(` ++ prelink_domtrans(sosreport_t) ++') ++ + optional_policy(` + pulseaudio_run(sosreport_t, sosreport_roles) + ') + + optional_policy(` +- rpm_exec(sosreport_t) +- rpm_dontaudit_manage_db(sosreport_t) +- rpm_read_db(sosreport_t) ++ rhsmcertd_manage_lib_files(sosreport_t) ++ rhsmcertd_manage_pid_files(sosreport_t) ++') ++ ++optional_policy(` ++ rpm_dontaudit_manage_db(sosreport_t) ++ rpm_manage_cache(sosreport_t) ++ rpm_manage_log(sosreport_t) ++ rpm_manage_pid_files(sosreport_t) ++ rpm_named_filetrans(sosreport_t) ++ rpm_read_db(sosreport_t) ++ rpm_signull(sosreport_t) ++') ++ ++optional_policy(` ++ setroubleshoot_signull(sosreport_t) ++') ++ ++optional_policy(` ++ systemd_dbus_chat_hostnamed(sosreport_t) ++') ++ ++optional_policy(` ++ unconfined_signull(sosreport_t) ++ unconfined_domain(sosreport_t) + ') + + optional_policy(` +diff --git a/soundserver.if b/soundserver.if +index a5abc5a8db..b9eff74cb8 100644 +--- a/soundserver.if ++++ b/soundserver.if +@@ -38,9 +38,13 @@ interface(`soundserver_admin',` + type soundd_state_t; + ') + +- allow $1 soundd_t:process { ptrace signal_perms }; ++ allow $1 soundd_t:process signal_perms; + ps_process_pattern($1, soundd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 soundd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, soundd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 soundd_initrc_exec_t system_r; +diff --git a/soundserver.te b/soundserver.te +index 0919e0c866..df28aadba4 100644 +--- a/soundserver.te ++++ b/soundserver.te +@@ -32,7 +32,7 @@ files_pid_file(soundd_var_run_t) + # Declarations + # + +-allow soundd_t self:capability dac_override; ++allow soundd_t self:capability { dac_read_search dac_override }; + dontaudit soundd_t self:capability sys_tty_config; + allow soundd_t self:process { setpgid signal_perms }; + allow soundd_t self:shm create_shm_perms; +@@ -65,7 +65,6 @@ kernel_read_kernel_sysctls(soundd_t) + kernel_list_proc(soundd_t) + kernel_read_proc_symlinks(soundd_t) + +-corenet_all_recvfrom_unlabeled(soundd_t) + corenet_all_recvfrom_netlabel(soundd_t) + corenet_tcp_sendrecv_generic_if(soundd_t) + corenet_tcp_sendrecv_generic_node(soundd_t) +@@ -81,7 +80,6 @@ dev_write_sound(soundd_t) + + domain_use_interactive_fds(soundd_t) + +-files_read_etc_files(soundd_t) + files_read_etc_runtime_files(soundd_t) + + fs_getattr_all_fs(soundd_t) +@@ -89,8 +87,6 @@ fs_search_auto_mountpoints(soundd_t) + + logging_send_syslog_msg(soundd_t) + +-miscfiles_read_localization(soundd_t) +- + sysnet_read_config(soundd_t) + + userdom_dontaudit_use_unpriv_user_fds(soundd_t) +diff --git a/spamassassin.fc b/spamassassin.fc +index e9bd097b79..5724bcf0f2 100644 +--- a/spamassassin.fc ++++ b/spamassassin.fc +@@ -1,20 +1,27 @@ +-HOME_DIR/\.spamassassin(/.*)? gen_context(system_u:object_r:spamassassin_home_t,s0) +-HOME_DIR/\.spamd(/.*)? gen_context(system_u:object_r:spamd_home_t,s0) ++HOME_DIR/\.pyzor(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++HOME_DIR/\.razor(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++HOME_DIR/\.spamassassin(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++HOME_DIR/\.spamd(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++/root/\.pyzor(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++/root/\.razor(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++/root/\.spamassassin(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) ++/root/\.spamd(/.*)? gen_context(system_u:object_r:spamc_home_t,s0) + + /etc/rc\.d/init\.d/spamd -- gen_context(system_u:object_r:spamd_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/spampd -- gen_context(system_u:object_r:spamd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/spampd -- gen_context(system_u:object_r:spamd_initrc_exec_t,s0) + /etc/rc\.d/init\.d/mimedefang.* -- gen_context(system_u:object_r:spamd_initrc_exec_t,s0) + + /usr/bin/sa-learn -- gen_context(system_u:object_r:spamc_exec_t,s0) + /usr/bin/spamassassin -- gen_context(system_u:object_r:spamc_exec_t,s0) +-/usr/bin/spamc -- gen_context(system_u:object_r:spamc_exec_t,s0) +-/usr/bin/spamd -- gen_context(system_u:object_r:spamd_exec_t,s0) ++/usr/bin/spamc -- gen_context(system_u:object_r:spamc_exec_t,s0) ++/usr/bin/spamd -- gen_context(system_u:object_r:spamd_exec_t,s0) + /usr/bin/sa-update -- gen_context(system_u:object_r:spamd_update_exec_t,s0) + +-/usr/sbin/spamd -- gen_context(system_u:object_r:spamd_exec_t,s0) +-/usr/sbin/spampd -- gen_context(system_u:object_r:spamd_exec_t,s0) ++/usr/sbin/spamd -- gen_context(system_u:object_r:spamd_exec_t,s0) ++/usr/sbin/spampd -- gen_context(system_u:object_r:spamd_exec_t,s0) + /usr/bin/mimedefang -- gen_context(system_u:object_r:spamd_exec_t,s0) +-/usr/bin/mimedefang-multiplexor -- gen_context(system_u:object_r:spamd_exec_t,s0) ++/usr/bin/mimedefang-multiplexor -- gen_context(system_u:object_r:spamd_exec_t,s0) ++/usr/libexec/mimedefang-wrapper -- gen_context(system_u:object_r:spamd_exec_t,s0) + + /var/lib/spamassassin(/.*)? gen_context(system_u:object_r:spamd_var_lib_t,s0) + /var/lib/spamassassin/compiled(/.*)? gen_context(system_u:object_r:spamd_compiled_t,s0) +@@ -25,7 +32,22 @@ HOME_DIR/\.spamd(/.*)? gen_context(system_u:object_r:spamd_home_t,s0) + /var/run/spamassassin(/.*)? gen_context(system_u:object_r:spamd_var_run_t,s0) + + /var/spool/spamassassin(/.*)? gen_context(system_u:object_r:spamd_spool_t,s0) +-/var/spool/spamd(/.*)? gen_context(system_u:object_r:spamd_spool_t,s0) +-/var/spool/spampd(/.*)? gen_context(system_u:object_r:spamd_spool_t,s0) ++/var/spool/spamd(/.*)? gen_context(system_u:object_r:spamd_spool_t,s0) ++/var/spool/spampd(/.*)? gen_context(system_u:object_r:spamd_spool_t,s0) + /var/spool/MD-Quarantine(/.*)? gen_context(system_u:object_r:spamd_var_run_t,s0) + /var/spool/MIMEDefang(/.*)? gen_context(system_u:object_r:spamd_var_run_t,s0) ++ ++/etc/pyzor(/.*)? gen_context(system_u:object_r:spamd_etc_t, s0) ++/etc/razor(/.*)? gen_context(system_u:object_r:spamd_etc_t,s0) ++/etc/rc\.d/init\.d/pyzord -- gen_context(system_u:object_r:spamd_initrc_exec_t,s0) ++ ++/usr/bin/razor.* -- gen_context(system_u:object_r:spamc_exec_t,s0) ++ ++/var/lib/pyzord(/.*)? gen_context(system_u:object_r:spamd_var_lib_t,s0) ++/var/lib/razor(/.*)? gen_context(system_u:object_r:spamd_var_lib_t,s0) ++ ++/var/log/pyzord\.log.* -- gen_context(system_u:object_r:spamd_log_t,s0) ++/var/log/razor-agent\.log.* -- gen_context(system_u:object_r:spamd_log_t,s0) ++ ++/usr/bin/pyzor -- gen_context(system_u:object_r:spamc_exec_t,s0) ++/usr/bin/pyzord -- gen_context(system_u:object_r:spamd_exec_t,s0) +diff --git a/spamassassin.if b/spamassassin.if +index 1499b0bbfe..e695a62f34 100644 +--- a/spamassassin.if ++++ b/spamassassin.if +@@ -2,39 +2,45 @@ + + ######################################## + ## +-## Role access for spamassassin. ++## Role access for spamassassin + ## + ## + ## +-## Role allowed access. ++## Role allowed access + ## + ## + ## + ## +-## User domain for the role. ++## User domain for the role + ## + ## ++## + # + interface(`spamassassin_role',` + gen_require(` + type spamc_t, spamc_exec_t, spamc_tmp_t; +- type spamassassin_t, spamassassin_exec_t, spamd_home_t; ++ type spamassassin_t, spamassassin_exec_t; + type spamassassin_home_t, spamassassin_tmp_t; + ') + + role $1 types { spamc_t spamassassin_t }; + + domtrans_pattern($2, spamassassin_exec_t, spamassassin_t) ++ ++ allow $2 spamassassin_t:process signal_perms; ++ ps_process_pattern($2, spamassassin_t) ++ + domtrans_pattern($2, spamc_exec_t, spamc_t) + +- allow $2 { spamc_t spamassassin_t}:process { ptrace signal_perms }; +- ps_process_pattern($2, { spamc_t spamassassin_t }) ++ allow $2 spamc_t:process signal_perms; ++ ps_process_pattern($2, spamc_t) + +- allow $2 { spamc_tmp_t spamd_home_t spamassassin_home_t spamassassin_tmp_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { spamc_tmp_t spamd_home_t spamassassin_home_t spamassassin_tmp_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 { spamc_tmp_t spamd_home_t spamassassin_home_t spamassassin_tmp_t }:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, spamassassin_home_t, dir, ".spamassassin") +- userdom_user_home_dir_filetrans($2, spamd_home_t, dir, ".spamd") ++ manage_dirs_pattern($2, spamassassin_home_t, spamassassin_home_t) ++ manage_files_pattern($2, spamassassin_home_t, spamassassin_home_t) ++ manage_lnk_files_pattern($2, spamassassin_home_t, spamassassin_home_t) ++ relabel_dirs_pattern($2, spamassassin_home_t, spamassassin_home_t) ++ relabel_files_pattern($2, spamassassin_home_t, spamassassin_home_t) ++ relabel_lnk_files_pattern($2, spamassassin_home_t, spamassassin_home_t) + ') + + ######################################## +@@ -53,13 +59,12 @@ interface(`spamassassin_exec',` + type spamassassin_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, spamassassin_exec_t) + ') + + ######################################## + ## +-## Send generic signals to spamd. ++## Singnal the spam assassin daemon + ## + ## + ## +@@ -77,7 +82,8 @@ interface(`spamassassin_signal_spamd',` + + ######################################## + ## +-## Execute spamd in the caller domain. ++## Execute the spamassassin daemon ++## program in the caller directory. + ## + ## + ## +@@ -90,13 +96,12 @@ interface(`spamassassin_exec_spamd',` + type spamd_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, spamd_exec_t) + ') + + ######################################## + ## +-## Execute spamc in the spamc domain. ++## Execute spamassassin client in the spamassassin client domain. + ## + ## + ## +@@ -109,32 +114,13 @@ interface(`spamassassin_domtrans_client',` + type spamc_t, spamc_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, spamc_exec_t, spamc_t) ++ allow $1 spamc_exec_t:file ioctl; + ') + + ######################################## + ## +-## Execute spamc in the caller domain. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`spamassassin_exec_client',` +- gen_require(` +- type spamc_exec_t; +- ') +- +- corecmd_search_bin($1) +- can_exec($1, spamc_exec_t) +-') +- +-######################################## +-## +-## Send kill signals to spamc. ++## Send kill signal to spamassassin client + ## + ## + ## +@@ -152,28 +138,28 @@ interface(`spamassassin_kill_client',` + + ######################################## + ## +-## Execute spamassassin standalone client +-## in the user spamassassin domain. ++## Manage spamc home files. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`spamassassin_domtrans_local_client',` ++interface(`spamassassin_manage_home_client',` + gen_require(` +- type spamassassin_t, spamassassin_exec_t; ++ type spamc_home_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, spamassassin_exec_t, spamassassin_t) ++ userdom_search_user_home_dirs($1) ++ manage_dirs_pattern($1, spamc_home_t, spamc_home_t) ++ manage_files_pattern($1, spamc_home_t, spamc_home_t) ++ manage_lnk_files_pattern($1, spamc_home_t, spamc_home_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## spamd home content. ++## Read spamc home files. + ## + ## + ## +@@ -181,20 +167,21 @@ interface(`spamassassin_domtrans_local_client',` + ## + ## + # +-interface(`spamassassin_manage_spamd_home_content',` ++interface(`spamassassin_read_home_client',` + gen_require(` +- type spamd_home_t; ++ type spamc_home_t; + ') + + userdom_search_user_home_dirs($1) +- allow $1 spamd_home_t:dir manage_dir_perms; +- allow $1 spamd_home_t:file manage_file_perms; +- allow $1 spamd_home_t:lnk_file manage_lnk_file_perms; ++ list_dirs_pattern($1, spamc_home_t, spamc_home_t) ++ read_files_pattern($1, spamc_home_t, spamc_home_t) ++ read_lnk_files_pattern($1, spamc_home_t, spamc_home_t) + ') + + ######################################## + ## +-## Relabel spamd home content. ++## Execute the spamassassin client ++## program in the caller directory. + ## + ## + ## +@@ -202,49 +189,35 @@ interface(`spamassassin_manage_spamd_home_content',` + ## + ## + # +-interface(`spamassassin_relabel_spamd_home_content',` ++interface(`spamassassin_exec_client',` + gen_require(` +- type spamd_home_t; ++ type spamc_exec_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 spamd_home_t:dir relabel_dir_perms; +- allow $1 spamd_home_t:file relabel_file_perms; +- allow $1 spamd_home_t:lnk_file relabel_lnk_file_perms; ++ can_exec($1, spamc_exec_t) + ') + + ######################################## + ## +-## Create objects in user home +-## directories with the spamd home type. ++## Execute spamassassin standalone client in the user spamassassin domain. + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. ++## Domain allowed to transition. + ## + ## + # +-interface(`spamassassin_home_filetrans_spamd_home',` ++interface(`spamassassin_domtrans_local_client',` + gen_require(` +- type spamd_home_t; ++ type spamassassin_t, spamassassin_exec_t; + ') + +- userdom_user_home_dir_filetrans($1, spamd_home_t, $2, $3) ++ domtrans_pattern($1, spamassassin_exec_t, spamassassin_t) + ') + + ######################################## + ## +-## Read spamd lib files. ++## read spamd lib files. + ## + ## + ## +@@ -258,7 +231,9 @@ interface(`spamassassin_read_lib_files',` + ') + + files_search_var_lib($1) ++ list_dirs_pattern($1, spamd_var_lib_t, spamd_var_lib_t) + read_files_pattern($1, spamd_var_lib_t, spamd_var_lib_t) ++ read_lnk_files_pattern($1, spamd_var_lib_t, spamd_var_lib_t) + ') + + ######################################## +@@ -283,7 +258,7 @@ interface(`spamassassin_manage_lib_files',` + + ######################################## + ## +-## Read spamd pid files. ++## Read temporary spamd file. + ## + ## + ## +@@ -291,56 +266,56 @@ interface(`spamassassin_manage_lib_files',` + ## + ## + # +-interface(`spamassassin_read_spamd_pid_files',` ++interface(`spamassassin_read_spamd_tmp_files',` + gen_require(` +- type spamd_var_run_t; ++ type spamd_tmp_t; + ') + +- files_search_pids($1) +- read_files_pattern($1, spamd_var_run_t, spamd_var_run_t) ++ files_search_tmp($1) ++ allow $1 spamd_tmp_t:file read_file_perms; + ') + + ######################################## + ## +-## Read temporary spamd files. ++## Do not audit attempts to get attributes of temporary ++## spamd sockets/ + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`spamassassin_read_spamd_tmp_files',` ++interface(`spamassassin_dontaudit_getattr_spamd_tmp_sockets',` + gen_require(` + type spamd_tmp_t; + ') + +- allow $1 spamd_tmp_t:file read_file_perms; ++ dontaudit $1 spamd_tmp_t:sock_file getattr_sock_file_perms; + ') + + ######################################## + ## +-## Do not audit attempts to get +-## attributes of temporary spamd sockets. ++## Connect to run spamd. + ## + ## + ## +-## Domain to not audit. ++## Domain allowed to connect. + ## + ## + # +-interface(`spamassassin_dontaudit_getattr_spamd_tmp_sockets',` ++interface(`spamd_stream_connect',` + gen_require(` +- type spamd_tmp_t; ++ type spamd_t, spamd_var_run_t; + ') + +- dontaudit $1 spamd_tmp_t:sock_file getattr; ++ files_search_pids($1) ++ stream_connect_pattern($1, spamd_var_run_t, spamd_var_run_t, spamd_t) + ') + + ######################################## + ## +-## Connect to spamd with a unix +-## domain stream socket. ++## Read spamd pid files. + ## + ## + ## +@@ -348,19 +323,62 @@ interface(`spamassassin_dontaudit_getattr_spamd_tmp_sockets',` + ## + ## + # +-interface(`spamassassin_stream_connect_spamd',` ++interface(`spamassassin_read_pid_files',` + gen_require(` +- type spamd_t, spamd_var_run_t; ++ type spamd_var_run_t; + ') + + files_search_pids($1) +- stream_connect_pattern($1, spamd_var_run_t, spamd_var_run_t, spamd_t) ++ read_files_pattern($1, spamd_var_run_t, spamd_var_run_t) + ') + ++###################################### ++## ++## Transition to spamassassin named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`spamassassin_filetrans_home_content',` ++ gen_require(` ++ type spamc_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, spamc_home_t, dir, ".pyzor") ++ userdom_user_home_dir_filetrans($1, spamc_home_t, dir, ".spamassassin") ++ userdom_user_home_dir_filetrans($1, spamc_home_t, dir, ".spamd") ++ userdom_user_home_dir_filetrans($1, spamc_home_t, dir, ".razor") ++') ++ ++###################################### ++## ++## Transition to spamassassin named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`spamassassin_filetrans_admin_home_content',` ++ gen_require(` ++ type spamc_home_t; ++ ') ++ ++ userdom_admin_home_dir_filetrans($1, spamc_home_t, dir, ".pyzor") ++ userdom_admin_home_dir_filetrans($1, spamc_home_t, dir, ".spamassassin") ++ userdom_admin_home_dir_filetrans($1, spamc_home_t, dir, ".spamd") ++ userdom_admin_home_dir_filetrans($1, spamc_home_t, dir, ".razor") ++') ++ ++ + ######################################## + ## +-## All of the rules required to +-## administrate an spamassassin environment. ++## All of the rules required to administrate ++## an spamassassin environment + ## + ## + ## +@@ -369,20 +387,22 @@ interface(`spamassassin_stream_connect_spamd',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the spamassassin domain. + ## + ## +-## + # +-interface(`spamassassin_admin',` ++interface(`spamassassin_spamd_admin',` + gen_require(` + type spamd_t, spamd_tmp_t, spamd_log_t; + type spamd_spool_t, spamd_var_lib_t, spamd_var_run_t; + type spamd_initrc_exec_t; + ') + +- allow $1 spamd_t:process { ptrace signal_perms }; ++ allow $1 spamd_t:process signal_perms; + ps_process_pattern($1, spamd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 spamd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, spamd_initrc_exec_t) + domain_system_change_exemption($1) +@@ -403,6 +423,4 @@ interface(`spamassassin_admin',` + + files_list_pids($1) + admin_pattern($1, spamd_var_run_t) +- +- spamassassin_role($2, $1) + ') +diff --git a/spamassassin.te b/spamassassin.te +index cc58e3578f..c7a301d4fd 100644 +--- a/spamassassin.te ++++ b/spamassassin.te +@@ -7,50 +7,30 @@ policy_module(spamassassin, 2.6.1) + + ## + ##

      +-## Determine whether spamassassin +-## clients can use the network. ++## Allow user spamassassin clients to use the network. + ##

      + ##
      + gen_tunable(spamassassin_can_network, false) + + ## + ##

      +-## Determine whether spamd can manage +-## generic user home content. ++## Allow spamd to read/write user home directories. + ##

      + ##
      +-gen_tunable(spamd_enable_home_dirs, false) ++gen_tunable(spamd_enable_home_dirs, true) ++ ++## ++##

      ++## Allow spamd_update to connect to all ports. ++##

      ++##
      ++gen_tunable(spamd_update_can_network, false) ++ + + type spamd_update_t; + type spamd_update_exec_t; +-init_system_domain(spamd_update_t, spamd_update_exec_t) +- +-type spamassassin_t; +-type spamassassin_exec_t; +-typealias spamassassin_t alias { user_spamassassin_t staff_spamassassin_t sysadm_spamassassin_t }; +-typealias spamassassin_t alias { auditadm_spamassassin_t secadm_spamassassin_t }; +-userdom_user_application_domain(spamassassin_t, spamassassin_exec_t) +- +-type spamassassin_home_t; +-typealias spamassassin_home_t alias { user_spamassassin_home_t staff_spamassassin_home_t sysadm_spamassassin_home_t }; +-typealias spamassassin_home_t alias { auditadm_spamassassin_home_t secadm_spamassassin_home_t }; +-userdom_user_home_content(spamassassin_home_t) +- +-type spamassassin_tmp_t; +-typealias spamassassin_tmp_t alias { user_spamassassin_tmp_t staff_spamassassin_tmp_t sysadm_spamassassin_tmp_t }; +-typealias spamassassin_tmp_t alias { auditadm_spamassassin_tmp_t secadm_spamassassin_tmp_t }; +-userdom_user_tmp_file(spamassassin_tmp_t) +- +-type spamc_t; +-type spamc_exec_t; +-typealias spamc_t alias { user_spamc_t staff_spamc_t sysadm_spamc_t }; +-typealias spamc_t alias { auditadm_spamc_t secadm_spamc_t }; +-userdom_user_application_domain(spamc_t, spamc_exec_t) +- +-type spamc_tmp_t; +-typealias spamc_tmp_t alias { user_spamc_tmp_t staff_spamc_tmp_t sysadm_spamc_tmp_t }; +-typealias spamc_tmp_t alias { auditadm_spamc_tmp_t secadm_spamc_tmp_t }; +-userdom_user_tmp_file(spamc_tmp_t) ++application_domain(spamd_update_t, spamd_update_exec_t) ++role system_r types spamd_update_t; + + type spamd_t; + type spamd_exec_t; +@@ -59,12 +39,6 @@ init_daemon_domain(spamd_t, spamd_exec_t) + type spamd_compiled_t; + files_type(spamd_compiled_t) + +-type spamd_etc_t; +-files_config_file(spamd_etc_t) +- +-type spamd_home_t; +-userdom_user_home_content(spamd_home_t) +- + type spamd_initrc_exec_t; + init_script_file(spamd_initrc_exec_t) + +@@ -72,87 +46,197 @@ type spamd_log_t; + logging_log_file(spamd_log_t) + + type spamd_spool_t; +-files_type(spamd_spool_t) ++files_spool_file(spamd_spool_t) + + type spamd_tmp_t; + files_tmp_file(spamd_tmp_t) + ++# var/lib files + type spamd_var_lib_t; + files_type(spamd_var_lib_t) + + type spamd_var_run_t; + files_pid_file(spamd_var_run_t) + +-######################################## ++ifdef(`distro_redhat',` ++ # spamassassin client executable ++ type spamc_t; ++ type spamc_exec_t; ++ application_domain(spamc_t, spamc_exec_t) ++ role system_r types spamc_t; ++ ++ type spamd_etc_t; ++ files_config_file(spamd_etc_t) ++ ++ typealias spamc_exec_t alias spamassassin_exec_t; ++ typealias spamc_t alias spamassassin_t; ++ ++ type spamc_home_t; ++ userdom_user_home_content(spamc_home_t) ++ typealias spamc_home_t alias { spamassassin_home_t user_spamassassin_home_t staff_spamassassin_home_t sysadm_spamassassin_home_t }; ++ typealias spamc_home_t alias { auditadm_spamassassin_home_t secadm_spamassassin_home_t }; ++ typealias spamc_home_t alias { user_spamc_home_t staff_spamc_home_t sysadm_spamc_home_t }; ++ typealias spamc_home_t alias { auditadm_spamc_home_t secadm_spamc_home_t }; ++ ++ type spamc_tmp_t; ++ files_tmp_file(spamc_tmp_t) ++ typealias spamc_tmp_t alias spamassassin_tmp_t; ++ typealias spamc_tmp_t alias { user_spamassassin_tmp_t staff_spamassassin_tmp_t sysadm_spamassassin_tmp_t }; ++ typealias spamc_tmp_t alias { auditadm_spamassassin_tmp_t secadm_spamassassin_tmp_t }; ++ ++ typealias spamc_tmp_t alias { user_spamc_tmp_t staff_spamc_tmp_t sysadm_spamc_tmp_t }; ++ typealias spamc_tmp_t alias { auditadm_spamc_tmp_t secadm_spamc_tmp_t }; ++ typealias spamc_t alias pyzor_t; ++ typealias spamc_exec_t alias pyzor_exec_t; ++ typealias spamd_t alias pyzord_t; ++ typealias spamd_initrc_exec_t alias pyzord_initrc_exec_t; ++ typealias spamd_exec_t alias pyzord_exec_t; ++ typealias spamc_tmp_t alias pyzor_tmp_t; ++ typealias spamd_log_t alias pyzor_log_t; ++ typealias spamd_log_t alias pyzord_log_t; ++ typealias spamd_var_lib_t alias pyzor_var_lib_t; ++ typealias spamd_etc_t alias pyzor_etc_t; ++ typealias spamc_home_t alias pyzor_home_t; ++ typealias spamc_home_t alias user_pyzor_home_t; ++ typealias spamc_t alias razor_t; ++ typealias spamc_exec_t alias razor_exec_t; ++ typealias spamd_log_t alias razor_log_t; ++ typealias spamd_var_lib_t alias razor_var_lib_t; ++ typealias spamd_etc_t alias razor_etc_t; ++ typealias spamc_home_t alias razor_home_t; ++ typealias spamc_home_t alias { user_razor_home_t staff_razor_home_t sysadm_razor_home_t }; ++ typealias spamc_home_t alias { auditadm_razor_home_t secadm_razor_home_t }; ++ typealias spamc_tmp_t alias { user_razor_tmp_t staff_razor_tmp_t sysadm_razor_tmp_t }; ++ typealias spamc_tmp_t alias { auditadm_razor_tmp_t secadm_razor_tmp_t }; ++',` ++ type spamassassin_t; ++ type spamassassin_exec_t; ++ typealias spamassassin_t alias { user_spamassassin_t staff_spamassassin_t sysadm_spamassassin_t }; ++ typealias spamassassin_t alias { auditadm_spamassassin_t secadm_spamassassin_t }; ++ application_domain(spamassassin_t, spamassassin_exec_t) ++ ubac_constrained(spamassassin_t) ++ ++ type spamassassin_home_t; ++ typealias spamassassin_home_t alias { user_spamassassin_home_t staff_spamassassin_home_t sysadm_spamassassin_home_t }; ++ typealias spamassassin_home_t alias { auditadm_spamassassin_home_t secadm_spamassassin_home_t }; ++ userdom_user_home_content(spamassassin_home_t) ++ ++ type spamassassin_tmp_t; ++ typealias spamassassin_tmp_t alias { user_spamassassin_tmp_t staff_spamassassin_tmp_t sysadm_spamassassin_tmp_t }; ++ typealias spamassassin_tmp_t alias { auditadm_spamassassin_tmp_t secadm_spamassassin_tmp_t }; ++ files_tmp_file(spamassassin_tmp_t) ++ ubac_constrained(spamassassin_tmp_t) ++ ++ type spamc_t; ++ type spamc_exec_t; ++ typealias spamc_t alias { user_spamc_t staff_spamc_t sysadm_spamc_t }; ++ typealias spamc_t alias { auditadm_spamc_t secadm_spamc_t }; ++ application_domain(spamc_t, spamc_exec_t) ++ ubac_constrained(spamc_t) ++ ++ type spamc_tmp_t; ++ typealias spamc_tmp_t alias { user_spamc_tmp_t staff_spamc_tmp_t sysadm_spamc_tmp_t }; ++ typealias spamc_tmp_t alias { auditadm_spamc_tmp_t secadm_spamc_tmp_t }; ++ files_tmp_file(spamc_tmp_t) ++ ubac_constrained(spamc_tmp_t) ++') ++ ++############################## + # +-# Standalone local policy ++# Standalone program local policy + # + + allow spamassassin_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow spamassassin_t self:fd use; + allow spamassassin_t self:fifo_file rw_fifo_file_perms; ++allow spamassassin_t self:sock_file read_sock_file_perms; ++allow spamassassin_t self:unix_dgram_socket create_socket_perms; ++allow spamassassin_t self:unix_stream_socket create_stream_socket_perms; + allow spamassassin_t self:unix_dgram_socket sendto; +-allow spamassassin_t self:unix_stream_socket { accept connectto listen }; ++allow spamassassin_t self:unix_stream_socket connectto; ++allow spamassassin_t self:shm create_shm_perms; ++allow spamassassin_t self:sem create_sem_perms; ++allow spamassassin_t self:msgq create_msgq_perms; ++allow spamassassin_t self:msg { send receive }; + + manage_dirs_pattern(spamassassin_t, spamassassin_home_t, spamassassin_home_t) + manage_files_pattern(spamassassin_t, spamassassin_home_t, spamassassin_home_t) + manage_lnk_files_pattern(spamassassin_t, spamassassin_home_t, spamassassin_home_t) + manage_fifo_files_pattern(spamassassin_t, spamassassin_home_t, spamassassin_home_t) + manage_sock_files_pattern(spamassassin_t, spamassassin_home_t, spamassassin_home_t) +-userdom_user_home_dir_filetrans(spamassassin_t, spamassassin_home_t, dir, ".spamassassin") + + manage_dirs_pattern(spamassassin_t, spamassassin_tmp_t, spamassassin_tmp_t) + manage_files_pattern(spamassassin_t, spamassassin_tmp_t, spamassassin_tmp_t) + files_tmp_filetrans(spamassassin_t, spamassassin_tmp_t, { file dir }) + ++manage_dirs_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) ++manage_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) ++manage_lnk_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) ++manage_fifo_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) ++manage_sock_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) ++userdom_home_manager(spamassassin_t) ++ + kernel_read_kernel_sysctls(spamassassin_t) + + dev_read_urand(spamassassin_t) + +-fs_getattr_all_fs(spamassassin_t) + fs_search_auto_mountpoints(spamassassin_t) ++fs_getattr_all_fs(spamassassin_t) ++ ++# this should probably be removed ++corecmd_list_bin(spamassassin_t) ++corecmd_read_bin_symlinks(spamassassin_t) ++corecmd_read_bin_files(spamassassin_t) ++corecmd_read_bin_pipes(spamassassin_t) ++corecmd_read_bin_sockets(spamassassin_t) + + domain_use_interactive_fds(spamassassin_t) + +-files_read_etc_files(spamassassin_t) + files_read_etc_runtime_files(spamassassin_t) + files_list_home(spamassassin_t) +-files_read_usr_files(spamassassin_t) + files_dontaudit_search_var(spamassassin_t) + + logging_send_syslog_msg(spamassassin_t) + +-miscfiles_read_localization(spamassassin_t) ++# cjp: this could probably be removed ++seutil_read_config(spamassassin_t) + + sysnet_dns_name_resolve(spamassassin_t) + ++# set tunable if you have spamassassin do DNS lookups + tunable_policy(`spamassassin_can_network',` +- allow spamassassin_t self:tcp_socket { accept listen }; ++ allow spamassassin_t self:tcp_socket create_stream_socket_perms; ++ allow spamassassin_t self:udp_socket create_socket_perms; + +- corenet_all_recvfrom_unlabeled(spamassassin_t) +- corenet_all_recvfrom_netlabel(spamassassin_t) + corenet_tcp_sendrecv_generic_if(spamassassin_t) ++ corenet_udp_sendrecv_generic_if(spamassassin_t) + corenet_tcp_sendrecv_generic_node(spamassassin_t) ++ corenet_udp_sendrecv_generic_node(spamassassin_t) + corenet_tcp_sendrecv_all_ports(spamassassin_t) +- ++ corenet_udp_sendrecv_all_ports(spamassassin_t) + corenet_tcp_connect_all_ports(spamassassin_t) + corenet_sendrecv_all_client_packets(spamassassin_t) ++ corenet_udp_bind_generic_node(spamassassin_t) ++ corenet_udp_bind_generic_port(spamassassin_t) ++ corenet_dontaudit_udp_bind_all_ports(spamassassin_t) ++ ++ sysnet_read_config(spamassassin_t) + ') + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(spamassassin_t) +- fs_manage_nfs_files(spamassassin_t) +- fs_manage_nfs_symlinks(spamassassin_t) ++tunable_policy(`spamd_enable_home_dirs',` ++ userdom_manage_user_home_content_dirs(spamd_t) ++ userdom_manage_user_home_content_files(spamd_t) ++ userdom_manage_user_home_content_symlinks(spamd_t) ++ userdom_exec_user_bin_files(spamd_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(spamassassin_t) +- fs_manage_cifs_files(spamassassin_t) +- fs_manage_cifs_symlinks(spamassassin_t) ++optional_policy(` ++ # Write pid file and socket in ~/.evolution/cache/tmp ++ evolution_home_filetrans(spamd_t, spamd_tmp_t, { file sock_file }) + ') + + optional_policy(` +- tunable_policy(`spamassassin_can_network && allow_ypbind',` ++ tunable_policy(`spamassassin_can_network && nis_enabled',` + nis_use_ypbind_uncond(spamassassin_t) + ') + ') +@@ -160,6 +244,8 @@ optional_policy(` + optional_policy(` + mta_read_config(spamassassin_t) + sendmail_stub(spamassassin_t) ++ sendmail_dontaudit_rw_unix_stream_sockets(spamassassin_t) ++ sendmail_dontaudit_rw_tcp_sockets(spamassassin_t) + ') + + ######################################## +@@ -167,72 +253,95 @@ optional_policy(` + # Client local policy + # + +-allow spamc_t self:capability dac_override; + allow spamc_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow spamc_t self:fd use; + allow spamc_t self:fifo_file rw_fifo_file_perms; ++allow spamc_t self:sock_file read_sock_file_perms; ++allow spamc_t self:shm create_shm_perms; ++allow spamc_t self:sem create_sem_perms; ++allow spamc_t self:msgq create_msgq_perms; ++allow spamc_t self:msg { send receive }; ++allow spamc_t self:unix_dgram_socket create_socket_perms; ++allow spamc_t self:unix_stream_socket create_stream_socket_perms; + allow spamc_t self:unix_dgram_socket sendto; +-allow spamc_t self:unix_stream_socket { accept connectto listen }; +-allow spamc_t self:tcp_socket { accept listen }; ++allow spamc_t self:unix_stream_socket connectto; ++allow spamc_t self:tcp_socket create_stream_socket_perms; ++allow spamc_t self:udp_socket create_socket_perms; ++ ++can_exec(spamc_t, spamc_exec_t) + + manage_dirs_pattern(spamc_t, spamc_tmp_t, spamc_tmp_t) + manage_files_pattern(spamc_t, spamc_tmp_t, spamc_tmp_t) + files_tmp_filetrans(spamc_t, spamc_tmp_t, { file dir }) + +-manage_dirs_pattern(spamc_t, spamassassin_home_t, spamassassin_home_t) +-manage_files_pattern(spamc_t, spamassassin_home_t, spamassassin_home_t) +-manage_lnk_files_pattern(spamc_t, spamassassin_home_t, spamassassin_home_t) +-manage_fifo_files_pattern(spamc_t, spamassassin_home_t, spamassassin_home_t) +-manage_sock_files_pattern(spamc_t, spamassassin_home_t, spamassassin_home_t) +-userdom_user_home_dir_filetrans(spamc_t, spamassassin_home_t, dir, ".spamassassin") ++manage_dirs_pattern(spamc_t, spamc_home_t, spamc_home_t) ++manage_files_pattern(spamc_t, spamc_home_t, spamc_home_t) ++manage_lnk_files_pattern(spamc_t, spamc_home_t, spamc_home_t) ++manage_fifo_files_pattern(spamc_t, spamc_home_t, spamc_home_t) ++manage_sock_files_pattern(spamc_t, spamc_home_t, spamc_home_t) ++userdom_append_user_home_content_files(spamc_t) ++spamassassin_filetrans_home_content(spamc_t) ++spamassassin_filetrans_admin_home_content(spamc_t) ++# for /root/.pyzor ++allow spamc_t self:capability { dac_read_search dac_override }; + + list_dirs_pattern(spamc_t, spamd_var_lib_t, spamd_var_lib_t) + read_files_pattern(spamc_t, spamd_var_lib_t, spamd_var_lib_t) + +-stream_connect_pattern(spamc_t, { spamd_var_run_t spamd_tmp_t }, { spamd_var_run_t spamd_tmp_t }, spamd_t) ++read_files_pattern(spamc_t, spamd_spool_t, spamd_spool_t) ++list_dirs_pattern(spamc_t, spamd_spool_t, spamd_spool_t) ++ ++allow spamc_t spamd_etc_t:dir list_dir_perms; ++allow spamc_t spamd_etc_t:file read_file_perms; ++ ++# Allow connecting to a local spamd ++allow spamc_t spamd_t:unix_stream_socket connectto; ++allow spamc_t spamd_tmp_t:sock_file rw_sock_file_perms; ++spamd_stream_connect(spamc_t) ++allow spamc_t spamd_tmp_t:file read_inherited_file_perms; + + kernel_read_kernel_sysctls(spamc_t) + kernel_read_system_state(spamc_t) + +-corenet_all_recvfrom_unlabeled(spamc_t) ++corecmd_exec_bin(spamc_t) ++ + corenet_all_recvfrom_netlabel(spamc_t) + corenet_tcp_sendrecv_generic_if(spamc_t) ++corenet_udp_sendrecv_generic_if(spamc_t) + corenet_tcp_sendrecv_generic_node(spamc_t) ++corenet_udp_sendrecv_generic_node(spamc_t) + corenet_tcp_sendrecv_all_ports(spamc_t) +- +-corenet_sendrecv_all_client_packets(spamc_t) ++corenet_udp_sendrecv_all_ports(spamc_t) + corenet_tcp_connect_all_ports(spamc_t) ++corenet_sendrecv_all_client_packets(spamc_t) ++corenet_tcp_connect_spamd_port(spamc_t) + +-corecmd_exec_bin(spamc_t) ++fs_search_auto_mountpoints(spamc_t) + +-domain_use_interactive_fds(spamc_t) ++# cjp: these should probably be removed: ++corecmd_list_bin(spamc_t) ++corecmd_read_bin_symlinks(spamc_t) ++corecmd_read_bin_files(spamc_t) ++corecmd_read_bin_pipes(spamc_t) ++corecmd_read_bin_sockets(spamc_t) + +-fs_getattr_all_fs(spamc_t) +-fs_search_auto_mountpoints(spamc_t) ++domain_use_interactive_fds(spamc_t) + + files_read_etc_runtime_files(spamc_t) +-files_read_usr_files(spamc_t) + files_dontaudit_search_var(spamc_t) ++# cjp: this may be removable: + files_list_home(spamc_t) + files_list_var_lib(spamc_t) + +-auth_use_nsswitch(spamc_t) ++fs_search_auto_mountpoints(spamc_t) + +-logging_send_syslog_msg(spamc_t) ++libs_exec_ldconfig(spamc_t) + +-miscfiles_read_localization(spamc_t) ++logging_send_syslog_msg(spamc_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(spamc_t) +- fs_manage_nfs_files(spamc_t) +- fs_manage_nfs_symlinks(spamc_t) +-') ++auth_use_nsswitch(spamc_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(spamc_t) +- fs_manage_cifs_files(spamc_t) +- fs_manage_cifs_symlinks(spamc_t) +-') ++userdom_home_manager(spamc_t) + + optional_policy(` + abrt_stream_connect(spamc_t) +@@ -243,19 +352,31 @@ optional_policy(` + ') + + optional_policy(` ++ # Allow connection to spamd socket above + evolution_stream_connect(spamc_t) + ') + ++optional_policy(` ++ cyrus_stream_connect(spamc_t) ++') ++ + optional_policy(` + milter_manage_spamass_state(spamc_t) + ') + ++optional_policy(` ++ postfix_domtrans_postdrop(spamc_t) ++ postfix_search_spool(spamc_t) ++ postfix_rw_local_pipes(spamc_t) ++ postfix_rw_inherited_master_pipes(spamc_t) ++') ++ + optional_policy(` + mta_send_mail(spamc_t) + mta_read_config(spamc_t) + mta_read_queue(spamc_t) +- sendmail_rw_pipes(spamc_t) + sendmail_stub(spamc_t) ++ sendmail_rw_pipes(spamc_t) + ') + + optional_policy(` +@@ -267,36 +388,40 @@ optional_policy(` + + ######################################## + # +-# Daemon local policy ++# Server local policy + # + +-allow spamd_t self:capability { kill setuid setgid dac_override sys_tty_config }; ++# Spamassassin, when run as root and using per-user config files, ++# setuids to the user running spamc. Comment this if you are not ++# using this ability. ++ ++allow spamd_t self:capability { kill setuid setgid dac_read_search dac_override sys_tty_config }; + dontaudit spamd_t self:capability sys_tty_config; + allow spamd_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow spamd_t self:fd use; + allow spamd_t self:fifo_file rw_fifo_file_perms; ++allow spamd_t self:sock_file read_sock_file_perms; ++allow spamd_t self:shm create_shm_perms; ++allow spamd_t self:sem create_sem_perms; ++allow spamd_t self:msgq create_msgq_perms; ++allow spamd_t self:msg { send receive }; ++allow spamd_t self:unix_dgram_socket create_socket_perms; ++allow spamd_t self:unix_stream_socket create_stream_socket_perms; + allow spamd_t self:unix_dgram_socket sendto; +-allow spamd_t self:unix_stream_socket { accept connectto listen }; +-allow spamd_t self:tcp_socket { accept listen }; ++allow spamd_t self:unix_stream_socket connectto; ++allow spamd_t self:tcp_socket create_stream_socket_perms; ++allow spamd_t self:udp_socket create_socket_perms; + +-manage_dirs_pattern(spamd_t, spamd_home_t, spamd_home_t) +-manage_files_pattern(spamd_t, spamd_home_t, spamd_home_t) +-manage_lnk_files_pattern(spamd_t, spamd_home_t, spamd_home_t) +-manage_fifo_files_pattern(spamd_t, spamd_home_t, spamd_home_t) +-manage_sock_files_pattern(spamd_t, spamd_home_t, spamd_home_t) +-userdom_user_home_dir_filetrans(spamd_t, spamd_home_t, dir, ".spamd") +- +-manage_dirs_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) +-manage_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) +-manage_lnk_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) +-manage_fifo_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) +-manage_sock_files_pattern(spamd_t, spamassassin_home_t, spamassassin_home_t) +-userdom_user_home_dir_filetrans(spamd_t, spamassassin_home_t, dir, ".spamassassin") ++# needed by razor ++list_dirs_pattern(spamd_t, spamd_etc_t, spamd_etc_t) ++read_lnk_files_pattern(spamd_t, spamd_etc_t, spamd_etc_t) ++rw_files_pattern(spamd_t, spamd_etc_t, spamd_etc_t) + ++can_exec(spamd_t, spamd_compiled_t) + manage_dirs_pattern(spamd_t, spamd_compiled_t, spamd_compiled_t) + manage_files_pattern(spamd_t, spamd_compiled_t, spamd_compiled_t) + +-allow spamd_t spamd_log_t:file { append_file_perms create_file_perms setattr_file_perms }; ++manage_files_pattern(spamd_t, spamd_log_t, spamd_log_t) + logging_log_filetrans(spamd_t, spamd_log_t, file) + + manage_dirs_pattern(spamd_t, spamd_spool_t, spamd_spool_t) +@@ -308,7 +433,8 @@ manage_dirs_pattern(spamd_t, spamd_tmp_t, spamd_tmp_t) + manage_files_pattern(spamd_t, spamd_tmp_t, spamd_tmp_t) + files_tmp_filetrans(spamd_t, spamd_tmp_t, { file dir }) + +-allow spamd_t spamd_var_lib_t:dir list_dir_perms; ++# var/lib files for spamd ++manage_dirs_pattern(spamd_t, spamd_var_lib_t, spamd_var_lib_t) + manage_files_pattern(spamd_t, spamd_var_lib_t, spamd_var_lib_t) + manage_lnk_files_pattern(spamd_t, spamd_var_lib_t, spamd_var_lib_t) + +@@ -317,12 +443,13 @@ manage_files_pattern(spamd_t, spamd_var_run_t, spamd_var_run_t) + manage_sock_files_pattern(spamd_t, spamd_var_run_t, spamd_var_run_t) + files_pid_filetrans(spamd_t, spamd_var_run_t, { file dir }) + +-can_exec(spamd_t, { spamd_exec_t spamd_compiled_t }) ++read_files_pattern(spamd_t, spamc_home_t, spamc_home_t) ++ ++can_exec(spamd_t, spamd_exec_t) + + kernel_read_all_sysctls(spamd_t) + kernel_read_system_state(spamd_t) + +-corenet_all_recvfrom_unlabeled(spamd_t) + corenet_all_recvfrom_netlabel(spamd_t) + corenet_tcp_sendrecv_generic_if(spamd_t) + corenet_udp_sendrecv_generic_if(spamd_t) +@@ -331,78 +458,59 @@ corenet_udp_sendrecv_generic_node(spamd_t) + corenet_tcp_sendrecv_all_ports(spamd_t) + corenet_udp_sendrecv_all_ports(spamd_t) + corenet_tcp_bind_generic_node(spamd_t) +-corenet_udp_bind_generic_node(spamd_t) +- +-corenet_sendrecv_spamd_server_packets(spamd_t) + corenet_tcp_bind_spamd_port(spamd_t) +- +-corenet_sendrecv_razor_client_packets(spamd_t) ++corenet_tcp_connect_spamd_port(spamd_t) + corenet_tcp_connect_razor_port(spamd_t) +- +-corenet_sendrecv_smtp_client_packets(spamd_t) + corenet_tcp_connect_smtp_port(spamd_t) +- +-corenet_sendrecv_generic_server_packets(spamd_t) ++corenet_sendrecv_razor_client_packets(spamd_t) ++corenet_sendrecv_spamd_server_packets(spamd_t) ++# spamassassin 3.1 needs this for its ++# DnsResolver.pm module which binds to ++# random ports >= 1024. ++corenet_udp_bind_generic_node(spamd_t) + corenet_udp_bind_generic_port(spamd_t) +- +-corenet_sendrecv_imaze_server_packets(spamd_t) + corenet_udp_bind_imaze_port(spamd_t) +- + corenet_dontaudit_udp_bind_all_ports(spamd_t) +- +-corecmd_exec_bin(spamd_t) ++corenet_sendrecv_imaze_server_packets(spamd_t) ++corenet_sendrecv_generic_server_packets(spamd_t) + + dev_read_sysfs(spamd_t) + dev_read_urand(spamd_t) + +-domain_use_interactive_fds(spamd_t) +- +-files_read_usr_files(spamd_t) +-files_read_etc_runtime_files(spamd_t) +- + fs_getattr_all_fs(spamd_t) + fs_search_auto_mountpoints(spamd_t) + +-auth_use_nsswitch(spamd_t) + auth_dontaudit_read_shadow(spamd_t) + ++corecmd_exec_bin(spamd_t) ++ ++domain_use_interactive_fds(spamd_t) ++ ++files_read_etc_runtime_files(spamd_t) ++# /var/lib/spamassin ++files_read_var_lib_files(spamd_t) ++ + init_dontaudit_rw_utmp(spamd_t) + ++auth_use_nsswitch(spamd_t) ++ + libs_use_ld_so(spamd_t) + libs_use_shared_libs(spamd_t) + + logging_send_syslog_msg(spamd_t) + +-miscfiles_read_localization(spamd_t) +- +-sysnet_use_ldap(spamd_t) +- + userdom_use_unpriv_users_fds(spamd_t) +- +-tunable_policy(`spamd_enable_home_dirs',` +- userdom_manage_user_home_content_dirs(spamd_t) +- userdom_manage_user_home_content_files(spamd_t) +- userdom_manage_user_home_content_symlinks(spamd_t) +-') +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(spamd_t) +- fs_manage_nfs_files(spamd_t) +- fs_manage_nfs_symlinks(spamd_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(spamd_t) +- fs_manage_cifs_files(spamd_t) +- fs_manage_cifs_symlinks(spamd_t) +-') ++userdom_search_user_home_dirs(spamd_t) ++userdom_home_manager(spamd_t) + + optional_policy(` +- amavis_manage_lib_files(spamd_t) ++ antivirus_stream_connect(spamd_t) ++ antivirus_manage_db(spamd_t) + ') + + optional_policy(` +- clamav_stream_connect(spamd_t) ++ exim_manage_spool_dirs(spamd_t) ++ exim_manage_spool_files(spamd_t) + ') + + optional_policy(` +@@ -421,21 +529,17 @@ optional_policy(` + ') + + optional_policy(` +- evolution_home_filetrans(spamd_t, spamd_tmp_t, { file sock_file }) +-') +- +-optional_policy(` +- exim_manage_spool_dirs(spamd_t) +- exim_manage_spool_files(spamd_t) ++ milter_manage_spamass_state(spamd_t) + ') + + optional_policy(` +- milter_manage_spamass_state(spamd_t) ++ mysql_tcp_connect(spamd_t) ++ mysql_search_db(spamd_t) ++ mysql_stream_connect(spamd_t) + ') + + optional_policy(` +- mysql_stream_connect(spamd_t) +- mysql_tcp_connect(spamd_t) ++ logwatch_manage_cache(spamd_t) + ') + + optional_policy(` +@@ -443,8 +547,8 @@ optional_policy(` + ') + + optional_policy(` +- postgresql_stream_connect(spamd_t) + postgresql_tcp_connect(spamd_t) ++ postgresql_stream_connect(spamd_t) + ') + + optional_policy(` +@@ -455,7 +559,17 @@ optional_policy(` + optional_policy(` + razor_domtrans(spamd_t) + razor_read_lib_files(spamd_t) +- razor_manage_home_content(spamd_t) ++') ++ ++optional_policy(` ++ tunable_policy(`spamd_enable_home_dirs',` ++ razor_manage_user_home_files(spamd_t) ++ ') ++') ++ ++optional_policy(` ++ spamassassin_filetrans_home_content(spamd_t) ++ spamassassin_filetrans_admin_home_content(spamd_t) + ') + + optional_policy(` +@@ -463,9 +577,9 @@ optional_policy(` + ') + + optional_policy(` ++ mta_send_mail(spamd_t) + sendmail_stub(spamd_t) + mta_read_config(spamd_t) +- mta_send_mail(spamd_t) + ') + + optional_policy(` +@@ -474,32 +588,32 @@ optional_policy(` + + ######################################## + # +-# Update local policy ++# spamd_update local policy + # + +-allow spamd_update_t self:capability dac_override; + allow spamd_update_t self:fifo_file manage_fifo_file_perms; + allow spamd_update_t self:unix_stream_socket create_stream_socket_perms; ++allow spamd_update_t self:capability dac_read_search; ++dontaudit spamd_update_t self:capability dac_override; + + manage_dirs_pattern(spamd_update_t, spamd_tmp_t, spamd_tmp_t) + manage_files_pattern(spamd_update_t, spamd_tmp_t, spamd_tmp_t) + files_tmp_filetrans(spamd_update_t, spamd_tmp_t, { file dir }) + ++allow spamd_update_t spamd_var_lib_t:dir list_dir_perms; + manage_dirs_pattern(spamd_update_t, spamd_var_lib_t, spamd_var_lib_t) + manage_files_pattern(spamd_update_t, spamd_var_lib_t, spamd_var_lib_t) + manage_lnk_files_pattern(spamd_update_t, spamd_var_lib_t, spamd_var_lib_t) + +-kernel_read_system_state(spamd_update_t) ++allow spamd_update_t spamc_home_t:dir search_dir_perms; ++allow spamd_update_t spamd_tmp_t:file read_file_perms; ++ ++allow spamd_update_t spamc_home_t:dir search_dir_perms; + +-corenet_all_recvfrom_unlabeled(spamd_update_t) +-corenet_all_recvfrom_netlabel(spamd_update_t) +-corenet_tcp_sendrecv_generic_if(spamd_update_t) +-corenet_tcp_sendrecv_generic_node(spamd_update_t) +-corenet_tcp_sendrecv_all_ports(spamd_update_t) ++kernel_read_system_state(spamd_update_t) + +-corenet_sendrecv_http_client_packets(spamd_update_t) ++# for updating rules + corenet_tcp_connect_http_port(spamd_update_t) +-corenet_tcp_sendrecv_http_port(spamd_update_t) + + corecmd_exec_bin(spamd_update_t) + corecmd_exec_shell(spamd_update_t) +@@ -508,25 +622,26 @@ dev_read_urand(spamd_update_t) + + domain_use_interactive_fds(spamd_update_t) + +-files_read_usr_files(spamd_update_t) + + auth_use_nsswitch(spamd_update_t) + auth_dontaudit_read_shadow(spamd_update_t) + +-miscfiles_read_localization(spamd_update_t) ++mta_read_config(spamd_update_t) + +-userdom_use_user_terminals(spamd_update_t) ++userdom_search_admin_dir(spamd_update_t) ++userdom_use_inherited_user_ptys(spamd_update_t) + + optional_policy(` + cron_system_entry(spamd_update_t, spamd_update_exec_t) + ') + +-# probably want a solution same as httpd_use_gpg since this will +-# give spamd_update a path to users gpg keys +-# optional_policy(` +-# gpg_domtrans(spamd_update_t) +-# ') +- + optional_policy(` +- mta_read_config(spamd_update_t) ++ gpg_domtrans(spamd_update_t) ++ gpg_manage_home_content(spamd_update_t) ++') ++ ++tunable_policy(`spamd_update_can_network',` ++ corenet_sendrecv_all_client_packets(spamd_update_t) ++ corenet_tcp_connect_all_ports(spamd_update_t) ++ corenet_tcp_sendrecv_all_ports(spamd_update_t) + ') +diff --git a/speech-dispatcher.fc b/speech-dispatcher.fc +new file mode 100644 +index 0000000000..545f68233e +--- /dev/null ++++ b/speech-dispatcher.fc +@@ -0,0 +1,5 @@ ++/usr/bin/speech-dispatcher -- gen_context(system_u:object_r:speech-dispatcher_exec_t,s0) ++ ++/usr/lib/systemd/system/speech-dispatcherd.service -- gen_context(system_u:object_r:speech-dispatcher_unit_file_t,s0) ++ ++/var/log/speech-dispatcher(/.*)? gen_context(system_u:object_r:speech-dispatcher_log_t,s0) +diff --git a/speech-dispatcher.if b/speech-dispatcher.if +new file mode 100644 +index 0000000000..4cb9104629 +--- /dev/null ++++ b/speech-dispatcher.if +@@ -0,0 +1,143 @@ ++ ++## speech-dispatcher - server process managing speech requests in Speech Dispatcher ++ ++######################################## ++## ++## Execute speech-dispatcher in the speech-dispatcher domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`speech-dispatcher_domtrans',` ++ gen_require(` ++ type speech-dispatcher_t, speech-dispatcher_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, speech-dispatcher_exec_t, speech-dispatcher_t) ++') ++######################################## ++## ++## Read speech-dispatcher's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`speech-dispatcher_read_log',` ++ gen_require(` ++ type speech-dispatcher_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, speech-dispatcher_log_t, speech-dispatcher_log_t) ++') ++ ++######################################## ++## ++## Append to speech-dispatcher log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`speech-dispatcher_append_log',` ++ gen_require(` ++ type speech-dispatcher_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, speech-dispatcher_log_t, speech-dispatcher_log_t) ++') ++ ++######################################## ++## ++## Manage speech-dispatcher log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`speech-dispatcher_manage_log',` ++ gen_require(` ++ type speech-dispatcher_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, speech-dispatcher_log_t, speech-dispatcher_log_t) ++ manage_files_pattern($1, speech-dispatcher_log_t, speech-dispatcher_log_t) ++ manage_lnk_files_pattern($1, speech-dispatcher_log_t, speech-dispatcher_log_t) ++') ++######################################## ++## ++## Execute speech-dispatcher server in the speech-dispatcher domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`speech-dispatcher_systemctl',` ++ gen_require(` ++ type speech-dispatcher_t; ++ type speech-dispatcher_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 speech-dispatcher_unit_file_t:file read_file_perms; ++ allow $1 speech-dispatcher_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, speech-dispatcher_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an speech-dispatcher environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`speech-dispatcher_admin',` ++ gen_require(` ++ type speech-dispatcher_t; ++ type speech-dispatcher_log_t; ++ type speech-dispatcher_unit_file_t; ++ ') ++ ++ allow $1 speech-dispatcher_t:process { signal_perms }; ++ ps_process_pattern($1, speech-dispatcher_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 speech-dispatcher_t:process ptrace; ++ ') ++ ++ logging_search_logs($1) ++ admin_pattern($1, speech-dispatcher_log_t) ++ ++ speech-dispatcher_systemctl($1) ++ admin_pattern($1, speech-dispatcher_unit_file_t) ++ allow $1 speech-dispatcher_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/speech-dispatcher.te b/speech-dispatcher.te +new file mode 100644 +index 0000000000..4739473123 +--- /dev/null ++++ b/speech-dispatcher.te +@@ -0,0 +1,61 @@ ++policy_module(speech-dispatcher, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type speech-dispatcher_t; ++type speech-dispatcher_exec_t; ++init_daemon_domain(speech-dispatcher_t, speech-dispatcher_exec_t) ++application_executable_file(speech-dispatcher_exec_t) ++ ++type speech-dispatcher_home_t; ++userdom_user_home_content(speech-dispatcher_home_t) ++ ++type speech-dispatcher_log_t; ++logging_log_file(speech-dispatcher_log_t) ++ ++type speech-dispatcher_unit_file_t; ++systemd_unit_file(speech-dispatcher_unit_file_t) ++ ++type speech-dispatcher_tmp_t; ++files_tmp_file(speech-dispatcher_tmp_t) ++ ++type speech-dispatcher_tmpfs_t; ++files_tmpfs_file(speech-dispatcher_tmpfs_t) ++ ++######################################## ++# ++# speech-dispatcher local policy ++# ++ ++allow speech-dispatcher_t self:process signal_perms; ++ ++allow speech-dispatcher_t self:fifo_file rw_fifo_file_perms; ++allow speech-dispatcher_t self:unix_stream_socket create_stream_socket_perms; ++allow speech-dispatcher_t self:tcp_socket create_socket_perms; ++ ++manage_dirs_pattern(speech-dispatcher_t, speech-dispatcher_log_t, speech-dispatcher_log_t) ++manage_files_pattern(speech-dispatcher_t, speech-dispatcher_log_t, speech-dispatcher_log_t) ++logging_log_filetrans(speech-dispatcher_t, speech-dispatcher_log_t, { dir }) ++ ++manage_files_pattern(speech-dispatcher_t, speech-dispatcher_tmp_t, speech-dispatcher_tmp_t) ++files_tmp_filetrans(speech-dispatcher_t, speech-dispatcher_tmp_t, { file }) ++ ++manage_files_pattern(speech-dispatcher_t, speech-dispatcher_tmpfs_t, speech-dispatcher_tmpfs_t) ++fs_tmpfs_filetrans(speech-dispatcher_t, speech-dispatcher_tmpfs_t, { file }) ++ ++manage_files_pattern(speech-dispatcher_t, speech-dispatcher_home_t, speech-dispatcher_home_t) ++manage_dirs_pattern(speech-dispatcher_t, speech-dispatcher_home_t, speech-dispatcher_home_t) ++manage_fifo_files_pattern(speech-dispatcher_t, speech-dispatcher_home_t, speech-dispatcher_home_t) ++userdom_filetrans_home_content(speech-dispatcher_t,speech-dispatcher_home_t, dir, ".speech-dispatcher") ++ ++kernel_read_system_state(speech-dispatcher_t) ++ ++auth_read_passwd(speech-dispatcher_t) ++ ++corenet_tcp_connect_pdps_port(speech-dispatcher_t) ++ ++dev_read_urand(speech-dispatcher_t) ++ +diff --git a/speedtouch.te b/speedtouch.te +index b38b8b1801..eb36653b84 100644 +--- a/speedtouch.te ++++ b/speedtouch.te +@@ -39,16 +39,12 @@ dev_read_usbfs(speedmgmt_t) + + domain_use_interactive_fds(speedmgmt_t) + +-files_read_etc_files(speedmgmt_t) +-files_read_usr_files(speedmgmt_t) + + fs_getattr_all_fs(speedmgmt_t) + fs_search_auto_mountpoints(speedmgmt_t) + + logging_send_syslog_msg(speedmgmt_t) + +-miscfiles_read_localization(speedmgmt_t) +- + userdom_dontaudit_use_unpriv_user_fds(speedmgmt_t) + userdom_dontaudit_search_user_home_dirs(speedmgmt_t) + +diff --git a/squid.fc b/squid.fc +index 0a8b0f7c02..2a569691f0 100644 +--- a/squid.fc ++++ b/squid.fc +@@ -1,20 +1,29 @@ +-/etc/squid(/.*)? gen_context(system_u:object_r:squid_conf_t,s0) ++/etc/rc\.d/init\.d/squid -- gen_context(system_u:object_r:squid_initrc_exec_t,s0) ++/etc/squid(/.*)? gen_context(system_u:object_r:squid_conf_t,s0) ++/etc/squid/ssl_db(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) ++/etc/lightsquid(/.*)? gen_context(system_u:object_r:squid_conf_t,s0) + +-/etc/rc\.d/init\.d/squid -- gen_context(system_u:object_r:squid_initrc_exec_t,s0) ++/usr/libexec/squid/cache_swap\.sh -- gen_context(system_u:object_r:squid_exec_t,s0) + +-/usr/lib/squid/cachemgr\.cgi -- gen_context(system_u:object_r:httpd_squid_script_exec_t,s0) ++/usr/lib/squid/cachemgr\.cgi -- gen_context(system_u:object_r:squid_script_exec_t,s0) ++ ++/usr/sbin/lightparser.pl -- gen_context(system_u:object_r:squid_cron_exec_t,s0) + + /usr/sbin/squid -- gen_context(system_u:object_r:squid_exec_t,s0) + + /usr/share/squid(/.*)? gen_context(system_u:object_r:squid_conf_t,s0) ++/usr/share/lightsquid/cgi(/.*)? gen_context(system_u:object_r:squid_script_exec_t,s0) + + /var/cache/squid(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) + + /var/log/squid(/.*)? gen_context(system_u:object_r:squid_log_t,s0) + /var/log/squidGuard(/.*)? gen_context(system_u:object_r:squid_log_t,s0) + +-/var/run/squid\.pid -- gen_context(system_u:object_r:squid_var_run_t,s0) ++/var/run/squid.* gen_context(system_u:object_r:squid_var_run_t,s0) ++ ++/var/spool/squid(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) ++/var/squidGuard(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) + +-/var/spool/squid(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) ++/var/lib/ssl_db(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) + +-/var/squidGuard(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) ++/var/lightsquid(/.*)? gen_context(system_u:object_r:squid_cache_t,s0) +diff --git a/squid.if b/squid.if +index 5e1f0534c7..e7820bce39 100644 +--- a/squid.if ++++ b/squid.if +@@ -72,7 +72,7 @@ interface(`squid_rw_stream_sockets',` + type squid_t; + ') + +- allow $1 squid_t:unix_stream_socket { getattr read write }; ++ allow $1 squid_t:unix_stream_socket rw_socket_perms; + ') + + ######################################## +@@ -85,7 +85,6 @@ interface(`squid_rw_stream_sockets',` + ## Domain to not audit. + ##
      + ## +-## + # + interface(`squid_dontaudit_search_cache',` + gen_require(` +@@ -213,9 +212,13 @@ interface(`squid_admin',` + type squid_initrc_exec_t, squid_tmp_t; + ') + +- allow $1 squid_t:process { ptrace signal_perms }; ++ allow $1 squid_t:process signal_perms; + ps_process_pattern($1, squid_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 squid_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, squid_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 squid_initrc_exec_t system_r; +diff --git a/squid.te b/squid.te +index 03472ed9b2..4b272687e2 100644 +--- a/squid.te ++++ b/squid.te +@@ -29,7 +29,7 @@ type squid_cache_t; + files_type(squid_cache_t) + + type squid_conf_t; +-files_type(squid_conf_t) ++files_config_file(squid_conf_t) + + type squid_initrc_exec_t; + init_script_file(squid_initrc_exec_t) +@@ -37,21 +37,28 @@ init_script_file(squid_initrc_exec_t) + type squid_log_t; + logging_log_file(squid_log_t) + ++type squid_tmpfs_t; ++files_tmpfs_file(squid_tmpfs_t) ++ + type squid_tmp_t; + files_tmp_file(squid_tmp_t) + +-type squid_tmpfs_t; +-files_tmpfs_file(squid_tmpfs_t) + + type squid_var_run_t; + files_pid_file(squid_var_run_t) + ++type squid_cron_t; ++type squid_cron_exec_t; ++init_daemon_domain(squid_cron_t, squid_cron_exec_t) ++application_domain(squid_cron_t, squid_cron_exec_t) ++role system_r types squid_cron_t; ++ + ######################################## + # + # Local policy + # + +-allow squid_t self:capability { setgid kill setuid dac_override sys_resource }; ++allow squid_t self:capability { setgid kill setuid dac_read_search dac_override sys_resource }; + dontaudit squid_t self:capability sys_tty_config; + allow squid_t self:process ~{ ptrace setcurrent setexec setfscreate execmem execstack execheap }; + allow squid_t self:fifo_file rw_fifo_file_perms; +@@ -68,6 +75,7 @@ manage_dirs_pattern(squid_t, squid_cache_t, squid_cache_t) + manage_files_pattern(squid_t, squid_cache_t, squid_cache_t) + manage_lnk_files_pattern(squid_t, squid_cache_t, squid_cache_t) + files_var_filetrans(squid_t, squid_cache_t, dir, "squid") ++filetrans_pattern(squid_t, squid_conf_t, squid_cache_t, dir, "ssl_db") + + allow squid_t squid_conf_t:dir list_dir_perms; + allow squid_t squid_conf_t:file read_file_perms; +@@ -78,15 +86,19 @@ manage_files_pattern(squid_t, squid_log_t, squid_log_t) + manage_lnk_files_pattern(squid_t, squid_log_t, squid_log_t) + logging_log_filetrans(squid_t, squid_log_t, { file dir }) + ++manage_files_pattern(squid_t, squid_tmpfs_t, squid_tmpfs_t) ++manage_dirs_pattern(squid_t, squid_tmpfs_t, squid_tmpfs_t) ++fs_tmpfs_filetrans(squid_t, squid_tmpfs_t, { dir file }) ++allow squid_t squid_tmpfs_t:file map; ++ + manage_dirs_pattern(squid_t, squid_tmp_t, squid_tmp_t) + manage_files_pattern(squid_t, squid_tmp_t, squid_tmp_t) + files_tmp_filetrans(squid_t, squid_tmp_t, { file dir }) + +-manage_files_pattern(squid_t, squid_tmpfs_t, squid_tmpfs_t) +-fs_tmpfs_filetrans(squid_t, squid_tmpfs_t, file) +- ++manage_dirs_pattern(squid_t, squid_var_run_t, squid_var_run_t) + manage_files_pattern(squid_t, squid_var_run_t, squid_var_run_t) +-files_pid_filetrans(squid_t, squid_var_run_t, file) ++manage_sock_files_pattern(squid_t, squid_var_run_t, squid_var_run_t) ++files_pid_filetrans(squid_t, squid_var_run_t, { dir file sock_file }) + + can_exec(squid_t, squid_exec_t) + +@@ -94,7 +106,6 @@ kernel_read_kernel_sysctls(squid_t) + kernel_read_system_state(squid_t) + kernel_read_network_state(squid_t) + +-corenet_all_recvfrom_unlabeled(squid_t) + corenet_all_recvfrom_netlabel(squid_t) + corenet_tcp_sendrecv_generic_if(squid_t) + corenet_udp_sendrecv_generic_if(squid_t) +@@ -132,6 +143,7 @@ corenet_tcp_sendrecv_gopher_port(squid_t) + corenet_udp_sendrecv_gopher_port(squid_t) + + corenet_sendrecv_squid_server_packets(squid_t) ++corenet_sendrecv_squid_client_packets(squid_t) + corenet_tcp_bind_squid_port(squid_t) + corenet_udp_bind_squid_port(squid_t) + corenet_tcp_sendrecv_squid_port(squid_t) +@@ -154,7 +166,6 @@ dev_read_urand(squid_t) + domain_use_interactive_fds(squid_t) + + files_read_etc_runtime_files(squid_t) +-files_read_usr_files(squid_t) + files_search_spool(squid_t) + files_dontaudit_getattr_tmp_dirs(squid_t) + files_getattr_home_dir(squid_t) +@@ -172,11 +183,11 @@ auth_use_nsswitch(squid_t) + auth_domtrans_chk_passwd(squid_t) + + libs_exec_lib_files(squid_t) ++libs_exec_ldconfig(squid_t) + + logging_send_syslog_msg(squid_t) + + miscfiles_read_generic_certs(squid_t) +-miscfiles_read_localization(squid_t) + + userdom_use_unpriv_users_fds(squid_t) + userdom_dontaudit_search_user_home_dirs(squid_t) +@@ -197,28 +208,31 @@ tunable_policy(`squid_use_tproxy',` + + optional_policy(` + apache_content_template(squid) ++ apache_content_alias_template(squid, squid) + +- corenet_all_recvfrom_unlabeled(httpd_squid_script_t) +- corenet_all_recvfrom_netlabel(httpd_squid_script_t) +- corenet_tcp_sendrecv_generic_if(httpd_squid_script_t) +- corenet_tcp_sendrecv_generic_node(httpd_squid_script_t) ++ allow squid_script_t self:tcp_socket create_socket_perms; + +- corenet_sendrecv_http_cache_client_packets(httpd_squid_script_t) +- corenet_tcp_connect_http_cache_port(httpd_squid_script_t) +- corenet_tcp_sendrecv_http_cache_port(httpd_squid_script_t) ++ corenet_all_recvfrom_unlabeled(squid_script_t) ++ corenet_all_recvfrom_netlabel(squid_script_t) ++ corenet_tcp_sendrecv_generic_if(squid_script_t) ++ corenet_tcp_sendrecv_generic_node(squid_script_t) + +- sysnet_dns_name_resolve(httpd_squid_script_t) ++ corenet_sendrecv_http_cache_client_packets(squid_script_t) ++ corenet_tcp_connect_http_cache_port(squid_script_t) ++ corenet_tcp_sendrecv_http_cache_port(squid_script_t) + +- squid_read_config(httpd_squid_script_t) +-') ++ corenet_tcp_connect_squid_port(squid_script_t) + +-optional_policy(` +- cron_system_entry(squid_t, squid_exec_t) ++ sysnet_dns_name_resolve(squid_script_t) ++ ++ optional_policy(` ++ squid_read_config(squid_script_t) ++ ') + ') + + optional_policy(` +- kerberos_manage_host_rcache(squid_t) +- kerberos_tmp_filetrans_host_rcache(squid_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(squid_t, "host_0") ++ kerberos_manage_host_rcache(squid_t) + ') + + optional_policy(` +@@ -236,3 +250,24 @@ optional_policy(` + optional_policy(` + udev_read_db(squid_t) + ') ++ ++######################################## ++# ++# squid cron Local policy ++# ++manage_dirs_pattern(squid_cron_t, squid_cache_t, squid_cache_t) ++manage_files_pattern(squid_cron_t, squid_cache_t, squid_cache_t) ++manage_lnk_files_pattern(squid_cron_t, squid_cache_t, squid_cache_t) ++files_var_filetrans(squid_cron_t, squid_cache_t, dir, "squid") ++ ++read_files_pattern(squid_cron_t, squid_conf_t, squid_conf_t) ++ ++read_files_pattern(squid_cron_t, squid_log_t, squid_log_t) ++ ++corecmd_exec_bin(squid_cron_t) ++ ++dev_read_urand(squid_cron_t) ++ ++optional_policy(` ++ cron_system_entry(squid_cron_t, squid_cron_exec_t) ++') +diff --git a/sssd.fc b/sssd.fc +index dbb005acab..da2394c685 100644 +--- a/sssd.fc ++++ b/sssd.fc +@@ -1,15 +1,23 @@ + /etc/rc\.d/init\.d/sssd -- gen_context(system_u:object_r:sssd_initrc_exec_t,s0) + +-/etc/sssd(/.*)? gen_context(system_u:object_r:sssd_conf_t,s0) ++/etc/sssd(/.*)? gen_context(system_u:object_r:sssd_conf_t,s0) + +-/usr/sbin/sssd -- gen_context(system_u:object_r:sssd_exec_t,s0) ++/usr/sbin/sssd -- gen_context(system_u:object_r:sssd_exec_t,s0) ++/usr/libexec/sssd/sssd_kcm -- gen_context(system_u:object_r:sssd_exec_t,s0) ++/usr/libexec/sssd/sssd_secrets -- gen_context(system_u:object_r:sssd_exec_t,s0) + +-/var/lib/sss(/.*)? gen_context(system_u:object_r:sssd_var_lib_t,s0) ++/usr/lib/systemd/system/sssd.* -- gen_context(system_u:object_r:sssd_unit_file_t,s0) + +-/var/lib/sss/mc(/.*)? gen_context(system_u:object_r:sssd_public_t,s0) ++/usr/libexec/sssd/selinux_child -- gen_context(system_u:object_r:sssd_selinux_manager_exec_t,s0) ++ ++/var/lib/sss(/.*)? gen_context(system_u:object_r:sssd_var_lib_t,s0) ++ ++/var/lib/sss/mc(/.*)? gen_context(system_u:object_r:sssd_public_t,s0) + + /var/lib/sss/pubconf(/.*)? gen_context(system_u:object_r:sssd_public_t,s0) + +-/var/log/sssd(/.*)? gen_context(system_u:object_r:sssd_var_log_t,s0) ++/var/log/sssd(/.*)? gen_context(system_u:object_r:sssd_var_log_t,s0) + +-/var/run/sssd\.pid -- gen_context(system_u:object_r:sssd_var_run_t,s0) ++/var/run/sssd.pid -- gen_context(system_u:object_r:sssd_var_run_t,s0) ++/var/run/secrets\.socket -s gen_context(system_u:object_r:sssd_var_run_t,s0) ++/var/run/\.heim_org\.h5l\.kcm-socket -s gen_context(system_u:object_r:sssd_var_run_t,s0) +diff --git a/sssd.if b/sssd.if +index a24045518c..2d4b9b2faf 100644 +--- a/sssd.if ++++ b/sssd.if +@@ -1,21 +1,21 @@ +-## System Security Services Daemon. ++## System Security Services Daemon + + ####################################### + ## +-## Get attributes of sssd executable files. ++## Allow a domain to getattr on sssd binary. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed to transition. ++## + ## + # + interface(`sssd_getattr_exec',` +- gen_require(` +- type sssd_exec_t; +- ') ++ gen_require(` ++ type sssd_t, sssd_exec_t; ++ ') + +- allow $1 sssd_exec_t:file getattr_file_perms; ++ allow $1 sssd_exec_t:file getattr; + ') + + ######################################## +@@ -33,14 +33,12 @@ interface(`sssd_domtrans',` + type sssd_t, sssd_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, sssd_exec_t, sssd_t) + ') + + ######################################## + ## +-## Execute sssd init scripts in +-## the initrc domain. ++## Execute sssd server in the sssd domain. + ## + ## + ## +@@ -56,49 +54,91 @@ interface(`sssd_initrc_domtrans',` + init_labeled_script_domtrans($1, sssd_initrc_exec_t) + ') + ++######################################## ++## ++## Execute sssd server in the sssd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`sssd_systemctl',` ++ gen_require(` ++ type sssd_t; ++ type sssd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 sssd_unit_file_t:file read_file_perms; ++ allow $1 sssd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, sssd_t) ++') ++ + ####################################### + ## +-## Read sssd configuration content. ++## Read sssd configuration. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`sssd_read_config',` +- gen_require(` +- type sssd_conf_t; +- ') ++ gen_require(` ++ type sssd_conf_t; ++ ') + +- files_search_etc($1) +- list_dirs_pattern($1, sssd_conf_t, sssd_conf_t) +- read_files_pattern($1, sssd_conf_t, sssd_conf_t) ++ files_search_etc($1) ++ list_dirs_pattern($1, sssd_conf_t, sssd_conf_t) ++ read_files_pattern($1, sssd_conf_t, sssd_conf_t) + ') + + ###################################### + ## +-## Write sssd configuration files. ++## Write sssd configuration. + ## + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`sssd_write_config',` +- gen_require(` +- type sssd_conf_t; +- ') ++ gen_require(` ++ type sssd_conf_t; ++ ') ++ ++ files_search_etc($1) ++ write_files_pattern($1, sssd_conf_t, sssd_conf_t) ++') ++ ++##################################### ++## ++## Write sssd configuration. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_create_config',` ++ gen_require(` ++ type sssd_conf_t; ++ ') + +- files_search_etc($1) +- write_files_pattern($1, sssd_conf_t, sssd_conf_t) ++ files_search_etc($1) ++ create_files_pattern($1, sssd_conf_t, sssd_conf_t) + ') + + #################################### + ## +-## Create, read, write, and delete +-## sssd configuration files. ++## Manage sssd configuration. + ## + ## + ## +@@ -107,12 +147,12 @@ interface(`sssd_write_config',` + ## + # + interface(`sssd_manage_config',` +- gen_require(` +- type sssd_conf_t; +- ') ++ gen_require(` ++ type sssd_conf_t; ++ ') + +- files_search_etc($1) +- manage_files_pattern($1, sssd_conf_t, sssd_conf_t) ++ files_search_etc($1) ++ manage_files_pattern($1, sssd_conf_t, sssd_conf_t) + ') + + ######################################## +@@ -131,14 +171,14 @@ interface(`sssd_read_public_files',` + ') + + sssd_search_lib($1) +- allow $1 sssd_public_t:dir list_dir_perms; ++ list_dirs_pattern($1, sssd_public_t, sssd_public_t) + read_files_pattern($1, sssd_public_t, sssd_public_t) ++ allow $1 sssd_public_t:file map; + ') + +-####################################### ++######################################## + ## +-## Create, read, write, and delete +-## sssd public files. ++## Delete sssd public files. + ## + ## + ## +@@ -146,18 +186,55 @@ interface(`sssd_read_public_files',` + ## + ## + # +-interface(`sssd_manage_public_files',` ++interface(`sssd_delete_public_files',` + gen_require(` + type sssd_public_t; + ') + + sssd_search_lib($1) +- manage_files_pattern($1, sssd_public_t, sssd_public_t) ++ allow $1 sssd_public_t:file unlink; ++') ++ ++######################################## ++## ++## Dontaudit read sssd public files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_dontaudit_read_public_files',` ++ gen_require(` ++ type sssd_public_t; ++ ') ++ ++ dontaudit $1 sssd_public_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Manage sssd public files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_manage_public_files',` ++ gen_require(` ++ type sssd_public_t; ++ ') ++ ++ sssd_search_lib($1) ++ manage_files_pattern($1, sssd_public_t, sssd_public_t) + ') + + ######################################## + ## +-## Read sssd pid files. ++## Read sssd PID files. + ## + ## + ## +@@ -176,8 +253,7 @@ interface(`sssd_read_pid_files',` + + ######################################## + ## +-## Create, read, write, and delete +-## sssd pid content. ++## Manage sssd var_run files. + ## + ## + ## +@@ -216,8 +292,7 @@ interface(`sssd_search_lib',` + + ######################################## + ## +-## Do not audit attempts to search +-## sssd lib directories. ++## Do not audit attempts to search sssd lib directories. + ## + ## + ## +@@ -233,6 +308,24 @@ interface(`sssd_dontaudit_search_lib',` + dontaudit $1 sssd_var_lib_t:dir search_dir_perms; + ') + ++######################################## ++## ++## Do not audit attempts to read sssd lib files. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`sssd_dontaudit_read_lib',` ++ gen_require(` ++ type sssd_var_lib_t; ++ ') ++ ++ dontaudit $1 sssd_var_lib_t:file read_file_perms; ++') ++ + ######################################## + ## + ## Read sssd lib files. +@@ -297,8 +390,7 @@ interface(`sssd_dbus_chat',` + + ######################################## + ## +-## Connect to sssd with a unix +-## domain stream socket. ++## Connect to sssd over a unix stream socket. + ## + ## + ## +@@ -317,8 +409,148 @@ interface(`sssd_stream_connect',` + + ######################################## + ## +-## All of the rules required to +-## administrate an sssd environment. ++## Dontaudit attempts to connect to sssd over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_dontaudit_stream_connect',` ++ gen_require(` ++ type sssd_t, sssd_var_lib_t; ++ ') ++ ++ dontaudit $1 sssd_t:unix_stream_socket connectto; ++ dontaudit $1 sssd_var_lib_t:sock_file { read write }; ++') ++ ++######################################## ++## ++## Connect to sssd over a unix stream socket in /var/run. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_run_stream_connect',` ++ gen_require(` ++ type sssd_t, sssd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, sssd_var_run_t, sssd_var_run_t, sssd_t) ++') ++ ++######################################## ++## ++## Dontaudit attempts to connect to sssd over a unix stream socket in /var/run. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_dontaudit_run_stream_connect',` ++ gen_require(` ++ type sssd_t, sssd_var_lib_t; ++ ') ++ ++ dontaudit $1 sssd_t:unix_stream_socket connectto; ++ dontaudit $1 sssd_var_run_t:sock_file { read write }; ++') ++ ++####################################### ++## ++## Manage keys for all user domains. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_manage_keys',` ++ gen_require(` ++ type sssd_t; ++ ') ++ ++ allow $1 sssd_t:key manage_key_perms; ++ allow sssd_t $1:key manage_key_perms; ++') ++ ++####################################### ++## ++## Allow attempts to read and write to ++## sssd pipes ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_rw_inherited_pipes',` ++ gen_require(` ++ type sssd_t; ++ ') ++ ++ allow $1 sssd_t:fifo_file rw_inherited_fifo_file_perms; ++') ++ ++######################################## ++## ++## Allow caller to signull sssd. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_signull',` ++ gen_require(` ++ type sssd_t; ++ ') ++ ++ allow $1 sssd_t:process signull; ++') ++ ++######################################## ++## ++## Transition to sssd named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`sssd_filetrans_named_content',` ++ gen_require(` ++ type sssd_var_run_t; ++ type sssd_var_log_t; ++ type sssd_var_lib_t; ++ type sssd_public_t; ++ type sssd_conf_t; ++ ') ++ ++ files_pid_filetrans($1, sssd_var_run_t, sock_file, "secrets.socket") ++ logging_log_filetrans($1, sssd_var_log_t, dir, "sssd") ++ files_var_lib_filetrans($1, sssd_var_lib_t, dir, "sss") ++ filetrans_pattern($1, sssd_var_lib_t, sssd_public_t, dir, "mc") ++ filetrans_pattern($1, sssd_var_lib_t, sssd_public_t, dir, "pubconf") ++ files_etc_filetrans($1, sssd_conf_t, dir, "sssd") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an sssd environment + ## + ## + ## +@@ -327,7 +559,7 @@ interface(`sssd_stream_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the sssd domain. + ## + ## + ## +@@ -335,27 +567,29 @@ interface(`sssd_stream_connect',` + interface(`sssd_admin',` + gen_require(` + type sssd_t, sssd_public_t, sssd_initrc_exec_t; +- type sssd_var_lib_t, sssd_var_run_t, sssd_conf_t; +- type sssd_log_t; ++ type sssd_unit_file_t; + ') + +- allow $1 sssd_t:process { ptrace signal_perms }; ++ allow $1 sssd_t:process signal_perms; + ps_process_pattern($1, sssd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 sssd_t:process ptrace; ++ ') + ++ # Allow sssd_t to restart the apache service + sssd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 sssd_initrc_exec_t system_r; + allow $2 system_r; + +- files_search_etc($1) +- admin_pattern($1, sssd_conf_t) ++ sssd_manage_pids($1) + +- files_search_var_lib($1) +- admin_pattern($1, { sssd_var_lib_t sssd_public_t }) ++ sssd_manage_lib_files($1) + +- files_search_pids($1) +- admin_pattern($1, sssd_var_run_t) ++ admin_pattern($1, sssd_public_t) ++ ++ sssd_systemctl($1) ++ admin_pattern($1, sssd_unit_file_t) ++ allow $1 sssd_unit_file_t:service all_service_perms; + +- logging_search_logs($1) +- admin_pattern($1, sssd_log_t) + ') +diff --git a/sssd.te b/sssd.te +index 2d8db1fa3b..07cf9c8ac6 100644 +--- a/sssd.te ++++ b/sssd.te +@@ -28,51 +28,58 @@ logging_log_file(sssd_var_log_t) + type sssd_var_run_t; + files_pid_file(sssd_var_run_t) + ++type sssd_unit_file_t; ++systemd_unit_file(sssd_unit_file_t) ++ ++type sssd_selinux_manager_t; ++type sssd_selinux_manager_exec_t; ++application_domain(sssd_selinux_manager_t, sssd_selinux_manager_exec_t) ++role system_r types sssd_selinux_manager_t; ++ + ######################################## + # +-# Local policy ++# sssd local policy + # + +-allow sssd_t self:capability { chown dac_read_search dac_override kill net_admin sys_nice setgid setuid sys_admin sys_resource }; ++allow sssd_t self:capability { ipc_lock chown dac_read_search dac_override kill net_admin sys_nice fowner setgid setuid sys_admin sys_resource }; + allow sssd_t self:capability2 block_suspend; +-allow sssd_t self:process { setfscreate setsched sigkill signal getsched setrlimit }; ++allow sssd_t self:process { setfscreate setsched sigkill signal getsched setrlimit setpgid}; + allow sssd_t self:fifo_file rw_fifo_file_perms; + allow sssd_t self:key manage_key_perms; +-allow sssd_t self:unix_stream_socket { accept connectto listen }; ++allow sssd_t self:unix_stream_socket { create_stream_socket_perms connectto }; + + read_files_pattern(sssd_t, sssd_conf_t, sssd_conf_t) ++list_dirs_pattern(sssd_t, sssd_conf_t, sssd_conf_t) + + manage_dirs_pattern(sssd_t, sssd_public_t, sssd_public_t) + manage_files_pattern(sssd_t, sssd_public_t, sssd_public_t) ++allow sssd_t sssd_public_t:file map; + + manage_dirs_pattern(sssd_t, sssd_var_lib_t, sssd_var_lib_t) + manage_files_pattern(sssd_t, sssd_var_lib_t, sssd_var_lib_t) + manage_lnk_files_pattern(sssd_t, sssd_var_lib_t, sssd_var_lib_t) + manage_sock_files_pattern(sssd_t, sssd_var_lib_t, sssd_var_lib_t) ++allow sssd_t sssd_var_lib_t:file map; + files_var_lib_filetrans(sssd_t, sssd_var_lib_t, { file dir }) + +-append_files_pattern(sssd_t, sssd_var_log_t, sssd_var_log_t) +-create_files_pattern(sssd_t, sssd_var_log_t, sssd_var_log_t) +-setattr_files_pattern(sssd_t, sssd_var_log_t, sssd_var_log_t) ++manage_files_pattern(sssd_t, sssd_var_log_t, sssd_var_log_t) + logging_log_filetrans(sssd_t, sssd_var_log_t, file) + + manage_dirs_pattern(sssd_t, sssd_var_run_t, sssd_var_run_t) + manage_files_pattern(sssd_t, sssd_var_run_t, sssd_var_run_t) +-files_pid_filetrans(sssd_t, sssd_var_run_t, { file dir }) ++manage_sock_files_pattern(sssd_t, sssd_var_run_t, sssd_var_run_t) ++files_pid_filetrans(sssd_t, sssd_var_run_t, { file dir sock_file }) + + kernel_read_network_state(sssd_t) + kernel_read_system_state(sssd_t) ++kernel_request_load_module(sssd_t) + +-corenet_all_recvfrom_unlabeled(sssd_t) +-corenet_all_recvfrom_netlabel(sssd_t) +-corenet_udp_sendrecv_generic_if(sssd_t) +-corenet_udp_sendrecv_generic_node(sssd_t) +-corenet_udp_sendrecv_all_ports(sssd_t) +-corenet_udp_bind_generic_node(sssd_t) +- +-corenet_sendrecv_generic_server_packets(sssd_t) + corenet_udp_bind_generic_port(sssd_t) + corenet_dontaudit_udp_bind_all_ports(sssd_t) ++corenet_tcp_connect_kerberos_password_port(sssd_t) ++corenet_tcp_connect_smbd_port(sssd_t) ++corenet_tcp_connect_http_port(sssd_t) ++corenet_tcp_connect_http_cache_port(sssd_t) + + corecmd_exec_bin(sssd_t) + +@@ -83,28 +90,36 @@ domain_read_all_domains_state(sssd_t) + domain_obj_id_change_exemption(sssd_t) + + files_list_tmp(sssd_t) +-files_read_etc_files(sssd_t) + files_read_etc_runtime_files(sssd_t) +-files_read_usr_files(sssd_t) + files_list_var_lib(sssd_t) + + fs_list_inotifyfs(sssd_t) ++fs_getattr_xattr_fs(sssd_t) + + selinux_validate_context(sssd_t) ++seutil_read_config(sssd_t) + + seutil_read_file_contexts(sssd_t) + # sssd wants to write /etc/selinux//logins/ for SELinux PAM module +-# seutil_rw_login_config_dirs(sssd_t) +-# seutil_manage_login_config_files(sssd_t) ++seutil_rw_login_config_dirs(sssd_t) ++seutil_manage_login_config_files(sssd_t) ++ ++seutil_dontaudit_access_check_load_policy(sssd_t) ++seutil_dontaudit_access_check_setfiles(sssd_t) ++seutil_dontaudit_access_check_semanage_read_lock(sssd_t) ++seutil_dontaudit_access_check_semanage_module_store(sssd_t) + + mls_file_read_to_clearance(sssd_t) + mls_socket_read_to_clearance(sssd_t) + mls_socket_write_to_clearance(sssd_t) + mls_trusted_object(sssd_t) + ++# auth_use_nsswitch(sssd_t) + auth_domtrans_chk_passwd(sssd_t) + auth_domtrans_upd_passwd(sssd_t) + auth_manage_cache(sssd_t) ++# Bogus allow because we don't handle keyring properly in code. ++auth_login_manage_key(sssd_t) + + init_read_utmp(sssd_t) + +@@ -112,18 +127,74 @@ logging_send_syslog_msg(sssd_t) + logging_send_audit_msgs(sssd_t) + + miscfiles_read_generic_certs(sssd_t) +-miscfiles_read_localization(sssd_t) ++miscfiles_dontaudit_access_check_cert(sssd_t) ++miscfiles_map_generic_certs(sssd_t) + + sysnet_dns_name_resolve(sssd_t) + sysnet_use_ldap(sssd_t) + ++userdom_manage_tmp_role(system_r, sssd_t) ++userdom_manage_all_users_keys(sssd_t) ++userdom_dbus_send_all_users(sssd_t) ++userdom_home_reader(sssd_t) ++ + optional_policy(` + dbus_system_bus_client(sssd_t) + dbus_connect_system_bus(sssd_t) + ') + + optional_policy(` +- kerberos_read_config(sssd_t) + kerberos_manage_host_rcache(sssd_t) +- kerberos_tmp_filetrans_host_rcache(sssd_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(sssd_t, "host_0") ++ kerberos_read_home_content(sssd_t) ++ kerberos_rw_config(sssd_t) ++ kerberos_rw_keytab(sssd_t) ++') ++ ++optional_policy(` ++ dirsrv_stream_connect(sssd_t) + ') ++ ++optional_policy(` ++ ldap_stream_connect(sssd_t) ++ ldap_read_certs(sssd_t) ++') ++ ++optional_policy(` ++ samba_manage_var_dirs(sssd_t) ++ samba_manage_var_files(sssd_t) ++') ++ ++optional_policy(` ++ systemd_login_read_pid_files(sssd_t) ++') ++ ++optional_policy(` ++ realmd_read_var_lib(sssd_t) ++') ++ ++######################################## ++# ++# sssd SELinux manager local policy ++# ++ ++allow sssd_selinux_manager_t self:capability { setgid setuid }; ++dontaudit sssd_selinux_manager_t self:capability net_admin; ++ ++domtrans_pattern(sssd_t, sssd_selinux_manager_exec_t, sssd_selinux_manager_t) ++allow sssd_t sssd_selinux_manager_exec_t:file map; ++ ++init_ioctl_stream_sockets(sssd_selinux_manager_t) ++ ++logging_send_audit_msgs(sssd_selinux_manager_t) ++ ++seutil_semanage_policy(sssd_selinux_manager_t) ++seutil_manage_file_contexts(sssd_selinux_manager_t) ++seutil_manage_config(sssd_selinux_manager_t) ++seutil_manage_login_config(sssd_selinux_manager_t) ++seutil_manage_default_contexts(sssd_selinux_manager_t) ++seutil_manage_default_contexts_dirs(sssd_selinux_manager_t) ++ ++seutil_exec_setfiles(sssd_selinux_manager_t) ++logging_dontaudit_search_audit_logs(sssd_selinux_manager_t) ++ +diff --git a/stapserver.fc b/stapserver.fc +new file mode 100644 +index 0000000000..0ccce5918f +--- /dev/null ++++ b/stapserver.fc +@@ -0,0 +1,7 @@ ++/usr/bin/stap-server -- gen_context(system_u:object_r:stapserver_exec_t,s0) ++ ++/var/lib/stap-server(/.*)? gen_context(system_u:object_r:stapserver_var_lib_t,s0) ++ ++/var/log/stap-server(/.*)? gen_context(system_u:object_r:stapserver_log_t,s0) ++ ++/var/run/stap-server(/.*)? gen_context(system_u:object_r:stapserver_var_run_t,s0) +diff --git a/stapserver.if b/stapserver.if +new file mode 100644 +index 0000000000..80c6480555 +--- /dev/null ++++ b/stapserver.if +@@ -0,0 +1,151 @@ ++ ++## Instrumentation System Server ++ ++######################################## ++## ++## Execute stapserver in the stapserver domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`stapserver_domtrans',` ++ gen_require(` ++ type stapserver_t, stapserver_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, stapserver_exec_t, stapserver_t) ++') ++######################################## ++## ++## Read stapserver's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`stapserver_read_log',` ++ gen_require(` ++ type stapserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, stapserver_log_t, stapserver_log_t) ++') ++ ++######################################## ++## ++## Append to stapserver log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`stapserver_append_log',` ++ gen_require(` ++ type stapserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, stapserver_log_t, stapserver_log_t) ++') ++ ++######################################## ++## ++## Manage stapserver log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`stapserver_manage_log',` ++ gen_require(` ++ type stapserver_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, stapserver_log_t, stapserver_log_t) ++ manage_files_pattern($1, stapserver_log_t, stapserver_log_t) ++ manage_lnk_files_pattern($1, stapserver_log_t, stapserver_log_t) ++') ++######################################## ++## ++## Read stapserver PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`stapserver_read_pid_files',` ++ gen_require(` ++ type stapserver_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 stapserver_var_run_t:file read_file_perms; ++') ++ ++####################################### ++## ++## Manage stapserver lib files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`stapserver_manage_lib',` ++ gen_require(` ++ type stapserver_var_lib_t; ++ ') ++ ++ manage_dirs_pattern($1, stapserver_var_lib_t, stapserver_var_lib_t) ++ manage_files_pattern($1, stapserver_var_lib_t, stapserver_var_lib_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an stapserver environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`stapserver_admin',` ++ gen_require(` ++ type stapserver_t; ++ type stapserver_log_t; ++ type stapserver_var_run_t; ++ ') ++ ++ allow $1 stapserver_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, stapserver_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, stapserver_log_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, stapserver_var_run_t) ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/systemtap.te b/stapserver.te +similarity index 62% +rename from systemtap.te +rename to stapserver.te +index ffde368643..fbfffa42ab 100644 +--- a/systemtap.te ++++ b/stapserver.te +@@ -1,4 +1,4 @@ +-policy_module(systemtap, 1.1.0) ++policy_module(stapserver, 1.1.0) + + ######################################## + # +@@ -9,12 +9,6 @@ type stapserver_t; + type stapserver_exec_t; + init_daemon_domain(stapserver_t, stapserver_exec_t) + +-type stapserver_initrc_exec_t; +-init_script_file(stapserver_initrc_exec_t) +- +-type stapserver_conf_t; +-files_config_file(stapserver_conf_t) +- + type stapserver_var_lib_t; + files_type(stapserver_var_lib_t) + +@@ -24,50 +18,64 @@ logging_log_file(stapserver_log_t) + type stapserver_var_run_t; + files_pid_file(stapserver_var_run_t) + ++type stapserver_tmp_t; ++files_tmp_file(stapserver_tmp_t) ++ + ######################################## + # +-# Local policy ++# stapserver local policy + # + +-allow stapserver_t self:capability { dac_override kill setuid setgid }; +-allow stapserver_t self:process { setrlimit setsched signal }; ++#runuser ++allow stapserver_t self:capability { setuid setgid }; ++allow stapserver_t self:process setsched; ++ ++allow stapserver_t self:capability { dac_read_search dac_override kill sys_ptrace}; ++allow stapserver_t self:process { setrlimit signal }; ++ + allow stapserver_t self:fifo_file rw_fifo_file_perms; + allow stapserver_t self:key write; +-allow stapserver_t self:unix_stream_socket { accept listen }; +-allow stapserver_t self:tcp_socket create_stream_socket_perms; +- +-allow stapserver_t stapserver_conf_t:file read_file_perms; ++allow stapserver_t self:unix_stream_socket create_stream_socket_perms; ++allow stapserver_t self:tcp_socket { accept listen }; + + manage_dirs_pattern(stapserver_t, stapserver_var_lib_t, stapserver_var_lib_t) + manage_files_pattern(stapserver_t, stapserver_var_lib_t, stapserver_var_lib_t) + files_var_lib_filetrans(stapserver_t, stapserver_var_lib_t, dir) + + manage_dirs_pattern(stapserver_t, stapserver_log_t, stapserver_log_t) +-append_files_pattern(stapserver_t, stapserver_log_t, stapserver_log_t) +-create_files_pattern(stapserver_t, stapserver_log_t, stapserver_log_t) +-setattr_files_pattern(stapserver_t, stapserver_log_t, stapserver_log_t) ++manage_files_pattern(stapserver_t, stapserver_log_t, stapserver_log_t) + logging_log_filetrans(stapserver_t, stapserver_log_t, dir ) + ++manage_dirs_pattern(stapserver_t, stapserver_tmp_t, stapserver_tmp_t) ++manage_files_pattern(stapserver_t, stapserver_tmp_t, stapserver_tmp_t) ++manage_lnk_files_pattern(stapserver_t, stapserver_tmp_t, stapserver_tmp_t) ++files_tmp_filetrans(stapserver_t, stapserver_tmp_t, { file dir }) ++allow stapserver_t stapserver_tmp_t:file map; ++ + manage_dirs_pattern(stapserver_t, stapserver_var_run_t, stapserver_var_run_t) + manage_files_pattern(stapserver_t, stapserver_var_run_t, stapserver_var_run_t) + files_pid_filetrans(stapserver_t, stapserver_var_run_t, dir ) + +-kernel_read_kernel_sysctls(stapserver_t) + kernel_read_system_state(stapserver_t) ++kernel_read_kernel_sysctls(stapserver_t) ++files_list_kernel_modules(stapserver_t) + + corecmd_exec_bin(stapserver_t) + corecmd_exec_shell(stapserver_t) + + domain_read_all_domains_state(stapserver_t) ++domain_use_interactive_fds(stapserver_t) + +-dev_read_rand(stapserver_t) + dev_read_sysfs(stapserver_t) ++dev_read_rand(stapserver_t) + dev_read_urand(stapserver_t) + + files_list_tmp(stapserver_t) +-files_read_usr_files(stapserver_t) + files_search_kernel_modules(stapserver_t) + ++fs_search_cgroup_dirs(stapserver_t) ++fs_getattr_all_fs(stapserver_t) ++ + auth_use_nsswitch(stapserver_t) + + init_read_utmp(stapserver_t) +@@ -75,11 +83,17 @@ init_read_utmp(stapserver_t) + logging_send_audit_msgs(stapserver_t) + logging_send_syslog_msg(stapserver_t) + +-miscfiles_read_localization(stapserver_t) ++#lspci + miscfiles_read_hwdata(stapserver_t) + ++systemd_dbus_chat_logind(stapserver_t) ++ + userdom_use_user_terminals(stapserver_t) + ++optional_policy(` ++ avahi_dbus_chat(stapserver_t) ++') ++ + optional_policy(` + consoletype_exec(stapserver_t) + ') +@@ -99,3 +113,4 @@ optional_policy(` + optional_policy(` + rpm_exec(stapserver_t) + ') ++ +diff --git a/stunnel.fc b/stunnel.fc +index 49dd63ca10..ae2e798f55 100644 +--- a/stunnel.fc ++++ b/stunnel.fc +@@ -5,3 +5,5 @@ + /usr/sbin/stunnel -- gen_context(system_u:object_r:stunnel_exec_t,s0) + + /var/run/stunnel(/.*)? gen_context(system_u:object_r:stunnel_var_run_t,s0) ++ ++/var/log/stunnel.* -- gen_context(system_u:object_r:stunnel_log_t,s0) +diff --git a/stunnel.te b/stunnel.te +index 27a8480bc9..89b475bcb7 100644 +--- a/stunnel.te ++++ b/stunnel.te +@@ -12,6 +12,9 @@ init_daemon_domain(stunnel_t, stunnel_exec_t) + type stunnel_etc_t; + files_config_file(stunnel_etc_t) + ++type stunnel_log_t; ++logging_log_file(stunnel_log_t) ++ + type stunnel_tmp_t; + files_tmp_file(stunnel_tmp_t) + +@@ -23,9 +26,9 @@ files_pid_file(stunnel_var_run_t) + # Local policy + # + +-allow stunnel_t self:capability { setgid setuid sys_chroot }; ++allow stunnel_t self:capability { setgid setuid sys_nice sys_chroot }; + dontaudit stunnel_t self:capability sys_tty_config; +-allow stunnel_t self:process signal_perms; ++allow stunnel_t self:process { setsched signal_perms }; + allow stunnel_t self:fifo_file rw_fifo_file_perms; + allow stunnel_t self:tcp_socket { accept listen }; + allow stunnel_t self:netlink_tcpdiag_socket r_netlink_socket_perms; +@@ -34,6 +37,9 @@ allow stunnel_t stunnel_etc_t:dir list_dir_perms; + allow stunnel_t stunnel_etc_t:file read_file_perms; + allow stunnel_t stunnel_etc_t:lnk_file read_lnk_file_perms; + ++allow stunnel_t stunnel_log_t:file manage_file_perms; ++logging_log_filetrans(stunnel_t, stunnel_log_t, file) ++ + manage_dirs_pattern(stunnel_t, stunnel_tmp_t, stunnel_tmp_t) + manage_files_pattern(stunnel_t, stunnel_tmp_t, stunnel_tmp_t) + files_tmp_filetrans(stunnel_t, stunnel_tmp_t, { file dir }) +@@ -48,7 +54,6 @@ kernel_read_network_state(stunnel_t) + + corecmd_exec_bin(stunnel_t) + +-corenet_all_recvfrom_unlabeled(stunnel_t) + corenet_all_recvfrom_netlabel(stunnel_t) + corenet_tcp_sendrecv_generic_if(stunnel_t) + corenet_tcp_sendrecv_generic_node(stunnel_t) +@@ -75,7 +80,6 @@ auth_use_nsswitch(stunnel_t) + logging_send_syslog_msg(stunnel_t) + + miscfiles_read_generic_certs(stunnel_t) +-miscfiles_read_localization(stunnel_t) + + userdom_dontaudit_use_unpriv_user_fds(stunnel_t) + userdom_dontaudit_search_user_home_dirs(stunnel_t) +@@ -105,4 +109,5 @@ optional_policy(` + gen_require(` + type stunnel_port_t; + ') ++ + allow stunnel_t stunnel_port_t:tcp_socket name_bind; +diff --git a/svnserve.fc b/svnserve.fc +index effffd0285..0d5c275de9 100644 +--- a/svnserve.fc ++++ b/svnserve.fc +@@ -1,8 +1,15 @@ +-/etc/rc\.d/init\.d/svnserve -- gen_context(system_u:object_r:svnserve_initrc_exec_t,s0) ++/etc/rc.d/init.d/svnserve -- gen_context(system_u:object_r:svnserve_initrc_exec_t,s0) + +-/usr/bin/svnserve -- gen_context(system_u:object_r:svnserve_exec_t,s0) ++/usr/bin/svnserve -- gen_context(system_u:object_r:svnserve_exec_t,s0) + +-/var/lib/subversion/repo(/.*)? gen_context(system_u:object_r:svnserve_content_t,s0) ++/lib/systemd/system/svnserve\.service -- gen_context(system_u:object_r:svnserve_unit_file_t,s0) ++/usr/lib/systemd/system/svnserve\.service -- gen_context(system_u:object_r:svnserve_unit_file_t,s0) + +-/var/run/svnserve(/.*)? gen_context(system_u:object_r:svnserve_var_run_t,s0) +-/var/run/svnserve\.pid -- gen_context(system_u:object_r:svnserve_var_run_t,s0) ++/var/run/svnserve(/.*)? gen_context(system_u:object_r:svnserve_var_run_t,s0) ++/var/run/svnserve.pid -- gen_context(system_u:object_r:svnserve_var_run_t,s0) ++ ++/var/svn(/.*)? gen_context(system_u:object_r:svnserve_content_t,s0) ++/var/subversion/repo(/.*)? gen_context(system_u:object_r:svnserve_content_t,s0) ++/var/lib/subversion/repo(/.*)? gen_context(system_u:object_r:svnserve_content_t,s0) ++ ++/var/log/svnserve(/.*)? gen_context(system_u:object_r:svnserve_log_t,s0) +diff --git a/svnserve.if b/svnserve.if +index 2ac91b6e0a..a97033d2b7 100644 +--- a/svnserve.if ++++ b/svnserve.if +@@ -1,35 +1,119 @@ +-## Server for the svn repository access method. ++ ++## policy for svnserve ++ ++ ++######################################## ++## ++## Transition to svnserve. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`svnserve_domtrans',` ++ gen_require(` ++ type svnserve_t, svnserve_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, svnserve_exec_t, svnserve_t) ++') ++ ++ ++######################################## ++## ++## Execute svnserve server in the svnserve domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`svnserve_initrc_domtrans',` ++ gen_require(` ++ type svnserve_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, svnserve_initrc_exec_t) ++') ++ ++####################################### ++## ++## Execute svnserve server in the svnserve domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`svnserve_systemctl',` ++ gen_require(` ++ type svnserve_t; ++ type svnserve_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 svnserve_unit_file_t:file read_file_perms; ++ allow $1 svnserve_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, svnserve_t) ++') + + ######################################## + ## +-## All of the rules required to +-## administrate an svnserve environment. ++## Read svnserve PID files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++# ++interface(`svnserve_read_pid_files',` ++ gen_require(` ++ type svnserve_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 svnserve_var_run_t:file read_file_perms; ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an svnserve environment ++## ++## + ## +-## Role allowed access. ++## Domain allowed access. + ## + ## +-## + # + interface(`svnserve_admin',` + gen_require(` +- type svnserve_t, svnserve_initrc_exec_t, svnserve_var_run_t; ++ type svnserve_t; ++ type svnserve_var_run_t; ++ type svnserve_unit_file_t; + ') + + allow $1 svnserve_t:process { ptrace signal_perms }; + ps_process_pattern($1, svnserve_t) + +- init_labeled_script_domtrans($1, svnserve_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 svnserve_initrc_exec_t system_r; +- allow $2 system_r; +- + files_search_pids($1) +- admin_pattern($1, httpd_var_run_t) ++ admin_pattern($1, svnserve_var_run_t) ++ ++ svnserve_systemctl($1) ++ admin_pattern($1, svnserve_unit_file_t) ++ allow $1 svnserve_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') ++ +diff --git a/svnserve.te b/svnserve.te +index 49d688d66b..ed880b23c9 100644 +--- a/svnserve.te ++++ b/svnserve.te +@@ -12,12 +12,21 @@ init_daemon_domain(svnserve_t, svnserve_exec_t) + type svnserve_initrc_exec_t; + init_script_file(svnserve_initrc_exec_t) + ++type svnserve_unit_file_t; ++systemd_unit_file(svnserve_unit_file_t) ++ + type svnserve_content_t; + files_type(svnserve_content_t) + + type svnserve_var_run_t; + files_pid_file(svnserve_var_run_t) + ++type svnserve_tmp_t; ++files_tmp_file(svnserve_tmp_t) ++ ++type svnserve_log_t; ++logging_log_file(svnserve_log_t) ++ + ######################################## + # + # Local policy +@@ -27,15 +36,29 @@ allow svnserve_t self:fifo_file rw_fifo_file_perms; + allow svnserve_t self:tcp_socket create_stream_socket_perms; + allow svnserve_t self:unix_stream_socket { listen accept }; + ++manage_dirs_pattern(svnserve_t, svnserve_tmp_t, svnserve_tmp_t) ++manage_files_pattern(svnserve_t, svnserve_tmp_t, svnserve_tmp_t) ++manage_lnk_files_pattern(svnserve_t, svnserve_tmp_t, svnserve_tmp_t) ++files_tmp_filetrans(svnserve_t, svnserve_tmp_t, { file dir }) ++ + manage_dirs_pattern(svnserve_t, svnserve_content_t, svnserve_content_t) + manage_files_pattern(svnserve_t, svnserve_content_t, svnserve_content_t) ++allow svnserve_t svnserve_content_t:file { execute execute_no_trans }; + + manage_dirs_pattern(svnserve_t, svnserve_var_run_t, svnserve_var_run_t) + manage_files_pattern(svnserve_t, svnserve_var_run_t, svnserve_var_run_t) + files_pid_filetrans(svnserve_t, svnserve_var_run_t, { dir file }) + +-files_read_etc_files(svnserve_t) +-files_read_usr_files(svnserve_t) ++manage_files_pattern(svnserve_t, svnserve_log_t, svnserve_log_t) ++manage_dirs_pattern(svnserve_t, svnserve_log_t, svnserve_log_t) ++logging_log_filetrans(svnserve_t, svnserve_log_t, { dir file }) ++ ++kernel_read_system_state(svnserve_t) ++ ++auth_use_nsswitch(svnserve_t) ++ ++corecmd_exec_bin(svnserve_t) ++corecmd_exec_shell(svnserve_t) + + corenet_all_recvfrom_unlabeled(svnserve_t) + corenet_all_recvfrom_netlabel(svnserve_t) +@@ -52,8 +75,20 @@ corenet_tcp_sendrecv_svn_port(svnserve_t) + corenet_udp_bind_svn_port(svnserve_t) + corenet_udp_sendrecv_svn_port(svnserve_t) + +-logging_send_syslog_msg(svnserve_t) ++dev_read_rand(svnserve_t) ++dev_read_urand(svnserve_t) + +-miscfiles_read_localization(svnserve_t) ++logging_send_syslog_msg(svnserve_t) + + sysnet_dns_name_resolve(svnserve_t) ++ ++optional_policy(` ++ kerberos_use(svnserve_t) ++ kerberos_read_keytab(svnserve_t) ++ kerberos_manage_host_rcache(svnserve_t) ++ kerberos_tmp_filetrans_host_rcache(svnserve_t, "svn_0") ++') ++ ++optional_policy(` ++ sasl_connect(svnserve_t) ++') +diff --git a/swift.fc b/swift.fc +new file mode 100644 +index 0000000000..6d897bc25f +--- /dev/null ++++ b/swift.fc +@@ -0,0 +1,36 @@ ++/usr/bin/swift-account-auditor -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-account-reaper -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-account-replicator -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-account-server -- gen_context(system_u:object_r:swift_exec_t,s0) ++ ++/usr/bin/swift-container-auditor -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-container-replicator -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-container-server -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-container-sync -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-container-updater -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-container-reconciler -- gen_context(system_u:object_r:swift_exec_t,s0) ++ ++/usr/bin/swift-object-auditor -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-object-info -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-object-expirer -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-object-replicator -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-object-server -- gen_context(system_u:object_r:swift_exec_t,s0) ++/usr/bin/swift-object-updater -- gen_context(system_u:object_r:swift_exec_t,s0) ++ ++/usr/bin/swift-proxy-server -- gen_context(system_u:object_r:swift_exec_t,s0) ++ ++/usr/lib/systemd/system/openstack-swift.* -- gen_context(system_u:object_r:swift_unit_file_t,s0) ++ ++/var/lock/swift.* gen_context(system_u:object_r:swift_lock_t,s0) ++/var/cache/swift(/.*)? -- gen_context(system_u:object_r:swift_var_cache_t,s0) ++/var/run/swift(/.*)? -- gen_context(system_u:object_r:swift_var_run_t,s0) ++ ++/var/lib/swift(/.*)? gen_context(system_u:object_r:swift_data_t,s0) ++ ++# This seems to be a de-facto standard when using swift. ++/srv/node(/.*)? gen_context(system_u:object_r:swift_data_t,s0) ++ ++# This is specific to RHOS's packstack utility ++ifdef(`distro_redhat', ` ++/srv/loopback-device(/.*)? gen_context(system_u:object_r:swift_data_t,s0) ++') +diff --git a/swift.if b/swift.if +new file mode 100644 +index 0000000000..af26807a78 +--- /dev/null ++++ b/swift.if +@@ -0,0 +1,156 @@ ++ ++## policy for swift ++ ++######################################## ++## ++## Execute TEMPLATE in the swift domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`swift_domtrans',` ++ gen_require(` ++ type swift_t, swift_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, swift_exec_t, swift_t) ++') ++ ++######################################## ++## ++## Read swift PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`swift_read_pid_files',` ++ gen_require(` ++ type swift_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ read_files_pattern($1, swift_var_run_t, swift_var_run_t) ++') ++ ++######################################## ++## ++## Manage swift data files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`swift_manage_data_files',` ++ gen_require(` ++ type swift_data_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, swift_data_t, swift_data_t) ++ manage_dirs_pattern($1, swift_data_t, swift_data_t) ++') ++ ++##################################### ++## ++## Read and write swift lock files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`swift_manage_lock',` ++ gen_require(` ++ type swift_lock_t; ++ ') ++ ++ files_search_locks($1) ++ manage_files_pattern($1, swift_lock_t, swift_lock_t) ++') ++ ++####################################### ++## ++## Transition content labels to swift named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`swift_filetrans_named_lock',` ++ gen_require(` ++ type swift_lock_t; ++ ') ++ ++ files_lock_filetrans($1, swift_lock_t, file, "swift_server.lock") ++') ++ ++######################################## ++## ++## Execute swift server in the swift domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`swift_systemctl',` ++ gen_require(` ++ type swift_t; ++ type swift_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 swift_unit_file_t:file read_file_perms; ++ allow $1 swift_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, swift_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an swift environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`swift_admin',` ++ gen_require(` ++ type swift_t; ++ type swift_var_run_t; ++ type swift_unit_file_t; ++ ') ++ ++ allow $1 swift_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, swift_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, swift_var_run_t) ++ ++ swift_systemctl($1) ++ admin_pattern($1, swift_unit_file_t) ++ allow $1 swift_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/swift.te b/swift.te +new file mode 100644 +index 0000000000..c2f086fe70 +--- /dev/null ++++ b/swift.te +@@ -0,0 +1,129 @@ ++policy_module(swift, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Determine whether swift can ++## connect to all TCP ports ++##

      ++##
      ++gen_tunable(swift_can_network, false) ++ ++ ++type swift_t; ++type swift_exec_t; ++init_daemon_domain(swift_t, swift_exec_t) ++ ++type swift_lock_t; ++files_lock_file(swift_lock_t) ++ ++type swift_tmp_t; ++files_tmp_file(swift_tmp_t) ++ ++type swift_tmpfs_t; ++files_tmpfs_file(swift_tmpfs_t) ++ ++type swift_var_cache_t; ++files_type(swift_var_cache_t) ++ ++type swift_var_run_t; ++files_pid_file(swift_var_run_t) ++ ++type swift_unit_file_t; ++systemd_unit_file(swift_unit_file_t) ++ ++type swift_data_t; ++files_type(swift_data_t) ++ ++######################################## ++# ++# swift local policy ++# ++ ++allow swift_t self:process signal; ++ ++allow swift_t self:fifo_file rw_fifo_file_perms; ++allow swift_t self:tcp_socket create_stream_socket_perms; ++allow swift_t self:unix_stream_socket create_stream_socket_perms; ++allow swift_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(swift_t, swift_lock_t, swift_lock_t) ++manage_files_pattern(swift_t, swift_lock_t, swift_lock_t) ++files_lock_filetrans(swift_t, swift_lock_t, { dir file }) ++ ++manage_dirs_pattern(swift_t, swift_tmp_t, swift_tmp_t) ++manage_files_pattern(swift_t, swift_tmp_t, swift_tmp_t) ++files_tmp_filetrans(swift_t, swift_tmp_t, { dir file }) ++ ++manage_dirs_pattern(swift_t, swift_tmpfs_t, swift_tmpfs_t) ++manage_files_pattern(swift_t, swift_tmpfs_t, swift_tmpfs_t) ++fs_tmpfs_filetrans(swift_t, swift_tmpfs_t, { dir file }) ++ ++manage_dirs_pattern(swift_t, swift_var_cache_t, swift_var_cache_t) ++manage_files_pattern(swift_t, swift_var_cache_t, swift_var_cache_t) ++manage_lnk_files_pattern(swift_t, swift_var_cache_t, swift_var_cache_t) ++files_var_filetrans(swift_t,swift_var_cache_t, { dir file }) ++ ++manage_dirs_pattern(swift_t, swift_var_run_t, swift_var_run_t) ++manage_files_pattern(swift_t, swift_var_run_t, swift_var_run_t) ++manage_lnk_files_pattern(swift_t, swift_var_run_t, swift_var_run_t) ++files_pid_filetrans(swift_t, swift_var_run_t, { dir }) ++ ++# swift makes use of rsync, so we need to give rsync permissions ++# to edit swift_data_t files as well as swift_t those permissions ++manage_dirs_pattern(swift_t, swift_data_t, swift_data_t) ++manage_files_pattern(swift_t, swift_data_t, swift_data_t) ++ ++kernel_dgram_send(swift_t) ++kernel_read_system_state(swift_t) ++kernel_read_network_state(swift_t) ++ ++# bug in swift ++corenet_tcp_bind_xserver_port(swift_t) ++ ++corenet_tcp_bind_swift_port(swift_t) ++corenet_tcp_bind_http_cache_port(swift_t) ++ ++corenet_tcp_connect_xserver_port(swift_t) ++corenet_tcp_connect_swift_port(swift_t) ++corenet_tcp_connect_keystone_port(swift_t) ++corenet_tcp_connect_memcache_port(swift_t) ++corenet_tcp_connect_all_ephemeral_ports(swift_t) ++ ++corecmd_exec_shell(swift_t) ++corecmd_exec_bin(swift_t) ++ ++dev_read_urand(swift_t) ++ ++domain_use_interactive_fds(swift_t) ++ ++files_dontaudit_search_home(swift_t) ++ ++fs_getattr_all_fs(swift_t) ++ ++auth_use_nsswitch(swift_t) ++ ++libs_exec_ldconfig(swift_t) ++ ++logging_send_syslog_msg(swift_t) ++ ++userdom_dontaudit_search_user_home_dirs(swift_t) ++ ++tunable_policy(`swift_can_network',` ++ corenet_sendrecv_all_client_packets(swift_t) ++ corenet_tcp_connect_all_ports(swift_t) ++ corenet_tcp_sendrecv_all_ports(swift_t) ++') ++ ++optional_policy(` ++ apache_search_config(swift_t) ++') ++ ++optional_policy(` ++ rpm_exec(swift_t) ++ rpm_dontaudit_manage_db(swift_t) ++') +diff --git a/swift_alias.fc b/swift_alias.fc +new file mode 100644 +index 0000000000..b7db25411d +--- /dev/null ++++ b/swift_alias.fc +@@ -0,0 +1 @@ ++# Empty +diff --git a/swift_alias.if b/swift_alias.if +new file mode 100644 +index 0000000000..3fed1a374f +--- /dev/null ++++ b/swift_alias.if +@@ -0,0 +1,2 @@ ++ ++## swift_alias policy module +diff --git a/swift_alias.te b/swift_alias.te +new file mode 100644 +index 0000000000..6e39c4ffff +--- /dev/null ++++ b/swift_alias.te +@@ -0,0 +1,26 @@ ++policy_module(swift_alias, 1.0.0) ++ ++# ++# swift_alias.pp policy replaces swift.pp policy ++# which is a part of openstack-selinux.rpm package ++# ++ ++######################################## ++# ++# Declarations ++# ++ ++#call stub interfaces for basic types ++init_stub_initrc() ++corecmd_stub_bin() ++files_stub_var_run() ++files_stub_var() ++systemd_stub_unit_file() ++ ++typealias initrc_t alias swift_t; ++typealias bin_t alias swift_exec_t; ++typealias var_run_t alias swift_var_run_t; ++typealias systemd_unit_file_t alias swift_unit_file_t; ++typealias var_t alias swift_data_t; ++ ++ +diff --git a/sxid.te b/sxid.te +index 01a9d0acd6..154872e4bf 100644 +--- a/sxid.te ++++ b/sxid.te +@@ -40,7 +40,6 @@ kernel_read_kernel_sysctls(sxid_t) + corecmd_exec_bin(sxid_t) + corecmd_exec_shell(sxid_t) + +-corenet_all_recvfrom_unlabeled(sxid_t) + corenet_all_recvfrom_netlabel(sxid_t) + corenet_tcp_sendrecv_generic_if(sxid_t) + corenet_udp_sendrecv_generic_if(sxid_t) +@@ -66,7 +65,7 @@ fs_list_all(sxid_t) + + term_dontaudit_use_console(sxid_t) + +-files_read_non_auth_files(sxid_t) ++files_read_non_security_files(sxid_t) + auth_dontaudit_getattr_shadow(sxid_t) + + init_use_fds(sxid_t) +@@ -74,8 +73,6 @@ init_use_script_ptys(sxid_t) + + logging_send_syslog_msg(sxid_t) + +-miscfiles_read_localization(sxid_t) +- + sysnet_read_config(sxid_t) + + userdom_dontaudit_use_unpriv_user_fds(sxid_t) +diff --git a/sysstat.te b/sysstat.te +index b92f6775a5..efb2f855c4 100644 +--- a/sysstat.te ++++ b/sysstat.te +@@ -20,13 +20,11 @@ logging_log_file(sysstat_log_t) + # Local policy + # + +-allow sysstat_t self:capability { dac_override sys_admin sys_resource sys_tty_config }; ++allow sysstat_t self:capability { dac_read_search dac_override sys_admin sys_resource sys_tty_config }; + allow sysstat_t self:fifo_file rw_fifo_file_perms; + + manage_dirs_pattern(sysstat_t,sysstat_log_t,sysstat_log_t) +-append_files_pattern(sysstat_t, sysstat_log_t, sysstat_log_t) +-create_files_pattern(sysstat_t, sysstat_log_t, sysstat_log_t) +-setattr_files_pattern(sysstat_t, sysstat_log_t, sysstat_log_t) ++manage_files_pattern(sysstat_t, sysstat_log_t, sysstat_log_t) + manage_lnk_files_pattern(sysstat_t,sysstat_log_t,sysstat_log_t) + logging_log_filetrans(sysstat_t, sysstat_log_t, { file dir }) + +@@ -38,6 +36,7 @@ kernel_read_kernel_sysctls(sysstat_t) + kernel_read_fs_sysctls(sysstat_t) + kernel_read_rpc_sysctls(sysstat_t) + ++corecmd_exec_shell(sysstat_t) + corecmd_exec_bin(sysstat_t) + + dev_read_sysfs(sysstat_t) +@@ -45,12 +44,15 @@ dev_read_urand(sysstat_t) + + files_search_var(sysstat_t) + files_read_etc_runtime_files(sysstat_t) ++files_search_all_mountpoints(sysstat_t) + +-fs_getattr_xattr_fs(sysstat_t) ++fs_getattr_all_fs(sysstat_t) + fs_list_inotifyfs(sysstat_t) + ++storage_getattr_fixed_disk_dev(sysstat_t) ++ + term_use_console(sysstat_t) +-term_use_all_terms(sysstat_t) ++term_use_all_inherited_terms(sysstat_t) + + auth_use_nsswitch(sysstat_t) + +@@ -60,10 +62,9 @@ locallogin_use_fds(sysstat_t) + + logging_send_syslog_msg(sysstat_t) + +-miscfiles_read_localization(sysstat_t) +- + userdom_dontaudit_list_user_home_dirs(sysstat_t) + + optional_policy(` + cron_system_entry(sysstat_t, sysstat_exec_t) + ') ++ +diff --git a/systemtap.fc b/systemtap.fc +deleted file mode 100644 +index 1710cbbe8f..0000000000 +--- a/systemtap.fc ++++ /dev/null +@@ -1,11 +0,0 @@ +-/etc/stap-server(/.*)? -- gen_context(system_u:object_r:stapserver_conf_t,s0) +- +-/etc/rc\.d/init\.d/stap-server -- gen_context(system_u:object_r:stapserver_initrc_exec_t,s0) +- +-/usr/bin/stap-server -- gen_context(system_u:object_r:stapserver_exec_t,s0) +- +-/var/lib/stap-server(/.*)? gen_context(system_u:object_r:stapserver_var_lib_t,s0) +- +-/var/log/stap-server(/.*)? gen_context(system_u:object_r:stapserver_log_t,s0) +- +-/var/run/stap-server(/.*)? gen_context(system_u:object_r:stapserver_var_run_t,s0) +diff --git a/systemtap.if b/systemtap.if +deleted file mode 100644 +index c755e2d93c..0000000000 +--- a/systemtap.if ++++ /dev/null +@@ -1,45 +0,0 @@ +-## instrumentation system for Linux. +- +-######################################## +-## +-## All of the rules required to +-## administrate an stapserver environment. +-## +-## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## +-## +-## +-# +-interface(`stapserver_admin',` +- gen_require(` +- type stapserver_t, stapserver_conf_t, stapserver_log_t; +- type stap_server_var_run_t, stapserver_initrc_exec_t, stapserver_var_lib_t; +- ') +- +- allow $1 stapserver_t:process { ptrace signal_perms }; +- ps_process_pattern($1, stapserver_t) +- +- init_labeled_script_domtrans($1, stapserver_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 stapserver_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_etc($1) +- admin_pattern($1, stapserver_conf_t) +- +- files_search_var_lib($1) +- admin_pattern($1, stapserver_var_lib_t) +- +- logging_search_logs($1) +- admin_pattern($1, stapserver_log_t) +- +- files_search_pids($1) +- admin_pattern($1, stapserver_var_run_t) +-') +diff --git a/tangd.fc b/tangd.fc +new file mode 100644 +index 0000000000..530593ba51 +--- /dev/null ++++ b/tangd.fc +@@ -0,0 +1,10 @@ ++/usr/lib/systemd/system/tang.* -- gen_context(system_u:object_r:tangd_unit_file_t,s0) ++/usr/lib/systemd/system/tangd-keygen.* -- gen_context(system_u:object_r:tangd_unit_file_t,s0) ++ ++/usr/libexec/tangd -- gen_context(system_u:object_r:tangd_exec_t,s0) ++/usr/libexec/tangd-keygen -- gen_context(system_u:object_r:tangd_exec_t,s0) ++/usr/libexec/tangd-update -- gen_context(system_u:object_r:tangd_exec_t,s0) ++ ++/var/cache/tang(/.*)? gen_context(system_u:object_r:tangd_cache_t,s0) ++ ++/var/db/tang(/.*)? gen_context(system_u:object_r:tangd_db_t,s0) +diff --git a/tangd.if b/tangd.if +new file mode 100644 +index 0000000000..37c8b69087 +--- /dev/null ++++ b/tangd.if +@@ -0,0 +1,40 @@ ++## policy for tangd ++ ++######################################## ++## ++## Execute tangd_exec_t in the tangd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tangd_domtrans',` ++ gen_require(` ++ type tangd_t, tangd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, tangd_exec_t, tangd_t) ++') ++ ++###################################### ++## ++## Execute tangd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tangd_exec',` ++ gen_require(` ++ type tangd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, tangd_exec_t) ++') ++ +diff --git a/tangd.te b/tangd.te +new file mode 100644 +index 0000000000..ee4c6a4502 +--- /dev/null ++++ b/tangd.te +@@ -0,0 +1,49 @@ ++policy_module(tangd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type tangd_t; ++type tangd_exec_t; ++init_daemon_domain(tangd_t, tangd_exec_t) ++ ++type tangd_unit_file_t; ++systemd_unit_file(tangd_unit_file_t) ++ ++type tangd_cache_t; ++files_pid_file(tangd_cache_t) ++ ++type tangd_db_t; ++files_type(tangd_db_t) ++ ++######################################## ++# ++# tangd local policy ++# ++allow tangd_t self:capability { dac_read_search dac_override }; ++ ++allow tangd_t self:fifo_file rw_fifo_file_perms; ++allow tangd_t self:unix_stream_socket create_stream_socket_perms; ++allow tangd_t self:tcp_socket create_stream_socket_perms; ++ ++manage_files_pattern(tangd_t, tangd_cache_t, tangd_cache_t) ++manage_lnk_files_pattern(tangd_t, tangd_cache_t, tangd_cache_t) ++manage_dirs_pattern(tangd_t, tangd_cache_t, tangd_cache_t) ++files_var_filetrans(tangd_t, tangd_cache_t, { file dir lnk_file }) ++ ++manage_files_pattern(tangd_t, tangd_db_t, tangd_db_t) ++manage_dirs_pattern(tangd_t, tangd_db_t, tangd_db_t) ++ ++kernel_read_system_state(tangd_t) ++ ++auth_read_passwd(tangd_t) ++ ++corenet_tcp_bind_generic_node(tangd_t) ++corenet_tcp_bind_http_port(tangd_t) ++corenet_tcp_bind_tangd_port(tangd_t) ++ ++corecmd_exec_bin(tangd_t) ++ ++miscfiles_read_certs(tangd_t) +diff --git a/targetd.fc b/targetd.fc +new file mode 100644 +index 0000000000..c1ef0535ff +--- /dev/null ++++ b/targetd.fc +@@ -0,0 +1,5 @@ ++/etc/target(/.*)? gen_context(system_u:object_r:targetd_etc_rw_t,s0) ++ ++/usr/bin/targetd -- gen_context(system_u:object_r:targetd_exec_t,s0) ++ ++/usr/lib/systemd/system/targetd.* -- gen_context(system_u:object_r:targetd_unit_file_t,s0) +diff --git a/targetd.if b/targetd.if +new file mode 100644 +index 0000000000..a6e216c732 +--- /dev/null ++++ b/targetd.if +@@ -0,0 +1,167 @@ ++ ++## Targetd is a service to allow the remote configuration of block device volumes and file systems within dedicated pools ++ ++######################################## ++## ++## Execute targetd_exec_t in the targetd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`targetd_domtrans',` ++ gen_require(` ++ type targetd_t, targetd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, targetd_exec_t, targetd_t) ++') ++ ++###################################### ++## ++## Execute targetd in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`targetd_exec',` ++ gen_require(` ++ type targetd_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, targetd_exec_t) ++') ++ ++######################################## ++## ++## Search targetd conf directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`targetd_search_conf',` ++ gen_require(` ++ type targetd_etc_rw_t; ++ ') ++ ++ allow $1 targetd_etc_rw_t:dir search_dir_perms; ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Read targetd conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`targetd_read_conf_files',` ++ gen_require(` ++ type targetd_etc_rw_t; ++ ') ++ ++ allow $1 targetd_etc_rw_t:dir list_dir_perms; ++ read_files_pattern($1, targetd_etc_rw_t, targetd_etc_rw_t) ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Manage targetd conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`targetd_manage_conf_files',` ++ gen_require(` ++ type targetd_etc_rw_t; ++ ') ++ ++ manage_files_pattern($1, targetd_etc_rw_t, targetd_etc_rw_t) ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Execute targetd server in the targetd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`targetd_systemctl',` ++ gen_require(` ++ type targetd_t; ++ type targetd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 targetd_unit_file_t:file read_file_perms; ++ allow $1 targetd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, targetd_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an targetd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`targetd_admin',` ++ gen_require(` ++ type targetd_t; ++ type targetd_etc_rw_t; ++ type targetd_unit_file_t; ++ ') ++ ++ allow $1 targetd_t:process { signal_perms }; ++ ps_process_pattern($1, targetd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 targetd_t:process ptrace; ++ ') ++ ++ files_search_etc($1) ++ admin_pattern($1, targetd_etc_rw_t) ++ ++ targetd_systemctl($1) ++ admin_pattern($1, targetd_unit_file_t) ++ allow $1 targetd_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ +diff --git a/targetd.te b/targetd.te +new file mode 100644 +index 0000000000..3496fd830a +--- /dev/null ++++ b/targetd.te +@@ -0,0 +1,115 @@ ++policy_module(targetd, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type targetd_t; ++type targetd_exec_t; ++init_daemon_domain(targetd_t, targetd_exec_t) ++ ++type targetd_etc_rw_t; ++files_type(targetd_etc_rw_t) ++ ++type targetd_unit_file_t; ++systemd_unit_file(targetd_unit_file_t) ++ ++type targetd_tmp_t; ++files_tmp_file(targetd_tmp_t) ++ ++######################################## ++# ++# targetd local policy ++# ++ ++allow targetd_t self:capability { ipc_lock sys_admin sys_nice }; ++allow targetd_t self:fifo_file rw_fifo_file_perms; ++allow targetd_t self:unix_stream_socket create_stream_socket_perms; ++allow targetd_t self:unix_dgram_socket create_socket_perms; ++allow targetd_t self:tcp_socket { accept listen }; ++allow targetd_t self:netlink_route_socket r_netlink_socket_perms; ++allow targetd_t self:process { setfscreate setsched }; ++ ++manage_dirs_pattern(targetd_t, targetd_etc_rw_t, targetd_etc_rw_t) ++manage_files_pattern(targetd_t, targetd_etc_rw_t, targetd_etc_rw_t) ++files_etc_filetrans(targetd_t, targetd_etc_rw_t, { dir file }) ++ ++manage_dirs_pattern(targetd_t, targetd_tmp_t, targetd_tmp_t) ++manage_files_pattern(targetd_t, targetd_tmp_t, targetd_tmp_t) ++files_tmp_filetrans(targetd_t, targetd_tmp_t, { file dir }) ++ ++files_rw_isid_type_dirs(targetd_t) ++ ++fs_getattr_xattr_fs(targetd_t) ++fs_manage_configfs_files(targetd_t) ++fs_manage_configfs_lnk_files(targetd_t) ++fs_manage_configfs_dirs(targetd_t) ++fs_read_nfsd_files(targetd_t) ++ ++kernel_rw_rpc_sysctls(targetd_t) ++kernel_get_sysvipc_info(targetd_t) ++kernel_read_system_state(targetd_t) ++kernel_read_network_state(targetd_t) ++kernel_load_module(targetd_t) ++kernel_request_load_module(targetd_t) ++kernel_dgram_send(targetd_t) ++ ++rpc_read_exports(targetd_t) ++ ++storage_raw_rw_fixed_disk(targetd_t) ++ ++auth_use_nsswitch(targetd_t) ++ ++corecmd_exec_shell(targetd_t) ++corecmd_exec_bin(targetd_t) ++ ++corenet_tcp_bind_generic_node(targetd_t) ++corenet_tcp_bind_lsm_plugin_port(targetd_t) ++ ++dev_rw_sysfs(targetd_t) ++dev_read_urand(targetd_t) ++dev_rw_lvm_control(targetd_t) ++dev_getattr_loop_control(targetd_t) ++ ++libs_exec_ldconfig(targetd_t) ++ ++seutil_dontaudit_read_module_store(targetd_t) ++ ++storage_raw_read_fixed_disk(targetd_t) ++storage_raw_read_removable_device(targetd_t) ++ ++sysnet_read_config(targetd_t) ++ ++optional_policy(` ++ gnome_read_generic_data_home_dirs(targetd_t) ++') ++ ++optional_policy(` ++ lvm_read_config(targetd_t) ++ lvm_map_config(targetd_t) ++ lvm_write_metadata(targetd_t) ++ lvm_manage_metadata(targetd_t) ++ lvm_manage_lock(targetd_t) ++ lvm_rw_pipes(targetd_t) ++ lvm_stream_connect(targetd_t) ++') ++ ++optional_policy(` ++ modutils_read_module_config(targetd_t) ++ modutils_dontaudit_exec_insmod(targetd_t) ++') ++ ++optional_policy(` ++ rpc_manage_nfs_state_data(targetd_t) ++') ++ ++optional_policy(` ++ rpm_dontaudit_read_db(targetd_t) ++ rpm_dontaudit_exec(targetd_t) ++') ++ ++optional_policy(` ++ udev_read_pid_files(targetd_t) ++') ++ +diff --git a/tcpd.te b/tcpd.te +index 2d6d2c23d6..db18a804b4 100644 +--- a/tcpd.te ++++ b/tcpd.te +@@ -23,7 +23,6 @@ manage_dirs_pattern(tcpd_t, tcpd_tmp_t, tcpd_tmp_t) + manage_files_pattern(tcpd_t, tcpd_tmp_t, tcpd_tmp_t) + files_tmp_filetrans(tcpd_t, tcpd_tmp_t, { file dir }) + +-corenet_all_recvfrom_unlabeled(tcpd_t) + corenet_all_recvfrom_netlabel(tcpd_t) + corenet_tcp_sendrecv_generic_if(tcpd_t) + corenet_tcp_sendrecv_generic_node(tcpd_t) +@@ -31,15 +30,12 @@ corenet_tcp_sendrecv_all_ports(tcpd_t) + + fs_getattr_xattr_fs(tcpd_t) + +-corecmd_search_bin(tcpd_t) ++corecmd_exec_bin(tcpd_t) + +-files_read_etc_files(tcpd_t) + files_dontaudit_search_var(tcpd_t) + + logging_send_syslog_msg(tcpd_t) + +-miscfiles_read_localization(tcpd_t) +- + sysnet_read_config(tcpd_t) + + inetd_domtrans_child(tcpd_t) +diff --git a/tcsd.if b/tcsd.if +index b42ec1d832..91b8f71dc6 100644 +--- a/tcsd.if ++++ b/tcsd.if +@@ -138,8 +138,11 @@ interface(`tcsd_admin',` + type tcsd_t, tcsd_initrc_exec_t, tcsd_var_lib_t; + ') + +- allow $1 tcsd_t:process { ptrace signal_perms }; ++ allow $1 tcsd_t:process signal_perms; + ps_process_pattern($1, tcsd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 tcsd_t:process ptrace; ++ ') + + tcsd_initrc_domtrans($1) + domain_system_change_exemption($1) +diff --git a/tcsd.te b/tcsd.te +index b26d44a8ce..5a79afdb58 100644 +--- a/tcsd.te ++++ b/tcsd.te +@@ -20,7 +20,7 @@ files_type(tcsd_var_lib_t) + # Local policy + # + +-allow tcsd_t self:capability { dac_override setuid }; ++allow tcsd_t self:capability { dac_read_search dac_override setuid }; + allow tcsd_t self:process { signal sigkill }; + allow tcsd_t self:tcp_socket { accept listen }; + +@@ -41,12 +41,8 @@ corenet_tcp_sendrecv_tcs_port(tcsd_t) + dev_read_urand(tcsd_t) + dev_rw_tpm(tcsd_t) + +-files_read_usr_files(tcsd_t) +- + auth_use_nsswitch(tcsd_t) + + init_read_utmp(tcsd_t) + + logging_send_syslog_msg(tcsd_t) +- +-miscfiles_read_localization(tcsd_t) +diff --git a/telepathy.fc b/telepathy.fc +index 6c7f8f8a39..03fc880795 100644 +--- a/telepathy.fc ++++ b/telepathy.fc +@@ -1,35 +1,23 @@ +-HOME_DIR/\.cache/\.mc_connections -- gen_context(system_u:object_r:telepathy_mission_control_cache_home_t,s0) ++HOME_DIR/\.cache/\.mc_connections -- gen_context(system_u:object_r:telepathy_mission_control_cache_home_t, s0) + HOME_DIR/\.cache/telepathy(/.*)? gen_context(system_u:object_r:telepathy_cache_home_t, s0) +-HOME_DIR/\.cache/telepathy/avatars/gabble(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t, s0) + HOME_DIR/\.cache/telepathy/logger(/.*)? gen_context(system_u:object_r:telepathy_logger_cache_home_t,s0) +-HOME_DIR/\.cache/telepathy/gabble(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t,s0) +-HOME_DIR/\.cache/wocky(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t,s0) +-HOME_DIR/\.mission-control(/.*)? gen_context(system_u:object_r:telepathy_mission_control_home_t,s0) ++HOME_DIR/\.cache/telepathy/avatars/gabble(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t, s0) ++HOME_DIR/\.cache/telepathy/gabble(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t, s0) ++HOME_DIR/\.cache/wocky(/.*)? gen_context(system_u:object_r:telepathy_gabble_cache_home_t, s0) ++HOME_DIR/\.mission-control(/.*)? gen_context(system_u:object_r:telepathy_mission_control_home_t, s0) + HOME_DIR/\.local/share/telepathy(/.*)? gen_context(system_u:object_r:telepathy_data_home_t,s0) +-HOME_DIR/\.local/share/telepathy/mission-control(/.*)? gen_context(system_u:object_r:telepathy_mission_control_data_home_t,s0) +-HOME_DIR/\.telepathy-sunshine(/.*)? gen_context(system_u:object_r:telepathy_sunshine_home_t,s0) +-HOME_DIR/\.local/share/TpLogger(/.*)? gen_context(system_u:object_r:telepathy_logger_data_home_t,s0) ++HOME_DIR/\.local/share/telepathy/mission-control(/.*)? gen_context(system_u:object_r:telepathy_mission_control_data_home_t, s0) ++HOME_DIR/\.telepathy-sunshine(/.*)? gen_context(system_u:object_r:telepathy_sunshine_home_t, s0) ++HOME_DIR/\.local/share/TpLogger(/.*)? gen_context(system_u:object_r:telepathy_logger_data_home_t,s0) + +-/usr/lib/telepathy/mission-control-5 -- gen_context(system_u:object_r:telepathy_mission_control_exec_t,s0) +-/usr/lib/telepathy/telepathy-butterfly -- gen_context(system_u:object_r:telepathy_msn_exec_t,s0) +-/usr/lib/telepathy/telepathy-gabble -- gen_context(system_u:object_r:telepathy_gabble_exec_t,s0) +-/usr/lib/telepathy/telepathy-haze -- gen_context(system_u:object_r:telepathy_msn_exec_t,s0) +-/usr/lib/telepathy/telepathy-idle -- gen_context(system_u:object_r:telepathy_idle_exec_t,s0) +-/usr/lib/telepathy/telepathy-logger -- gen_context(system_u:object_r:telepathy_logger_exec_t,s0) +-/usr/lib/telepathy/telepathy-salut -- gen_context(system_u:object_r:telepathy_salut_exec_t,s0) +-/usr/lib/telepathy/telepathy-sofiasip -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t,s0) +-/usr/lib/telepathy/telepathy-rakia -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t,s0) +-/usr/lib/telepathy/telepathy-stream-engine -- gen_context(system_u:object_r:telepathy_stream_engine_exec_t,s0) +-/usr/lib/telepathy/telepathy-sunshine -- gen_context(system_u:object_r:telepathy_sunshine_exec_t,s0) +- +-/usr/libexec/mission-control-5 -- gen_context(system_u:object_r:telepathy_mission_control_exec_t,s0) +-/usr/libexec/telepathy-butterfly -- gen_context(system_u:object_r:telepathy_msn_exec_t,s0) +-/usr/libexec/telepathy-gabble -- gen_context(system_u:object_r:telepathy_gabble_exec_t,s0) +-/usr/libexec/telepathy-haze -- gen_context(system_u:object_r:telepathy_msn_exec_t,s0) +-/usr/libexec/telepathy-idle -- gen_context(system_u:object_r:telepathy_idle_exec_t,s0) +-/usr/libexec/telepathy-logger -- gen_context(system_u:object_r:telepathy_logger_exec_t,s0) +-/usr/libexec/telepathy-salut -- gen_context(system_u:object_r:telepathy_salut_exec_t, s0) +-/usr/libexec/telepathy-sofiasip -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t,s0) +-/usr/libexec/telepathy-rakia -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t,s0) +-/usr/libexec/telepathy-stream-engine -- gen_context(system_u:object_r:telepathy_stream_engine_exec_t,s0) +-/usr/libexec/telepathy-sunshine -- gen_context(system_u:object_r:telepathy_sunshine_exec_t,s0) ++/usr/libexec/mission-control-5 -- gen_context(system_u:object_r:telepathy_mission_control_exec_t, s0) ++/usr/libexec/telepathy-butterfly -- gen_context(system_u:object_r:telepathy_msn_exec_t, s0) ++/usr/libexec/telepathy-gabble -- gen_context(system_u:object_r:telepathy_gabble_exec_t, s0) ++/usr/libexec/telepathy-haze -- gen_context(system_u:object_r:telepathy_msn_exec_t, s0) ++/usr/libexec/telepathy-idle -- gen_context(system_u:object_r:telepathy_idle_exec_t, s0) ++/usr/libexec/telepathy-logger -- gen_context(system_u:object_r:telepathy_logger_exec_t,s0) ++/usr/libexec/telepathy-salut -- gen_context(system_u:object_r:telepathy_salut_exec_t, s0) ++/usr/libexec/telepathy-sofiasip -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t, s0) ++/usr/libexec/telepathy-rakia -- gen_context(system_u:object_r:telepathy_sofiasip_exec_t, s0) ++/usr/libexec/telepathy-stream-engine -- gen_context(system_u:object_r:telepathy_stream_engine_exec_t, s0) ++/usr/libexec/telepathy-sunshine -- gen_context(system_u:object_r:telepathy_sunshine_exec_t, s0) +diff --git a/telepathy.if b/telepathy.if +index 42946bc10b..9f70e4cf17 100644 +--- a/telepathy.if ++++ b/telepathy.if +@@ -2,45 +2,39 @@ + + ####################################### + ## +-## The template to define a telepathy domain. ++## Creates basic types for telepathy ++## domain + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # + template(`telepathy_domain_template',` + gen_require(` +- attribute telepathy_domain, telepathy_executable, telepathy_tmp_content; ++ attribute telepathy_domain; ++ attribute telepathy_executable; + ') + + type telepathy_$1_t, telepathy_domain; + type telepathy_$1_exec_t, telepathy_executable; +- userdom_user_application_domain(telepathy_$1_t, telepathy_$1_exec_t) ++ application_domain(telepathy_$1_t, telepathy_$1_exec_t) ++ ubac_constrained(telepathy_$1_t) + +- type telepathy_$1_tmp_t, telepathy_tmp_content; ++ type telepathy_$1_tmp_t; + userdom_user_tmp_file(telepathy_$1_tmp_t) + ++ kernel_read_system_state(telepathy_$1_t) ++ + auth_use_nsswitch(telepathy_$1_t) + ') + + ####################################### + ## +-## The role template for the telepathy module. ++## Role access for telepathy domains ++## that executes via dbus-session + ## +-## +-##

      +-## This template creates a derived domains which are used +-## for window manager applications. +-##

      +-##
      +-## +-## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). +-## +-## + ## + ## + ## The role associated with the user domain. +@@ -51,10 +45,15 @@ template(`telepathy_domain_template',` + ## The type of the user domain. + ## + ## ++## ++## ++## User domain prefix to be used. ++## ++## + # +-template(`telepathy_role_template',` ++template(`telepathy_role',` + gen_require(` +- attribute telepathy_domain, telepathy_tmp_content; ++ attribute telepathy_domain; + type telepathy_gabble_t, telepathy_sofiasip_t, telepathy_idle_t; + type telepathy_mission_control_t, telepathy_salut_t, telepathy_sunshine_t; + type telepathy_stream_engine_t, telepathy_msn_t, telepathy_gabble_exec_t; +@@ -63,91 +62,84 @@ template(`telepathy_role_template',` + type telepathy_mission_control_exec_t, telepathy_salut_exec_t; + type telepathy_sunshine_exec_t, telepathy_stream_engine_exec_t; + type telepathy_msn_exec_t; +- +- type telepathy_mission_control_cache_home_t, telepathy_cache_home_t, telepathy_logger_cache_home_t; +- type telepathy_gabble_cache_home_t, telepathy_mission_control_home_t, telepathy_data_home_t; +- type telepathy_mission_control_data_home_t, telepathy_sunshine_home_t, telepathy_logger_data_home_t; + ') + +- role $2 types telepathy_domain; +- +- allow $3 telepathy_domain:process { ptrace signal_perms }; +- ps_process_pattern($3, telepathy_domain) ++ role $1 types telepathy_domain; + +- telepathy_gabble_stream_connect($3) +- telepathy_msn_stream_connect($3) +- telepathy_salut_stream_connect($3) ++ allow $2 telepathy_domain:process signal_perms; ++ ps_process_pattern($2, telepathy_domain) + +- dbus_spec_session_domain($1, telepathy_gabble_exec_t, telepathy_gabble_t) +- dbus_spec_session_domain($1, telepathy_sofiasip_exec_t, telepathy_sofiasip_t) +- dbus_spec_session_domain($1, telepathy_idle_exec_t, telepathy_idle_t) +- dbus_spec_session_domain($1, telepathy_logger_exec_t, telepathy_logger_t) +- dbus_spec_session_domain($1, telepathy_mission_control_exec_t, telepathy_mission_control_t) +- dbus_spec_session_domain($1, telepathy_salut_exec_t, telepathy_salut_t) +- dbus_spec_session_domain($1, telepathy_sunshine_exec_t, telepathy_sunshine_t) +- dbus_spec_session_domain($1, telepathy_stream_engine_exec_t, telepathy_stream_engine_t) +- dbus_spec_session_domain($1, telepathy_msn_exec_t, telepathy_msn_t) ++ telepathy_gabble_stream_connect($2) ++ telepathy_msn_stream_connect($2) ++ telepathy_salut_stream_connect($2) + +- allow $3 { telepathy_mission_control_cache_home_t telepathy_cache_home_t telepathy_logger_cache_home_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 { telepathy_gabble_cache_home_t telepathy_mission_control_home_t telepathy_data_home_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 { telepathy_mission_control_data_home_t telepathy_sunshine_home_t telepathy_logger_data_home_t }:dir { manage_dir_perms relabel_dir_perms }; ++ dbus_session_domain($3, telepathy_gabble_exec_t, telepathy_gabble_t) ++ dbus_session_domain($3, telepathy_sofiasip_exec_t, telepathy_sofiasip_t) ++ dbus_session_domain($3, telepathy_idle_exec_t, telepathy_idle_t) ++ dbus_session_domain($3, telepathy_logger_exec_t, telepathy_logger_t) ++ dbus_session_domain($3, telepathy_mission_control_exec_t, telepathy_mission_control_t) ++ dbus_session_domain($3, telepathy_salut_exec_t, telepathy_salut_t) ++ dbus_session_domain($3, telepathy_sunshine_exec_t, telepathy_sunshine_t) ++ dbus_session_domain($3, telepathy_stream_engine_exec_t, telepathy_stream_engine_t) ++ dbus_session_domain($3, telepathy_msn_exec_t, telepathy_msn_t) + +- allow $3 { telepathy_mission_control_cache_home_t telepathy_cache_home_t telepathy_logger_cache_home_t }:file { manage_file_perms relabel_file_perms }; +- allow $3 { telepathy_gabble_cache_home_t telepathy_mission_control_home_t telepathy_data_home_t }:file { manage_file_perms relabel_file_perms }; +- allow $3 { telepathy_mission_control_data_home_t telepathy_sunshine_home_t telepathy_logger_data_home_t }:file { manage_file_perms relabel_file_perms }; +- +- filetrans_pattern($3, telepathy_cache_home_t, telepathy_gabble_cache_home_t, dir, "gabble") +- # gnome_cache_filetrans($3, telepathy_gabble_cache_home_t, dir, "wocky") +- +- filetrans_pattern($3, telepathy_cache_home_t, telepathy_logger_cache_home_t, dir, "logger") +- # gnome_data_filetrans($3, telepathy_logger_data_home_t, dir, "TpLogger") +- +- userdom_user_home_dir_filetrans($3, telepathy_mission_control_home_t, dir, ".mission-control") +- filetrans_pattern($3, telepathy_data_home_t, telepathy_mission_control_data_home_t, dir, "mission-control") +- # gnome_cache_filetrans($3, telepathy_mission_control_cache_home_t, file, ".mc_connections") +- +- userdom_user_home_dir_filetrans($3, telepathy_sunshine_home_t, dir, ".telepathy-sunshine") +- +- # gnome_cache_filetrans($3, telepathy_cache_home_t, dir, "telepathy") +- # gnome_data_filetrans($3, telepathy_data_home_t, dir, "telepathy") +- +- allow $3 telepathy_tmp_content:dir { manage_dir_perms relabel_dir_perms }; +- allow $3 telepathy_tmp_content:file { manage_file_perms relabel_file_perms }; +- allow $3 telepathy_tmp_content:sock_file { manage_sock_file_perms relabel_sock_file_perms }; ++ telepathy_dbus_chat($2) + ') + + ######################################## + ## +-## Connect to gabble with a unix +-## domain stream socket. ++## Stream connect to Telepathy Gabble + ## + ## +-## ++## + ## Domain allowed access. + ## + ## + # +-interface(`telepathy_gabble_stream_connect',` ++interface(`telepathy_gabble_stream_connect', ` + gen_require(` + type telepathy_gabble_t, telepathy_gabble_tmp_t; + ') + +- files_search_tmp($1) + stream_connect_pattern($1, telepathy_gabble_tmp_t, telepathy_gabble_tmp_t, telepathy_gabble_t) ++ files_search_tmp($1) + ') + + ######################################## + ## +-## Send dbus messages to and from +-## gabble. ++## Allow Telepathy Gabble to stream connect to a domain. + ## + ## +-## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`telepathy_gabble_stream_connect_to', ` ++ gen_require(` ++ type telepathy_gabble_t; ++ ') ++ ++ stream_connect_pattern(telepathy_gabble_t, $2, $2, $1) ++') ++ ++######################################## ++## ++## Send DBus messages to and from ++## Telepathy Gabble. ++## ++## ++## + ## Domain allowed access. + ## + ## + # +-interface(`telepathy_gabble_dbus_chat',` ++interface(`telepathy_gabble_dbus_chat', ` + gen_require(` + type telepathy_gabble_t; + class dbus send_msg; +@@ -159,10 +151,10 @@ interface(`telepathy_gabble_dbus_chat',` + + ######################################## + ## +-## Read mission control process state files. ++## Read telepathy mission control state. + ## + ## +-## ++## + ## Domain allowed access. + ## + ## +@@ -173,15 +165,12 @@ interface(`telepathy_mission_control_read_state',` + ') + + kernel_search_proc($1) +- allow $1 telepathy_mission_control_t:dir list_dir_perms; +- allow $1 telepathy_mission_control_t:file read_file_perms; +- allow $1 telepathy_mission_control_t:lnk_file read_lnk_file_perms; ++ ps_process_pattern($1, telepathy_mission_control_t) + ') + + ####################################### + ## +-## Connect to msn with a unix +-## domain stream socket. ++## Stream connect to telepathy MSN managers + ## + ## + ## +@@ -189,19 +178,18 @@ interface(`telepathy_mission_control_read_state',` + ## + ## + # +-interface(`telepathy_msn_stream_connect',` ++interface(`telepathy_msn_stream_connect', ` + gen_require(` + type telepathy_msn_t, telepathy_msn_tmp_t; + ') + +- files_search_tmp($1) + stream_connect_pattern($1, telepathy_msn_tmp_t, telepathy_msn_tmp_t, telepathy_msn_t) ++ files_search_tmp($1) + ') + + ######################################## + ## +-## Connect to salut with a unix +-## domain stream socket. ++## Stream connect to Telepathy Salut + ## + ## + ## +@@ -209,11 +197,140 @@ interface(`telepathy_msn_stream_connect',` + ## + ## + # +-interface(`telepathy_salut_stream_connect',` ++interface(`telepathy_salut_stream_connect', ` + gen_require(` + type telepathy_salut_t, telepathy_salut_tmp_t; + ') + +- files_search_tmp($1) + stream_connect_pattern($1, telepathy_salut_tmp_t, telepathy_salut_tmp_t, telepathy_salut_t) ++ files_search_tmp($1) ++') ++ ++####################################### ++## ++## Send DBus messages to and from ++## all Telepathy domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`telepathy_dbus_chat',` ++ gen_require(` ++ attribute telepathy_domain; ++ class dbus send_msg; ++ ') ++ ++ allow $1 telepathy_domain:dbus send_msg; ++ allow telepathy_domain $1:dbus send_msg; ++') ++ ++###################################### ++## ++## Execute telepathy executable ++## in the specified domain. ++## ++## ++##

      ++## Execute a telepathy executable ++## in the specified domain. This allows ++## the specified domain to execute any file ++## on these filesystems in the specified ++## domain. ++##

      ++##

      ++## No interprocess communication (signals, pipes, ++## etc.) is provided by this interface since ++## the domains are not owned by this module. ++##

      ++##
      ++## ++## ++## Domain allowed to transition. ++## ++## ++## ++## ++## The type of the new process. ++## ++## ++# ++interface(`telepathy_command_domtrans', ` ++ gen_require(` ++ attribute telepathy_executable; ++ ') ++ ++ allow $2 telepathy_executable:file entrypoint; ++ domain_transition_pattern($1, telepathy_executable, $2) ++ type_transition $1 telepathy_executable:process $2; ++ ++ # needs to dbus chat with unconfined_t and unconfined_dbusd_t ++ optional_policy(` ++ telepathy_dbus_chat($1) ++ telepathy_dbus_chat($2) ++ ') ++') ++ ++######################################## ++## ++## Create telepathy content in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`telepathy_filetrans_home_content',` ++ gen_require(` ++ type telepathy_mission_control_cache_home_t; ++ type telepathy_mission_control_home_t; ++ type telepathy_logger_cache_home_t; ++ type telepathy_gabble_cache_home_t; ++ type telepathy_sunshine_home_t; ++ type telepathy_logger_data_home_t; ++ type telepathy_cache_home_t, telepathy_data_home_t; ++ type telepathy_mission_control_data_home_t; ++ ') ++ ++ filetrans_pattern($1, telepathy_cache_home_t, telepathy_logger_cache_home_t, dir, "logger") ++ filetrans_pattern($1, telepathy_cache_home_t, telepathy_logger_cache_home_t, file, "sqlite-data-journal") ++ filetrans_pattern($1, telepathy_cache_home_t, telepathy_gabble_cache_home_t, dir, "gabble") ++ ++ filetrans_pattern($1, telepathy_data_home_t, telepathy_mission_control_data_home_t, dir, "mission-control") ++ ++ userdom_user_home_dir_filetrans($1, telepathy_mission_control_home_t, dir, ".mission-control") ++ userdom_user_home_dir_filetrans($1, telepathy_sunshine_home_t, dir, ".telepathy-sunshine") ++ ++ optional_policy(` ++ gnome_cache_filetrans($1, telepathy_mission_control_cache_home_t, file, ".mc_connections") ++ gnome_cache_filetrans($1, telepathy_gabble_cache_home_t, dir, "gabble") ++ gnome_cache_filetrans($1, telepathy_gabble_cache_home_t, dir, "wocky") ++ gnome_cache_filetrans($1, telepathy_cache_home_t, dir, "telepathy") ++ ++ gnome_data_filetrans($1, telepathy_logger_data_home_t, dir, "TpLogger") ++ gnome_data_filetrans($1, telepathy_data_home_t, dir, "telepathy") ++ ') ++') ++ ++###################################### ++## ++## Execute telepathy in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`telepathy_exec',` ++ gen_require(` ++ attribute telepathy_executable; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, telepathy_executable) + ') +diff --git a/telepathy.te b/telepathy.te +index 9afcbc95c2..b19622dc66 100644 +--- a/telepathy.te ++++ b/telepathy.te +@@ -2,28 +2,27 @@ policy_module(telepathy, 1.4.2) + + ######################################## + # +-# Declarations ++# Declarations. + # + + ## +-##

      +-## Determine whether telepathy connection +-## managers can connect to generic tcp ports. +-##

      ++##

      ++## Allow the Telepathy connection managers ++## to connect to any generic TCP port. ++##

      + ##
      + gen_tunable(telepathy_tcp_connect_generic_network_ports, false) + + ## +-##

      +-## Determine whether telepathy connection +-## managers can connect to any port. +-##

      ++##

      ++## Allow the Telepathy connection managers ++## to connect to any network port. ++##

      + ##
      + gen_tunable(telepathy_connect_all_ports, false) + + attribute telepathy_domain; + attribute telepathy_executable; +-attribute telepathy_tmp_content; + + telepathy_domain_template(gabble) + +@@ -67,179 +66,157 @@ userdom_user_home_content(telepathy_sunshine_home_t) + + ####################################### + # +-# Gabble local policy ++# Telepathy Gabble local policy. + # + +-allow telepathy_gabble_t self:tcp_socket { accept listen }; ++allow telepathy_gabble_t self:tcp_socket create_stream_socket_perms; + allow telepathy_gabble_t self:unix_dgram_socket { create_socket_perms sendto }; + +-# ~/.cache/telepathy/gabble/caps-cache.db-journal +-manage_dirs_pattern(telepathy_gabble_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) +-manage_files_pattern(telepathy_gabble_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) +-filetrans_pattern(telepathy_gabble_t, telepathy_cache_home_t, telepathy_gabble_cache_home_t, dir, "gabble") +-# gnome_cache_filetrans(telepathy_gabble_t, telepathy_gabble_cache_home_t, dir, "wocky") +- + manage_dirs_pattern(telepathy_gabble_t, telepathy_gabble_tmp_t, telepathy_gabble_tmp_t) + manage_sock_files_pattern(telepathy_gabble_t, telepathy_gabble_tmp_t, telepathy_gabble_tmp_t) + files_tmp_filetrans(telepathy_gabble_t, telepathy_gabble_tmp_t, { dir sock_file }) + +-corenet_all_recvfrom_unlabeled(telepathy_gabble_t) ++# ~/.cache/telepathy/gabble/caps-cache.db-journal ++optional_policy(` ++ manage_dirs_pattern(telepathy_gabble_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) ++ manage_files_pattern(telepathy_gabble_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) ++ filetrans_pattern(telepathy_gabble_t, telepathy_cache_home_t, telepathy_gabble_cache_home_t, dir) ++ # ~/.cache/wocky ++ gnome_cache_filetrans(telepathy_gabble_t, telepathy_gabble_cache_home_t, dir) ++') ++ + corenet_all_recvfrom_netlabel(telepathy_gabble_t) + corenet_tcp_sendrecv_generic_if(telepathy_gabble_t) + corenet_tcp_sendrecv_generic_node(telepathy_gabble_t) +- +-corenet_sendrecv_http_client_packets(telepathy_gabble_t) + corenet_tcp_connect_http_port(telepathy_gabble_t) +-corenet_tcp_sendrecv_http_port(telepathy_gabble_t) +- +-corenet_sendrecv_jabber_client_client_packets(telepathy_gabble_t) + corenet_tcp_connect_jabber_client_port(telepathy_gabble_t) +-corenet_tcp_sendrecv_jabber_client_port(telepathy_gabble_t) +- +-corenet_sendrecv_vnc_client_packets(telepathy_gabble_t) + corenet_tcp_connect_vnc_port(telepathy_gabble_t) +-corenet_tcp_sendrecv_vnc_port(telepathy_gabble_t) ++corenet_sendrecv_http_client_packets(telepathy_gabble_t) ++corenet_sendrecv_jabber_client_client_packets(telepathy_gabble_t) ++corenet_sendrecv_vnc_client_packets(telepathy_gabble_t) + + dev_read_rand(telepathy_gabble_t) + + files_read_config_files(telepathy_gabble_t) +-files_read_usr_files(telepathy_gabble_t) ++ ++fs_getattr_all_fs(telepathy_gabble_t) + + miscfiles_read_all_certs(telepathy_gabble_t) + + tunable_policy(`telepathy_connect_all_ports',` +- corenet_sendrecv_all_client_packets(telepathy_gabble_t) + corenet_tcp_connect_all_ports(telepathy_gabble_t) + corenet_tcp_sendrecv_all_ports(telepathy_gabble_t) ++ corenet_udp_sendrecv_all_ports(telepathy_gabble_t) + ') + + tunable_policy(`telepathy_tcp_connect_generic_network_ports',` +- corenet_sendrecv_generic_client_packets(telepathy_gabble_t) + corenet_tcp_connect_generic_port(telepathy_gabble_t) +- corenet_tcp_sendrecv_generic_port(telepathy_gabble_t) +-') +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(telepathy_gabble_t) +- fs_manage_nfs_files(telepathy_gabble_t) ++ corenet_sendrecv_generic_client_packets(telepathy_gabble_t) + ') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(telepathy_gabble_t) +- fs_manage_cifs_files(telepathy_gabble_t) +-') ++userdom_home_manager(telepathy_gabble_t) + + optional_policy(` + dbus_system_bus_client(telepathy_gabble_t) + ') + +-# optional_policy(` +- # ~/.config/dconf/user +- # gnome_manage_generic_home_content(telepathy_gabble_t) +-# ') ++optional_policy(` ++ gnome_manage_home_config(telepathy_gabble_t) ++') + + ####################################### + # +-# Idle local policy ++# Telepathy Idle local policy. + # + + corenet_all_recvfrom_netlabel(telepathy_idle_t) +-corenet_all_recvfrom_unlabeled(telepathy_idle_t) + corenet_tcp_sendrecv_generic_if(telepathy_idle_t) + corenet_tcp_sendrecv_generic_node(telepathy_idle_t) +- +-corenet_sendrecv_gatekeeper_client_packets(telepathy_idle_t) + corenet_tcp_connect_gatekeeper_port(telepathy_idle_t) +-corenet_tcp_sendrecv_gatekeeper_port(telepathy_idle_t) +- +-corenet_sendrecv_ircd_client_packets(telepathy_idle_t) + corenet_tcp_connect_ircd_port(telepathy_idle_t) +-corenet_tcp_sendrecv_ircd_port(telepathy_idle_t) ++corenet_sendrecv_ircd_client_packets(telepathy_idle_t) + + dev_read_rand(telepathy_idle_t) + +-files_read_usr_files(telepathy_idle_t) +- + tunable_policy(`telepathy_connect_all_ports',` +- corenet_sendrecv_all_client_packets(telepathy_idle_t) + corenet_tcp_connect_all_ports(telepathy_idle_t) + corenet_tcp_sendrecv_all_ports(telepathy_idle_t) ++ corenet_udp_sendrecv_all_ports(telepathy_idle_t) + ') + + tunable_policy(`telepathy_tcp_connect_generic_network_ports',` +- corenet_sendrecv_generic_client_packets(telepathy_idle_t) + corenet_tcp_connect_generic_port(telepathy_idle_t) +- corenet_tcp_sendrecv_generic_port(telepathy_idle_t) ++ corenet_sendrecv_generic_client_packets(telepathy_idle_t) + ') + + ####################################### + # +-# Logger local policy ++# Telepathy Logger local policy. + # + + allow telepathy_logger_t self:unix_stream_socket create_socket_perms; + + manage_dirs_pattern(telepathy_logger_t, telepathy_logger_cache_home_t, telepathy_logger_cache_home_t) + manage_files_pattern(telepathy_logger_t, telepathy_logger_cache_home_t, telepathy_logger_cache_home_t) +-filetrans_pattern(telepathy_logger_t, telepathy_cache_home_t, telepathy_logger_cache_home_t, dir, "logger") ++filetrans_pattern(telepathy_logger_t, telepathy_cache_home_t, telepathy_logger_cache_home_t, dir) + + manage_dirs_pattern(telepathy_logger_t, telepathy_logger_data_home_t, telepathy_logger_data_home_t) + manage_files_pattern(telepathy_logger_t, telepathy_logger_data_home_t, telepathy_logger_data_home_t) +-# gnome_data_filetrans(telepathy_logger_t, telepathy_logger_data_home_t, dir, "TpLogger") + +-files_read_usr_files(telepathy_logger_t) ++optional_policy(` ++ gnome_data_filetrans(telepathy_logger_t, telepathy_logger_data_home_t, dir) ++') ++ + files_search_pids(telepathy_logger_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(telepathy_logger_t) +- fs_manage_nfs_files(telepathy_logger_t) +-') ++fs_getattr_all_fs(telepathy_logger_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(telepathy_logger_t) +- fs_manage_cifs_files(telepathy_logger_t) +-') ++userdom_home_manager(telepathy_logger_t) + +-# optional_policy(` ++optional_policy(` + # ~/.config/dconf/user +- # gnome_manage_generic_home_content(telepathy_logger_t) +-# ') ++ gnome_manage_home_config(telepathy_logger_t) ++') + + ####################################### + # +-# Mission-Control local policy ++# Telepathy Mission-Control local policy. + # +- + allow telepathy_mission_control_t self:process setsched; + + manage_dirs_pattern(telepathy_mission_control_t, telepathy_mission_control_home_t, telepathy_mission_control_home_t) + manage_files_pattern(telepathy_mission_control_t, telepathy_mission_control_home_t, telepathy_mission_control_home_t) +-userdom_user_home_dir_filetrans(telepathy_mission_control_t, telepathy_mission_control_home_t, dir, ".mission-control") ++userdom_search_user_home_dirs(telepathy_mission_control_t) ++ ++manage_files_pattern(telepathy_mission_control_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) ++manage_dirs_pattern(telepathy_mission_control_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) + +-manage_dirs_pattern(telepathy_mission_control_t, telepathy_mission_control_data_home_t, telepathy_mission_control_data_home_t) ++manage_dirs_pattern(telepathy_mission_control_t, { telepathy_data_home_t telepathy_mission_control_data_home_t }, { telepathy_data_home_t telepathy_mission_control_data_home_t }) + manage_files_pattern(telepathy_mission_control_t, telepathy_mission_control_data_home_t, telepathy_mission_control_data_home_t) +-filetrans_pattern(telepathy_mission_control_t, telepathy_data_home_t, telepathy_mission_control_data_home_t, dir, "mission-control") ++filetrans_pattern(telepathy_mission_control_t, telepathy_data_home_t, telepathy_mission_control_data_home_t, { dir file }) + +-manage_files_pattern(telepathy_mission_control_t, telepathy_mission_control_cache_home_t, telepathy_mission_control_cache_home_t) +-# gnome_cache_filetrans(telepathy_mission_control_t, telepathy_mission_control_cache_home_t, file, ".mc_connections") ++manage_dirs_pattern(telepathy_mission_control_t, telepathy_mission_control_tmp_t, telepathy_mission_control_tmp_t) ++manage_files_pattern(telepathy_mission_control_t, telepathy_mission_control_tmp_t, telepathy_mission_control_tmp_t) ++manage_sock_files_pattern(telepathy_mission_control_t, telepathy_mission_control_tmp_t, telepathy_mission_control_tmp_t) ++exec_files_pattern(telepathy_mission_control_t, telepathy_mission_control_tmp_t, telepathy_mission_control_tmp_t) ++files_tmp_filetrans(telepathy_mission_control_t, telepathy_mission_control_tmp_t, { dir file sock_file }) ++userdom_user_tmp_filetrans(telepathy_mission_control_t, telepathy_mission_control_tmp_t, { dir file sock_file }) ++ ++optional_policy(` ++ gnome_data_filetrans(telepathy_mission_control_t, telepathy_data_home_t, dir) ++ gnome_manage_home_config(telepathy_mission_control_t) ++') + + manage_dirs_pattern(telepathy_mission_control_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) + manage_files_pattern(telepathy_mission_control_t, telepathy_gabble_cache_home_t, telepathy_gabble_cache_home_t) + + dev_read_rand(telepathy_mission_control_t) + +-files_list_tmp(telepathy_mission_control_t) +-files_read_usr_files(telepathy_mission_control_t) ++fs_getattr_all_fs(telepathy_mission_control_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(telepathy_mission_control_t) +- fs_manage_nfs_files(telepathy_mission_control_t) +-') ++files_list_tmp(telepathy_mission_control_t) + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(telepathy_mission_control_t) +- fs_manage_cifs_files(telepathy_mission_control_t) +-') ++userdom_home_manager(telepathy_mission_control_t) + + optional_policy(` + dbus_system_bus_client(telepathy_mission_control_t) +@@ -248,59 +225,47 @@ optional_policy(` + devicekit_dbus_chat_power(telepathy_mission_control_t) + ') + optional_policy(` +- gnome_dbus_chat_all_gkeyringd(telepathy_mission_control_t) ++ gnome_dbus_chat_gkeyringd(telepathy_mission_control_t) + ') + optional_policy(` + networkmanager_dbus_chat(telepathy_mission_control_t) + ') + ') + +-# optional_policy(` +- # ~/.config/dconf/user +- # gnome_manage_generic_home_content(telepathy_mission_control_t) +-# ') ++# ~/.cache/.mc_connections. ++optional_policy(` ++ manage_files_pattern(telepathy_mission_control_t, telepathy_mission_control_cache_home_t, telepathy_mission_control_cache_home_t) ++ gnome_cache_filetrans(telepathy_mission_control_t, telepathy_mission_control_cache_home_t, file) ++') + + ####################################### + # +-# Butterfly and Haze local policy ++# Telepathy Butterfly and Haze local policy. + # + + allow telepathy_msn_t self:process setsched; ++allow telepathy_msn_t self:unix_dgram_socket { write create connect }; + + manage_dirs_pattern(telepathy_msn_t, telepathy_msn_tmp_t, telepathy_msn_tmp_t) + manage_files_pattern(telepathy_msn_t, telepathy_msn_tmp_t, telepathy_msn_tmp_t) + manage_sock_files_pattern(telepathy_msn_t, telepathy_msn_tmp_t, telepathy_msn_tmp_t) ++exec_files_pattern(telepathy_msn_t, telepathy_msn_tmp_t, telepathy_msn_tmp_t) + files_tmp_filetrans(telepathy_msn_t, telepathy_msn_tmp_t, { dir file sock_file }) +- + userdom_user_tmp_filetrans(telepathy_msn_t, telepathy_msn_tmp_t, { dir file sock_file }) +- ++userdom_dontaudit_setattr_user_tmp(telepathy_msn_t) + can_exec(telepathy_msn_t, telepathy_msn_tmp_t) + + corenet_all_recvfrom_netlabel(telepathy_msn_t) +-corenet_all_recvfrom_unlabeled(telepathy_msn_t) + corenet_tcp_sendrecv_generic_if(telepathy_msn_t) + corenet_tcp_sendrecv_generic_node(telepathy_msn_t) +- +-corenet_sendrecv_http_client_packets(telepathy_msn_t) ++corenet_tcp_bind_generic_node(telepathy_msn_t) + corenet_tcp_connect_http_port(telepathy_msn_t) +-corenet_tcp_sendrecv_http_port(telepathy_msn_t) +- +-corenet_sendrecv_mmcc_client_packets(telepathy_msn_t) + corenet_tcp_connect_mmcc_port(telepathy_msn_t) +-corenet_tcp_sendrecv_mmcc_port(telepathy_msn_t) +- +-corenet_sendrecv_msnp_client_packets(telepathy_msn_t) + corenet_tcp_connect_msnp_port(telepathy_msn_t) +-corenet_tcp_sendrecv_msnp_port(telepathy_msn_t) +- +-corenet_sendrecv_sip_client_packets(telepathy_msn_t) + corenet_tcp_connect_sip_port(telepathy_msn_t) +-corenet_tcp_sendrecv_sip_port(telepathy_msn_t) +- +-corecmd_exec_bin(telepathy_msn_t) +-corecmd_exec_shell(telepathy_msn_t) +- +-files_read_usr_files(telepathy_msn_t) ++corenet_sendrecv_http_client_packets(telepathy_msn_t) ++corenet_sendrecv_mmcc_client_packets(telepathy_msn_t) ++corenet_sendrecv_msnp_client_packets(telepathy_msn_t) + + init_read_state(telepathy_msn_t) + +@@ -310,18 +275,19 @@ logging_send_syslog_msg(telepathy_msn_t) + + miscfiles_read_all_certs(telepathy_msn_t) + +-# userdom_dontaudit_setattr_user_tmp(telepathy_msn_t) +- + tunable_policy(`telepathy_connect_all_ports',` +- corenet_sendrecv_all_client_packets(telepathy_msn_t) + corenet_tcp_connect_all_ports(telepathy_msn_t) + corenet_tcp_sendrecv_all_ports(telepathy_msn_t) ++ corenet_udp_sendrecv_all_ports(telepathy_msn_t) + ') + + tunable_policy(`telepathy_tcp_connect_generic_network_ports',` +- corenet_sendrecv_generic_client_packets(telepathy_msn_t) + corenet_tcp_connect_generic_port(telepathy_msn_t) +- corenet_tcp_sendrecv_generic_port(telepathy_msn_t) ++ corenet_sendrecv_generic_client_packets(telepathy_msn_t) ++') ++ ++optional_policy(` ++ gnome_read_gconf_home_files(telepathy_msn_t) + ') + + optional_policy(` +@@ -332,43 +298,33 @@ optional_policy(` + ') + ') + +-# optional_policy(` +- # ~/.config/dconf/user +- # gnome_manage_generic_home_content(telepathy_msn_t) +-# ') +- + ####################################### + # +-# Salut local policy ++# Telepathy Salut local policy. + # + +-allow telepathy_salut_t self:tcp_socket { accept listen }; ++allow telepathy_salut_t self:tcp_socket create_stream_socket_perms; + + manage_sock_files_pattern(telepathy_salut_t, telepathy_salut_tmp_t, telepathy_salut_tmp_t) + files_tmp_filetrans(telepathy_salut_t, telepathy_salut_tmp_t, sock_file) + + corenet_all_recvfrom_netlabel(telepathy_salut_t) +-corenet_all_recvfrom_unlabeled(telepathy_salut_t) + corenet_tcp_sendrecv_generic_if(telepathy_salut_t) + corenet_tcp_sendrecv_generic_node(telepathy_salut_t) + corenet_tcp_bind_generic_node(telepathy_salut_t) +- +-corenet_sendrecv_presence_server_packets(telepathy_salut_t) + corenet_tcp_bind_presence_port(telepathy_salut_t) +-corenet_sendrecv_presence_client_packets(telepathy_salut_t) + corenet_tcp_connect_presence_port(telepathy_salut_t) +-corenet_tcp_sendrecv_presence_port(telepathy_salut_t) ++corenet_sendrecv_presence_server_packets(telepathy_salut_t) + + tunable_policy(`telepathy_connect_all_ports',` +- corenet_sendrecv_all_client_packets(telepathy_salut_t) + corenet_tcp_connect_all_ports(telepathy_salut_t) + corenet_tcp_sendrecv_all_ports(telepathy_salut_t) ++ corenet_udp_sendrecv_all_ports(telepathy_salut_t) + ') + + tunable_policy(`telepathy_tcp_connect_generic_network_ports',` +- corenet_sendrecv_generic_client_packets(telepathy_salut_t) + corenet_tcp_connect_generic_port(telepathy_salut_t) +- corenet_tcp_sendrecv_generic_port(telepathy_salut_t) ++ corenet_sendrecv_generic_client_packets(telepathy_salut_t) + ') + + optional_policy(` +@@ -381,73 +337,51 @@ optional_policy(` + + ####################################### + # +-# Sofiasip local policy ++# Telepathy Sofiasip local policy. + # + +-allow telepathy_sofiasip_t self:rawip_socket create_stream_socket_perms; +-allow telepathy_sofiasip_t self:tcp_socket { accept listen }; ++allow telepathy_sofiasip_t self:rawip_socket { create_socket_perms listen }; ++allow telepathy_sofiasip_t self:tcp_socket create_stream_socket_perms; + + corenet_all_recvfrom_netlabel(telepathy_sofiasip_t) +-corenet_all_recvfrom_unlabeled(telepathy_sofiasip_t) + corenet_tcp_sendrecv_generic_if(telepathy_sofiasip_t) + corenet_raw_sendrecv_generic_if(telepathy_sofiasip_t) + corenet_raw_sendrecv_generic_node(telepathy_sofiasip_t) + corenet_tcp_sendrecv_generic_node(telepathy_sofiasip_t) + corenet_tcp_bind_generic_node(telepathy_sofiasip_t) + corenet_raw_bind_generic_node(telepathy_sofiasip_t) +- +-corenet_sendrecv_all_server_packets(telepathy_sofiasip_t) + corenet_tcp_bind_all_unreserved_ports(telepathy_sofiasip_t) +-corenet_tcp_sendrecv_all_ports(telepathy_sofiasip_t) +- + corenet_dontaudit_tcp_bind_all_ports(telepathy_sofiasip_t) +- +-corenet_sendrecv_sip_client_packets(telepathy_sofiasip_t) + corenet_tcp_connect_sip_port(telepathy_sofiasip_t) +-corenet_tcp_sendrecv_sip_port(telepathy_sofiasip_t) ++corenet_sendrecv_sip_client_packets(telepathy_sofiasip_t) + + kernel_request_load_module(telepathy_sofiasip_t) + + tunable_policy(`telepathy_connect_all_ports',` +- corenet_sendrecv_all_client_packets(telepathy_sofiasip_t) + corenet_tcp_connect_all_ports(telepathy_sofiasip_t) + corenet_tcp_sendrecv_all_ports(telepathy_sofiasip_t) ++ corenet_udp_sendrecv_all_ports(telepathy_sofiasip_t) + ') + + tunable_policy(`telepathy_tcp_connect_generic_network_ports',` +- corenet_sendrecv_generic_client_packets(telepathy_sofiasip_t) + corenet_tcp_connect_generic_port(telepathy_sofiasip_t) +- corenet_tcp_sendrecv_generic_port(telepathy_sofiasip_t) ++ corenet_sendrecv_generic_client_packets(telepathy_sofiasip_t) + ') + + ####################################### + # +-# Sunshine local policy ++# Telepathy Sunshine local policy. + # + + manage_dirs_pattern(telepathy_sunshine_t, telepathy_sunshine_home_t, telepathy_sunshine_home_t) + manage_files_pattern(telepathy_sunshine_t, telepathy_sunshine_home_t, telepathy_sunshine_home_t) +-userdom_user_home_dir_filetrans(telepathy_sunshine_t, telepathy_sunshine_home_t, dir, ".telepathy-sunshine") ++userdom_user_home_dir_filetrans(telepathy_sunshine_t, telepathy_sunshine_home_t, { dir file }) ++userdom_search_user_home_dirs(telepathy_sunshine_t) + + manage_files_pattern(telepathy_sunshine_t, telepathy_sunshine_tmp_t, telepathy_sunshine_tmp_t) ++exec_files_pattern(telepathy_sunshine_t, telepathy_sunshine_tmp_t, telepathy_sunshine_tmp_t) + files_tmp_filetrans(telepathy_sunshine_t, telepathy_sunshine_tmp_t, file) + +-can_exec(telepathy_sunshine_t, telepathy_sunshine_tmp_t) +- +-corecmd_exec_bin(telepathy_sunshine_t) +- +-files_read_usr_files(telepathy_sunshine_t) +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(telepathy_sunshine_t) +- fs_manage_nfs_files(telepathy_sunshine_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(telepathy_sunshine_t) +- fs_manage_cifs_files(telepathy_sunshine_t) +-') +- + optional_policy(` + xserver_read_xdm_pid(telepathy_sunshine_t) + xserver_stream_connect(telepathy_sunshine_t) +@@ -455,31 +389,51 @@ optional_policy(` + + ####################################### + # +-# Common telepathy domain local policy ++# telepathy domains common policy + # + + allow telepathy_domain self:process { getsched signal sigkill }; + allow telepathy_domain self:fifo_file rw_fifo_file_perms; ++allow telepathy_domain self:tcp_socket create_socket_perms; ++allow telepathy_domain self:udp_socket create_socket_perms; + + manage_dirs_pattern(telepathy_domain, telepathy_cache_home_t, telepathy_cache_home_t) +-# gnome_cache_filetrans(telepathy_domain, telepathy_cache_home_t, dir, "telepathy") ++optional_policy(` ++ gnome_cache_filetrans(telepathy_domain, telepathy_cache_home_t, dir, "telepathy") ++') + +-manage_dirs_pattern(telepathy_domain, telepathy_data_home_t, telepathy_data_home_t) +-# gnome_data_filetrans(telepathy_domain, telepathy_data_home_t, dir, "telepathy") ++corecmd_exec_bin(telepathy_domain) ++corecmd_exec_shell(telepathy_domain) + + dev_read_urand(telepathy_domain) + +-kernel_read_system_state(telepathy_domain) +- + fs_getattr_all_fs(telepathy_domain) + fs_search_auto_mountpoints(telepathy_domain) ++fs_rw_inherited_tmpfs_files(telepathy_domain) + +-miscfiles_read_localization(telepathy_domain) ++userdom_search_user_tmp_dirs(telepathy_domain) ++userdom_search_user_home_dirs(telepathy_domain) + + optional_policy(` + automount_dontaudit_getattr_tmp_dirs(telepathy_domain) + ') + ++optional_policy(` ++ gnome_read_generic_cache_files(telepathy_domain) ++ gnome_write_generic_cache_files(telepathy_domain) ++ gnome_filetrans_config_home_content(telepathy_domain) ++') ++ ++optional_policy(` ++ systemd_dbus_chat_logind(telepathy_domain) ++ systemd_write_inhibit_pipes(telepathy_domain) ++') ++ ++optional_policy(` ++ telepathy_dbus_chat(telepathy_domain) ++') ++ + optional_policy(` + xserver_rw_xdm_pipes(telepathy_domain) + ') ++ +diff --git a/telnet.te b/telnet.te +index d7c8633695..0d3d4392ad 100644 +--- a/telnet.te ++++ b/telnet.te +@@ -27,19 +27,22 @@ files_pid_file(telnetd_var_run_t) + # Local policy + # + +-allow telnetd_t self:capability { fsetid chown fowner setuid setgid sys_tty_config dac_override }; ++allow telnetd_t self:capability { fsetid chown fowner setuid setgid sys_tty_config dac_read_search dac_override }; + allow telnetd_t self:process signal_perms; + allow telnetd_t self:fifo_file rw_fifo_file_perms; +-allow telnetd_t self:tcp_socket { accept listen }; ++allow telnetd_t self:tcp_socket connected_stream_socket_perms; ++allow telnetd_t self:udp_socket create_socket_perms; ++# for identd; cjp: this should probably only be inetd_child rules? ++allow telnetd_t self:netlink_tcpdiag_socket r_netlink_socket_perms; + + allow telnetd_t telnetd_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms }; ++ + term_create_pty(telnetd_t, telnetd_devpts_t) + + allow telnetd_t telnetd_keytab_t:file read_file_perms; + + manage_dirs_pattern(telnetd_t, telnetd_tmp_t, telnetd_tmp_t) + manage_files_pattern(telnetd_t, telnetd_tmp_t, telnetd_tmp_t) +-files_tmp_filetrans(telnetd_t, telnetd_tmp_t, { file dir }) + + manage_files_pattern(telnetd_t, telnetd_var_run_t, telnetd_var_run_t) + files_pid_filetrans(telnetd_t, telnetd_var_run_t, file) +@@ -48,7 +51,6 @@ kernel_read_kernel_sysctls(telnetd_t) + kernel_read_system_state(telnetd_t) + kernel_read_network_state(telnetd_t) + +-corenet_all_recvfrom_unlabeled(telnetd_t) + corenet_all_recvfrom_netlabel(telnetd_t) + corenet_tcp_sendrecv_generic_if(telnetd_t) + corenet_tcp_sendrecv_generic_node(telnetd_t) +@@ -63,7 +65,6 @@ dev_read_urand(telnetd_t) + + domain_interactive_fd(telnetd_t) + +-files_read_usr_files(telnetd_t) + files_read_etc_runtime_files(telnetd_t) + files_search_home(telnetd_t) + +@@ -76,12 +77,12 @@ init_rw_utmp(telnetd_t) + + logging_send_syslog_msg(telnetd_t) + +-miscfiles_read_localization(telnetd_t) +- + seutil_read_config(telnetd_t) + + userdom_search_user_home_dirs(telnetd_t) + userdom_setattr_user_ptys(telnetd_t) ++userdom_manage_user_tmp_files(telnetd_t) ++userdom_tmp_filetrans_user_tmp(telnetd_t, file) + + tunable_policy(`use_nfs_home_dirs',` + fs_search_nfs(telnetd_t) +@@ -93,7 +94,7 @@ tunable_policy(`use_samba_home_dirs',` + + optional_policy(` + kerberos_read_keytab(telnetd_t) +- kerberos_tmp_filetrans_host_rcache(telnetd_t, file, "host_0") ++ kerberos_tmp_filetrans_host_rcache(telnetd_t, "host_0") + kerberos_manage_host_rcache(telnetd_t) + kerberos_use(telnetd_t) + ') +diff --git a/tftp.fc b/tftp.fc +index 3dd87daf5f..0d13384b01 100644 +--- a/tftp.fc ++++ b/tftp.fc +@@ -1,9 +1,9 @@ +-/etc/(x)?inetd\.d/tftp -- gen_context(system_u:object_r:tftpd_conf_t,s0) ++/etc/(x)?inetd\.d/tftp -- gen_context(system_u:object_r:tftpd_etc_t,s0) + + /usr/sbin/atftpd -- gen_context(system_u:object_r:tftpd_exec_t,s0) + /usr/sbin/in\.tftpd -- gen_context(system_u:object_r:tftpd_exec_t,s0) + +-/tftpboot -d gen_context(system_u:object_r:tftpdir_t,s0) +-/tftpboot/.* gen_context(system_u:object_r:tftpdir_t,s0) ++/tftpboot -d gen_context(system_u:object_r:tftpdir_t,s0) ++/tftpboot/.* gen_context(system_u:object_r:tftpdir_t,s0) + +-/var/lib/tftpboot(/.*)? gen_context(system_u:object_r:tftpdir_rw_t,s0) ++/var/lib/tftpboot(/.*)? gen_context(system_u:object_r:tftpdir_rw_t,s0) +diff --git a/tftp.if b/tftp.if +index 9957e300d8..cd2132109e 100644 +--- a/tftp.if ++++ b/tftp.if +@@ -1,8 +1,8 @@ +-## Trivial file transfer protocol daemon. ++## Trivial file transfer protocol daemon + + ######################################## + ## +-## Read tftp content files. ++## Read tftp content + ## + ## + ## +@@ -13,18 +13,21 @@ + interface(`tftp_read_content',` + gen_require(` + type tftpdir_t; ++ type tftpdir_rw_t; + ') + +- files_search_var_lib($1) +- allow $1 tftpdir_t:dir list_dir_perms; +- allow $1 tftpdir_t:file read_file_perms; +- allow $1 tftpdir_t:lnk_file read_lnk_file_perms; ++ list_dirs_pattern($1, tftpdir_t, tftpdir_t) ++ read_files_pattern($1, tftpdir_t, tftpdir_t) ++ read_lnk_files_pattern($1, tftpdir_t, tftpdir_t) ++ ++ list_dirs_pattern($1, tftpdir_rw_t, tftpdir_rw_t) ++ read_files_pattern($1, tftpdir_rw_t, tftpdir_rw_t) ++ read_lnk_files_pattern($1, tftpdir_rw_t, tftpdir_rw_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## tftp rw content. ++## Search tftp /var/lib directories. + ## + ## + ## +@@ -32,20 +35,18 @@ interface(`tftp_read_content',` + ## + ## + # +-interface(`tftp_manage_rw_content',` ++interface(`tftp_search_rw_content',` + gen_require(` + type tftpdir_rw_t; + ') + ++ search_dirs_pattern($1, tftpdir_rw_t, tftpdir_rw_t) + files_search_var_lib($1) +- allow $1 tftpdir_rw_t:dir manage_dir_perms; +- allow $1 tftpdir_rw_t:file manage_file_perms; +- allow $1 tftpdir_rw_t:lnk_file manage_lnk_file_perms; + ') + + ######################################## + ## +-## Read tftpd configuration files. ++## Allow read tftp /var/lib files. + ## + ## + ## +@@ -53,19 +54,18 @@ interface(`tftp_manage_rw_content',` + ## + ## + # +-interface(`tftp_read_config_files',` ++interface(`tftp_read_rw_content',` + gen_require(` +- type tftpd_conf_t; ++ type tftpdir_rw_t; + ') + +- files_search_etc($1) +- allow $1 tftpd_conf_t:file read_file_perms; ++ files_search_var_lib($1) ++ read_files_pattern($1, tftpdir_rw_t, tftpdir_rw_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## tftpd configuration files. ++## Allow write tftp /var/lib files. + ## + ## + ## +@@ -73,55 +73,83 @@ interface(`tftp_read_config_files',` + ## + ## + # +-interface(`tftp_manage_config_files',` ++interface(`tftp_write_rw_content',` + gen_require(` +- type tftpd_conf_t; ++ type tftpdir_rw_t; + ') + +- files_search_etc($1) +- allow $1 tftpd_conf_t:file manage_file_perms; ++ files_search_var_lib($1) ++ write_files_pattern($1, tftpdir_rw_t, tftpdir_rw_t) + ') + + ######################################## + ## +-## Create objects in etc directories +-## with tftp conf type. ++## Manage tftp /var/lib files. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`tftp_manage_rw_content',` ++ gen_require(` ++ type tftpdir_rw_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, tftpdir_rw_t, tftpdir_rw_t) ++ manage_files_pattern($1, tftpdir_rw_t, tftpdir_rw_t) ++') ++ ++######################################## ++## ++## Read tftp config files. ++## ++## + ## +-## Class of the object being created. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`tftp_read_config',` ++ gen_require(` ++ type tftpd_etc_t; ++ ') ++ ++ read_files_pattern($1, tftpd_etc_t, tftpd_etc_t) ++') ++ ++######################################## ++## ++## Manage tftp config files. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## + # +-interface(`tftp_etc_filetrans_config',` ++interface(`tftp_manage_config',` + gen_require(` +- type tftp_conf_t; ++ type tftpd_etc_t; + ') + +- files_etc_filetrans($1, tftp_conf_t, $2, $3) ++ manage_files_pattern($1, tftpd_etc_t, tftpd_etc_t) ++ files_etc_filetrans($1, tftpd_etc_t, file, "tftp") + ') + + ######################################## + ## + ## Create objects in tftpdir directories +-## with a private type. ++## with specified types. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## + ## + ## Private file type. + ## +@@ -131,25 +159,38 @@ interface(`tftp_etc_filetrans_config',` + ## Class of the object being created. + ## + ## +-## +-## +-## The name of the object being created. +-## +-## + # + interface(`tftp_filetrans_tftpdir',` + gen_require(` + type tftpdir_rw_t; + ') + ++ filetrans_pattern($1, tftpdir_rw_t, $2, $3) + files_search_var_lib($1) +- filetrans_pattern($1, tftpdir_rw_t, $2, $3, $4) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an tftp environment. ++## Transition to tftp named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tftp_filetrans_named_content',` ++ gen_require(` ++ type tftpd_etc_t; ++ ') ++ ++ files_etc_filetrans($1, tftpd_etc_t, file, "tftp") ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an tftp environment + ## + ## + ## +@@ -161,18 +202,22 @@ interface(`tftp_filetrans_tftpdir',` + interface(`tftp_admin',` + gen_require(` + type tftpd_t, tftpdir_t, tftpdir_rw_t, tftpd_var_run_t; +- type tftpd_conf_t; + ') + +- allow $1 tftpd_t:process { ptrace signal_perms }; ++ allow $1 tftpd_t:process signal_perms; + ps_process_pattern($1, tftpd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 tftpd_t:process ptrace; ++ ') + +- files_search_etc($1) +- admin_pattern($1, tftpd_conf_t) ++ files_list_var_lib($1) + +- files_search_var_lib($1) +- admin_pattern($1, { tftpdir_t tftpdir_rw_t }) ++ admin_pattern($1, tftpdir_rw_t) ++ ++ admin_pattern($1, tftpdir_t) + + files_list_pids($1) + admin_pattern($1, tftpd_var_run_t) ++ ++ tftp_manage_config($1) + ') +diff --git a/tftp.te b/tftp.te +index cfaa2a19c8..a9bc6f1ff7 100644 +--- a/tftp.te ++++ b/tftp.te +@@ -6,30 +6,24 @@ policy_module(tftp, 1.13.0) + # + + ## +-##

      +-## Determine whether tftp can modify +-## public files used for public file +-## transfer services. Directories/Files must +-## be labeled public_content_rw_t. +-##

      ++##

      ++## Allow tftp to modify public files ++## used for public file transfer services. ++##

      + ##
      + gen_tunable(tftp_anon_write, false) + + ## +-##

      +-## Determine whether tftp can manage +-## generic user home content. +-##

      ++##

      ++## Allow tftp to read and write files in the user home directories ++##

      + ##
      +-gen_tunable(tftp_enable_homedir, false) ++gen_tunable(tftp_home_dir, false) + + type tftpd_t; + type tftpd_exec_t; + init_daemon_domain(tftpd_t, tftpd_exec_t) + +-type tftpd_conf_t; +-files_config_file(tftpd_conf_t) +- + type tftpd_var_run_t; + files_pid_file(tftpd_var_run_t) + +@@ -39,6 +33,9 @@ files_type(tftpdir_t) + type tftpdir_rw_t; + files_type(tftpdir_rw_t) + ++type tftpd_etc_t; ++files_config_file(tftpd_etc_t) ++ + ######################################## + # + # Local policy +@@ -46,15 +43,17 @@ files_type(tftpdir_rw_t) + + allow tftpd_t self:capability { setgid setuid sys_chroot }; + dontaudit tftpd_t self:capability sys_tty_config; +-allow tftpd_t self:tcp_socket { accept listen }; +-allow tftpd_t self:unix_stream_socket { accept listen }; +- +-allow tftpd_t tftpd_conf_t:file read_file_perms; ++allow tftpd_t self:tcp_socket create_stream_socket_perms; ++allow tftpd_t self:udp_socket create_socket_perms; ++allow tftpd_t self:unix_dgram_socket create_socket_perms; ++allow tftpd_t self:unix_stream_socket create_stream_socket_perms; + + allow tftpd_t tftpdir_t:dir list_dir_perms; + allow tftpd_t tftpdir_t:file read_file_perms; + allow tftpd_t tftpdir_t:lnk_file read_lnk_file_perms; + ++read_files_pattern(tftpd_t, tftpd_etc_t, tftpd_etc_t) ++ + manage_dirs_pattern(tftpd_t, tftpdir_rw_t, tftpdir_rw_t) + manage_files_pattern(tftpd_t, tftpdir_rw_t, tftpdir_rw_t) + manage_lnk_files_pattern(tftpd_t, tftpdir_rw_t, tftpdir_rw_t) +@@ -65,18 +64,23 @@ files_pid_filetrans(tftpd_t, tftpd_var_run_t, file) + kernel_read_system_state(tftpd_t) + kernel_read_kernel_sysctls(tftpd_t) + +-corenet_all_recvfrom_unlabeled(tftpd_t) + corenet_all_recvfrom_netlabel(tftpd_t) ++corenet_tcp_sendrecv_generic_if(tftpd_t) + corenet_udp_sendrecv_generic_if(tftpd_t) ++corenet_tcp_sendrecv_generic_node(tftpd_t) + corenet_udp_sendrecv_generic_node(tftpd_t) ++corenet_tcp_sendrecv_all_ports(tftpd_t) ++corenet_udp_sendrecv_all_ports(tftpd_t) ++corenet_tcp_bind_generic_node(tftpd_t) + corenet_udp_bind_generic_node(tftpd_t) +- +-corenet_sendrecv_tftp_server_packets(tftpd_t) + corenet_udp_bind_tftp_port(tftpd_t) +-corenet_udp_sendrecv_tftp_port(tftpd_t) ++corenet_sendrecv_tftp_server_packets(tftpd_t) + + dev_read_sysfs(tftpd_t) + ++fs_getattr_all_fs(tftpd_t) ++fs_search_auto_mountpoints(tftpd_t) ++ + domain_use_interactive_fds(tftpd_t) + + files_read_etc_runtime_files(tftpd_t) +@@ -84,43 +88,46 @@ files_read_var_files(tftpd_t) + files_read_var_symlinks(tftpd_t) + files_search_var(tftpd_t) + +-fs_getattr_all_fs(tftpd_t) +-fs_search_auto_mountpoints(tftpd_t) +- + auth_use_nsswitch(tftpd_t) + + logging_send_syslog_msg(tftpd_t) + +-miscfiles_read_localization(tftpd_t) + miscfiles_read_public_files(tftpd_t) + + userdom_dontaudit_use_unpriv_user_fds(tftpd_t) + userdom_dontaudit_use_user_terminals(tftpd_t) +-userdom_user_home_dir_filetrans_user_home_content(tftpd_t, { dir file lnk_file }) ++userdom_dontaudit_search_user_home_dirs(tftpd_t) ++ ++userdom_home_manager(tftpd_t) + + tunable_policy(`tftp_anon_write',` + miscfiles_manage_public_files(tftpd_t) + ') + +-tunable_policy(`tftp_enable_homedir',` +- allow tftpd_t self:capability { dac_override dac_read_search }; ++tunable_policy(`tftp_home_dir',` ++ allow tftpd_t self:capability { dac_override dac_read_search }; + ++ # allow access to /home + files_list_home(tftpd_t) +- userdom_manage_user_home_content_dirs(tftpd_t) +- userdom_manage_user_home_content_files(tftpd_t) +- userdom_manage_user_home_content_symlinks(tftpd_t) ++ userdom_read_user_home_content_files(tftpd_t) ++ userdom_manage_user_home_content(tftpd_t) ++ ++ auth_read_all_dirs_except_shadow(tftpd_t) ++ auth_read_all_files_except_shadow(tftpd_t) ++ auth_read_all_symlinks_except_shadow(tftpd_t) ++',` ++ # Needed for permissive mode, to make sure everything gets labeled correctly ++ userdom_user_home_dir_filetrans_pattern(tftpd_t, { dir file lnk_file }) + ') + +-tunable_policy(`tftp_enable_homedir && use_nfs_home_dirs',` +- fs_manage_nfs_dirs(tftpd_t) +- fs_manage_nfs_files(tftpd_t) +- fs_read_nfs_symlinks(tftpd_t) ++tunable_policy(`tftp_home_dir && use_nfs_home_dirs',` ++ fs_manage_nfs_files(tftpd_t) ++ fs_read_nfs_symlinks(tftpd_t) + ') + +-tunable_policy(`tftp_enable_homedir && use_samba_home_dirs',` +- fs_manage_cifs_dirs(tftpd_t) +- fs_manage_cifs_files(tftpd_t) +- fs_read_cifs_symlinks(tftpd_t) ++tunable_policy(`tftp_home_dir && use_samba_home_dirs',` ++ fs_manage_cifs_files(tftpd_t) ++ fs_read_cifs_symlinks(tftpd_t) + ') + + optional_policy(` +diff --git a/tgtd.fc b/tgtd.fc +index 38389e6754..ae0f9ab51f 100644 +--- a/tgtd.fc ++++ b/tgtd.fc +@@ -1,7 +1,4 @@ +-/etc/rc\.d/init\.d/tgtd -- gen_context(system_u:object_r:tgtd_initrc_exec_t,s0) +- +-/usr/sbin/tgtd -- gen_context(system_u:object_r:tgtd_exec_t,s0) +- +-/var/lib/tgtd(/.*)? gen_context(system_u:object_r:tgtd_var_lib_t,s0) +- +-/var/run/tgtd.* -s gen_context(system_u:object_r:tgtd_var_run_t,s0) ++/etc/rc\.d/init\.d/tgtd -- gen_context(system_u:object_r:tgtd_initrc_exec_t,s0) ++/usr/sbin/tgtd -- gen_context(system_u:object_r:tgtd_exec_t,s0) ++/var/lib/tgtd(/.*)? gen_context(system_u:object_r:tgtd_var_lib_t,s0) ++/var/run/tgtd.* gen_context(system_u:object_r:tgtd_var_run_t,s0) +diff --git a/tgtd.if b/tgtd.if +index 5406b6ee8b..dc5b46e280 100644 +--- a/tgtd.if ++++ b/tgtd.if +@@ -97,6 +97,6 @@ interface(`tgtd_admin',` + files_search_tmp($1) + admin_pattern($1, tgtd_tmp_t) + +- files_search_tmpfs($1) ++ fs_search_tmpfs($1) + admin_pattern($1, tgtd_tmpfs_t) + ') +diff --git a/tgtd.te b/tgtd.te +index d010963868..65498f7a4a 100644 +--- a/tgtd.te ++++ b/tgtd.te +@@ -29,8 +29,8 @@ files_pid_file(tgtd_var_run_t) + # Local policy + # + +-allow tgtd_t self:capability sys_resource; +-allow tgtd_t self:capability2 block_suspend; ++allow tgtd_t self:capability { dac_read_search dac_override ipc_lock sys_resource sys_rawio sys_admin }; ++allow tgtd_t self:capability2 { block_suspend wake_alarm }; + allow tgtd_t self:process { setrlimit signal }; + allow tgtd_t self:fifo_file rw_fifo_file_perms; + allow tgtd_t self:netlink_route_socket r_netlink_socket_perms; +@@ -56,15 +56,16 @@ files_pid_filetrans(tgtd_t,tgtd_var_run_t, { file sock_file }) + + kernel_read_system_state(tgtd_t) + kernel_read_fs_sysctls(tgtd_t) ++kernel_read_network_state(tgtd_t) + + corenet_all_recvfrom_netlabel(tgtd_t) +-corenet_all_recvfrom_unlabeled(tgtd_t) + corenet_tcp_sendrecv_generic_if(tgtd_t) + corenet_tcp_sendrecv_generic_node(tgtd_t) + corenet_tcp_bind_generic_node(tgtd_t) + + corenet_sendrecv_iscsi_server_packets(tgtd_t) + corenet_tcp_bind_iscsi_port(tgtd_t) ++corenet_tcp_connect_isns_port(tgtd_t) + corenet_tcp_sendrecv_iscsi_port(tgtd_t) + + corenet_sendrecv_iscsi_client_packets(tgtd_t) +@@ -72,16 +73,18 @@ corenet_tcp_connect_isns_port(tgtd_t) + + dev_read_sysfs(tgtd_t) + +-files_read_etc_files(tgtd_t) ++files_list_mnt(tgtd_t) + + fs_read_anon_inodefs_files(tgtd_t) + ++miscfiles_read_generic_certs(tgtd_t) ++ + storage_manage_fixed_disk(tgtd_t) ++storage_read_scsi_generic(tgtd_t) ++storage_write_scsi_generic(tgtd_t) + + logging_send_syslog_msg(tgtd_t) + +-miscfiles_read_localization(tgtd_t) +- + optional_policy(` + iscsi_manage_semaphores(tgtd_t) + ') +diff --git a/thin.fc b/thin.fc +new file mode 100644 +index 0000000000..1f8a9086c0 +--- /dev/null ++++ b/thin.fc +@@ -0,0 +1,12 @@ ++/usr/bin/thin -- gen_context(system_u:object_r:thin_exec_t,s0) ++ ++/usr/bin/aeolus-configserver-thinwrapper -- gen_context(system_u:object_r:thin_aeolus_configserver_exec_t,s0) ++ ++/var/lib/aeolus-configserver(/.*)? gen_context(system_u:object_r:thin_aeolus_configserver_lib_t,s0) ++ ++/var/log/aeolus-configserver(/.*)? gen_context(system_u:object_r:thin_aeolus_configserver_log_t,s0) ++/var/log/thin\.log.* -- gen_context(system_u:object_r:thin_log_t,s0) ++ ++/var/run/aeolus-configserver(/.*)? gen_context(system_u:object_r:thin_aeolus_configserver_var_run_t,s0) ++/var/run/aeolus/thin\.pid -- gen_context(system_u:object_r:thin_var_run_t,s0) ++/var/run/thin(/.*)? gen_context(system_u:object_r:thin_var_run_t,s0) +diff --git a/thin.if b/thin.if +new file mode 100644 +index 0000000000..5e3637e639 +--- /dev/null ++++ b/thin.if +@@ -0,0 +1,64 @@ ++## thin policy ++ ++####################################### ++## ++## Creates types and rules for a basic ++## thin daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`thin_domain_template',` ++ gen_require(` ++ attribute thin_domain; ++ ') ++ ++ type $1_t, thin_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ can_exec($1_t, $1_exec_t) ++ ++ kernel_read_system_state($1_t) ++') ++ ++###################################### ++## ++## Execute mongod in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`thin_exec',` ++ gen_require(` ++ type thin_exec_t; ++ ') ++ ++ can_exec($1, thin_exec_t) ++') ++ ++##################################### ++## ++## Connect to thin over a unix domain ++## stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`thin_stream_connect',` ++ gen_require(` ++ type thin_t, thin_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, thin_var_run_t, thin_var_run_t, thin_t) ++') +diff --git a/thin.te b/thin.te +new file mode 100644 +index 0000000000..e66fc8c34b +--- /dev/null ++++ b/thin.te +@@ -0,0 +1,115 @@ ++policy_module(thin, 1.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute thin_domain; ++ ++thin_domain_template(thin) ++ ++type thin_log_t; ++logging_log_file(thin_log_t) ++ ++type thin_var_run_t; ++files_pid_file(thin_var_run_t) ++ ++thin_domain_template(thin_aeolus_configserver) ++ ++type thin_aeolus_configserver_lib_t; ++files_type(thin_aeolus_configserver_lib_t) ++ ++type thin_aeolus_configserver_log_t; ++logging_log_file(thin_aeolus_configserver_log_t) ++ ++type thin_aeolus_configserver_var_run_t; ++files_pid_file(thin_aeolus_configserver_var_run_t) ++ ++######################################## ++# ++# thin_domain local policy ++# ++ ++allow thin_domain self:process signal; ++ ++allow thin_domain self:fifo_file rw_fifo_file_perms; ++allow thin_domain self:tcp_socket create_stream_socket_perms; ++ ++# we want to stay in a new thin domain if we call thin binary from a script ++# # initrc_t@thin_test_exec_t->thin_test_t@thin_exec_t->thin_test_t ++can_exec(thin_domain, thin_exec_t) ++ ++corecmd_exec_bin(thin_domain) ++corecmd_exec_shell(thin_domain) ++ ++corenet_tcp_bind_generic_node(thin_domain) ++ ++dev_read_rand(thin_domain) ++dev_read_urand(thin_domain) ++ ++ ++auth_read_passwd(thin_domain) ++ ++miscfiles_read_certs(thin_domain) ++ ++ ++fs_search_auto_mountpoints(thin_domain) ++ ++init_read_utmp(thin_domain) ++ ++kernel_read_kernel_sysctls(thin_domain) ++ ++optional_policy(` ++ apache_read_sys_content(thin_domain) ++') ++ ++optional_policy(` ++ sysnet_read_config(thin_domain) ++') ++ ++######################################## ++# ++# thin local policy ++# ++ ++allow thin_t self:capability { setuid kill setgid dac_read_search dac_override }; ++allow thin_t self:capability2 block_suspend; ++ ++allow thin_t self:netlink_route_socket r_netlink_socket_perms; ++allow thin_t self:udp_socket create_socket_perms; ++allow thin_t self:unix_stream_socket create_stream_socket_perms; ++ ++manage_files_pattern(thin_t, thin_log_t, thin_log_t) ++manage_dirs_pattern(thin_t, thin_log_t, thin_log_t) ++logging_log_filetrans(thin_t, thin_log_t, { file dir }) ++ ++manage_dirs_pattern(thin_t, thin_var_run_t, thin_var_run_t) ++manage_files_pattern(thin_t, thin_var_run_t, thin_var_run_t) ++manage_lnk_files_pattern(thin_t, thin_var_run_t, thin_var_run_t) ++manage_sock_files_pattern(thin_t, thin_var_run_t, thin_var_run_t) ++files_pid_filetrans(thin_t, thin_var_run_t, { dir file sock_file }) ++ ++corenet_tcp_bind_ntop_port(thin_t) ++corenet_tcp_connect_postgresql_port(thin_t) ++ ++####################################### ++# ++# thin aeolus configserver local policy ++# ++ ++allow thin_aeolus_configserver_t self:capability { setuid setgid }; ++ ++corenet_tcp_bind_tram_port(thin_aeolus_configserver_t) ++ ++manage_files_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_lib_t, thin_aeolus_configserver_lib_t) ++manage_dirs_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_lib_t, thin_aeolus_configserver_lib_t) ++files_var_lib_filetrans(thin_aeolus_configserver_t, thin_aeolus_configserver_lib_t, { file dir }) ++ ++manage_files_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_log_t, thin_aeolus_configserver_log_t) ++manage_dirs_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_log_t, thin_aeolus_configserver_log_t) ++logging_log_filetrans(thin_aeolus_configserver_t, thin_aeolus_configserver_log_t, { file dir }) ++ ++manage_files_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_var_run_t, thin_aeolus_configserver_var_run_t) ++manage_dirs_pattern(thin_aeolus_configserver_t, thin_aeolus_configserver_var_run_t, thin_aeolus_configserver_var_run_t) ++files_pid_filetrans(thin_aeolus_configserver_t, thin_aeolus_configserver_var_run_t, { dir file }) +diff --git a/thumb.fc b/thumb.fc +new file mode 100644 +index 0000000000..115bf6c42f +--- /dev/null ++++ b/thumb.fc +@@ -0,0 +1,17 @@ ++HOME_DIR/\.thumbnails(/.*)? gen_context(system_u:object_r:thumb_home_t,s0) ++HOME_DIR/\.cache/thumbnails(/.*)? gen_context(system_u:object_r:thumb_home_t,s0) ++HOME_DIR/missfont\.log.* gen_context(system_u:object_r:thumb_home_t,s0) ++ ++/usr/bin/evince-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/gsf-office-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/gnome-thumbnail-font -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/gnome-[^/]*-thumbnailer(.sh)? -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/raw-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/shotwell-video-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/totem-video-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/whaaw-thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/[^/]*thumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/ffmpegthumbnailer -- gen_context(system_u:object_r:thumb_exec_t,s0) ++/usr/bin/mate-thumbnail-font -- gen_context(system_u:object_r:thumb_exec_t,s0) ++ ++/usr/lib/tumbler-?[^/]*/tumblerd -- gen_context(system_u:object_r:thumb_exec_t,s0) +diff --git a/thumb.if b/thumb.if +new file mode 100644 +index 0000000000..d371f62f60 +--- /dev/null ++++ b/thumb.if +@@ -0,0 +1,153 @@ ++ ++## policy for thumb ++ ++######################################## ++## ++## Transition to thumb. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`thumb_domtrans',` ++ gen_require(` ++ type thumb_t, thumb_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, thumb_exec_t, thumb_t) ++ dontaudit thumb_t $1:unix_stream_socket { getattr read write }; ++') ++ ++######################################## ++## ++## NNP Transition to thumb. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`thumb_nnp_domtrans',` ++ gen_require(` ++ type thumb_t; ++ ') ++ ++ allow $1 thumb_t:process2 { nnp_transition nosuid_transition }; ++ ++') ++ ++######################################## ++## ++## Execute thumb in the thumb domain, and ++## allow the specified role the thumb domain. ++## ++## ++## ++## Domain allowed to transition ++## ++## ++## ++## ++## The role to be allowed the thumb domain. ++## ++## ++# ++interface(`thumb_run',` ++ gen_require(` ++ type thumb_t; ++ ') ++ ++ thumb_domtrans($1) ++ thumb_nnp_domtrans($1) ++ role $2 types thumb_t; ++ ++ allow $1 thumb_t:process signal_perms; ++ ++ dontaudit thumb_t $1:dir list_dir_perms; ++ dontaudit thumb_t $1:file read_file_perms; ++ dontaudit thumb_t $1:unix_stream_socket rw_socket_perms; ++ ++ allow thumb_t $1:shm create_shm_perms; ++ allow thumb_t $1:sem create_sem_perms; ++') ++ ++######################################## ++## ++## Role access for thumb ++## ++## ++## ++## Role allowed access ++## ++## ++## ++## ++## User domain for the role ++## ++## ++# ++interface(`thumb_role',` ++ gen_require(` ++ type thumb_t; ++ class dbus send_msg; ++ ') ++ ++ thumb_run($2, $1) ++ ++ ps_process_pattern($2, thumb_t) ++ allow thumb_t $2:unix_stream_socket connectto; ++ ++ thumb_dbus_chat($2) ++ thumb_filetrans_home_content($2) ++') ++ ++######################################## ++## ++## Send and receive messages from ++## thumb over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`thumb_dbus_chat',` ++ gen_require(` ++ type thumb_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 thumb_t:dbus send_msg; ++ allow thumb_t $1:dbus send_msg; ++ ps_process_pattern(thumb_t, $1) ++') ++ ++######################################## ++## ++## Create thumb content in the user home directory ++## with an correct label. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`thumb_filetrans_home_content',` ++ ++ gen_require(` ++ type thumb_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, thumb_home_t, dir, ".thumbnails") ++ userdom_user_home_dir_filetrans($1, thumb_home_t, file, "missfont.log") ++ ++ optional_policy(` ++ gnome_cache_filetrans($1, thumb_home_t, dir, "thumbnails") ++ ') ++') +diff --git a/thumb.te b/thumb.te +new file mode 100644 +index 0000000000..a66e74723f +--- /dev/null ++++ b/thumb.te +@@ -0,0 +1,164 @@ ++policy_module(thumb, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type thumb_t; ++type thumb_exec_t; ++application_domain(thumb_t, thumb_exec_t) ++ubac_constrained(thumb_t) ++userdom_home_manager(thumb_t) ++ ++type thumb_tmp_t; ++files_tmp_file(thumb_tmp_t) ++ubac_constrained(thumb_tmp_t) ++ ++type thumb_home_t; ++userdom_user_home_content(thumb_home_t) ++ ++type thumb_tmpfs_t; ++files_tmpfs_file(thumb_tmpfs_t) ++ ++######################################## ++# ++# thumb local policy ++# ++ ++allow thumb_t self:process { setsched signal signull setrlimit }; ++dontaudit thumb_t self:capability sys_tty_config; ++dontaudit thumb_t self:process setfscreate; ++ ++tunable_policy(`deny_execmem',`',` ++ allow thumb_t self:process execmem; ++') ++ ++allow thumb_t self:fifo_file manage_fifo_file_perms; ++allow thumb_t self:unix_stream_socket create_stream_socket_perms; ++allow thumb_t self:netlink_route_socket r_netlink_socket_perms; ++allow thumb_t self:udp_socket create_socket_perms; ++allow thumb_t self:tcp_socket create_socket_perms; ++allow thumb_t self:shm create_shm_perms; ++allow thumb_t self:sem create_sem_perms; ++ ++manage_dirs_pattern(thumb_t, thumb_home_t, thumb_home_t) ++manage_files_pattern(thumb_t, thumb_home_t, thumb_home_t) ++userdom_user_home_dir_filetrans(thumb_t, thumb_home_t, dir, ".thumbnails") ++userdom_user_home_dir_filetrans(thumb_t, thumb_home_t, file, "missfont.log") ++userdom_dontaudit_access_check_user_content(thumb_t) ++userdom_rw_inherited_user_tmp_files(thumb_t) ++userdom_manage_home_texlive(thumb_t) ++ ++manage_files_pattern(thumb_t, thumb_tmp_t, thumb_tmp_t) ++manage_dirs_pattern(thumb_t, thumb_tmp_t, thumb_tmp_t) ++manage_sock_files_pattern(thumb_t, thumb_tmp_t, thumb_tmp_t) ++exec_files_pattern(thumb_t, thumb_tmp_t, thumb_tmp_t) ++files_tmp_filetrans(thumb_t, thumb_tmp_t, { file dir sock_file }) ++userdom_user_tmp_filetrans(thumb_t, thumb_tmp_t, { file dir sock_file }) ++ ++manage_dirs_pattern(thumb_t, thumb_tmpfs_t, thumb_tmpfs_t) ++manage_files_pattern(thumb_t, thumb_tmpfs_t, thumb_tmpfs_t) ++fs_tmpfs_filetrans(thumb_t, thumb_tmpfs_t, { dir file }) ++ ++can_exec(thumb_t, thumb_exec_t) ++ ++kernel_read_system_state(thumb_t) ++ ++corecmd_exec_bin(thumb_t) ++corecmd_exec_shell(thumb_t) ++ ++corenet_tcp_connect_xserver_port(thumb_t) ++corenet_dontaudit_tcp_connect_all_ports(thumb_t) ++ ++dev_read_sysfs(thumb_t) ++dev_read_urand(thumb_t) ++dev_dontaudit_rw_dri(thumb_t) ++dev_rw_xserver_misc(thumb_t) ++dev_read_video_dev(thumb_t) ++dev_write_video_dev(thumb_t) ++ ++domain_use_interactive_fds(thumb_t) ++domain_dontaudit_read_all_domains_state(thumb_t) ++ ++files_read_non_security_files(thumb_t) ++files_map_non_security_files(thumb_t) ++ ++fs_getattr_all_fs(thumb_t) ++fs_read_dos_files(thumb_t) ++fs_rw_inherited_tmpfs_files(thumb_t) ++fs_mmap_removable_files(thumb_t) ++ ++auth_read_passwd(thumb_t) ++ ++tunable_policy(`selinuxuser_execmod',` ++ libs_legacy_use_shared_libs(thumb_t) ++') ++ ++miscfiles_read_fonts(thumb_t) ++miscfiles_dontaudit_setattr_fonts_dirs(thumb_t) ++miscfiles_dontaudit_setattr_fonts_cache_dirs(thumb_t) ++ ++sysnet_read_config(thumb_t) ++ ++userdom_dontaudit_setattr_user_tmp(thumb_t) ++userdom_read_user_tmp_files(thumb_t) ++userdom_read_user_home_content_files(thumb_t) ++userdom_exec_user_home_content_files(thumb_t) ++userdom_dontaudit_write_user_tmp_files(thumb_t) ++userdom_dontaudit_delete_user_tmp_files(thumb_t) ++userdom_read_home_audio_files(thumb_t) ++userdom_home_reader(thumb_t) ++ ++userdom_use_user_terminals(thumb_t) ++ ++xserver_read_xdm_home_files(thumb_t) ++xserver_append_xdm_home_files(thumb_t) ++xserver_dontaudit_read_xdm_pid(thumb_t) ++xserver_dontaudit_xdm_tmp_dirs(thumb_t) ++xserver_stream_connect(thumb_t) ++xserver_use_user_fonts(thumb_t) ++ ++optional_policy(` ++ bumblebee_stream_connect(thumb_t) ++') ++ ++optional_policy(` ++ dbus_exec_dbusd(thumb_t) ++ dbus_connect_session_bus(thumb_t) ++ dbus_stream_connect_session_bus(thumb_t) ++ dbus_chat_session_bus(thumb_t) ++') ++ ++optional_policy(` ++ # .config ++ gnome_dontaudit_search_config(thumb_t) ++ gnome_dontaudit_write_config_files(thumb_t) ++ gnome_append_home_config(thumb_t) ++ gnome_append_generic_cache_files(thumb_t) ++ gnome_read_generic_data_home_files(thumb_t) ++ gnome_dontaudit_rw_generic_cache_files(thumb_t) ++ gnome_manage_gstreamer_home_files(thumb_t) ++ gnome_manage_gstreamer_home_dirs(thumb_t) ++ gnome_exec_gstreamer_home_files(thumb_t) ++ gnome_create_generic_cache_dir(thumb_t) ++ gnome_cache_filetrans(thumb_t, thumb_home_t, dir, "thumbnails") ++ gnome_cache_filetrans(thumb_t, thumb_home_t, file) ++') ++ ++optional_policy(` ++ sssd_dontaudit_stream_connect(thumb_t) ++') ++ ++optional_policy(` ++ nscd_dontaudit_write_sock_file(thumb_t) ++') ++ ++optional_policy(` ++ nslcd_dontaudit_write_sock_file(thumb_t) ++') ++ ++tunable_policy(`nis_enabled',` ++ corenet_dontaudit_udp_bind_all_ports(thumb_t) ++ corenet_dontaudit_udp_bind_generic_node(thumb_t) ++') +diff --git a/thunderbird.te b/thunderbird.te +index 5e867da56e..b25ea6e08b 100644 +--- a/thunderbird.te ++++ b/thunderbird.te +@@ -53,7 +53,6 @@ kernel_read_system_state(thunderbird_t) + + corecmd_exec_shell(thunderbird_t) + +-corenet_all_recvfrom_unlabeled(thunderbird_t) + corenet_all_recvfrom_netlabel(thunderbird_t) + corenet_tcp_sendrecv_generic_if(thunderbird_t) + corenet_tcp_sendrecv_generic_node(thunderbird_t) +@@ -82,7 +81,6 @@ dev_read_urand(thunderbird_t) + dev_dontaudit_search_sysfs(thunderbird_t) + + files_list_tmp(thunderbird_t) +-files_read_usr_files(thunderbird_t) + files_read_etc_runtime_files(thunderbird_t) + files_read_var_files(thunderbird_t) + files_read_var_symlinks(thunderbird_t) +@@ -98,7 +96,6 @@ fs_search_auto_mountpoints(thunderbird_t) + auth_use_nsswitch(thunderbird_t) + + miscfiles_read_fonts(thunderbird_t) +-miscfiles_read_localization(thunderbird_t) + + userdom_write_user_tmp_sockets(thunderbird_t) + +@@ -107,23 +104,14 @@ userdom_manage_user_tmp_files(thunderbird_t) + + userdom_manage_user_home_content_dirs(thunderbird_t) + userdom_manage_user_home_content_files(thunderbird_t) +-userdom_user_home_dir_filetrans_user_home_content(thunderbird_t, { dir file }) ++userdom_filetrans_home_content(thunderbird_t) + + xserver_user_x_domain_template(thunderbird, thunderbird_t, thunderbird_tmpfs_t) + xserver_read_xdm_tmp_files(thunderbird_t) + xserver_dontaudit_getattr_xdm_tmp_sockets(thunderbird_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(thunderbird_t) +- fs_manage_nfs_files(thunderbird_t) +- fs_manage_nfs_symlinks(thunderbird_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(thunderbird_t) +- fs_manage_cifs_files(thunderbird_t) +- fs_manage_cifs_symlinks(thunderbird_t) +-') ++# Access ~/.thunderbird ++userdom_home_manager(thunderbird_t) + + ifndef(`enable_mls',` + fs_search_removable(thunderbird_t) +diff --git a/timidity.te b/timidity.te +index 97cd15589c..49321a5bf0 100644 +--- a/timidity.te ++++ b/timidity.te +@@ -36,7 +36,6 @@ fs_tmpfs_filetrans(timidity_t, timidity_tmpfs_t, { dir file lnk_file sock_file f + kernel_read_kernel_sysctls(timidity_t) + kernel_read_system_state(timidity_t) + +-corenet_all_recvfrom_unlabeled(timidity_t) + corenet_all_recvfrom_netlabel(timidity_t) + corenet_tcp_sendrecv_generic_if(timidity_t) + corenet_udp_sendrecv_generic_if(timidity_t) +@@ -51,8 +50,6 @@ dev_write_sound(timidity_t) + + domain_use_interactive_fds(timidity_t) + +-files_read_etc_files(timidity_t) +-files_read_usr_files(timidity_t) + files_search_tmp(timidity_t) + + fs_search_auto_mountpoints(timidity_t) +diff --git a/tlp.fc b/tlp.fc +new file mode 100644 +index 0000000000..eef708d929 +--- /dev/null ++++ b/tlp.fc +@@ -0,0 +1,7 @@ ++/usr/lib/systemd/system/((tlp-sleep.*)|(tlp.*)) -- gen_context(system_u:object_r:tlp_unit_file_t,s0) ++ ++/usr/sbin/tlp -- gen_context(system_u:object_r:tlp_exec_t,s0) ++ ++/var/lib/tlp(/.*)? gen_context(system_u:object_r:tlp_var_lib_t,s0) ++ ++/var/run/tlp(/.*)? gen_context(system_u:object_r:tlp_var_run_t,s0) +diff --git a/tlp.if b/tlp.if +new file mode 100644 +index 0000000000..368e188425 +--- /dev/null ++++ b/tlp.if +@@ -0,0 +1,184 @@ ++ ++## policy for tlp ++ ++######################################## ++## ++## Execute tlp_exec_t in the tlp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tlp_domtrans',` ++ gen_require(` ++ type tlp_t, tlp_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, tlp_exec_t, tlp_t) ++') ++ ++###################################### ++## ++## Execute tlp in the caller domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tlp_exec',` ++ gen_require(` ++ type tlp_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, tlp_exec_t) ++') ++ ++######################################## ++## ++## Search tlp conf directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tlp_search_conf',` ++ gen_require(` ++ type tlp_etc_rw_t; ++ ') ++ ++ allow $1 tlp_etc_rw_t:dir search_dir_perms; ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Read tlp conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tlp_read_conf_files',` ++ gen_require(` ++ type tlp_etc_rw_t; ++ ') ++ ++ allow $1 tlp_etc_rw_t:dir list_dir_perms; ++ read_files_pattern($1, tlp_etc_rw_t, tlp_etc_rw_t) ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Manage tlp conf files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tlp_manage_conf_files',` ++ gen_require(` ++ type tlp_etc_rw_t; ++ ') ++ ++ manage_files_pattern($1, tlp_etc_rw_t, tlp_etc_rw_t) ++ files_search_etc($1) ++') ++ ++######################################## ++## ++## Execute tlp server in the tlp domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tlp_systemctl',` ++ gen_require(` ++ type tlp_t; ++ type tlp_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 tlp_unit_file_t:file read_file_perms; ++ allow $1 tlp_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, tlp_t) ++') ++ ++######################################## ++## ++## Read all dbus pid files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tlp_manage_pid_files',` ++ gen_require(` ++ type tlp_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ manage_files_pattern($1, tlp_var_run_t, tlp_var_run_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an tlp environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`tlp_admin',` ++ gen_require(` ++ type tlp_t; ++ type tlp_etc_rw_t; ++ type tlp_unit_file_t; ++ ') ++ ++ allow $1 tlp_t:process { signal_perms }; ++ ps_process_pattern($1, tlp_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 tlp_t:process ptrace; ++ ') ++ ++ files_search_etc($1) ++ admin_pattern($1, tlp_etc_rw_t) ++ ++ tlp_systemctl($1) ++ admin_pattern($1, tlp_unit_file_t) ++ allow $1 tlp_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/tlp.te b/tlp.te +new file mode 100644 +index 0000000000..80e71067a3 +--- /dev/null ++++ b/tlp.te +@@ -0,0 +1,95 @@ ++policy_module(tlp, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++type tlp_t; ++type tlp_exec_t; ++init_daemon_domain(tlp_t, tlp_exec_t) ++ ++type tlp_var_run_t; ++files_pid_file(tlp_var_run_t) ++ ++type tlp_var_lib_t; ++files_type(tlp_var_lib_t) ++ ++type tlp_unit_file_t; ++systemd_unit_file(tlp_unit_file_t) ++ ++######################################## ++# ++# tlp local policy ++# ++allow tlp_t self:capability { net_admin sys_rawio }; ++allow tlp_t self:unix_stream_socket create_stream_socket_perms; ++allow tlp_t self:udp_socket create_socket_perms; ++allow tlp_t self:unix_dgram_socket create_socket_perms; ++allow tlp_t self:netlink_generic_socket create_socket_perms; ++ ++manage_dirs_pattern(tlp_t, tlp_var_run_t, tlp_var_run_t) ++manage_files_pattern(tlp_t, tlp_var_run_t, tlp_var_run_t) ++files_pid_filetrans(tlp_t, tlp_var_run_t, { dir file }) ++ ++manage_dirs_pattern(tlp_t, tlp_var_lib_t, tlp_var_lib_t) ++manage_files_pattern(tlp_t, tlp_var_lib_t, tlp_var_lib_t) ++files_var_lib_filetrans(tlp_t, tlp_var_lib_t, dir) ++ ++kernel_read_system_state(tlp_t) ++kernel_read_network_state(tlp_t) ++kernel_read_fs_sysctls(tlp_t) ++kernel_rw_fs_sysctls(tlp_t) ++kernel_rw_kernel_sysctl(tlp_t) ++kernel_rw_vm_sysctls(tlp_t) ++kernel_create_rpc_sysctls(tlp_t) ++ ++auth_read_passwd(tlp_t) ++ ++corecmd_exec_bin(tlp_t) ++ ++dev_list_sysfs(tlp_t) ++dev_manage_sysfs(tlp_t) ++dev_rw_cpu_microcode(tlp_t) ++dev_rw_wireless(tlp_t) ++ ++files_read_kernel_modules(tlp_t) ++files_map_kernel_modules(tlp_t) ++files_load_kernel_modules(tlp_t) ++ ++modutils_exec_insmod(tlp_t) ++modutils_read_module_config(tlp_t) ++ ++logging_send_syslog_msg(tlp_t) ++ ++storage_raw_read_fixed_disk(tlp_t) ++storage_raw_read_removable_device(tlp_t) ++storage_raw_write_removable_device(tlp_t) ++ ++sysnet_exec_ifconfig(tlp_t) ++ ++optional_policy(` ++ dbus_stream_connect_system_dbusd(tlp_t) ++ dbus_system_bus_client(tlp_t) ++') ++ ++optional_policy(` ++ fstools_exec(tlp_t) ++') ++ ++optional_policy(` ++ mount_domtrans(tlp_t) ++') ++ ++optional_policy(` ++ sssd_read_public_files(tlp_t) ++ sssd_stream_connect(tlp_t) ++') ++ ++optional_policy(` ++ systemd_rfkill_domtrans(tlp_t) ++') ++ ++optional_policy(` ++ udev_domtrans(tlp_t) ++') +diff --git a/tmpreaper.te b/tmpreaper.te +index 585a77f951..0aca5b5fb2 100644 +--- a/tmpreaper.te ++++ b/tmpreaper.te +@@ -5,37 +5,74 @@ policy_module(tmpreaper, 1.7.1) + # Declarations + # + ++## ++##

      ++## Determine whether tmpreaper can use ++## nfs file systems. ++##

      ++##
      ++gen_tunable(tmpreaper_use_nfs, false) ++ ++ ++## ++##

      ++## Determine whether tmpreaper can use ++## cifs file systems. ++##

      ++##
      ++gen_tunable(tmpreaper_use_cifs, false) ++ ++## ++##

      ++## Determine whether tmpreaper can use samba_share files ++##

      ++##
      ++gen_tunable(tmpreaper_use_samba, false) ++ + type tmpreaper_t; + type tmpreaper_exec_t; + init_system_domain(tmpreaper_t, tmpreaper_exec_t) ++application_domain(tmpreaper_t, tmpreaper_exec_t) ++init_nnp_daemon_domain(tmpreaper_t) + + ######################################## + # + # Local Policy + # + +-allow tmpreaper_t self:capability { dac_override dac_read_search fowner }; ++allow tmpreaper_t self:capability { dac_override dac_read_search fowner sys_ptrace }; + allow tmpreaper_t self:fifo_file rw_fifo_file_perms; + + kernel_list_unlabeled(tmpreaper_t) + kernel_read_system_state(tmpreaper_t) ++kernel_read_network_state(tmpreaper_t) ++kernel_delete_unlabeled(tmpreaper_t) ++kernel_dontaudit_getattr_all_sysctls(tmpreaper_t) + + dev_read_urand(tmpreaper_t) ++dev_getattr_all_chr_files(tmpreaper_t) ++dev_getattr_all_blk_files(tmpreaper_t) ++dev_getattr_mtrr_dev(tmpreaper_t) + + corecmd_exec_bin(tmpreaper_t) + corecmd_exec_shell(tmpreaper_t) + ++domain_read_all_domains_state(tmpreaper_t) ++domain_getattr_all_sockets(tmpreaper_t) ++domain_getattr_all_pipes(tmpreaper_t) ++ + fs_getattr_xattr_fs(tmpreaper_t) + fs_list_all(tmpreaper_t) ++fs_setattr_tmpfs_dirs(tmpreaper_t) ++fs_delete_tmpfs_files(tmpreaper_t) + +-files_getattr_all_dirs(tmpreaper_t) +-files_getattr_all_files(tmpreaper_t) + files_read_var_lib_files(tmpreaper_t) + files_purge_tmp(tmpreaper_t) +-files_setattr_all_tmp_dirs(tmpreaper_t) ++files_delete_all_non_security_files(tmpreaper_t) ++files_setattr_non_security_dirs(tmpreaper_t) ++files_getattr_all_dirs(tmpreaper_t) ++files_getattr_all_files(tmpreaper_t) + +-mcs_file_read_all(tmpreaper_t) +-mcs_file_write_all(tmpreaper_t) + mls_file_read_all_levels(tmpreaper_t) + mls_file_write_all_levels(tmpreaper_t) + +@@ -45,7 +82,6 @@ init_use_inherited_script_ptys(tmpreaper_t) + + logging_send_syslog_msg(tmpreaper_t) + +-miscfiles_read_localization(tmpreaper_t) + miscfiles_delete_man_pages(tmpreaper_t) + + ifdef(`distro_debian',` +@@ -53,10 +89,33 @@ ifdef(`distro_debian',` + ') + + ifdef(`distro_redhat',` +- userdom_list_all_user_home_content(tmpreaper_t) ++ userdom_list_user_home_content(tmpreaper_t) ++ userdom_list_admin_dir(tmpreaper_t) + userdom_delete_all_user_home_content_dirs(tmpreaper_t) + userdom_delete_all_user_home_content_files(tmpreaper_t) ++ userdom_delete_all_user_home_content_sock_files(tmpreaper_t) + userdom_delete_all_user_home_content_symlinks(tmpreaper_t) ++ userdom_setattr_all_user_home_content_dirs(tmpreaper_t) ++') ++ ++tunable_policy(`tmpreaper_use_nfs',` ++ fs_setattr_nfs_dirs(tmpreaper_t) ++') ++ ++ optional_policy(` ++ tunable_policy(`tmpreaper_use_samba',` ++ samba_setattr_samba_share_dirs(tmpreaper_t) ++ ') ++') ++ ++tunable_policy(`tmpreaper_use_cifs',` ++ fs_setattr_cifs_dirs(tmpreaper_t) ++') ++ ++ optional_policy(` ++ tunable_policy(`tmpreaper_use_samba',` ++ samba_setattr_samba_share_dirs(tmpreaper_t) ++ ') + ') + + optional_policy(` +@@ -64,6 +123,7 @@ optional_policy(` + ') + + optional_policy(` ++ apache_delete_sys_content_rw(tmpreaper_t) + apache_list_cache(tmpreaper_t) + apache_delete_cache_dirs(tmpreaper_t) + apache_delete_cache_files(tmpreaper_t) +@@ -79,7 +139,19 @@ optional_policy(` + ') + + optional_policy(` +- lpd_manage_spool(tmpreaper_t) ++ lpd_manage_spool(tmpreaper_t) ++') ++ ++optional_policy(` ++ mandb_delete_cache(tmpreaper_t) ++') ++ ++optional_policy(` ++ sandbox_list(tmpreaper_t) ++ sandbox_delete_dirs(tmpreaper_t) ++ sandbox_delete_files(tmpreaper_t) ++ sandbox_delete_sock_files(tmpreaper_t) ++ sandbox_setattr_dirs(tmpreaper_t) + ') + + optional_policy(` +@@ -89,3 +161,8 @@ optional_policy(` + optional_policy(` + rpm_manage_cache(tmpreaper_t) + ') ++ ++optional_policy(` ++ ntp_manage_log(tmpreaper_t) ++') ++ +diff --git a/tomcat.fc b/tomcat.fc +new file mode 100644 +index 0000000000..1a401e3667 +--- /dev/null ++++ b/tomcat.fc +@@ -0,0 +1,13 @@ ++/usr/lib/systemd/system/tomcat.service -- gen_context(system_u:object_r:tomcat_unit_file_t,s0) ++ ++/usr/sbin/tomcat(6)? -- gen_context(system_u:object_r:tomcat_exec_t,s0) ++/usr/libexec/tomcat/server -- gen_context(system_u:object_r:tomcat_exec_t,s0) ++ ++/var/cache/tomcat6?(/.*)? gen_context(system_u:object_r:tomcat_cache_t,s0) ++ ++/var/lib/tomcat6?(/.*)? gen_context(system_u:object_r:tomcat_var_lib_t,s0) ++/var/lib/tomcats?(/.*)? gen_context(system_u:object_r:tomcat_var_lib_t,s0) ++ ++/var/log/tomcat6?(/.*)? gen_context(system_u:object_r:tomcat_log_t,s0) ++ ++/var/run/tomcat6?\.pid -- gen_context(system_u:object_r:tomcat_var_run_t,s0) +diff --git a/tomcat.if b/tomcat.if +new file mode 100644 +index 0000000000..6e6923b7e4 +--- /dev/null ++++ b/tomcat.if +@@ -0,0 +1,399 @@ ++ ++## policy for tomcat ++ ++###################################### ++## ++## Creates types and rules for a basic ++## tomcat daemon domain. ++## ++## ++## ++## Prefix for the domain. ++## ++## ++# ++template(`tomcat_domain_template',` ++ gen_require(` ++ attribute tomcat_domain; ++ ') ++ ++ type $1_t, tomcat_domain; ++ type $1_exec_t; ++ init_daemon_domain($1_t, $1_exec_t) ++ ++ type $1_cache_t; ++ files_type($1_cache_t) ++ ++ type $1_log_t; ++ logging_log_file($1_log_t) ++ ++ type $1_var_lib_t; ++ files_type($1_var_lib_t) ++ ++ type $1_var_run_t; ++ files_pid_file($1_var_run_t) ++ ++ type $1_tmp_t; ++ files_tmp_file($1_tmp_t) ++ ++ ################################## ++ # ++ # Local policy ++ # ++ ++ manage_dirs_pattern($1_t, $1_cache_t, $1_cache_t) ++ manage_files_pattern($1_t, $1_cache_t, $1_cache_t) ++ manage_lnk_files_pattern($1_t, $1_cache_t, $1_cache_t) ++ files_var_filetrans($1_t, $1_cache_t, { dir file }) ++ ++ manage_dirs_pattern($1_t, $1_log_t, $1_log_t) ++ manage_files_pattern($1_t, $1_log_t, $1_log_t) ++ manage_lnk_files_pattern($1_t, $1_log_t, $1_log_t) ++ logging_log_filetrans($1_t, $1_log_t, { dir file }) ++ ++ manage_dirs_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ manage_files_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ manage_lnk_files_pattern($1_t, $1_var_lib_t, $1_var_lib_t) ++ files_var_lib_filetrans($1_t, $1_var_lib_t, { dir file lnk_file }) ++ allow $1_t $1_var_lib_t:file map; ++ ++ manage_dirs_pattern($1_t, $1_var_run_t, $1_var_run_t) ++ manage_files_pattern($1_t, $1_var_run_t, $1_var_run_t) ++ manage_lnk_files_pattern($1_t, $1_var_run_t, $1_var_run_t) ++ files_pid_filetrans($1_t, $1_var_run_t, { dir file lnk_file }) ++ ++ manage_dirs_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ manage_files_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ manage_fifo_files_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ manage_lnk_files_pattern($1_t, $1_tmp_t, $1_tmp_t) ++ files_tmp_filetrans($1_t, $1_tmp_t, { file fifo_file dir lnk_file }) ++ allow $1_t $1_tmp_t:file map; ++ ++ can_exec($1_t, $1_exec_t) ++ ++ kernel_read_system_state($1_t) ++ ++ logging_send_syslog_msg($1_t) ++') ++ ++######################################## ++## ++## Transition to tomcat. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tomcat_domtrans',` ++ gen_require(` ++ type tomcat_t, tomcat_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, tomcat_exec_t, tomcat_t) ++') ++ ++######################################## ++## ++## Search tomcat cache directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_search_cache',` ++ gen_require(` ++ type tomcat_cache_t; ++ ') ++ ++ allow $1 tomcat_cache_t:dir search_dir_perms; ++ files_search_var($1) ++') ++ ++######################################## ++## ++## Read tomcat cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_read_cache_files',` ++ gen_require(` ++ type tomcat_cache_t; ++ ') ++ ++ files_search_var($1) ++ read_files_pattern($1, tomcat_cache_t, tomcat_cache_t) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## tomcat cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_manage_cache_files',` ++ gen_require(` ++ type tomcat_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_files_pattern($1, tomcat_cache_t, tomcat_cache_t) ++') ++ ++######################################## ++## ++## Manage tomcat cache dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_manage_cache_dirs',` ++ gen_require(` ++ type tomcat_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, tomcat_cache_t, tomcat_cache_t) ++') ++ ++######################################## ++## ++## Read tomcat's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`tomcat_read_log',` ++ gen_require(` ++ type tomcat_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, tomcat_log_t, tomcat_log_t) ++') ++ ++######################################## ++## ++## Append to tomcat log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_append_log',` ++ gen_require(` ++ type tomcat_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, tomcat_log_t, tomcat_log_t) ++') ++ ++######################################## ++## ++## Manage tomcat log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_manage_log',` ++ gen_require(` ++ type tomcat_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, tomcat_log_t, tomcat_log_t) ++ manage_files_pattern($1, tomcat_log_t, tomcat_log_t) ++ manage_lnk_files_pattern($1, tomcat_log_t, tomcat_log_t) ++') ++ ++######################################## ++## ++## Search tomcat lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_search_lib',` ++ gen_require(` ++ type tomcat_var_lib_t; ++ ') ++ ++ allow $1 tomcat_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read tomcat lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_read_lib_files',` ++ gen_require(` ++ type tomcat_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, tomcat_var_lib_t, tomcat_var_lib_t) ++') ++ ++######################################## ++## ++## Manage tomcat lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_manage_lib_files',` ++ gen_require(` ++ type tomcat_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, tomcat_var_lib_t, tomcat_var_lib_t) ++') ++ ++######################################## ++## ++## Manage tomcat lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_manage_lib_dirs',` ++ gen_require(` ++ type tomcat_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, tomcat_var_lib_t, tomcat_var_lib_t) ++') ++ ++######################################## ++## ++## Read tomcat PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tomcat_read_pid_files',` ++ gen_require(` ++ type tomcat_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ allow $1 tomcat_var_run_t:file read_file_perms; ++') ++ ++######################################## ++## ++## Execute tomcat server in the tomcat domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tomcat_systemctl',` ++ gen_require(` ++ type tomcat_t; ++ type tomcat_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 tomcat_unit_file_t:file read_file_perms; ++ allow $1 tomcat_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, tomcat_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an tomcat environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`tomcat_admin',` ++ gen_require(` ++ type tomcat_t; ++ type tomcat_cache_t; ++ type tomcat_log_t; ++ type tomcat_var_lib_t; ++ type tomcat_var_run_t; ++ type tomcat_unit_file_t; ++ ') ++ ++ allow $1 tomcat_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, tomcat_t) ++ ++ files_search_var($1) ++ admin_pattern($1, tomcat_cache_t) ++ ++ logging_search_logs($1) ++ admin_pattern($1, tomcat_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, tomcat_var_lib_t) ++ ++ files_search_pids($1) ++ admin_pattern($1, tomcat_var_run_t) ++ ++ tomcat_systemctl($1) ++ admin_pattern($1, tomcat_unit_file_t) ++ allow $1 tomcat_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') +diff --git a/tomcat.te b/tomcat.te +new file mode 100644 +index 0000000000..4f16df698e +--- /dev/null ++++ b/tomcat.te +@@ -0,0 +1,168 @@ ++policy_module(tomcat, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow tomcat to read rpm database. ++##

      ++##
      ++gen_tunable(tomcat_read_rpm_db, false) ++ ++## ++##

      ++## Allow tomcat to use executable memory and executable stack ++##

      ++##
      ++gen_tunable(tomcat_use_execmem, false) ++ ++## ++##

      ++## Allow tomcat to connect to databases over the network. ++##

      ++##
      ++gen_tunable(tomcat_can_network_connect_db, false) ++ ++attribute tomcat_domain; ++ ++tomcat_domain_template(tomcat) ++ ++type tomcat_unit_file_t; ++systemd_unit_file(tomcat_unit_file_t) ++ ++######################################## ++# ++# tomcat local policy ++# ++ ++allow tomcat_t self:capability setgid; ++ ++allow tomcat_t self:process execmem; ++allow tomcat_t self:process { signal signull }; ++ ++allow tomcat_t self:tcp_socket { accept listen }; ++ ++auth_use_nsswitch(tomcat_t) ++ ++# Temporary fix, while missing SELinux policies for HSM ++init_stream_connect_script(tomcat_t) ++ ++optional_policy(` ++ pki_manage_tomcat_cert(tomcat_t) ++ pki_manage_apache_log_files(tomcat_t) ++ pki_manage_tomcat_lib(tomcat_t) ++ pki_manage_tomcat_etc_rw(tomcat_t) ++ pki_search_log_dirs(tomcat_t) ++ pki_manage_tomcat_pid(tomcat_t) ++ pki_manage_tomcat_log(tomcat_t) ++ pki_manage_common_files(tomcat_t) ++ pki_exec_common_files(tomcat_t) ++ pki_stream_connect(tomcat_t) ++') ++ ++optional_policy(` ++ ipa_read_lib(tomcat_t) ++ ipa_read_tmp(tomcat_t) ++') ++ ++######################################## ++# ++# tomcat domain policy ++# ++ ++allow tomcat_t self:capability { dac_read_search dac_override setuid kill }; ++ ++allow tomcat_t self:process { execmem setcap setsched signal signull }; ++allow tomcat_domain self:fifo_file rw_fifo_file_perms; ++allow tomcat_domain self:unix_stream_socket create_stream_socket_perms; ++ ++# we want to stay in a new tomcat domain if we call tomcat binary from a script ++# initrc_t@tomcat_test_exec_t->tomcat_test_t@tomcat_exec_t->tomcat_test_t ++can_exec(tomcat_domain, tomcat_exec_t) ++ ++kernel_read_network_state(tomcat_domain) ++kernel_search_network_sysctl(tomcat_domain) ++kernel_read_net_sysctls(tomcat_domain) ++kernel_read_usermodehelper_state(tomcat_domain) ++ ++corecmd_exec_bin(tomcat_domain) ++corecmd_exec_shell(tomcat_domain) ++ ++corenet_tcp_bind_generic_node(tomcat_domain) ++corenet_udp_bind_generic_node(tomcat_domain) ++corenet_tcp_bind_http_port(tomcat_domain) ++corenet_tcp_bind_http_cache_port(tomcat_domain) ++corenet_tcp_bind_mxi_port(tomcat_domain) ++corenet_tcp_bind_transproxy_port(tomcat_domain) ++corenet_tcp_bind_bctp_port(tomcat_domain) ++corenet_tcp_connect_http_cache_port(tomcat_domain) ++corenet_tcp_connect_http_port(tomcat_domain) ++corenet_tcp_connect_ldap_port(tomcat_domain) ++corenet_tcp_connect_mxi_port(tomcat_domain) ++corenet_tcp_connect_transproxy_port(tomcat_domain) ++corenet_tcp_connect_amqp_port(tomcat_domain) ++corenet_tcp_connect_ibm_dt_2_port(tomcat_domain) ++corenet_tcp_connect_unreserved_ports(tomcat_domain) ++corenet_tcp_bind_jboss_management_port(tomcat_domain) ++corenet_tcp_connect_smtp_port(tomcat_domain) ++ ++dev_dontaudit_append_rand(tomcat_domain) ++dev_read_rand(tomcat_domain) ++dev_read_urand(tomcat_domain) ++dev_read_sysfs(tomcat_domain) ++ ++domain_use_interactive_fds(tomcat_domain) ++ ++libs_exec_ldconfig(tomcat_domain) ++ ++files_delete_usr_dirs(tomcat_domain) ++files_manage_usr_files(tomcat_domain) ++ ++fs_getattr_all_fs(tomcat_domain) ++fs_read_hugetlbfs_files(tomcat_domain) ++fs_read_cgroup_files(tomcat_domain) ++fs_search_cgroup_dirs(tomcat_domain) ++ ++sysnet_dns_name_resolve(tomcat_domain) ++ ++optional_policy(` ++ cobbler_read_lib_files(tomcat_domain) ++') ++ ++optional_policy(` ++ # needed by FreeIPA ++ ldap_stream_connect(tomcat_domain) ++ ldap_read_certs(tomcat_domain) ++') ++ ++optional_policy(` ++ mta_send_mail(tomcat_domain) ++') ++ ++optional_policy(` ++ tomcat_search_lib(tomcat_domain) ++') ++ ++tunable_policy(`tomcat_read_rpm_db',` ++ rpm_exec(tomcat_domain) ++ rpm_read_db(tomcat_domain) ++') ++ ++tunable_policy(`tomcat_can_network_connect_db',` ++ corenet_tcp_connect_gds_db_port(tomcat_domain) ++ corenet_tcp_connect_mssql_port(tomcat_domain) ++ corenet_tcp_connect_mongod_port(tomcat_domain) ++ corenet_sendrecv_mssql_client_packets(tomcat_domain) ++ corenet_tcp_connect_oracle_port(tomcat_domain) ++ corenet_sendrecv_oracle_client_packets(tomcat_domain) ++ corenet_tcp_connect_postgresql_port(tomcat_domain) ++ corenet_tcp_connect_mysqld_port(tomcat_domain) ++ corenet_tcp_connect_redis_port(tomcat_domain) ++') ++ ++tunable_policy(`tomcat_use_execmem',` ++ allow tomcat_domain self:process { execmem execstack }; ++') +diff --git a/tor.fc b/tor.fc +index dce42ecc55..b6b67bffe2 100644 +--- a/tor.fc ++++ b/tor.fc +@@ -5,6 +5,8 @@ + /usr/bin/tor -- gen_context(system_u:object_r:tor_exec_t,s0) + /usr/sbin/tor -- gen_context(system_u:object_r:tor_exec_t,s0) + ++/usr/lib/systemd/system/tor.* -- gen_context(system_u:object_r:tor_unit_file_t,s0) ++ + /var/lib/tor(/.*)? gen_context(system_u:object_r:tor_var_lib_t,s0) + /var/lib/tor-data(/.*)? gen_context(system_u:object_r:tor_var_lib_t,s0) + +diff --git a/tor.if b/tor.if +index 61c2e07d61..3b860953c4 100644 +--- a/tor.if ++++ b/tor.if +@@ -19,6 +19,30 @@ interface(`tor_domtrans',` + domtrans_pattern($1, tor_exec_t, tor_t) + ') + ++####################################### ++## ++## Execute tor server in the tor domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`tor_systemctl',` ++ gen_require(` ++ type tor_t; ++ type tor_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 tor_unit_file_t:file read_file_perms; ++ allow $1 tor_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, tor_t) ++') ++ + ######################################## + ## + ## All of the rules required to +@@ -39,12 +63,18 @@ interface(`tor_domtrans',` + interface(`tor_admin',` + gen_require(` + type tor_t, tor_var_log_t, tor_etc_t; +- type tor_var_lib_t, tor_var_run_t, tor_initrc_exec_t; ++ type tor_var_lib_t, tor_var_run_t; ++ type tor_initrc_exec_t; ++ type tor_unit_file_t; + ') + +- allow $1 tor_t:process { ptrace signal_perms }; ++ allow $1 tor_t:process signal_perms; + ps_process_pattern($1, tor_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 tor_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, tor_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 tor_initrc_exec_t system_r; +@@ -61,4 +91,13 @@ interface(`tor_admin',` + + files_list_pids($1) + admin_pattern($1, tor_var_run_t) ++ ++ tor_systemctl($1) ++ admin_pattern($1, tor_unit_file_t) ++ allow $1 tor_unit_file_t:service all_service_perms; ++ ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') + ') +diff --git a/tor.te b/tor.te +index 5ceacde8c1..9c178da360 100644 +--- a/tor.te ++++ b/tor.te +@@ -13,6 +13,13 @@ policy_module(tor, 1.9.0) + ## + gen_tunable(tor_bind_all_unreserved_ports, false) + ++## ++##

      ++## Allow tor to act as a relay ++##

      ++##
      ++gen_tunable(tor_can_network_relay, false) ++ + type tor_t; + type tor_exec_t; + init_daemon_domain(tor_t, tor_exec_t) +@@ -33,12 +40,15 @@ type tor_var_run_t; + files_pid_file(tor_var_run_t) + init_daemon_run_dir(tor_var_run_t, "tor") + ++type tor_unit_file_t; ++systemd_unit_file(tor_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow tor_t self:capability { setgid setuid sys_tty_config }; ++allow tor_t self:capability { dac_read_search dac_override setgid setuid sys_tty_config }; + allow tor_t self:process signal; + allow tor_t self:fifo_file rw_fifo_file_perms; + allow tor_t self:unix_stream_socket { accept listen }; +@@ -52,6 +62,7 @@ manage_dirs_pattern(tor_t, tor_var_lib_t, tor_var_lib_t) + manage_files_pattern(tor_t, tor_var_lib_t, tor_var_lib_t) + manage_sock_files_pattern(tor_t, tor_var_lib_t, tor_var_lib_t) + files_var_lib_filetrans(tor_t, tor_var_lib_t, dir) ++allow tor_t tor_var_lib_t:file map; + + allow tor_t tor_var_log_t:dir setattr_dir_perms; + append_files_pattern(tor_t, tor_var_log_t, tor_var_log_t) +@@ -77,7 +88,6 @@ corenet_tcp_sendrecv_generic_node(tor_t) + corenet_udp_sendrecv_generic_node(tor_t) + corenet_tcp_bind_generic_node(tor_t) + corenet_udp_bind_generic_node(tor_t) +- + corenet_sendrecv_dns_server_packets(tor_t) + corenet_udp_bind_dns_port(tor_t) + corenet_udp_sendrecv_dns_port(tor_t) +@@ -85,6 +95,7 @@ corenet_udp_sendrecv_dns_port(tor_t) + corenet_sendrecv_tor_server_packets(tor_t) + corenet_tcp_bind_tor_port(tor_t) + corenet_tcp_sendrecv_tor_port(tor_t) ++corenet_tcp_bind_hplip_port(tor_t) + + corenet_sendrecv_all_client_packets(tor_t) + corenet_tcp_connect_all_ports(tor_t) +@@ -98,19 +109,22 @@ dev_read_urand(tor_t) + domain_use_interactive_fds(tor_t) + + files_read_etc_runtime_files(tor_t) +-files_read_usr_files(tor_t) + + auth_use_nsswitch(tor_t) + + logging_send_syslog_msg(tor_t) + +-miscfiles_read_localization(tor_t) +- + tunable_policy(`tor_bind_all_unreserved_ports',` + corenet_sendrecv_all_server_packets(tor_t) + corenet_tcp_bind_all_unreserved_ports(tor_t) + ') + ++tunable_policy(`tor_can_network_relay',` ++ # allow httpd to work as a relay ++ corenet_tcp_connect_all_ephemeral_ports(tor_t) ++ corenet_tcp_bind_http_port(tor_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(tor_t) + ') +diff --git a/transproxy.te b/transproxy.te +index 34973ee4cb..1c9a4c6139 100644 +--- a/transproxy.te ++++ b/transproxy.te +@@ -32,7 +32,6 @@ kernel_read_kernel_sysctls(transproxy_t) + kernel_list_proc(transproxy_t) + kernel_read_proc_symlinks(transproxy_t) + +-corenet_all_recvfrom_unlabeled(transproxy_t) + corenet_all_recvfrom_netlabel(transproxy_t) + corenet_tcp_sendrecv_generic_if(transproxy_t) + corenet_tcp_sendrecv_generic_node(transproxy_t) +@@ -46,15 +45,12 @@ dev_read_sysfs(transproxy_t) + + domain_use_interactive_fds(transproxy_t) + +-files_read_etc_files(transproxy_t) + + fs_getattr_all_fs(transproxy_t) + fs_search_auto_mountpoints(transproxy_t) + + logging_send_syslog_msg(transproxy_t) + +-miscfiles_read_localization(transproxy_t) +- + sysnet_read_config(transproxy_t) + + userdom_dontaudit_use_unpriv_user_fds(transproxy_t) +diff --git a/tripwire.te b/tripwire.te +index 03aa6b7f01..53c0c73665 100644 +--- a/tripwire.te ++++ b/tripwire.te +@@ -47,7 +47,7 @@ role twprint_roles types twprint_t; + # Local policy + # + +-allow tripwire_t self:capability { setgid setuid dac_override }; ++allow tripwire_t self:capability { setgid setuid dac_read_search dac_override }; + + allow tripwire_t tripwire_etc_t:dir list_dir_perms; + allow tripwire_t tripwire_etc_t:file read_file_perms; +@@ -86,7 +86,7 @@ files_getattr_all_sockets(tripwire_t) + + logging_send_syslog_msg(tripwire_t) + +-userdom_use_user_terminals(tripwire_t) ++userdom_use_inherited_user_terminals(tripwire_t) + + optional_policy(` + cron_system_entry(tripwire_t, tripwire_exec_t) +@@ -107,9 +107,7 @@ files_search_etc(twadmin_t) + + logging_send_syslog_msg(twadmin_t) + +-miscfiles_read_localization(twadmin_t) +- +-userdom_use_user_terminals(twadmin_t) ++userdom_use_inherited_user_terminals(twadmin_t) + + ######################################## + # +@@ -135,9 +133,7 @@ files_search_var_lib(twprint_t) + + logging_send_syslog_msg(twprint_t) + +-miscfiles_read_localization(twprint_t) +- +-userdom_use_user_terminals(twprint_t) ++userdom_use_inherited_user_terminals(twprint_t) + + ######################################## + # +@@ -150,6 +146,4 @@ files_read_all_files(siggen_t) + + logging_send_syslog_msg(siggen_t) + +-miscfiles_read_localization(siggen_t) +- +-userdom_use_user_terminals(siggen_t) ++userdom_use_inherited_user_terminals(siggen_t) +diff --git a/tuned.if b/tuned.if +index e29db63a2b..061fb983c9 100644 +--- a/tuned.if ++++ b/tuned.if +@@ -119,9 +119,13 @@ interface(`tuned_admin',` + type tuned_etc_t, tuned_rw_etc_t, tuned_log_t; + ') + +- allow $1 tuned_t:process { ptrace signal_perms }; ++ allow $1 tuned_t:process signal_perms; + ps_process_pattern($1, tuned_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 tuned_t:process ptrace; ++ ') ++ + tuned_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 tuned_initrc_exec_t system_r; +diff --git a/tuned.te b/tuned.te +index 393a330739..76390e2f6a 100644 +--- a/tuned.te ++++ b/tuned.te +@@ -21,6 +21,9 @@ files_config_file(tuned_rw_etc_t) + type tuned_log_t; + logging_log_file(tuned_log_t) + ++type tuned_tmp_t; ++files_tmp_file(tuned_tmp_t) ++ + type tuned_var_run_t; + files_pid_file(tuned_var_run_t) + +@@ -29,10 +32,14 @@ files_pid_file(tuned_var_run_t) + # Local policy + # + +-allow tuned_t self:capability { sys_admin sys_nice }; +-dontaudit tuned_t self:capability { dac_override sys_tty_config }; +-allow tuned_t self:process { setsched signal }; ++allow tuned_t self:capability { net_admin sys_admin sys_nice sys_rawio }; ++dontaudit tuned_t self:capability { dac_read_search dac_override sys_tty_config }; ++allow tuned_t self:process { setsched signal }; + allow tuned_t self:fifo_file rw_fifo_file_perms; ++allow tuned_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow tuned_t self:netlink_socket create_socket_perms; ++allow tuned_t self:udp_socket create_socket_perms; ++allow tuned_t self:socket create_socket_perms; + + read_files_pattern(tuned_t, tuned_etc_t, tuned_etc_t) + exec_files_pattern(tuned_t, tuned_etc_t, tuned_etc_t) +@@ -41,22 +48,29 @@ manage_files_pattern(tuned_t, tuned_etc_t, tuned_rw_etc_t) + files_etc_filetrans(tuned_t, tuned_rw_etc_t, file, "active_profile") + + manage_dirs_pattern(tuned_t, tuned_log_t, tuned_log_t) +-append_files_pattern(tuned_t, tuned_log_t, tuned_log_t) +-create_files_pattern(tuned_t, tuned_log_t, tuned_log_t) +-setattr_files_pattern(tuned_t, tuned_log_t, tuned_log_t) +-logging_log_filetrans(tuned_t, tuned_log_t, file) ++manage_files_pattern(tuned_t, tuned_log_t, tuned_log_t) ++logging_log_filetrans(tuned_t, tuned_log_t, file, "tuned.log") ++ ++manage_dirs_pattern(tuned_t, tuned_tmp_t, tuned_tmp_t) ++manage_files_pattern(tuned_t, tuned_tmp_t, tuned_tmp_t) ++files_tmp_filetrans(tuned_t, tuned_tmp_t, { file dir }) ++can_exec(tuned_t, tuned_tmp_t) + + manage_files_pattern(tuned_t, tuned_var_run_t, tuned_var_run_t) + manage_dirs_pattern(tuned_t, tuned_var_run_t, tuned_var_run_t) + files_pid_filetrans(tuned_t, tuned_var_run_t, { dir file }) ++allow tuned_t tuned_var_run_t:file relabel_file_perms; ++can_exec(tuned_t, tuned_var_run_t) + + kernel_read_system_state(tuned_t) + kernel_read_network_state(tuned_t) + kernel_read_kernel_sysctls(tuned_t) + kernel_request_load_module(tuned_t) + kernel_rw_kernel_sysctl(tuned_t) +-kernel_rw_hotplug_sysctls(tuned_t) ++kernel_rw_usermodehelper_state(tuned_t) + kernel_rw_vm_sysctls(tuned_t) ++kernel_setsched(tuned_t) ++kernel_rw_all_sysctls(tuned_t) + + corecmd_exec_bin(tuned_t) + corecmd_exec_shell(tuned_t) +@@ -64,31 +78,64 @@ corecmd_exec_shell(tuned_t) + dev_getattr_all_blk_files(tuned_t) + dev_getattr_all_chr_files(tuned_t) + dev_read_urand(tuned_t) ++dev_rw_cpu_microcode(tuned_t) + dev_rw_sysfs(tuned_t) + dev_rw_netcontrol(tuned_t) + +-files_read_usr_files(tuned_t) ++files_dontaudit_all_access_check(tuned_t) + files_dontaudit_search_home(tuned_t) +-files_dontaudit_list_tmp(tuned_t) ++files_list_tmp(tuned_t) ++ ++fs_getattr_all_fs(tuned_t) ++fs_search_all(tuned_t) ++fs_rw_hugetlbfs_files(tuned_t) + +-fs_getattr_xattr_fs(tuned_t) ++auth_use_nsswitch(tuned_t) + + logging_send_syslog_msg(tuned_t) ++#bug in tuned ++logging_manage_syslog_config(tuned_t) ++logging_filetrans_named_conf(tuned_t) + +-miscfiles_read_localization(tuned_t) ++mount_read_pid_files(tuned_t) ++ ++modutils_domtrans_insmod(tuned_t) + + udev_read_pid_files(tuned_t) + + userdom_dontaudit_search_user_home_dirs(tuned_t) + ++optional_policy(` ++ dbus_system_bus_client(tuned_t) ++ dbus_connect_system_bus(tuned_t) ++') ++ ++optional_policy(` ++ dmidecode_domtrans(tuned_t) ++') ++ ++# to allow disk tuning + optional_policy(` + fstools_domtrans(tuned_t) + ') + ++optional_policy(` ++ gnome_dontaudit_search_config(tuned_t) ++') ++ ++optional_policy(` ++ libs_exec_ldconfig(tuned_t) ++') ++ + optional_policy(` + mount_domtrans(tuned_t) + ') + ++optional_policy(` ++ policykit_dbus_chat(tuned_t) ++') ++ ++# to allow network interface tuning + optional_policy(` + sysnet_domtrans_ifconfig(tuned_t) + ') +@@ -96,3 +143,7 @@ optional_policy(` + optional_policy(` + unconfined_dbus_send(tuned_t) + ') ++ ++optional_policy(` ++ unconfined_domain(tuned_t) ++') +diff --git a/tvtime.if b/tvtime.if +index 1bb0f7c78a..372be2f213 100644 +--- a/tvtime.if ++++ b/tvtime.if +@@ -1,5 +1,23 @@ + ## High quality television application. + ++####################################### ++## ++## Transition to alsa named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`tvtime_filetrans_home_content',` ++ gen_require(` ++ type tvtime_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, tvtime_home_t, dir, ".tvtime") ++') ++ + ######################################## + ## + ## Role access for tvtime +diff --git a/tvtime.te b/tvtime.te +index afd2d6c3fc..3ce900e99b 100644 +--- a/tvtime.te ++++ b/tvtime.te +@@ -42,7 +42,6 @@ allow tvtime_t self:unix_stream_socket rw_stream_socket_perms; + manage_dirs_pattern(tvtime_t, tvtime_home_t, tvtime_home_t) + manage_files_pattern(tvtime_t, tvtime_home_t, tvtime_home_t) + manage_lnk_files_pattern(tvtime_t, tvtime_home_t, tvtime_home_t) +-userdom_user_home_dir_filetrans(tvtime_t, tvtime_home_t, dir) + + manage_dirs_pattern(tvtime_t, tvtime_tmp_t, tvtime_tmp_t) + manage_files_pattern(tvtime_t, tvtime_tmp_t, tvtime_tmp_t) +@@ -61,7 +60,6 @@ dev_read_realtime_clock(tvtime_t) + dev_read_sound(tvtime_t) + dev_read_urand(tvtime_t) + +-files_read_usr_files(tvtime_t) + + fs_getattr_all_fs(tvtime_t) + fs_search_auto_mountpoints(tvtime_t) +@@ -69,21 +67,12 @@ fs_search_auto_mountpoints(tvtime_t) + auth_use_nsswitch(tvtime_t) + + miscfiles_read_fonts(tvtime_t) +-miscfiles_read_localization(tvtime_t) + +-userdom_use_user_terminals(tvtime_t) ++userdom_use_inherited_user_terminals(tvtime_t) ++userdom_read_user_home_content_files(tvtime_t) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(tvtime_t) +- fs_manage_nfs_files(tvtime_t) +- fs_manage_nfs_symlinks(tvtime_t) +-') +- +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(tvtime_t) +- fs_manage_cifs_files(tvtime_t) +- fs_manage_cifs_symlinks(tvtime_t) +-') ++# X access, Home files ++userdom_home_manager(tvtime_t) + + optional_policy(` + xserver_user_x_domain_template(tvtime, tvtime_t, tvtime_tmpfs_t) +diff --git a/tzdata.te b/tzdata.te +index 221c43b846..2b9c49ac1b 100644 +--- a/tzdata.te ++++ b/tzdata.te +@@ -27,11 +27,10 @@ term_dontaudit_list_ptys(tzdata_t) + + locallogin_dontaudit_use_fds(tzdata_t) + +-miscfiles_read_localization(tzdata_t) + miscfiles_manage_localization(tzdata_t) + miscfiles_etc_filetrans_localization(tzdata_t) + +-userdom_use_user_terminals(tzdata_t) ++userdom_use_inherited_user_terminals(tzdata_t) + + optional_policy(` + postfix_search_spool(tzdata_t) +diff --git a/ucspitcp.te b/ucspitcp.te +index 7745b72e66..329c3d899b 100644 +--- a/ucspitcp.te ++++ b/ucspitcp.te +@@ -33,7 +33,6 @@ corenet_udp_sendrecv_all_ports(rblsmtpd_t) + corenet_tcp_bind_generic_node(rblsmtpd_t) + corenet_udp_bind_generic_port(rblsmtpd_t) + +-files_read_etc_files(rblsmtpd_t) + files_search_var(rblsmtpd_t) + + optional_policy(` +@@ -82,7 +81,6 @@ corenet_udp_bind_dns_port(ucspitcp_t) + corenet_sendrecv_generic_server_packets(ucspitcp_t) + corenet_udp_bind_generic_port(ucspitcp_t) + +-files_read_etc_files(ucspitcp_t) + files_search_var(ucspitcp_t) + + sysnet_read_config(ucspitcp_t) +diff --git a/ulogd.if b/ulogd.if +index 9b95c3ef76..a892845bb0 100644 +--- a/ulogd.if ++++ b/ulogd.if +@@ -123,8 +123,11 @@ interface(`ulogd_admin',` + type ulogd_var_log_t, ulogd_initrc_exec_t; + ') + +- allow $1 ulogd_t:process { ptrace signal_perms }; ++ allow $1 ulogd_t:process signal_perms; + ps_process_pattern($1, ulogd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 ulogd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, ulogd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/ulogd.te b/ulogd.te +index de35e5f4c3..e710f37a7a 100644 +--- a/ulogd.te ++++ b/ulogd.te +@@ -29,8 +29,12 @@ logging_log_file(ulogd_var_log_t) + allow ulogd_t self:capability { net_admin setuid setgid sys_nice }; + allow ulogd_t self:process setsched; + allow ulogd_t self:netlink_nflog_socket create_socket_perms; ++allow ulogd_t self:netlink_route_socket r_netlink_socket_perms; + allow ulogd_t self:netlink_socket create_socket_perms; +-allow ulogd_t self:tcp_socket create_stream_socket_perms; ++allow ulogd_t self:netlink_netfilter_socket create_socket_perms; ++allow ulogd_t self:tcp_socket { create_stream_socket_perms connect }; ++allow ulogd_t self:udp_socket create_socket_perms; ++allow ulogd_t self:unix_dgram_socket create_socket_perms; + + read_files_pattern(ulogd_t, ulogd_etc_t, ulogd_etc_t) + +@@ -42,10 +46,10 @@ create_files_pattern(ulogd_t, ulogd_var_log_t, ulogd_var_log_t) + setattr_files_pattern(ulogd_t, ulogd_var_log_t, ulogd_var_log_t) + logging_log_filetrans(ulogd_t, ulogd_var_log_t, file) + +-files_read_etc_files(ulogd_t) +-files_read_usr_files(ulogd_t) ++kernel_request_load_module(ulogd_t) ++kernel_dgram_send(ulogd_t) + +-miscfiles_read_localization(ulogd_t) ++logging_send_syslog_msg(ulogd_t) + + sysnet_dns_name_resolve(ulogd_t) + +diff --git a/uml.if b/uml.if +index ab5c1d0dae..d13105ea79 100644 +--- a/uml.if ++++ b/uml.if +@@ -32,7 +32,7 @@ interface(`uml_role',` + allow uml_t $2:unix_dgram_socket sendto; + + ps_process_pattern($2, uml_t) +- allow $2 uml_t:process { ptrace signal_perms }; ++ allow $2 uml_t:process signal_perms; + + allow $2 { uml_ro_t uml_rw_t uml_tmp_t uml_exec_t }:dir { manage_dir_perms relabel_dir_perms }; + allow $2 { uml_ro_t uml_rw_t uml_tmp_t uml_tmpfs_t uml_exec_t }:file { manage_file_perms relabel_file_perms }; +diff --git a/uml.te b/uml.te +index b68bd49ff7..da0c6912f3 100644 +--- a/uml.te ++++ b/uml.te +@@ -90,7 +90,6 @@ kernel_write_proc_files(uml_t) + + corecmd_exec_bin(uml_t) + +-corenet_all_recvfrom_unlabeled(uml_t) + corenet_all_recvfrom_netlabel(uml_t) + corenet_tcp_sendrecv_generic_if(uml_t) + corenet_tcp_sendrecv_generic_node(uml_t) +@@ -115,7 +114,13 @@ init_dontaudit_write_utmp(uml_t) + + libs_exec_lib_files(uml_t) + +-userdom_use_user_terminals(uml_t) ++# Inherit and use descriptors from newrole. ++seutil_use_newrole_fds(uml_t) ++ ++# Use the network. ++sysnet_read_config(uml_t) ++ ++userdom_use_inherited_user_terminals(uml_t) + userdom_attach_admin_tun_iface(uml_t) + + tunable_policy(`use_nfs_home_dirs',` +@@ -132,10 +137,6 @@ tunable_policy(`use_samba_home_dirs',` + fs_manage_cifs_symlinks(uml_t) + ') + +-optional_policy(` +- seutil_use_newrole_fds(uml_t) +-') +- + optional_policy(` + virt_attach_tun_iface(uml_t) + ') +@@ -171,8 +172,6 @@ init_use_script_ptys(uml_switch_t) + + logging_send_syslog_msg(uml_switch_t) + +-miscfiles_read_localization(uml_switch_t) +- + userdom_dontaudit_use_unpriv_user_fds(uml_switch_t) + userdom_dontaudit_search_user_home_dirs(uml_switch_t) + +diff --git a/updfstab.te b/updfstab.te +index 5ceb912497..232e9ac930 100644 +--- a/updfstab.te ++++ b/updfstab.te +@@ -14,7 +14,7 @@ init_system_domain(updfstab_t, updfstab_exec_t) + # Local policy + # + +-allow updfstab_t self:capability dac_override; ++allow updfstab_t self:capability { dac_read_search dac_override }; + dontaudit updfstab_t self:capability { sys_admin sys_tty_config }; + allow updfstab_t self:process signal_perms; + allow updfstab_t self:fifo_file rw_fifo_file_perms; +@@ -66,8 +66,6 @@ init_use_script_ptys(updfstab_t) + logging_search_logs(updfstab_t) + logging_send_syslog_msg(updfstab_t) + +-miscfiles_read_localization(updfstab_t) +- + seutil_read_config(updfstab_t) + seutil_read_default_contexts(updfstab_t) + seutil_read_file_contexts(updfstab_t) +@@ -75,9 +73,8 @@ seutil_read_file_contexts(updfstab_t) + userdom_dontaudit_search_user_home_content(updfstab_t) + userdom_dontaudit_use_unpriv_user_fds(updfstab_t) + +-optional_policy(` +- auth_domtrans_pam_console(updfstab_t) +-') ++auth_use_nsswitch(updfstab_t) ++auth_domtrans_pam_console(updfstab_t) + + optional_policy(` + dbus_system_bus_client(updfstab_t) +diff --git a/uptime.if b/uptime.if +index 01a3234b64..19f4724757 100644 +--- a/uptime.if ++++ b/uptime.if +@@ -19,7 +19,7 @@ + # + interface(`uptime_admin',` + gen_require(` +- type uptimed_t, uptimed_initrc_exec_t. uptimed_etc_t; ++ type uptimed_t, uptimed_initrc_exec_t, uptimed_etc_t; + type uptimed_spool_t, uptimed_var_run_t; + ') + +diff --git a/uptime.te b/uptime.te +index 58397dc31a..e6b6a34726 100644 +--- a/uptime.te ++++ b/uptime.te +@@ -16,7 +16,7 @@ type uptimed_initrc_exec_t; + init_script_file(uptimed_initrc_exec_t) + + type uptimed_spool_t; +-files_type(uptimed_spool_t) ++files_spool_file(uptimed_spool_t) + + type uptimed_var_run_t; + files_pid_file(uptimed_var_run_t) +@@ -55,8 +55,6 @@ fs_search_auto_mountpoints(uptimed_t) + + logging_send_syslog_msg(uptimed_t) + +-miscfiles_read_localization(uptimed_t) +- + userdom_dontaudit_use_unpriv_user_fds(uptimed_t) + userdom_dontaudit_search_user_home_dirs(uptimed_t) + +diff --git a/usbmodules.te b/usbmodules.te +index 279e511df1..4f79ad6978 100644 +--- a/usbmodules.te ++++ b/usbmodules.te +@@ -24,8 +24,6 @@ files_list_kernel_modules(usbmodules_t) + dev_list_usbfs(usbmodules_t) + dev_rw_usbfs(usbmodules_t) + +-files_list_etc(usbmodules_t) +- + term_read_console(usbmodules_t) + term_write_console(usbmodules_t) + +@@ -35,10 +33,12 @@ logging_send_syslog_msg(usbmodules_t) + + miscfiles_read_hwdata(usbmodules_t) + +-modutils_read_module_deps(usbmodules_t) +- +-userdom_use_user_terminals(usbmodules_t) ++userdom_use_inherited_user_terminals(usbmodules_t) + + optional_policy(` + hotplug_read_config(usbmodules_t) + ') ++ ++optional_policy(` ++ modutils_read_module_deps(usbmodules_t) ++') +diff --git a/usbmuxd.fc b/usbmuxd.fc +index 220f6add14..ccbb5dabcb 100644 +--- a/usbmuxd.fc ++++ b/usbmuxd.fc +@@ -1,3 +1,6 @@ + /usr/sbin/usbmuxd -- gen_context(system_u:object_r:usbmuxd_exec_t,s0) + +-/var/run/usbmuxd.* gen_context(system_u:object_r:usbmuxd_var_run_t,s0) ++/var/run/usbmuxd.* gen_context(system_u:object_r:usbmuxd_var_run_t,s0) ++/usr/lib/systemd/system/usbmuxd.* -- gen_context(system_u:object_r:usbmuxd_unit_file_t,s0) ++ ++/var/lib/lockdown(/.*)? gen_context(system_u:object_r:usbmuxd_var_lib_t,s0) +diff --git a/usbmuxd.if b/usbmuxd.if +index 1ec5e996bc..5b6c80bbad 100644 +--- a/usbmuxd.if ++++ b/usbmuxd.if +@@ -38,3 +38,67 @@ interface(`usbmuxd_stream_connect',` + files_search_pids($1) + stream_connect_pattern($1, usbmuxd_var_run_t, usbmuxd_var_run_t, usbmuxd_t) + ') ++ ++######################################## ++## ++## Execute usbmuxd server in the usbmuxd domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`usbmuxd_systemctl',` ++ gen_require(` ++ type usbmuxd_t; ++ type usbmuxd_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 usbmuxd_unit_file_t:file read_file_perms; ++ allow $1 usbmuxd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, usbmuxd_t) ++') ++ ++##################################### ++## ++## All of the rules required to administrate ++## an usbmuxd environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## The role to be allowed to manage the usbmuxd domain. ++## ++## ++## ++# ++interface(`usbmuxd_admin',` ++ gen_require(` ++ type usbmuxd_t,usbmuxd_var_run_t; ++ type usbmuxd_unit_file_t; ++ ') ++ ++ allow $1 usbmuxd_t:process { signal_perms }; ++ ps_process_pattern($1, usbmuxd_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 usbmuxd_t:process ptrace; ++ ') ++ ++ allow $2 system_r; ++ ++ files_list_pids($1) ++ admin_pattern($1, usbmuxd_var_run_t) ++ ++ usbmuxd_systemctl($1) ++ admin_pattern($1, usbmuxd_unit_file_t) ++ allow $1 usbmuxd_unit_file_t:service all_service_perms; ++') +diff --git a/usbmuxd.te b/usbmuxd.te +index 34a891755c..933baa42d6 100644 +--- a/usbmuxd.te ++++ b/usbmuxd.te +@@ -10,34 +10,58 @@ roleattribute system_r usbmuxd_roles; + + type usbmuxd_t; + type usbmuxd_exec_t; ++init_system_domain(usbmuxd_t, usbmuxd_exec_t) + application_domain(usbmuxd_t, usbmuxd_exec_t) + role usbmuxd_roles types usbmuxd_t; + + type usbmuxd_var_run_t; + files_pid_file(usbmuxd_var_run_t) + ++type usbmuxd_var_lib_t; ++files_type(usbmuxd_var_lib_t) ++ ++type usbmuxd_unit_file_t; ++systemd_unit_file(usbmuxd_unit_file_t) ++ + ######################################## + # + # Local policy + # + +-allow usbmuxd_t self:capability { kill setgid setuid }; +-allow usbmuxd_t self:process { signal signull }; ++allow usbmuxd_t self:capability { fowner fsetid chown kill setgid setuid }; ++dontaudit usbmuxd_t self:capability sys_resource; ++allow usbmuxd_t self:process { signal_perms setrlimit }; + allow usbmuxd_t self:fifo_file rw_fifo_file_perms; ++allow usbmuxd_t self:netlink_kobject_uevent_socket create_socket_perms; ++allow usbmuxd_t self:unix_stream_socket connectto; + + manage_dirs_pattern(usbmuxd_t, usbmuxd_var_run_t, usbmuxd_var_run_t) + manage_files_pattern(usbmuxd_t, usbmuxd_var_run_t, usbmuxd_var_run_t) + manage_sock_files_pattern(usbmuxd_t, usbmuxd_var_run_t, usbmuxd_var_run_t) + files_pid_filetrans(usbmuxd_t, usbmuxd_var_run_t, { file dir sock_file }) + ++manage_dirs_pattern(usbmuxd_t, usbmuxd_var_lib_t, usbmuxd_var_lib_t) ++manage_files_pattern(usbmuxd_t, usbmuxd_var_lib_t, usbmuxd_var_lib_t) ++manage_lnk_files_pattern(usbmuxd_t, usbmuxd_var_lib_t, usbmuxd_var_lib_t) ++files_var_lib_filetrans(usbmuxd_t, usbmuxd_var_lib_t, { dir file }) ++ + kernel_read_kernel_sysctls(usbmuxd_t) + kernel_read_system_state(usbmuxd_t) + + dev_read_sysfs(usbmuxd_t) ++dev_read_urand(usbmuxd_t) + dev_rw_generic_usb_dev(usbmuxd_t) + + auth_use_nsswitch(usbmuxd_t) + +-miscfiles_read_localization(usbmuxd_t) +- + logging_send_syslog_msg(usbmuxd_t) ++ ++seutil_dontaudit_read_file_contexts(usbmuxd_t) ++ ++optional_policy(` ++ udev_read_pid_files(usbmuxd_t) ++') ++ ++optional_policy(` ++ virt_dontaudit_read_chr_dev(usbmuxd_t) ++') +diff --git a/userhelper.fc b/userhelper.fc +index c416a833e9..cd83b89ee2 100644 +--- a/userhelper.fc ++++ b/userhelper.fc +@@ -1,5 +1,10 @@ +-/etc/security/console\.apps(/.*)? gen_context(system_u:object_r:userhelper_conf_t,s0) ++# ++# /etc ++# ++/etc/security/console\.apps(/.*)? gen_context(system_u:object_r:userhelper_conf_t,s0) + +-/usr/bin/consolehelper -- gen_context(system_u:object_r:consolehelper_exec_t,s0) +- +-/usr/sbin/userhelper -- gen_context(system_u:object_r:userhelper_exec_t,s0) +\ No newline at end of file ++# ++# /usr ++# ++/usr/sbin/userhelper -- gen_context(system_u:object_r:userhelper_exec_t,s0) ++/usr/bin/consolehelper -- gen_context(system_u:object_r:consolehelper_exec_t,s0) +diff --git a/userhelper.if b/userhelper.if +index 98b51fd0b4..c7e44cada9 100644 +--- a/userhelper.if ++++ b/userhelper.if +@@ -1,4 +1,4 @@ +-## A wrapper that helps users run system programs. ++## SELinux utility to run a shell with a new role + + ####################################### + ## +@@ -23,9 +23,9 @@ + # + template(`userhelper_role_template',` + gen_require(` +- attribute userhelper_type, consolehelper_type; +- attribute_role userhelper_roles, consolehelper_roles; +- type userhelper_exec_t, consolehelper_exec_t, userhelper_conf_t; ++ attribute userhelper_type; ++ type userhelper_exec_t, userhelper_conf_t; ++ class dbus send_msg; + ') + + ######################################## +@@ -33,64 +33,123 @@ template(`userhelper_role_template',` + # Declarations + # + +- type $1_consolehelper_t, consolehelper_type; +- userdom_user_application_domain($1_consolehelper_t, consolehelper_exec_t) +- +- role consolehelper_roles types $1_consolehelper_t; +- roleattribute $2 consolehelper_roles; +- + type $1_userhelper_t, userhelper_type; + userdom_user_application_domain($1_userhelper_t, userhelper_exec_t) +- + domain_role_change_exemption($1_userhelper_t) + domain_obj_id_change_exemption($1_userhelper_t) + domain_interactive_fd($1_userhelper_t) + domain_subj_id_change_exemption($1_userhelper_t) +- +- role userhelper_roles types $1_userhelper_t; +- roleattribute $2 userhelper_roles; ++ role $2 types $1_userhelper_t; + + ######################################## + # +- # Consolehelper local policy ++ # Local policy + # ++ allow $1_userhelper_t self:capability { setuid setgid net_bind_service dac_read_search dac_override chown sys_tty_config }; ++ allow $1_userhelper_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; ++ allow $1_userhelper_t self:process setexec; ++ allow $1_userhelper_t self:fd use; ++ allow $1_userhelper_t self:fifo_file rw_fifo_file_perms; ++ allow $1_userhelper_t self:shm create_shm_perms; ++ allow $1_userhelper_t self:sem create_sem_perms; ++ allow $1_userhelper_t self:msgq create_msgq_perms; ++ allow $1_userhelper_t self:msg { send receive }; ++ allow $1_userhelper_t self:unix_dgram_socket create_socket_perms; ++ allow $1_userhelper_t self:unix_stream_socket create_stream_socket_perms; ++ allow $1_userhelper_t self:unix_dgram_socket sendto; ++ allow $1_userhelper_t self:unix_stream_socket connectto; ++ allow $1_userhelper_t self:sock_file read_sock_file_perms; ++ ++ #Transition to the derived domain. ++ domtrans_pattern($3, userhelper_exec_t, $1_userhelper_t) + +- allow $1_consolehelper_t $3:unix_stream_socket connectto; ++ allow $1_userhelper_t userhelper_conf_t:dir rw_dir_perms; ++ rw_files_pattern($1_userhelper_t, userhelper_conf_t, userhelper_conf_t) + +- domtrans_pattern($3, consolehelper_exec_t, $1_consolehelper_t) ++ can_exec($1_userhelper_t, userhelper_exec_t) + +- allow $3 $1_consolehelper_t:process { ptrace signal_perms }; +- ps_process_pattern($3, $1_consolehelper_t) ++ dontaudit $3 $1_userhelper_t:process signal; + +- auth_use_pam($1_consolehelper_t) ++ kernel_read_all_sysctls($1_userhelper_t) ++ kernel_getattr_debugfs($1_userhelper_t) ++ kernel_read_system_state($1_userhelper_t) + +- optional_policy(` +- dbus_connect_all_session_bus($1_consolehelper_t) ++ # Execute shells ++ corecmd_exec_shell($1_userhelper_t) ++ # By default, revert to the calling domain when a program is executed ++ corecmd_bin_domtrans($1_userhelper_t, $3) + +- optional_policy(` +- userhelper_dbus_chat_all_consolehelper($3) +- ') +- ') ++ # Inherit descriptors from the current session. ++ domain_use_interactive_fds($1_userhelper_t) ++ # for when the user types "exec userhelper" at the command line ++ domain_sigchld_interactive_fds($1_userhelper_t) ++ ++ dev_read_urand($1_userhelper_t) ++ # Read /dev directories and any symbolic links. ++ dev_list_all_dev_nodes($1_userhelper_t) ++ ++ files_list_var_lib($1_userhelper_t) ++ # Read the /etc/security/default_type file ++ files_read_etc_files($1_userhelper_t) ++ # Read /var. ++ files_read_var_files($1_userhelper_t) ++ files_read_var_symlinks($1_userhelper_t) ++ # for some PAM modules and for cwd ++ files_search_home($1_userhelper_t) ++ ++ fs_search_auto_mountpoints($1_userhelper_t) ++ fs_read_nfs_files($1_userhelper_t) ++ fs_read_nfs_symlinks($1_userhelper_t) ++ ++ # Allow $1_userhelper to obtain contexts to relabel TTYs ++ selinux_get_fs_mount($1_userhelper_t) ++ selinux_validate_context($1_userhelper_t) ++ selinux_compute_access_vector($1_userhelper_t) ++ selinux_compute_create_context($1_userhelper_t) ++ selinux_compute_relabel_context($1_userhelper_t) ++ selinux_compute_user_contexts($1_userhelper_t) ++ ++ # Read the devpts root directory. ++ term_list_ptys($1_userhelper_t) ++ # Relabel terminals. ++ term_relabel_all_ttys($1_userhelper_t) ++ term_relabel_all_ptys($1_userhelper_t) ++ # Access terminals. ++ term_use_all_ttys($1_userhelper_t) ++ term_use_all_ptys($1_userhelper_t) + +- ######################################## +- # +- # Userhelper local policy +- # ++ auth_domtrans_chk_passwd($1_userhelper_t) ++ auth_manage_pam_pid($1_userhelper_t) ++ auth_manage_var_auth($1_userhelper_t) ++ auth_search_pam_console_data($1_userhelper_t) ++ auth_use_nsswitch($1_userhelper_t) + +- domtrans_pattern($3, userhelper_exec_t, $1_userhelper_t) ++ logging_send_syslog_msg($1_userhelper_t) + +- dontaudit $3 $1_userhelper_t:process signal; ++ # Inherit descriptors from the current session. ++ init_use_fds($1_userhelper_t) ++ # Write to utmp. ++ init_manage_utmp($1_userhelper_t) ++ init_pid_filetrans_utmp($1_userhelper_t) + +- corecmd_bin_domtrans($1_userhelper_t, $3) + +- auth_domtrans_chk_passwd($1_userhelper_t) +- auth_use_nsswitch($1_userhelper_t) ++ seutil_read_config($1_userhelper_t) ++ seutil_read_default_contexts($1_userhelper_t) + ++ # Allow $1_userhelper_t to transition to user domains. + userdom_bin_spec_domtrans_unpriv_users($1_userhelper_t) + userdom_entry_spec_domtrans_unpriv_users($1_userhelper_t) + ++ ifdef(`distro_redhat',` ++ optional_policy(` ++ # Allow transitioning to rpm_t, for up2date ++ rpm_domtrans($1_userhelper_t) ++ ') ++ ') ++ + optional_policy(` + tunable_policy(`! secure_mode',` ++ #if we are not in secure mode then we can transition to sysadm_t + sysadm_bin_spec_domtrans($1_userhelper_t) + sysadm_entry_spec_domtrans($1_userhelper_t) + ') +@@ -99,7 +158,7 @@ template(`userhelper_role_template',` + + ######################################## + ## +-## Search userhelper configuration directories. ++## Search the userhelper configuration directory. + ## + ## + ## +@@ -118,7 +177,7 @@ interface(`userhelper_search_config',` + ######################################## + ## + ## Do not audit attempts to search +-## userhelper configuration directories. ++## the userhelper configuration directory. + ## + ## + ## +@@ -136,28 +195,26 @@ interface(`userhelper_dontaudit_search_config',` + + ######################################## + ## +-## Send and receive messages from +-## consolehelper over dbus. ++## Do not audit attempts to write ++## the userhelper configuration files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`userhelper_dbus_chat_all_consolehelper',` ++interface(`userhelper_dontaudit_write_config',` + gen_require(` +- attribute consolehelper_type; +- class dbus send_msg; ++ type userhelper_conf_t; + ') + +- allow $1 consolehelper_type:dbus send_msg; +- allow consolehelper_type $1:dbus send_msg; ++ dontaudit $1 userhelper_conf_t:file write; + ') + + ######################################## + ## +-## Use userhelper all userhelper file descriptors. ++## Allow domain to use userhelper file descriptor. + ## + ## + ## +@@ -175,7 +232,7 @@ interface(`userhelper_use_fd',` + + ######################################## + ## +-## Send child terminated signals to all userhelper. ++## Allow domain to send sigchld to userhelper. + ## + ## + ## +@@ -206,10 +263,83 @@ interface(`userhelper_exec',` + type userhelper_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, userhelper_exec_t) + ') + ++####################################### ++## ++## The role template for the consolehelper module. ++## ++## ++##

      ++## This template creates a derived domains which are used ++## for consolehelper applications. ++##

      ++##
      ++## ++## ++## The prefix of the user domain (e.g., user ++## is the prefix for user_t). ++## ++## ++## ++## ++## The role associated with the user domain. ++## ++## ++## ++## ++## The type of the user domain. ++## ++## ++# ++template(`userhelper_console_role_template',` ++ gen_require(` ++ type consolehelper_exec_t; ++ attribute consolehelper_domain; ++ class dbus send_msg; ++ ') ++ type $1_consolehelper_t, consolehelper_domain; ++ domain_type($1_consolehelper_t) ++ domain_entry_file($1_consolehelper_t, consolehelper_exec_t) ++ role $2 types $1_consolehelper_t; ++ ++ domtrans_pattern($3, consolehelper_exec_t, $1_consolehelper_t) ++ ++ allow $3 $1_consolehelper_t:process signal; ++ allow $3 $1_consolehelper_t:dbus send_msg; ++ allow $1_consolehelper_t $3:dbus send_msg; ++ allow $1_consolehelper_t $3:unix_stream_socket connectto; ++ ++ kernel_read_system_state($1_consolehelper_t) ++ ++ auth_use_pam($1_consolehelper_t) ++ ++ userdom_manage_tmp_role($2, $1_consolehelper_t) ++ ++ optional_policy(` ++ dbus_connect_session_bus($1_consolehelper_t) ++ ') ++ ++ optional_policy(` ++ hddtemp_run($1_consolehelper_t, $2) ++ ') ++ ++ optional_policy(` ++ shutdown_run($1_consolehelper_t, $2) ++ shutdown_send_sigchld($3) ++ ') ++ ++ optional_policy(` ++ mock_run($1_consolehelper_t, $2) ++ ') ++ ++ optional_policy(` ++ xserver_run_xauth($1_consolehelper_t, $2) ++ xserver_read_xdm_pid($1_consolehelper_t) ++ ') ++') ++ + ######################################## + ## + ## Execute the consolehelper program +diff --git a/userhelper.te b/userhelper.te +index 42cfce06e2..b7e3e25326 100644 +--- a/userhelper.te ++++ b/userhelper.te +@@ -5,11 +5,8 @@ policy_module(userhelper, 1.8.1) + # Declarations + # + +-attribute consolehelper_type; + attribute userhelper_type; +- +-attribute_role consolehelper_roles; +-attribute_role userhelper_roles; ++attribute consolehelper_domain; + + type userhelper_conf_t; + files_config_file(userhelper_conf_t) +@@ -22,141 +19,77 @@ application_executable_file(consolehelper_exec_t) + + ######################################## + # +-# Common consolehelper domain local policy ++# consolehelper local policy + # + +-allow consolehelper_type self:capability { setgid setuid dac_override }; +-allow consolehelper_type self:process signal; +-allow consolehelper_type self:fifo_file rw_fifo_file_perms; +-allow consolehelper_type self:unix_stream_socket create_stream_socket_perms; +-allow consolehelper_type self:shm create_shm_perms; +- +-dontaudit consolehelper_type userhelper_conf_t:file audit_access; +-read_files_pattern(consolehelper_type, userhelper_conf_t, userhelper_conf_t) ++allow consolehelper_domain self:shm create_shm_perms; ++allow consolehelper_domain self:capability { setgid setuid dac_read_search dac_override sys_nice }; ++allow consolehelper_domain self:process { signal_perms getsched setsched }; + +-domain_use_interactive_fds(consolehelper_type) ++allow consolehelper_domain userhelper_conf_t:file audit_access; ++dontaudit consolehelper_domain userhelper_conf_t:file write; ++read_files_pattern(consolehelper_domain, userhelper_conf_t, userhelper_conf_t) + +-kernel_read_system_state(consolehelper_type) +-kernel_read_kernel_sysctls(consolehelper_type) ++# Init script handling ++domain_use_interactive_fds(consolehelper_domain) + +-corecmd_exec_bin(consolehelper_type) ++# internal communication is often done using fifo and unix sockets. ++allow consolehelper_domain self:fifo_file rw_fifo_file_perms; ++allow consolehelper_domain self:unix_stream_socket create_stream_socket_perms; + +-dev_getattr_all_chr_files(consolehelper_type) +-dev_dontaudit_list_all_dev_nodes(consolehelper_type) ++kernel_read_kernel_sysctls(consolehelper_domain) + +-files_read_config_files(consolehelper_type) +-files_read_usr_files(consolehelper_type) ++corecmd_exec_bin(consolehelper_domain) + +-fs_getattr_all_dirs(consolehelper_type) +-fs_getattr_all_fs(consolehelper_type) +-fs_search_auto_mountpoints(consolehelper_type) +-files_search_mnt(consolehelper_type) ++dev_getattr_all_chr_files(consolehelper_domain) ++dev_dontaudit_list_all_dev_nodes(consolehelper_domain) ++dev_dontaudit_getattr_all(consolehelper_domain) ++fs_getattr_all_fs(consolehelper_domain) ++fs_getattr_all_dirs(consolehelper_domain) + +-term_list_ptys(consolehelper_type) ++files_read_config_files(consolehelper_domain) + +-auth_search_pam_console_data(consolehelper_type) +-auth_read_pam_pid(consolehelper_type) ++term_list_ptys(consolehelper_domain) + +-miscfiles_read_localization(consolehelper_type) +-miscfiles_read_fonts(consolehelper_type) ++auth_search_pam_console_data(consolehelper_domain) ++auth_read_pam_pid(consolehelper_domain) + +-userhelper_exec(consolehelper_type) ++init_read_utmp(consolehelper_domain) ++init_telinit(consolehelper_domain) + +-userdom_use_user_terminals(consolehelper_type) ++miscfiles_read_fonts(consolehelper_domain) + +-# might want to make this consolehelper_tmp_t +-userdom_manage_user_tmp_dirs(consolehelper_type) +-userdom_manage_user_tmp_files(consolehelper_type) +-userdom_tmp_filetrans_user_tmp(consolehelper_type, { dir file }) ++userhelper_exec(consolehelper_domain) + +-tunable_policy(`use_nfs_home_dirs',` +- fs_search_nfs(consolehelper_type) +-') ++userdom_use_user_ptys(consolehelper_domain) ++userdom_use_user_ttys(consolehelper_domain) ++userdom_read_user_home_content_files(consolehelper_domain) ++userdom_search_admin_dir(consolehelper_domain) + +-tunable_policy(`use_samba_home_dirs',` +- fs_search_cifs(consolehelper_type) ++optional_policy(` ++ dbus_session_bus_client(consolehelper_domain) ++ optional_policy(` ++ devicekit_dbus_chat_disk(consolehelper_domain) ++ ') + ') + + optional_policy(` +- shutdown_run(consolehelper_type, consolehelper_roles) +- shutdown_signal(consolehelper_type) ++ gnome_read_gconf_home_files(consolehelper_domain) + ') + + optional_policy(` +- xserver_domtrans_xauth(consolehelper_type) +- xserver_read_xdm_pid(consolehelper_type) +- xserver_stream_connect(consolehelper_type) ++ xserver_read_home_fonts(consolehelper_domain) ++ xserver_stream_connect(consolehelper_domain) ++ xserver_admin_home_dir_filetrans_xauth(consolehelper_domain) ++ xserver_manage_user_xauth(consolehelper_domain) + ') + +-######################################## +-# +-# Common userhelper domain local policy +-# +- +-allow userhelper_type self:capability { setuid setgid net_bind_service dac_override chown sys_tty_config }; +-allow userhelper_type self:process ~{ ptrace setcurrent setfscreate setrlimit execmem execstack execheap }; +-allow userhelper_type self:fd use; +-allow userhelper_type self:fifo_file rw_fifo_file_perms; +-allow userhelper_type self:shm create_shm_perms; +-allow userhelper_type self:sem create_sem_perms; +-allow userhelper_type self:msgq create_msgq_perms; +-allow userhelper_type self:msg { send receive }; +-allow userhelper_type self:unix_dgram_socket sendto; +-allow userhelper_type self:unix_stream_socket { accept connectto listen }; +- +-dontaudit userhelper_type userhelper_conf_t:file audit_access; +-read_files_pattern(userhelper_type, userhelper_conf_t, userhelper_conf_t) +- +-can_exec(userhelper_type, userhelper_exec_t) +- +-kernel_read_all_sysctls(userhelper_type) +-kernel_getattr_debugfs(userhelper_type) +-kernel_read_system_state(userhelper_type) +- +-corecmd_exec_shell(userhelper_type) +- +-domain_use_interactive_fds(userhelper_type) +-domain_sigchld_interactive_fds(userhelper_type) +- +-dev_read_urand(userhelper_type) +-dev_list_all_dev_nodes(userhelper_type) +- +-files_list_var_lib(userhelper_type) +-files_read_var_files(userhelper_type) +-files_read_var_symlinks(userhelper_type) +-files_search_home(userhelper_type) +- +-fs_getattr_all_fs(userhelper_type) +-fs_search_auto_mountpoints(userhelper_type) +- +-selinux_get_fs_mount(userhelper_type) +-selinux_validate_context(userhelper_type) +-selinux_compute_access_vector(userhelper_type) +-selinux_compute_create_context(userhelper_type) +-selinux_compute_relabel_context(userhelper_type) +-selinux_compute_user_contexts(userhelper_type) +- +-term_list_ptys(userhelper_type) +-term_relabel_all_ttys(userhelper_type) +-term_relabel_all_ptys(userhelper_type) +-term_use_all_ttys(userhelper_type) +-term_use_all_ptys(userhelper_type) +- +-auth_manage_pam_pid(userhelper_type) +-auth_manage_var_auth(userhelper_type) +-auth_search_pam_console_data(userhelper_type) +- +-init_use_fds(userhelper_type) +-init_manage_utmp(userhelper_type) +-init_pid_filetrans_utmp(userhelper_type) +- +-logging_send_syslog_msg(userhelper_type) +- +-miscfiles_read_localization(userhelper_type) +- +-seutil_read_config(userhelper_type) +-seutil_read_default_contexts(userhelper_type) ++tunable_policy(`use_nfs_home_dirs',` ++ files_search_mnt(consolehelper_domain) ++ fs_search_nfs(consolehelper_domain) ++') + +-optional_policy(` +- rpm_domtrans(userhelper_type) ++tunable_policy(`use_samba_home_dirs',` ++ files_search_mnt(consolehelper_domain) ++ fs_search_cifs(consolehelper_domain) + ') +diff --git a/usernetctl.if b/usernetctl.if +index 7deec55cf8..c542887da3 100644 +--- a/usernetctl.if ++++ b/usernetctl.if +@@ -39,6 +39,7 @@ interface(`usernetctl_domtrans',` + # + interface(`usernetctl_run',` + gen_require(` ++ type usernetctl_t; + attribute_role usernetctl_roles; + ') + +diff --git a/usernetctl.te b/usernetctl.te +index f973af82ba..8606439919 100644 +--- a/usernetctl.te ++++ b/usernetctl.te +@@ -6,19 +6,19 @@ policy_module(usernetctl, 1.7.0) + # + + attribute_role usernetctl_roles; ++roleattribute system_r usernetctl_roles; + + type usernetctl_t; + type usernetctl_exec_t; + application_domain(usernetctl_t, usernetctl_exec_t) + domain_interactive_fd(usernetctl_t) +-role usernetctl_roles types usernetctl_t; + + ######################################## + # + # Local policy + # + +-allow usernetctl_t self:capability { setuid setgid dac_override }; ++allow usernetctl_t self:capability { setuid setgid dac_read_search dac_override }; + allow usernetctl_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow usernetctl_t self:fd use; + allow usernetctl_t self:fifo_file rw_fifo_file_perms; +@@ -40,7 +40,6 @@ files_exec_etc_files(usernetctl_t) + files_read_etc_runtime_files(usernetctl_t) + files_list_pids(usernetctl_t) + files_list_home(usernetctl_t) +-files_read_usr_files(usernetctl_t) + + fs_search_auto_mountpoints(usernetctl_t) + +@@ -48,18 +47,14 @@ auth_use_nsswitch(usernetctl_t) + + logging_send_syslog_msg(usernetctl_t) + +-miscfiles_read_localization(usernetctl_t) +- + seutil_read_config(usernetctl_t) + ++sysnet_read_config(usernetctl_t) ++ + sysnet_run_ifconfig(usernetctl_t, usernetctl_roles) + sysnet_run_dhcpc(usernetctl_t, usernetctl_roles) + +-userdom_use_user_terminals(usernetctl_t) +- +-optional_policy(` +- consoletype_run(usernetctl_t, usernetctl_roles) +-') ++userdom_use_inherited_user_terminals(usernetctl_t) + + optional_policy(` + hostname_exec(usernetctl_t) +@@ -73,6 +68,10 @@ optional_policy(` + modutils_run_insmod(usernetctl_t, usernetctl_roles) + ') + ++optional_policy(` ++ nis_use_ypbind(usernetctl_t) ++') ++ + optional_policy(` + ppp_run(usernetctl_t, usernetctl_roles) + ') +diff --git a/uucp.if b/uucp.if +index af9acc0d3c..cdaf82e214 100644 +--- a/uucp.if ++++ b/uucp.if +@@ -90,11 +90,6 @@ interface(`uucp_domtrans_uux',` + ## Domain allowed access. + ## + ## +-## +-## +-## Role allowed access. +-## +-## + ## + # + interface(`uucp_admin',` +@@ -104,14 +99,13 @@ interface(`uucp_admin',` + type uucpd_var_run_t, uucpd_initrc_exec_t; + ') + +- init_labeled_script_domtrans($1, uucpd_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 uucpd_initrc_exec_t system_r; +- allow $2 system_r; +- +- allow $1 uucpd_t:process { ptrace signal_perms }; ++ allow $1 uucpd_t:process signal_perms; + ps_process_pattern($1, uucpd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 uucpd_t:process ptrace; ++ ') ++ + logging_list_logs($1) + admin_pattern($1, uucpd_log_t) + +diff --git a/uucp.te b/uucp.te +index 849f607b14..e01ec6d2e9 100644 +--- a/uucp.te ++++ b/uucp.te +@@ -31,7 +31,7 @@ type uucpd_ro_t; + files_type(uucpd_ro_t) + + type uucpd_spool_t; +-files_type(uucpd_spool_t) ++files_spool_file(uucpd_spool_t) + + type uucpd_log_t; + logging_log_file(uucpd_log_t) +@@ -84,15 +84,20 @@ kernel_read_kernel_sysctls(uucpd_t) + kernel_read_system_state(uucpd_t) + kernel_read_network_state(uucpd_t) + +-corenet_all_recvfrom_unlabeled(uucpd_t) + corenet_all_recvfrom_netlabel(uucpd_t) + corenet_tcp_sendrecv_generic_if(uucpd_t) + corenet_tcp_sendrecv_generic_node(uucpd_t) ++corenet_udp_sendrecv_generic_node(uucpd_t) ++corenet_tcp_sendrecv_all_ports(uucpd_t) ++corenet_udp_sendrecv_all_ports(uucpd_t) + + corenet_sendrecv_ssh_client_packets(uucpd_t) + corenet_tcp_connect_ssh_port(uucpd_t) + corenet_tcp_sendrecv_ssh_port(uucpd_t) + ++corenet_tcp_bind_uucpd_port(uucpd_t) ++corenet_tcp_connect_uucpd_port(uucpd_t) ++ + corecmd_exec_bin(uucpd_t) + corecmd_exec_shell(uucpd_t) + +@@ -110,7 +115,7 @@ auth_use_nsswitch(uucpd_t) + + logging_send_syslog_msg(uucpd_t) + +-miscfiles_read_localization(uucpd_t) ++mta_send_mail(uucpd_t) + + optional_policy(` + cron_system_entry(uucpd_t, uucpd_exec_t) +@@ -124,10 +129,6 @@ optional_policy(` + kerberos_use(uucpd_t) + ') + +-optional_policy(` +- mta_send_mail(uucpd_t) +-') +- + optional_policy(` + ssh_exec(uucpd_t) + ') +@@ -160,10 +161,15 @@ auth_use_nsswitch(uux_t) + logging_search_logs(uux_t) + logging_send_syslog_msg(uux_t) + +-miscfiles_read_localization(uux_t) +- + optional_policy(` + mta_send_mail(uux_t) + mta_read_queue(uux_t) ++') ++ ++optional_policy(` + sendmail_dontaudit_rw_unix_stream_sockets(uux_t) + ') ++ ++optional_policy(` ++ postfix_rw_inherited_master_pipes(uux_t) ++') +diff --git a/uuidd.if b/uuidd.if +index 6e48653331..6abf74a905 100644 +--- a/uuidd.if ++++ b/uuidd.if +@@ -148,11 +148,12 @@ interface(`uuidd_read_pid_files',` + # + interface(`uuidd_stream_connect_manager',` + gen_require(` +- type uuidd_t, uuidd_var_run_t; ++ type uuidd_t, uuidd_var_run_t, uuidd_var_lib_t; + ') + + files_search_pids($1) + stream_connect_pattern($1, uuidd_var_run_t, uuidd_var_run_t, uuidd_t) ++ stream_connect_pattern($1, uuidd_var_lib_t, uuidd_var_lib_t, uuidd_t) + ') + + ######################################## +@@ -180,6 +181,9 @@ interface(`uuidd_admin',` + + allow $1 uuidd_t:process signal_perms; + ps_process_pattern($1, uuidd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 uuidd_t:process ptrace; ++ ') + + uuidd_initrc_domtrans($1) + domain_system_change_exemption($1) +diff --git a/uuidd.te b/uuidd.te +index f8e52fc97b..b283c25f72 100644 +--- a/uuidd.te ++++ b/uuidd.te +@@ -42,6 +42,4 @@ dev_read_urand(uuidd_t) + + domain_use_interactive_fds(uuidd_t) + +-files_read_etc_files(uuidd_t) + +-miscfiles_read_localization(uuidd_t) +diff --git a/uwimap.te b/uwimap.te +index acdc78ae70..9e5ee472d9 100644 +--- a/uwimap.te ++++ b/uwimap.te +@@ -20,7 +20,7 @@ files_pid_file(imapd_var_run_t) + # Local policy + # + +-allow imapd_t self:capability { dac_override setgid setuid sys_resource }; ++allow imapd_t self:capability { dac_read_search dac_override setgid setuid sys_resource }; + dontaudit imapd_t self:capability sys_tty_config; + allow imapd_t self:process signal_perms; + allow imapd_t self:fifo_file rw_fifo_file_perms; +@@ -37,7 +37,6 @@ kernel_read_kernel_sysctls(imapd_t) + kernel_list_proc(imapd_t) + kernel_read_proc_symlinks(imapd_t) + +-corenet_all_recvfrom_unlabeled(imapd_t) + corenet_all_recvfrom_netlabel(imapd_t) + corenet_tcp_sendrecv_generic_if(imapd_t) + corenet_tcp_sendrecv_generic_node(imapd_t) +@@ -56,8 +55,6 @@ dev_read_urand(imapd_t) + + domain_use_interactive_fds(imapd_t) + +-files_read_etc_files(imapd_t) +- + fs_getattr_all_fs(imapd_t) + fs_search_auto_mountpoints(imapd_t) + +@@ -65,8 +62,6 @@ auth_domtrans_chk_passwd(imapd_t) + + logging_send_syslog_msg(imapd_t) + +-miscfiles_read_localization(imapd_t) +- + sysnet_dns_name_resolve(imapd_t) + + userdom_dontaudit_use_unpriv_user_fds(imapd_t) +diff --git a/varnishd.if b/varnishd.if +index 1c35171d83..2cba4dfeaa 100644 +--- a/varnishd.if ++++ b/varnishd.if +@@ -153,12 +153,16 @@ interface(`varnishd_manage_log',` + # + interface(`varnishd_admin_varnishlog',` + gen_require(` ++ type varnishd_t; + type varnishlog_t, varnishlog_initrc_exec_t, varnishlog_log_t; + type varnishlog_var_run_t; + ') + +- allow $1 varnishlog_t:process { ptrace signal_perms }; ++ allow $1 varnishlog_t:process signal_perms; + ps_process_pattern($1, varnishlog_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 varnishd_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, varnishlog_initrc_exec_t) + domain_system_change_exemption($1) +@@ -196,9 +200,13 @@ interface(`varnishd_admin',` + type varnishd_initrc_exec_t; + ') + +- allow $1 varnishd_t:process { ptrace signal_perms }; ++ allow $1 varnishd_t:process signal_perms; + ps_process_pattern($1, varnishd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 varnishd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, varnishd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 varnishd_initrc_exec_t system_r; +diff --git a/varnishd.te b/varnishd.te +index 9d4d8cbb09..3b30d5ac5e 100644 +--- a/varnishd.te ++++ b/varnishd.te +@@ -21,7 +21,7 @@ type varnishd_initrc_exec_t; + init_script_file(varnishd_initrc_exec_t) + + type varnishd_etc_t; +-files_type(varnishd_etc_t) ++files_config_file(varnishd_etc_t) + + type varnishd_tmp_t; + files_tmp_file(varnishd_tmp_t) +@@ -43,16 +43,16 @@ type varnishlog_var_run_t; + files_pid_file(varnishlog_var_run_t) + + type varnishlog_log_t; +-files_type(varnishlog_log_t) ++logging_log_file(varnishlog_log_t) + + ######################################## + # + # Local policy + # + +-allow varnishd_t self:capability { kill dac_override ipc_lock setuid setgid }; ++allow varnishd_t self:capability { kill dac_read_search dac_override ipc_lock setuid setgid chown fowner fsetid }; + dontaudit varnishd_t self:capability sys_tty_config; +-allow varnishd_t self:process signal; ++allow varnishd_t self:process { execmem signal }; + allow varnishd_t self:fifo_file rw_fifo_file_perms; + allow varnishd_t self:tcp_socket { accept listen }; + +@@ -103,15 +103,13 @@ corenet_tcp_sendrecv_varnishd_port(varnishd_t) + + dev_read_urand(varnishd_t) + +-files_read_usr_files(varnishd_t) +- + fs_getattr_all_fs(varnishd_t) + + auth_use_nsswitch(varnishd_t) + + logging_send_syslog_msg(varnishd_t) + +-miscfiles_read_localization(varnishd_t) ++sysnet_read_config(varnishd_t) + + tunable_policy(`varnishd_connect_any',` + corenet_sendrecv_all_client_packets(varnishd_t) +@@ -136,5 +134,6 @@ setattr_files_pattern(varnishlog_t, varnishlog_log_t, varnishlog_log_t) + logging_log_filetrans(varnishlog_t, varnishlog_log_t, { file dir }) + + read_files_pattern(varnishlog_t, varnishd_var_lib_t, varnishd_var_lib_t) ++allow varnishlog_t varnishd_var_lib_t:file map; + + files_search_var_lib(varnishlog_t) +diff --git a/vbetool.te b/vbetool.te +index 2a61f75266..cea4ee2203 100644 +--- a/vbetool.te ++++ b/vbetool.te +@@ -26,7 +26,8 @@ role vbetool_roles types vbetool_t; + # Local policy + # + +-allow vbetool_t self:capability { dac_override sys_tty_config sys_admin }; ++allow vbetool_t self:capability { dac_read_search dac_override sys_tty_config sys_admin }; ++allow vbetool_t self:capability2 compromise_kernel; + allow vbetool_t self:process execmem; + + dev_wx_raw_memory(vbetool_t) +@@ -43,7 +44,6 @@ mls_file_write_all_levels(vbetool_t) + + term_use_unallocated_ttys(vbetool_t) + +-miscfiles_read_localization(vbetool_t) + + tunable_policy(`vbetool_mmap_zero_ignore',` + dontaudit vbetool_t self:memprotect mmap_zero; +diff --git a/vdagent.if b/vdagent.if +index 31c752ea64..ef522355bd 100644 +--- a/vdagent.if ++++ b/vdagent.if +@@ -24,15 +24,15 @@ interface(`vdagent_domtrans',` + ## Get attributes of vdagent executable files. + ##
      + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`vdagent_getattr_exec_files',` +- gen_require(` +- type vdagent_exec_t; +- ') ++ gen_require(` ++ type vdagent_exec_t; ++ ') + + allow $1 vdagent_exec_t:file getattr_file_perms; + ') +@@ -42,18 +42,18 @@ interface(`vdagent_getattr_exec_files',` + ## Get attributes of vdagent log files. + ##
      + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`vdagent_getattr_log',` +- gen_require(` +- type vdagent_log_t; +- ') ++ gen_require(` ++ type vdagent_log_t; ++ ') + +- logging_search_logs($1) +- allow $1 vdagent_log_t:file getattr_file_perms; ++ logging_search_logs($1) ++ allow $1 vdagent_log_t:file getattr_file_perms; + ') + + ######################################## +@@ -81,18 +81,18 @@ interface(`vdagent_read_pid_files',` + ## domain stream socket. + ##
      + ## +-## +-## Domain allowed access. +-## ++## ++## Domain allowed access. ++## + ## + # + interface(`vdagent_stream_connect',` +- gen_require(` +- type vdagent_var_run_t, vdagent_t; +- ') ++ gen_require(` ++ type vdagent_var_run_t, vdagent_t; ++ ') + +- files_search_pids($1) +- stream_connect_pattern($1, vdagent_var_run_t, vdagent_var_run_t, vdagent_t) ++ files_search_pids($1) ++ stream_connect_pattern($1, vdagent_var_run_t, vdagent_var_run_t, vdagent_t) + ') + + ######################################## +@@ -110,7 +110,6 @@ interface(`vdagent_stream_connect',` + ## Role allowed access. + ##
      + ## +-## + # + interface(`vdagent_admin',` + gen_require(` +@@ -120,6 +119,9 @@ interface(`vdagent_admin',` + + allow $1 vdagent_t:process signal_perms; + ps_process_pattern($1, vdagent_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 vdagent_t:process ptrace; ++ ') + + init_labeled_script_domtrans($1, vdagentd_initrc_exec_t) + domain_system_change_exemption($1) +diff --git a/vdagent.te b/vdagent.te +index 87da8a24d6..70531c93ee 100644 +--- a/vdagent.te ++++ b/vdagent.te +@@ -25,6 +25,7 @@ logging_log_file(vdagent_log_t) + + dontaudit vdagent_t self:capability sys_admin; + allow vdagent_t self:process signal; ++ + allow vdagent_t self:fifo_file rw_fifo_file_perms; + allow vdagent_t self:unix_stream_socket { accept listen }; + +@@ -39,23 +40,27 @@ create_files_pattern(vdagent_t, vdagent_log_t, vdagent_log_t) + setattr_files_pattern(vdagent_t, vdagent_log_t, vdagent_log_t) + logging_log_filetrans(vdagent_t, vdagent_log_t, file) + ++kernel_request_load_module(vdagent_t) ++ + dev_rw_input_dev(vdagent_t) + dev_rw_mtrr(vdagent_t) + dev_read_sysfs(vdagent_t) + dev_dontaudit_write_mtrr(vdagent_t) + +-files_read_etc_files(vdagent_t) +- + term_use_virtio_console(vdagent_t) + + init_read_state(vdagent_t) + +-logging_send_syslog_msg(vdagent_t) ++systemd_read_logind_sessions_files(vdagent_t) ++systemd_login_read_pid_files(vdagent_t) ++systemd_dbus_chat_logind(vdagent_t) + +-miscfiles_read_localization(vdagent_t) ++logging_send_syslog_msg(vdagent_t) + + userdom_read_all_users_state(vdagent_t) + ++xserver_read_xdm_state(vdagent_t) ++ + optional_policy(` + dbus_system_bus_client(vdagent_t) + +diff --git a/vhostmd.if b/vhostmd.if +index 22edd58f83..c3a536427f 100644 +--- a/vhostmd.if ++++ b/vhostmd.if +@@ -216,9 +216,13 @@ interface(`vhostmd_admin',` + type vhostmd_tmpfs_t; + ') + +- allow $1 vhostmd_t:process { ptrace signal_perms }; ++ allow $1 vhostmd_t:process signal_perms; + ps_process_pattern($1, vhostmd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 vhostmd_t:process ptrace; ++ ') ++ + vhostmd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 vhostmd_initrc_exec_t system_r; +diff --git a/vhostmd.te b/vhostmd.te +index 3d11c6a3d8..2eb57ded1c 100644 +--- a/vhostmd.te ++++ b/vhostmd.te +@@ -23,7 +23,7 @@ files_pid_file(vhostmd_var_run_t) + # Local policy + # + +-allow vhostmd_t self:capability { dac_override ipc_lock setuid setgid }; ++allow vhostmd_t self:capability { dac_read_search dac_override ipc_lock setuid setgid }; + allow vhostmd_t self:process { setsched getsched signal }; + allow vhostmd_t self:fifo_file rw_fifo_file_perms; + +@@ -58,14 +58,11 @@ dev_read_urand(vhostmd_t) + dev_read_sysfs(vhostmd_t) + + files_list_tmp(vhostmd_t) +-files_read_usr_files(vhostmd_t) + + auth_use_nsswitch(vhostmd_t) + + logging_send_syslog_msg(vhostmd_t) + +-miscfiles_read_localization(vhostmd_t) +- + optional_policy(` + hostname_exec(vhostmd_t) + ') +@@ -77,6 +74,8 @@ optional_policy(` + + optional_policy(` + virt_stream_connect(vhostmd_t) ++ virt_write_content(vhostmd_t) ++ virt_rw_svirt_image(vhostmd_t) + ') + + optional_policy(` +diff --git a/virt.fc b/virt.fc +index a4f20bcfcb..5172dcec43 100644 +--- a/virt.fc ++++ b/virt.fc +@@ -1,51 +1,113 @@ +-HOME_DIR/\.libvirt(/.*)? gen_context(system_u:object_r:virt_home_t,s0) +-HOME_DIR/\.libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) +-HOME_DIR/\.virtinst(/.*)? gen_context(system_u:object_r:virt_home_t,s0) +-HOME_DIR/VirtualMachines(/.*)? gen_context(system_u:object_r:virt_home_t,s0) +-HOME_DIR/VirtualMachines/isos(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++HOME_DIR/\.libvirt(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) ++HOME_DIR/\.virtinst(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.cache/libvirt(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.cache/libvirt-sandbox(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.cache/gnome-boxes(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.cache/libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) ++HOME_DIR/\.config/libvirt(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/\.config/libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) ++HOME_DIR/VirtualMachines(/.*)? gen_context(system_u:object_r:virt_home_t,s0) ++HOME_DIR/VirtualMachines/isos(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++HOME_DIR/\.local/share/gnome-boxes/images(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) ++HOME_DIR/\.local/share/libvirt/images(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) ++HOME_DIR/\.local/share/libvirt/boot(/.*)? gen_context(system_u:object_r:svirt_home_t,s0) + +-/etc/libvirt -d gen_context(system_u:object_r:virt_etc_t,s0) ++/etc/libvirt -d gen_context(system_u:object_r:virt_etc_t,s0) ++/etc/libvirt/virtlogd.conf -- gen_context(system_u:object_r:virtlogd_etc_t,s0) + /etc/libvirt/[^/]* -- gen_context(system_u:object_r:virt_etc_t,s0) + /etc/libvirt/[^/]* -d gen_context(system_u:object_r:virt_etc_rw_t,s0) +-/etc/libvirt/.*/.* gen_context(system_u:object_r:virt_etc_rw_t,s0) ++/etc/libvirt/.*/.* gen_context(system_u:object_r:virt_etc_rw_t,s0) ++/etc/rc\.d/init\.d/libvirtd -- gen_context(system_u:object_r:virtd_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/virtlogd -- gen_context(system_u:object_r:virtlogd_initrc_exec_t,s0) ++/etc/xen -d gen_context(system_u:object_r:virt_etc_t,s0) ++/etc/xen/[^/]* -- gen_context(system_u:object_r:virt_etc_t,s0) ++/etc/xen/[^/]* -d gen_context(system_u:object_r:virt_etc_rw_t,s0) ++/etc/xen/.*/.* gen_context(system_u:object_r:virt_etc_rw_t,s0) + +-/etc/rc\.d/init\.d/(libvirt-bin|libvirtd) -- gen_context(system_u:object_r:virtd_initrc_exec_t,s0) ++/usr/libexec/libvirt_lxc -- gen_context(system_u:object_r:virtd_lxc_exec_t,s0) ++/usr/libexec/qemu-bridge-helper gen_context(system_u:object_r:virt_bridgehelper_exec_t,s0) + +-/etc/xen -d gen_context(system_u:object_r:virt_etc_t,s0) +-/etc/xen/[^/]* -- gen_context(system_u:object_r:virt_etc_t,s0) +-/etc/xen/[^/]* -d gen_context(system_u:object_r:virt_etc_rw_t,s0) +-/etc/xen/.*/.* gen_context(system_u:object_r:virt_etc_rw_t,s0) +- +-/usr/libexec/libvirt_lxc -- gen_context(system_u:object_r:virtd_lxc_exec_t,s0) +-/usr/libexec/qemu-bridge-helper gen_context(system_u:object_r:virt_bridgehelper_exec_t,s0) +- +-/usr/bin/virsh -- gen_context(system_u:object_r:virsh_exec_t,s0) +-/usr/bin/virt-sandbox-service.* -- gen_context(system_u:object_r:virsh_exec_t,s0) +- +-/usr/sbin/condor_vm-gahp -- gen_context(system_u:object_r:virtd_exec_t,s0) +-/usr/sbin/fence_virtd -- gen_context(system_u:object_r:virsh_exec_t,s0) + /usr/sbin/libvirt-qmf -- gen_context(system_u:object_r:virt_qmf_exec_t,s0) + /usr/sbin/libvirtd -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/sbin/virtlockd -- gen_context(system_u:object_r:virtlogd_exec_t,s0) ++/usr/sbin/virtlogd -- gen_context(system_u:object_r:virtlogd_exec_t,s0) ++/usr/bin/virt-who -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/bin/qemu-pr-helper -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/bin/virsh -- gen_context(system_u:object_r:virsh_exec_t,s0) ++/usr/sbin/condor_vm-gahp -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/sbin/xl -- gen_context(system_u:object_r:virsh_exec_t,s0) ++/usr/sbin/xm -- gen_context(system_u:object_r:virsh_exec_t,s0) + + /var/cache/libvirt(/.*)? gen_context(system_u:object_r:virt_cache_t,s0-mls_systemhigh) + +-/var/lib/libvirt(/.*)? gen_context(system_u:object_r:virt_var_lib_t,s0) +-/var/lib/libvirt/boot(/.*)? gen_context(system_u:object_r:virt_content_t,s0) +-/var/lib/libvirt/images(/.*)? gen_context(system_u:object_r:virt_image_t,s0) +-/var/lib/libvirt/isos(/.*)? gen_context(system_u:object_r:virt_content_t,s0) +-/var/lib/libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_var_run_t,s0-mls_systemhigh) ++/var/lib/libvirt(/.*)? gen_context(system_u:object_r:virt_var_lib_t,s0) ++/var/lib/libvirt/boot(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++/var/lib/libvirt/images(/.*)? gen_context(system_u:object_r:virt_image_t,s0) ++/var/lib/libvirt/isos(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++/var/lib/libvirt/qemu(/.*)? gen_context(system_u:object_r:qemu_var_run_t,s0-mls_systemhigh) + +-/var/log/log(/.*)? gen_context(system_u:object_r:virt_log_t,s0) +-/var/log/libvirt(/.*)? gen_context(system_u:object_r:virt_log_t,s0) +-/var/log/vdsm(/.*)? gen_context(system_u:object_r:virt_log_t,s0) ++/var/lock/xl -- gen_context(system_u:object_r:virt_log_t,s0) ++/var/log/log(/.*)? gen_context(system_u:object_r:virt_log_t,s0) ++/var/log/libvirt(/.*)? gen_context(system_u:object_r:virt_log_t,s0) ++/var/log/vdsm(/.*)? gen_context(system_u:object_r:virt_log_t,s0) ++/var/run/libvirtd\.pid -- gen_context(system_u:object_r:virt_var_run_t,s0) ++/var/run/virtlogd\.pid -- gen_context(system_u:object_r:virtlogd_var_run_t,s0) ++/var/run/libvirt(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) ++/var/run/libvirt/qemu(/.*)? gen_context(system_u:object_r:qemu_var_run_t,s0-mls_systemhigh) ++/var/run/libvirt/lxc(/.*)? gen_context(system_u:object_r:virt_lxc_var_run_t,s0) ++/var/run/libvirt/virtlogd-sock gen_context(system_u:object_r:virtlogd_var_run_t,s0) ++/var/run/libvirt-sandbox(/.*)? gen_context(system_u:object_r:virt_lxc_var_run_t,s0) ++/var/run/vdsm(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) ++/var/run/qemu-pr-helper\.sock -s gen_context(system_u:object_r:virt_var_run_t,s0) + +-/var/vdsm(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) ++/var/vdsm(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) + +-/var/run/libguestfs(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) +-/var/run/libvirtd\.pid -- gen_context(system_u:object_r:virt_var_run_t,s0) +-/var/run/libvirt(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) +-/var/run/libvirt/lxc(/.*)? gen_context(system_u:object_r:virtd_lxc_var_run_t,s0) +-/var/run/libvirt-sandbox(/.*)? gen_context(system_u:object_r:virtd_lxc_var_run_t,s0) +-/var/run/libvirt/qemu(/.*)? gen_context(system_u:object_r:svirt_var_run_t,s0-mls_systemhigh) +-/var/run/user/[^/]*/libguestfs(/.*)? gen_context(system_u:object_r:virt_home_t,s0) +-/var/run/vdsm(/.*)? gen_context(system_u:object_r:virt_var_run_t,s0) ++# support for AEOLUS project ++/usr/bin/imagefactory -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/bin/imgfac\.py -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/var/cache/oz(/.*)? gen_context(system_u:object_r:virt_cache_t,s0) ++/var/lib/imagefactory/images(/.*)? gen_context(system_u:object_r:virt_image_t,s0) ++/var/lib/oz(/.*)? gen_context(system_u:object_r:virt_var_lib_t,s0) ++/var/lib/oz/isos(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++/var/lib/vdsm(/.*)? gen_context(system_u:object_r:virt_content_t,s0) ++ ++# add support vios-proxy-* ++/usr/bin/vios-proxy-host -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/bin/vios-proxy-guest -- gen_context(system_u:object_r:virtd_exec_t,s0) ++ ++#support for vdsm ++/usr/share/vdsm/vdsm -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/share/vdsm/respawn -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/share/vdsm/supervdsmServer -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/share/vdsm/daemonAdapter -- gen_context(system_u:object_r:virtd_exec_t,s0) ++ ++# support for nova-stack ++/usr/bin/nova-compute -- gen_context(system_u:object_r:virtd_exec_t,s0) ++/usr/bin/qemu -- gen_context(system_u:object_r:qemu_exec_t,s0) ++/usr/bin/qemu-system-.* -- gen_context(system_u:object_r:qemu_exec_t,s0) ++/usr/bin/qemu-kvm -- gen_context(system_u:object_r:qemu_exec_t,s0) ++/usr/libexec/qemu.* -- gen_context(system_u:object_r:qemu_exec_t,s0) ++ ++/etc/qemu-ga/fsfreeze-hook.d(/.*)? gen_context(system_u:object_r:virt_qemu_ga_unconfined_exec_t,s0) ++/usr/libexec/qemu-ga/fsfreeze-hook.d(/.*)? gen_context(system_u:object_r:virt_qemu_ga_unconfined_exec_t,s0) ++/var/run/qemu-ga/fsfreeze-hook.d(/.*)? gen_context(system_u:object_r:virt_qemu_ga_unconfined_exec_t,s0) ++ ++/usr/libexec/qemu-ga(/.*)? gen_context(system_u:object_r:virt_qemu_ga_exec_t,s0) ++ ++/usr/lib/systemd/system/*virtlogd.* gen_context(system_u:object_r:virtlogd_unit_file_t,s0) ++ ++/usr/lib/systemd/system/virt.*\.service -- gen_context(system_u:object_r:virtd_unit_file_t,s0) ++/usr/lib/systemd/system/libvirt.*\.service -- gen_context(system_u:object_r:virtd_unit_file_t,s0) ++/usr/lib/systemd/system/.*xen.*\.service -- gen_context(system_u:object_r:virtd_unit_file_t,s0) ++ ++/usr/bin/qemu-ga -- gen_context(system_u:object_r:virt_qemu_ga_exec_t,s0) ++ ++/var/lib/kubelet(/.*)? gen_context(system_u:object_r:container_file_t,s0) ++/var/lib/docker/vfs(/.*)? gen_context(system_u:object_r:container_file_t,s0) ++ ++/var/run/qemu-ga\.pid -- gen_context(system_u:object_r:virt_qemu_ga_var_run_t,s0) ++/var/run/qga\.state -- gen_context(system_u:object_r:virt_qemu_ga_var_run_t,s0) ++ ++/var/log/qemu-ga\.log.* -- gen_context(system_u:object_r:virt_qemu_ga_log_t,s0) ++/var/log/qemu-ga(/.*)? gen_context(system_u:object_r:virt_qemu_ga_log_t,s0) +diff --git a/virt.if b/virt.if +index facdee8b32..b149565d04 100644 +--- a/virt.if ++++ b/virt.if +@@ -1,120 +1,104 @@ +-## Libvirt virtualization API. ++## Libvirt virtualization API + +-####################################### ++######################################## + ## +-## The template to define a virt domain. ++## virtd_lxc_t stub interface. No access allowed. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Domain allowed access. + ## + ## + # +-template(`virt_domain_template',` ++interface(`virt_stub_lxc',` + gen_require(` +- attribute_role virt_domain_roles; +- attribute virt_image_type, virt_domain, virt_tmpfs_type; +- attribute virt_ptynode, virt_tmp_type; +- ') +- +- ######################################## +- # +- # Declarations +- # +- +- type $1_t, virt_domain; +- application_type($1_t) +- qemu_entry_type($1_t) +- domain_user_exemption_target($1_t) +- mls_rangetrans_target($1_t) +- mcs_constrained($1_t) +- role virt_domain_roles types $1_t; +- +- type $1_devpts_t, virt_ptynode; +- term_pty($1_devpts_t) +- +- type $1_tmp_t, virt_tmp_type; +- files_tmp_file($1_tmp_t) +- +- type $1_tmpfs_t, virt_tmpfs_type; +- files_tmpfs_file($1_tmpfs_t) +- +- optional_policy(` +- pulseaudio_tmpfs_content($1_tmpfs_t) ++ type virtd_lxc_t; + ') ++') + +- type $1_image_t, virt_image_type; +- files_type($1_image_t) +- dev_node($1_image_t) +- dev_associate_sysfs($1_image_t) +- +- ######################################## +- # +- # Policy +- # +- +- allow $1_t $1_devpts_t:chr_file { rw_term_perms setattr_chr_file_perms }; +- term_create_pty($1_t, $1_devpts_t) +- +- manage_dirs_pattern($1_t, $1_image_t, $1_image_t) +- manage_files_pattern($1_t, $1_image_t, $1_image_t) +- manage_fifo_files_pattern($1_t, $1_image_t, $1_image_t) +- read_lnk_files_pattern($1_t, $1_image_t, $1_image_t) +- manage_sock_files_pattern($1_t, $1_image_t, $1_image_t) +- rw_chr_files_pattern($1_t, $1_image_t, $1_image_t) +- rw_blk_files_pattern($1_t, $1_image_t, $1_image_t) +- fs_hugetlbfs_filetrans($1_t, $1_image_t, file) +- +- manage_dirs_pattern($1_t, $1_tmp_t, $1_tmp_t) +- manage_files_pattern($1_t, $1_tmp_t, $1_tmp_t) +- manage_lnk_files_pattern($1_t, $1_tmp_t, $1_tmp_t) +- files_tmp_filetrans($1_t, $1_tmp_t, { file dir }) +- +- manage_dirs_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) +- manage_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) +- manage_lnk_files_pattern($1_t, $1_tmpfs_t, $1_tmpfs_t) +- fs_tmpfs_filetrans($1_t, $1_tmpfs_t, { dir file lnk_file }) +- +- optional_policy(` +- pulseaudio_run($1_t, virt_domain_roles) ++######################################## ++## ++## svirt_sandbox_domain attribute stub interface. No access allowed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_stub_svirt_sandbox_domain',` ++ gen_require(` ++ attribute svirt_sandbox_domain; + ') ++') + +- optional_policy(` +- xserver_rw_shm($1_t) ++######################################## ++## ++## container_file_t stub interface. No access allowed. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_stub_svirt_sandbox_file',` ++ gen_require(` ++ type container_file_t; + ') + ') + +-####################################### ++######################################## + ## +-## The template to define a virt lxc domain. ++## Creates types and rules for a basic ++## qemu process domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # +-template(`virt_lxc_domain_template',` ++template(`virt_domain_template',` + gen_require(` +- attribute_role svirt_lxc_domain_roles; +- attribute svirt_lxc_domain; ++ attribute virt_image_type, virt_domain; ++ attribute virt_tmpfs_type; ++ attribute virt_ptynode; ++ type qemu_exec_t; ++ type virtlogd_t; + ') + +- type $1_t, svirt_lxc_domain; +- domain_type($1_t) ++ type $1_t, virt_domain; ++ application_domain($1_t, qemu_exec_t) + domain_user_exemption_target($1_t) + mls_rangetrans_target($1_t) + mcs_constrained($1_t) +- role svirt_lxc_domain_roles types $1_t; ++ role system_r types $1_t; ++ ++ type $1_devpts_t, virt_ptynode; ++ term_pty($1_devpts_t) ++ ++ kernel_read_system_state($1_t) ++ ++ auth_read_passwd($1_t) ++ ++ logging_send_syslog_msg($1_t) ++ ++ allow $1_t $1_devpts_t:chr_file { rw_chr_file_perms setattr_chr_file_perms }; ++ term_create_pty($1_t, $1_devpts_t) ++ ++ # Allow domain to write to pipes connected to virtlogd ++ allow $1_t virtlogd_t:fd use; ++ allow $1_t virtlogd_t:fifo_file rw_inherited_fifo_file_perms; + ') + + ######################################## + ## +-## Make the specified type virt image type. ++## Make the specified type usable as a virt image + ## + ## + ## +-## Type to be used as a virtual image. ++## Type to be used as a virtual image + ## + ## + # +@@ -125,31 +109,32 @@ interface(`virt_image',` + + typeattribute $1 virt_image_type; + files_type($1) ++ ++ # virt images can be assigned to blk devices + dev_node($1) + ') + +-######################################## ++####################################### + ## +-## Execute a domain transition to run virtd. ++## Getattr on virt executable. + ## + ## +-## +-## Domain allowed to transition. +-## ++## ++## Domain allowed to transition. ++## + ## + # +-interface(`virt_domtrans',` +- gen_require(` +- type virtd_t, virtd_exec_t; +- ') ++interface(`virt_getattr_exec',` ++ gen_require(` ++ type virtd_exec_t; ++ ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, virtd_exec_t, virtd_t) ++ allow $1 virtd_exec_t:file getattr; + ') + + ######################################## + ## +-## Execute a domain transition to run virt qmf. ++## Execute a domain transition to run virt. + ## + ## + ## +@@ -157,95 +142,71 @@ interface(`virt_domtrans',` + ## + ## + # +-interface(`virt_domtrans_qmf',` ++interface(`virt_domtrans',` + gen_require(` +- type virt_qmf_t, virt_qmf_exec_t; ++ type virtd_t, virtd_exec_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, virt_qmf_exec_t, virt_qmf_t) ++ domtrans_pattern($1, virtd_exec_t, virtd_t) + ') + + ######################################## + ## +-## Execute a domain transition to +-## run virt bridgehelper. ++## Execute virtd in the caller domain. + ## + ## + ## +-## Domain allowed to transition. ++## Domain allowed access. + ## + ## + # +-interface(`virt_domtrans_bridgehelper',` ++interface(`virt_exec',` + gen_require(` +- type virt_bridgehelper_t, virt_bridgehelper_exec_t; ++ type virtd_exec_t; + ') + +- corecmd_search_bin($1) +- domtrans_pattern($1, virt_bridgehelper_exec_t, virt_bridgehelper_t) ++ can_exec($1, virtd_exec_t) + ') + + ######################################## + ## +-## Execute bridgehelper in the bridgehelper +-## domain, and allow the specified role +-## the bridgehelper domain. ++## Transition to virt_qmf. + ## + ## +-## ++## + ## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. +-## ++## + ## + # +-interface(`virt_run_bridgehelper',` ++interface(`virt_domtrans_qmf',` + gen_require(` +- attribute_role virt_bridgehelper_roles; ++ type virt_qmf_t, virt_qmf_exec_t; + ') + +- virt_domtrans_bridgehelper($1) +- roleattribute $2 virt_bridgehelper_roles; ++ corecmd_search_bin($1) ++ domtrans_pattern($1, virt_qmf_exec_t, virt_qmf_t) + ') + + ######################################## + ## +-## Execute virt domain in the their +-## domain, and allow the specified +-## role that virt domain. ++## Transition to virt_bridgehelper. + ## + ## +-## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. +-## ++## ++## Domain allowed to transition. ++## + ## +-# +-interface(`virt_run_virt_domain',` ++interface(`virt_domtrans_bridgehelper',` + gen_require(` +- attribute virt_domain; +- attribute_role virt_domain_roles; ++ type virt_bridgehelper_t, virt_bridgehelper_exec_t; + ') + +- allow $1 virt_domain:process { signal transition }; +- roleattribute $2 virt_domain_roles; +- +- allow virt_domain $1:fd use; +- allow virt_domain $1:fifo_file rw_fifo_file_perms; +- allow virt_domain $1:process sigchld; ++ domtrans_pattern($1, virt_bridgehelper_exec_t, virt_bridgehelper_t) + ') + +-######################################## ++####################################### + ## +-## Send generic signals to all virt domains. ++## Connect to virt over a unix domain stream socket. + ## + ## + ## +@@ -253,17 +214,18 @@ interface(`virt_run_virt_domain',` + ## + ## + # +-interface(`virt_signal_all_virt_domains',` ++interface(`virt_stream_connect',` + gen_require(` +- attribute virt_domain; ++ type virtd_t, virt_var_run_t; + ') + +- allow $1 virt_domain:process signal; ++ files_search_pids($1) ++ stream_connect_pattern($1, virt_var_run_t, virt_var_run_t, virtd_t) + ') + +-######################################## ++####################################### + ## +-## Send kill signals to all virt domains. ++## Connect to svirt process over a unix domain stream socket. + ## + ## + ## +@@ -271,48 +233,36 @@ interface(`virt_signal_all_virt_domains',` + ## + ## + # +-interface(`virt_kill_all_virt_domains',` ++interface(`virt_stream_connect_svirt',` + gen_require(` +- attribute virt_domain; ++ type svirt_t; + ') + +- allow $1 virt_domain:process sigkill; ++ allow $1 svirt_t:unix_stream_socket connectto; + ') + + ######################################## + ## +-## Execute svirt lxc domains in their +-## domain, and allow the specified +-## role that svirt lxc domain. ++## Read and write to apmd unix ++## stream sockets. + ## + ## + ## +-## Domain allowed to transition. +-## +-## +-## +-## +-## Role allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`virt_run_svirt_lxc_domain',` ++interface(`virt_rw_stream_sockets_svirt',` + gen_require(` +- attribute svirt_lxc_domain; +- attribute_role svirt_lxc_domain_roles; ++ type svirt_t; + ') + +- allow $1 svirt_lxc_domain:process { signal transition }; +- roleattribute $2 svirt_lxc_domain_roles; +- +- allow svirt_lxc_domain $1:fd use; +- allow svirt_lxc_domain $1:fifo_file rw_fifo_file_perms; +- allow svirt_lxc_domain $1:process sigchld; ++ allow $1 svirt_t:unix_stream_socket { setopt getopt read write }; + ') + +-####################################### ++######################################## + ## +-## Get attributes of virtd executable files. ++## Allow domain to attach to virt TUN devices + ## + ## + ## +@@ -320,18 +270,18 @@ interface(`virt_run_svirt_lxc_domain',` + ## + ## + # +-interface(`virt_getattr_virtd_exec_files',` ++interface(`virt_attach_tun_iface',` + gen_require(` +- type virtd_exec_t; ++ type virtd_t; + ') + +- allow $1 virtd_exec_t:file getattr_file_perms; ++ allow $1 virtd_t:tun_socket relabelfrom; ++ allow $1 self:tun_socket relabelto; + ') + +-####################################### ++######################################## + ## +-## Connect to virt with a unix +-## domain stream socket. ++## Allow domain to attach to virt sandbox TUN devices + ## + ## + ## +@@ -339,18 +289,18 @@ interface(`virt_getattr_virtd_exec_files',` + ## + ## + # +-interface(`virt_stream_connect',` ++interface(`virt_attach_sandbox_tun_iface',` + gen_require(` +- type virtd_t, virt_var_run_t; ++ attribute svirt_sandbox_domain; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, virt_var_run_t, virt_var_run_t, virtd_t) ++ allow $1 svirt_sandbox_domain:tun_socket relabelfrom; ++ allow $1 self:tun_socket relabelto; + ') + + ######################################## + ## +-## Attach to virt tun devices. ++## Read virt config files. + ## + ## + ## +@@ -358,18 +308,20 @@ interface(`virt_stream_connect',` + ## + ## + # +-interface(`virt_attach_tun_iface',` ++interface(`virt_read_config',` + gen_require(` +- type virtd_t; ++ type virt_etc_t, virt_etc_rw_t; + ') + +- allow $1 virtd_t:tun_socket relabelfrom; +- allow $1 self:tun_socket relabelto; ++ files_search_etc($1) ++ read_files_pattern($1, virt_etc_t, virt_etc_t) ++ read_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) ++ read_lnk_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) + ') + + ######################################## + ## +-## Read virt configuration content. ++## manage virt config files. + ## + ## + ## +@@ -377,22 +329,20 @@ interface(`virt_attach_tun_iface',` + ## + ## + # +-interface(`virt_read_config',` ++interface(`virt_manage_config',` + gen_require(` + type virt_etc_t, virt_etc_rw_t; + ') + + files_search_etc($1) +- allow $1 { virt_etc_t virt_etc_rw_t }:dir list_dir_perms; +- read_files_pattern($1, virt_etc_t, virt_etc_t) +- read_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) +- read_lnk_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) ++ manage_files_pattern($1, virt_etc_t, virt_etc_t) ++ manage_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) ++ manage_lnk_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt configuration content. ++## Allow domain to manage virt image files + ## + ## + ## +@@ -400,22 +350,17 @@ interface(`virt_read_config',` + ## + ## + # +-interface(`virt_manage_config',` ++interface(`virt_getattr_content',` + gen_require(` +- type virt_etc_t, virt_etc_rw_t; ++ type virt_content_t; + ') + +- files_search_etc($1) +- allow $1 { virt_etc_t virt_etc_rw_t }:dir manage_dir_perms; +- manage_files_pattern($1, virt_etc_t, virt_etc_t) +- manage_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) +- manage_lnk_files_pattern($1, virt_etc_rw_t, virt_etc_rw_t) ++ allow $1 virt_content_t:file getattr_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt image files. ++## Allow domain to manage virt image files + ## + ## + ## +@@ -434,6 +379,7 @@ interface(`virt_read_content',` + read_files_pattern($1, virt_content_t, virt_content_t) + read_lnk_files_pattern($1, virt_content_t, virt_content_t) + read_blk_files_pattern($1, virt_content_t, virt_content_t) ++ read_chr_files_pattern($1, virt_content_t, virt_content_t) + + tunable_policy(`virt_use_nfs',` + fs_list_nfs($1) +@@ -450,8 +396,7 @@ interface(`virt_read_content',` + + ######################################## + ## +-## Create, read, write, and delete +-## virt content. ++## Allow domain to write virt image files + ## + ## + ## +@@ -459,35 +404,17 @@ interface(`virt_read_content',` + ## + ## + # +-interface(`virt_manage_virt_content',` ++interface(`virt_write_content',` + gen_require(` + type virt_content_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 virt_content_t:dir manage_dir_perms; +- allow $1 virt_content_t:file manage_file_perms; +- allow $1 virt_content_t:fifo_file manage_fifo_file_perms; +- allow $1 virt_content_t:lnk_file manage_lnk_file_perms; +- allow $1 virt_content_t:sock_file manage_sock_file_perms; +- allow $1 virt_content_t:blk_file manage_blk_file_perms; +- +- tunable_policy(`virt_use_nfs',` +- fs_manage_nfs_dirs($1) +- fs_manage_nfs_files($1) +- fs_manage_nfs_symlinks($1) +- ') +- +- tunable_policy(`virt_use_samba',` +- fs_manage_cifs_dirs($1) +- fs_manage_cifs_files($1) +- fs_manage_cifs_symlinks($1) +- ') ++ allow $1 virt_content_t:file write_file_perms; + ') + + ######################################## + ## +-## Relabel virt content. ++## Read virt PID symlinks files. + ## + ## + ## +@@ -495,53 +422,38 @@ interface(`virt_manage_virt_content',` + ## + ## + # +-interface(`virt_relabel_virt_content',` ++interface(`virt_read_pid_symlinks',` + gen_require(` +- type virt_content_t; ++ type virt_var_run_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 virt_content_t:dir relabel_dir_perms; +- allow $1 virt_content_t:file relabel_file_perms; +- allow $1 virt_content_t:fifo_file relabel_fifo_file_perms; +- allow $1 virt_content_t:lnk_file relabel_lnk_file_perms; +- allow $1 virt_content_t:sock_file relabel_sock_file_perms; +- allow $1 virt_content_t:blk_file relabel_blk_file_perms; ++ files_search_pids($1) ++ read_lnk_files_pattern($1, virt_var_run_t, virt_var_run_t) + ') + + ######################################## + ## +-## Create specified objects in user home +-## directories with the virt content type. ++## Read virt PID files. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`virt_home_filetrans_virt_content',` ++interface(`virt_read_pid_files',` + gen_require(` +- type virt_content_t; ++ type virt_var_run_t; + ') + +- virt_home_filetrans($1, virt_content_t, $2, $3) ++ files_search_pids($1) ++ read_files_pattern($1, virt_var_run_t, virt_var_run_t) ++ read_lnk_files_pattern($1, virt_var_run_t, virt_var_run_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## svirt home content. ++## Manage virt pid directories. + ## + ## + ## +@@ -549,34 +461,21 @@ interface(`virt_home_filetrans_virt_content',` + ## + ## + # +-interface(`virt_manage_svirt_home_content',` ++interface(`virt_manage_pid_dirs',` + gen_require(` +- type svirt_home_t; +- ') +- +- userdom_search_user_home_dirs($1) +- allow $1 svirt_home_t:dir manage_dir_perms; +- allow $1 svirt_home_t:file manage_file_perms; +- allow $1 svirt_home_t:fifo_file manage_fifo_file_perms; +- allow $1 svirt_home_t:lnk_file manage_lnk_file_perms; +- allow $1 svirt_home_t:sock_file manage_sock_file_perms; +- +- tunable_policy(`virt_use_nfs',` +- fs_manage_nfs_dirs($1) +- fs_manage_nfs_files($1) +- fs_manage_nfs_symlinks($1) ++ type virt_var_run_t; ++ type virt_lxc_var_run_t; + ') + +- tunable_policy(`virt_use_samba',` +- fs_manage_cifs_dirs($1) +- fs_manage_cifs_files($1) +- fs_manage_cifs_symlinks($1) +- ') ++ files_search_pids($1) ++ manage_dirs_pattern($1, virt_var_run_t, virt_var_run_t) ++ manage_dirs_pattern($1, virt_lxc_var_run_t, virt_lxc_var_run_t) ++ virt_filetrans_named_content($1) + ') + + ######################################## + ## +-## Relabel svirt home content. ++## Manage virt pid files. + ## + ## + ## +@@ -584,32 +483,36 @@ interface(`virt_manage_svirt_home_content',` + ## + ## + # +-interface(`virt_relabel_svirt_home_content',` ++interface(`virt_manage_pid_files',` + gen_require(` +- type svirt_home_t; ++ type virt_var_run_t; ++ type virt_lxc_var_run_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 svirt_home_t:dir relabel_dir_perms; +- allow $1 svirt_home_t:file relabel_file_perms; +- allow $1 svirt_home_t:fifo_file relabel_fifo_file_perms; +- allow $1 svirt_home_t:lnk_file relabel_lnk_file_perms; +- allow $1 svirt_home_t:sock_file relabel_sock_file_perms; ++ files_search_pids($1) ++ manage_files_pattern($1, virt_var_run_t, virt_var_run_t) ++ manage_files_pattern($1, virt_lxc_var_run_t, virt_lxc_var_run_t) + ') + + ######################################## + ## +-## Create specified objects in user home +-## directories with the svirt home type. ++## Create objects in the pid directory ++## with a private type with a type transition. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## ++## ++## ++## Type to which the created node will be transitioned. ++## ++## ++## + ## +-## Class of the object being created. ++## Object class(es) (single or set including {}) for which this ++## the transition will occur. + ## + ## + ## +@@ -618,54 +521,36 @@ interface(`virt_relabel_svirt_home_content',` + ## + ## + # +-interface(`virt_home_filetrans_svirt_home',` ++interface(`virt_pid_filetrans',` + gen_require(` +- type svirt_home_t; ++ type virt_var_run_t; + ') + +- virt_home_filetrans($1, svirt_home_t, $2, $3) ++ filetrans_pattern($1, virt_var_run_t, $2, $3, $4) + ') + + ######################################## + ## +-## Create specified objects in generic +-## virt home directories with private +-## home type. ++## Search virt lib directories. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Private file type. +-## +-## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`virt_home_filetrans',` ++interface(`virt_search_lib',` + gen_require(` +- type virt_home_t; ++ type virt_var_lib_t; + ') + +- userdom_search_user_home_dirs($1) +- filetrans_pattern($1, virt_home_t, $2, $3, $4) ++ allow $1 virt_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt home files. ++## Read virt lib files. + ## + ## + ## +@@ -673,54 +558,572 @@ interface(`virt_home_filetrans',` + ## + ## + # +-interface(`virt_manage_home_files',` ++interface(`virt_read_lib_files',` + gen_require(` +- type virt_home_t; ++ type virt_var_lib_t; + ') + +- userdom_search_user_home_dirs($1) +- manage_files_pattern($1, virt_home_t, virt_home_t) ++ files_search_var_lib($1) ++ read_files_pattern($1, virt_var_lib_t, virt_var_lib_t) ++ list_dirs_pattern($1, virt_var_lib_t, virt_var_lib_t) ++ read_lnk_files_pattern($1, virt_var_lib_t, virt_var_lib_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt home content. ++## Dontaudit inherited read virt lib files. + ## + ## + ## +-## Domain allowed access. ++## Domain to not audit. + ## + ## + # +-interface(`virt_manage_generic_virt_home_content',` ++interface(`virt_dontaudit_read_lib_files',` + gen_require(` +- type virt_home_t; ++ type virt_var_lib_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 virt_home_t:dir manage_dir_perms; +- allow $1 virt_home_t:file manage_file_perms; +- allow $1 virt_home_t:fifo_file manage_fifo_file_perms; +- allow $1 virt_home_t:lnk_file manage_lnk_file_perms; +- allow $1 virt_home_t:sock_file manage_sock_file_perms; ++ dontaudit $1 virt_var_lib_t:file read_inherited_file_perms; ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## virt lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_lib_files',` ++ gen_require(` ++ type virt_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, virt_var_lib_t, virt_var_lib_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read virt's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`virt_read_log',` ++ gen_require(` ++ type virt_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, virt_log_t, virt_log_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to append ++## virt log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_append_log',` ++ gen_require(` ++ type virt_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, virt_log_t, virt_log_t) ++') ++ ++######################################## ++## ++## Allow domain to manage virt log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_log',` ++ gen_require(` ++ type virt_log_t; ++ ') ++ ++ manage_dirs_pattern($1, virt_log_t, virt_log_t) ++ manage_files_pattern($1, virt_log_t, virt_log_t) ++ manage_lnk_files_pattern($1, virt_log_t, virt_log_t) ++') ++ ++######################################## ++## ++## Allow domain to getattr virt image direcories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_getattr_images',` ++ gen_require(` ++ attribute virt_image_type; ++ ') ++ ++ virt_search_lib($1) ++ allow $1 virt_image_type:file getattr_file_perms; ++') ++ ++######################################## ++## ++## Allow domain to search virt image direcories ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_search_images',` ++ gen_require(` ++ attribute virt_image_type; ++ ') ++ ++ virt_search_lib($1) ++ allow $1 virt_image_type:dir search_dir_perms; ++') ++ ++######################################## ++## ++## Allow domain to read virt image files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_read_images',` ++ gen_require(` ++ type virt_var_lib_t; ++ attribute virt_image_type; ++ ') ++ ++ virt_search_lib($1) ++ allow $1 virt_image_type:dir list_dir_perms; ++ list_dirs_pattern($1, virt_image_type, virt_image_type) ++ read_files_pattern($1, virt_image_type, virt_image_type) ++ read_lnk_files_pattern($1, virt_image_type, virt_image_type) ++ read_blk_files_pattern($1, virt_image_type, virt_image_type) ++ read_chr_files_pattern($1, virt_image_type, virt_image_type) + + tunable_policy(`virt_use_nfs',` +- fs_manage_nfs_dirs($1) +- fs_manage_nfs_files($1) +- fs_manage_nfs_symlinks($1) ++ fs_list_nfs($1) ++ fs_read_nfs_files($1) ++ fs_read_nfs_symlinks($1) ++ ') ++ ++ tunable_policy(`virt_use_samba',` ++ fs_list_cifs($1) ++ fs_read_cifs_files($1) ++ fs_read_cifs_symlinks($1) ++ ') ++') ++ ++######################################## ++## ++## Allow domain to read virt blk image files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_read_blk_images',` ++ gen_require(` ++ attribute virt_image_type; ++ ') ++ ++ read_blk_files_pattern($1, virt_image_type, virt_image_type) ++') ++ ++######################################## ++## ++## Allow domain to read/write virt image chr files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_rw_chr_files',` ++ gen_require(` ++ attribute virt_image_type; ++ ') ++ ++ rw_chr_files_pattern($1, virt_image_type, virt_image_type) ++') ++ ++######################################## ++## ++## Create, read, write, and delete ++## svirt cache files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_cache',` ++ gen_require(` ++ type virt_cache_t; ++ ') ++ ++ files_search_var($1) ++ manage_dirs_pattern($1, virt_cache_t, virt_cache_t) ++ manage_files_pattern($1, virt_cache_t, virt_cache_t) ++ manage_lnk_files_pattern($1, virt_cache_t, virt_cache_t) ++') ++ ++######################################## ++## ++## Allow domain to manage virt image files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_images',` ++ gen_require(` ++ type virt_var_lib_t; ++ attribute virt_image_type; ++ ') ++ ++ virt_search_lib($1) ++ allow $1 virt_image_type:dir list_dir_perms; ++ manage_dirs_pattern($1, virt_image_type, virt_image_type) ++ manage_files_pattern($1, virt_image_type, virt_image_type) ++ read_lnk_files_pattern($1, virt_image_type, virt_image_type) ++ rw_blk_files_pattern($1, virt_image_type, virt_image_type) ++ rw_chr_files_pattern($1, virt_image_type, virt_image_type) ++') ++ ++####################################### ++## ++## Allow domain to manage virt image files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_default_image_type',` ++ gen_require(` ++ type virt_var_lib_t; ++ type virt_image_t; ++ ') ++ ++ virt_search_lib($1) ++ manage_dirs_pattern($1, virt_image_t, virt_image_t) ++ manage_files_pattern($1, virt_image_t, virt_image_t) ++ read_lnk_files_pattern($1, virt_image_t, virt_image_t) ++') ++ ++######################################## ++## ++## Execute virt server in the virt domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`virt_systemctl',` ++ gen_require(` ++ type virtd_unit_file_t; ++ type virtd_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 virtd_unit_file_t:file read_file_perms; ++ allow $1 virtd_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, virtd_t) ++') ++ ++######################################## ++## ++## Ptrace the svirt domain ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`virt_ptrace',` ++ gen_require(` ++ attribute virt_domain; ++ ') ++ ++ allow $1 virt_domain:process ptrace; ++') ++ ++####################################### ++## ++## Execute Sandbox Files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_exec_sandbox_files',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ can_exec($1, container_file_t) ++') ++ ++######################################## ++## ++## Allow any container_file_t to be an entrypoint of this domain ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`virt_sandbox_entrypoint',` ++ gen_require(` ++ type container_file_t; ++ ') ++ allow $1 container_file_t:file entrypoint; ++') ++ ++####################################### ++## ++## Read Sandbox Files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_read_sandbox_files',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ list_dirs_pattern($1, container_file_t, container_file_t) ++ read_files_pattern($1, container_file_t, container_file_t) ++ read_lnk_files_pattern($1, container_file_t, container_file_t) ++') ++ ++####################################### ++## ++## Manage Sandbox Files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_manage_sandbox_files',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ manage_dirs_pattern($1, container_file_t, container_file_t) ++ manage_files_pattern($1, container_file_t, container_file_t) ++ manage_fifo_files_pattern($1, container_file_t, container_file_t) ++ manage_chr_files_pattern($1, container_file_t, container_file_t) ++ manage_lnk_files_pattern($1, container_file_t, container_file_t) ++ allow $1 container_file_t:dir_file_class_set { relabelfrom relabelto }; ++') ++ ++####################################### ++## ++## Getattr Sandbox File systems ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_getattr_sandbox_filesystem',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ allow $1 container_file_t:filesystem getattr; ++') ++ ++####################################### ++## ++## Relabel Sandbox File systems ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_relabel_sandbox_filesystem',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ allow $1 container_file_t:filesystem { relabelfrom relabelto }; ++') ++ ++####################################### ++## ++## Mounton Sandbox Files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_mounton_sandbox_file',` ++ gen_require(` ++ type container_file_t; ++ ') ++ ++ allow $1 container_file_t:dir_file_class_set mounton; ++') ++ ++####################################### ++## ++## Connect to virt over a unix domain stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_stream_connect_sandbox',` ++ gen_require(` ++ attribute svirt_sandbox_domain; ++ type container_file_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, container_file_t, container_file_t, svirt_sandbox_domain) ++ ps_process_pattern(svirt_sandbox_domain, $1) ++') ++ ++######################################## ++## ++## Execute qemu in the svirt domain, and ++## allow the specified role the svirt domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the sandbox domain. ++## ++## ++## ++# ++interface(`virt_transition_svirt',` ++ gen_require(` ++ attribute virt_domain; ++ type virt_bridgehelper_t; ++ type svirt_image_t; ++ type svirt_socket_t; ++ ') ++ ++ allow $1 virt_domain:process transition; ++ role $2 types virt_domain; ++ role $2 types virt_bridgehelper_t; ++ role $2 types svirt_socket_t; ++ ++ allow $1 virt_domain:process { sigkill sigstop signull signal }; ++ allow $1 svirt_image_t:file { relabelfrom relabelto }; ++ allow $1 svirt_image_t:fifo_file { read_fifo_file_perms relabelto }; ++ allow $1 svirt_image_t:sock_file { create_sock_file_perms relabelto }; ++ allow $1 svirt_socket_t:unix_stream_socket create_stream_socket_perms; ++ ++ optional_policy(` ++ ptchown_run(virt_domain, $2) ++ ') ++') ++ ++######################################## ++## ++## Do not audit attempts to write virt daemon unnamed pipes. ++## ++## ++## ++## Domain to not audit. ++## ++## ++# ++interface(`virt_dontaudit_write_pipes',` ++ gen_require(` ++ type virtd_t; ++ ') ++ ++ dontaudit $1 virtd_t:fd use; ++ dontaudit $1 virtd_t:fifo_file write_fifo_file_perms; ++') ++ ++######################################## ++## ++## Send a sigkill to virtual machines ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_kill_svirt',` ++ gen_require(` ++ attribute virt_domain; + ') + +- tunable_policy(`virt_use_samba',` +- fs_manage_cifs_dirs($1) +- fs_manage_cifs_files($1) +- fs_manage_cifs_symlinks($1) +- ') ++ allow $1 virt_domain:process sigkill; + ') + + ######################################## + ## +-## Relabel virt home content. ++## Send a sigkill to virtd daemon. + ## + ## + ## +@@ -728,52 +1131,35 @@ interface(`virt_manage_generic_virt_home_content',` + ## + ## + # +-interface(`virt_relabel_generic_virt_home_content',` ++interface(`virt_kill',` + gen_require(` +- type virt_home_t; ++ type virtd_t; + ') + +- userdom_search_user_home_dirs($1) +- allow $1 virt_home_t:dir relabel_dir_perms; +- allow $1 virt_home_t:file relabel_file_perms; +- allow $1 virt_home_t:fifo_file relabel_fifo_file_perms; +- allow $1 virt_home_t:lnk_file relabel_lnk_file_perms; +- allow $1 virt_home_t:sock_file relabel_sock_file_perms; ++ allow $1 virtd_t:process sigkill; + ') + + ######################################## + ## +-## Create specified objects in user home +-## directories with the generic virt +-## home type. ++## Send a signal to virtd daemon. + ## + ## + ## + ## Domain allowed access. + ## + ## +-## +-## +-## Class of the object being created. +-## +-## +-## +-## +-## The name of the object being created. +-## +-## + # +-interface(`virt_home_filetrans_virt_home',` ++interface(`virt_signal',` + gen_require(` +- type virt_home_t; ++ type virtd_t; + ') + +- userdom_user_home_dir_filetrans($1, virt_home_t, $2, $3) ++ allow $1 virtd_t:process signal; + ') + + ######################################## + ## +-## Read virt pid files. ++## Send null signal to virtd daemon. + ## + ## + ## +@@ -781,19 +1167,17 @@ interface(`virt_home_filetrans_virt_home',` + ## + ## + # +-interface(`virt_read_pid_files',` ++interface(`virt_signull',` + gen_require(` +- type virt_var_run_t; ++ type virtd_t; + ') + +- files_search_pids($1) +- read_files_pattern($1, virt_var_run_t, virt_var_run_t) ++ allow $1 virtd_t:process signull; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt pid files. ++## Send a signal to virtual machines + ## + ## + ## +@@ -801,18 +1185,17 @@ interface(`virt_read_pid_files',` + ## + ## + # +-interface(`virt_manage_pid_files',` ++interface(`virt_signal_svirt',` + gen_require(` +- type virt_var_run_t; ++ attribute virt_domain; + ') + +- files_search_pids($1) +- manage_files_pattern($1, virt_var_run_t, virt_var_run_t) ++ allow $1 virt_domain:process signal; + ') + + ######################################## + ## +-## Search virt lib directories. ++## Send a signal to sandbox domains + ## + ## + ## +@@ -820,18 +1203,17 @@ interface(`virt_manage_pid_files',` + ## + ## + # +-interface(`virt_search_lib',` ++interface(`virt_signal_sandbox',` + gen_require(` +- type virt_var_lib_t; ++ attribute svirt_sandbox_domain; + ') + +- files_search_var_lib($1) +- allow $1 virt_var_lib_t:dir search_dir_perms; ++ allow $1 svirt_sandbox_domain:process signal; + ') + + ######################################## + ## +-## Read virt lib files. ++## Manage virt home files. + ## + ## + ## +@@ -839,192 +1221,223 @@ interface(`virt_search_lib',` + ## + ## + # +-interface(`virt_read_lib_files',` ++interface(`virt_manage_home_files',` + gen_require(` +- type virt_var_lib_t; ++ type virt_home_t; + ') + +- files_search_var_lib($1) +- read_files_pattern($1, virt_var_lib_t, virt_var_lib_t) +- read_lnk_files_pattern($1, virt_var_lib_t, virt_var_lib_t) ++ userdom_search_user_home_dirs($1) ++ manage_files_pattern($1, virt_home_t, virt_home_t) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt lib files. ++## allow domain to read ++## virt tmpfs files + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access + ## + ## + # +-interface(`virt_manage_lib_files',` ++interface(`virt_read_tmpfs_files',` + gen_require(` +- type virt_var_lib_t; ++ attribute virt_tmpfs_type; + ') + +- files_search_var_lib($1) +- manage_files_pattern($1, virt_var_lib_t, virt_var_lib_t) ++ allow $1 virt_tmpfs_type:file read_file_perms; + ') + + ######################################## + ## +-## Create objects in virt pid +-## directories with a private type. ++## allow domain to manage ++## virt tmpfs files + ## + ## + ## +-## Domain allowed access. +-## +-## +-## +-## +-## The type of the object to be created. ++## Domain allowed access + ## + ## +-## ++# ++interface(`virt_manage_tmpfs_files',` ++ gen_require(` ++ attribute virt_tmpfs_type; ++ ') ++ ++ allow $1 virt_tmpfs_type:file manage_file_perms; ++') ++ ++######################################## ++## ++## Create .virt directory in the user home directory ++## with an correct label. ++## ++## + ## +-## The object class of the object being created. ++## Domain allowed access. + ## + ## +-## ++# ++interface(`virt_filetrans_home_content',` ++ gen_require(` ++ type virt_home_t; ++ type svirt_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, virt_home_t, dir, ".libvirt") ++ userdom_user_home_dir_filetrans($1, virt_home_t, dir, ".virtinst") ++ filetrans_pattern($1, virt_home_t, svirt_home_t, dir, "qemu") ++ ++ optional_policy(` ++ gnome_config_filetrans($1, virt_home_t, dir, "libvirt") ++ gnome_cache_filetrans($1, virt_home_t, dir, "libvirt") ++ gnome_cache_filetrans($1, virt_home_t, dir, "libvirt-sandbox") ++ gnome_cache_filetrans($1, virt_home_t, dir, "gnome-boxes") ++ gnome_data_filetrans($1, svirt_home_t, dir, "images") ++ gnome_data_filetrans($1, svirt_home_t, dir, "boot") ++ ') ++') ++ ++######################################## ++## ++## Dontaudit attempts to Read virt_image_type devices. ++## ++## + ## +-## The name of the object being created. ++## Domain allowed access. + ## + ## +-## + # +-interface(`virt_pid_filetrans',` ++interface(`virt_dontaudit_read_chr_dev',` + gen_require(` +- type virt_var_run_t; ++ attribute virt_image_type; + ') + +- files_search_pids($1) +- filetrans_pattern($1, virt_var_run_t, $2, $3, $4) ++ dontaudit $1 virt_image_type:chr_file read_chr_file_perms; + ') + + ######################################## + ## +-## Read virt log files. ++## Creates types and rules for a basic ++## virt_lxc process domain. + ## +-## ++## + ## +-## Domain allowed access. ++## Prefix for the domain. + ## + ## +-## + # +-interface(`virt_read_log',` ++template(`virt_sandbox_domain_template',` + gen_require(` +- type virt_log_t; ++ attribute svirt_sandbox_domain; + ') + +- logging_search_logs($1) +- read_files_pattern($1, virt_log_t, virt_log_t) ++ type $1_t, svirt_sandbox_domain; ++ domain_type($1_t) ++ domain_user_exemption_target($1_t) ++ mls_rangetrans_target($1_t) ++ mcs_constrained($1_t) ++ role system_r types $1_t; ++ ++ logging_send_syslog_msg($1_t) ++ ++ kernel_read_system_state($1_t) + ') + + ######################################## + ## +-## Append virt log files. ++## Make the specified type usable as a lxc domain + ## +-## ++## + ## +-## Domain allowed access. ++## Type to be used as a lxc domain + ## + ## + # +-interface(`virt_append_log',` ++template(`virt_sandbox_domain',` + gen_require(` +- type virt_log_t; ++ attribute svirt_sandbox_domain; + ') + +- logging_search_logs($1) +- append_files_pattern($1, virt_log_t, virt_log_t) ++ typeattribute $1 svirt_sandbox_domain; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt log files. ++## Execute a qemu_exec_t in the callers domain + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # +-interface(`virt_manage_log',` ++interface(`virt_exec_qemu',` + gen_require(` +- type virt_log_t; ++ type qemu_exec_t; + ') + +- logging_search_logs($1) +- manage_dirs_pattern($1, virt_log_t, virt_log_t) +- manage_files_pattern($1, virt_log_t, virt_log_t) +- manage_lnk_files_pattern($1, virt_log_t, virt_log_t) ++ can_exec($1, qemu_exec_t) + ') + + ######################################## + ## +-## Search virt image directories. ++## Transition to virt named content + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access. + ## + ## + # +-interface(`virt_search_images',` ++interface(`virt_filetrans_named_content',` + gen_require(` +- attribute virt_image_type; ++ type virt_lxc_var_run_t; ++ type virt_var_run_t; + ') + +- virt_search_lib($1) +- allow $1 virt_image_type:dir search_dir_perms; ++ files_pid_filetrans($1, virt_lxc_var_run_t, dir, "libvirt-sandbox") ++ files_pid_filetrans($1, virt_var_run_t, dir, "libvirt") ++ files_pid_filetrans($1, virt_var_run_t, dir, "libguestfs") + ') + + ######################################## + ## +-## Read virt image files. ++## Execute qemu in the svirt domain, and ++## allow the specified role the svirt domain. + ## + ## + ## +-## Domain allowed access. ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the sandbox domain. + ## + ## ++## + # +-interface(`virt_read_images',` ++interface(`virt_transition_svirt_sandbox',` + gen_require(` +- type virt_var_lib_t; +- attribute virt_image_type; ++ attribute svirt_sandbox_domain; + ') + +- virt_search_lib($1) +- allow $1 virt_image_type:dir list_dir_perms; +- list_dirs_pattern($1, virt_image_type, virt_image_type) +- read_files_pattern($1, virt_image_type, virt_image_type) +- read_lnk_files_pattern($1, virt_image_type, virt_image_type) +- read_blk_files_pattern($1, virt_image_type, virt_image_type) ++ allow $1 svirt_sandbox_domain:process { transition signal_perms }; ++ role $2 types svirt_sandbox_domain; ++ allow $1 svirt_sandbox_domain:unix_dgram_socket sendto; + +- tunable_policy(`virt_use_nfs',` +- fs_list_nfs($1) +- fs_read_nfs_files($1) +- fs_read_nfs_symlinks($1) +- ') ++ allow svirt_sandbox_domain $1:fd use; + +- tunable_policy(`virt_use_samba',` +- fs_list_cifs($1) +- fs_read_cifs_files($1) +- fs_read_cifs_symlinks($1) +- ') ++ allow svirt_sandbox_domain $1:fifo_file rw_fifo_file_perms; ++ allow svirt_sandbox_domain $1:process sigchld; ++ ps_process_pattern($1, svirt_sandbox_domain) + ') + + ######################################## + ## +-## Read and write all virt image +-## character files. ++## Read the process state of virt sandbox containers + ## + ## + ## +@@ -1032,20 +1445,17 @@ interface(`virt_read_images',` + ## + ## + # +-interface(`virt_rw_all_image_chr_files',` ++interface(`virt_sandbox_read_state',` + gen_require(` +- attribute virt_image_type; ++ attribute svirt_sandbox_domain; + ') + +- virt_search_lib($1) +- allow $1 virt_image_type:dir list_dir_perms; +- rw_chr_files_pattern($1, virt_image_type, virt_image_type) ++ ps_process_pattern($1, svirt_sandbox_domain) + ') + + ######################################## + ## +-## Create, read, write, and delete +-## svirt cache files. ++## Read and write to svirt_image devices. + ## + ## + ## +@@ -1053,15 +1463,17 @@ interface(`virt_rw_all_image_chr_files',` + ## + ## + # +-interface(`virt_manage_svirt_cache',` +- refpolicywarn(`$0($*) has been deprecated, use virt_manage_virt_cache() instead.') +- virt_manage_virt_cache($1) ++interface(`virt_rw_svirt_dev',` ++ gen_require(` ++ type svirt_image_t; ++ ') ++ ++ allow $1 svirt_image_t:chr_file rw_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt cache content. ++## Read and write to svirt_images. + ## + ## + ## +@@ -1069,21 +1481,17 @@ interface(`virt_manage_svirt_cache',` + ## + ## + # +-interface(`virt_manage_virt_cache',` ++interface(`virt_rw_svirt_image',` + gen_require(` +- type virt_cache_t; ++ type svirt_image_t; + ') + +- files_search_var($1) +- manage_dirs_pattern($1, virt_cache_t, virt_cache_t) +- manage_files_pattern($1, virt_cache_t, virt_cache_t) +- manage_lnk_files_pattern($1, virt_cache_t, virt_cache_t) ++ allow $1 svirt_image_t:file rw_file_perms; + ') + + ######################################## + ## +-## Create, read, write, and delete +-## virt image files. ++## Read and write to svirt_image devices. + ## + ## + ## +@@ -1091,36 +1499,36 @@ interface(`virt_manage_virt_cache',` + ## + ## + # +-interface(`virt_manage_images',` ++interface(`virt_rlimitinh',` + gen_require(` +- type virt_var_lib_t; +- attribute virt_image_type; ++ type virtd_t; + ') + +- virt_search_lib($1) +- allow $1 virt_image_type:dir list_dir_perms; +- manage_dirs_pattern($1, virt_image_type, virt_image_type) +- manage_files_pattern($1, virt_image_type, virt_image_type) +- read_lnk_files_pattern($1, virt_image_type, virt_image_type) +- rw_blk_files_pattern($1, virt_image_type, virt_image_type) ++ allow $1 virtd_t:process { rlimitinh }; ++') + +- tunable_policy(`virt_use_nfs',` +- fs_manage_nfs_dirs($1) +- fs_manage_nfs_files($1) +- fs_read_nfs_symlinks($1) ++######################################## ++## ++## Read and write to svirt_image devices. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_noatsecure',` ++ gen_require(` ++ type virtd_t; + ') + +- tunable_policy(`virt_use_samba',` +- fs_manage_cifs_files($1) +- fs_manage_cifs_files($1) +- fs_read_cifs_symlinks($1) +- ') ++ allow $1 virtd_t:process { noatsecure rlimitinh }; + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an virt environment. ++## All of the rules required to administrate ++## an virt environment + ## + ## + ## +@@ -1136,50 +1544,137 @@ interface(`virt_manage_images',` + # + interface(`virt_admin',` + gen_require(` +- attribute virt_domain, virt_image_type, virt_tmpfs_type; +- attribute virt_ptynode, svirt_lxc_domain, virt_tmp_type; +- type virtd_t, virtd_initrc_exec_t, virtd_lxc_t; +- type virsh_t, virtd_lxc_var_run_t, svirt_lxc_file_t; +- type virt_bridgehelper_t, virt_qmf_t, virt_var_lib_t; +- type virt_var_run_t, virt_tmp_t, virt_log_t; +- type virt_lock_t, svirt_var_run_t, virt_etc_rw_t; +- type virt_etc_t, svirt_cache_t, virtd_keytab_t; ++ attribute virt_domain; ++ attribute virt_system_domain; ++ attribute svirt_file_type; ++ attribute virt_file_type; ++ type virtd_initrc_exec_t; + ') + +- allow $1 { virt_domain svirt_lxc_domain virtd_t }:process { ptrace signal_perms }; +- allow $1 { virtd_lxc_t virsh_t virt_bridgehelper_t virt_qmf_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { virt_domain svirt_lxc_domain virtd_t }) +- ps_process_pattern($1, { virtd_lxc_t virsh_t virt_bridgehelper_t virt_qmf_t }) ++ allow $1 virt_system_domain:process signal_perms; ++ allow $1 virt_domain:process signal_perms; ++ ps_process_pattern($1, virt_system_domain) ++ ps_process_pattern($1, virt_domain) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 virt_system_domain:process ptrace; ++ allow $1 virt_domain:process ptrace; ++ ') + + init_labeled_script_domtrans($1, virtd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 virtd_initrc_exec_t system_r; + allow $2 system_r; + +- fs_search_tmpfs($1) +- admin_pattern($1, virt_tmpfs_type) ++ allow $1 virt_domain:process signal_perms; + +- files_search_tmp($1) +- admin_pattern($1, { virt_tmp_type virt_tmp_t }) ++ admin_pattern($1, virt_file_type) ++ admin_pattern($1, svirt_file_type) + +- files_search_etc($1) +- admin_pattern($1, { virt_etc_t virt_etc_rw_t virtd_keytab_t }) ++ virt_systemctl($1) ++ allow $1 virtd_unit_file_t:service all_service_perms; + +- logging_search_logs($1) +- admin_pattern($1, virt_log_t) ++ virt_stream_connect_sandbox($1) ++ virt_stream_connect_svirt($1) ++ virt_stream_connect($1) ++') ++####################################### ++## ++## Getattr on virt executable. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`virt_default_capabilities',` ++ gen_require(` ++ attribute sandbox_caps_domain; ++ ') + +- files_search_pids($1) +- admin_pattern($1, { virt_var_run_t virtd_lxc_var_run_t svirt_var_run_t }) ++ typeattribute $1 sandbox_caps_domain; ++') + +- files_search_var($1) +- admin_pattern($1, svirt_cache_t) + +- files_search_var_lib($1) +- admin_pattern($1, { virt_image_type virt_var_lib_t svirt_lxc_file_t }) ++######################################## ++## ++## Send and receive messages from ++## virt over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_dbus_chat',` ++ gen_require(` ++ type virtd_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 virtd_t:dbus send_msg; ++ allow virtd_t $1:dbus send_msg; ++ ps_process_pattern(virtd_t, $1) ++') ++ ++ ++######################################## ++## ++## Dontaudit read the process state (/proc/pid) of libvirt ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_dontaudit_read_state',` ++ gen_require(` ++ type virtd_t; ++ ') ++ ++ dontaudit $1 virtd_t:dir search_dir_perms; ++ dontaudit $1 virtd_t:file read_file_perms; ++ dontaudit $1 virtd_t:lnk_file read_lnk_file_perms; ++') ++ ++####################################### ++## ++## Send to libvirt with a unix dgram socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_dgram_send',` ++ gen_require(` ++ type virtd_t, virt_var_run_t; ++ ') + +- files_search_locks($1) +- admin_pattern($1, virt_lock_t) ++ files_search_pids($1) ++ dgram_send_pattern($1, virt_var_run_t, virt_var_run_t, virtd_t) ++') + +- dev_list_all_dev_nodes($1) +- allow $1 virt_ptynode:chr_file rw_term_perms; ++######################################## ++## ++## Manage svirt tmp files,dirs and sockfiles. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`virt_svirt_manage_tmp',` ++ gen_require(` ++ type svirt_tmp_t; ++ ') ++ ++ manage_files_pattern($1, svirt_tmp_t, svirt_tmp_t) ++ manage_dirs_pattern($1, svirt_tmp_t, svirt_tmp_t) ++ manage_sock_files_pattern($1, svirt_tmp_t, svirt_tmp_t) + ') ++ +diff --git a/virt.te b/virt.te +index f03dcf5673..2f3c112159 100644 +--- a/virt.te ++++ b/virt.te +@@ -1,451 +1,401 @@ +-policy_module(virt, 1.7.4) ++policy_module(virt, 1.5.0) + + ######################################## + # + # Declarations + # + ++gen_require(` ++ class passwd rootok; ++ class passwd passwd; ++') ++ ++attribute virsh_transition_domain; ++attribute virt_ptynode; ++attribute virt_system_domain; ++attribute virt_domain; ++attribute virt_image_type; ++attribute virt_tmpfs_type; ++attribute svirt_file_type; ++attribute virt_file_type; ++attribute sandbox_net_domain; ++attribute sandbox_caps_domain; ++ ++type svirt_tmp_t, svirt_file_type; ++files_tmp_file(svirt_tmp_t) ++ ++type svirt_tmpfs_t, virt_tmpfs_type, svirt_file_type; ++files_tmpfs_file(svirt_tmpfs_t) ++ ++type svirt_image_t, virt_image_type, svirt_file_type; ++files_type(svirt_image_t) ++dev_node(svirt_image_t) ++dev_associate_sysfs(svirt_image_t) ++ + ## +-##

      +-## Determine whether confined virtual guests +-## can use serial/parallel communication ports. +-##

      ++##

      ++## Allow confined virtual guests to use serial/parallel communication ports ++##

      + ##
      + gen_tunable(virt_use_comm, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can use executable memory and can make +-## their stack executable. +-##

      ++##

      ++## Allow virtual processes to run as userdomains ++##

      ++##
      ++gen_tunable(virt_transition_userdomain, false) ++ ++## ++##

      ++## Allow confined virtual guests to use executable memory and executable stack ++##

      + ##
      + gen_tunable(virt_use_execmem, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can use fuse file systems. +-##

      ++##

      ++## Allow confined virtual guests to read fuse files ++##

      + ##
      + gen_tunable(virt_use_fusefs, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can use nfs file systems. +-##

      ++##

      ++## Allow confined virtual guests to use glusterd ++##

      ++##
      ++gen_tunable(virt_use_glusterd, false) ++ ++## ++##

      ++## Allow confined virtual guests to manage nfs files ++##

      + ##
      + gen_tunable(virt_use_nfs, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can use cifs file systems. +-##

      ++##

      ++## Allow confined virtual guests to manage cifs files ++##

      + ##
      + gen_tunable(virt_use_samba, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can manage device configuration. +-##

      ++##

      ++## Allow confined virtual guests to interact with the sanlock ++##

      + ##
      +-gen_tunable(virt_use_sysfs, false) ++gen_tunable(virt_use_sanlock, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can use usb devices. +-##

      ++##

      ++## Allow confined virtual guests to interact with rawip sockets ++##

      + ##
      +-gen_tunable(virt_use_usb, false) ++gen_tunable(virt_use_rawip, false) + + ## +-##

      +-## Determine whether confined virtual guests +-## can interact with xserver. +-##

      ++##

      ++## Allow confined virtual guests to interact with the xserver ++##

      + ##
      + gen_tunable(virt_use_xserver, false) + +-attribute virt_ptynode; +-attribute virt_domain; +-attribute virt_image_type; +-attribute virt_tmp_type; +-attribute virt_tmpfs_type; ++## ++##

      ++## Allow confined virtual guests to use usb devices ++##

      ++##
      ++gen_tunable(virt_use_usb, true) ++ ++## ++##

      ++## Allow sandbox containers to send audit messages ++ ++##

      ++##
      ++gen_tunable(virt_sandbox_use_audit, true) ++ ++## ++##

      ++## Allow sandbox containers to use netlink system calls ++##

      ++##
      ++gen_tunable(virt_sandbox_use_netlink, false) ++ ++## ++##

      ++## Allow sandbox containers to use sys_admin system calls, for example mount ++##

      ++##
      ++gen_tunable(virt_sandbox_use_sys_admin, false) + +-attribute svirt_lxc_domain; ++## ++##

      ++## Allow sandbox containers to use mknod system calls ++##

      ++##
      ++gen_tunable(virt_sandbox_use_mknod, false) ++ ++## ++##

      ++## Allow sandbox containers to use all capabilities ++##

      ++##
      ++gen_tunable(virt_sandbox_use_all_caps, true) + +-attribute_role virt_domain_roles; +-roleattribute system_r virt_domain_roles; ++## ++##

      ++## Allow qemu-ga to read qemu-ga date. ++##

      ++##
      ++gen_tunable(virt_read_qemu_ga_data, false) + +-attribute_role virt_bridgehelper_roles; +-roleattribute system_r virt_bridgehelper_roles; ++## ++##

      ++## Allow qemu-ga to manage qemu-ga date. ++##

      ++##
      ++gen_tunable(virt_rw_qemu_ga_data, false) + +-attribute_role svirt_lxc_domain_roles; +-roleattribute system_r svirt_lxc_domain_roles; ++## ++##

      ++## Allow sandbox containers manage fuse files ++##

      ++##
      ++gen_tunable(virt_sandbox_use_fusefs, false) + + virt_domain_template(svirt) +-virt_domain_template(svirt_prot_exec) ++role system_r types svirt_t; ++typealias svirt_t alias qemu_t; ++ ++virt_domain_template(svirt_tcg) ++role system_r types svirt_tcg_t; + +-type virt_cache_t alias svirt_cache_t; ++type qemu_exec_t, virt_file_type; ++ ++type virt_cache_t alias svirt_cache_t, virt_file_type; + files_type(virt_cache_t) + +-type virt_etc_t; ++type virt_etc_t, virt_file_type; + files_config_file(virt_etc_t) + +-type virt_etc_rw_t; ++type virt_etc_rw_t, virt_file_type; + files_type(virt_etc_rw_t) + +-type virt_home_t; ++type virt_home_t, virt_file_type; + userdom_user_home_content(virt_home_t) + +-type svirt_home_t; ++type svirt_home_t, svirt_file_type; + userdom_user_home_content(svirt_home_t) + +-type svirt_var_run_t; +-files_pid_file(svirt_var_run_t) +-mls_trusted_object(svirt_var_run_t) +- +-type virt_image_t; # customizable ++# virt Image files ++type virt_image_t, virt_file_type; # customizable + virt_image(virt_image_t) + files_mountpoint(virt_image_t) + +-type virt_content_t; # customizable ++# virt Image files ++type virt_content_t, virt_file_type; # customizable + virt_image(virt_content_t) + userdom_user_home_content(virt_content_t) + +-type virt_lock_t; +-files_lock_file(virt_lock_t) ++type virt_tmp_t, virt_file_type; ++files_tmp_file(virt_tmp_t) + +-type virt_log_t; ++type virt_log_t, virt_file_type; + logging_log_file(virt_log_t) + mls_trusted_object(virt_log_t) + +-type virt_tmp_t; +-files_tmp_file(virt_tmp_t) ++type virt_lock_t, virt_file_type; ++files_lock_file(virt_lock_t) + +-type virt_var_run_t; ++type virt_var_run_t, virt_file_type; + files_pid_file(virt_var_run_t) + +-type virt_var_lib_t; ++type virt_var_lib_t, virt_file_type; + files_mountpoint(virt_var_lib_t) + +-type virtd_t; +-type virtd_exec_t; ++type virtd_t, virt_system_domain; ++type virtd_exec_t, virt_file_type; + init_daemon_domain(virtd_t, virtd_exec_t) + domain_obj_id_change_exemption(virtd_t) + domain_subj_id_change_exemption(virtd_t) + +-type virtd_initrc_exec_t; ++type virtd_unit_file_t, virt_file_type; ++systemd_unit_file(virtd_unit_file_t) ++ ++type virtd_initrc_exec_t, virt_file_type; + init_script_file(virtd_initrc_exec_t) + + type virtd_keytab_t; + files_type(virtd_keytab_t) + ++type virtlogd_t; ++type virtlogd_exec_t; ++init_daemon_domain(virtlogd_t, virtlogd_exec_t) ++type virtlogd_var_run_t; ++type virtlogd_etc_t; ++ ++type virtlogd_unit_file_t; ++systemd_unit_file(virtlogd_unit_file_t) ++ ++type virtlogd_initrc_exec_t; ++init_script_file(virtlogd_initrc_exec_t) ++ ++ ++type qemu_var_run_t, virt_file_type; ++typealias qemu_var_run_t alias svirt_var_run_t; ++files_pid_file(qemu_var_run_t) ++mls_trusted_object(qemu_var_run_t) ++ + ifdef(`enable_mcs',` + init_ranged_daemon_domain(virtd_t, virtd_exec_t, s0 - mcs_systemhigh) ++ init_ranged_daemon_domain(virtlogd_t, virtlogd_exec_t, s0 - mcs_systemhigh) + ') + + ifdef(`enable_mls',` + init_ranged_daemon_domain(virtd_t, virtd_exec_t, s0 - mls_systemhigh) ++ init_ranged_daemon_domain(virtlogd_t, virtlogd_exec_t, s0 - mls_systemhigh) + ') + +-type virt_qmf_t; +-type virt_qmf_exec_t; ++type virt_qmf_t, virt_system_domain; ++type virt_qmf_exec_t, virt_file_type; + init_daemon_domain(virt_qmf_t, virt_qmf_exec_t) + +-type virt_bridgehelper_t; +-type virt_bridgehelper_exec_t; ++type virt_bridgehelper_t, virt_system_domain; + domain_type(virt_bridgehelper_t) ++ ++type virt_bridgehelper_exec_t, virt_file_type; + domain_entry_file(virt_bridgehelper_t, virt_bridgehelper_exec_t) +-role virt_bridgehelper_roles types virt_bridgehelper_t; ++role system_r types virt_bridgehelper_t; + +-type virtd_lxc_t; +-type virtd_lxc_exec_t; +-init_system_domain(virtd_lxc_t, virtd_lxc_exec_t) ++# policy for qemu_ga ++type virt_qemu_ga_t, virt_system_domain; ++type virt_qemu_ga_exec_t, virt_file_type; ++init_daemon_domain(virt_qemu_ga_t, virt_qemu_ga_exec_t) + +-type virtd_lxc_var_run_t; +-files_pid_file(virtd_lxc_var_run_t) ++type virt_qemu_ga_var_run_t, virt_file_type; ++files_pid_file(virt_qemu_ga_var_run_t) + +-type svirt_lxc_file_t; +-files_mountpoint(svirt_lxc_file_t) +-fs_noxattr_type(svirt_lxc_file_t) +-term_pty(svirt_lxc_file_t) ++type virt_qemu_ga_log_t, virt_file_type; ++logging_log_file(virt_qemu_ga_log_t) + +-virt_lxc_domain_template(svirt_lxc_net) ++type virt_qemu_ga_tmp_t, virt_file_type; ++files_tmp_file(virt_qemu_ga_tmp_t) + +-type virsh_t; +-type virsh_exec_t; +-init_system_domain(virsh_t, virsh_exec_t) ++type virt_qemu_ga_data_t, virt_file_type; ++files_type(virt_qemu_ga_data_t) ++ ++type virt_qemu_ga_unconfined_exec_t, virt_file_type; ++application_executable_file(virt_qemu_ga_unconfined_exec_t) + + ######################################## + # +-# Common virt domain local policy ++# Declarations + # ++attribute svirt_sandbox_domain; + +-allow virt_domain self:process { signal getsched signull }; +-allow virt_domain self:fifo_file rw_fifo_file_perms; +-allow virt_domain self:netlink_kobject_uevent_socket create_socket_perms; +-allow virt_domain self:netlink_route_socket r_netlink_socket_perms; +-allow virt_domain self:shm create_shm_perms; +-allow virt_domain self:tcp_socket create_stream_socket_perms; +-allow virt_domain self:unix_stream_socket { accept listen }; +-allow virt_domain self:unix_dgram_socket sendto; +- +-allow virt_domain virtd_t:fd use; +-allow virt_domain virtd_t:fifo_file rw_fifo_file_perms; +-allow virt_domain virtd_t:process sigchld; +- +-dontaudit virt_domain virtd_t:unix_stream_socket { read write }; +- +-manage_dirs_pattern(virt_domain, virt_cache_t, virt_cache_t) +-manage_files_pattern(virt_domain, virt_cache_t, virt_cache_t) +-files_var_filetrans(virt_domain, virt_cache_t, { file dir }) +- +-manage_dirs_pattern(virt_domain, svirt_var_run_t, svirt_var_run_t) +-manage_files_pattern(virt_domain, svirt_var_run_t, svirt_var_run_t) +-manage_sock_files_pattern(virt_domain, svirt_var_run_t, svirt_var_run_t) +-manage_lnk_files_pattern(virt_domain, svirt_var_run_t, svirt_var_run_t) +-files_pid_filetrans(virt_domain, svirt_var_run_t, { dir file }) +- +-stream_connect_pattern(virt_domain, svirt_var_run_t, svirt_var_run_t, virtd_t) +- +-dontaudit virt_domain virt_tmpfs_type:file { read write }; +- +-append_files_pattern(virt_domain, virt_log_t, virt_log_t) +- +-append_files_pattern(virt_domain, virt_var_lib_t, virt_var_lib_t) +- +-kernel_read_system_state(virt_domain) +- +-fs_getattr_xattr_fs(virt_domain) +- +-corecmd_exec_bin(virt_domain) +-corecmd_exec_shell(virt_domain) +- +-corenet_all_recvfrom_unlabeled(virt_domain) +-corenet_all_recvfrom_netlabel(virt_domain) +-corenet_tcp_sendrecv_generic_if(virt_domain) +-corenet_tcp_sendrecv_generic_node(virt_domain) +-corenet_tcp_bind_generic_node(virt_domain) +- +-corenet_sendrecv_vnc_server_packets(virt_domain) +-corenet_tcp_bind_vnc_port(virt_domain) +-corenet_tcp_sendrecv_vnc_port(virt_domain) +- +-corenet_sendrecv_virt_migration_server_packets(virt_domain) +-corenet_tcp_bind_virt_migration_port(virt_domain) +-corenet_sendrecv_virt_migration_client_packets(virt_domain) +-corenet_tcp_connect_virt_migration_port(virt_domain) +-corenet_tcp_sendrecv_virt_migration_port(virt_domain) +- +-corenet_rw_tun_tap_dev(virt_domain) +- +-dev_getattr_fs(virt_domain) +-dev_list_sysfs(virt_domain) +-dev_read_generic_symlinks(virt_domain) +-dev_read_rand(virt_domain) +-dev_read_sound(virt_domain) +-dev_read_urand(virt_domain) +-dev_write_sound(virt_domain) +-dev_rw_ksm(virt_domain) +-dev_rw_kvm(virt_domain) +-dev_rw_qemu(virt_domain) +-dev_rw_vhost(virt_domain) +- +-domain_use_interactive_fds(virt_domain) +- +-files_read_etc_files(virt_domain) +-files_read_mnt_symlinks(virt_domain) +-files_read_usr_files(virt_domain) +-files_read_var_files(virt_domain) +-files_search_all(virt_domain) +- +-fs_getattr_all_fs(virt_domain) +-fs_rw_anon_inodefs_files(virt_domain) +-fs_rw_tmpfs_files(virt_domain) +-fs_getattr_hugetlbfs(virt_domain) +- +-# fs_rw_inherited_nfs_files(virt_domain) +-# fs_rw_inherited_cifs_files(virt_domain) +-# fs_rw_inherited_noxattr_fs_files(virt_domain) +- +-storage_raw_write_removable_device(virt_domain) +-storage_raw_read_removable_device(virt_domain) +- +-term_use_all_terms(virt_domain) +-term_getattr_pty_fs(virt_domain) +-term_use_generic_ptys(virt_domain) +-term_use_ptmx(virt_domain) +- +-logging_send_syslog_msg(virt_domain) +- +-miscfiles_read_localization(virt_domain) +-miscfiles_read_public_files(virt_domain) +- +-sysnet_read_config(virt_domain) +- +-userdom_search_user_home_dirs(virt_domain) +-userdom_read_all_users_state(virt_domain) +- +-virt_run_bridgehelper(virt_domain, virt_domain_roles) +-virt_read_config(virt_domain) +-virt_read_lib_files(virt_domain) +-virt_read_content(virt_domain) +-virt_stream_connect(virt_domain) +- +-qemu_exec(virt_domain) +- +-tunable_policy(`virt_use_execmem',` +- allow virt_domain self:process { execmem execstack }; +-') +- +-tunable_policy(`virt_use_comm',` +- term_use_unallocated_ttys(virt_domain) +- dev_rw_printer(virt_domain) +-') +- +-tunable_policy(`virt_use_fusefs',` +- fs_manage_fusefs_dirs(virt_domain) +- fs_manage_fusefs_files(virt_domain) +- fs_read_fusefs_symlinks(virt_domain) +-') +- +-tunable_policy(`virt_use_nfs',` +- fs_manage_nfs_dirs(virt_domain) +- fs_manage_nfs_files(virt_domain) +- fs_manage_nfs_named_sockets(virt_domain) +- fs_read_nfs_symlinks(virt_domain) +-') +- +-tunable_policy(`virt_use_samba',` +- fs_manage_cifs_dirs(virt_domain) +- fs_manage_cifs_files(virt_domain) +- fs_manage_cifs_named_sockets(virt_domain) +- fs_read_cifs_symlinks(virt_domain) +-') +- +-tunable_policy(`virt_use_sysfs',` +- dev_rw_sysfs(virt_domain) +-') +- +-tunable_policy(`virt_use_usb',` +- dev_rw_usbfs(virt_domain) +- dev_read_sysfs(virt_domain) +- fs_getattr_dos_fs(virt_domain) +- fs_manage_dos_dirs(virt_domain) +- fs_manage_dos_files(virt_domain) +-') +- +-optional_policy(` +- tunable_policy(`virt_use_xserver',` +- xserver_read_xdm_pid(virt_domain) +- xserver_stream_connect(virt_domain) +- ') +-') +- +-optional_policy(` +- dbus_read_lib_files(virt_domain) +-') +- +-optional_policy(` +- nscd_use(virt_domain) +-') ++type virtd_lxc_t, virt_system_domain; ++type virtd_lxc_exec_t, virt_file_type; ++init_system_domain(virtd_lxc_t, virtd_lxc_exec_t) + +-optional_policy(` +- samba_domtrans_smbd(virt_domain) +-') ++type virt_lxc_var_run_t, virt_file_type; ++files_pid_file(virt_lxc_var_run_t) ++typealias virt_lxc_var_run_t alias virtd_lxc_var_run_t; + +-optional_policy(` +- xen_rw_image_files(virt_domain) +-') ++# virt lxc container files ++type container_file_t, svirt_file_type; ++typealias container_file_t alias { svirt_sandbox_file_t svirt_lxc_file_t }; ++files_mountpoint(container_file_t) + + ######################################## + # + # svirt local policy + # + +-list_dirs_pattern(svirt_t, virt_content_t, virt_content_t) +-read_files_pattern(svirt_t, virt_content_t, virt_content_t) +- +-dontaudit svirt_t virt_content_t:file write_file_perms; +-dontaudit svirt_t virt_content_t:dir rw_dir_perms; +- +-append_files_pattern(svirt_t, virt_home_t, virt_home_t) +-manage_dirs_pattern(svirt_t, svirt_home_t, svirt_home_t) +-manage_files_pattern(svirt_t, svirt_home_t, svirt_home_t) +-manage_sock_files_pattern(svirt_t, svirt_home_t, svirt_home_t) +- +-filetrans_pattern(svirt_t, virt_home_t, svirt_home_t, dir, "qemu") ++# it was a part of auth_use_nsswitch ++allow svirt_t self:netlink_route_socket r_netlink_socket_perms; + +-stream_connect_pattern(svirt_t, svirt_home_t, svirt_home_t, virtd_t) +- +-corenet_udp_sendrecv_generic_if(svirt_t) +-corenet_udp_sendrecv_generic_node(svirt_t) +-corenet_udp_sendrecv_all_ports(svirt_t) +-corenet_udp_bind_generic_node(svirt_t) +- +-corenet_all_recvfrom_unlabeled(svirt_t) +-corenet_all_recvfrom_netlabel(svirt_t) +-corenet_tcp_sendrecv_generic_if(svirt_t) + corenet_udp_sendrecv_generic_if(svirt_t) +-corenet_tcp_sendrecv_generic_node(svirt_t) + corenet_udp_sendrecv_generic_node(svirt_t) +-corenet_tcp_sendrecv_all_ports(svirt_t) + corenet_udp_sendrecv_all_ports(svirt_t) +-corenet_tcp_bind_generic_node(svirt_t) + corenet_udp_bind_generic_node(svirt_t) +- +-corenet_sendrecv_all_server_packets(svirt_t) + corenet_udp_bind_all_ports(svirt_t) + corenet_tcp_bind_all_ports(svirt_t) +- +-corenet_sendrecv_all_client_packets(svirt_t) + corenet_tcp_connect_all_ports(svirt_t) + ++init_dontaudit_read_state(svirt_t) ++ ++virt_dontaudit_read_state(svirt_t) ++ ++storage_rw_inherited_fixed_disk_dev(svirt_t) ++ ++####################################### ++# ++# svirt_prot_exec local policy ++# ++ ++allow svirt_tcg_t self:process { execmem execstack }; ++allow svirt_tcg_t self:netlink_route_socket r_netlink_socket_perms; ++ ++corenet_udp_sendrecv_generic_if(svirt_tcg_t) ++corenet_udp_sendrecv_generic_node(svirt_tcg_t) ++corenet_udp_sendrecv_all_ports(svirt_tcg_t) ++corenet_udp_bind_generic_node(svirt_tcg_t) ++corenet_udp_bind_all_ports(svirt_tcg_t) ++corenet_tcp_bind_all_ports(svirt_tcg_t) ++corenet_tcp_connect_all_ports(svirt_tcg_t) ++ + ######################################## + # + # virtd local policy + # + +-allow virtd_t self:capability { chown dac_override fowner ipc_lock kill mknod net_admin net_raw setpcap setuid setgid sys_admin sys_nice }; ++allow virtd_t self:capability { chown dac_read_search dac_override fowner ipc_lock kill mknod net_admin net_raw setpcap setuid setgid sys_admin sys_nice sys_ptrace }; ++allow virtd_t self:capability2 compromise_kernel; + allow virtd_t self:process { getcap getsched setcap sigkill signal signull execmem setexec setfscreate setsockcreate setsched }; ++ifdef(`hide_broken_symptoms',` ++ # caused by some bogus kernel code ++ dontaudit virtd_t self:capability { sys_module }; ++') ++ + allow virtd_t self:fifo_file { manage_fifo_file_perms relabelfrom relabelto }; +-allow virtd_t self:unix_stream_socket { accept connectto listen relabelfrom relabelto }; +-allow virtd_t self:tcp_socket { accept listen }; ++allow virtd_t self:unix_stream_socket { connectto create_stream_socket_perms relabelfrom relabelto }; ++allow virtd_t self:tcp_socket create_stream_socket_perms; + allow virtd_t self:tun_socket { create_socket_perms relabelfrom relabelto }; + allow virtd_t self:rawip_socket create_socket_perms; + allow virtd_t self:packet_socket create_socket_perms; + allow virtd_t self:netlink_kobject_uevent_socket create_socket_perms; +-allow virtd_t self:netlink_route_socket nlmsg_write; +- +-allow virtd_t virt_domain:process { getattr getsched setsched transition signal signull sigkill }; +-dontaudit virtd_t virt_domain:process { siginh noatsecure rlimitinh }; +- +-allow virtd_t svirt_lxc_domain:unix_stream_socket { create_stream_socket_perms connectto }; +-allow virtd_t svirt_lxc_domain:process signal_perms; +- +-allow virtd_t virtd_lxc_t:process { signal signull sigkill }; +- +-domtrans_pattern(virtd_t, virtd_lxc_exec_t, virtd_lxc_t) ++allow virtd_t self:netlink_route_socket create_netlink_socket_perms; ++allow virtd_t self:netlink_socket create_socket_perms; + + manage_dirs_pattern(virtd_t, virt_cache_t, virt_cache_t) + manage_files_pattern(virtd_t, virt_cache_t, virt_cache_t) + + manage_dirs_pattern(virtd_t, virt_content_t, virt_content_t) + manage_files_pattern(virtd_t, virt_content_t, virt_content_t) +-filetrans_pattern(virtd_t, virt_home_t, virt_content_t, dir, "isos") + + allow virtd_t virtd_keytab_t:file read_file_perms; + +-allow virtd_t svirt_var_run_t:file relabel_file_perms; +-manage_dirs_pattern(virtd_t, svirt_var_run_t, svirt_var_run_t) +-manage_files_pattern(virtd_t, svirt_var_run_t, svirt_var_run_t) +-manage_sock_files_pattern(virtd_t, svirt_var_run_t, svirt_var_run_t) +-filetrans_pattern(virtd_t, virt_var_run_t, svirt_var_run_t, dir, "qemu") ++allow virtd_t virt_domain:process { getattr getsched setsched transition signal signull sigkill }; ++allow virtd_t svirt_sandbox_domain:process { getattr getsched setsched transition signal signull sigkill }; ++allow virt_domain virtd_t:fd use; ++dontaudit virt_domain virtd_t:unix_stream_socket { read write }; ++allow virtd_t virt_domain:unix_stream_socket { connectto create_stream_socket_perms }; ++allow virt_domain virtd_t:tun_socket attach_queue; ++ ++can_exec(virtd_t, qemu_exec_t) ++can_exec(virt_domain, qemu_exec_t) ++ ++allow virtd_t qemu_var_run_t:file relabel_file_perms; ++manage_dirs_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t) ++relabelfrom_dirs_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t) ++manage_files_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t) ++relabelfrom_files_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t) ++manage_sock_files_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t) ++stream_connect_pattern(virtd_t, qemu_var_run_t, qemu_var_run_t, virt_domain) ++filetrans_pattern(virtd_t, virt_var_run_t, qemu_var_run_t, dir, "qemu") + + read_files_pattern(virtd_t, virt_etc_t, virt_etc_t) + read_lnk_files_pattern(virtd_t, virt_etc_t, virt_etc_t) +@@ -455,71 +405,62 @@ manage_files_pattern(virtd_t, virt_etc_rw_t, virt_etc_rw_t) + manage_lnk_files_pattern(virtd_t, virt_etc_rw_t, virt_etc_rw_t) + filetrans_pattern(virtd_t, virt_etc_t, virt_etc_rw_t, dir) + +-manage_dirs_pattern(virtd_t, virt_home_t, virt_home_t) +-manage_files_pattern(virtd_t, virt_home_t, virt_home_t) +-manage_sock_files_pattern(virtd_t, virt_home_t, virt_home_t) +-manage_lnk_files_pattern(virtd_t, virt_home_t, virt_home_t) +- +-userdom_user_home_dir_filetrans(virtd_t, virt_home_t, dir, ".libvirt") +-userdom_user_home_dir_filetrans(virtd_t, virt_home_t, dir, ".virtinst") +-userdom_user_home_dir_filetrans(virtd_t, virt_home_t, dir, "VirtualMachines") +- ++relabelto_dirs_pattern(virtd_t, virt_image_type, virt_image_type) + manage_files_pattern(virtd_t, virt_image_type, virt_image_type) + manage_chr_files_pattern(virtd_t, virt_image_type, virt_image_type) + manage_blk_files_pattern(virtd_t, virt_image_type, virt_image_type) + manage_lnk_files_pattern(virtd_t, virt_image_type, virt_image_type) +- ++allow virtd_t virt_image_type:dir { setattr rmdir }; + allow virtd_t virt_image_type:file relabel_file_perms; + allow virtd_t virt_image_type:blk_file relabel_blk_file_perms; + allow virtd_t virt_image_type:chr_file relabel_chr_file_perms; +-allow virtd_t virt_image_type:chr_file relabel_chr_file_perms; +- ++allow virtd_t virt_image_type:unix_stream_socket relabel_file_perms; + allow virtd_t virt_ptynode:chr_file rw_term_perms; + + manage_dirs_pattern(virtd_t, virt_tmp_t, virt_tmp_t) + manage_files_pattern(virtd_t, virt_tmp_t, virt_tmp_t) + files_tmp_filetrans(virtd_t, virt_tmp_t, { file dir }) ++can_exec(virtd_t, virt_tmp_t) + +-# This needs a file context specification + manage_dirs_pattern(virtd_t, virt_lock_t, virt_lock_t) + manage_files_pattern(virtd_t, virt_lock_t, virt_lock_t) + manage_lnk_files_pattern(virtd_t, virt_lock_t, virt_lock_t) + files_lock_filetrans(virtd_t, virt_lock_t, { dir file lnk_file }) + + manage_dirs_pattern(virtd_t, virt_log_t, virt_log_t) +-append_files_pattern(virtd_t, virt_log_t, virt_log_t) +-create_files_pattern(virtd_t, virt_log_t, virt_log_t) +-read_files_pattern(virtd_t, virt_log_t, virt_log_t) +-setattr_files_pattern(virtd_t, virt_log_t, virt_log_t) ++manage_files_pattern(virtd_t, virt_log_t, virt_log_t) + logging_log_filetrans(virtd_t, virt_log_t, { file dir }) + + manage_dirs_pattern(virtd_t, virt_var_lib_t, virt_var_lib_t) + manage_files_pattern(virtd_t, virt_var_lib_t, virt_var_lib_t) + manage_sock_files_pattern(virtd_t, virt_var_lib_t, virt_var_lib_t) + files_var_lib_filetrans(virtd_t, virt_var_lib_t, { file dir }) ++allow virtd_t virt_var_lib_t:file { relabelfrom relabelto }; + + manage_dirs_pattern(virtd_t, virt_var_run_t, virt_var_run_t) + manage_files_pattern(virtd_t, virt_var_run_t, virt_var_run_t) + manage_sock_files_pattern(virtd_t, virt_var_run_t, virt_var_run_t) +-files_pid_filetrans(virtd_t, virt_var_run_t, { file dir }) ++files_pid_filetrans(virtd_t, virt_var_run_t, { file dir sock_file }) + +-manage_dirs_pattern(virtd_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-manage_files_pattern(virtd_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-filetrans_pattern(virtd_t, virt_var_run_t, virtd_lxc_var_run_t, dir, "lxc") ++manage_dirs_pattern(virtd_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++manage_files_pattern(virtd_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++filetrans_pattern(virtd_t, virt_var_run_t, virt_lxc_var_run_t, dir, "lxc") ++allow virtd_t virt_lxc_var_run_t:file { relabelfrom relabelto }; ++stream_connect_pattern(virtd_t, virt_lxc_var_run_t, virt_lxc_var_run_t, virtd_lxc_t) + +-stream_connect_pattern(virtd_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t, virtd_lxc_t) +-stream_connect_pattern(virtd_t, svirt_var_run_t, svirt_var_run_t, virt_domain) ++# libvirtd is permitted to talk to virtlogd ++stream_connect_pattern(virtd_t, virt_var_run_t, virtlogd_var_run_t, virtlogd_t) ++allow virtd_t virtlogd_t:fifo_file rw_inherited_fifo_file_perms; + +-can_exec(virtd_t, virt_tmp_t) + +-kernel_read_crypto_sysctls(virtd_t) + kernel_read_system_state(virtd_t) + kernel_read_network_state(virtd_t) + kernel_rw_net_sysctls(virtd_t) + kernel_read_kernel_sysctls(virtd_t) + kernel_request_load_module(virtd_t) + kernel_search_debugfs(virtd_t) +-kernel_setsched(virtd_t) ++kernel_dontaudit_setsched(virtd_t) ++kernel_write_proc_files(virtd_t) + + corecmd_exec_bin(virtd_t) + corecmd_exec_shell(virtd_t) +@@ -527,24 +468,16 @@ corecmd_exec_shell(virtd_t) + corenet_all_recvfrom_netlabel(virtd_t) + corenet_tcp_sendrecv_generic_if(virtd_t) + corenet_tcp_sendrecv_generic_node(virtd_t) ++corenet_tcp_sendrecv_all_ports(virtd_t) + corenet_tcp_bind_generic_node(virtd_t) +- +-corenet_sendrecv_virt_server_packets(virtd_t) + corenet_tcp_bind_virt_port(virtd_t) +-corenet_tcp_sendrecv_virt_port(virtd_t) +- +-corenet_sendrecv_vnc_server_packets(virtd_t) + corenet_tcp_bind_vnc_port(virtd_t) +-corenet_sendrecv_vnc_client_packets(virtd_t) + corenet_tcp_connect_vnc_port(virtd_t) +-corenet_tcp_sendrecv_vnc_port(virtd_t) +- +-corenet_sendrecv_soundd_client_packets(virtd_t) + corenet_tcp_connect_soundd_port(virtd_t) +-corenet_tcp_sendrecv_soundd_port(virtd_t) +- + corenet_rw_tun_tap_dev(virtd_t) ++corenet_relabel_tun_tap_dev(virtd_t) + ++dev_rw_vfio_dev(virtd_t) + dev_rw_sysfs(virtd_t) + dev_read_urand(virtd_t) + dev_read_rand(virtd_t) +@@ -555,20 +488,26 @@ dev_rw_vhost(virtd_t) + dev_setattr_generic_usb_dev(virtd_t) + dev_relabel_generic_usb_dev(virtd_t) + ++# Init script handling + domain_use_interactive_fds(virtd_t) + domain_read_all_domains_state(virtd_t) ++domain_signull_all_domains(virtd_t) + +-files_read_usr_files(virtd_t) ++files_list_all_mountpoints(virtd_t) + files_read_etc_runtime_files(virtd_t) + files_search_all(virtd_t) + files_read_kernel_modules(virtd_t) + files_read_usr_src_files(virtd_t) ++files_relabelto_system_conf_files(virtd_t) ++files_relabelfrom_system_conf_files(virtd_t) ++files_relabelfrom_boot_files(virtd_t) ++files_relabelto_boot_files(virtd_t) ++files_manage_boot_files(virtd_t) + + # Manages /etc/sysconfig/system-config-firewall +-# files_relabelto_system_conf_files(virtd_t) +-# files_relabelfrom_system_conf_files(virtd_t) +-# files_manage_system_conf_files(virtd_t) ++files_manage_system_conf_files(virtd_t) + ++fs_read_tmpfs_symlinks(virtd_t) + fs_list_auto_mountpoints(virtd_t) + fs_getattr_all_fs(virtd_t) + fs_rw_anon_inodefs_files(virtd_t) +@@ -587,6 +526,7 @@ mls_net_write_within_range(virtd_t) + mls_socket_write_to_clearance(virtd_t) + mls_socket_read_to_clearance(virtd_t) + mls_rangetrans_source(virtd_t) ++mls_file_upgrade(virtd_t) + + mcs_process_set_categories(virtd_t) + +@@ -601,15 +541,18 @@ term_use_ptmx(virtd_t) + + auth_use_nsswitch(virtd_t) + +-miscfiles_read_localization(virtd_t) ++init_dbus_chat(virtd_t) ++ + miscfiles_read_generic_certs(virtd_t) + miscfiles_read_hwdata(virtd_t) + + modutils_read_module_deps(virtd_t) ++modutils_read_module_config(virtd_t) + modutils_manage_module_config(virtd_t) + + logging_send_syslog_msg(virtd_t) + logging_send_audit_msgs(virtd_t) ++logging_stream_connect_syslog(virtd_t) + + selinux_validate_context(virtd_t) + +@@ -620,18 +563,26 @@ seutil_read_file_contexts(virtd_t) + sysnet_signull_ifconfig(virtd_t) + sysnet_signal_ifconfig(virtd_t) + sysnet_domtrans_ifconfig(virtd_t) ++sysnet_read_config(virtd_t) + +-userdom_read_all_users_state(virtd_t) +- +-ifdef(`hide_broken_symptoms',` +- dontaudit virtd_t self:capability { sys_module sys_ptrace }; +-') ++systemd_dbus_chat_logind(virtd_t) ++systemd_write_inhibit_pipes(virtd_t) + +-tunable_policy(`virt_use_fusefs',` +- fs_manage_fusefs_dirs(virtd_t) +- fs_manage_fusefs_files(virtd_t) +- fs_read_fusefs_symlinks(virtd_t) +-') ++userdom_list_admin_dir(virtd_t) ++userdom_getattr_all_users(virtd_t) ++userdom_list_user_home_content(virtd_t) ++userdom_read_all_users_state(virtd_t) ++userdom_read_user_home_content_files(virtd_t) ++userdom_relabel_user_tmp_files(virtd_t) ++userdom_setattr_user_tmp_files(virtd_t) ++userdom_relabel_user_home_files(virtd_t) ++userdom_setattr_user_home_content_files(virtd_t) ++manage_dirs_pattern(virtd_t, virt_home_t, virt_home_t) ++manage_files_pattern(virtd_t, virt_home_t, virt_home_t) ++manage_sock_files_pattern(virtd_t, virt_home_t, virt_home_t) ++manage_lnk_files_pattern(virtd_t, virt_home_t, virt_home_t) ++#userdom_user_home_dir_filetrans(virtd_t, virt_home_t, { dir file }) ++virt_filetrans_home_content(virtd_t) + + tunable_policy(`virt_use_nfs',` + fs_manage_nfs_dirs(virtd_t) +@@ -640,7 +591,7 @@ tunable_policy(`virt_use_nfs',` + ') + + tunable_policy(`virt_use_samba',` +- fs_manage_cifs_files(virtd_t) ++ fs_manage_cifs_dirs(virtd_t) + fs_manage_cifs_files(virtd_t) + fs_read_cifs_symlinks(virtd_t) + ') +@@ -664,10 +615,6 @@ optional_policy(` + consolekit_dbus_chat(virtd_t) + ') + +- optional_policy(` +- firewalld_dbus_chat(virtd_t) +- ') +- + optional_policy(` + hal_dbus_chat(virtd_t) + ') +@@ -675,11 +622,7 @@ optional_policy(` + optional_policy(` + networkmanager_dbus_chat(virtd_t) + ') +- +- optional_policy(` +- policykit_dbus_chat(virtd_t) +- ') +-') ++') + + optional_policy(` + dmidecode_domtrans(virtd_t) +@@ -691,20 +634,26 @@ optional_policy(` + dnsmasq_kill(virtd_t) + dnsmasq_signull(virtd_t) + dnsmasq_create_pid_dirs(virtd_t) +- dnsmasq_spec_filetrans_pid(virtd_t, virt_var_run_t, dir, "network") +- dnsmasq_spec_filetrans_pid(virtd_t, virt_var_run_t, file, "dnsmasq.pid") ++ dnsmasq_filetrans_named_content_fromdir(virtd_t, virt_var_run_t); + dnsmasq_manage_pid_files(virtd_t) + ') + ++optional_policy(` ++ firewalld_dbus_chat(virtd_t) ++') ++ + optional_policy(` + iptables_domtrans(virtd_t) + iptables_initrc_domtrans(virtd_t) ++ iptables_systemctl(virtd_t) ++ ++ # Manages /etc/sysconfig/system-config-firewall + iptables_manage_config(virtd_t) + ') + + optional_policy(` +- kerberos_read_keytab(virtd_t) +- kerberos_use(virtd_t) ++ kerberos_read_keytab(virtd_t) ++ kerberos_use(virtd_t) + ') + + optional_policy(` +@@ -712,11 +661,18 @@ optional_policy(` + ') + + optional_policy(` ++ # Run mount in the mount_t domain. + mount_domtrans(virtd_t) + mount_signal(virtd_t) + ') + + optional_policy(` ++ numad_domtrans(virtd_t) ++ numad_dbus_chat(virtd_t) ++') ++ ++optional_policy(` ++ policykit_dbus_chat(virtd_t) + policykit_domtrans_auth(virtd_t) + policykit_domtrans_resolve(virtd_t) + policykit_read_lib(virtd_t) +@@ -726,10 +682,18 @@ optional_policy(` + qemu_exec(virtd_t) + ') + ++optional_policy(` ++ sanlock_stream_connect(virtd_t) ++') ++ + optional_policy(` + sasl_connect(virtd_t) + ') + ++optional_policy(` ++ setrans_manage_pid_files(virtd_t) ++') ++ + optional_policy(` + kernel_read_xen_state(virtd_t) + kernel_write_xen_state(virtd_t) +@@ -746,44 +710,371 @@ optional_policy(` + udev_read_pid_files(virtd_t) + ') + ++optional_policy(` ++ unconfined_domain(virtd_t) ++') ++ + ######################################## + # +-# Virsh local policy ++# virtlogd local policy + # + +-allow virsh_t self:capability { setpcap dac_override ipc_lock sys_nice sys_tty_config }; +-allow virsh_t self:process { getcap getsched setsched setcap signal }; +-allow virsh_t self:fifo_file rw_fifo_file_perms; +-allow virsh_t self:unix_stream_socket { accept connectto listen }; +-allow virsh_t self:tcp_socket { accept listen }; ++# virtlogd is allowed to manage files it creates in /var/run/libvirt ++manage_files_pattern(virtlogd_t, virt_var_run_t, virtlogd_var_run_t) + +-manage_files_pattern(virsh_t, virt_image_type, virt_image_type) +-manage_blk_files_pattern(virsh_t, virt_image_type, virt_image_type) +-manage_lnk_files_pattern(virsh_t, virt_image_type, virt_image_type) ++# virtlogd needs to read /etc/libvirt/virtlogd.conf only ++files_config_file(virtlogd_etc_t) ++allow virtlogd_t virtlogd_etc_t:file read_file_perms; ++files_search_etc(virtlogd_t) ++allow virtlogd_t virt_etc_t:file read_file_perms; ++allow virtlogd_t virt_etc_t:lnk_file read_file_perms; ++allow virtlogd_t virt_etc_t:dir search; + +-manage_dirs_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_files_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_chr_files_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_lnk_files_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_sock_files_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_fifo_files_pattern(virsh_t, svirt_lxc_file_t, svirt_lxc_file_t) ++# virtlogd creates /var/run/libvirt/virtlogd-sock with isolated ++# context from other stuff in /var/run/libvirt ++filetrans_pattern(virtlogd_t, virt_var_run_t, virtlogd_var_run_t, { sock_file }) ++# This lets systemd create the socket itself too ++files_pid_file(virtlogd_var_run_t) + +-manage_dirs_pattern(virsh_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-manage_files_pattern(virsh_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-filetrans_pattern(virsh_t, virt_var_run_t, virtd_lxc_var_run_t, dir, "lxc") ++# virtlogd creates a /var/run/virtlogd.pid file ++allow virtlogd_t virtlogd_var_run_t:file manage_file_perms; ++manage_sock_files_pattern(virtlogd_t, virt_var_run_t, virtlogd_var_run_t) ++files_pid_filetrans(virtlogd_t, virtlogd_var_run_t, file) + +-dontaudit virsh_t virt_var_lib_t:file read_file_perms; ++manage_dirs_pattern(virtlogd_t, svirt_tmp_t, svirt_tmp_t) ++manage_files_pattern(virtlogd_t, svirt_tmp_t, svirt_tmp_t) ++manage_lnk_files_pattern(virtlogd_t, svirt_tmp_t, svirt_tmp_t) ++files_tmp_filetrans(virtlogd_t, svirt_tmp_t, { file dir lnk_file }) + +-allow virsh_t svirt_lxc_domain:process transition; ++manage_dirs_pattern(virtlogd_t, virt_tmp_t, virt_tmp_t) ++manage_files_pattern(virtlogd_t, virt_tmp_t, virt_tmp_t) + +-can_exec(virsh_t, virsh_exec_t) ++can_exec(virtlogd_t, virtlogd_exec_t) ++ ++kernel_read_network_state(virtlogd_t) ++ ++allow virtlogd_t self:unix_stream_socket create_stream_socket_perms; ++ ++dev_read_sysfs(virtlogd_t) ++ ++logging_send_syslog_msg(virtlogd_t) ++ ++auth_use_nsswitch(virtlogd_t) ++ ++manage_files_pattern(virtlogd_t, virt_log_t, virt_log_t) ++ ++manage_files_pattern(virtlogd_t, svirt_image_t, svirt_image_t) ++ ++# Allow virtlogd to look at /proc/$PID/status ++# to authenticate the connecting libvirtd ++allow virtlogd_t virtd_t:dir list_dir_perms; ++allow virtlogd_t virtd_t:file read_file_perms; ++allow virtlogd_t virtd_t:lnk_file read_lnk_file_perms; ++ ++tunable_policy(`virt_use_nfs',` ++ fs_append_nfs_files(virtlogd_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(virtlogd_t) ++') ++ ++optional_policy(` ++ systemd_write_inhibit_pipes(virtlogd_t) ++ systemd_dbus_chat_logind(virtlogd_t) ++') ++ ++######################################## ++# ++# virtual domains common policy ++# ++allow virt_domain self:capability2 compromise_kernel; ++allow virt_domain self:process { setrlimit signal_perms getsched setsched }; ++allow virt_domain self:fifo_file rw_fifo_file_perms; ++allow virt_domain self:shm create_shm_perms; ++allow virt_domain self:unix_stream_socket { connectto create_stream_socket_perms }; ++allow virt_domain self:unix_dgram_socket { create_socket_perms sendto }; ++allow virt_domain self:tcp_socket create_stream_socket_perms; ++allow virt_domain self:udp_socket create_socket_perms; ++allow virt_domain self:netlink_kobject_uevent_socket create_socket_perms; ++ ++list_dirs_pattern(virt_domain, virt_content_t, virt_content_t) ++read_files_pattern(virt_domain, virt_content_t, virt_content_t) ++dontaudit virt_domain virt_content_t:file write_file_perms; ++dontaudit virt_domain virt_content_t:dir write; ++ ++kernel_read_net_sysctls(virt_domain) ++kernel_read_network_state(virt_domain) ++kernel_ib_access_unlabeled_pkeys(virt_domain) ++ ++userdom_search_user_home_content(virt_domain) ++userdom_read_user_home_content_symlinks(virt_domain) ++userdom_read_all_users_state(virt_domain) ++append_files_pattern(virt_domain, virt_home_t, virt_home_t) ++manage_dirs_pattern(virt_domain, svirt_home_t, svirt_home_t) ++manage_files_pattern(virt_domain, svirt_home_t, svirt_home_t) ++manage_sock_files_pattern(virt_domain, svirt_home_t, svirt_home_t) ++filetrans_pattern(virt_domain, virt_home_t, svirt_home_t, { dir sock_file file }) ++stream_connect_pattern(virt_domain, svirt_home_t, svirt_home_t, virtd_t) ++ ++manage_dirs_pattern(virt_domain, virt_cache_t, virt_cache_t) ++manage_files_pattern(virt_domain, virt_cache_t, virt_cache_t) ++files_var_filetrans(virt_domain, virt_cache_t, { file dir }) ++ ++read_lnk_files_pattern(virt_domain, virt_image_t, virt_image_t) ++ ++manage_dirs_pattern(virt_domain, svirt_image_t, svirt_image_t) ++manage_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++manage_sock_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++manage_fifo_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++read_lnk_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++rw_chr_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++rw_blk_files_pattern(virt_domain, svirt_image_t, svirt_image_t) ++fs_hugetlbfs_filetrans(virt_domain, svirt_image_t, file) ++allow svirt_t svirt_image_t:file map; ++allow svirt_t svirt_image_t:blk_file map; ++ ++manage_dirs_pattern(virt_domain, svirt_tmp_t, svirt_tmp_t) ++manage_files_pattern(virt_domain, svirt_tmp_t, svirt_tmp_t) ++manage_lnk_files_pattern(virt_domain, svirt_tmp_t, svirt_tmp_t) ++manage_sock_files_pattern(virt_domain, svirt_tmp_t, svirt_tmp_t) ++files_tmp_filetrans(virt_domain, svirt_tmp_t, { file dir lnk_file sock_file}) ++userdom_user_tmp_filetrans(virt_domain, svirt_tmp_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(virt_domain, svirt_tmpfs_t, svirt_tmpfs_t) ++manage_files_pattern(virt_domain, svirt_tmpfs_t, svirt_tmpfs_t) ++manage_lnk_files_pattern(virt_domain, svirt_tmpfs_t, svirt_tmpfs_t) ++fs_tmpfs_filetrans(virt_domain, svirt_tmpfs_t, { dir file lnk_file }) ++allow virt_domain svirt_tmpfs_t:file map; ++ ++manage_dirs_pattern(virt_domain, qemu_var_run_t, qemu_var_run_t) ++manage_files_pattern(virt_domain, qemu_var_run_t, qemu_var_run_t) ++manage_sock_files_pattern(virt_domain, qemu_var_run_t, qemu_var_run_t) ++manage_lnk_files_pattern(virt_domain, qemu_var_run_t, qemu_var_run_t) ++files_pid_filetrans(virt_domain, qemu_var_run_t, { dir file }) ++stream_connect_pattern(virt_domain, qemu_var_run_t, qemu_var_run_t, virtd_t) ++ ++dontaudit virtd_t virt_domain:process { siginh noatsecure rlimitinh }; ++ ++dontaudit virt_domain virt_tmpfs_type:file { read write }; ++ ++append_files_pattern(virt_domain, virt_log_t, virt_log_t) ++ ++append_files_pattern(virt_domain, virt_var_lib_t, virt_var_lib_t) ++ ++corecmd_exec_bin(virt_domain) ++corecmd_exec_shell(virt_domain) ++ ++corenet_tcp_sendrecv_generic_if(virt_domain) ++corenet_tcp_sendrecv_generic_node(virt_domain) ++corenet_tcp_sendrecv_all_ports(virt_domain) ++corenet_tcp_bind_generic_node(virt_domain) ++corenet_tcp_bind_vnc_port(virt_domain) ++corenet_tcp_bind_virt_migration_port(virt_domain) ++corenet_tcp_connect_virt_migration_port(virt_domain) ++corenet_rw_inherited_tun_tap_dev(virt_domain) ++ ++dev_list_sysfs(virt_domain) ++dev_getattr_fs(virt_domain) ++dev_dontaudit_getattr_all(virt_domain) ++dev_read_generic_symlinks(virt_domain) ++dev_read_rand(virt_domain) ++dev_read_sound(virt_domain) ++dev_read_urand(virt_domain) ++dev_write_sound(virt_domain) ++dev_rw_ksm(virt_domain) ++dev_rw_vfio_dev(virt_domain) ++dev_rw_kvm(virt_domain) ++dev_rw_qemu(virt_domain) ++dev_rw_inherited_vhost(virt_domain) ++dev_rw_infiniband_dev(virt_domain) ++dev_rw_dri(virt_domain) ++ ++domain_use_interactive_fds(virt_domain) ++ ++files_read_mnt_symlinks(virt_domain) ++files_read_var_files(virt_domain) ++files_search_all(virt_domain) ++ ++ ++fs_rw_cephfs_files(virt_domain) ++fs_getattr_xattr_fs(virt_domain) ++fs_getattr_tmpfs(virt_domain) ++fs_rw_anon_inodefs_files(virt_domain) ++fs_rw_inherited_tmpfs_files(virt_domain) ++fs_getattr_hugetlbfs(virt_domain) ++fs_rw_inherited_nfs_files(virt_domain) ++fs_rw_inherited_cifs_files(virt_domain) ++fs_rw_inherited_noxattr_fs_files(virt_domain) ++ ++# I think we need these for now. ++miscfiles_read_public_files(virt_domain) ++miscfiles_read_generic_certs(virt_domain) ++ ++storage_raw_read_removable_device(virt_domain) + ++sysnet_read_config(virt_domain) ++ ++term_use_all_inherited_terms(virt_domain) ++term_getattr_pty_fs(virt_domain) ++term_use_generic_ptys(virt_domain) ++term_use_ptmx(virt_domain) ++ ++tunable_policy(`virt_use_execmem',` ++ allow virt_domain self:process { execmem execstack }; ++') ++ ++optional_policy(` ++ alsa_read_rw_config(virt_domain) ++') ++ ++optional_policy(` ++ nscd_dontaudit_write_sock_file(virt_domain) ++') ++ ++optional_policy(` ++ nscd_dontaudit_read_pid(virt_domain) ++') ++ ++optional_policy(` ++ openvswitch_stream_connect(svirt_t) ++') ++ ++optional_policy(` ++ ptchown_domtrans(virt_domain) ++') ++ ++optional_policy(` ++ pulseaudio_dontaudit_exec(virt_domain) ++') ++ ++optional_policy(` ++ sssd_dontaudit_stream_connect(virt_domain) ++ sssd_dontaudit_read_lib(virt_domain) ++ sssd_dontaudit_read_public_files(virt_domain) ++') ++ ++optional_policy(` ++ virt_read_config(virt_domain) ++ virt_read_lib_files(virt_domain) ++ virt_read_content(virt_domain) ++ virt_stream_connect(virt_domain) ++ virt_read_pid_symlinks(virt_domain) ++ virt_domtrans_bridgehelper(virt_domain) ++') ++ ++optional_policy(` ++ xserver_rw_shm(virt_domain) ++') ++ ++tunable_policy(`virt_use_comm',` ++ term_use_unallocated_ttys(virt_domain) ++ dev_rw_printer(virt_domain) ++') ++ ++tunable_policy(`virt_use_fusefs',` ++ fs_manage_fusefs_dirs(virt_domain) ++ fs_manage_fusefs_files(virt_domain) ++ fs_read_fusefs_symlinks(virt_domain) ++ fs_getattr_fusefs(virt_domain) ++') ++ ++optional_policy(` ++ tunable_policy(`virt_use_glusterd',` ++ glusterd_manage_pid(virt_domain) ++ ') ++') ++ ++tunable_policy(`virt_use_nfs',` ++ fs_manage_nfs_dirs(virt_domain) ++ fs_manage_nfs_files(virt_domain) ++ fs_manage_nfs_named_sockets(virt_domain) ++ fs_read_nfs_symlinks(virt_domain) ++ fs_getattr_nfs(virt_domain) ++') ++ ++tunable_policy(`virt_use_samba',` ++ fs_manage_cifs_dirs(virt_domain) ++ fs_manage_cifs_files(virt_domain) ++ fs_manage_cifs_named_sockets(virt_domain) ++ fs_read_cifs_symlinks(virt_domain) ++ fs_getattr_cifs(virt_domain) ++') ++ ++tunable_policy(`virt_use_usb',` ++ dev_rw_usbfs(virt_domain) ++ dev_read_sysfs(virt_domain) ++ fs_getattr_dos_fs(virt_domain) ++ fs_manage_dos_dirs(virt_domain) ++ fs_manage_dos_files(virt_domain) ++') ++ ++optional_policy(` ++ tunable_policy(`virt_use_sanlock',` ++ sanlock_stream_connect(virt_domain) ++ sanlock_read_state(virt_domain) ++ ') ++') ++ ++tunable_policy(`virt_use_rawip',` ++ allow virt_domain self:rawip_socket create_socket_perms; ++') ++ ++optional_policy(` ++ tunable_policy(`virt_use_xserver',` ++ xserver_stream_connect(virt_domain) ++ ') ++') ++ ++######################################## ++# ++# xm local policy ++# ++type virsh_t, virt_system_domain; ++type virsh_exec_t, virt_file_type; ++init_system_domain(virsh_t, virsh_exec_t) ++typealias virsh_t alias xm_t; ++typealias virsh_exec_t alias xm_exec_t; ++ ++allow virsh_t self:capability { setpcap dac_read_search dac_override ipc_lock sys_admin sys_chroot sys_nice sys_tty_config }; ++allow virsh_t self:process { getcap getsched setsched setcap setexec signal }; ++allow virsh_t self:fifo_file rw_fifo_file_perms; ++allow virsh_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow virsh_t self:tcp_socket create_stream_socket_perms; ++ ++ps_process_pattern(virsh_t, svirt_sandbox_domain) ++ ++can_exec(virsh_t, virsh_exec_t) + virt_domtrans(virsh_t) + virt_manage_images(virsh_t) + virt_manage_config(virsh_t) + virt_stream_connect(virsh_t) + +-kernel_read_crypto_sysctls(virsh_t) ++manage_dirs_pattern(virsh_t, virt_lock_t, virt_lock_t) ++manage_files_pattern(virsh_t, virt_lock_t, virt_lock_t) ++manage_lnk_files_pattern(virsh_t, virt_lock_t, virt_lock_t) ++files_lock_filetrans(virsh_t, virt_lock_t, { dir file lnk_file }) ++ ++manage_files_pattern(virsh_t, virt_image_type, virt_image_type) ++manage_blk_files_pattern(virsh_t, virt_image_type, virt_image_type) ++manage_lnk_files_pattern(virsh_t, virt_image_type, virt_image_type) ++ ++manage_dirs_pattern(virsh_t, container_file_t, container_file_t) ++manage_files_pattern(virsh_t, container_file_t, container_file_t) ++manage_chr_files_pattern(virsh_t, container_file_t, container_file_t) ++manage_lnk_files_pattern(virsh_t, container_file_t, container_file_t) ++manage_sock_files_pattern(virsh_t, container_file_t, container_file_t) ++manage_fifo_files_pattern(virsh_t, container_file_t, container_file_t) ++virt_transition_svirt_sandbox(virsh_t, system_r) ++ ++manage_dirs_pattern(virsh_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++manage_files_pattern(virsh_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++virt_filetrans_named_content(virsh_t) ++filetrans_pattern(virsh_t, virt_var_run_t, virt_lxc_var_run_t, dir, "lxc") ++ ++dontaudit virsh_t virt_var_lib_t:file read_inherited_file_perms; ++ ++kernel_write_proc_files(virsh_t) + kernel_read_system_state(virsh_t) + kernel_read_network_state(virsh_t) + kernel_read_kernel_sysctls(virsh_t) +@@ -794,25 +1085,18 @@ kernel_write_xen_state(virsh_t) + corecmd_exec_bin(virsh_t) + corecmd_exec_shell(virsh_t) + +-corenet_all_recvfrom_unlabeled(virsh_t) +-corenet_all_recvfrom_netlabel(virsh_t) + corenet_tcp_sendrecv_generic_if(virsh_t) + corenet_tcp_sendrecv_generic_node(virsh_t) +-corenet_tcp_bind_generic_node(virsh_t) +- +-corenet_sendrecv_soundd_client_packets(virsh_t) + corenet_tcp_connect_soundd_port(virsh_t) +-corenet_tcp_sendrecv_soundd_port(virsh_t) + + dev_read_rand(virsh_t) + dev_read_urand(virsh_t) + dev_read_sysfs(virsh_t) + + files_read_etc_runtime_files(virsh_t) +-files_read_etc_files(virsh_t) +-files_read_usr_files(virsh_t) + files_list_mnt(virsh_t) + files_list_tmp(virsh_t) ++# Some common macros (you might be able to remove some) + + fs_getattr_all_fs(virsh_t) + fs_manage_xenfs_dirs(virsh_t) +@@ -821,23 +1105,25 @@ fs_search_auto_mountpoints(virsh_t) + + storage_raw_read_fixed_disk(virsh_t) + +-term_use_all_terms(virsh_t) ++term_use_all_inherited_terms(virsh_t) ++term_dontaudit_use_generic_ptys(virsh_t) ++ ++userdom_search_admin_dir(virsh_t) ++userdom_read_home_certs(virsh_t) + + init_stream_connect_script(virsh_t) + init_rw_script_stream_sockets(virsh_t) + init_use_fds(virsh_t) + +-logging_send_syslog_msg(virsh_t) ++systemd_exec_systemctl(virsh_t) ++ ++auth_read_passwd(virsh_t) + +-miscfiles_read_localization(virsh_t) ++logging_send_syslog_msg(virsh_t) + + sysnet_dns_name_resolve(virsh_t) + +-tunable_policy(`virt_use_fusefs',` +- fs_manage_fusefs_dirs(virsh_t) +- fs_manage_fusefs_files(virsh_t) +- fs_read_fusefs_symlinks(virsh_t) +-') ++userdom_stream_connect(virsh_t) + + tunable_policy(`virt_use_nfs',` + fs_manage_nfs_dirs(virsh_t) +@@ -855,15 +1141,21 @@ optional_policy(` + cron_system_entry(virsh_t, virsh_exec_t) + ') + ++optional_policy(` ++ rhcs_domtrans_fenced(virsh_t) ++') ++ + optional_policy(` + rpm_exec(virsh_t) + ') + + optional_policy(` + xen_manage_image_dirs(virsh_t) ++ xen_read_image_files(virsh_t) ++ xen_read_lib_files(virsh_t) + xen_append_log(virsh_t) + xen_domtrans(virsh_t) +- xen_read_xenstored_pid_files(virsh_t) ++ xen_read_pid_files_xenstored(virsh_t) + xen_stream_connect(virsh_t) + xen_stream_connect_xenstore(virsh_t) + ') +@@ -888,49 +1180,66 @@ optional_policy(` + kernel_read_xen_state(virsh_ssh_t) + kernel_write_xen_state(virsh_ssh_t) + ++ dontaudit virsh_ssh_t virsh_transition_domain:fifo_file rw_inherited_fifo_file_perms; + files_search_tmp(virsh_ssh_t) + + fs_manage_xenfs_dirs(virsh_ssh_t) + fs_manage_xenfs_files(virsh_ssh_t) ++ ++ userdom_search_admin_dir(virsh_ssh_t) + ') + + ######################################## + # +-# Lxc local policy ++# virt_lxc local policy + # ++allow virtd_lxc_t self:bpf { map_read map_write prog_load map_create prog_run }; ++allow virtd_lxc_t self:capability { dac_read_search dac_override net_admin net_raw setpcap chown sys_admin sys_boot sys_resource setuid sys_nice setgid }; ++allow virtd_lxc_t self:process { setsockcreate transition setpgid signal_perms }; ++allow virtd_lxc_t self:capability2 compromise_kernel; + +-allow virtd_lxc_t self:capability { dac_override net_admin net_raw setpcap chown sys_admin sys_boot sys_resource }; + allow virtd_lxc_t self:process { setexec setrlimit setsched getcap setcap signal_perms }; + allow virtd_lxc_t self:fifo_file rw_fifo_file_perms; +-allow virtd_lxc_t self:netlink_route_socket nlmsg_write; +-allow virtd_lxc_t self:unix_stream_socket { accept listen }; ++allow virtd_lxc_t self:netlink_route_socket rw_netlink_socket_perms; ++allow virtd_lxc_t self:unix_stream_socket { connectto create_stream_socket_perms }; + allow virtd_lxc_t self:packet_socket create_socket_perms; ++ps_process_pattern(virtd_lxc_t, svirt_sandbox_domain) ++allow virtd_t virtd_lxc_t:unix_stream_socket create_stream_socket_perms; + +-allow virtd_lxc_t svirt_lxc_domain:process { getattr getsched setsched transition signal signull sigkill }; ++files_entrypoint_all_files(virtd_lxc_t) + + allow virtd_lxc_t virt_image_type:dir mounton; + manage_files_pattern(virtd_lxc_t, virt_image_t, virt_image_t) + ++domtrans_pattern(virtd_t, virtd_lxc_exec_t, virtd_lxc_t) ++allow virtd_t virtd_lxc_t:process { getattr noatsecure signal_perms }; ++ + allow virtd_lxc_t virt_var_run_t:dir search_dir_perms; +-manage_dirs_pattern(virtd_lxc_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-manage_files_pattern(virtd_lxc_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-manage_sock_files_pattern(virtd_lxc_t, virtd_lxc_var_run_t, virtd_lxc_var_run_t) +-files_pid_filetrans(virtd_lxc_t, virtd_lxc_var_run_t, { file dir }) +- +-manage_dirs_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_files_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_chr_files_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_lnk_files_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_sock_files_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_fifo_files_pattern(virtd_lxc_t, svirt_lxc_file_t, svirt_lxc_file_t) +-allow virtd_lxc_t svirt_lxc_file_t:dir_file_class_set { relabelto relabelfrom }; +-allow virtd_lxc_t svirt_lxc_file_t:filesystem { relabelto relabelfrom }; ++manage_dirs_pattern(virtd_lxc_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++manage_files_pattern(virtd_lxc_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++manage_sock_files_pattern(virtd_lxc_t, virt_lxc_var_run_t, virt_lxc_var_run_t) ++files_pid_filetrans(virtd_lxc_t, virt_lxc_var_run_t, { file dir }) ++filetrans_pattern(virtd_lxc_t, virt_var_run_t, virt_lxc_var_run_t, dir, "lxc") ++ ++manage_dirs_pattern(virtd_lxc_t, container_file_t, container_file_t) ++manage_files_pattern(virtd_lxc_t, container_file_t, container_file_t) ++manage_chr_files_pattern(virtd_lxc_t, container_file_t, container_file_t) ++manage_lnk_files_pattern(virtd_lxc_t, container_file_t, container_file_t) ++manage_sock_files_pattern(virtd_lxc_t, container_file_t, container_file_t) ++manage_fifo_files_pattern(virtd_lxc_t, container_file_t, container_file_t) ++allow virtd_lxc_t container_file_t:dir_file_class_set { relabelto relabelfrom }; ++allow virtd_lxc_t container_file_t:filesystem { relabelto relabelfrom }; ++files_associate_rootfs(container_file_t) ++ ++seutil_read_file_contexts(virtd_lxc_t) + + storage_manage_fixed_disk(virtd_lxc_t) ++storage_rw_fuse(virtd_lxc_t) + + kernel_read_all_sysctls(virtd_lxc_t) + kernel_read_network_state(virtd_lxc_t) + kernel_read_system_state(virtd_lxc_t) ++kernel_request_load_module(virtd_lxc_t) + + corecmd_exec_bin(virtd_lxc_t) + corecmd_exec_shell(virtd_lxc_t) +@@ -942,17 +1251,16 @@ dev_read_urand(virtd_lxc_t) + + domain_use_interactive_fds(virtd_lxc_t) + +-files_associate_rootfs(svirt_lxc_file_t) + files_search_all(virtd_lxc_t) + files_getattr_all_files(virtd_lxc_t) +-files_read_usr_files(virtd_lxc_t) + files_relabel_rootfs(virtd_lxc_t) + files_mounton_non_security(virtd_lxc_t) + files_mount_all_file_type_fs(virtd_lxc_t) + files_unmount_all_file_type_fs(virtd_lxc_t) + files_list_isid_type_dirs(virtd_lxc_t) +-files_root_filetrans(virtd_lxc_t, svirt_lxc_file_t, dir_file_class_set) ++files_root_filetrans(virtd_lxc_t, container_file_t, dir_file_class_set) + ++fs_read_fusefs_files(virtd_lxc_t) + fs_getattr_all_fs(virtd_lxc_t) + fs_manage_tmpfs_dirs(virtd_lxc_t) + fs_manage_tmpfs_chr_files(virtd_lxc_t) +@@ -964,15 +1272,11 @@ fs_rw_cgroup_files(virtd_lxc_t) + fs_unmount_all_fs(virtd_lxc_t) + fs_relabelfrom_tmpfs(virtd_lxc_t) + ++logging_send_audit_msgs(virtd_lxc_t) ++ + selinux_mount_fs(virtd_lxc_t) + selinux_unmount_fs(virtd_lxc_t) +-selinux_get_enforce_mode(virtd_lxc_t) +-selinux_get_fs_mount(virtd_lxc_t) +-selinux_validate_context(virtd_lxc_t) +-selinux_compute_access_vector(virtd_lxc_t) +-selinux_compute_create_context(virtd_lxc_t) +-selinux_compute_relabel_context(virtd_lxc_t) +-selinux_compute_user_contexts(virtd_lxc_t) ++seutil_read_config(virtd_lxc_t) + + term_use_generic_ptys(virtd_lxc_t) + term_use_ptmx(virtd_lxc_t) +@@ -982,186 +1286,296 @@ auth_use_nsswitch(virtd_lxc_t) + + logging_send_syslog_msg(virtd_lxc_t) + +-miscfiles_read_localization(virtd_lxc_t) +- + seutil_domtrans_setfiles(virtd_lxc_t) +-seutil_read_config(virtd_lxc_t) + seutil_read_default_contexts(virtd_lxc_t) + +-sysnet_domtrans_ifconfig(virtd_lxc_t) ++selinux_get_enforce_mode(virtd_lxc_t) ++selinux_get_fs_mount(virtd_lxc_t) ++selinux_validate_context(virtd_lxc_t) ++selinux_compute_access_vector(virtd_lxc_t) ++selinux_compute_create_context(virtd_lxc_t) ++selinux_compute_relabel_context(virtd_lxc_t) ++selinux_compute_user_contexts(virtd_lxc_t) + +-######################################## +-# +-# Common virt lxc domain local policy +-# ++sysnet_exec_ifconfig(virtd_lxc_t) + +-allow svirt_lxc_domain self:capability { kill setuid setgid dac_override sys_boot }; +-allow svirt_lxc_domain self:process { execstack execmem getattr signal_perms getsched setsched setcap setpgid }; +-allow svirt_lxc_domain self:fifo_file manage_file_perms; +-allow svirt_lxc_domain self:sem create_sem_perms; +-allow svirt_lxc_domain self:shm create_shm_perms; +-allow svirt_lxc_domain self:msgq create_msgq_perms; +-allow svirt_lxc_domain self:unix_stream_socket { create_stream_socket_perms connectto }; +-allow svirt_lxc_domain self:unix_dgram_socket { sendto create_socket_perms }; ++systemd_dbus_chat_machined(virtd_lxc_t) + +-allow svirt_lxc_domain virtd_lxc_t:fd use; +-allow svirt_lxc_domain virtd_lxc_t:fifo_file rw_fifo_file_perms; +-allow svirt_lxc_domain virtd_lxc_t:process sigchld; ++userdom_read_admin_home_files(virtd_lxc_t) + +-allow svirt_lxc_domain virtd_lxc_t:unix_stream_socket { connectto rw_socket_perms }; ++optional_policy(` ++ container_exec_lib(virtd_lxc_t) ++') + +-allow svirt_lxc_domain virsh_t:fd use; +-allow svirt_lxc_domain virsh_t:fifo_file rw_fifo_file_perms; +-allow svirt_lxc_domain virsh_t:process sigchld; ++optional_policy(` ++ dbus_system_bus_client(virtd_lxc_t) ++ init_dbus_chat(virtd_lxc_t) + +-allow svirt_lxc_domain virtd_lxc_var_run_t:dir list_dir_perms; +-allow svirt_lxc_domain virtd_lxc_var_run_t:file read_file_perms; ++ optional_policy(` ++ hal_dbus_chat(virtd_lxc_t) ++ ') ++') + +-manage_dirs_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_lnk_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_sock_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-manage_fifo_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-rw_chr_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) +-rw_blk_files_pattern(svirt_lxc_domain, svirt_lxc_file_t, svirt_lxc_file_t) ++optional_policy(` ++ gnome_read_generic_cache_files(virtd_lxc_t) ++') + +-allow svirt_lxc_net_t svirt_lxc_file_t:dir mounton; +-allow svirt_lxc_net_t svirt_lxc_file_t:filesystem getattr; ++optional_policy(` ++ setrans_manage_pid_files(virtd_lxc_t) ++') + +-can_exec(svirt_lxc_domain, svirt_lxc_file_t) ++optional_policy(` ++ unconfined_domain(virtd_lxc_t) ++') + +-kernel_getattr_proc(svirt_lxc_domain) +-kernel_list_all_proc(svirt_lxc_domain) +-kernel_read_kernel_sysctls(svirt_lxc_domain) +-kernel_rw_net_sysctls(svirt_lxc_domain) +-kernel_read_system_state(svirt_lxc_domain) +-kernel_dontaudit_search_kernel_sysctl(svirt_lxc_domain) ++######################################## ++# ++# svirt_sandbox_domain local policy ++# ++allow svirt_sandbox_domain self:key manage_key_perms; ++dontaudit svirt_sandbox_domain svirt_sandbox_domain:key search; ++ ++allow svirt_sandbox_domain self:process { getattr signal_perms getsched getpgid getcap setsched setcap setpgid setrlimit }; ++allow svirt_sandbox_domain self:fifo_file manage_file_perms; ++allow svirt_sandbox_domain self:msg all_msg_perms; ++allow svirt_sandbox_domain self:sem create_sem_perms; ++allow svirt_sandbox_domain self:shm create_shm_perms; ++allow svirt_sandbox_domain self:msgq create_msgq_perms; ++allow svirt_sandbox_domain self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow svirt_sandbox_domain self:unix_dgram_socket { sendto create_socket_perms }; ++allow svirt_sandbox_domain self:passwd rootok; ++allow svirt_sandbox_domain self:filesystem associate; ++allow svirt_sandbox_domain self:netlink_kobject_uevent_socket create_socket_perms; ++ ++tunable_policy(`deny_ptrace',`',` ++ allow svirt_sandbox_domain self:process ptrace; ++') + +-corecmd_exec_all_executables(svirt_lxc_domain) ++allow virtd_t svirt_sandbox_domain:unix_stream_socket { create_stream_socket_perms connectto }; ++allow virtd_t svirt_sandbox_domain:process { signal_perms getattr }; ++allow virtd_lxc_t svirt_sandbox_domain:process { getattr getsched setsched setrlimit transition signal_perms }; ++ ++allow svirt_sandbox_domain virtd_lxc_t:process sigchld; ++allow svirt_sandbox_domain virtd_lxc_t:fd use; ++allow svirt_sandbox_domain virtd_lxc_t:unix_stream_socket { connectto rw_socket_perms }; ++ ++manage_dirs_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++manage_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++manage_lnk_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++manage_sock_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++manage_fifo_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++manage_chr_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++allow svirt_sandbox_domain container_file_t:file { execmod relabelfrom relabelto }; ++ ++allow svirt_sandbox_domain container_file_t:blk_file setattr; ++rw_blk_files_pattern(svirt_sandbox_domain, container_file_t, container_file_t) ++can_exec(svirt_sandbox_domain, container_file_t) ++allow svirt_sandbox_domain container_file_t:dir mounton; ++allow svirt_sandbox_domain container_file_t:filesystem getattr; ++ ++kernel_getattr_proc(svirt_sandbox_domain) ++kernel_list_all_proc(svirt_sandbox_domain) ++kernel_read_all_proc(svirt_sandbox_domain) ++kernel_read_all_sysctls(svirt_sandbox_domain) ++kernel_read_net_sysctls(svirt_sandbox_domain) ++kernel_rw_unix_sysctls(svirt_sandbox_domain) ++kernel_dontaudit_search_kernel_sysctl(svirt_sandbox_domain) ++kernel_dontaudit_access_check_proc(svirt_sandbox_domain) ++kernel_dontaudit_setattr_proc_files(svirt_sandbox_domain) ++kernel_dontaudit_setattr_proc_dirs(svirt_sandbox_domain) ++ ++corecmd_exec_all_executables(svirt_sandbox_domain) ++ ++domain_dontaudit_link_keys(svirt_sandbox_domain) ++ ++files_dontaudit_getattr_all_dirs(svirt_sandbox_domain) ++files_dontaudit_getattr_all_files(svirt_sandbox_domain) ++files_dontaudit_getattr_all_symlinks(svirt_sandbox_domain) ++files_dontaudit_getattr_all_pipes(svirt_sandbox_domain) ++files_dontaudit_getattr_all_sockets(svirt_sandbox_domain) ++files_search_all_mountpoints(svirt_sandbox_domain) ++files_dontaudit_list_all_mountpoints(svirt_sandbox_domain) ++files_dontaudit_write_etc_runtime_files(svirt_sandbox_domain) ++files_entrypoint_all_files(svirt_sandbox_domain) ++files_list_var(svirt_sandbox_domain) ++files_list_var_lib(svirt_sandbox_domain) ++files_search_all(svirt_sandbox_domain) ++files_read_config_files(svirt_sandbox_domain) ++files_read_usr_symlinks(svirt_sandbox_domain) ++files_search_locks(svirt_sandbox_domain) ++files_dontaudit_unmount_all_mountpoints(svirt_sandbox_domain) ++fs_rw_cephfs_files(svirt_sandbox_domain) ++ ++fs_getattr_all_fs(svirt_sandbox_domain) ++fs_list_inotifyfs(svirt_sandbox_domain) ++fs_rw_inherited_tmpfs_files(svirt_sandbox_domain) ++fs_read_fusefs_files(svirt_sandbox_domain) ++fs_read_hugetlbfs_files(svirt_sandbox_domain) ++fs_read_tmpfs_symlinks(svirt_sandbox_domain) ++fs_list_tmpfs(svirt_sandbox_domain) ++fs_rw_hugetlbfs_files(svirt_sandbox_domain) ++fs_rw_onload_sockets(svirt_sandbox_domain) ++ ++auth_dontaudit_read_passwd(svirt_sandbox_domain) ++auth_dontaudit_read_login_records(svirt_sandbox_domain) ++auth_dontaudit_write_login_records(svirt_sandbox_domain) ++auth_search_pam_console_data(svirt_sandbox_domain) ++ ++clock_read_adjtime(svirt_sandbox_domain) ++ ++init_read_utmp(svirt_sandbox_domain) ++init_dontaudit_write_utmp(svirt_sandbox_domain) ++ ++libs_dontaudit_setattr_lib_files(svirt_sandbox_domain) ++ ++miscfiles_dontaudit_access_check_cert(svirt_sandbox_domain) ++miscfiles_dontaudit_setattr_fonts_cache_dirs(svirt_sandbox_domain) ++miscfiles_read_fonts(svirt_sandbox_domain) ++miscfiles_read_hwdata(svirt_sandbox_domain) ++ ++systemd_read_unit_files(svirt_sandbox_domain) ++ ++userdom_use_inherited_user_terminals(svirt_sandbox_domain) ++userdom_dontaudit_append_inherited_admin_home_file(svirt_sandbox_domain) ++userdom_dontaudit_read_inherited_admin_home_files(svirt_sandbox_domain) + +-files_dontaudit_getattr_all_dirs(svirt_lxc_domain) +-files_dontaudit_getattr_all_files(svirt_lxc_domain) +-files_dontaudit_getattr_all_symlinks(svirt_lxc_domain) +-files_dontaudit_getattr_all_pipes(svirt_lxc_domain) +-files_dontaudit_getattr_all_sockets(svirt_lxc_domain) +-files_dontaudit_list_all_mountpoints(svirt_lxc_domain) +-files_dontaudit_write_etc_runtime_files(svirt_lxc_domain) +-# files_entrypoint_all_files(svirt_lxc_domain) +-files_list_var(svirt_lxc_domain) +-files_list_var_lib(svirt_lxc_domain) +-files_search_all(svirt_lxc_domain) +-files_read_config_files(svirt_lxc_domain) +-files_read_usr_files(svirt_lxc_domain) +-files_read_usr_symlinks(svirt_lxc_domain) ++optional_policy(` ++ apache_exec_modules(svirt_sandbox_domain) ++ apache_read_sys_content(svirt_sandbox_domain) ++') + +-fs_getattr_all_fs(svirt_lxc_domain) +-fs_list_inotifyfs(svirt_lxc_domain) ++optional_policy(` ++ gear_read_pid_files(svirt_sandbox_domain) ++') + +-# fs_rw_inherited_tmpfs_files(svirt_lxc_domain) +-# fs_rw_inherited_cifs_files(svirt_lxc_domain) +-# fs_rw_inherited_noxattr_fs_files(svirt_lxc_domain) ++optional_policy(` ++ mta_dontaudit_read_spool_symlinks(svirt_sandbox_domain) ++') + +-auth_dontaudit_read_login_records(svirt_lxc_domain) +-auth_dontaudit_write_login_records(svirt_lxc_domain) +-auth_search_pam_console_data(svirt_lxc_domain) ++optional_policy(` ++ ssh_use_ptys(svirt_sandbox_domain) ++') + +-clock_read_adjtime(svirt_lxc_domain) ++optional_policy(` ++ udev_read_pid_files(svirt_sandbox_domain) ++') + +-init_read_utmp(svirt_lxc_domain) +-init_dontaudit_write_utmp(svirt_lxc_domain) ++optional_policy(` ++ userhelper_dontaudit_write_config(svirt_sandbox_domain) ++') + +-libs_dontaudit_setattr_lib_files(svirt_lxc_domain) ++tunable_policy(`virt_use_nfs',` ++ fs_manage_nfs_dirs(svirt_sandbox_domain) ++ fs_manage_nfs_files(svirt_sandbox_domain) ++ fs_manage_nfs_named_sockets(svirt_sandbox_domain) ++ fs_manage_nfs_symlinks(svirt_sandbox_domain) ++') + +-miscfiles_read_localization(svirt_lxc_domain) +-miscfiles_dontaudit_setattr_fonts_cache_dirs(svirt_lxc_domain) +-miscfiles_read_fonts(svirt_lxc_domain) ++tunable_policy(`virt_use_samba',` ++ fs_manage_cifs_files(svirt_sandbox_domain) ++ fs_manage_cifs_dirs(svirt_sandbox_domain) ++ fs_manage_cifs_named_sockets(svirt_sandbox_domain) ++ fs_manage_cifs_symlinks(svirt_sandbox_domain) ++') + +-mta_dontaudit_read_spool_symlinks(svirt_lxc_domain) ++tunable_policy(`virt_sandbox_use_fusefs',` ++ fs_manage_fusefs_dirs(svirt_sandbox_domain) ++ fs_manage_fusefs_files(svirt_sandbox_domain) ++ fs_manage_fusefs_symlinks(svirt_sandbox_domain) ++') + + optional_policy(` +- udev_read_pid_files(svirt_lxc_domain) ++ fs_dontaudit_remount_tmpfs(svirt_sandbox_domain) ++ dev_dontaudit_mounton_sysfs(svirt_sandbox_domain) + ') + + optional_policy(` +- apache_exec_modules(svirt_lxc_domain) +- apache_read_sys_content(svirt_lxc_domain) ++ container_read_share_files(svirt_sandbox_domain) ++ container_exec_share_files(svirt_sandbox_domain) ++ container_lib_filetrans(svirt_sandbox_domain,container_file_t, sock_file) ++ container_use_ptys(svirt_sandbox_domain) + ') + + ######################################## + # +-# Lxc net local policy ++# container_t local policy + # ++virt_sandbox_domain_template(container) ++typealias container_t alias svirt_lxc_net_t; ++# Policy moved to container-selinux policy package + +-allow svirt_lxc_net_t self:capability { chown dac_read_search dac_override fowner fsetid net_raw net_admin sys_admin sys_nice sys_ptrace sys_resource setpcap }; +-dontaudit svirt_lxc_net_t self:capability2 block_suspend; +-allow svirt_lxc_net_t self:process setrlimit; +-allow svirt_lxc_net_t self:tcp_socket { accept listen }; +-allow svirt_lxc_net_t self:netlink_route_socket nlmsg_write; +-allow svirt_lxc_net_t self:packet_socket create_socket_perms; +-allow svirt_lxc_net_t self:socket create_socket_perms; +-allow svirt_lxc_net_t self:rawip_socket create_socket_perms; +-allow svirt_lxc_net_t self:netlink_socket create_socket_perms; +-allow svirt_lxc_net_t self:netlink_tcpdiag_socket create_socket_perms; +-allow svirt_lxc_net_t self:netlink_kobject_uevent_socket create_socket_perms; ++######################################## ++# ++# svirt_lxc_net_t local policy ++# ++virt_sandbox_domain_template(svirt_qemu_net) ++typeattribute svirt_qemu_net_t sandbox_net_domain; + +-kernel_read_network_state(svirt_lxc_net_t) +-kernel_read_irq_sysctls(svirt_lxc_net_t) ++allow svirt_qemu_net_t self:capability { kill setuid setgid sys_boot ipc_lock chown dac_read_search dac_override fowner fsetid sys_chroot sys_admin sys_nice sys_ptrace sys_resource setpcap }; ++dontaudit svirt_qemu_net_t self:capability2 block_suspend; ++allow svirt_qemu_net_t self:process { execstack execmem }; + +-corenet_all_recvfrom_unlabeled(svirt_lxc_net_t) +-corenet_all_recvfrom_netlabel(svirt_lxc_net_t) +-corenet_tcp_sendrecv_generic_if(svirt_lxc_net_t) +-corenet_udp_sendrecv_generic_if(svirt_lxc_net_t) +-corenet_tcp_sendrecv_generic_node(svirt_lxc_net_t) +-corenet_udp_sendrecv_generic_node(svirt_lxc_net_t) +-corenet_tcp_sendrecv_all_ports(svirt_lxc_net_t) +-corenet_udp_sendrecv_all_ports(svirt_lxc_net_t) +-corenet_tcp_bind_generic_node(svirt_lxc_net_t) +-corenet_udp_bind_generic_node(svirt_lxc_net_t) ++tunable_policy(`virt_sandbox_use_netlink',` ++ allow svirt_qemu_net_t self:netlink_socket create_socket_perms; ++ allow svirt_qemu_net_t self:netlink_tcpdiag_socket create_netlink_socket_perms; ++ allow svirt_qemu_net_t self:netlink_kobject_uevent_socket create_socket_perms; ++') + +-corenet_sendrecv_all_server_packets(svirt_lxc_net_t) +-corenet_udp_bind_all_ports(svirt_lxc_net_t) +-corenet_tcp_bind_all_ports(svirt_lxc_net_t) ++manage_dirs_pattern(sandbox_net_domain, svirt_home_t, svirt_home_t) ++manage_files_pattern(sandbox_net_domain, svirt_home_t, svirt_home_t) ++manage_fifo_files_pattern(sandbox_net_domain, svirt_home_t, svirt_home_t) ++manage_lnk_files_pattern(sandbox_net_domain, svirt_home_t, svirt_home_t) ++manage_sock_files_pattern(sandbox_net_domain, svirt_home_t, svirt_home_t) ++filetrans_pattern(sandbox_net_domain, virt_home_t, svirt_home_t, { dir sock_file file }) + +-corenet_sendrecv_all_client_packets(svirt_lxc_net_t) +-corenet_tcp_connect_all_ports(svirt_lxc_net_t) ++term_use_generic_ptys(svirt_qemu_net_t) ++term_use_ptmx(svirt_qemu_net_t) + +-dev_getattr_mtrr_dev(svirt_lxc_net_t) +-dev_read_rand(svirt_lxc_net_t) +-dev_read_sysfs(svirt_lxc_net_t) +-dev_read_urand(svirt_lxc_net_t) ++dev_rw_kvm(svirt_qemu_net_t) + +-files_read_kernel_modules(svirt_lxc_net_t) ++manage_sock_files_pattern(svirt_qemu_net_t, qemu_var_run_t, qemu_var_run_t) + +-fs_mount_cgroup(svirt_lxc_net_t) +-fs_manage_cgroup_dirs(svirt_lxc_net_t) +-fs_rw_cgroup_files(svirt_lxc_net_t) ++list_dirs_pattern(svirt_qemu_net_t, virt_content_t, virt_content_t) ++read_files_pattern(svirt_qemu_net_t, virt_content_t, virt_content_t) + +-auth_use_nsswitch(svirt_lxc_net_t) ++append_files_pattern(svirt_qemu_net_t, virt_log_t, virt_log_t) + +-logging_send_audit_msgs(svirt_lxc_net_t) ++kernel_read_irq_sysctls(svirt_qemu_net_t) + +-userdom_use_user_ptys(svirt_lxc_net_t) ++dev_read_sysfs(svirt_qemu_net_t) ++dev_getattr_mtrr_dev(svirt_qemu_net_t) ++dev_read_rand(svirt_qemu_net_t) ++dev_read_urand(svirt_qemu_net_t) + +-optional_policy(` +- rpm_read_db(svirt_lxc_net_t) +-') ++files_read_kernel_modules(svirt_qemu_net_t) + +-####################################### +-# +-# Prot exec local policy +-# ++fs_noxattr_type(container_file_t) ++fs_mount_cgroup(svirt_qemu_net_t) ++fs_manage_cgroup_dirs(svirt_qemu_net_t) ++fs_manage_cgroup_files(svirt_qemu_net_t) ++ ++term_pty(container_file_t) ++ ++auth_use_nsswitch(svirt_qemu_net_t) ++ ++rpm_read_db(svirt_qemu_net_t) + +-allow svirt_prot_exec_t self:process { execmem execstack }; ++logging_send_syslog_msg(svirt_qemu_net_t) ++ ++tunable_policy(`virt_sandbox_use_audit',` ++ logging_send_audit_msgs(svirt_qemu_net_t) ++') ++ ++userdom_use_user_ptys(svirt_qemu_net_t) + + ######################################## + # +-# Qmf local policy ++# virt_qmf local policy + # +- + allow virt_qmf_t self:capability { sys_nice sys_tty_config }; + allow virt_qmf_t self:process { setsched signal }; + allow virt_qmf_t self:fifo_file rw_fifo_file_perms; +-allow virt_qmf_t self:unix_stream_socket { accept listen }; ++allow virt_qmf_t self:unix_stream_socket create_stream_socket_perms; + allow virt_qmf_t self:tcp_socket create_stream_socket_perms; + allow virt_qmf_t self:netlink_route_socket create_netlink_socket_perms; + +@@ -1174,12 +1588,12 @@ dev_read_sysfs(virt_qmf_t) + dev_read_rand(virt_qmf_t) + dev_read_urand(virt_qmf_t) + ++corenet_tcp_connect_matahari_port(virt_qmf_t) ++ + domain_use_interactive_fds(virt_qmf_t) + + logging_send_syslog_msg(virt_qmf_t) + +-miscfiles_read_localization(virt_qmf_t) +- + sysnet_read_config(virt_qmf_t) + + optional_policy(` +@@ -1192,9 +1606,8 @@ optional_policy(` + + ######################################## + # +-# Bridgehelper local policy ++# virt_bridgehelper local policy + # +- + allow virt_bridgehelper_t self:process { setcap getcap }; + allow virt_bridgehelper_t self:capability { setpcap setgid setuid net_admin }; + allow virt_bridgehelper_t self:tcp_socket create_stream_socket_perms; +@@ -1207,5 +1620,249 @@ kernel_read_network_state(virt_bridgehelper_t) + + corenet_rw_tun_tap_dev(virt_bridgehelper_t) + +-userdom_search_user_home_dirs(virt_bridgehelper_t) +-userdom_use_user_ptys(virt_bridgehelper_t) ++userdom_use_inherited_user_ptys(virt_bridgehelper_t) ++ ++####################################### ++# ++# virt_qemu_ga local policy ++# ++ ++allow virt_qemu_ga_t self:capability { sys_admin sys_time sys_tty_config }; ++ ++allow virt_qemu_ga_t self:passwd passwd; ++ ++allow virt_qemu_ga_t self:fifo_file rw_fifo_file_perms; ++allow virt_qemu_ga_t self:unix_stream_socket create_stream_socket_perms; ++ ++allow virt_qemu_ga_t virt_qemu_ga_exec_t:dir search_dir_perms; ++can_exec(virt_qemu_ga_t, virt_qemu_ga_exec_t) ++ ++manage_dirs_pattern(virt_qemu_ga_t, virt_qemu_ga_tmp_t, virt_qemu_ga_tmp_t) ++manage_files_pattern(virt_qemu_ga_t, virt_qemu_ga_tmp_t, virt_qemu_ga_tmp_t) ++files_tmp_filetrans(virt_qemu_ga_t, virt_qemu_ga_tmp_t, { file dir }) ++ ++manage_files_pattern(virt_qemu_ga_t, virt_qemu_ga_var_run_t, virt_qemu_ga_var_run_t) ++manage_dirs_pattern(virt_qemu_ga_t, virt_qemu_ga_var_run_t, virt_qemu_ga_var_run_t) ++files_pid_filetrans(virt_qemu_ga_t, virt_qemu_ga_var_run_t, { dir file } ) ++ ++manage_dirs_pattern(virt_qemu_ga_t, virt_qemu_ga_log_t, virt_qemu_ga_log_t) ++manage_files_pattern(virt_qemu_ga_t, virt_qemu_ga_log_t, virt_qemu_ga_log_t) ++logging_log_filetrans(virt_qemu_ga_t, virt_qemu_ga_log_t, { dir file }) ++ ++kernel_read_system_state(virt_qemu_ga_t) ++kernel_read_network_state(virt_qemu_ga_t) ++kernel_rw_kernel_sysctl(virt_qemu_ga_t) ++ ++corecmd_exec_shell(virt_qemu_ga_t) ++corecmd_exec_bin(virt_qemu_ga_t) ++ ++clock_read_adjtime(virt_qemu_ga_t) ++ ++dev_getattr_apm_bios_dev(virt_qemu_ga_t) ++dev_rw_sysfs(virt_qemu_ga_t) ++dev_rw_realtime_clock(virt_qemu_ga_t) ++ ++files_list_all_mountpoints(virt_qemu_ga_t) ++files_write_all_mountpoints(virt_qemu_ga_t) ++ ++fs_list_all(virt_qemu_ga_t) ++fs_getattr_all_fs(virt_qemu_ga_t) ++ ++term_use_virtio_console(virt_qemu_ga_t) ++term_use_all_ttys(virt_qemu_ga_t) ++term_use_unallocated_ttys(virt_qemu_ga_t) ++ ++auth_use_nsswitch(virt_qemu_ga_t) ++ ++logging_send_syslog_msg(virt_qemu_ga_t) ++logging_send_audit_msgs(virt_qemu_ga_t) ++ ++init_read_utmp(virt_qemu_ga_t) ++ ++modutils_exec_insmod(virt_qemu_ga_t) ++ ++sysnet_dns_name_resolve(virt_qemu_ga_t) ++ ++systemd_exec_systemctl(virt_qemu_ga_t) ++systemd_start_power_services(virt_qemu_ga_t) ++ ++userdom_use_user_ptys(virt_qemu_ga_t) ++ ++usermanage_domtrans_passwd(virt_qemu_ga_t) ++ ++tunable_policy(`virt_read_qemu_ga_data',` ++ read_files_pattern(virt_qemu_ga_t, virt_qemu_ga_data_t, virt_qemu_ga_data_t) ++ read_lnk_files_pattern(virt_qemu_ga_t, virt_qemu_ga_data_t, virt_qemu_ga_data_t) ++') ++ ++tunable_policy(`virt_rw_qemu_ga_data',` ++ manage_files_pattern(virt_qemu_ga_t, virt_qemu_ga_data_t, virt_qemu_ga_data_t) ++ manage_lnk_files_pattern(virt_qemu_ga_t, virt_qemu_ga_data_t, virt_qemu_ga_data_t) ++ manage_dirs_pattern(virt_qemu_ga_t, virt_qemu_ga_data_t, virt_qemu_ga_data_t) ++') ++ ++optional_policy(` ++ bootloader_domtrans(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ clock_domtrans(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ cron_initrc_domtrans(virt_qemu_ga_t) ++ cron_domtrans(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ devicekit_manage_pid_files(virt_qemu_ga_t) ++ devicekit_read_log_files(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ fstools_domtrans(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ rpm_dbus_chat(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ shutdown_domtrans(virt_qemu_ga_t) ++') ++ ++optional_policy(` ++ udev_read_pid_files(virt_qemu_ga_t) ++') ++ ++####################################### ++# ++# qemu-ga unconfined hook script local policy ++# ++ ++optional_policy(` ++ type virt_qemu_ga_unconfined_t; ++ domain_type(virt_qemu_ga_unconfined_t) ++ ++ domain_entry_file(virt_qemu_ga_unconfined_t, virt_qemu_ga_unconfined_exec_t) ++ role system_r types virt_qemu_ga_unconfined_t; ++ ++ domtrans_pattern(virt_qemu_ga_t, virt_qemu_ga_unconfined_exec_t, virt_qemu_ga_unconfined_t) ++ ++ allow virt_qemu_ga_t virt_qemu_ga_unconfined_exec_t:dir search_dir_perms; ++ allow virt_qemu_ga_t virt_qemu_ga_unconfined_exec_t:dir read_file_perms; ++ allow virt_qemu_ga_t virt_qemu_ga_unconfined_exec_t:file ioctl; ++ ++ init_domtrans_script(virt_qemu_ga_unconfined_t) ++ ++ optional_policy(` ++ unconfined_domain(virt_qemu_ga_unconfined_t) ++ ') ++') ++ ++####################################### ++# ++# tye for svirt sockets ++# ++ ++type svirt_socket_t; ++domain_type(svirt_socket_t) ++role system_r types svirt_socket_t; ++allow virtd_t svirt_socket_t:unix_stream_socket { connectto create_stream_socket_perms }; ++allow virt_domain svirt_socket_t:unix_stream_socket { connectto create_stream_socket_perms }; ++ ++tunable_policy(`virt_transition_userdomain',` ++ userdom_transition(virtd_t) ++ userdom_transition(virtd_lxc_t) ++') ++ ++######################################## ++# ++# svirt_lxc_net_t local policy ++# ++virt_sandbox_domain_template(svirt_kvm_net) ++typeattribute svirt_kvm_net_t sandbox_net_domain; ++ ++allow svirt_kvm_net_t self:capability { kill setuid setgid sys_boot ipc_lock chown dac_read_search dac_override fowner fsetid sys_chroot sys_admin sys_nice sys_ptrace sys_resource setpcap }; ++dontaudit svirt_kvm_net_t self:capability2 block_suspend; ++ ++tunable_policy(`virt_sandbox_use_netlink',` ++ allow svirt_kvm_net_t self:netlink_socket create_socket_perms; ++ allow svirt_kvm_net_t self:netlink_tcpdiag_socket create_netlink_socket_perms; ++ allow svirt_kvm_net_t self:netlink_kobject_uevent_socket create_socket_perms; ++') ++ ++term_use_generic_ptys(svirt_kvm_net_t) ++term_use_ptmx(svirt_kvm_net_t) ++ ++dev_rw_kvm(svirt_kvm_net_t) ++ ++manage_sock_files_pattern(svirt_kvm_net_t, virt_var_run_t, virt_var_run_t) ++ ++list_dirs_pattern(svirt_kvm_net_t, virt_content_t, virt_content_t) ++read_files_pattern(svirt_kvm_net_t, virt_content_t, virt_content_t) ++ ++append_files_pattern(svirt_kvm_net_t, virt_log_t, virt_log_t) ++ ++kernel_read_network_state(svirt_kvm_net_t) ++kernel_read_irq_sysctls(svirt_kvm_net_t) ++ ++dev_read_sysfs(svirt_kvm_net_t) ++dev_getattr_mtrr_dev(svirt_kvm_net_t) ++dev_read_rand(svirt_kvm_net_t) ++dev_read_urand(svirt_kvm_net_t) ++ ++files_read_kernel_modules(svirt_kvm_net_t) ++ ++fs_noxattr_type(container_file_t) ++fs_mount_cgroup(svirt_kvm_net_t) ++fs_manage_cgroup_dirs(svirt_kvm_net_t) ++fs_manage_cgroup_files(svirt_kvm_net_t) ++ ++term_pty(container_file_t) ++ ++auth_use_nsswitch(svirt_kvm_net_t) ++ ++rpm_read_db(svirt_kvm_net_t) ++ ++logging_send_syslog_msg(svirt_kvm_net_t) ++ ++tunable_policy(`virt_sandbox_use_audit',` ++ logging_send_audit_msgs(svirt_kvm_net_t) ++') ++ ++userdom_use_user_ptys(svirt_kvm_net_t) ++ ++kernel_read_network_state(sandbox_net_domain) ++ ++allow sandbox_net_domain self:capability { net_raw net_admin net_bind_service }; ++ ++allow sandbox_net_domain self:udp_socket create_socket_perms; ++allow sandbox_net_domain self:tcp_socket create_stream_socket_perms; ++allow sandbox_net_domain self:netlink_route_socket create_netlink_socket_perms; ++allow sandbox_net_domain self:packet_socket create_socket_perms; ++allow sandbox_net_domain self:socket create_socket_perms; ++allow sandbox_net_domain self:rawip_socket create_socket_perms; ++ ++corenet_tcp_bind_generic_node(sandbox_net_domain) ++corenet_udp_bind_generic_node(sandbox_net_domain) ++corenet_raw_bind_generic_node(sandbox_net_domain) ++corenet_tcp_sendrecv_all_ports(sandbox_net_domain) ++corenet_udp_sendrecv_all_ports(sandbox_net_domain) ++corenet_udp_bind_all_ports(sandbox_net_domain) ++corenet_tcp_bind_all_ports(sandbox_net_domain) ++corenet_tcp_connect_all_ports(sandbox_net_domain) ++ ++optional_policy(` ++ sssd_stream_connect(sandbox_net_domain) ++') ++ ++optional_policy(` ++ systemd_dbus_chat_logind(sandbox_net_domain) ++') ++ ++allow sandbox_caps_domain self:capability { chown dac_read_search dac_override fowner kill setgid setuid setpcap net_bind_service net_raw sys_chroot mknod audit_write setfcap }; +diff --git a/vlock.te b/vlock.te +index 6b72968ea8..de409cc610 100644 +--- a/vlock.te ++++ b/vlock.te +@@ -38,7 +38,7 @@ auth_use_pam(vlock_t) + + init_dontaudit_rw_utmp(vlock_t) + +-miscfiles_read_localization(vlock_t) ++logging_send_syslog_msg(vlock_t) + + userdom_dontaudit_search_user_home_dirs(vlock_t) +-userdom_use_user_terminals(vlock_t) ++userdom_use_inherited_user_terminals(vlock_t) +diff --git a/vmtools.fc b/vmtools.fc +new file mode 100644 +index 0000000000..bcada182cc +--- /dev/null ++++ b/vmtools.fc +@@ -0,0 +1,8 @@ ++/etc/vmware-tools(/.*)? gen_context(system_u:object_r:vmtools_unconfined_exec_t,s0) ++ ++/usr/bin/vmtoolsd -- gen_context(system_u:object_r:vmtools_exec_t,s0) ++/usr/bin/VGAuthService -- gen_context(system_u:object_r:vmtools_exec_t,s0) ++ ++/usr/bin/vmware-user-suid-wrapper -- gen_context(system_u:object_r:vmtools_helper_exec_t,s0) ++ ++/usr/lib/systemd/system/vmtoolsd.* -- gen_context(system_u:object_r:vmtools_unit_file_t,s0) +diff --git a/vmtools.if b/vmtools.if +new file mode 100644 +index 0000000000..f94feab67f +--- /dev/null ++++ b/vmtools.if +@@ -0,0 +1,143 @@ ++## VMware Tools daemon ++ ++######################################## ++## ++## Execute vmtools in the vmtools domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`vmtools_domtrans',` ++ gen_require(` ++ type vmtools_t, vmtools_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, vmtools_exec_t, vmtools_t) ++') ++ ++######################################## ++## ++## Execute vmtools in the vmtools domin. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`vmtools_domtrans_helper',` ++ gen_require(` ++ type vmtools_helper_t, vmtools_helper_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, vmtools_helper_exec_t, vmtools_helper_t) ++') ++ ++######################################## ++## ++## Execute vmtools helpers in the vmtools_heler domain. ++## ++## ++## ++## Domain allowed access ++## ++## ++## ++## ++## The role to be allowed the mozilla_plugin domain. ++## ++## ++# ++interface(`vmtools_run_helper',` ++ gen_require(` ++ attribute_role vmtools_helper_roles; ++ ') ++ ++ vmtools_domtrans_helper($1) ++ roleattribute $2 vmtools_helper_roles; ++') ++ ++######################################## ++## ++## Execute vmtools server in the vmtools domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`vmtools_systemctl',` ++ gen_require(` ++ type vmtools_t; ++ type vmtools_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ systemd_read_fifo_file_passwd_run($1) ++ allow $1 vmtools_unit_file_t:file read_file_perms; ++ allow $1 vmtools_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, vmtools_t) ++') ++ ++ ++######################################## ++## ++## All of the rules required to administrate ++## an vmtools environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`vmtools_admin',` ++ gen_require(` ++ type vmtools_t; ++ type vmtools_unit_file_t; ++ ') ++ ++ allow $1 vmtools_t:process { signal_perms }; ++ ps_process_pattern($1, vmtools_t) ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 vmtools_t:process ptrace; ++ ') ++ ++ vmtools_systemctl($1) ++ admin_pattern($1, vmtools_unit_file_t) ++ allow $1 vmtools_unit_file_t:service all_service_perms; ++ optional_policy(` ++ systemd_passwd_agent_exec($1) ++ systemd_read_fifo_file_passwd_run($1) ++ ') ++') ++ ++######################################## ++## ++## Send and receive messages from ++## vmtools_unconfined over dbus. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`vmtools_unconfined_dbus_chat',` ++ gen_require(` ++ type vmtools_unconfined_t; ++ class dbus send_msg; ++ ') ++ ++ allow $1 vmtools_unconfined_t:dbus send_msg; ++') +diff --git a/vmtools.te b/vmtools.te +new file mode 100644 +index 0000000000..c4f3b456bf +--- /dev/null ++++ b/vmtools.te +@@ -0,0 +1,136 @@ ++policy_module(vmtools, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++attribute_role vmtools_helper_roles; ++ ++roleattribute system_r vmtools_helper_roles; ++ ++type vmtools_t; ++type vmtools_exec_t; ++init_daemon_domain(vmtools_t, vmtools_exec_t) ++role vmtools_helper_roles types vmtools_t; ++ ++type vmtools_helper_t; ++type vmtools_helper_exec_t; ++application_domain(vmtools_helper_t, vmtools_helper_exec_t) ++domain_system_change_exemption(vmtools_helper_t) ++role vmtools_helper_roles types vmtools_helper_t; ++ ++type vmtools_unit_file_t; ++systemd_unit_file(vmtools_unit_file_t) ++ ++type vmtools_tmp_t; ++files_tmp_file(vmtools_tmp_t) ++ ++type vmtools_unconfined_exec_t; ++application_executable_file(vmtools_unconfined_exec_t) ++ ++######################################## ++# ++# vmtools local policy ++# ++ ++allow vmtools_t self:capability { sys_time sys_rawio }; ++allow vmtools_t self:fifo_file rw_fifo_file_perms; ++allow vmtools_t self:unix_stream_socket create_stream_socket_perms; ++allow vmtools_t self:unix_dgram_socket create_socket_perms; ++ ++manage_dirs_pattern(vmtools_t, vmtools_tmp_t, vmtools_tmp_t) ++manage_files_pattern(vmtools_t, vmtools_tmp_t, vmtools_tmp_t) ++manage_lnk_files_pattern(vmtools_t, vmtools_tmp_t, vmtools_tmp_t) ++files_tmp_filetrans(vmtools_t, vmtools_tmp_t, { file dir }) ++ ++kernel_read_system_state(vmtools_t) ++kernel_read_network_state(vmtools_t) ++ ++corecmd_exec_bin(vmtools_t) ++corecmd_exec_shell(vmtools_t) ++ ++dev_read_urand(vmtools_t) ++dev_getattr_all_blk_files(vmtools_t) ++ ++fs_getattr_all_fs(vmtools_t) ++ ++auth_use_nsswitch(vmtools_t) ++ ++#shutdown ++init_rw_utmp(vmtools_t) ++init_stream_connect(vmtools_t) ++init_telinit(vmtools_t) ++ ++logging_send_syslog_msg(vmtools_t) ++ ++systemd_exec_systemctl(vmtools_t) ++ ++sysnet_domtrans_ifconfig(vmtools_t) ++ ++xserver_stream_connect_xdm(vmtools_t) ++xserver_stream_connect(vmtools_t) ++ ++optional_policy(` ++ networkmanager_dbus_chat(vmtools_t) ++') ++ ++optional_policy(` ++ rpm_transition_script(vmtools_t,system_r) ++') ++ ++optional_policy(` ++ vmware_filetrans_content(vmtools_t) ++ vmware_manage_log(vmtools_t) ++') ++ ++optional_policy(` ++ unconfined_domain(vmtools_t) ++') ++ ++######################################## ++# ++# vmtools-helper local policy ++# ++ ++domtrans_pattern(vmtools_helper_t, vmtools_exec_t, vmtools_t) ++can_exec(vmtools_helper_t, vmtools_helper_exec_t) ++ ++corecmd_exec_bin(vmtools_helper_t) ++ ++userdom_stream_connect(vmtools_helper_t) ++userdom_use_inherited_user_ttys(vmtools_helper_t) ++userdom_use_inherited_user_ptys(vmtools_helper_t) ++ ++optional_policy(` ++ unconfined_domain(vmtools_helper_t) ++') ++ ++######################################## ++# ++# vmtools_unconfined_script_t local policy ++# ++ ++optional_policy(` ++ type vmtools_unconfined_t; ++ domain_type(vmtools_unconfined_t) ++ ++ domain_entry_file(vmtools_unconfined_t, vmtools_unconfined_exec_t) ++ role system_r types vmtools_unconfined_t; ++ ++ domtrans_pattern(vmtools_t, vmtools_unconfined_exec_t, vmtools_unconfined_t) ++ ++ allow vmtools_t vmtools_unconfined_exec_t:dir search_dir_perms; ++ allow vmtools_t vmtools_unconfined_exec_t:dir read_file_perms; ++ allow vmtools_t vmtools_unconfined_exec_t:file ioctl; ++ ++ init_domtrans_script(vmtools_unconfined_t) ++ ++ corecmd_exec_shell(vmtools_unconfined_t) ++ corecmd_shell_entry_type(vmtools_unconfined_t) ++ corecmd_shell_domtrans(vmtools_t, vmtools_unconfined_t) ++ ++ optional_policy(` ++ unconfined_domain(vmtools_unconfined_t) ++ ') ++') +diff --git a/vmware.if b/vmware.if +index 20a1fb2961..39d21a3047 100644 +--- a/vmware.if ++++ b/vmware.if +@@ -26,7 +26,11 @@ interface(`vmware_role',` + domtrans_pattern($2, vmware_exec_t, vmware_t) + + ps_process_pattern($2, vmware_t) +- allow $2 vmware_t:process { ptrace signal_perms }; ++ allow $2 vmware_t:process signal_perms; ++ ++ tunable_policy(`deny_ptrace',`',` ++ allow $2 vmware_t:process ptrace; ++ ') + + allow $2 { vmware_tmp_t vmware_file_t }:dir { manage_dir_perms relabel_dir_perms }; + allow $2 { vmware_conf_t vmware_file_t vmware_tmp_t vmware_tmpfs_t }:file { manage_file_perms relabel_file_perms }; +@@ -112,3 +116,39 @@ interface(`vmware_append_log',` + logging_search_logs($1) + append_files_pattern($1, vmware_log_t, vmware_log_t) + ') ++ ++######################################## ++## ++## Transition to vmware content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`vmware_filetrans_content',` ++ gen_require(` ++ type vmware_log_t; ++ ') ++ ++ logging_log_filetrans($1, vmware_log_t, file) ++') ++ ++######################################## ++## ++## Manage vmware log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`vmware_manage_log',` ++ gen_require(` ++ type vmware_log_t; ++ ') ++ ++ manage_files_pattern($1, vmware_log_t, vmware_log_t) ++') +diff --git a/vmware.te b/vmware.te +index 4ad18944a8..dfe8d1f1a8 100644 +--- a/vmware.te ++++ b/vmware.te +@@ -65,7 +65,8 @@ ifdef(`enable_mcs',` + # Host local policy + # + +-allow vmware_host_t self:capability { setgid setuid net_raw sys_nice sys_time sys_ptrace kill dac_override }; ++allow vmware_host_t self:capability { net_admin sys_module }; ++allow vmware_host_t self:capability { setgid setuid net_raw sys_nice sys_time kill dac_read_search dac_override }; + dontaudit vmware_host_t self:capability sys_tty_config; + allow vmware_host_t self:process { execstack execmem signal_perms }; + allow vmware_host_t self:fifo_file rw_fifo_file_perms; +@@ -94,8 +95,8 @@ can_exec(vmware_host_t, vmware_host_exec_t) + kernel_read_kernel_sysctls(vmware_host_t) + kernel_read_system_state(vmware_host_t) + kernel_read_network_state(vmware_host_t) ++kernel_request_load_module(vmware_host_t) + +-corenet_all_recvfrom_unlabeled(vmware_host_t) + corenet_all_recvfrom_netlabel(vmware_host_t) + corenet_tcp_sendrecv_generic_if(vmware_host_t) + corenet_udp_sendrecv_generic_if(vmware_host_t) +@@ -115,14 +116,13 @@ dev_getattr_all_blk_files(vmware_host_t) + dev_read_sysfs(vmware_host_t) + dev_read_urand(vmware_host_t) + dev_rw_vmware(vmware_host_t) ++dev_rw_generic_chr_files(vmware_host_t) + + domain_use_interactive_fds(vmware_host_t) + domain_dontaudit_read_all_domains_state(vmware_host_t) + + files_list_tmp(vmware_host_t) +-files_read_etc_files(vmware_host_t) + files_read_etc_runtime_files(vmware_host_t) +-files_read_usr_files(vmware_host_t) + + fs_getattr_all_fs(vmware_host_t) + fs_search_auto_mountpoints(vmware_host_t) +@@ -138,23 +138,27 @@ libs_exec_ld_so(vmware_host_t) + + logging_send_syslog_msg(vmware_host_t) + +-miscfiles_read_localization(vmware_host_t) +- + sysnet_dns_name_resolve(vmware_host_t) + sysnet_domtrans_ifconfig(vmware_host_t) + ++systemd_start_power_services(vmware_host_t) ++ + userdom_dontaudit_use_unpriv_user_fds(vmware_host_t) + userdom_dontaudit_search_user_home_dirs(vmware_host_t) + + netutils_domtrans_ping(vmware_host_t) + + optional_policy(` +- hostname_exec(vmware_host_t) ++ unconfined_domain(vmware_host_t) + ') + ++optional_policy(` ++ hostname_exec(vmware_host_t) ++') ++ + optional_policy(` + modutils_domtrans_insmod(vmware_host_t) +-') ++') + + optional_policy(` + samba_read_config(vmware_host_t) +@@ -182,7 +186,7 @@ optional_policy(` + # Guest local policy + # + +-allow vmware_t self:capability { dac_override setgid sys_nice sys_resource setuid sys_admin sys_rawio chown }; ++allow vmware_t self:capability { dac_read_search dac_override setgid sys_nice sys_resource setuid sys_admin sys_rawio chown }; + dontaudit vmware_t self:capability sys_tty_config; + allow vmware_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow vmware_t self:process { execmem execstack }; +@@ -244,9 +248,7 @@ dev_search_sysfs(vmware_t) + + domain_use_interactive_fds(vmware_t) + +-files_read_etc_files(vmware_t) + files_read_etc_runtime_files(vmware_t) +-files_read_usr_files(vmware_t) + files_list_home(vmware_t) + + fs_getattr_all_fs(vmware_t) +@@ -258,9 +260,8 @@ storage_raw_write_removable_device(vmware_t) + libs_exec_ld_so(vmware_t) + libs_read_lib_files(vmware_t) + +-miscfiles_read_localization(vmware_t) + +-userdom_use_user_terminals(vmware_t) ++userdom_use_inherited_user_terminals(vmware_t) + userdom_list_user_home_dirs(vmware_t) + + sysnet_dns_name_resolve(vmware_t) +diff --git a/vnstatd.if b/vnstatd.if +index 137ac4458e..b644854c99 100644 +--- a/vnstatd.if ++++ b/vnstatd.if +@@ -157,7 +157,6 @@ interface(`vnstatd_manage_lib_files',` + ## Role allowed access. + ##
      + ## +-## + # + interface(`vnstatd_admin',` + gen_require(` +@@ -165,9 +164,13 @@ interface(`vnstatd_admin',` + type vnstatd_var_run_t; + ') + +- allow $1 vnstatd_t:process { ptrace signal_perms }; ++ allow $1 vnstatd_t:process signal_perms; + ps_process_pattern($1, vnstatd_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 vnstatd_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, vnstatd_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 vnstatd_initrc_exec_t system_r; +diff --git a/vnstatd.te b/vnstatd.te +index e2220ae7f0..85f393b418 100644 +--- a/vnstatd.te ++++ b/vnstatd.te +@@ -36,7 +36,7 @@ allow vnstatd_t self:unix_stream_socket { accept listen }; + + manage_dirs_pattern(vnstatd_t, vnstatd_var_lib_t, vnstatd_var_lib_t) + manage_files_pattern(vnstatd_t, vnstatd_var_lib_t, vnstatd_var_lib_t) +-files_var_lib_filetrans(vnstatd_t, vnstatd_var_lib_t, { dir file }) ++files_var_lib_filetrans(vnstatd_t, vnstatd_var_lib_t, dir) + + manage_files_pattern(vnstatd_t, vnstatd_var_run_t, vnstatd_var_run_t) + manage_dirs_pattern(vnstatd_t, vnstatd_var_run_t, vnstatd_var_run_t) +@@ -45,16 +45,14 @@ files_pid_filetrans(vnstatd_t, vnstatd_var_run_t, { dir file }) + kernel_read_network_state(vnstatd_t) + kernel_read_system_state(vnstatd_t) + +-domain_use_interactive_fds(vnstatd_t) ++dev_read_sysfs(vnstatd_t) + +-files_read_etc_files(vnstatd_t) ++domain_use_interactive_fds(vnstatd_t) + + fs_getattr_xattr_fs(vnstatd_t) + + logging_send_syslog_msg(vnstatd_t) + +-miscfiles_read_localization(vnstatd_t) +- + ######################################## + # + # Client local policy +@@ -64,23 +62,19 @@ allow vnstat_t self:process signal; + allow vnstat_t self:fifo_file rw_fifo_file_perms; + allow vnstat_t self:unix_stream_socket { accept listen }; + ++files_search_var_lib(vnstat_t) + manage_dirs_pattern(vnstat_t, vnstatd_var_lib_t, vnstatd_var_lib_t) + manage_files_pattern(vnstat_t, vnstatd_var_lib_t, vnstatd_var_lib_t) +-files_var_lib_filetrans(vnstat_t, vnstatd_var_lib_t, { dir file }) + + kernel_read_network_state(vnstat_t) + kernel_read_system_state(vnstat_t) + + domain_use_interactive_fds(vnstat_t) + +-files_read_etc_files(vnstat_t) +- + fs_getattr_xattr_fs(vnstat_t) + + logging_send_syslog_msg(vnstat_t) + +-miscfiles_read_localization(vnstat_t) +- + optional_policy(` + cron_system_entry(vnstat_t, vnstat_exec_t) + ') +diff --git a/vpn.fc b/vpn.fc +index 524ac2f76d..076dcc3e63 100644 +--- a/vpn.fc ++++ b/vpn.fc +@@ -1,7 +1,13 @@ +-/sbin/vpnc -- gen_context(system_u:object_r:vpnc_exec_t,s0) ++# ++# sbin ++# ++/sbin/vpnc -- gen_context(system_u:object_r:vpnc_exec_t,s0) + ++# ++# /usr ++# + /usr/bin/openconnect -- gen_context(system_u:object_r:vpnc_exec_t,s0) + +-/usr/sbin/vpnc -- gen_context(system_u:object_r:vpnc_exec_t,s0) ++/usr/sbin/vpnc -- gen_context(system_u:object_r:vpnc_exec_t,s0) + +-/var/run/vpnc(/.*)? gen_context(system_u:object_r:vpnc_var_run_t,s0) ++/var/run/vpnc(/.*)? gen_context(system_u:object_r:vpnc_var_run_t,s0) +diff --git a/vpn.if b/vpn.if +index 7a7f34297b..afedcba80b 100644 +--- a/vpn.if ++++ b/vpn.if +@@ -1,8 +1,8 @@ +-## Virtual Private Networking client. ++## Virtual Private Networking client + + ######################################## + ## +-## Execute vpn clients in the vpnc domain. ++## Execute VPN clients in the vpnc domain. + ## + ## + ## +@@ -15,15 +15,13 @@ interface(`vpn_domtrans',` + type vpnc_t, vpnc_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, vpnc_exec_t, vpnc_t) + ') + + ######################################## + ## +-## Execute vpn clients in the vpnc +-## domain, and allow the specified +-## role the vpnc domain. ++## Execute VPN clients in the vpnc domain, and ++## allow the specified role the vpnc domain. + ## + ## + ## +@@ -40,6 +38,7 @@ interface(`vpn_domtrans',` + interface(`vpn_run',` + gen_require(` + attribute_role vpnc_roles; ++ type vpnc_t; + ') + + vpn_domtrans($1) +@@ -48,7 +47,7 @@ interface(`vpn_run',` + + ######################################## + ## +-## Send kill signals to vpnc. ++## Send VPN clients the kill signal. + ## + ## + ## +@@ -66,7 +65,7 @@ interface(`vpn_kill',` + + ######################################## + ## +-## Send generic signals to vpnc. ++## Send generic signals to VPN clients. + ## + ## + ## +@@ -84,7 +83,7 @@ interface(`vpn_signal',` + + ######################################## + ## +-## Send null signals to vpnc. ++## Send signull to VPN clients. + ## + ## + ## +@@ -103,7 +102,7 @@ interface(`vpn_signull',` + ######################################## + ## + ## Send and receive messages from +-## vpnc over dbus. ++## Vpnc over dbus. + ## + ## + ## +diff --git a/vpn.te b/vpn.te +index 95b26d1260..3d74e70cc9 100644 +--- a/vpn.te ++++ b/vpn.te +@@ -6,6 +6,7 @@ policy_module(vpn, 1.16.0) + # + + attribute_role vpnc_roles; ++roleattribute system_r vpnc_roles; + + type vpnc_t; + type vpnc_exec_t; +@@ -28,9 +29,13 @@ allow vpnc_t self:capability { dac_read_search dac_override net_admin ipc_lock n + allow vpnc_t self:process { getsched signal }; + allow vpnc_t self:fifo_file rw_fifo_file_perms; + allow vpnc_t self:netlink_route_socket rw_netlink_socket_perms; +-allow vpnc_t self:tcp_socket { accept listen }; ++allow vpnc_t self:tcp_socket create_stream_socket_perms; ++allow vpnc_t self:udp_socket create_socket_perms; + allow vpnc_t self:rawip_socket create_socket_perms; ++allow vpnc_t self:unix_dgram_socket create_socket_perms; ++allow vpnc_t self:unix_stream_socket create_socket_perms; + allow vpnc_t self:tun_socket { create_socket_perms relabelfrom }; ++# cjp: this needs to be fixed + allow vpnc_t self:socket create_socket_perms; + + manage_dirs_pattern(vpnc_t, vpnc_tmp_t, vpnc_tmp_t) +@@ -47,7 +52,6 @@ kernel_read_all_sysctls(vpnc_t) + kernel_request_load_module(vpnc_t) + kernel_rw_net_sysctls(vpnc_t) + +-corenet_all_recvfrom_unlabeled(vpnc_t) + corenet_all_recvfrom_netlabel(vpnc_t) + corenet_tcp_sendrecv_generic_if(vpnc_t) + corenet_udp_sendrecv_generic_if(vpnc_t) +@@ -58,38 +62,32 @@ corenet_raw_sendrecv_generic_node(vpnc_t) + corenet_tcp_sendrecv_all_ports(vpnc_t) + corenet_udp_sendrecv_all_ports(vpnc_t) + corenet_udp_bind_generic_node(vpnc_t) +- +-corenet_sendrecv_all_server_packets(vpnc_t) + corenet_udp_bind_generic_port(vpnc_t) +- +-corenet_sendrecv_isakmp_server_packets(vpnc_t) + corenet_udp_bind_isakmp_port(vpnc_t) +- +-corenet_sendrecv_generic_server_packets(vpnc_t) + corenet_udp_bind_ipsecnat_port(vpnc_t) +- +-corenet_sendrecv_all_client_packets(vpnc_t) + corenet_tcp_connect_all_ports(vpnc_t) +- ++corenet_sendrecv_all_client_packets(vpnc_t) ++corenet_sendrecv_isakmp_server_packets(vpnc_t) ++corenet_sendrecv_generic_server_packets(vpnc_t) + corenet_rw_tun_tap_dev(vpnc_t) + +-corecmd_exec_all_executables(vpnc_t) +- + dev_read_rand(vpnc_t) + dev_read_urand(vpnc_t) + dev_read_sysfs(vpnc_t) + + domain_use_interactive_fds(vpnc_t) + +-files_exec_etc_files(vpnc_t) +-files_read_etc_runtime_files(vpnc_t) +-files_dontaudit_search_home(vpnc_t) +- + fs_getattr_xattr_fs(vpnc_t) + fs_getattr_tmpfs(vpnc_t) + +-term_use_all_ptys(vpnc_t) +-term_use_all_ttys(vpnc_t) ++term_use_all_inherited_ptys(vpnc_t) ++term_use_all_inherited_ttys(vpnc_t) ++ ++corecmd_exec_all_executables(vpnc_t) ++ ++files_exec_etc_files(vpnc_t) ++files_read_etc_runtime_files(vpnc_t) ++files_dontaudit_search_home(vpnc_t) + + auth_use_nsswitch(vpnc_t) + +@@ -103,16 +101,15 @@ locallogin_use_fds(vpnc_t) + logging_send_syslog_msg(vpnc_t) + logging_dontaudit_search_logs(vpnc_t) + +-miscfiles_read_localization(vpnc_t) +- +-seutil_dontaudit_search_config(vpnc_t) ++seutil_use_newrole_fds(vpnc_t) + + sysnet_run_ifconfig(vpnc_t, vpnc_roles) + sysnet_etc_filetrans_config(vpnc_t) + sysnet_manage_config(vpnc_t) + + userdom_use_all_users_fds(vpnc_t) +-userdom_dontaudit_search_user_home_content(vpnc_t) ++userdom_read_home_certs(vpnc_t) ++userdom_search_admin_dir(vpnc_t) + + optional_policy(` + dbus_system_bus_client(vpnc_t) +@@ -124,8 +121,5 @@ optional_policy(` + + optional_policy(` + networkmanager_attach_tun_iface(vpnc_t) +-') +- +-optional_policy(` +- seutil_use_newrole_fds(vpnc_t) ++ networkmanager_manage_pid_files(vpnc_t) + ') +diff --git a/w3c.fc b/w3c.fc +index 463c799f46..227feaf345 100644 +--- a/w3c.fc ++++ b/w3c.fc +@@ -1,4 +1,4 @@ +-/usr/lib/cgi-bin/check -- gen_context(system_u:object_r:httpd_w3c_validator_script_exec_t,s0) ++/usr/lib/cgi-bin/check -- gen_context(system_u:object_r:w3c_validator_script_exec_t,s0) + +-/usr/share/w3c-markup-validator(/.*)? gen_context(system_u:object_r:httpd_w3c_validator_content_t,s0) +-/usr/share/w3c-markup-validator/cgi-bin(/.*)? gen_context(system_u:object_r:httpd_w3c_validator_script_exec_t,s0) ++/usr/share/w3c-markup-validator(/.*)? gen_context(system_u:object_r:w3c_validator_content_t,s0) ++/usr/share/w3c-markup-validator/cgi-bin(/.*)? gen_context(system_u:object_r:w3c_validator_script_exec_t,s0) +diff --git a/w3c.te b/w3c.te +index b14d6a9481..d7c79382da 100644 +--- a/w3c.te ++++ b/w3c.te +@@ -6,29 +6,37 @@ policy_module(w3c, 1.1.0) + # + + apache_content_template(w3c_validator) ++apache_content_alias_template(w3c_validator, w3c_validator) ++ ++type w3c_validator_tmp_t; ++files_tmp_file(w3c_validator_tmp_t) + + ######################################## + # + # Local policy + # ++manage_dirs_pattern(w3c_validator_script_t, w3c_validator_tmp_t, w3c_validator_tmp_t) ++manage_files_pattern(w3c_validator_script_t, w3c_validator_tmp_t, w3c_validator_tmp_t) ++files_tmp_filetrans(w3c_validator_script_t, w3c_validator_tmp_t, { file dir }) ++ + +-corenet_all_recvfrom_unlabeled(httpd_w3c_validator_script_t) +-corenet_all_recvfrom_netlabel(httpd_w3c_validator_script_t) +-corenet_tcp_sendrecv_generic_if(httpd_w3c_validator_script_t) +-corenet_tcp_sendrecv_generic_node(httpd_w3c_validator_script_t) ++corenet_all_recvfrom_unlabeled(w3c_validator_script_t) ++corenet_all_recvfrom_netlabel(w3c_validator_script_t) ++corenet_tcp_sendrecv_generic_if(w3c_validator_script_t) ++corenet_tcp_sendrecv_generic_node(w3c_validator_script_t) + +-corenet_sendrecv_ftp_client_packets(httpd_w3c_validator_script_t) +-corenet_tcp_connect_ftp_port(httpd_w3c_validator_script_t) +-corenet_tcp_sendrecv_ftp_port(httpd_w3c_validator_script_t) ++corenet_sendrecv_ftp_client_packets(w3c_validator_script_t) ++corenet_tcp_connect_ftp_port(w3c_validator_script_t) ++corenet_tcp_sendrecv_ftp_port(w3c_validator_script_t) + +-corenet_sendrecv_http_client_packets(httpd_w3c_validator_script_t) +-corenet_tcp_connect_http_port(httpd_w3c_validator_script_t) +-corenet_tcp_sendrecv_http_port(httpd_w3c_validator_script_t) ++corenet_sendrecv_http_client_packets(w3c_validator_script_t) ++corenet_tcp_connect_http_port(w3c_validator_script_t) ++corenet_tcp_sendrecv_http_port(w3c_validator_script_t) + +-corenet_sendrecv_http_cache_client_packets(httpd_w3c_validator_script_t) +-corenet_tcp_connect_http_cache_port(httpd_w3c_validator_script_t) +-corenet_tcp_sendrecv_http_cache_port(httpd_w3c_validator_script_t) ++corenet_sendrecv_http_cache_client_packets(w3c_validator_script_t) ++corenet_tcp_connect_http_cache_port(w3c_validator_script_t) ++corenet_tcp_sendrecv_http_cache_port(w3c_validator_script_t) + +-miscfiles_read_generic_certs(httpd_w3c_validator_script_t) ++miscfiles_read_generic_certs(w3c_validator_script_t) + +-sysnet_dns_name_resolve(httpd_w3c_validator_script_t) ++sysnet_dns_name_resolve(w3c_validator_script_t) +diff --git a/watchdog.fc b/watchdog.fc +index eecd0e03b3..8df2e8ce75 100644 +--- a/watchdog.fc ++++ b/watchdog.fc +@@ -1,7 +1,12 @@ + /etc/rc\.d/init\.d/watchdog -- gen_context(system_u:object_r:watchdog_initrc_exec_t,s0) ++/etc/watchdog\.d(/.*)? gen_context(system_u:object_r:watchdog_unconfined_exec_t,s0) + + /usr/sbin/watchdog -- gen_context(system_u:object_r:watchdog_exec_t,s0) + ++/usr/libexec/watchdog/scripts(/.*)? gen_context(system_u:object_r:watchdog_unconfined_exec_t,s0) ++ ++/var/cache/watchdog(/.*)? gen_context(system_u:object_r:watchdog_cache_t,s0) ++ + /var/log/watchdog.* gen_context(system_u:object_r:watchdog_log_t,s0) + + /var/run/watchdog\.pid -- gen_context(system_u:object_r:watchdog_var_run_t,s0) +diff --git a/watchdog.if b/watchdog.if +index 6461a77468..8fda2dd718 100644 +--- a/watchdog.if ++++ b/watchdog.if +@@ -37,3 +37,21 @@ interface(`watchdog_admin',` + files_search_pids($1) + admin_pattern($1, watchdog_var_run_t) + ') ++ ++####################################### ++## ++## Allow read watchdog_unconfined_t lnk files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`watchdog_unconfined_exec_read_lnk_files',` ++ gen_require(` ++ type watchdog_unconfined_exec_t; ++ ') ++ ++ read_lnk_files_pattern($1,watchdog_unconfined_exec_t, watchdog_unconfined_exec_t) ++') +diff --git a/watchdog.te b/watchdog.te +index 3548317cf8..fc3da17d6b 100644 +--- a/watchdog.te ++++ b/watchdog.te +@@ -12,34 +12,47 @@ init_daemon_domain(watchdog_t, watchdog_exec_t) + type watchdog_initrc_exec_t; + init_script_file(watchdog_initrc_exec_t) + ++type watchdog_cache_t; ++files_type(watchdog_cache_t) ++ + type watchdog_log_t; + logging_log_file(watchdog_log_t) + + type watchdog_var_run_t; + files_pid_file(watchdog_var_run_t) + ++type watchdog_unconfined_exec_t; ++application_executable_file(watchdog_unconfined_exec_t) ++ + ######################################## + # + # Local policy + # + +-allow watchdog_t self:capability { sys_admin net_admin sys_boot ipc_lock sys_pacct sys_nice sys_resource }; ++allow watchdog_t self:capability { sys_admin net_admin sys_boot ipc_lock sys_pacct sys_nice sys_resource net_raw }; + dontaudit watchdog_t self:capability sys_tty_config; + allow watchdog_t self:process { setsched signal_perms }; + allow watchdog_t self:fifo_file rw_fifo_file_perms; + allow watchdog_t self:tcp_socket { accept listen }; ++allow watchdog_t self:rawip_socket create_socket_perms; + +-allow watchdog_t watchdog_log_t:file { append_file_perms create_file_perms setattr_file_perms }; +-logging_log_filetrans(watchdog_t, watchdog_log_t, file) ++manage_files_pattern(watchdog_t, watchdog_cache_t, watchdog_cache_t) ++manage_dirs_pattern(watchdog_t, watchdog_cache_t, watchdog_cache_t) ++ ++manage_files_pattern(watchdog_t,watchdog_log_t,watchdog_log_t) ++manage_dirs_pattern(watchdog_t,watchdog_log_t,watchdog_log_t) ++logging_log_filetrans(watchdog_t, watchdog_log_t,{dir file}) + + manage_files_pattern(watchdog_t, watchdog_var_run_t, watchdog_var_run_t) + files_pid_filetrans(watchdog_t, watchdog_var_run_t, file) + ++kernel_read_network_state(watchdog_t) + kernel_read_system_state(watchdog_t) + kernel_read_kernel_sysctls(watchdog_t) + kernel_unmount_proc(watchdog_t) + + corecmd_exec_shell(watchdog_t) ++corecmd_exec_bin(watchdog_t) + + corenet_all_recvfrom_unlabeled(watchdog_t) + corenet_all_recvfrom_netlabel(watchdog_t) +@@ -63,7 +76,6 @@ domain_signull_all_domains(watchdog_t) + domain_signal_all_domains(watchdog_t) + domain_kill_all_domains(watchdog_t) + +-files_read_etc_files(watchdog_t) + files_manage_etc_runtime_files(watchdog_t) + files_etc_filetrans_etc_runtime(watchdog_t, file) + +@@ -72,16 +84,19 @@ fs_getattr_all_fs(watchdog_t) + fs_search_auto_mountpoints(watchdog_t) + + auth_append_login_records(watchdog_t) ++auth_read_passwd(watchdog_t) + + logging_send_syslog_msg(watchdog_t) + +-miscfiles_read_localization(watchdog_t) +- + sysnet_dns_name_resolve(watchdog_t) + + userdom_dontaudit_use_unpriv_user_fds(watchdog_t) + userdom_dontaudit_search_user_home_dirs(watchdog_t) + ++optional_policy(` ++ cron_system_entry(watchdog_t, watchdog_exec_t) ++') ++ + optional_policy(` + mta_send_mail(watchdog_t) + ') +@@ -90,6 +105,10 @@ optional_policy(` + nis_use_ypbind(watchdog_t) + ') + ++optional_policy(` ++ rhcs_domtrans_fenced(watchdog_t) ++') ++ + optional_policy(` + seutil_sigchld_newrole(watchdog_t) + ') +@@ -97,3 +116,32 @@ optional_policy(` + optional_policy(` + udev_read_db(watchdog_t) + ') ++ ++optional_policy(` ++ watchdog_unconfined_exec_read_lnk_files(watchdog_t) ++') ++ ++######################################## ++# ++# watchdog_unconfined_script_t local policy ++# ++ ++optional_policy(` ++ type watchdog_unconfined_t; ++ domain_type(watchdog_unconfined_t) ++ ++ domain_entry_file(watchdog_unconfined_t, watchdog_unconfined_exec_t) ++ role system_r types watchdog_unconfined_t; ++ ++ domtrans_pattern(watchdog_t, watchdog_unconfined_exec_t, watchdog_unconfined_t) ++ ++ allow watchdog_t watchdog_unconfined_exec_t:dir search_dir_perms; ++ allow watchdog_t watchdog_unconfined_exec_t:dir read_file_perms; ++ allow watchdog_t watchdog_unconfined_exec_t:file ioctl; ++ ++ init_domtrans_script(watchdog_unconfined_t) ++ ++ optional_policy(` ++ unconfined_domain(watchdog_unconfined_t) ++ ') ++') +diff --git a/wdmd.fc b/wdmd.fc +index 66f11f7247..e051997a6d 100644 +--- a/wdmd.fc ++++ b/wdmd.fc +@@ -1,5 +1,7 @@ + /etc/rc\.d/init\.d/wdmd -- gen_context(system_u:object_r:wdmd_initrc_exec_t,s0) + +-/usr/sbin/wdmd -- gen_context(system_u:object_r:wdmd_exec_t,s0) ++/usr/sbin/wdmd -- gen_context(system_u:object_r:wdmd_exec_t,s0) ++ ++/var/run/wdmd(/.*)? gen_context(system_u:object_r:wdmd_var_run_t,s0) ++/var/run/checkquorum-timer -- gen_context(system_u:object_r:wdmd_var_run_t,s0) + +-/var/run/wdmd(/.*)? gen_context(system_u:object_r:wdmd_var_run_t,s0) +diff --git a/wdmd.if b/wdmd.if +index 1e3aec07f0..d17ff392f1 100644 +--- a/wdmd.if ++++ b/wdmd.if +@@ -1,29 +1,47 @@ +-## Watchdog multiplexing daemon. ++ ++## watchdog multiplexing daemon + + ######################################## + ## +-## Connect to wdmd with a unix +-## domain stream socket. ++## Execute a domain transition to run wdmd. + ## + ## +-## ++## + ## Domain allowed access. ++## ++## ++# ++interface(`wdmd_domtrans',` ++ gen_require(` ++ type wdmd_t, wdmd_exec_t; ++ ') ++ ++ domtrans_pattern($1, wdmd_exec_t, wdmd_t) ++') ++ ++ ++######################################## ++## ++## Execute wdmd server in the wdmd domain. ++## ++## ++## ++## The type of the process performing this action. + ## + ## + # +-interface(`wdmd_stream_connect',` ++interface(`wdmd_initrc_domtrans',` + gen_require(` +- type wdmd_t, wdmd_var_run_t; ++ type wdmd_initrc_exec_t; + ') + +- files_search_pids($1) +- stream_connect_pattern($1, wdmd_var_run_t, wdmd_var_run_t, wdmd_t) ++ init_labeled_script_domtrans($1, wdmd_initrc_exec_t) + ') + + ######################################## + ## +-## All of the rules required to +-## administrate an wdmd environment. ++## All of the rules required to administrate ++## an wdmd environment + ## + ## + ## +@@ -39,17 +57,77 @@ interface(`wdmd_stream_connect',` + # + interface(`wdmd_admin',` + gen_require(` +- type wdmd_t, wdmd_initrc_exec_t, wdmd_var_run_t; ++ type wdmd_t; ++ type wdmd_initrc_exec_t; + ') + +- allow $1 wdmd_t:process { ptrace signal_perms }; ++ allow $1 wdmd_t:process signal_perms; + ps_process_pattern($1, wdmd_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 wdmd_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, wdmd_initrc_exec_t) ++ wdmd_initrc_domtrans($1) + domain_system_change_exemption($1) + role_transition $2 wdmd_initrc_exec_t system_r; + allow $2 system_r; + ++') ++ ++###################################### ++## ++## Create, read, write, and delete wdmd PID files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`wdmd_manage_pid_files',` ++ gen_require(` ++ type wdmd_var_run_t; ++ ') ++ + files_search_pids($1) +- admin_pattern($1, wdmd_var_run_t) ++ manage_files_pattern($1, wdmd_var_run_t, wdmd_var_run_t) ++') ++ ++######################################## ++## ++## Connect to wdmd over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`wdmd_stream_connect',` ++ gen_require(` ++ type wdmd_t, wdmd_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, wdmd_var_run_t, wdmd_var_run_t, wdmd_t) ++') ++ ++ ++#################################### ++## ++## Allow the specified domain to read/write wdmd's tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`wdmd_rw_tmpfs',` ++ gen_require(` ++ type wdmd_tmpfs_t; ++ ') ++ ++ rw_files_pattern($1, wdmd_tmpfs_t, wdmd_tmpfs_t) ++ + ') +diff --git a/wdmd.te b/wdmd.te +index 4815a93f41..24dcf51740 100644 +--- a/wdmd.te ++++ b/wdmd.te +@@ -45,16 +45,15 @@ corecmd_exec_shell(wdmd_t) + dev_read_watchdog(wdmd_t) + dev_write_watchdog(wdmd_t) + ++fs_getattr_all_fs(wdmd_t) + fs_read_anon_inodefs_files(wdmd_t) + + auth_use_nsswitch(wdmd_t) + + logging_send_syslog_msg(wdmd_t) + +-miscfiles_read_localization(wdmd_t) +- + optional_policy(` +- corosync_initrc_domtrans(wdmd_t) +- corosync_stream_connect(wdmd_t) +- corosync_rw_tmpfs(wdmd_t) ++ rhcs_initrc_domtrans_cluster(wdmd_t) ++ rhcs_stream_connect_cluster(wdmd_t) ++ rhcs_rw_cluster_tmpfs(wdmd_t) + ') +diff --git a/webadm.te b/webadm.te +index 2a6cae7736..d2752d9bb4 100644 +--- a/webadm.te ++++ b/webadm.te +@@ -25,12 +25,21 @@ role webadm_r; + + userdom_base_user_template(webadm) + ++type webadm_tmp_t; ++files_tmp_file(webadm_tmp_t) ++ + ######################################## + # + # Local policy + # + +-allow webadm_t self:capability { dac_override dac_read_search kill sys_nice }; ++allow webadm_t self:capability { dac_override dac_read_search kill sys_nice sys_resource }; ++ ++manage_dirs_pattern(webadm_t, webadm_tmp_t, webadm_tmp_t) ++manage_files_pattern(webadm_t, webadm_tmp_t, webadm_tmp_t) ++manage_lnk_files_pattern(webadm_t, webadm_tmp_t, webadm_tmp_t) ++files_tmp_filetrans(webadm_t, webadm_tmp_t, { file dir }) ++can_exec(webadm_t, webadm_tmp_t) + + files_dontaudit_search_all_dirs(webadm_t) + files_list_var(webadm_t) +@@ -38,12 +47,26 @@ files_list_var(webadm_t) + selinux_get_enforce_mode(webadm_t) + seutil_domtrans_setfiles(webadm_t) + ++init_rw_pipes(webadm_t) ++init_status(webadm_t) ++ + logging_send_audit_msgs(webadm_t) + logging_send_syslog_msg(webadm_t) + + userdom_dontaudit_search_user_home_dirs(webadm_t) ++userdom_dontaudit_manage_admin_files(webadm_t) ++ ++optional_policy(` ++ apache_admin(webadm_t, webadm_r) ++') ++ ++optional_policy(` ++ dbus_system_bus_client(webadm_t) ++') + +-apache_admin(webadm_t, webadm_r) ++optional_policy(` ++ policykit_dbus_chat(webadm_t) ++') + + tunable_policy(`webadm_manage_user_files',` + userdom_manage_user_home_content_files(webadm_t) +diff --git a/webalizer.fc b/webalizer.fc +index 64baf679e3..76c753b1ac 100644 +--- a/webalizer.fc ++++ b/webalizer.fc +@@ -6,4 +6,4 @@ + + /var/lib/webalizer(/.*)? gen_context(system_u:object_r:webalizer_var_lib_t,s0) + +-/var/www/usage(/.*)? gen_context(system_u:object_r:httpd_webalizer_content_t,s0) ++/var/www/usage(/.*)? gen_context(system_u:object_r:webalizer_rw_content_t,s0) +diff --git a/webalizer.te b/webalizer.te +index ae919b9a52..cdd9359d13 100644 +--- a/webalizer.te ++++ b/webalizer.te +@@ -33,7 +33,7 @@ files_type(webalizer_write_t) + # Local policy + # + +-allow webalizer_t self:capability dac_override; ++allow webalizer_t self:capability { dac_read_search dac_override }; + allow webalizer_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execmem execstack execheap }; + allow webalizer_t self:fd use; + allow webalizer_t self:fifo_file rw_fifo_file_perms; +@@ -55,29 +55,36 @@ can_exec(webalizer_t, webalizer_exec_t) + kernel_read_kernel_sysctls(webalizer_t) + kernel_read_system_state(webalizer_t) + +-files_read_etc_runtime_files(webalizer_t) ++corenet_all_recvfrom_netlabel(webalizer_t) ++corenet_tcp_sendrecv_generic_if(webalizer_t) ++corenet_tcp_sendrecv_generic_node(webalizer_t) ++corenet_tcp_sendrecv_all_ports(webalizer_t) + + fs_search_auto_mountpoints(webalizer_t) + fs_getattr_xattr_fs(webalizer_t) + fs_rw_anon_inodefs_files(webalizer_t) + +-auth_use_nsswitch(webalizer_t) ++files_read_etc_runtime_files(webalizer_t) + + logging_list_logs(webalizer_t) + logging_send_syslog_msg(webalizer_t) + +-miscfiles_read_localization(webalizer_t) ++auth_use_nsswitch(webalizer_t) ++ + miscfiles_read_public_files(webalizer_t) + +-userdom_use_user_terminals(webalizer_t) ++sysnet_dns_name_resolve(webalizer_t) ++sysnet_read_config(webalizer_t) ++ ++userdom_use_inherited_user_terminals(webalizer_t) + userdom_use_unpriv_users_fds(webalizer_t) + userdom_dontaudit_search_user_home_content(webalizer_t) + + optional_policy(` + apache_read_log(webalizer_t) + apache_content_template(webalizer) +- manage_dirs_pattern(webalizer_t, httpd_webalizer_content_t, httpd_webalizer_content_t) +- manage_files_pattern(webalizer_t, httpd_webalizer_content_t, httpd_webalizer_content_t) ++ apache_content_alias_template(webalizer, webalizer) ++ apache_manage_sys_content(webalizer_t) + ') + + optional_policy(` +diff --git a/wine.if b/wine.if +index fd2b6cc1e6..9c4f14b880 100644 +--- a/wine.if ++++ b/wine.if +@@ -1,46 +1,58 @@ +-## Run Windows programs in Linux. ++## Wine Is Not an Emulator. Run Windows programs in Linux. + +-######################################## ++####################################### + ## +-## Role access for wine. ++## The per role template for the wine module. + ## +-## ++## ++##

      ++## This template creates a derived domains which are used ++## for wine applications. ++##

      ++##
      ++## + ## +-## Role allowed access. ++## The role associated with the user domain. + ## + ## +-## ++## + ## +-## User domain for the role. ++## The type of the user domain. + ## + ## + # +-interface(`wine_role',` ++template(`wine_role',` + gen_require(` +- attribute_role wine_roles; +- type wine_exec_t, wine_t, wine_tmp_t; ++ type wine_t; + type wine_home_t; ++ type wine_exec_t; + ') + +- roleattribute $1 wine_roles; +- +- domtrans_pattern($2, wine_exec_t, wine_t) ++ role $1 types wine_t; + ++ domain_auto_trans($2, wine_exec_t, wine_t) ++ # Unrestricted inheritance from the caller. ++ allow $2 wine_t:process { noatsecure siginh rlimitinh }; ++ allow wine_t $2:fd use; ++ allow wine_t $2:process { sigchld signull }; + allow wine_t $2:unix_stream_socket connectto; +- allow wine_t $2:process signull; + ++ # Allow the user domain to signal/ps. + ps_process_pattern($2, wine_t) +- allow $2 wine_t:process { ptrace signal_perms }; ++ allow $2 wine_t:process signal_perms; + + allow $2 wine_t:fd use; +- allow $2 wine_t:shm { associate getattr }; +- allow $2 wine_t:shm rw_shm_perms; ++ allow $2 wine_t:shm { associate getattr unix_read unix_write }; + allow $2 wine_t:unix_stream_socket connectto; + +- allow $2 { wine_tmp_t wine_home_t }:dir { manage_dir_perms relabel_dir_perms }; +- allow $2 { wine_tmp_t wine_home_t }:file { manage_file_perms relabel_file_perms }; +- allow $2 wine_home_t:lnk_file { manage_lnk_file_perms relabel_lnk_file_perms }; +- userdom_user_home_dir_filetrans($2, wine_home_t, dir, ".wine") ++ # X access, Home files ++ manage_dirs_pattern($2, wine_home_t, wine_home_t) ++ manage_files_pattern($2, wine_home_t, wine_home_t) ++ manage_lnk_files_pattern($2, wine_home_t, wine_home_t) ++ relabel_dirs_pattern($2, wine_home_t, wine_home_t) ++ relabel_files_pattern($2, wine_home_t, wine_home_t) ++ relabel_lnk_files_pattern($2, wine_home_t, wine_home_t) ++ + ') + + ####################################### +@@ -72,31 +84,26 @@ interface(`wine_role',` + # + template(`wine_role_template',` + gen_require(` ++ type wine_t; ++ attribute wine_domain; + type wine_exec_t; + ') + +- type $1_wine_t; +- userdom_user_application_domain($1_wine_t, wine_exec_t) ++ type $1_wine_t, wine_domain; ++ domain_type($1_wine_t) ++ domain_entry_file($1_wine_t, wine_exec_t) ++ ubac_constrained($1_wine_t) + role $2 types $1_wine_t; +- +- allow $1_wine_t self:process { execmem execstack }; +- +- allow $3 $1_wine_t:process { ptrace noatsecure signal_perms }; +- ps_process_pattern($3, $1_wine_t) +- ++ allow $3 $1_wine_t:process { getattr noatsecure signal_perms }; + domtrans_pattern($3, wine_exec_t, $1_wine_t) +- +- corecmd_bin_domtrans($1_wine_t, $3) ++ corecmd_bin_domtrans($1_wine_t, $1_t) + + userdom_unpriv_usertype($1, $1_wine_t) +- userdom_manage_user_tmpfs_files($1_wine_t) ++ userdom_manage_tmp_role($2, $1_wine_t) ++ userdom_manage_home_role($2 ,$1_wine_t) + + domain_mmap_low($1_wine_t) + +- tunable_policy(`wine_mmap_zero_ignore',` +- dontaudit $1_wine_t self:memprotect mmap_zero; +- ') +- + optional_policy(` + xserver_role($1_r, $1_wine_t) + ') +@@ -123,9 +130,8 @@ interface(`wine_domtrans',` + + ######################################## + ## +-## Execute wine in the wine domain, +-## and allow the specified role +-## the wine domain. ++## Execute wine in the wine domain, and ++## allow the specified role the wine domain. + ## + ## + ## +@@ -140,11 +146,11 @@ interface(`wine_domtrans',` + # + interface(`wine_run',` + gen_require(` +- attribute_role wine_roles; ++ type wine_t; + ') + + wine_domtrans($1) +- roleattribute $2 wine_roles; ++ role $2 types wine_t; + ') + + ######################################## +@@ -165,3 +171,22 @@ interface(`wine_rw_shm',` + + allow $1 wine_t:shm rw_shm_perms; + ') ++ ++######################################## ++## ++## Transition to wine named content ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`wine_filetrans_named_content',` ++ gen_require(` ++ type wine_home_t; ++ ') ++ ++ userdom_user_home_dir_filetrans($1, wine_home_t, dir, ".wine") ++') ++ +diff --git a/wine.te b/wine.te +index 491b87b44a..2a79df4078 100644 +--- a/wine.te ++++ b/wine.te +@@ -14,10 +14,11 @@ policy_module(wine, 1.11.0) + ## + gen_tunable(wine_mmap_zero_ignore, false) + ++attribute wine_domain; + attribute_role wine_roles; + roleattribute system_r wine_roles; + +-type wine_t; ++type wine_t, wine_domain; + type wine_exec_t; + userdom_user_application_domain(wine_t, wine_exec_t) + role wine_roles types wine_t; +@@ -25,56 +26,63 @@ role wine_roles types wine_t; + type wine_home_t; + userdom_user_home_content(wine_home_t) + +-type wine_tmp_t; +-userdom_user_tmp_file(wine_tmp_t) +- + ######################################## + # + # Local policy + # ++domain_mmap_low(wine_t) ++ ++optional_policy(` ++ unconfined_domain(wine_t) ++') + +-allow wine_t self:process { execstack execmem execheap }; +-allow wine_t self:fifo_file manage_fifo_file_perms; + +-can_exec(wine_t, wine_exec_t) ++######################################## ++# ++# Common wine domain policy ++# + +-userdom_user_home_dir_filetrans(wine_t, wine_home_t, dir, ".wine") ++allow wine_domain self:process { execstack execmem execheap }; ++allow wine_domain self:fifo_file manage_fifo_file_perms; + +-manage_dirs_pattern(wine_t, wine_tmp_t, wine_tmp_t) +-manage_files_pattern(wine_t, wine_tmp_t, wine_tmp_t) +-files_tmp_filetrans(wine_t, wine_tmp_t, { file dir }) ++can_exec(wine_domain, wine_exec_t) + +-domain_mmap_low(wine_t) ++manage_files_pattern(wine_domain, wine_home_t, wine_home_t) ++manage_lnk_files_pattern(wine_domain, wine_home_t, wine_home_t) ++manage_dirs_pattern(wine_domain, wine_home_t, wine_home_t) ++userdom_tmpfs_filetrans(wine_domain, file) ++wine_filetrans_named_content(wine_domain) + +-files_execmod_all_files(wine_t) ++files_execmod_all_files(wine_domain) + +-userdom_use_user_terminals(wine_t) ++userdom_use_inherited_user_terminals(wine_domain) + + tunable_policy(`wine_mmap_zero_ignore',` +- dontaudit wine_t self:memprotect mmap_zero; ++ dontaudit wine_domain self:memprotect mmap_zero; + ') + + optional_policy(` +- dbus_system_bus_client(wine_t) ++ dbus_system_bus_client(wine_domain) + + optional_policy(` +- hal_dbus_chat(wine_t) ++ hal_dbus_chat(wine_domain) + ') + + optional_policy(` +- policykit_dbus_chat(wine_t) ++ policykit_dbus_chat(wine_domain) + ') + ') + + optional_policy(` +- rtkit_scheduled(wine_t) ++ gnome_create_generic_cache_dir(wine_domain) + ') + + optional_policy(` +- unconfined_domain(wine_t) ++ rtkit_scheduled(wine_domain) + ') + + optional_policy(` +- xserver_read_xdm_pid(wine_t) +- xserver_rw_shm(wine_t) ++ xserver_read_xdm_pid(wine_domain) ++ xserver_rw_shm(wine_domain) + ') ++ +diff --git a/wireshark.te b/wireshark.te +index ff6ef38592..436d3bf5ad 100644 +--- a/wireshark.te ++++ b/wireshark.te +@@ -34,7 +34,7 @@ userdom_user_tmpfs_file(wireshark_tmpfs_t) + # Local Policy + # + +-allow wireshark_t self:capability { net_admin net_raw setgid }; ++allow wireshark_t self:capability { net_admin net_raw }; + allow wireshark_t self:process { signal getsched }; + allow wireshark_t self:fifo_file rw_fifo_file_perms; + allow wireshark_t self:shm create_shm_perms; +@@ -82,7 +82,6 @@ dev_read_rand(wireshark_t) + dev_read_sysfs(wireshark_t) + dev_read_urand(wireshark_t) + +-files_read_usr_files(wireshark_t) + + fs_getattr_all_fs(wireshark_t) + fs_list_inotifyfs(wireshark_t) +@@ -90,31 +89,15 @@ fs_search_auto_mountpoints(wireshark_t) + + auth_use_nsswitch(wireshark_t) + +-libs_read_lib_files(wireshark_t) +- + miscfiles_read_fonts(wireshark_t) +-miscfiles_read_localization(wireshark_t) + + userdom_use_user_terminals(wireshark_t) + + userdom_manage_user_home_content_files(wireshark_t) +-userdom_user_home_dir_filetrans_user_home_content(wireshark_t, file) +- +-tunable_policy(`use_nfs_home_dirs',` +- fs_manage_nfs_dirs(wireshark_t) +- fs_manage_nfs_files(wireshark_t) +- fs_manage_nfs_symlinks(wireshark_t) +-') + +-tunable_policy(`use_samba_home_dirs',` +- fs_manage_cifs_dirs(wireshark_t) +- fs_manage_cifs_files(wireshark_t) +- fs_manage_cifs_symlinks(wireshark_t) +-') ++userdom_filetrans_home_content(wireshark_t) + +-optional_policy(` +- seutil_use_newrole_fds(wireshark_t) +-') ++userdom_home_manager(wireshark_t) + + optional_policy(` + userhelper_use_fd(wireshark_t) +diff --git a/wm.fc b/wm.fc +index 304ae09d36..c1d10a11b0 100644 +--- a/wm.fc ++++ b/wm.fc +@@ -1,4 +1,4 @@ + /usr/bin/gnome-shell -- gen_context(system_u:object_r:wm_exec_t,s0) + /usr/bin/openbox -- gen_context(system_u:object_r:wm_exec_t,s0) + /usr/bin/metacity -- gen_context(system_u:object_r:wm_exec_t,s0) +-/usr/bin/twm -- gen_context(system_u:object_r:wm_exec_t,s0) ++/usr/bin/twm -- gen_context(system_u:object_r:wm_exec_t,s0) +diff --git a/wm.if b/wm.if +index 95f888d169..48fe249e15 100644 +--- a/wm.if ++++ b/wm.if +@@ -1,4 +1,4 @@ +-## X Window Managers. ++## X Window Managers + + ####################################### + ## +@@ -29,69 +29,58 @@ + # + template(`wm_role_template',` + gen_require(` +- attribute wm_domain; + type wm_exec_t; ++ class dbus send_msg; ++ attribute wm_domain; + ') + +- ######################################## +- # +- # Declarations +- # +- + type $1_wm_t, wm_domain; +- userdom_user_application_domain($1_wm_t, wm_exec_t) ++ domain_type($1_wm_t) ++ domain_entry_file($1_wm_t, wm_exec_t) + role $2 types $1_wm_t; + +- ######################################## +- # +- # Policy +- # +- + allow $1_wm_t $3:unix_stream_socket connectto; + allow $3 $1_wm_t:unix_stream_socket connectto; ++ allow $3 $1_wm_t:process { signal sigchld signull }; ++ allow $1_wm_t $3:process { signull sigkill }; + +- allow $3 $1_wm_t:process { ptrace signal_perms }; +- ps_process_pattern($3, $1_wm_t) ++ allow $1_wm_t $3:dbus send_msg; ++ allow $3 $1_wm_t:dbus send_msg; + +- allow $1_wm_t $3:process { signull sigkill }; ++ userdom_manage_home_role($2, $1_wm_t) ++ userdom_manage_tmp_role($2, $1_wm_t) ++ userdom_exec_user_tmp_files($1_wm_t) + + domtrans_pattern($3, wm_exec_t, $1_wm_t) + + corecmd_bin_domtrans($1_wm_t, $3) + corecmd_shell_domtrans($1_wm_t, $3) + ++ auth_use_nsswitch($1_wm_t) ++ ++ kernel_read_system_state($1_wm_t) ++ ++ auth_use_nsswitch($1_wm_t) ++ + mls_file_read_all_levels($1_wm_t) + mls_file_write_all_levels($1_wm_t) + mls_xwin_read_all_levels($1_wm_t) + mls_xwin_write_all_levels($1_wm_t) + mls_fd_use_all_levels($1_wm_t) + +- auth_use_nsswitch($1_wm_t) +- +- xserver_role($2, $1_wm_t) +- xserver_manage_core_devices($1_wm_t) +- +- optional_policy(` +- dbus_spec_session_bus_client($1, $1_wm_t) +- dbus_system_bus_client($1_wm_t) +- +- optional_policy(` +- wm_dbus_chat($1, $3) +- ') +- ') +- + optional_policy(` +- gnome_stream_connect_gkeyringd($1, $1_wm_t) ++ pulseaudio_run($1_wm_t, $2) + ') + + optional_policy(` +- pulseaudio_run($1_wm_t, $2) ++ xserver_role($2, $1_wm_t) ++ xserver_manage_core_devices($1_wm_t) + ') + ') + + ######################################## + ## +-## Execute wm in the caller domain. ++## Execute the wm program in the wm domain. + ## + ## + ## +@@ -104,33 +93,5 @@ interface(`wm_exec',` + type wm_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, wm_exec_t) + ') +- +-######################################## +-## +-## Send and receive messages from +-## specified wm over dbus. +-## +-## +-## +-## The prefix of the user domain (e.g., user +-## is the prefix for user_t). +-## +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`wm_dbus_chat',` +- gen_require(` +- type $1_wm_t; +- class dbus send_msg; +- ') +- +- allow $2 $1_wm_t:dbus send_msg; +- allow $1_wm_t $2:dbus send_msg; +-') +diff --git a/wm.te b/wm.te +index 638d10fc69..5fb9960089 100644 +--- a/wm.te ++++ b/wm.te +@@ -1,12 +1,12 @@ + policy_module(wm, 1.3.3) + ++attribute wm_domain; ++ + ######################################## + # + # Declarations + # + +-attribute wm_domain; +- + type wm_exec_t; + corecmd_executable_file(wm_exec_t) + +@@ -18,11 +18,11 @@ corecmd_executable_file(wm_exec_t) + allow wm_domain self:fifo_file rw_fifo_file_perms; + allow wm_domain self:process { setcap setrlimit execmem signal_perms getsched setsched }; + allow wm_domain self:netlink_kobject_uevent_socket create_socket_perms; ++ + allow wm_domain self:shm create_shm_perms; + allow wm_domain self:unix_dgram_socket create_socket_perms; + +-kernel_read_system_state(wm_domain) +- ++corecmd_dontaudit_access_all_executables(wm_domain) + corecmd_getattr_all_executables(wm_domain) + + dev_read_sound(wm_domain) +@@ -31,12 +31,18 @@ dev_read_urand(wm_domain) + dev_rw_wireless(wm_domain) + dev_write_sound(wm_domain) + +-files_read_usr_files(wm_domain) +- + fs_getattr_all_fs(wm_domain) + ++application_signull(wm_domain) ++ ++init_read_state(wm_domain) ++ + miscfiles_read_fonts(wm_domain) +-miscfiles_read_localization(wm_domain) ++ ++systemd_dbus_chat_logind(wm_domain) ++systemd_read_logind_sessions_files(wm_domain) ++systemd_write_inhibit_pipes(wm_domain) ++systemd_login_read_pid_files(wm_domain) + + userdom_manage_user_tmp_sockets(wm_domain) + userdom_tmp_filetrans_user_tmp(wm_domain, sock_file) +@@ -45,24 +51,38 @@ userdom_manage_user_home_content_dirs(wm_domain) + userdom_manage_user_home_content_files(wm_domain) + userdom_user_home_dir_filetrans_user_home_content(wm_domain, { dir file }) + +-optional_policy(` +- accountsd_dbus_chat(wm_domain) +-') +- +-optional_policy(` +- bluetooth_dbus_chat(wm_domain) +-') ++udev_read_pid_files(wm_domain) + + optional_policy(` +- devicekit_dbus_chat_power(wm_domain) ++ gnome_stream_connect_gkeyringd(wm_domain) + ') + + optional_policy(` +- networkmanager_dbus_chat(wm_domain) +-') ++ dbus_system_bus_client(wm_domain) ++ dbus_session_bus_client(wm_domain) ++ optional_policy(` ++ accountsd_dbus_chat(wm_domain) ++ ') ++ ++ optional_policy(` ++ bluetooth_dbus_chat(wm_domain) ++ ') + +-optional_policy(` +- policykit_dbus_chat(wm_domain) ++ optional_policy(` ++ devicekit_dbus_chat_power(wm_domain) ++ ') ++ ++ optional_policy(` ++ networkmanager_dbus_chat(wm_domain) ++ ') ++ ++ optional_policy(` ++ policykit_dbus_chat(wm_domain) ++ ') ++ ++ optional_policy(` ++ systemd_dbus_chat_logind(wm_domain) ++ ') + ') + + optional_policy(` +@@ -72,3 +92,7 @@ optional_policy(` + optional_policy(` + userhelper_exec_consolehelper(wm_domain) + ') ++ ++optional_policy(` ++ xserver_manage_core_devices(wm_domain) ++') +diff --git a/xen.fc b/xen.fc +index 42d83b02fc..651d1cb610 100644 +--- a/xen.fc ++++ b/xen.fc +@@ -1,38 +1,42 @@ + /dev/xen/tapctrl.* -p gen_context(system_u:object_r:xenctl_t,s0) + +-/usr/lib/xen-[^/]*/bin/xenconsoled -- gen_context(system_u:object_r:xenconsoled_exec_t,s0) +-/usr/lib/xen-[^/]*/bin/xend -- gen_context(system_u:object_r:xend_exec_t,s0) +-/usr/lib/xen-[^/]*/bin/xenstored -- gen_context(system_u:object_r:xenstored_exec_t,s0) +-/usr/lib/xen-[^/]*/bin/xl -- gen_context(system_u:object_r:xm_exec_t,s0) +-/usr/lib/xen-[^/]*/bin/xm -- gen_context(system_u:object_r:xm_exec_t,s0) +- + /usr/sbin/blktapctrl -- gen_context(system_u:object_r:blktap_exec_t,s0) + /usr/sbin/evtchnd -- gen_context(system_u:object_r:evtchnd_exec_t,s0) + /usr/sbin/tapdisk -- gen_context(system_u:object_r:blktap_exec_t,s0) ++ ++#/usr/lib/xen/bin/qemu-dm -- gen_context(system_u:object_r:qemu_dm_exec_t,s0) ++ ++ifdef(`distro_debian',` ++/usr/lib/xen-[^/]*/bin/xenconsoled -- gen_context(system_u:object_r:xenconsoled_exec_t,s0) ++/usr/lib/xen-[^/]*/bin/xend -- gen_context(system_u:object_r:xend_exec_t,s0) ++/usr/lib/xen-[^/]*/bin/xenstored -- gen_context(system_u:object_r:xenstored_exec_t,s0) ++/usr/lib/xen-[^/]*/bin/xm -- gen_context(system_u:object_r:xm_exec_t,s0) ++',` + /usr/sbin/xenconsoled -- gen_context(system_u:object_r:xenconsoled_exec_t,s0) +-/usr/sbin/xend -- gen_context(system_u:object_r:xend_exec_t,s0) ++/usr/sbin/xend -- gen_context(system_u:object_r:xend_exec_t,s0) + /usr/sbin/xenstored -- gen_context(system_u:object_r:xenstored_exec_t,s0) +-/usr/sbin/xl -- gen_context(system_u:object_r:xm_exec_t,s0) +-/usr/sbin/xm -- gen_context(system_u:object_r:xm_exec_t,s0) ++/usr/sbin/oxenstored -- gen_context(system_u:object_r:xenstored_exec_t,s0) ++') + +-/var/lib/xen(/.*)? gen_context(system_u:object_r:xend_var_lib_t,s0) ++/var/lib/xen(/.*)? gen_context(system_u:object_r:xend_var_lib_t,s0) + /var/lib/xen/images(/.*)? gen_context(system_u:object_r:xen_image_t,s0) +-/var/lib/xend(/.*)? gen_context(system_u:object_r:xend_var_lib_t,s0) ++/var/lib/xend(/.*)? gen_context(system_u:object_r:xend_var_lib_t,s0) + /var/lib/xenstored(/.*)? gen_context(system_u:object_r:xenstored_var_lib_t,s0) + + /var/log/evtchnd\.log.* -- gen_context(system_u:object_r:evtchnd_var_log_t,s0) +-/var/log/xen(/.*)? gen_context(system_u:object_r:xend_var_log_t,s0) ++/var/log/xen(/.*)? gen_context(system_u:object_r:xend_var_log_t,s0) + /var/log/xen-hotplug\.log.* -- gen_context(system_u:object_r:xend_var_log_t,s0) + /var/log/xend\.log.* -- gen_context(system_u:object_r:xend_var_log_t,s0) + /var/log/xend-debug\.log.* -- gen_context(system_u:object_r:xend_var_log_t,s0) ++/var/log/xenstored.* gen_context(system_u:object_r:xenstored_var_log_t,s0) + + /var/run/evtchnd -s gen_context(system_u:object_r:evtchnd_var_run_t,s0) + /var/run/evtchnd\.pid -- gen_context(system_u:object_r:evtchnd_var_run_t,s0) +-/var/run/xenconsoled\.pid -- gen_context(system_u:object_r:xenconsoled_var_run_t,s0) +-/var/run/xend(/.*)? gen_context(system_u:object_r:xend_var_run_t,s0) ++/var/run/xenconsoled\.pid -- gen_context(system_u:object_r:xenconsoled_var_run_t,s0) ++/var/run/xend(/.*)? gen_context(system_u:object_r:xend_var_run_t,s0) + /var/run/xend\.pid -- gen_context(system_u:object_r:xend_var_run_t,s0) +-/var/run/xenner(/.*)? gen_context(system_u:object_r:xend_var_run_t,s0) ++/var/run/xenner(/.*)? gen_context(system_u:object_r:xend_var_run_t,s0) + /var/run/xenstore\.pid -- gen_context(system_u:object_r:xenstored_var_run_t,s0) + /var/run/xenstored(/.*)? gen_context(system_u:object_r:xenstored_var_run_t,s0) + +-/xen(/.*)? gen_context(system_u:object_r:xen_image_t,s0) ++/xen(/.*)? gen_context(system_u:object_r:xen_image_t,s0) +diff --git a/xen.if b/xen.if +index f93558c5ac..16e29c1413 100644 +--- a/xen.if ++++ b/xen.if +@@ -1,13 +1,13 @@ +-## Xen hypervisor. ++## Xen hypervisor + + ######################################## + ## + ## Execute a domain transition to run xend. + ## + ## +-## ++## + ## Domain allowed to transition. +-## ++## + ## + # + interface(`xen_domtrans',` +@@ -15,18 +15,18 @@ interface(`xen_domtrans',` + type xend_t, xend_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, xend_exec_t, xend_t) + ') + + ######################################## + ## +-## Execute xend in the caller domain. ++## Allow the specified domain to execute xend ++## in the caller domain. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`xen_exec',` +@@ -34,7 +34,6 @@ interface(`xen_exec',` + type xend_exec_t; + ') + +- corecmd_search_bin($1) + can_exec($1, xend_exec_t) + ') + +@@ -75,24 +74,43 @@ interface(`xen_dontaudit_use_fds',` + dontaudit $1 xend_t:fd use; + ') + ++####################################### ++## ++## Read xend pid files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`xen_read_pid_files_xenstored',` ++ gen_require(` ++ type xenstored_var_run_t; ++ ') ++ ++ files_search_pids($1) ++ ++ read_files_pattern($1, xenstored_var_run_t, xenstored_var_run_t) ++') ++ + ######################################## + ## +-## Create, read, write, and delete +-## xend image directories. ++## Read xend lib files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # +-interface(`xen_manage_image_dirs',` ++interface(`xen_read_lib_files',` + gen_require(` + type xend_var_lib_t; + ') + +- files_search_var_lib($1) +- manage_dirs_pattern($1, xend_var_lib_t, xend_var_lib_t) ++ files_list_var_lib($1) ++ read_files_pattern($1, xend_var_lib_t, xend_var_lib_t) + ') + + ######################################## +@@ -100,9 +118,9 @@ interface(`xen_manage_image_dirs',` + ## Read xend image files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`xen_read_image_files',` +@@ -111,18 +129,40 @@ interface(`xen_read_image_files',` + ') + + files_list_var_lib($1) ++ + list_dirs_pattern($1, xend_var_lib_t, xend_var_lib_t) + read_files_pattern($1, { xend_var_lib_t xen_image_t }, xen_image_t) + ') + + ######################################## + ## +-## Read and write xend image files. ++## Allow the specified domain to read/write ++## xend image files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## ++## ++# ++interface(`xen_manage_image_dirs',` ++ gen_require(` ++ type xend_var_lib_t; ++ ') ++ ++ files_list_var_lib($1) ++ manage_dirs_pattern($1, xend_var_lib_t, xend_var_lib_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to read/write ++## xend image files. ++## ++## ++## ++## Domain allowed to transition. ++## + ## + # + interface(`xen_rw_image_files',` +@@ -137,7 +177,8 @@ interface(`xen_rw_image_files',` + + ######################################## + ## +-## Append xend log files. ++## Allow the specified domain to append ++## xend log files. + ## + ## + ## +@@ -157,13 +198,13 @@ interface(`xen_append_log',` + + ######################################## + ## +-## Create, read, write, and delete ++## Create, read, write, and delete the + ## xend log files. + ## + ## +-## ++## + ## Domain allowed access. +-## ++## + ## + # + interface(`xen_manage_log',` +@@ -176,29 +217,11 @@ interface(`xen_manage_log',` + manage_files_pattern($1, xend_var_log_t, xend_var_log_t) + ') + +-####################################### +-## +-## Read xenstored pid files. +-## +-## +-## +-## Domain allowed access. +-## +-## +-# +-interface(`xen_read_xenstored_pid_files',` +- gen_require(` +- type xenstored_var_run_t; +- ') +- +- files_search_pids($1) +- read_files_pattern($1, xenstored_var_run_t, xenstored_var_run_t) +-') +- + ######################################## + ## + ## Do not audit attempts to read and write +-## Xen unix domain stream sockets. ++## Xen unix domain stream sockets. These ++## are leaked file descriptors. + ## + ## + ## +@@ -216,8 +239,7 @@ interface(`xen_dontaudit_rw_unix_stream_sockets',` + + ######################################## + ## +-## Connect to xenstored with a unix +-## domain stream socket. ++## Connect to xenstored over a unix stream socket. + ## + ## + ## +@@ -236,8 +258,7 @@ interface(`xen_stream_connect_xenstore',` + + ######################################## + ## +-## Connect to xend with a unix +-## domain stream socket. ++## Connect to xend over a unix domain stream socket. + ## + ## + ## +@@ -270,16 +291,15 @@ interface(`xen_stream_connect',` + interface(`xen_domtrans_xm',` + gen_require(` + type xm_t, xm_exec_t; ++ attribute virsh_transition_domain; + ') +- +- corecmd_search_bin($1) ++ typeattribute $1 virsh_transition_domain; + domtrans_pattern($1, xm_exec_t, xm_t) + ') + + ######################################## + ## +-## Connect to xm with a unix +-## domain stream socket. ++## Connect to xm over a unix stream socket. + ## + ## + ## +@@ -289,7 +309,7 @@ interface(`xen_domtrans_xm',` + # + interface(`xen_stream_connect_xm',` + gen_require(` +- type xm_t; ++ type xm_t, xenstored_var_run_t; + ') + + files_search_pids($1) +diff --git a/xen.te b/xen.te +index 6f736a9936..c1ba3ba4b9 100644 +--- a/xen.te ++++ b/xen.te +@@ -4,39 +4,31 @@ policy_module(xen, 1.13.0) + # + # Declarations + # ++attribute xm_transition_domain; + + ## +-##

      +-## Determine whether xend can +-## run blktapctrl and tapdisk. ++##

      ++## Allow xend to run blktapctrl/tapdisk. ++## Not required if using dedicated logical volumes for disk images. + ##

      + ##
      +-gen_tunable(xend_run_blktap, false) ++gen_tunable(xend_run_blktap, true) + + ## +-##

      +-## Determine whether xen can +-## use fusefs file systems. +-##

      ++##

      ++## Allow xend to run qemu-dm. ++## Not required if using paravirt and no vfb. ++##

      + ##
      +-gen_tunable(xen_use_fusefs, false) ++gen_tunable(xend_run_qemu, true) + + ## +-##

      +-## Determine whether xen can +-## use nfs file systems. +-##

      ++##

      ++## Allow xen to manage nfs files ++##

      + ##
      + gen_tunable(xen_use_nfs, false) + +-## +-##

      +-## Determine whether xen can +-## use samba file systems. +-##

      +-##
      +-gen_tunable(xen_use_samba, false) +- + type blktap_t; + type blktap_exec_t; + domain_type(blktap_t) +@@ -50,41 +42,55 @@ type evtchnd_t; + type evtchnd_exec_t; + init_daemon_domain(evtchnd_t, evtchnd_exec_t) + ++# log files + type evtchnd_var_log_t; + logging_log_file(evtchnd_var_log_t) + ++# pid files + type evtchnd_var_run_t; + files_pid_file(evtchnd_var_run_t) + ++type qemu_dm_t; ++type qemu_dm_exec_t; ++domain_type(qemu_dm_t) ++domain_entry_file(qemu_dm_t, qemu_dm_exec_t) ++role system_r types qemu_dm_t; ++ ++# console ptys + type xen_devpts_t; + term_pty(xen_devpts_t) + files_type(xen_devpts_t) + ++# Xen Image files + type xen_image_t; # customizable + files_type(xen_image_t) ++# xen_image_t can be assigned to blk devices + dev_node(xen_image_t) +- +-optional_policy(` +- virt_image(xen_image_t) +-') ++virt_image(xen_image_t) + + type xenctl_t; + files_type(xenctl_t) + + type xend_t; + type xend_exec_t; ++domain_type(xend_t) + init_daemon_domain(xend_t, xend_exec_t) + ++# tmp files + type xend_tmp_t; + files_tmp_file(xend_tmp_t) + ++# var/lib files + type xend_var_lib_t; + files_type(xend_var_lib_t) ++# for mounting an NFS store + files_mountpoint(xend_var_lib_t) + ++# log files + type xend_var_log_t; + logging_log_file(xend_var_log_t) + ++# pid files + type xend_var_run_t; + files_pid_file(xend_var_run_t) + files_mountpoint(xend_var_run_t) +@@ -96,51 +102,50 @@ init_daemon_domain(xenstored_t, xenstored_exec_t) + type xenstored_tmp_t; + files_tmp_file(xenstored_tmp_t) + ++# var/lib files + type xenstored_var_lib_t; + files_type(xenstored_var_lib_t) + files_mountpoint(xenstored_var_lib_t) + ++# log files + type xenstored_var_log_t; + logging_log_file(xenstored_var_log_t) + ++# pid files + type xenstored_var_run_t; + files_pid_file(xenstored_var_run_t) +-init_daemon_run_dir(xenstored_var_run_t, "xenstored") + + type xenconsoled_t; + type xenconsoled_exec_t; + init_daemon_domain(xenconsoled_t, xenconsoled_exec_t) + ++# pid files + type xenconsoled_var_run_t; + files_pid_file(xenconsoled_var_run_t) + +-type xm_t; +-type xm_exec_t; +-init_system_domain(xm_t, xm_exec_t) +- + ######################################## + # + # blktap local policy + # +- ++# Do we need to allow execution of blktap? + tunable_policy(`xend_run_blktap',` ++ # If yes, transition to its own domain. + domtrans_pattern(xend_t, blktap_exec_t, blktap_t) + +- allow blktap_t self:fifo_file { read write }; ++',` ++ # If no, then silently refuse to run it. ++ dontaudit xend_t blktap_exec_t:file { execute execute_no_trans }; ++') + +- dev_read_sysfs(blktap_t) +- dev_rw_xen(blktap_t) ++allow blktap_t self:fifo_file { read write }; + +- files_read_etc_files(blktap_t) ++dev_read_sysfs(blktap_t) ++dev_rw_xen(blktap_t) + +- logging_send_syslog_msg(blktap_t) + +- miscfiles_read_localization(blktap_t) ++logging_send_syslog_msg(blktap_t) + +- xen_stream_connect_xenstore(blktap_t) +-',` +- dontaudit xend_t blktap_exec_t:file { execute execute_no_trans }; +-') ++xen_stream_connect_xenstore(blktap_t) + + ####################################### + # +@@ -148,9 +153,7 @@ tunable_policy(`xend_run_blktap',` + # + + manage_dirs_pattern(evtchnd_t, evtchnd_var_log_t, evtchnd_var_log_t) +-append_files_pattern(evtchnd_t, evtchnd_var_log_t, evtchnd_var_log_t) +-create_files_pattern(evtchnd_t, evtchnd_var_log_t, evtchnd_var_log_t) +-setattr_files_pattern(evtchnd_t, evtchnd_var_log_t, evtchnd_var_log_t) ++manage_files_pattern(evtchnd_t, evtchnd_var_log_t, evtchnd_var_log_t) + logging_log_filetrans(evtchnd_t, evtchnd_var_log_t, { file dir }) + + manage_dirs_pattern(evtchnd_t, evtchnd_var_run_t, evtchnd_var_run_t) +@@ -158,30 +161,70 @@ manage_files_pattern(evtchnd_t, evtchnd_var_run_t, evtchnd_var_run_t) + manage_sock_files_pattern(evtchnd_t, evtchnd_var_run_t, evtchnd_var_run_t) + files_pid_filetrans(evtchnd_t, evtchnd_var_run_t, { file sock_file dir }) + ++######################################## ++# ++# qemu-dm local policy ++# ++ ++# TODO: This part of policy should be removed ++# qemu-dm should run in xend_t domain ++ ++# Do we need to allow execution of qemu-dm? ++tunable_policy(`xend_run_qemu',` ++ allow qemu_dm_t self:capability sys_resource; ++ allow qemu_dm_t self:process setrlimit; ++ allow qemu_dm_t self:fifo_file { read write }; ++ allow qemu_dm_t self:tcp_socket create_stream_socket_perms; ++ ++ # If yes, transition to its own domain. ++ domtrans_pattern(xend_t, qemu_dm_exec_t, qemu_dm_t) ++ ++ append_files_pattern(qemu_dm_t, xend_var_log_t, xend_var_log_t) ++ ++ rw_fifo_files_pattern(qemu_dm_t, xend_var_run_t, xend_var_run_t) ++ ++ corenet_tcp_bind_generic_node(qemu_dm_t) ++ corenet_tcp_bind_vnc_port(qemu_dm_t) ++ ++ dev_rw_xen(qemu_dm_t) ++ ++ ++ fs_manage_xenfs_dirs(qemu_dm_t) ++ fs_manage_xenfs_files(qemu_dm_t) ++ ++ ++ xen_stream_connect_xenstore(qemu_dm_t) ++',` ++ # If no, then silently refuse to run it. ++ dontaudit xend_t qemu_dm_exec_t:file { execute execute_no_trans }; ++') ++ + ######################################## + # + # xend local policy + # + +-allow xend_t self:capability { dac_override ipc_lock net_admin setuid sys_admin sys_nice sys_tty_config net_raw sys_resource sys_rawio }; +-dontaudit xend_t self:capability { sys_ptrace }; +-allow xend_t self:process { setrlimit signal sigkill }; +-dontaudit xend_t self:process ptrace; ++allow xend_t self:capability { dac_read_search dac_override ipc_lock net_admin setuid sys_admin sys_nice sys_tty_config net_raw sys_rawio }; ++allow xend_t self:process { signal sigkill }; ++ ++# needed by qemu_dm ++allow xend_t self:capability sys_resource; ++allow xend_t self:process setrlimit; ++ ++# internal communication is often done using fifo and unix sockets. + allow xend_t self:fifo_file rw_fifo_file_perms; +-allow xend_t self:unix_stream_socket { accept listen }; +-allow xend_t self:tcp_socket { accept listen }; ++allow xend_t self:unix_stream_socket create_stream_socket_perms; ++allow xend_t self:unix_dgram_socket create_socket_perms; ++allow xend_t self:netlink_route_socket r_netlink_socket_perms; ++allow xend_t self:tcp_socket create_stream_socket_perms; + allow xend_t self:packet_socket create_socket_perms; + allow xend_t self:tun_socket create_socket_perms; + + allow xend_t xen_image_t:dir list_dir_perms; + manage_dirs_pattern(xend_t, xen_image_t, xen_image_t) +-manage_fifo_files_pattern(xend_t, xen_image_t, xen_image_t) + manage_files_pattern(xend_t, xen_image_t, xen_image_t) + read_lnk_files_pattern(xend_t, xen_image_t, xen_image_t) +-read_sock_files_pattern(xend_t, xen_image_t, xen_image_t) +-rw_chr_files_pattern(xend_t, xen_image_t, xen_image_t) + rw_blk_files_pattern(xend_t, xen_image_t, xen_image_t) +-fs_hugetlbfs_filetrans(xend_t, xen_image_t, file) + + allow xend_t xenctl_t:fifo_file manage_fifo_file_perms; + dev_filetrans(xend_t, xenctl_t, fifo_file) +@@ -190,33 +233,37 @@ manage_files_pattern(xend_t, xend_tmp_t, xend_tmp_t) + manage_dirs_pattern(xend_t, xend_tmp_t, xend_tmp_t) + files_tmp_filetrans(xend_t, xend_tmp_t, { file dir }) + ++# pid file + manage_dirs_pattern(xend_t, xend_var_run_t, xend_var_run_t) + manage_files_pattern(xend_t, xend_var_run_t, xend_var_run_t) + manage_sock_files_pattern(xend_t, xend_var_run_t, xend_var_run_t) + manage_fifo_files_pattern(xend_t, xend_var_run_t, xend_var_run_t) + files_pid_filetrans(xend_t, xend_var_run_t, { file sock_file fifo_file dir }) + ++# log files + manage_dirs_pattern(xend_t, xend_var_log_t, xend_var_log_t) +-append_files_pattern(xend_t, xend_var_log_t, xend_var_log_t) +-create_files_pattern(xend_t, xend_var_log_t, xend_var_log_t) +-setattr_files_pattern(xend_t, xend_var_log_t, xend_var_log_t) ++manage_files_pattern(xend_t, xend_var_log_t, xend_var_log_t) + manage_sock_files_pattern(xend_t, xend_var_log_t, xend_var_log_t) + logging_log_filetrans(xend_t, xend_var_log_t, { sock_file file dir }) + ++# var/lib files for xend + manage_dirs_pattern(xend_t, xend_var_lib_t, xend_var_lib_t) + manage_files_pattern(xend_t, xend_var_lib_t, xend_var_lib_t) + manage_sock_files_pattern(xend_t, xend_var_lib_t, xend_var_lib_t) + manage_fifo_files_pattern(xend_t, xend_var_lib_t, xend_var_lib_t) + files_var_lib_filetrans(xend_t, xend_var_lib_t, { file dir }) + ++# transition to store ++domtrans_pattern(xend_t, xenstored_exec_t, xenstored_t) ++ ++# manage xenstored pid file + manage_files_pattern(xend_t, xenstored_var_run_t, xenstored_var_run_t) + +-allow xend_t xenstored_var_lib_t:dir list_dir_perms; ++# mount tmpfs on /var/lib/xenstored ++allow xend_t xenstored_var_lib_t:dir read; + ++# transition to console + domtrans_pattern(xend_t, xenconsoled_exec_t, xenconsoled_t) +-domtrans_pattern(xend_t, xenstored_exec_t, xenstored_t) +- +-xen_stream_connect_xenstore(xend_t) + + kernel_read_kernel_sysctls(xend_t) + kernel_read_system_state(xend_t) +@@ -224,61 +271,44 @@ kernel_write_xen_state(xend_t) + kernel_read_xen_state(xend_t) + kernel_rw_net_sysctls(xend_t) + kernel_read_network_state(xend_t) ++kernel_request_load_module(xend_t) + + corecmd_exec_bin(xend_t) + corecmd_exec_shell(xend_t) + +-corenet_all_recvfrom_unlabeled(xend_t) + corenet_all_recvfrom_netlabel(xend_t) + corenet_tcp_sendrecv_generic_if(xend_t) + corenet_tcp_sendrecv_generic_node(xend_t) + corenet_tcp_sendrecv_all_ports(xend_t) + corenet_tcp_bind_generic_node(xend_t) +- +-corenet_sendrecv_xen_server_packets(xend_t) + corenet_tcp_bind_xen_port(xend_t) +- +-corenet_sendrecv_soundd_server_packets(xend_t) + corenet_tcp_bind_soundd_port(xend_t) +- +-corenet_sendrecv_generic_server_packets(xend_t) + corenet_tcp_bind_generic_port(xend_t) +- +-corenet_sendrecv_vnc_server_packets(xend_t) + corenet_tcp_bind_vnc_port(xend_t) +- +-corenet_sendrecv_xserver_client_packets(xend_t) + corenet_tcp_connect_xserver_port(xend_t) +- +-corenet_sendrecv_xen_client_packets(xend_t) + corenet_tcp_connect_xen_port(xend_t) +- ++corenet_sendrecv_xserver_client_packets(xend_t) ++corenet_sendrecv_xen_server_packets(xend_t) ++corenet_sendrecv_xen_client_packets(xend_t) ++corenet_sendrecv_soundd_server_packets(xend_t) + corenet_rw_tun_tap_dev(xend_t) + +-dev_getattr_all_chr_files(xend_t) + dev_read_urand(xend_t) ++# run lsscsi ++dev_getattr_all_chr_files(xend_t) + dev_filetrans_xen(xend_t) + dev_rw_sysfs(xend_t) + dev_rw_xen(xend_t) + + domain_dontaudit_read_all_domains_state(xend_t) +-domain_dontaudit_ptrace_all_domains(xend_t) + +-files_read_etc_files(xend_t) + files_read_kernel_symbol_table(xend_t) + files_read_kernel_img(xend_t) + files_manage_etc_runtime_files(xend_t) + files_etc_filetrans_etc_runtime(xend_t, file) +-files_read_usr_files(xend_t) + files_read_default_symlinks(xend_t) +-files_search_mnt(xend_t) + +-fs_getattr_all_fs(xend_t) +-fs_list_auto_mountpoints(xend_t) +-fs_read_dos_files(xend_t) + fs_read_removable_blk_files(xend_t) +-fs_manage_xenfs_dirs(xend_t) +-fs_manage_xenfs_files(xend_t) + + storage_read_scsi_generic(xend_t) + +@@ -295,7 +325,8 @@ locallogin_dontaudit_use_fds(xend_t) + + logging_send_syslog_msg(xend_t) + +-miscfiles_read_localization(xend_t) ++auth_read_passwd(xend_t) ++ + miscfiles_read_hwdata(xend_t) + + sysnet_domtrans_dhcpc(xend_t) +@@ -308,23 +339,7 @@ sysnet_rw_dhcp_config(xend_t) + + userdom_dontaudit_search_user_home_dirs(xend_t) + +-tunable_policy(`xen_use_fusefs',` +- fs_manage_fusefs_dirs(xend_t) +- fs_manage_fusefs_files(xend_t) +- fs_read_fusefs_symlinks(xend_t) +-') +- +-tunable_policy(`xen_use_nfs',` +- fs_manage_nfs_dirs(xend_t) +- fs_manage_nfs_files(xend_t) +- fs_read_nfs_symlinks(xend_t) +-') +- +-tunable_policy(`xen_use_samba',` +- fs_manage_cifs_dirs(xend_t) +- fs_manage_cifs_files(xend_t) +- fs_read_cifs_symlinks(xend_t) +-') ++xen_stream_connect_xenstore(xend_t) + + optional_policy(` + brctl_domtrans(xend_t) +@@ -342,7 +357,7 @@ optional_policy(` + mount_domtrans(xend_t) + ') + +-optional_policy(` ++optional_policy(` + netutils_domtrans(xend_t) + ') + +@@ -351,6 +366,7 @@ optional_policy(` + ') + + optional_policy(` ++ virt_manage_default_image_type(xend_t) + virt_search_images(xend_t) + virt_read_config(xend_t) + ') +@@ -360,18 +376,14 @@ optional_policy(` + # Xen console local policy + # + +-allow xenconsoled_t self:capability { dac_override fsetid ipc_lock }; ++allow xenconsoled_t self:capability { dac_read_search dac_override fsetid ipc_lock }; + allow xenconsoled_t self:process setrlimit; + allow xenconsoled_t self:unix_stream_socket create_stream_socket_perms; + allow xenconsoled_t self:fifo_file rw_fifo_file_perms; + +-allow xenconsoled_t xen_devpts_t:chr_file { rw_term_perms setattr_chr_file_perms }; +- +-manage_dirs_pattern(xenconsoled_t, xend_var_log_t, xend_var_log_t) +-append_files_pattern(xenconsoled_t, xend_var_log_t, xend_var_log_t) +-create_files_pattern(xenconsoled_t, xend_var_log_t, xend_var_log_t) +-setattr_files_pattern(xenconsoled_t, xend_var_log_t, xend_var_log_t) ++allow xenconsoled_t xen_devpts_t:chr_file { rw_term_perms setattr }; + ++# pid file + manage_files_pattern(xenconsoled_t, xenconsoled_var_run_t, xenconsoled_var_run_t) + manage_sock_files_pattern(xenconsoled_t, xenconsoled_var_run_t, xenconsoled_var_run_t) + files_pid_filetrans(xenconsoled_t, xenconsoled_var_run_t, { file sock_file }) +@@ -384,10 +396,6 @@ dev_rw_xen(xenconsoled_t) + dev_filetrans_xen(xenconsoled_t) + dev_rw_sysfs(xenconsoled_t) + +-domain_dontaudit_ptrace_all_domains(xenconsoled_t) +- +-files_read_etc_files(xenconsoled_t) +-files_read_usr_files(xenconsoled_t) + + fs_list_tmpfs(xenconsoled_t) + fs_manage_xenfs_dirs(xenconsoled_t) +@@ -395,15 +403,13 @@ fs_manage_xenfs_files(xenconsoled_t) + + term_create_pty(xenconsoled_t, xen_devpts_t) + term_use_generic_ptys(xenconsoled_t) +-term_use_console(xenconsoled_t) + + init_use_fds(xenconsoled_t) + init_use_script_ptys(xenconsoled_t) + +-logging_search_logs(xenconsoled_t) +- +-miscfiles_read_localization(xenconsoled_t) ++auth_read_passwd(xenconsoled_t) + ++xen_manage_log(xenconsoled_t) + xen_stream_connect_xenstore(xenconsoled_t) + + optional_policy(` +@@ -415,25 +421,27 @@ optional_policy(` + # Xen store local policy + # + +-allow xenstored_t self:capability { dac_override ipc_lock sys_resource }; +-allow xenstored_t self:unix_stream_socket { accept listen }; ++allow xenstored_t self:capability { dac_read_search dac_override ipc_lock sys_resource }; ++allow xenstored_t self:unix_stream_socket create_stream_socket_perms; ++allow xenstored_t self:unix_dgram_socket create_socket_perms; + + manage_files_pattern(xenstored_t, xenstored_tmp_t, xenstored_tmp_t) + manage_dirs_pattern(xenstored_t, xenstored_tmp_t, xenstored_tmp_t) + files_tmp_filetrans(xenstored_t, xenstored_tmp_t, { file dir }) + ++# pid file + manage_dirs_pattern(xenstored_t, xenstored_var_run_t, xenstored_var_run_t) + manage_files_pattern(xenstored_t, xenstored_var_run_t, xenstored_var_run_t) + manage_sock_files_pattern(xenstored_t, xenstored_var_run_t, xenstored_var_run_t) + files_pid_filetrans(xenstored_t, xenstored_var_run_t, { file sock_file dir }) + ++# log files + manage_dirs_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) +-append_files_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) +-create_files_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) +-setattr_files_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) ++manage_files_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) + manage_sock_files_pattern(xenstored_t, xenstored_var_log_t, xenstored_var_log_t) + logging_log_filetrans(xenstored_t, xenstored_var_log_t, { sock_file file dir }) + ++# var/lib files for xenstored + manage_dirs_pattern(xenstored_t, xenstored_var_lib_t, xenstored_var_lib_t) + manage_files_pattern(xenstored_t, xenstored_var_lib_t, xenstored_var_lib_t) + manage_sock_files_pattern(xenstored_t, xenstored_var_lib_t, xenstored_var_lib_t) +@@ -448,157 +456,40 @@ dev_filetrans_xen(xenstored_t) + dev_rw_xen(xenstored_t) + dev_read_sysfs(xenstored_t) + +-files_read_etc_files(xenstored_t) +-files_read_usr_files(xenstored_t) ++ + + fs_search_xenfs(xenstored_t) + fs_manage_xenfs_files(xenstored_t) + + term_use_generic_ptys(xenstored_t) ++term_use_console(xenconsoled_t) + + init_use_fds(xenstored_t) + init_use_script_ptys(xenstored_t) + + logging_send_syslog_msg(xenstored_t) + +-miscfiles_read_localization(xenstored_t) +- + xen_append_log(xenstored_t) + +-######################################## +-# +-# xm local policy +-# +- +-allow xm_t self:capability { setpcap dac_override ipc_lock sys_nice sys_tty_config }; +-allow xm_t self:process { getcap getsched setsched setcap signal }; +-allow xm_t self:fifo_file rw_fifo_file_perms; +-allow xm_t self:unix_stream_socket { accept connectto listen }; +-allow xm_t self:tcp_socket { accept listen }; +- +-manage_files_pattern(xm_t, xend_var_lib_t, xend_var_lib_t) +-manage_fifo_files_pattern(xm_t, xend_var_lib_t, xend_var_lib_t) +-manage_sock_files_pattern(xm_t, xend_var_lib_t, xend_var_lib_t) +- +-manage_files_pattern(xm_t, xen_image_t, xen_image_t) +-manage_blk_files_pattern(xm_t, xen_image_t, xen_image_t) +-manage_lnk_files_pattern(xm_t, xen_image_t, xen_image_t) +- +-read_files_pattern(xm_t, xenstored_var_run_t, xenstored_var_run_t) +- +-xen_manage_image_dirs(xm_t) +-xen_append_log(xm_t) +-xen_domtrans(xm_t) +-xen_stream_connect(xm_t) +-xen_stream_connect_xenstore(xm_t) +- +-can_exec(xm_t, xm_exec_t) +- +-kernel_read_system_state(xm_t) +-kernel_read_network_state(xm_t) +-kernel_read_kernel_sysctls(xm_t) +-kernel_read_sysctl(xm_t) +-kernel_read_xen_state(xm_t) +-kernel_write_xen_state(xm_t) +- +-corecmd_exec_bin(xm_t) +-corecmd_exec_shell(xm_t) +- +-corenet_all_recvfrom_unlabeled(xm_t) +-corenet_all_recvfrom_netlabel(xm_t) +-corenet_tcp_sendrecv_generic_if(xm_t) +-corenet_tcp_sendrecv_generic_node(xm_t) +- +-corenet_sendrecv_soundd_client_packets(xm_t) +-corenet_tcp_connect_soundd_port(xm_t) +-corenet_tcp_sendrecv_soundd_port(xm_t) +- +-dev_read_rand(xm_t) +-dev_read_urand(xm_t) +-dev_read_sysfs(xm_t) +- +-files_read_etc_runtime_files(xm_t) +-files_read_etc_files(xm_t) +-files_read_usr_files(xm_t) +-files_search_pids(xm_t) +-files_search_var_lib(xm_t) +-files_list_mnt(xm_t) +-files_list_tmp(xm_t) +- +-fs_getattr_all_fs(xm_t) +-fs_manage_xenfs_dirs(xm_t) +-fs_manage_xenfs_files(xm_t) +-fs_search_auto_mountpoints(xm_t) +- +-storage_raw_read_fixed_disk(xm_t) +- +-term_use_all_terms(xm_t) +- +-init_stream_connect_script(xm_t) +-init_rw_script_stream_sockets(xm_t) +-init_use_fds(xm_t) +- +-logging_send_syslog_msg(xm_t) +- +-miscfiles_read_localization(xm_t) +- +-sysnet_dns_name_resolve(xm_t) +- +-tunable_policy(`xen_use_fusefs',` +- fs_manage_fusefs_dirs(xm_t) +- fs_manage_fusefs_files(xm_t) +- fs_read_fusefs_symlinks(xm_t) +-') +- +-tunable_policy(`xen_use_nfs',` +- fs_manage_nfs_dirs(xm_t) +- fs_manage_nfs_files(xm_t) +- fs_read_nfs_symlinks(xm_t) +-') +- +-tunable_policy(`xen_use_samba',` +- fs_manage_cifs_dirs(xm_t) +- fs_manage_cifs_files(xm_t) +- fs_read_cifs_symlinks(xm_t) +-') +- + optional_policy(` +- cron_system_entry(xm_t, xm_exec_t) ++ virt_read_config(xenstored_t) + ') + ++######################################## ++# ++# SSH component local policy ++# + optional_policy(` +- dbus_system_bus_client(xm_t) +- +- optional_policy(` +- hal_dbus_chat(xm_t) ++ #Should have a boolean wrapping these ++ fs_list_auto_mountpoints(xend_t) ++ files_search_mnt(xend_t) ++ fs_getattr_all_fs(xend_t) ++ fs_read_dos_files(xend_t) ++ fs_manage_xenfs_dirs(xend_t) ++ fs_manage_xenfs_files(xend_t) ++ ++ tunable_policy(`xen_use_nfs',` ++ fs_manage_nfs_files(xend_t) ++ fs_read_nfs_symlinks(xend_t) + ') + ') +- +-optional_policy(` +- rpm_exec(xm_t) +-') +- +-optional_policy(` +- vhostmd_rw_tmpfs_files(xm_t) +- vhostmd_stream_connect(xm_t) +- vhostmd_dontaudit_rw_stream_connect(xm_t) +-') +- +-optional_policy(` +- virt_domtrans(xm_t) +- virt_manage_images(xm_t) +- virt_manage_config(xm_t) +- virt_stream_connect(xm_t) +-') +- +-optional_policy(` +- ssh_basic_client_template(xm, xm_t, system_r) +- +- kernel_read_xen_state(xm_ssh_t) +- kernel_write_xen_state(xm_ssh_t) +- +- files_search_tmp(xm_ssh_t) +- +- fs_manage_xenfs_dirs(xm_ssh_t) +- fs_manage_xenfs_files(xm_ssh_t) +-') +diff --git a/xfs.te b/xfs.te +index 0928c5d6a6..b9bcf8824f 100644 +--- a/xfs.te ++++ b/xfs.te +@@ -23,7 +23,7 @@ files_pid_file(xfs_var_run_t) + # Local policy + # + +-allow xfs_t self:capability { dac_override setgid setuid }; ++allow xfs_t self:capability { dac_read_search dac_override setgid setuid }; + dontaudit xfs_t self:capability sys_tty_config; + allow xfs_t self:process { signal_perms setpgid }; + allow xfs_t self:unix_stream_socket { accept listen }; +@@ -41,7 +41,6 @@ can_exec(xfs_t, xfs_exec_t) + kernel_read_kernel_sysctls(xfs_t) + kernel_read_system_state(xfs_t) + +-corenet_all_recvfrom_unlabeled(xfs_t) + corenet_all_recvfrom_netlabel(xfs_t) + corenet_tcp_sendrecv_generic_if(xfs_t) + corenet_tcp_sendrecv_generic_node(xfs_t) +@@ -63,7 +62,6 @@ fs_search_auto_mountpoints(xfs_t) + domain_use_interactive_fds(xfs_t) + + files_read_etc_runtime_files(xfs_t) +-files_read_usr_files(xfs_t) + + auth_use_nsswitch(xfs_t) + +@@ -71,7 +69,6 @@ init_script_tmp_filetrans(xfs_t, xfs_tmp_t, sock_file, "fs7100") + + logging_send_syslog_msg(xfs_t) + +-miscfiles_read_localization(xfs_t) + miscfiles_read_fonts(xfs_t) + + userdom_dontaudit_use_unpriv_user_fds(xfs_t) +diff --git a/xguest.if b/xguest.if +index 4f1d07d718..5c819abe86 100644 +--- a/xguest.if ++++ b/xguest.if +@@ -1,4 +1,4 @@ +-## Least privledge xwindows user role. ++## Least privileged xwindows user role. + + ######################################## + ## +diff --git a/xguest.te b/xguest.te +index a64aad347e..4ddc93c386 100644 +--- a/xguest.te ++++ b/xguest.te +@@ -6,46 +6,49 @@ policy_module(xguest, 1.2.0) + # + + ## +-##

      +-## Determine whether xguest can +-## mount removable media. +-##

      ++##

      ++## Allow xguest users to mount removable media ++##

      + ##
      +-gen_tunable(xguest_mount_media, false) ++gen_tunable(xguest_mount_media, true) + + ## +-##

      +-## Determine whether xguest can +-## configure network manager. +-##

      ++##

      ++## Allow xguest users to configure Network Manager and connect to apache ports ++##

      + ##
      +-gen_tunable(xguest_connect_network, false) ++gen_tunable(xguest_connect_network, true) + + ## +-##

      +-## Determine whether xguest can +-## use blue tooth devices. +-##

      ++##

      ++## Allow xguest to use blue tooth devices ++##

      + ##
      +-gen_tunable(xguest_use_bluetooth, false) ++gen_tunable(xguest_use_bluetooth, true) + + role xguest_r; + + userdom_restricted_xwindows_user_template(xguest) ++sysnet_dns_name_resolve(xguest_t) ++ ++init_dbus_chat(xguest_t) ++init_status(xguest_t) ++systemd_dontaudit_dbus_chat(xguest_t) + + ######################################## + # + # Local policy + # + +-kernel_dontaudit_request_load_module(xguest_t) ++dontaudit xguest_t xguest_t : tcp_socket { listen }; + + ifndef(`enable_mls',` + fs_exec_noxattr(xguest_t) + +- tunable_policy(`user_rw_noexattrfile',` ++ tunable_policy(`selinuxuser_rw_noexattrfile',` + fs_manage_noxattr_fs_files(xguest_t) + fs_manage_noxattr_fs_dirs(xguest_t) ++ # Write floppies + storage_raw_read_removable_device(xguest_t) + storage_raw_write_removable_device(xguest_t) + ',` +@@ -53,10 +56,23 @@ ifndef(`enable_mls',` + ') + ') + ++optional_policy(` ++ # Dontaudit fusermount ++ mount_dontaudit_exec_fusermount(xguest_t) ++') ++ ++kernel_dontaudit_request_load_module(xguest_t) ++kernel_read_software_raid_state(xguest_t) ++ ++tunable_policy(`selinuxuser_execstack',` ++ allow xguest_t self:process execstack; ++') ++ ++# Allow mounting of file systems + optional_policy(` + tunable_policy(`xguest_mount_media',` + kernel_read_fs_sysctls(xguest_t) +- ++ kernel_request_load_module(xguest_t) + files_dontaudit_getattr_boot_dirs(xguest_t) + files_search_mnt(xguest_t) + +@@ -65,10 +81,9 @@ optional_policy(` + fs_manage_noxattr_fs_dirs(xguest_t) + fs_getattr_noxattr_fs(xguest_t) + fs_read_noxattr_fs_symlinks(xguest_t) ++ fs_mount_fusefs(xguest_t) + + auth_list_pam_console_data(xguest_t) +- +- init_read_utmp(xguest_t) + ') + ') + +@@ -84,12 +99,25 @@ optional_policy(` + ') + ') + ++ + optional_policy(` +- apache_role(xguest_r, xguest_t) ++ abrt_dontaudit_read_config(xguest_t) ++') ++ ++optional_policy(` ++ colord_dbus_chat(xguest_t) ++') ++ ++optional_policy(` ++ chrome_role(xguest_r, xguest_t) ++') ++ ++optional_policy(` ++ thumb_role(xguest_r, xguest_t) + ') + + optional_policy(` +- gnomeclock_dontaudit_dbus_chat(xguest_t) ++ dbus_dontaudit_chat_system_bus(xguest_t) + ') + + optional_policy(` +@@ -97,75 +125,78 @@ optional_policy(` + ') + + optional_policy(` +- java_role(xguest_r, xguest_t) ++ apache_role(xguest_r, xguest_t) + ') + + optional_policy(` +- mozilla_role(xguest_r, xguest_t) ++ mozilla_run_plugin(xguest_t, xguest_r) + ') + + optional_policy(` +- tunable_policy(`xguest_connect_network',` +- kernel_read_network_state(xguest_t) ++ mount_run_fusermount(xguest_t, xguest_r) ++') ++ ++optional_policy(` ++ pcscd_read_pid_files(xguest_t) ++ pcscd_stream_connect(xguest_t) ++') ++ ++optional_policy(` ++ rhsmcertd_dontaudit_dbus_chat(xguest_t) ++') + ++optional_policy(` ++ tunable_policy(`xguest_connect_network',` + networkmanager_dbus_chat(xguest_t) + networkmanager_read_lib_files(xguest_t) ++ ') ++') + +- corenet_all_recvfrom_unlabeled(xguest_t) +- corenet_all_recvfrom_netlabel(xguest_t) ++optional_policy(` ++ tunable_policy(`xguest_connect_network',` ++ kernel_read_network_state(xguest_t) ++ ++ corenet_tcp_connect_pulseaudio_port(xguest_t) + corenet_tcp_sendrecv_generic_if(xguest_t) + corenet_raw_sendrecv_generic_if(xguest_t) + corenet_tcp_sendrecv_generic_node(xguest_t) + corenet_raw_sendrecv_generic_node(xguest_t) +- +- corenet_sendrecv_pulseaudio_client_packets(xguest_t) +- corenet_tcp_connect_pulseaudio_port(xguest_t) +- corenet_tcp_sendrecv_pulseaudio_port(xguest_t) +- +- corenet_sendrecv_http_client_packets(xguest_t) +- corenet_tcp_connect_http_port(xguest_t) ++ corenet_tcp_connect_commplex_link_port(xguest_t) + corenet_tcp_sendrecv_http_port(xguest_t) +- +- corenet_sendrecv_http_cache_client_packets(xguest_t) +- corenet_tcp_connect_http_cache_port(xguest_t) + corenet_tcp_sendrecv_http_cache_port(xguest_t) +- +- corenet_sendrecv_squid_client_packets(xguest_t) +- corenet_tcp_connect_squid_port(xguest_t) + corenet_tcp_sendrecv_squid_port(xguest_t) +- +- corenet_sendrecv_ftp_client_packets(xguest_t) +- corenet_tcp_connect_ftp_port(xguest_t) + corenet_tcp_sendrecv_ftp_port(xguest_t) +- +- corenet_sendrecv_ipp_client_packets(xguest_t) +- corenet_tcp_connect_ipp_port(xguest_t) + corenet_tcp_sendrecv_ipp_port(xguest_t) +- +- corenet_sendrecv_generic_client_packets(xguest_t) ++ corenet_tcp_connect_http_port(xguest_t) ++ corenet_tcp_connect_http_cache_port(xguest_t) ++ corenet_tcp_connect_squid_port(xguest_t) ++ corenet_tcp_connect_flash_port(xguest_t) ++ corenet_tcp_connect_ftp_port(xguest_t) ++ corenet_tcp_connect_ipp_port(xguest_t) + corenet_tcp_connect_generic_port(xguest_t) +- corenet_tcp_sendrecv_generic_port(xguest_t) +- +- corenet_sendrecv_soundd_client_packets(xguest_t) + corenet_tcp_connect_soundd_port(xguest_t) +- corenet_tcp_sendrecv_soundd_port(xguest_t) +- +- corenet_sendrecv_speech_client_packets(xguest_t) +- corenet_tcp_connect_speech_port(xguest_t) +- corenet_tcp_sendrecv_speech_port(xguest_t) +- +- corenet_sendrecv_transproxy_client_packets(xguest_t) +- corenet_tcp_connect_transproxy_port(xguest_t) +- corenet_tcp_sendrecv_transproxy_port(xguest_t) +- ++ corenet_sendrecv_http_client_packets(xguest_t) ++ corenet_sendrecv_http_cache_client_packets(xguest_t) ++ corenet_sendrecv_squid_client_packets(xguest_t) ++ corenet_sendrecv_ftp_client_packets(xguest_t) ++ corenet_sendrecv_ipp_client_packets(xguest_t) ++ corenet_sendrecv_generic_client_packets(xguest_t) ++ # Should not need other ports + corenet_dontaudit_tcp_sendrecv_generic_port(xguest_t) + corenet_dontaudit_tcp_bind_generic_port(xguest_t) ++ corenet_tcp_connect_speech_port(xguest_t) ++ corenet_tcp_sendrecv_transproxy_port(xguest_t) ++ corenet_tcp_connect_transproxy_port(xguest_t) + ') + ') + + optional_policy(` +- pcscd_read_pid_files(xguest_t) +- pcscd_stream_connect(xguest_t) ++ gen_require(` ++ type mozilla_t; ++ ') ++ ++ allow xguest_t mozilla_t:process transition; ++ role xguest_r types mozilla_t; + ') + +-#gen_user(xguest_u,, xguest_r, s0, s0) ++gen_user(xguest_u, user, xguest_r, s0, s0) +diff --git a/xprint.te b/xprint.te +index 3c44d8493b..ce5e69d696 100644 +--- a/xprint.te ++++ b/xprint.te +@@ -32,7 +32,6 @@ kernel_read_kernel_sysctls(xprint_t) + corecmd_exec_bin(xprint_t) + corecmd_exec_shell(xprint_t) + +-corenet_all_recvfrom_unlabeled(xprint_t) + corenet_all_recvfrom_netlabel(xprint_t) + corenet_tcp_sendrecv_generic_if(xprint_t) + corenet_udp_sendrecv_generic_if(xprint_t) +@@ -46,9 +45,7 @@ dev_read_urand(xprint_t) + + domain_use_interactive_fds(xprint_t) + +-files_read_etc_files(xprint_t) + files_read_etc_runtime_files(xprint_t) +-files_read_usr_files(xprint_t) + files_search_var_lib(xprint_t) + files_search_tmp(xprint_t) + +@@ -58,7 +55,6 @@ fs_search_auto_mountpoints(xprint_t) + logging_send_syslog_msg(xprint_t) + + miscfiles_read_fonts(xprint_t) +-miscfiles_read_localization(xprint_t) + + sysnet_read_config(xprint_t) + +diff --git a/xscreensaver.te b/xscreensaver.te +index 04096a0502..98a8205a72 100644 +--- a/xscreensaver.te ++++ b/xscreensaver.te +@@ -25,7 +25,6 @@ allow xscreensaver_t self:fifo_file rw_fifo_file_perms; + + kernel_read_system_state(xscreensaver_t) + +-files_read_usr_files(xscreensaver_t) + + auth_use_nsswitch(xscreensaver_t) + auth_domtrans_chk_passwd(xscreensaver_t) +@@ -35,9 +34,8 @@ init_read_utmp(xscreensaver_t) + logging_send_audit_msgs(xscreensaver_t) + logging_send_syslog_msg(xscreensaver_t) + +-miscfiles_read_localization(xscreensaver_t) +- +-userdom_use_user_terminals(xscreensaver_t) ++userdom_use_inherited_user_ptys(xscreensaver_t) ++#access to .icons and ~/.xscreensaver + userdom_read_user_home_content_files(xscreensaver_t) + + xserver_user_x_domain_template(xscreensaver, xscreensaver_t, xscreensaver_tmpfs_t) +diff --git a/yam.te b/yam.te +index 2695db25cf..c1ec893848 100644 +--- a/yam.te ++++ b/yam.te +@@ -26,7 +26,7 @@ files_tmp_file(yam_tmp_t) + # Local policy + # + +-allow yam_t self:capability { chown fowner fsetid dac_override }; ++allow yam_t self:capability { chown fowner fsetid dac_read_search dac_override }; + allow yam_t self:process ~{ ptrace setcurrent setexec setfscreate setrlimit execstack execheap }; + allow yam_t self:fd use; + allow yam_t self:fifo_file rw_fifo_file_perms; +@@ -73,11 +73,11 @@ auth_use_nsswitch(yam_t) + + logging_send_syslog_msg(yam_t) + +-miscfiles_read_localization(yam_t) +- + seutil_read_config(yam_t) + +-userdom_use_user_terminals(yam_t) ++sysnet_read_config(yam_t) ++ ++userdom_use_inherited_user_terminals(yam_t) + userdom_use_unpriv_users_fds(yam_t) + userdom_search_user_home_dirs(yam_t) + +diff --git a/zabbix.fc b/zabbix.fc +index c3b5a819e9..c384947f31 100644 +--- a/zabbix.fc ++++ b/zabbix.fc +@@ -4,12 +4,22 @@ + /usr/bin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0) + /usr/bin/zabbix_agentd -- gen_context(system_u:object_r:zabbix_agent_exec_t,s0) + +-/usr/sbin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0) + /usr/sbin/zabbix_agentd -- gen_context(system_u:object_r:zabbix_agent_exec_t,s0) ++/usr/sbin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0) + /usr/sbin/zabbix_server_mysql -- gen_context(system_u:object_r:zabbix_exec_t,s0) + /usr/sbin/zabbix_server_pgsql -- gen_context(system_u:object_r:zabbix_exec_t,s0) + /usr/sbin/zabbix_server_sqlite3 -- gen_context(system_u:object_r:zabbix_exec_t,s0) ++/usr/sbin/zabbix_proxy -- gen_context(system_u:object_r:zabbix_exec_t,s0) ++/usr/sbin/zabbix_proxy_mysql -- gen_context(system_u:object_r:zabbix_exec_t,s0) ++/usr/sbin/zabbix_proxy_pgsql -- gen_context(system_u:object_r:zabbix_exec_t,s0) ++/usr/sbin/zabbix_proxy_sqlite3 -- gen_context(system_u:object_r:zabbix_exec_t,s0) ++ ++/usr/lib/zabbix/externalscripts(/.*)? gen_context(system_u:object_r:zabbix_script_exec_t,s0) ++ ++/var/lib/zabbixsrv(/.*)? gen_context(system_u:object_r:zabbix_var_lib_t,s0) ++/var/lib/zabbix(/.*)? gen_context(system_u:object_r:zabbix_var_lib_t,s0) ++/var/lib/zabbix/externalscripts(/.*)? gen_context(system_u:object_r:zabbix_script_exec_t,s0) + +-/var/log/zabbix(/.*)? gen_context(system_u:object_r:zabbix_log_t,s0) ++/var/log/zabbix.* gen_context(system_u:object_r:zabbix_log_t,s0) + + /var/run/zabbix(/.*)? gen_context(system_u:object_r:zabbix_var_run_t,s0) +diff --git a/zabbix.if b/zabbix.if +index dd63de028f..7cf8202abf 100644 +--- a/zabbix.if ++++ b/zabbix.if +@@ -1,4 +1,4 @@ +-## Distributed infrastructure monitoring. ++## Distributed infrastructure monitoring + + ######################################## + ## +@@ -15,13 +15,30 @@ interface(`zabbix_domtrans',` + type zabbix_t, zabbix_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, zabbix_exec_t, zabbix_t) + ') + + ######################################## + ## +-## Connect to zabbit on the TCP network. ++## Execute a domain transition to run zabbix_script. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`zabbix_script_domtrans',` ++ gen_require(` ++ type zabbix_script_t, zabbix_script_exec_t; ++ ') ++ ++ domtrans_pattern($1, zabbix_script_exec_t, zabbix_script_t) ++') ++ ++######################################## ++## ++## Allow connectivity to the zabbix server + ## + ## + ## +@@ -34,7 +51,7 @@ interface(`zabbix_tcp_connect',` + type zabbix_t; + ') + +- corenet_sendrecv_zabbix_client_packets($1) ++ corenet_sendrecv_zabbix_agent_client_packets($1) + corenet_tcp_connect_zabbix_port($1) + corenet_tcp_recvfrom_labeled($1, zabbix_t) + corenet_tcp_sendrecv_zabbix_port($1) +@@ -42,7 +59,7 @@ interface(`zabbix_tcp_connect',` + + ######################################## + ## +-## Read zabbix log files. ++## Allow the specified domain to read zabbix's log files. + ## + ## + ## +@@ -62,13 +79,34 @@ interface(`zabbix_read_log',` + + ######################################## + ## +-## Append zabbix log files. ++## Allow the specified domain to read zabbix's tmp files. + ## + ## + ## + ## Domain allowed access. + ## + ## ++## ++# ++interface(`zabbix_read_tmp',` ++ gen_require(` ++ type zabbix_tmp_t; ++ ') ++ ++ files_search_tmp($1) ++ read_files_pattern($1, zabbix_tmp_t, zabbix_tmp_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to append ++## zabbix log files. ++## ++## ++## ++## Domain allowed access. ++## ++## + # + interface(`zabbix_append_log',` + gen_require(` +@@ -81,7 +119,7 @@ interface(`zabbix_append_log',` + + ######################################## + ## +-## Read zabbix pid files. ++## Read zabbix PID files. + ## + ## + ## +@@ -100,7 +138,7 @@ interface(`zabbix_read_pid_files',` + + ######################################## + ## +-## Connect to zabbix agent on the TCP network. ++## Allow connectivity to a zabbix agent + ## + ## + ## +@@ -110,7 +148,7 @@ interface(`zabbix_read_pid_files',` + # + interface(`zabbix_agent_tcp_connect',` + gen_require(` +- type zabbix_agent_t; ++ type zabbix_t, zabbix_agent_t; + ') + + corenet_sendrecv_zabbix_agent_client_packets($1) +@@ -121,8 +159,8 @@ interface(`zabbix_agent_tcp_connect',` + + ######################################## + ## +-## All of the rules required to +-## administrate an zabbix environment. ++## All of the rules required to administrate ++## an zabbix environment + ## + ## + ## +@@ -131,7 +169,7 @@ interface(`zabbix_agent_tcp_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the zabbix domain. + ## + ## + ## +@@ -139,16 +177,18 @@ interface(`zabbix_agent_tcp_connect',` + interface(`zabbix_admin',` + gen_require(` + type zabbix_t, zabbix_log_t, zabbix_var_run_t; +- type zabbix_initrc_exec_t, zabbit_agent_initrc_exec_t, zabbix_tmp_t; +- type zabbit_tmpfs_t; ++ type zabbix_initrc_exec_t; + ') + +- allow $1 { zabbix_t zabbix_agent_t }:process { ptrace signal_perms }; +- ps_process_pattern($1, { zabbix_t zabbix_agent_t }) ++ allow $1 zabbix_t:process signal_perms; ++ ps_process_pattern($1, zabbix_t) ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 zabbix_t:process ptrace; ++ ') + +- init_labeled_script_domtrans($1, { zabbix_agent_initrc_exec_t zabbix_initrc_exec_t }) ++ init_labeled_script_domtrans($1, zabbix_initrc_exec_t) + domain_system_change_exemption($1) +- role_transition $2 { zabbix_agent_initrc_exec_t zabbix_initrc_exec_t } system_r; ++ role_transition $2 zabbix_initrc_exec_t system_r; + allow $2 system_r; + + logging_list_logs($1) +@@ -156,10 +196,4 @@ interface(`zabbix_admin',` + + files_list_pids($1) + admin_pattern($1, zabbix_var_run_t) +- +- files_list_tmp($1) +- admin_pattern($1, zabbix_tmp_t) +- +- fs_list_tmpfs($1) +- admin_pattern($1, zabbix_tmpfs_t) + ') +diff --git a/zabbix.te b/zabbix.te +index 7f496c6177..569f9209f0 100644 +--- a/zabbix.te ++++ b/zabbix.te +@@ -6,27 +6,45 @@ policy_module(zabbix, 1.6.0) + # + + ## +-##

      ++##

      + ## Determine whether zabbix can + ## connect to all TCP ports + ##

      + ##
      + gen_tunable(zabbix_can_network, false) + +-type zabbix_t; ++ ++## ++##

      ++## Allow Zabbix to run su/sudo. ++##

      ++##
      ++gen_tunable(zabbix_run_sudo, false) ++ ++gen_require(` ++ class passwd rootok; ++ class passwd passwd; ++') ++ ++attribute zabbix_domain; ++ ++type zabbix_t, zabbix_domain; + type zabbix_exec_t; + init_daemon_domain(zabbix_t, zabbix_exec_t) + + type zabbix_initrc_exec_t; + init_script_file(zabbix_initrc_exec_t) + +-type zabbix_agent_t; ++type zabbix_agent_t, zabbix_domain; + type zabbix_agent_exec_t; + init_daemon_domain(zabbix_agent_t, zabbix_agent_exec_t) + + type zabbix_agent_initrc_exec_t; + init_script_file(zabbix_agent_initrc_exec_t) + ++type zabbixd_var_lib_t; ++files_type(zabbixd_var_lib_t) ++ + type zabbix_log_t; + logging_log_file(zabbix_log_t) + +@@ -36,27 +54,62 @@ files_tmp_file(zabbix_tmp_t) + type zabbix_tmpfs_t; + files_tmpfs_file(zabbix_tmpfs_t) + ++type zabbix_var_lib_t; ++files_type(zabbix_var_lib_t) ++ + type zabbix_var_run_t; + files_pid_file(zabbix_var_run_t) + ++type zabbix_script_t; ++type zabbix_script_exec_t; ++domain_type(zabbix_script_t) ++domain_entry_file(zabbix_script_t, zabbix_script_exec_t) ++application_executable_file(zabbix_script_exec_t) ++role system_r types zabbix_script_t; ++ ++######################################## ++# ++# zabbix domain local policy ++# ++ ++allow zabbix_domain self:capability { setuid setgid }; ++allow zabbix_domain self:process { setpgid setsched getsched signal_perms }; ++allow zabbix_domain self:fifo_file rw_fifo_file_perms; ++allow zabbix_domain self:sem create_sem_perms; ++allow zabbix_domain self:shm create_shm_perms; ++allow zabbix_domain self:tcp_socket { accept listen }; ++allow zabbix_domain self:unix_stream_socket create_stream_socket_perms; ++ ++kernel_read_all_sysctls(zabbix_domain) ++kernel_read_network_state(zabbix_domain) ++ ++corenet_tcp_sendrecv_generic_if(zabbix_domain) ++corenet_tcp_sendrecv_generic_node(zabbix_domain) ++corenet_tcp_bind_generic_node(zabbix_domain) ++ ++corecmd_exec_shell(zabbix_domain) ++corecmd_exec_bin(zabbix_domain) ++ ++dev_read_sysfs(zabbix_domain) ++dev_read_urand(zabbix_domain) ++ + ######################################## + # + # Local policy + # + +-allow zabbix_t self:capability { dac_read_search dac_override setuid setgid }; +-allow zabbix_t self:process { setsched signal_perms }; +-allow zabbix_t self:fifo_file rw_fifo_file_perms; +-allow zabbix_t self:unix_stream_socket create_stream_socket_perms; +-allow zabbix_t self:sem create_sem_perms; +-allow zabbix_t self:shm create_shm_perms; +-allow zabbix_t self:tcp_socket create_stream_socket_perms; ++allow zabbix_t self:capability { dac_read_search dac_override }; ++allow zabbix_t self:process { setrlimit }; ++ ++manage_dirs_pattern(zabbix_t, zabbix_var_lib_t, zabbix_var_lib_t) ++manage_files_pattern(zabbix_t, zabbix_var_lib_t, zabbix_var_lib_t) ++manage_lnk_files_pattern(zabbix_t, zabbix_var_lib_t, zabbix_var_lib_t) ++files_var_lib_filetrans(zabbix_t, zabbix_var_lib_t, dir, "zabbixsrv") + +-allow zabbix_t zabbix_log_t:dir setattr_dir_perms; +-append_files_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) +-create_files_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) +-setattr_files_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) +-logging_log_filetrans(zabbix_t, zabbix_log_t, file) ++manage_dirs_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) ++manage_files_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) ++manage_lnk_files_pattern(zabbix_t, zabbix_log_t, zabbix_log_t) ++logging_log_filetrans(zabbix_t, zabbix_log_t, { dir file }) + + manage_dirs_pattern(zabbix_t, zabbix_tmp_t, zabbix_tmp_t) + manage_files_pattern(zabbix_t, zabbix_tmp_t, zabbix_tmp_t) +@@ -70,13 +123,9 @@ manage_files_pattern(zabbix_t, zabbix_var_run_t, zabbix_var_run_t) + files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file }) + + kernel_read_system_state(zabbix_t) +-kernel_read_kernel_sysctls(zabbix_t) + + corenet_all_recvfrom_unlabeled(zabbix_t) + corenet_all_recvfrom_netlabel(zabbix_t) +-corenet_tcp_sendrecv_generic_if(zabbix_t) +-corenet_tcp_sendrecv_generic_node(zabbix_t) +-corenet_tcp_bind_generic_node(zabbix_t) + + corenet_sendrecv_ftp_client_packets(zabbix_t) + corenet_tcp_connect_ftp_port(zabbix_t) +@@ -85,37 +134,55 @@ corenet_tcp_sendrecv_ftp_port(zabbix_t) + corenet_sendrecv_http_client_packets(zabbix_t) + corenet_tcp_connect_http_port(zabbix_t) + corenet_tcp_sendrecv_http_port(zabbix_t) ++corenet_tcp_connect_smtp_port(zabbix_t) + + corenet_sendrecv_zabbix_server_packets(zabbix_t) + corenet_tcp_bind_zabbix_port(zabbix_t) + corenet_tcp_sendrecv_zabbix_port(zabbix_t) + +-corecmd_exec_bin(zabbix_t) +-corecmd_exec_shell(zabbix_t) +- +-dev_read_urand(zabbix_t) +- +-files_read_usr_files(zabbix_t) +- + auth_use_nsswitch(zabbix_t) + +-miscfiles_read_localization(zabbix_t) +- + zabbix_agent_tcp_connect(zabbix_t) + ++logging_send_syslog_msg(zabbix_t) ++ + tunable_policy(`zabbix_can_network',` + corenet_sendrecv_all_client_packets(zabbix_t) + corenet_tcp_connect_all_ports(zabbix_t) + corenet_tcp_sendrecv_all_ports(zabbix_t) + ') + ++tunable_policy(`zabbix_run_sudo',` ++ allow zabbix_t self:capability { setuid setgid sys_resource }; ++ allow zabbix_t self:process { setrlimit setsched }; ++ allow zabbix_t self:key write; ++ allow zabbix_t self:passwd { passwd rootok }; ++ ++ auth_rw_lastlog(zabbix_t) ++ auth_rw_faillog(zabbix_t) ++ auth_exec_chkpwd(zabbix_t) ++ ++ selinux_compute_access_vector(zabbix_t) ++ ++ systemd_write_inherited_logind_sessions_pipes(zabbix_t) ++ systemd_dbus_chat_logind(zabbix_t) ++ ++ xserver_exec_xauth(zabbix_t) ++') ++ + optional_policy(` +- netutils_domtrans_ping(zabbix_t) ++ tunable_policy(`zabbix_run_sudo',` ++ sudo_exec(zabbix_t) ++ su_exec(zabbix_t) ++ ') + ') + + optional_policy(` + mysql_stream_connect(zabbix_t) +- mysql_tcp_connect(zabbix_t) ++') ++ ++optional_policy(` ++ netutils_domtrans_ping(zabbix_t) + ') + + optional_policy(` +@@ -125,6 +192,7 @@ optional_policy(` + + optional_policy(` + snmp_read_snmp_var_lib_files(zabbix_t) ++ snmp_read_snmp_var_lib_dirs(zabbix_t) + ') + + ######################################## +@@ -132,18 +200,9 @@ optional_policy(` + # Agent local policy + # + +-allow zabbix_agent_t self:capability { setuid setgid }; +-allow zabbix_agent_t self:process { setsched getsched signal }; +-allow zabbix_agent_t self:fifo_file rw_fifo_file_perms; +-allow zabbix_agent_t self:sem create_sem_perms; +-allow zabbix_agent_t self:shm create_shm_perms; +-allow zabbix_agent_t self:tcp_socket { accept listen }; +-allow zabbix_agent_t self:unix_stream_socket create_stream_socket_perms; ++allow zabbix_agent_t self:process { setrlimit }; + +-append_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t) +-create_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t) +-setattr_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t) +-filetrans_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t, file) ++manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t) + + rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t) + fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file) +@@ -151,16 +210,13 @@ fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file) + manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t) + files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file) + +-kernel_read_all_sysctls(zabbix_agent_t) + kernel_read_system_state(zabbix_agent_t) +- +-corecmd_read_all_executables(zabbix_agent_t) ++kernel_read_network_state(zabbix_agent_t) + + corenet_all_recvfrom_unlabeled(zabbix_agent_t) + corenet_all_recvfrom_netlabel(zabbix_agent_t) +-corenet_tcp_sendrecv_generic_if(zabbix_agent_t) +-corenet_tcp_sendrecv_generic_node(zabbix_agent_t) +-corenet_tcp_bind_generic_node(zabbix_agent_t) ++ ++corecmd_read_all_executables(zabbix_agent_t) + + corenet_sendrecv_zabbix_agent_server_packets(zabbix_agent_t) + corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t) +@@ -170,28 +226,108 @@ corenet_sendrecv_ssh_client_packets(zabbix_agent_t) + corenet_tcp_connect_ssh_port(zabbix_agent_t) + corenet_tcp_sendrecv_ssh_port(zabbix_agent_t) + ++corenet_sendrecv_ftp_client_packets(zabbix_agent_t) ++corenet_tcp_connect_ftp_port(zabbix_agent_t) ++corenet_tcp_sendrecv_ftp_port(zabbix_agent_t) ++ ++corenet_sendrecv_http_client_packets(zabbix_agent_t) ++corenet_tcp_connect_http_port(zabbix_agent_t) ++corenet_tcp_sendrecv_http_port(zabbix_agent_t) ++ ++corenet_sendrecv_innd_client_packets(zabbix_agent_t) ++corenet_tcp_connect_innd_port(zabbix_agent_t) ++corenet_tcp_sendrecv_innd_port(zabbix_agent_t) ++ ++corenet_sendrecv_pop_client_packets(zabbix_agent_t) ++corenet_tcp_connect_pop_port(zabbix_agent_t) ++corenet_tcp_sendrecv_pop_port(zabbix_agent_t) ++ ++corenet_tcp_connect_postgresql_port(zabbix_agent_t) ++ ++corenet_sendrecv_smtp_client_packets(zabbix_agent_t) ++corenet_tcp_connect_smtp_port(zabbix_agent_t) ++corenet_tcp_sendrecv_smtp_port(zabbix_agent_t) ++ + corenet_sendrecv_zabbix_client_packets(zabbix_agent_t) + corenet_tcp_connect_zabbix_port(zabbix_agent_t) + corenet_tcp_sendrecv_zabbix_port(zabbix_agent_t) + ++corenet_tcp_connect_redis_port(zabbix_agent_t) ++corenet_tcp_sendrecv_redis_port(zabbix_agent_t) ++ + dev_getattr_all_blk_files(zabbix_agent_t) + dev_getattr_all_chr_files(zabbix_agent_t) + +-domain_search_all_domains_state(zabbix_agent_t) ++domain_read_all_domains_state(zabbix_agent_t) + + files_getattr_all_dirs(zabbix_agent_t) + files_getattr_all_files(zabbix_agent_t) + files_read_all_symlinks(zabbix_agent_t) +-files_read_etc_files(zabbix_agent_t) + + fs_getattr_all_fs(zabbix_agent_t) + ++auth_use_nsswitch(zabbix_agent_t) ++ + init_read_utmp(zabbix_agent_t) + + logging_search_logs(zabbix_agent_t) + +-miscfiles_read_localization(zabbix_agent_t) +- + sysnet_dns_name_resolve(zabbix_agent_t) + + zabbix_tcp_connect(zabbix_agent_t) ++ ++zabbix_script_domtrans(zabbix_agent_t) ++ ++tunable_policy(`zabbix_run_sudo',` ++ allow zabbix_agent_t self:capability { setuid setgid sys_resource }; ++ allow zabbix_agent_t self:process { setrlimit setsched }; ++ allow zabbix_agent_t self:key write; ++ allow zabbix_agent_t self:passwd { passwd rootok }; ++ ++ auth_rw_lastlog(zabbix_agent_t) ++ auth_rw_faillog(zabbix_agent_t) ++ auth_exec_chkpwd(zabbix_agent_t) ++ ++ selinux_compute_access_vector(zabbix_agent_t) ++ ++ systemd_write_inherited_logind_sessions_pipes(zabbix_agent_t) ++ systemd_dbus_chat_logind(zabbix_agent_t) ++ ++ xserver_exec_xauth(zabbix_agent_t) ++') ++ ++optional_policy(` ++ tunable_policy(`zabbix_run_sudo',` ++ sudo_exec(zabbix_agent_t) ++ su_exec(zabbix_agent_t) ++ ') ++') ++ ++optional_policy(` ++ dmidecode_domtrans(zabbix_agent_t) ++') ++ ++optional_policy(` ++ hostname_exec(zabbix_agent_t) ++') ++ ++######################################## ++# ++# zabbix_script_t local policy ++# ++ ++domtrans_pattern(zabbix_t, zabbix_script_exec_t, zabbix_script_t) ++ ++allow zabbix_t zabbix_script_exec_t:dir search_dir_perms; ++allow zabbix_t zabbix_script_exec_t:dir read_file_perms; ++allow zabbix_t zabbix_script_exec_t:file ioctl; ++ ++init_domtrans_script(zabbix_script_t) ++ ++optional_policy(` ++ mta_send_mail(zabbix_script_t) ++') ++ ++optional_policy(` ++ unconfined_domain(zabbix_script_t) ++') +diff --git a/zarafa.fc b/zarafa.fc +index faf99ed513..44e94fad9f 100644 +--- a/zarafa.fc ++++ b/zarafa.fc +@@ -1,33 +1,34 @@ +-/etc/zarafa(/.*)? gen_context(system_u:object_r:zarafa_etc_t,s0) ++/etc/zarafa(/.*)? gen_context(system_u:object_r:zarafa_etc_t,s0) + +-/etc/rc\.d/init\.d/zarafa.* -- gen_context(system_u:object_r:zarafa_initrc_exec_t,s0) ++/usr/bin/zarafa-dagent -- gen_context(system_u:object_r:zarafa_deliver_exec_t,s0) ++/usr/bin/zarafa-gateway -- gen_context(system_u:object_r:zarafa_gateway_exec_t,s0) ++/usr/bin/zarafa-ical -- gen_context(system_u:object_r:zarafa_ical_exec_t,s0) ++/usr/bin/zarafa-indexer -- gen_context(system_u:object_r:zarafa_indexer_exec_t,s0) ++/usr/bin/zarafa-monitor -- gen_context(system_u:object_r:zarafa_monitor_exec_t,s0) ++/usr/bin/zarafa-search -- gen_context(system_u:object_r:zarafa_indexer_exec_t,s0) ++/usr/bin/zarafa-server -- gen_context(system_u:object_r:zarafa_server_exec_t,s0) ++/usr/bin/zarafa-spooler -- gen_context(system_u:object_r:zarafa_spooler_exec_t,s0) + +-/usr/bin/zarafa-dagent -- gen_context(system_u:object_r:zarafa_deliver_exec_t,s0) +-/usr/bin/zarafa-gateway -- gen_context(system_u:object_r:zarafa_gateway_exec_t,s0) +-/usr/bin/zarafa-ical -- gen_context(system_u:object_r:zarafa_ical_exec_t,s0) +-/usr/bin/zarafa-indexer -- gen_context(system_u:object_r:zarafa_indexer_exec_t,s0) +-/usr/bin/zarafa-monitor -- gen_context(system_u:object_r:zarafa_monitor_exec_t,s0) +-/usr/bin/zarafa-server -- gen_context(system_u:object_r:zarafa_server_exec_t,s0) +-/usr/bin/zarafa-spooler -- gen_context(system_u:object_r:zarafa_spooler_exec_t,s0) +- +-/var/lib/zarafa(/.*)? gen_context(system_u:object_r:zarafa_var_lib_t,s0) ++/var/lib/zarafa(/.*)? gen_context(system_u:object_r:zarafa_var_lib_t,s0) + /var/lib/zarafa-webaccess(/.*)? gen_context(system_u:object_r:zarafa_var_lib_t,s0) +-/var/lib/zarafa-webapp(/.*)? gen_context(system_u:object_r:zarafa_var_lib_t,s0) ++/var/lib/zarafa-webapp(/.*)? gen_context(system_u:object_r:zarafa_var_lib_t,s0) + +-/var/log/zarafa/dagent\.log.* -- gen_context(system_u:object_r:zarafa_deliver_log_t,s0) ++/var/log/zarafa/dagent\.log.* -- gen_context(system_u:object_r:zarafa_deliver_log_t,s0) + /var/log/zarafa/gateway\.log.* -- gen_context(system_u:object_r:zarafa_gateway_log_t,s0) + /var/log/zarafa/ical\.log.* -- gen_context(system_u:object_r:zarafa_ical_log_t,s0) + /var/log/zarafa/indexer\.log.* -- gen_context(system_u:object_r:zarafa_indexer_log_t,s0) + /var/log/zarafa/monitor\.log.* -- gen_context(system_u:object_r:zarafa_monitor_log_t,s0) + /var/log/zarafa/server\.log.* -- gen_context(system_u:object_r:zarafa_server_log_t,s0) ++/var/log/zarafa/search\.log.* -- gen_context(system_u:object_r:zarafa_indexer_log_t,s0) + /var/log/zarafa/spooler\.log.* -- gen_context(system_u:object_r:zarafa_spooler_log_t,s0) + +-/var/run/zarafa -s gen_context(system_u:object_r:zarafa_server_var_run_t,s0) +-/var/run/zarafa-dagent\.pid -- gen_context(system_u:object_r:zarafa_deliver_var_run_t,s0) ++/var/run/zarafa -s gen_context(system_u:object_r:zarafa_server_var_run_t,s0) ++/var/run/zarafa-dagent\.pid -- gen_context(system_u:object_r:zarafa_deliver_var_run_t,s0) + /var/run/zarafa-gateway\.pid -- gen_context(system_u:object_r:zarafa_gateway_var_run_t,s0) + /var/run/zarafa-ical\.pid -- gen_context(system_u:object_r:zarafa_ical_var_run_t,s0) +-/var/run/zarafa-indexer -s gen_context(system_u:object_r:zarafa_indexer_var_run_t,s0) ++/var/run/zarafa-indexer -s gen_context(system_u:object_r:zarafa_indexer_var_run_t,s0) + /var/run/zarafa-indexer\.pid -- gen_context(system_u:object_r:zarafa_indexer_var_run_t,s0) + /var/run/zarafa-monitor\.pid -- gen_context(system_u:object_r:zarafa_monitor_var_run_t,s0) + /var/run/zarafa-server\.pid -- gen_context(system_u:object_r:zarafa_server_var_run_t,s0) ++/var/run/zarafa-search\.pid -- gen_context(system_u:object_r:zarafa_indexer_var_run_t,s0) + /var/run/zarafa-spooler\.pid -- gen_context(system_u:object_r:zarafa_spooler_var_run_t,s0) +diff --git a/zarafa.if b/zarafa.if +index 36e32df6dc..3d089626ed 100644 +--- a/zarafa.if ++++ b/zarafa.if +@@ -1,55 +1,59 @@ + ## Zarafa collaboration platform. + +-####################################### ++###################################### + ## +-## The template to define a zarafa domain. ++## Creates types and rules for a basic ++## zararfa init daemon domain. + ## +-## ++## + ## +-## Domain prefix to be used. ++## Prefix for the domain. + ## + ## + # + template(`zarafa_domain_template',` + gen_require(` +- attribute zarafa_domain, zarafa_logfile, zarafa_pidfile; ++ attribute zarafa_domain; + ') + +- ######################################## ++ ############################## + # +- # Declarations ++ # $1_t declarations + # + + type zarafa_$1_t, zarafa_domain; + type zarafa_$1_exec_t; + init_daemon_domain(zarafa_$1_t, zarafa_$1_exec_t) + +- type zarafa_$1_log_t, zarafa_logfile; ++ type zarafa_$1_log_t; + logging_log_file(zarafa_$1_log_t) + +- type zarafa_$1_var_run_t, zarafa_pidfile; ++ type zarafa_$1_var_run_t; + files_pid_file(zarafa_$1_var_run_t) + +- ######################################## ++ ############################## + # +- # Policy ++ # $1_t local policy + # + + manage_files_pattern(zarafa_$1_t, zarafa_$1_var_run_t, zarafa_$1_var_run_t) + manage_sock_files_pattern(zarafa_$1_t, zarafa_$1_var_run_t, zarafa_$1_var_run_t) + files_pid_filetrans(zarafa_$1_t, zarafa_$1_var_run_t, { file sock_file }) + +- append_files_pattern(zarafa_$1_t, zarafa_$1_log_t, zarafa_$1_log_t) +- create_files_pattern(zarafa_$1_t, zarafa_$1_log_t, zarafa_$1_log_t) +- setattr_files_pattern(zarafa_$1_t, zarafa_$1_log_t, zarafa_$1_log_t) +- logging_log_filetrans(zarafa_$1_t, zarafa_$1_log_t, file) ++ manage_files_pattern(zarafa_$1_t, zarafa_$1_log_t, zarafa_$1_log_t) ++ logging_log_filetrans(zarafa_$1_t, zarafa_$1_log_t, { file }) ++ ++ kernel_read_system_state(zarafa_$1_t) + + auth_use_nsswitch(zarafa_$1_t) ++ ++ logging_send_syslog_msg(zarafa_$1_t) + ') + + ###################################### + ## +-## search zarafa configuration directories. ++## Allow the specified domain to search ++## zarafa configuration dirs. + ## + ## + ## +@@ -68,7 +72,7 @@ interface(`zarafa_search_config',` + + ######################################## + ## +-## Execute a domain transition to run zarafa deliver. ++## Execute a domain transition to run zarafa_deliver. + ## + ## + ## +@@ -81,13 +85,12 @@ interface(`zarafa_domtrans_deliver',` + type zarafa_deliver_t, zarafa_deliver_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, zarafa_deliver_exec_t, zarafa_deliver_t) + ') + + ######################################## + ## +-## Execute a domain transition to run zarafa server. ++## Execute a domain transition to run zarafa_server. + ## + ## + ## +@@ -100,14 +103,12 @@ interface(`zarafa_domtrans_server',` + type zarafa_server_t, zarafa_server_exec_t; + ') + +- corecmd_search_bin($1) + domtrans_pattern($1, zarafa_server_exec_t, zarafa_server_t) + ') + + ####################################### + ## +-## Connect to zarafa server with a unix +-## domain stream socket. ++## Connect to zarafa-server unix domain stream socket. + ## + ## + ## +@@ -124,51 +125,24 @@ interface(`zarafa_stream_connect_server',` + stream_connect_pattern($1, zarafa_server_var_run_t, zarafa_server_var_run_t, zarafa_server_t) + ') + +-######################################## ++#################################### + ## +-## All of the rules required to +-## administrate an zarafa environment. ++## Allow the specified domain to manage ++## zarafa /var/lib files. + ## + ## +-## +-## Domain allowed access. +-## +-## +-## +-## +-## Role allowed access. +-## ++## ++## Domain allowed access. ++## + ## +-## + # +-interface(`zarafa_admin',` +- gen_require(` +- attribute zarafa_domain, zarafa_logfile, zarafa_pidfile; +- type zarafa_etc_t, zarafa_initrc_exec_t, zarafa_deliver_tmp_t; +- type zarafa_indexer_tmp_t, zarafa_server_tmp_t, zarafa_share_t; +- type zarafa_var_lib_t; +- ') +- +- allow $1 zarafa_domain:process { ptrace signal_perms }; +- ps_process_pattern($1, zarafa_domain) +- +- init_labeled_script_domtrans($1, zarafa_initrc_exec_t) +- domain_system_change_exemption($1) +- role_transition $2 zarafa_initrc_exec_t system_r; +- allow $2 system_r; +- +- files_search_etc($1) +- admin_pattern($1, zarafa_etc_t) +- +- files_search_tmp($1) +- admin_pattern($1, { zarafa_deliver_tmp_t zarafa_indexer_tmp_t zarafa_server_tmp_t }) +- +- logging_search_log($1) +- admin_pattern($1, zarafa_logfile) +- +- files_search_var_lib($1) +- admin_pattern($1, { zarafa_var_lib_t zarafa_share_t }) +- +- files_search_pids($1) +- admin_pattern($1, zarafa_pidfile) ++interface(`zarafa_manage_lib_files',` ++ gen_require(` ++ type zarafa_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, zarafa_var_lib_t, zarafa_var_lib_t) ++ manage_lnk_files_pattern($1, zarafa_var_lib_t, zarafa_var_lib_t) ++ manage_dirs_pattern($1, zarafa_var_lib_t, zarafa_var_lib_t) + ') +diff --git a/zarafa.te b/zarafa.te +index 3fded1c4d8..8bea5e820a 100644 +--- a/zarafa.te ++++ b/zarafa.te +@@ -5,9 +5,14 @@ policy_module(zarafa, 1.2.0) + # Declarations + # + ++## ++##

      ++## Allow zarafa domains to setrlimit/sys_resource. ++##

      ++##
      ++gen_tunable(zarafa_setrlimit, false) ++ + attribute zarafa_domain; +-attribute zarafa_logfile; +-attribute zarafa_pidfile; + + zarafa_domain_template(deliver) + +@@ -17,9 +22,6 @@ files_tmp_file(zarafa_deliver_tmp_t) + type zarafa_etc_t; + files_config_file(zarafa_etc_t) + +-type zarafa_initrc_exec_t; +-init_script_file(zarafa_initrc_exec_t) +- + zarafa_domain_template(gateway) + zarafa_domain_template(ical) + zarafa_domain_template(indexer) +@@ -43,61 +45,74 @@ files_tmp_file(zarafa_var_lib_t) + + ######################################## + # +-# Deliver local policy ++# zarafa-deliver local policy + # + + manage_dirs_pattern(zarafa_deliver_t, zarafa_deliver_tmp_t, zarafa_deliver_tmp_t) + manage_files_pattern(zarafa_deliver_t, zarafa_deliver_tmp_t, zarafa_deliver_tmp_t) + files_tmp_filetrans(zarafa_deliver_t, zarafa_deliver_tmp_t, { file dir }) + ++auth_use_nsswitch(zarafa_deliver_t) ++ ++corenet_tcp_bind_lmtp_port(zarafa_deliver_t) ++ + ######################################## + # +-# Gateway local policy ++# zarafa_gateway local policy + # +- +-corenet_all_recvfrom_unlabeled(zarafa_gateway_t) + corenet_all_recvfrom_netlabel(zarafa_gateway_t) + corenet_tcp_sendrecv_generic_if(zarafa_gateway_t) + corenet_tcp_sendrecv_generic_node(zarafa_gateway_t) ++corenet_tcp_sendrecv_all_ports(zarafa_gateway_t) + corenet_tcp_bind_generic_node(zarafa_gateway_t) +- +-corenet_sendrecv_pop_server_packets(zarafa_gateway_t) + corenet_tcp_bind_pop_port(zarafa_gateway_t) +-corenet_tcp_sendrecv_pop_port(zarafa_gateway_t) ++ ++###################################### ++# ++# zarafa-indexer local policy ++# ++ ++ ++manage_dirs_pattern(zarafa_indexer_t, zarafa_indexer_tmp_t, zarafa_indexer_tmp_t) ++manage_files_pattern(zarafa_indexer_t, zarafa_indexer_tmp_t, zarafa_indexer_tmp_t) ++files_tmp_filetrans(zarafa_indexer_t, zarafa_indexer_tmp_t, { file dir }) ++ ++manage_dirs_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) ++manage_files_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) ++manage_lnk_files_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) ++ ++auth_use_nsswitch(zarafa_indexer_t) + + ####################################### + # +-# Ical local policy ++# zarafa-ical local policy + # + +-corenet_all_recvfrom_unlabeled(zarafa_ical_t) ++ + corenet_all_recvfrom_netlabel(zarafa_ical_t) + corenet_tcp_sendrecv_generic_if(zarafa_ical_t) + corenet_tcp_sendrecv_generic_node(zarafa_ical_t) ++corenet_tcp_sendrecv_all_ports(zarafa_ical_t) + corenet_tcp_bind_generic_node(zarafa_ical_t) +- +-corenet_sendrecv_http_cache_client_packets(zarafa_ical_t) + corenet_tcp_bind_http_cache_port(zarafa_ical_t) +-corenet_tcp_sendrecv_http_cache_port(zarafa_ical_t) ++ ++auth_use_nsswitch(zarafa_ical_t) + + ###################################### + # +-# Indexer local policy ++# zarafa-monitor local policy + # + +-manage_dirs_pattern(zarafa_indexer_t, zarafa_indexer_tmp_t, zarafa_indexer_tmp_t) +-manage_files_pattern(zarafa_indexer_t, zarafa_indexer_tmp_t, zarafa_indexer_tmp_t) +-files_tmp_filetrans(zarafa_indexer_t, zarafa_indexer_tmp_t, { file dir }) + +-manage_dirs_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) +-manage_files_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) +-manage_lnk_files_pattern(zarafa_indexer_t, zarafa_var_lib_t, zarafa_var_lib_t) ++auth_use_nsswitch(zarafa_monitor_t) + + ######################################## + # +-# Server local policy ++# zarafa_server local policy + # + ++allow zarafa_server_t self:capability net_bind_service; ++ + manage_dirs_pattern(zarafa_server_t, zarafa_server_tmp_t, zarafa_server_tmp_t) + manage_files_pattern(zarafa_server_t, zarafa_server_tmp_t, zarafa_server_tmp_t) + files_tmp_filetrans(zarafa_server_t, zarafa_server_tmp_t, { file dir }) +@@ -109,70 +124,85 @@ files_var_lib_filetrans(zarafa_server_t, zarafa_var_lib_t, { file dir lnk_file } + + stream_connect_pattern(zarafa_server_t, zarafa_indexer_var_run_t, zarafa_indexer_var_run_t, zarafa_indexer_t) + +-corenet_all_recvfrom_unlabeled(zarafa_server_t) + corenet_all_recvfrom_netlabel(zarafa_server_t) + corenet_tcp_sendrecv_generic_if(zarafa_server_t) + corenet_tcp_sendrecv_generic_node(zarafa_server_t) ++corenet_tcp_sendrecv_all_ports(zarafa_server_t) + corenet_tcp_bind_generic_node(zarafa_server_t) +- +-corenet_sendrecv_zarafa_server_packets(zarafa_server_t) + corenet_tcp_bind_zarafa_port(zarafa_server_t) +-corenet_tcp_sendrecv_zarafa_port(zarafa_server_t) + +-files_read_usr_files(zarafa_server_t) + ++auth_use_nsswitch(zarafa_server_t) ++ ++logging_send_syslog_msg(zarafa_server_t) + logging_send_audit_msgs(zarafa_server_t) + ++sysnet_dns_name_resolve(zarafa_server_t) ++ + optional_policy(` + kerberos_use(zarafa_server_t) + ') + + optional_policy(` + mysql_stream_connect(zarafa_server_t) +- mysql_tcp_connect(zarafa_server_t) +-') +- +-optional_policy(` +- postgresql_stream_connect(zarafa_server_t) +- postgresql_tcp_connect(zarafa_server_t) + ') + + ######################################## + # +-# Spooler local policy ++# zarafa_spooler local policy + # + + can_exec(zarafa_spooler_t, zarafa_spooler_exec_t) + +-corenet_all_recvfrom_unlabeled(zarafa_spooler_t) + corenet_all_recvfrom_netlabel(zarafa_spooler_t) + corenet_tcp_sendrecv_generic_if(zarafa_spooler_t) + corenet_tcp_sendrecv_generic_node(zarafa_spooler_t) +- +-corenet_sendrecv_smtp_client_packets(zarafa_spooler_t) ++corenet_tcp_sendrecv_all_ports(zarafa_spooler_t) + corenet_tcp_connect_smtp_port(zarafa_spooler_t) +-corenet_tcp_sendrecv_smtp_port(zarafa_spooler_t) ++ ++auth_use_nsswitch(zarafa_spooler_t) + + ######################################## + # +-# Zarafa domain local policy ++# zarafa_gateway local policy + # ++corenet_tcp_bind_pop_port(zarafa_gateway_t) + +-allow zarafa_domain self:capability { kill dac_override chown setgid setuid }; +-allow zarafa_domain self:process { setrlimit signal }; ++####################################### ++# ++# zarafa-ical local policy ++# ++ ++corenet_tcp_bind_http_cache_port(zarafa_ical_t) ++ ++###################################### ++# ++# zarafa-monitor local policy ++# ++ ++ ++######################################## ++# ++# zarafa domains local policy ++# ++ ++# bad permission on /etc/zarafa ++allow zarafa_domain self:capability { kill dac_read_search dac_override chown setgid setuid }; ++allow zarafa_domain self:process { signal_perms }; + allow zarafa_domain self:fifo_file rw_fifo_file_perms; +-allow zarafa_domain self:tcp_socket { accept listen }; +-allow zarafa_domain self:unix_stream_socket { accept listen }; ++allow zarafa_domain self:tcp_socket create_stream_socket_perms; ++allow zarafa_domain self:unix_stream_socket create_stream_socket_perms; ++ ++tunable_policy(`zarafa_setrlimit',` ++ allow zarafa_domain self:capability sys_resource; ++ allow zarafa_domain self:process setrlimit; ++') + + stream_connect_pattern(zarafa_domain, zarafa_server_var_run_t, zarafa_server_var_run_t, zarafa_server_t) + + read_files_pattern(zarafa_domain, zarafa_etc_t, zarafa_etc_t) + +-kernel_read_system_state(zarafa_domain) +- + dev_read_rand(zarafa_domain) + dev_read_urand(zarafa_domain) + +-logging_send_syslog_msg(zarafa_domain) +- +-miscfiles_read_localization(zarafa_domain) ++dev_read_sysfs(zarafa_domain) +diff --git a/zebra.fc b/zebra.fc +index 28ee4cac93..bc37f76918 100644 +--- a/zebra.fc ++++ b/zebra.fc +@@ -1,21 +1,34 @@ +-/etc/quagga(/.*)? gen_context(system_u:object_r:zebra_conf_t,s0) +-/etc/zebra(/.*)? gen_context(system_u:object_r:zebra_conf_t,s0) +- + /etc/rc\.d/init\.d/bgpd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/ospf6d -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/ospfd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/ospf6d -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/ospfd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) + /etc/rc\.d/init\.d/ripd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/ripngd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) +-/etc/rc\.d/init\.d/zebra -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/ripngd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/zebra -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/babeld -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++/etc/rc\.d/init\.d/isisd -- gen_context(system_u:object_r:zebra_initrc_exec_t,s0) ++ ++/usr/lib/systemd/system/babeld.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/bgpd.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/isisd.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/ospf6d.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/ospfd.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/ripd.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/ripngd.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) ++/usr/lib/systemd/system/zebra.* -- gen_context(system_u:object_r:zebra_unit_file_t,s0) + +-/usr/sbin/bgpd -- gen_context(system_u:object_r:zebra_exec_t,s0) ++/usr/sbin/babeld -- gen_context(system_u:object_r:zebra_exec_t,s0) ++/usr/sbin/bgpd -- gen_context(system_u:object_r:zebra_exec_t,s0) ++/usr/sbin/isisd -- gen_context(system_u:object_r:zebra_exec_t,s0) + /usr/sbin/ospf.* -- gen_context(system_u:object_r:zebra_exec_t,s0) +-/usr/sbin/rip.* -- gen_context(system_u:object_r:zebra_exec_t,s0) +-/usr/sbin/zebra -- gen_context(system_u:object_r:zebra_exec_t,s0) ++/usr/sbin/rip.* -- gen_context(system_u:object_r:zebra_exec_t,s0) ++/usr/sbin/zebra -- gen_context(system_u:object_r:zebra_exec_t,s0) ++ ++/etc/quagga(/.*)? gen_context(system_u:object_r:zebra_conf_t,s0) ++/etc/zebra(/.*)? gen_context(system_u:object_r:zebra_conf_t,s0) + +-/var/log/quagga(/.*)? gen_context(system_u:object_r:zebra_log_t,s0) +-/var/log/zebra(/.*)? gen_context(system_u:object_r:zebra_log_t,s0) ++/var/log/quagga(/.*)? gen_context(system_u:object_r:zebra_log_t,s0) ++/var/log/zebra(/.*)? gen_context(system_u:object_r:zebra_log_t,s0) + + /var/run/\.zebra -s gen_context(system_u:object_r:zebra_var_run_t,s0) + /var/run/\.zserv -s gen_context(system_u:object_r:zebra_var_run_t,s0) +-/var/run/quagga(/.*)? gen_context(system_u:object_r:zebra_var_run_t,s0) ++/var/run/quagga(/.*)? gen_context(system_u:object_r:zebra_var_run_t,s0) +diff --git a/zebra.if b/zebra.if +index 34164017bf..e364caf4bf 100644 +--- a/zebra.if ++++ b/zebra.if +@@ -1,8 +1,8 @@ +-## Zebra border gateway protocol network routing service. ++## Zebra border gateway protocol network routing service + + ######################################## + ## +-## Read zebra configuration content. ++## Read the configuration files for zebra. + ## + ## + ## +@@ -18,14 +18,13 @@ interface(`zebra_read_config',` + + files_search_etc($1) + allow $1 zebra_conf_t:dir list_dir_perms; +- allow $1 zebra_conf_t:file read_file_perms; +- allow $1 zebra_conf_t:lnk_file read_lnk_file_perms; ++ read_files_pattern($1, zebra_conf_t, zebra_conf_t) ++ read_lnk_files_pattern($1, zebra_conf_t, zebra_conf_t) + ') + + ######################################## + ## +-## Connect to zebra with a unix +-## domain stream socket. ++## Connect to zebra over an unix stream socket. + ## + ## + ## +@@ -42,10 +41,34 @@ interface(`zebra_stream_connect',` + stream_connect_pattern($1, zebra_var_run_t, zebra_var_run_t, zebra_t) + ') + ++####################################### ++## ++## Execute zebra services in the zebra domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`zebra_systemctl',` ++ gen_require(` ++ type zebra_t; ++ type zebra_unit_file_t; ++ ') ++ ++ systemd_exec_systemctl($1) ++ init_reload_services($1) ++ allow $1 zebra_unit_file_t:file read_file_perms; ++ allow $1 zebra_unit_file_t:service manage_service_perms; ++ ++ ps_process_pattern($1, zebra_t) ++') ++ + ######################################## + ## +-## All of the rules required to +-## administrate an zebra environment. ++## All of the rules required to administrate ++## an zebra environment + ## + ## + ## +@@ -54,7 +77,7 @@ interface(`zebra_stream_connect',` + ## + ## + ## +-## Role allowed access. ++## The role to be allowed to manage the zebra domain. + ## + ## + ## +@@ -62,13 +85,16 @@ interface(`zebra_stream_connect',` + interface(`zebra_admin',` + gen_require(` + type zebra_t, zebra_tmp_t, zebra_log_t; +- type zebra_conf_t, zebra_var_run_t; +- type zebra_initrc_exec_t; ++ type zebra_conf_t, zebra_var_run_t, zebra_initrc_exec_t; + ') + +- allow $1 zebra_t:process { ptrace signal_perms }; ++ allow $1 zebra_t:process signal_perms; + ps_process_pattern($1, zebra_t) + ++ tunable_policy(`deny_ptrace',`',` ++ allow $1 zebra_t:process ptrace; ++ ') ++ + init_labeled_script_domtrans($1, zebra_initrc_exec_t) + domain_system_change_exemption($1) + role_transition $2 zebra_initrc_exec_t system_r; +@@ -85,4 +111,8 @@ interface(`zebra_admin',` + + files_list_pids($1) + admin_pattern($1, zebra_var_run_t) ++ ++ zebra_systemctl($1) ++ admin_pattern($1, zebra_unit_file_t) ++ allow $1 zebra_unit_file_t:service all_service_perms; + ') +diff --git a/zebra.te b/zebra.te +index 2e80d04fc6..5bf04b2d0e 100644 +--- a/zebra.te ++++ b/zebra.te +@@ -6,23 +6,26 @@ policy_module(zebra, 1.13.0) + # + + ## +-##

      +-## Determine whether zebra daemon can +-## manage its configuration files. +-##

      ++##

      ++## Allow zebra daemon to write it configuration files ++##

      + ##
      +-gen_tunable(allow_zebra_write_config, false) ++# ++gen_tunable(zebra_write_config, false) + + type zebra_t; + type zebra_exec_t; + init_daemon_domain(zebra_t, zebra_exec_t) + + type zebra_conf_t; +-files_type(zebra_conf_t) ++files_config_file(zebra_conf_t) + + type zebra_initrc_exec_t; + init_script_file(zebra_initrc_exec_t) + ++type zebra_unit_file_t; ++systemd_unit_file(zebra_unit_file_t) ++ + type zebra_log_t; + logging_log_file(zebra_log_t) + +@@ -40,26 +43,27 @@ files_pid_file(zebra_var_run_t) + allow zebra_t self:capability { setgid setuid net_admin net_raw }; + dontaudit zebra_t self:capability sys_tty_config; + allow zebra_t self:process { signal_perms getcap setcap }; +-allow zebra_t self:fifo_file rw_fifo_file_perms; +-allow zebra_t self:unix_stream_socket { accept connectto listen }; ++allow zebra_t self:file rw_file_perms; ++allow zebra_t self:unix_dgram_socket create_socket_perms; ++allow zebra_t self:unix_stream_socket { connectto create_stream_socket_perms }; + allow zebra_t self:netlink_route_socket rw_netlink_socket_perms; + allow zebra_t self:tcp_socket { connect connected_stream_socket_perms }; + allow zebra_t self:udp_socket create_socket_perms; + allow zebra_t self:rawip_socket create_socket_perms; + + allow zebra_t zebra_conf_t:dir list_dir_perms; +-allow zebra_t zebra_conf_t:file read_file_perms; +-allow zebra_t zebra_conf_t:lnk_file read_lnk_file_perms; ++read_files_pattern(zebra_t, zebra_conf_t, zebra_conf_t) ++read_lnk_files_pattern(zebra_t, zebra_conf_t, zebra_conf_t) + + allow zebra_t zebra_log_t:dir setattr_dir_perms; +-append_files_pattern(zebra_t, zebra_log_t, zebra_log_t) +-create_files_pattern(zebra_t, zebra_log_t, zebra_log_t) +-setattr_files_pattern(zebra_t, zebra_log_t, zebra_log_t) ++manage_files_pattern(zebra_t, zebra_log_t, zebra_log_t) + manage_sock_files_pattern(zebra_t, zebra_log_t, zebra_log_t) + logging_log_filetrans(zebra_t, zebra_log_t, { sock_file file dir }) + +-allow zebra_t zebra_tmp_t:sock_file manage_sock_file_perms; +-files_tmp_filetrans(zebra_t, zebra_tmp_t, sock_file) ++# /tmp/.bgpd is such a bad idea! ++manage_sock_files_pattern(zebra_t, zebra_tmp_t, zebra_tmp_t) ++manage_files_pattern(zebra_t, zebra_tmp_t, zebra_tmp_t) ++files_tmp_filetrans(zebra_t, zebra_tmp_t, { file sock_file }) + + manage_dirs_pattern(zebra_t, zebra_var_run_t, zebra_var_run_t) + manage_files_pattern(zebra_t, zebra_var_run_t, zebra_var_run_t) +@@ -71,7 +75,6 @@ kernel_read_network_state(zebra_t) + kernel_read_kernel_sysctls(zebra_t) + kernel_rw_net_sysctls(zebra_t) + +-corenet_all_recvfrom_unlabeled(zebra_t) + corenet_all_recvfrom_netlabel(zebra_t) + corenet_tcp_sendrecv_generic_if(zebra_t) + corenet_udp_sendrecv_generic_if(zebra_t) +@@ -79,48 +82,44 @@ corenet_raw_sendrecv_generic_if(zebra_t) + corenet_tcp_sendrecv_generic_node(zebra_t) + corenet_udp_sendrecv_generic_node(zebra_t) + corenet_raw_sendrecv_generic_node(zebra_t) ++corenet_tcp_sendrecv_all_ports(zebra_t) ++corenet_udp_sendrecv_all_ports(zebra_t) + corenet_tcp_bind_generic_node(zebra_t) + corenet_udp_bind_generic_node(zebra_t) +- +-corenet_sendrecv_bgp_server_packets(zebra_t) + corenet_tcp_bind_bgp_port(zebra_t) +-corenet_sendrecv_bgp_client_packets(zebra_t) ++corenet_tcp_bind_zebra_port(zebra_t) ++corenet_udp_bind_router_port(zebra_t) + corenet_tcp_connect_bgp_port(zebra_t) +-corenet_tcp_sendrecv_bgp_port(zebra_t) +- + corenet_sendrecv_zebra_server_packets(zebra_t) +-corenet_tcp_bind_zebra_port(zebra_t) +-corenet_tcp_sendrecv_zebra_port(zebra_t) +- + corenet_sendrecv_router_server_packets(zebra_t) +-corenet_udp_bind_router_port(zebra_t) +-corenet_udp_sendrecv_router_port(zebra_t) + + dev_associate_usbfs(zebra_var_run_t) + dev_list_all_dev_nodes(zebra_t) ++dev_read_rand(zebra_t) ++dev_read_urand(zebra_t) + dev_read_sysfs(zebra_t) + dev_rw_zero(zebra_t) + +-domain_use_interactive_fds(zebra_t) +- +-files_read_etc_files(zebra_t) +-files_read_etc_runtime_files(zebra_t) +- + fs_getattr_all_fs(zebra_t) + fs_search_auto_mountpoints(zebra_t) + + term_list_ptys(zebra_t) + +-logging_send_syslog_msg(zebra_t) ++domain_use_interactive_fds(zebra_t) ++ ++files_search_etc(zebra_t) ++files_read_etc_runtime_files(zebra_t) + +-miscfiles_read_localization(zebra_t) ++auth_use_nsswitch(zebra_t) ++ ++logging_send_syslog_msg(zebra_t) + + sysnet_read_config(zebra_t) + + userdom_dontaudit_use_unpriv_user_fds(zebra_t) + userdom_dontaudit_search_user_home_dirs(zebra_t) + +-tunable_policy(`allow_zebra_write_config',` ++tunable_policy(`zebra_write_config',` + manage_files_pattern(zebra_t, zebra_conf_t, zebra_conf_t) + ') + +@@ -139,3 +138,7 @@ optional_policy(` + optional_policy(` + udev_read_db(zebra_t) + ') ++ ++optional_policy(` ++ unconfined_sigchld(zebra_t) ++') +diff --git a/zoneminder.fc b/zoneminder.fc +new file mode 100644 +index 0000000000..ceaa219dc3 +--- /dev/null ++++ b/zoneminder.fc +@@ -0,0 +1,13 @@ ++/etc/rc\.d/init\.d/zoneminder -- gen_context(system_u:object_r:zoneminder_initrc_exec_t,s0) ++ ++/usr/bin/zmpkg.pl -- gen_context(system_u:object_r:zoneminder_exec_t,s0) ++ ++/usr/lib/systemd/system/zoneminder.* -- gen_context(system_u:object_r:zoneminder_unit_file_t,s0) ++ ++/usr/libexec/zoneminder/cgi-bin(/.*)? gen_context(system_u:object_r:zoneminder_script_exec_t,s0) ++ ++/var/lib/zoneminder(/.*)? gen_context(system_u:object_r:zoneminder_var_lib_t,s0) ++ ++/var/log/zoneminder(/.*)? gen_context(system_u:object_r:zoneminder_log_t,s0) ++ ++/var/spool/zoneminder-upload(/.*)? gen_context(system_u:object_r:zoneminder_spool_t,s0) +diff --git a/zoneminder.if b/zoneminder.if +new file mode 100644 +index 0000000000..fb0519ebfb +--- /dev/null ++++ b/zoneminder.if +@@ -0,0 +1,374 @@ ++## policy for zoneminder ++ ++######################################## ++## ++## Transition to zoneminder. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`zoneminder_domtrans',` ++ gen_require(` ++ type zoneminder_t, zoneminder_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ domtrans_pattern($1, zoneminder_exec_t, zoneminder_t) ++') ++ ++######################################## ++## ++## Allow the specified domain to execute zoneminder ++## in the caller domain. ++## ++## ++## ++## Domain allowed to transition. ++## ++## ++# ++interface(`zoneminder_exec',` ++ gen_require(` ++ type zoneminder_exec_t; ++ ') ++ ++ corecmd_search_bin($1) ++ can_exec($1, zoneminder_exec_t) ++') ++ ++ ++######################################## ++## ++## Execute zoneminder server in the zoneminder domain. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_initrc_domtrans',` ++ gen_require(` ++ type zoneminder_initrc_exec_t; ++ ') ++ ++ init_labeled_script_domtrans($1, zoneminder_initrc_exec_t) ++') ++ ++ ++######################################## ++## ++## Read zoneminder's log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++# ++interface(`zoneminder_read_log',` ++ gen_require(` ++ type zoneminder_log_t; ++ ') ++ ++ logging_search_logs($1) ++ read_files_pattern($1, zoneminder_log_t, zoneminder_log_t) ++') ++ ++######################################## ++## ++## Append to zoneminder log files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_append_log',` ++ gen_require(` ++ type zoneminder_log_t; ++ ') ++ ++ logging_search_logs($1) ++ append_files_pattern($1, zoneminder_log_t, zoneminder_log_t) ++') ++ ++######################################## ++## ++## Manage zoneminder log files ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_log',` ++ gen_require(` ++ type zoneminder_log_t; ++ ') ++ ++ logging_search_logs($1) ++ manage_dirs_pattern($1, zoneminder_log_t, zoneminder_log_t) ++ manage_files_pattern($1, zoneminder_log_t, zoneminder_log_t) ++ manage_lnk_files_pattern($1, zoneminder_log_t, zoneminder_log_t) ++') ++ ++######################################## ++## ++## Search zoneminder lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_search_lib',` ++ gen_require(` ++ type zoneminder_var_lib_t; ++ ') ++ ++ allow $1 zoneminder_var_lib_t:dir search_dir_perms; ++ files_search_var_lib($1) ++') ++ ++######################################## ++## ++## Read zoneminder lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_read_lib_files',` ++ gen_require(` ++ type zoneminder_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ read_files_pattern($1, zoneminder_var_lib_t, zoneminder_var_lib_t) ++') ++ ++######################################## ++## ++## Manage zoneminder lib files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_lib_files',` ++ gen_require(` ++ type zoneminder_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_files_pattern($1, zoneminder_var_lib_t, zoneminder_var_lib_t) ++') ++ ++######################################## ++## ++## Manage zoneminder lib directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_lib_dirs',` ++ gen_require(` ++ type zoneminder_var_lib_t; ++ ') ++ ++ files_search_var_lib($1) ++ manage_dirs_pattern($1, zoneminder_var_lib_t, zoneminder_var_lib_t) ++') ++ ++######################################## ++## ++## Manage zoneminder sock_files files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_lib_sock_files',` ++ gen_require(` ++ type zoneminder_var_lib_t; ++ ') ++ files_search_var_lib($1) ++ manage_sock_files_pattern($1, zoneminder_var_lib_t, zoneminder_var_lib_t) ++') ++ ++######################################## ++## ++## Search zoneminder spool directories. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_search_spool',` ++ gen_require(` ++ type zoneminder_spool_t; ++ ') ++ ++ allow $1 zoneminder_spool_t:dir search_dir_perms; ++ files_search_spool($1) ++') ++ ++######################################## ++## ++## Read zoneminder spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_read_spool_files',` ++ gen_require(` ++ type zoneminder_spool_t; ++ ') ++ ++ files_search_spool($1) ++ read_files_pattern($1, zoneminder_spool_t, zoneminder_spool_t) ++') ++ ++######################################## ++## ++## Manage zoneminder spool files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_spool_files',` ++ gen_require(` ++ type zoneminder_spool_t; ++ ') ++ ++ files_search_spool($1) ++ manage_files_pattern($1, zoneminder_spool_t, zoneminder_spool_t) ++') ++ ++######################################## ++## ++## Manage zoneminder spool dirs. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_manage_spool_dirs',` ++ gen_require(` ++ type zoneminder_spool_t; ++ ') ++ ++ files_search_spool($1) ++ manage_dirs_pattern($1, zoneminder_spool_t, zoneminder_spool_t) ++') ++ ++######################################## ++## ++## Connect to zoneminder over a unix stream socket. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_stream_connect',` ++ gen_require(` ++ type zoneminder_t, zoneminder_var_lib_t; ++ ') ++ ++ files_search_pids($1) ++ stream_connect_pattern($1, zoneminder_var_lib_t, zoneminder_var_lib_t, zoneminder_t) ++') ++ ++###################################### ++## ++## Read/write zonerimender tmpfs files. ++## ++## ++## ++## Domain allowed access. ++## ++## ++# ++interface(`zoneminder_rw_tmpfs_files',` ++ gen_require(` ++ type zoneminder_tmpfs_t; ++ ') ++ ++ fs_search_tmpfs($1) ++ rw_files_pattern($1, zoneminder_tmpfs_t, zoneminder_tmpfs_t) ++') ++ ++######################################## ++## ++## All of the rules required to administrate ++## an zoneminder environment ++## ++## ++## ++## Domain allowed access. ++## ++## ++## ++## ++## Role allowed access. ++## ++## ++## ++# ++interface(`zoneminder_admin',` ++ gen_require(` ++ type zoneminder_t; ++ type zoneminder_initrc_exec_t; ++ type zoneminder_log_t; ++ type zoneminder_var_lib_t; ++ type zoneminder_spool_t; ++ ') ++ ++ allow $1 zoneminder_t:process { ptrace signal_perms }; ++ ps_process_pattern($1, zoneminder_t) ++ ++ zoneminder_initrc_domtrans($1) ++ domain_system_change_exemption($1) ++ role_transition $2 zoneminder_initrc_exec_t system_r; ++ allow $2 system_r; ++ ++ logging_search_logs($1) ++ admin_pattern($1, zoneminder_log_t) ++ ++ files_search_var_lib($1) ++ admin_pattern($1, zoneminder_var_lib_t) ++ ++ files_search_spool($1) ++ admin_pattern($1, zoneminder_spool_t) ++ ++') ++ +diff --git a/zoneminder.te b/zoneminder.te +new file mode 100644 +index 0000000000..ba1d14974f +--- /dev/null ++++ b/zoneminder.te +@@ -0,0 +1,189 @@ ++policy_module(zoneminder, 1.0.0) ++ ++######################################## ++# ++# Declarations ++# ++ ++## ++##

      ++## Allow ZoneMinder to run su/sudo. ++##

      ++##
      ++gen_tunable(zoneminder_run_sudo, false) ++ ++ ++## ++##

      ++## Allow ZoneMinder to modify public files ++## used for public file transfer services. ++##

      ++##
      ++gen_tunable(zoneminder_anon_write, false) ++ ++gen_require(` ++ class passwd rootok; ++ class passwd passwd; ++ ') ++ ++type zoneminder_t; ++type zoneminder_exec_t; ++init_daemon_domain(zoneminder_t, zoneminder_exec_t) ++ ++type zoneminder_unit_file_t; ++systemd_unit_file(zoneminder_unit_file_t) ++ ++type zoneminder_initrc_exec_t; ++init_script_file(zoneminder_initrc_exec_t) ++ ++type zoneminder_log_t; ++logging_log_file(zoneminder_log_t) ++ ++type zoneminder_tmpfs_t; ++files_tmpfs_file(zoneminder_tmpfs_t) ++ ++type zoneminder_spool_t; ++files_type(zoneminder_spool_t) ++ ++type zoneminder_var_lib_t; ++files_type(zoneminder_var_lib_t) ++ ++type zoneminder_var_run_t; ++files_pid_file(zoneminder_var_run_t) ++ ++######################################## ++# ++# zoneminder local policy ++# ++allow zoneminder_t self:capability { chown dac_read_search dac_override }; ++allow zoneminder_t self:process { signal_perms setpgid }; ++allow zoneminder_t self:shm create_shm_perms; ++allow zoneminder_t self:fifo_file rw_fifo_file_perms; ++allow zoneminder_t self:unix_stream_socket { create_stream_socket_perms connectto }; ++allow zoneminder_t self:netlink_selinux_socket create_socket_perms; ++ ++manage_dirs_pattern(zoneminder_t, zoneminder_log_t, zoneminder_log_t) ++manage_files_pattern(zoneminder_t, zoneminder_log_t, zoneminder_log_t) ++logging_log_filetrans(zoneminder_t, zoneminder_log_t, { dir file }) ++ ++manage_dirs_pattern(zoneminder_t, zoneminder_tmpfs_t, zoneminder_tmpfs_t) ++manage_files_pattern(zoneminder_t, zoneminder_tmpfs_t, zoneminder_tmpfs_t) ++manage_lnk_files_pattern(zoneminder_t, zoneminder_tmpfs_t, zoneminder_tmpfs_t) ++fs_tmpfs_filetrans(zoneminder_t, zoneminder_tmpfs_t, { dir file lnk_file }) ++ ++manage_dirs_pattern(zoneminder_t, zoneminder_var_lib_t, zoneminder_var_lib_t) ++manage_files_pattern(zoneminder_t, zoneminder_var_lib_t, zoneminder_var_lib_t) ++manage_sock_files_pattern(zoneminder_t, zoneminder_var_lib_t, zoneminder_var_lib_t) ++manage_lnk_files_pattern(zoneminder_t, zoneminder_var_lib_t, zoneminder_var_lib_t) ++files_var_lib_filetrans(zoneminder_t, zoneminder_var_lib_t, { dir file lnk_file sock_file }) ++ ++manage_dirs_pattern(zoneminder_t, zoneminder_var_run_t, zoneminder_var_run_t) ++manage_files_pattern(zoneminder_t, zoneminder_var_run_t, zoneminder_var_run_t) ++files_pid_filetrans(zoneminder_t, zoneminder_var_run_t, { dir file }) ++ ++manage_dirs_pattern(zoneminder_t, zoneminder_spool_t, zoneminder_spool_t) ++manage_files_pattern(zoneminder_t, zoneminder_spool_t, zoneminder_spool_t) ++manage_lnk_files_pattern(zoneminder_t, zoneminder_spool_t, zoneminder_spool_t) ++files_spool_filetrans(zoneminder_t, zoneminder_spool_t, { dir file }) ++ ++kernel_read_system_state(zoneminder_t) ++ ++domain_read_all_domains_state(zoneminder_t) ++ ++corecmd_exec_bin(zoneminder_t) ++corecmd_exec_shell(zoneminder_t) ++ ++corenet_tcp_bind_http_cache_port(zoneminder_t) ++corenet_tcp_bind_transproxy_port(zoneminder_t) ++corenet_tcp_connect_http_port(zoneminder_t) ++ ++dev_read_sysfs(zoneminder_t) ++dev_read_rand(zoneminder_t) ++dev_read_urand(zoneminder_t) ++dev_read_video_dev(zoneminder_t) ++dev_write_video_dev(zoneminder_t) ++ ++fs_getattr_xattr_fs(zoneminder_t) ++ ++auth_use_nsswitch(zoneminder_t) ++#auth_read_shadow(zoneminder_t) need to debug zmpkg.pl to see why is needed this rule. ++ ++logging_send_syslog_msg(zoneminder_t) ++logging_send_audit_msgs(zoneminder_t) ++ ++mta_send_mail(zoneminder_t) ++ ++tunable_policy(`zoneminder_anon_write',` ++ miscfiles_manage_public_files(zoneminder_t) ++') ++ ++tunable_policy(`zoneminder_run_sudo',` ++ allow zoneminder_t self:capability { setuid setgid sys_resource }; ++ allow zoneminder_t self:process { setrlimit setsched }; ++ allow zoneminder_t self:key write; ++ allow zoneminder_t self:passwd { passwd rootok }; ++ ++ auth_rw_lastlog(zoneminder_t) ++ auth_rw_faillog(zoneminder_t) ++ auth_exec_chkpwd(zoneminder_t) ++ ++ selinux_compute_access_vector(zoneminder_t) ++ ++ systemd_write_inherited_logind_sessions_pipes(zoneminder_t) ++ systemd_dbus_chat_logind(zoneminder_t) ++ ++ xserver_exec_xauth(zoneminder_t) ++') ++ ++optional_policy(` ++ tunable_policy(`zoneminder_run_sudo',` ++ sudo_exec(zoneminder_t) ++ su_exec(zoneminder_t) ++ ') ++') ++ ++optional_policy(` ++ dbus_system_bus_client(zoneminder_t) ++') ++ ++ ++optional_policy(` ++ mysql_stream_connect(zoneminder_t) ++') ++ ++optional_policy(` ++ fprintd_dbus_chat(zoneminder_t) ++') ++ ++optional_policy(` ++ motion_manage_all_files(zoneminder_t) ++') ++ ++######################################## ++# ++# zoneminder cgi local policy ++# ++ ++optional_policy(` ++ apache_content_template(zoneminder) ++ apache_content_alias_template(zoneminder, zoneminder) ++ ++ # need more testing ++ #allow zoneminder_script_t self:shm create_shm_perms; ++ ++ manage_sock_files_pattern(zoneminder_script_t, zoneminder_var_lib_t, zoneminder_var_lib_t) ++ ++ rw_files_pattern(zoneminder_script_t, zoneminder_tmpfs_t, zoneminder_tmpfs_t) ++ ++ zoneminder_stream_connect(zoneminder_script_t) ++ ++ can_exec(zoneminder_t, zoneminder_script_exec_t) ++ ++ files_search_var_lib(zoneminder_script_t) ++ ++ logging_send_syslog_msg(zoneminder_script_t) ++ ++ optional_policy(` ++ mysql_stream_connect(zoneminder_script_t) ++ ') ++') +diff --git a/zosremote.if b/zosremote.if +index b14698c4f5..16e1581a00 100644 +--- a/zosremote.if ++++ b/zosremote.if +@@ -35,6 +35,7 @@ interface(`zosremote_domtrans',` + ## Role allowed access. + ##
      + ## ++## + # + interface(`zosremote_run',` + gen_require(` +diff --git a/zosremote.te b/zosremote.te +index bc6a5db700..0abdcebcb8 100644 +--- a/zosremote.te ++++ b/zosremote.te +@@ -24,6 +24,4 @@ allow zos_remote_t self:unix_stream_socket { accept listen }; + + auth_use_nsswitch(zos_remote_t) + +-miscfiles_read_localization(zos_remote_t) +- + logging_send_syslog_msg(zos_remote_t) diff --git a/SPECS/selinux-policy.spec b/SPECS/selinux-policy.spec index 22adeb09..cdb2268c 100644 --- a/SPECS/selinux-policy.spec +++ b/SPECS/selinux-policy.spec @@ -20,12 +20,12 @@ Summary: SELinux policy configuration Name: selinux-policy Version: 3.13.1 -Release: 266%{?dist}.1 +Release: 268%{?dist} License: GPLv2+ Group: System Environment/Base Source: serefpolicy-%{version}.tgz -patch0: policy-rhel-7.8-base.patch -patch1: policy-rhel-7.8-contrib.patch +patch0: policy-rhel-7.9-base.patch +patch1: policy-rhel-7.9-contrib.patch Source1: modules-targeted-base.conf Source31: modules-targeted-contrib.conf Source2: booleans-targeted.conf @@ -653,9 +653,23 @@ fi %endif %changelog -* Fri May 15 2020 Zdenek Pytela - 3.13.1-266.1 +* Tue May 12 2020 Zdenek Pytela - 3.13.1-268 +- Allow rhsmd read process state of all domains and kernel threads +Resolves: rhbz#1837461 +- Allow ipa-adtrust-install restart sssd and dirsrv services +Resolves: rhbz#1820298 - Allow nagios_plugin_domain execute programs in bin directories -Resolves: rhbz#1832219 +Resolves: rhbz#1824625 +- selinux policy: add the right context for org.freeipa.server.trust-enable-agent +Related: rhbz#1820298 + +* Mon Mar 23 2020 Zdenek Pytela - 3.13.1-267 +- Allow chronyd_t domain to exec shell +Resolves: rhbz#1775573 +- Allow pmie daemon to send signal pcmd daemon +Resolves: rhbz#1770123 +- Allow auditd poweroff or switch to single mode +Resolves: rhbz#1780332 * Wed Nov 06 2019 Lukas Vrabec - 3.13.1-266 - Dontaudit tmpreaper_t getting attributes from sysctl_type files