Работа со ScanSuite

Повторные сканирования и проверка исправлений

Как повторное сканирование решает, что находка исправлена, что может изменить статус и как статусы передаются в ServiceNow и обратно.

Разработчик исправляет три уязвимости и просит выполнить повторное сканирование. Дальше следуют два вопроса, и это разные вопросы: исчезли ли старые уязвимости? и не появилось ли что-то новое из-за исправления? На этой странице описано, как ScanSuite отвечает на оба и как статус уязвимости меняется без ручного вмешательства.

Отсутствие — это не исправление

Очевидное решение — закрывать всё, о чём повторное сканирование не сообщило, — неверно, и стоит понять почему, прежде чем доверять всему остальному. Обнаружение — это вызов модели. Сканирование, которое проанализировало файл и ничего не сообщило, может означать, что дефекта больше нет, а может — что модель на этот раз его пропустила. Закрыть реальную уязвимость только потому, что сканирование промолчало, — худшее, что эта система может сделать.

Поэтому молчание трактуется как вопрос, а не как ответ. Когда сканирование охватило файл, но больше не сообщает о уязвимости в нём, отдельный агент проверки открывает текущий исходный код и принимает решение. Уязвимость считается устранённой только тогда, когда этот агент может указать на код, который её исправил.

Надёжность этой схемы держится на двух вещах. Сканирование делает выводы только о файлах, которые действительно проанализировало: пропущенный или сбойный файл не считается охваченным, и уязвимости в нём не трогаются. И закрывают уязвимость только два вердикта: fixed и file_removed. Все остальные оставляют её открытой.

Два способа выполнить повторное сканирование

РежимЧто делает
Verify FixesВы выбираете уязвимости, которые считаете исправленными. ScanSuite сопоставляет их с файлами и сканирует только эти файлы, а затем проверяет ровно те уязвимости, которые вы выбрали, — и никогда их соседей.
Once / полное сканированиеАнализируется весь репозиторий. Под переоценку попадает каждая уязвимость в репозитории — приём мощный, но неизбирательный: одно сканирование может закрыть сразу очень многое.

Оба запускаются с формы SAST-сканирования; Verify Fixes доступен также прямо из списка уязвимостей: разработчик отмечает исправленные строки и нажимает запуск, не выбирая режим и не вводя шаблон файлов.

Запуск повторного сканирования Verify Fixes
Выбор исправленных уязвимостей и запуск повторного сканирования Verify Fixes из списка уязвимостей

Для повседневного устранения предпочтительнее Verify Fixes. Он значительно дешевле — несколько файлов вместо репозитория — и его выводы ограничены тем, о чём действительно спросил разработчик. Уязвимость, находящаяся в одном файле с выбранной, повторно не оценивается — случайно ничто не закроется.

Что решает повторное сканирование

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

КатегорияЗначение
ПодтвержденаПовторное сканирование снова о ней сообщило. Уязвимость остаётся открытой, а счётчик пропусков сбрасывается.
Охвачена, но не сообщенаФайл был проанализирован, а уязвимость не появилась. Именно этот случай уходит на проверку.
Удерживается решением аналитикаRisk Accepted или False Positive. Сканирование не может их менять — см. ниже.
Вне охвата этого сканированияФайл не анализировался. Сканирование ничего о уязвимости не утверждает ни в ту, ни в другую сторону.

Уязвимость уходит на проверку не после первого же «молчаливого» сканирования во всех режимах. Порог зависит от того, насколько весомы доказательства:

РежимСколько молчаливых сканирований нужноПочему
Verify Fixes1Вы спросили именно об этих уязвимостях: одно молчаливое сканирование — это ответ.
Once / полное сканирование1Проанализирован весь репозиторий — отсутствие что-то значит.
Custom Scope, Incremental, Monitor Changes2Узкая или построенная по различиям область — более слабое доказательство: она должна сказать одно и то же дважды.

Проверка

Уязвимости, достигшие порога, по одной передаются агенту проверки исправлений. Он читает текущий исходный код в месте уязвимости и возвращает один из пяти вердиктов:

ВердиктДействие
fixedУстранена. Требуются доказательства вида «файл:строка» в текущем коде со средней или высокой уверенностью.
file_removedУстранена. Файла, в котором была уязвимость, больше не существует.
still_presentОстаётся открытой, счётчик пропусков сбрасывается. Значит, детектор пропустил живой дефект. Это промах обнаружения, и он не должен шаг за шагом подводить уязвимость к закрытию.
movedОстаётся открытой. Дефект, переехавший при рефакторинге, не был исправлен.
inconclusiveОстаётся открытой. Агент не смог установить ни того, ни другого.

Доказательства сохраняются в записи и отображаются в её заметках о жизненном цикле — закрытие можно проверить позже:

