GitHub 21.5k Star 的Java工程师成神之路,不来了解一下吗!

GitHub 21.5k Star 的Java工程师成神之路,真的不来了解一下吗!

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等等。

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

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

参考资料:

https://segmentfault.com/a/1190000041132495

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

https://github.com/xbeark/javaopenrasp

全网连夜修复的Log4j漏洞,如何做到一行代码都不改?的更多相关文章

  1. 【原创】够强!一行代码就修复了我提的Dubbo的Bug。

    这是 why 技术的第 28 篇原创文章 之前在<Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?>中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug. 对于解决 ...

  2. 修复Apache Log4j任意代码执行漏洞安全风险通告

    2021年12月10日 0x01漏洞背景 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了 ...

  3. Log4j漏洞源码分析

    Log4j漏洞源码分析 这几天Log4j的问题消息满天飞,今天我们就一起来看看从源码角度看看这个漏洞是如何产生的. 大家都知道这次问题主要是由于Log4j中提供的jndi的功能. 具体涉及到的入口类是 ...

  4. 我们一起分析一下这个刚刚修复的RDP漏洞CVE-2019-0708

    写在前面的话 在微软今年五月份的漏洞更新安全公告中,提到了一个跟远程桌面协议(RDP)有关的漏洞.我们之所以要在这里专门针对这个漏洞进行分析,是因为这个漏洞更新涉及到Windows XP以及其他多个W ...

  5. 升级过log4j,却还没搞懂log4j漏洞的本质?

    摘要:log4j远程代码漏洞问题被大范围曝光后已经有一段时间了,今天完整讲清JNDI和RMI以及该漏洞的深层原因. 本文分享自华为云社区<升级过log4j,却还没搞懂log4j漏洞的本质?为你完 ...

  6. idea解决springboot项目中log4j漏洞升级问题

    最近阿里云团队发现log4j漏洞,危险级别:严重,相关资讯 https://m.sohu.com/coo/hsdt/506958086_355140 https://www.sohu.com/a/50 ...

  7. 错误问题之“Apache Log4j 漏洞,在版本为包含2.14以内!”

    漏洞概述 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器. Log4j 1.2 中包含一个 SocketServer 类,该类容易受到不可信数据反序列化的影响,当侦听 ...

  8. 齐博cms最新SQL注入网站漏洞 可远程执行代码提权

    齐博cms整站系统,是目前建站系统用的较多的一款CMS系统,开源,免费,第三方扩展化,界面可视化的操作,使用简单,便于新手使用和第二次开发,受到许多站长们的喜欢.开发架构使用的是php语言以及mysq ...

  9. RHSA-2017:2299-中危: NetworkManager 和 libnl3 安全和BUG修复更新(本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

随机推荐

  1. 基于树莓派部署 code-server

    code-server 是 vscode 的服务端程序,通过部署 code-server 在服务器,可以实现 web 端访问 vscode.进而可以达到以下能力: 支持跨设备(Mac/iPad/iPh ...

  2. 【Services】【Web】【tomcat】配置tomcat支持https传输

    1. 基础: 1.1. 描述:内网的tomcat接到外网nginx转发过来的请求之后需要和外网的客户端进行通讯,为了保证通讯内容的安装,使用tomcat使用https协议. 1.2. 链接:http: ...

  3. css实现项目中的加载动画

    // =========================================第一个动画 <template> <!-- 这个组件用于 页面下滑到底部时 展示加载动画 -- ...

  4. 使用Spring JDBC连接数据库(以SQL Server为例)

    一.配置Spring JDBC 1.导入相关jar包 (略) 2.配置文件applicationContext.xml <?xml version="1.0" encodin ...

  5. JDK各版本新增的主要特性总结

    JDK1.5新特性: 1.自动装箱与拆箱: 2.枚举 3.静态导入,如:import staticjava.lang.System.out 4.可变参数(Varargs) 5.内省(Introspec ...

  6. Linux进程操作

    查看进程启动时间 ps -eo pid,lstart | grep PID 查看进程的运行多久 ps -eo pid,etime |grep PID 查看进程中启动了哪些线程 top -H -p pi ...

  7. 如何优雅的在scrapy中使用selenium —— 在scrapy中实现浏览器池

    1 使用 scrapy 做采集实在是爽,但是遇到网站反爬措施做的比较好的就让人头大了.除了硬着头皮上以外,还可以使用爬虫利器 selenium,selenium 因其良好的模拟能力成为爬虫爱(cai) ...

  8. mysql联合索引阻碍修改列数据类型:BLOB/TEXT column 'name' used in key specification without a key length

    今天在项目中mysql表中有一个字段数据类型为varchar,长度不够需要换为text类型 当时表是已经存在的表, CREATE TABLE `table_aaa` ( `id` int NOT NU ...

  9. CF74A Room Leader 题解

    Content 一场 CF 比赛有 \(n\) 个人,有 ABCDE 五道题目.在比赛过程中,参赛者还可以随时互相攻击,成功一次加 \(100\) 分,失败一次扣 \(50\)分,已知第 \(i\) ...

  10. CF1461A String Generation 题解

    Content 构造一个仅由 a,b,c 三个字符组成,且最长回文子串长度不超过 \(k\) 的长度为 \(n\) 的字符串. 数据范围:数据组数 \(\leqslant 10\),\(1\leqsl ...