架構(gòu)設(shè)計(jì)中的6種常見安全誤區(qū)
自然世界中,先天有缺陷的生物總是容易被細(xì)菌病毒入侵,而健壯的生物更能抵抗細(xì)菌病毒的攻擊,計(jì)算機(jī)系統(tǒng)也是一樣,若有先天的架構(gòu)設(shè)計(jì)安全缺陷,那 么在面臨網(wǎng)絡(luò)攻擊的時(shí)候,就更容易被入侵或者破壞,甚至因?yàn)樵O(shè)計(jì)架構(gòu)的原因,有些漏洞完全沒有辦法修復(fù)!本文將講述架構(gòu)設(shè)計(jì)中需要避免出現(xiàn)的安全誤區(qū),以 幫助我們研發(fā)人員設(shè)計(jì)出更安全健壯的軟件架構(gòu)。本文的舉例既有硬件架構(gòu),也有軟件架構(gòu),還有基礎(chǔ)架構(gòu)等等不同的架構(gòu),但其中原理適用于所有的架構(gòu)設(shè)計(jì)。下 文將從兼容性設(shè)計(jì)誤區(qū),降低成本設(shè)計(jì)誤區(qū),數(shù)據(jù)和代碼不分離的設(shè)計(jì)誤區(qū),封閉設(shè)計(jì)的誤區(qū),黑名單設(shè)計(jì)的誤區(qū),沒有將安全列為設(shè)計(jì)目標(biāo)之一的誤區(qū),總共6個(gè) 方面來探討設(shè)計(jì)安全誤區(qū)的問題。
誤區(qū)一:兼容性設(shè)計(jì)
兼容性越好的架構(gòu)越能適應(yīng)未來變化的需要,所以架構(gòu)設(shè)計(jì)者會(huì)非常關(guān)注架構(gòu)的兼容性設(shè)計(jì),但是有些兼容性設(shè)計(jì)會(huì)帶來嚴(yán)重的安全漏洞,這些安全漏洞甚至無法以簡單的漏洞補(bǔ)丁方式修復(fù)。
以 蘋果的USB-C接口設(shè)計(jì)為案例。USB-C這個(gè)接口不僅用來實(shí)現(xiàn)供電、還用于支持鼠標(biāo),鍵盤等設(shè)備的數(shù)據(jù)傳輸,起到了簡化設(shè)計(jì)結(jié)構(gòu),方便用戶的目的。谷 歌新款Chromebook Pixel也內(nèi)置了USB-C接口,預(yù)示著業(yè)界對(duì)于MacBook的USB-C接口設(shè)計(jì)基本上是一致認(rèn)可的。不過,安全專家卻認(rèn)為這是一個(gè)很糟糕的設(shè)計(jì)。 在2014年的黑帽技術(shù)大會(huì)上,安全專家演示了一次針對(duì)USB-C接口的攻擊,只要將特制的U盤插入使用USB-C接口的蘋果計(jì)算機(jī),攻擊者無需在做任何 操作,就可以將后門或是病毒自動(dòng)植入蘋果計(jì)算機(jī),使計(jì)算機(jī)可以被攻擊者遠(yuǎn)程控制或是通過病毒自動(dòng)破壞計(jì)算機(jī)內(nèi)的文件,非??膳?。更悲劇的還在后面,蘋果一 直都沒有辦法修復(fù)該漏洞,為什么呢?這得從這個(gè)漏洞的利用方式說起,上文說到攻擊需要特制的U盤,安全專家改變了U盤的硬件和軟件結(jié)構(gòu)和內(nèi)容,當(dāng)U盤插入 USB-C接口的蘋果計(jì)算機(jī)時(shí),電腦會(huì)識(shí)別U盤為一個(gè)鍵盤,再利用U盤中的芯片和存儲(chǔ)的攻擊代碼,就可以偽裝成鍵盤向主機(jī)發(fā)送控制命令,從而完全控制主 機(jī),無論使用者是否開啟自動(dòng)播放,都可以成功。所以漏洞的關(guān)鍵在于U盤和鍵盤等設(shè)備可以共用同一類接口與計(jì)算機(jī)交互,在計(jì)算機(jī)系統(tǒng)上沒有辦法區(qū)分偽裝成鍵 盤的U盤和真實(shí)的鍵盤,這樣若不改變USB-C接口可以兼容U盤,鍵盤等各種硬件的設(shè)計(jì),他們就不能修復(fù)該漏洞,而若要修復(fù)該漏洞就必須推翻原來的設(shè)計(jì), 讓USB接口不再兼容鍵盤,鼠標(biāo)等輸入硬件,輸入類硬件仍然使用原來的PS/2接口或其它不同的接口。
蘋果的USB-C接口設(shè)計(jì)產(chǎn)生了 一個(gè)必須推翻自己才能修復(fù)的漏洞, 所以說這是一個(gè)糟糕的設(shè)計(jì)。對(duì)于軟硬件的兼容性設(shè)計(jì),第一,一定要注意兼容的對(duì)象是否為同一類,不同類的對(duì)象最好不要強(qiáng)容,蘋果這個(gè)設(shè)計(jì)就沒有將控制指令 的輸入設(shè)備(鍵盤)與數(shù)據(jù)輸入設(shè)備(U盤)這兩類對(duì)象區(qū)分對(duì)待,導(dǎo)致了這個(gè)越權(quán)漏洞的產(chǎn)生;第二,兼容性設(shè)計(jì)者需要確保鑒權(quán)機(jī)制能夠識(shí)別不同的對(duì)象輸入, 對(duì)不同的對(duì)象輸入走不同的處理,避免出現(xiàn)控制指令輸入設(shè)備可以偽裝數(shù)據(jù)輸入設(shè)備,代碼可以偽裝成數(shù)據(jù)輸入的漏洞,借用一句經(jīng)典的話——“圈子不同,不要強(qiáng) 容”。
誤區(qū)二:降低成本設(shè)計(jì)
架構(gòu)設(shè)計(jì)者也會(huì)非常關(guān)注架構(gòu)的成本,能以最少的成本實(shí)現(xiàn)系統(tǒng)是體現(xiàn)設(shè)計(jì)者水平的重要標(biāo)志,所以架構(gòu)設(shè)計(jì)者的設(shè)計(jì)總有降低軟硬件成本的傾向,這種傾向本沒有錯(cuò),但如果在錯(cuò)誤的地方降了成本,給系統(tǒng)帶來極大的安全風(fēng)險(xiǎn),就得不償失了。
例 如下面這個(gè)因?yàn)榻党杀驹O(shè)計(jì)導(dǎo)致服務(wù)器無法防范CC攻擊的場景。很多設(shè)計(jì)者會(huì)將每臺(tái)服務(wù)器的負(fù)載率設(shè)定得非常高,高達(dá)50%-70%,希望減少服務(wù)器的部署 以降低成本,但是在正常業(yè)務(wù)場景下就有這么高的負(fù)載,被CC攻擊的時(shí)候會(huì)很容易被癱瘓,安全專家也沒有辦法在服務(wù)器上實(shí)施安全策略以防御攻擊。 CC(Challenge Collapsar)是一種HTTP層的DDos攻擊,它通過發(fā)送大量HTTP層的請(qǐng)求,以達(dá)到讓被攻擊的目標(biāo)網(wǎng)站癱瘓的目的。Challenge Collapsar的中文意思是挑戰(zhàn)黑洞,大家可能會(huì)覺得它的名字有點(diǎn)怪,這里涉及攻擊命名者與一個(gè)防火墻產(chǎn)品的糾葛,黑洞是一款知名的防火墻產(chǎn)品,意思 很明顯了,命名者想說黑洞防火墻也防不住他的這種攻擊。目前國內(nèi)領(lǐng)先的幾家DDos清洗設(shè)備安全廠商可以基于特征防御一些普通的CC攻擊,但是對(duì)于一些沒 有數(shù)據(jù)段特征,并且有大量代理IP的CC攻擊仍然沒有辦法。這個(gè)時(shí)候防御的重點(diǎn)戰(zhàn)場就必須轉(zhuǎn)移到服務(wù)器上來了,通過業(yè)務(wù)服務(wù)器上更多業(yè)務(wù)場景的數(shù)據(jù),以及 更容易編程實(shí)現(xiàn)復(fù)雜的安全策略優(yōu)勢來檢測攻擊請(qǐng)求,舉個(gè)例子,比如我們通常業(yè)務(wù)場景下,來自河南省的訪問量很少,而攻擊的時(shí)候該省的訪問量上升10倍,我 們可以對(duì)該省的訪問量丟掉80%,從而防御攻擊,并且最大限度的降低對(duì)業(yè)務(wù)的影響。
所以設(shè)計(jì)時(shí)保證一定的服務(wù)器冗余,能夠降低攻擊開始階段系統(tǒng)就被攻擊到癱瘓的概率,也為DDos安全專家的安全防御策略提供計(jì)算資源。如果有條件的話,最好是把業(yè)務(wù)部署在云上,這樣被攻擊的時(shí)候可以動(dòng)態(tài)增加服務(wù)器數(shù)量,既能節(jié)省成本也能保障攻擊的時(shí)候能夠有效的防護(hù)。
誤區(qū)三:數(shù)據(jù)和代碼不分離的設(shè)計(jì)
數(shù) 據(jù)和代碼不分離意味著數(shù)據(jù)可以被當(dāng)成代碼執(zhí)行,而數(shù)據(jù)是可以由用戶(攻擊者)自己定義的,也就是說用戶(攻擊者)可以自定義在系統(tǒng)上執(zhí)行的代碼,那么攻擊 者可以構(gòu)造木馬代碼,作為數(shù)據(jù)輸入給系統(tǒng),系統(tǒng)執(zhí)行這些木馬代碼后,系統(tǒng)就會(huì)被攻擊者控制,這樣的設(shè)計(jì)將給系統(tǒng)帶來極大的風(fēng)險(xiǎn)。我們的系統(tǒng)開發(fā)過程中其實(shí) 有不少這樣的案例,下面我們先看看一個(gè)設(shè)計(jì)導(dǎo)致的上傳攻擊漏洞的案例。
例如一個(gè)導(dǎo)致上傳攻擊漏洞的設(shè)計(jì)案例,先簡單描述一下上傳攻擊的 原理,大部分應(yīng)用系統(tǒng)都有上傳圖片或文件的功能,攻擊者利用這些功能上傳一個(gè)網(wǎng)頁木馬,如果存放上傳文件的目錄有執(zhí)行腳本的權(quán)限,那么攻擊者就可以直接得 到一個(gè)WebShell,進(jìn)而控制Web服務(wù)器。這個(gè)漏洞有兩個(gè)必要條件,一是可以上傳木馬,二是存放上傳文件的目錄具備執(zhí)行腳本的權(quán)限。上傳是業(yè)務(wù)的功 能需要,即便有做各種安全過濾,限制木馬上傳,但也有各種繞過過濾的攻擊方法,比較難以限制。所以漏洞的關(guān)鍵就在上傳的目錄是否具備執(zhí)行腳本的權(quán)限上,很 多設(shè)計(jì)者會(huì)基于降低成本的考慮,將存儲(chǔ)上傳文件的位置與Web應(yīng)用程序放在同一服務(wù)器,甚至同一目錄下,這樣上傳的目錄也和Web應(yīng)用程序一樣具備執(zhí)行腳 本的權(quán)限,從而導(dǎo)致系統(tǒng)產(chǎn)生了一個(gè)高危上傳漏洞。
而如果將存儲(chǔ)上傳文件的位置設(shè)計(jì)在另一臺(tái)只具備存儲(chǔ)功能的文件服務(wù)器或數(shù)據(jù)庫上,與Web應(yīng)用服務(wù)器分開,這樣即使木馬被上傳進(jìn)來,也因?yàn)槲募?wù)器不能執(zhí)行腳本而沒有辦法實(shí)施攻擊。
誤區(qū)四:封閉設(shè)計(jì)
架 構(gòu)師設(shè)計(jì)通常會(huì)遵循對(duì)擴(kuò)展開放,對(duì)修改封閉的設(shè)計(jì)原則。對(duì)于修改封閉,就是說外部可以調(diào)用系統(tǒng)的接口使用系統(tǒng)的功能,但是看不到系統(tǒng)內(nèi)部實(shí)現(xiàn)的代碼,也不 能對(duì)內(nèi)部實(shí)現(xiàn)的代碼進(jìn)行修改。這常常給設(shè)計(jì)者一種錯(cuò)覺,認(rèn)為外部使用者不知道系統(tǒng)內(nèi)部是怎么實(shí)現(xiàn)的,不知道存在的安全缺陷,從而放心大膽的在內(nèi)部留下許多 安全隱患,最常見的就是使用私有加密算法。
設(shè)計(jì)者常會(huì)直觀的認(rèn)為私有算法擁有算法的秘密性,所以安全性要比公開常用加密算法更高些。但 其實(shí)私有算法的秘密性也是很難保障的首先,中國有句古語——“天下沒有不透風(fēng)的墻”,指不定什么時(shí)候你的算法就會(huì)通過隊(duì)友泄露出去,如果你覺得這個(gè)說法太 虛了,舉個(gè)實(shí)際的例子,開發(fā)人員都喜歡用GitHub,指不定哪個(gè)豬隊(duì)友(有可能是自己)就會(huì)把你的算法全部上傳到GitHub,黑客會(huì)放過這么好的機(jī)會(huì) 嗎?當(dāng)然不會(huì),烏云上這些漏洞案例比比皆是。其次,如果算法沒有泄露,黑客就不知道你的算法了嗎?當(dāng)然不是,黑客可以通過很多數(shù)學(xué)推導(dǎo)的方式,把加密的算 法推導(dǎo)出來,例如加密算法的公式通常如下所示:
y= F(x) 其中F是加密算法,y是密文,x是明文
但只要有足夠多的 x,y 就可以推導(dǎo)出 F,比如下面一組【x,y】的數(shù)據(jù):
x=[0 0.9375 1.8750 2.8125 3.7500 4.6875 5.6250 6.5625 7.5000
8.4375 9.3750 10.3125 11.2500 12.1875 13.1250 14.0625 15.0000];
y=[0.000000E+000 8.789063E-003 3.515625E-002 7.910156E-002
1.406250E-001 2.197266E-001 3.164063E-001 4.306641E-001
5.625000E-0017.119141E-001 8.789063E-001 1.063477E+000
1.265625E+000 1.485352E+000 1.722656E+000 1.977539E+000 2.250000E+000];
通過matlab的最小二乘法就可以計(jì)算出F的公式如下:
加密算法是這樣,其它的設(shè)計(jì)也是這樣,黑客總是可以通過各種方法收集到攻擊目標(biāo)的大量信息,要知道攻擊的第一步就是情報(bào)收集。所以,使用私有加密 算法并不能保證加密算法的私密性,對(duì)安全性提升也微乎其微。再加上私有算法的數(shù)學(xué)復(fù)雜性難以達(dá)到和公開常用算法的一樣水平(比如RSA算法利用的就是“將 兩個(gè)大素?cái)?shù)相乘十分容易,但是想要對(duì)其乘積進(jìn)行因式分解卻極其困難”的數(shù)學(xué)原理), 在算法的實(shí)現(xiàn)上也不如公開常用算法一樣久經(jīng)考驗(yàn),因此即便封裝了的私有加密算法也是不能使用的,加密應(yīng)該用公開常用的加密算法,用密鑰秘密性而不是算法的 秘密性來保障安全。
所以,通過此類通過封閉設(shè)計(jì)隱藏軟件的實(shí)現(xiàn),從而隱藏一些安全隱患是非常不可取的!官方機(jī)構(gòu)對(duì)此類行為也有過明確的 意見,反對(duì)采用執(zhí)行或者實(shí)現(xiàn)的秘密性來保障產(chǎn)品的安全,美國國家標(biāo)準(zhǔn)與技術(shù)研究所(NIST)明文表示:“系統(tǒng)的安全性不應(yīng)該依賴于執(zhí)行或其部件的秘密 性。軟件的設(shè)計(jì)應(yīng)該假設(shè)是開放的——用戶和黑客都知道軟件是怎么樣實(shí)現(xiàn)的,而且即便知道軟件的實(shí)現(xiàn)也不會(huì)危害產(chǎn)品的安全,通過密鑰或者鑒權(quán)因子就能保障產(chǎn) 品數(shù)據(jù)的安全。
誤區(qū)五:黑名單防御
通常設(shè)計(jì)者都會(huì)知道需要防御sql注入和 XSS攻擊等安全問題,但是在選擇防御的方案時(shí)常常走入一些誤區(qū), 他們通常會(huì)選擇用過濾的方法去防御sql注入和XSS攻擊等攻擊,這種類似黑名單的防御方式簡單方便,修改量小,而且他們認(rèn)為這樣黑客已經(jīng)攻不進(jìn)來了。他 們低估了黑客們的智慧和毅力,事實(shí)證明凡是采用過濾方式防御sql注入和xss的產(chǎn)品,無一不被繞成狗的。
烏云上這種被繞過的案例比比 皆是,目前還沒有看到有一個(gè)不被繞過的硬件防火墻,云WAF或主機(jī)端的防護(hù)產(chǎn)品,即便最新宣稱“永別了SQL注入”的SQLChop也很快在烏云被爆出存 在繞過的漏洞, 筆者也贊同SQLChop的用數(shù)據(jù)分析檢測SQL注入的思路把防護(hù)水平提高了一個(gè)等級(jí),但即便這樣也依然逃脫不了被繞過的命運(yùn)。這些如此專業(yè)的安全廠商設(shè) 計(jì)的產(chǎn)品都難逃被繞過的命運(yùn),那我們自己的研發(fā)人員自己在服務(wù)器上開發(fā)和部署的SQL注入和XSS攻擊過濾功能,是不是會(huì)被繞得更慘呢?答案是肯定的。所 以對(duì)SQL注入漏洞應(yīng)該用參數(shù)化查詢的方式來解決,XSS漏洞應(yīng)該用對(duì)輸出進(jìn)行編碼的方式來解決,過濾的方法只能作為臨時(shí)方案用來輔助做深度防御,而絕不 能單獨(dú)作為防御攻擊的安全解決方案。
誤區(qū)六:沒有將安全列為設(shè)計(jì)目標(biāo)之一
相比以 上誤區(qū),大部分設(shè)計(jì)最大的誤區(qū)就是沒有將安全列為設(shè)計(jì)的目標(biāo)之一,這才是產(chǎn)生以上所有設(shè)計(jì)安全問題的根源。產(chǎn)生這樣誤區(qū)的主要原因有兩個(gè),第一,架構(gòu)師或 設(shè)計(jì)者真心不覺得有人有能力和有耐心去攻擊他們的產(chǎn)品。我在與架構(gòu)師的溝通中,聽到最多的一句話就是“不可能!”,不管是最優(yōu)秀互聯(lián)網(wǎng)企業(yè)的架構(gòu)師,還是 最優(yōu)秀傳統(tǒng)企業(yè)的架構(gòu)師都是這樣。架構(gòu)師或設(shè)計(jì)者們通常以自己的知識(shí)去判斷是否能被攻擊,但是大部分的架構(gòu)師和設(shè)計(jì)者都不具備一定深度的安全知識(shí),所以常 常作出錯(cuò)誤的判斷。黑客是最具極客精神的群體,為挖掘一個(gè)漏洞連續(xù)調(diào)試12小時(shí),持續(xù)攻堅(jiān)一個(gè)星期都不是什么稀奇的事情,所以在這樣一個(gè)群體面前,絕不能 以己度人,聽從靠譜安全架構(gòu)師的意見會(huì)更安全。第二,存在安全漏洞并不一定立即發(fā)生安全事故。安全問題大多數(shù)情況下都只是風(fēng)險(xiǎn),它轉(zhuǎn)化為安全事故一般有一 段時(shí)間,而且很多情況下即便發(fā)生了安全事故,一些安全力量薄弱的公司甚至不能檢測和感知到,所以表面的一片“和諧”給了我們的設(shè)計(jì)者一種錯(cuò)覺,不需要做安 全的設(shè)計(jì),產(chǎn)品給我的需求都做不完,哪有時(shí)間”浪費(fèi)”人力的做安全設(shè)計(jì)和開發(fā)!
所以各種遺留下來的安全隱患積累到一定程度,或者被某個(gè)導(dǎo)火索事件引起安全事故的大爆發(fā),導(dǎo)致企業(yè)的經(jīng)營遭受重創(chuàng)!不管是架構(gòu)師等研發(fā)人員,還是安全人員都不應(yīng)該讓企業(yè)走到這一步絕境,而應(yīng)該在產(chǎn)品設(shè)計(jì)之初就避免出現(xiàn)嚴(yán)重的設(shè)計(jì)安全問題,為保障產(chǎn)品的安全水平打下基礎(chǔ)。