BlackHat议题解析:Windows程序的数字签名校验“漏洞”

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:
  • 本文原创作者:维一零,本文属FreeBuf原创奖励计划,未经许可禁止转载

在今年的黑帽大会上,国外的一个安全研究员展示了如何通过Windows的数字签名bypass对恶意程序代码的检测。下载大会的该演讲的ppt大概看了一下,报告分为两部分,第一部分展示数字签名的的校验“漏洞”,第二部分展示该作者自己研究实现的一个pe程序加载器,用来配合第一部分的“漏洞“bypass杀毒软件对恶意程序的检测。本文重点在于第一部分的这个数字签名校验”漏洞“,通过回顾分析数字签名的校验来阐述这个”漏洞“的原理。

数字签名与数字证书

讲这个”漏洞“之前先讲一下数字签名的原理,理解一般的数字签名验证过程。下面是数字签名的相关概念和验证过程:

数字签名:对一段数据摘要使用私钥进行加密,公钥进行解密校验

数字证书:对数字签名的解密公钥和身份信息使用CA的私钥进行加密,系统信任的CA公钥进行解密

如上图所示,数字签名用来保护所有者的数据,所以从这些数据出发,所有者签发数据的数字签名过程是要先计算这些数据的摘要(也就是对这些数据做个hash运算,目前由于SHA-1开始不安全,正在逐渐换成SHA-2算法),然后使用所有者的私钥进行加密(目前主流还是RSA,也有一些ECC或其他算法),加密后的数据带上所有者的信息按照一定的标准格式组织好其实就是所谓的数字签名。

而接收方(使用者)要验证这个数字签名,一般通过数字证书,因为其中包含两个重要的信息,一个就是用于解密数字签名的公钥(通过这个公钥才能正确解密出数据所有者事先加密好的数据摘要值,用于验证比对数据的一致性),另一个就是指明了这个公钥的所有者的信息(当然要和数字签名所有者的信息一致)。

而数字证书其实是由第三方的可信机构颁发给数字签名所有者的一份数据文件,生成算法和数字签名类似,只不过它是把所有者的公钥和身份这些固定信息数据进行了加密返回给了所有者,此时所有者的身份正常是得到了可信机构的认证了。最后一个环节,数字签名、数字证书通常都是附加到所有者的数据后面一起传送给了使用者,但是如何解密数字证书来进行验证呢?我的理解是,这个要依托于系统,比如windows,他们会维护一批可信机构的列表,在验证证书的时候,就会先从这个列表里校验和获取证书签发机构的身份和公钥,并返回到用户系统进行存储和使用。

正是通过这样一整套的相对完善的机制,最终比较靠谱的保证了接收数据的有效性。而本文所指的Windows程序的数字签名,其实就是指所有者要保护的数据是一些Windows下的可执行程序这样一种情况。

可被利用的“漏洞”

从上面的签名校验流程看,由于整个过程涉及环节比较多,相应的每个环节都存在有被攻破的可能性,比如hash碰撞、根证书伪造等,但是本文不涉及此类问题。实际上,数字签名仍然是保护数据有效的一种可靠的途径,只要操作得当,算法强度足够,被攻破的可能性还是比较低。而本文所说的“漏洞”,也不是上面整个验证过程的漏洞,下面就来看一看这个“漏洞”是什么意思吧。

找一个带有数字签名的程序来实验,就以微软官方的库文件msvcr100.dll为例。右键点击文件属性,可以看到有一个数字签名的标签,依次点击可以查看到下面的签名有效状态,表示这个程序的数字签名验证成功,“程序数据没有被篡改”(这里加引号说明理解需要谨慎,详看下文)。

然后修改这个文件,比如在尾部随便添加几个字节的数据,再次查看数字签名的状态后如下图所示,说明系统检测到文件被篡改,数字签名验证为无效。

这就给我们造成一种感觉,数字签名真的可以保证数据不被篡改,只要数据受到篡改,就会被系统的验证机制检测到并提示签名无效。然而,这种感觉其实并不靠谱,因为我们实际上只是对签名文件添加了一些数据,并没有修改到程序的原始数据区域的部分,理论上只要系统能够找到程序的数字签名并通过上述的验证流程,那么数字签名就仍是有效的,受保护数据没有遭到篡改。那么,有没有办法让这个添加了数据的文件去正确识别数字签名并显示签名有效呢,答案是肯定的,而这也正是本文所指的“漏洞”。

