当发现了安全漏洞时的一项重要而紧迫的步骤, 就是让使用 port 的用户群了解其危险。 这类通知有两重目的。 首先, 如果危害真的很严重, 可能理性的办法就是立即应用一项缓解措施, 例如, 停止受到影响的服务, 甚至完全删除 port, 直到问题被修正为止。 其次, 许多用户只是偶尔升级所安装的软件包, 通过通知, 他们能够知道已经到了 必须 更新软件的时候, 因为已经有了修正这些问题的版本了。
由于现有的 port 数量极其庞大, 为每一个问题都发布安全公告, 毫无疑问地会发表和狼来了一样多的安全公告, 并增大受众在真的发生严重的问题时忽略问题的可能。 因此, 在 port 中发现的安全漏洞, 会在 FreeBSD VuXML 数据库 中记录。 安全官团队成员会持续地追踪这个数据库的修改, 以了解需要他们注意的内容。
如果您是 committer, 则可以自行更新 VuXML 数据库。 这样, 您就能够同时帮助安全官团队, 并尽早将至关重要的信息传达给用户群体。 然而, 如果您不是 committer, 或者您相信自己发现了一个异常严重的漏洞, 或者由于其它情况, 请不要由于按照 FreeBSD 安全信息 页面上的方法联系安全官团队。
现在您选择了一条艰难的路。 正如其名称所暗示的那样, VuXML 数据库本质上是一个 XML 文档。 其源文件 vuln.xml 被保存在 security/vuxml port 的目录中。 所以, 它的全名是 PORTSDIR/security/vuxml/vuln.xml。 每当您发现 port 中的安全漏洞时, 请把新的纪录加入到那个文件中。 在熟悉 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>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> (16) <mlist msgid="[email protected]">http://marc.theaimsgroup.com/?l=bugtraq&m=203886607825605</mlist> (17) <url>http://j.r.hacker.com/advisories/1</url> (18) </references> <dates> <discovery>2010-05-25</discovery> (19) <entry>2010-07-13</entry> (20) <modified>2010-09-17</modified> (21) </dates> </vuln>
标记的名字都是简单明了的, 下面我们来介绍一下需要由您填写的字段:
perl -MData::UUID -le 'print lc new Data::UUID->create_str'
重要: 撰写 VuXML 记录时, 您有责任找到所有相关的包。 很多时候 make search name=foo 是您的朋友。 需要留意的通常包括:
foo port 的 foo-devel 变体;
包含不同后缀的其它变体, 例如 -a4 (对于和打印有关的软件包), -without-gui (提供但禁用了 X 支持的软件包), 以及类似的其它情况;
jp-, ru-、 zh-, 以及其它可能的本地化变体, 它们通常可以在 Ports Collection 中相应的国家分类中找到。
在描述范围的时候, * (星号) 表达最小的版本。 更具体地说, 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 上下界的所有版本, 以及 2.x 在 2.4_1 之前的版本, 和 3.0b1 版。
假定您打算撰写, 或已经写好了一个关于 package clamav 的问题描述, 并且, 已经知道 0.65_7 版本修正了这个问题。
您需要做的准备工作, 是安装一个新版本的 ports ports-mgmt/portaudit 程序以及 ports-mgmt/portaudit-db。
首先, 检查一下是否已经有了关于这个漏洞的描述。 如果已经有过这样的记录, 那么它将匹配较早版本的 package, 0.65_6:
% packaudit % portaudit clamav-0.65_6
注意: 要运行 packaudit, 您必须拥有写入 DATABASEDIR 目录, 通常是 /var/db/portaudit 的权限。
如果什么都没有发现, 您就可以考虑写一个新的记录来描述这个漏洞了。 现在可以生成一个新的 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