2

Mac OS X で USB/CD を認証したいのですが、DiskArbitration フレームワークを使用して、ユーザー モードで MountApprovalCallback を取得しています。しかし、このコールバックの問題は、その保証がないことです。そして、コールバックを取得する場合CFUserNotificationReceiveResponse()、ユーザーからパスワードを受け入れるために使用しています。ただし、プロンプトが同時に表示された場合、ユーザーは DiskUtility を開いてデバイスをマウントできます

そう、

  1. マウント承認コールバックを取得したり、デバイスを承認したりする他の方法はありますか?
  2. カーネルモードでどのように処理できますか?

前もって感謝します。

4

1 に答える 1

1

mpo_mount_check_mountkext では、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_UNLOADOKmpc_namempc_fullname
  • おそらく多くのスレッドやプロセスから同時に、コールバックへの呼び出しをすぐに受け取り始めるので、必ずコールバックをスレッドセーフにしてください
  • アンロードする前に、kext は とmac_policy_unregister()から受け取ったハンドルを使用して登録を解除する必要がありますmac_policy_register()

ヘッダー ファイルには、さらに多くの情報があります。

于 2015-01-03T12:36:27.740 に答える