037 代碼安全掃描【產(chǎn)品】

源代碼是構(gòu)成信息系統(tǒng)的基石沦辙。對源代碼進行安全審計,可以在系統(tǒng)實現(xiàn)階段就發(fā)現(xiàn)大量的安全漏洞和潛在威脅隱患纸厉,可節(jié)省5%-20%的后期安全維護費用底哥,減少10%-50%的系統(tǒng)安全漏洞。?

從技術(shù)上分析谬擦,大中型政企機構(gòu)的信息系統(tǒng)切距,往往規(guī)模龐大,涉及大量定制開發(fā)惨远、外包開發(fā)谜悟、開源軟件集成、第三方組件使用等北秽,并且開發(fā)人員水平參差不齊葡幸、開發(fā)管理任務(wù)復(fù)雜、開發(fā)語言種類繁多贺氓,對信息系統(tǒng)的安全性帶來較多挑戰(zhàn)蔚叨。通過源碼安全審計,可以及早發(fā)現(xiàn)各類安全漏洞和威脅隱患辙培,節(jié)省大量安全建設(shè)成本及軟件運維成本蔑水。

《中華人民共和國網(wǎng)絡(luò)安全法》正式頒布實施以來,國家對包括政企機構(gòu)的網(wǎng)絡(luò)安全監(jiān)管日益完善扬蕊,不管是網(wǎng)絡(luò)安全等級保護制度還是行業(yè)監(jiān)管制度搀别,都對信息系統(tǒng)開發(fā)管理、源碼安全審 計做出了規(guī)范要求尾抑,源碼安全審計作為信息系統(tǒng)安全建設(shè)的重要組成部分歇父,日益受到大中型政企機構(gòu)的重視蒂培,在安全建設(shè)過程中, 對源碼進行安全審計的機構(gòu)比例不斷提高榜苫。?

靜態(tài)分析:不運行代碼的方式下毁渗,驗證代碼是否滿足規(guī)范性,安全性单刁,可靠性灸异,可維護性等指標的一種代碼分析技術(shù)。

實現(xiàn)原理:詞法分析羔飞,語法分析肺樟,控制流,數(shù)據(jù)流分析等對程序代碼進行掃描逻淌,使用數(shù)學(xué)方法進行分析么伯。

1 技術(shù)概述

1.1?基于污點傳播分析的自動化挖掘技術(shù)

1.1.1 檢測模型

自動化代碼安全檢測是一種自動化挖掘、發(fā)現(xiàn)源代碼漏洞的安全檢測卡儒。在人工形式下的代碼審計中田柔,通常關(guān)注以下三點:

(1)輸入源

即用戶輸入可進入代碼邏輯的入口,如PHP語言中的GPC骨望,JAVA語言中的HttpServletRequest等等硬爆。此外,在對框架開發(fā)的工程進行代碼審計的時候擎鸠,我們還會關(guān)注框架自身封裝的一些入口方式缀磕,比如SpingMVC中的@RequestParam注解。

(2)凈化操作

凈化操作包括兩個部分:系統(tǒng)自帶的凈化操作函數(shù)以及用戶自定義的凈化操作函數(shù)劣光。

這些凈化操作函數(shù)通惩嗖希可以針對某種漏洞類型將傳入的參數(shù)進行一定程度的字符串變化,從而消除某種漏洞的威脅绢涡。比如htmlspecialchars函數(shù)牲剃,被廣泛認為是用于消除XSS漏洞影響的,雖然在某些場景下一樣可以被繞過雄可。

(3)危險函數(shù)

危險函數(shù)是觸發(fā)漏洞的位置凿傅,一般按照漏洞類型進行分類別討論。比如SQL注入漏洞的PHP危險函數(shù)為mysql_query滞项,調(diào)用該方法執(zhí)行查詢狭归,如果一旦危險參數(shù)可控,則會造成SQL注入漏洞文判。

