追踪CoreOS/Clair的扫描处理(CentOS部分)第2部分
本文是2016年Vuls Advent Calendar第9天的文章。
你好,我是浅香光代。今天天气真好呢。

第9天,这是Vuls Advent Calendar 2016第6天的延续。我的主题是Advent Calendar 2016,我将追踪其他漏洞扫描器的内部实施,以收集信息来提高Vuls本身的漏洞检测精度。
今天是第6天,计划是追踪在Clair中RedHat系列操作系统的检测内部实现,但在这个过程中我意外地在RedHat的支持网站上找到了一些有用的信息,所以我被吸引过去了。但是今天我会专注地继续做下去。
因为我们发现Clair似乎是基于Redhat系列的OVAL来检测漏洞的,所以今天我们会着重研究这方面。
OVAL是什么意思?
- IPA
安全检查语言OVAL(Open Vulnerability and Assessment Language)是一种用于检查计算机安全配置情况的规范。OVAL是美国政府推动信息安全技术自动化和标准化的技术规范SCAP(Security Content Automation Protocol)的一个组成部分。
OVAL存储区域
MITRE: 其他OVAL内容的仓库
-
- パット見でDebian, SUSE, RedHat, Ciscoあたりが使えそうだね。
-
- VulsはDebian, Ubuntu, CentOSはチェンジログのパースで検知してるんだけど、上記を使えば検知精度上がるね。Ubuntuがないけど、Clairはどーやってんだろうね。それについてはまた後日Advent Calendarでおってみるよ。
- では、ClairでのOVALでの検知をおってみるね。
获取并解析OVAL文件
你正在互联网上取得OVAL文件,对吗?
// OvalFetcher implements updater.Fetcher.
type OvalFetcher struct {
// OsInfo contains specifics to each Linux Distribution (see below)
OsInfo OSInfo
}
// RHELInfo implements oval.OsInfo interface
// See oval.OsInfo for more info on what each method is
type RHELInfo struct {
}
func (f *RHELInfo) OvalURI() string {
return "https://www.redhat.com/security/data/oval/"
}
https://www.redhat.com/security/data/oval/ ここに沢山おいてあるね。詳細はXMLみたら良いと思うよ。
解析OVAL文件
把取回的OVAL转化为XML并且存入数据库。
OVAL数据保存的结构体
Fetch,parse后的OVAL要用以下结构体表示,对吧?
type Vulnerability struct {
Model
Name string
Namespace Namespace
Description string
Link string
Severity types.Priority
Metadata MetadataMap
FixedIn []FeatureVersion
LayersIntroducingVulnerability []Layer
// For output purposes. Only make sense when the vulnerability
// is already about a specific Feature/FeatureVersion.
FixedBy types.Version `json:",omitempty"`
}
解读OVAL包中的版本号
在OVAL中写着软件包的版本号。
在这里,将包名和版本分解开来了。
OVAL中记录的版本号是指与此版本之前的漏洞相关的,是这样写的。
获取RPM软件包列表并解析部分
获取RPM软件包
在这个地方,我们对/var/lib/rpm/Packages(二进制文件)执行了rpm -qa命令,以获取已安装的软件包版本信息。
out, err := utils.Exec(tmpDir, "rpm", "--dbpath", tmpDir, "-qa", "--qf", "%{NAME} %{EPOCH}:%{VERSION}-%{RELEASE}\n")
解析软件包的版本
据说包版本的解析规则遵循了Debian包的版本控制规则。在Clair中,它还根据规则解析了RPM系列的实现。
-
- deb-version
- Debian Policy Manual Chapter 5 – Control files and their fields
[epoch:]upstream-version[-debian-revision]
- Debian JPに日本語訳がある
5.6.12版本
這是包的版本號。格式為 [epoch:]upstream_version[-debian_revision]。
版本由三個元素組成:epoch
這是一位數的非負整數。通常應該是一個小數字。如果可以假設為零,則可以省略。當省略時,upstream_version不能包含冒號。
它是為了允許舊版本的包版本號錯誤,或者保留包之前的版本號體系。upstream_version
這是版本號的主要部分。通常情況下,它將是創建.deb文件的原始(“上游”)包的版本號。通常它將與上游作者所定義的格式相同,但可能需要根據包管理系統和比較方法進行修改。
關於upstream_version的包管理系統比較行為,將在下一節中進行介紹。在版本號中,這部分是必需的。
upstream_version只能由字母、數字 [37] 和字符 . + – : ~ (點、加號、減號、冒號、波浪號)組成,並應以數字開頭。然而,如果沒有debian_revision,則不允許出現減號。同樣,如果沒有epoch,則不允許出現冒號。debian_revision
這部分表示為使該包成為Debian二進制包所做的修改的版本號。它只由字母、數字和字符 + . ~ (加號、點和波浪號)組成,並且將根據與upstream_version相同的方式進行比較。
這部分是可選的。如果不帶有debian_revision,則upstream_version不能包含減號。沒有debian_revision的格式指示它是作為Debian包源頭的特殊編寫的軟件。在這種情況下,Debian包源應始終與原始源相同,因此不需要添加修訂版本。
按照慣例,每當upstream_version增加時,debian_revision返回1。
包管理系統將嘗試在版本號的最後一個(如有的話)減號處將版本號分割為upstream_version和debian_revision。沒有debian_revision的情況相當於debian_revision等於0。比較兩個版本號時,首先比較epoch值,然後比較upstream_version,如果epoch相同,則比較debian_revision。epoch會以數字形式進行比較。 upstream_version和debian_revision的部分將由包管理系統使用以下算法進行比較。
字符串從左到右進行比較。
首先,在兩個字符串中,確定所有都由非數字構成的部分。對這兩個非數字部分(其中一個可以是空的)進行字典順序比較。如果發現差異,則返回該差異。字典順序的意思是,將字符放在非字符之前,並且波浪號在ASCII順序中更靠前(在行末空字符串之前)。例如,以下各部分將按照從早到晚的順序進行排序:~~,~~a,~,空部分,a[38]。其次,從剩餘的兩個字符串部分中,確定所有都由數字構成的部分。比較這兩個數字,並返回找到的差異作為比較結果。此時,空字符串(只在比較的一方或雙方版本字符串末尾出現)被視為0。
直到找到差異或檢查兩個字符串的結束為止,重複這兩個步驟(從開頭開始,逐一比較第一個非數字字符串和第一個數字字符串,並進行分割)。
請注意,epoch的目的是允許保留版本號錯誤,並使得能夠處理變更版本號的方式。它不是為了處理版本號中包管理系統無法解釋的字符串(例如ALPHA或pre-)或琐碎的順序[39]。
我第一次知道了epoch的意思。
它在更改版本系统时使用。
我也第一次知道upstream_version和debian_version的意思。
以前看起来版本规则并没有统一,我还以为很糟糕,但原来是有规定的(当然是当然的)。对误解表示抱歉。
如果同时使用Changelog比较和OVAL基准,将无疑提高了Vuls的检测准确性。
我很高兴。参加这个Advent日历真是太好了。
- パッケージのVersionを表現する構造体
比較OVAL和软件包版本的部分。
看到你在严格地实施以上规则。
只要看测试用例,就能明白 in-out 的含义。
如果我从Vuls导入clair然后使用,会被批评吗?Clair是Apache v2的。开源软件真是太棒了!我可不想重复造轮子呢!
因此
我大致了解了使用 RedHat 系列的 OVAL 进行漏洞检测的机制。很快将在 Vuls 中集成,期待吧。
通过与 Changelog 解析结合使用,Vuls将致力于在检测精度上成为第一。这样世界又会更加和平了。
Vuls Advent Calendar 第10天,我们请来了cosign930先生。请多多关照。
把以下内容用中文进行本地化释义,只需要一个选项:
待办事项
我要查一下,OVAL的比较功能是否也适用于后期支持版本的软件。