追踪CoreOS/Clair的扫描处理(CentOS部分)第2部分

本文是2016年Vuls Advent Calendar第9天的文章。

你好,我是浅香光代。今天天气真好呢。

Pasted image at 2016_12_09 05_13 PM.png

第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的比较功能是否也适用于后期支持版本的软件。

广告
将在 10 秒后关闭
bannerAds