0

SecCodeCheckValidity动态代码合法性检查防止什么样的动态代码修改?

执行签名代码的动态验证。

SecStaticCodeCheckValidity

验证一个静态代码对象。

此函数获取并验证代码对象指定的代码 上的签名。它检查所有密封组件的有效性,包括资源(如果有的话) 。如果指定了代码,它将根据代码 验证代码。如果所有这些条件都满足,则调用成功。只要代码未被修改,代码 不受并发修改,并且结果只有效 ,此调用才是安全的。如果底层文件系统 具有动态特性(例如网络文件系统,联合安装或FUSE),则必须考虑在验证后代码的修改安全性从 更改。

因此,鉴于苹果的代码签名描述,目前尚不清楚它们在这里指的是什么“动态characaters”。

回答

0

SecStaticCodeCheckValidity验证应用程序是否在磁盘上。相反,SecCodeCheckValidity在运行时验证应用程序内存中的是否符合相同的要求。

这会尝试通过劫持,注入或其他传统方法来修改内存代码,方法是检查它是否仍然使用有效签名进行代码签名。

我记得在WWDC '09的某个地方听到这种区别,如果我错了,请纠正我。

如果你想查一些正在运行的代码是否被苹果签署的,而不是由程序员指定一些指定的要求,你想:

SecRequirementCreateWithString(CFSTR("anchor apple"), ...) 

,然后将结果传递从SecRequirementRefSecCodeCheckValidity。在这种情况下,不需要与指定的要求进行交互,因为您已经决定了哪些代码可以接受,哪些是Apple签署的任何代码。

在生产代码中,您可以使用csreq(1)编译“anchor apple”的二进制版本,并使用SecRequirementCreateWithData而不是SecRequirementCreateWithString,这更快。

+0

它多久检查一次“内存”? – PnotNP