Монтирование обратного вызова для утверждения в Mac OS X

Я хочу авторизовать USB/CD на Mac OS X. Теперь я использую инфраструктуру DiskArbitration, чтобы получить MountApprovalCallback в пользовательском режиме. Но проблема с этим обратным вызовом состоит в том, что нет уверенности в этом. И если я получу обратный звонок, я использую CFUserNotificationReceiveResponse() принять пароль от пользователя. Но когда отображается приглашение, пользователь может открыть DiskUtility и смонтировать устройство.

Так,

  1. Есть ли другой способ получить обратный вызов для подтверждения подключения или авторизовать устройство?
  2. Как я могу справиться с этим в режиме ядра?

Заранее спасибо.

1 ответ

В kext вы можете получить обратный вызов авторизации для обратных вызовов монтирования файловой системы через mpo_mount_check_mount обратный вызов в структуре политики MAC (TrustedBSD). Вы можете решить, будет ли крепление идти вперед или нет. Я подозреваю, что вы не получите никакой информации о зарегистрированном пользователе от cred аргумент, так как монтирование syscall, вероятно, инициируется демоном, работающим от имени пользователя root. Я не знаю, что вы на самом деле пытаетесь сделать, так что, возможно, это не лучший способ подойти к проблеме в вашем конкретном случае.

/**
  @brief Access control check for mounting a file system
  @param cred Subject credential
  @param vp Vnode that is to be the mount point
  @param vlabel Label associated with the vnode
  @param cnp Component name for vp
  @param vfc_name Filesystem type name

  Determine whether the subject identified by the credential can perform
  the mount operation on the target vnode.

  @return Return 0 if access is granted, otherwise an appropriate value for
  errno should be returned.
*/
typedef int mpo_mount_check_mount_t(
    kauth_cred_t cred,
    struct vnode *vp,
    struct label *vlabel,
    struct componentname *cnp,
    const char *vfc_name
);

Обратите внимание, что это неподдерживаемый KPI, поэтому Apple заявляет, что он может исчезнуть или сломаться в будущем выпуске. Действительно, сигнатуры функций обратного вызова политики часто меняются между основными выпусками OS X, поэтому вам может потребоваться проверить версию OS X во время выполнения и использовать разные функции для разных версий. Вам также нужно быть в курсе всех бета-версий Apple, чтобы проверить, не нарушат ли они ваш код.

С этим из пути, вот, как вы фактически используете это:

  • Вам нужно будет связать с KPI инфраструктуры MAC, поэтому добавьте com.apple.kpi.dsep в словарь OSBundleLibraries вашего kext. (он использует версионирование darwin, поэтому используйте ту же версию, что и для других пакетов com.apple.kpi. *)
  • #include <security/mac_policy.h> в вашем коде (это уже предусмотрено в Kernel.framework)
  • Создайте глобальную переменную или выделите некоторую память при запуске для хранения struct mac_policy_ops и инициализируйте любые интересующие вас поля указателя на функцию, например mpo_mount_check_mount,
  • Когда ваш kext запустится, зарегистрируйте свою политику, используя mac_policy_register() и сохраните ручку, которую он возвращает. Вам нужно будет настроить свою политику, используя mac_policy_conf структура, где вы устанавливаете mpc_ops указать на вашу структуру политики, mpc_loadtime_flags в MPC_LOADTIME_FLAG_UNLOADOK, mpc_name к идентификатору обратного DNS для вашего kext, mpc_fullname в удобочитаемую строку, и инициализировать нулем все остальное.
  • Вы сразу же начнете получать вызовы ваших обратных вызовов, возможно, одновременно из многих потоков и процессов, поэтому убедитесь, что ваши обратные вызовы безопасны.
  • Перед разгрузкой ваш kext необходимо отменить регистрацию с помощью mac_policy_unregister() и ручка, которую вы получили от mac_policy_register(),

Гораздо больше информации можно найти в заголовочном файле.

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