自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全網(wǎng)連夜修復(fù)的Log4j漏洞,如何做到一行代碼都不改?

安全 應(yīng)用安全
Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞的問(wèn)題最近鬧得沸沸揚(yáng)揚(yáng)的,很多人都被大半夜叫起來(lái)緊急修復(fù)這跟問(wèn)題。

[[442760]]

 這篇文章我周一發(fā)過(guò),但是因?yàn)橐恍?quot;人在江湖、身不由己"的原因,原文刪除了,但是很多人找我還是想看看內(nèi)容,所以我改了一點(diǎn)內(nèi)容,重新發(fā)一下:

Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞的問(wèn)題最近鬧得沸沸揚(yáng)揚(yáng)的,很多人都被大半夜叫起來(lái)緊急修復(fù)這個(gè)問(wèn)題。

有很多人在微信上問(wèn)我:這種漏洞還能怎么修?下次有問(wèn)題還要再升級(jí)版本嗎?有沒(méi)有啥一勞永逸的辦法?就沒(méi)啥辦法避免嗎?

其實(shí),是有的。有一種技術(shù),可以針對(duì)這類漏洞做定向攔截??梢宰岄_(kāi)發(fā)者不用急急忙忙修這個(gè)漏洞,甚至你如果完全不想修都可以。

這就是RASP技術(shù)。

其實(shí)這個(gè)技術(shù)已經(jīng)誕生很久了,在安全圈也應(yīng)用很廣泛。應(yīng)用范圍也很廣泛了。

RASP

RASP 是 Runtime Application Self-Protection 的縮寫(xiě),這是一種應(yīng)用安全保護(hù)技術(shù)。他的原理是將保護(hù)程序注入到應(yīng)用程序中,與應(yīng)用程序融為一體,能夠起到實(shí)時(shí)監(jiān)測(cè)、阻斷攻擊的作用,使程序自身?yè)碛凶员Wo(hù)的能力。

聽(tīng)起來(lái)是不是很高大上?

其實(shí),RASP就是攔截從應(yīng)用程序到系統(tǒng)的所有調(diào)用,確保它們是安全的,并直接在應(yīng)用程序內(nèi)驗(yàn)證數(shù)據(jù)請(qǐng)求。Web和非Web應(yīng)用程序都可以通過(guò)RASP進(jìn)行保護(hù)。該技術(shù)不會(huì)影響應(yīng)用程序的設(shè)計(jì),因?yàn)镽ASP的檢測(cè)和保護(hù)功能是在應(yīng)用程序運(yùn)行的系統(tǒng)上運(yùn)行的。

RASP 技術(shù)非常是和對(duì)于0Day 漏洞的防護(hù),如反序列化漏洞、JNDI 注入漏洞、表達(dá)式注入漏洞、SQL 諸如漏洞、遠(yuǎn)程代碼執(zhí)行漏洞等。

WAF 和 RASP

在安全防護(hù)上,很多人都知道WAF(Web Application Firewall),俗稱防火墻,那么,和防火墻相比,RASP 技術(shù)其實(shí)有著很多的優(yōu)點(diǎn)。

傳統(tǒng)的 WAF 主要通過(guò)分析流量中的特征過(guò)濾攻擊請(qǐng)求,并攔截?cái)y帶有攻擊特征的請(qǐng)求。但是因?yàn)?WAF 只能基于流量規(guī)則進(jìn)行防御,無(wú)法根據(jù)應(yīng)用上下文進(jìn)行檢測(cè),所以存在誤報(bào)率高、容易繞過(guò)等問(wèn)題。

但是,RASP 則不同,他就像疫苗會(huì)注入到人體一樣,RASP 是運(yùn)行在應(yīng)用之中的,與應(yīng)用融為一體,可以獲取到應(yīng)用運(yùn)行時(shí)的上下文,根據(jù)請(qǐng)求上下文進(jìn)行攔截可以對(duì)攻擊進(jìn)行精準(zhǔn)的識(shí)別和攔截。

