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! Ждем предложений и пожеланий!
Поделиться с друзьями
-->

Комментарии (34)


  1. zbestr
    22.08.2016 15:11
    +4

    Package parsing error. Require `rpm -qa` for rpm's or `dpkg-query -W -f='${Package} ${Version} ${Architecture} '` for deb systems.
    


    1. avleonov
      22.08.2016 15:19

      Это через веб-интерфейс? Скиньте пожалуйста пример того, на чем упало мне в личку или на support@vulners.com. Мы оперативно поправим.


    1. Loki3000
      22.08.2016 15:46

      аналогично…

      libtext-soundex-perl 3.4-1build3 i386
      

      Даже из одной строчки вывод распарсить не может.


      1. isox
        22.08.2016 16:03
        +3

        Привет! Сорри, ошибка была смешная — я не проверял на наличие пустых строк как элементов массива и упорно пытался их распарсить. Вроде Fixed.
        На тех списках, которые вы мне кинули в почту, работает.
        Спасибо за фидбек!


        1. zbestr
          22.08.2016 16:34

          Scanned 2793 Packages and found 0 Security Bulletins
          

          Заработало.
          Только добавьте ещё проверку на наличие строки только с пробелом (табом) — тоже ошибка вылазит и приходится делать лишние движения — возвращаться назад и снова вставлять список.


          1. isox
            22.08.2016 16:38

            Сделал дополнительный .strip() пере проверкой.


  1. whiplash
    22.08.2016 16:15

    А для Windows сделаете??


    1. isox
      22.08.2016 16:17
      +1

      Когда-нибудь. В данный момент мы изучаем, как это парсить и собирать.
      Второй стадией уже сделаем такую же штуку для Win.


  1. 640509-040147
    22.08.2016 18:14
    +5

    Огромное спасибище вам!


    1. isox
      22.08.2016 20:03
      +1

      Не за что. Главное, что бы полезно было.


  1. BasilioCat
    22.08.2016 22:05

    Передавать данные об актуальных уязвимостях третьим лицам, да еще и с адреса сервера (если белый IP) — вот этого хотелось бы избежать. Почему-то мне кажется, что платные сканеры уязвимостей имеют локальную БД с уязвимостями. Ну и во FreeBSD есть VuXML


    1. avleonov
      22.08.2016 23:38

      У трех топовых Vulnerability Management вендоров есть облачные решения: Qualys Cloud Platform, Nessus Cloud, Rapid7 Nexpose Now. Причем у Qualys, лидера по объему рынка по версии Gartner-а, облачное решение является основным. У них есть и private cloud это экзотика для очень больших компаний. Это вопрос доверия VM-вендору. Если какая-то компания захочет иметь свой локальный Vulners, чтобы он хостился внутри компании и синхронизировал security content периодически, то думаю вполне реально договориться.
      Как альтернативный вариант — можно подмешивать к запросам какие-то несуществующие пакеты, потом исключать их уязимости из результатов. Можно сделать проксирующий сервер, и все запросы пропускать только через него.


      1. BasilioCat
        23.08.2016 07:22

        Возможно более безопасным был бы такой вариант — агент запрашивает по названию пакета, а ему возвращается список уязвимостей в версиях, который он фильтрует локально согласно версии пакета, и выводит актуальные уязвимости.


  1. rusbaron
    22.08.2016 22:48

    эх,Arch и OpenSUSE в списке не нашёл(((


  1. bfuvx
    22.08.2016 23:44

    curl -s https://vulners.com/api/v3/search/id?id=RHSA-2015:1943 | grep OSVersion | uniq
                "OSVersion": "any",
    

    Получаем «OSVersion»: «any» для всех пакетов, хотя тут видим, что этот RHSA-announce актуален только для RedHat версий 7.*.


    1. isox
      22.08.2016 23:46
      +1

      Спасибо, поправил :)

      «OSVersion»: «7»


      1. bfuvx
        23.08.2016 01:17

        Спасибо, работает.

        Еще для RedHat находятся «лишние» уязвимости, из-за того парсятся бюллетени не только для «Red Hat Enterprise Linux Server», а и для всех остальных дистрибутивов заданной ветки (например Red Hat Gluster Storage Server).

        Пример:

        curl -s "https://vulners.com/api/v3/audit/rpm/?os=redhat&version=6.8&package=samba-winbind-clients-3.6.23-35.el6_8.x86_64" | grep bulletinID -m1
                    "bulletinID": "RHSA-2016:0015",
        

        В то время как RHSA-2016:0015 актуален только для Red Hat Gluster Storage Server.

        Т.е. или нужно связать redhat только с «Red Hat Enterprise Linux Server» или добавить возможность указать более точно версию RedHat.


        1. isox
          23.08.2016 08:37
          +1

          Спасибо, вижу. Но вот это кажется за 5 минут не поправлю.
          Пошел копать содержимое.


  1. slonopotamus
    23.08.2016 10:15

    Эээ… Постойте, то есть вы хотите сказать, что для deb/rpm-based дистрибутивов не существует штатного аналога portaudit (FreeBSD) / glsa-check (Gentoo)???


    1. slonopotamus
      23.08.2016 11:12

      Нет, аналоги вполне есть: http://lzone.de/Automated+Linux+Package+Vulnerability+Scanning

      Debian — debsecan
      RHEL: yum list-security

      Тогда вопрос — зачем ваш сайт?


      1. BasilioCat
        23.08.2016 11:42

        Ну вот мне нужно находить уязвимости в установленных джумлах, вордпрессах и их плагинах, о которых менеджеры пакетов не знают совсем. Правда, представленный агент о них тоже не знает, а методы нахождения версии у всех этих ЦМС и форумов сильно разнятся (про плагины вообще молчу), но задача в целом решаемая


      1. avleonov
        23.08.2016 13:03

        Хороший вопрос. Действительно, есть различные утилиты для проверки уязвимостей для различных платформ. Vulnerability Management решение в общем случае позволяет отслеживать уязвимости единообразным способом для многих платформ, при этом обращение к репозиториям в момент проверки не требуется. Такое решение предоставляет подробную информацию о том, что за уязвимость была найдена, как её можно проэксплуатировать и запатчить и т.д. При работе с утилитами есть свои тонкости, например 'yum list-security' работает в RHEL, но не работает в CentOS. Если в компании зоопарк решений небольшой и не критично ставить все обновления без обязательного тестирования, безусловно можно обойтись и без сканера уязвимостей.


        1. GlukKazan
          21.12.2016 13:39

          Выслал контакты в личку.
          Буду рад пообщаться.


  1. delvin-fil
    23.08.2016 12:23

    Gentoo отсутствует. Было бы интересно.


    1. slonopotamus
      23.08.2016 13:23

      https://wiki.gentoo.org/wiki/Security_Handbook/Staying_up-to-date


  1. tsma11
    23.08.2016 12:23

    Когда будет Suse (SLES)? Планируете ли парсить конфиги Cisco, Huawei, Palo Alto?


    1. isox
      23.08.2016 14:17
      +1

      SUSE формально готова и лежит в базе, но мы ее не тестировали.
      Если есть желание помочь — напишите нам письмо :) Так мы включим SUSE очень быстро.

      Планируете ли парсить конфиги Cisco, Huawei, Palo Alto? --> Это прям сканер получится.
      Увы, пока не знаю. Это фриварный sideproject для нашей команды, а не работа.
      Будет время, успеем — напишем. Но пока парсер конфигов даже в планах не стоит.


  1. kreon
    23.08.2016 19:43
    +2

    Вы клевые, спасибо! :)


  1. bi4o4ek
    24.08.2016 10:19

    С рандомной сортировкой не очень удобно изучать уязвимости.
    https://vulners.com/search?query=type:%20nginx
    Почему бы по дефолту не сделать сортировку, как у всех, по дате?
    Хотя это вопрос скорее не про аудит, а про поиск.


    1. isox
      24.08.2016 10:54

      Там дефолтная сортировка «по лучшести». То есть по весу «насколько найденный элемент соответствует условиям поиска».
      Согласен, это спорное состояние «по умолчанию». Но мы опирались на то, как работает Гугл/Яндекс.
      Мы не правы? Поменять-то 5 минут. Но как правильно, мы пока не знаем.


      1. shweew
        24.08.2016 13:13

        Но как правильно, мы пока не знаем

        Предоставить выбор пользователю.

        И да, хотелось бы в списке ОС увидеть OpenSuSE и SLES/SLED.


        1. isox
          24.08.2016 17:55

          Для SLES/SLED вроде все данные есть.
          Если вы можете помочь их потестить — пожалуйста, напишите нам.
          Что бы запуститься надо не много, только протестировать.


          1. shweew
            24.08.2016 18:20

            Что нужно сделать, что бы протестировать?


  1. tsma11
    01.09.2016 13:08

    проверьте алгоритм сравнения для deb


    USN-3028-1
    libnspr4 2:4.10.10-0ubuntu0.14.04.1 amd64


    >>> import apt_pkg
    >>> apt_pkg.init_system()
    >>> apt_pkg.version_compare("2:4.10.10-0ubuntu0.14.04.1", "2:4.12-0ubuntu0.14.04.1")
    -2