我正在尝试开发一个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中解决这个未解决的符号问题? 非常感谢本期杂志中的任何帮助/指针。
答案 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()就可以了,您将完成。