Vulners задумывался как поисковик для Security Content-а: уязвимостей, бюллетеней безопасности, эксплоитов, плагинов детекта и прочей полезной информации. Но мы подумали: если у нас уже есть разобранные бюллетени безопасности для основных Linux-дистрибутивов, почему бы нам не сделать сервис, который будет брать данные о системе, а на выходе отдавать список уязвимостей. Также, как это делают привычные сканеры уязвимостей, только быстрее и бесплатно.


Откуда мы получаем информацию об уязвимостях Linux? Для этого мы парсим бюллетени вендоров. Покажем процедуру разбора на примере бюллетеня безопасности Debian DSA-3638.

Изначальная информация на странице вендора:

https://security-tracker.debian.org/tracker/DSA-3638-1


Мы видим, что уязвим source пакет curl на операционной системе версии jessie и уязвимость исправлена в пакете версии 7.38.0-4+deb8u4. Но этой информации не достаточно, чтобы правильно определить уязвимость. curl в данном случае является source-пакетом, то есть на его основе собираются бинарные пакеты. Поэтому нужно найти все бинарные пакеты, собранные из пакета curl:

packages.debian.org/source/jessie/curl


В итоге мы считаем, что уязвимость есть для всех перечисленных пакетов версии меньше 7.38.0-4+deb8u4

https://vulners.com/api/v3/search/id?id=DSA-3638

