2013-06-18 3 views
1

Я пытаюсь разработать модуль политики MAC (Mandatory Access Control), где я пытаюсь реализовать API MAC «mac_iokit_check_device». Я могу построить модуль политики MAC kext, который реализует mac_iokit_check_device API, и я могу загрузить kext. Но драйвер kext, который использует этот API-интерфейс с политикой, имеет проблемы. Он компилируется должным образом. Но не удается разрешить символ «_mac_iokit_check_device». Библиотеки зависимостей драйвера kext, который я использовал, приведены ниже.Символ присутствует в mach_kernel, но не в любом kpi

<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> 

Любопытно, что ни один из КПЭ библиотек не кажется, определяет символ _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 драйвера? Любая помощь/указатель в этом выпуске будет принята с благодарностью.

ответ

2

Причина, по которой это не экспортируется, заключается в том, что вы не должны ее использовать. 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 к (безопасность/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); 
} 

FYI, код ядра напрямую не вызывает check_device - он вызывает iokit_check_open (iokit/Kernel/IOUserClient.cpp), но не check_device (по крайней мере, не в ядре IOKit - это может быть из некоторого семейства IO). Первый также предупреждается быть экспериментальным, в то время как последний - нет, поэтому мы бы предложили его использовать.

Будь то, что может, просто реализуй его как часть своей политики, mac_register_policy(), и все будет готово.

+0

Спасибо за помощь. Я имел в виду код SEDarwin для модуля политики выборки, и был добавлен другой kext, который назывался API «mac_iokit_check_device». Это заставило меня поверить, что API-интерфейсы API-модулей необходимо вызывать из другого kext. Я пытаюсь реализовать контроль доступа к устройству и подключая устройство, поддерживаемое iokit, я пытаюсь применить политику. Теперь я реализовал iokit_check_open и вызывается всякий раз, когда обнаружено устройство (во время других действий iokit). Я пытаюсь понять, как этот API можно использовать для обеспечения соблюдения политики доступа к устройствам. Еще раз спасибо. – ramkumarhn