1

我正在尝试开发一个 MAC(强制访问控制)策略模块,我正在尝试实现 MAC API“mac_iokit_check_device”。我能够构建一个实现 mac_iokit_check_device API 的 MAC 策略模块 kext,并且我能够加载 kext。但是,使用此策略模块 API 的驱动程序 kext 存在问题。它正在正确编译。但无法解析符号“_mac_iokit_check_device”。我使用的驱动程序kext的依赖库如下。

<key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOUSBFamily</key>
        <string>5.5.5</string>
        <key>com.apple.kpi.mach</key>
        <string>12.3</string>
        <key>com.apple.kpi.unsupported</key>
        <string>12.3</string>
        <key>com.apple.kpi.iokit</key>
        <string>12.3</string>
        <key>com.apple.kpi.libkern</key>
        <string>12.3</string>
        <key>com.apple.kpi.bsd</key>
        <string>12.3</string>
        <key>com.apple.kpi.dsep</key>
        <string>12.3</string>
    </dict>

奇怪的是,似乎没有一个 kpi 库定义了符号 _mac_iokit_check_device。我通过运行命令推断出这一点

find /System/Library/Extensions/System.kext/PlugIns -type f |
    grep -v plist | xargs nm | sort | uniq | grep _mac_iokit_check_device

然而,内核映像似乎有符号,正如推断的那样

nm /mach_kernel|grep mac_iokit_check

有什么办法可以解决驱动程序 kext 中这个未解决的符号问题?在这个问题上的任何帮助/指针将不胜感激。

4

1 回答 1

3

不导出它的原因是因为您不应该使用它。MACF 导出 policy_register 并取消注册:

bash-3.2# nm /System/Library/Extensions/System.kext/PlugIns/MACFramework.kext/MACFramework  | grep mac_po
                 U _mac_policy_register
                 U _mac_policy_unregister

并且您应该在给定的策略中将您的 iokit_ 调用实现为回调。具体实施:

typedef int mpo_iokit_check_device_t(
        char *devtype,
        struct mac_module_data *mdata
);

作为:

struct mac_policy_ops {
 ...
   mpo_iokit_check_device_t                *mpo_iokit_check_device;
...

驱动程序不调用此函数:I/O Kit 将 MACF 获取到 (security/mac_iokit.c)

mac_iokit_check_device(char *devtype, struct mac_module_data *mdata)
{
        int error;

        MAC_CHECK(iokit_check_device, devtype, mdata);
        return (error);
}

仅供参考,内核代码不直接调用 check_device - 它确实调用 iokit_check_open (iokit/Kernel/IOUserClient.cpp),但不是 check_device (至少不在核心 IOKit 中 - 它可能来自某些 IO 系列)。前者也被警告为实验性的,而后者不是——所以我们建议使用它。

不管怎样,只要将它作为你的策略的一部分来实现,mac_register_policy() 就可以了。

于 2013-06-22T15:39:23.923 回答