何斌穎,楊林海
(云南工商學(xué)院,651700,昆明)
Web代碼安全人工審計(jì)內(nèi)容的研究
何斌穎,楊林海
(云南工商學(xué)院,651700,昆明)
Web系統(tǒng)的大量應(yīng)用,各種安全事故頻發(fā),除了操作系統(tǒng)的安全漏洞以外,web系統(tǒng)的代碼在編制的時(shí)候,不良的編碼習(xí)慣、對操作過程中在代碼中顯露出安全重視不夠等因素,導(dǎo)致系統(tǒng)在生產(chǎn)線中存在或大或小的隱患。web系統(tǒng)上線之前,系統(tǒng)一般會進(jìn)行白盒、黑盒測試,但是并不能保障足夠的安全,還應(yīng)對代碼和運(yùn)行環(huán)境等進(jìn)行詳細(xì)的人工審計(jì),可以大大減少安全事故。
代碼審計(jì);白盒;黑盒;安全漏洞;安全滲透
LxLabs公司開發(fā)的HyperVM在2009年被黑客發(fā)現(xiàn)有嚴(yán)重的漏洞,造成10余萬站點(diǎn)的數(shù)據(jù)被黑客刪除,造成了用戶巨大的損失,諸如此類安全事故頻見于各大新聞媒體或行業(yè)通告。從技術(shù)角度來說對軟件造成威脅的本質(zhì)其實(shí)就是軟件在設(shè)計(jì)和編碼時(shí)存在安全漏洞,一旦漏洞被懷有惡意的黑客發(fā)現(xiàn)并利用即可對系統(tǒng)造成嚴(yán)重的威脅,給服務(wù)提供商和用戶造成巨大的經(jīng)濟(jì)損失。因此從軟件需求分析、設(shè)計(jì)、編碼一直到運(yùn)行維護(hù)的幾個(gè)階段,完全有必要對軟件代碼進(jìn)行安全審計(jì),以降低軟件的脆弱性。代碼審計(jì)主要有2種方法:借助一些工具軟件來查找問題,另外一種方法是利用人工審核主要是彌補(bǔ)工具軟件的不足之處。
Web網(wǎng)站在投入使用后,可能會出現(xiàn)操作系統(tǒng)漏洞、SQL注入、跨站腳本、未驗(yàn)證的重定向和數(shù)據(jù)傳遞等安全問題,安全問題一旦出現(xiàn),輕者系統(tǒng)需要重新安裝,重者數(shù)據(jù)沒有備份時(shí)會造成很嚴(yán)重的損失。通常做的首先是對操作系統(tǒng)和web系統(tǒng)進(jìn)行常規(guī)的更新,修改web系統(tǒng)的明顯bug,在操作系統(tǒng)中安裝軟件防火墻,在網(wǎng)絡(luò)中部署硬件防火墻或者其他類型的安全設(shè)備等,但是這些行為都屬于事后彌補(bǔ)。而作為一個(gè)安全性足夠高的web應(yīng)用系統(tǒng),應(yīng)該將安全漏洞隱患扼殺在萌芽中,在投入使用前應(yīng)該對web軟件進(jìn)行白盒源代碼脆弱性和缺陷檢查,或黑盒滲透測試,或者兩者同時(shí)都進(jìn)行,但這2種測試并不能完全保證軟件的安全性。
本文提出對web軟件代碼應(yīng)進(jìn)行上線前安全審計(jì),這種代碼審計(jì)是從業(yè)務(wù)的角度對威脅進(jìn)行分析,檢查關(guān)鍵環(huán)節(jié)是否對業(yè)務(wù)進(jìn)行了安全控制,當(dāng)然此階段需要根據(jù)企業(yè)提供的測試環(huán)境以及前期的設(shè)計(jì)文檔,再結(jié)合業(yè)務(wù)數(shù)據(jù)流進(jìn)行完整性研究、整理和分析。
代碼審計(jì)是一種高效的檢測安全漏洞的技術(shù),分為人工和軟件工具自動(dòng)審計(jì),能夠?qū)Πl(fā)現(xiàn)的安全漏洞進(jìn)行驗(yàn)證,常見的審計(jì)工具軟件有Fortify SCA、OWASP、FindBugs、PREFast、FxCop、PHPSAT等。本文主要探討人工審計(jì)的內(nèi)容和方法。
有經(jīng)驗(yàn)的開發(fā)人員詳細(xì)分析并閱讀應(yīng)用系統(tǒng)的相關(guān)文檔和源程序,對程序中存在的不良編碼習(xí)慣、不合理邏輯關(guān)系和安全漏洞進(jìn)行審閱,找出應(yīng)用系統(tǒng)可能存在的安全隱患,綜合給出代碼修改意見和評估報(bào)告,達(dá)到提高應(yīng)用系統(tǒng)的安全性的作用。代碼審計(jì)是軟件安全生命開發(fā)周期(SDL)中組成安全應(yīng)用非常重要的一環(huán),在代碼開發(fā)過程中即進(jìn)行代碼審計(jì),能夠幫助開發(fā)人員養(yǎng)成良好的開發(fā)習(xí)慣,減少因開發(fā)人員不良習(xí)慣導(dǎo)致的安全問題,有效的提高軟件的安全性[1]。涉及到以下威脅分類:業(yè)務(wù)連續(xù)安全(圖形驗(yàn)證碼等),業(yè)務(wù)邏輯安全(認(rèn)證和授權(quán)等),業(yè)務(wù)數(shù)據(jù)安全(文件上傳和下載防護(hù))和業(yè)務(wù)安全管理(日志記錄等)。以下對威脅分類分別講述人工審計(jì)代碼的內(nèi)容。
2.1認(rèn)證管理
在web代碼中應(yīng)檢測是否包含有用戶登錄過程應(yīng)該有圖形類型的驗(yàn)證碼,預(yù)防黑客編寫程序暴力破解密碼。驗(yàn)證碼在編寫上應(yīng)將復(fù)雜度考慮進(jìn)去,在頁面顯示時(shí)應(yīng)加入干擾因素:如驗(yàn)證碼有變形和底版等。驗(yàn)證碼在用戶使用過一次后應(yīng)自動(dòng)刷新,不能以明文方式傳送給客戶端,以防有cookie等進(jìn)行記錄。在用戶對重要的操作,如修改密碼等行為時(shí),也應(yīng)有驗(yàn)證碼的有效驗(yàn)證。
Web頁面的用戶登錄認(rèn)證過程中,在審計(jì)代碼時(shí),較安全的編寫順序應(yīng)是先校驗(yàn)驗(yàn)證碼,然后檢查用戶名,最后比對密碼的密文。用戶登錄提交應(yīng)只有一次,在重定向時(shí)不可以將密碼再次傳送,以防會出現(xiàn)明文密碼的情況。對用戶名和密碼進(jìn)行驗(yàn)證時(shí),如果出現(xiàn)錯(cuò)誤的用戶名或者密碼,登錄提示時(shí)代碼應(yīng)顯示出相同的錯(cuò)誤信息,如“用戶名或密碼錯(cuò)!”,代碼不應(yīng)單獨(dú)對錯(cuò)誤的密碼或用戶提示“用戶名錯(cuò)!”或者“密碼錯(cuò)!”,以增加用戶名和密碼被破解的難度,降低風(fēng)險(xiǎn)。用戶登錄如出現(xiàn)幾次認(rèn)證失敗,在代碼中應(yīng)設(shè)置時(shí)間限制,如認(rèn)證失敗超過3次,鎖定幾分鐘甚至一天以后才能再次進(jìn)行認(rèn)證登錄,增加猜測密碼和用戶名的時(shí)間成本。用戶登錄后如果要退出應(yīng)有注銷功能的代碼,清理當(dāng)前用戶的會話記錄。
2.2授權(quán)管理
對于web系統(tǒng)操作和使用的用戶,在代碼中應(yīng)明確角色的權(quán)限,授權(quán)訪問的范圍,盡可能詳盡地分析有可能導(dǎo)致越權(quán)的情況。角色一般有系統(tǒng)管理員、管理員、普通用戶和審計(jì)員(也可細(xì)分成系統(tǒng)審計(jì)和業(yè)務(wù)審計(jì)員)等,系統(tǒng)管理員應(yīng)只負(fù)責(zé)對系統(tǒng)的維護(hù),不能對業(yè)務(wù)數(shù)據(jù)進(jìn)行操作,管理員則在系統(tǒng)管理員定制的權(quán)限范圍內(nèi)對系統(tǒng)數(shù)據(jù)進(jìn)行操作,普通用戶則只能進(jìn)行有限的界面訪問,以及自己權(quán)限范圍內(nèi)的數(shù)據(jù)修改,審計(jì)員則應(yīng)定期審計(jì)各級別用戶的權(quán)限和操作過的記錄等。
如果是大型應(yīng)用軟件,應(yīng)設(shè)計(jì)有統(tǒng)一的最好是獨(dú)立的權(quán)限控制模塊,并審核權(quán)限控制模塊是否存在漏洞,在頁面及功能設(shè)置上應(yīng)體現(xiàn)出權(quán)限控制模塊的作用。對頁面權(quán)限的控制應(yīng)精準(zhǔn),對需要和不需要控制的頁面及功能進(jìn)行驗(yàn)證,驗(yàn)證過程中應(yīng)區(qū)別出用戶的角色。
2.3輸入和輸出驗(yàn)證
對數(shù)據(jù)庫的操作應(yīng)設(shè)計(jì)有全局過濾器,有相應(yīng)的過濾函數(shù),過濾器應(yīng)過濾所有的查詢請求,對數(shù)據(jù)依據(jù)PHPIDS的規(guī)則庫進(jìn)行初期檢查。對數(shù)據(jù)應(yīng)使用預(yù)查詢機(jī)制,在傳入SQL語句前應(yīng)明確指定傳輸數(shù)據(jù)的類型以執(zhí)行必要的轉(zhuǎn)換。對于一些復(fù)雜的組合查詢,未預(yù)防可能導(dǎo)致的注入,應(yīng)檢查拼接是否存在缺陷。
預(yù)防跨站攻擊,web網(wǎng)站的代碼應(yīng)有全局跨站腳本(XSS)過濾器,過濾器應(yīng)符合要求,需考慮需要過濾和不需要過濾的2種輸出。預(yù)防跨站請求偽造(CSRF)攻擊,應(yīng)使用Token或驗(yàn)證碼加強(qiáng)安全性,在web表單提交成功或者是被以后token或驗(yàn)證碼應(yīng)該重置[2]。使用Token應(yīng)驗(yàn)證其生成算法的安全性,如果是驗(yàn)證碼則檢查生成的驗(yàn)證碼是否符合復(fù)雜性要求,如是否有干擾線或干擾點(diǎn),有字符變形等。
對于服務(wù)器獲取web表單數(shù)值時(shí),如果操作代碼不嚴(yán)格區(qū)分GET和POST的功能區(qū)別,在沒有Token或驗(yàn)證碼的輔助功能下很容易導(dǎo)致跨站請求偽造攻擊。
Web網(wǎng)站一般提供文件的上傳和下載,包括管理員對網(wǎng)站的維護(hù)也需要上傳或者下載文件,在文件上傳操作代碼中應(yīng)限制用戶所傳文件的擴(kuò)展名,某些擴(kuò)展名的文件名應(yīng)禁止上傳,如“.exe”文件。審計(jì)代碼時(shí)查看擴(kuò)展名是否是以黑白名單的方式列出,列在黑名單的擴(kuò)展名是禁止上傳的,白名單中的擴(kuò)展名則可以上傳,這樣編制代碼的另外一個(gè)好處是管理員可以及時(shí)調(diào)整黑白名單中的擴(kuò)展名。對于上傳的文件最后限制重命名的操作,防范重命名過程中會產(chǎn)生不可預(yù)知的風(fēng)險(xiǎn)。另外在代碼中應(yīng)禁止對上傳文件的存放位置實(shí)現(xiàn)腳本執(zhí)行功能。
對于web提供的文件下載中,應(yīng)審計(jì)客戶端是否可以指定文件名進(jìn)行下載,如果存在安全隱患則應(yīng)關(guān)閉此功能,如果客戶端可以指定文件名進(jìn)行下載,則不允許客戶端指定路徑。用戶下載時(shí)應(yīng)對不同級別的用戶設(shè)置不同的權(quán)限控制,并在下載功能中對權(quán)限進(jìn)行檢查。對于客戶端訪問鏈接時(shí)應(yīng)對客戶端的重定向或轉(zhuǎn)發(fā)請求進(jìn)行檢查,定義重定向的信任域名或主機(jī)列表。
2.4會話管理
當(dāng)用戶訪問web頁面時(shí),應(yīng)禁止session信息顯示在URL里。在執(zhí)行業(yè)務(wù)時(shí),應(yīng)對當(dāng)前操作的用戶檢查session身份。成功登陸之后應(yīng)強(qiáng)制更新SessionID,并對Session的時(shí)效性進(jìn)行約定,如約定15 min或者0.5 h等。
應(yīng)加強(qiáng)對cookie的管理,不能在cookie中存儲明文或簡單加密過的密碼,消除存儲的應(yīng)用特權(quán)標(biāo)識,設(shè)置cookie的有效域和有效路徑,設(shè)置合適的cookie有效時(shí)間,如果生存時(shí)間為20-30 min,則建議使用session方式。
2.5密碼管理
對于用戶、管理員等的密碼應(yīng)使用哈希算法進(jìn)行存儲,為防止暴力破解密碼,對密碼進(jìn)行哈希算法后還可以使用加鹽(Salt)的方式來增強(qiáng)安全性。可以采用哈希算法或者RSA等加密算法將密碼加密后傳遞,或者是使用SSL來做傳輸層加密。
用戶或管理員等對密碼進(jìn)行修改時(shí)應(yīng)進(jìn)行舊密碼驗(yàn)證或者有安全問題確認(rèn)過程,如果在設(shè)置密碼時(shí)保留有電子郵件、手機(jī)號碼等信息時(shí),應(yīng)具備找回密碼的功能。檢查密碼設(shè)置頁面應(yīng)該對密碼復(fù)雜度進(jìn)行檢查,至少包含大、小寫字母、數(shù)字中的2種,長度最少6位,避免用戶輸入弱口令。
2.6調(diào)試和接口
在web代碼中,當(dāng)應(yīng)用出現(xiàn)錯(cuò)誤的時(shí)候,應(yīng)阻止輸出給客戶端,否則詳細(xì)的錯(cuò)誤輸出可能會導(dǎo)致SQL查詢泄露、程序源代碼泄露、物理路徑泄露等。對代碼中的異常處理應(yīng)能夠全面覆蓋所有異常行為,檢查異常處理是否會導(dǎo)致程序流程異常,引發(fā)安全問題,如果異常情況處理不好,特定程序捕獲了異常,可能會導(dǎo)致程序繞過一些重要的步驟而直接執(zhí)行后續(xù)的操作。
在審計(jì)數(shù)據(jù)接口時(shí),檢查是否存在安全漏洞。接口服務(wù)后臺登錄是否存在弱密碼,接口服務(wù)最好沒有默認(rèn)的測試頁面,否則會暴露物理路徑。接口服務(wù)應(yīng)用是否包含身份認(rèn)證,認(rèn)證的帳號、密碼(或密鑰)的存儲是否足夠安全。接口服務(wù)應(yīng)用傳輸應(yīng)加密。
接口服務(wù)應(yīng)用異常處理,如對特殊字符的處理,是否會在報(bào)錯(cuò)信息中泄露數(shù)據(jù)。代碼中是否存在內(nèi)置的敏感信息,如:調(diào)試帳號、外部接口帳號/密碼、數(shù)據(jù)加/解密密鑰等。
2.6.1 日志審計(jì) 審計(jì)對應(yīng)用操作的代碼時(shí)是否會將用戶密碼記入日志,以防密碼泄露。日志記錄的內(nèi)容是否合理,避免日志文件增長過快,造成磁盤空間不足。
2.6.2 運(yùn)行環(huán)境 對系統(tǒng)運(yùn)行的環(huán)境進(jìn)行審計(jì)時(shí),刪除不必要的網(wǎng)頁、帳號及權(quán)限。頁面包括應(yīng)用服務(wù)器的默認(rèn)頁面、管理后臺、測試頁面、備份文件等;帳號指Web應(yīng)用服務(wù)器的運(yùn)行帳戶。禁用目錄瀏覽功能,Web容器默認(rèn)帳戶的密碼是否更改或禁用,不能刪除的管理后臺是否啟用了密碼保護(hù),正式發(fā)布的應(yīng)用是否包含開發(fā)調(diào)試文件、代碼,重要的配置信息是否進(jìn)行了加密,如數(shù)據(jù)庫連接配置、其它接口連接配置等。
審計(jì)是否自定義了403、404、500錯(cuò)誤頁面,錯(cuò)誤頁面是否會輸出詳細(xì)錯(cuò)誤信息,服務(wù)器是否開啟了用戶訪問日志的記錄,記錄的日志是否滿足問題回溯的要求,是否記錄了客戶端地址、請求的方法、請求的URL、提交的參數(shù)(GET、POST、COOKIE參數(shù))、請求的狀態(tài)等。
2.6.3 第3方組件 分析應(yīng)用使用的框架及引用的第3方組件,分析其是否存在各種已知漏洞,且當(dāng)前環(huán)境漏洞是否可以重現(xiàn)。
2.6.4 安全功能 對于比較重要的業(yè)務(wù)系統(tǒng)如支付系統(tǒng)等,應(yīng)對登錄認(rèn)證及數(shù)據(jù)操作進(jìn)行審計(jì)。重要系統(tǒng)是否使用了雙因素登錄認(rèn)證,例如數(shù)字證書、支付盾、密保卡等,防止用戶密碼泄露導(dǎo)致系統(tǒng)被非法登錄,對用戶提交的關(guān)鍵數(shù)據(jù)進(jìn)行加密。
重要系統(tǒng)的后臺管理界面是否限制了訪問源地址,系統(tǒng)的密碼重置短信發(fā)送等功能的使用頻率是否進(jìn)行了限制,例如:一個(gè)手機(jī)號一分鐘只能發(fā)送一條短信,防止被惡意利用多次發(fā)送短信,用戶登錄時(shí)的用戶名、狀態(tài)、源地址等關(guān)鍵信息需要記錄到應(yīng)用日志中,管理員可以進(jìn)行查詢。如果用戶在不常用的地址登錄,系統(tǒng)會提示用戶,并顯示上一次登錄的源地址,對于多次密碼錯(cuò)誤的登錄嘗試,系統(tǒng)能否檢測,禁止源地址訪問30 min,管理員登錄后可以看到,也可以進(jìn)行查詢。
系統(tǒng)中大數(shù)據(jù)量查詢等影響系統(tǒng)負(fù)載的功能是否進(jìn)行了查詢范圍限制,例如:只能查詢最近3個(gè)月的數(shù)據(jù),系統(tǒng)中大數(shù)據(jù)量查詢等影響系統(tǒng)負(fù)載的功能是否進(jìn)行了查詢頻率限制,例如一分鐘內(nèi)只能查詢一次。高可用性要求的系統(tǒng)中是否有用戶請求頻率檢測,超過訪問閾值時(shí),需要用戶輸入頁面上的圖形驗(yàn)證碼,才能進(jìn)一步操作。
對報(bào)表查詢等涉及大量數(shù)據(jù)的讀取和導(dǎo)出操作,是否嚴(yán)格限制了查詢范圍,必要時(shí)可以使用雙用戶認(rèn)證,限制單個(gè)用戶大量讀取業(yè)務(wù)數(shù)據(jù)的能力。
業(yè)務(wù)關(guān)鍵數(shù)據(jù)的讀取頁面,是否使用靜態(tài)密碼、手機(jī)動(dòng)態(tài)密碼等二次驗(yàn)證,防止敏感數(shù)據(jù)泄露,例如:交易詳單的查詢。業(yè)務(wù)處理過程中用戶身份等關(guān)鍵識別信息,是否保存在服務(wù)端,禁止從客戶端提交。
業(yè)務(wù)處理過程中的關(guān)鍵操作需要用戶確認(rèn)和圖形驗(yàn)證碼,手機(jī)動(dòng)態(tài)驗(yàn)證碼等保護(hù),防止重復(fù)攻擊,例如:轉(zhuǎn)賬操作等。關(guān)鍵業(yè)務(wù)操作需要記錄到應(yīng)用日志中,可以設(shè)置閾值,超過一定數(shù)值系統(tǒng)會告警,管理員可以進(jìn)行查詢。例如:轉(zhuǎn)賬金額大于20萬的交易記錄。涉及資金的業(yè)務(wù)用戶可以設(shè)置上限,例如:用戶可以設(shè)置每日最高消費(fèi)限額,及轉(zhuǎn)賬限額。關(guān)鍵業(yè)務(wù)操作可以設(shè)置短信提醒,例如:用戶進(jìn)行資金轉(zhuǎn)賬,進(jìn)行詳單查詢等。
本文主要是針對web系統(tǒng)代碼的人工審計(jì)內(nèi)容,對審計(jì)員要求很強(qiáng)的綜合素質(zhì),能對代碼的良好風(fēng)格提出一定的建設(shè)性意見,也能對已存漏洞或可能導(dǎo)致安全事故的漏洞有解決的能力及預(yù)知性。代碼審計(jì)帶來的收益也是非常明顯的,通過審計(jì)能發(fā)現(xiàn)漏洞及時(shí)修復(fù),能提前預(yù)防。
[1]濟(jì)南時(shí)代確信信息安全測評.源代碼安全審計(jì)[EB/OL](2012-06-20)[2014-6-22].http://www.cstc.org.cn/templet/default/ show_zyfw.jspid=1294.
[2]yiyaoyuan.跨站請求偽造-CSRF防護(hù)方法[EB/OL](2013-01-24)[2014-6-22].http://www.docin.com/p-589312893.html.
AStudyofWebArtificialCodeSecurityAudit
HE Binying,YANG Linhai
(Yunnan Technology and Business University,651700,Kunming,PRC)
Web system are commonly applicated in many enterprises, frequent accidents of all kinds of security are occured,in addition to the security bugs of the operating system,during programming,poor coding practices,exhibited in the operation code factors such as insufficient attention to safety,causing the system to present on the production line or greater or lesser risk.Generally web system should make the white box and black box testing, but does not guarantee adequate security.This article before the detailed manual audit code and runtime environment,can significantly reduce safty problem.
code audit;white box;black box;bugs;security penetration
2014-06-22;
2014-07-16
何斌穎(1974-),女,湖南人,本科,主要從事計(jì)算機(jī)網(wǎng)絡(luò)及安全方面的研究。
10.13990/j.issn1001-3679.2014.04.027
TP393
A
1001-3679(2014)04-0536-04