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

本文详细介绍了如何利用osquery的Authenticode签名验证功能检测被盗代码签名证书签名的恶意软件,包括技术实现原理、SQL查询示例及实际应用场景,为安全团队提供有效的应急响应方案。

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

近期,270万台Windows计算机感染了通过盗取CCleaner开发者证书签名的恶意软件,该恶意软件被植入其软件更新机制。幸运的是,借助我们同事Alessandro Gario提交的拉取请求,osquery现在可以轻松检测签名恶意软件,该功能添加了Windows可执行代码签名验证(也称为Authenticode)。本文解释了代码签名在事件响应中的重要性,并通过使用这一新osquery功能检测最近的CCleaner恶意软件来演示其用例。

如果您不熟悉osquery,请花点时间阅读我们之前的博客文章,其中解释了为什么我们是osquery的传播者,以及我们如何将其扩展到Windows平台运行。osquery的部分吸引力在于其灵活性和开源模型——如果您需要构建其他功能,请告诉我们!

代码签名的恶意软件

代码签名旨在有效阻止恶意修改的可执行文件,并允许用户(或平台所有者)选择是否运行来自不受信任来源的可执行文件。不幸的是,在像Windows这样的通用计算平台上,第三方软件供应商各自负责保护其代码签名证书。恶意行为者意识到,他们只需要窃取其中一个证书即可签名恶意软件,使其看起来像是来自合法的软件供应商。这一认识(以及著名的Stuxnet事件)开始了一种趋势,即使用被盗代码签名证书签名的恶意软件。在过去的几年中,这已成为犯罪和国家支持的恶意软件攻击的常规特征,最近又发生在流行应用CCleaner的受感染软件更新中。

因此,防御者已经知道,基于所有第三方软件供应商都能保护其代码签名证书的假设的信任模型是不可持续的,并且在像Windows这样的平台上,代码签名只是一个弱信任标记或应用程序白名单机制。但是,代码签名还有另一个用途:事件响应。一旦已知特定签名证书被盗,它也可以作为泄露的明显指标。作为防御者,您可以从这些柠檬中制作柠檬水:搜索网络上其他也使用此被盗证书签名的可执行文件的系统。恶意软件可能已成功逃避了防病毒类型的保护,但任何使用已知被盗证书签名的代码都是一个简单的红旗:签名检查具有0%的误报概率。osquery提供了执行此类搜索的理想方法。

使用osquery验证Authenticode签名

通过添加“表”,新传感器被添加到osquery中,将所有系统信息抽象为SQL表。

Alessandro在osquery/tables/system/windows/authenticode.cpp中实现了从系统读取代码签名和证书信息的代码。签名的验证是通过调用系统API WinVerifyTrust()完成的。

以下是使用osquery检查Windows可执行文件代码签名的简化示例:

1
2
3

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

大多数列是不言自明的。结果值不是。“结果”可能意味着:

状态 解释
missing 缺少签名。
invalid 无效签名,由缺少或损坏的文件引起。
untrusted 无法验证的签名。
distrusted 有效签名,但被用户明确不信任。
valid 有效签名,但用户未明确信任。
trusted 有效签名,被用户信任。

使用osquery中的SQL获取聚焦结果

为了充分利用这一新功能,请与osquery中的其他系统表执行JOIN查询。我们将演示如何使用SQL查询通过减少列出进程时的噪音来增强系统监控:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
osquery> SELECT process.pid, process.path, authenticode.result
    ...> FROM processes as process
    ...> LEFT JOIN authenticode
    ...> ON process.path = authenticode.path
    ...> WHERE result = 'missing';

+------+-----------------------------------------------------------+---------+
| 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模式下运行,这更适合事件响应。您可以按计划运行任何这些查询——使用osquery进行检测而不是响应。为此,您将在要监视的主机上安装osqueryd(osquery守护程序),并配置日志记录基础设施以收集这些查询的输出(例如,将osquery输出馈送到LogStash / ElasticSearch以供后续分析)。

未来的osquery工作

在本文中,我们展示了osquery作为系统信息检索工具的灵活性:使用熟悉的SQL语法,您可以快速制作自定义查询,仅返回与您当前目标相关的信息。检查Authenticode签名的能力只是osquery作为响应工具搜索潜在泄露指标的一种用途。许多IT和安全团队正在使用osquery进行即时事件响应,包括初始恶意软件检测和识别传播。

Trail of Bits很早就认识到osquery的潜力。一年多来,我们一直在根据客户的要求添加各种功能。如果您已经在使用osquery或考虑使用它,并且需要构建某个功能,请告诉我们!我们随时准备帮助您根据需求定制osquery。

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