Арбитраж периферийных устройств USB в macOS

Фреймворк DiskArbitration в macOS предоставляет простой способ перехватывать монтирование томов и авторизовать его или нет с помощью DARegisterDiskMountApprovalCallback.

Я ищу что-то подобное для всех других USB-устройств, таких как устройства HID, сетевые интерфейсы и вообще все периферийные устройства USB.

Я двигаюсь в направлении IOKit: Введение в руководство по интерфейсу USB-устройства, и я вижу, как взаимодействовать с USB-устройством, но не могу найти ничего похожего на механизм арбитража.

Есть идеи? Расширение ядра не вариант.


обновление macOS 11

В macOS появилось новое событие AUTH под названием ES_EVENT_TYPE_AUTH_IOKIT_OPEN. Событие называется правильно, но копаясь в заголовках объектов, я финансирую:

/**
 * @brief Open a connection to an I/O Kit IOService
 *
 * @field user_client_type A constant specifying the type of connection to be
 *        created, interpreted only by the IOService's family.
 *        This field corresponds to the type argument to IOServiceOpen().
 * @field user_client_class Meta class name of the user client instance.
 *
 * This event is fired when a process calls IOServiceOpen() in order to open
 * a communications channel with an I/O Kit driver.  The event does not
 * correspond to driver <-> device communication and is neither providing
 * visibility nor access control into devices being attached.
 */
typedef struct {
    uint32_t user_client_type;
    es_string_token_t user_client_class;
    uint8_t reserved[64];
} es_event_iokit_open_t;

:(

Это разрушает мои планы:

The event does not correspond to driver <-> device communication and is neither providing visibility nor access control into devices being attached.

Любая идея о том, как получить информацию об устройстве другим способом?


person Kappe    schedule 09.10.2019    source источник


Ответы (2)


Начиная с macOS 10.15, вы можете использовать EndpointSecurity API для авторизации пользовательских клиентов IOKit, т. е. получать обратный вызов всякий раз, когда пользовательский процесс пытается IOServiceOpen().

Соответствующим событием для этого является ES_EVENT_TYPE_NOTIFY_IOKIT_OPEN/es_event_iokit_open_t.

Я не верю, что это каким-либо образом относится к клиентам в ядре, для тех, кому вам нужно идти по маршруту kext.

До 10.15 кекст был единственным вариантом в целом — API-интерфейс ядра инфраструктуры MAC имеет обратный вызов политики, аналогичный новому EndpointSecurity.

person pmdj    schedule 10.10.2019
comment
Спасибо, pmdj, я изучал ту же идею, но из моей интерпретации заголовков выглядит так, что x_NOTIFY_x — это только уведомление, а не событие авторизации (из developer.apple.com/documentation/endpointsecurity/), как вы думаете, можно ли разрешать или не разрешать такие события? - person Kappe; 11.10.2019
comment
Ты прав; бета-версия macOS 11 теперь содержит как минимум соответствующее событие AUTH. developer.apple.com/documentation/endpointsecurity/ - person pmdj; 02.09.2020
comment
Играя с событием ES_EVENT_TYPE_NOTIFY_IOKIT_OPEN, я вижу, что некоторые процессы, такие как systemstats и configd, уведомляются о подключении USB-накопителя. @pmdj вы случайно не знаете, как эти процессы подписываются на эти уведомления/получают их? - person craig65535; 04.09.2020
comment
Я думаю, что новый ES_EVENT_TYPE_AUTH_IOKIT_OPEN - это решение, которое я искал :) хорошо, спасибо @pmdj - person Kappe; 14.09.2020
comment
взгляните на мой macOS 11 update, не повезло с новым событием аутентификации. - person Kappe; 11.01.2021
comment
@Kappe да, это только для доступа к IOServiceOpen(). Это работает для драйверов чистого пользовательского пространства, но неудивительно, что программа пользовательского пространства не будет запрашиваться до того, как различным компонентам ядра будет разрешено взаимодействовать. Похоже, вы хотите иметь полный контроль над тем, соответствуют ли устройства их соответствующим драйверам ядра, DriverKit или пользовательского пространства. Такая сила доступна только внутри самого ядра. - person pmdj; 14.01.2021
comment
@pmdj с KEXT устарел, я больше не вижу жизнеспособного решения для защиты пользовательского устройства с аппаратной точки зрения ... в настоящее время вредоносное зарядное устройство USB-C может иметь возможности HID, хранения или беспроводной связи и не иметь способ анализ того, что аппаратное обеспечение на самом деле, кажется мне весьма важным. - person Kappe; 15.01.2021
comment
USB-кексты @Kappe действительно устарели, хотя я не уверен, что вы все еще можете заставить их загружаться в Big Sur, связав их с KPI, который не имеет эквивалента DriverKit. (они определенно будут загружаться с отключенным SIP, но это еще хуже для безопасности) Единственное, что я могу придумать, кроме kext, - это подать запрос на улучшение (предложение) помощнику обратной связи Apple, чтобы такой API был добавлен в EndpointSecurity. API. К сожалению, шансы на то, что они воздействуют на него, малы. - person pmdj; 15.01.2021
comment
С положительной стороны, macOS теоретически имеет встроенную защиту от атак HID-клавиатуры: если вы подключите новую клавиатуру, которую она раньше не видела, она не будет принимать нажатия клавиш и вместо этого показывает помощника по раскладке клавиатуры. Я не знаю, насколько легко это обойти с помощью устройства, притворяющегося клавиатурой Apple. - person pmdj; 15.01.2021

Не полный ответ, но похоже, что есть способ подписаться на уведомления устройства с помощью IOKit.

Apple предоставила ionotifyCB.c здесь: https://opensource.apple.com/source/IOKitUser/IOKitUser-502/ionotifyCB.c.auto.html

Он не собирается для меня как есть, но я смог заставить его работать с небольшими исправлениями:

@@ -23,5 +23,6 @@
 /*
-cc ionotifyCB.c -o /tmp/ion -Wall -Wno-four-char-constants -framework IOKit -undefined warning
+cc ionotifyCB.c -o /tmp/ion -Wall -Wno-four-char-constants -framework IOKit -framework CoreFoundation
 */
 
+#include <stdio.h>
 #include <ctype.h>
@@ -35,2 +36,3 @@
 #include <CoreFoundation/CFRunLoop.h>
+#include <IOKit/graphics/IOGraphicsLib.h>

person craig65535    schedule 04.09.2020
comment
Не эксперт в IOKit, и копание в коде кажется скорее уведомлением, чем запросом авторизации/арбитражом. @craig взгляните на мое обновление macOS 11 update в исходном вопросе. - person Kappe; 11.01.2021