苹果操作系统高级版High Sierra KEXT加载 - 有没有取消用户批准的方法?

14

正如某些MacOS开发人员所知,苹果实施了安全内核扩展加载

用户可以通过单击“安全性与隐私”中的“批准”按钮来批准第三方KEXT。但是,一旦批准了KEXT,是否有任何取消批准的方法?

想象一下,测试具有KEXT加载等功能的应用程序的情况。

如果没有其他方法而只能进行干净安装,则很难测试应用程序。


我发现最简单的方法是在macOS 10.13上设置一个新的虚拟机并拍摄快照。测试您需要的内容,包括批准kext,然后完成后回滚到快照。不幸的是,这对于无法通过到虚拟机的设备的驱动程序没有帮助。 - pmdj
糟糕,黑苹果了!真的很遗憾,我的KEXT只能与USB设备一起工作... - HirofumiTamori
我不确定这与Hackintosh有什么关系?VMWare Fusion可以将许多USB设备从主机Mac传递到客户VM。它并不适用于所有类型的硬件,但对于某些硬件是有效的。 - pmdj
时间机器可以恢复KEXT的权限状态。 - HirofumiTamori
至少在我尝试这种方法的时候,它是有效的。但是,这是一种肮脏的黑科技(未经记录,不是官方开放的),此外MacOS已经升级到了Mojave,苹果可能会改变kext管理方法。 - HirofumiTamori
显示剩余2条评论
2个回答

24

批准相关信息存储在sqlite3数据库中:

/var/db/SystemPolicyConfiguration/KextPolicy

你感兴趣的表格是:kext_policykext_load_history_v3。例如,以下是查看数据和表结构的方法:

sqlite3 /var/db/SystemPolicyConfiguration/KextPolicy

sqlite> select * from kext_policy;
54GTJ2AU36|com.joshuawise.kexts.HoRNDIS|1|Joshua Wise|1

sqlite> .schema kext_policy
CREATE TABLE kext_policy ( team_id TEXT, bundle_id TEXT, allowed BOOLEAN, developer_name TEXT, flags INTEGER, PRIMARY KEY (team_id, bundle_id) );

删除批准比较棘手,因为系统完整性保护不允许您修改数据库。所以,您需要重新启动到恢复分区或不同的MacOS安装,然后进入卷的根目录,并运行这些命令(用您的团队ID替换或使用其他标准):

usr/bin/sqlite3 var/db/SystemPolicyConfiguration/KextPolicy
delete from kext_load_history_v3 where team_id='54GTJ2AU36';
delete from kext_policy where team_id='54GTJ2AU36';
.quit 

很好的回答,除了大多数人不知道“团队ID”是什么。也许可以列出select * from kext_policy查询显示的列的列表(这些列不会与查询一起输出)?谢谢! - Daniel Griscom
哦,欢迎来到 Stack Overflow。你迄今为止的三个答案中有两个对我很有用,一天内做得很好。继续保持! - Daniel Griscom
谢谢!现在我负责的工作不再依赖于MacOS ;-p 然而这种技巧将来会很有用。最重要的是,你的技巧非常有趣;与Time-Machine相比,它可以节省很多时间。 - HirofumiTamori
1
在我的10.13.6版本中,执行所描述的步骤后仍然加载扩展。还有一个名为kext_policy_mdm的附加表,但是从那里删除相关记录也没有帮助——除了它们不再被写入kext_load_history_v3之外。但是它们仍然会加载,并由kextstat列出。还有旧的old_platform_cache,它暗示了某种迁移。我无法猜测它的记录与扩展的关系。名为“settings”的表强化了迁移提示,其中包含单个记录“migrationPerformed|YES”。 - felix-b
我的一些用户批准的内核扩展甚至没有列在这个数据库中。它必须存在于其他地方。 - hmedia1
显示剩余3条评论

3

回应评论中的观点,我发现被接受的解决方案并没有起作用。我还需要重置PRAM。

操作步骤:

  1. 在文件系统的某个位置创建以下脚本(您将从恢复模式运行此脚本,因此无法在该模式下复制和粘贴)。您需要将TEAMID1234替换为要撤销同意的kext(s)的团队ID。请注意,在恢复模式下需要完整路径/Volumes/Macintosh\ HD

    我将我的脚本命名为/Users/me/revoke_kext_consent.sh,并运行了 chmod +x /Users/me/revoke_kext_consent.sh

#!/bin/sh -e
/Volumes/Macintosh\ HD/usr/bin/sqlite3 /Volumes/Macintosh\ HD/var/db/SystemPolicyConfiguration/KextPolicy 'delete from kext_policy where team_id="TEAMID1234";'
/Volumes/Macintosh\ HD/usr/bin/sqlite3 /Volumes/Macintosh\ HD/var/db/SystemPolicyConfiguration/KextPolicy 'delete from kext_load_history_v3 where team_id="TEAMID1234";'
  1. 进入恢复模式(按住Cmd-R键启动)

  2. 打开终端,运行上述脚本 (/Volumes/Macintosh\ HD/Users/me/revoke_kext_consent.sh)。

  3. 重启并重置PRAM(按住Cmd-Opt-P-R键启动)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接