Ссылка доступна только зарегистрированным пользователям задумывался как поисковик для Security Content-а: уязвимостей, бюллетеней безопасности, эксплоитов, плагинов детекта и прочей полезной информации. Но мы подумали: если у нас уже есть разобранные бюллетени безопасности для основных Linux-дистрибутивов, почему бы нам не сделатьСсылка доступна только зарегистрированным пользователям, который будет брать данные о системе, а на выходе отдавать список уязвимостей. Также, как это делают привычные сканеры уязвимостей, только быстрее и бесплатно. Откуда мы получаем информацию об уязвимостях Linux? Для этого мы парсим бюллетени вендоров. Покажем процедуру разбора на примере бюллетеня безопасности Debian DSA-3638.Ссылка доступна только зарегистрированным пользователям Мы видим, что уязвим 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) структура версий отличается. И соответственно отличается механика их сравнения. Для того, чтобы обеспечить достоверность сканирования, необходимо реализовывать сравнение версий ровно по тому же алгоритму, как он сделан в самой операционной системе. К счастью, какой-то тайны в этом нет, есть готовые примеры Ссылка доступна только зарегистрированным пользователям. На сегодняшний день мы готовы вам предложить Ссылка доступна только зарегистрированным пользователям, с помощью которого можно проверить свой сервер на уязвимости, полноценное API для автоматизации и Ссылка доступна только зарегистрированным пользователям для нашего будущего облачного решения по управлению уязвимостями. Поддерживаются следующие дистрибутивы Linux: RedHat, CentOS, Fedora, Oracle Linux, Ubuntu, Debian. Графический интерфейс доступен Ссылка доступна только зарегистрированным пользователям. Найденные уязвимости: Аналогично можно работать через 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/CARTIAL/IARTIAL/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,