目前市面上有基于正則表達式和基于語義分析的兩種檢測方式过椎,基于正則表達式的傳統(tǒng)代碼安全掃描方案的缺陷在于其無法很好的“理解”代碼的語義,而是僅僅把代碼文件當(dāng)作純字符串處理戏仓。目前較為成功的靜態(tài)掃描商用產(chǎn)品都運用了語義分析疚宇、語法分析等程序分析技術(shù)亡鼠,如開源的Rips中,使用的是PHP內(nèi)置的Tokenizer系列API來獲取token流敷待。在token流的基礎(chǔ)上進行分析间涵,可以通過每個節(jié)點的解析器代號對代碼進行一定程度的理解,如T_ABSTRACT表示抽象類榜揖、T_AND_EQUAL代表賦值運算符勾哩。

除了在token流的基礎(chǔ)上執(zhí)行代碼分析,市面上越來越多的代碼漏洞掃描器選擇了從抽象語法樹層面入手執(zhí)行代碼分析举哟,相比冗長的token流思劳,語法樹層面的分析顯得層次分明、容易理解妨猩,這對于平臺開發(fā)人員來說是個好消息潜叛。

通過更加高級的語義、語法分析壶硅,我們可以從待分析的代碼中獲取更多的信息威兜,通過這些信息,就能夠大大提高漏洞檢測的準確度庐椒,這也是為什么目前絕大多數(shù)商用軟件都選擇在語義椒舵、語法分析的基礎(chǔ)上執(zhí)行代碼安全檢測。

1.1.2 系統(tǒng)層次

一個基于程序靜態(tài)分析的自動化審計系統(tǒng)大致應(yīng)該有以下幾個部分:

(1)靜態(tài)分析層

靜態(tài)分析層負責(zé)對代碼文件進行“理解”扼睬,完成語義逮栅、語法層面的分析,比如生成抽象語法樹窗宇、生成程序的控制流圖等基礎(chǔ)的分析結(jié)構(gòu)。同時特纤,針對PHP語言的一些變量類型進行分類抽象军俊,用于后續(xù)的數(shù)據(jù)流分析中。

(2)數(shù)據(jù)流分析層

數(shù)據(jù)流分析主要負責(zé)收集代碼中的變量傳遞流向捧存,同時收集變量的凈化情況粪躬。數(shù)據(jù)流分析是污點傳播分析的基礎(chǔ),其收集的信息越全面越準確昔穴,后續(xù)的污點傳播分析才會準確镰官。

(3)污點分析層

污點傳播分析是依照數(shù)據(jù)流分析過程獲取的一系列程序信息來進行漏洞判定的模塊。

(4)其他分析層

其他分析包含針對PHP多個代碼文件的聯(lián)合檢測吗货、結(jié)合程序的上下文信息進行更加細化的漏洞判定分析泳唠、過程內(nèi)和過程間分析等等。

1.1.2.1?語義語法分析

抽象語法樹(Abstract syntaxtree宙搬, AST)是將源代碼按照一定的語法結(jié)構(gòu)笨腥,并且將一些冗余的細節(jié)抽象為樹狀結(jié)構(gòu)進行表示拓哺。市面上有很多語義語法分析工具,如ANTLR脖母,Yacc士鸥,Lex,PHP-Parser等等谆级。

