rasp 系统_RASP攻防 —— RASP安全应用与局限性浅析
文|【騰訊安全平臺部數(shù)據(jù)安全團隊】 qiye & baz
前言
隨著Web應(yīng)用攻擊手段變得復雜,基于請求特征的防護手段,已經(jīng)不能滿足企業(yè)安全防護需求。在2012年的時候,Gartner引入了“Runtime application self-protection”一詞,簡稱為RASP,屬于一種新型應(yīng)用安全保護技術(shù),它將防護功能“ 注入”到應(yīng)用程序中,與應(yīng)用程序融為一體,使應(yīng)用程序具備自我防護能力,當應(yīng)用程序遭受到實際攻擊傷害時,能實時檢測和阻斷安全攻擊,而不需要進行人工干預。
騰訊洋蔥反入侵團隊早在很多年前就研究RASP的應(yīng)用場景,2014年還在TSRC搞了一次基于rasp的webshell攻防挑戰(zhàn)賽,詳見(https://security.tencent.com/index.php/blog/msg/57);近幾年從PHP逐步擴展到Java,Python,Nodejs等其他語言。RASP通過實時采集Web應(yīng)用的高風險行為,通過特征規(guī)則、上下文語義分析及第三方安全產(chǎn)品數(shù)據(jù)關(guān)聯(lián)分析等多種安全模型來提升檢測準確率,相較于傳統(tǒng)Web應(yīng)用安全產(chǎn)品,RASP從海量的攻擊中排除掉了大量的無效攻擊,聚焦發(fā)現(xiàn)真實的已知和未知安全威脅。經(jīng)過多年的實踐我們發(fā)現(xiàn)RASP也存在一些缺陷和不足,本文以PHP RASP作為研究對象拋磚引玉,在此分享RASP的應(yīng)用場景和問題。本文主要分三個部分:RASP架構(gòu)原理簡要介紹、RASP安全應(yīng)用場景介紹 及 RASP對抗淺析。
注意:文中涉及的文章pdf ,代碼,思維導圖存放于https://github.com/qiyeboy/my_tsrc_paper倉庫中,喜歡的朋友可以自取。一、 RASP架構(gòu)原理簡要介紹
以PHP語言為例,PHP語言自身提供擴展機制,可以基于擴展機制開發(fā)RASP系統(tǒng)。
騰訊自研的TRASP架構(gòu)示意圖:
TRASP 整個架構(gòu)大致分為3個部分:1. 客戶端模塊;2. 云端數(shù)據(jù)分析模塊; 3. 安全處置模塊。
1、客戶端模塊;負責數(shù)據(jù)采集和規(guī)則匹配,數(shù)據(jù)采集可以配置策略采集需要的數(shù)據(jù)(如SQL執(zhí)行/命令執(zhí)行/代碼執(zhí)行/文件操作等),RASP可以根據(jù)需求配置數(shù)據(jù)采集策略,需要注意的是采集數(shù)據(jù)越多資源消耗也會隨之增大;
2、云端數(shù)據(jù)分析模塊;有些場景通過前端規(guī)則無法完全解決,需要上報數(shù)據(jù)到云端分析進行二次分析,包括使用機器學習算法,關(guān)聯(lián)分析等;
3、安全處置模塊;負責配置事件安全等級和處置策略,RASP串行在業(yè)務(wù)中,誤報會影響業(yè)務(wù),需要根據(jù)安全事件的等級和精準度配置阻斷/異步告警/安全通知等不同的處置策略。
PHP RASP擴展原理和實現(xiàn)簡要介紹:
PHP RASP作為PHP解釋器的擴展,是一個動態(tài)庫so文件,PHP語言中類似的動態(tài)庫很多,比如:mysql.so,RASP和MYSQL擴展的加載方式和運行原理一樣,集成在PHP解釋器中。接下來從3個方面簡單描述一下TRASP擴展模塊的實現(xiàn)原理。
1. 預加載
任何一個PHP實例都會經(jīng)過Module init、Request init、Request shutdown和Module shutdown四個過程。
Module init
在所有請求到達前發(fā)生,例如啟動Apache服務(wù)器,PHP解釋器隨之啟動,相關(guān)的各個模塊(Redis、Mysql等)的MINIT方法被調(diào)用。僅被調(diào)用一次。在開發(fā)XXX擴展時,相應(yīng)的XXX.c文件中將自動生成該方法:
Request init
每個請求到達時都被觸發(fā)。SAPI層將控制權(quán)交由PHP層,PHP初始化本次請求執(zhí)行腳本所需的環(huán)境變量,函數(shù)列表等,調(diào)用所有模塊的RINIT函數(shù)。XXX.c中對應(yīng)函數(shù)如下:
Request shutdown
每個請求結(jié)束,PHP就會自動清理程序,順序調(diào)用各個模塊的RSHUTDOWN方法,清除程序運行期間的符號表。典型的RSHUTDOWN方法如:
Module shutdown
所有請求處理完畢后,SAPI也關(guān)閉了(即服務(wù)器關(guān)閉),PHP調(diào)用各個模塊的MSHUTDOWN方法釋放內(nèi)存。
RASP預加載主要在Module init 階段實現(xiàn), 通過在初始化階段預先加載RASP模塊, 替換opcode handler與通過自定義函數(shù)替換全局函數(shù)表位置。
PHP把中間字節(jié)碼稱之為OPCODE,每個OPCODE對應(yīng)ZEND底層的一個處理函數(shù),ZEND引擎最終執(zhí)行這個處理函數(shù)。2. Hook Opcode 或 Hook 內(nèi)部函數(shù)
RASP需要監(jiān)控各個敏感函數(shù)的調(diào)用,在PHP中比較好的方式便是 Hook Opcode 和 Hook內(nèi)部函數(shù)。
(1) 實現(xiàn)Hook Opcode 功能只需要改變 Hook Opcode 對應(yīng)的處理函數(shù)即可,而 zend 預先就提供了一個現(xiàn)成的接口:zend_set_user_opcode_handler, 如:
替換 Opcode handler 后便可以自定義函數(shù)調(diào)用前后的操作, 如獲取參數(shù)、阻斷攻擊等, 還可以通過 ZEND_USER_OPCODE_DISPATCH 跳回至原來的Opcode執(zhí)行,雖然PHP調(diào)用函數(shù)的方式多種多樣, 但從Opcode角度分析, 主要還是分為以下幾類, 以php7為例:
(2) 另一種實現(xiàn)Hook函數(shù)調(diào)用的方式就是Hook內(nèi)部函數(shù), Opcode最終還是會通過CG(function_table)獲取所調(diào)用函數(shù)的handler執(zhí)行, 那么我們通過修改CG(function_table)表對應(yīng)函數(shù)的handler指向, 便可以指向我們實現(xiàn)的函數(shù),在完成相應(yīng)操作后繼續(xù)調(diào)用原來的函數(shù)實現(xiàn)hook。
兩種方式皆可實現(xiàn)Hook函數(shù),有各自的優(yōu)點。第一種,適合工程化,只需要對幾種Opcode類型進行hook,后續(xù)Hook的敏感函數(shù)可以自行添加;第二種則是需要對敏感函數(shù)進行逐一替換,比較繁瑣,但優(yōu)點是替換發(fā)生在函數(shù)表內(nèi),故通過越過Opcode進行函數(shù)執(zhí)行的手法也無法繞過檢測,更加可靠。
3. 參數(shù)獲取與分析
在完成對敏感函數(shù)調(diào)用行為的監(jiān)控后,通過ZEND_CALL_NUM_ARGS和ZEND_CALL_ARG,我們可以獲取到函數(shù)的參數(shù)個數(shù)和內(nèi)容,便可根據(jù)函數(shù)的參數(shù)制定相應(yīng)的策略。如文件類可以關(guān)注是否讀取了敏感文件, 數(shù)據(jù)庫操作類是否語法結(jié)構(gòu)發(fā)生了變化等等。
二、 RASP 安全應(yīng)用場景介紹
1. 基于規(guī)則的漏洞攻擊檢測
通過RASP實時采集Web應(yīng)用的高風險行為,具體實現(xiàn)為hook漏洞相關(guān)的函數(shù),如檢測SQL注入(劫持mysqli_query等)、命令注入(system/exec等)、文件上傳漏洞(move_uploaded_file等)、xss漏洞(echo/print等);拿到函數(shù)數(shù)據(jù)后對參數(shù)進行規(guī)則匹配判斷是否存在漏洞攻擊。舉兩個例子:
(1)文件上傳漏洞,以move_uploaded_file為例,函數(shù)說明:move_uploaded_file ( string filename,stringdestination ) : bool,第一個參數(shù)為上傳文件,如果上傳了一個動態(tài)php腳本后綴文件即判斷存在上傳漏洞。
【ip xxx 安全漏洞告警】
TRASP 發(fā)現(xiàn)ip xxx存在上傳漏洞,漏洞細節(jié)如下:
漏洞文件: /data/webroot/xxx/x.php(第201行)
上傳的PHP動態(tài)腳本: /data/webroot/xxx/1.php
(2)SQL注入,可以發(fā)現(xiàn)下圖正常的sql和惡意的注入sql有區(qū)別,比如使用了union select,可以基于此做安全策略;
傳統(tǒng)規(guī)則可能存在誤報,也可以對sql語句做語義解析判斷是否存在sql注入攻擊,非本文重點不再過多介紹。
2. 基于污點追蹤的漏洞檢測
通過追蹤外部可控制的輸入變量(如GET,_POST,REQUEST,REQUEST,_COOKIE等)是否未經(jīng)安全處理進入危險函數(shù)執(zhí)行,危險函數(shù)包括各種可能導致漏洞的函數(shù),如命令注入相關(guān)的system/exec,xss相關(guān)的echo/print。污點追蹤原理借用了php變量結(jié)構(gòu)體預留的一個標記位,業(yè)界知名的相關(guān)系統(tǒng)有鳥哥開發(fā)的Taint擴展,詳情可參考:https://www.laruence.com/2012/02/14/2544.html, 本文不再做過多介紹。
3. IAST掃描聯(lián)動
先簡要介紹下IAST,IAST中文名是交互式應(yīng)用安全測試,相較于傳統(tǒng)的DAST和SAST掃描方式,漏洞檢出率更高&誤報率更低。IAST目前常見的實現(xiàn)方式有兩種,一類是基于代理或網(wǎng)關(guān)等形式抓取業(yè)務(wù)CGI流量后做安全測試掃描,一類是在業(yè)務(wù)web容器插樁獲取業(yè)務(wù)代碼執(zhí)行細節(jié)結(jié)合DAST掃描用例判斷是否存在漏洞,比如DAST發(fā)起一個帶有test_from_dongxi字符串的SQL注入測試請求,web容器內(nèi)插樁劫持數(shù)據(jù)庫相關(guān)函數(shù),發(fā)現(xiàn)sql語句中有test_from_dongxi的字符串,從而聯(lián)動發(fā)現(xiàn)安全漏洞;RASP可以用于插樁獲取代碼執(zhí)行流程,相較于傳統(tǒng)漏洞檢測方法可以直接定位到有漏洞的代碼文件和具體代碼行號,業(yè)務(wù)修復起來更加便捷。
4. Webshell檢測
Webshell文件是一個特殊的cgi文件,有文件操作、命令執(zhí)行等管理功能,可以基于rasp采集的數(shù)據(jù)在云端做檢測;檢測方法包括 規(guī)則匹配(適用于一句話木馬和混淆webshell有明顯特征的樣本)、行為統(tǒng)計分析(適用于大馬);此外,RASP結(jié)合污點追蹤也是一種檢測方法,通過標記非信任的數(shù)據(jù)源,監(jiān)測整個數(shù)據(jù)鏈路,此前寫過一篇文章,詳情可參考:https://security.tencent.com/index.php/blog/msg/152, 本文不再做過多介紹。
三、RASP 對抗淺析
在上文中,介紹了PHP RASP的安全應(yīng)用場景和實現(xiàn)原理,寫了很多RASP的優(yōu)點,但俗話講的好:沒有絕對安全的系統(tǒng),接下來分享一下RASP存在的不足。先看一下RASP在LINUX系統(tǒng)中的層級:
PHP RASP作為php解釋器的擴展,運行在php解釋器層面,也就是說在與PHP RASP同級或者在其層級之下的操作,它的監(jiān)控基本上是失效的,這包括與PHP RASP同一級的其他擴展,PHP解釋器之外的進程,以及通過glibc的操作,這很關(guān)鍵。
既然分析繞過手法,那就需要一個繞過的標準,由于命令風險很高,同時更加普遍,因此選擇命令作為突破口:
接下來從9個方面來闡述繞過方法,文中部分知識都是公開的,只是用在了新的場景。
1.函數(shù)監(jiān)控不全
php手冊中的函數(shù)太多了,總有你想不到的,多翻翻PHP手冊,比如rasp hook了以下常用的命令執(zhí)行函數(shù)
利用Windows中COM組件繞過:
2.函數(shù)參數(shù)混淆
RASP檢測基于函數(shù)和參數(shù)做安全策略,可以對參數(shù)做變形繞過檢測,舉個例子: system 函數(shù),用來執(zhí)行命令,很多業(yè)務(wù)文件也用,比如運維管理后臺。RASP不能只根據(jù)函數(shù)做報警,會帶來大量誤報,需要結(jié)合參數(shù)來做策略,system函數(shù)底層原理是執(zhí)行 sh -c "函數(shù)參數(shù)",因此我們可以通過命令混淆的方式,成功將RASP動態(tài)檢測轉(zhuǎn)化為對函數(shù)參數(shù)的靜態(tài)檢測,這樣操作空間就會變得很大。示例如下:
其實在存在命令注入漏洞的場景中,使用混淆的方式是有很大的機會繞過RASP的監(jiān)控。
3.loader型函數(shù)
什么叫l(wèi)oader型函數(shù)呢? 簡單來說函數(shù)是正常的,但是通過改變參數(shù)來實現(xiàn)惡意行為,函數(shù)參數(shù)相當于payload。
比如 mail() 函數(shù)的第五個additional_parameters參數(shù)可用于設(shè)置命令行選項傳遞給配置為發(fā)送郵件時使用的程序。
mail 函數(shù)的底層原理是調(diào)用sendmail程序,當系統(tǒng)使用Exim來發(fā)送郵件時,sendmail 的 -be 參數(shù)支持運行擴展模式,可以 對指定字符串擴展格式進行解析。
默認情況下 sendmail時不支持 -be參數(shù)的,如何測試主機上的sendmail是否支持-be擴展呢? 使用sendmail執(zhí)行whoami,如果成功則沒有問題:
借用github中使用mail 實現(xiàn)命令執(zhí)行的開源代碼:
除了mail函數(shù),還有imap_open 函數(shù)在ssh建立連接可利用t代替空格進行-o ProxyCommand參數(shù)命令拼接,從而調(diào)用系統(tǒng)shell執(zhí)行命令。示例代碼如下:
4.LD_PRELOAD
LD_PRELOAD 是Linux中比較特殊的環(huán)境變量,它允許用戶指定程序運行前優(yōu)先加載的動態(tài)鏈接庫。在php中,可使用putenv()函數(shù)設(shè)置LD_PRELOAD環(huán)境變量來加載指定的so文件,so文件中包含自定義函數(shù)進行劫持從而達到執(zhí)行惡意命令的目的。
mail() 、 error_log()、ImageMagick() 是常用于劫持的觸發(fā)函數(shù),原因是在運行的時候能夠啟動子進程,這樣才能重新加載我們所設(shè)置的環(huán)境變量,從而劫持子進程所調(diào)用的庫函數(shù)。
以mail函數(shù)為例:mail函數(shù)在運行時,會啟動子進程來調(diào)用系統(tǒng)的sendmail,sendmail引用了getegid() 函數(shù)。
那么我們可以通過重寫 getegid() 函數(shù)編譯為so文件,代碼內(nèi)部執(zhí)行了whoami:
在利用過程中,通過設(shè)置LD_PRELOAD環(huán)境變量引入自定義的so庫。由于真正的惡意代碼運行在php之外的進程,自然避過了RASP監(jiān)控。
5. htaccess和mod_cgi
在apache的WEB環(huán)境中,我們經(jīng)常會使用.htaccess這個文件來確定某個目錄下的URL重寫規(guī)則,如果.htaccess文件被攻擊者修改的話,攻擊者就可以利用apache的mod_cgi模塊,直接繞過PHP來執(zhí)行系統(tǒng)命令。需要滿足四個條件:
舉個例子:
.htaccess內(nèi)容:
shell.tt
6. PHP-FPM
PHP-FPM是一個fastcgi協(xié)議解析器,默認監(jiān)聽在9000端口。php-fpm由于未授權(quán)訪問的設(shè)計缺陷,它沒有相應(yīng)的訪問驗證,因此 可以自己構(gòu)造fastcgi協(xié)議,與php-fpm進行通信,讓它幫我們干一些"壞事",比如動態(tài)加載上傳的惡意php擴展。
FastCGI協(xié)議由多個record組成,和HTTP協(xié)議類似,也有header和body ,但是和HTTP頭不同,record的頭固定8個字節(jié),body是由頭中的contentLength指定,其結(jié)構(gòu)如下:
在傳入的FastCGI協(xié)議數(shù)據(jù)包中,設(shè)置 type=4,就可以給php-fpm傳遞環(huán)境參數(shù),指揮它工作。
通過FastCGI協(xié)議告訴php-fpm去加載一個我們自定義的擴展,這涉及到php-fpm的兩個環(huán)境變量,PHP_VALUE 和 PHP_ADMIN_VALUE。這兩個環(huán)境變量就是用來設(shè)置PHP配置項的,PHP_VALUE可以設(shè)置模式為PHP_INI_USER和PHP_INI_ALL的選項,PHP_ADMIN_VALUE可以設(shè)置所有選項。我們只要發(fā)送如下類似的請求就可以實現(xiàn)擴展的自動加載。
推薦幾個項目,可以方便大家更好的操作:
7. C接口
FFI(Foreign Function Interface)是 PHP7.4 新加入的功能,即外部函數(shù)接口,允許從共享庫中調(diào)用C代碼,導致風險點擴大。調(diào)用glibc中的system:
8. 已知漏洞
php有一些已知的釋放重引用漏洞,比如 GC UAF、Json Serializer UAF 、Backtrace UAF等,具體的exp位于https://github.com/mm0r1/exploits/
通過第一部分對 RASP(PHP)原理的講解,我們知道PHP函數(shù)的底層調(diào)用都要通過CG(function_table)獲取所調(diào)用函數(shù)的handler。無論 RASP 是hook opcode 還是 hook function,本質(zhì)上都沒有從內(nèi)存中刪除所調(diào)用的函數(shù),只是改變了走向,指向了我們自定義的函數(shù)。正因如此,我們可以通過上述漏洞,找到內(nèi)存中對應(yīng)的函數(shù)地址,將其封裝為閉包實現(xiàn)調(diào)用,從而完成繞過 。以 system函數(shù)為例,繞過原理簡單總結(jié)如下圖所示:
對于 正常的php 文件 system("whoami")而言,由于php rasp 將function_table 函數(shù)指向從原來的zif_system 內(nèi)置函數(shù) 改為 自定義的fake_system監(jiān)控函數(shù),導致命令執(zhí)行在RASP的控制之下。而通過上述漏洞的方式,可以在內(nèi)存中直接找到 zif_system函數(shù)地址,找到地址后,通過偽造閉包對象,將對象中的函數(shù)handler指向該地址,實現(xiàn)對 zif_system函數(shù)的調(diào)用,從而繞過RASP監(jiān)控。
9. GOT 表劫持
在linux系統(tǒng)中,procfs 文件系統(tǒng)是個特殊的存在,對應(yīng)的是 /proc目錄,php 可以通過/proc 目錄讀寫自己所在進程的內(nèi)存,將非敏感函數(shù)地址替換成glibc 中的system地址,從而執(zhí)行命令,其涉及的技術(shù)叫做 GOT表劫持。
通過正常函數(shù)實現(xiàn)敏感行為繞過 RASP ,舉個例子,如果能將open函數(shù)地址換成system地址,那么便可以將fopen打開文件的命令,最終變成glibc調(diào)用system執(zhí)行命令。
適用條件:
針對適用條件的第2點簡要說明一下:
- apache+php 由于 apache調(diào)用setuid設(shè)置www權(quán)限工作進程,/proc/self/目錄屬于root用戶,導致沒有權(quán)限讀寫。
- nginx+php,對于低版本的php -fpm www權(quán)限工作進程, /proc/self/目錄屬于www用戶可以讀寫。經(jīng)不完全測試,php<5.6 版本是可以使用GOT表劫持。
下面簡單描述一下劫持GOT表的步驟,以system替換open函數(shù)為例:
不在文中放exp源碼了,具體源碼在前文提到的git倉庫中,大家可以根據(jù)實際環(huán)境進行調(diào)試修改,并不通用。
四、總結(jié)
單純就RASP本身而言,RASP的優(yōu)點在于能嵌入在應(yīng)用程序內(nèi)部,應(yīng)用代碼無感知,更了解應(yīng)用程序上下文,方便定位漏洞信息,更少的誤報和漏報,對各種繞過手法具有更強的防護能力;但缺點在于PHP RASP會對服務(wù)器的性能造成影響,推動部署落地相對困難。不過隨著DevSecOps理念的推廣,未來借助于云、容器等成熟的大規(guī)模基礎(chǔ)設(shè)施和技術(shù),通過優(yōu)化完全有可能提供更優(yōu)雅更易于接受和使用的部署方案,能夠帶來更快更精準更細致入微的安全檢查及防護能力。關(guān)于DevSecOps理念與思考,大家可以參考我們團隊之前的文章: “安全需要每個工程師的參與”-DevSecOps理念及思考 。
雖然依然有一些對抗手段,但是RASP 在Web安全領(lǐng)域依然是現(xiàn)階段強有力的存在。但是安全沒有銀彈,不存在一勞永逸的系統(tǒng)和辦法,在漏洞/入侵檢測上我們需要掃描器,WAF,IDS,EDR等系統(tǒng)的配合共建防御體系,縱深防御才是長久之道,并且需要持續(xù)研究在對抗中不斷提升和發(fā)展。
參考文獻:
https://www.cnblogs.com/zw1sh/p/12632126.htmlhttps://zhuanlan.zhihu.com/p/75114351?from_voters_page=truehttps://www.cnblogs.com/tr1ple/p/11213732.htmlhttps://www.freebuf.com/articles/others-articles/232329.htmlhttps://x-c3ll.github.io/posts/UAF-PHP-disable_functions/ 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的rasp 系统_RASP攻防 —— RASP安全应用与局限性浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 剪辑图片_CSS clip:re
- 下一篇: ai边缘平滑_华为P40的多帧曝光AI智