Как стать автором
Обновить

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

Время на прочтение 9 мин
Количество просмотров 19K
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! Ждем предложений и пожеланий!
Теги:
Хабы:
+33
Комментарии 42
Комментарии Комментарии 42

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн