T1553.003: SIP 和信任提供程序劫持

Defense Impairment

摘要

攻击者可能篡改 SIP 和信任提供程序组件,以在进行签名验证检查时误导操作系统和应用程序控制工具。在用户模式下,Windows Authenticode (Citation: Microsoft Authenticode) 数字签名用于验证文件的来源和完整性,这些变量可用于建立对已签名代码的信任(例如,具有有效 Microsoft 签名的驱动程序可能被视为安全)。签名验证过程通过 WinVerifyTrust 应用程序编程接口(API)函数处理, (Citation: Microsoft WinVerifyTrust) 该函数接受查询并与适当的信任提供程序协调,后者负责验证签名的参数。(Citation: SpectorOps Subverting Trust Sept 2017) 由于可执行文件类型和相应签名格式的多样性,Microsoft 创建了称为主体接口包(SIP)的软件组件 (Citation: EduardosBlog SIPs July 2008),以在 API 函数和文件之间提供一层抽象。SIP 负责使 API 函数能够创建、检索、计算和验证签名。大多数文件格式都有唯一的 SIP(可执行文件、PowerShell、安装程序等,其中目录签名(catalog signing)提供了通用方案 (Citation: Microsoft Catalog Files and Signatures April 2017)),并由全局唯一标识符(GUID)标识。(Citation: SpectorOps Subverting Trust Sept 2017) 与[代码签名](https://attack.mitre.org/techniques/T1553/002)类似,攻击者可能滥用此架构来颠覆信任控制,并绕过只允许合法签名代码在系统上执行的安全策略。攻击者可能劫持 SIP 和信任提供程序组件,以误导操作系统和应用程序控制工具将恶意(或任何)代码归类为已签名,方法如下:(Citation: SpectorOps Subverting Trust Sept 2017) * 修改 <code>HKLM\SOFTWARE[\WOW6432Node\]Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg\{SIP_GUID}</code> 中的 <code>Dll</code> 和 <code>FuncName</code> 注册表值,它们指向提供 SIP 的 CryptSIPDllGetSignedDataMsg 函数的动态链接库(DLL),该函数从已签名文件中检索编码的数字证书。通过指向一个恶意构造的 DLL(其导出的函数始终返回已知良好的签名值(例如 Portable Executables 的 Microsoft 签名)而非文件的真实签名),攻击者可以为使用该 SIP 的所有文件应用可接受的签名值 (Citation: GitHub SIP POC Sept 2017)(尽管很可能会出现哈希不匹配从而使签名无效,因为该函数返回的哈希将不匹配从文件计算出的值)。 * 修改 <code>HKLM\SOFTWARE[WOW6432Node\]Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{SIP_GUID}</code> 中的 <code>Dll</code> 和 <code>FuncName</code> 注册表值,它们指向提供 SIP 的 CryptSIPDllVerifyIndirectData 函数的 DLL,该函数验证文件计算的哈希与已签名哈希值。通过指向一个恶意构造的 DLL(其导出的函数始终返回 TRUE(指示验证成功)),攻击者可以成功使用该 SIP 验证任何文件(具有合法签名)(Citation: GitHub SIP POC Sept 2017)(无论是否劫持前述的 CryptSIPDllGetSignedDataMsg 函数)。此注册表值也可以重定向到已存在 DLL 中合适的导出函数,从而避免需要在磁盘上投放并执行新文件。 * 修改 <code>HKLM\SOFTWARE[WOW6432Node\]Microsoft\Cryptography\Providers\Trust\FinalPolicy\{trust provider GUID}</code> 中的 <code>DLL</code> 和 <code>Function</code> 注册表值,它们指向提供信任提供程序 FinalPolicy 函数的 DLL,该函数是检查解码和解析后的签名以及做出大多数信任决策的地方。与劫持 SIP 的 CryptSIPDllVerifyIndirectData 函数类似,此值可以重定向到已存在 DLL 中合适的导出函数,或重定向到恶意构造的 DLL(尽管信任提供程序的实现很复杂)。 * **注意:**上述劫持也可以在不修改注册表的情况下,通过 [DLL](https://attack.mitre.org/techniques/T1574/001) 搜索顺序劫持来实现。 劫持 SIP 或信任提供程序组件还可以实现持久性代码执行,因为这些恶意组件可能由任何执行代码签名或签名验证的应用程序调用。(Citation: SpectorOps Subverting Trust Sept 2017)

来源归属

来源:MITRE ATT&CK · 置信度:high

平台

  • Windows

战术

Defense Impairment

参考来源