如何建立有效的安全策略
說起攻防對抗,大家很熟悉的一句話是 “攻擊只需一點(diǎn)即可得手,而防守必須全面設(shè)防”??梢姸鄶?shù)時(shí)候,防守方很被動(dòng)。當(dāng)攻防雙方在同一維度活動(dòng)時(shí),攻擊者會(huì)有很多途徑實(shí)現(xiàn)攻擊,而防守策略必須不斷的疊加來封堵,往往疲于奔命。在互聯(lián)網(wǎng)公司安全團(tuán)隊(duì)有限的人力資源條件下,像殺毒軟件或各色ips\ids那樣不斷累加特征碼的方式,需長年累月投入人力且收效未必很好,因此是非常不可取的。
其實(shí),防守方也是有他的優(yōu)勢的。舉例來說,目前常見的攻擊手法都是針對目標(biāo)的web或主機(jī)系統(tǒng)層面。而整個(gè)戰(zhàn)場所在的操作系統(tǒng)以及網(wǎng)絡(luò)設(shè)備均是防守方的,那么理論上防守方可以在任意維度構(gòu)建安全產(chǎn)品和制定安全策略,相對來說攻擊行為則處在一個(gè)較低維度領(lǐng)域內(nèi)活動(dòng)。
如何理解這個(gè)維度呢,參考圖1:

圖1. 戰(zhàn)場縱深視圖
高維防守
常??吹統(tǒng)uange提到安全策略(體系)的完備性,通常安全策略被繞過是由于不夠完備。如何讓策略足夠完備呢,筆者認(rèn)為基于系統(tǒng)的機(jī)制、CGI和協(xié)議規(guī)范較為有效,比不斷用新規(guī)則新策略去為之前的策略打“補(bǔ)丁”靠譜的多。因?yàn)橐磺泄襞c防守所需的基本功能/基本邏輯均來源于此。
從圖1可以看到無論什么入侵行為,其實(shí)都對應(yīng)著更高一維度的系統(tǒng)功能和能力支持。在防守方的主場,不要放著這些有利的條件不用,與攻擊者針尖對麥芒的在低維度對抗,猶如遭受了《三體》中的“降維攻擊”是不明智的。
維度分析
以“webshell上傳“這個(gè)入侵場景為例,在制定防守策略前,先分析一下它在各個(gè)維度都有哪些事件發(fā)生,見圖2。

圖2. Webshell上傳在各維度事件
策略實(shí)踐
梳理清楚了“webshell上傳”這個(gè)場景在各維度的技術(shù)細(xì)節(jié),如何制定不易繞過的策略就相對容易了。
◆網(wǎng)絡(luò)層:檢測符合RFC1867標(biāo)準(zhǔn)的上傳CGI行為
無論什么漏洞和那種猥瑣的攻擊,他總是要符合HTTP協(xié)議的。那從高維度的HTTP協(xié)議入手,便不用去考慮諸如”XXeditor上傳漏洞”、“XXCMS上傳漏洞“的防護(hù)規(guī)則了,見圖3。

圖3. 一個(gè)符合RFC 1867協(xié)議的HTTP上傳行為數(shù)據(jù)包
◆CGI層面:檢測fopen等API事件是否在創(chuàng)建CGI文件
無論什么CGI漏洞導(dǎo)致的上傳,漏洞代碼幾乎都用有fopen等寫文件的操作,見圖4。

圖4. CGI層面對寫文件事件的監(jiān)控
◆系統(tǒng)用戶態(tài):檢測系統(tǒng)層面的API調(diào)用行為是否在創(chuàng)建CGI文件
除非websvr直接是root啟動(dòng)且能加載任意代碼,否則攻擊者幾乎很難繞過檢測了,見圖5

圖5. 用戶態(tài)監(jiān)控CGI文件創(chuàng)建事件
◆系統(tǒng)內(nèi)核態(tài):通過內(nèi)核inotify事件來發(fā)現(xiàn)CGI創(chuàng)建行為
在這一層我們甚至不擔(dān)心root啟動(dòng)的websvr加載惡意代碼帶來的可能的逃逸行為,至少在完成后續(xù)的攻擊之前,創(chuàng)建CGI文件的可疑行為必定被發(fā)現(xiàn),見圖6。

圖6. Inotify監(jiān)控創(chuàng)建CGI文件事件
越高維度的策略,越不易被繞過,聯(lián)動(dòng)起來,則更為精準(zhǔn)。以上策略檢測模型匯總起來,就是圖7的樣子。

圖7. 上傳Webshell可以做的高緯防守
2個(gè)木馬檢測案例
前面看到,通常供攻擊者施展的漏洞利用或攻擊渠道能做的事情通常畢竟有限,在防守方在高一維度對事件的觀察與檢測讓攻擊方很難逃逸。而對入侵\漏洞場景的細(xì)致分析,以及入侵場景關(guān)鍵環(huán)節(jié)的提煉則是策略制定的關(guān)鍵,否則同樣會(huì)陷入不斷為舊策略打補(bǔ)丁的尷尬境地。
要解決一個(gè)入侵場景,在制定策略之前需要做好足夠的分析并提煉其最核心的技術(shù)點(diǎn),貼近此特征制定策略效果就非常好,且不易被繞過。下面選擇2個(gè)linux系統(tǒng)常見的木馬場景和案例來說明。
熟悉惡意代碼取證的同學(xué)應(yīng)該清楚常見的反連木馬,‘核心’代碼部分一般是這樣的:
connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(struct sockaddr));
dup2(sockfd, 1);
dup2(sockfd, 2);
execve("/bin/sh","sh",envp);
那防守方的檢測就十分簡單,通常一個(gè)bash進(jìn)程是不會(huì)有網(wǎng)絡(luò)連接的,所以檢測策略是bash的 STDIN/STDOUT綁定了socket則為木馬。

圖8. 常規(guī)linux反連shell檢測思路
有一些老練的木馬代碼則不會(huì)那么偷懶,譬如mod_rootme。為了復(fù)用apache的監(jiān)聽端口以及獲得root權(quán)限的shell,mod_rootme在代碼邏輯上作了很多精巧的變換組合,使得檢測不能像普通木馬一樣方便。TSRC官微曾經(jīng)有分享過如何發(fā)現(xiàn)mod_rootme這類極為隱蔽的后門(http://t.qq.com/p/t/330573116082464)。
但是,再狡猾的后門,他也有異于系統(tǒng)正常行為的地方,比如mod_rootme會(huì)存在多于2個(gè)root權(quán)限的httpd進(jìn)程、apache進(jìn)程開啟多個(gè)管道并且使用了偽終端(詳見微博),根據(jù)異常行為建立策略是相比簽名特征更為靠譜的檢測手段。

圖9. mod_rootme檢測思路,根據(jù)root權(quán)限的httpd進(jìn)程、管道和偽終端判斷
總結(jié)
安全設(shè)備與檢測系統(tǒng)布置在合適的維度可以使得防守處于非常有利的位置,同時(shí)盡可能的提煉入侵場景的關(guān)鍵環(huán)節(jié),則是檢測思想的精髓。
筆者認(rèn)為甲方安全團(tuán)隊(duì)?wèi)?yīng)該盡量避免針對每一個(gè)漏洞和黑客攻擊手法制定個(gè)性化防護(hù)的策略,那樣看似大而全,實(shí)際卻難以窮舉同類場景并難以維護(hù)。
針對自身業(yè)務(wù)特點(diǎn),分析其主要風(fēng)險(xiǎn),針對性的制定策略。將有限的資源用于對抗清晰的風(fēng)險(xiǎn)場景,才是更為可取且有效率的事。