Авторизация соединений 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 функция.

Другие вопросы по тегам