操作系統為什麼都有無數的漏洞?是故意留下的還是技術上無法達到完美?

就目前而言,幾乎所有的操作系統都有無數的漏洞。是故意留下的還是技術上無法控制?是給自己的員工方便使用嗎?還是真的達到了人類的極限,面對複雜系統沒有能力達到完美?


因為bug是一個不可計算的概念。什麼是bug,跟你腦子想的不一樣的就是bug。就算你寫出了需求文檔,需求文檔也可能跟你的意圖有差別,不同的人看這份需求文檔的理解也不一樣,文字還有起義,還有一群傻逼寫出來的代碼跟他們本來要寫的東西也不一樣,最後測試對需求文檔的理解也跟開發不一樣,於是最後就變成了屎。

如果你能把需求文檔用某種數學語言來寫,嚴格定義什麼是對,什麼是錯,不要有undefined behavior,行文自洽,而且用這種語言來寫這種語言的虛擬機,配套證明,肯定0漏洞。

然而最終你就會發現,沒有漏洞的技術可以實現的東西的集合的勢,小於C++可以實現的東西的集合的勢,於是作用為0(逃


先把概念搞清楚。如果是故意留下的,那叫後門,不叫漏洞。自己員工要超常規使用的話,用的是內部工具、非公開sdk等,犯不著用後門和漏洞。

另外,這個不是操作系統的特例,所有軟硬體都是這個情況。

我在別的帖子也回答過漏洞出現的三大原因。

1. 不小心:比如用錯變數。這個最常見。

2. 不知道:比如對一個函數或庫的使用條件和功能了解不夠,錯調用了。

3. 故意:面對一個沒法修復的bug,比如沒有源代碼的組件里的,這時候有可能你需要「製造」一個bug用法來繞開它。但需要保證這個不會影響到別的東西。

第三條,我具體親身經歷的栗子。在開發Halo3的時候,我打算用xbox 360的float tessellation,那就需要把index buffer拿來作為tessellation factor。為了速度,所有tessellation factor都是在gpu算了之後用mem export導出到index buffer。

好,這時候發現了一個api設計的bug。mem export的參數接受的是一個vertex buffer和一個內存地址。不能給它index buffer。接著我又發現了一個實現上的bug,它其實不驗證兩者是否來自同一個buffer。所以我就用了一個空的vertex buffer和一個來自index buffer的內存地址實現了這件事情。從代碼上被認為是個bug,但解釋清楚就知道是有意而為之。

後來,xbox sdk更新了,兩個bug都修好了,我也不必再那麼做。

至於為什麼在我之前沒人遇到這個問題?估計我是頭一個敢這麼用的。好幾年後才有xbox遊戲用tessellation。


我一直覺得,計算機科學與工程的發展相比於其它行業還處於非常原始的階段。大型的軟體工程,像是用火柴棍搭摩天大樓。即使耗費大量人力物力,用各種手段進行驗證與測試,也很難保證其可靠性和穩定性。發展和進步需要時間嘛。


我們要相信題主一定沒寫過錯別字


人有沒有漏洞?進化了幾萬年,還是被病毒找到漏洞攻擊。操作系統是人造的(概念),人無完人,操無完操,扯犢子模式開啟,用老毛子的思想,發展的眼光看待問題,人的自身系統和思想的不完善導致了目前的操作系統百般漏洞。比如人的懶惰,人的粗心,人的固執,人的疲勞,人的局限都會導致操作系統的不完善,個體人的種種缺點,組成的組織的各種不完善,不可避免的造成操作系統的漏洞。另一個方面,還是符合人類社會發展的歷程,對於慾望的追求,計算機誕生之際,受到硬體的局限,那時的操作系統如此簡單,也漏洞百出,卻不怎麼考慮安全,能用就行;隨著計算機和互聯網的普及和應用的增多,為了這個系統的運行的能公平公正,安全就變得越來越重要,漏洞才當做漏洞,所以漏洞是社會或者計算機發展的產物。

簡單點說,我們沒有進化到完美的高度,社會沒有到達共產社會之後的社會,漏洞只是整個進化過程中的一道亮麗的風景線。


以上多只是從技術的視角去分析這個問題,以下從多個視角去分析這件事情:

工程構建的視角分析,

  • 操作系統是要完成資源計算,存儲,管理的系統,這些需求本身具備複雜性
  • 在如此複雜度的需求下,設計一個操作系統是一件相當困難的事情
  • 設計一個低耦合,高內聚,高並發,低能耗,高可用的軟體需要絞盡腦汁
  • 操作系統軟體不是普通的軟體,是一種基礎性的,平台級的軟體,代碼量可能是百萬,千萬級
  • 如此,操作系統的寫手不可能是常人,而是人精:人精不多,找到人精不簡單

  • 這種人精具備的能力不僅僅體現在對軟體和硬體的理解上,更重要的是一種對宏觀和微觀世界的抽象和建模能力
  • 工程構建需要一個長期的過程,會有不同背景的人,進行著對前期迭代版本的不同思考,最後產出不同但基本符合要求的結果

數學邏輯的視角分析,

  • 哥德爾證明了任何一個形式系統,只要包括了簡單的初等數論描述,而且是自洽的,它必定包含某些系統內所允許的方法既不能證明真也不能證偽的命題。

  • 第一不完備性定理

任意一個包含一階謂詞邏輯與初等數論的形式系統,都存在一個命題,它在這個系統中既不能被證明也不能被否定。

  • 第二不完備性定理

如果系統S含有初等數論,當S無矛盾時,它的無矛盾性不可能在S內證明。

商業行為的視角分析,

  • 對於商業產品來說,它需要有人用,即有需求
  • 考慮到時間成本,人力成本,利益因素,事情就會變得複雜
  • 推廣,傳播,長期盈利是很重要的,操作系統是一個基礎平台軟體,寫操作系統的人必須具備持久的價值
  • 操作系統被劃歸為不同模塊,它們的目標是自身最終能夠各司其職,又相互協作,對用戶友好,對外系統上的開發人員提供商業邏輯對外提供的一個深思熟慮後的API,大型科技公司無不如此:蘋果(Mac OS ,iOS,itunes),微軟(PC,企業操作系統),甲骨文(資料庫操作系統),騰訊微信(萬能app,移動類操作系統?!),即面向不同類型用戶的community

  • 有漏洞,可以打補丁嘛,補丁可以賺錢嘛
  • 開源軟體和商用軟體其實具備微妙的內在關係

  • 伸展商業觸角,創造不同level的運維部門和售後部門,對公司是有益的,對社會創造就業也是有益的

生物科學的視角分析,

  • 操作系統的構建過程就像一個嬰兒的成長過程,從0到1,從1到99...

  • 一開始追求具備完美的能歌善舞,文武雙全的嬰兒不太可能,必須後天持續訓練他(先天缺陷的情況不談),18歲才成年吧。。
  • 操作系統有漏洞,可以使得商業生態更繁榮:有人去修補漏洞,有人去攻擊漏洞

  • 具備「生物多樣性」的系統才是健康的動態平衡的系統:軟體要為人類商業社會使用,普及多少用戶,哪種類型的用戶取決於軟體設計初衷和商業生態的設計,而商業生態問題很像一個生物多樣性的問題,比如阿里系的天貓,神馬,蝦米,。。又比如Hadoop雲生態等。

遺言:

  • 從一個高緯度空間去突破低緯度空間是妥妥的事,漏洞算個鳥 ~
  • 降維攻擊

總結

以上任何一點不具備或做出妥協或根本性衝突,漏洞必將發生。還有其它沒考慮到的的情況。

:)


