> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/porters-handbook/di-12-zhang-an-quan/12.3.-rang-she-qu-le-jie-qing-kuang.md).

# 12.3.向社区通报情况

## 12.3.1. VuXML 数据库

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

鉴于 Ports 树中 Port 数量庞大，不能在每个事件发生时都发布安全公告，这样会造成信息泛滥，导致受众对真正严重的事件失去关注。因此，在 Ports 中发现的安全漏洞会被记录在 [FreeBSD VuXML 数据库](https://vuxml.freebsd.org/) 中。安全官员团队成员也会监视它，处理需要他们干预的问题。

提交者可以自己更新 VuXML 数据库，协助安全官员团队，并更快速地向社区提供关键信息。对于那些不是提交者，或者发现了特别严重的漏洞的人，应当毫不犹豫地直接联系安全官员团队，联系方式可以在 [FreeBSD 安全信息](https://www.freebsd.org/security/#how) 页面上找到。

VuXML 数据库是一个 XML 文档。其源文件 **vuln.xml** 保存在 Port [security/vuxml](https://cgit.freebsd.org/ports/tree/security/vuxml/) 中。因此，该文件的完整路径将是 **PORTSDIR/security/vuxml/vuln.xml**。每当在 Port 中发现安全漏洞时，请为该漏洞在此文件中添加一个条目。在熟悉 VuXML 之前，最好先找到一个符合当前情况的现有条目，然后复制它并用作模板。

## 12.3.2. VuXML 简介

完整的 XML 格式非常复杂，超出了本书的范围。然而，要基本了解 VuXML 条目的结构，只需要了解标签的概念。XML 标签名称用尖括号括起来。每个打开的 `<tag>` 必须有一个匹配的关闭标签 `</tag>`。标签可以嵌套。如果是嵌套的，必须先关闭内部标签，再关闭外部标签。标签有层次结构，即更复杂的嵌套规则。这与 HTML 类似。主要的区别在于，XML 是 **eX**tensible（可扩展的），即基于定义自定义标签。由于 XML 的固有结构，它将原本无序的数据整理成形。VuXML 特别为标记安全漏洞描述而设计。

现在考量一个实际的 VuXML 条目：

```xml
<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="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)](https://man.freebsd.org/cgi/man.cgi?query=uuidgen\&sektion=1\&format=html) 来生成 VuXML UUID。
* ② 这是所发现问题的一行描述。
* ③ 这里列出受影响的包名称。可以列出多个名称，因为多个包可能基于同一个主 Port 或软件产品。这可能包括稳定版和开发版、本地化版本，以及具有不同重要构建配置选项的从属 Port。
* ④ 这里以一个或多个范围形式指定受影响包的版本，使用 `<lt>`、`<le>`、`<eq>`、`<ge>` 和 `<gt>` 元素的组合。请检查给出的版本范围是否没有重叠。在范围说明中，`\*`（星号）表示最小的版本号。特别地，`2.*` 小于 `2.a`。因此可以使用星号来匹配所有可能的 `alpha`、`beta` 和 `RC` 版本。例如，`<ge>2.*</ge><lt>3.*</lt>` 会选择性地匹配每个 `2.x` 版本，而 `<ge>2.0</ge><lt>3.0</lt>` 不会，因为它跳过了 `2.r3` 并匹配了 `3.b`。上述示例表示受影响的版本包括从 `1.6` 到 `1.9`（不包括 `1.9`）、`2.x` 版本中小于 `2.4_1` 的部分，以及版本 `3.0b1`。
* ⑤ 在 `<affected>` 区块中可以列出若干相关包组（本质上是 Ports）。当多个软件产品（比如 FooBar、FreeBar 和 OpenBar）源自同一代码库并共享其漏洞时可使用此方式。请注意这与在单个 `<package>` 区块中列出多个名称的不同。
* ⑥ 版本范围必须考虑 `PORTEPOCH` 和 `PORTREVISION`（如适用）。请记住，根据排序规则，带有非零 `PORTEPOCH` 的版本大于任何没有 `PORTEPOCH` 的版本，例如，`3.0,1` 大于 `3.1`，甚至大于 `8.9`。
* ⑦ 这是问题的摘要说明。本字段使用 XHTML。至少要出现包裹内容的 `<p>` 和 `</p>` 标签。可以使用更复杂的标记，但仅限于准确性和清晰性的目的：请勿添加视觉效果装饰。
* ⑧ 本节包含相关文档的引用。建议尽可能多地提供适用的引用。
* ⑨ 这是一个 [FreeBSD 安全公告](https://www.freebsd.org/security/#adv)。
* ⑩ 这是一个 [FreeBSD 问题报告](https://www.freebsd.org/support/)。
* ⑪ 这是一个 [MITRE CVE](https://cve.mitre.org/) 标识符。
* ⑫ 这是一个 [US-CERT](https://www.kb.cert.org/vuls/) 漏洞说明。
* ⑬ 这是一个 [US-CERT](https://www.cisa.gov/news-events/cybersecurity-advisories) 技术网络安全警报。
* ⑭ 这是邮件列表中存档帖子的 URL。可选属性 `msgid` 可用于指定该帖子的消息 ID。
* ⑮ 这是一个通用 URL，仅在其他引用类别都不适用时才使用。
* ⑯ 这是问题公开披露的日期（*YYYY-MM-DD*）。
* ⑰ 这是该条目添加的日期（*YYYY-MM-DD*）。
* ⑱ 这是该条目中任意信息最后一次修改的日期（*YYYY-MM-DD*）。新条目不得包含该字段。仅在编辑现有条目时添加。

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

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

前提是安装最新版的 [security/vuxml](https://cgit.freebsd.org/ports/tree/security/vuxml/) Port。

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

```sh
% pkg audit dropbear-2013.58
```

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

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

如果该漏洞具有 [MITRE CVE](https://cve.mitre.org/) 标识符，可以使用以下命令代替：

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

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

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

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

其中 `FreeBSD-SA-YY-XXXXXX.asc` 是已发布的 [FreeBSD 安全公告](https://www.freebsd.org/security/advisories/)。

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

```sh
% make validate
```

上述命令会生成 **vuln-flat.xml** 文件，也可以使用以下命令生成：

```sh
% make vuln-flat.xml
```

> **注意**
>
> 至少需要安装以下其中一个包：[textproc/libxml2](https://cgit.freebsd.org/ports/tree/textproc/libxml2/)、[textproc/jade](https://cgit.freebsd.org/ports/tree/textproc/jade/)。

验证条目中的 `<affected>` 区块是否能匹配正确的包版本：

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

确保该条目不会错误地匹配不受影响的版本。

现在检查是否匹配正确的版本范围：

```sh
% 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. VuXML 新条目检查清单

* 检查 Port 的名称。有时上游项目名称与 Port 名称并不完全相同。
* 添加所有 flavor。当 Port 有 flavor 时，所有包名称都需要作为 `<package>` 添加到条目中。使用以下脚本生成所有带 flavor 的包名称：

  ```sh
  % for flavor in $(make -V FLAVORS); do FLAVOR="${flavor}" make -VPKGNAME;done
  ```
* 检查 Port 是否有 `PORTEPOCH`。上面的脚本片段可以帮助确认。如果 Port 使用 `PORTEPOCH`，则必须将其添加到 `<range>` 标签中。
* 仔细检查范围。对于两端都有限制的范围，确保 `<ge>` 和 `<lt>` 元素位于同一个 `<range>` 标签内。否则条目可能最终会定义重叠的范围。
* 交叉检查衍生项目。检查 Ports 树中是否包含该项目的衍生版本或分支，并确认它们是否也受影响。例如，如果在 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/) 中发现漏洞，应评估类似的衍生项目，如 [www/librewolf](https://cgit.freebsd.org/ports/tree/www/librewolf/)、[www/waterfox](https://cgit.freebsd.org/ports/tree/www/waterfox/) 或其他类似项目是否也存在相同漏洞。请在 VuXML 条目中列出所有受影响的衍生项目，以确保这些 Ports 的用户也能获知相关信息。同时检查树中是否存在同一 Port 的 Linux 版本。例如，[databases/sqlite3](https://cgit.freebsd.org/ports/tree/databases/sqlite3/) 的漏洞很可能也会影响 [databases/linux-c7-sqlite3](https://cgit.freebsd.org/ports/tree/databases/linux-c7-sqlite3/) 等包。
* 在未先运行 `make validate` 之前，不要提交条目。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/porters-handbook/di-12-zhang-an-quan/12.3.-rang-she-qu-le-jie-qing-kuang.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
