IOKitLib
IOKitLib — это системная библиотека (динамически загружаемый модуль) в операционной системе macOS (и её предшественнице Mac OS X), предоставляющая интерфейс для взаимодействия пользовательских приложений с подсистемой I/O Kit (Input/Output Kit). I/O Kit, в свою очередь, является объектно-ориентированным фреймворком ядра XNU (ядро macOS), отвечающим за управление драйверами устройств и работой с оборудованием. Библиотека IOKitLib позволяет программам, работающим в пространстве пользователя (user space), выполнять такие операции, как поиск устройств, получение их свойств, отправка команд драйверам и обработка событий от устройств, не требуя написания собственного кода ядра.
История и происхождение
I/O Kit был разработан компанией Apple Inc. в конце 1990-х годов для операционной системы Mac OS X (выпущена в 2001 году), которая базировалась на ядре XNU, сочетающем компоненты Mach и FreeBSD. До появления I/O Kit в классической Mac OS (до версии 9) управление драйверами было менее структурированным и часто требовало написания расширений непосредственно для ядра. I/O Kit был создан как современная, объектно-ориентированная среда, написанная на подмножестве C++ (с ограничениями, накладываемыми средой ядра). Библиотека IOKitLib была реализована как интерфейс для доступа к этой среде из пользовательских приложений. Она предоставляет функции на языке C, которые оборачивают вызовы к ядру через механизм Mach IPC (межпроцессное взаимодействие Mach). С момента своего появления IOKitLib остаётся ключевым компонентом для разработки утилит, диагностических инструментов и приложений, взаимодействующих с оборудованием на macOS.
Архитектура и принцип работы
Связь с I/O Kit
I/O Kit в ядре организован как иерархия объектов, представляющих устройства, драйверы, контроллеры и другие сущности. Каждый объект в I/O Kit имеет уникальный идентификатор (io_object_t) и набор свойств, доступных через словарь (CFDictionaryRef). IOKitLib предоставляет функции для поиска этих объектов, открытия сессий (сессии — это контекст взаимодействия с ядром для конкретного процесса) и выполнения операций.
Основные типы данных
- io_service_t — тип, представляющий сервис (устройство или драйвер) в I/O Kit.
- io_connect_t — дескриптор соединения с драйвером, через который можно отправлять команды и получать данные.
- io_iterator_t — итератор для перебора списка объектов, найденных по заданным критериям.
- mach_port_t — порт Mach, используемый для межпроцессного взаимодействия с ядром.
Основные функции
IOKitLib содержит несколько десятков функций, которые можно разделить на группы:
- Управление сессиями:
IOMasterPort(),IOServiceGetMatchingServices(). - Поиск устройств:
IOServiceMatching(),IOServiceNameMatching(),IOBSDNameMatching(). - Работа с объектами:
IOObjectRelease(),IOObjectRetain(),IOObjectConformsTo(). - Получение свойств:
IORegistryEntryCreateCFProperties(),IORegistryEntryGetProperty(). - Открытие и закрытие соединений:
IOServiceOpen(),IOServiceClose(). - Отправка команд:
IOConnectCallMethod(),IOConnectCallScalarMethod(),IOConnectCallStructMethod(). - Работа с памятью:
IOConnectMapMemory(),IOConnectUnmapMemory().
Механизм вызова
Вызов функций IOKitLib обычно приводит к отправке сообщения через порт Mach к серверу I/O Kit в ядре. Ядро обрабатывает запрос, выполняет операции с драйверами и возвращает результат. Это обеспечивает безопасность, так как пользовательское приложение не имеет прямого доступа к памяти ядра.
Применение
Диагностика и мониторинг системы
IOKitLib широко используется в системных утилитах macOS, таких как System Information (Системная информация) и Console (Консоль), для отображения информации об устройствах (например, видеокартах, контроллерах USB, дисках). Программы, подобные ioreg (команда терминала), также используют IOKitLib для вывода полного реестра устройств I/O Kit.
Разработка драйверов и утилит
Разработчики, создающие драйверы для macOS, часто используют IOKitLib для тестирования и отладки. Например, драйвер для видеокарты или аудиоустройства может предоставлять пользовательский интерфейс через IOKitLib, позволяя приложениям настраивать параметры.
Безопасность и вредоносное ПО
Из-за возможности доступа к низкоуровневым данным об оборудовании и драйверах, IOKitLib иногда используется в вредоносном программном обеспечении для macOS. Например, некоторые трояны и кейлоггеры могут использовать функции IOKitLib для перехвата ввода с клавиатуры или мониторинга активности устройств. В ответ на это Apple усилила ограничения безопасности, введя систему разрешений (например, запрос на доступ к «Вводу с клавиатуры» в настройках конфиденциальности).
Пример использования
Типичный сценарий работы с IOKitLib включает следующие шаги:
- Получение главного порта Mach с помощью
IOMasterPort(). - Создание словаря соответствия (matching dictionary) с помощью
IOServiceMatching()для поиска определённого класса устройств (например,IOUSBDevice). - Получение итератора с помощью
IOServiceGetMatchingServices(). - Перебор объектов с помощью
IOIteratorNext(). - Для каждого объекта получение свойств через
IORegistryEntryCreateCFProperties(). - Освобождение ресурсов с помощью
IOObjectRelease().
Ограничения и безопасность
Права доступа
Начиная с macOS 10.14 (Mojave) и более поздних версий, Apple ввела строгие ограничения на доступ к некоторым функциям IOKitLib. Например, для доступа к данным о вводе с клавиатуры, микрофона или камеры требуется явное разрешение пользователя через системные настройки. Это сделано для предотвращения утечки конфиденциальной информации.
Защита целостности системы (SIP)
System Integrity Protection (SIP) ограничивает возможности модификации системных файлов и драйверов. IOKitLib не может использоваться для изменения защищённых объектов I/O Kit без отключения SIP.
Ошибки и уязвимости
Как и любой интерфейс, IOKitLib может содержать уязвимости. В прошлом были обнаружены ошибки, позволяющие повышение привилегий (например, CVE-2019-8605, «SockPuppet»), которые эксплуатировали недостатки в обработке вызовов IOKitLib. Apple регулярно выпускает обновления безопасности для устранения таких проблем.
Альтернативы и аналоги
В других операционных системах существуют аналогичные механизмы:
- В Linux роль
IOKitLibотчасти выполняет интерфейс ioctl (системный вызов для управления устройствами) и библиотеки libudev (для работы с устройствами и их свойствами). - В Windows аналогом является Windows Driver Model (WDM) и библиотека SetupAPI, а также WinUSB для взаимодействия с USB-устройствами.
- В BSD-системах используется devfs и системные вызовы, подобные
ioctl.
Интересные факты
IOKitLibявляется частью открытого исходного кода Apple (Darwin), и её код доступен на официальном сайте Apple Open Source.- Библиотека написана на C, но часто используется в проектах на Objective-C и Swift через обёртки (например, в фреймворке
IOKitв Swift). - Команда
ioregв терминале macOS, использующаяIOKitLib, может выводить тысячи строк информации о всех устройствах, подключённых к системе.
Источники
- Apple Inc. I/O Kit Fundamentals. Документация разработчика Apple.
- Apple Inc. IOKitLib Reference. Документация разработчика Apple.
- Singh, Amit. Mac OS X Internals: A Systems Approach. Addison-Wesley, 2006.
- CVE-2019-8605: Apple macOS SockPuppet Vulnerability. National Vulnerability Database.
- Документация к проекту Darwin (opensource.apple.com).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →