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