利用漏洞清除債務(wù),盜取數(shù)據(jù),一鍵獲取XX游戲的所有賬戶登陸權(quán)限,這些看似爽文里的“騷操作”其實(shí)早就在現(xiàn)實(shí)中上演。
2013年,一個(gè)自稱RedHack的黑客小組利用土耳其政府網(wǎng)站的Web漏洞,清除了相關(guān)人員在政府機(jī)構(gòu)的債務(wù)數(shù)據(jù)。2015年,某安全研究人員公開(kāi)稱,可以通過(guò)特定的注入漏洞攻破某知名汽車(chē)的網(wǎng)站,獲得管理權(quán)限,并竊取用戶數(shù)據(jù)。2019年,擁有超過(guò)3.5億用戶的在線游戲“XX壘之夜”被爆出一個(gè)SQL注入漏洞,可以讓攻擊者訪問(wèn)所有用戶帳戶。
這些都是Web應(yīng)用程序的漏洞,Web應(yīng)用程序已經(jīng)廣泛應(yīng)用社交網(wǎng)絡(luò)、網(wǎng)上支付等各個(gè)領(lǐng)域,真正影響人們的生活,因此Web應(yīng)用中存在的各種安全漏洞越來(lái)越引起人們的重視。
為趕在惡意人員之前發(fā)現(xiàn)并修復(fù)Web應(yīng)用程序中的安全漏洞,安全人員需要利用各種安全測(cè)試技術(shù)識(shí)別并修復(fù)Web應(yīng)用程序中的缺陷。靜態(tài)應(yīng)用安全測(cè)試(Static Application Security Testing ,SAST)由于不需要運(yùn)行被測(cè)程序,具有覆蓋率高、自動(dòng)化程度高、可以在開(kāi)發(fā)生命周期早期使用等特點(diǎn),是目前被業(yè)界廣泛采用的應(yīng)用安全測(cè)試技術(shù)之一。但是靜態(tài)應(yīng)用安全測(cè)試作為一種針對(duì)應(yīng)用安全缺陷的自動(dòng)化檢測(cè)方法,本質(zhì)上處理的是一個(gè)不可判定問(wèn)題,理論上不可能同時(shí)做到?jīng)]有誤報(bào)也沒(méi)有漏報(bào)。
大量的誤報(bào)會(huì)使人對(duì)分析工具失去信心,而漏報(bào)會(huì)造成程序具有較高安全水位的假象,很多情況下減少誤報(bào)和減少漏報(bào)就是一對(duì)矛盾體。為盡量減少不必要的漏報(bào)和誤報(bào),往往需要運(yùn)用更復(fù)雜的分析技術(shù),意味著更高的復(fù)雜度,因此分析的精度與分析的速度往往也是一對(duì)不可兼得的矛盾體。實(shí)用的靜態(tài)應(yīng)用安全測(cè)試工具需要根據(jù)分析目標(biāo)和應(yīng)用場(chǎng)景在誤報(bào)、漏報(bào)、效率、易用性、可擴(kuò)展性之間達(dá)到一個(gè)合理的平衡。
哪些缺陷類(lèi)型需要“關(guān)心”
程序分析工具都有其針對(duì)的“分析目標(biāo)程序?qū)傩浴保╰arget program properties),通俗地來(lái)說(shuō)“分析目標(biāo)程序?qū)傩浴本褪欠治龉ぞ摺瓣P(guān)心哪些缺陷類(lèi)型”。當(dāng)前許多通用的靜態(tài)缺陷檢測(cè)工具往往強(qiáng)調(diào)“大而全”,強(qiáng)調(diào)能夠適應(yīng)不同的掃描場(chǎng)景,強(qiáng)調(diào)能夠覆蓋更多的缺陷類(lèi)型,實(shí)際上這里存在誤區(qū)。實(shí)際中的程序千變?nèi)f化,對(duì)不同類(lèi)型的程序,在不同的場(chǎng)景下,人們關(guān)注的程序?qū)傩圆灰粯?,?duì)分析工具的各項(xiàng)要求也不一樣。靜態(tài)分析都會(huì)引入某種程度上的抽象,最有效的抽象方法需要充分利用分析目標(biāo)程序?qū)傩员旧淼奶攸c(diǎn)。明確應(yīng)用場(chǎng)景和分析目標(biāo)程序?qū)傩裕╰arget program properties)是設(shè)計(jì)真正實(shí)用分析工具的首要任務(wù)。
Web應(yīng)用靜態(tài)安全測(cè)試的主要應(yīng)用場(chǎng)景在開(kāi)發(fā)階段而不是開(kāi)發(fā)完成之后,它的重要優(yōu)勢(shì)是能夠在早期就檢測(cè)出源碼中的安全漏洞,從而大大降低修復(fù)安全問(wèn)題成本,成熟的大型軟件開(kāi)發(fā)組織通常將其融入DevSecOps流程中。這更加要求分析工具能夠在漏報(bào)、誤報(bào)和效率之間達(dá)到合理的平衡,避免不必要地打擾和減緩正常開(kāi)發(fā)流程。
Web應(yīng)用靜態(tài)安全測(cè)試的分析目標(biāo)程序?qū)傩允浅R?jiàn)的Web應(yīng)用程序安全風(fēng)險(xiǎn),核心關(guān)注的就是OWASP Top 10中列出的安全風(fēng)險(xiǎn)。下圖是最新發(fā)布的OWASP Top 10Web應(yīng)用安全風(fēng)險(xiǎn):