这里直接给出这个“漏洞”的信息:对于一个Windows的可执行程序,签发数字签名的时候需要计算的数据摘要并不会是程序文件的全部数据,而是要排除一些特定区域的数据。而这些区域当然和PE文件结构有关,具体地,不管是签发时还是校验时计算的hash都会排除一个checksum字段、一个Security数据目录字段以及数字签名证书部分的数据。至于原因,当然是为了合理地组织pe程序的数字签名,符合pe文件格式的标准了。下面是三个字段的相关信息:

struct IMAGE_NT_HEADERS

struct IMAGE_OPTIONAL_HEADER32

DWORD CheckSum //pe映像校验和,dll常用

struct DATA_DIR Security

DWORD VirtualAddress //指向数字签名证书数据结构_WIN_CERTIFICATE

DWORD Size //_WIN_CERTIFICATE结构大小

struct _WIN_CERTIFICATE

DWORD dwLength //本结构数据的大小,一般和Security.Size相等

WORD wRevision

WORD wCertificateType

BYTE bCertificate[ANYSIZE_ARRAY] //数字签名证书数据

由于计算hash时排除以上3个相关的数据,故这三个字段本身就是Windows系统留给用户可以操作修改的区域。而实际上,要让上述在尾部添加数据的文件显示数字签名有效,即Windows系统对数字签名可正确识别,只需要更新Security.Size这个字段一致,且满足添加的数据长度为8的整数倍即可:

由此可见,数字签名状态正常,并不意味着带签名的程序就是完整未被篡改过的,通过修改程序的字段数据可以实现在带签名的程序后面添加任意的数据且签名状态验证正常。上面的三个字段如果同时修改,即checksum、Security.Size和dwLength都正常,除非很严格的去对数字签名的数据部分进行检查,否则比较难以检测出带签名的程序文件是否被恶意篡改添加了非法数据。而这一点,就构成所谓的“漏洞”,能够成为很多恶意程序的良好的藏身之处,借此bypass很多防火墙、反病毒等软件的检测。比如黑客可以将恶意代码嵌入带有正常签名的程序后面来绕过一些防护系统的检测,从而为后续的一些攻击行动起到一个很好的掩护作用。

另一种Windows程序的签名“漏洞”

经过以上的分析,所谓的签名“漏洞”,其实是数字签名文件组织上的概念误区,导致将签名的正常状态和签名文件的完整性混淆在一起。这里介绍一种更为方便的Windows程序,能够以更简单的方式实现以上同样的效果。

打开Windows系统文件夹“C:/Windows/Installer”,在这个目录下可以找到一些具有微软数字签名的msi/msp格式的文件。我们知道msi是微软格式的安装包,点击运行后系统会自动调用Msiexec.exe来启动程序,而这种程序相比于PE程序这个文件格式来说,对数字签名的识别好像更为简单,也没有PE程序结构的特殊限制。于是,随便往带有签名的msi文件尾部添加一些数据,而无需再修改文件的其他数据,msi的数字签名状态仍然校验正常。比如我系统找到的下面一个文件:

可以看到,对于msi签名文件,随意添加数据签名状态不变,说明即使被添加了非法数据,系统也能顺利找到msi程序的数字签名进行校验,而由于msi程序的原始保护部分没有受到篡改,所以数字签名状态验证正常。

总结

通过本文的分析,实际上这个程序签名的“漏洞”并算不上通常意义上的漏洞,但是却因为本身比较容易被概念混淆,使用可能没有充分得当,导致可能存在一些比较严重的可利用环节。所以本文的结论就是:程序的数字签名只能用于验证程序的代码和数据是否被篡改,而无法用于验证程序文件本身是否被篡改。

本文转自d1net(转载)