這里著重介紹一下PHP-Parser(https://github.com/nikic/PHP-Parser)烤礁,作為PHP語言的語法分析工具,其本身就是使用PHP語言進行實現(xiàn)的肥照,且支持節(jié)點遍歷等功能脚仔。

1.1.2.2 控制流程分析

僅僅在抽象語法樹的基礎(chǔ)上進行分析是不夠的,因為抽象語法樹無法很好的獲取程序中流程控制語句的信息建峭。因此需要在抽象語法樹的基礎(chǔ)上構(gòu)建控制流程圖玻侥,將PHP中的分支跳轉(zhuǎn)進行整理,以基本塊的形式編排抽象語法樹的節(jié)點亿蒸。

在程序分析的時候凑兰,必須要對每個分支進行獨立的分析。生成新基本塊的依據(jù)是一些控制流程語句边锁,這些語法結(jié)構(gòu)都是固定姑食,大致有以下幾種:

(1)條件分支

If語句、Switch語句茅坛、Try catch塊音半、三目運算符、Or語句

(2)循環(huán)結(jié)構(gòu)

For語句贡蓖、Foreach語句曹鸠、While語句、Do…While語句

(3)終止結(jié)構(gòu)

Break斥铺、Continue彻桃、Throw

(4)返回結(jié)構(gòu)

Return

生成控制流圖的方法是當(dāng)遇到條件分支和循環(huán)結(jié)構(gòu)時,需要生成一個新的基本塊晾蜘,將這些代碼塊中的語法樹節(jié)點插入進去邻眷;當(dāng)遇到終止結(jié)構(gòu)時,停止當(dāng)前基本塊的生成剔交;當(dāng)遇到返回語句時肆饶,停止圖的構(gòu)建。

1.1.2.3?抽象內(nèi)置函數(shù)

在任何代碼中岖常,都會有PHP內(nèi)置函數(shù)的調(diào)用驯镊,如果不對這些內(nèi)置函數(shù)進行處理,或者說自動化分析不“理解”這些函數(shù)的含義和效果,可能會造成大量的誤報阿宅,由于PHP內(nèi)置函數(shù)眾多候衍,每個函數(shù)都人工進行處理是不現(xiàn)實的,最好的方式是對這些內(nèi)置函數(shù)進行分類洒放。按照功能和對程序分析的影響蛉鹿,大致可分為:

(1)返回常量值

比如strlen()或者md5(),一旦參數(shù)進入這些內(nèi)置函數(shù)將會返回常量類型的結(jié)果往湿,比如返回純數(shù)字妖异、布爾值、純字符串领追,這種處理需要考慮為針對參數(shù)的一種凈化方法他膳。

(2)返回參數(shù)的一部分

某些內(nèi)置函數(shù)如trim() 或者 array_keys() 會將參數(shù)的一部分或者全部進行返回。針對返回值绒窑,該分類可以分為返回array棕孙、返回array的單個元素、返回string類型些膨。

(3)凈化操作

針對某種漏洞類型進行參數(shù)凈化操作的內(nèi)置函數(shù)蟀俊,比較典型的有addslashes,htmlspecialchars等函數(shù)订雾。

(4)字符串切割變換

比如內(nèi)置函數(shù)substr()或者chunk_split()肢预,這些內(nèi)置函數(shù)會返回傳入?yún)?shù)的一個子串。由于這種操作會破壞參數(shù)原有的結(jié)構(gòu)洼哎,如果不追求絕對精確分析的話烫映,實際上完全可以將這類函數(shù)的調(diào)用視為某種程度的凈化處理。

(5)編碼和解碼函數(shù)

編碼函數(shù)

如urlencode()或者base64_encode()等執(zhí)行某種編碼操作的內(nèi)置函數(shù)噩峦。

解碼函數(shù)

如urldecode()或者base64_decode()等執(zhí)行某種解碼操作的內(nèi)置函數(shù)锭沟。注意,如果在分析中遇到了解碼函數(shù)识补,通常認為該函數(shù)調(diào)用前參數(shù)所受到的一切凈化都是無效的冈钦,如果直接進入危險函數(shù)就會觸發(fā)漏洞。

(6)回調(diào)函數(shù)

一些內(nèi)置函數(shù)會執(zhí)行參數(shù)指定的其他函數(shù)李请,比如array_walk(),array_map(), set_error_handler()。如果標識其他函數(shù)名的參數(shù)可以直接獲取到厉熟,那么將該調(diào)用信息進行進一步分析导盅,

①獲取文件句柄

一些文件操作類型的危險函數(shù)的文件參數(shù)是以resource傳遞進來的,因此如果僅僅去判斷是否受污染是不可行的揍瑟,所以需要對獲取文件句柄的函數(shù)進行分類白翻。

