针对敏感数据识别与自动分类分级
按下数据脱敏快捷键
全场景安全防护,保障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大治理体系
智慧城市解决方案
软件安全开发解决方案
信息系统运行维护服务
国家重大活动网络安保服务
数据安全规划、治理、风险评估等咨询服务
面向云上租户提供安全运维和安全咨询服务
本地化安全服务、闭环安全运营管理
脚本引擎开发者在设计GC(Garbage Collect,简称GC)时追踪指针不善导致的UAF(Use-After-Free),是一类常见的漏洞。本文通过一个例子来向读者介绍这类漏洞的成因与分析思路。
漏洞描述
CVE-2018-8353是谷歌的Ivan Fratric发现的一个jscript漏洞,该漏洞在2018年8月被修复。这是一个UAF漏洞,Ivan Fratric在披露页清晰地描述了该漏洞的成因:
通俗一点说就是RegExp类的lastIndex成员没有被加入GC追踪列表,如果给它赋值,在GC时会导致lastIndex处存储的指针变为悬垂指针。后续再访问lastIndex时,即造成一个典型的Use-After-Free场景。
jscript模块目前已发现多个类似漏洞,例如CVE-2017-11793,CVE-2017-11903,CVE-2018-0866,CVE-2018-0935,CVE-2018-8353,CVE-2018-8653,CVE-2018-8389,CVE-2019-1429
本文试图通过CVE-2018-8353一窥这类漏洞的成因,并在此基础上分析谷歌PoC中的信息泄露利用代码。读者将会看到一个GC导致的UAF如何被转化为高质量的信息泄露漏洞。
PoC
以下为Ivan Fratric给出的PoC,下一小节将通过该PoC分析漏洞成因。
UAF
@0Patch团队已通过补丁分析发现,x86下lastIndex位于RegExpObj对象的+A8偏移处,如下:
现在RegExpObj::Create函数内下断点,在RegExpObj对象创建完成后,对其偏移+A8处下一个硬件写入断点,这个偏移处存储一个VAR结构体,此结构体在x86下大小为0x10。重点观察+B0处的数据变化。
为了更清晰地解释成因,笔者并没有开启页堆,但开启了用户模式下堆申请的栈回溯,以下为调试日志:
重占位
到这里已经获得了一个非常好的UAF,接下来的问题是:如何使用它?
从调试日志中可以看出,用来存储VAR变量的内存块是从GcBlockFactory::PblkAlloc申请的,x86下其申请大小固定为0x648(《Garbage Collection Internals of JScript》这篇文章有解释为什么x86下这个大小是0x648):
如果要重用被释放的内存,得在GC后迅速用大小为0x648的内存申请去占用之。如何做到?
一个比较好的方法是借助NameList。jscript对象在创建成员变量时,如果成员变量的名称过长(谷歌的文章中说这个长度阈值为4),会在NameList::FCreateVval函数内单独申请内存,以存储对应的成员变量,并且会以第一个成员名称的长度去申请特定大小的内存,而相关计算公式是固定的。
通过逆向调试,可以得到x86下的计算公式:
现在,令alloc_size=0x648,解上述方程,可得到x=0x178(0n376)。于是可以通过下面的代码重用被释放的内存:
在调试器中观察验证重用:
从UAF到信息泄露
前一小节已经在合适的时机控制了被Free的内存,接下来要哦那个过这个UAF漏洞实现信息泄露,以得到被重用内存的起始地址。
NameList::FCreateVval点
NameList::FCreateVval函数内在申请成员变量名内存时,若成员名长度超过一定值,就会额外申请内存去存储这些名称。第一个成员名可以用来控制申请的内存大小,相关计算过程已经在前面说明。后面的成员名称只要长度合适,就可以在第一个成员名称初始化时申请的内存中使用剩余的部分,从而用来布控内存。
在x86环境下,通过逆向NameList::FCreateVval函数,发现每个成员名称前面会额外留0x30大小的空间作为头部,用于初始化各种数据。每次成员名称进行申请时,还会按照下图的计算公式按4字节对齐并保存与返回相关偏移:
整个计算公式比较复杂,但设计思路很简单,笔者在这里描述一遍,读者大致了解即可:x86下,第一个成员名初始化时,先申请(2x+0x32)*2+4的内存大小,得到内存后,最初的0x30作为头部使用,用来初始化各种数据,包括本次字符串长度,指向下一个成员名头的指针(这个指针会后面的成员名初始化时被更新),然后因为是第一个成员,按照公式直接加4字节进行对齐,所以从前面的调试日志也可以看到,第一个成员名从+0x34开始被复制。只要第一次申请的内存空间够,第二个成员名按照base+offset+4的方式进行内存地址获取,然后前0x30又是头部,接着再开始复制,以此类推。
泄露被重用内存首地址
接下来是泄露被重用内存的首地址。
由于被重用的内容之前存储着lastIndex引用的VAR数据,所以只要用长度及内容合适的字符串设计类成员名称,就可以控制指定地址处的VAR结构。
从这里开始,使用Ivan Fratric在附件中给出的infoleak.html代码,为便于展示,去除了部分注释:
name1用来申请大小为0x648的内存。name2可调节,用来对齐。name3用来指定类型,以泄露特定偏移处的一个指针,这个后面再会提及。name4用来布控0x1337对应的VAR,用于jscript代码中的条件判断。
上面的小节中只关心了name1,现在开始来具体设计name4,name3,name2。
锁定偏移值
首先得计算垂悬指针指向的VAR结构在被重用内存的偏移值。Ivan Fratric的适配的是x64的版本,原poc在笔者的环境中运行后0x1337对应的i为十进制的115。
x64与x86的原理一致,以x86的版本进行说明。既然x64环境中对应的i为115。x32环境中,也以115为例进行偏移计算。在上述代码中在第115个RegExpObj对象创建时下断点,相关方法在前面UAF小结已经描述,这个偏移很容易计算得到。
笔者的环境中这个偏移每次固定为0x3d8,如下:
设计name
现在来设计name,在每个成员名称初始化时,都会有0x30的头部,在这个头部的+0x24处是一个指针(这个指针要到初始化下一个成员名时才会被初始化),指向下一个变量名的0x30头部,下图中字体为红色的即为这些指针。如果能读取其中一个指针,减去其相对内存起始地址的偏移,就可以得到被重用内存的首地址。
下图中字体颜色为橙黄的是被拷贝的成员名称,每个名称最后会多拷贝两个0x00。字体颜色为蓝色的是每个成员名称的实际长度(转化为unicode后的长度)。字体颜色为红色上面已经进行解释。字体背景为灰色的一个个0x30内存区域为name2、name3、name4三个成员名的头部。
字体背景为黄色高亮的区域,实验时发现会与name3的值相同(意思就是给3得3,给5得5)。后面需要借助这个值来读取它后面偏移8字节的一个红色指针。
最后一个注意点
因为要泄露某个红色指针,所以x86下必须保证这个红色指针之前8字节处的type为long型,这可以通过设计name3来实现。现在的问题是:VAR与某个特定的lastIndex对应起来?
幸运的是,通过调试观察发现,当连续申请VAR结构时,一个个大小为0x10的VAR似乎是从高内存往低内存次第排列。笔者用下图来通俗地解释一下VAR的分布(name2中b的数量被用来调节这里的对齐):
所以,在x86下,如果找到了0x1337对应的regexps[i].lastIndex,就可以通过读取regexps[i+5].lastIndex来泄露相关指针,减去固定偏移就得到被重用内存的起始地址了。如下:
到这里已经将这个UAF漏洞转为了信息泄露,泄露出一块(aaa...部分)完全可控的内存的首地址。如果读者之前看过笔者之前的一篇文章,就会明白这里已经将CVE-2018-8353转换为和CVE-2017-11906具有相同功能的信息泄露漏洞。
从信息泄露到RCE
此类信息泄露漏洞与其他堆溢出漏洞一起使用可以实现远程代码执行。笔者将这个漏洞的利用代码稍加改动,并配合CVE-2017-11907一起使用,可以在未打补丁的机器上完成概念验证。
考虑到CVE-2018-8653或CVE-2019-1429这类在野0day的利用方式,应该是用了更高级的利用手法,通过UAF直接实现了任意地址读写,通过单个UAF即可实现远程代码执行,并不需要其他漏洞进行辅助。
此类UAF漏洞后面一定还会出现,请大家做好防范工作。
参考文章
Issue 1587: Windows: use-after-free in JScript in RegExp.lastIndex
Garbage Collection Internals of JScript