12.3.让社区了解情况

12.3.1 VuXML 数据库

在发现安全漏洞之后, 尽可能早地采取的一个非常重要和紧迫的步骤, 是将这一危险性通知 port 用户群体。这种通知有两个目的。首先,如果危险真的很严重,明智的做法是采用即时的变通办法。例如,停止受影响的网络服务,甚至完全卸载该 port,直到漏洞被关闭。第二,很多用户往往只是偶尔升级已安装的软件包。他们会从通知中知道,一旦有了更正的版本,他们 必须 毫不拖延地更新软件包。

鉴于树上有大量的 port , 在涉及到真正严重的问题时, 不可能对每一个事件都发布安全通告, 而不至于造成泛滥, 失去受众的注意力。因此在 ports 中发现的安全漏洞会被记录在 FreeBSD VuXML 数据库 中。安全官团队的成员也会对其进行监控,以发现需要他们干预的问题。

提交者可以自己更新 VuXML 数据库, 以协助安全官团队并更快地将关键信息传递给社区。 那些不是提交者或发现了特别严重的漏洞的人, 应该毫不犹豫地直接联系安全官团队, 这在 FreeBSD 安全信息 页面上有介绍。

VuXML 数据库是一个 XML 文档。其源文件 vuln.xml 就保存在 port security/vuxml 中。因此这个文件的全称是 PORTSDIR/security/vuxml/vuln.xml。每当在一个 port 中发现安全漏洞时, 请在该文件中加入该漏洞的条目。在熟悉 VuXML 之前, 最好的办法是找到一个符合当前情况的现有条目, 然后复制它并将其作为一个模板。

12.3.2 VuXML简介

完整的 XML 格式很复杂,远远超出了本书的范围。 然而,为了获得对 VuXML 条目结构的基本了解,只需要了解标签的概念。 XML标签的名称被括在角括号中。 每个开头的 必须有一个匹配的结尾的 。标签可以被嵌套。 如果嵌套,内部的标签必须在外部的标签之前关闭。 标签有一个层次结构,也就是说,有更复杂的嵌套规则。 这与 HTML 类似。主要的区别是,XML 是 eXtensible 的,也就是说,是基于定义自定义标签的。 由于其固有的结构,XML 把本来无定形的数据变成了定形。 VuXML 特别适合于标记安全漏洞的描述。

现在考虑一个现实的 VuXML 条目。

<vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> ①
  <topic>Several vulnerabilities found in Foo</topic> ②
  <affects>
    <package>
      <name>foo</name> ③
      <name>foo-devel</name>
      <name>ja-foo</name>
      <range><ge>1.6</ge><lt>1.9</lt></range> ④
      <range><ge>2.*</ge><lt>2.4_1</lt></range>
      <range><eq>3.0b1</eq></range>
    </package>
    <package>
      <name>openfoo</name> ⑤
      <range><lt>1.10_7</lt></range> ⑥
      <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
    </package>
  </affects>
  <description>
    <body xmlns="http://www.w3.org/1999/xhtml">
      <p>J. Random Hacker reports:</p> ⑦
      <blockquote
        cite="http://j.r.hacker.com/advisories/1">
        <p>Several issues in the Foo software may be exploited
          via carefully crafted QUUX requests.  These requests will
          permit the injection of Bar code, mumble theft, and the
          readability of the Foo administrator account.</p>
      </blockquote>
    </body>
  </description>
  <references> ⑧
    <freebsdsa>SA-10:75.foo</freebsdsa> ⑨
    <freebsdpr>ports/987654</freebsdpr> ⑩
    <cvename>CAN-2010-0201</cvename> ⑪
    <cvename>CAN-2010-0466</cvename>
    <bid>96298</bid> ⑫
    <certsa>CA-2010-99</certsa> ⑬
    <certvu>740169</certvu> ⑭
    <uscertsa>SA10-99A</uscertsa> ⑮
    <uscertta>SA10-99A</uscertta> ⑯
    <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> ⑰
    <url>http://j.r.hacker.com/advisories/1</url> ⑱
  </references>
  <dates>
    <discovery>2010-05-25</discovery> ⑲
    <entry>2010-07-13</entry> ⑳
    <modified>2010-09-17</modified> ㉑
  </dates>
</vuln>

标签的名称应该是不言自明的,所以我们将只仔细看一下需要填写的字段。

① 这是一个 VuXML 条目的顶级标签。它有一个强制性的属性,vid,为这个条目指定一个通用的唯一标识符(UUID)(带引号)。为每个新的 VuXML 条目生成一个 UUID (不要忘记用它来代替模板 UUID,除非从头开始编写条目)。使用 uuidgen(1) 来生成一个 VuXML UUID。

