Log4j漏洞?一行代码都不改就能永久修复?
△Hollis, 一个对Coding有着独特追求的人△
作者 l Hollis
来源 l Hollis(ID:hollischuang)
这篇文章我周一发过,但是因为一些"人在江湖、身不由己"的原因,原文删除了,但是很多人找我还是想看看内容,所以我改了一点内容,重新发一下:
Apache Log4j2 远程代码执行漏洞的问题最近闹得沸沸扬扬的,很多人都被大半夜叫起来紧急修复这跟问题。
有很多人在微信上问我:这种漏洞还能怎么修?下次有问题还要再升级版本吗?有没有啥一劳永逸的办法?就没啥办法避免吗?
其实,是有的。有一种技术,可以针对这类漏洞做定向拦截。可以让开发者不用急急忙忙修这个漏洞,甚至你如果完全不想修都可以。
这就是RASP技术。
其实这个技术已经诞生很久了,在安全圈也应用很广泛。应用范围也很广泛了。
RASP
RASP 是 Runtime Application Self-Protection 的缩写,这是一种应用安全保护技术。他的原理是将保护程序注入到应用程序中,与应用程序融为一体,能够起到实时监测、阻断攻击的作用,使程序自身拥有自保护的能力。
听起来是不是很高大上?
其实,RASP就是拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
RASP 技术非常是和对于0Day 漏洞的防护,如反序列化漏洞、JNDI 注入漏洞、表达式注入漏洞、SQL 诸如漏洞、远程代码执行漏洞等。
WAF 和 RASP
在安全防护上,很多人都知道WAF(Web Application Firewall),俗称防火墙,那么,和防火墙相比,RASP 技术其实有着很多的优点。
传统的 WAF 主要通过分析流量中的特征过滤攻击请求,并拦截携带有攻击特征的请求。但是因为 WAF 只能基于流量规则进行防御,无法根据应用上下文进行检测,所以存在误报率高、容易绕过等问题。
但是,RASP 则不同,他就像疫苗会注入到人体一样,RASP 是运行在应用之中的,与应用融为一体,可以获取到应用运行时的上下文,根据请求上下文进行拦截可以对攻击进行精准的识别和拦截。
防火墙就像为簇拥在大人物周围的保镖,大人物去哪里都带着保镖,看起来防御力爆棚,但是大人物本人肌肉不发达也没有武功,一旦保镖被突破或者保镖被调虎离山,那么这个大人物就没有任何保护了,就非常危险了。而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 上的程序,甚至能够替换和修改某些类的定义。
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 注入等的防护:
使用 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
往期推荐
更快的Maven来了,我的天,速度提升了8倍!
保姆级教学:缓存穿透、缓存击穿和缓存雪崩!
Java 中接口和抽象类竟然有 7 点不同?
Log4j漏洞?一行代码都不改就能永久修复?相关推荐
- 全网连夜修复的Log4j漏洞,如何做到一行代码都不改?
GitHub 21.5k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.5k Star 的Java工程师成神之路,真的不来了解一下吗! Apache Log4j2 远程代码 ...
- 离职交接文档_离职程序员交接工作被同事怒怼:每一行代码都讲清楚,不然投诉你...
我们都知道,员工在离职之前都要完成一份工作,那就是交接工作.在工作层面上讲,这样做算得上是有始有终了,在道德层面上讲,我们不能说走就走,把摊子就给别人,这是不负责任的表现. 交接工作也需要我们认真对待 ...
- 程序员工作交接文档怎么写_离职程序员交接工作被怒怼:每一行代码都必须讲清楚,不然投诉...
阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都会有分享,都是免费订阅,请您放心关注.注:本文转载自网络,不代表 ...
- 程序员离职代码交接_离职程序员交接工作被同事怒怼:每一行代码都必须讲清楚,不然投诉...
一般员工离职都需要提前一段时间,递交离职申请,为的就是让公司和员工都有一个缓冲期,可以把手头的工作交接好,以免无法维持公司的正常运营.一般来说,离职员工也会将手头的工作详细交代一下,以免给公司带来不必 ...
- 高响应比优先算法代码_以梦为码丨让每一行代码都充满温情
本期热点 智能校园部招聘专场 小海 小海冲鸭 我们一直在打磨的多款产品在上周海亮教育研究院产品发布会上崭露头角,激动!!! 别说话,我在敲代码 发布了哪些呀? 小海冲鸭 iClass.海亮星课堂.模板 ...
- 一行代码都不写!Github 博客小白版入门教程
赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI GitHub不仅可以传代码,还可以建博客.利用GitHub Pages平台,就可以搭建非常好用的个人博客. 但是难点在于,你在要敲很多代码才 ...
- 一行代码都不写!Github博客小白版入门教程
赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI GitHub不仅可以传代码,还可以建博客.利用GitHub Pages平台,就可以搭建非常好用的个人博客. 但是难点在于,你在要敲很多代码才 ...
- 一行代码都不用写,教你如何快速搭建Github博客!!!
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 转载自量子位 GitHub不仅可以传代码,还可以建博客.利用GitHub Page ...
- python文字识别库_python做文字识别一行代码都不用!
今天,我们用Python实现对图像文字的识别,很简单!利用的库是pillow和pytesseract.pytesseract需要从网上下载,也很方便. 学习Python中有不明白推荐加入交流群 号:9 ...
最新文章
- centos6源码安装mysql5.6.29
- declare handler 声明异常处理的语法
- 使用gethostname()函数和gethostbyname()函数获取主机相关信息
- 前端学习(2821):windows上配置tabber字段
- 企业网站 源码 服务邮箱:_公司企业邮箱购买,外贸企业邮箱用哪家服务好?
- Bootloader启动过程
- gbase 8s oracle,GBase8s 查看数据库表空间信息
- 盘绕过苹果id方法_如何更换苹果ID?
- matlab2c使用c++实现matlab函数系列教程-poisspdf函数
- MATLAB绘制柱状图带标准误差线
- 计算机辅助 高等数学教学,高等数学计算机辅助教学理论的探讨(6页)-原创力文档...
- 【SEAN的日志】如何突破微信小程序2M限制?
- mysql execute stmt_25.2.7.10. mysql_stmt_execute()
- 【详细】Oracle数据库安装教程--Oracle DataBase 19c
- Mac如何固定桌面排序
- Redis 面试面面观
- 蓝色主机 bluehost主机 启用CloudFlare的cdn加速服务
- WPF编程--地图控件GMap使用
- linux iso挂载报错,linux下文件系统、iso挂载
- c#使用Aspose实现Word域套打
热门文章
- mongotemplate中save抛出异常_异常处理的三个好习惯 | Python 工匠
- ISA Server 2006 部署步骤
- 【JUnit 报错】 method initializationerror not found:JUnit4单元测试报错问题
- 使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码
- zabbix server 迁移步骤
- PHP高并发高负载系统架构
- [翻译] Haneke(处理图片缓存问题)
- 关于linux下制作静态库
- 深入解读ESB与SOA的关系
- mysql时区设置gmt_将MySQL数据库时区设置为GMT