1

MAC API "mac_iokit_check_device" を実装しようとしている MAC (Mandatory Access Control) ポリシー モジュールを開発しようとしています。mac_iokit_check_device API を実装する MAC ポリシー モジュール kext を構築でき、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 でこの未解決のシンボルの問題を解決する方法はありますか? この問題のヘルプ/ポインタは大歓迎です。

4

1 に答える 1

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() を実行するだけで完了です。

于 2013-06-22T15:39:23.923 に答える