Открыть сервис

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 включает следующие шаги:

  1. Получение главного порта Mach с помощью IOMasterPort().
  2. Создание словаря соответствия (matching dictionary) с помощью IOServiceMatching() для поиска определённого класса устройств (например, IOUSBDevice).
  3. Получение итератора с помощью IOServiceGetMatchingServices().
  4. Перебор объектов с помощью IOIteratorNext().
  5. Для каждого объекта получение свойств через IORegistryEntryCreateCFProperties().
  6. Освобождение ресурсов с помощью 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 →