动态代码有效性检查可以防止哪种动态代码修改?

时间:2017-04-26 00:29:18

标签: macos security code-signing codesign code-signing-entitlements

SecCodeCheckValidity

  

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

SecStaticCodeCheckValidity

  

验证静态代码对象。

     

此函数获取并验证指定代码上的签名   由代码对象。它检查所有密封组件的有效性,   包括资源(如果有的话)。它根据代码验证代码   如果指定了一个要求。如果所有这些,呼叫成功   条件令人满意。只有代码,此调用才是安全的   不受同时修改,结果只有效   只要代码保持不变。如果是底层文件系统   具有动态特性,例如网络文件系统,联合   mount或FUSE,您必须考虑代码的安全性   验证后修改。

因此,鉴于此对Apple的文档进行协调处理的描述,目前尚不清楚它们是什么意思"动态特征"这里。

1 个答案:

答案 0 :(得分:0)

SecStaticCodeCheckValidity验证应用是否为磁盘。相比之下,SecCodeCheckValidity会在运行时针对相同的要求验证应用程序内存中

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

我记得在WWDC '09期间听到过这种区别,如果我错了,请纠正我。

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

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

然后将结果从SecRequirementRef传递给SecCodeCheckValidity。在这种情况下,没有必要与指定的要求进行交互,因为您已经确定了您可以接受的代码,这是Apple签署的任何代码。

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