代码疫苗技术,是一种能够通过运行时插桩技术进行应用漏洞检测及安全防护的新一代安全技术,其所涵盖的IAST技术与RASP技术,已连续数年被Gartner列在十大安全技术之内。
在不久前的【T·TALK】系列活动第七期中,我们特别邀请到了悬镜安全CTO宁戈做客直播间,为大家分享代码疫苗技术的原理、实现及落地实践经验。【T·TALK】也将这期分享的精彩内容进行了整理,希望能为读者带来一些启发:
代码疫苗概念
近年来,在技术创新的驱动下,软件技术上下游产业的演替不断加速。开发模式、应用架构、服务器与基础设施的升级,使得应用软件的开发流程变得愈发复杂。与此同时,伴随着软件复杂度的提升,软件安全所面临的问题与挑战也在持续增加。
代码疫苗技术,是一种能够通过运行时插桩技术进行软件运行时风险自发现及威胁自免疫的新一代安全技术,其核心内涵主要包含四个方面:
- 无需代码安全专家逐行分析源代码
- 无需对原有代码逻辑进行修改调整
- 无需维护复杂流量过滤策略及规则
- 不会忽略应用程序中超90%由第三方组件引入的风险
与医学届对疫苗的定义相似,代码疫苗技术并不是传统的外挂式安全,其侧重点是从开发源头侧规避安全风险,并为应用搭建更加有效的内生积极防御体系。而帮助代码疫苗技术实现这一目标的两个核心,则是基于单探针插桩的IAST技术与RASP技术。
IAST全称交互式应用安全测试,是近几年的新兴安全测试技术。与SAST白盒安全测试技术、DAST黑盒安全测试技术两种传统的安全漏洞解决方案相比,IAST的漏洞检出率更高、适配场景更多,也更加适用于目前流行的DevOps场景。
RASP全称运行时应用自防护。不同于传统的WAF或IDS在流量层的检测,RASP更多的是与应用耦合在一起,通过运行时插桩,对应用的运行时环境进行检测。利用这样的方式,RASP能够拦截从应用程序到系统的所有调用,确保它们的安全,从而实时检测和阻断各式各样的安全攻击。
代码疫苗技术,则是将IAST技术的漏洞检测能力与RASP技术的攻击防护能力进行了合并。将这两项技术整合成一个统一的IAST和RASP探针,以此实现统一的从漏洞检测到漏洞防护的全生命周期一体化的检测与防护解决方案。
代码疫苗技术原理
无论IAST技术还是RASP技术,都依赖运行时插桩进行实现。运行时插桩是在应用层通过应用启动后,替换函数体或在函数前后插入检测代码来实现的。通过插桩代码,可以快速获得应用运行在关键点的数据信息。
需要注意的是,由于不同语言间存在运行时的环境差异,因此不同语言实现插桩的方式也会有所区别。以Java为例,由于Java拥有Instrument的特性,因此在类加载的过程中,需要对所关注的关键类与方法的字节码进行修改,才能够达到插入检测逻辑的目的。
IAST从概念角度可分为广义与狭义两种。广义的IAST包含流量学习和日志分析模式,通过对镜像流量及日志等数据进行重放及分析,以达到检测目的。此外,广义的IAST对研发测试等使用人员完全透明,无流程侵入,不依赖应用编程语言。
狭义IAST特指运行时插桩模式,能够帮助普通研发测试人员快速完成业务安全测试,精准定位漏洞细节及修复指导。同时,狭义IAST分为两种模式,一种是主动IAST,通过插桩分析流量数据,另一种则是使用动态污点分析技术的被动IAST。
动态污点分析技术能够基于运行时插桩跟踪外部可控数据对应用的影响,进而分析外部数据在应用内部的流转情况,从而确定应用是否存在漏洞。由于动态IAST拥有无重放数据、无脏数据、可应对加密签名接口、可适配复杂场景等优点,因此目前的适用面是比较广泛的。
在动态污点分析技术中,可以将污点传播的整体过程分为污点输入、污点传播与污点汇集三个阶段。在污点输入阶段,所有外部数据都被默认为不可信数据,因此需要在外部数据进入应用的时候,对其添加污点标记。
污点传播阶段,主要目标为跟踪污点数据的传播过程。由于外部数据在进入应用程序时已被污点标记,因此当被标记数据进行运算或字符串拼接及其他操作后,所产生的新数据也将会携带污点标记。
污点汇集阶段,需要对可能触发漏洞的函数进行关注。确定携带污点标记的数据是否会汇聚到例如SQL执行或文件读写等敏感函数之上。若该过程发生,则意味着在应用程序中的这些函数执行流程中可能存在着漏洞。
当然,如果在污点传播阶段,携带污点标记的数据遇到了清洁函数,并被成功执行了过滤操作或其他安全操作,则会将该数据所携带的污点标记消除,以此来确认这一条链路的安全性。这就是动态污点分析技术的执行原理。
RASP的核心则是通过插桩技术将防护逻辑与防护功能注入应用程序,深入应用运行时的环境内部,通过分析与了解数据流及事件流,检测和防护无法预见的安全威胁与攻击事件(如0day攻击)。这种运作模式,使得RASP能够解决WAF所存在的检测规则与功能无法对应、无法知晓服务端防御方式、变形及未知威胁防御乏力、微服务场景难适配等痛点。
RASP能够获取运行时的上下文数据。在这其中,第一类数据是HTTP请求及响应数据与各式RPC协议,例如dubbo的请求与响应数据,以及gRPC等各式RPC框架。
第二类是所关注函数的执行数据,包括动态运行时,函数所接收到的完整参数、调用函数的对象实例以及函数执行的返回值。通过获取运行时过程中函数整体执行的状态,便能够判断运行函数执行过程中是否存在所关注的数据。
第三类则是函数执行过程中的调用栈。获取完整的函数调用栈,一方面便于研发进行漏洞分析与攻击分析。另一方面,也可以通过函数调用栈分析攻击者的行为。常用的一些反序列化的攻击手段,都可以通过函数调用栈进行分析。第四类是应用配置信息。获取应用的各类安全配置、代码内属性配置等信息,可以完整得知该应用是否执行了安全策略。
基于获取的运行时上下文数据,RASP可以进行分析和运用,根据采用的算法或者检测逻辑分为几大类。
第一类也是最常规的是规则方式,对获取的参数或者HTTP请求综合进行规则匹配。
第二类是RASP的亮点功能,就是基于词法的分析。由于RASP所获取的数据更加全面,因此RASP能够针对完整的输入如SQL、命令执行等信息数据进行词法分析,以判断关键函数执行点上的数据是否存在异常。
第三类是行为及运行堆栈检测,主要用来检测敏感函数的执行。例如当WebShell植入系统后,会通过变形混淆绕过检测,但在执行系统命令或文件操作的过程中,其必定会调用底层运行时的API,此时通过行为及运行堆栈分析,便能够得知执行调用的函数或函数调用栈。
第四类则是应用运行配置检测,也就是对代码中的动态安全配置及其他配置检测。例如增加了某些安全配置后,部分漏洞就无法再被利用了。这其中包括预编译这类防范SQL注入的方式,以及XXE的关闭外部实体访问这类方式等。这样便能够完整地了解目前应用所存在的安全防护情况。
综合以上四类方式,可以实现应用运行时的自我防护。
在整体防护体系中,RASP会与每个应用耦合,但其与WAF、IDS/IPS、防火墙等防护是并不冲突的。RASP适用于现代开发或应用架构,其与应用、微服务是相伴相生的。因此这些安全解决方案,每个都是纵深防御体系中的一个环节。
代码疫苗技术实践
代码疫苗技术的实践主要有四类场景。第一类是应对DevOps的检测防护一体化。由于探针是比较轻量级的,可以随流水线一同上线发布。在开发和测试环节,可以利用IAST进行漏洞检测,上线后则可以开启RASP进行漏洞防护,以实现全流程的检测防护一体化,使DevOps的效率更高。
第二类场景是红蓝对抗。在这一场景下,RASP充当的是高级漏洞攻击防护工具的角色。目前红蓝对抗中会更多地应用0day、1day或一些未公开的EXP进行攻防。这对于传统的流量手段而言是难以防护的,而RASP则有能力应对一些高级攻击。
第三类场景是应对突发漏洞的应急。RASP能够提供针对基于行为与调用栈位置威胁的检测。这可以在一定程度上缓解0day或1day攻击,为漏洞修复争取时间。也可以利用RASP提供的热补丁功能,通过一些简单配置,先进行第一波漏洞攻击的防护。
第四类则是应用上线的自免疫。在容器化的环境之中,可以将探针和应用进行打包,使应用在上线之后能够自带攻击防护效果。
代码疫苗技术也同样关注性能与熔断方面的问题。代码疫苗技术也会提供一些基于CPU或内存、QPS/TPS的熔断策略。例如,代码疫苗技术会提供CPU、内存、QPS/TPS的阈值,当超过这一阈值时,探针就会进行熔断降级,以确保业务优先、不影响业务的运行。
代码疫苗技术针对IAST与RASP有着一整套应用风险的闭环管理。在IAST层面,在发现漏洞后进行自动化的漏洞验证,通过在参数点上增加payload进行数据重放(重放量很小)以验证漏洞。若漏洞存在,则会通过对接的平台通知企业的相应负责人。此时负责人便可进行漏洞修复或选择启动RASP的热补丁功能模块进行漏洞的临时防护。
最后,以2021年Log4j2组件的远程代码执行漏洞的防护为例,梳理一下代码疫苗技术的防护流程。当应用的某个接口或接口背后的实现应用了Log4j2的组件并开启了模块化JNDI的Log4j栈内服务输出与日志输出,则系统中就会存在这一漏洞。
对攻击者而言,探测到漏洞存在,即可基于漏洞的接口发送HTTP请求,JNDI注入的数据传入到Log4j的写日志操作之中。当写日志操作执行时,就会触发这一漏洞,并请求攻击者的服务器,将外部的class文件加载到应用之中,从而造成远程代码执行。
在这一过程中,有多个步骤都是RASP能够进行拦截的。首先,在发送写日志请求时,会内部发送一个类似于SSRF的请求,这是RASP能够进行的第一层防护。其次,在攻击者进行JNDI注入时,RASP也能够对这一操作进行拦截。最后,在攻击者进行命令执行的环节,RASP同样会针对这一操作采取相应的防护。
当漏洞的原理明晰之后,可以通过热补丁对漏洞点进行精准插桩,同时基于插桩技术梳理应用所有依赖的组件与版本号,结合SCA或OSS的功能对组件漏洞进行分析。因此,代码疫苗技术能够对Log4j2这类0day漏洞进行较好防护并为漏洞的修复争取宝贵的时间。
嘉宾介绍:
悬镜安全CTO宁戈,拥有10年前沿安全技术研究实践经验,长期从事系统软件与应用软件的漏洞研究及自动化检测技术研究,专注于IAST、RASP等运行时检测防御技术及DevSecOps体系的产品化实践。负责悬镜IAST、RASP、SCA等多个产品线的设计与研发。拥有多项原创发明专利授权,多次参与国家级科研和安全保障项目,获得多个国家级网络安全领域奖项。