{
  "result": "OK",
  "data": {
    "documents": {
      "DSA-3638": {
        "objectVersion": "1.0",
        "modified": "2016-08-03T00:00:00",
        "affectedPackage": [
          {
            "packageName": "libcurl3-nss",
            "packageVersion": "7.38.0-4+deb8u4",
            "packageFilename": "libcurl3-nss_7.38.0-4+deb8u4_all.deb",
            "arch": "all",
            "operator": "lt",
            "OSVersion": "8",
            "OS": "Debian GNU/Linux"
          },
          {
            "packageName": "curl",
            "packageVersion": "7.38.0-4+deb8u4",
            "packageFilename": "curl_7.38.0-4+deb8u4_all.deb",
            "arch": "all",
            "operator": "lt",
            "OSVersion": "8",
            "OS": "Debian GNU/Linux"
...

Как работает Аудит? Сначала нам нужно собрать и отправить на сервер информацию о пакетах и ОС. Версия ос содержится в файлах /etc/os-release, /etc/centos-release и других файлах, специфичных для тех или иных операционных систем. В качестве источника информации об установленных пакетах для rpm-based систем достаточно стандартной команды rpm -qa. В случае deb-based системы нужен вывод команды посложнее — dpkg-query -W -f='${Package} ${Version} ${Architecture}\n'

В ответ сервер вернет нам информацию о найденных уязвимостях. Рассчет происходит очень быстро. Мы обрабатываем 750 пакетов за 160ms! Можно подумать, что на сервере происходит какая-то магия. Но это не так, все на самом деле очень просто и так работаю практически все сканеры уязвимостей.

Рассмотрим пакет — curl 7.38.0-4+deb8u3 amd64 для Debian Linux. Имя пакета curl. Мы ищем в системы все бюллетени, которые содержат это пакет среди списка уязвимых пакетов. После того, как все такие бюллетени найдены, нужно пройтись по каждому из них и проверить, выполняется ли хотя бы одно из условие из перечисленных в поле affectedPackage. Возьмем для примера пакет DSA-3638:

{
 "OS": "Debian GNU/Linux",
 "operator": "lt",
 "packageFilename": "libcurl3-nss_7.38.0-4+deb8u4_all.deb",
 "OSVersion": "8",
 "packageVersion": "7.38.0-4+deb8u4",
 "packageName": "libcurl3-nss",
 "arch": "all"
}

Здесь указано, что уязвимость имеет место быть в случае, если:

— Операционная система — Debian GNU/Linux («OS»: «Debian GNU/Linux»)
— Версия этой операционной системы — 8 («OSVersion»: «8»)
— Установлен пакет с именем libcurl3-nss («packageName»: «libcurl3-nss»)
— Архитектура уязвимого пакета — любая
— И версия этого пакета меньше, чем 7.38.0-4+deb8u4 («operator»: «lt» и «packageVersion»: «7.38.0-4+deb8u4»)

Если все условия выполнились — пакет подвержен данной уязвимости DSA-3638. Для каждого пакета в системе мы проверяем все условия из бюллетеней и получаем список уязвимостей для системы. Как видите, какой-то сложности или магии в этом нет.

Важно отметить, ни в коем случае нельзя сравнивать версии как числа или строки. Для каждой из систем (debian, redhat, solaris) структура версий отличается. И соответственно отличается механика их сравнения. Для того, чтобы обеспечить достоверность сканирования, необходимо реализовывать сравнение версий ровно по тому же алгоритму, как он сделан в самой операционной системе. К счастью, какой-то тайны в этом нет, есть готовые примеры функций сравнения для того же debian.

На сегодняшний день мы готовы вам предложить веб-интерфейс, с помощью которого можно проверить свой сервер на уязвимости, полноценное API для автоматизации и PoС агента для нашего будущего облачного решения по управлению уязвимостями. Поддерживаются следующие дистрибутивы Linux: RedHat, CentOS, Fedora, Oracle Linux, Ubuntu, Debian.

Графический интерфейс доступен на вкладке Audit.



Найденные уязвимости:



Аналогично можно работать через Audit API. Задайте список установленных пакетов и версию ОС, а в ответ получите список уязвимостей и описание того почему мы считаем, что уязвимость действительно есть. Вы можете сравнить результаты с результатами своего сканера и попросите своего вендора объяснить расхождения. Ну или пните нас, что мы где-то накосячили ;-)

curl -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"os":"centos","package":["pcre-8.32-15.el7.x86_64", "samba-common-4.2.3-11.el7_2.noarch", "gnu-free-fonts-common-20120503-8.el7.noarch", "libreport-centos-2.1.11-32.el7.centos.x86_64", "libacl-2.2.51-12.el7.x86_64", "sos-3.2-35.el7.centos.noarch" ],"version":"7"}'  https://vulners.com/api/v3/audit/audit/
{
  "result": "OK",
  "data": {
    "reasons": [
      {
        "providedPackage": "sos-3.2-35.el7.centos.noarch",
        "operator": "lt",
        "bulletinID": "CESA-2016:0188",
        "providedVersion": "0:3.2-35.el7.centos",
        "bulletinPackage": "sos-3.2-35.el7.centos.3.noarch.rpm",
        "bulletinVersion": "3.2-35.el7.centos.3",
        "package": "sos-3.2-35.el7.centos.noarch"
      },
      {
        "providedPackage": "pcre-8.32-15.el7.x86_64",
        "operator": "lt",
        "bulletinID": "CESA-2016:1025",
        "providedVersion": "0:8.32-15.el7",
        "bulletinPackage": "pcre-8.32-15.el7_2.1.x86_64.rpm",
        "bulletinVersion": "8.32-15.el7_2.1",
        "package": "pcre-8.32-15.el7.x86_64"
      },
      {
        "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
        "operator": "lt",
        "bulletinID": "CESA-2016:1486",
        "providedVersion": "0:4.2.3-11.el7_2",
        "bulletinPackage": "samba-common-4.2.10-7.el7_2.noarch.rpm",
        "bulletinVersion": "4.2.10-7.el7_2",
        "package": "samba-common-4.2.3-11.el7_2.noarch"
      },
      {
        "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
        "operator": "lt",
        "bulletinID": "CESA-2016:0612",
        "providedVersion": "0:4.2.3-11.el7_2",
        "bulletinPackage": "samba-common-4.2.10-6.el7_2.noarch.rpm",
        "bulletinVersion": "4.2.10-6.el7_2",
        "package": "samba-common-4.2.3-11.el7_2.noarch"
      },
      {
        "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
        "operator": "lt",
        "bulletinID": "CESA-2016:0448",
        "providedVersion": "0:4.2.3-11.el7_2",
        "bulletinPackage": "samba-common-4.2.3-12.el7_2.noarch.rpm",
        "bulletinVersion": "4.2.3-12.el7_2",
        "package": "samba-common-4.2.3-11.el7_2.noarch"
      }
    ],
    "vulnerabilities": [
      "CESA-2016:1486",
      "CESA-2016:1025",
      "CESA-2016:0448",
      "CESA-2016:0612",
      "CESA-2016:0188"
    ],
    "cvelist": [
      "CVE-2015-5370",
      "CVE-2015-7560",
      "CVE-2016-2119",
      "CVE-2016-2118",
      "CVE-2015-7529",
      "CVE-2016-2112",
      "CVE-2016-2113",
      "CVE-2016-3191",
      "CVE-2015-8386",
      "CVE-2015-8388",
      "CVE-2015-8385",
      "CVE-2016-2110",
      "CVE-2015-5073",
      "CVE-2015-8391",
      "CVE-2015-2328",
      "CVE-2016-2115",
      "CVE-2015-3217",
      "CVE-2016-2114",
      "CVE-2016-2111"
    ],
    "cvss": {
      "vector": "AV:NETWORK/AC:LOW/Au:NONE/C:PARTIAL/I:PARTIAL/A:COMPLETE/",
      "score": 9.0
    },
    "packages": {
      "pcre-8.32-15.el7.x86_64": {
        "CESA-2016:1025": [
          {
            "providedPackage": "pcre-8.32-15.el7.x86_64",
            "operator": "lt",
            "bulletinID": "CESA-2016:1025",
            "providedVersion": "0:8.32-15.el7",
            "bulletinPackage": "pcre-8.32-15.el7_2.1.x86_64.rpm",
            "bulletinVersion": "8.32-15.el7_2.1",
            "package": "pcre-8.32-15.el7.x86_64"
          }
        ]
      },
      "sos-3.2-35.el7.centos.noarch": {
        "CESA-2016:0188": [
          {
            "providedPackage": "sos-3.2-35.el7.centos.noarch",
            "operator": "lt",
            "bulletinID": "CESA-2016:0188",
            "providedVersion": "0:3.2-35.el7.centos",
            "bulletinPackage": "sos-3.2-35.el7.centos.3.noarch.rpm",
            "bulletinVersion": "3.2-35.el7.centos.3",
            "package": "sos-3.2-35.el7.centos.noarch"
          }
        ]
      },
      "samba-common-4.2.3-11.el7_2.noarch": {
        "CESA-2016:1486": [
          {
            "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
            "operator": "lt",
            "bulletinID": "CESA-2016:1486",
            "providedVersion": "0:4.2.3-11.el7_2",
            "bulletinPackage": "samba-common-4.2.10-7.el7_2.noarch.rpm",
            "bulletinVersion": "4.2.10-7.el7_2",
            "package": "samba-common-4.2.3-11.el7_2.noarch"
          }
        ],
        "CESA-2016:0448": [
          {
            "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
            "operator": "lt",
            "bulletinID": "CESA-2016:0448",
            "providedVersion": "0:4.2.3-11.el7_2",
            "bulletinPackage": "samba-common-4.2.3-12.el7_2.noarch.rpm",
            "bulletinVersion": "4.2.3-12.el7_2",
            "package": "samba-common-4.2.3-11.el7_2.noarch"
          }
        ],
        "CESA-2016:0612": [
          {
            "providedPackage": "samba-common-4.2.3-11.el7_2.noarch",
            "operator": "lt",
            "bulletinID": "CESA-2016:0612",
            "providedVersion": "0:4.2.3-11.el7_2",
            "bulletinPackage": "samba-common-4.2.10-6.el7_2.noarch.rpm",
            "bulletinVersion": "4.2.10-6.el7_2",
            "package": "samba-common-4.2.3-11.el7_2.noarch"
          }
        ]
      }
    }
  }

И, наконец, агент для будущего облачного решения по управлению уязвимостями. Мы выступаем за прозрачность работы всех компонент, поэтом сделали агент полнофункциональным. Он не только собирает данные с системы и отправляет их на сервер Vulners-а для анализа и отображения, но и принимает с сервера рассчитанные списки уязвимостей и отображает их в консоли. Агентное решение выбрано не случайно. Оно дает наиболее быстрый и надежный результат, если один раз решить проблемы с автоматической разливкой агентов. Не нужно создавать какие-то учетные записи, открывать сетевые доступы для сканеров и разбираться, высчитывать параметры, и время, когда сканирование не будет забивать канал и тд. На текущий момент это всего лишь python-скрипт, но в дальнейшем будет полноценный пакет для системы.

$ git clone https://github.com/videns/vulners-scanner
$ cd vulners-scanner
$ ./linuxScanner.py 

             _
__   ___   _| |_ __   ___ _ __ ___
\ \ / / | | | | '_ \ / _ \ '__/ __|
 \ V /| |_| | | | | |  __/ |  \__ \
  \_/  \__,_|_|_| |_|\___|_|  |___/

==========================================
Host info - Host machine
OS Name - centos, OS Version - 7
Total found packages: 1026
Vulnerable packages:
    krb5-libs-1.13.2-10.el7.x86_64
        CESA-2016:0532 - 'Moderate krb5 Security Update', cvss.score - 6.8
    openssh-server-6.6.1p1-23.el7_2.x86_64
        CESA-2016:0465 - 'Moderate openssh Security Update', cvss.score - 7.7
    libtdb-1.3.6-2.el7.x86_64
        CESA-2016:0612 - 'Critical ipa Security Update', cvss.score - 0.0
    kernel-tools-3.10.0-327.4.5.el7.x86_64
        CESA-2016:1033 - 'Important kernel Security Update', cvss.score - 0.0
        CESA-2016:1633 - 'Important kernel Security Update', cvss.score - 4.3
        CESA-2016:0185 - 'Important kernel Security Update', cvss.score - 7.2
        CESA-2016:1539 - 'Important kernel Security Update', cvss.score - 7.2
        CESA-2016:1277 - 'Important kernel Security Update', cvss.score - 7.2
    openssl-libs-1.0.1e-51.el7_2.2.x86_64
        CESA-2016:0301 - 'Important openssl Security Update', cvss.score - 0.0
        CESA-2016:0722 - 'Important openssl Security Update', cvss.score - 10.0
    nss-softokn-3.16.2.3-13.el7_1.x86_64
        CESA-2016:0685 - 'Moderate nss-softokn Security Update', cvss.score - 6.8
...

Как видите анализ защищенности Linux, можно делать эффективнее и быстрее и без дорогостоящих сканеров уязвимостей. Мы, конечно, рекомендуем Vulners. Но если вы не хотите отправлять ничего на наш сервер, например волнуетесь за приватность, ты вы можете реализовать данный функционал самостоятельно. Э��о сделать не сложно. Вам потрубется реализовать функцию сравнения, скачать у нас полный набор данных по операционной системы, например набор для CentOS, и обработать свои данные так, как мы показали выше. Как делать сбор данных вы можете посмотреть в исходном коде нашего агента. Агент у нас открытый и мы были бы рады разивать его вместе с вами! Pull requests welcome! Ждем предложений и пожеланий!