防火墻就像為簇?fù)碓诖笕宋镏車谋gS,大人物去哪里都帶著保鏢,看起來(lái)防御力爆棚,但是大人物本人肌肉不發(fā)達(dá)也沒(méi)有武功,一旦保鏢被突破或者保鏢被調(diào)虎離山,那么這個(gè)大人物就沒(méi)有任何保護(hù)了,就非常危險(xiǎn)了。而RASP 則是讓沒(méi)有武功的人在很短的時(shí)間并且付出的代價(jià)不高的情況下?lián)碛泻芨叩淖晕冶Wo(hù)能力。

RASP 具有以下優(yōu)點(diǎn):

1.誤報(bào)率低。

2.可以防護(hù)0Day級(jí)別的漏洞攻擊。

同時(shí)也并不是完全沒(méi)有缺點(diǎn),主要的問(wèn)題就是可能帶來(lái)一定的性能損耗。還有就是開(kāi)發(fā)難度比較高,需要對(duì) JVM 字節(jié)碼、ASM 工具、漏洞觸發(fā)原理以及各類Java 應(yīng)用容器都有所了解。

RASP技術(shù)目前已經(jīng)非常成熟,在PHP、Java、.NET等多種語(yǔ)言中都有實(shí)現(xiàn)方案。

實(shí)現(xiàn)原理

不同于基于流量特征的檢測(cè),RASP 主要關(guān)注應(yīng)用自身的行為,而非流量本身。

當(dāng) RASP 發(fā)現(xiàn)一個(gè)應(yīng)用,做了它不應(yīng)該做的事情時(shí),大概率意味著當(dāng)前應(yīng)用已經(jīng)被攻擊者利用漏洞攻陷并做了一些高危操作。

以這次 Log4j的漏洞來(lái)看,RASP 并不關(guān)注請(qǐng)求中的流量是否包含了惡意的 payload,而是去關(guān)注 Log4j2 究竟使用 JNDI 功能去做了什么。如果進(jìn)行正常的 JNDI 查詢,就沒(méi)有問(wèn)題;但如果企圖使用 JNDI 功能進(jìn)行命令執(zhí)行,就是一個(gè)顯而易見(jiàn)的危險(xiǎn)行為。

RASP 要將自己注入到被保護(hù)的應(yīng)用中,基本思路類似于 Java 中的 AOP 技術(shù),將 RASP 的Hook代碼注入到需要進(jìn)行檢測(cè)的地方,根據(jù)上下文和關(guān)鍵函數(shù)的參數(shù)等信息判斷請(qǐng)求是否為惡意請(qǐng)求,并終止或繼續(xù)執(zhí)行。

想要實(shí)現(xiàn)RASP,在 Java中逃不開(kāi) Agent 技術(shù),Agent是一個(gè)運(yùn)行在目標(biāo)JVM的特定程序,它的職責(zé)是負(fù)責(zé)從目標(biāo)JVM中獲取數(shù)據(jù),然后將數(shù)據(jù)傳遞給外部進(jìn)程。

在Java SE 5之前,要實(shí)現(xiàn)一個(gè)Agent只能通過(guò)編寫(xiě)Native代碼來(lái)實(shí)現(xiàn)。從Java SE 5開(kāi)始,可以使用Java的Instrumentation接口(java.lang.instrument)來(lái)編寫(xiě)Agent。

使? Instrumentation,開(kāi)發(fā)者可以構(gòu)建?個(gè)獨(dú)?于應(yīng)?程序的代理程序(Agent),用來(lái)監(jiān)測(cè)和協(xié)助運(yùn)行在 JVM 上的程序,甚至能夠替換和修改某些類的定義。

Java Agent支持目標(biāo)JVM啟動(dòng)時(shí)加載,也支持在目標(biāo)JVM運(yùn)行時(shí)加載,這兩種不同的加載模式會(huì)使用不同的入口函數(shù),如果需要在目標(biāo)JVM啟動(dòng)的同時(shí)加載Agent,那么可以選擇實(shí)現(xiàn)下面的方法:

  1. public static void premain(String agentArgs, Instrumentation inst); 
  2.  
  3. public static void premain(String agentArgs); 

