11.3. Обеспечение сообщества информацией

11.3.1. База данных VuXML

Очень важным и первостепенным шагом при действии как можно раньше после раскрытия уязвимости является уведомление сообщества пользователей порта об опасности. Такие уведомления служат двум целям. Во-первых, в случае действительно серьезной угрозы, будет посоветовано применить мгновенное воздействие, например, остановка затрагиваемого сетевого сервиса или даже удаление порта целиком, пока уязвимость не будет устранена. Во-вторых, масса пользователей имеет тенденцию обновлять установленные пакеты от случая к случаю. Из уведомления они узнают, что должны обновить пакет без промедления сразу же после появления исправленной версии.

Учитывая огромное число портов в дереве, невозможно по каждому случаю выпускать бюллетень безопасности без создания флуда и потери внимания сообщества к моменту появления действительно серьезных причин. Поэтому уязвимости безопасности, обнаруженные в портах, записываются в базу данных FreeBSD VuXML. Члены Команды Офицеров Безопасности проводят их мониторинг на предмет появления вопросов, требующих их вмешательства.

Если вы обладаете правами коммиттера, вы можете сам обновить базу данных VuXML. Так вы поможете Команде Офицеров Безопасности и своевременно пошлете ценную информацию сообществу. Тем не менее, если вы не являетесь коммиттером или верите, что нашли исключительно серьезную уязвимость, или что-то еще, то не задумываясь свяжитесь с Командой Офицеров Безопасности напрямую как это описано на странице информационной безопасности FreeBSD.

Хорошо, вы выбрали трудный путь. Как это может быть очевидно из самого названия, база данных VuXML по существу является документом XML. Его исходный файл vuln.xml содержится прямо внутри порта security/vuxml. Поэтому полное имя пути к файлу будет PORTSDIR/security/vuxml/vuln.xml. Каждый раз, при обнаружении вами в порте уязвимости безопасности добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML, лучшее, что вы можете сделать, это найти существующую запись, подпадающую под ваш случай, затем скопировать ее и использовать в качестве шаблона.

11.3.2. Короткое вступление в VuXML

Полномасштабный XML очень сложен и выходит далеко за рамки этой книги. Тем не менее, для достижения основного понимания структуры записи VuXML, вам понадобится только нотация тегов. Имена тегов XML обрамляются в угловые скобки. Каждый открывающий <тег> должен иметь совпадающий закрывающий </tag>. Теги могут быть вложенными. При вложенности внутренние теги должны быть закрыты до закрытия внешних. Существует иерархия тегов, т.е. более сложные правила вкладывания тегов. Очень похоже на HTML, правда? Основное отличие в расширяемости XML, т.е. определении собственных тегов. Из-за своей характерной структуры, XML придает форму разрозненным данным. В частности, XML подходит для разметки описаний уязвимостей безопасности.

Теперь давайте возьмем настоящую запись VuXML:

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

Имена тегов должны быть самодокументируемыми, чтобы мы сфокусировались только на полях, нужных нам для заполнения:

(1)
Это тег верхнего уровня записи VuXML. У него есть обязательный атрибут vid, указывающий на универсальный уникальный идентификатор (UUID) для этой записи (в кавычках). Вы должны формировать UUID для каждой новой записи VuXML (и не забудьте заменить ее для шаблона UUID, если вы не пишете запись с нуля). Для получения VuXML UUID вы можете использовать uuidgen(1); иначе, если вы используете FreeBSD 4.x, вы можете установить порт devel/p5-Data-UUID и выполнить следующую команду:
perl -MData::UUID -le 'print lc new Data::UUID->create_str'
(2)
Однострочное описание найденной проблемы.
(3)
Здесь перечислены имена затронутых пакетов. Может быть дано несколько имен, поскольку некоторые пакеты могут быть основаны на одном главном порте или программном продукте. Сюда можно включить стабильную ветвь и ветвь разработки, локализованные версии и подчиненные порты, зависящие от различного выбора важных вариантов конфигурации, указанных на этапе построения.

Важно: Поиск всех подобных пакетов при написании записи VuXML входит в зону вашей ответственности. Имейте в виду, что make search name=foo это ваш друг. Первичные точки для поиска следующие:

  • вариант foo-devel для порта foo;

  • другие варианты с суффиксами вида -a4 (для пакетов, связанных с печатью), -without-gui (для пакетов с отключенной поддержкой X), или подобных;

  • jp-, ru-, zh- и другие возможные локализованные варианты в соответствующих национальных категориях коллекции портов.

(4)
Здесь указаны затронутые версии пакета(-ов) как один или более диапазонов с использованием комбинации элементов <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 включительно, версии 2.x до 2.4_1 и версия 3.0b1.

(5)
Некоторые связанные группы пакетов (в конечном счете, порты) могут быть указаны в разделе <affected>. Это можно использовать, если некоторые программные продукты (скажем, FooBar, FreeBar and OpenBar) являются производными от общей кодовой базы и всё еще совместно используют её ошибки и уязвимости. Имейте в виду отличие от перечисления множественных имён в одном разделе <package>.
(6)
Диапазоны версий должны учитывать PORTEPOCH и PORTREVISION, если это применимо. Пожалуйста, помните, что в соответствии с правилами сравнения строк версия с ненулевым значением PORTEPOCH выше, чем любая версия без PORTEPOCH, например, 3.0,1 выше, чем 3.1 или даже 8.9.
(7)
Сводная информация о проблеме. В этом поле используется XHTML. По крайней мере, должны быть обрамляющие <p> и </p>. Может быть использована более сложная разметка, но только в целях аккуратности и ясности: без эстетства, пожалуйста.
(8)
Этот раздел содержит ссылки на имеющие отношение документы. Приветствуется как можно большее количество ссылок.
(9)
Это бюллетень безопасности FreeBSD.
(10)
Это сообщение об ошибке FreeBSD.
(11)
Идентификатор Mitre CVE.
(12)
Это SecurityFocus Bug ID.
(13)
Бюллетень безопасности US-CERT.
(14)
Примечание к уязвимости US-CERT.
(15)
Уведомление системы Cyber Security Alert US-CERT.
(16)
Уведомление системы Technical Cyber Security Alert US-CERT.
(17)
URL к архивному сообщению в списке рассылки. Атрибут msgid является необязательным и может указывать на message ID сообщения.
(18)
Основной URL. Должен быть использован в случае, если не подходит ни одна из категорий источника.
(19)
Дата последнего изменения любой информации данной записи (YYYY-MM-DD). Новые записи не должны включать это поле. Поле должно быть добавлено после редактирования существующей записи.

11.3.3. Тестирование ваших изменений в базе данных VuXML

Предположим, что вы только что написали или заполнили запись об уязвимости в пакете clamav, которая была исправлена в версии 0.65_7.

Прежде всего, вам нужно установить свежие версии портов ports-mgmt/portaudit и ports-mgmt/portaudit-db.

Во-первых, проверьте, нет ли уже записи об этой уязвимости. Если такая запись есть, она может совпадать с предыдущей версией пакета 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

Замечание: Вам понадобится установить по крайней мере один из следующих пакетов: textproc/libxml2, textproc/jade.

Теперь выполните перепостроение базы данных portaudit из файла VuXML:

% packaudit

Чтобы убедиться, что раздел <affected> в вашей записи совпадает с правильными пакетами, выполните следующую команду:

% 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
По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.