mpo_mount_check_mount
kext では、MAC (TrustedBSD) ポリシー フレームワークのコールバックを介して、ファイル システム マウント コールバックの認証コールバックを取得できます。そこでマウントを進めるかどうかを決めることができます。cred
マウント syscall はおそらく root として実行されているデーモンによって開始されるため、ログインしているユーザーに関する情報を引数から取得することはできないと思います。あなたが実際に何をしようとしているのかわからないので、これはあなたの特定のケースの問題に取り組むための最良の方法ではないかもしれません.
/**
@brief Access control check for mounting a file system
@param cred Subject credential
@param vp Vnode that is to be the mount point
@param vlabel Label associated with the vnode
@param cnp Component name for vp
@param vfc_name Filesystem type name
Determine whether the subject identified by the credential can perform
the mount operation on the target vnode.
@return Return 0 if access is granted, otherwise an appropriate value for
errno should be returned.
*/
typedef int mpo_mount_check_mount_t(
kauth_cred_t cred,
struct vnode *vp,
struct label *vlabel,
struct componentname *cnp,
const char *vfc_name
);
これはサポートされていないKPI であるため、Apple は将来のリリースでなくなるか壊れる可能性があると述べています。実際、ポリシー コールバック関数のシグネチャは OS X のメジャー リリース間で頻繁に変更されるため、実行時に OS X のバージョンを確認し、バージョンごとに異なる関数を使用する必要がある場合があります。また、Apple がリリースするベータ版を最新の状態に保ち、コードが壊れていないかどうかを確認する必要があります。
邪魔にならないので、実際に使用する方法は次のとおりです。
- MAC フレームワーク KPI にリンクする必要があるため
com.apple.kpi.dsep
、kext の OSBundleLibraries ディクショナリに追加します。(darwin のバージョン管理を使用するため、他の com.apple.kpi.* バンドルと同じバージョンを使用します)
#include <security/mac_policy.h>
コード内 (Kernel.framework で既に提供されています)
- グローバル変数を作成するか、起動時にメモリを割り当てて を保持し
struct mac_policy_ops
、関心のある関数ポインタ フィールドを初期化しますmpo_mount_check_mount
。
- kext が起動したら、 を使用してポリシーを登録し、
mac_policy_register()
返されたハンドルを保存します。mac_policy_conf
構造体を使用してポリシーを構成する必要があります。ここではmpc_ops
、ポリシー構造体、 、kext の逆引き DNS 識別子、人間が読み取れる文字列を指すように設定し、その他mpc_loadtime_flags
すべてをゼロで初期化します。MPC_LOADTIME_FLAG_UNLOADOK
mpc_name
mpc_fullname
- おそらく多くのスレッドやプロセスから同時に、コールバックへの呼び出しをすぐに受け取り始めるので、必ずコールバックをスレッドセーフにしてください。
- アンロードする前に、kext は と
mac_policy_unregister()
から受け取ったハンドルを使用して登録を解除する必要がありますmac_policy_register()
。
ヘッダー ファイルには、さらに多くの情報があります。