Перейти к содержимому
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Как читать CVE: что запись CVE сообщает и о чём молчит

Запись CVE называет уязвимость и указывает на вендора, а исправленную версию определяет бюллетень вендора.

Начальный11 мин чтенияАвтор: NotHoly

Вы читаете новость о том, что уязвимость с номером CVE уже эксплуатируют. Через десять минут коллега спрашивает, закрыта ли она у вас. Номер — единственный факт, в котором новость и коллега сходятся. Он называет одну уязвимость. Насколько она опасна для ваших систем, какие ваши версии затронуты и что ставить, он не говорит.

В этой статье разобрано, что такое идентификатор CVE, кто его присваивает, что значит каждое поле записи CVE и что к ней добавляет National Vulnerability Database (NVD). В практической части мы прочитаем одну известную запись, CVE-2021-44228 (Log4Shell), поле за полем, на cve.org и через API NVD. Затем откроем бюллетень вендора, на который ссылается запись. Главное, что стоит запомнить: запись CVE ведёт вас к бюллетеню вендора, а бюллетень вендора — источник истины по исправленным версиям.

Если вы читали Что такое уязвимость, термины покажутся знакомыми. Лабораторная отправляет запросы только на чтение к двум публичным сервисам и одной публичной веб-странице.

Что такое идентификатор CVE

CVE расшифровывается как Common Vulnerabilities and Exposures. Программа CVE, как сказано в её обзоре, выявляет, определяет и каталогизирует публично раскрытые уязвимости кибербезопасности. Каждая уязвимость получает одну запись, CVE Record, а ID — это указатель на неё. Он имеет вид CVE-YEAR-NUMBER. Год здесь — год резервирования ID, и часто он не совпадает с годом, когда ошибку написали или исправили.

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

Названия полей ниже взяты из формата записи 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)

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 дополняет запись

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, намного позже публикации, так что запись, которую вы читали в прошлом году, могла измениться.

Практика: читаем CVE-2021-44228 поле за полем

Что нужно. Браузер, curl (в Git Bash для Windows он есть) и Python 3.12. jq необязателен. Каждый запрос здесь — чтение из публичного сервиса. Не запускайте запросы к API NVD в цикле. Без API-ключа NVD ограничивает число запросов за короткий период, так что выполняйте каждую команду один раз.

Шаг 1: прочитайте страницу записи CVE

Откройте https://www.cve.org/CVERecord?id=CVE-2021-44228 и прочитайте её сверху вниз. В день проведения лабораторной на ней было:

  • CNA: Apache Software Foundation
  • Опубликовано 2021-12-10, отдельно дата «Updated» 2023-04-03
  • Заголовок: Apache Log4j2 JNDI features do not protect against attacker controlled LDAP and other JNDI related endpoints
  • CWE: всего 3
  • Продукт: Apache Log4j2, с описанными выше утверждениями о версиях
  • Ссылки: всего 53

Шаг 2: получите запись NVD и отфильтруйте поля

Команда лабораторной, написанная для jq:

bash
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:

bash
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))"

Полученный вывод:

json
{
  "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, стоит в отдельном блоке. А первые пять ссылок ведут на сторонние страницы, так что ссылку на вендора придётся брать на более позднем шаге.

Шаг 3: прочитайте оценки и статус NVD

bash
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]]"

Полученный вывод:

text
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, так что можно сделать вывод сверх того, что сказано в поле. Записывайте то, что можете подтвердить, и указывайте, какая часть — вывод.

Шаг 4: сравните с CVE JSON от CNA

bash
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))"

Полученный вывод:

json
{
  "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.

Шаг 5: откройте бюллетень вендора

Откройте 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 в этой записи и почему базовая оценка служит лишь одним из входных данных при расстановке приоритетов.

Источники

Источники

  1. CVE Program overview
  2. CVE Numbering Authorities
  3. CVE Record CVE-2021-44228
  4. NVD vulnerability API documentation
  5. NVD dashboard
  6. Apache Log4j security page

Ещё по теме: Данные об уязвимостях