張慕榕,張 尼,許鳳凱,崔 軻,魏利卓,鄒志博
(華北計算機系統工程研究所,北京 100083)
隨著信息化、工業化的發展,科技不斷推陳出新,信息系統在人們生活中的應用越來越普遍,其中的組件功能也愈加豐富,配置愈加復雜。例如MySQL服務器的每個軟件含有至少200個配置項,要想在紛繁復雜的配置項中找到正確的配置方式是一件非常耗費人力物力的事情。有研究表明,錯誤的配置不僅有可能導致系統癱瘓致使企業的業務中斷,還會花費大量資源和財力來排除可能的故障。
安全配置錯誤可以發生在一個應用程序堆棧的任何層面,包括平臺、Web服務器、應用服務器、數據庫、框架和自定義代碼。從黑客攻擊的角度,安全配置錯誤往往是安全攻擊的第一個環節(或者可以理解為跳過信息搜集環節),在捕獲此類安全問題后,往往可以獲取較高權限,黑客可以修改配置、提升權限、爆破口令或者連接內部服務器或數據庫,安全配置錯誤威脅甚至等于或高于“后門”安全威脅。從安全防護角度,傳統的安全配置錯誤防護成本極高,比如至少要開展如下工作:自動化安裝部署開發環境,及時更新IT環境安全補丁,使用高安全性應用架構,開展定期或不定期的漏洞掃描和安全審計。
隨著Google提出的圖結構數據[1]——知識圖譜的發展,人們開始借助其可視化等優點展開研究。通過圖結構中的關聯特性來連接知識與數據,在海量的知識庫中挖掘并處理問題。本文主要基于知識圖譜在軟件配置漏洞方向展開分析與研究。
知識圖譜是Google在2012年提出的[2],它的第一個特點即它是一種由節點和邊組成的多邊關系圖,類似于一種語義網絡,其中包含了實體與實體之間的關系。知識圖譜從多源數據中抽取出實體,實體間的關系,實體的屬性、概念等,它可以劃分為通用知識圖譜(General-purpose Knowledge Graph,GKG)和專業領域知識圖譜(Domain-specific Knowledge Graph,DKG)。通用知識圖譜包含的范圍很廣,有著豐富且龐大的知識體量。而專業領域知識圖譜則更加專一化,側重于該專業知識的深度擴充,在檢索方面,專業領域知識圖譜的準確性要高于通用知識圖譜。目前常見的通用知識庫有Wikidata[3]、DBpedia[4]和Zhishi.me[5]等。除了語義網絡這個特點之外,它還有龐大的知識體量支撐,在2012年發布之初,Google知識圖譜就具有5億多的實體。然而,知識圖譜的特殊之處不僅僅體現在具有龐大的知識庫作為背景,它更能夠挖掘海量數據中更深一層次的關系,通過數據間的關聯關系為研究分析提供幫助。
知識圖譜的數據來源往往有兩類:網頁數據和數據庫[6]。數據庫中多體現為結構化數據,網頁上的則是非結構數據和半結構數據,還需要通過語義抽取等方式來提取實體及其關系,并映射到領域本體以形成知識圖譜。而知識圖譜的存儲也主要有兩種方式,分別是RDF存儲和圖數據庫存儲。RDF存儲即將數據以三元組(Subject,Predicate,Object)的形式進行存儲[7],而常見的圖數據庫存儲使用Neo4j進行存儲[8-10]。兩種存儲方式各有其優點與不足,RDF方式的查詢、鏈接等效率要高于Neo4j等圖數據庫,而圖數據庫的方式更適合進行存儲與查詢,還能支持圖挖掘算法。考慮到用途,本文使用Neo4j圖數據庫來存儲安全配置漏洞知識圖譜。
知識圖譜在網絡安全領域主要涉及網絡安全本體設計和信息抽取。在該系統框架的設計過程中,需要建立安全配置知識圖譜,并將收集到的多源數據融合到高級知識圖譜中。
軟件配置漏洞產生的原因往往是操作人員配置不當,不同的組件不同的配置需求會耗費大量的精力和資源來分析調整配置,尤其是在開發和運維的階段。本文所提出的基于知識圖譜的軟件配置漏洞分析系統,結合了知識圖譜的可視化功能,并通過圖結構對軟件配置項等數據進行關聯處理,幫助操作人員分析配置,節約了人力物力,可高效達成安全配置的目的。本文將軟件配置漏洞知識圖譜的構建主要分為以下三個方面:漏洞數據預處理、漏洞知識融合和配置漏洞知識圖譜構建。框架如圖1所示。

