今天为大家推荐的是一篇关于数据绑定漏洞自动化挖掘的文章Automated Data Binding Vulnerability Detection for Java Web Frameworks via Nested Property Graph,这篇论文由浙江大学计算机科学与技术学院的常瑞老师、申文博老师研究组和蚂蚁集团非攻安全实验室合作完成,目前已被ISSTA 2024录用。本文提出了一种通用的基于嵌套属性图的数据绑定漏洞挖掘方法,自研的DIVER工具在Spring框架、Grails框架中发现了多个数据绑定漏洞,包含著名的Spring4Shell、Grails Pre-Auth RCE等高危漏洞。
背景与挑战
数据绑定是Web开发中的一项重要技术,它能够自动将前端的Web请求参数绑定到后端应用程序的相应属性中。这项技术简化了程序代码,提高了程序的可维护性,同时大幅度提升了开发效率,因此在诸如Spring等流行Web框架中得到广泛应用。
然而,某些Web框架在数据绑定的实现上存在缺陷,导致Web请求能够绑定的属性范围扩大,使攻击者可以操纵程序运行环境(如Web容器、Java虚拟机)中的敏感属性,从而引发漏洞。本文首次将Web框架中的这类漏洞定义为数据绑定漏洞。
例如,攻击者利用精心构造的payload来操纵Tomcat容器的敏感属性,最终实现RCE攻击。其攻击流程如上图所示:❶ 攻击者利用嵌套属性(如class.module.classLoader.resources.context.parent.pipeline.first.director)精心构造payload并发送给Web应用程序;❷ Spring框架处理数据绑定请求,导致Tomcat容器的敏感属性被篡改;❸ 从而使Tomcat容器自动生成名为poc1.jsp的Webshell文件;❹ 攻击者向poc1.jsp发送命令,Webshell执行该命令。
从上面例子可以看出:数据绑定漏洞利用简单,只需要发送Web请求即可;危害严重,可以导致远程代码执行;影响范围广泛,使用Web框架数据绑定功能的应用程序都可能受到影响。那么,如何发现这类漏洞呢?主要面临以下技术挑战:
挑战一:如何获取嵌套属性?由于属性路径深层嵌套和属性间复杂的指向关系,在获取嵌套属性时存在路径爆炸的问题。常见的解决方法是针对任一属性仅执行一次访问操作,即从多个指向同一属性的路径中选择其中一个路径。然而,这可能导致获取的嵌套属性被数据绑定规则过滤而绑定失败,但是通过另外一条路径获取的嵌套属性却可以绑定成功。
挑战二:如何准确识别可绑定嵌套属性?Web框架的数据绑定规则复杂多样,包含安全过滤规则、数据类型转换规则、属性读写权限过滤规则等,而且这些规则分散在框架各处。因此,很难完整且准确地提取这些数据绑定规则,那么也无法准确识别可绑定嵌套属性。
挑战三:如何自动化触发和检测数据绑定漏洞?数据绑定规则是由操纵敏感属性动态触发的,静态分析的方法并不适合解决这类问题,而模糊测试技术更为适用。但是,在检测数据绑定漏洞的场景下,模糊测试技术也面临一些困难。首先,由于属性类型多样且Web应用程序只接收特定格式的输入,这要求模糊测试技术能够高效地生成有效测试用例。其次,模糊测试技术擅长检测内存破坏型攻击,而数据绑定漏洞造成的攻击并非是内存破坏型攻击,因此需要一套新的检测指标和漏洞识别方法。
DIVER设计
为了解决上述挑战,本文首次提出了一种数据绑定漏洞自动化检测方法,并实现了原型工具DIVER,其主要工作流程如下图所示:
DIVER提出了三个新技术:基于嵌套属性图(Nested Property Graph)的提取技术能够有效处理属性复杂的指向关系,便于获取嵌套属性;基于绑定点插桩(Bind-Site Instrumentation)的识别技术通过对框架进行插桩,依据插桩反馈来判断嵌套属性是否可绑定,避免了依靠提取复杂绑定规则来识别可绑定嵌套属性时带来的漏报和误报;属性感知的模糊测试技术依据属性类型对种子进行变异,提高生成有效测试用例的效率,并且设计不同的检测指标来识别对应类型的攻击。
基于嵌套属性图的提取技术:首先,提出嵌套属性图NPG的形式化定义,图中的节点表示属性,图中的有向边表示属性之间的嵌套关系。其次,构建NPG并提取嵌套属性,以Web测试程序中的一个数据绑定对象为根节点,获取其所有子属性,并以每个子属性作为图的新节点,以属性间嵌套关系作为图的边,不断递归构建出NPG。最后,通过枚举所有从根节点到图中每个节点的路径来获取所有的嵌套属性。
基于绑定点插桩的识别技术:当嵌套属性满足以下两个条件时即为可绑定嵌套属性:一个是可访问性,即Web绑定请求通过嵌套属性的路径可以访问到其指向的属性;另一个是可修改性,即Web绑定请求可以修改对应属性的值。Web框架中与上述两个判定条件对应的关键点即为绑定点,因此,绑定点插桩分为可访问插桩和可修改插桩。对可绑定嵌套属性的识别过程如下图所示:首先,遍历NPG,利用嵌套属性路径构造Web绑定请求,并监测插桩反馈来判断对应的嵌套属性是否可访问。当某个属性不可访问时,其所有子属性也不可访问。根据这一规则对NPG进行剪枝,得到可访问嵌套属性图ANPG,这减少了大量候选可绑定嵌套属性,从而提高识别效率。其次,遍历ANPG,并进行可修改判断,当识别出可绑定嵌套属性时,在图中对应的属性上添加可绑定标记。最终,NPG就转换为了可绑定嵌套属性图BNPG。
属性感知的模糊测试技术:首先,依据属性类型对种子进行变异,种子的结构为“属性路径=属性值”,“属性路径”为可绑定嵌套属性的路径,“属性值”为构造嵌套属性图时获取的属性的默认值。针对不同类型的属性,DIVER执行不同的变异策略。其次,针对数据绑定漏洞引发的不同类型的攻击,DIVER采用不同的检测指标来识别。最后,为了快速恢复自动化模糊测试,DIVER采用基于Docker的测试环境。因为模糊测试依赖Web环境,当Web服务遭遇DoS攻击时,无法继续执行后续的模糊测试。
实验评估
评估DIVER获取可绑定嵌套属性的能力:与Snyk安全团队研发的工具(下文简称为SnykTool)进行对比实验,由于SnykTool仅针对Spring框架,所以测试框架选取Spring框架。测试结果表明,无论是在识别可绑定嵌套属性的数量上还是精度上,DIVER都明显优于SnykTool。
评估DIVER检测数据绑定漏洞的能力:对流行的Java Web框架Spring和Grails在不同的JDK版本(JDK8、JDK11)及不同的部署方式(独立部署、Tomcat容器部署、Jetty容器部署)下进行实验,共发现了81个漏洞(其中9个需要人工参与发现),包括了两个严重性(critical)CVE和一个高危(high)CVE。
总结
本文作为首个对数据绑定漏洞进行系统性研究的工作,提出了三项新技术来自动检测数据绑定漏洞:基于嵌套属性图的提取技术用于提取嵌套属性;基于绑定点插桩的识别技术用于识别可绑定嵌套属性;属性感知的模糊测试技术用于自动触发和检测数据绑定漏洞。研发的DIVER工具在Spring框架、Grails框架中发现81个漏洞,包括2个严重性CVE和1个高危CVE。