Откуда мы получаем информацию об уязвимостях 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)
BasilioCat
22.08.2016 22:05Передавать данные об актуальных уязвимостях третьим лицам, да еще и с адреса сервера (если белый IP) — вот этого хотелось бы избежать. Почему-то мне кажется, что платные сканеры уязвимостей имеют локальную БД с уязвимостями. Ну и во FreeBSD есть VuXML
avleonov
22.08.2016 23:38У трех топовых Vulnerability Management вендоров есть облачные решения: Qualys Cloud Platform, Nessus Cloud, Rapid7 Nexpose Now. Причем у Qualys, лидера по объему рынка по версии Gartner-а, облачное решение является основным. У них есть и private cloud это экзотика для очень больших компаний. Это вопрос доверия VM-вендору. Если какая-то компания захочет иметь свой локальный Vulners, чтобы он хостился внутри компании и синхронизировал security content периодически, то думаю вполне реально договориться.
Как альтернативный вариант — можно подмешивать к запросам какие-то несуществующие пакеты, потом исключать их уязимости из результатов. Можно сделать проксирующий сервер, и все запросы пропускать только через него.BasilioCat
23.08.2016 07:22Возможно более безопасным был бы такой вариант — агент запрашивает по названию пакета, а ему возвращается список уязвимостей в версиях, который он фильтрует локально согласно версии пакета, и выводит актуальные уязвимости.
bfuvx
22.08.2016 23:44curl -s https://vulners.com/api/v3/search/id?id=RHSA-2015:1943 | grep OSVersion | uniq "OSVersion": "any",
Получаем «OSVersion»: «any» для всех пакетов, хотя тут видим, что этот RHSA-announce актуален только для RedHat версий 7.*.isox
22.08.2016 23:46+1Спасибо, поправил :)
«OSVersion»: «7»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.isox
23.08.2016 08:37+1Спасибо, вижу. Но вот это кажется за 5 минут не поправлю.
Пошел копать содержимое.
slonopotamus
23.08.2016 10:15Эээ… Постойте, то есть вы хотите сказать, что для deb/rpm-based дистрибутивов не существует штатного аналога portaudit (FreeBSD) / glsa-check (Gentoo)???
slonopotamus
23.08.2016 11:12Нет, аналоги вполне есть: http://lzone.de/Automated+Linux+Package+Vulnerability+Scanning
Debian — debsecan
RHEL: yum list-security
Тогда вопрос — зачем ваш сайт?BasilioCat
23.08.2016 11:42Ну вот мне нужно находить уязвимости в установленных джумлах, вордпрессах и их плагинах, о которых менеджеры пакетов не знают совсем. Правда, представленный агент о них тоже не знает, а методы нахождения версии у всех этих ЦМС и форумов сильно разнятся (про плагины вообще молчу), но задача в целом решаемая
avleonov
23.08.2016 13:03Хороший вопрос. Действительно, есть различные утилиты для проверки уязвимостей для различных платформ. Vulnerability Management решение в общем случае позволяет отслеживать уязвимости единообразным способом для многих платформ, при этом обращение к репозиториям в момент проверки не требуется. Такое решение предоставляет подробную информацию о том, что за уязвимость была найдена, как её можно проэксплуатировать и запатчить и т.д. При работе с утилитами есть свои тонкости, например 'yum list-security' работает в RHEL, но не работает в CentOS. Если в компании зоопарк решений небольшой и не критично ставить все обновления без обязательного тестирования, безусловно можно обойтись и без сканера уязвимостей.
tsma11
23.08.2016 12:23Когда будет Suse (SLES)? Планируете ли парсить конфиги Cisco, Huawei, Palo Alto?
isox
23.08.2016 14:17+1SUSE формально готова и лежит в базе, но мы ее не тестировали.
Если есть желание помочь — напишите нам письмо :) Так мы включим SUSE очень быстро.
Планируете ли парсить конфиги Cisco, Huawei, Palo Alto? --> Это прям сканер получится.
Увы, пока не знаю. Это фриварный sideproject для нашей команды, а не работа.
Будет время, успеем — напишем. Но пока парсер конфигов даже в планах не стоит.
bi4o4ek
24.08.2016 10:19С рандомной сортировкой не очень удобно изучать уязвимости.
https://vulners.com/search?query=type:%20nginx
Почему бы по дефолту не сделать сортировку, как у всех, по дате?
Хотя это вопрос скорее не про аудит, а про поиск.isox
24.08.2016 10:54Там дефолтная сортировка «по лучшести». То есть по весу «насколько найденный элемент соответствует условиям поиска».
Согласен, это спорное состояние «по умолчанию». Но мы опирались на то, как работает Гугл/Яндекс.
Мы не правы? Поменять-то 5 минут. Но как правильно, мы пока не знаем.shweew
24.08.2016 13:13Но как правильно, мы пока не знаем
Предоставить выбор пользователю.
И да, хотелось бы в списке ОС увидеть OpenSuSE и SLES/SLED.isox
24.08.2016 17:55Для SLES/SLED вроде все данные есть.
Если вы можете помочь их потестить — пожалуйста, напишите нам.
Что бы запуститься надо не много, только протестировать.
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
zbestr
avleonov
Это через веб-интерфейс? Скиньте пожалуйста пример того, на чем упало мне в личку или на support@vulners.com. Мы оперативно поправим.
Loki3000
аналогично…
Даже из одной строчки вывод распарсить не может.
isox
Привет! Сорри, ошибка была смешная — я не проверял на наличие пустых строк как элементов массива и упорно пытался их распарсить. Вроде Fixed.
На тех списках, которые вы мне кинули в почту, работает.
Спасибо за фидбек!
zbestr
Заработало.
Только добавьте ещё проверку на наличие строки только с пробелом (табом) — тоже ошибка вылазит и приходится делать лишние движения — возвращаться назад и снова вставлять список.
isox
Сделал дополнительный .strip() пере проверкой.