②白名單機制

在條件分支中遇到這些函數(shù)如in_array,array_key_exists等函數(shù),可以默認是一種基于白名單的凈化處理。

③正則表達式校驗

比如preg_match和ereg函數(shù)滤馍,這里不可能去分析具體的正則表達式岛琼,因此為了減少誤報,可以認為調(diào)用這些函數(shù)進行校驗都是有效的過濾巢株。當(dāng)然如果選擇犧牲誤報而減少漏報槐瑞,也可以認為這些函數(shù)的調(diào)用是不起作用的,可以直接報警阁苞。

④其他函數(shù)

其他不屬于上述類別但是需要額外分析的內(nèi)置函數(shù)困檩。

1.1.2.4 數(shù)據(jù)流分析

數(shù)據(jù)流分析層所做的工作是收集程序中的變量值傳遞、特殊函數(shù)調(diào)用等信息那槽〉垦兀可以理解為數(shù)據(jù)流分析就是一個綜合的程序信息搜集,目的是為了給后續(xù)的污點分析提供詳細的參考信息骚灸。

對于數(shù)據(jù)流向的識別和搜集糟趾,應(yīng)該考慮到以下兩種情況:

(1)針對代碼中的賦值語句

(2)PHP內(nèi)置函數(shù)導(dǎo)致的隱藏數(shù)據(jù)流,比如調(diào)用list甚牲、func_get_args等函數(shù)义郑。

1.1.2.5 污點傳播分析

污點分析過程是在程序分析中,一旦發(fā)現(xiàn)危險函數(shù)的調(diào)用則啟動分析鳖藕。對傳入危險函數(shù)的危險參數(shù)進行分析魔慷,結(jié)合數(shù)據(jù)流分析時該危險參數(shù)的一些程序信息,如凈化信息著恩、內(nèi)置函數(shù)處理信息等進行判斷院尔,如果一旦發(fā)現(xiàn)該變量可以被用戶控制并且沒有進行有效過濾,則判定為漏洞喉誊。

①定義危險函數(shù)

首先考慮如何定義危險函數(shù)邀摆。在人工代碼審計的時候,會按照漏洞的類型著重關(guān)注某一批函數(shù)伍茄,比如mysql_query, file_get_contents, eval等等栋盹。然后我們會找到這些函數(shù)的某些參數(shù),然后判斷這些參數(shù)是否經(jīng)過程序處理后還是會存在漏洞敷矫。因此例获,污點分析時,只需要關(guān)注危險函數(shù)的名稱和危險參數(shù)的位置即可曹仗,配置示例如下:

print ?=> ?array(array(1),$F_SECURING_XSS)

該配置的含義是:print函數(shù)是一個可能引發(fā)XSS漏洞的危險函數(shù)榨汤,并且其參數(shù)1是一個危險參數(shù)。

②定義凈化操作

定義一個參數(shù)是否受到了有效凈化是污點分析中比較重要的環(huán)節(jié)怎茫,這關(guān)系到后續(xù)漏洞判定的準確性收壕。根據(jù)人工代碼審計的經(jīng)驗,可以抽象總結(jié)出一個PHP實現(xiàn)的凈化操作可以有以下方式:

(1)使用PHP內(nèi)置的或者用戶自定義的凈化函數(shù)執(zhí)行凈化,比如調(diào)用addslashes等函數(shù)

(2)使用PHP內(nèi)置的一些校驗類型的函數(shù)蜜宪,比如類型判斷虫埂、正則表達式校驗、字符串切割圃验、回調(diào)函數(shù)以及編碼解碼等操作掉伏。這些操作都會進行一定程度的凈化,如果在實踐中损谦,期望有較高的精確度岖免,則可以認為凡是調(diào)用這些函數(shù),就認為是有效的凈化照捡;如果我們期望降低漏報率颅湘,則可以忽視這些內(nèi)置函數(shù)影響或者執(zhí)行更加細致的分析。

