Авторизация соединений XPC
Мое приложение включает в себя в качестве ключевого компонента расширение ядра. Это расширение ядра контролируется системным сокетом управления. По соображениям безопасности этот сокет управления системой принимает соединения только от суперпользователя.
Чтобы общаться из моего обычного приложения, не являющегося суперпользователем, у меня есть помощник SMJobBless, который выступает в качестве посредника. Проблема в том, что я хочу, чтобы мое приложение (подписанное мной) могло подключаться к этой службе XPC. Есть ли способ проверить подпись исполняемого файла на другом конце соединения? Если мне удастся получить PID процесса на другом конце, этого достаточно, я знаю, как оттуда проверить подпись.
2 ответа
Если я могу получить PID процесса на другом конце
Вы можете, используя xpc_connection_get_pid ().
Для всех, кто прочитает это в 2021 году, исследования безопасности показали, что PID не заслуживают доверия из-за их повторного использования. Вот хорошая презентация по этому поводу.
Начиная с macOS 11, SecCodeCreateWithXPCMessage
доступна функция, позволяющая определить истинного отправителя сообщения XPC. В старых версиях macOS недокументированная функция
void xpc_connection_get_audit_token(xpc_connection_t, audit_token_t *)
существует, который можно использовать с несколькими дополнительными шагами для достижения того же результата.
Я создал платформу Swift XPC под названием SecureXPC, которая использует обе эти функции, поэтому, если вы хотите увидеть, как их использовать, взгляните наacceptMessage
функция.