你為什麼有那麼多不懂?老師故意不教?


其實每個系統發布時都可能沒有bug,只到用戶發現了一個。


是人在寫代碼,而不是神。再說就算是神也有不少bug,比如pi是個無理數。。。


只要是人寫的代碼,怎麼能沒有漏洞。何況你看看這些操作系統代碼有多老了,那時候一直遺留下來的代碼出現很多問題也很正常。

C/C++相對於JAVA之類更先進的語言而言出問題的概率要大得多。


公交系統,地鐵系統,供電系統,供水系統出點紕漏是在所難免的,好像人人都能理解。

但是操作系統的設計難度不在這些之下。


It"s not a bug, it"s a feature.


微軟本身知道漏洞,技術上【自身】實現。用來幹嘛?三戰、情報、各種資料... ...

不鳴則已,一鳴驚人!

在這之前被黑客挖掘出來 。

微軟: 開會! 加班! 修復!

後門?不不不,這本身就是漏洞~

@叛逆者 慨念這種東西由人定的 你說是嗎?

它們存在的本質都是為了獲得一定甚至所有操作許可權 這就夠了。

我是做逆向破解的 這些彎彎道道再清楚也不過了。


肯定是微軟故意留下的,他在下一盤很大的棋,第三次世界大戰原子彈神馬的弱爆了,殺傷力最強的是微軟。帝國主義亡我之心不滅。

