Windows NT 內核與 Linux 內核相比哪個更安全?

從技術上考慮,不要考慮實際人數。
我一直堅信Linux更安全(堅持使用中,業餘運維),但直到有一天我和同學討論了這個問題。。。
麻煩從內核技術上討論,不要說Linux是開源的,很容易修補(這我知道)。。。


我來扯幾句。

就計算機安全來說,離不開談論的環境,即所謂要確立"可信計算域"的概念和範圍,就當前這個問題來說,內核的安全性。嗯,話題有點大,寫一米厚的書都夠了,我簡單寫點NT的。

首先,已經是內核了,那麼在NT內核裡面執行的代碼的許可權就是無限大,linux我想應該是差不多的,所以首先要確立對於這個問題來說,內核內就是「可信計算域」,這裡面能做出危害整個系統的事情。

OK,那麼問題就分兩方面,NT內核對內對外的安全性體現。

首先說NT內核自身,因為這貨是閉源的,所以普通的擴展方法就是寫驅動,驅動載入進去基本也就什麼都能做了。ok,你可以認為這是一個不安全的地方。但是,首先,安裝驅動程序是需要許可權的,如果你每天開著administrator上網還扯什麼安全性,這就是搞笑;其次,現在的NT內核因為x64下面patch guard技術的引入,胡亂Hook的現象少多了,進一步限制了驅動胡搞;最後x64要求驅動有sign,惡意代碼進系統比以往有了很大的難度。

其次說說內核對外的安全性體現。NT其實有一大弱點,就是r3有幾個進程是不能結束的,crash掉會馬上BSOD,但這和今天的話題無關。
1 當下的NT內核提供了ASLR,大大提高了進程被inject後shellcode run起來的難度;
2 傳統NT的ACL模型就不廢話了
3 UAC,這貨也不扯了
4 EFS和Bitlocker,EFS的易受攻擊性已經是被證明的,所以這貨只能提供有限的安全性,但是Bitloacker在正確配置的情況下,可以提供幾乎不存在什麼弱點的安全保護,相關話題我就不在這裡扯了,有興趣的自己看看相關資料。
5 UMDF,因為內核驅動會導致BSOD,所以現在NT內核提供用戶模式驅動,這貨崩掉只會導致一個系統服務crash,重啟服務即可(並不是重啟計算機,比如USB的,只需要重新插一下就行了)

就說這麼多,以下是嘲諷時間:
如上所述,要確立「可信計算域」,安全是對用戶來說的,無論吹得多麼天花亂墜,傷害了最終用戶,再先進的技術也是不安全的。
舉例來說,安卓對用戶來說就是一完全惡意不安全的系統,當然你可以反駁我「你覺得這個app要的許可權多,你可以不用,你換一個阿」,這是廢話,當每一個app都可以(事實上也都是)肆無忌憚的要求各種許可權的時候,用戶沒得選,用戶也沒地方設置。
另外總有人蹦出來說linux如何優越,開源就是棒,一般來說這種嚷嚷得越歡的越菜,開源等於安全是一個悖論,不多扯了,跑題,能戰100頁。


占坑,一點點的說。

先說內核的定義:狹義的WindowsNT內核指的就是NTOSKRNL.EXE,Linux內核就是Grub里指定的那個內核文件,這兩個文件都不大,屬於系統最核心的組件;廣義的內核定義是:WindowsNT架構下的大部分SYS文件,Linux里所有工作在內核模式的進程。

因為WindowsNT是微內核(勉強算是吧),Linux則完全不屬於微內核結構,就先從這種區別來說安全性吧:

微內核的好處就是核心的東西通常可靠性較高,並且如果某一個子系統掛掉的情況下,不會完全影響到內核的工作(當然實際NT情況不是這樣),缺點就是外圍驅動的代碼無法控制,為此微軟引入了數字簽名之類的東西,從WIN7x64開始,沒有簽名的驅動是無法被載入的,這一點可以保證一些安全性。

Linux里內核包括了很多東西,編譯內核的時候可以定製自己想要的東西,如果對自己想要的東西理解的足夠多的話,那麼驅動的安全性是可以保證的。但Linux的一大問題是LKM,LKM可以在root許可權下動態載入任意一個內核代碼。

