理解開源安全中的李納斯定律
這篇文章討論 Linux 對(duì)開源軟件安全的影響。
開源軟件的一個(gè)常被贊揚(yáng)的優(yōu)點(diǎn)是它的代碼能夠被任何人審查(安全專家通常稱之為“代碼審計(jì)”)。然而,如果你真的去問很多開源軟件用戶他們上一次檢查代碼是什么時(shí)候。你大概只能收獲他們茫然的眼神或者是喃喃的低語。此外,對(duì)于一些相當(dāng)大型的開源應(yīng)用,有效地審查每一行代碼也是困難的。
根據(jù)上述這些稍顯不安的事實(shí),我們不得不思考:如果沒有人察看這些代碼,它是開源還是閉源真的有關(guān)系嗎?
你應(yīng)該相信開源嗎?
計(jì)算機(jī)愛好者傾向于作出認(rèn)為開源軟件比其他軟件更加安全的傳統(tǒng)假設(shè)。我們通常不會(huì)討論這意味者什么:比較的基礎(chǔ)是什么(比什么“更”安全?),或者上述結(jié)論是如何得到的。這是一個(gè)危險(xiǎn)的陳述,因?yàn)樗砻髦灰銓⒁恍〇|西稱之為“開源”,它就自動(dòng)如魔法般地繼承了更高的安全性。這不是開源,事實(shí)上,這正是開源安全非常反對(duì)的。
除非你已經(jīng)親自審計(jì)并理解了軟件代碼,否則就不應(yīng)該假定一個(gè)應(yīng)用程序是安全的。一但你做到了這一點(diǎn),就可以給予它 終極信任ultimate trust。終極信任 不是對(duì)計(jì)算機(jī)而言的,而是對(duì)你本人而言的,至少在這一應(yīng)用程序被滲透攻擊之前,你信任它是因?yàn)槟氵x擇了相信它是安全的。
使用者本人是唯一可以對(duì)軟件代碼給予終極信任的人,因此任何人想要獲得這樣的享受都必須親自審查代碼。相信其他人的話是不管用的。
在你已經(jīng)親自審計(jì)并理解了軟件代碼之前,你對(duì)一個(gè)應(yīng)用程序給予的最大信任度是一個(gè)范圍,可以是從 根本不信任 到 相當(dāng)信任 之間。然而我們并沒有一個(gè)關(guān)于信任程度的標(biāo)準(zhǔn)對(duì)照表,這是一個(gè)你必須親自做出的個(gè)人選擇。如果你已經(jīng)從非常信任的人那里聽說了一款應(yīng)用程序是安全的,那么你可能會(huì)更信任這個(gè)軟件,而不是信任那些你沒有得到信任建議的東西。
然而,因?yàn)闊o法審計(jì)專有(閉源)軟件代碼,你不可能給予它 終極信任。
李納斯定律
現(xiàn)實(shí)很骨感,并不是每個(gè)人都是程序員,同時(shí)也不是每個(gè)程序員都有時(shí)間檢查數(shù)以萬計(jì)的代碼行。因此如果你沒有親自審查代碼,你就只能選擇(一定程度上)相信那些 親自 審查了代碼的人。
那么,有哪些人會(huì)審查代碼呢?
李納斯定律聲稱 只要有足夠的眼睛關(guān)注,任何漏洞都無處隱藏,然而我們并不知道多少雙眼睛是“足夠”的。請(qǐng)不要低估這一數(shù)量,應(yīng)用程序往往經(jīng)過了遠(yuǎn)超你想象數(shù)量的人員審查。原始開發(fā)人員以及后續(xù)開發(fā)人員顯然清楚他們自己寫下的代碼,不過開源軟件往往都是團(tuán)隊(duì)成果,開源時(shí)間越長,閱讀了代碼的開發(fā)人員越多。新加入的開發(fā)人員也必須回顧項(xiàng)目代碼的核心部分,因?yàn)樗麄儽仨殞W(xué)習(xí)基礎(chǔ)代碼以加入新的功能。
同時(shí),為了使開源軟件能夠在 Linux 發(fā)行版上可用,負(fù)責(zé)開源軟件打包分發(fā)的開發(fā)人員會(huì)加入多個(gè)項(xiàng)目。有時(shí)一個(gè)應(yīng)用程序可能會(huì)在不熟悉項(xiàng)目代碼的情況下打包,但是大多數(shù)時(shí)候,開源軟件打包人員都是熟悉所打包的項(xiàng)目代碼的。這不僅僅是因?yàn)樗麄儾幌朐谒麄儾恍湃蔚能浖虾灻?,還由于他們可能不得不修改代碼來使得程序能夠正確編譯。漏洞報(bào)告人員和漏洞修復(fù)人員一般也是熟悉代碼庫的,因?yàn)樗麄冃枰獓L試解決小到運(yùn)行異常,大到程序崩潰的問題。當(dāng)然,一些漏洞報(bào)告人員不是通過親自審查項(xiàng)目代碼,而是通過關(guān)注明顯未按預(yù)期工作的現(xiàn)象,無意中揭示了代碼漏洞。系統(tǒng)管理員通常都是通曉用戶依賴的重要應(yīng)用軟件的代碼的。最后,還有一些安全研究人員,他們專門深入代碼內(nèi)部以揭露潛在的漏洞。
信任與透明
很多人先入為主的認(rèn)為大型軟件的審計(jì)是基本不可能的,因?yàn)樗蓴?shù)以萬計(jì)的代碼行組成。不要被軟件運(yùn)行所需的代碼量欺騙了。我們不需要真的閱讀數(shù)以萬計(jì)的代碼行。代碼是高度結(jié)構(gòu)化的,可被利用的代碼漏洞僅僅只是其中的一行,不過它通常影響軟件的全部功能。
當(dāng)然,也有例外。有時(shí)僅僅一個(gè)系統(tǒng)調(diào)用或者鏈接一個(gè)有缺陷的庫文件就可能引入一系列漏洞。幸運(yùn)的是,多虧安全研究人員以及漏洞數(shù)據(jù)庫所扮演的積極角色,這些錯(cuò)誤相對(duì)而言是容易發(fā)現(xiàn)的。
一些人指著錯(cuò)誤追蹤系統(tǒng),比如 ??通用漏洞披露??Common Vulnerabilities and Exposures(CVE)網(wǎng)站,并推斷開源軟件顯而易見是不安全的。畢竟已經(jīng)向公眾公開了大量的安全風(fēng)險(xiǎn),涉及許多開源項(xiàng)目。但是不要被數(shù)據(jù)欺騙了。只是因?yàn)槲覀兛床坏浆F(xiàn)閉源軟件的漏洞,并不意味著閉源軟件中不存在漏洞。事實(shí)上,已經(jīng)有很多針對(duì)閉源軟件的漏洞攻擊提出了,閉源軟件也是存在漏洞的。區(qū)別在于開發(fā)者(以及用戶)可以查看開源軟件的 所有的漏洞 從而降低漏洞的影響。這是擴(kuò)大對(duì)開源軟件信任的系統(tǒng)機(jī)制的一部分,卻正是閉源軟件軟件所缺少的。
對(duì)于任何代碼而言,可能永遠(yuǎn)沒有“足夠的眼睛”來發(fā)現(xiàn)漏洞,但是開發(fā)社區(qū)越壯大、越多樣化,越有機(jī)會(huì)發(fā)現(xiàn)和修復(fù)代碼中的缺陷。
信任與人
在開源社區(qū)中,參與同一項(xiàng)目的眾多開發(fā)者已經(jīng)發(fā)現(xiàn)“不安全”的漏洞,卻保持沉默的的可能性是微乎其微的,因?yàn)槿藗兒苌偻庖赃@樣的方式合謀。我們已經(jīng)看到了在應(yīng)對(duì) COVID-19 的過程中,人類的行為是如何不一致了,在這里也一樣:
- 我們都發(fā)現(xiàn)了漏洞(病毒)。
- 我們知曉如何避免它傳播(待在家里)。
- 然而病毒還是在持續(xù)傳播,因?yàn)榭偸怯幸粋€(gè)或者多個(gè)人偏離了消減疫情的計(jì)劃。
開源軟件中的漏洞也一樣,如果有人發(fā)現(xiàn)了漏洞總會(huì)公之于眾(當(dāng)然,我們說的是“假如”能夠發(fā)現(xiàn))。
然而就專有軟件而言,有很大可能參與項(xiàng)目的眾多開發(fā)者即使注意到不安全的漏洞卻仍然保持沉默,因?yàn)閷S心J揭蕾囉谛剿?。如果一個(gè)開發(fā)者將漏洞泄漏出來,他可能只是傷害了該專有軟件的聲譽(yù),進(jìn)而降低軟件的銷售額;或者,在更糟糕的情況下,他可能因此而丟了工作。開發(fā)人員拿著薪水秘密地研究軟件,往往不會(huì)談?wù)撈淙毕荨H绻阍?jīng)是一名開發(fā)者,你可能曾經(jīng)簽署過 NDA (LCTT 譯注:保密協(xié)議Non-Disclosure Agreement),也被培訓(xùn)過商業(yè)秘密的重要性,等等不一而足。專有軟件鼓勵(lì)在面對(duì)嚴(yán)重的秘密缺陷時(shí)保持沉默,更多時(shí)候甚至是強(qiáng)制要求沉默。
信任與軟件
不要信任未經(jīng)你審計(jì)的軟件。
如果你必須相信未經(jīng)你審計(jì)的軟件,那么選擇相信已經(jīng)面向那些更有可能將軟件缺陷公之于眾的開發(fā)者公開代碼的軟件。
開源軟件并沒有比專有軟件繼承更高的安全性,但是修復(fù)它的系統(tǒng)得到了更好的規(guī)劃、實(shí)施和人員配置。