软件安全策略-下
軟件安全策略
@author:alkaid
生命以負(fù)熵為食 —— 《生命是什么》薛定諤
前文
見(jiàn) 軟件安全策略-上
正文
對(duì)抗中間人
背景
在前文中提到的三大基石策略——身份認(rèn)證、訪問(wèn)控制和會(huì)話管理,在通信過(guò)程都涉及到與遠(yuǎn)程服務(wù)器交換秘密信息,同時(shí)在實(shí)際的業(yè)務(wù)過(guò)程中,也包含了大量的個(gè)人隱私信息。
如果這些信息被竊取,可能會(huì)對(duì)社會(huì)、個(gè)人造成巨大的影響。
概念
在具體討論怎么對(duì)抗中間人之前,我們首先來(lái)看看中間人到底是什么?
從名字來(lái)看,中間——那肯定是在什么之間。
信息系統(tǒng)常見(jiàn)幾個(gè)重要的主體,應(yīng)用、操作系統(tǒng)、網(wǎng)絡(luò)鏈路、客戶端、服務(wù)端,通信過(guò)程如下:
一般而言,我們所考慮的中間人攻擊的情況是圖中虛線的框框——網(wǎng)絡(luò)設(shè)備,攻擊者可能控制了相關(guān)的路由器或者交換機(jī),進(jìn)而對(duì)應(yīng)用的相關(guān)數(shù)據(jù)包進(jìn)行監(jiān)聽(tīng)、篡改。
一般不考慮應(yīng)用與操作系統(tǒng)、操作系統(tǒng)與網(wǎng)卡之間攔截,一方面由于這些操作都需要對(duì)客戶端/服務(wù)端的操作系統(tǒng)進(jìn)行控制,如果能進(jìn)行控制,那么有其他更加豐富的方式獲
取相關(guān)的數(shù)據(jù),包括但不僅限于hook相關(guān)的技術(shù)、屏幕錄像。 另一方面,由于需要獲取操作系統(tǒng)的控制權(quán),一般而言是個(gè)例,不具有普遍性,在資源有限的情況,不會(huì)進(jìn)行考慮。同時(shí)在這類(lèi)場(chǎng)景下,更關(guān)鍵是需要解決惡意攻擊者獲得操作系統(tǒng)控制權(quán)的問(wèn)題。
當(dāng)然,如果有特殊的要求確實(shí)需要納入到考慮范圍的情況,那肯定需要在應(yīng)用層面去完成,自然是最方便的途徑,從數(shù)據(jù)的源頭進(jìn)行防護(hù),設(shè)計(jì)的要求同針對(duì)網(wǎng)絡(luò)設(shè)備的中間人一致。
對(duì)抗中間人攻擊,不可能去解決掉中間人,而不可能去保證每個(gè)人一個(gè)人的鏈路的安全。
需要解決如何在不可性的鏈路上去構(gòu)建一個(gè)可信或者相對(duì)可信的鏈路。
風(fēng)險(xiǎn)與處理
風(fēng)險(xiǎn)其實(shí)在背景里已經(jīng)提到了就是信息被竊取、篡改,而處理的解決方式就是需要去構(gòu)建可信信道。
具體的風(fēng)險(xiǎn)可以細(xì)化成以下四種:
虛擬身份或者臨時(shí)身份被竊取
重放
監(jiān)聽(tīng)(隱私信息采集等)
業(yè)務(wù)數(shù)據(jù)包被篡改
從風(fēng)險(xiǎn)可知,構(gòu)建的可信信道需要滿足
數(shù)據(jù)被加密,防止被竊取身份,被采集信息
加密應(yīng)該保證每個(gè)對(duì)象與對(duì)象之間不同(如果是現(xiàn)代密碼學(xué)算法應(yīng)該保證每組通信采用不同的密鑰)。
需要支持完整性的校驗(yàn)
需要支持對(duì)抗重放數(shù)據(jù)——即每個(gè)數(shù)據(jù)包有自己的標(biāo)識(shí)
已有技術(shù)
提到中間人,不得不提到的一定是SSL、TLS,以及結(jié)合http協(xié)議形成的https,一般情況其代碼實(shí)現(xiàn)已經(jīng)集成在操作系統(tǒng)中。
理想情況下,TLS或者SSL協(xié)議能夠打成我們的目標(biāo),但是它們?cè)跇?gòu)建可信信道的過(guò)程中,依賴(lài)于數(shù)字證書(shū)技術(shù)。如果不當(dāng)使用數(shù)字證書(shū),例如自簽證書(shū)、不可信CA濫發(fā)證書(shū),那么可信信道就無(wú)法構(gòu)建。
無(wú)共享信息的可信信道,基本上無(wú)法建立,除了量子。
那么為了部分解決SSL/TLS的數(shù)字證書(shū)問(wèn)題,只能采取增加部分預(yù)置信息的方式,例如HSTS——瀏覽器緩存證書(shū),SSL Pinning——內(nèi)置證書(shū)進(jìn)行比較
注意事項(xiàng)
由于SSL/TLS是對(duì)抗中間人的完整性校驗(yàn)和對(duì)抗重放,重放的另一個(gè)威脅源來(lái)自客戶端自身在應(yīng)用層發(fā)起的請(qǐng)求,這類(lèi)情況無(wú)法適用SSL/TLS。
一般建議在應(yīng)用層面的核心業(yè)務(wù),再次實(shí)現(xiàn)完整性校驗(yàn)和對(duì)抗重放的技術(shù)。例如交易。
異常處理
滲透測(cè)試的小伙伴應(yīng)該會(huì)這樣的體會(huì)——只有當(dāng)輸入信息與我們預(yù)期的正常情況存在出入的時(shí)候,才會(huì)引起注意,例如頁(yè)面500報(bào)錯(cuò)、異常的業(yè)務(wù)流程、預(yù)計(jì)之外數(shù)據(jù)輸出。
所以異常可以算是一切攻擊的源頭,如果所有的情況都能符合預(yù)期,那么我想攻擊者的途徑應(yīng)該會(huì)少很多吧。
可惜的是人非圣賢,異常難以避免。
對(duì)研發(fā)而言,我們希望異常越清晰越好,查看異常越簡(jiǎn)單越好,能夠協(xié)助我們盡快的定位bug,分析業(yè)務(wù)。
在攻擊者在挖掘漏洞的過(guò)程,同樣希望異常越清晰越好,與開(kāi)發(fā)者們的預(yù)期一致,在頻繁的上線和更新代碼的過(guò)程中,經(jīng)常會(huì)遺忘掉這些暗門(mén),從而使攻擊者能夠從研發(fā)留下的痕跡中收獲不少敏感信息。
所幸的是目前部分框架已經(jīng)支持對(duì)全局異常的統(tǒng)一處理。
剩下的需要解決的是配置問(wèn)題,在下文中也會(huì)單獨(dú)的講這個(gè)問(wèn)題,不過(guò)在這個(gè)篇章里索性就先提一點(diǎn)。
研發(fā)人員和攻擊者都關(guān)注異常信息,自然不可能把異常信息全都屏蔽,那么對(duì)于研發(fā)人員可能是一場(chǎng)災(zāi)難。
那么如何把兩者劃開(kāi)來(lái)呢,測(cè)試環(huán)境自不必說(shuō),對(duì)于生產(chǎn)環(huán)境而言,攻擊者能接觸到的應(yīng)用頁(yè)面、通信的數(shù)據(jù)包,而研發(fā)人員在授權(quán)的情況下,理論上可以接觸到所有數(shù)據(jù)的,所以我們可控制異常信息的輸出,輸出到攻擊者無(wú)法接觸的地方,例如操作系統(tǒng)的某個(gè)固定目錄下、統(tǒng)一的日志收集平臺(tái)。
當(dāng)然有個(gè)后話,如何保證相關(guān)目錄的安全、日志平臺(tái)安全以及哪些數(shù)據(jù)需要隱藏又是我們需要繼續(xù)考慮的問(wèn)題。
注意事項(xiàng)
異常處理的手段其實(shí)在本質(zhì)上并不能解決信息泄露的問(wèn)題,只是通過(guò)對(duì)異常處理的控制,盡可能地降低從異常中獲取的信息量,提高攻擊者的攻擊成本和利用難度,從而降低風(fēng)險(xiǎn)。
(沒(méi)有任何回顯,本身就是一種異常。只是造成這類(lèi)異常的情況豐富且復(fù)雜,從而降低從異常中獲取得信息量)
PS:信息量/信息熵等概念,可自行搜索了解,本質(zhì)上是為了量化信息。
配置管理
對(duì)于應(yīng)用系統(tǒng)而言,經(jīng)常需要部署在不同的運(yùn)行環(huán)境,我們引入了配置從而避免了因?yàn)榄h(huán)境的變動(dòng)就需要對(duì)應(yīng)用進(jìn)行重新編碼,重新測(cè)試的情況,同時(shí)各種各樣的配置項(xiàng)可以支持各式各樣的組件和程序不同的運(yùn)行方式,極大的提高了效率。
場(chǎng)景一 不同的運(yùn)行環(huán)境
跨平臺(tái)的編程語(yǔ)言解決了應(yīng)用需要在不同操作系統(tǒng)部署的問(wèn)題,優(yōu)化了大量的時(shí)間投入。但是它們沒(méi)辦法解決不同抽象的運(yùn)行環(huán)境,例如開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、準(zhǔn)生產(chǎn)、生產(chǎn)環(huán)境,不同的抽象運(yùn)行環(huán)境對(duì)應(yīng)著不同的組件、網(wǎng)絡(luò)以及信息安全的要求。
開(kāi)發(fā)環(huán)境/測(cè)試環(huán)境:對(duì)于信息安全的要求應(yīng)該是最低,同時(shí)也是輸出信息最為豐富、系統(tǒng)最不穩(wěn)定的。
準(zhǔn)生產(chǎn)/生產(chǎn)環(huán)境:對(duì)于信息安全有明確的要求,僅保留必要的輸出,系統(tǒng)最為穩(wěn)定。
風(fēng)險(xiǎn)與處理
在從開(kāi)發(fā)環(huán)境切換到準(zhǔn)生產(chǎn)/生產(chǎn)環(huán)境,難免需要更新具體的配置,一般而言會(huì)考慮引入編譯的配置選項(xiàng)來(lái)解決,實(shí)現(xiàn)一鍵切換,例如maven的profile屬性,不同的屬性值對(duì)應(yīng)了不同的策略,包括不同的打包策略、不同的配置文件。
這類(lèi)方式是提高系統(tǒng)可靠性的重要方式,但是也存在一些副作用,需要使用者進(jìn)行控制。
如果管理不當(dāng),開(kāi)發(fā)者有可能接觸到生產(chǎn)環(huán)境的具體配置信息,對(duì)生產(chǎn)經(jīng)營(yíng)產(chǎn)生影響
如果打包策略/配置文件未進(jìn)行檢查和校驗(yàn),導(dǎo)致多個(gè)環(huán)境信息被一起打包。
如果缺少對(duì)具體配置項(xiàng)的檢查,導(dǎo)致生產(chǎn)環(huán)境采用了測(cè)試環(huán)境的配置,進(jìn)而可能產(chǎn)生信息泄露事件。
各個(gè)組件(中間件、容器等)的配置。雖然目前有docker一類(lèi)的容器技術(shù),用于實(shí)現(xiàn)運(yùn)行環(huán)境的標(biāo)準(zhǔn)化配置,但是標(biāo)準(zhǔn)化配置不是一個(gè)不再需要關(guān)注的點(diǎn)而是一個(gè)更加需要關(guān)注的點(diǎn),試想如果某個(gè)標(biāo)準(zhǔn)化上配置存在弱口令賬號(hào)或者所有的標(biāo)準(zhǔn)化環(huán)境共享一個(gè)賬號(hào),會(huì)帶來(lái)什么樣的風(fēng)險(xiǎn)。
場(chǎng)景二 日志管理
日志功能相關(guān)的組件越來(lái)越成熟,大多通過(guò)配置進(jìn)行實(shí)現(xiàn),索性就納入到了配置管理模塊。
日志是目前所有系統(tǒng)審計(jì)的重要依據(jù),同時(shí)也是發(fā)現(xiàn)攻擊者和內(nèi)鬼的重要手段,但是隨著SSL/TLS等相關(guān)加密方式普及,位于通信鏈路上的相關(guān)設(shè)備越來(lái)越難以捕獲到明文信息,應(yīng)用系統(tǒng)自身的日志顯得越來(lái)越重要。 我想隨著云相關(guān)技術(shù)的進(jìn)一步推廣,應(yīng)用系統(tǒng)的日志會(huì)更加重要。
如何管理這些日志,采集哪些日志就是需要進(jìn)行考慮的。
風(fēng)險(xiǎn)與處理
日志最好也能有全局的日志控制。
當(dāng)然,如果需要最大發(fā)揮日志的價(jià)值,一般是需要匯集到統(tǒng)一的日志平臺(tái),用于支持搜索。而日志往往包含了最詳盡的業(yè)務(wù)信息,從某種意義上而言,這些日志可能是在誘導(dǎo)犯罪。(不知道是不是對(duì)前文中關(guān)于臨時(shí)身份有印象,拿到這些臨時(shí)身份的令牌,就可以完成身份竊取)
一類(lèi)風(fēng)險(xiǎn)是正式這些日志信息造成,我們需要有明確的規(guī)定有指導(dǎo)數(shù)據(jù)記錄,例如敏感信息、個(gè)人隱私信息、令牌、身份等信息,不要存儲(chǔ)全文,需要進(jìn)行部分的模糊化。
另一類(lèi)風(fēng)險(xiǎn)正是引入日志平臺(tái)其本身帶入的風(fēng)險(xiǎn)。
日志的具體配置不當(dāng),例如本地的日志文件存放到了web的相關(guān)目錄,從而能直接訪問(wèn),造成大量信息泄露。(相關(guān)實(shí)例可自行搜索)
場(chǎng)景三 權(quán)限配置
目前越來(lái)越來(lái)多的應(yīng)用支持復(fù)雜的權(quán)限配置和資源配置,有效維護(hù)這類(lèi)信息,能夠大幅度降低安全風(fēng)險(xiǎn)。
具體涉及的權(quán)限內(nèi)容,可查看訪問(wèn)控制策略章節(jié)了解
軟件技術(shù)棧
概念
軟件技術(shù)棧——我姑且這么寫(xiě)如果有更好的名稱(chēng)可以私信我,這里主要想提一提應(yīng)用系統(tǒng)中那些無(wú)法進(jìn)行掌控的第三方組件,例如java的第三方j(luò)ar、框架、中間件。
對(duì)于現(xiàn)在的應(yīng)用程序而言,從零開(kāi)始的搭建已經(jīng)有點(diǎn)不可能了,不是技術(shù)不可能,而是業(yè)務(wù)上不可能,我們需要速度,在已有輪子的前提下,肯定不需要再造輪子,即使造輪子,你有能力保證造的輪子就比別人的好使嗎?
但是呢,這類(lèi)第三方的代碼與我們編寫(xiě)的代碼在運(yùn)行時(shí)共享的是同樣的權(quán)限、系統(tǒng)資源,如果這些代碼出現(xiàn)了問(wèn)題,又當(dāng)如何?
風(fēng)險(xiǎn)與處理
至少需要能管理、了解到底用了哪些第三方的代碼。唯有這樣,在相關(guān)的第三方出現(xiàn)安全問(wèn)題時(shí),能夠快速響應(yīng),做到止損。(相關(guān)工具:SCA——軟件成分分析軟件)
盡可能不使用存在已知問(wèn)題的組件,不使用停止維護(hù)/維護(hù)不當(dāng)?shù)牡谌絻?nèi)容(如果是開(kāi)源的,己方有能力維護(hù)可以不納入考慮)。
敏感數(shù)據(jù)
敏感數(shù)據(jù)現(xiàn)在是屬于法律法規(guī)領(lǐng)域最關(guān)注的一個(gè)點(diǎn)了,雖然互聯(lián)網(wǎng)上的應(yīng)用五花八門(mén),但是所有這些虛擬身份的背后都是一個(gè)唯一的實(shí)體人。生命以負(fù)熵為食,人天生喜歡規(guī)律也是有規(guī)律的,大量數(shù)據(jù)可能能夠重新去定義一個(gè)實(shí)體人,通過(guò)定向的投放去影響和控制人,甚至盜取這個(gè)人的現(xiàn)實(shí)身份,這也是為什么敏感數(shù)據(jù)會(huì)成為各國(guó)法律法規(guī)的關(guān)注點(diǎn)。
所以在應(yīng)用系統(tǒng)設(shè)計(jì)的初期,我們必須需要明確哪些是所謂的敏感數(shù)據(jù),以及圍繞著敏感數(shù)據(jù)的生命周期要如何處置
哪些是敏感數(shù)據(jù)
個(gè)人隱私
CISSP ALL in One 在隱私章節(jié)里給出部分屬于隱私的數(shù)據(jù)類(lèi)型,如下:
敏感的業(yè)務(wù)數(shù)據(jù)
財(cái)務(wù)相關(guān)交易記錄
…… 需要根據(jù)具體內(nèi)容去決定
敏感數(shù)據(jù)的生命周期
一般而言,生命周期至少包括數(shù)據(jù)的產(chǎn)生、存儲(chǔ)、使用、銷(xiāo)毀,該過(guò)程映射到實(shí)際的應(yīng)用系統(tǒng)中可能還需要進(jìn)行更加細(xì)節(jié)的處理。
傳輸
應(yīng)用系統(tǒng)涉及到信息交互,那么首先要新增的一個(gè)過(guò)程就是傳輸,在傳輸過(guò)程中的敏感信息要如何進(jìn)行處理是需要進(jìn)行明確。明文傳輸肯定是不行的。
產(chǎn)生
我覺(jué)得更明確的詞,應(yīng)該是采集。
采集就涉及到到底是采用完整的數(shù)據(jù),還是部分關(guān)鍵即可,如果是部分關(guān)鍵,那么將采集出的數(shù)據(jù)直接轉(zhuǎn)成Hash摘要可作為一種參考方式。
存儲(chǔ)
避免明文存儲(chǔ)
如果不需要明文的敏感數(shù)據(jù),建議采用hash算法等方式轉(zhuǎn)化數(shù)據(jù),僅用于對(duì)比
如果需要明文的敏感數(shù)據(jù)進(jìn)行操作,建議采用加密算法保障
其他情況
使用
使用可能涉及到多個(gè)場(chǎng)景,例如客戶端頁(yè)面的展示、業(yè)務(wù)操作的需要,如不必要進(jìn)行展示,盡量不進(jìn)行展示。
銷(xiāo)毀
一般這類(lèi)敏感數(shù)據(jù)是需要提供銷(xiāo)毀數(shù)據(jù)的功能的,是真正從數(shù)據(jù)庫(kù)清空相關(guān)信息,而不是通過(guò)標(biāo)志位實(shí)現(xiàn)的假刪除方式
注意: 這里的說(shuō)明,僅僅是提供敏感數(shù)據(jù)相關(guān)策略的參考,具體內(nèi)容以相關(guān)的法律法規(guī)以及業(yè)務(wù)自行設(shè)計(jì)。
輸入輸出
概念
輸入與輸出,絕大多數(shù)的漏洞都在體現(xiàn)在這方面,假如一個(gè)系統(tǒng)完全沒(méi)有輸入和輸出,開(kāi)個(gè)玩笑,如果真有這個(gè)系統(tǒng),有和沒(méi)有又有什么區(qū)別?
輸入與輸出,這兩個(gè)詞雖然簡(jiǎn)單但是里面缺少了一個(gè)東西——主體,什么東西的輸入輸出。
假如實(shí)體服務(wù)器,那么輸入輸出基本上就是我們?cè)谕ㄐ沛溌飞蟻?lái)回輸送的數(shù)據(jù),但是這些數(shù)據(jù)有點(diǎn)駁雜,沒(méi)有辦法再進(jìn)一步的處理,唯一能做是采用一些全局的過(guò)濾器或者攔截器,但是誤殺又太高。
所有站在這個(gè)維度,雖然實(shí)現(xiàn)起來(lái)相對(duì)容易,但是把握度的難度會(huì)比較困難
假如把實(shí)體的粒度劃的再細(xì)一點(diǎn),定義成應(yīng)用軟件(軟件,而非系統(tǒng))。從這個(gè)維度來(lái)看,系統(tǒng)的輸入和輸出類(lèi)型就豐富來(lái)起來(lái)
輸入:來(lái)自文件系統(tǒng)上的文件、數(shù)據(jù)庫(kù)中的數(shù)據(jù)、中間件/容器傳遞的業(yè)務(wù)數(shù)據(jù)、其他組件的數(shù)據(jù)輸入、
輸出:文件系統(tǒng)、數(shù)據(jù)庫(kù)、其他組件、中間件/容器
此時(shí)的輸入輸出可以看得出與部分漏洞有了聯(lián)系,例如與文件系統(tǒng)相關(guān)的文件上傳漏洞、任意文件讀取漏洞
記住,原則上一切的輸入和輸出都不可信,只是經(jīng)過(guò)校驗(yàn)和過(guò)濾的數(shù)據(jù)才能提高可信度。
風(fēng)險(xiǎn)與處理
通過(guò)縮小實(shí)體的粒度,我們更加明確了輸入與輸出,后續(xù)的風(fēng)險(xiǎn)便是圍繞著具體的輸入信息和輸出的信息進(jìn)行分析,構(gòu)建針對(duì)性的過(guò)濾和處理。
當(dāng)然,這種方法因?yàn)榭s小了粒度所以在實(shí)現(xiàn)上就要復(fù)雜的多,主要是分析工作量增大,需要有針對(duì)性。
引用
深度解讀SSL/TLS實(shí)現(xiàn)
SpringBoot開(kāi)發(fā)詳解(六)-- 異常統(tǒng)一管理以及AOP的使用
總結(jié)
- 上一篇: java在进行修改时报400_java开
- 下一篇: 三星s10长宽高是多少(三星智能手机)