Re: selinux_set_callback for policy load not triggering

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 17, 2024 at 3:42 PM Matthew Sheets
<masheets@xxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi All,
>
> I am currently working on an update for dbus-broker to trigger reload of
> its configuration whenever an SELinux policy load event is seen.
>
> For some background dbus-broker is comprised of two major elements the
> launcher and the broker.  To trigger a config reload you can either send
> a SIGHUP to the launcher or send a message to the launcher over dbus.
> In most cases the launcher will be the brokers parent.
>
> Here is a link to my current PR:
> https://github.com/bus1/dbus-broker/pull/379
>
> In this current state things work.  The broker will see the POLICY_LOAD
> event and properly send a SIGHUP to its parent, but as David pointed out
> my initial attempt at the fix is no good since there is no guarantee
> that the brokers parent will be the launcher.
>
> My attempts at moving the callback registration into the launcher have
> been less successful.  From what my debugging has told me is that the
> selinux_set_callback is going through successfully and the function
> pointer is correctly pointing to the callback function I define.  But
> when I trigger a load_policy my callback function is never called.
>
> I am not familiar with how the callbacks in libselinux work under the
> hood so I am unsure about what could be blocking them in this situation.

Caveat: I haven't looked deeply so take this with a grain of salt (or two).
There are generally two ways of discovering when policy has been reloaded:
1. Create and receive notifications on a SELinux netlink socket, or
2. Map the SELinux status page and poll it for updates to the policy seqno.

Internally libselinux has switched to using the status page whenever
the kernel supports it since doing so is more efficient (no syscall
required to read it once you've mapped the page). As an aside, the
status page is also more easily "virtualizable" for SELinux namespaces
since it is per-SELinux state/namespace already (the netlink socket
can also be virtualized via a separate network namespace if/when my
namespace patches land but that requires you to unshare the network
namespace too).

As far as libselinux APIs are concerned for the status page, you can
check for a policy reload or enforcing mode change by calling
selinux_status_updated() at any time after having done an initial
selinux_status_open(). selinux_status_updated() will call any
registered callbacks if enforcing mode or policy was changed, and, it
returns an indicator as to whether anything changed since the last
time it was called.

Or if you choose to use the netlink socket and want to use the
libselinux APIs, you'd call avc_netlink_acquire_fd() to create and
take ownership of the SELinux netlink socket and then poll/select on
it for notifications, and upon receiving them, calling
avc_netlink_check_nb() to process them, including calling your
callbacks.

But you have to do one of those two things in order for your callback
to be invoked. I assume dbus and dbus-broker are already doing one of
them which is why it works for them but not for the launcher.





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux