Log4j漏洞?一行代碼都不改就能永久修復(fù)?
△Hollis, 一個對Coding有著獨(dú)特追求的人△
作者 l Hollis來源 l Hollis(ID:hollischuang)
這篇文章我周一發(fā)過,但是因為一些"人在江湖、身不由己"的原因,原文刪除了,但是很多人找我還是想看看內(nèi)容,所以我改了一點(diǎn)內(nèi)容,重新發(fā)一下:Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞的問題最近鬧得沸沸揚(yáng)揚(yáng)的,很多人都被大半夜叫起來緊急修復(fù)這跟問題。有很多人在微信上問我:這種漏洞還能怎么修?下次有問題還要再升級版本嗎?有沒有啥一勞永逸的辦法?就沒啥辦法避免嗎?其實(shí),是有的。有一種技術(shù),可以針對這類漏洞做定向攔截??梢宰岄_發(fā)者不用急急忙忙修這個漏洞,甚至你如果完全不想修都可以。這就是RASP技術(shù)。其實(shí)這個技術(shù)已經(jīng)誕生很久了,在安全圈也應(yīng)用很廣泛。應(yīng)用范圍也很廣泛了。
RASPRASP 是 Runtime Application Self-Protection 的縮寫,這是一種應(yīng)用安全保護(hù)技術(shù)。他的原理是將保護(hù)程序注入到應(yīng)用程序中,與應(yīng)用程序融為一體,能夠起到實(shí)時監(jiān)測、阻斷攻擊的作用,使程序自身擁有自保護(hù)的能力。聽起來是不是很高大上?其實(shí),RASP就是攔截從應(yīng)用程序到系統(tǒng)的所有調(diào)用,確保它們是安全的,并直接在應(yīng)用程序內(nèi)驗證數(shù)據(jù)請求。Web和非Web應(yīng)用程序都可以通過RASP進(jìn)行保護(hù)。該技術(shù)不會影響應(yīng)用程序的設(shè)計,因為RASP的檢測和保護(hù)功能是在應(yīng)用程序運(yùn)行的系統(tǒng)上運(yùn)行的。

RASP 技術(shù)非常是和對于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 主要通過分析流量中的特征過濾攻擊請求,并攔截攜帶有攻擊特征的請求。但是因為 WAF 只能基于流量規(guī)則進(jìn)行防御,無法根據(jù)應(yīng)用上下文進(jìn)行檢測,所以存在誤報率高、容易繞過等問題。但是,RASP 則不同,他就像疫苗會注入到人體一樣,RASP 是運(yùn)行在應(yīng)用之中的,與應(yīng)用融為一體,可以獲取到應(yīng)用運(yùn)行時的上下文,根據(jù)請求上下文進(jìn)行攔截可以對攻擊進(jìn)行精準(zhǔn)的識別和攔截。

防火墻就像為簇?fù)碓诖笕宋镏車谋gS,大人物去哪里都帶著保鏢,看起來防御力爆棚,但是大人物本人肌肉不發(fā)達(dá)也沒有武功,一旦保鏢被突破或者保鏢被調(diào)虎離山,那么這個大人物就沒有任何保護(hù)了,就非常危險了。而RASP 則是讓沒有武功的人在很短的時間并且付出的代價不高的情況下?lián)碛泻芨叩淖晕冶Wo(hù)能力。
RASP 具有以下優(yōu)點(diǎn):- 1.誤報率低。
- 2.可以防護(hù)0Day級別的漏洞攻擊。
實(shí)現(xiàn)原理不同于基于流量特征的檢測,RASP 主要關(guān)注應(yīng)用自身的行為,而非流量本身。當(dāng) RASP 發(fā)現(xiàn)一個應(yīng)用,做了它不應(yīng)該做的事情時,大概率意味著當(dāng)前應(yīng)用已經(jīng)被攻擊者利用漏洞攻陷并做了一些高危操作。以這次 Log4j的漏洞來看,RASP 并不關(guān)注請求中的流量是否包含了惡意的 payload,而是去關(guān)注 Log4j2 究竟使用 JNDI 功能去做了什么。如果進(jìn)行正常的 JNDI 查詢,就沒有問題;但如果企圖使用 JNDI 功能進(jìn)行命令執(zhí)行,就是一個顯而易見的危險行為。RASP 要將自己注入到被保護(hù)的應(yīng)用中,基本思路類似于 Java 中的 AOP 技術(shù),將 RASP 的Hook代碼注入到需要進(jìn)行檢測的地方,根據(jù)上下文和關(guān)鍵函數(shù)的參數(shù)等信息判斷請求是否為惡意請求,并終止或繼續(xù)執(zhí)行。想要實(shí)現(xiàn)RASP,在 Java中逃不開 Agent 技術(shù),Agent是一個運(yùn)行在目標(biāo)JVM的特定程序,它的職責(zé)是負(fù)責(zé)從目標(biāo)JVM中獲取數(shù)據(jù),然后將數(shù)據(jù)傳遞給外部進(jìn)程。在Java SE 5之前,要實(shí)現(xiàn)一個Agent只能通過編寫Native代碼來實(shí)現(xiàn)。從Java SE 5開始,可以使用Java的Instrumentation接口(java.lang.instrument)來編寫Agent。使? Instrumentation,開發(fā)者可以構(gòu)建?個獨(dú)?于應(yīng)?程序的代理程序(Agent),用來監(jiān)測和協(xié)助運(yùn)行在 JVM 上的程序,甚至能夠替換和修改某些類的定義。

Java Agent支持目標(biāo)JVM啟動時加載,也支持在目標(biāo)JVM運(yùn)行時加載,這兩種不同的加載模式會使用不同的入口函數(shù),如果需要在目標(biāo)JVM啟動的同時加載Agent,那么可以選擇實(shí)現(xiàn)下面的方法:
public?static?void?premain(String?agentArgs,?Instrumentation?inst);
public?static?void?premain(String?agentArgs);
public?static?void?premain(String?agentArgs,?Instrumentation?inst)
????????throws?ClassNotFoundException,?UnmodifiableClassException?{
????inst.addTransformer(new?ClassTransformer());
}
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;
}

使用 Java實(shí)現(xiàn)的,代碼不多,很容易理解。
開源工具RASP作為一個相對成熟的技術(shù),現(xiàn)在已經(jīng)有很多開源的產(chǎn)品了,國內(nèi)外都有很多。如國外的Micro Focus、Prevoty、OWASP AppSensor、Shadowd等等。國內(nèi)也有很多廠商也有類似的工具。如:
- 安百科技——靈蜥
- http://www.anbai.com/lxPlatform/
- 百度——OpenRasp
- https://rasp.baidu.com/
- 椒圖科技——云鎖
https://www.yunsuo.com.cn

往期推薦