Web應(yīng)用程序安全風(fēng)險(xiǎn)和空指針解引用、數(shù)組越界、資源泄漏、數(shù)值溢出等內(nèi)存安全程序?qū)傩杂酗@著區(qū)別。Web應(yīng)用程序安全風(fēng)險(xiǎn)從程序語(yǔ)義上看更加高層(更加靠近應(yīng)用層),內(nèi)存安全則更加底層,更加關(guān)注程序中變量的具體取值情況。為了開(kāi)發(fā)真正實(shí)用的分析工具,需要充分利用“分析目標(biāo)程序?qū)傩浴钡奶攸c(diǎn),選擇能夠達(dá)到最佳平衡的分析算法和策略。
Web應(yīng)用安全風(fēng)險(xiǎn)程序?qū)傩越?/h2>
為了保證靜態(tài)應(yīng)用安全測(cè)試工具能夠無(wú)二義性地識(shí)別和分析目標(biāo)缺陷類(lèi)型,我們將目標(biāo)缺陷類(lèi)型的分析配置描述為靜態(tài)應(yīng)用安全測(cè)試工具能夠識(shí)別的“規(guī)則”。易用且可擴(kuò)展性好的Web應(yīng)用靜態(tài)安全測(cè)試工具都應(yīng)該做到規(guī)則和引擎分離。規(guī)則描述結(jié)構(gòu)設(shè)計(jì)的過(guò)程本質(zhì)上是對(duì)Web應(yīng)用程序安全風(fēng)險(xiǎn)知識(shí)進(jìn)行建模的過(guò)程。OWASP Top 10列表中的Web應(yīng)用安全風(fēng)險(xiǎn)可分為兩類(lèi):一類(lèi)是和非正常數(shù)據(jù)流相關(guān)的安全風(fēng)險(xiǎn),如注入、敏感信息泄露、XML外部實(shí)體、跨站腳本和不安全的反序列化。一類(lèi)是和非正常控制流或狀態(tài)相關(guān)的安全風(fēng)險(xiǎn),如失效的身份認(rèn)證、失效的訪問(wèn)控制、安全配置錯(cuò)誤、使用含有已知漏洞的組件不足的日志和監(jiān)控。我們采用兩種不同的規(guī)則描述模型來(lái)支持上述兩類(lèi)Web應(yīng)用安全風(fēng)險(xiǎn):污染傳播模型和狀態(tài)機(jī)模型。
污染傳播分析
污染傳播分析又被稱作信息流分析(information-flow analysis),它是用于追蹤程序中特定數(shù)據(jù)傳播和依賴的一種數(shù)據(jù)流分析技術(shù)。污染傳播分析是Web應(yīng)用安全缺陷檢測(cè)的主要方法之一,其基本思想是通過(guò)對(duì)不可信的源頭(source)引入的數(shù)據(jù)進(jìn)行污染標(biāo)記,跟蹤被標(biāo)記的污染數(shù)據(jù)在程序中的傳播,若污染數(shù)據(jù)在進(jìn)入敏感操作(sink)前未經(jīng)過(guò)恰當(dāng)?shù)膬艋僮鳎╯anitizer),則表明存在潛在的安全缺陷。
污染傳播規(guī)則中的配置包括source、sanitizer、sink、安全類(lèi)型等。安全類(lèi)型指的是對(duì)于當(dāng)前目標(biāo)程序?qū)傩詠?lái)說(shuō)認(rèn)為肯定不會(huì)污染的類(lèi)型,例如對(duì)于注入類(lèi)安全風(fēng)險(xiǎn)可以認(rèn)為所有的枚舉類(lèi)型、布爾類(lèi)型、日期類(lèi)型、浮點(diǎn)類(lèi)型等都是安全的。
對(duì)于常見(jiàn)的web注入安全風(fēng)險(xiǎn),我們的解法是,提供統(tǒng)一的“安全方法”給開(kāi)發(fā)人員調(diào)用,這些“安全方法”也是靜態(tài)分析工具能夠識(shí)別的統(tǒng)一的凈化操作。污染傳播分析沿控制流在每個(gè)程序位置上計(jì)算當(dāng)前污染變量集合,并在污染變量間建立污染傳播依賴關(guān)系。
狀態(tài)機(jī)分析
理論上來(lái)說(shuō),Web應(yīng)用安全缺陷檢測(cè)所檢查的缺陷類(lèi)型都屬于時(shí)序安全屬性(temporal safety properties),安全屬性描述的是“壞的事情不會(huì)發(fā)生”一類(lèi)屬性,通??梢悦枋龀扇缦陆y(tǒng)一模式:“程序中某些動(dòng)作或行為構(gòu)成時(shí)序上的約束,一旦違背這種約束即被認(rèn)為是一個(gè)缺陷”。
有限狀態(tài)機(jī)(finite state machine)是描述時(shí)序安全屬性的有效工具,污點(diǎn)傳播相關(guān)的缺陷類(lèi)型本質(zhì)上也屬于時(shí)序安全屬性,即“來(lái)自source的數(shù)據(jù)在進(jìn)入sink點(diǎn)之前必須經(jīng)過(guò)sanitizer操作,否則報(bào)告一個(gè)缺陷”(但為了缺陷報(bào)告時(shí)更好地給出污染在變量間的傳播路徑,將其采用專門(mén)的污染傳播分析進(jìn)行建模)。狀態(tài)機(jī)規(guī)則中的配置包括狀態(tài)集合、狀態(tài)間的轉(zhuǎn)換集合以及各轉(zhuǎn)換所需滿足的條件集合等。
在實(shí)際的狀態(tài)機(jī)分析過(guò)程中還需要引入狀態(tài)機(jī)實(shí)例的概念,在程序中的每個(gè)分析入口函數(shù)處會(huì)創(chuàng)建一個(gè)狀態(tài)機(jī)實(shí)例,并沿控制流在每個(gè)程序位置上的計(jì)算它的可能狀態(tài)。如果一旦某個(gè)狀態(tài)機(jī)實(shí)例的當(dāng)前可能狀態(tài)中出現(xiàn)了error狀態(tài)則報(bào)告一個(gè)缺陷。
分析策略選擇
從不同的抽象和近似精度角度,靜態(tài)分析方法可以區(qū)分是否流敏感(flow sensitive)、路徑敏感(path sensitive)、上下文敏感(context sensitive)、域敏感(field sensitive)、對(duì)象敏感(object sensitive)等。
具體來(lái)說(shuō)流敏感需要在分析中考慮語(yǔ)句的執(zhí)行順序,路徑敏感需要在分析中考慮分支判斷條件的組合關(guān)系并排除不可達(dá)路徑(infeasible path),上下文敏感需要在分析中考慮被調(diào)函數(shù)在不同調(diào)用點(diǎn)的上下文影響,域敏感需要在分析中區(qū)分同一對(duì)象的不同字段,對(duì)象敏感需要在分析中區(qū)分同一字段的不同對(duì)象。一般來(lái)說(shuō),敏感性支持得越多,分析精度越高,實(shí)現(xiàn)越復(fù)雜,分析速度越慢。對(duì)于實(shí)際的靜態(tài)分析工具來(lái)說(shuō),最好的選擇是根據(jù)分析目標(biāo)和應(yīng)用場(chǎng)景的需要花最少的代價(jià)獲得最大的回報(bào)。對(duì)于Web應(yīng)用程序安全風(fēng)險(xiǎn)來(lái)說(shuō),引入路徑敏感的“性價(jià)比”并不高。
污染傳播分析和狀態(tài)機(jī)分析本質(zhì)上都可納入傳統(tǒng)的數(shù)據(jù)流分析框架,污染傳播分析在每個(gè)程序位置上計(jì)算當(dāng)前污染變量集合,其對(duì)應(yīng)數(shù)據(jù)流分析值為“當(dāng)前污染變量集合”。狀態(tài)機(jī)分析在每個(gè)程序位置上計(jì)算狀態(tài)機(jī)實(shí)例的的當(dāng)前可能變量集合,其對(duì)應(yīng)數(shù)據(jù)流分析值為“狀態(tài)機(jī)實(shí)例的的當(dāng)前可能變量集合”。污染變量集合和可能狀態(tài)集合的轉(zhuǎn)換函數(shù)都是滿足分配率。
傳統(tǒng)數(shù)據(jù)流分析基于迭代收斂完成過(guò)程內(nèi)數(shù)據(jù)流分析,基于圖可達(dá)算法完成過(guò)程間數(shù)據(jù)流分析。對(duì)于本文所關(guān)注的靜態(tài)應(yīng)用安全測(cè)試分析目標(biāo)程序?qū)傩詠?lái)說(shuō),傳統(tǒng)數(shù)據(jù)流分析算法的“性價(jià)比”太低。傳統(tǒng)數(shù)據(jù)流分析中的迭代主要是因?yàn)閷?shí)際的程序中存在循環(huán)和遞歸結(jié)構(gòu),需要通過(guò)迭代并收斂于不動(dòng)點(diǎn)來(lái)處理控制流圖中循環(huán)回邊帶來(lái)的影響。而實(shí)際上對(duì)于污點(diǎn)分析和狀態(tài)機(jī)分析(Web應(yīng)用安全風(fēng)險(xiǎn)這類(lèi)目標(biāo)程序?qū)傩裕﹣?lái)說(shuō)控制流圖中的回邊在實(shí)際中分析結(jié)果中的影響很小。至于圖可達(dá)算法考慮的過(guò)程間調(diào)用和返回匹配問(wèn)題可以在搜索污染傳播跟蹤路徑時(shí)進(jìn)行單獨(dú)處理。在不考慮循環(huán)和遞歸結(jié)構(gòu)的前提下(相當(dāng)于循環(huán)和遞歸只展開(kāi)1次),污染傳播分析和狀態(tài)機(jī)分析可以做到接近線性復(fù)雜度O(n),n為程序中的語(yǔ)句條數(shù)。
函數(shù)摘要
函數(shù)摘要(function summary)是靜態(tài)分析過(guò)程中常用的一種過(guò)程間分析技術(shù),它根據(jù)函數(shù)內(nèi)分析結(jié)果生成被調(diào)函數(shù)的摘要信息,以此替代函數(shù)的實(shí)際展開(kāi),從而避免同一個(gè)函數(shù)的多次展開(kāi)分析,提高函數(shù)間分析效率。函數(shù)摘要是對(duì)已展開(kāi)分析過(guò)函數(shù)的“抽象和總結(jié)”,函數(shù)摘要可以看作是以函數(shù)為單位,對(duì)函數(shù)實(shí)際語(yǔ)義的抽象。其理想的效果是:使用函數(shù)摘要得到的計(jì)算結(jié)果等于展開(kāi)實(shí)際函數(shù)調(diào)用得到的計(jì)算結(jié)果。
需要指出的是函數(shù)摘要是對(duì)函數(shù)實(shí)際語(yǔ)義的抽象,這種抽象必然是面向?qū)嶋H分析目標(biāo)程序?qū)傩蕴攸c(diǎn)的,應(yīng)該根據(jù)不同的分析目標(biāo)程序?qū)傩栽O(shè)計(jì)并收集對(duì)應(yīng)的函數(shù)摘要。由于靜態(tài)分析的不可判定性,通用的精確的函數(shù)摘要必然退化為函數(shù)的另一個(gè)完整實(shí)現(xiàn)。由于污染變量集合和可能狀態(tài)集合的轉(zhuǎn)換函數(shù)滿足分配律,面向污染傳播和狀態(tài)機(jī)的函數(shù)摘要完全可以滿足:使用函數(shù)摘要得到的計(jì)算結(jié)果=展開(kāi)實(shí)際函數(shù)調(diào)用得到的計(jì)算結(jié)果。
跨應(yīng)用、多語(yǔ)言支持
這里所謂的“跨應(yīng)用”,其實(shí)用“跨掃描單元”來(lái)表述可能更為準(zhǔn)確,“掃描單元”是掃描過(guò)程中確定和區(qū)分被掃對(duì)象的基本管理單位,它與缺陷的關(guān)閉與合并,權(quán)限管理,掃描中間結(jié)果的記錄等有關(guān),直觀地理解就是一次源碼掃描過(guò)程中的被掃對(duì)象。
目前市面上的靜態(tài)應(yīng)用安全測(cè)試工具都局限于處理單個(gè)掃描單元內(nèi)部的污染數(shù)據(jù)傳播,無(wú)法處理跨掃描單元傳播的場(chǎng)景,隨著微服務(wù)/Serverless/FaaS等開(kāi)發(fā)技術(shù)和模式的逐步演進(jìn),業(yè)務(wù)開(kāi)發(fā)代碼日趨碎片化,使得這一問(wèn)題愈發(fā)嚴(yán)重,成為靜態(tài)應(yīng)用安全測(cè)試技術(shù)的重大挑戰(zhàn)??鐠呙鑶卧P(guān)注的單元間依賴關(guān)系分為兩類(lèi):一類(lèi)是通過(guò)引用二三方包而形成的依賴關(guān)系,另一類(lèi)是通過(guò)各種遠(yuǎn)程調(diào)用服務(wù)(remote procedure call , RPC)形成的依賴關(guān)系。前一類(lèi)依賴關(guān)系通常在編譯時(shí)可以通過(guò)類(lèi)似maven這樣的機(jī)制獲取,后一類(lèi)依賴關(guān)系通常需要通過(guò)分析具體的配置文件獲取或者掃描時(shí)由用戶額外提供。
最直接的跨單元掃描解決方案是將所有相關(guān)掃描單元代碼進(jìn)行合并掃描。但是在實(shí)際中,這樣會(huì)使得單次掃描的代碼量急劇膨脹而難以實(shí)現(xiàn)。另外,對(duì)于被依賴掃描單元來(lái)說(shuō),每次的重復(fù)掃描也將會(huì)是極大的資源浪費(fèi)。
在實(shí)際中通常平均每個(gè)“應(yīng)用”依賴的其他掃描單元(包括二三方包依賴和RPC依賴)超過(guò)200,最大甚至超過(guò)2000。對(duì)于這些依賴非常多的“應(yīng)用”,所有相關(guān)掃描單元代碼合并后的代碼將會(huì)超過(guò)1000萬(wàn)行。本文所述分析工具當(dāng)前運(yùn)行節(jié)點(diǎn)的典型配置為8核32G內(nèi)存,單個(gè)掃描任務(wù)要求掃描時(shí)間不超過(guò)10分鐘。工具的內(nèi)存開(kāi)銷(xiāo)與代碼行數(shù)基本成線性關(guān)系,實(shí)際中平均每10萬(wàn)行代碼消耗內(nèi)存約2G左右。時(shí)間開(kāi)銷(xiāo)與代碼行數(shù)關(guān)系略高于O(n),10萬(wàn)行代碼的掃描時(shí)間約1分鐘左右。因此合并掃描的方案在實(shí)際中由于空間、時(shí)間以及存儲(chǔ)成本的限制而無(wú)法實(shí)現(xiàn)。
一種更好的跨單元掃描解決方案是:首先,在不損失精度的前提下,以掃描單元為單位建立被依賴單元的靜態(tài)應(yīng)用安全檢測(cè)中間結(jié)果表示,并將這些中間結(jié)果持久化地保存下來(lái);其次,在其他單元掃描前,先依據(jù)其依賴關(guān)系將需要的中間結(jié)果下載到本地,并應(yīng)用于當(dāng)前單元的掃描過(guò)程。
根據(jù)上一節(jié)的討論,基于污染傳播和狀態(tài)機(jī)的中間結(jié)果表示核心即是函數(shù)摘要。另外,對(duì)于通常的RPC調(diào)用來(lái)說(shuō),只要在接口層面進(jìn)行了統(tǒng)一,具體用何種語(yǔ)言實(shí)現(xiàn)對(duì)調(diào)用方是完全透明的,因此,基于函數(shù)摘要的跨單元掃描解決方案天然支持跨語(yǔ)言。上述方案如下圖所示:

免費(fèi)領(lǐng)取學(xué)習(xí)資料
2021年全套網(wǎng)絡(luò)安全資料包及最新面試題
(滲透工具,環(huán)境搭建、HTML,PHP,MySQL基礎(chǔ)學(xué)習(xí),信息收集,SQL注入,XSS,CSRF,暴力破解等等)
經(jīng)驗(yàn)與體會(huì)
本文討論的Web應(yīng)用安全靜態(tài)測(cè)試工具主要的使用方式是與應(yīng)用持續(xù)集成/發(fā)布平臺(tái)對(duì)接,作為持續(xù)集成/發(fā)布的一個(gè)環(huán)節(jié),在發(fā)布之前集成發(fā)布平臺(tái)調(diào)用工具進(jìn)行代碼安全掃描,如果發(fā)現(xiàn)安全缺陷則通知用戶進(jìn)行修復(fù),修復(fù)后才可以發(fā)布上線。在這樣的應(yīng)用場(chǎng)景下有如下幾點(diǎn)總結(jié)和體會(huì):
- 實(shí)用的靜態(tài)應(yīng)用安全測(cè)試工具通常是根據(jù)分析目標(biāo)和應(yīng)用場(chǎng)景在誤報(bào)、漏報(bào)、效率、易用性、可擴(kuò)展性之間達(dá)到一個(gè)合理的平衡。
- Web應(yīng)用安全風(fēng)險(xiǎn)和通用的內(nèi)存安全漏洞有不同的特點(diǎn),這些特點(diǎn)決定了分析算法和策略的選擇。
- 函數(shù)摘要對(duì)于Web應(yīng)用安全風(fēng)險(xiǎn)相關(guān)的靜態(tài)分析來(lái)說(shuō)是一種重要的技術(shù),它不僅可以大大提高應(yīng)用內(nèi)掃描的效率,也是支持跨應(yīng)用多語(yǔ)言掃描的一種方法。
- 靜態(tài)應(yīng)用安全測(cè)試方法有許多天然的優(yōu)點(diǎn),但也有其固有的缺點(diǎn),在實(shí)際中亟需將它與其他方法結(jié)合起來(lái),才能更好地面對(duì)不斷涌現(xiàn)的Web應(yīng)用安全檢測(cè)新場(chǎng)景和新需求。