周一发了这篇文章,但是因为有些“人在江湖,身不由己”,所以删掉了原文,但是还是有很多人想看内容,所以我稍微改了一下内容和转贴看看:ApacheLog4j2远程代码执行漏洞的问题最近闹得沸沸扬扬,半夜召集了很多人紧急修复这个问题。微信上很多人问我:这种漏洞怎么修复?下次有问题需要升级版本吗?有什么办法可以一劳永逸地解决吗?没有办法避免吗?其实是有的。有一种技术可以针对此类漏洞进行针对性的拦截。它可以避免开发人员急于修复此漏洞,甚至根本不想修复它。这就是RASP技术。其实这个技术已经诞生很长时间了,在安防圈中被广泛应用。适用范围也很广。RASPRASP是RuntimeApplicationSelf-Protection的缩写,是一种应用程序安全保护技术。他的原理是将保护程序注入到应用程序中,与应用程序集成在一起,可以实时监控和阻断攻击,使程序本身具有自我保护的能力。听起来很花哨?事实上,RASP就是拦截应用程序对系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以使用RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能在应用程序运行的系统上运行。RASP技术非常适合防护0Day漏洞,如反序列化漏洞、JNDI注入漏洞、表达式注入漏洞、SQL等漏洞、远程代码执行漏洞等。在WAF和RASP的安全防护方面,很多人都知道WAF(WebApplicationFirewall),俗称防火墙,所以,与防火墙相比,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技术。在需要检测的地方注入RASPHook代码,根据上下文和关键函数的参数判断请求是否为恶意请求。,并终止或继续执行。要想实现RASP,就离不开Java中的Agent技术。Agent是运行在目标JVM上的具体程序。它的职责是从目标JVM获取数据,然后将数据传输到外部进程。在JavaSE5之前,Agent只能通过编写Native代码来实现。从JavaSE5开始,可以使用Java的Instrumentation接口(java.lang.instrument)编写代理。使用Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent)来监控和协助运行在JVM上的程序,甚至可以替换和修改某些类的定义。JavaAgent支持在目标JVM启动时加载,也支持在目标JVM运行时加载。这两种不同的加载方式使用不同的入口函数。如果需要在目标JVM启动时加载Agent,可以选择实现如下方法:publicstaticvoidpremain(StringagentArgs,Instrumentationinst);publicstaticvoidpremain(StringagentArgs);在premain函数中,我们可以对字节码进行操作,并将其编织到Rasp安全探测器中。publicstaticvoidpremain(StringagentArgs,Instrumentationinst)throwsClassNotFoundException,UnmodifiableClassException{inst.addTransformer(newClassTransformer());}通过使用ClassFileTransformer接口,修改字节码,定义一个类,实现ClassFileTransformer接口,重写transform方法,在这个方法中,通过ASM技术修改字节码。publicbyte[]transform(ClassLoaderloader,StringclassName,Class>classBeingRedefined,ProtectionDomainprotectionDomain,byte[]classfileBuffer)throwsIllegalClassFormatException{byte[]transformeredByteCode=classfileBuffer;if(Config.moudleMap.containsKey(className)){try{ClassReaderreader=newClassFileBuffer);ClassWriterwriter=newClassWriter(ClassWriter.COMPUTE_MAXS);ClassVisitorvisitor=Reflections.createVisitorIns((String)Config.moudleMap.get(className).get("loadClass"),writer,className);reader.accept(visitor,ClassReader.EXPAND_FRAMES);transformeredByteCode=writer.toByteArray();}catch(Exceptione){e.printStackTrace();}}returntransformeredByteCode;}简单的原理是这样的,因为篇幅优先,这里就不展开太多了,如果你有兴趣的可以看看(https://github.com/xbeark/javaopenrasp)这个开源项目,这是我一个阿里同事做的一个简单的RASPDemo,里面包含了一些REC和SQL等保护注入:使用JavaRealized,代码不多,很容易理解。开源工具RASP是一个比较成熟的技术,现在国内外都有很多开源产品。如国外的MicroFocus、Prevoty、OWASPAppSensor、Shadowd等。国内也有很多厂家有类似的工具。如:暗百科技-Skinlizardhttp://www.anbai.com/lxPlatform/百度-OpenRasphttps://rasp.baidu.com/交兔科技-云锁https://www.yunsuo.com以上.cn,我们介绍了RASP技术及其简单原理,并为您提供了一个简单的Demo应用,方便您深入学习。如果你想用开元的一些产品,我也推荐给你几款,你可以选择了解一下。但话又说回来,安全攻防并不是绝对的,这场比赛永远是攻守双方的博弈过程。没有绝对的安全,所有的安全措施只是让攻击的成本更高。因此,RASP技术并非完全100%万无一失。不过从目前业界的很多应用来看,这项技术还是比较成熟的,对于一些常见的漏洞的防范还是比较有效的。参考资料:https://segmentfault.com/a/1190000041132495https://www.freebuf.com/articles/web/197823.htmlhttps://github.com/xbeark/javaopenrasp