(3)使用邏輯判斷進行校驗栗精,如使用了==或者===與某些靜態(tài)常量進行了比較操作闯参,則認定為該變量接受了凈化。

③執(zhí)行污點分析

有了上述基礎(chǔ)悲立,可以很清晰地執(zhí)行污點分析判斷漏洞了鹿寨,大致的過程如下:

(1)在執(zhí)行數(shù)據(jù)流分析過程中,如果發(fā)現(xiàn)了敏感函數(shù)的調(diào)用薪夕,則啟動污點分析脚草。

(2)查詢危險函數(shù)配置列表,獲取到需要判斷的危險參數(shù)列表原献。

(3)向上找到連接的基本塊信息馏慨,關(guān)注一個基本塊內(nèi)所有的數(shù)據(jù)流記錄,找到數(shù)據(jù)流記錄右邊的值姑隅,提取出該變量写隶。

(4)如果該變量進入到了內(nèi)置函數(shù),則按照之前章節(jié)中整理的內(nèi)置函數(shù)的作用判斷是否受到了有效的凈化讲仰。

(5)當(dāng)遍歷時找不到基本塊中相關(guān)的賦值語句慕趴,或者賦值的值為字符串、數(shù)字或者布爾值鄙陡,則停止污點分析冕房。

此外,需要格外注意編碼和解碼的影響趁矾,:

(1)一個回溯變量被進行解碼操作后(base64/hex/zlib…)毒费,該變量向上的所有凈化操作都可以認為是無效的。

(2)如果一個變量被編碼和解碼多次愈魏,則進行抵消分析操作,并由抵消之后的結(jié)果進行判斷。

1.1.3 其他分析層

在整個語法樹遍歷培漏、控制流圖生成的過程中溪厘,可能還會伴隨著以下幾種情況的細致分析:

(1)過程內(nèi)、過程間分析

當(dāng)分析代碼時牌柄,會遇到方法內(nèi)部的變量傳遞與程序信息搜集畸悬;或者會遇到一個變量在多個方法之間通過參數(shù)進行傳遞。支持過程內(nèi)珊佣、過程間分析的重點是作用域之間的對應(yīng)和轉(zhuǎn)換蹋宦。此外,當(dāng)我們遇到某個函數(shù)中執(zhí)行了對某個參數(shù)的過濾咒锻,可以將其加入到凈化函數(shù)列表冷冗。

(2)多文件分析

執(zhí)行多文件分析時,很多系統(tǒng)僅僅只是依賴use惑艇、include蒿辙、require等關(guān)鍵詞來尋找當(dāng)前文件所包含的其他文件,但是很多程序?qū)崿F(xiàn)中滨巴,往往會用到autoload技術(shù)思灌,或者在某個統(tǒng)一入口執(zhí)行文件包含的操作。所以我們有很大的幾率會遇到某個文件中調(diào)用了一個其他文件的方法恭取,但是在該文件中卻找不到該方法的定義語法結(jié)構(gòu)的情景泰偿。

因此多文件分析時,我們最好在分析初始化階段中獲取到所有類定義蜈垮、方法定義耗跛、通用函數(shù)定義以及其所在的路徑位置,將這些信息保存在內(nèi)存中窃款。當(dāng)我們后續(xù)分析時课兄,可以直接操作該內(nèi)存結(jié)構(gòu),動態(tài)提取需要的方法定義晨继。

2 功能概述

①非本地工具烟阐,而是一個平臺

在大型公司,可能有成千上萬的產(chǎn)品線紊扬,涉及到的代碼庫數(shù)量龐大并且編程語言繁雜蜒茄,面對這種狀況,本地化工具過于松散餐屎,不好管理檀葛,接入效率低的缺點,而統(tǒng)一的掃描平臺可以提供一整套的自動化接入方案腹缩。統(tǒng)一的源碼安全掃描平臺可以區(qū)分多場景的任務(wù)類型屿聋,提供多種接入方式空扎,可以更高效、自動化地提供安全掃描能力润讥。

