Аудит уязвимостей Linux c Vulners.com

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

    Ну. И что?
    Реклама
    Комментарии 41
    • +4
      Package parsing error. Require `rpm -qa` for rpm's or `dpkg-query -W -f='${Package} ${Version} ${Architecture} '` for deb systems.
      

      • 0
        Это через веб-интерфейс? Скиньте пожалуйста пример того, на чем упало мне в личку или на support@vulners.com. Мы оперативно поправим.
        • 0
          аналогично…
          libtext-soundex-perl 3.4-1build3 i386
          

          Даже из одной строчки вывод распарсить не может.
          • +3
            Привет! Сорри, ошибка была смешная — я не проверял на наличие пустых строк как элементов массива и упорно пытался их распарсить. Вроде Fixed.
            На тех списках, которые вы мне кинули в почту, работает.
            Спасибо за фидбек!
            • 0
              Scanned 2793 Packages and found 0 Security Bulletins
              

              Заработало.
              Только добавьте ещё проверку на наличие строки только с пробелом (табом) — тоже ошибка вылазит и приходится делать лишние движения — возвращаться назад и снова вставлять список.
              • 0
                Сделал дополнительный .strip() пере проверкой.
        • 0
          А для Windows сделаете??
          • +1
            Когда-нибудь. В данный момент мы изучаем, как это парсить и собирать.
            Второй стадией уже сделаем такую же штуку для Win.
          • +5
            Огромное спасибище вам!
            • +1
              Не за что. Главное, что бы полезно было.
            • 0
              Передавать данные об актуальных уязвимостях третьим лицам, да еще и с адреса сервера (если белый IP) — вот этого хотелось бы избежать. Почему-то мне кажется, что платные сканеры уязвимостей имеют локальную БД с уязвимостями. Ну и во FreeBSD есть VuXML
              • 0
                У трех топовых Vulnerability Management вендоров есть облачные решения: Qualys Cloud Platform, Nessus Cloud, Rapid7 Nexpose Now. Причем у Qualys, лидера по объему рынка по версии Gartner-а, облачное решение является основным. У них есть и private cloud это экзотика для очень больших компаний. Это вопрос доверия VM-вендору. Если какая-то компания захочет иметь свой локальный Vulners, чтобы он хостился внутри компании и синхронизировал security content периодически, то думаю вполне реально договориться.
                Как альтернативный вариант — можно подмешивать к запросам какие-то несуществующие пакеты, потом исключать их уязимости из результатов. Можно сделать проксирующий сервер, и все запросы пропускать только через него.
                • 0
                  Возможно более безопасным был бы такой вариант — агент запрашивает по названию пакета, а ему возвращается список уязвимостей в версиях, который он фильтрует локально согласно версии пакета, и выводит актуальные уязвимости.
              • 0
                эх,Arch и OpenSUSE в списке не нашёл(((
                • 0
                  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
                    Спасибо, поправил :)

                    «OSVersion»: «7»
                    • 0
                      Спасибо, работает.

                      Еще для 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
                        Спасибо, вижу. Но вот это кажется за 5 минут не поправлю.
                        Пошел копать содержимое.
                  • 0
                    Эээ… Постойте, то есть вы хотите сказать, что для deb/rpm-based дистрибутивов не существует штатного аналога portaudit (FreeBSD) / glsa-check (Gentoo)???
                    • 0
                      Нет, аналоги вполне есть: http://lzone.de/Automated+Linux+Package+Vulnerability+Scanning

                      Debian — debsecan
                      RHEL: yum list-security

                      Тогда вопрос — зачем ваш сайт?
                      • 0
                        Ну вот мне нужно находить уязвимости в установленных джумлах, вордпрессах и их плагинах, о которых менеджеры пакетов не знают совсем. Правда, представленный агент о них тоже не знает, а методы нахождения версии у всех этих ЦМС и форумов сильно разнятся (про плагины вообще молчу), но задача в целом решаемая
                        • 0
                          Хороший вопрос. Действительно, есть различные утилиты для проверки уязвимостей для различных платформ. Vulnerability Management решение в общем случае позволяет отслеживать уязвимости единообразным способом для многих платформ, при этом обращение к репозиториям в момент проверки не требуется. Такое решение предоставляет подробную информацию о том, что за уязвимость была найдена, как её можно проэксплуатировать и запатчить и т.д. При работе с утилитами есть свои тонкости, например 'yum list-security' работает в RHEL, но не работает в CentOS. Если в компании зоопарк решений небольшой и не критично ставить все обновления без обязательного тестирования, безусловно можно обойтись и без сканера уязвимостей.
                          • 0
                            Вот вы что-то вроде ответили, а вроде бы и нет. Если что, я не вижу ничего плохого в том что есть причина не использовать центос.
                      • 0
                        Gentoo отсутствует. Было бы интересно.
                      • 0
                        Когда будет Suse (SLES)? Планируете ли парсить конфиги Cisco, Huawei, Palo Alto?
                        • +1
                          SUSE формально готова и лежит в базе, но мы ее не тестировали.
                          Если есть желание помочь — напишите нам письмо :) Так мы включим SUSE очень быстро.

                          Планируете ли парсить конфиги Cisco, Huawei, Palo Alto? --> Это прям сканер получится.
                          Увы, пока не знаю. Это фриварный sideproject для нашей команды, а не работа.
                          Будет время, успеем — напишем. Но пока парсер конфигов даже в планах не стоит.
                        • +2
                          Вы клевые, спасибо! :)
                          • 0
                            С рандомной сортировкой не очень удобно изучать уязвимости.
                            https://vulners.com/search?query=type:%20nginx
                            Почему бы по дефолту не сделать сортировку, как у всех, по дате?
                            Хотя это вопрос скорее не про аудит, а про поиск.
                            • 0
                              Там дефолтная сортировка «по лучшести». То есть по весу «насколько найденный элемент соответствует условиям поиска».
                              Согласен, это спорное состояние «по умолчанию». Но мы опирались на то, как работает Гугл/Яндекс.
                              Мы не правы? Поменять-то 5 минут. Но как правильно, мы пока не знаем.
                              • 0
                                Но как правильно, мы пока не знаем

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

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

                              проверьте алгоритм сравнения для 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
                              • 0
                                Пошли проверять)
                                • 0
                                  Исправлено:
                                  https://vulners.com/api/v3/audit/deb/?os=ubuntu&version=14&package=libnspr4%202:4.10.10-0ubuntu0.14.04.1%20amd64
                                  Очень веселая бага — в поисковом запросе в elasticsearch, который должен был выдавать кандидатов для анализа, мы использовали конструкцию вида OSVersion:«14*». Кто же знал, что символ wildcard нельзя использовать при поиске с фразой в кавычках )
                                  Теперь и мы об этом знаем. Спасибо за находку. Если вы в мск, то можем подарить вам кружку vulners, уж очень сочная ошибка была
                                  • 0

                                    а зачем вы используете wildcard для версий Ubuntu? Таким образом покрываете non-LTS версии?

                                    • 0
                                      wildcard используется только на предварительной выборке уязвимостей из базы. Дальше используется точное совпадение.
                                      • 0

                                        так а не проще сразу забирать точное совпадение?

                                        • 0
                                          Мы на всякий случай проверяем потом еще и неточное. Вендор не всегда указывает все правильно.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое