## 第?7?章?病毒
**目錄**
[引言](ch07.html#id3056684)
[Windows 的缺陷](ch07s02.html)
[Unix 的健壯](ch07s03.html)
[歷史](ch07s04.html)
## 引言
這是一個非常流行的言論:
Linux 下的病毒少,是因為 Linux 的使用者少,駭客顯然不愿意浪費氣力去攻擊沒有人使用的操作系統。
您可能已經知道了,互聯網上用作重要用途的服務器,其中很大一部分是 Linux 系統,另外的一部分是 Unix 系統:) 如果駭客能夠搞掉 Linux 系統的話,那么整個互聯網就會陷于癱瘓!效果似乎更好一些。
當然了,您一定會想:駭客也是人,他們也喜歡上網,兔子還不吃窩邊草呢……兔子那么笨,連烏龜都跑不過……駭客們可比兔子要聰明的多了!它們總沒有理由讓自己無家可歸吧?
是的,我承認這一點……不過他們也不一定非得把互聯網干掉。很多駭客作夢都想入侵美國軍方的服務器,美軍服務器中的絕密數據,我想拉登大叔一定愿意以重金買下的!
如果駭客可以入侵任何一臺主機[[16](ch07.html#ftn.id3056085)],他們為什么不去入侵美軍的服務器,而要入侵您的電腦呢?
有些人又會認為:這樣的解釋不能說明什么,Linux 比 Windows 安全也許只是偶然的,或許下一個版本的 Windows 會超過 Linux。
個人傾向認為這種情況不可能出現,后面的論述基本摘自《UNIX 編程藝術》[[17](ch07.html#ftn.id3056714)]
順帶提一下,與上面的觀點相呼應,另一種論調也使人側目:Windows 服務器占到了服務器操作系統xx%的份額。
或許這個現象可以用80:20法則來解釋:
_占服務器總數80%的 Windows 提供了服務總量的20%_
請您務必注意,這只是舉一個例子,Windows 服務器可能永遠也不會占到服務器總數的80%!它提供的服務,以我個人的角度,我不認為可以達到20%,而且永遠不會有那一天。
* * *
> [[16](ch07.html#id3056085)] 我看過一篇報道,美國海軍的一個港口的指揮塔,以前用 Windows,每天不得不重啟主機N次,后來實在扛不住,轉用了 Linux。指揮塔只不過是指揮幾艘小船靠個岸,負載不大,也不是特別重要,尚且不可以用 Windows,軍方的中央服務器就更不可能了
> [[17](ch07.html#id3056714)] 這本書算是開源信仰的《福音書》,建議弄一本看看。由于這本書實在太長了,所以我就不全文摘抄了
## Windows 的缺陷
盡管支持搶先式多任務處理,但進程生成卻很昂貴——雖然比不上 VMS,但是(平均生成一個進程需要0.1秒左右)要比現在的 Unix 高出一個數量級。腳本功能薄弱,操作系統廣泛使用二進制文件格式。除了此前我們總結過的,還有這些后果:
大多數程序都不能用腳本調用。程序間依賴復雜脆弱的遠程過程調用(RPC)來通信,這是滋生 bug 的溫床。
………………
Unix 的系統配置和用戶配置數據分散存放在眾多的 dotfiles(名字以“.”開頭的文件)和系統數據文件中,而 NT 則集中存放在注冊表中。以下后果貫穿于設計中:
* 注冊表使得整個系統完全不具備正交性。應用程序的單點故障就會損毀注冊表,經常使得整個操作系統無法使用、必須重裝。
* 注冊表蠕變( registry creep ) 現象:隨著注冊表的膨脹,越來越大的存取開銷拖慢了所有程序的運行。
互聯網上的 NT 系統因易受各種蠕蟲、病毒、損毀程序以及破解(crack)的攻擊而臭名昭著。原因很多,但有一些是根本性的,最根本的就是:NT 的內部邊界漏洞太多。
NT 有訪問控制列表,可用于實現用戶權限組管理,但許多遺留代碼對此視而不見,而操作系統為了不破壞向后兼容性又允許這種現象的存在。在各個 GUI 客戶端之間的消息通訊機制也沒有安全控制,如果加上的話,也會破壞向后兼容性。
雖然 NT 將要使用 MMU,出于性能方面的考慮,NT 3.5后的版本將系統 GUI 和優先內核一起塞進了同一個地址空間。為了獲得和 Unix 相近的速度,最新版本的 NT 甚至將 Web 服務器也塞進了內核空間。
由于這些內部邊界漏洞產生的協合效應,要在 NT 上達到真正的安全實際上是不可能的。如果入侵者隨便作為什么用戶把一段代碼運行起來(例如,通過 Outlook email 宏功能),這段代碼就可以通過窗口系統向其它任何運行的應用程序發送虛假信息。只要利用緩存溢出或 GUI 及 Web 服務器的缺口就可以控制整個系統。
## Unix 的健壯
Unix 至少設立了三層內部邊界來防范惡意用戶或有缺陷的程序。一層是內存管理:Unix 用硬件自身的內存管理單元(MMU)來保證各自的進程不會侵入到其它進程的內存地址空間。第二層是為多用戶設置的真正權限組——普通用戶(非 root用戶)的進程未經允許,就不能更改或者讀取其他用戶的文件。第三層是把涉及關鍵安全性的功能限制在盡可能小的可信代碼塊上。在 Unix 中,即使是 shell(系統命令解釋器)也不是什么特權程序。
操作系統內部邊界的穩定不僅是一個設計的抽象問題,它對系統安全性有著重要的實際影響。
徹頭徹尾的反 Unix 系統,就是拋棄或回避內存管理,這樣失控的進程就可以任意摧毀、攪亂或破壞掉其它正在運行的程序;弱化甚至不設置權限組,這樣用戶就可以輕而易舉地修改他人的文件和系統的關鍵數據(例如,掌控了 Word 程序的宏病毒可以格式化硬盤);依賴大量的代碼,如整個 shell 和 GUI,這樣任何代碼的 bug 或對代碼的成功攻擊都可以威脅到整個系統。
## 歷史
大部分1980年前的 Unix 競爭者都被拴到單個硬件平臺上,隨著這個硬件的消亡而消亡。為什么 VMS 可以堅持這么久?值得我們作為案例研究一個原因是:VMS 成功地從最初的 VAX 硬件移植到了 Alpha 處理器(2003年正從 Alpha 移植到 Itanium 上)。MacOS 也在1980年代后期成功完成了從摩托羅拉68000到 PowerPC 芯片的遷躍。微軟的 Windows 處在計算機商品化將通用計算機市場扁平化到單一 PC 文化的時期,真是生逢其時。
自1980年起,對于那些要么被 Unix 壓倒要么已經先 Unix 而去的其它系統,不斷重現的另一個特有弱點是:不具備良好的網絡支持能力。
在一個網絡無處不在的世界,即使為單個用戶設計的系統也需要多用戶能力(多種權限組)——因為如果不具備這一點,任何可能欺騙用戶運行惡意代碼的網絡事務都將顛覆整個系統(Windows 宏病毒只是冰山一角)。如果不具備強大的多任務處理能力,操作系統同時處理網絡傳輸和運行用戶程序的能力將被削弱。操作系統還需要高效的 IPC,這樣網絡程序彼此能夠通信,并且能夠與用戶的前臺應用程序通信。
Windows 在這些領域具有嚴重缺陷卻逃脫了懲罰,這僅僅因為它們在連網變得真正重要以前就形成了壟斷地位,并擁有一群已經對機器經常崩潰和無數安全漏洞習以為常的用戶。微軟的這種地位并不穩定,Linux 陣營正是利用這一點成功地(于2003年)在服務器操作系統市場取得了重大突破。
在個人機剛剛進入全盛時期的1980年左右,操作系統設計者認為 Unix 和其它傳統的分時系統笨重、麻煩、不適合單用戶個人機這個美麗新世界,而棄之不理 ——根本不顧 GUI 接口往往要求改造多任務處理能力,來適應不同窗口及其部件的綁定執行線程的事實。青睞客戶端操作系統的趨勢非常強烈,服務器操作系統就像已經逝去的蒸汽機時代的遺物一樣遭到冷落。
但是,正如 BeOS 設計者們所注意到的那樣,如果不實現某些近似通用分時系統的東西,就無法滿足普遍聯網的要求。單用戶客戶端操作系統在互聯網世界里不可能繁榮。
這個問題促使客戶端操作系統和服務器操作系統重新匯到了一起。首先,互聯網時代之前的1980年代晚期,人們首次嘗試通過局域網進行點對點聯網,這種嘗試暴露了客戶端操作系統設計模式的不足:網絡中的數據必須放到集合點上才能實現共享,因此如果沒有服務器就做不到這一點。同時,人們對 Macintosh 和 Windows 客戶端操作系統的體驗也抬高了客戶所能容忍的最低用戶體驗質量的門檻。
到了1990年,隨著非 Unix 分時系統模型的實際消亡,客戶端操作系統設計者還是拿不出來多少可能解決這一挑戰的方案。他們可以吸收 Unix(如 MacOS X 所做的),或通過一次一個補丁重復發明一些大致等價的功能(如 Windows),或試圖重新發明整個世界(如 BeOS,但失敗了)。但與此同時,各種開源 Unix 的類客戶端能力不斷增強,開始能夠使用 GUI 并能在廉價的個人機上運行。
然而,這些壓力在兩類操作系統上并未達到上面描述所意味的那種對稱。將服務器操作系統特性,如多用戶優先權組和完全多任務處理,改裝到客戶端操作系統上非常困難,很可能打破對舊版本客戶端的兼容性,而且通常做出的系統既脆弱又令人不滿意,不穩定也不安全。另一方面,將 GUI 應用于服務器操作系統,所出現的問題卻大部分可通過靈活處理和投入更廉價硬件資源得到解決。就像造房子一樣,在堅實的地基上修理上層建筑當然要比更換地基而不破壞上層建筑來得容易。
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?I.?氣候
- 第?1?章?GUI? CLI?
- 第?2?章?UNIX 縮寫風格
- 第?3?章?版本號的迷霧
- 第?4?章???Vim 還是 Emacs
- 第?5?章???DocBook 還是 TeX
- 第?6?章?完全用 Gnu/Linux 工作
- 第?7?章?病毒
- 第?8?章?磁盤 分區
- 第?9?章?文件系統
- 第?10?章???發行版介紹
- 第?11?章???編程語言
- 第?12?章?無根的根:無名師的 Unix 心傳
- 部分?II.?地理
- 第?13?章?基礎知識
- 第?14?章?命令系統
- 第?15?章?基本系統
- 第?16?章?軟件管理
- 第?17?章?核心工具集
- 第?18?章?編譯工具鏈
- 第?19?章?圖形界面
- 第?20?章?國際化
- 第?21?章???內核
- 第?22?章?Grub
- 第?23?章?服務器
- 第?24?章?Vim 編輯器
- 第?25?章?Emacs 入門
- 第?26?章?正則表達式
- 第?27?章?docbook 指南
- 第?28?章?Git 版本控制系統
- 第?29?章?ConTeXt 入門指南
- 部分?III.?景觀
- 第?30?章?終極 Shell -- ZSH
- 第?31?章?完美工作站 Archlinux
- 第?32?章?組織你的意念:Emacs org mode
- 第?33?章???Zsh+screen
- 第?34?章???gentoo stage3
- 第?35?章???硬件問題
- 第?36?章???網絡設置
- 第?37?章???自制 LiveCD
- 第?38?章?awesome
- 第?39?章?openbox 工作環境
- 第?40?章???Emacs muse
- 第?41?章???寫作工具鏈
- 第?42?章?使用 lftp
- 第?43?章???Firefox 使用技巧
- 第?44?章???FVWM
- 部分?IV.?地質
- 第?45?章?Unix
- 第?46?章???Gnu
- 第?47?章?軟件業自由之神——Richard Stallman
- 第?48?章?Linux
- 第?49?章?GNOME與KDE的戰爭
- 第?50?章???Vim Emacs
- 第?51?章???年代紀
- 第?52?章?我的選擇
- 第?53?章???補遺