在 mac 上测试用户批准内核扩展加载 (TN2459)

Test User Approval Kernel Extension Loading on mac (TN2459)

TN2459:https://developer.apple.com/library/content/technotes/tn2459/_index.html 介绍在 macOS High Sierra 下加载新的第三方内核扩展需要用户批准。

我想测试的 kext 已在升级到 High Sierra 之前加载,因此在升级后加载相同的 kext 不会触发我想要的用户批准流程进行测试。

内核扩展用户同意已启用:

$ spctl kext-consent status
Kernel Extension User Consent: ENABLED 

我删除了kext_policytable中kext对应的条目/private/var/db/SystemPolicyConfiguration/KextPolicy 在恢复模式下重启几次。但是当我加载kext时仍然没有触发用户批准流程。

我想知道策略信息是否缓存在其他地方,我是否需要为我的机器清除 NVRAM 或告诉 syspolicyd 清除其缓存?或者还有其他事情需要我做?

能够使用高 sierra 虚拟机对其进行测试。安装虚拟机的完整步骤是:https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10/

简而言之,您必须以恢复模式启动 (Mac+R) 并编辑 sqlite table /private/var/db/SystemPolicyConfiguration/KextPolicy

这个 table 可以在正常启动时以只读模式访问:

sqlite3 /private/var/db/SystemPolicyConfiguration/KextPolicy
sqlite> SELECT * FROM kext_policy;
sqlite> SELECT * FROM kext_load_history_v3;

您必须删除您的条目(恢复模式)并重新启动,就像这样(将 'G43BCU2T37' 替换为您的 team_id):

sqlite> DELETE FROM kext_policy WHERE team_id = 'G43BCU2T37';
sqlite> DELETE FROM kext_load_history_v3 WHERE team_id = 'G43BCU2T37';
sqlite> .exit

为避免每次重启,您可以更改 "System Integrity Protection" 配置(在恢复模式下):csrutil enable --without fs --no-internal。现在 kext_policy 可以从正常启动更改。

这里描述了整个过程:https://forums.developer.apple.com/thread/79172#248518