圖1 配置漏洞知識圖譜構建流程
配置漏洞數據處理模塊將獲取到的與配置漏洞相關的半結構化數據或非結構化數據通過實體抽取、關系抽取和屬性抽取等知識抽取功能,得到結構化的數據。配置漏洞知識融合模塊則通過專業領域的知識數據庫來獲取結構化數據,然后將處理后的非結構化數據和直接獲取的結構化數據進行知識融合。最后在配置漏洞知識圖譜構建模塊通過節點和關系的創建來搭建配置漏洞知識圖譜,然后進行數據的可視化邏輯展示。
本研究采取的構建知識圖譜的方法主要有以下三個步驟:知識庫構建、知識融合以及圖譜構建。
知識圖譜依靠龐大的知識庫存在,所以知識的獲取對于知識圖譜的搭建至關重要。目前有兩種途徑可以收集安全漏洞數據,其一是自動進行漏洞收集,它的原理在于通過腳本利用網站插件等工具收集一些開源或專業網站的漏洞信息,然后將其進行信息抽取轉化為結構化數據;其二則是需要專業人員手動進行漏洞收集。
3.1.1 信息抽取方式
信息抽取是知識圖譜構建的第一步,在目前的研究方法中,信息抽取的方式主要有兩種。
第一種主要基于規則提取[11],這類知識來源于知識數據庫,數據庫中的知識通常是結構化的數據,便于提取,并且精確度高,這類數據是專業領域知識圖譜中知識的主要來源,但是它的缺點是覆蓋面小,且需要領域相關的專業人士參與。
第二種則需要基于機器學習的方法[12],這類知識通常來源于網頁數據等。機器學習的方法需要大量訓練數據,基于訓練數據得到訓練模型,通過訓練出來的模型來提取所需要的知識。通過大量的訓練數據建模,從而從非結構化的文本中提取到所需要的相關信息,所以這類方法更加適用于通用領域的知識圖譜構建。
針對非結構化的開源配置漏洞知識,大部分通過文章形式來描述問題,所以需要先用自然語言處理生成句子圖,再通過知識抽取的方式從中提取出實體、關系和屬性,最后轉化為結構化數據。
知識抽取可以大致分為三個部分:實體抽取、屬性抽取和關系抽取。實體抽取也叫命名實體識別,早期主要依靠大量人力物力以基于規則的方法抽取,更適用于領域知識圖譜。后來發展了基于機器學習的方法,常見的是通過長短期記憶網絡(Long Short Team Memory Network,LSTM)來實現從原始語料庫中自動抽取命名實體[13-15]。屬性抽取則是抽取實體的屬性,屬性使得實體的抽象形象更加飽滿,可以將其轉化為關系抽取問題。關系抽取則是利用學科方法來抽取實體之間的語義關系,包括了詞性標注、句法分析以及命名實體識別等多個步驟。
3.1.2 安全漏洞知識庫體系結構
圖2描述了安全漏洞知識庫體系的結構,這個結構主要包含了三部分內容:數據的來源,數據的處理——信息抽取,以及本體的結構描述和知識圖譜的輪廓。數據的來源有結構化數據和非結構化數據,可以通過上一小節中的信息抽取方式來獲取相應數據庫中的數據,抽取的主要信息即為本體所需要的內容。

圖2 安全漏洞知識庫體系
3.2.1 結構化數據
CVE和CNNVD中的漏洞信息是漏洞數據庫中結構化數據的主要來源。CVE中的漏洞信息主要包括以下字段:漏洞名稱、網址、avd編號、危害等級、CVE編號、漏洞類型、發布時間、攻擊路徑、CVSS評分、廠商、漏洞簡介、漏洞公告、參考網址、受影響實體、補丁、相關組件、信息來源、CWE編號、攻擊復雜度、權限要求、影響范圍等,而CNNVD中的漏洞信息主要字段有:漏洞名稱、網址、CNNVD編號、危害等級、CVE編號、漏洞類型、發布時間、威脅類型、更新時間、廠商、漏洞簡介、漏洞公告、參考網址、受影響實體、補丁等。
這些主要字段詳細記錄了漏洞自身的信息,同時也記錄了相關的產品和事件以及解決辦法等。在抽取信息的過程中需要將這些信息提取出來,抽取出其中的重點部分,并將其形成節點,以搭建知識圖譜。
收集到的數據經過清洗整理以及去除冗余和錯誤的信息之后,可以通過一致性描述語言來表示。表1展示了漏洞節點,表2展示了組件節點,表3展示了攻擊節點的部分信息。通過其中共有的屬性,如CVE-ID、組件名稱、CWE-ID等可以建立三類節點間的關聯關系。

