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

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

В итоге мы считаем, что уязвимость есть для всех перечисленных пакетов версии меньше 7.38.0-4+deb8u4
{ "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}
'
В ответ сервер вернет нам информацию о найденных уязвимостях. Рассчет происходит очень быстро. Мы обрабатываем 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) структура версий отличается. И соответственно отличается механика их сравнения. Для того, чтобы обеспечить достоверность сканирования, необходимо реализовывать сравнение версий ровно по тому же алгоритму, как он сделан в самой операционной системе. К счастью, какой-то тайны в этом нет, есть готовые примеры
На сегодняшний день мы готовы вам предложить
Графический интерфейс доступен

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

Аналогично можно работать через 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" } ] } } } |
И, наконец,
$ 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 ... |