macOS 10.15 から有効な EndpointSecurity API(SystemExtension.framework)

https://developer.apple.com/jp/system-extensions/

macOS 10.15 から、従来のカーネル拡張(KEXT)を使わずに、ユーザーランドで動作するソフトでシステムイベントを監視(おそらくイベントの許可/禁止も)できるようになった。



https://developer.apple.com/contact/request/system-extension/

まず Apple に SystemExtension.framework / EndpointSecurity API の使用リクエストを出し、許可される必要がある。


https://developer.apple.com/documentation/endpointsecurity

f:id:daisuke-t-jp:20200531152712p:plain:w400

プロジェクトで Endpoint Security API を使用するには、以下の2つをリンクする。

  • SystemExtension.framwork
  • libEndpointSecurity.tdb


f:id:daisuke-t-jp:20200531152915p:plain:w400

entitlements に com.apple.developer.endpoint-security.client = YES を設定する。

AppleAPI リクエストが許可されていないと、アプリがただしく起動しない。



従来の KEXT を使用してシステム監視(アンチウィルスソフトなど)する場合より SystemExtension.framework を使用するメリット

  • Kernel extension で機能を実現した場合、ソフトはカーネルランドで実行されるため、ソフトの処理が遅いと OS 全体も遅くなってしまうなど OS の安定性に関わる現象が起きる。その分、実装もシビアになる。
    • ユーザランド実行になるとここが、そこまでシビアではなくなる?
  • Kernel extension 由来のセキュリティ問題がある場合、カーネル空間でその問題は発生するので OS デベロッパApple)、ソフトデベロッパの責務の線引きが不明瞭になる。
    • カーネルランド、ユーザランド、それぞれのセキュリティレベルが線引きされた状態で、ソフトウェア開発ができる。



不明な点

https://developer.apple.com/documentation/endpointsecurity/client?language=objc

  • Endpoint Security API のサンプルコードをみると panic() 関数を呼んでいる
    • ユーザランドで動作するソフトだが、作法として kernel panic を発生させて良いのだろうか?
  • Kernel extension ではデバッグをするとき、同じモデル・OS の mac 2台を用意して、片方の mac で panic を発生させて、その状態でもう片方の mac で接続してデバッグ・・・という方法があったが、そのあたりのデバッグ方法もしやすい方に変わっているのだろうか