Аудит вразливостей 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 для автоматизації і РоС агента для нашого майбутнього хмарного рішення по управлінню уразливими. Підтримуються наступні дистрибутиви 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.1 e-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! Чекаємо пропозицій та побажань!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.