2016-05-13 73 views
1

如何在IOKit內核擴展中使用來自TrustedBSD的MAC策略?IOKit和TrustedBSD策略

我已經有一個工作IOKit擴展,我想添加一些策略。

爲了測試,我寫了兩個虛擬擴展,一個使用IOKit和一個通用擴展。
通用擴展工作完美,同時由於IOKit之一被生成鏈路錯誤的符號和mac_policy_registermac_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.dsepcom.apple.kpi.unsupportedcom.apple.kpi.mach或其任意組合,沒有成功。

所有我能找到這個信息是這樣的thread on the darwin-kernel討論列表。

我針對OS X 10.11現在。

回答

1

通知書丟失的符號是如何錯位,好像他們是C++的功能,但在問題的函數實際上是簡單的C函數。這意味着當你從C++調用它們時,它們使用的是缺少extern "C"鏈接說明符的聲明。該MAC頭不考慮C++,所以從.cpp文件,包括他們的時候,你需要用他們在extern "C"塊明確的,就像這樣:

extern "C" { 
#include <security/mac_policy.h> 
} 

如果您#include是一個混合的C/C++頭文件,你需要像往常一樣使用#ifdef __cplusplus來使它成爲C++編譯的條件。

+0

我現在還在這個[註釋]上發現了這個問題(http://stackoverflow.com/questions/27702967/mount-approval-callback-on-mac-os-x#comment53763572_27754917) – MathPlayer

1

你應該知道,儘管事實上,這個功能被正式加入,基於OS X v10.11 API的diffKernel Changes for Objective-C

enter image description here

不幸的是,從開始高Sierra(10.13) MAC策略API對於第三方開發人員完全關閉。蘋果刪除了所有引用的mac_policy_registermac_policy_unregistermac_policy_confmac_policy_ops,並從自己的單證等主要MAC政策部分。

+0

你從哪裏得到這個信息從? – MathPlayer

+0

本機「包含」不再從High Sierra(10.13)開始工作,從SDK 10.13中刪除了「mac_policy.h」頭。有關MAC策略的任何信息已在Xcode 9文檔和Apple開發人員門戶中刪除。 –