针对敏感数据识别与自动分类分级
按下数据脱敏快捷键
全场景安全防护,保障API安全调用及访问可视
单设备最高可处理40000条/秒SQL
全方面守护政企的API数据安全
数据库审计领域领先产品,累计销量超5万台
全域全流量外发敏感内容精准监测
全域一体构建数据安全监督管控闭环
提供更专业、更安全的数据交换方式
数据交换专家使数据交换更高效、安全、便捷
网络安全与高效单向传输两不误
保障数据安全流通,解决数据共享的信任和隐私保护问题的数据开放和共享交换平台
分布式安全系统架构设计,为用户提供安全、可靠、可控、可溯的分布式隐私计算平台
数据流通利用基础设施的接入终端
数据流通规范性保障平台
网信用户综合安全事件分析与全局安全态势感知平台
网络安全挂图作战指挥应用平台产品
智能编排实现网络安全自动化运营
精准检测 极速响应
为企业级用户提供全局、智能化安全态势感知能力
在线安全自助诊疗服务,以“医疗+医保”的方式向客户提供全生命周期数字安全保障
托管式云端Web安全防护服务
主机的一站式安全防护
对多云主机资产运维过程进行全量审计
7*24小时专家值守,保障网站服务质量
持续发现暴露在互联网边界上的安全风险
为容器平台应用提供全生命周期安全防护
托管有我,安全为你
中国移动首次APT集采产品
下一代防火墙
稳定、全面、便捷、合规,不只是上网行为管理,更助力网络安全与业务成功
融入《SQL注入WEB攻击的实时入侵检测系统》第二十二届中国专利优秀奖技术
欺骗诱捕技术的主动安全防御体系
让运维更简单、更高效、更安全
信息系统的综合性管理平台
网络安全事件的取证溯源与快速恢复
检查能力完备,助力等保2.0落地
5万+知识库实时更新监测网络安全最薄弱的一环
以公安部151号令为指导依据
事前+事中+事后的全生命周期Web应用安全防护解决方案
北京奥运会“一战成名”的Web安全保障产品
简单配置就可保护企业网页不被非法篡改
主机安全防护、勒索病毒专防御专杀
数据防泄漏、防病毒、主机审计、终端准入
一站式管理保障访问安全,零信任体系的安全大脑
构建零信任API服务统一访问总线
全面保障应用安全
提供弹性、灵活的一站式云上密码服务
可管理、可感知、可预警、可处置的一体化密码监管平台
提供系统化、流程化的密码应用安全测评工具
为应用系统提供高性能的密码服务
为云平台和用户提供资源弹性、灵活伸缩的云密码服务
提供基于数字证书的签名验签服务
为商用密码应用提供密钥全生命周期管理服务
提供简单易用的远程安全访问与数据加密传输服务
提供站到站数据加密服务
提供远程安全访问与数据加密传输服务
提供可信用户身份认证与应用安全访问服务
为终端用户提供安全可信的身份认证服务
为多终端环境提供数据传输加解密服务
信息全面加密 离职人员无法解密 任何第三方无法解密
构建智慧、敏捷、赋能的工业安全运营体系
专门针对工业控制系统的审计和威胁监测平台
针对工控网络进行边界防护的专业防火墙产品
统一管理,工控安全防护的核心大脑
针对工业控制系统网络环境中存在的设备进行漏洞检测的专业设备
实现工业网络环境中不同安全级别网络间的数据安全交换
一体化便携式工控安全检查工具
便捷高效的工控安全实训工具
按需订阅、即开即用的SaaS安全服务平台
新一代物联网安全防护体系
智能感知物联网终端安全状态信息的分析系统
内嵌在物联网终端系统底层的轻量级软件产品
以安全大模型赋能显示屏内容安全
构建终端接入全程可视、可管的视频网
云端安全监测服务
GreatAttack互联网外部数据服务
集漏洞收集、生命周期管理、威胁统计评测为一体
POC插件式探测
基于全网架构的探测扫描引擎
即时、全面、深入的整合与分析
专业移动APP应用
实战化欺骗诱捕防御产品
智能感知物联网终端安全状态
钓鱼攻击检测服务
防范和化解信息安全风险
信息系统安全保障体系的规划与建设
等级保护咨询服务
减少软件安全漏洞数量、减轻漏洞威胁
云Web应用防火墙,精准覆盖各类Web应用攻击
为金融、政府、运营商等用户量身定制的安全众测服务
模拟真实黑客攻击,全方位了解安全风险
专业的网站安全测试服务
预判科学风向,科学决策
攻防对抗 实战演习
Web应用防火墙拦截各种异常攻击行为
针对无线环境进行专项安全评估
应用系统安全状况评估
对特定对象进行有针对的检查评估
源代码审计,发现潜在安全风险
数据分级分类保护
安全风险发现能力
轻松生成完整的日志审计分析报告,满足客户多样化报表、监管要求
SaaS化网络安全攻防演练应急指挥平台
企业安全自运营能力
大数据安全分析技术
业界领先的威胁情报云脑
欺骗和诱导攻击行为
终端安全全方位分析检测
“防勒索”应急处置 快速响应
应急处置 快速响应
应急处置 快速响应
“防挖矿”应急处置 快速响应
0DAY预警通告
安全事件应急自动化分析平台
数据化、标准化、智能化
充分检验应急响应工作机制与应急预案
构建完整、高效且高质量的安全开发体系
安全服务+保险补偿
信息安全相关的专业资质、认证培训
银河集团信息安全评估服务
有效的安全建设、完整的安全保障体系
情报驱动安全事件窗口前移,防患于未然
政策解读、行业研究、专家级洞察分析服务
“彩虹模型”,九维安全团队
私有云场景,一站式云安全综合解决方案的安全资源池
全天候、全方位网络安全监测
4层5大治理体系
智慧城市解决方案
软件安全开发解决方案
信息系统运行维护服务
国家重大活动网络安保服务
数据安全规划、治理、风险评估等咨询服务
面向云上租户提供安全运维和安全咨询服务
本地化安全服务、闭环安全运营管理
全生命周期安全防护,智能体驱动效能提升,场景化联动管控。
多云安全与多云管理服务平台
多场景应用提升安全运营能力
安全态势感知与管控
全方位守护工业信息网络安全
AI数据分类分级,让分类分级快人一步!
HVV利器,即日起,免费试用三个月!
有效实现数据“供得出、流得动、用得好、保安全”的数据流通利用基础设施
一站式意识教育解决方案
让安全更智能,让智能更安全
面向大模型系统的内容安全检测系统
针对敏感数据识别与自动分类分级
按下数据脱敏快捷键
全场景安全防护,保障API安全调用及访问可视
单设备最高可处理40000条/秒SQL
全方面守护政企的API数据安全
数据库审计领域领先产品,累计销量超5万台
全域全流量外发敏感内容精准监测
全域一体构建数据安全监督管控闭环
提供更专业、更安全的数据交换方式
数据交换专家使数据交换更高效、安全、便捷
网络安全与高效单向传输两不误
保障数据安全流通,解决数据共享的信任和隐私保护问题的数据开放和共享交换平台
分布式安全系统架构设计,为用户提供安全、可靠、可控、可溯的分布式隐私计算平台
数据流通利用基础设施的接入终端
数据流通规范性保障平台
网信用户综合安全事件分析与全局安全态势感知平台
网络安全挂图作战指挥应用平台产品
智能编排实现网络安全自动化运营
精准检测 极速响应
为企业级用户提供全局、智能化安全态势感知能力
在线安全自助诊疗服务,以“医疗+医保”的方式向客户提供全生命周期数字安全保障
托管式云端Web安全防护服务
主机的一站式安全防护
对多云主机资产运维过程进行全量审计
7*24小时专家值守,保障网站服务质量
持续发现暴露在互联网边界上的安全风险
为容器平台应用提供全生命周期安全防护
托管有我,安全为你
中国移动首次APT集采产品
下一代防火墙
稳定、全面、便捷、合规,不只是上网行为管理,更助力网络安全与业务成功
融入《SQL注入WEB攻击的实时入侵检测系统》第二十二届中国专利优秀奖技术
欺骗诱捕技术的主动安全防御体系
让运维更简单、更高效、更安全
信息系统的综合性管理平台
网络安全事件的取证溯源与快速恢复
检查能力完备,助力等保2.0落地
5万+知识库实时更新监测网络安全最薄弱的一环
以公安部151号令为指导依据
事前+事中+事后的全生命周期Web应用安全防护解决方案
北京奥运会“一战成名”的Web安全保障产品
简单配置就可保护企业网页不被非法篡改
主机安全防护、勒索病毒专防御专杀
数据防泄漏、防病毒、主机审计、终端准入
一站式管理保障访问安全,零信任体系的安全大脑
构建零信任API服务统一访问总线
全面保障应用安全
提供弹性、灵活的一站式云上密码服务
可管理、可感知、可预警、可处置的一体化密码监管平台
提供系统化、流程化的密码应用安全测评工具
为应用系统提供高性能的密码服务
为云平台和用户提供资源弹性、灵活伸缩的云密码服务
提供基于数字证书的签名验签服务
为商用密码应用提供密钥全生命周期管理服务
提供简单易用的远程安全访问与数据加密传输服务
提供站到站数据加密服务
提供远程安全访问与数据加密传输服务
提供可信用户身份认证与应用安全访问服务
为终端用户提供安全可信的身份认证服务
为多终端环境提供数据传输加解密服务
信息全面加密 离职人员无法解密 任何第三方无法解密
构建智慧、敏捷、赋能的工业安全运营体系
专门针对工业控制系统的审计和威胁监测平台
针对工控网络进行边界防护的专业防火墙产品
统一管理,工控安全防护的核心大脑
针对工业控制系统网络环境中存在的设备进行漏洞检测的专业设备
实现工业网络环境中不同安全级别网络间的数据安全交换
一体化便携式工控安全检查工具
便捷高效的工控安全实训工具
按需订阅、即开即用的SaaS安全服务平台
新一代物联网安全防护体系
智能感知物联网终端安全状态信息的分析系统
内嵌在物联网终端系统底层的轻量级软件产品
以安全大模型赋能显示屏内容安全
构建终端接入全程可视、可管的视频网
云端安全监测服务
GreatAttack互联网外部数据服务
集漏洞收集、生命周期管理、威胁统计评测为一体
POC插件式探测
基于全网架构的探测扫描引擎
即时、全面、深入的整合与分析
专业移动APP应用
实战化欺骗诱捕防御产品
智能感知物联网终端安全状态
钓鱼攻击检测服务
防范和化解信息安全风险
信息系统安全保障体系的规划与建设
等级保护咨询服务
减少软件安全漏洞数量、减轻漏洞威胁
预判科学风向,科学决策
攻防对抗 实战演习
Web应用防火墙拦截各种异常攻击行为
针对无线环境进行专项安全评估
应用系统安全状况评估
对特定对象进行有针对的检查评估
源代码审计,发现潜在安全风险
数据分级分类保护
安全风险发现能力
轻松生成完整的日志审计分析报告,满足客户多样化报表、监管要求
SaaS化网络安全攻防演练应急指挥平台
企业安全自运营能力
大数据安全分析技术
业界领先的威胁情报云脑
欺骗和诱导攻击行为
终端安全全方位分析检测
“防勒索”应急处置 快速响应
应急处置 快速响应
应急处置 快速响应
“防挖矿”应急处置 快速响应
0DAY预警通告
安全事件应急自动化分析平台
数据化、标准化、智能化
充分检验应急响应工作机制与应急预案
构建完整、高效且高质量的安全开发体系
安全服务+保险补偿
信息安全相关的专业资质、认证培训
银河集团信息安全评估服务
有效的安全建设、完整的安全保障体系
情报驱动安全事件窗口前移,防患于未然
政策解读、行业研究、专家级洞察分析服务
“彩虹模型”,九维安全团队
私有云场景,一站式云安全综合解决方案的安全资源池
全天候、全方位网络安全监测
4层5大治理体系
智慧城市解决方案
软件安全开发解决方案
信息系统运行维护服务
国家重大活动网络安保服务
数据安全规划、治理、风险评估等咨询服务
面向云上租户提供安全运维和安全咨询服务
本地化安全服务、闭环安全运营管理
前言
CVE-2019-1208是趋势科技的@elli0tn0phacker在今年6月发现的一个vbscript漏洞,报告中提到这个漏洞是通过补丁比对发现的,这引起了笔者的兴趣。最近,笔者花了一些时间对该漏洞进行了比较详细的研究。在这篇文章中,笔者将从漏洞成因、修复方案、利用编写三个方面对该漏洞进行介绍。
读者将会看到,代码开发者是如何在修复旧漏洞时不经意间引入新漏洞。在这个例子中,引入的还是一个非常严重的远程代码执行漏洞。通过这个例子读者也会发现,有时候通过补丁比对就可以发现新漏洞。
该漏洞从2019年6月更新被引入,到2019年9月更新被修复,只存活了短短3个月,因此编写这个漏洞的利用并无价值,笔者写这个漏洞的利用只是为了概念验证。
尽管微软已经在2019年8月的IE更新中全面禁用了vbscript,但出于安全性考虑,完整利用代码不予公开。
漏洞成因
这是一个vbscript的UAF(Use After Free)漏洞,漏洞成因还要从微软今年6月的补丁说起。
漏洞成因
微软在2019年6月的vbscript更新中引入了下面几个函数:
•SafeArrayAddRef
•SafeArrayReleaseData
•SafeArrayReleaseDescriptor
引入SafeArrayAddRef的作用是为SafeArray提供一种类似引用计数的机制。
源码中通过使用STL的 map将一些对象/数据指针(如pSafeArray和pvData)与一个int型的计数器进行绑定。
在VbsFilter和VbsJoin这两个函数中,在调用实际的rtJoin和rtFilter前,会调用SafeArrayAddRef对相关指针的引用计数+1。调用完毕后,再调用SafeArrayReleaseData和SafeArrayReleaseDescriptor在map中将指针对应的计数-1,并将指针所对应的key从map中删除。
开发者应该是用这种方式修复了一些UAF问题。但修复方案中没有考虑到当Join/Filter传入的数组中有类对象时,在Public Default Property Get这一潜在的回调中可以对数组进行操作(比如ReDim)。这样,当调用完 rtJoin/rtFilter后返回VbsJoin/VbsFilter时,对应的pSafeArray/pvData指针已被更新,原先的设计是将之前已在Map中“注册”的指针传入后续的SafeArrayReleaseData/SafeArrayReleaseDescriptor进行引用计数减操作,但现在传入SafeArrayReleaseData/SafeArrayReleaseDescriptor的指针均不在map中(因为被重新创建了)。这导致在调用RefCountMap
具体地,开发者借助RefCountMap类实现了一个“伪引用计数机制”,通过一个map
相关操作函数的声明如下:
RefCountMap
了解了这些知识后,回过头去理解@elli0tn0phacker报告中的Figure 5就会容易多了。
PoC分析
@elli0tn0phacker给出的poc大致如下:
由于漏洞的存在,我们知道arr(0) = 1语句执行前arr已被释放,而且从代码中可以看到arr是在回调中被ReDim的。那么arr到底存在哪里?为什么arr(0) = 1索引的是ReDim后被释放的SafeArray,而不是Redim前的SafeArray?
这就涉及到 vbscript虚拟机的相关知识。
卡巴斯基实验室的Boris Larin曾写过一篇关于vbscript虚拟机的文章,并且开源了相关的调试插件。
在文章中,作者对vbscript虚拟机进行了比较细致的介绍。vbscript的所有代码都会先被编译为P-Code,随后通过CScriptRuntime::RunNoEH对所有P-Code进行解释执行,CScriptRuntime对象的成员变量中存储着解释所需的许多信息,比较重要的几个如下:
借助调试插件,我们可以得到 PoC代码编译后的P-Code:
以下是上述用到的部分指令对应的字节码(全部指令请参考Boris的插件源码):
从P-Code中可以看出, arr(0) = 1这句对应的指令索引的是本地变量栈(OP_CallLclSt, 0x25),Call Join(arr)这句对应的指令索引的也是本地变量栈(OP_LocalAdr, 0x19),从两个指令名称中我们可以猜测arr被存储在本地变量栈上。
在IDA Pro中对vbscript!CScriptRuntime::RunNoEH进行逆向,我们来看一下上述两个指令解释分支的汇编代码:
上述两个分支都调用了CScriptRuntime::PvarLocal方法,再来看一下CScriptRuntime::PvarLocal方法的实现:
可以看到CScriptRuntime::PvarLocal接收一个索引,并且基于CScriptRuntime对象+0x28或0x2C处的值进行偏移运算。调试时发现PoC两处对arr的操作索引均为1,所以存储arr的地址为:
poi(pCScriptRuntime + 0x28) - 0x10*1
上述分析验证了上面对于指令作用的猜想,PoC中每次使用arr变量时,都会传入对应的索引去本地变量栈中进行访问。
明白了arr的存取原理后,我们可以清晰地在调试器中观察arr的变化过程,从而理解整个UAF的过程。
笔者在开启页堆后对PoC进行了调试。我们先将断点下到OP_LocalAdr指令的解释分支,可以看到Join(arr)执行时访问到的arr,命中断点时ebx即为CScriptRuntime,调试时arr从本地变量栈(ebx+0x28)进行索引,读者请留意下图中蓝色高亮的指针,ReDim语句执行后它会发生变化。
我们对上图中高亮数据(SafeArray指针)所在的内存下一个写入断点,观察这个位置上数据的几次变化过程。
第一次是在ReDim(OP_ArrNamReDim)执行时,对之前arr的清理阶段(OP_ArrNamReDim指令的解释流程在后面“修复方案”一节中会进一步说明。):
第二次是在OP_ArrNamReDim执行时,将新创建的arr复制到本地变量栈的对应内存处,可以看到蓝色高亮处的指针已经发生变化,此时的SafeArray已经变为刚刚创建的二维数组。
最后,我们将断点下到OP_CallLclSt的解释分支,目的是断在arr(0) = 1这句对arr的访问过程,由于“漏洞成因”所描述的设计上的问题,此时本地变量栈上的arr已经被释放:
追踪到的释放栈回溯如下图,读者可以看到,这个不当的释放正是由于SafeArrayReleaseDescriptor传入了未在map注册的指针所导致。
通过以上调试,读者应该可以清晰感受到整个Use After Free过程。
修复方案
清楚漏洞成因后,我们来看一下微软在9月更新中是如何修复该漏洞的。笔者用Bidiff工具比对了8月更新和9月更新两个vbscript.dll,发现在rtJoin(rtFilter均类似,下面只以rtJoin进行说明)函数中,在对数组内的元素进行操作前后,加了一对SafeArrayLock/SafeArrayUnlock函数:
微软采用对SafeArray加锁的方式来修补这个由之前的补丁引入的问题。SafeArrayLock会令pSafeArr->cLocks的值+1。这样,当在安装9月补丁后再次打开PoC。由于前面的+1操作,就可以令ReDim指令无法得到正常执行,我们来看一下具体的逻辑。
这里再引述一下上面提到的P-Code,可以看到ReDim arr(1, 1)这句语句对应的P-Code如下:
笔者在调试器中跟了一遍OP_ArrNamReDim指令(0x0A) 的执行逻辑,发现有如下几个关键点:
有意思的是,调试前笔者以为这里的ReDim最终会调用oleaut32!SafeArrayRedim函数,结果并没有。
结合上述逻辑,当补丁中在操作Join传入的数组前,SafeArrayLock令pSafeArr->cLocks从0变为1,从而在执行ReDim arr(1, 1)对应的指令时,无法通过3.1.1这一步,新数组无法被创建,Join函数执行完后本地变量栈中的数组指针不会得到更新,之前的UAF问题也就无从谈起了。Filter函数的修复方案同上。
以下为上述过程中涉及到的函数调用及说明:
这个修复方案和CVE-2016-0189的修复方案思路一致。
利用编写
@elli0tn0phacker在他的报告中已经给出了这个漏洞的exploit编写思路,但没有公布完整代码。作为概念验证,笔者亲手编写了对应的exploit,以下对部分细节进行说明。
伪造超长数组
通过触发漏洞,可以得到一块大小为0x30的空闲内存。借助堆的特性,如果在Join函数执行完后立即申请一些字符串长度为(0x30 - 4)的BSTR对象,就可以实现对被释放内存的占位。减4是因为BSTR的字符串前面还有4字节的长度域,会一并申请。
实践证明这里的操作还是比较简单的,并不需要过多的堆风水技巧,下面是一个可以成功占位的代码示例:
占位后,因为笔者已经在字符串中构造了假的超长数组,当下次访问arr时,成功占位的字符串会被解释为SafeArray结构体,从而得到一个基地址为0,元素个数为0x7fffffff,元素大小为1的超长数组。
任意地址读取
这部分,以及如何构造一块可读写内存的步骤请参考@elli0tn0phacker的报告,相关步骤实现起来非常简单,这里不再重复叙述。
Bypass ASLR
在前面的基础上,就可以泄露一个指针对象以绕过ASLR,这里笔者采用的方法和和CVE-2019-0752一样,泄露一个Scripting.Dictionary对象的虚表指针,具体操作如下:
虚函数劫持
若PoC要在windows 10上执行,必须要绕过CFG。笔者最终采用了@elli0tn0phacker在他报告中提到的方法,即对CVE-2019-0752的利用方式稍作改动:
1.借助BSTR复制并伪造一个假的Dictionary虚表(fake_vtable),并改写Dictionary.Exists函数指针为kernel32!WinExec,由于kernel32!WinExec是系统自带函数,因此可以绕过CFG检测
2.借助BSTR复制并伪造一个假的Dictionary对象(fake_dict),将虚表替换为上述的假虚表,将WinExec的命令行参数写入虚表指针后4字节开始的地址
3.将假的Dictionary对象所对应BSTR的type设为0x09,使之成为一个对象(VT_DISPATCH)
4.调用fake_dict.Exists,使控制流导向WinExec函数,命令行参数在步骤2中已经构造好
这个过程的示例代码如下:
利用约束
这个漏洞利用在任意地址写上有一些受限条件,@elli0tn0phacker已在他的报告中提到,这里也不再重复叙述。
这里提一个笔者编写利用时遇到的问题,笔者一开始是在windows7 sp1 x86环境下写的利用,代码全部写完后发现计算器无法弹出,一番调试后发现,传入WinExec函数的命令行参数无法得到正常解释,原因也很简单,来看一下某次win7调试时最终传给WinExec的参数:
出于利用构造的约束条件,命令行参数的前4个字符是由前面伪造的虚表的地址解释而来,这种情况下很容易造成前4个字符里面有多余字符,因此WinExec也就不能按预期执行后续的命令行。笔者一开始想到的将虚表伪造到0x20202020这个地址,这样命令行参数的前4个字符可以被解释为空格,不会影响整个命令行的解释。但该漏洞中对指定地址的连续写是受限的,笔者最终放弃了这个思路。
后来笔者将未加修改的exploit在win10环境试了一下,发现计算器可以成功弹出,以下为某次在win10下调试得到的参数及伪造的虚函数表:
笔者推测win10和win7下进程创建相关函数对命令行参数的处理存在一些差异,win10上的容错性更高一点。
代码执行
最终,笔者成功在windows 10 1709 x86系统的2019年8月全补丁环境上弹出一个计算器:
参考资料
《Delving deep into VBScript》
《From BinDiff to Zero-Day: A Proof of Concept Exploiting CVE-2019-1208 in Internet Explorer》
《RCE WITHOUT NATIVE CODE: EXPLOITATION OF A WRITE-WHAT-WHERE IN INTERNET EXPLORER》