当发现了安全漏洞时的一项重要而紧迫的步骤, 就是让使用 port 的用户群了解其危险。 这类通知有两重目的。 首先, 如果危害真的很严重, 可能理性的办法就是立即应用一项缓解措施, 例如, 停止受到影响的服务, 甚至完全删除 port, 直到问题被修正为止。 其次, 许多用户只是偶尔升级所安装的软件包, 通过通知, 他们能够知道已经到了 必须 更新软件的时候, 因为已经有了修正这些问题的版本了。
由于现有的 port 数量极其庞大, 为每一个问题都发布安全公告, 毫无疑问地会发表和狼来了一样多的安全公告, 并增大受众在真的发生严重的问题时忽略问题的可能。 因此, 在 port 中发现的安全漏洞, 会在 FreeBSD VuXML 数据库 中记录。 安全官团队成员会持续地追踪这个数据库的修改, 以了解需要他们注意的内容。
如果您是 committer, 则可以自行更新 VuXML 数据库。 这样, 您就能够同时帮助安全官团队, 并尽早将至关重要的信息传达给用户群体。 然而, 如果您不是 committer, 或者您相信自己发现了一个异常严重的漏洞, 请不要犹豫, 按照 FreeBSD 安全信息 页面上的方法联系安全官团队。
正如其名称所暗示的那样, VuXML
数据库是一个 XML 文档。 其源文件 vuln.xml
被保存在 security/vuxml
port 的目录中。
所以, 它的全名是
。
每当您发现 port 中的安全漏洞时, 请把新的纪录加入到那个文件中。
在熟悉 VuXML 之前, 您最好先看看是否有类似的您发现的问题的其它记录,
并复制它作为模板。PORTSDIR
/security/vuxml/vuln.xml
XML 是一个复杂的语言, 它远远超越了这本书的范围。 不过, 只需了解标记的命名规则, 就能 VuXML 记录的结构有一个大体的了解了。 XML 标记的名字应出现在一对尖括号之间。 每一个 <tag> 必须有一个对应的 </tag>。 标记可以嵌套, 如果嵌套的话, 内层的标记必须在外层标记之前结束。 这就形成了一个标记的层次结构, 也就是关于它们之间如何嵌套的规则。 听起来很像 HTML, 是不是? 最主要的区别在于, XML 是可扩展的 (eXtensible), 例如通过定义新的标记等等。 由于其结构的内在性质, XML 能够赋予无组织的数据新的形态。 VuXML 是专门为描述安全漏洞设计的语言。
现在让我们来观察一个实际的 VuXML 记录:
标记的名字都是简单明了的, 下面我们来介绍一下需要由您填写的字段:
这是 VuXML 记录的顶级 tag。
它有一个强制性的字段, | |
关于问题的一句话描述。 | |
此处给出受到影响的 package 的名字。 可以给出多个名字, 因为可能有多个软件包基于同一个 master port 或软件产品。 这可能包括稳定和开发分支、 本地化版本, 以及提供了不同的编译时选项的 slave port。 重要:撰写 VuXML 记录时, 您有责任找到所有相关的包。 很多时候
| |
受影响的 package 版本, 可以使用
在描述范围的时候, 上面的例子指定了受影响的版本, 是包括 | |
受到影响的一组 package (本质上是 ports)
可以列在 | |
如果可能, 版本的范围应包括
| |
关于问题的摘要性信息。 此处使用
XHTML。 务必要成对使用
| |
这部分包含了相关的可供参考的文档。 请尽可能多提供参考文献。 | |
指定 FreeBSD 安全公告。 | |
指定 FreeBSD 问题报告。 | |
指定 Mitre CVE ID。 | |
指定 US-CERT 安全公告。 | |
指定 US-CERT 漏洞说明。 | |
指定 US-CERT 计算机安全警报。 | |
指定 US-CERT 技术性计算机安全警报。 | |
指向邮件列表存档的 URL。
属性 | |
一般的 URL。 只有在没有其它更适合的参考文献时, 才应使用它。 | |
问题被全面披露的日期
( | |
记录加入到数据库中的日期
( | |
记录最后一次被修改的日期
( |
假定您打算撰写, 或已经写好了一个关于
package clamav
的问题描述, 并且,
已经知道 0.65_7
版本修正了这个问题。
您需要做的准备工作, 是 安装 一个新版本的
ports ports-mgmt/portaudit
程序、
ports-mgmt/portaudit-db
, 以及
security/vuxml
。
要运行 packaudit
,
您必须拥有其
,
通常是 DATABASEDIR
/var/db/portaudit
的写入权限。
您可以通过
环境变量来指定一个不同的位置。DATABASEDIR
如果您的工作目录是
${PORTSDIR}/security/vuxml
以外的其它地方, 则应使用环境变量
来指明
VUXMLDIR
vuln.xml
的位置。
首先, 检查一下是否已经有了关于这个漏洞的描述。
如果已经有过这样的记录, 那么它将匹配较早版本的 package,
0.65_6
:
%
packaudit
%
portaudit clamav-0.65_6
如果什么都没有发现, 您就可以考虑写一个新的记录来描述这个漏洞了。
现在可以生成一个新的 UUID (假设它是
74a9541d-5d6c-11d8-80e3-0020ed76ef5a
),
然后将您的新记录加入到 VuXML 数据库中。 接下来,
用下面的命令来检查它是否符合语法:
%
cd ${PORTSDIR}/security/vuxml && make validate
您需要安装下列 package 中的至少一个:
textproc/libxml2
、
textproc/jade
。
接下来从 VuXML 文件重构 portaudit
数据库:
%
packaudit
要验证您新加入的项的 <affected>
小节能够正确地匹配希望的 package, 可以使用下面的命令:
%
portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5a
请参见 portaudit(1) 以了解关于这个命令语法的更多细节。
请确信新添加的记录不会在输出中匹配不应匹配的项。
现在检查您添加的记录所匹配的版本是否正确:
%
portaudit clamav-0.65_6 clamav-0.65_7
Affected package: clamav-0.65_6 (matched by clamav<0.65_7)
Type of problem: clamav remote denial-of-service.
Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
1 problem(s) found.显然, 前一个版本会匹配, 而后一个不会。
最后, 验证您从 VuXML 数据库中能够正确地得到预期的网页效果:
%
mkdir -p ~/public_html/portaudit
%
packaudit
%
lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.