Re: [PATCH] sepolicy: Allow bluetooth to send D-Bus messages to systemd

Wei Deng <[email protected]> Thu, 23 Apr 2026 11:16:08 +0800
Newsgroups org.kernel.vger.selinux-refpolicy
Message-ID <[email protected]>
Hi Chris,

On 4/13/2026 8:32 PM, Christopher J. PeBenito wrote:
> On 4/9/26 7:36 AM, Wei Deng wrote:
>> On 4/7/2026 8:40 PM, Christopher J. PeBenito wrote:
>>> On 4/4/26 5:19 AM, Wei Deng wrote:
>>>> On 4/3/2026 10:01 PM, Christopher J. PeBenito wrote:
>>>>> On 4/3/26 2:31 AM, Wei Deng wrote:
>>>>>> Add init_dbus_chat() for bluetooth_t to allow bluetoothd to send
>>>>>> D-Bus method_return messages back to systemd (init_t) over the
>>>>>> system bus.
>>>>>>
>>>>>> Below avc denial is fixed with this patch:
>>>>>>
>>>>>> avc:  denied  { send_msg } for  msgtype=method_return dest=:1.11
>>>>>> scontext=system_u:system_r:bluetooth_t:s0
>>>>>> tcontext=system_u:system_r:init_t:s0 tclass=dbus permissive=0
>>>>>>
>>>>>> Signed-off-by: Wei Deng <[email protected]>
>>>>>> ---
>>>>>>     policy/modules/services/bluetooth.te | 1 +
>>>>>>     1 file changed, 1 insertion(+)
>>>>>>
>>>>>> diff --git a/policy/modules/services/bluetooth.te b/policy/modules/services/bluetooth.te
>>>>>> index ceb42d147..a73cb5db0 100644
>>>>>> --- a/policy/modules/services/bluetooth.te
>>>>>> +++ b/policy/modules/services/bluetooth.te
>>>>>> @@ -136,6 +136,7 @@ userdom_dontaudit_search_user_home_dirs(bluetooth_t)
>>>>>>     optional_policy(`
>>>>>>         dbus_system_bus_client(bluetooth_t)
>>>>>>         dbus_connect_system_bus(bluetooth_t)
>>>>>> +  init_dbus_chat(bluetooth_t)
>>>>>>         init_dbus_send_script(bluetooth_t)
>>>>>>           optional_policy(`
>>>>> Can you confirm this response is going to systemd/pid1? Is there a fuller set of log messages corresponding to this denial? The init_dbus_send_script() makes me wonder.
>>>> The two log entries list here:
>>>>
>>>>     type=SERVICE_START msg=audit(19.419:292): pid=1 uid=0
>>>>       subj=system_u:system_r:init_t:s0
>>>>       msg='unit=bluetooth comm="systemd"
>>>>       exe="/usr/lib/systemd/systemd" ... res=success'
>>>>
>>>>     type=USER_AVC msg=audit(19.547:319):
>>>>       subj=system_u:system_r:system_dbusd_t:s0
>>>>       msg='avc: denied { send_msg } for msgtype=method_return
>>>>       dest=:1.11 spid=684 tpid=843
>>>>       scontext=system_u:system_r:bluetooth_t:s0
>>>>       tcontext=system_u:system_r:init_t:s0
>>>>       tclass=dbus permissive=0
>>>>       exe="/usr/bin/dbus-daemon"'
>>>>
>>>>> Can you confirm this response is going to systemd/pid1?
>>>>> Is there a fuller set of log messages corresponding to this denial?
>>>> Yes. The SERVICE_START entry shows pid=1 with
>>>> exe="/usr/lib/systemd/systemd" running under init_t, confirming that
>>>> init_t is systemd's SELinux domain.
>>> These two audit messages are not related, as they have different event IDs (292 vs 319). Additionally, SERVICE_START messages are expected to come from pid=1.
>>>
>>> Can you confirm this response is going to systemd/pid1?
>>> Is there a fuller set of log messages corresponding to
>>> this denial?
>> You are right. I apologize for the confusion. The two audit
>> messages are unrelated, as they have different event IDs.
>>
>> Here is the full AVC denial:
>>
>>    type=USER_AVC msg=audit(1773416627.807:455):
>>      pid=801 uid=997 auid=4294967295 ses=4294967295
>>      subj=system_u:system_r:system_dbusd_t:s0
>>      msg='avc: denied { send_msg } for
>>      msgtype=method_return dest=:1.27
>>      spid=1942 tpid=1944
>>      scontext=system_u:system_r:bluetooth_t:s0
>>      tcontext=system_u:system_r:init_t:s0
>>      tclass=dbus permissive=0
>>      exe="/usr/bin/dbus-daemon"'
>>
>> The tpid=1944 is obexd, not systemd/pid1, as confirmed by:
>>
>>    ps -p 1944 -o pid,ppid,comm,exe,label
>>        PID  PPID COMMAND  EXE                           LABEL
>>       1944     1 obexd    /usr/libexec/bluetooth/obexd  system_u:system_r:init_t:s0
>>
>> So the real issue is not bluetooth_t -> init_t (systemd),
>> but bluetooth_t -> init_t (obexd running in the wrong domain).
>>
>> The root cause is that obex.te currently uses
>> userdom_user_application_domain(), which does not create a
>> domain transition from init_t. obexd therefore inherits
>> systemd's domain instead of transitioning to obex_t.
> 
> Thanks for working that out. It would be acceptable to add this in refpolicy, but I think it should be tunable. It's not a common case configuration.
> 

Thanks for the feedback. I will consider your suggestion and send a v2 patch series shortly.

> 

-- 
Best Regards,
Wei Deng