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