在mac OS X上挂载批准回调

时间:2014-12-30 09:40:59

标签: macos kernel-extension cfnetworking

我想在Mac OS X上授权USB / CD。现在我使用DiskArbitration框架将MountApprovalCallback置于用户模式。但这次回调的问题在于无法保证。 如果我得到回调,我使用CFUserNotificationReceiveResponse()来接受用户的密码。 但是当同时显示提示时,用户可以打开DiskUtility并可以挂载设备

所以,

  1. 是否有其他方法可以获得挂载审批回调或授权设备?
  2. 我如何在内核模式下处理它?<​​/ li>

    提前致谢。

1 个答案:

答案 0 :(得分:1)

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

有了这个,这就是你实际使用它的方式:

  • 您需要链接MAC框架KPI,因此请将com.apple.kpi.dsep添加到您的kext的OSBundleLibraries字典中。 (它使用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_UNLOADOKmpc_name至您的kext的反向DNS标识符,mpc_fullname到人类可读的字符串,并将其他所有内容归零。
  • 您将立即开始接收对回调的调用,可能同时来自多个线程和进程,因此确保使您的回调线程安全
  • 在卸载之前,您的kext需要使用mac_policy_unregister()以及您从mac_policy_register()收到的句柄取消注册。

可以找到更多信息in the header file