Монтирование обратного вызова для утверждения в Mac OS X
Я хочу авторизовать USB/CD на Mac OS X. Теперь я использую инфраструктуру DiskArbitration, чтобы получить MountApprovalCallback в пользовательском режиме. Но проблема с этим обратным вызовом состоит в том, что нет уверенности в этом. И если я получу обратный звонок, я использую CFUserNotificationReceiveResponse()
принять пароль от пользователя. Но когда отображается приглашение, пользователь может открыть DiskUtility и смонтировать устройство.
Так,
- Есть ли другой способ получить обратный вызов для подтверждения подключения или авторизовать устройство?
- Как я могу справиться с этим в режиме ядра?
Заранее спасибо.
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()
,
Гораздо больше информации можно найти в заголовочном файле.