追踪被盗代码签名证书与 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。