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