表1 CVE-2021-20334漏洞節點

表2 mongodb組件節點

表3 CWE-269攻擊節點
3.2.2 知識融合
(1)知識融合
通過信息抽取時在非結構化和半結構化等數據中獲取的結果,以及在實體抽取和關系抽取后,可以獲得實體單元,其中大多較為統一。然而其中還可能會存在與之前知識有所重復或沖突的冗余信息,且該類信息部分存在關系層次不明確的問題或結果呈扁平化,尚未建立關系,對構建圖譜具有一定的影響,因此需要對這些結果進行融合加工。知識融合可以剔除冗余的、不正確的概念,并為概念消歧,從而提升獲取的信息的質量。知識融合通常分為兩步:實體鏈接和知識合并。實體鏈接即將抽取出的實體對象鏈接到知識庫中的正確的實體對象[12]。
本系統的數據來源為專業領域的數據庫,所以實體存在歧義的現象較少,但由于來源的數據庫不同,因此存在實體對齊和屬性融合的問題。數據實體和屬性來自于阿里云的CVE庫和CNNVD之間交叉互補信息,由于規范不同,故同一漏洞實體字段信息存在一定差異,在知識圖譜構建中可能產生歧義,造成系統一定開銷,因此需要將兩個漏洞庫之間的信息進行對齊,統一為本文所構建本體規范的實體和屬性字段。以阿里云的CVE庫和CNNVD庫中編號為CVE-2020-14828的漏洞為例,如圖3漏洞知識融合圖所示,這兩個漏洞屬于同一實體,將CVE編號統一規范為“CVE-ID”;阿里云的CVE中的屬性字段“漏洞描述”對應CNNVD中的“漏洞簡介”,統一規范為“漏洞描述”;阿里云的CVE中的屬性字段“披露時間”對應的是CNNVD中“發布時間”,表示的是漏洞的發布時間,統一規范為“發布時間”。實體對齊能夠使信息更加規范、準確,有效地減少系統的開銷。相同的CVE漏洞,在CNNVD中部分屬性字段缺乏,但在阿里云的CVE中能夠有效互補,如受影響實體、CVSS得分等,兩者交叉互補使得信息更加豐富全面。通過知識融合有效解決了部分字段不匹配問題,建立起異構本體和實例之間的關聯關系,實現實體之間的互聯互通[11]。

圖3 配置漏洞知識融合
(2)知識推理
在知識庫的實體關系數據的基礎上,經過分析推理,建立實體間新的關聯操作就是知識推理。知識推理能夠通過從已有的知識關系中分析得到新的知識,從而豐富知識網絡。知識推理可以大致分為三種類型:基于傳統規則的推理,基于分布式特征表示的推理和基于深度學習的推理[12]。
3.2.3 數據存儲
本文選取了Neo4j圖數據庫來存儲安全配置漏洞分析圖譜,Neo4j圖數據庫目前被廣泛用于知識圖譜的可視化存儲,它查詢高效,穩定性高,接口豐富且容易擴展功能。Neo4j有許多方法實現數據的存儲,常見的有:(1)通過Cypher的create語句,比如“create(n:Label)”;(2)Cypher中的load csv方式;(3)Neo4j官 方 提 供 的neo4j-import工 具;(4)Neo4j官方提供的Java API Batch Inserter;(5)batch-import工具等。其中官方提供的neo4j-import和Batch Inserter僅支持初始化導入,在導入數據的時候必須脫機,停止Neo4j數據庫。但由于neo4j-import占用資源少,導入速度快,而Batch Inserter僅支持在Java環境中使用,因此在初次導入數據時,宜選用neo4jimport方式,達到高效快速批量導入數據的目的。在后續進行增量更新的時候,使用Python提供的py2neo庫對數據進行進一步的存儲。
本文提出的基于知識圖譜的安全配置漏洞分析方法首先從阿里云的漏洞庫中提取出CVE漏洞的原始漏洞信息,然后從CNNVD中提取全部的177715條安全漏洞,一并形成漏洞節點。此外對提取出的漏洞原始信息進行半自動化分析,提取出設計的產品及其CVE-ID,形成組件節點,將各類節點及其節點間的信息注入關聯分析引擎,對漏洞與組件的關聯關系進行梳理。
經過知識融合得到完整的、結構化的配置漏洞知識數據集,可方便后續進行圖譜構建。圖譜構建選擇Neo4j圖形數據庫,Neo4j提供了大規模可擴展功能,在一臺機器上可以處理數十億節點/關系/屬性的圖,同時可擴展到多臺機器并行運行[9]。圖譜構建分為節點創建和關系創建兩方面。
3.3.1 知識抽取
根據3.1.2小節中安全漏洞知識庫體系結構所需的節點及其知識,對漏洞數據庫依次進行信息抽取,并將其整合到csv格式文件中。
3.3.2 節點及關系創建
通過對實體進行分析,構建漏洞節點,節點包括了漏洞CVE編號、漏洞描述、發布時間等漏洞自身的屬性,圖4所示為cveNode.csv文件。

