使用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可执行文件签名的简化示例:
|
|
result
列的可能值及含义:
状态 | 说明 |
---|---|
missing |
文件无签名。 |
invalid |
签名无效(文件缺失或损坏)。 |
untrusted |
签名无法通过验证。 |
distrusted |
有效签名,但被用户显式标记为不信任。 |
valid |
有效签名,但未被用户显式信任。 |
trusted |
有效签名且受用户信任。 |
使用SQL优化osquery查询结果
通过与其他系统表联查(JOIN),可显著提升监控效率。例如,以下查询列出所有未签名进程,减少无关噪音:
|
|
追踪被盗签名证书
假设某恶意活动使用从合法供应商(如CCleaner)窃取的证书签名。供应商已更换新证书并重新分发应用。如何排查设备中仍使用旧证书签名的文件?
示例1:查找使用被盗证书签名的文件
|
|
示例2:查找由该供应商签名但未使用新证书的文件
|
|
示例3:结合代码签名与文件哈希记录
|
|
未来展望
本文展示了osquery作为系统信息检索工具的灵活性:通过熟悉的SQL语法,可快速定制查询以获取目标信息。Authenticode签名检查仅是osquery作为事件响应工具的用途之一。许多IT和安全团队正利用osquery进行实时响应,包括初始恶意软件检测和传播分析。
Trail of Bits很早就认识到osquery的潜力。过去一年中,我们根据客户需求持续添加功能。如果您正在使用或考虑使用osquery,并需要特定功能,请联系我们!我们愿助您定制osquery以满足需求。