使用osquery追踪被盗代码签名证书的技术解析

本文详细介绍了如何利用osquery检测被盗代码签名证书签名的恶意软件,包括Authenticode签名验证的实现原理及实际SQL查询示例,帮助安全团队快速识别潜在威胁。

使用osquery追踪被盗代码签名证书

近期,270万台Windows计算机因运行了通过CCleaner软件更新机制分发的恶意软件而感染,该恶意软件使用了从CCleaner开发者处窃取的代码签名证书进行签名。幸运的是,得益于同事Alessandro Gario提交的拉取请求(为osquery新增了Windows可执行文件代码签名验证功能,即Authenticode),检测此类签名恶意软件现已变得简单。本文将探讨代码签名在事件响应中的重要性,并通过实际案例演示这一新功能的用途。

代码签名恶意软件的威胁

代码签名本应防止可执行文件被恶意篡改,并允许用户(或平台所有者)选择是否运行来自非信任源的代码。然而,在Windows等通用计算平台上,第三方软件供应商需自行保护其代码签名证书。攻击者意识到,只需窃取其中一个证书即可为恶意软件签名,使其看似来自合法供应商。这种现象(以及著名的Stuxnet事件)催生了使用被盗证书签名恶意软件的趋势,并成为近年来犯罪和国家级攻击的常规手段,最近的案例便是CCleaner的受感染更新。

防御者已意识到,依赖“所有第三方供应商都能保护其签名证书”的信任模型并不可靠。在Windows等平台上,代码签名仅能作为薄弱的信任标记或应用白名单机制。但代码签名还有另一用途:事件响应。一旦确认某签名证书被盗,它即可作为明确的入侵指标(IoC)。防御者可借此搜索网络中其他使用该证书签名的可执行文件——即使恶意软件绕过了杀毒软件,被盗证书的签名检查也能以0误报率精准定位威胁。osquery正是执行此类搜索的理想工具。

通过osquery验证Authenticode签名

osquery通过“表”的形式新增传感器功能,将系统信息抽象为SQL表。添加新表需先定义其规范(schema),包括列名、数据类型及简短描述。Alessandro的拉取请求为Windows新增了authenticode虚拟表,包含以下列:

  • path:文件路径

  • original_program_name:发布者名称

  • serial_number:证书序列号

  • subject_name:主题名称

  • result:验证结果

签名验证通过系统API WinVerifyTrust()实现,代码位于osquery/tables/system/windows/authenticode.cpp。以下为检查Windows可执行文件签名的简化示例:

1
2
3

    ...> FROM authenticode  
    ...> WHERE path = 'C:\Windows\explorer.exe';  

result列的可能值及含义:

状态 说明
missing 文件无签名。
invalid 签名无效(文件缺失或损坏)。
untrusted 签名无法通过验证。
distrusted 有效签名,但被用户显式标记为不信任。
valid 有效签名,但未被用户显式信任。
trusted 有效签名且受用户信任。

使用SQL优化osquery查询结果

通过与其他系统表联查(JOIN),可显著提升监控效率。例如,以下查询列出所有未签名进程,减少无关噪音:

1
2
3
4
5
osquery> SELECT process.pid, process.path, authenticode.result  
    ...> FROM processes as process  
    ...> LEFT JOIN authenticode  
    ...> ON process.path = authenticode.path  
    ...> WHERE result = 'missing';  

追踪被盗签名证书

假设某恶意活动使用从合法供应商(如CCleaner)窃取的证书签名。供应商已更换新证书并重新分发应用。如何排查设备中仍使用旧证书签名的文件?

示例1:查找使用被盗证书签名的文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
osquery> SELECT files.path, authenticode.subject_name,  
    ...>        authenticode.serial_number,  
    ...>        authenticode.result AS status  
    ...> FROM (  
    ...>   SELECT * FROM file  
    ...>   WHERE directory = "C:\Program Files\CCleaner"  
    ...> ) AS files  
    ...> LEFT JOIN authenticode  
    ...> ON authenticode.path = files.path  
    ...> WHERE authenticode.serial_number == "4b48b27c8224fe37b17a6a2ed7a81c9f";  

示例2:查找由该供应商签名但未使用新证书的文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
osquery> SELECT files.path, authenticode.subject_name,  
    ...>        authenticode.serial_number,  
    ...>        authenticode.result AS status  
    ...> FROM (  
    ...>   SELECT * FROM file  
    ...>   WHERE directory = "C:\Program Files\CCleaner"  
    ...> ) AS files  
    ...> LEFT JOIN authenticode  
    ...> ON authenticode.path = files.path  
    ...> WHERE authenticode.subject_name LIKE "%Piriform%"  
    ...> AND authenticode.serial_number != "52b6a81474e8048920f1909e454d7fc0";  

示例3:结合代码签名与文件哈希记录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SELECT files.path AS path,  
    ...>        authenticode.subject_name AS subject_name,  
    ...>        authenticode.serial_number AS serial_number,  
    ...>        authenticode.result AS status,  
    ...>        hashes.sha256 AS sha256  
    ...> FROM (  
    ...>   SELECT * FROM file  
    ...>   WHERE directory = "C:\Program Files\CCleaner"  
    ...> ) AS files  
    ...> LEFT JOIN authenticode  
    ...> ON authenticode.path = files.path  
    ...> LEFT JOIN hash AS hashes  
    ...> ON hashes.path = files.path  
    ...> WHERE authenticode.subject_name LIKE "%Piriform%"  
    ...> AND authenticode.serial_number != "52b6a81474e8048920f1909e454d7fc0";  

未来展望

本文展示了osquery作为系统信息检索工具的灵活性:通过熟悉的SQL语法,可快速定制查询以获取目标信息。Authenticode签名检查仅是osquery作为事件响应工具的用途之一。许多IT和安全团队正利用osquery进行实时响应,包括初始恶意软件检测和传播分析。

Trail of Bits很早就认识到osquery的潜力。过去一年中,我们根据客户需求持续添加功能。如果您正在使用或考虑使用osquery,并需要特定功能,请联系我们!我们愿助您定制osquery以满足需求。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计