12.3.向社区通报情况

12.3.1. VuXML 数据库

在发现安全漏洞后,尽早通知 Port 用户社区是非常重要且紧急的步骤。这样的通知有两个目的。首先,如果风险真的很严重,最好立即采取临时解决方案。例如,停止受影响的网络服务,或者在漏洞修复前完全卸载该 Port。其次,很多用户通常只偶尔升级已安装的包。他们会从通知中得知,一旦有修复版本发布,就必须立即更新包。

鉴于 Ports 树中 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 标签名称用尖括号括起来。每个打开的 <tag> 必须有一个匹配的关闭标签 </tag>。标签可以嵌套。如果是嵌套的,必须先关闭内部标签,再关闭外部标签。标签有层次结构,即更复杂的嵌套规则。这与 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>CVE-2023-48795</cvename> ⑪
    <certvu>740169</certvu> ⑫
    <uscertta>SA10-99A</uscertta> ⑬
    <mlist msgid="[email protected]">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>, <gt>, <ge>, 和 <range> 元素的组合。请检查给出的版本范围是否没有重叠。在范围说明中,*(星号)表示最小的版本号。特别地,2.* 小于 2.a。因此可以使用星号来匹配所有可能的 alphabetaRC 版本。例如,2.3.* 会选择性地匹配每个 2.x 版本,而 2.03.0 不会,因为它跳过了 2.r3 并匹配了 3.b。上述示例表示受影响的版本包括 1.6 到但不包括 1.92.x 版本中小于 2.4_1 的部分,以及版本 3.0b1

  • ⑤ 在 <package> 区块中可以列出若干相关包组(本质上是 Ports)。当多个软件产品(比如 FooBar、FreeBar 和 OpenBar)源自同一代码库并共享其漏洞时可使用此方式。请注意这与在一个 <name> 区块中列出多个名称的不同。

  • ⑥ 版本范围必须考虑 PORTEPOCHPORTREVISION(如适用)。请记住,根据排序规则,带有非零 PORTEPOCH 的版本大于任何没有 PORTEPOCH 的版本,例如,3.0,1 大于 3.1,甚至大于 8.9

  • ⑦ 这是问题的摘要说明。本字段使用 XHTML。至少要有包裹内容的 <description></description> 标签。可以使用更复杂的标记,但仅限于准确性和清晰性的目的:请勿添加视觉效果装饰。

  • ⑧ 本节包含相关文档的引用。建议尽可能多地提供适用的引用。

  • ⑨ 这是一个 FreeBSD 安全公告

  • ⑩ 这是一个 FreeBSD 问题报告

  • ⑪ 这是一个 MITRE CVE 标识符。

  • ⑫ 这是一个 US-CERT 漏洞说明。

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

  • ⑭ 这是邮件列表中存档帖子的 URL。可选属性 msgid 可用于指定该帖子的消息 ID。

  • ⑮ 这是一个通用 URL,仅在其他引用类别都不适用时才使用。

  • ⑯ 这是问题公开披露的日期(YYYY-MM-DD)。

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

  • ⑱ 这是该条目中任意信息最后一次修改的日期(YYYY-MM-DD)。新条目不得包含该字段。仅在编辑现有条目时添加。

12.3.3. 测试对 VuXML 数据库的更改

本例描述了一个关于 dropbear 包的新漏洞条目,该漏洞在版本 dropbear-2013.59 中已修复。

前提是安装最新版的 security/vuxml Port。

首先检查是否已有该漏洞的条目。如果已有,该条目应能匹配该包的前一个版本 2013.58

% pkg audit dropbear-2013.58

如果未找到匹配条目,则为此漏洞添加一个新条目:

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

如果该漏洞具有 MITRE CVE 标识符,可以使用以下命令代替:

% cd ${PORTSDIR}/security/vuxml
% make newentry CVE_ID=CVE-YYYY-XXXXX

其中 CVE-YYYYY-XXXX 是有效的 CVE 标识符。

如果该漏洞是 FreeBSD 安全公告,可使用以下命令代替:

% cd ${PORTSDIR}/security/vuxml
% make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc

其中 FreeBSD-SA-YY-XXXXXX.asc 是已发布的 FreeBSD 安全公告

验证语法和格式是否正确:

% 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.

能匹配旧版本,不会匹配新版本则。

12.3.4. 交叉检查衍生项目

如果上游项目存在已知漏洞,应检查 Ports 树中该项目的衍生版本或分支是否也受影响。例如,如果在 www/firefox 中发现漏洞,应评估类似的衍生项目,如 www/librewolfwww/waterfox 或其他类似项目是否也存在相同漏洞。请在 VuXML 条目中列出所有受影响的衍生项目,以确保这些 Ports 的用户也能获知相关信息。

最后更新于

这有帮助吗?