符号存在于mach_kernel中,但不存在于任何kpi中

时间:2013-06-18 18:48:07

标签: macos kernel kernel-extension

我正在尝试开发一个MAC(强制访问控制)策略模块,我正在尝试实现MAC API“mac_iokit_check_device”。我能够构建一个MAC策略模块kext,它实现了mac_iokit_check_device API并且我能够加载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中解决这个未解决的符号问题? 非常感谢本期杂志中的任何帮助/指针。

1 个答案:

答案 0 :(得分: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()就可以了,您将完成。