圖4 cveNode.csv文件結構
由于CVE漏洞節點個數較多,因此采用了neo4jimport方式將其導入Neo4j中,首先需要編寫腳本將數據存儲到csv文件中,通過命令行輸入指令如“neo4j-admin import--database=neo4j-nodes=cve="importcveNode.csv"”,即可將CVE漏洞節點上傳到名為Neo4j的數據庫中。
在節點創建的同時,將關系設計好存入csv文件,并與節點文件一同上傳。由于neo4j-import要求目標數據庫必須為空時才可以導入數據,因此可以在csv文件中通過表頭的“:START_ID,:TYPE,:END_ID”來創建節點與節點之間的關系文件,每行至少三列,分別為頭節點、關系以及尾節點,也可以增加節點的標簽列使得節點更加完善,如圖5所示。最后創建的配置漏洞分析圖譜如圖6所示。

圖5 AttackVector.csv文件結構
本文通過Neo4j知識圖譜的可視化,使用cypher查詢語句來展現某個節點及其關聯的節點和邊之間的關聯關系。如圖7所示,所有CVE節點看似是孤立存在的,但其實都存在關聯關系。
由于節點數據量過大,因此無法全面地展示所有CVE節點及其關聯關系。本文只截取部分節點示意圖用作展示。圖8是廠商Huawei制造的部分云服務產品版本,展示了廠商節點和受影響實體之間的關系,通過“制造商”將產品實體與其廠商相關聯。

圖8 廠商Huawei及其部分產品
通過分析圖譜可以看到,一個廠商可能有多種產品,一個產品可能會被一個或多個漏洞影響,圖9展示了部分Huawei受到影響的產品名稱以及具體CVE漏洞信息。漏洞信息包含了部分漏洞的屬性,如CVE編號、漏洞名稱、發布時間、漏洞描述等信息。圖中展示了兩種關系,即漏洞影響產品,產品由制造商制造,通過這兩種關系將三類節點關聯在一起。

圖9 部分節點與產品的關系
漏洞的屬性反映了漏洞自身基礎信息、漏洞的風險以及目前的修復狀況等。通過知識圖譜對漏洞屬性以及攻擊鏈路屬性等進行多維度分析,使漏洞的特征更清晰,可視化界面使研究人員更直觀地看到漏洞的狀態,以及其可能帶來的潛在風險。
從漏洞角度來看,對目前漏洞庫進行分析,如圖10所示,目前Neo4j中存儲CVE漏洞170558個。其中,關于配置錯誤的漏洞有368個,在總漏洞數中占比0.22%;關于MySQL組件的漏洞有1109個,在總漏洞數中占比0.65%;關于weblogic的漏洞有320個,在總漏洞數中占比0.19%。

圖10 漏洞數量查詢
通過知識圖譜中的“關系”,可以從關聯關系的角度來對漏洞、攻擊以及組件進行可視化分析。通過查詢語句:MATCH p=()-[r:′危害等級′]->()RETURN p LIMIT 25,得出圖11中的結果。

圖11 “危害等級”關系圖
其中“危害等級”這個關系記錄了CVE漏洞的危害等級,可以根據其等級判斷CVE漏洞的危險性。
本文主要在知識圖譜的輔助下,對軟件配置漏洞進行分析,根據目前軟件配置漏洞面臨的問題現狀和知識圖譜龐大的知識體量以及多源數據的優勢,提出了軟件配置漏洞知識圖譜構建的思路。通過軟件配置漏洞數據處理、軟件配置漏洞知識加工、軟件配置漏洞圖譜構建等技術,構建出適合軟件配置漏洞分析的知識圖譜,借助知識圖譜的可視化效果,更加直接明了地觀察到軟件配置漏洞導致的問題與可能引發的關聯問題,可以輔助完成軟件配置的過程,避免一些錯誤漏洞再次發生。