Skip to main content
Version: 1.8

Действия с парсерами

Конструктор парсеров в TRON.ASOC позволяет создавать, редактировать, применять и удалять парсеры — пользовательские схемы разбора SARIF/JSON-отчетов для интеграции с системой.

Конструктор основан на языке запросов и трансформации данных JSONata. Синтаксис JSONata поддерживает логические операторы, поиск по массивам, маппинг значений и частичные совпадения.

Для работы с парсерами пользователь должен иметь следующие права доступа:

  • Просмотр парсеров;
  • Создание/редактирование парсеров;
  • Удаление парсеров.

Поля маппинга​

В JSON-схеме парсера разрешено использовать только предопределенный набор полей, соответствующих модели TRON.ASOC. При использовании полей важен корректный регистр. Поля, отсутствующие в таблице, игнорируются.

Каждое поле заполняется выражением JSONata, которое возвращает значение из отчета. Значения всех полей передаются строками.

Поле TRON.ASOCПоле в парсереНазначение и особенности заполнения
КатегорияcategoryКатегория уязвимости
КритичностьseverityУровень критичности — число от -1 до 4.

Инструмент безопасности может передавать уровень критичности в любом виде: задача конфигурации — привести его к этой шкале.

Значения critical, high, medium и low приводятся к шкале без маппинга. Остальные значения (в том числе info, none, note, warning, error) следует приводить к шкале через $lookup. Значение уровня, отсутствующее в таблице $lookup, оставляет поле пустым
CWEcweИдентификатор CWE в формате CWE-XX.

В одной находке может быть несколько идентификаторов CWE
CVEcveИдентификатор CVE в формате CVE-ГГГГ-ЧЧЧЧ.

В одной находке может быть только один идентификатор CVE
Исходный файлsource_fileПуть к файлу, содержащему уязвимость
СтрокаlineНомер строки в коде
Название библиотекиlib_nameИмя библиотеки (для SCA)
Версия библиотекиlib_versionВерсия библиотеки
Объектsource_objectОбъект, содержащий уязвимость
Кодmatched_codeФрагмент кода, содержащий уязвимость
CVSSv2cvss_v2_scoreОценка CVSS v2
CVSSv3cvss_v3_scoreОценка CVSS v3
CVSSv4cvss_v4_scoreОценка CVSS v4
CVSS(?)cvss_vu_scoreОценка CVSS, для которой инструмент безопасности не указал версию метрики
ЭксплуатируемостьexploitabilityОценка эксплуатируемости уязвимости
Элементы кодаcode_elementsСтруктурированные элементы кода.

Формируется кодовым адаптером на стороне сервера для ESLint, GitLab SAST и PT AI/SASTAV, из пользовательского парсера не заполняется.

Для остальных инструментов безопасности недоступно
ОписаниеdescriptionДанные находки, которым нет соответствия в полях выше, размещаются во вложенном объекте description.details — см. строки ниже
—description.details.infoКраткое описание находки
—description.details.detailedInfoПолное описание уязвимости
—description.details.recommendationsРекомендации по устранению
—description.details.refsСсылки на источники
—description.details.ratingsОценки и векторы CVSS в виде JSON-строки
—description.details.messageКлассификации инструмента безопасности (OWASP, SANS, PCI DSS, NIST)
—description.details.pathТрасса распространения данных
—description.details.queryИмя правила или функции, в которой обнаружена уязвимость
—description.details.matchDetailsДополнительные условия срабатывания правила
—description.details.platformЯзык или платформа уязвимого кода
—description.details.hashСобственный идентификатор находки в отчете инструмента безопасности
info

Поле code_elements формируется кодовым адаптером на стороне сервера для инструментов безопасности ESLint, GitLab SAST и PT AI/SASTAV. Из пользовательского парсера это поле не заполняется: выражение JSONata, возвращающее вложенную структуру элементов кода, составить нельзя.

Для остальных инструментов безопасности поле code_elements недоступно. Если отчет содержит данные об элементах кода, их можно передать текстом в одно из полей description.details.

Каждое поле заполняется выражением JSONata, которое возвращает значение из отчета. Доступные выражения представлены в таблице ниже.