在premain函數(shù)中,我們可以對(duì)字節(jié)碼進(jìn)⾏操作,織⼊Rasp的安全探針。

  1. public static void premain(String agentArgs, Instrumentation inst) 
  2.  
  3.         throws ClassNotFoundException, UnmodifiableClassException { 
  4.  
  5.     inst.addTransformer(new ClassTransformer()); 
  6.  

借助ClassFileTransformer接口,實(shí)現(xiàn)對(duì)字節(jié)碼的修改,定義一個(gè)類,實(shí)現(xiàn)ClassFileTransformer接口,并重寫(xiě)transform方法,在這個(gè)方法中,通過(guò) ASM 技術(shù)修改字節(jié)碼。

  1. public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, 
  2.  
  3.                         ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { 
  4.  
  5.     byte[] transformeredByteCode = classfileBuffer; 
  6.  
  7.  
  8.     if (Config.moudleMap.containsKey(className)) { 
  9.  
  10.         try { 
  11.  
  12.             ClassReader reader = new ClassReader(classfileBuffer); 
  13.  
  14.             ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); 
  15.  
  16.             ClassVisitor visitor = Reflections.createVisitorIns((String) Config.moudleMap.get(className).get("loadClass"), writer, className); 
  17.  
  18.             reader.accept(visitor, ClassReader.EXPAND_FRAMES); 
  19.  
  20.             transformeredByteCode = writer.toByteArray(); 
  21.  
  22.         } catch (Exception e) { 
  23.  
  24.             e.printStackTrace(); 
  25.  
  26.         } 
  27.  
  28.     } 
  29.  
  30.     return transformeredByteCode; 
  31.  

簡(jiǎn)單的原理就是這樣的,因?yàn)槠鶅?yōu)先就不在這里展開(kāi)太多了,大家如果感興趣的話,可以看一下 (https://github.com/xbeark/javaopenrasp )這個(gè)開(kāi)源項(xiàng)目,這是我的一個(gè)阿里同事搞的一個(gè)簡(jiǎn)單的 RASP Demo,里面包含了一些REC、SQL 注入等的防護(hù):

使用 Java實(shí)現(xiàn)的,代碼不多,很容易理解。

開(kāi)源工具

RASP作為一個(gè)相對(duì)成熟的技術(shù),現(xiàn)在已經(jīng)有很多開(kāi)源的產(chǎn)品了,國(guó)內(nèi)外都有很多。如國(guó)外的Micro Focus、Prevoty、OWASP AppSensor、Shadowd等等。

國(guó)內(nèi)也有很多廠商也有類似的工具。如:

  • 安百科技——靈蜥

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

  • 百度——OpenRasp

https://rasp.baidu.com/

  • 椒圖科技——云鎖

https://www.yunsuo.com.cn

以上,我們給大家介紹了 RASP 技術(shù),以及他的簡(jiǎn)單原理,并給大家提供了一個(gè)簡(jiǎn)單的 Demo 應(yīng)用,可以方便大家深入學(xué)習(xí),如果想要使用一些開(kāi)原產(chǎn)品的話,也給大家推薦了幾個(gè),可以選擇性的了解一下。

但是,話又說(shuō)回來(lái),安全攻防沒(méi)有絕對(duì),這個(gè)領(lǐng)域永遠(yuǎn)都是攻擊者和防守者之間的博弈過(guò)程。沒(méi)有絕對(duì)的安全,所有安全手段只是讓攻擊的成本更高而已。

所以,RASP 技術(shù)也并不是完完全全100%的可以做到萬(wàn)無(wú)一失,但是,從目前業(yè)內(nèi)的很多應(yīng)用來(lái)看,這個(gè)技術(shù)目前還是比較成熟的,對(duì)于一些常見(jiàn)漏洞的預(yù)防還是行之有效的。

參考資料:

https://segmentfault.com/a/1190000041132495

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

https://github.com/xbeark/javaopenrasp

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)