Когда вы сталкиваетесь с новой уязвимостью, какая мысль приходит первой? Конечно, отреагировать как можно быстрее. Однако, скорость — всего лишь одно из условий эффективной борьбы с ИБ-угрозами. Когда речь идет о корпоративной безопасности, не менее важно безошибочно определять, на что стоит реагировать в первую очередь. Недооцененная угроза может стать причиной серьезных убытков или потери деловой репутации. Но если число уязвимостей постоянно растет, как быстро оценить их значимость и не упустить важные детали?

Динамика числа уязвимостей по группам CVSS (источник — vulners.com)
Для ранжирования уязвимостей по различным критериям традиционно применяется шкала CVSS Score (Common Vulnerability Scoring System), ранжирующая уязвимости по различным критериям, от сложности эксплуатации до наносимого вреда и других параметров.
Казалось бы, зачем придумывать что-то еще — но у CVSS Score есть одно слабое место — она строится на экспертных оценках, не подкрепленных реальной статистикой. Гораздо эффективнее было бы предлагать экспертам уже отобранные по определенным количественным критериям кейсы и принимать решения на основании проверенных данных — но где взять эти данные и что с ними делать дальше? Звучит как необычная и интересная задача для датасаентиста – и именно этот вызов вдохновил меня и команду Vulners на новую концепцию оценки и классификацию уязвимостей на основе графа связанной информации.
Почему графы? В случае социальных сетей и СМИ графовые методы давно и успешно применяются для различных целей: от анализа распространения контента в новостном потоке, до заметок о влиянии ТОПовых авторов на мнение читателей и кластеризации социальной сети по интересам. Любая уязвимость может быть представлена как граф, содержащий данные — новости об изменениях в software или hardware и вызванных ими эффектах.
Мне не пришлось вручную собирать новости о каждом обновлении, все необходимые тексты нашлись в открытой базе уязвимостей vulners.com. Визуально данные выглядят следующим образом:

Каждая уязвимость, помимо названия, даты публикации и описания, имеет уже присвоенный ей тип (cve, nessus и пр.) семейство (NVD, scanner, exploit и пр.), оценку CVSS (здесь и далее используется CVSS v2), а также ссылки на связанные новости.
Если представить эти связи схематично в виде графа, то одна уязвимость будет выглядеть следующим образом: оранжевый кружок обозначает исходную или родительскую публикацию, черные кружки – новости, на которые можно кликнуть, находясь на родительской страничке, а серые кружки – связанные новости, добраться до которых можно только пройдя по всем публикациям, обозначенным черными кружками. Каждый цвет кружков – это новый уровень графа связанной информации, от нулевого – исходной уязвимости, до первого, второго и так далее.

Конечно, при просмотре одной новости нам известны только нулевой и первый уровень, поэтому для получения всех данных был использован метод обхода графа в глубину, позволяющий распутать клубок новостей от начала до самых последних связанных узлов (далее — нод графа). На этом этапе вылезли проблемы оптимизации — сборка графа за длительный период занимала большое время и пришлось поколдовать как со скриптом, так и структурой данных. Кстати, итоговые данные я решила упаковать в parquet для последующей работы с ними при помощи spark sql, что очень облегчило первичный анализ.
Как же выглядят графовые данные? Лучше всего понять их природу нам поможет визуализация. На рисунке 4 представлен граф известной, но не очень опасной уязвимости Heartbleed (всего 5 из 10 баллов по шкале cvss).

