在考慮操作系統的繼承安全性的時候,有一個常常被忽略了的問題(這到符合微軟的口味):如果你為Windows平台編程,那麼你的軟件就只能夠在有限的操作系統、版本和補丁層上運行。
而UNIX和Linux則相反,它們包括很多開放源代碼、商業,以及政府開發的版本,而且應用程序常常跨很多不同平台自由發布,而這些平台都有相當不同的安全特性。 由於有些讀者只在Windows上工作,所以這裡要介紹一下*nix。UNIX和Linux的劃分在於其內核以及用戶空間上。大多數程序都可以在用戶空間裡的內核之上運行。剛剛接觸Linux的程序員,尤其是有經驗的UNIX開發人員,有時候無法意識Linux並不只是是免費版本的UNIX;事實上,兩者的確存在一些很大的不同之處。從安全的角度講,大多數版本Linux都非常相似,因為它們都基於相同的內核和C庫。一個顯著的不同之處是,Linux對按需動態加載內核模塊提供了專門的支持。 除了UNIX和Linux以上的不同之處,不同版本的UNIX之間也存在很大的安全差別。對於轉到UNIX的Linux開發人員來說,這些差別不太明顯,但是很重要。例如,有些和UNIX類似的操作系統會進行強制的訪問控制,而有的則不會。 還有一個緊密相關的平台:Free Software HURD宏內核的*nix,它有自己的安全特性。 有些UNIX平台,其中最顯著的是OpenBSD,在進行缺省安裝的時候本身就要比其它的操作系統更加安全;如果為它們所寫的應用程序還會運行在其他一些版本的UNIX系統上,那麼這些應用程序仍然需要實現它們自己的安全特性,並遵照一些好的編程慣例。 對於開發人員而言,理解線程和進程是尤其重要的。在UNIX的變體裡,線程常常會被單獨處理,而執行則由系統來計劃安排。而在Linux裡,進程和線程事實上沒有區別。在UNIX裡,同一個進程裡的線程會共享內存,但是Linux的進程會創建另外的進程,並能夠定義哪些資源可以被共享,而哪些不能。Linux的開發人員常常會用到“任務(task)”這個詞,而他們事實上是在談論進程。為了以最安全的方式讓應用程序能夠被移植,開發人員應該堅持使用標准的線程庫。 特別的,如果你希望應用程序能夠被移植,那麼就要使用“fork”調用來創建新的進程。要注意,如果可能的話要堅持使用fork,這一點很重要。不要使用“vfork”,它是由BSD開發的一個優化版本的fork(因此被廣泛使用),而且出於兼容性的考慮,也被引入了Linux。其原因很簡單:vfork會讓子進程共享(或者更准確地說,接管)父進程的內存和控件,這會導致子進程和父進程之間的相互沖突。在有些版本的Linux裡,vfork在特定情況下會被黑客攻破。 盡管Windows有這樣或者那樣明顯的和著名的問題,從某種角度上講,微軟的開發人員實現編程安全要相對容易一些,因為他們所工作平台的多樣性受到了限制。 UNIX和Linux的開發人員,尤其是跨平台的開發人員,可能對安全具有特別的敏感性,因為它們的操作系統可能在缺省的條件下就更加安全;但是,不同版本的UNIX之間在安全上有很多的不同,其差別甚至要比UNIX和Linux之間的還要大。它們之間眾多的相同特性常常掩蓋掉了這些差別,而可移植性的因素則加劇了這些差別。沒有哪個Windows下的C或者VBASIC程序員,會認為他的或者她的應用程序會一成不變的只運行在UNIX平台上,或者相反;但是在UNIX/Linux社區內部,要記住,由於應用程序可能會運行在不同的平台上,所以它可能無法運行在相同的安全級別上,這一點很重要。 更多內容請看Linux安全 Linux安全 Linux安全專題,或