②軟件開發(fā)關(guān)鍵環(huán)節(jié)转锈,中流砥柱

SDL(security development lifecycle) 是微軟提出的從安全角度指導(dǎo)軟件開發(fā)過程的管理模式,源代碼安全掃描是SDL方法中的重要環(huán)節(jié)楚殿。從軟件的開發(fā)流程上看撮慨,源代碼安全掃描處于軟件開發(fā)流程上下游,在軟件上線之前需要通過安全掃描脆粥。在實踐中砌溺,源代碼安全掃描是以插件的形式锡搜,嵌入到軟件研發(fā)的流程中奴饮,為業(yè)務(wù)線代碼保駕護航工猜。這將要求平臺必須具有高可用性玫芦,高響應(yīng)及時度和完善的用戶反饋機制槽华。?

③戰(zhàn)略地位沛励,支撐安全紅線

企業(yè)有一條安全紅線言蛇,業(yè)務(wù)必須遵守的最基本安全要求锌奴。源代碼安全掃描也可以用于在系統(tǒng)上線前發(fā)現(xiàn)漏洞與違規(guī)的內(nèi)容孵户,禁止漏洞帶到線上萧朝,一定程度保護企業(yè)業(yè)務(wù)安全。

2.1?整體架構(gòu)

從分層的角度夏哭,源碼安全掃描平臺大致分為五層检柬,每一層都有明確的職責(zé)劃分。

2.1.1 接口層

接口層是平臺對外輸出能力的入口竖配,主要對接口請求進行合理性校驗何址,權(quán)限校驗,參數(shù)校驗进胯,以確保請求是合法的用爪,非惡意的。功能上主要分掃描接口和查詢接口胁镐,掃描接口用來接收發(fā)起掃描任務(wù)偎血,查詢接口用來查詢掃描任務(wù)的結(jié)果數(shù)據(jù)。

2.1.2 任務(wù)管理層

每一次掃描就是一個任務(wù)盯漂,任務(wù)管理層是整個平臺的中心部分颇玷,管理所有任務(wù)的掃描狀態(tài)。主要包括三個職責(zé):

跟蹤就缆。任務(wù)管理層跟蹤和記錄所有任務(wù)的掃描狀態(tài)帖渠。

策略下發(fā)。源碼掃描平臺根據(jù)業(yè)務(wù)的實際場景竭宰,針對不同任務(wù)實施不同的掃描策略空郊,比如根據(jù)代碼的變更情況使用緩存策略份招,根據(jù)代碼庫的特性調(diào)整超時時間等。

超時監(jiān)控渣淳。每個任務(wù)都有一個超時時間脾还,當(dāng)任務(wù)掃描時間超過期望值,任務(wù)會結(jié)束并返回超時異常入愧。

2.1.3 引擎管理層

引擎管理層是對引擎調(diào)用的一層封裝,在企業(yè)里面涉及到多種計算機語言嗤谚,不同語言可能使用不同的源碼分析引擎棺蛛。引擎管理層向上抽象出掃描接口和報告接口,掃描接口接收掃描數(shù)據(jù)巩步,下層實現(xiàn)具體的引擎調(diào)用策略旁赊,報告接口獲取不同引擎的掃描結(jié)果,統(tǒng)一生成掃描分析報告數(shù)據(jù)椅野。

2.1.4 源代碼管理層

源代碼管理層主要關(guān)注目標源碼獲取终畅、源碼存儲和源碼安全。

?源碼獲取竟闪。源碼獲取主要支持兩種方式离福,第一是用戶上傳源碼的方式,這種方式需要用戶自己把源碼打包炼蛤,上傳到web服務(wù)器妖爷。第二種是和企業(yè)級代碼托管平臺打通,源碼管理層根據(jù)托管平臺提供的安全協(xié)議拉取源碼理朋。

