Java 语言在应用场景下有更健全的性能,对于很多企业而言是应用程序编写选择中的 Plan A。树大招风,这也使得它成为攻击者重点关注的对象。
在软件开发的过程中,程序员通常会引入第三方库提高自己的研发效率。但开源代码的安全性和可靠性很难保证,近年来开源软件漏洞大规模恶意利用、软件供应链投毒事件屡见不鲜,一旦被攻击者发现应用程序中引用了包含已知漏洞的组件,就可能导致服务器被攻击或者敏感数据泄漏,造成无法想象的严重后果。
传统的 Web 应用防护
传统的基于网络的防御涉及 Web 应用程序防火墙和入侵防御系统,以保护生产系统免受外部威胁。为了避免阻塞合法的流量,这类系统往往采用“日志模式”,来防止错杀问题。
利用 AST(Application Security Testing) 工具分析软件是否存在漏洞时,会面临主要问题、次要问题的优先级排序和误报问题的处理,当漏洞无法避免且项目需要按期交付时,这些工具的结果往往就仅停留在“报告”层面了。
基于 RASP 的 Web 应用保护技术
目前较为流行的保护 Java 应用程序的是运用运行时应用程序自我保护 (RASP),由应用程序运行时本身实现。
RASP 结合了应用程序行为的实时分析和实时上下文感知,通俗来说是分析应用程序做了什么以及这么做是否安全。如此一来,持续的安全分析成为运行时环境的内置功能,系统可以据此立即响应任何已识别的攻击。通过 RASP 技术,可以为包含漏洞的应用程序提供临时保护,为漏洞修复争取宝贵时间。
Java 应用程序实现 RASP 的主流方式是利用 JVM 虚拟机提供的标准接口 Instrumentation。通过该接口可以向指定方法中添加字节码来实现实时数据获取、记录等操作,而无需修改原有的代码逻辑。在此基础上,针对具体的漏洞行为特点就可以实现 Java 程序运行时的实时行为分析和阻断等动作。
原理综述
RASP 在 Java 系统中的工作原理如下图所示:
RASP 探针能够将安全保护能力嵌入到应用程序的执行流程中,因而也被称为“代码疫苗”技术。RASP 探针从应用内部已经经过层层转码后真正执行的明文参数,可以避免被各种编码绕过的痛点。
通过 JavaAgent 的形式将 RASP 运行在 JVM 上,然后借助 Instrumentation 技术 Hook 关键的类和方法。当被 Hook 的函数被调用之后,RASP 会触发检测逻辑,所以不需要拦截每个请求去检测是否命中了攻击的流量特征。
在部署 RASP 探针时,JVM Instruumentation 为我们提供了两种方式将“疫苗”注入到代码中:
* 代理方式:启动进程时使用 -javaagent 参数来将探针相关代码传递给 premain 方法(Agent_OnLoad)。此外,我们可以通过 Agent_OnLoad 方法来卸载插桩,清理 Agent_OnLoad 阶段创建的资源。
* 热加载方式:JVM 提供在运行时以热加载的方式将探针代码传递给 agentmain 方法(Agent_OnAttach)。此方式注入的代码无法在运行时卸载。
基于 Java 系统中 RASP 的应用
01精准应用保护
精准应用保护是指 RASP 相对流量侧安全防护工具具有更低的误报。RASP 运行在应用程序内部,因而可以识别和区分来自应用程序内部的数据和由用户输入产生的外部数据。通过该特性,RASP 相对流量侧防护工具能更好识别业务场景,防止误报和漏报产生。
02防御未知漏洞
RASP 规则基于攻击行为向量来抵御 0day 攻击。例如,在内存马的防御过程中 RASP 可以监听特定 servlet 的方法来判断是否被植入了内存马,亦可在最终调用命令执行的 Runtime.exec() 方法来判断是否将要执行敏感命令。基于这种细粒度的控制可以延伸到运行时的各个方面,使得 RASP 能够阻止异常的操作,即使代码逻辑中本身没有进行足够的安全校验。
03虚拟补丁
RASP 的虚拟补丁是对代码函数级别进行的安全补丁热更新。这对于存在技术限制或对缺陷代码不够了解的企业而言非常重要,既为企业提供了保障老旧应用安全的方案,也可以对 0day 漏洞在官方没有发布修复版本的空窗期提供临时防护。被“打补丁”的应用程序不需要修改代码或者重新编译,可以直接在运行状态实时下发,从而减少了因业务重启而带来的商业风险。
04监管用户输入
将应用程序的安全保护引入 JVM 意味着可以在整个程序执行过程中跟踪用户输入,也就是我们常说的“变量污点跟踪”。该功能可防止在未经适当验证的情况下使用不受信任的用户输入进行数据访问或敏感操作,例如 SQL 查询。此外,污点跟踪可以通过阻止恶意或格式错误的用户输入从不受信任的源传递到受信任的资源来防止代码注入攻击,例如从 HTTP 查询字符串到 SQL 数据库进行 SQL 注入。
无论恶意代码在应用程序代码还是在导入的第三方库或网络中,启用 RASP 的 JVM 都可以防御 0day 漏洞。安全管理员可以在不重新启动或中断应用程序服务的情况下,对正在运行的应用程序添加新规则,从而使他们能够在发现新漏洞后立即阻止它,无需等待供应商提供的补丁。同时,通过将安全性引入 JVM,可以始终以可行的方式保护核心的代码,在不更改软件不影响性能的前提下保护多个应用程序。
总结
RASP 的强耦合能够为应用的安全性突破质的提升,但同时也使得 RASP 在落地方面比起其他的安全产品会麻烦一些。传统的安全产品只需要在网关上即可进行部署,但 RASP 需要开发运维人员去修改配置才能完成部署,这意味着需要花费更多的精力。
另一个缺憾则是 RASP 在不同语言下的解决方案并不相同,本文主要介绍的是 RASP 在 Java 中的应用,当其出现在 PHP 或其他不同语言的开发框架下,则需要形成一套独立的 RASP 产品。
未来 RASP 的研究方向会朝着在保证基本优势不损耗的前提下,让部署变得轻量级从而更好地实现产品落地。任何一款产品都无法做到尽善尽美,所以我们才能在安全的道路上不断前行,期待 RASP 在未来取得突破性的优化。
云鲨RASP
基于运行时情境感知技术的新一代应用威胁免疫平台
悬镜云鲨RASP自适应威胁免疫平台作为悬镜第三代DevSecOps智适应威胁管理体系中运营环节的持续检测响应平台,通过专利级AI检测引擎、应用漏洞攻击免疫算法、运行时安全切面调度算法及纵深流量学习算法等关键技术,将主动防御能力“注入”到业务应用中,借助强大的应用上下文情景分析能力,可捕捉并防御各种绕过流量检测的攻击方式,提供兼具业务透视和功能解耦的内生主动安全免疫能力,为业务应用出厂默认安全免疫迎来革新发展。
官网:https://rasp.xmirror.cn/