Глядя на этот пышный «букет» из связанных новостей и эксплойтов, где красная точка – исходная уязвимость, мы понимаем, что Heartbleed был существенно недооценен.
На этом примере можно сделать вывод о том, что системность, продолжительность и другие параметры уязвимости неплохо оцениваются при помощи графовых метрик. Ниже пару примеров метрик из исследования, которые послужили базой для альтернативной классификации:
Конечно, это не все метрики, под капотом исследования сейчас порядка 30 показателей, дополняющих базовый набор CVSS критериев, в том числе средний прирост между уровнями новостного графа уязвимости, доля эксплойтов на первом уровне графа и многое другое.
А теперь немного data science и статистики — ведь гипотезы нужно подтверждать на данных, не так ли?
Для эксперимента с альтернативной шкалой и новыми метриками были отобраны новости, опубликованные в январе 2019 года. Это 2403 бюллетеня и около 150 тысяч строк в графе новостей. Все исходные уязвимости были разделены на три группы по CVSS Score:
Для начала посмотрим, как CVSS-балл коррелирует с числом связанных новостей в графе, числом типов новостей и числом эксплойтов:



В идеальной картинке мы должны были увидеть четкое разделение метрик на три кластера, однако этого не произошло, что указало на возможное наличие серой зоны, которую CVSS Score не определяет – это и есть наша цель.
Следующим логичным шагом стала кластеризация уязвимостей в однородные группы и построение новой шкалы.
Для первой итерации был выбран простой метрический классификатор и k-means и получена новая матрица оценок: по оси У находятся исходные баллы (Medium, Low, High), по X, где 2 — максимально крупные по новым метрикам уязвимости, 1 — новые уязвимости, 0 — самые маленькие.

Зона, помеченная овалом (класс уязвимостей 2 с первоначальной оценкой low & medium) —потенциально недооцененные уязвимости. Разделение на новые классы тоже выглядит уже более четким, чего мы и добивались:



Однако, просто доверять модели — плохая идея, особенно, если речь идет об unsupervised кластеризации, где правильный ответ в принципе не известен, и полагаться можно лишь на метрики разделения полученных классов.
И именно тут нам потребуется знание эксперта — ведь для хорошей проверки и интерпретации результатов необходимо знание предметной области. Поэтому желательно точечно проверить модель, например, вытащив пару уязвимостей для детального анализа.
Ниже приведены несколько ярких образцов из серой зоны, имеющих н��зкий балл CVSS, но высокий графовый балл – а значит, потенциально требующих другого приоритета работы с ними. Вот как они выглядят в графовом представлении:
CVE-2019-0555 (CVSS балл 4.4, графовый класс 2 — high)


SMB_NT_MS19_JAN_DOTNET.NASL (CVSS балл 5.0, графовый класс 2 — high)


CVE-2019-1653 (CVSS балл 5.0, графовый класс 2 — high)


RHSA-2019:0130 (CVSS балл 5.0, графовый класс 2 — high)


Похоже, что концепция подтвердилась статистикой и точечной проверкой, поэтому в ближайшем будущем мы хотим доработать и автоматизировать сбор графовых метрик, и — возможно — сам классификатор. Конечно, предстоит еще очень много работы – от сбора огромного числа новых графов по неохваченным в исследовании месяцам, но это лишь добавляет энтузиазма, как и сама суть задачи. Как датасаентист могу сказать, что работа над этим исследованием была невероятно вдохновляющим опытом, как с точки зрения темы, так и сложности — даже подготовительная инженерная работа со слабо структурированными данными была очень интересна.
Как сделать шаг от экспертных оценок к реальным цифрам и оценить неоценимое?
После исследования стало ясно, что первую очередь, необходим критичный подход не только к любой метрике или данным, но и к процессу в целом, ведь мир слишком динамичен и меняется быстрее, чем методологии и документация. Всегда оценивали одним способом — почему бы и не попробовать сместить угол зрения? Как показывает наш пример, даже самые необычные гипотезы могут подтвердиться.
Немаловажную роль играет и доступность данных для датасаентистов – она позволяет быстро проверить самые смелые гипотезы и лучше понять суть вашей предметной области во всех ее проявлениях. Поэтому если вы еще не собираете или удаляете «ненужные» данные — подумайте, возможно там таится немало открытий. Этот кейс подсказывает, что data driven и information security отлично дополняют друг друга.