Тип выраженияСинтаксисПример
Прямой путьa.b.clocations[0].physicalLocation.artifactLocation.uri
Индекс элементаa[0]cvss[0].score
Разворот массиваa[].bResults[].Vulnerabilities
Фильтр по значениюa[field = "value"]cvss[version = "CVSS_V3"].score
Частичное совпадениеa[$ ~> /regex/]tags[$ ~> /CWE/]
Fallback-выражениеexpr1 or expr2numberLine or beginLine
Тернарный операторcond ? expr1 : expr2cweId != "" ? (\"CWE-\" & cweId) : \"\"
Конкатенацияexpr1 & expr2type.displayName & ": " & summary
Маппинг значений$lookup({...}, expr)$lookup({\"high\":\"3\"}, severity)
warning

Оператор or в конструкторе парсеров работает не как логическое ИЛИ, а как fallback-выражение: он возвращает первое непустое значение, а не true. Это отличается от поведения оператора в эталонной реализации JSONata и в стороннем инструменте проверки.

Тернарный оператор не применяет ветку «иначе», если поля из условия нет в находке, в результате поле останется пустым. Для необязательных полей используйте fallback-выражение or.

Полный перечень отличий приведен в разделе Конфигурация пользовательского парсера.

Секции парсера​

Конфигурация парсера поддерживает поле sections — список подконфигов, каждый из которых содержит путь к массиву находок (items_path) и собственный набор полей маппинга (severity, category и т. д.). В отличие от единственного режима на весь конфиг, секции внутри sections объединяются: находки, извлеченные по каждой секции, собираются вместе в результате разбора одного отчета.

Это снимает ограничение, при котором один парсер мог извлечь найденные артефакты только из одного массива отчета за раз. Для инструментов безопасности, отчет которых содержит несколько независимых массивов разных типов находок (например, отчет Trivy содержит уязвимости, мисконфигурации и секреты), можно описать все типы находок одним парсером, содержащим по одной секции на каждый тип:

{
"sections": [
{ "items_path": "Results[].Vulnerabilities", "severity": "...", "category": "..." },
{ "items_path": "Results[].Misconfigurations", "severity": "...", "category": "..." },
{ "items_path": "Results[].Secrets", "severity": "...", "category": "..." }
]
}

items_path — путь к массиву находок в отчете. Остальные выражения секции вычисляются относительно отдельного элемента этого массива, а не относительно корня отчета. Правила записи пути, доступ к полям родительского объекта и другие особенности секций описаны в разделе Конфигурация пользовательского парсера.

Ограничения конструктора парсеров​

Для полей, формируемых на основе описания правила SARIF (например, category, cwe), соответствие между найденной проблемой и описанием правила определяется по позиционному индексу правила (ruleIndex), если он присутствует в отчете. Кодовый парсер того же инструмента безопасности сопоставляет их по строковому идентификатору правила (ruleId).

На корректно сформированных отчетах оба способа дают одинаковый результат. Если в отчете ruleIndex указывает не на то правило (ошибка конкретного инструмента), пользовательский парсер и предустановленный кодовый парсер того же инструмента могут вернуть разные данные для одной и той же находки.

Прочие ограничения конструктора — неподдерживаемые конструкции языка, ограничения на длину значений полей, схлопывание находок по составному ключу — описаны в разделе Конфигурация пользовательского парсера.

Создание нового парсера​

Чтобы создать новый парсер, выполните следующие шаги:

  1. Перейдите в раздел Интеграции.

  2. Нажмите кнопку Парсеры.

  3. В открывшемся разделе Парсеры нажмите кнопку Добавить парсер.

    Список парсеров

    Рисунок 1 — Список парсеров

  4. В окне добавления нового парсера введите следующие данные:

    • название парсера;
    • описание парсера;
    • конфигурация парсера в формате JSON.
  5. Нажмите кнопку Создать.

Создание нового парсера

Рисунок 2 — Создание нового парсера

Новый парсер будет отображаться в списке парсеров в разделе Парсеры.

Пример парсера​

Ниже представлен пример минимального парсера, предназначенного для извлечения уровня критичности уязвимости и пути к файлу с уязвимостью:

{
"items_path": "runs[0].results",
"severity": "$lookup({\"error\": \"4\", \"warning\": \"2\", \"note\": \"1\", \"none\": \"-1\"}, level)",
"source_file": "locations[0].physicalLocation.artifactLocation.uri"
}

items_path задает массив находок, а выражения полей вычисляются относительно отдельной находки этого массива. Выражения вида runs[0].results[0].level обращаются только к первой находке отчета и для пользовательских парсеров не применяются.

Создание нового парсера на основе имеющегося​

Чтобы создать новый парсер на основе имеющегося, выполните следующие шаги:

  1. Перейдите в раздел Интеграции.
  2. Нажмите кнопку Парсеры.
  3. Нажмите кнопку дополнительных действий (Доп. действия) возле необходимого парсера.
  4. Выберите вариант Использовать как шаблон.
  5. В окне добавления нового парсера введите следующие данные:
    • название парсера;
    • описание парсера;
    • конфигурация парсера в формате JSON.
  6. Нажмите кнопку Создать.

Новый парсер будет отображаться в списке парсеров в разделе Парсеры.

info

При создании парсера на основе имеющегося копируется JSON-схема исходного парсера в текущем виде.

Если за основу взять один из предустановленных SARIF-парсеров (например, SARIF: General), учитывайте, что пока на инструменте безопасности оставлен предустановленный парсер, разбор выполняется его кодовым (Go) аналогом, а не JSONata-конфигом. Соответствие между ними подтверждается автотестами эквивалентности, но это не гарантирует, что скопированная схема покрывает все нюансы поведения кодового парсера. После назначения пользовательского парсера разбор выполняется по его конфигурации.

Создание парсера для инструмента безопасности, не поддерживаемого TRON.ASOC​

Если инструмент безопасности не поддерживается системой, результаты сканирования этим инструментом все равно можно загрузить и обработать системой. Для этого создайте парсер с маппингом полей отчета в формате JSONata. После настройки отчеты такого инструмента обрабатываются так же, как отчеты поддерживаемых инструментов, а уязвимости отображаются в результатах проверки безопасности.

Чтобы создать парсер для неподдерживаемого инструмента безопасности, выполните следующие шаги:

  1. Получите пример отчета от подключаемого инструмента в формате JSON или SARIF.
  2. Составьте конфигурацию парсера (маппинг полей отчета в формате JSONata). Подробнее о синтаксисе конфигурации, доступных функциях и ограничениях см. раздел Конфигурация пользовательского парсера.
  3. Создайте новый парсер (подробнее см. раздел Создание нового парсера).
  4. Создайте новую интеграцию с инструментом безопасности для импорта результатов. Подробнее об этом см. раздел Подключение интеграции с пользовательским инструментом безопасности (кастомной интеграции).
  5. При настройке новой интеграции выберите парсер, созданный на шаге 3.
  6. Перейдите в необходимый проект в разделе Проекты.
  7. Выберите слой, в котором будет выполняться проверка, либо создайте новый (подробнее см. в разделах Создание слоя с нуля и Создание слоя по шаблону).
  8. Создайте новую проверку безопасности в слое (подробнее см. раздел Создание проверки безопасности).
  9. Выберите инструмент, созданный на шаге 4.
  10. Выберите источник сканирования или создайте новую интеграцию с источником (подробнее см. раздел Подключение интеграции с источником сканирования).
  11. Импортируйте пример отчета от подключаемого инструмента безопасности (подробнее см. раздел Импорт отчетов из инструментов безопасности).
  12. Дождитесь завершения обработки отчета.

После завершения обработки статус проверки безопасности изменится на Выполнено, а найденные уязвимости будут отображаться в результатах сканирования.

info

Эта же последовательность действий используется для проверки конфигурации парсера: отдельного режима проверки конфигурации на образце отчета в системе нет. Результат разбора виден после импорта отчета — по составу найденных уязвимостей и заполненности их полей.

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

Назначение парсера на инструмент безопасности​

При создании новой интеграции на выбранный инструмент безопасности назначается системный парсер, соответствующий типу инструмента, однако при создании или редактировании инструмента безопасности можно назначить и другой парсер (системный или пользовательский).

Чтобы назначить парсер на инструмент безопасности, выполните следующие шаги:

  1. Создайте новую интеграцию с инструментом безопасности. Подробнее см. раздел Подключение интеграции с инструментом безопасности.
  2. Выберите необходимый парсер из раскрывающегося списка Парсер.
  3. Нажмите кнопку Создать.

Кроме того, можно перейти к назначению парсера на инструмент безопасности и при создании новой проверки безопасности:

  1. Создайте новую проверку безопасности. Подробнее см. раздел Создание новой проверки безопасности.
  2. Нажмите иконку информации (Информация) возле раскрывающегося списка Парсер.
  3. Нажмите кнопку Редактировать инструмент.
  4. В открывшемся окне отредактируйте инструмент безопасности.
  5. Нажмите кнопку Сохранить.

Назначенный пользовательский парсер имеет приоритет над предустановленным парсером инструмента безопасности: если на инструмент назначен пользовательский парсер, разбор отчетов выполняется через него. Это относится и к инструментам с предустановленным SARIF-парсером — для них также можно создать и назначить пользовательский SARIF-парсер.

info

Если инструмент безопасности возвращает 0 уязвимостей при заведомо непустом отчете, проверьте, какой парсер назначен инструменту в его настройках. Отчет разбирается назначенным парсером независимо от того, какой парсер редактировался последним.

Редактирование парсера​

warning

Предустановленные системные парсеры (отмечены тегом System во вкладке Парсеры) недоступны для редактирования и удаления. Пользователю доступен просмотр конфигурации системных парсеров или использование их в качестве шаблонов для создания своих парсеров.

Чтобы отредактировать парсер, выполните следующие шаги:

  1. Перейдите в раздел Интеграции.
  2. Нажмите кнопку Парсеры.
  3. Нажмите кнопку дополнительных действий (Доп. действия) возле необходимого парсера.
  4. Выберите вариант Редактировать.
  5. Измените данные парсера.
  6. Нажмите кнопку Сохранить.

Внесенные изменения будут применены к парсеру.

warning

Изменение конфигурации парсера наследуется во все инструменты безопасности и проверки безопасности, где этот парсер используется, но применяется только к отчетам, обработанным после изменения. Ранее найденные уязвимости не пересчитываются: новые поля у них не появятся, а изменившиеся значения не обновятся.

Чтобы результаты разбора соответствовали новой конфигурации, обработайте отчет повторно. При повторной обработке уязвимости, которые обновленный парсер не находит, закрываются, а найденные заново объединяются с ранее найденными по совпадающему хешу.

Из этого следует, что некорректная конфигурация парсера приводит не только к отсутствию новых уязвимостей, но и к закрытию ранее найденных. Проверяйте конфигурацию на отдельном слое или отдельной проверке безопасности, прежде чем назначать парсер на инструмент безопасности с рабочими данными.

Удаление одного или нескольких парсеров​

Чтобы удалить один парсер, выполните следующие шаги:

  1. Перейдите в раздел Интеграции.
  2. Нажмите кнопку Парсеры.
  3. Нажмите кнопку дополнительных действий (Доп. действия) возле необходимого парсера.
  4. Выберите вариант Удалить.
  5. В открывшемся модальном окне подтвердите удаление парсера.

Окно подтверждения удаления парсера

Рисунок 3 — Окно подтверждения удаления парсера

Парсер будет удален из системы и перестанет отображаться в списке парсеров в разделе Парсеры.

Чтобы удалить несколько парсеров, выполните следующие шаги:

  1. Перейдите в раздел Интеграции.
  2. Нажмите кнопку Парсеры.
  3. Выберите необходимые парсеры с помощью флажков (Флажок).
  4. Нажмите кнопку удаления (Удалить) над таблицей парсеров.
  5. В открывшемся модальном окне подтвердите удаление парсеров.

Окно подтверждения удаления парсеров

Рисунок 4 — Окно подтверждения удаления парсеров

Парсеры будут удалены из системы и перестанут отображаться в списке парсеров в разделе Парсеры.

info

Если удаляемый парсер назначен на инструмент безопасности, инструменту назначается предустановленный парсер, соответствующий его типу. Обработка отчетов такого инструмента продолжается по конфигурации предустановленного парсера.

Парсеры удаляются безвозвратно: восстановить удаленный парсер средствами системы нельзя.