On 04/20/2018 09:31 AM, Petr Lautrbach wrote:
> On Fri, Apr 20, 2018 at 08:49:41AM -0400, Stephen Smalley wrote:
>> On 04/20/2018 08:31 AM, Petr Lautrbach wrote:
>>> On Thu, Apr 19, 2018 at 11:07:39AM -0400, Stephen Smalley wrote:
>>>> A 2.8-rc1 release candidate for the SELinux userspace is now available at:
>>>> https://github.com/SELinuxProject/selinux/wiki/Releases
>>>>
>>>> Please give it a test and let us know if there are any issues.
>>>
>>>
>>> I've built in my Fedora COPR repo [1] and I'm running Fedora CI [2] tests
>>> on it.
>>>
>>> So far there's one problem found by libselinux/selabel-function [3] test. It
>>> looks like commit 814631d3aebaa changed the behavior of selabel_open() when
>>> SELABEL_OPT_VALIDATE is null - a context should not be validated, but it is.
>>
>> So, is this a bug in the test or a bug in libselinux? As noted in that
>> commit description,
>> failing to verify contexts at all before use can lead to applying an invalid
>> label (if the system is permissive).
>
> selabel_open(3) states that "an invalid context may not be treated as an
> error unless it is actually encountered during a lookup operation ". So at
> least, it's some disproportion between the code and the documentation.
>
> I read the commit message as that a context should be validated before it's
> applied. But now it's validated during lookup.
I guess it would be an API change given the way SELABEL_OPT_VALIDATE is
documented in the man page,
although that description doesn't quite match the current code either.
I was thinking that {SELABEL_OPT_VALIDATE,1} was intended to mean "validate all
contexts during selabel_open() and fail the open on any errors". Which is good
for setfiles (particularly when invoked by libsemanage to check file_contexts
against the policy) but was considered problematic for restorecon, as it meant
that a single typo in file_contexts could prevent your system from booting
(e.g. restorecon -R /dev or similar during boot may fail even if the error has
nothing to do with /dev entries). I thought {SELABEL_OPT_VALIDATE,0} was
intended to mean "don't validate during selabel_open(); instead, lazily
validate just before returning from selabel_lookup()". That makes more sense
to me.
However, if it is an API change, I guess we have to revert it. In which case
maybe we should just change restorecon itself
to validate the context it gets from selabel_lookup (which might have been
Yuli's original approach; I don't remember -
I think I sent him down this path instead).
On a separate but related note, I have seen situations where people really
wanted setfiles to have an option to suppress validation for use when labeling
in a chroot with a policy that differs from the host policy.
>
>
>
>> Are there real users of libselinux that rely on the current behavior or is
>> there some use case where
>> it is desirable?
>
> I don't know. I was thinking about setfiles but it always validate. There
> might be 3rd party users who
> lookups for labels in chroot.
>
>
>>>
>>> The reproducer code:
>>>
>>> #include <errno.h>
>>> #include <stdio.h>
>>>
>>> #include <selinux/selinux.h>
>>> #include <selinux/label.h>
>>>
>>> int main() {
>>> struct selabel_handle *hnd = NULL;
>>> security_context_t selabel_context;
>>>
>>> struct selinux_opt selabel_option [] = {
>>> { SELABEL_OPT_PATH, "my_contexts" },
>>> { SELABEL_OPT_SUBSET, NULL },
>>> { SELABEL_OPT_VALIDATE, (char *) 0 },
>>> { SELABEL_OPT_BASEONLY, (char *) 0 }
>>> };
>>> int result = 0;
>>>
>>> if ((hnd = selabel_open(SELABEL_CTX_FILE, selabel_option, 4)) == NULL) {
>>> return 1;
>>> }
>>>
>>> if ((result = selabel_lookup_raw(hnd, &selabel_context, "/tmp/mypath",
>>> 0)) == -1) {
>>> perror("selabel_lookup_raw - ERROR");
>>> return 1;
>>> }
>>>
>>> printf("%s\n", selabel_context);
>>>
>>> return 0;
>>> }
>>>
>>> ---
>>>
>>> $ gcc -o selabel_reproducer selabel_reproducer.c -lselinux
>>> $ echo '/tmp/mypath my_user_u:my_role_r:my_type_t:s' > my_contexts
>>>
>>> Before:
>>>
>>> $ ./selabel_reproducer
>>> my_user_u:my_role_r:my_type_t:s
>>>
>>> After:
>>>
>>> $ ./selabel_reproducer
>>> my_contexts: line 1 has invalid context my_user_u:my_role_r:my_type_t:s
>>> selabel_lookup_raw - ERROR: Invalid argument
>>>
>>>
>>>
>>>
>>> [1]
>>> https://copr.fedorainfracloud.org/coprs/plautrba/selinux-fedora/packages/
>>> [2] https://src.fedoraproject.org/tests/selinux/tree/master
>>> [3]
>>> https://src.fedoraproject.org/tests/selinux/blob/master/f/libselinux/selabel-functions
>>>
>>>> If there are specific changes that you think should be called out in
>>>> release notes for packagers and users in the final release announcement,
>>>> let us know.
>>>>
>>>> Thanks to all the contributors to this release candidate!
>>>>
>>>> A shortlog of changes since the 2.7 release is below.
>>>>
>>>> Dan Cashman (1):
>>>> libsepol: cil: Add ability to redeclare types[attributes]
>>>>
>>>> Dominick Grift (1):
>>>> Describe multiple-decls in secilc.8.xml
>>>>
>>>> Grégoire Colbert (1):
>>>> Fixed bad reference in roleattribute
>>>>
>>>> James Carter (4):
>>>> libsepol/cil: Keep attributes used by generated attributes in
>>>> neverallow rules
>>>> libsepol/cil: Create new keep field for type attribute sets
>>>> libsepol: Prevent freeing unitialized value in ibendport handling
>>>> libsepol/cil: Improve processing of context rules
>>>>
>>>> Jan Zarsky (6):
>>>> libsepol: reset pointer after free
>>>> libsepol: fix memory leak in sepol_bool_query()
>>>> libsepol: free ibendport device names
>>>> libsemanage: free genhomedircon fallback user
>>>> libsemanage: properly check return value of iterate function
>>>> python/sepolgen: fix typo in PolicyGenerator
>>>>
>>>> Lee Stubbs (1):
>>>> Minor update for bash completion. Bash completion for ports is
>>>> missing '-' for type. Based on documentation, it should be --type, not
>>>> -type.
>>>>
>>>> Lukas Vrabec (1):
>>>> python/sepolicy: Fix sepolicy manpage.
>>>>
>>>> Marcus Folkesson (15):
>>>> libsepol: build: follow standard semantics for DESTDIR and PREFIX
>>>> libselinux: build: follow standard semantics for DESTDIR and PREFIX
>>>> libsemanage: build: follow standard semantics for DESTDIR and PREFIX
>>>> checkpolicy: build: follow standard semantics for DESTDIR and PREFIX
>>>> gui: build: follow standard semantics for DESTDIR and PREFIX
>>>> mcstrans: build: follow standard semantics for DESTDIR and PREFIX
>>>> policycoreutils: build: follow standard semantics for DESTDIR and
>>>> PREFIX
>>>> python: build: follow standard semantics for DESTDIR and PREFIX
>>>> python: build: move modules from platform-specific to platform-shared
>>>> restorecond: build: follow standard semantics for DESTDIR and PREFIX
>>>> sandbox: build: follow standard semantics for DESTDIR and PREFIX
>>>> secilc: build: follow standard semantics for DESTDIR and PREFIX
>>>> semodule-utils: build: follow standard semantics for DESTDIR and
>>>> PREFIX
>>>> dbus: build: follow standard semantics for DESTDIR and PREFIX
>>>> build: setup buildpaths if DESTDIR is specified
>>>>
>>>> Nicolas Iooss (36):
>>>> Travis-CI: use sugulite environment
>>>> Travis-CI: do not test gold linkers with clang
>>>> sepolicy: fix Python3 syntax in manpage
>>>> sepolicy: do not fail when file_contexts.local does not exist
>>>> sepolicy: fix misspelling of _ra_content_t suffix
>>>> sepolicy: support non-MLS policy in manpage
>>>> sepolicy: support non-MCS policy in manpage
>>>> sepolicy: remove stray space in section "SEE ALSO"
>>>> libsepol: use IN6ADDR_ANY_INIT to initialize IPv6 addresses
>>>> libsepol/cil: __cil_post_db_neverallow_attr_helper() does not use
>>>> extra_args
>>>> libsepol/cil: fix -Wwrite-strings warning
>>>> libsepol/cil: drop wrong unused attribute
>>>> restorecond: check write() and daemon() results
>>>> Makefile: define a default value for CFLAGS
>>>> sepolicy: do not fail when file_contexts.local or .subs do not exist
>>>> gui: port to Python 3 by migrating to PyGI
>>>> Travis-CI: fix configuration after September's update
>>>> sepolicy: ignore comments and empty lines in file_contexts.subs_dist
>>>> sepolicy: support non-MLS policy in gui
>>>> gui: remove the status bar
>>>> gui: fix parsing of "semodule -lfull" in tab Modules
>>>> gui: delete overridden definition of usersPage.delete()
>>>> gui: remove mappingsPage
>>>> Travis-CI: try working around network issues by retrying downloads
>>>> Travis-CI: do not duplicate $DESTDIR in $PYSITEDIR
>>>> python/sepolicy: Fix translated strings with parameters
>>>> python/sepolicy: Support non-MLS policy
>>>> python/sepolicy: Initialize policy.ports as a dict in generate.py
>>>> libsepol: cil: show an error when cil_expr_to_string() fails
>>>> libsemanage: silence clang static analyzer report
>>>> libselinux,libsemanage: Replace PYSITEDIR with PYTHONLIBDIR
>>>> libsepol: do not dereference NULL if stack_init fails
>>>> libsepol: ensure the level context is not empty
>>>> libselinux: label_file: fix memory management in store_stem()
>>>> libselinux: fix memory leak in getconlist
>>>> libselinux: remove unused variable usercon
>>>>
>>>> Petr Lautrbach (12):
>>>> libselinux: Add support for pcre2 to pkgconfig definition
>>>> python/semanage: drop *_ini functions
>>>> python/semanage: Don't use global setup variable
>>>> python/semanage: Enforce noreload only if it's requested by -N option
>>>> libsemanage: Use umask(0077) for fopen() write operations
>>>> python/semanage: make seobject.py backward compatible
>>>> python/semanage: bring semanageRecords.set_reload back
>>>> gui/polgengui.py: Fix sepolicy.generate import in polgengui.py
>>>> gui/polgengui.py: Convert polgen.glade to Builder format polgen.ui
>>>> python/sepolicy: Use list instead of map
>>>> python/sepolicy: Do not use types.BooleanType
>>>> gui/polgengui.py: Use stop_emission_by_name instead of
>>>> emit_stop_by_name
>>>>
>>>> Richard Haines (3):
>>>> libselinux: Correct manpages regarding removable_context
>>>> libsemanage: Return commit number if save-previous false
>>>> libsemanage: Allow tmp files to be kept if a compile fails
>>>>
>>>> Richard Haines via Selinux (1):
>>>> selinux: Add support for the SCTP portcon keyword
>>>>
>>>> Stephen Smalley (4):
>>>> checkpolicy,libselinux,libsepol,policycoreutils: Update my email
>>>> address
>>>> semodule-utils: remove semodule_deps
>>>> libsepol: Export sepol_polcap_getnum/name functions
>>>> Update VERSION files to 2.8-rc1
>>>>
>>>> Tri Vo (1):
>>>> Resolve conflicts in expandattribute.
>>>>
>>>> Vit Mojzis (18):
>>>> libsemanage: Keep copy of file_contexts.homedirs in policy store
>>>> libsemanage: Add support for listing fcontext.homedirs file
>>>> python/semanage: Enable listing file_contexts.homedirs
>>>> python/semanage: Fix export of ibendport entries
>>>> python/semanage: Update Infiniband code to work on python3
>>>> python/semanage: Remove redundant and broken moduleRecords.modify()
>>>> semodule-utils/semodule_package: fix semodule_unpackage man page
>>>> libsemanage: Improve warning for installing disabled module
>>>> gui/semanagePage: Close "edit" and "add" dialogues when successfull
>>>> gui/fcontextPage: Set default object class in addDialog
>>>> libsemanage: remove access() check to make setuid programs work
>>>> libsemanage: remove access() check to make setuid programs work
>>>> libsemanage: replace access() checks to make setuid programs work
>>>> libsemanage/direct_api.c: Fix iterating over array
>>>> policycoreutils/semodule: Improve man page and unify it with --help
>>>> policycoreutils/semodule: Allow enabling/disabling multiple modules
>>>> at once
>>>> python/sepolgen: Try to translate SELinux contexts to raw
>>>> libsemanage: do not change file mode of seusers and users_extra
>>>>
>>>> Yuli Khodorkovskiy (3):
>>>> secilc: Fix documentation build for OS X systems
>>>> libselinux: verify file_contexts when using restorecon
>>>> libselinux: echo line number of bad label in selabel_fini()
>>>>
>>>>
>>