相关文章
|
1月前
|
SQL 安全 网络安全
网络安全的护城河:漏洞防御与加密技术的深度解析
【10月更文挑战第37天】在数字时代的浪潮中,网络安全成为守护个人隐私与企业资产的坚固堡垒。本文将深入探讨网络安全的两大核心要素——安全漏洞和加密技术,以及如何通过提升安全意识来强化这道防线。文章旨在揭示网络攻防战的复杂性,并引导读者构建更为稳固的安全体系。
62 1
|
1月前
|
SQL 安全 测试技术
网络安全的盾牌与剑——漏洞防御与加密技术解析
【10月更文挑战第28天】 在数字时代的浪潮中,网络空间安全成为我们不可忽视的战场。本文将深入探讨网络安全的核心问题,包括常见的网络安全漏洞、先进的加密技术以及提升个人和组织的安全意识。通过实际案例分析和代码示例,我们将揭示黑客如何利用漏洞进行攻击,展示如何使用加密技术保护数据,并强调培养网络安全意识的重要性。让我们一同揭开网络安全的神秘面纱,为打造更加坚固的数字防线做好准备。
44 3
|
14天前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
132 84
|
2月前
|
SQL 安全 网络安全
网络安全的盾牌与利剑:漏洞防御与加密技术解析
【10月更文挑战第3天】在数字化浪潮中,网络安全成为保障信息资产的关键防线。本文将深入探讨网络安全中的两大核心议题:网络漏洞防御和加密技术。我们将从基础概念出发,逐步分析漏洞产生的原因、影响及防范措施,并详细解读加密技术的工作原理和应用实例。文章旨在通过理论与实践的结合,增强读者的安全意识和技能,为构建更加稳固的网络环境提供实用指南。
55 1
|
24天前
|
SQL 安全 算法
网络安全之盾:漏洞防御与加密技术解析
在数字时代的浪潮中,网络安全和信息安全成为维护个人隐私和企业资产的重要防线。本文将深入探讨网络安全的薄弱环节—漏洞,并分析如何通过加密技术来加固这道防线。文章还将分享提升安全意识的重要性,以预防潜在的网络威胁,确保数据的安全与隐私。
47 2
|
26天前
|
安全 算法 网络安全
网络安全的盾牌与剑:漏洞防御与加密技术深度解析
在数字信息的海洋中,网络安全是航行者不可或缺的指南针。本文将深入探讨网络安全的两大支柱——漏洞防御和加密技术,揭示它们如何共同构筑起信息时代的安全屏障。从最新的网络攻击手段到防御策略,再到加密技术的奥秘,我们将一起揭开网络安全的神秘面纱,理解其背后的科学原理,并掌握保护个人和企业数据的关键技能。
32 3
|
1月前
|
SQL 监控 安全
网络安全的盾牌与利剑:漏洞防御与加密技术解析
在数字时代的洪流中,网络安全如同一场没有硝烟的战争。本文将深入探讨网络安全的核心议题,从网络漏洞的发现到防御策略的实施,以及加密技术的运用,揭示保护信息安全的关键所在。通过实际案例分析,我们将一窥网络攻击的手段和防御的艺术,同时提升个人与企业的安全意识,共同构筑一道坚固的数字防线。
|
1月前
|
安全 算法 网络安全
网络安全的盾牌与剑:漏洞防御与加密技术解析
【10月更文挑战第42天】在数字时代的海洋中,网络安全是守护数据宝藏的坚固盾牌和锋利之剑。本文将揭示网络安全的两大支柱——漏洞防御和加密技术,通过深入浅出的方式,带你了解如何发现并堵塞安全漏洞,以及如何使用加密技术保护信息不被窃取。我们将一起探索网络安全的奥秘,让你成为信息时代的智者和守护者。
37 6
|
1月前
|
存储 SQL 安全
网络安全的屏障与钥匙:漏洞防御与加密技术解析
【10月更文挑战第42天】在数字时代的浪潮中,网络安全成为守护个人隐私与企业数据不被侵犯的关键防线。本文将深入探讨网络安全中的两大核心议题——漏洞防御和加密技术。我们将从网络漏洞的识别开始,逐步揭示如何通过有效的安全策略和技术手段来防范潜在的网络攻击。随后,文章将转向加密技术的奥秘,解读其在数据传输和存储过程中保护信息安全的作用机制。最后,强调提升个人和企业的安全意识,是构建坚固网络安全屏障的重要一环。
|
2月前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞防御与加密技术深度解析
【10月更文挑战第20天】在数字世界的迷宫中,网络安全是守护我们数据宝藏的坚固盾牌和锋利钥匙。本篇文章将带您穿梭于网络的缝隙之间,揭示那些潜藏的脆弱点—网络安全漏洞,同时探索如何通过现代加密技术加固我们的数字堡垒。从基本概念到实战策略,我们将一同揭开网络安全的神秘面纱,提升您的安全意识,保护个人信息不受侵犯。
59 25

推荐镜像

更多