?源碼存儲絮识。源碼存儲主要包括兩個方面,其一是需要掃描的源碼嗽上,這部分源碼存儲時間不長次舌,在掃描結(jié)束后的一段時間內(nèi)會被清除;其二是有漏洞的源碼兽愤,這部分源碼會被永久存儲彼念,用來后續(xù)分析漏洞報告使用。

?源碼安全烹看。源碼安全掃描涉及到業(yè)務(wù)線的源碼下載與分析国拇,對于企業(yè)來說源碼具有最高保密性,需要防止源碼泄露的問題發(fā)生惯殊。這里我們有兩個層面措施:第一是服務(wù)器隔離酱吝,所有對源碼操作和源碼存儲都放在指定的服務(wù)器上,并且由源碼托管平臺負責(zé)土思,這種物理隔離大大減少平臺自身的管理成本务热。第二是所有源碼存儲傳輸都采用了加密忆嗜,這里采用常用的方式,使用AES加密源碼崎岂,RSA加密AES的key捆毫。

2.1.5 掃描引擎

引擎主要利用靜態(tài)代碼分析技術(shù)分析源碼中可能存在的漏洞。

2.2?SDL中的實戰(zhàn)

研發(fā)工程師(RD)提交代碼冲甘,進行源碼安全掃描绩卤,編譯,持續(xù)集成到部署上線江醇,這一系列步驟是全自動化的過程濒憋,而源碼安全掃描嵌入到整個流程中,必定牽扯到各個平臺陶夜。

2.2.1 接口可用性

一般平臺的接口可用性要求是四個9凛驮,即SLA為99.99%,即使企業(yè)內(nèi)部使用条辟,也要達到99.9%黔夭。SLA指標很重要,因為一旦某段時間內(nèi)接口不可用導(dǎo)致軟件持續(xù)集成阻塞羽嫡,會影響到正常的產(chǎn)品發(fā)布的流程本姥,導(dǎo)致產(chǎn)品上線出問題。比如企業(yè)內(nèi)某個產(chǎn)品緊急修復(fù)了bug需要上線厂僧,但是卻在安全掃描這一步卡住扣草,產(chǎn)品線的同學(xué)可能會抓狂了。

為了保障接口的可用性颜屠,以及及時發(fā)現(xiàn)故障辰妙,可做以下策略:

①慢啟動。接口的服務(wù)邏輯應(yīng)該盡可能少的計算和IO訪問甫窟,這里將請求的原始數(shù)據(jù)做一次redis寫入密浑,然后就返回,其他的任務(wù)掃描邏輯之后才被后續(xù)的邏輯“慢”啟動起來粗井。

②接口監(jiān)控尔破。監(jiān)控每個接口每次接收請求到做出響應(yīng)的時間,在響應(yīng)時間超出一定范圍(一般與調(diào)用平臺約定)浇衬,則進行郵件告警懒构。

③降級策略。在遇到故障無法在短時間內(nèi)恢復(fù)的情況耘擂,啟動降級策略胆剧,舍棄一定功能的情況下,保障接口能夠及時返回,防止流程卡住秩霍。

2.2.2 “慢”是永恒話題

源碼安全掃描作為軟件集成發(fā)布的一個步驟篙悯,一定程度上影響軟件發(fā)布的時間。如果安全掃描耗時過長铃绒,將會大大拖累的整個上線流程鸽照,安全部本身也會承受著很大的壓力。

2.2.2.1 此增量非彼增量

或許有人會講颠悬,RD大多數(shù)時候可能只會修改幾個代碼庫的文件矮燎,這樣怎么會有掃描速度慢的問題呢?這樣的想法是基于兩個前提:第一赔癌,掃描是單文件漏峰;第二,文件與文件之間是沒有關(guān)聯(lián)的届榄。但事實上,前面漏洞分析技術(shù)也有提及倔喂,白盒代碼掃描過程其實會對相關(guān)聯(lián)的多個文件進行掃描铝条,可能修改了一個文件,但是有很多其他的文件引用了這個文件席噩,為了保險起見班缰,所以會把相關(guān)聯(lián)的文件一并執(zhí)行掃描。

