是不是細(xì)思極恐?所謂“知彼知己,百戰(zhàn)不殆”,要想不die,先要充分了解對(duì)手,所以接下來(lái)我們進(jìn)一步了解一下什么是病毒?病毒是如何以危險(xiǎn)方式危害公共安全的?又是怎樣進(jìn)入我們的系統(tǒng)的?
病毒是什么,其實(shí)是老生常談了,經(jīng)常關(guān)注醫(yī)療衛(wèi)生領(lǐng)域的朋友都知道:
病毒是一段基因與蛋白質(zhì)構(gòu)成,自身不能實(shí)現(xiàn)新陳代謝,通過(guò)適當(dāng)?shù)耐緩角秩胨拗黧w內(nèi),通過(guò)宿主細(xì)胞的代謝系統(tǒng)實(shí)現(xiàn)復(fù)制傳播。
跑題了?好吧,不要在意這些細(xì)節(jié),我們改幾個(gè)字就能用了:
病毒由一段可執(zhí)行代碼與數(shù)據(jù)構(gòu)成,自身不能在裸機(jī)上運(yùn)行,通過(guò)適當(dāng)?shù)耐緩角秩胨拗鞑僮飨到y(tǒng),通過(guò)宿主系統(tǒng)中的存儲(chǔ)和網(wǎng)絡(luò)實(shí)現(xiàn)復(fù)制傳播。
Wirth教授教導(dǎo)我們,算法+數(shù)據(jù)結(jié)構(gòu)=程序,
病毒=代碼+數(shù)據(jù)=算法+數(shù)據(jù)結(jié)構(gòu)=程序
沒(méi)錯(cuò),病毒就是一類(lèi)特殊的計(jì)算機(jī)程序,廣義上稱(chēng)為惡意軟件。通常它們懷著對(duì)人類(lèi)的深深的惡意來(lái)到世上,行為各不相同,有的在你的屏幕上畫(huà)個(gè)圈圈詛咒你,有的會(huì)竊取你設(shè)備中的隱私照片,還有的會(huì)眨眼間轉(zhuǎn)走你銀行卡上的購(gòu)房首付款……顯然,它們的目標(biāo)還是很一致的:危害人類(lèi)設(shè)備,破壞世界和平。
又扯遠(yuǎn)了,我們接著來(lái)看病毒是如何入侵操作系統(tǒng)的。病毒的入侵無(wú)外乎兩個(gè)途徑:主動(dòng)和被動(dòng)。所謂主動(dòng)是針對(duì)目標(biāo)系統(tǒng)嘗試發(fā)起掃描和攻擊,一般是遠(yuǎn)程發(fā)起,當(dāng)發(fā)現(xiàn)了自己能吃定的漏洞之后,就通過(guò)各種陰險(xiǎn)手段(其實(shí)技術(shù)實(shí)現(xiàn)上大多還是很優(yōu)雅的)攫取系統(tǒng)權(quán)限,進(jìn)而將惡意代碼注入宿主系統(tǒng)中伺機(jī)作惡,對(duì)此沒(méi)什么概念的小伙伴可以自行腦補(bǔ)一下《異形》中的人類(lèi)被寄生的過(guò)程。
病毒入侵的另一種方式,我們稱(chēng)之為被動(dòng)方式。這種方式并不需要系統(tǒng)存在漏洞或缺陷,需要的是用戶(hù)的經(jīng)驗(yàn)、常識(shí)或智商存在缺陷。它們通過(guò)各種偽裝誘騙用戶(hù)去打開(kāi)或運(yùn)行自己,包括形形色色讓你心動(dòng)的郵件、鏈接、不明來(lái)源的安裝程序等等,一旦獲得機(jī)會(huì)運(yùn)行,它們會(huì)悄無(wú)聲息的在你的系統(tǒng)中安營(yíng)扎寨、留下多道后門(mén),然后為所欲為,這類(lèi)病毒又被形象地稱(chēng)為(特洛伊)木馬。
如何應(yīng)對(duì)各種病毒威脅
了解了病毒的來(lái)龍去脈之后,我們就可以討論如何應(yīng)對(duì)各種病毒層出不窮的威脅了。
對(duì)于大多數(shù)用戶(hù),良好的使用習(xí)慣是第一位的。堡壘往往從內(nèi)部被攻克,再安全的操作系統(tǒng),再?gòu)?qiáng)大的安全機(jī)制,都難以阻止用戶(hù)的自我毀滅的腳步。良好的使用習(xí)慣中最重要的,是安全更新,安全更新,安全更新!為什么呢?這要先談一下操作系統(tǒng)漏洞的由來(lái)。
漏洞實(shí)際是軟件缺陷的一種,也就是俗稱(chēng)的bug,是由于軟件開(kāi)發(fā)人員的疏忽而導(dǎo)致程序沒(méi)有按照預(yù)期的方式運(yùn)行。軟件缺陷多種多樣,有些很呆,有些很萌,也并不都會(huì)對(duì)系統(tǒng)安全構(gòu)成威脅。在軟件正式發(fā)布前,研發(fā)人員和測(cè)試人員經(jīng)過(guò)漫長(zhǎng)而艱苦卓絕的互相傷害,通常最終會(huì)達(dá)成妥協(xié),通過(guò)共同消滅軟件缺陷的方式來(lái)解決雙方的爭(zhēng)端。然而總會(huì)一些生性狡猾、城府極深的漏網(wǎng)之魚(yú),潛伏在革命隊(duì)伍中,混入千家萬(wàn)戶(hù)。當(dāng)它們中的一些被黑客們發(fā)現(xiàn)、策反,并借助自己在系統(tǒng)內(nèi)部的有利位置,披著合法軟件的外衣,做出送人頭、坑隊(duì)友的惡劣行徑時(shí),就成為軟件系統(tǒng)的公敵:漏洞。
軟件漏洞通常分為代碼實(shí)現(xiàn)漏洞和邏輯設(shè)計(jì)漏洞。代碼實(shí)現(xiàn)漏洞通常是開(kāi)發(fā)人員代碼編寫(xiě)方式的缺陷而產(chǎn)生的漏洞,常見(jiàn)的包括緩沖區(qū)溢出、格式化字符串、內(nèi)存越界訪問(wèn)、資源釋放重用等;另一類(lèi)則是邏輯設(shè)計(jì)漏洞,它在架構(gòu)或流程設(shè)計(jì)上就存在的固有缺陷,較為常見(jiàn)的例如安全機(jī)制可旁路,導(dǎo)致密碼檢查、權(quán)限驗(yàn)證等機(jī)制被輕易繞過(guò)。而越龐大越復(fù)雜的系統(tǒng)中越容易產(chǎn)生這兩類(lèi)漏洞。操作系統(tǒng)就是這樣一類(lèi)極其龐大而復(fù)雜的軟件系統(tǒng)。
雖然操作系統(tǒng)漏洞常常難以完全避免,然而某個(gè)漏洞一旦被發(fā)現(xiàn),開(kāi)發(fā)廠商都會(huì)在第一時(shí)間發(fā)布安全更新對(duì)問(wèn)題進(jìn)行修復(fù)。以這次勒索病毒為例,針對(duì)被利用的SMB服務(wù)漏洞,事實(shí)上早在一個(gè)月前微軟就公布了漏洞警告和補(bǔ)丁,提供了安全更新,那些開(kāi)啟自動(dòng)更新及時(shí)修復(fù)了漏洞的用戶(hù),他們可以用省下的三個(gè)比特幣吃著火鍋唱著歌,完全不用擔(dān)心麻匪。
所以請(qǐng)劃重點(diǎn):操作系統(tǒng)安全更新非常重要,不論個(gè)人用戶(hù)、企業(yè)用戶(hù)還是系統(tǒng)管理員,不論服務(wù)器,桌面還是移動(dòng)終端,不論Windows,Linux還是MacOS,都應(yīng)該盡可能及時(shí)地從操作系統(tǒng)廠商處獲取安全更新。
其次,殺毒軟件也可以起到一定的安全增強(qiáng)的作用,多數(shù)殺毒軟件可以借助病毒庫(kù)對(duì)已有病毒的特征進(jìn)行分析比對(duì),一旦發(fā)現(xiàn)用戶(hù)即將運(yùn)行的程序中含有病毒或惡意程序,會(huì)及時(shí)提醒用戶(hù),甚至自動(dòng)清除。因此,殺毒軟件可以在很大程度上防御已知的、以被動(dòng)方式入侵系統(tǒng)的病毒。
那么,積極地安全更新、安裝殺毒軟件就可以解決所有病毒威脅了么?很不幸,事實(shí)并非如此。安全更新和殺毒軟件之于病毒威脅正如強(qiáng)身健體之于疾病隱患,可以大幅降低幾率,卻難以完全避免。為什么?這要從零日(0-day)漏洞說(shuō)起。
零日漏洞,聽(tīng)起來(lái)就很霸氣的一個(gè)名字,仿佛給人一種世界末日的感覺(jué)。它并不是指具體的某個(gè)或某類(lèi)漏洞,而是指被黑客發(fā)現(xiàn)后立刻用來(lái)發(fā)起攻擊的漏洞,這些漏洞尚未公開(kāi),用戶(hù)不知道,軟件廠商也不了解,應(yīng)對(duì)時(shí)間為零。所以,這類(lèi)漏洞沒(méi)有檢測(cè)工具,沒(méi)有修復(fù)方法,傳統(tǒng)被動(dòng)升級(jí)防御、病毒特征比對(duì)的方式毫無(wú)用處,一旦被用來(lái)發(fā)起攻擊,普通系統(tǒng)是毫無(wú)招架能力的。那么有沒(méi)有可以防御零日漏洞的安全的操作系統(tǒng)呢?
安全的操作系統(tǒng)與 SELinux
一提到安全的操作系統(tǒng),總會(huì)涌現(xiàn)出很多真知灼見(jiàn),最膾炙人口的莫過(guò)于:“ 所有操作系統(tǒng)都有漏洞,所以沒(méi)有絕對(duì)安全的操作系統(tǒng);所以Windows也好,Linux也好,MacOS也好,都一樣不安全。”
說(shuō)的好有道理,我竟無(wú)言以對(duì),因?yàn)榍鞍刖涫菍?duì)本文前半部分的總結(jié),理論正確,邏輯自洽,沒(méi)什么可黑的。后半句的邏輯卻似乎有點(diǎn)燒腦,如果它成立的話,我們不妨試著推廣一下,比如:“任何物質(zhì)都是有毒性的,沒(méi)有什么是絕對(duì)無(wú)毒的。紕霜吃了會(huì)中毒,水喝多了也會(huì)中毒,所以砒霜和水一樣不安全?!?/p>
毒理學(xué)有句名言:一切談毒性不談劑量的行為都是耍流氓。同樣,任何談操作系統(tǒng)安全不談體系架構(gòu)的行為也是耍流氓。所以面對(duì)這種耍流氓的行為,接下來(lái)我們要嚴(yán)肅的談一談操作系統(tǒng)的安全體系架構(gòu)。
多年前,永恒之藍(lán)的始作蛹者NSA為了防御自家系統(tǒng),開(kāi)發(fā)了一套安全框架,多年后這套框架通過(guò)開(kāi)源組織進(jìn)入了Linux內(nèi)核,這就是SELinux。作為造成這次世界性災(zāi)難的幕后大boss,NSA為自己定制的SELinux又是怎樣的一套防具呢?
SELinux全稱(chēng)Security Enhanced Linux ,是針對(duì)Linux的全面安全增強(qiáng),相比一般的發(fā)現(xiàn)漏洞-修復(fù)漏洞這種被動(dòng)挨打的模式,SELinux具備主動(dòng)防御能力,可以抵御包括零日漏洞在內(nèi)的多種攻擊。那么SELinux是如何做到的呢?
訪問(wèn)控制是操作系統(tǒng)安全體系中的最核心最關(guān)鍵的機(jī)制,它決定了系統(tǒng)中什么樣的資源可以被哪些用戶(hù)以什么樣的方式來(lái)訪問(wèn),也就是說(shuō)普通用戶(hù)能做什么,入侵者能做什么,應(yīng)用軟件能做什么,惡意軟件能做什么,都是訪問(wèn)控制系統(tǒng)決定的。
SELinux的核心訪問(wèn)機(jī)制是強(qiáng)制訪問(wèn)控制,又叫MAC(別想多了,不是蘋(píng)果電腦,也不是網(wǎng)卡地址,是Mandatory Access Control),SELinux的安全特性是建立在MAC基礎(chǔ)之上的。那么MAC何得何能,堪負(fù)如此重任?
說(shuō)到MAC強(qiáng)制訪問(wèn)控制就不得不說(shuō)它的前輩自主訪問(wèn)控制。自主訪問(wèn)控制又叫DAC(Discretionary Access Control)。傳統(tǒng)的操作系統(tǒng),Windows、MacOS、以及包括Linux在內(nèi)的各種Unix的系統(tǒng)權(quán)限管理都是采用的自主訪問(wèn)控制,自主訪問(wèn)控制將用戶(hù)(或用戶(hù)組)簡(jiǎn)化為一個(gè)標(biāo)識(shí),系統(tǒng)中的資源(比如文件)都會(huì)帶上用戶(hù)標(biāo)識(shí)和對(duì)應(yīng)的訪問(wèn)權(quán)限信息,通過(guò)這種方式賦予不同用戶(hù)不同的訪問(wèn)權(quán)限,操作系統(tǒng)通過(guò)對(duì)用戶(hù)標(biāo)識(shí)的比對(duì)和權(quán)限信息決定一個(gè)用戶(hù)是否能訪問(wèn)某個(gè)資源。打個(gè)比方,你認(rèn)為你家里的東西是只屬于你的,在DAC看來(lái),只要能進(jìn)屋的人都對(duì)這個(gè)屋子里的東西擁有權(quán)限,那么你自己開(kāi)門(mén)進(jìn)屋睡覺(jué)也好,小偷撬門(mén)進(jìn)去拿走金銀細(xì)軟也好,隔壁老王每天不請(qǐng)自來(lái)到你家蹭飯也好,都是合法的。
在操作系統(tǒng)中也是如此,幾乎所有操作系統(tǒng)中都有一個(gè)身影,叫管理員,Administrator也好,root也好,都是一群在系統(tǒng)中權(quán)力無(wú)限大,對(duì)任何資源都有完全訪問(wèn)權(quán)限的家伙。多數(shù)系統(tǒng)服務(wù)是以管理員權(quán)限運(yùn)行的,如果它們存在漏洞,被劫持去做一些它們本不該做的事情的時(shí)候,DAC是不會(huì)阻攔的,因?yàn)樗鼰o(wú)法區(qū)分某個(gè)動(dòng)作是程序正常行為還是惡意行為,在它眼里,身份就是權(quán)力的象征,只要認(rèn)可了你的管理員身份,你說(shuō)什么都是對(duì)的,你做什么都是合法的。所以我們說(shuō),在DAC機(jī)制下,不能用來(lái)獲取管理員權(quán)限的漏洞不是好漏洞,不想獲得管理員權(quán)限的入侵者不是好入侵者。
那么MAC機(jī)制又是怎樣的呢?與DAC中的混沌不同,MAC是一個(gè)充滿(mǎn)秩序的世界,一個(gè)每天需要早請(qǐng)示,晚匯報(bào),一舉一動(dòng)要提出申請(qǐng)的世界。在MAC中,一切訪問(wèn)計(jì)劃都要事先寫(xiě)入安全策略,沒(méi)有明確的策略允許的任何訪問(wèn)都會(huì)被禁止。在上個(gè)例子中,作為家中的主人,你需要能夠在家睡覺(jué),也是需要明確制定計(jì)劃的,你需要添加的安全策略看起來(lái)是這樣的:
定義資源類(lèi)型: 床
定義安全域: 休息
定義角色: 主人
訪問(wèn)規(guī)則: 允許 主人 休息時(shí) 使用床
如果系統(tǒng)對(duì)于你家中的資源訪問(wèn)只添加了這一條安全策略,那么你仍然可以安心的在家睡覺(jué),小偷也好、老王也罷,無(wú)論用何種方式進(jìn)入你家都將寸步難行,接觸任何東西的行為都會(huì)被禁止,并且一切被禁止的行為嘗試都將被另一套完善的監(jiān)控系統(tǒng):審計(jì)日志記錄在案。
明白了這個(gè)例子,回到操作系統(tǒng)中我們就很容易看懂MAC是如何防范系統(tǒng)帶來(lái)的安全威脅的:假設(shè)我們有一個(gè)存在緩沖區(qū)溢出漏洞的文件共享服務(wù),與多數(shù)系統(tǒng)服務(wù)一樣使用管理員權(quán)限運(yùn)行。攻擊者通過(guò)精心構(gòu)建一個(gè)特殊的數(shù)據(jù)包發(fā)送給服務(wù)器,使存在漏洞服務(wù)器正常的執(zhí)行流程被劫持,轉(zhuǎn)而執(zhí)行修改管理員密碼的操作。在DAC控制下的傳統(tǒng)操作系統(tǒng)中,一旦攻擊生效,那么管理員密碼會(huì)被這個(gè)平時(shí)八竿子打不著的文件服務(wù)器修改,攻擊者隨后可以很容易的登錄進(jìn)入系統(tǒng)。而在MAC系統(tǒng)中,文件服務(wù)器的可訪問(wèn)的文件是嚴(yán)格受限的,安全策略類(lèi)似于:
允許 系統(tǒng)管理員角色 運(yùn)行文件服務(wù)器 該進(jìn)程允許訪問(wèn)被共享文件。
安全策略的定義了該服務(wù)可以訪問(wèn)的所有資源,攻擊者在攻擊了文件服務(wù)器后,希望修改管理員密碼,它需要訪問(wèn)的是SAM或passwd等的密碼管理文件,由于文件服務(wù)器進(jìn)程僅被策略?xún)H允許訪問(wèn)需要被共享的文件,因此對(duì)密碼管理文件的操作將被拒絕,攻擊失效。這種情況下最壞的情形是,攻擊者可能非法訪問(wèn)共享文件,因?yàn)樗栽诎踩呗栽试S范圍內(nèi)。盡管如此,一個(gè)系統(tǒng)級(jí)的安全漏洞對(duì)整個(gè)操作系統(tǒng)的影響被限制在了非常小的范圍內(nèi)。
通過(guò)細(xì)粒度的劃分訪問(wèn)權(quán)限,將所有應(yīng)用和服務(wù)的訪問(wèn)限制在最小范圍內(nèi),這就是強(qiáng)制訪問(wèn)控制保護(hù)系統(tǒng)不受已知及未知漏洞攻擊的原理。
其實(shí)強(qiáng)制訪問(wèn)控制和自主訪問(wèn)控制并不是水火不容的,在包括SELinux在內(nèi)的多數(shù)安全框架中,它們是共同生效的,所有的資源(或者準(zhǔn)確的說(shuō)叫客體)訪問(wèn)請(qǐng)求首先要經(jīng)過(guò)DAC權(quán)限判定,驗(yàn)證通過(guò)之后再進(jìn)一步進(jìn)行MAC的安全策略判定,只有同時(shí)符合自主訪問(wèn)控制和強(qiáng)制訪問(wèn)控制規(guī)則后才能獲得訪問(wèn)權(quán)限。
SELinux中,有三大類(lèi)MAC策略模型,分別是TE(類(lèi)型增強(qiáng)),RBAC(角色訪問(wèn)控制)以及MLS(多級(jí)別安全),每一類(lèi)模型都針對(duì)系統(tǒng)已有服務(wù)和應(yīng)用提供了大量安全策略,一個(gè)使用了SELinux的典型的服務(wù)器操作系統(tǒng)環(huán)境,內(nèi)核中會(huì)包含10萬(wàn)條以上的安全策略。那么如此多的安全策略,會(huì)不會(huì)導(dǎo)致系統(tǒng)每項(xiàng)操作都要進(jìn)行大量的策略查詢(xún)和判斷,從而步履維艱、不堪重負(fù)呢?不會(huì),因?yàn)镾ELinux中提供了策略緩存機(jī)制,叫做AVC(向量緩存),將已執(zhí)行過(guò)的訪問(wèn)及其判定結(jié)果請(qǐng)求緩存起來(lái),從而可以大幅提升強(qiáng)制訪問(wèn)控制安全策略判定效率。
計(jì)算機(jī)信息系統(tǒng)的安全等級(jí)
了解了SELinux及其強(qiáng)制訪問(wèn)框架后,看到攻防兩端都造詣深厚的NSA,你可能會(huì)驚嘆于矛尖盾厚的美國(guó)在信息安全領(lǐng)域的強(qiáng)大的實(shí)力。然而我國(guó)在這個(gè)陸上有東風(fēng),海上有航母,天空有北斗的時(shí)代,在信息安全這樣重要的領(lǐng)域當(dāng)然不會(huì)碌碌無(wú)為。我國(guó)很早就對(duì)信息安全領(lǐng)域展開(kāi)了全面的研究,公安部對(duì)信息安全的各個(gè)領(lǐng)域提出了一些列標(biāo)準(zhǔn),最早在GB 17859-1999標(biāo)準(zhǔn)中就根據(jù)需求將計(jì)算機(jī)信息系統(tǒng)由低到高,劃分為1-5共五個(gè)等級(jí)。在GB/T 20272-2006中更進(jìn)一步對(duì)操作系統(tǒng)安全技術(shù)提出了具體要求。
從國(guó)標(biāo)安全第三級(jí)開(kāi)始要求操作系統(tǒng)提供強(qiáng)制訪問(wèn)控制,除了要實(shí)現(xiàn)SELinux中的各類(lèi)安全模型架構(gòu)外,還根據(jù)最小特權(quán)原則開(kāi)創(chuàng)性的引入三權(quán)分立的概念,將普通操作系統(tǒng)中權(quán)限不受控制的管理員根據(jù)職責(zé)分解為系統(tǒng)管理員,安全管理員,審計(jì)管理員三個(gè)角色。系統(tǒng)管理員負(fù)責(zé)“行政”體系,也就是系統(tǒng)中的配置管理,類(lèi)似網(wǎng)絡(luò)配置、服務(wù)啟停(安全服務(wù)除外)、設(shè)備管理等等;安全管理員負(fù)責(zé)“立法”,負(fù)責(zé)安全策略制定、加載以及安全服務(wù)的開(kāi)啟;審計(jì)管理員的職責(zé)類(lèi)似“司法”,制定違規(guī)訪問(wèn)的記錄,安全服務(wù)的關(guān)閉,三個(gè)角色的權(quán)限之間互相制約,從根本上避免了惡意入侵者通過(guò)獲取管理員權(quán)限對(duì)操作系統(tǒng)的全面控制。
同時(shí)標(biāo)準(zhǔn)還對(duì)用戶(hù)數(shù)據(jù)的私密性、完整性提出了嚴(yán)格的保護(hù)要求,要求操作系統(tǒng)通過(guò)安全標(biāo)簽保障用戶(hù)數(shù)據(jù)不被非法讀取和篡改。國(guó)標(biāo)安全四級(jí)除了在訪問(wèn)控制和數(shù)據(jù)保護(hù)上提出更為嚴(yán)格要求之外,還要求設(shè)計(jì)者對(duì)操作系統(tǒng)的安全策略模型、安全功能模塊進(jìn)行形式化驗(yàn)證,并進(jìn)行隱蔽信道分析,對(duì)系統(tǒng)抵御攻擊能力進(jìn)行評(píng)估,也是目前已有操作系統(tǒng)能達(dá)到的最高安全等級(jí)。目前普華、凝思等國(guó)產(chǎn)操作系統(tǒng)廠商已經(jīng)開(kāi)發(fā)出了符合國(guó)標(biāo)安全四級(jí)的安全操作系統(tǒng),提供了遠(yuǎn)高于普通SELinux的底層安全保護(hù)。
結(jié)語(yǔ)
盡管病毒與惡意入侵并非只針對(duì)操作系統(tǒng),信息安全是全方位的,單一從操作系統(tǒng)層面無(wú)法解決所有的安全問(wèn)題,然而作為所有上層應(yīng)用的最底層軟件支撐,操作系統(tǒng)卻承載著一切上層軟件的安全機(jī)制,脫離操作系統(tǒng)的構(gòu)建的安全體系,如同沙灘上的城堡,即使再堅(jiān)固也將最終失去根基。
本文作者“東風(fēng)快遞”來(lái)自普華基礎(chǔ)軟件研發(fā)部