從載入第三方代碼的角度說,微軟在WIN7以後安全性提高了很多,而Linux因為有LKM的存在,如果root許可權被控制,那麼任意指令都可以被載入到內核執行。

所以,我不太認為Linux的內核安全性比NT內核要高多少,雖然微軟簽名也有可能濫發,但LKM更可怕。

Windows使用IRQL之類的限制保證不同的代碼運行在不同的內存空間下,理論上說,對硬體的資源控制是要優於Linux的。Linux在這方面沒有提供更多的保護(或者,我不了解相關的情況)。註:此處的內存空間是指page和non-paged的區別。

剩下的我慢慢補充。

------------------補充1------------------

關於root許可權的問題:

這是在對等的條件下進行比較的,Windows的管理員許可權下是無法載入未驗證的代碼到內核的,Linux在root(管理員)許可權下是可以載入任何未驗證的代碼到內核的。所以說從內核的結構上看對待ring0的代碼來說Linux的保護機制更弱。

@deep-pro@殷紅路 你們的說法我無法贊同,Windows非管理員許可權是很安全的,但是沒有人這麼用,如果用Windows管理員許可權與Linux一般用戶去比較那麼是不公平的。

另外,@殷紅路 以下是我找到的數據鏈接:
Usage share of operating systems

看不出Linux的佔有率哪裡明顯高於Windows了,在伺服器市場,IDC的數據仍然是Windows高於Linux,唯一的一組數據是安全領域Linux很高,但是點開那個引用數據可以看到那個數值是基於apache的應用的,Windows、Linux、Unix是都支持apache的,尤其在IDC的伺服器上Apache+Windows的應用也是見過很多的,所以也沒理由說Linux的佔用率一定高於Windows。

----------------------------補充2----------------------------

討論的是內核安全性,但我還要說說應用的事情,在應用的方面,Windows應用的安全性還是遠遠低於Linux的,雖然微軟在vista以後加入了UAC這種控制,但易用性和安全性之間本身就是有矛盾的,在方便的同時是要犧牲一部分安全性的代價的。

Windows的應用漏洞多的不計其數,但也不是說Linux是完全安全的,Linux的代碼來源未必都是可靠的,並且就算是可靠的也未必是安全的,比如今年的struts2漏洞,當然有人會說那不是Linux的,那好吧Windows的很多應用也不是微軟發布的,在這之間沒有明顯的界限,不做進一步討論了。

----------------------------補充3----------------------------

繼續說安全性,說兩個內核區別:

Windows內核的二次開發是非常困難的,比如,Linux里可以基於VFS很快建立一個自己的文件系統,自建文件系統的好處就是可以保證數據安全,而Windows想要擴展第三方文件系統是十分困難的,因為Windows內核里有太多的API是不公開或者沒有明確文檔說明的。

Windows內核的為了方便第三方軟體工作提供了過濾驅動這種介面,這種設計簡直是為木馬軟體專門留的後門。當然微軟的策略是:方便自己封閉、也方便別人使用,但正是這種思路,也使得用戶無法觸及封閉的部分,使得開放的部分被人濫用,因此也就有了各種奇怪的保護手段,比如QQ密碼框用的修改IDT表項之類的,Linux因為系統是開放的,應用軟體有足夠的手段去開發安全性更強的驅動、插件、系統調用。

所以NT內核的封閉性+開放API的做法很容易導致開放的部分被濫用,這一點對開發者而言是很不友好的,在這個方面,Linux取勝。

----------------------------補充4----------------------------

兩個系統內核還有明顯的區別,但跟安全性關聯不大,比如:

系統調用,一個用int 0x80,另一個用sysenter,據說最新版本的Linux也是用sysenter,我沒有考察過,二者安全性應該沒太大區別,只存在於速度上。sysenter更快一點。

圖形化組件是集成在Windows內核里的,但Linux的圖形化不集成在內核里,集成內核的效果是圖形化更快。但對於伺服器而言,圖形化組件不是一個必需的選項,Windows這麼做其實是在浪費資源,並且也多了一個漏洞存在的可能性,因為Windows JPEG緩衝區溢出漏洞是能攻擊到內核的。

Windows的調用棧更多,寫過Windows驅動的人都知道IRP這個東西,一層一層的傳遞,效率其實很差的,浪費內存資源,所以Linux能精簡,但Windows想精簡都困難。


