2013-02-20 170 views
3

我試圖將Linux軟件包(名稱+版本)的信息映射到其相應的CPE字符串(請參閱http://nvd.nist.gov/cpe.cfm),以便能夠自動查找系統的可能漏洞。模糊搜索SQL

NIST提供的XML文檔包含所有相關的CPE。我想過把這些信息解析成一個SQL數據庫,這樣我就可以通過名稱和版本號快速搜索。那大概有70,000行。

現在的問題是,當前CPE的拼寫和軟件包名稱存在差異。例如,Tomcat 6.0.36的CPE將爲cpe:/a:apache:tomcat:6.0.36,因此您可以使用名稱tomcat和版本6.0.36。現在,軟件包管理器可以爲您提供類似tomcat6的名稱和6.0.36-3的版本。它可能是兩個程序相同或者至少具有相同的漏洞。所以我需要能夠自動將上面提到的CPE識別爲適用於我的Tomcat包的CPE。

首先要做的是某種標準化,也許將所有東西都轉換成小寫。但正如你從例子中看到的那樣,這還不夠。我需要某種模糊搜索。從我已經發現的情況來看,在拼寫錯誤的情況下有一些識別匹配的解決方案。但這並不是我所需要的。軟件包名稱不拼寫錯誤,但可能包含其他字符(或缺少一些字符)。

模糊搜索也必須相對較快,因爲我需要爲多個主機執行它,每個主機可以安裝幾百個軟件包,正如我所說的,數據庫將有大約70,000行。我可以介紹一個主要的查找,它首先嚐試查找完全匹配,但由於我懷疑許多包不會有任何相應的CPE字符串,因此這不會顯着降低數量。

另一個限制是解決方案應該在非專有數據庫上工作,因爲我沒有任何其他的財務手段。

那麼,有什麼符合這些要求?或者除了某種模糊搜索之外,您能否想到我的問題的任何解決方案?

在此先感謝!

+0

我想我會更多的誘惑「正常化」導入到我的數據庫。因此,在導入列表時,有一些功能可以提供獨特的CPE,並且可以爲搜索目標執行相同操作。這樣,你只需要一次點擊就可以使用直接搜索,就好像完全匹配是可以的,而不是每次比較都會模糊。 – 2013-02-20 16:05:26

回答

2

首先是一般性評論。 CPE術語似乎是有機地發展起來的,通常取決於供應商(不一致)的術語。例如,Sun Java有major.minor.point_version。 Adobe使用major.minor.point.subpoint。 Microsoft操作系統使用Service Packs_Language Packs。其他一些供應商會使用大多數數字的點發布,但偶爾會出現一些字母(例如.8,.9,.9R2,.10)。

當我處理所述問題時,我從他們的XML文件開始,在Excel中對它們進行操作,分割時間段。然後,我會按數字排序(如果它們都是數字)或作爲文本字符串。 (請注意,這些字母大部分數字會造成嚴重破壞,而.10在詞法上來自.8)

這種不一致是第三方軟件供應商在春雨後像蘑菇一樣發芽的原因。公司寧願支付軟件供應商的費用,也不願解開這個難題。

如果你想要一個真正模糊的搜索,請看看關於using Soundex的這個問題。預計會有很多誤報。

如果您的目標是準確地映射CPE字符串,那麼您應該考慮實施一個將CPE轉換爲庫名稱的查找表。