Динамика числа уязвимостей по группам CVSS (источник — vulners.com)
Для ранжирования уязвимостей по различным критериям традиционно применяется шкала CVSS Score (Common Vulnerability Scoring System), ранжирующая уязвимости по различным критериям, от сложности эксплуатации до наносимого вреда и других параметров.
Казалось бы, зачем придумывать что-то еще — но у CVSS Score есть одно слабое место — она строится на экспертных оценках, не подкрепленных реальной статистикой. Гораздо эффективнее было бы предлагать экспертам уже отобранные по определенным количественным критериям кейсы и принимать решения на основании проверенных данных — но где взять эти данные и что с ними делать дальше? Звучит как необычная и интересная задача для датасаентиста – и именно этот вызов вдохновил меня и команду Vulners на новую концепцию оценки и классификацию уязвимостей на основе графа связанной информации.
Почему графы? В случае социальных сетей и СМИ графовые методы давно и успешно применяются для различных целей: от анализа распространения контента в новостном потоке, до заметок о влиянии ТОПовых авторов на мнение читателей и кластеризации социальной сети по интересам. Любая уязвимость может быть представлена как граф, содержащий данные — новости об изменениях в software или hardware и вызванных ими эффектах.
О данных
Мне не пришлось вручную собирать новости о каждом обновлении, все необходимые тексты нашлись в открытой базе уязвимостей vulners.com. Визуально данные выглядят следующим образом:

Каждая уязвимость, помимо названия, даты публикации и описания, имеет уже присвоенный ей тип (cve, nessus и пр.) семейство (NVD, scanner, exploit и пр.), оценку CVSS (здесь и далее используется CVSS v2), а также ссылки на связанные новости.
Если представить эти связи схематично в виде графа, то одна уязвимость будет выглядеть следующим образом: оранжевый кружок обозначает исходную или родительскую публикацию, черные кружки – новости, на которые можно кликнуть, находясь на родительской страничке, а серые кружки – связанные новости, добраться до которых можно только пройдя по всем публикациям, обозначенным черными кружками. Каждый цвет кружков – это новый уровень графа связанной информации, от нулевого – исходной уязвимости, до первого, второго и так далее.

Конечно, при просмотре одной новости нам известны только нулевой и первый уровень, поэтому для получения всех данных был использован метод обхода графа в глубину, позволяющий распутать клубок новостей от начала до самых последних связанных узлов (далее — нод графа). На этом этапе вылезли проблемы оптимизации — сборка графа за длительный период занимала большое время и пришлось поколдовать как со скриптом, так и структурой данных. Кстати, итоговые данные я решила упаковать в parquet для последующей работы с ними при помощи spark sql, что очень облегчило первичный анализ.
Как же выглядят графовые данные? Лучше всего понять их природу нам поможет визуализация. На рисунке 4 представлен граф известной, но не очень опасной уязвимости Heartbleed (всего 5 из 10 баллов по шкале cvss).

Глядя на этот пышный «букет» из связанных новостей и эксплойтов, где красная точка – исходная уязвимость, мы понимаем, что Heartbleed был существенно недооценен.
На этом примере можно сделать вывод о том, что системность, продолжительность и другие параметры уязвимости неплохо оцениваются при помощи графовых метрик. Ниже пару примеров метрик из исследования, которые послужили базой для альтернативной классификации:
- число нод в графе — отвечает за «широту» уязвимости, насколько большой след она оставила в различных системах,
- число подграфов (крупных скоплений новостей) — отвечает за гранулярность проблемы или наличие крупных проблемных зон внутри уязвимости,
- число связанных эксплойтов и патчей — говорит о взрывоопасности новости и сколько раз ее приходилось «лечить»,
- количество уникальных типов и семейств новостей в графе — о системности, то есть числе подсистем, затронутых влиянием уязвимости,
- длительность от первой публикации до первого эксплойта, время от первой публикации до последней связанной новости — о темпоральной природе уязвимости, тянется ли он с большим «хвостом» последствий или быстро развивается и затухает.
Конечно, это не все метрики, под капотом исследования сейчас порядка 30 показателей, дополняющих базовый набор CVSS критериев, в том числе средний прирост между уровнями новостного графа уязвимости, доля эксплойтов на первом уровне графа и многое другое.
Открываем серую зону
А теперь немного data science и статистики — ведь гипотезы нужно подтверждать на данных, не так ли?
Для эксперимента с альтернативной шкалой и новыми метриками были отобраны новости, опубликованные в январе 2019 года. Это 2403 бюллетеня и около 150 тысяч строк в графе новостей. Все исходные уязвимости были разделены на три группы по CVSS Score:
- High — от 8 баллов включительно.
- Medium — от 6 включительно до 8 баллов.
- Low — менее 6 баллов.
Для начала посмотрим, как CVSS-балл коррелирует с числом связанных новостей в графе, числом типов новостей и числом эксплойтов:



