2

SecCodeCheckValidity

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

SecStaticCodeCheckValidity

验证静态代码对象。

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

因此,鉴于 Apple 对代码签名文档的描述,不清楚它们在这里的“动态特性”是什么意思。

4

1 回答 1

1

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

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

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

如果要检查某些运行代码是否由 Apple 签名,而不是程序员指定的某些指定要求,则需要:

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

然后将结果从SecRequirementRefto传递给SecCodeCheckValidity. 在这种情况下,无需与指定要求进行交互,因为您已经决定了您可以接受的代码,即任何由 Apple 签名的代码。

在生产代码中,您可以使用csreq(1)编译“锚苹果”的二进制版本并使用SecRequirementCreateWithData代替SecRequirementCreateWithString,这样更快。

于 2017-04-26T06:23:27.663 回答