淺談RASP技術攻防之基礎篇
凌天labs發表於2019-03-11
引言
本文就筆者研究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對比非常明顯,比如說:
攻擊者對urlhttp://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
公司名稱 | 產品官網 |
Micro Focus | https://www.microfocus.com/en-us/products/application-defender/features |
Prevoty | https://www.prevoty.com/ |
waratek | https://www.waratek.com/application-security-platform/ |
OWASP AppSensor | http://appsensor.org/ |
Shadowd | https://shadowd.zecure.org/overview/introduction/ |
immun | https://www.immun.io/features |
Contrast Security | https://www.contrastsecurity.com/runtime-application-self-protection-rasp |
Signal Sciences | https://www.signalsciences.com/rasp-runtime-application-self-protection/ |
BrixBits | http://www.brixbits.com/security-analyzer.html |
筆者只列舉了部分國外產品,關於更多這些產品的介紹請大家自行諮詢。
根據上述收集到的國外RASP技術產品,發現大家都各有千秋,甚至還有根據RASP技術衍生出來的一些其他技術名詞以及解決方案。
並且大家對資料視覺化越來越注重,讓使用者可以一目瞭然的看清楚入侵點以及攻擊鏈,以此來對特定的點進行程式碼整改或者RASP技術層面的攻擊攔截。
四、國內RASP技術實現進度以及狀態
國內目前做RASP技術的廠家不多,我收集的只有以下幾家。如有不足,歡迎補充。
產品名or公司名 | 產品網址 | 概述 |
靈蜥 | http://www.anbai.com/lxPlatform/ | 靈蜥是北京安百科技研發的一款RASP防禦產品,而RASP安全研究團隊的核心是之前烏雲核心成員,據我瞭解,烏雲在2012年後半年左右的時候就對RASP技術開始進行研究了。目前靈蜥RASP安全防禦技術以及升級到了2.0版本,對靈蜥1.0版本的架構以及防禦點進行了大版本的升級,應該是目前防禦比較完善的一家了。 |
OneRasp | https://www.oneapm.com/ | 然後藍海訊通研究的OneRasp也出現在市場,後面不知什麼原因,藍海訊通好像放棄了對oneRasp的研究以及售賣,現在oneRasp官網以及下線。 |
OpenRasp | https://rasp.baidu.com/ | 在隨後可能就是大家都聽過或者用過百度開源的OpenRasp,百度開源的rasp產品讓更多的企業以及安全研究者接觸和認識到了rasp技術。該專案目前社群活躍度挺高,外掛開發也很簡單,大大降低了使用門檻。 |
雲鎖 | https://www.yunsuo.com.cn | 雲鎖我是在18年的360安全大會上了解到的,官網將RASP技術列入了一個小功能,主打是的微隔離技術,關於微隔離技術,在這邊我們不做探討。有興趣的可以搜尋一下相關的技術文章。 |
安數雲 | http://www.datacloudsec.com/#/product-4 | 安數雲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 的利器:ASM 3.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都沒有進行任何程式碼混淆,官方安裝文件也很豐富,這些都是可以進行參考的。 由此可見,有時候技術換個平臺、換個想法,就是一個完全不一樣的東西了。所以對於任何技術都可以發散性的去想象一下其他的應用場景,萬一恰到好處呢? 不論研究的技術是什麼樣的,可能大家實現的方式不一樣,使用的技術不一樣,使用的名稱不一樣,不過最終的目的就是為了保護應用程式安全,防止攻擊者入侵成功。
十、參考
相關文章
- 淺談RASP技術攻防之實戰[環境配置篇]2019-05-06
- 淺談RASP技術攻防之實戰[程式碼實現篇]2019-05-08
- 手擼ORM淺談ORM框架之基礎篇2020-10-14ORM框架
- Java基礎之淺談介面2022-04-04Java
- Java基礎之淺談集合2022-04-07Java
- 淺談Kotlin語法篇之基礎語法(一)2018-04-01Kotlin
- Java基礎之淺談泛型2022-04-06Java泛型
- Salesforce Consumer Goods Cloud 淺談篇一之基礎介紹2021-11-14SalesforceGoCloud
- Java基礎之淺談繼承、多型2022-04-03Java繼承多型
- 淺談Python基礎2018-04-22Python
- 淺談技術翻譯2014-05-28
- 快取技術淺談2010-09-24快取
- Docker 技術基礎之 CGroups2019-06-23Docker
- [基礎] 淺談 JS Event Loop2019-03-09JSOOP
- 淺談正則的基礎2017-08-29
- iOS跳槽寶典-面試技術基礎篇2018-03-22iOS面試
- IPSECVPN技術淺談2017-11-14
- 淺談程序隱藏技術2024-07-07
- 攻防論道之啟動篇|做好這三大基礎工作,攻防演練方能事半功倍2021-04-08
- 虛擬化技術之kvm基礎2020-08-14
- 容器技術之Docker基礎入門2020-05-22Docker
- 技術分享 | Kubernetes 學習筆記之基礎知識篇2021-10-19筆記
- Java基礎之淺談異常與瞭解斷言2022-04-05Java
- 淺談動態追蹤技術2019-04-18
- 淺談API HOOK技術(一) (轉)2007-12-12APIHook
- 淺談API HOOK技術(二) (轉)2007-12-12APIHook
- java框架基礎技術之--------反射機制2018-07-14Java框架反射
- Java安全基礎之Java Web核心技術2024-05-04JavaWeb
- vuejs深入淺出—基礎篇2017-01-02VueJS
- 深入淺出RxJava(一:基礎篇)2016-04-27RxJava
- 深入淺出RxJava(1):基礎篇2015-09-15RxJava
- 即時通訊IM技術領域基礎篇2018-01-25
- 【AOP】技術基礎2014-03-16
- 淺談LocalCache | 京東雲技術團隊2024-02-12
- docker容器技術基礎之linux cgroup、namespace2021-07-20DockerLinuxnamespace
- Go 基礎篇之 Map2023-02-21Go
- 手擼ORM淺談ORM框架之Query篇2020-11-12ORM框架
- 手擼ORM淺談ORM框架之Delete篇2020-10-30ORM框架delete