如何在IOKit内核扩展中使用TrustedBSD的MAC策略?
我已经有一个有效的IOKit扩展,我想为它添加一些策略。
为了进行测试,我编写了两个虚拟扩展,一个使用IOKit,另一个使用通用扩展
通用扩展正在完美运行,而IOKit正在为符号mac_policy_register
和mac_policy_unregister
生成链接错误。
$ sudo kextutil -tn /tmp/MACPolicy.kext
kxld[com.Test.MACPolicy]: The following symbols are unresolved for this kext:
kxld[com.Test.MACPolicy]: mac_policy_register(mac_policy_conf*, unsigned int*, void*)
kxld[com.Test.MACPolicy]: mac_policy_unregister(unsigned int)
Link failed (error code 5).
Check library declarations for your kext with kextlibs(8).
$ sudo kextlibs -v 6 -undef-symbols /tmp/MACPolicy.kext
Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Kext library architecture is x86_64 (unchanged).
For all architectures:
com.apple.kpi.iokit = 15.4
com.apple.kpi.libkern = 15.4
For x86_64:
2 symbols not found in any library kext:
__Z21mac_policy_unregisterj
__Z19mac_policy_registerP15mac_policy_confPjPv
我已将指定的库添加到Info.plist
,com.apple.kpi.dsep
,com.apple.kpi.unsupported
,com.apple.kpi.mach
或其中的任意组合,但未成功。
我能找到的有关此问题的所有信息都是thread on the darwin-kernel讨论列表。
我目前正在以OS X 10.11为目标。
答案 0 :(得分:2)
你应该知道,尽管基于 OS X v10.11 API Diffs Kernel Changes for Objective-C
,此功能已正式添加 不幸,从 High Sierra(10.13)开始 MAC政策API对第三方开发者完全关闭。 Apple从自己的文档中删除了mac_policy_register
,mac_policy_unregister
,mac_policy_conf
,mac_policy_ops
以及其他主要MAC政策部分的所有引用。
答案 1 :(得分:1)
注意丢失的符号是如何被破坏的,就好像它们是C ++函数一样,但问题中的函数实际上是普通的C函数。这意味着当您从C ++调用它们时,它们会使用缺少extern "C"
链接说明符的声明。 MAC标头不考虑C ++,因此当从.cpp文件中包含它们时,您需要明确地将它们包装在extern "C"
块中,如下所示:
extern "C" {
#include <security/mac_policy.h>
}
如果您的#include
位于混合的C / C ++头文件中,您需要像往常一样使用#ifdef __cplusplus
以C ++编译为条件。