正因為Linux是開源的,Linux安全到什麼程度,取決於在什麼人手上


安全性不能量化成數值,你最後只能得到一個主觀的答案。

Windows現在的安全性遜色於Linux也是建立於Windows數十倍於Linux的用戶的基礎上的。同等的,在挖掘Windows漏洞的人數量也要比挖掘Linux漏洞的多不知道多少。

而且進商業公司的Linux伺服器違法成本很高。而日民用機器,就算穿幫,也幾乎沒有被告的可能。

如果拋開使用人數,這個問題沒有任何意義。NT和Linux內核都是非常優秀的,無法量化比較。微軟雖然整天被黑但的確是個優秀的公司。


必須Windows NT,參見Android的破解root,近幾年SELinux被繞過,抵制Pax/Grsec,Linus罵OpenBSD開發組,如果在同等用戶量下,且同等用戶許可權自由度,Linux必死無疑,Windows NT在歷代版本中不斷為其自身完善安全機制,以減少被惡意提權的可能性,Linux,呵呵。。。


來,看個 linux 的大範圍 root exploit
https://dirtycow.ninja/


其實差不多。Linux安全只是(JUST!)幻覺。
至於NT。。。也還行,不過個人不喜歡NT的設計思想。


我根本就不用從技術角度考慮,只考慮一點,WINDOWS用戶比LINUX的多的多,於是,系統攻擊者一定在WINDOWS攻擊上下的功夫要比在LINUX上下的功夫要多,從而推斷WINDOWS的系統更能扛的住攻擊。

@Liigo 發完才看到你的回答我得承認你說的是有道理


沒有明確回答該問題答案,僅供參考

安全性我沒辦法評論,畢竟我太嫩了

提及一下Windows和Linux的代碼量

Windows+底層:按G算吧,畢竟那麼多API

Linux整個內核,或者加上GNU: 不到1G

再看看人數:

微軟的維護人員非常多,但也有限

Linux,只要是有能力的用戶都可以提交問題

代碼量越大,出問題的地方可能就越多。

所以維護起來,漏洞可能就更多。

Linux內核也已經很大了。跟BSD比一下嘛。

還有開源社區的優勢:因為FreeBSD是BSD協議發布的,很自由,Apple給他們資助了,而且Apple和FreeBSD也是相互幫助

BSD系的也是互相取長補短

而Linux雖然是GPL,但都是開源,也跟BSD們有著密切的交流。

一大堆優秀的操作系統(內核)共同發展,跟一個比較封閉的內核比起來,似乎還是不可比。

Windows 2003的伺服器也可以運行得很好,openbsd甚至可以漏洞百出,關鍵看是誰在用。

上面我說的東西,似乎只能證明,不可比

畢竟NT也發展了這麼多年,用戶量非常大,漏洞似乎就更容易暴露了,但只要正常使用,一般不會有問題。懂電腦的都知道,中病毒的都是亂點的。


安全靠內核?

那麼說明物理機器本身已經不安全了(遇到一個玩命想root的本機用戶或者被本機用戶安裝的惡意應用程序)?

在這種情況下,比較是毫無意義的。如同蘋果ios總是出來沒多久就被人用0day越獄,但是以此就認為蘋果ios內核不夠安全,不免失去了安全的本意。


"風險釋緩/Mitigation"比"安全/Security"更重要...


我認為Linux內核更安全,因為其代碼開源,並被大量使用,是個白盒,理論上每個人都能進行Code Review.而Windows內核,基本只有微軟的內核維護團隊能看,是個徹頭徹尾的黑盒,有漏洞沒人曝,你還不一定知道.不說Windows內核,就說WannaCry這個利用Windows漏洞加密用戶數據索要贖金的病毒,不就是利用了Windows的一個閉源服務的漏洞(後門?)搞的事么?

不說那麼深,就說自己開發的Web程序,你開源發布出去,用的人多了,bugfix多了,軟體的質量自然就會越來越高,越來越安全,如果總是敝帚自珍,漏洞被人家利用了可能自己還不知道有這回事.


