Я создаю kext для дополнительного уровня безопасности на OS X (построенный вокруг KAtuh). Я использую клиент в пользовательском пространстве, который подключается к kext поверх сокетов (по рекомендации Apple) и в основном управляет kext. Поскольку продукт должен обеспечивать дополнительную безопасность для OS X, важно, чтобы он был «как можно более безопасным» от атак. Один вектор атаки следующий: A malicious process impersonates the client and sends malicious control data to the kext, disabling the security mechanism.
. Я хочу предотвратить это, выполнив аутентификацию при подключении. Вот мои решения:Аутентификация клиента из kext при подключении сокета
Запуск клиента в качестве корня, используйте
CTL_FLAG_PRIVILEGED
флаг, чтобы обеспечить только корневые клиент может подключаться к Kext. Я не уверен, хочу ли я, чтобы мой клиент работал в привилегированном режиме (снова: дополнительный вектор атаки).Пусть kext будет подключен только к одному клиенту. Тем не менее, это легко обходимо.
В идеале, я хочу, чтобы проверить личность клиента, который подключается через static int ctl_connect(kern_ctl_ref ctl_ref, struct sockaddr_ctl *sac, void **unitinfo)
. Как я могу это сделать?
Я также могу выполнить аутентификацию пакетов в static int ctl_set(kern_ctl_ref ctl_ref, u_int32_t unit, void *unitinfo, int opt, void *data, size_t len)
, однако мне придется придумать динамический общий секрет. Я думал о secret = SHA256(getUDID())
, но AFAIK нет доступных криптографических KPI, ни пути к getUDID()
из kernelspace.
Есть ли другая идея в том, чтобы делать «правильную» аутентификацию клиентов?
Мне любопытно, как это сделать (и разрешать другие вызовы ядра). Один из вариантов - настроить выделенного непривилегированного пользователя для вашего демона и проверить UUID EUID процесса, пытающегося подключиться. Я не уверен, что это обязательно так, что Apple хочет, чтобы вы это сделали. В любом случае, я добавлю щедрость к этому, как только смогу, и, возможно, напишу запрос DTS, если никто не ответит. – pmdj
@pmdj Возможно, вы знаете способ захватить MAC-адрес из ядра или карты Ethernet или WiFi и использовать его в качестве динамического кода аутентификации? – Joseph
Я не уверен, насколько это безопасно, но вы можете найти экземпляры IOEthernetController и/или IOEthernetInterface всех Ethernet-устройств в системе и запросить их. Я не совсем уверен, как это поможет решить эту проблему, хотя MAC-адреса легко получить. – pmdj