macOS内核如何验证Security.framework的完整性?

3

Security.framework 暴露了像 SecCodeCheckValidityWithErrors() 参考, 源码 这样的函数,用于校验代码签名的正确性以及证书存储。

但是,谁来检查这个检查者呢?Security.framework 也被签名了。内核如何验证它的签名而不预先加载 Security.framework 来获取访问这些函数的权限?这是否意味着只需用自定义实现替换 Security.framework 并盲目接受任何签名就足以有效地关闭所有代码签名保护?

如果内核有编译的静态版本的 Security.framework,那么将其作为单独的框架有什么意义呢?如果没有,它是否只是盲目信任这个特定的框架没有被篡改?

背景:我最近更换了 MacBook 上的内置键盘,并且它使用错误的 USB PID 进行自我声明,因此被识别为 JIS 而不是 ANSI。可以通过更改 AppleUSBTCKeyboard.kextInfo.plist 中的一行来修复它,但这会使签名无效。而且创建自己的 CA 并具有所有相关 OID 是不够的,因为 kext 签名检查是硬编码为仅接受 Apple 根证书。规避此问题的唯一合法方法是向苹果支付每年 100 美元的费用,基本上是为了使用我自己的计算机。这就是为什么我想要将 anchor apple 要求与由 Apple CA 颁发的证书以及任何受信任的 CA 匹配,包括用户提供的那些,以使公开可用的补丁尽可能非侵入性,并且现在我正在调查如何做到这一点。

2个回答

2

实际上,Security.framework并不直接负责检查kexts的代码签名逻辑。这是由完成的 - 根据记忆,在创建预链接内核或更新kext缓存时检查签名,而在按需加载kext时检查。

Hackintosh社区提出了一种修改后的工具链,可以允许您自己的kext签名授权。我还没有测试过这个,因为上次我检查时,他们假设您将使用某个Hackintosh网站的中央CA,这并不吸引我,并且我没有找到他们针对Apple工具使用的补丁。我没有花太多时间在这上面,也许你可以更加坚持使它起作用:https://www.tonymacx86.com/threads/gatebreak-signed-kexts-for-everyone.112306/


2

苹果并没有公开文档说明启动信任链是如何工作的。

然而,有一些间接证据表明,在启动时对某些关键文件的校验和进行了计算:

enter image description here

虽然我个人没有尝试过,但似乎极有可能检查安全框架,因此您很难偷偷改变它。考虑在更高的级别重新映射键盘。


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