所以一開始的做法是:不管代碼庫如何變化悼枢,都使用全量掃描埠忘,而這將導(dǎo)致掃描速度特別“慢”,經(jīng)常會收到業(yè)務(wù)線同學(xué)的反饋馒索,對運營造成很大的壓力莹妒。

2.2.2.2 增量掃描的實踐方法

為了提高掃描的性能,嘗試做了增量掃描策略绰上。

大致思路是旨怠,如果我們能夠?qū)Ρ敬巫兏拇a進行分析,找出當(dāng)前代碼庫中變更文件引用的文件和被引用的文件蜈块,將這些文件進行掃描鉴腻,最后跟全量合并結(jié)果。這樣可以大大減少掃描的文件數(shù)百揭,提高掃描速度爽哎。

具體做法是,在源碼管理層嵌入增量策略層器一,利用簡單的源碼分析技術(shù)课锌,得出文件的引用流向圖。通過對圖的遍歷獲取到增量涉及到的文件盹舞。

2.2.2.3?其他優(yōu)化策略

除了增量掃描产镐,我們還有如下優(yōu)化策略:

①無變更文件使用歷史結(jié)果隘庄。相同代碼庫前后兩次掃描,如果文件沒有任何修改癣亚,則認為兩次掃描結(jié)果一致丑掺。

②基于無關(guān)文件變更的緩存策略。一個代碼庫述雾,前后兩次掃描街州,如果前后兩次變更的文件與安全掃描無關(guān),則復(fù)用第一次掃描結(jié)果玻孟。

③閑時掃描唆缴。很多時候掃描慢也可能是資源緊缺有關(guān),一個平臺的訪問量也可能集中在某個時間段黍翎,因此面徽,閑時掃描作為一種緩存策略,可以大大提高掃描的速度匣掸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟紊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碰酝,更是在濱河造成了極大的恐慌霎匈,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送爸,死亡現(xiàn)場離奇詭異铛嘱,居然都是意外死亡,警方通過查閱死者的電腦和手機袭厂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門墨吓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌器,你說我怎么就攤上這事肛真。” “怎么了爽航?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵蚓让,是天一觀的道長。 經(jīng)常有香客問我讥珍,道長历极,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任衷佃,我火速辦了婚禮趟卸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己锄列,他們只是感情好图云,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邻邮,像睡著了一般竣况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筒严,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天丹泉,我揣著相機與錄音,去河邊找鬼鸭蛙。 笑死摹恨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娶视。 我是一名探鬼主播晒哄,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肪获!你這毒婦竟也來了揩晴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贪磺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诅愚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寒锚,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年违孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了刹前。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡雌桑,死狀恐怖喇喉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情校坑,我是刑警寧澤拣技,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站耍目,受9級特大地震影響膏斤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邪驮,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一莫辨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦沮榜、人聲如沸盘榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽草巡。三九已至,卻和暖如春振愿,著一層夾襖步出監(jiān)牢的瞬間捷犹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工冕末, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萍歉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓档桃,卻偏偏與公主長得像枪孩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藻肄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 一蔑舞、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,818評論 0 27
  • Getting Started Burp Suite 是用于攻擊web 應(yīng)用程序的集成平臺。它包含了許多工具嘹屯,并為...
    Eva_chenx閱讀 28,713評論 0 14
  • 上周五參加了brandpeng學(xué)校的家長開放日活動攻询,學(xué)校請到了省教研室評價部主任方張松做《創(chuàng)造適合孩子發(fā)展的家庭教...
    小雨0921閱讀 1,112評論 0 1
  • 發(fā)生了什么---- 上周末就想吃芋艿熬魚頭湯,到了市場發(fā)現(xiàn)到賣完了州弟,今天傍晚提早過去買了回來钧栖,芋艿有點小,眼又多婆翔,...
    李曉玲_中閱讀 164評論 0 0