Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△

d4a2866900f189ea0c7eac2f971e32bf.png

作者 l Hollis

来源 l Hollis(ID:hollischuang)

9e26a32a76feabd6cb5f5ab93dbf2c9c.png

这篇文章我周一发过,但是因为一些"人在江湖、身不由己"的原因,原文删除了,但是很多人找我还是想看看内容,所以我改了一点内容,重新发一下:

Apache Log4j2 远程代码执行漏洞的问题最近闹得沸沸扬扬的,很多人都被大半夜叫起来紧急修复这跟问题。

有很多人在微信上问我:这种漏洞还能怎么修?下次有问题还要再升级版本吗?有没有啥一劳永逸的办法?就没啥办法避免吗?

其实,是有的。有一种技术,可以针对这类漏洞做定向拦截。可以让开发者不用急急忙忙修这个漏洞,甚至你如果完全不想修都可以。

这就是RASP技术。

其实这个技术已经诞生很久了,在安全圈也应用很广泛。应用范围也很广泛了。

RASP

RASP 是 Runtime Application Self-Protection 的缩写,这是一种应用安全保护技术。他的原理是将保护程序注入到应用程序中,与应用程序融为一体,能够起到实时监测、阻断攻击的作用,使程序自身拥有自保护的能力。

听起来是不是很高大上?

其实,RASP就是拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。

ed9afb4f5335313e020b37fa9c6ebf21.png

RASP 技术非常是和对于0Day 漏洞的防护,如反序列化漏洞、JNDI 注入漏洞、表达式注入漏洞、SQL 诸如漏洞、远程代码执行漏洞等。

WAF 和 RASP

在安全防护上,很多人都知道WAF(Web Application Firewall),俗称防火墙,那么,和防火墙相比,RASP 技术其实有着很多的优点。

传统的 WAF 主要通过分析流量中的特征过滤攻击请求,并拦截携带有攻击特征的请求。但是因为 WAF 只能基于流量规则进行防御,无法根据应用上下文进行检测,所以存在误报率高容易绕过等问题。

但是,RASP 则不同,他就像疫苗会注入到人体一样,RASP 是运行在应用之中的,与应用融为一体,可以获取到应用运行时的上下文,根据请求上下文进行拦截可以对攻击进行精准的识别和拦截。

94366bfbd01ba3c1bf5d7f65c1ff9501.png

防火墙就像为簇拥在大人物周围的保镖,大人物去哪里都带着保镖,看起来防御力爆棚,但是大人物本人肌肉不发达也没有武功,一旦保镖被突破或者保镖被调虎离山,那么这个大人物就没有任何保护了,就非常危险了。而RASP 则是让没有武功的人在很短的时间并且付出的代价不高的情况下拥有很高的自我保护能力。

RASP 具有以下优点:

  • 1.误报率低。

  • 2.可以防护0Day级别的漏洞攻击。

同时也并不是完全没有缺点,主要的问题就是可能带来一定的性能损耗。还有就是开发难度比较高,需要对 JVM 字节码、ASM 工具、漏洞触发原理以及各类Java 应用容器都有所了解。

RASP技术目前已经非常成熟,在PHP、Java、.NET等多种语言中都有实现方案。

实现原理

不同于基于流量特征的检测,RASP 主要关注应用自身的行为,而非流量本身。

当 RASP 发现一个应用,做了它不应该做的事情时,大概率意味着当前应用已经被攻击者利用漏洞攻陷并做了一些高危操作。

以这次 Log4j的漏洞来看,RASP 并不关注请求中的流量是否包含了恶意的 payload,而是去关注 Log4j2 究竟使用 JNDI 功能去做了什么。如果进行正常的 JNDI 查询,就没有问题;但如果企图使用 JNDI 功能进行命令执行,就是一个显而易见的危险行为。

RASP 要将自己注入到被保护的应用中,基本思路类似于 Java 中的 AOP 技术,将 RASP 的Hook代码注入到需要进行检测的地方,根据上下文和关键函数的参数等信息判断请求是否为恶意请求,并终止或继续执行。

想要实现RASP,在 Java中逃不开 Agent 技术,Agent是一个运行在目标JVM的特定程序,它的职责是负责从目标JVM中获取数据,然后将数据传递给外部进程。

在Java SE 5之前,要实现一个Agent只能通过编写Native代码来实现。从Java SE 5开始,可以使用Java的Instrumentation接口(java.lang.instrument)来编写Agent。

使⽤ Instrumentation,开发者可以构建⼀个独⽴于应⽤程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。

d65e5aa6cc78337a4e2f3ec5d4f3030e.png

