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

本文详细介绍了如何利用 osquery 工具检测被盗代码签名证书签名的恶意软件,通过实际 SQL 查询示例展示 Windows Authenticode 验证流程,帮助安全团队快速识别受感染系统并提升事件响应效率。

追踪被盗代码签名证书与 osquery 的应用

近期,270 万台 Windows 计算机因 CCleaner 软件更新机制被植入使用被盗证书签名的恶意软件而遭受感染。幸运的是,得益于同事 Alessandro Gario 提交的拉取请求,osquery 现已支持 Windows 可执行文件代码签名验证(即 Authenticode),使得检测签名恶意软件变得简单。本文阐述了代码签名在事件响应中的重要性,并通过实际案例展示了这一新功能在检测 CCleaner 恶意软件中的应用。

若您不熟悉 osquery,建议先阅读我们之前的博客文章,了解我们为何推崇 osquery 以及如何将其扩展至 Windows 平台。osquery 的灵活性和开源模式是其魅力所在——如果您需要其他功能,请告知我们!

代码签名恶意软件的威胁

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

防御者已认识到,基于“所有第三方供应商都能保护其证书”的信任模型不可靠,在 Windows 等平台上,代码签名仅是弱信任标记或应用白名单机制。但代码签名另有用途:事件响应。一旦某签名证书确认为被盗,它即可作为入侵指标。防御者可借此搜索网络中其他使用同一证书签名的可执行文件——即使恶意软件绕过防病毒保护,使用已知被盗证书签名的代码也极易被识别,且误报率为零。osquery 为此类搜索提供了理想工具。

使用 osquery 验证 Authenticode 签名

签名验证通过调用系统 API WinVerifyTrust() 实现。以下为检查 Windows 可执行文件代码签名的简化示例:

1
2
3

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

result 列的可能值及其含义如下:

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

利用 SQL 优化 osquery 查询结果

通过与其他系统表联查,可提升监控效率。以下示例展示如何减少进程列表中的噪声:

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';

查询结果示例:

1
2
3
4
5
6
7
8
9
+------+-----------------------------------------------------------+---------+
| pid  | path                                                      | result  |
+------+-----------------------------------------------------------+---------+
| 3752 | c:\windows\system32\sihost.exe                            | missing |
| 3872 | C:\Windows\system32\notepad.exe                           | missing |
| 4860 | C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe | missing |
| 5200 | C:\Windows\system32\conhost.exe                           | missing |
| 6040 | C:\Windows\osqueryi.exe                                   | 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";

以上示例将搜索范围限定于 C:\Program Files\CCleaner,实际可根据需求调整路径。这些查询可在 osquery 交互式 shell 中运行(适用于事件响应),也可通过 osqueryd 守护进程定时执行,用于检测而非响应场景,并将输出发送至 LogStash/ElasticSearch 等日志基础设施。

osquery 的未来展望

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

Trail of Bits 较早认识到 osquery 的潜力,过去一年中已应客户需求添加了多项功能。若您正在使用或考虑使用 osquery 并需要特定功能,请联系我们!我们乐意为您定制 osquery。

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