11.3. Keeping the Community Informed

11.3.1. The VuXML Database

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, if the danger is really severe it will be wise to apply an instant workaround. For example, 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 a security vulnerability is discovered in a port, please add an entry for it to that file. Until familiar with VuXML, the best thing to do is to find an existing entry fitting the case at hand, then copy it and use it as a template.

11.3.2. A Short Introduction to VuXML

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 only the notion of tags is needed. 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, that is, more complex rules of nesting them. This is similar to HTML. The major difference is that XML is eXtensible, that is, 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"> 1
  <topic>Several vulnerabilities found in Foo</topic> 2
  <affects>
    <package>
      <name>foo</name> 3
      <name>foo-devel</name>
      <name>ja-foo</name>
      <range><ge>1.6</ge><lt>1.9</lt></range> 4
      <range><ge>2.*</ge><lt>2.4_1</lt></range>
      <range><eq>3.0b1</eq></range>
    </package>
    <package>
      <name>openfoo</name> 5
      <range><lt>1.10_7</lt></range> 6
      <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> 7
      <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> 8
    <freebsdsa>SA-10:75.foo</freebsdsa> 9
    <freebsdpr>ports/987654</freebsdpr> 10
    <cvename>CAN-2010-0201</cvename> 11
    <cvename>CAN-2010-0466</cvename>
    <bid>96298</bid> 12
    <certsa>CA-2010-99</certsa> 13
    <certvu>740169</certvu> 14
    <uscertsa>SA10-99A</uscertsa> 15
    <uscertta>SA10-99A</uscertta> 16
    <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;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>

The tag names are supposed to be self-explanatory so we shall take a closer look only at fields which needs to be fill in:

1

This is the top-level tag of a VuXML entry. It has a mandatory attribute, vid, specifying a universally unique identifier (UUID) for this entry (in quotes). Generate a UUID for each new VuXML entry (and do not forget to substitute it for the template UUID unless writing the entry from scratch). use uuidgen(1) to generate a VuXML UUID.

2

This is a one-line description of the issue found.

3

The names of packages affected are listed there. Multiple names can be given since several packages may be based on a single master port or software product. This may include stable and development branches, localized versions, and slave ports featuring different choices of important build-time configuration options.

Important:

It is the submitter's responsibility to find all such related packages when writing a VuXML entry. Keep in mind that make search name=foo is helpful. The primary points to look for are:

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

4

Affected versions of the package(s) are specified there as one or more ranges using a combination of <lt>, <le>, <eq>, <ge>, and <gt> elements. Check the version ranges given do not overlap.

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.

5

Several related package groups (essentially, ports) can be listed in the <affected> section. This can be used if several software products (say FooBar, FreeBar and OpenBar) grow from the same code base and still share its bugs and vulnerabilities. Note the difference from listing multiple names within a single <package> section.

6

The version ranges have to allow for PORTEPOCH and PORTREVISION if applicable. Please remember that according to the collation rules, a version with a non-zero PORTEPOCH is greater than any version without PORTEPOCH, for example, 3.0,1 is greater than 3.1 or even than 8.9.

7

This is a summary of the issue. XHTML is used in this field. At least enclosing <p> and </p> has to appear. More complex mark-up may be used, but only for the sake of accuracy and clarity: No eye candy please.

8

This section contains references to relevant documents. As many references as apply are encouraged.

9

This is a FreeBSD security advisory.

10

This is a FreeBSD problem report.

11

This is a MITRE CVE identifier.

12

This is a SecurityFocus Bug ID.

13

This is a US-CERT security advisory.

14

This is a US-CERT vulnerability note.

15

This is a US-CERT Cyber Security Alert.

16

This is a US-CERT Technical Cyber Security Alert.

17

This is a URL to an archived posting in a mailing list. The attribute msgid is optional and may specify the message ID of the posting.

18

This is a generic URL. Only it if none of the other reference categories apply.

19

This is the date when the issue was disclosed (YYYY-MM-DD).

20

This is the date when the entry was added (YYYY-MM-DD).

21

This is the date when any information in the entry was last modified (YYYY-MM-DD). New entries must not include this field. Add it when editing an existing entry.

11.3.3. Testing Changes to the VuXML Database

Assume a new entry for a vulnerability in the package clamav that has been fixed in version 0.65_7.

As a prerequisite, install fresh versions of the ports ports-mgmt/portaudit, ports-mgmt/portaudit-db, and security/vuxml.

Note:

The user running packaudit 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 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, add a new entry for this vulnerability.

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

Verify its syntax and formatting:

% make validate

Note:

At least one of these packages needs to be installed: textproc/libxml2, textproc/jade.

Now rebuild the portaudit database from the VuXML file:

% packaudit

To verify that the <affected> section of the entry will match correct package(s), issue this command:

% portaudit -f /usr/ports/INDEX -r uuid

Note:

Please refer to portaudit(1) for better understanding of the command syntax.

Make sure that the entry produces no spurious matches in the output.

Now check whether the right package versions are matched by the 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 matches while the latter one does 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

All FreeBSD documents are available for download at http://ftp.FreeBSD.org/pub/FreeBSD/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.