2

我想在 Mac OS X 上授权 USB/CD。现在我正在使用 DiskArbitration 框架在用户模式下获取 MountApprovalCallback。但是这个回调的问题是没有保证。如果我会收到回调,我将使用CFUserNotificationReceiveResponse()它来接受用户的密码。但是当同时显示提示时,用户可以打开 DiskUtility 并可以挂载设备

所以,

  1. 有没有其他方法可以获取挂载批准回调或授权设备?
  2. 我如何在内核模式下处理它?

提前致谢。

4

1 回答 1

1

mpo_mount_check_mount在 kext 中,您可以通过MAC (TrustedBSD) 策略框架中的回调获取文件系统挂载回调的授权回调。你可以决定坐骑是否应该继续前进。我怀疑您不会从cred参数中获得有关登录用户的任何信息,因为 mount 系统调用可能是由以 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 发布的任何测试版,以查看它们是否会破坏您的代码。

顺便说一句,这就是你实际使用它的方式:

  • 您需要链接 MAC 框架 KPI,因此添加com.apple.kpi.dsep到您的 kext 的 OSBundleLibraries 字典中。(它使用 darwin 版本控制,因此使用与其他 com.apple.kpi.* 捆绑包相同的版本)
  • #include <security/mac_policy.h>在您的代码中(它已在 Kernel.framework 中提供)
  • 创建一个全局变量,或在启动时分配一些内存来保存 a 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您的 kext 的反向 DNS 标识符、mpc_fullname指向人类可读的字符串,并对其他所有内容进行零初始化。
  • 您将立即开始接收对回调的调用,可能同时来自许多线程和进程,因此请确保您的回调线程安全
  • 在卸载之前,您的 kext 需要使用mac_policy_unregister()您从mac_policy_register().

在头文件中可以找到更多信息。

于 2015-01-03T12:36:27.740 回答