Java Agent支持目标JVM启动时加载,也支持在目标JVM运行时加载,这两种不同的加载模式会使用不同的入口函数,如果需要在目标JVM启动的同时加载Agent,那么可以选择实现下面的方法:

public static void premain(String agentArgs, Instrumentation inst);public static void premain(String agentArgs);

在premain函数中,我们可以对字节码进⾏操作,织⼊Rasp的安全探针。

public static void premain(String agentArgs, Instrumentation inst)throws ClassNotFoundException, UnmodifiableClassException {inst.addTransformer(new ClassTransformer());}

借助ClassFileTransformer接口,实现对字节码的修改,定义一个类,实现ClassFileTransformer接口,并重写transform方法,在这个方法中,通过 ASM 技术修改字节码。

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {byte[] transformeredByteCode = classfileBuffer;if (Config.moudleMap.containsKey(className)) {try {ClassReader reader = new ClassReader(classfileBuffer);ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);ClassVisitor visitor = Reflections.createVisitorIns((String) Config.moudleMap.get(className).get("loadClass"), writer, className);reader.accept(visitor, ClassReader.EXPAND_FRAMES);transformeredByteCode = writer.toByteArray();} catch (Exception e) {e.printStackTrace();}}return transformeredByteCode;}

简单的原理就是这样的,因为篇幅优先就不在这里展开太多了,大家如果感兴趣的话,可以看一下 (https://github.com/xbeark/javaopenrasp )这个开源项目,这是我的一个阿里同事搞的一个简单的 RASP Demo,里面包含了一些REC、SQL 注入等的防护:

4a562dbd105546038e368034e65f730a.png

使用 Java实现的,代码不多,很容易理解。

开源工具

RASP作为一个相对成熟的技术,现在已经有很多开源的产品了,国内外都有很多。如国外的Micro Focus、Prevoty、OWASP AppSensor、Shadowd等等。

国内也有很多厂商也有类似的工具。如:

  • 安百科技——灵蜥

    • http://www.anbai.com/lxPlatform/

  • 百度——OpenRasp

    • https://rasp.baidu.com/

  • 椒图科技——云锁

    • https://www.yunsuo.com.cn

以上,我们给大家介绍了 RASP 技术,以及他的简单原理,并给大家提供了一个简单的 Demo 应用,可以方便大家深入学习,如果想要使用一些开原产品的话,也给大家推荐了几个,可以选择性的了解一下。

但是,话又说回来,安全攻防没有绝对,这个领域永远都是攻击者和防守者之间的博弈过程。没有绝对的安全,所有安全手段只是让攻击的成本更高而已。

所以,RASP 技术也并不是完完全全100%的可以做到万无一失,但是,从目前业内的很多应用来看,这个技术目前还是比较成熟的,对于一些常见漏洞的预防还是行之有效的。

参考资料:

https://segmentfault.com/a/1190000041132495

https://www.freebuf.com/articles/web/197823.html

https://github.com/xbeark/javaopenrasp

9bcdb36e44f1494f74a828932e0b0121.gif

往期推荐

87a90ee9ed0c7f25cbc97307933f689e.png

更快的Maven来了,我的天,速度提升了8倍!


c06d4fbc070ad2a13eb8dd6aef0fdd54.png

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!


5840a2459a7fefd6642c96d1dee3e0fa.png

Java 中接口和抽象类竟然有 7 点不同?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装eclipse

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 13.04下的安装eclipse 一、eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址&#xff1a;http://www.eclipse.org/downloads/download.php?file/technology…

github果然强大

github果然强大&#xff0c;在idea里写好&#xff0c;可以直接提交到github&#xff0c;在哪台电脑都可以看源码了&#xff0c;手机也可以看 https://github.com/gaojinhua 转载于:https://www.cnblogs.com/gaojinhua/p/4705992.html

保姆级教程,终于搞懂脏读、幻读和不可重复读了!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;我的文章合集&#xff1a;https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种&#xff1a;读未提交&am…

保姆级教程,终于搞懂脏读、幻读和不可重复读了!(经典回顾)

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;我的文章合集&#xff1a;https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种&#xff1a;读未提交&am…

WPF入门教程系列十五——WPF中的数据绑定(一)

使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面&#xff0c;同时 WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似&#xff0c;但也有所不同&#xff0c;在 WPF中以通过后台代码绑定、前台XAML中进行绑定&#xff…

实战,实现幂等的8种方案!

前言 大家好&#xff0c;我是程序员田螺。今天我们一起来聊聊幂等设计。什么是幂等为什么需要幂等接口超时&#xff0c;如何处理呢&#xff1f;如何设计幂等&#xff1f;实现幂等的8种方案HTTP的幂等1. 什么是幂等? 幂等是一个数学与计算机科学概念。在数学中&#xff0c;幂等…

灰度共生矩阵及其数字特征_数字系统及其表示

灰度共生矩阵及其数字特征Any number system has a set of symbols known as Digits with some rules performing arithmetic operations. A collection of these makes a number has two parts. They are integer portion and fraction portion. These portions are separated…

绝绝子,画框架图就用这个工具

前言看过我以往文章的小伙伴可能会发现&#xff0c;我的大部分文章都有很多配图。我的文章风格是图文相结合&#xff0c;更便于大家理解。最近有很多小伙伴发私信问我&#xff1a;文章中的图是用什么工具画的。他们觉得我画的图风格挺小清新的&#xff0c;能够让人眼前一亮。先…

面试官:this和super有什么区别?this能调用到父类吗?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》&#xff1a;https://gitee.com/mydb/interviewthis 和 super 都是 Java 中常…

SpringBoot 热部署神器快速重启的秘密!

今天咱们来聊聊这个热部署神器 spring-boot-devtools 的运行原理&#xff0c;看看它是怎么用这个 ClassLoader 来实现快速重启&#xff0c;帮我们节省时间的&#xff01;&#x1f61d;文章概要文章的主旋律如下&#x1f447;spring.factories我们直接打开 spring-boot-devtool…

计算机操作系统 内存_计算机内存的类型| 操作系统

计算机操作系统 内存什么是记忆&#xff1f; (What is Memory?) The essential component of the computer is its Memory. It is assembled on the motherboard as it is a storage device used for storing data and instructions for performing a task on the system. 计算…

关于 java 实现 语音朗读

最近有个java项目要实现 一个 java语音朗读的功能&#xff0c;百度了半天 没有现成的 。也是一头雾水。没具体思路。。。。。大体上总结了下网上的资料 1.java 实现起来 比c或者vb 能麻烦点&#xff0c;或者是这个功能用其他语言完成 然后整合到java 项目里面去&#xff01;2.…

查询MySQL字段注释的 5 种方法!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;很多场景下&#xff0c;我们需要查看 MySQL 中表注释&#xff0c;或者是某张表下所有字段的注释&#xff0c;所以本文就来盘…

聊聊索引失效的10种场景,太坑了

前言今天我接着上一期数据库的话题&#xff0c;更进一步聊聊索引的相关问题&#xff0c;因为索引是大家都比较关心的公共话题&#xff0c;确实有很多坑。不知道你在实际工作中&#xff0c;有没有遇到过下面的这两种情况&#xff1a;明明在某个字段上加了索引&#xff0c;但实际…

Java中的main方法

2019独角兽企业重金招聘Python工程师标准>>> 在一个Java应用程序中&#xff0c;通常程序的入口是一个main方法&#xff0c;它被声明为公有静态方法&#xff0c;参数是一个字符串数组&#xff0c;返回值为Void类型。这个方法有许多值得研究的地方&#xff0c;今天就来…

约瑟夫环问题(C++)

问题描述 首先&#xff0c;说明一下这个问题是研究生期间c课的综合作业&#xff0c;本来有好多选择但最后还是选择了约瑟夫环问题。下面是约瑟夫环的问题描述以及设计要求&#xff1a; 约瑟夫环&#xff08;约瑟夫问题&#xff09;是一个数学的应用问题&#xff1a;已知n个人&…

实战!工作中常用到哪些设计模式

前言 大家好&#xff0c;我是捡田螺的小男孩。平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。今天跟大家…

什么是bcd码数据传输通讯_传输障碍| 数据通讯

什么是bcd码数据传输通讯传输障碍 (Transmission Impairment) In the data communication system, analog and digital signals go through the transmission medium. Transmission media are not ideal. There are some imperfections in transmission mediums. So, the signa…

Spring boot项目(问答网站)之timeline的推拉两种模式

Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合&#xff0c;主要包含&#xff1a; 关注用户的最新动态热门推荐广告推荐整合等等. 推、拉模式 推模式&#xff1a; 当一个用户关注了或者评论了一个问题或用户&#xff0c;触发事件&…

Bean放入Spring容器,你知道几种方式?

作者&#xff1a;三尺微命 一介书生来源&#xff1a;blog.csdn.net/weixin_43741092/article/details/120176466我们知道平时在开发中使用Spring的时候&#xff0c;都是将对象交由Spring去管理&#xff0c;那么将一个对象加入到Spring容器中&#xff0c;有哪些方式呢&#xff…