Закрытие, записанное вместе с кодом, который его обосновывает
Finding test-java-sast-c4d1f672fc16 closed as fixed: fixed (high confidence) |
src/main/java/com/scalesec/vulnado/User.java:39-49 shows fetch(String un) using a
PreparedStatement with the query "select * from users where username = ? limit 1",
followed by stmt.setString(1, un) and stmt.executeQuery().

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

Статусы и кто вправе их менять

СтатусЧто может сделать повторное сканирование
OpenОценивается при каждом повторном сканировании. Может быть устранена по результатам проверки.
In ProgressОценивается при каждом повторном сканировании. Может быть устранена по результатам проверки.
ResolvedПо-прежнему оценивается, и регресс виден: если повторное сканирование снова её обнаружит, уязвимость автоматически открывается заново, а устаревшие доказательства закрытия очищаются.
Risk AcceptedСканирование её никогда не трогает.
False PositiveСканирование её никогда не трогает.

Risk Accepted и False Positive — это решения относительно дефекта, в существовании которого все согласны, а это другой вопрос, чем то, содержится ли он ещё в коде. У сканера есть мнение о коде; у него нет мнения о том, что решила ваша организация. Поэтому менять эти статусы он не вправе — ни в одну сторону.

Каждое автоматическое изменение фиксирует, как оно произошло. Уязвимость, закрытая проверкой, несёт closure_source = scanner и свои доказательства; закрытая человеком — свои. Всегда можно понять, что есть что.

Уязвимость, устранённая проверкой исправления
Уязвимость, устранённая по результатам проверки исправления, с вердиктом, уверенностью и доказательствами из исходного кода

Как включить автоматическое закрытие

Закрытие по инициативе сканера по умолчанию выключено. Включите его в Settings → Resolve findings verified as fixed. При выключенной настройке всё описанное выше всё равно выполняется и записывается в журнал — пропуски подсчитываются и отражаются в отчёте, — но статусы не меняются. Это осмысленный режим сам по себе: можно посмотреть, какие вердикты действительно выдаёт ваша кодовая база, прежде чем разрешать им закрывать задачи.

Разумный порядок внедрения: оставьте закрытие выключенным на несколько повторных сканирований и почитайте строки сверки в журнале сканирования. Если вердикты агента совпадают с тем, что вы знаете о коде, включите закрытие и начните с Verify Fixes — он затрагивает только уязвимости, выбранные разработчиком, и это куда более безопасное место, чтобы понаблюдать за его работой, чем сканирование всего репозитория.

Как читать журнал сканирования

Повторное сканирование само описывает свои решения, называя уязвимости, а не просто считая их:

Запуск Verify Fixes: от выбора уязвимостей до закрытия
Reassessing only the 1 finding(s) this scan was asked to verify, of 1 selected.
Finding reconciliation: 0 confirmed, 1 covered but not reported (1 at or over the
1-miss threshold), 0 held by an analyst decision, 0 outside this scan’s coverage.
Verifying 1 finding(s) that this scan covered but did not report: test-java-sast-c4d1f672fc16
Finding test-java-sast-c4d1f672fc16 closed as fixed: fixed (high confidence) | ...
Fix verification: 1 closed on source-backed evidence, 0 still present, 0 left open.

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

Передача статусов в ServiceNow и обратно

ScanSuite не подключается к ServiceNow. Обмен идёт файлами в обе стороны — именно это и делает такую схему применимой там, где исходящую интеграцию никогда бы не согласовали.

  1. 01
    Выгрузка

    На странице Vulnerabilities выберите Export → ServiceNow XLSX. Каждая строка содержит устойчивый идентификатор отслеживания уязвимости: у ServiceNow есть ключ, за который можно держаться.

  2. 02
    Загрузка

    Импортируйте таблицу в ServiceNow своим обычным способом. В этом шаге нет ничего специфичного для ScanSuite.

  3. 03
    Работа с заявками

    Ваш процесс в ServiceNow назначает и закрывает их так же, как всегда.

  4. 04
    Возврат статусов

    Статусы, проставленные в ServiceNow, возвращаются в ScanSuite файлом и сопоставляются с уязвимостями по тому же идентификатору отслеживания. Там, где они расходятся с тем, что считает ScanSuite, расхождение показывается, а не перезаписывается молча.

Варианты выгрузки, включая ServiceNow XLSX
Меню выгрузки на странице Vulnerabilities с вариантами XLSX, JSON и ServiceNow XLSX

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

Один и тот же идентификатор появляется в журнале сканирования, в JSON-отчёте, в выгрузке XLSX и в карточке уязвимости в консоли. Когда разработчик, заявка и журнал сканирования называют одну и ту же строку, спор о том, об одном ли и том же они говорят, просто не может начаться.

Как это связано с остальным

Повторное сканирование — вторая половина цикла, описанного в разделе Управление уязвимостями: там уязвимости загружаются, сопоставляются, проверяются и получают ответственных, а здесь — закрываются. О самих режимах сканирования см. Запуск сканирования с AI и Периодические и инкрементальные сканирования.

Проверено: 2026-08-27