② 这是对所发现问题的单行描述。

③ 受影响的软件包的名字会列在这里。可以给出多个名字, 因为多个软件包可能是基于一个主 port 或软件产品的。这可能包括稳定和开发分支、 本地化版本,以及具有不同的重要联编配置选项的从属 port 。

④ 受影响的软件包的版本, 可以用 <lt><le><eq><ge><gt> 元素的组合来指定一个或多个范围。检查给定的版本范围是否重叠。在一个范围说明中,* (星号)表示最小的版本号。特别是,2.* 小于 2.a。因此,一个星号可以用于一个范围,以匹配所有可能的 alphabetaRC 版本。

例如,<ge>2.**</ge><lt>3.**</lt> 将选择性地匹配每个 2.x 版本,而 <ge>2.0</ge><lt>3.0</lt> 则不会,因为后者错过了 2.r3 而匹配 3.b。 上面的例子指出,受影响的是 1.6 及以下版本,但不包括 1.92.4_1 之前的 2.x 版本,以及 3.0b1 版本。

⑤ 在 <affected> 部分可以列出几个相关的包组 (基本上是 ports)。如果几个软件产品 (例如 FooBar、FreeBar 和 OpenBar) 从同一个代码库中生长出来, 并且仍然分享它的错误和漏洞, 就可以使用这个方法。请注意与在单个部分列出多个名字的区别。

⑥ 版本范围必须允许 PORTEPOCHPORTREVISION(如果适用)。请记住, 根据整理规则, 具有非零 PORTEPOCH 的版本大于任何没有 PORTEPOCH 的版本, 例如, 3.0,1 大于 3.1, 甚至大于 8.9

⑦ 这是对这个问题的总结。在这个领域中使用 XHTML。至少要出现封闭的 <p></p> 。可以使用更复杂的标记,但仅仅是为了准确和清晰起见。请不要有眼花缭乱的感觉。

⑧ 本节包含对相关文件的参考。我们鼓励使用尽可能多的参考文献。

⑨ 这是一份 FreeBSD 安全公告

⑩这是一份 FreeBSD 问题报告

⑪ 这是一个 MITRE CVE 标识符。

⑫ 这是一个 SecurityFocus Bug ID

⑬ 这是 US-CERT 的安全公告。

⑭ 这是 US-CERT 漏洞说明。

⑮ 这是 US-CERT 网络安全警报。

⑯ 这是一个 US-CERT 技术网络安全警报。

⑰ 这是一个指向邮件列表中的存档帖子的URL。属性 msgid 是可选的,可以指定发帖的消息 ID。

⑱ 这是一个通用的 URL。只有在其他参考类别都不适用的情况下才使用。

⑲ 这是问题被披露的日期(YYY-MM-DD)。

⑳ 这是该条目被添加的日期(YYYY-MM-DD)。

㉑ 这是条目中任何信息最后被修改的日期(YYY-MM-DD)。新条目必须不包括这个字段。在编辑现有条目时添加它。

12.3.3 测试对 VuXML 数据库的修改

这个例子描述了软件包 dropbear 中的一个漏洞的新条目,该漏洞已在 dropbear-2013.59 版本中被修复。

作为先决条件,安装一个新版本的 port security/vuxml

首先,检查是否已经有这个漏洞的条目。如果有这样一个条目,它将与该软件包的前一个版本,即 2013.58 相匹配。

% pkg audit dropbear-2013.58

如果没有找到,为这个漏洞添加一个新条目。

% cd ${PORTSDIR}/security/vuxml
% make newentry

验证其语法和格式。

% make validate

前面的命令生成了 vuln-flat.xml 文件。它也可以用以下方法生成。

% make vuln-flat.xml

注意

至少需要安装这些软件包中的其中一个:textproc/libxml2textproc/jade

验证条目中的 <affected> 部分将与正确的软件包相匹配。

% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58

请确保该条目在输出中没有产生虚假的匹配。

现在检查这个条目是否匹配了正确的软件包版本:

% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58 dropbear-2013.59
dropbear-2012.58 is vulnerable:
dropbear -- exposure of sensitive information, DoS
CVE: CVE-2013-4434
CVE: CVE-2013-4421
WWW: https://portaudit.FreeBSD.org/8c9b48d1-3715-11e3-a624-00262d8b701d.html

1 problem(s) in the installed packages found.

前一个版本符合,而后一个版本不符合。

最后更新于

FreeBSD 中文社区