調查概覽
作為歐洲最大的黑客協會,混沌計算機俱樂部為研究該領域流行的編程語言提供了良好的基礎。為此,我們于 2021 年 5 月向俱樂部會員發送了在線問卷鏈接。根據結果,受訪者主要使用 Shell 和 Python/ target=_blank class=infotextkey>Python 進行黑客攻擊。調查的另一個重要發現是他們的語言偏好隨時間發生了變化。總的來說,參與者并不認為編程語言的選擇對于黑客攻擊來說是必不可少的。由于它僅針對 CCC 成員,因此調查結果也可能存在偏見。本文的目標是通過分析 Exploit-DB 來驗證關鍵結果。
關于漏洞利用數據庫
在 CCC 調查開展的同一年,一個所謂的零日漏洞引起了廣泛關注。當時,流行的日志記錄框架 Log4j 存在嚴重漏洞。利用此類安全漏洞的腳本稱為漏洞利用。顧名思義,Exploit Database 提供了一個公開的漏洞利用檔案和相應的易受攻擊的軟件。該平臺的目標受眾是滲透測試人員和安全研究人員。用戶可以通過其網站或 Kali linux 下可用的工具集訪問該數據庫。
在撰寫本文時,來自 9,000 多名作者的 45,000 多個漏洞已在 Exploit-DB(來源)中發布。數據庫條目由不同的屬性組成,例如漏洞 ID、作者、類型和發布日期。每條記錄都與一個文件相關,該文件包含漏洞利用的實際腳本或程序。在Kali下,我們通過執行shell命令exploitdb找到數據庫的根目錄。除其他外,該目錄包含一個帶有 Exploit-DB 快照的 CSV 文件 (files_exploits.csv),以及帶有實際腳本或程序的子目錄 (exploits/)。
本文中描述的比較是在 2023 年 1 月 13 日使用 2022 年 11 月 22 日的數據庫快照準備的。快照和分析的源代碼都可以在 Github 上找到。
設置和數據轉換
為了設置分析環境,第一步是克隆 GitHub 項目。所有需要的文件都存放在它的根目錄exploits中。該實現基于 Anaconda Python 發行版,該發行版必須預裝在客戶端計算機上。可以在項目根目錄下執行以下命令創建并激活conda環境:
conda env create -f environment.yml
conda activate exploits
要分析的數據庫快照作為 CSV 文件存儲在數據文件夾中。它是從 Kali Linux 中檢索到的,并使用腳本 execute_transformer 進行了轉換。轉換時間和快照時間都記錄在文件時間戳中。如果需要,可以通過在 Kali shell 中運行以下命令來更新快照:
cp -p /usr/share/exploitdb/files_exploits.csv data/
python execute_transformer.py
轉換腳本提供整理數據和派生附加字段的功能。一項主要任務是提取有關所用編程語言的信息。為此,應用了庫 Pygments。雖然它的主要目的是語法高亮顯示,但該框架提供了猜測特定文件的編程語言的功能。
除了 Pygments,還有其他語言檢測庫。本文測試的一個示例是深度學習解決方案 Guesslang。然而,將其集成到 conda 環境中有些困難,處理時間遠遠超過 Pygments。由于 Guesslang 沒有產生優越的結果,因此采用了后一種框架。以下函數將 Pygments 包含到數據轉換腳本中:
import pygments
from pygments.lexers import guess_lexer_for_filename
def _parse_exploit_file(file_name):
with open(file_name, encoding="UTF-8") as file:
lines = file.readlines()
text = "n".join(lines)
line_count = len(lines)
try:
lang_guessed = guess_lexer_for_filename(file_name, text).name
except pygments.util.ClassNotFound:
lang_guessed = None
return line_count, lang_guessed
上面的 Python 代碼讀取特定文件,計算其行數并使用函數 guess_lexer_for_filename 來檢測編程語言。為實現這一點,該框架應用了各種詞法分析器,即用于語法分析的類。僅考慮分配給給定文件擴展名的那些詞法分析器。有些后綴只存在一類,而其他的選擇是不明確的。例如,擴展名“py”顯然指定給 Python,而后綴“pl”可以指向 Perl 或 Prolog。最匹配的 Lexer 作為結果返回。它的名字揭示了編程語言并建立了分析的基礎。下一節中討論的發現來自筆記本比較。此外,GitHub 項目提供了進一步的筆記本來探索 Exploit-DB 的特定方面。
結果討論
CCC 調查的核心問題是參與者在研究前一年使用了哪些編程語言。受訪者可以選擇多個答案選項。圖 2 將 CCC 成員提到的前十種語言與 Exploit-DB 作者使用的語言進行了比較。該圖表揭示了相似之處,但也有不同之處。
首先,樣本量存在重大差距。總共有 48 名 CCC 成員參與了調查。相比之下,2020/21 年間,900 多位獨立作者在 Exploit-DB 中發布了 2,500 多個文件。之所以選擇這兩年,是因為它們與比較研究的研究時期相吻合。為了避免重復,Exploit-DB 中的每個作者語言組合只計算一次。在研究期間,這導致了 1,134 種語言引用,其中 1,116 種是前十名的一部分。另一方面,CCC 調查的參與者將他們的前十種語言命名為 140 次。
CCC成員主要使用Shell(Bash/Shell/PowerShell)和Python,其次是C、JAVAScript、html/css。所有這些技術也出現在 Exploit-DB 中。一般來說,語言選擇有很大的重疊。十分之六的技術出現在圖 2 的兩個列表中。Python 一直排名第二,顯示了它在網絡安全領域的受歡迎程度。然而,圖表一側的某些語言并未出現在另一側。
一個主要區別是 Exploit-DB 中語言的不平衡分布。超過一半的提交是文本文件。在這里,Pygments 指定的名稱“Text only”具有誤導性。Exploit-DB 中的文本文件通常包含描述,但通常也包含 shell 命令和可能的其他語言腳本。因此,某些技術在結果中的代表性可能不足。抽查表明,這可能適用于 shell 腳本,在 CCC 研究中排名第一。這是我們方法的局限性。Pygments 等框架在評估多語言文件時存在問題。克服這個問題將是后續研究的一個有趣主題。
讓我們離開 2020/21 年,看看整個 Exploit-DB 歷史。圖 3 顯示了數據庫中所有時間排名前十的語言。如上所述,語言檢測依賴于 Pygments,每個作者-語言組合只計算一次。
根據圖 3,Exploit-DB 中有史以來排名前十的語言以 Text 居首,其次是 Python、C、HTML 和 Perl。同樣,與 CCC 成員的選擇有相當大的交集。當然,令人驚訝的是 Prolog 出現在列表的后半部分。可能的原因是擴展名為“pl”的文件分類錯誤。無論如何,Perl 相對較高的排名是值得注意的,因為該語言根本沒有出現在圖 2 中。這與 CCC 調查的另一個發現相吻合。在這項研究中,大多數參與者 (77.5%) 報告說他們的語言偏好隨時間發生了變化。為了評估這一點,我們可以看一下圖 4。該圖表直觀地顯示了在此分析之前的 25 年中 Exploit-DB 中排名前十的語言的百分比份額。每個作者語言組合每年計算一次。結果,我們在研究期間從 9,592 位獨立作者那里找到了 16,422 條語言參考。
圖 4 顯示 Exploit-DB 中文本文件的百分比保持相當穩定。選擇 25 年的時間范圍是因為在此期間之前的提交數量相對較少。除了持續使用文本之外,圖 4 顯示了對其他語言的首選項的變化。最明顯的是在數據庫中從 C 轉向 Python。CCC 研究中也提到了一個可能的原因。參與者報告說,他們并不認為編程語言的選擇對黑客攻擊至關重要。因此,越來越多地使用 Python 可以簡單地反映出它近年來普遍流行。因此,隨著技術的發展,語言偏好在未來應該會繼續改變。例如,引入 Rust 作為 Linux 內核開發的第二語言可能會引發這種轉變。這一預測是否屬實,將在未來幾年見分曉。
結論
總之,本文中的比較揭示了 CCC 成員和 Exploit-DB 作者使用的語言之間存在大量重疊。這兩個數據集都證實了 Python 在網絡安全領域的流行程度。此外,每個數據集都表明語言偏好隨時間的變化。CCC 研究制定了一個可能的原因。參與者并不認為編程語言的選擇對于黑客攻擊至關重要。按照這一解釋,人們應該期望語言偏好會隨著技術進步而繼續變化。Exploit-DB 分析的一個主要限制與語言檢測方法有關。由于多語言文件的問題,某些技術可能未得到充分體現。解決這個問題將是后續研究的一個有趣話題。顯然,Exploit-DB 為數據科學家和安全專家提供了豐富的數據集。關于黑客滲透的藝術還有很多東西需要學習。