引言
本文就筆者研究RASP的過程進行了一些概述,技術幹貨略少,偏向于普及RASP技術。中間對java如何實作rasp技術進行了簡單的舉例,想對大家起到抛磚引玉的作用,可以讓大家更好的了解一些關于web應用程式安全防護的技術。文筆不好,大家輕拍。
一 、什麼是RASP?
在2014年的時候,Gartner引入了“Runtime application self-protection”一詞,簡稱為RASP。它是一種新型應用安全保護技術,它将保護程式像疫苗一樣注入到應用程式中,應用程式融為一體,能實時檢測和阻斷安全攻擊,使應用程式具備自我保護能力,當應用程式遭受到實際攻擊傷害,就可以自動對其進行防禦,而不需要進行人工幹預。
RASP技術可以快速的将安全防禦功能整合到正在運作的應用程式中,它攔截從應用程式到系統的所有調用,確定它們是安全的,并直接在應用程式内驗證資料請求。Web和非Web應用程式都可以通過RASP進行保護。該技術不會影響應用程式的設計,因為RASP的檢測和保護功能是在應用程式運作的系統上運作的。
二、RASP vs WAF
很多時候大家在攻擊中遇到的都是基于流量規則的waf防禦,waf往往誤報率高,繞過率高,市面上也有很多針對不同waf的繞過方式,而RASP技術防禦是根據請求上下文進行攔截的,和WAF對比非常明顯,比如說:
攻擊者對url為http://http.com/index.do?id=1進行測試,一般情況下,掃描器或者人工測試sql注入都會進行一些sql語句的拼接,來驗證是否有注入,會對該url進行大量的發包,發的包可能如下:http://xxx.com/index.do?id=1' and 1=2--
但是應用程式本身已經在程式内做了完整的注入參數過濾以及編碼或者其他去危險操作,實際上通路該連結以後在資料庫中執行的sql語句為:select id,name,age from home where id='1 \' and 1=2--'
可以看到這個sql語句中已經将單引号進行了轉義,導緻無法進行,但是WAF大部分是基于規則去攔截的(也有小部分WAF是帶參數淨化功能的),也就是說,如果你的請求參數在他的規則中存在,那麼waf都會對其進行攔截(上面隻是一個例子,當然waf規則肯定不會這麼簡單,大家不要鑽牛角尖。),這樣會導緻誤報率大幅提升,但是RASP技術可以做到程式底層拼接的sql語句到資料庫之前進行攔截。也就是說,在應用程式将sql語句預編譯的時候,RASP可以在其發送之前将其攔截下來進行檢測,如果sql語句沒有危險操作,則正常放行,不會影響程式本身的功能。如果存在惡意攻擊,則直接将惡意攻擊的請求進行攔截或淨化參數。
三、國外的RASP
我搜集到國外RASP的産品有的下面幾個,可能清單不足,歡迎補充:P
筆者隻列舉了部分國外産品,關于更多這些産品的介紹請大家自行咨詢。
根據上述收集到的國外RASP技術産品,發現大家都各有千秋,甚至還有根據RASP技術衍生出來的一些其他技術名詞以及解決方案。
并且大家對資料可視化越來越注重,讓使用者可以一目了然的看清楚入侵點以及攻擊鍊,以此來對特定的點進行代碼整改或者RASP技術層面的攻擊攔截。
四、國内RASP技術實作進度以及狀态
國内目前做RASP技術的廠家不多,我收集的隻有以下幾家。如有不足,歡迎補充。産品名稱 産品官網 概述 靈蜥 靈蜥是北京安百科技研發的一款RASP防禦産品,而RASP安全研究團隊的核心是之前烏雲核心成員,據我了解,烏雲在2012年後半年左右的時候就對RASP技術開始進行研究了。目前靈蜥RASP安全防禦技術以及更新到了2.0版本,對靈蜥1.0版本的架構以及防禦點進行了大版本的更新,應該是目前防禦比較完善的一家了。
OneRasp 然後藍海訊通研究的OneRasp也出現在市場,後面不知什麼原因,藍海訊通好像放棄了對oneRasp的研究以及售賣,現在oneRasp官網以及下線。
OpenRasp 在随後可能就是大家都聽過或者用過百度開源的OpenRasp,百度開源的rasp産品讓更多的企業以及安全研究者接觸和認識到了rasp技術。該項目目前社群活躍度挺高,插件開發也很簡單,大大降低了使用門檻。
雲鎖 雲鎖我是在18年的360安全大會上了解到的,官網将RASP技術列入了一個小功能,主打是的微隔離技術,關于微隔離技術,在這邊我們不做探讨。有興趣的可以搜尋一下相關的技術文章。
安數雲 安數雲WEB應用實時防護系統RASP是在我寫這篇文章的時候,發現他們也開發了一款RASP産品才知道的。不過沒有找到其技術白皮書等可參考的文章。
五、各種語言RASP技術實作方式
1.JAVA
Java是通過Java Agent方式進行實作(Agent本質是java中的一個動态庫,利用JVMTI暴露的一些接口實作的),具體是使用ASM(`或者其他位元組碼修改架構`)技術實作RASP技術。Java Agent有三種機制,分别是Agent_OnLoad、Agent_OnAttach、Agent_OnUnload,大部分時候使用的都是Agent_OnLoad技術和Agent_OnAttach技術,Agent_OnUnload技術很少使用。具體關于Java Agent的機制大家可以看一下下面這些文章:
2.PHP
PHP是通過開發第php擴充庫來進行實作。
3..NET
.NET是通過IHostingStartup(承載啟動)實作,具體的大家可以下面這篇文章:
4.other
RASP技術其實主要就是對程式設計語言的危險底層函數進行hook,畢竟在怎麼編碼轉換以及調用,最後肯定會去執行最底層的某個方法然後對系統進行調用。由此可以反推出其hook點,然後使用不同的程式設計語言中不同的技術對其進行實作。
六、舉“栗子”
1.如何在Java中實作RASP技術
目前筆者我參與研究&研發了JAVA版本的RASP技術,下面給大家簡單的進行講解。
在jdk1.5之後,java提供一個名為Instrumentation的API接口,Instrumentation 的最大作用,就是類定義動态改變和操作。開發者可以在一個普通Java程式(帶有 main 函數的 Java 類)運作時,通過 – javaagent參數指定一個特定的 jar 檔案(包含 Instrumentation 代理)來啟動 Instrumentation 的代理程式。
關于premain的介紹,大家可以去我部落格看一下:java Agent簡單學習。
關于ASM的介紹以及使用,大家可以看一下下面的介紹:ASM官方操作手冊,AOP的利器:ASM3.0介紹關于ASM的時序圖,我這邊引用一下IBM上的一張圖:
正文開始
首先編寫一個premain函數,然後在premain中添加一個我們自定義的Transformer。
我們的Transformer需要實作ClassFileTransformer接口中的transform方法,我這邊就簡單的先進行一個列印包名的操作。
在編譯以後,運作結果如下:
由此可見我們的transform已經生效了。 我們來簡單的類比一下加入agent以及未加入agent的過程。
由此可見,在使用了transform以後,可以對jvm中的未加載的類進行重寫。已經加載過的類可以使用retransform去進行重寫。 在java中有個比較友善的位元組碼操作庫,ASM(ASM是一個比較友善的位元組碼操作架構,可以借助ASM對位元組碼進行修改,這樣就可以實作動态修改位元組碼的操作了。ASM介紹)
ClassVisitor接口,定義了一系列的visit方法,而這些visit方法。
下面這段代碼是對方法進行重寫的一個過程。
首先定義一個ClassVisitor,重寫visitMethod方法。
可以看到該方法傳回的對象為MethodVisitor(後面簡稱mv),我們如果要修改其中的邏輯過程,需要對mv進行操作,下面展示一個簡單的修改代碼的過程。
上面visitCode中代碼的大概意思為,插入一個調用TestInsert類中的hello方法,并且将一個數字8壓入進去。 TestInsert類的代碼如下:
如果不出意外,運作jar包以後将輸出類似下面這樣的資訊:
可以看一下加入agent運作以後的類有什麼變化。
源代碼:
加入Agent運作以後的源代碼:
可以看到代碼:System.out.println(TestInsert.hello(8));
成功在:System.out.println("Hello,This is TestAgent Program!");
之前運作,而調用TestInsert.hello這個方法在源代碼中原來是沒有的,我們是通過java的agent配合asm對運作的位元組碼進行了修改,這樣就達到了埋點hook的目的。
在了解了上面的技術以後,就可以其他對關鍵的點進行hook了,hook的方法大同小異,這裡僅僅是抛磚引玉,大家自行發揮。可以給大家推薦一個園長師傅寫的一個簡單例子:javaweb-codereview
筆者展示的該例子項目位址為:javaagent
2.如何在PHP中實作RASP技術
關于php中的rasp技術實作,筆者我還沒有進行深入研究,大家可以參考以下兩個開源的擴充進行研究,筆者接下來也準備研究php方面的rasp技術實作,歡迎大家一起讨論。
七、RASP技術的其他方面應用場景
在RASP技術實作的過程中,我橫向了遐想一些其他的用法以及參考了一下其他rasp産品的功能點,比如:
代碼審計
對于rasp中運用到的技術,換一種思維方式,可以不進行攔截,而進行記錄,對所有記錄的日志結合上下文進行代碼審計。
0day防禦
對已經hook的關鍵點進行告警通知并且要攔截攻擊行為,然後在公網部署多種不同cms的web蜜罐。如若已經觸發到了告警通知,那麼已經證明攻擊已經成功。且攔截到的漏洞可能為0day。
攻擊溯源
對所有攻擊ip以及攻擊的檔案進行聚合,用時間軸進行展示。這樣就可以定位到黑客是從上面時候開始進行攻擊的,攻擊中通路了哪些檔案,觸發了哪些攻擊攔截。然後對所有大緻相同的ip進行歸類,可以引出來一個專業用于攻擊溯源的産品。
DevOps
對所有事件詳細資訊提供完整的執行路徑,包括代碼行,應用程式中使用的完整上下文查詢以及豐富的屬性詳細資訊。
其他方面
當然Rasp技術的應用場景肯定不止這麼多,還有其他很多方面的一些應用場景,大家可以發散思維去想。本文章僅用于抛磚引玉。
八、RASP技術有什麼缺陷
● 不同的程式設計語言可能編譯語言和應用程式的版本不一緻都導緻RASP産品無法通用,甚至導緻網站挂掉;
● 如果RASP技術中對底層攔截點不熟悉,可能導緻漏掉重要hook點,導緻繞過;
● 對于csrf、ssrf、sql語句解析等問題目前還是基于部分正則進行防護(對于sql語句的解析問題可以使用AST文法樹進行解析)。
……
九、總結
目前RASP還處于一個發展的階段,尚未像防火牆等常見的安全産品一樣有非常明确的功能邊界(scope),此文僅抛磚引玉,更多由RASP防禦技術的用法可以發揮想象,比如日志監控、管理會話、安全過濾、請求管理等。 在研究RASP技術的時候,我發現RASP與APM有着部分相同的技術,APM本意是用于監控應用程式的,反轉思路,在APM中監控應用程式的時候加入漏洞防護功能,即可形成了一個簡單的RASP demo。在APM這方面,大家參考的對象可就很多了,比如:skywalking、newrelic等,skywalking是開源産品,在github上就可以直接檢視其源代碼,而且是Apache的項目,而newrelic的所有agent都沒有進行任何代碼混淆,官方安裝文檔也很豐富,這些都是可以進行參考的。 由此可見,有時候技術換個平台、換個想法,就是一個完全不一樣的東西了。是以對于任何技術都可以發散性的去想象一下其他的應用場景,萬一恰到好處呢? 不論研究的技術是什麼樣的,可能大家實作的方式不一樣,使用的技術不一樣,使用的名稱不一樣,不過最終的目的就是為了保護應用程式安全,防止攻擊者入侵成功。
十、參考
*本文作者:安百科技,轉載請注明來自FreeBuf.COM