程式語言安全性排行榜:Ruby最佳,C語言漏洞最多?

weixin_33806914發表於2019-03-22

IT技術圈有一個永遠無解且有爭議性的問題,那就是“誰是最好的程式語言?”事實上,由於各種程式語言的特性、應用場景不同,它們是各有長處的,但是Whitesource另闢蹊徑,從安全性方面來衡量一下誰才是最好的程式語言?

評判方法:

我們經常會聽到這樣的聲音:“XX語言比XX語言更安全。”其實,程式語言的安全性也取決於多種因素,為了避免引起歧義,我們先來闡述一下評判方法。

本文中關於安全性的評判標準是基於Whitesource的綜合資料庫,該資料庫彙集了來自多個來源的開源漏洞資訊,如國家漏洞資料庫(NVD)、安全諮詢、Github問題跟蹤程式和流行的開源專案問題跟蹤程式。

Whitesource綜合資料庫涵蓋了200多種程式語言,在此次研究中,我們挑選了過去幾年在開源專案中最流行的其中程式語言,C、Java、JavaScript、Python、Ruby、PHP和C++。

在評判時,我們將參考這些程式語言的已知的開源安全漏洞的數量、這些漏洞隨時間的嚴重程度以及常見的CWE。

誰是最安全的程式語言?

\"image\"
從上圖中,我們可以看到在這些程式語言中,C語言的漏洞數量是最多的,佔到了過去10年報告中的所有漏洞的47%。

這也使得很多人容易根據這個結果認為C語言最不安全,但其實事實並非如此。首先,C語言是初學者最常使用的程式語言,產生漏洞的機率無疑就增加了。其次,C語言的使用時間比大多數語言都長,理所應當的會更容易受到攻擊。第三,C語言還是Open SSL和Linux核心等主要基礎架構背後的語言之一。

如果單從安全漏洞數量的維度來看,Ruby是最安全的程式語言,而C語言是最不安全的程式語言。

隨著時間的推移,每種程式語言安全漏洞的變化

\"image\"

從圖中我們可以看到,每個程式語言都有自己的安全高點和低點,但是在過去的兩年中,所有程式語言的安全漏洞都出現了大幅的增加,其背後的原因主要是開源的普及和大眾對於開源元件安全漏洞的認知提高。另外,自動化工具和對bug獎勵計劃的大量投資也促進了安全漏洞數量的大幅增加。

高嚴重性漏洞的變化情況

\"image\"
接下來,我們來重點關注一下高嚴重性的漏洞(在通用安全漏洞評估系統CVSS v2中高於7的漏洞)。

從上圖中我們可以看到,雖然2017年安全漏洞的數量激增,但是除了JavaScript和PHP之外,報告中涵蓋的大多數語言中高嚴重性漏洞的百分比都在下降。

而這得益於發現安全漏洞的自動化工具。這些工具能夠很好的發現漏洞,但是漏洞的嚴重程度並不高,這也是我們看到中等嚴重的漏洞數量增加的原因。

不同語言的不同安全漏洞(CWE)

\"image\"

為了更加嚴謹的研究各種程式語言的安全性,接下來我們要檢查每種語言中出現的漏洞型別,同時為了方便理解它們的弱點和長處,我們分析了隨著時間的推移在每種語言中發現的CWE型別。

從圖中我們可以看到站點指令碼(XSS)(也稱為CWE-79)和輸入驗證(也稱為CWE-20)是出現頻率最高的CWE。除此之外,其它出現頻率較高的CWE包括資訊洩漏/洩露(CWE-200)路徑遍歷(CWE-22)、許可權和訪問控制(CWE-264)。

當漏洞變得越來越流行時,會有解決這個問題的框架出現,同時開發人員也會對該漏洞越來越熟悉瞭解,所以,可能在可預見的未來這個漏洞就會消失。

各程式語言的安全漏洞情況

C語言

C語言是目前為止漏洞最多的語言,雖然在這十年中漏洞數量會出現上升和下降的情況,但是C語言的漏洞數量一直是遠超其它程式語言的。

C語言安全漏洞:按嚴重程度

\"image\"

C語言的漏洞數量實在逐年增加。2018年,C語言的低嚴重性漏洞發生率相對較低,只有7%。另外,C語言是唯一存在大量記憶體損壞問題的語言,而這些問題被認為是一種關鍵的脆弱性型別。

C語言安全漏洞:CWE

\"image\"

緩衝區錯誤(CWE-119)是C語言中最常見的安全漏洞,類似於C++的漏洞配置檔案。大多數的程式語言的CWE都與Web、Web服務相關,緩衝區錯誤和其他相關的CWE是不可能在管理語言中出現的。

需要注意的是,這組漏洞(有時稱為記憶體損壞)通常會產生嚴重後果。

C語言中的每個專案的安全漏洞

\"image\"
構建在C語言之上的開源專案很容易被跟蹤。從上圖中,我們可以看到,Linux漏洞幾乎總是在C語言中佔很大比例的漏洞。2016年年中,我們發現了一個臭名昭著的名為ImageCritical的漏洞,為了確保安全,安全研究人員對其進行了大量的研究,因此我們可以看到ImageCritical在2017年呈現出了異常的增長。

Java

Java安全漏洞:按嚴重程度
\"image\"
自2016年起,Java的安全漏洞就一直在不斷上升。2018年,其它程式語言的安全漏洞數量都在下降,Java是唯一一個安全漏洞在這一年增加了的程式語言,更誇張的是,2018年的Java安全漏洞相比2017年翻了一番。

