Security.framework
导出SecCodeCheckValidityWithErrors()
ref,src 等函数,用于验证针对证书存储区的代码签名的正确性。
然而,谁检查了检查员? Security.framework也已签名。内核如何在不事先加载Security.framework来访问这些函数的情况下验证它的签名?并不意味着只是用自定义实现替换Security.framework,盲目接受任何签名,这足以有效地关闭所有代码签名保护?
如果内核安装了静态版本的Security.framework,那么将它作为一个单独的框架有什么意义呢?如果没有,它是否只是盲目地相信这个特定的框架被篡改?
背景:我最近更换了Macbook上的内置键盘,它宣布自己的USB PID错误,所以它被认为是JIS而不是ANSI。可以通过更改AppleUSBTCKeyboard.kext
的{{1}}中的一行来修复此问题,但这会使签名无效。使用所有相关OID创建自己的CA是不够的,因为kext签名检查被硬编码为仅接受Apple根证书。规避这一点的唯一合法方法是向Apple支付100美元/年的费用,主要是为了使用我自己的电脑。这就是为什么我要Info.plist
要求不仅要匹配Apple CA颁发的认证,还要匹配任何可信任的CA,包括用户提供的CA,以使公开的补丁尽可能不具有侵入性,以及现在我正在研究如何做到这一点。
答案 0 :(得分:2)
Apple未公开记录启动信任链的工作原理。
但是,有一些间接证据表明在启动时会执行某些关键文件的校验和:
虽然我没有亲自尝试,但似乎很可能安检框架也被检查,所以你不太可能偷偷改变它。考虑将键盘重新映射到更高的级别。
答案 1 :(得分:2)
Security.framework实际上并不直接负责检查kexts的代码签名的逻辑。这是由 kexttools 完成的 - 来自内存,<router-outlet>
在创建预链接内核或更新kext缓存时检查签名,并在按需加载kext时检查<div>child state</div>
。 / p>
Hackintosh社区已经提出了一个修改过的工具链,它允许你自己的kext签名权限。我还没有测试过,因为我最后一次检查他们认为你使用了一些Hackintosh网站的中央CA,这对我没有吸引力,而且我没有找到他们用来对付苹果工具的补丁。我没有花太多时间在这上面,所以也许你可以让它更有效:https://www.tonymacx86.com/threads/gatebreak-signed-kexts-for-everyone.112306/