macOSのKextの許可状態の取得

Apple Silicon Macではセキュリティポリシーが導入され、サードパーティのKextはやや複雑な手段を経なければ使用できなくなりました。ユーザーから見れば複雑、デベロッパーから見ればKextを使わざるを得ないにも関わらず、イメージが悪く、難しい操作をユーザーに強いることになります。複雑な操作であるため、正しく許可されていないという状況が生まれてしまうのも致し方無い状況です。

この記事では、Kextが壊れていてロードできないのか、正しい手順で許可されていないのかを取得する方法について解説します。

目次

Kextの読み込み要求を行う

Kextと通信ができる状態になっているかや、Kextが適切にロードされているかを調べる方法にはいくつかあります。例えば、IOUserClientを使用して実際に通信ポートを開く方法や、IOKitのレジストリを調べてロードされているか確認する方法です。

調べた結果、読み込まれていない場合には、読み込み要求を行います。読み込み要求はKextManagerの以下の2つの関数が使用可能です。

  • KextManagerLoadKextWithIdentifier
  • KextManagerLoadKextWithURL

これだけであれば簡単なのですが、どちらの関数も実行するには管理者権限が必要で、使用するための準備が大変です。

管理者権限への昇格

KextManagerの関数を実行するには次のようにします。

STEP
プログラムを分割する

プログラムを管理者権限が必要な部分と、その他の不要な部分に分割します。GUIも管理者権限は不要な部分に入れます。

管理者権限が必要な部分はデーモンとして実装します。

STEP
Service Managmentフレームワークを使って管理者権限の認証を行う

Service Managementフレームワークのクラスや関数を使い、管理者権限の認証を行います。認証に成功したら、デーモンをシステムに登録します。登録したデーモンはスーパーユーザーで実行されます。

Service Managementフレームワークには、SMAppServiceクラスとSMJobBless関数を実装しています。macOS 13未満はSMJobBless関数を使用します。macOS 13以降はSMAppServiceクラスを使用します。

SMJobBless関数はmacOS 13でDeprecatedに指定されました。

STEP
プロセス間通信でデーモンに指示を出す

GUIプログラムから必要なタイミングで、デーモンに指示を出し、デーモンからKextManagerの関数を使ってKextの読み込み要求を行います。

プロセス間通信には低レベルのプロセス間通信を使用する必要があります。。SMJobBless関数のサンプルコードではソケットを使用しています。SMAppServiceクラスのサンプルコードではXPCを使用しています。

サンプルコード

SMAppServiceクラスのサンプルコードは以下の場所に公開されています。デーモンではなくエージェントのサンプルですが、同様の方法でデーモンもできると思います。(筆者は未確認ですが)

SMJobBless関数のサンプルコードは以下の場所に公開されています。

許可状態の判定

KextManagerのKextの読み込み関数の戻り値をチェックすることで、ユーザーの許可状態を判定できます。

Kextの状態戻り値定数ヘッダファイル
未インストール0xDC008001kOSKextReturnInternalErrorOSKextLib.h
セキュリティポリシーが「完全なセキュリティ」のため、未許可0xDC00801BkOSKextReturnSystemPolicyOSKextLib.h
セキュリティポリシーが「低セキュリティ」だが、未許可0xDC00801BkOSKextReturnSystemPolicyOSKextLib.h
セキュリティポリシーが「低セキュリティ」かつ、許可済み0x00000000kOSReturnSuccessOSReturn.h
戻り値

それ以外のエラーについても、OSKextLib.hに定義されています。

簡易判定で良い場合もある

ここまで書いておいて何ですが、結構大変です。簡易判定という方法もあります。例えば、次のような方法です。

状況判定
Kextがインストールされていない不正インストール
Kextがあるが読み込まれないユーザーが許可していない
簡易判定の判定テーブル

この方法では、Kextが壊れていて読み込まれないや、ユーザーが自分でファイルコピーしたなどは判定できませんが、多くの場合は問題ないでしょう。

おまけの効用

Apple Silicon Macで強化されたKextのブロックですが、ちょっと不安定なところがあります。例えば、セキュリティポリシーを下げて許可してから、再び、完全セキュリティにしてから、再度、低セキュリティにするとKextが許可されないことがあります。この場合、許可ボタンも表示されません。

似たような状況で、許可する前にKextを再インストールすると、許可ボタンが消えて、再表示されないこともあります。

上記の現象は必ず再現するということではありませんが、何度か遭遇しています。

このようなときに、KextManagerの読み込み要求関数が実行されると、システムがKextの存在に気づき、許可ボタンが表示されるようになったり、ブロックダイアログが表示されたりして、システムが本来の状態に復帰します。

実装するのは大変ですが、良い面もあります。

ちなみに以下の手順でも復活することが多いです。

  1. Kextを削除する。
  2. 再起動する。
  3. Kextを再インストールする。
  4. 再起動する。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次