從上圖中,我們可以看到Java的嚴重性安全漏洞一直維持在75%z左右,而高嚴重性安全漏洞在最近兩年增加到了20%。

Java安全漏洞:CWE

\"image\"
從上圖中我們可以看到在Java的CWE中有一個很特別的漏洞型別——反序列化問題(CWE-502),這是在所有調查的程式語言中Java所獨有的一個漏洞型別,PHP、Ruby和Python中沒有出現反序列化的問題,這到底是研究人員還沒注意到這些程式語言的反序列化問題還是序列化在其它語言中更安全呢?

JavaScript

JavaScript安全漏洞:按嚴重程度

\"image\"
JavaScript是唯一一個在過去10年中安全漏洞不斷增加的程式語言,其2017年的安全漏洞數量是2016年的16倍,而2018年安全漏洞數量又增加了50%以上。

為何JavaScript的安全漏洞會一直增長呢?研究人員表示:“主要原因可能是JavaScript作為後端語言變得越來越流行了。”

JavaScript安全漏洞:CWE

\"image\"

JavaScript有兩種常見的CWE——密碼問題(CWE-310)和路徑遍歷(CWE-22)。研究人員表示,“我們在調查NPM包時發現,61%的JavaScript安全漏洞都存在路徑遍歷和加密的問題,但是這其中70%的包都已經不再使用維護了,且2018年的下載量少於2000次。”

為什麼這兩種型別的CWE數量會這麼多呢?研究人員表示,“原因之一可能是新的自動化工具在這些幾乎沒有維護下載的包中發現了這些CWE。”

從調查結果來看,2016年發現的JavaScript安全漏洞幾乎都是密碼問題(CWE-310),而2017年發現了絕大多數的安全漏洞都是路徑遍歷問題(WEE-22)。同時,這兩種型別的安全漏洞也導致了JavaScript安全漏洞的整體上升。

JavaScript社群
\"image\"
在研究JavaScript的安全漏洞時,研究人員還發現了一個有趣的現象:超過30%的JavaScript漏洞是在社群平臺上公開的。

由於開源社群的分散性,有關安全漏洞的資訊被分散在數百個安全顧問、開源專案的問題跟蹤者和論壇中。雖然關於這些安全漏洞的資訊也可以通過各種渠道被開發者知曉,但是可信度卻無法進行衡量。

PHP

PHP安全漏洞:按嚴重程度

\"image\"
“PHP是最好的程式語言”,這是一個在技術圈廣為流傳的段子,甚至非技術人也聽過這個段子。但是最近幾年來,PHP的普及率一直在下降。2017年,PHP的安全漏洞打破了之前一直起起伏伏的趨勢,數量急劇上升。

在此次調查中,PHP的安全漏洞數量在所有被調查的程式語言中排第二。

PHP安全漏洞:CWE

\"image\"

PHP是唯一一種具有SQL隱碼攻擊(CWE-89)漏洞的語言。

很多安全專家認為SQL隱碼攻擊漏洞應該是很久遠的事情了,但是在PHP中SQL隱碼攻擊漏洞仍是很常見的安全漏洞,尤其是在2017年和2018年,SQL隱碼攻擊漏洞的數量特別高。

針對PHP安全漏洞,有人表示:“PHP語言中內建的一些設計流程和糟糕的實踐,使得開發者很難編寫安全程式碼和維護高階別的安全編碼。”

Python

Python安全漏洞:按嚴重程度

\"image\"

近幾年來,Python獲得了飛速的發展,而且其在安全配置檔案方面做得也非常不錯。大多數程式語言都是到2018年才出現了安全漏洞下降的情況,但是Python的安全漏洞自2015年達到峰值,之後就一直在下降。

且Python的高嚴重性安全漏洞的佔比也非常小。

Python安全漏洞:CWE
\"image\"

Python中主要存在4種型別的安全漏洞,輸入驗證(cwe-20)、許可權、特權和訪問控制(cwe-264)、跨站點指令碼(xss)(cwe-79)和資訊洩漏/洩漏(cwe-200)。這些安全漏洞在其它程式語言中也是非常常見的。

C++

C++安全漏洞:按嚴重程度

\"image\"

C++和C語言的安全漏洞情況差不多,由於這兩種程式語言不太適用於Web應用程式開發,因為它們的安全漏洞在其它語言中不太常見。

C++安全漏洞:CWE

\"image\"
從上圖中我們可以看到,緩衝器錯誤(CWE-119)是C++中最常見的安全漏洞,排在第二位的是輸入驗證問題(CWE-20)。

輸入驗證問題(CWE-20)是從2016年才開始增加的,而這一增長也側面表明接下來安全研究人員可能會重點關注輸入驗證問題。

Ruby

Ruby安全漏洞:按嚴重程度

\"image\"
在被調查的七種語言中,Ruby的安全漏洞最少,在過去的10年中Ruby的安全漏洞數量一直在起起伏伏。

Ruby安全漏洞:CWE

\"image\"

Ruby中最常見的安全漏洞是XSS漏洞,同時也這是其它程式語言中比較常見的安全漏洞。另外,CWE-20(輸入驗證)和CWE-200(資訊洩漏/披露)在Ruby中自2013年達到頂峰之後,之後一直就沒有什麼變化,這說明大多數的Ruby開發人員已經學會了如何處理它們。

除了PHP之外,Ruby也是唯一一種具有相對較高數量的SQL程式碼注入漏洞的語言。不過,自2015年之後,SQL隱碼攻擊就在Ruby中消失了,很可能是開發人員也掌握瞭如何避免SQL隱碼攻擊的方法。

相關文章