我只能通過推測回答這個問題。首先,普通PC用戶很少會優先重點考慮安全問題;其次,只有運行大型後台伺服器集群的公司才非常重視安全問題(他們配置的專業人員也最多最有實力);最後,沒有多年大型伺服器實際運作經驗的人,對於安全性問題根本沒有發言權。我的結論是:哪個內核被大型公司部署的最多,它的安全性往往會更好。因為這是許多大公司用大量真金白銀和許多業內頂級工程師多年真實運作經驗的結果,可以說是用腳投的票,也可以說是用錢投的票,也可以說用自己公司的前途投的票,我相信這是非常專業非常慎重的投票。所以,根據上面的推論,我投Linux一票。


從內核角度……如果不考慮bug的話,沒有什麼安全不安全之分啊。


根據我當年操作系統老師的話,Linux和Windows在安全層級上都是同一個級別,好象是某個權威機構認證的


說到內核安全, 就要和平時語境中的"安全"區分開來. 內核安全是內核自身的功能安全, 是十分二進位安全的概念, 它不同於 許可權控制模型, 物理安全, 桌面安全, 應用生態安全等等OS安全的其它各個方面. 內核安全的理想情況就是, 內核能完全按照開發者的設計意願運行, 任何一個模塊都不會因為特製的輸入就產生預料之外的行為, 產生安全漏洞. 但對於大型軟體系統來說, 這近乎是不可能的. 不管是Windows還是Linux, 內核漏洞(或者說bug)都不少見.

同樣的, 普通的軟體也會存在這樣的問題. 只是一個低許可權的桌面軟體產生漏洞並被利用, 它仍然只能在自己許可權所及範圍內鬧騰(所以瀏覽器要用沙箱), 但內核漏洞是沒有任何阻礙的.

如何提高內核安全性?第一, 從源頭上盡量少產生漏洞和bug. 第二, 做額外的安全加固措施, 使得內核漏洞難以被利用. 第一點是硬辦法, 但並不可控. 第二點一般稱為漏洞緩解.

漏洞緩解措施(mitagation)是真正屬於內核安全範疇的概念. Linux下的KSPP, grsec/PaX這種工作就是內核安全. 在這之上的安全模型, 傳統的unix 9bit也好, POSIX ACL也好, 還是SELinux, namespaces等等, 與內核安全是兩碼事兒, 它們都有賴於內核本身去enforce安全策略. 內核漏洞一出, 它們也不再有效力. 而Linux內核本身的安全性...內核社區的態度還是傾向於"A bug is a bug", 沒有去做很多fail-safe類的措施. Linus本人也噴grsec和OpenBSD. 這裡面也有性能和可用性的考量. 儘管安全相關的論文和patch有很多, 但進入mainline的不多. 進入mainline之後, 處於性能和兼容性原因,默認開啟的也只有一部分(4.12終於默認啟用x86 kASLR了). 好在Linux社區龐大, 大家一直在積極改進, 有各種安全加固版可以滿足你. Linux內核的攻擊面其實是很大的

Windows的情況比Linux激進一些, 尤其Windows 8到Windows 10以來. 有興趣的谷歌一下Windows 的漏洞防禦技術對比, 我就不列了. Windows的攻擊面依然比較大, 內核里還有win32k這麼個東西. 然而有意思的是Windows 10 新引入的 Virtual Security Mode, 可以看看Alex Ionescu在Black Hat上的Slides. http://www.alex-ionescu.com/blackhat2015.pdf

最後說點題外話

有人說開源所以漏洞好找, 更安全.

先不說這句話本身就前後矛盾...開源對於漏洞挖掘有用, 但不是很多人想的那麼大. 對於安全研究員來說, 系統中高層次的運作邏輯, 耦合方式才是切入點. 看源代碼能看出來的漏洞, 寫代碼, review代碼時被發現的概率也很大. 另外, 研究Windows安全的大牛白帽子也很多, 微軟的partner也可以訪問到部分源代碼. 不要一說起(安全上的)黑客就是Linux的刻板印象.

//本人目前用的是Linux


這個問題沒有絕對的答案,只能相對而言。
系統安全性,取決於用戶對這個系統的認知程度,用戶如何最大限度地利用OS提供的安全機制來保護自身的數據安全這個是關鍵。兩個系統都在進步,都提供了一些保護措施,如果你不知道如何利用,說什麼都白搭。
你覺得呢


推薦閱讀:

TAG:Microsoft Windows | 操作系統 | Linux | Linux 內核 | 操作系統內核 |