一連串的陰謀浮出水面,,,

(深度好文,轉不轉看你,我愛國,我轉了)


系統是一條船,軟體是貨物,貨物與貨物混合會發生什麼誰也不知道。

問題的關鍵不是貨物問題,而是你設計的這條船,沒有把貨物單獨存放。

就像船的隔離倉一樣,沒有隔離倉的船,會因為一個貨物而導致沉船。

真正好的操作系統是應該與運用程序隔離的,而生產製作安全的操作系統似乎會損害某些人的利益,有權決定是否推廣安全系統的人,似乎不希望系統安全,比如某國。


操作系統是由軟體工程師完成的,所以其中的漏洞是工程層面的問題。和科學與技術不同,工程師更關心的是交付時間和可用性。事實上操作系統有漏洞只可證實而無法證偽。即便是在理論層面上,使用形式化工具也只能證明操作系統滿足給定的性質,或是在一定抽象級別上不存在某些漏洞。因此開發團隊的職責更多的是在給定的時間約束下儘可能地控制漏洞的危害,即所謂的best effort。當然系統上線後對已知bug的快速修復能力也很重要。關於這方面的理論和工程的方法論在軟體工程中有較詳盡的討論。

操作系統極高的複雜度使得部分bug的重現都相對困難,更不要說修復。另外操作系統打patch和更新的難度高於一般互聯網服務的後端系統。所以很多時候操作系統的bug看上去更難修復,也更容易被利用。

漏洞會有的,補丁也會有的,一切都會有的-只是時間問題。


達成做飯吃飯的目的:在自己家做飯吃飯很容易,做飯 吃飯ok

開個小飯館,同樣是做飯吃飯,除了做出來還要處理很多事情,例如找個合適的廚子(設計師)

開個連鎖飯館就要更多的員工,涉及安全,衛生,管理等。

開個世界型連鎖餐館就要有各個部門應付各種事情。比如如何應對客戶(黑客)故意往飯里(系統內)扔蒼蠅(植入病毒等)就是十分複雜麻煩的事。

達成一個目的很容易,防止搗亂達成目的就很難了。


正如有江湖的地方就有紛爭,有代碼的地方就有BUG。

如果沒有BUG,只是想像力不夠沒想到更多的測試輸入而已。


數學研究表明,任何一個公理系,都不能自洽。所以程序當然也不能完美。


人手寫的東西怎麼可能沒一點問題呢


推薦閱讀:

如何看待 Intel CPU 設計漏洞對雲服務廠商的影響?
從硬體上修復Meltdown與Spectre會是怎樣的思路?困難在哪裡?
為何一些人仍然認為光速不變和相對論是錯的?
『別人在你眼中是什麼樣的人,那麼你自己就是什麼樣的人』這句話存在漏洞嗎?
為什麼三大運營商至今沒有修復十幾年以來的計費漏洞?

TAG:操作系統 | 漏洞 |