Данные об уязвимостях
CVSS простыми словами: как читать вектор и считать оценку
Что значит оценка CVSS вроде 9.8, как устроены векторы v4.0 и v3.1 и как разобрать и пересчитать вектор вручную.
Запись CVE называет уязвимость и указывает на вендора, а исправленную версию определяет бюллетень вендора.
Вы читаете новость о том, что уязвимость с номером CVE уже эксплуатируют. Через десять минут коллега спрашивает, закрыта ли она у вас. Номер — единственный факт, в котором новость и коллега сходятся. Он называет одну уязвимость. Насколько она опасна для ваших систем, какие ваши версии затронуты и что ставить, он не говорит.
В этой статье разобрано, что такое идентификатор CVE, кто его присваивает, что значит каждое поле записи CVE и что к ней добавляет National Vulnerability Database (NVD). В практической части мы прочитаем одну известную запись, CVE-2021-44228 (Log4Shell), поле за полем, на cve.org и через API NVD. Затем откроем бюллетень вендора, на который ссылается запись. Главное, что стоит запомнить: запись CVE ведёт вас к бюллетеню вендора, а бюллетень вендора — источник истины по исправленным версиям.
Если вы читали Что такое уязвимость, термины покажутся знакомыми. Лабораторная отправляет запросы только на чтение к двум публичным сервисам и одной публичной веб-странице.
CVE расшифровывается как Common Vulnerabilities and Exposures. Программа CVE, как сказано в её обзоре, выявляет, определяет и каталогизирует публично раскрытые уязвимости кибербезопасности. Каждая уязвимость получает одну запись, CVE Record, а ID — это указатель на неё. Он имеет вид CVE-YEAR-NUMBER. Год здесь — год резервирования ID, и часто он не совпадает с годом, когда ошибку написали или исправили.
ID — это имя. С ним двое людей или два инструмента могут сказать «вот эта» и иметь в виду одну и ту же уязвимость. В нём нет ни оценки серьёзности, ни списка затронутых продуктов, ни патча, ни статуса эксплуатации. Всё это хранится в записи, и часть данных приходит от других организаций.
Программа CVE работает через CVE Numbering Authorities, или CNA. Сайт CVE описывает их так: вендоры, исследователи, проекты с открытым исходным кодом, CERT, хостинговые сервисы, операторы программ bug bounty и консорциумы. Каждая из этих организаций вправе присваивать ID и публиковать записи в своём скоупе. Когда мы проверяли страницу CNA 2026-11-08, на ней было 564 CNA, включая 3 CNA-LR (CNA последней инстанции, для продуктов, которые не покрывает ни одна другая CNA). Число меняется, так что актуальное значение смотрите на странице.
Скоуп — слово, которое стоит запомнить. Apache Software Foundation — CNA для проектов Apache, поэтому в записи CVE-2021-44228 CNA указана она. CNA пишет заголовок, описание, список затронутых продуктов, ссылки и типы проблем. Другие стороны могут добавить данные позже, и тут в дело вступает NVD.
Названия полей ниже взяты из формата записи CVE JSON. JSON на cve.org и JSON из CVE API имеют одну структуру.
Состояние говорит, действует ли запись. В записи из этой лабораторной стоит "state": "PUBLISHED". Бывают и отклонённые записи, поэтому сначала проверяйте состояние.
CVE JSON содержит три даты: dateReserved, datePublished и dateUpdated. Для CVE-2021-44228 это 2021-11-26, 2021-12-10 и 2025-10-21. У NVD свои даты. Значение published там равно 2021-12-10, а lastModified в полученном нами ответе равно 2026-08-11. На странице cve.org отдельно показана дата «Updated», 2023-04-03, из блока provider metadata у CNA. Три источника дают три даты обновления. Сравните их, прежде чем решить, что у вас самый свежий текст.
Описание — это текст от CNA. В нём должно быть сказано, что это за уязвимость, что её вызывает и какие версии она затрагивает. Описание Log4Shell даёт затронутый диапазон, называет задействованную функцию (JNDI lookups в конфигурации, сообщениях лога и параметрах), указывает, когда это поведение отключили по умолчанию, и сообщает, что log4net и другие проекты логирования Apache не затронуты. Последнее предложение экономит полдня на патчинге не того, что нужно.
Этот блок — самая полезная часть записи, и прочитать его неправильно проще всего. Каждое утверждение о версии говорит, затронут диапазон, не затронут или его статус неизвестен, и может описывать изменения на конкретных номерах версий.
Страница cve.org показывает запись Log4j2 как временную шкалу: затронуты с 2.0-beta9, не затронуты с 2.3.1, затронуты с 2.4, не затронуты с 2.12.2, затронуты с 2.13.0 и не затронуты с 2.15.0. Версия получает статус ближайшей предшествующей точки изменения. Весь смысл в промежутках. Утверждение «всё ниже 2.15.0 уязвимо» здесь неверно, потому что 2.3.1 и 2.12.2 указаны как незатронутые.
Поле lessThan называет компонент, log4j-core*. В бюллетене Apache сказано, что приложение, использующее только JAR log4j-api, не затронуто. Читайте компонент вместе с версией. Кроме того, список полон ровно настолько, насколько его заполнила CNA. Продуктов, в которые библиотека встроена, там может не быть, и здесь помогают бюллетень вендора и данные конфигураций NVD.
Ссылки ведут на бюллетени вендоров, посты в рассылках, райтапы третьих сторон и иногда на страницы об эксплуатации. На странице cve.org для CVE-2021-44228 перечислены 53 ссылки, у каждой есть тег вроде vendor-advisory, mailing-list, third-party-advisory или exploit. Сначала читайте ссылки vendor-advisory. Сторонние страницы дают контекст, исправленные версии там искать не стоит. В копии этой записи в NVD ссылки хранятся в другом порядке, и первые пять ведут на страницы Packet Storm.
CWE — это Common Weakness Enumeration, каталог типов слабостей. CWE-20 — Improper Input Validation, а CWE-502 — Deserialization of Untrusted Data. CWE говорит, какого рода ошибка привела к уязвимости. Продукт она не называет.
CNA указывает CWE-20, CWE-400 и CWE-502. В записи NVD те же три, приписанные адресу безопасности Apache, и добавлена CWE-917, приписанная NVD. Следите за столбцом источника. Вы можете не согласиться с маппингом аналитика, и надо знать, чей маппинг вы читаете. CWE ещё и полезна для группировки. Поиск по CWE находит все уязвимости десериализации в разных продуктах, что помогает при код-ревью и моделировании угроз.
Метрики содержат оценки из разных источников.
CVSS (Common Vulnerability Scoring System) даёт базовую оценку от 0 до 10, метку серьёзности и векторную строку со входными параметрами: вектор атаки, сложность, привилегии, взаимодействие с пользователем, область действия и влияние. Запись NVD по CVSS v3.1 для этой CVE: 10.0, CRITICAL, вектор CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H. Есть и оценка NVD по CVSS v2.0: 9.3. Оценка описывает уязвимость при заявленных допущениях. Вашу реальную подверженность она не описывает.
SSVC — метод принятия решений, который спрашивает, идёт ли активная эксплуатация, можно ли автоматизировать атаку и насколько велико техническое воздействие. В этой записи есть данные SSVC от источника CISA coordinator: эксплуатация отмечена как активная, автоматизация возможна, техническое воздействие полное.
KEV — каталог CISA Known Exploited Vulnerabilities. В записи указаны дата добавления (2021-12-10), крайний срок выполнения (2021-12-24) и требуемое действие: установить обновления или убрать затронутые активы из сети. KEV означает, что эксплуатацию наблюдали. Насколько уязвимость серьёзна, это другой вопрос.
Метрики меняются. Смотрите на источник и дату рядом с каждым числом.
NVD ведёт NIST, и это проект, отдельный от программы CVE. База берёт записи CVE и добавляет то, чего CNA могла не дать: вычисленные или подтверждённые оценки CVSS, маппинг CWE, конфигурации CPE (машиночитаемые соответствия продуктов и версий), теги ссылок и поле статуса. API NVD по адресу services.nvd.nist.gov отдаёт эти дополненные записи. Панель NVD от NIST находится рядом с документацией API, так что проверяйте там уведомления, прежде чем считать обогащение актуальным.
Блок конфигураций — та часть, которую большинство никогда не открывает. В этой записи 20 блоков конфигураций и 396 записей соответствия CPE. Первая запись — пакет прошивки Siemens, так что список охватывает и продукты со встроенной библиотекой, помимо собственных релизов Apache. Пустая или скудная конфигурация может означать незавершённый анализ. Безопасности продукта она не доказывает.
Статус здесь Analyzed. Это значит, что база NVD обработала запись. Ничего в вашей сети NVD не тестировала. Дата lastModified равна 2026-08-11, намного позже публикации, так что запись, которую вы читали в прошлом году, могла измениться.
Что нужно. Браузер, curl (в Git Bash для Windows он есть) и Python 3.12. jq необязателен. Каждый запрос здесь — чтение из публичного сервиса. Не запускайте запросы к API NVD в цикле. Без API-ключа NVD ограничивает число запросов за короткий период, так что выполняйте каждую команду один раз.
Откройте https://www.cve.org/CVERecord?id=CVE-2021-44228 и прочитайте её сверху вниз. В день проведения лабораторной на ней было:
Команда лабораторной, написанная для jq:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' | jq '.vulnerabilities[0].cve | {id, published, descriptions: .descriptions[0].value, weaknesses, references: [.references[0:5][].url]}'На машине, где проверяли лабораторную, jq не было, поэтому тот же фильтр запустили на Python 3.12. Используйте этот вариант, если у вас тоже нет jq:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' -o nvd.json
python -c "import json; c=json.load(open('nvd.json', encoding='utf8'))['vulnerabilities'][0]['cve']; print(json.dumps({'id': c['id'], 'published': c['published'], 'descriptions': c['descriptions'][0]['value'], 'weaknesses': c['weaknesses'], 'references': [r['url'] for r in c['references'][0:5]]}, indent=2, ensure_ascii=False))"Полученный вывод:
{
"id": "CVE-2021-44228",
"published": "2021-12-10T10:15:09.143",
"descriptions": "Apache Log4j2 2.0-beta9 through 2.15.0 (excluding security releases 2.12.2, 2.12.3, and 2.3.1) JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default. From version 2.16.0 (along with 2.12.2, 2.12.3, and 2.3.1), this functionality has been completely removed. Note that this vulnerability is specific to log4j-core and does not affect log4net, log4cxx, or other Apache Logging Services projects.",
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{ "lang": "en", "value": "CWE-20" },
{ "lang": "en", "value": "CWE-400" },
{ "lang": "en", "value": "CWE-502" }
]
},
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{ "lang": "en", "value": "CWE-917" }
]
}
],
"references": [
"http://packetstormsecurity.com/files/165225/Apache-Log4j2-2.14.1-Remote-Code-Execution.html",
"http://packetstormsecurity.com/files/165260/VMware-Security-Advisory-2021-0028.html",
"http://packetstormsecurity.com/files/165261/Apache-Log4j2-2.14.1-Information-Disclosure.html",
"http://packetstormsecurity.com/files/165270/Apache-Log4j2-2.14.1-Remote-Code-Execution.html",
"http://packetstormsecurity.com/files/165281/Log4j2-Log4Shell-Regexes.html"
]
}Обратите внимание на три вещи. Значение published в NVD содержит время, 10:15, без часового пояса, а JSON от CNA для того же дня даёт полночь. CWE, добавленная NVD, стоит в отдельном блоке. А первые пять ссылок ведут на сторонние страницы, так что ссылку на вендора придётся брать на более позднем шаге.
python -c "import json; c=json.load(open('nvd.json', encoding='utf8'))['vulnerabilities'][0]['cve']; print('lastModified', c['lastModified'], '| vulnStatus', c['vulnStatus']); [print(k, m['source'], m['type'], m['cvssData']['version'], m['cvssData']['baseScore'], m['cvssData'].get('baseSeverity'), m['cvssData']['vectorString']) for k in ('cvssMetricV31', 'cvssMetricV2') for m in c['metrics'][k]]"Полученный вывод:
lastModified 2026-08-11T19:33:44.513 | vulnStatus Analyzed
cvssMetricV31 [email protected] Primary 3.1 10.0 CRITICAL CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvssMetricV31 134c704f-9b21-4f2e-91b3-4a467353bcc0 Secondary 3.1 10.0 CRITICAL CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvssMetricV2 [email protected] Primary 2.0 9.3 None AV:N/AC:M/Au:N/C:C/I:C/A:CУ записи v2 нет метки серьёзности, для CVSS v2 это нормально. Вторичный источник v3.1 указан идентификатором, имени там нет. Тот же идентификатор встречается в данных SSVC рядом с ролью CISA coordinator, так что можно сделать вывод сверх того, что сказано в поле. Записывайте то, что можете подтвердить, и указывайте, какая часть — вывод.
curl -s 'https://cveawg.mitre.org/api/cve/CVE-2021-44228' -o cve5.json
python -c "import json; d=json.load(open('cve5.json', encoding='utf8')); print(json.dumps(d['cveMetadata'], indent=2))"Полученный вывод:
{
"state": "PUBLISHED",
"cveId": "CVE-2021-44228",
"assignerOrgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09",
"assignerShortName": "apache",
"dateUpdated": "2025-10-21T23:25:23.121Z",
"dateReserved": "2021-11-26T00:00:00.000Z",
"datePublished": "2021-12-10T00:00:00.000Z"
}assignerShortName называет CNA. В собственном блоке метрик CNA нет оценки CVSS, только запись other со значением critical. Оценка CVSS, которую вы видите, пришла от NVD.
Откройте https://logging.apache.org/log4j/2.x/security.html. Страница перенаправляет на logging.apache.org/security.html. На ней по одному разделу на каждую CVE. Раздел CVE-2021-45046 расположен выше раздела CVE-2021-44228.
В тексте, который мы получили 2026-11-08, раздел CVE-2021-44228 указывает затронутый диапазон [2.0-beta9, 2.3.1), [2.4, 2.12.2) и [2.13.0, 2.15.0), а исправленные версии 2.3.1 для Java 6, 2.12.2 для Java 7 и 2.15.0 для Java 8 и новее. В разделе CVE-2021-45046 сказано, что исправление CVE-2021-44228 в 2.15.0 оказалось неполным в некоторых нестандартных конфигурациях. В строке о снижении риска рекомендованы 2.3.1 для Java 6, 2.12.3 для Java 7 или 2.16.0 для Java 8 и новее.
Сопоставим источники:
| Вопрос | Запись CVE (cve.org) | NVD | Бюллетень вендора |
|---|---|---|---|
| Какой компонент? | Apache Log4j2, log4j-core | Всего 396 записей соответствия CPE | Только log4j-core; один log4j-api не затронут |
| Какая версия исправлена? | Не затронуты с 2.15.0 | Повторяет затронутые диапазоны в соответствиях CPE | 2.15.0 для Java 8 и новее, позже признана неполной; рекомендована 2.16.0 |
| Насколько серьёзно? | Метрика CNA «critical», без оценки | CVSS v3.1 10.0 CRITICAL, v2 9.3 | В прочитанном нами тексте оценки нет |
| Эксплуатируется? | В прочитанном нами CNA JSON нет поля об эксплуатации | Запись KEV добавлена 2021-12-10 | В прочитанном нами тексте не указано |
Читатель, остановившийся на «не затронуты с 2.15.0» в записи, выбрал бы целью 2.15.0. Бюллетень говорит, что исправление 2.15.0 было неполным, и указывает на 2.16.0 для Java 8 и новее. Запись показывала утверждения CNA о версиях на момент их написания. Бюллетень показывает, что вендор рекомендует ставить сейчас.
Считать оценку CVSS своим риском. Оценка исходит из предположений о доступе и ущербе. Ваша подверженность зависит от того, достижим ли компонент и включена ли настройка. Используйте оценку для сортировки работы, затем проверяйте достижимость.
Останавливаться на диапазоне версий из записи. Версию для установки берите из бюллетеня. Проверяйте его каждый раз.
Считать «нет в списке» равным «не затронут». Отсутствующий в списке продукт всё равно может быть затронут. Список зависит от работы CNA и анализа NVD, а на то и другое нужно время.
Ждать CVE для каждой проблемы. Многие исправления вендоров выходят без ID. Отсутствие CVE безопасности не доказывает.
Путать даты. Резервирование, публикация, последнее обновление и последнее изменение — разные события из разных источников. Называйте источник рядом с каждой приводимой датой.
Проверять CVE на чужих системах. Лабораторная работает только на чтение. Чтобы воспроизвести уязвимость на цели, которую вы не контролируете, нужно письменное разрешение её владельца. Используйте собранную вами лабораторию с той версией ПО, которую изучаете.
Читайте бюллетень вендора по каждому продукту, который у вас работает, и подпишитесь на его ленту безопасности. Для продуктивных систем именно на страницу вендора должны ссылаться документы управления изменениями.
Группируйте типы CWE по CVE, за которыми следите, и сверяйтесь с каталогом CISA KEV, когда за неделю приходит длинный список новых CVE. KEV — короткий список уязвимостей с подтверждённой эксплуатацией, поэтому из него получается полезный фильтр.
Далее в этой серии Что такое CVSS объясняет, как получается 10.0 в этой записи и почему базовая оценка служит лишь одним из входных данных при расстановке приоритетов.
Данные об уязвимостях
Что значит оценка CVSS вроде 9.8, как устроены векторы v4.0 и v3.1 и как разобрать и пересчитать вектор вручную.
Данные об уязвимостях
Расставляем приоритеты CVE по каталогу CISA KEV и оценкам EPSS от FIRST рядом с CVSS, затем строим таблицу приоритетов из обоих бесплатных фидов.