В идеальной картинке мы должны были увидеть четкое разделение метрик на три кластера, однако этого не произошло, что указало на возможное наличие серой зоны, которую CVSS Score не определяет – это и есть наша цель.
Следующим логичным шагом стала кластеризация уязвимостей в однородные группы и построение новой шкалы.
Для первой итерации был выбран простой метрический классификатор и k-means и получена новая матрица оценок: по оси У находятся исходные баллы (Medium, Low, High), по X, где 2 — максимально крупные по новым метрикам уязвимости, 1 — новые уязвимости, 0 — самые маленькие.

Зона, помеченная овалом (класс уязвимостей 2 с первоначальной оценкой low & medium) —потенциально недооцененные уязвимости. Разделение на новые классы тоже выглядит уже более четким, чего мы и добивались:



Однако, просто доверять модели — плохая идея, особенно, если речь идет об unsupervised кластеризации, где правильный ответ в принципе не известен, и полагаться можно лишь на метрики разделения полученных классов.
И именно тут нам потребуется знание эксперта — ведь для хорошей проверки и интерпретации результатов необходимо знание предметной области. Поэтому желательно точечно проверить модель, например, вытащив пару уязвимостей для детального анализа.
Ниже приведены несколько ярких образцов из серой зоны, имеющих н��зкий балл CVSS, но высокий графовый балл – а значит, потенциально требующих другого приоритета работы с ними. Вот как они выглядят в графовом представлении:
CVE-2019-0555 (CVSS балл 4.4, графовый класс 2 — high)


SMB_NT_MS19_JAN_DOTNET.NASL (CVSS балл 5.0, графовый класс 2 — high)


CVE-2019-1653 (CVSS балл 5.0, графовый класс 2 — high)


RHSA-2019:0130 (CVSS балл 5.0, графовый класс 2 — high)


Похоже, что концепция подтвердилась статистикой и точечной проверкой, поэтому в ближайшем будущем мы хотим доработать и автоматизировать сбор графовых метрик, и — возможно — сам классификатор. Конечно, предстоит еще очень много работы – от сбора огромного числа новых графов по неохваченным в исследовании месяцам, но это лишь добавляет энтузиазма, как и сама суть задачи. Как датасаентист могу сказать, что работа над этим исследованием была невероятно вдохновляющим опытом, как с точки зрения темы, так и сложности — даже подготовительная инженерная работа со слабо структурированными данными была очень интересна.
В заключение
Как сделать шаг от экспертных оценок к реальным цифрам и оценить неоценимое?
После исследования стало ясно, что первую очередь, необходим критичный подход не только к любой метрике или данным, но и к процессу в целом, ведь мир слишком динамичен и меняется быстрее, чем методологии и документация. Всегда оценивали одним способом — почему бы и не попробовать сместить угол зрения? Как показывает наш пример, даже самые необычные гипотезы могут подтвердиться.
Немаловажную роль играет и доступность данных для датасаентистов – она позволяет быстро проверить самые смелые гипотезы и лучше понять суть вашей предметной области во всех ее проявлениях. Поэтому если вы еще не собираете или удаляете «ненужные» данные — подумайте, возможно там таится немало открытий. Этот кейс подсказывает, что data driven и information security отлично дополняют друг друга.
