A very important and urgent step to take as early after a security vulnerability is discovered as possible is to notify the community of port users about the jeopardy. Such notification serves two purposes. First, should the danger be really severe it will be wise to apply an instant workaround. E.g., stop the affected network service or even deinstall the port completely until the vulnerability is closed. Second, a lot of users tend to upgrade installed packages only occasionally. They will know from the notification that they must update the package without delay as soon as a corrected version is available.
Given the huge number of ports in the tree a security advisory cannot be issued on each incident without creating a flood and losing the attention of the audience when it comes to really serious matters. Therefore security vulnerabilities found in ports are recorded in the FreeBSD VuXML database. The Security Officer Team members also monitor it for issues requiring their intervention.
If you have committer rights you can update the VuXML database by yourself. So you will both help the Security Officer Team and deliver the crucial information to the community earlier. However, if you are not a committer, or you believe you have found an exceptionally severe vulnerability please do not hesitate to contact the Security Officer Team directly as described on the FreeBSD Security Information page.
The VuXML database is an XML document. Its source file vuln.xml is kept right inside the port security/vuxml. Therefore the file's full pathname will be PORTSDIR/security/vuxml/vuln.xml. Each time you discover a security vulnerability in a port please add an entry for it to that file. Until you are familiar with VuXML, the best thing you can do is to find an existing entry fitting your case, then copy it and use it as a template.
The full-blown XML format is complex, and far beyond the scope of this book. However, to gain basic insight on the structure of a VuXML entry you need only the notion of tags. XML tag names are enclosed in angle brackets. Each opening <tag> must have a matching closing </tag>. Tags may be nested. If nesting, the inner tags must be closed before the outer ones. There is a hierarchy of tags, i.e., more complex rules of nesting them. This is similar to HTML. The major difference is that XML is eXtensible, i.e., based on defining custom tags. Due to its intrinsic structure XML puts otherwise amorphous data into shape. VuXML is particularly tailored to mark up descriptions of security vulnerabilities.
Now consider a realistic VuXML entry:
<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&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>
The tag names are supposed to be self-explanatory so we shall take a closer look only at fields you will need to fill in by yourself:
Important: It is your responsibility to find all such related packages when writing a VuXML entry. Keep in mind that make search name=foo is your friend. The primary points to look for are as follows:
the foo-devel variant for a foo port;
other variants with a suffix like -a4 (for print-related packages), -without-gui (for packages with X support disabled), or similar;
jp-, ru-, zh-, and other possible localized variants in the corresponding national categories of the ports collection.
In a range specification, * (asterisk) denotes the smallest version number. In particular, 2.* is less than 2.a. Therefore an asterisk may be used for a range to match all possible alpha, beta, and RC versions. For instance, <ge>2.*</ge><lt>3.*</lt> will selectively match every 2.x version while <ge>2.0</ge><lt>3.0</lt> will not since the latter misses 2.r3 and matches 3.b.
The above example specifies that affected are versions from 1.6 to 1.9 inclusive, versions 2.x before 2.4_1, and version 3.0b1.
Assume you just wrote or filled in an entry for a vulnerability in the package clamav that has been fixed in version 0.65_7.
As a prerequisite, you need to install fresh versions of the ports ports-mgmt/portaudit, ports-mgmt/portaudit-db, and security/vuxml.
Note: To run packaudit you must have permission to write to its DATABASEDIR, typically /var/db/portaudit.
To use a different directory set the DATABASEDIR environment variable to a different location.
If you are working in a directory other than ${PORTSDIR}/security/vuxml set the VUXMLDIR environment variable to the directory where vuln.xml is located.
First, check whether there already is an entry for this vulnerability. If there were such an entry, it would match the previous version of the package, 0.65_6:
% packaudit % portaudit clamav-0.65_6
If there is none found, you have the green light to add a new entry for this vulnerability.
% cd ${PORTSDIR}/security/vuxml % make newentry
When you are done verify its syntax and formatting.
% make validate
Note: You will need at least one of the following packages installed: textproc/libxml2, textproc/jade.
Now rebuild the portaudit database from the VuXML file:
% packaudit
To verify that the <affected> section of your entry will match correct package(s), issue the following command:
% portaudit -f /usr/ports/INDEX -r uuid
Note: Please refer to portaudit(1) for better understanding of the command syntax.
Make sure that your entry produces no spurious matches in the output.
Now check whether the right package versions are matched by your entry:
% 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.
The former version should match while the latter one should not.
Finally, verify whether the web page generated from the VuXML database looks like expected:
% mkdir -p ~/public_html/portaudit % packaudit % lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html