Рассмотрим гипотетическую ситуацию. B2B SaaS-компания, продающая платформу для выставления счетов, готовится к проверке безопасности со стороны крупного потенциального клиента. Пентест, проведённый несколько месяцев назад, дал отчёт с несколькими находками, среди которых ошибка авторизации: через API один арендатор мог читать счета другого. Теперь в трекере все тикеты в статусе «Готово». Команда безопасности клиента задаёт простой вопрос: откуда известно, что ошибки больше нет, на каких системах, начиная с какой сборки и кто принял решение о закрытии? Руководитель разработки находит слитый pull request, но не находит записи о ретесте. Тот же эндпоинт обслуживает и отдельный мобильный бэкенд, который никто не проверял, а одну находку разработчик молча «принял» без срока действия. Это не история реального клиента; пример лишь показывает, как быстро расходятся статус тикета и фактическая защищённость.
В статье разобрано, как управлять закрытием как решением, подкреплённым доказательствами: у каждой подтверждённой находки есть статус, ответственный за устранение, заранее определённые доказательства приёмки и явные сроки действия или триггеры пересмотра, а закрытие требует доказательства изменившегося поведения в заданных условиях, а не просто слитого патча или тикета в нужной колонке.
Что такое контроль устранения и где начинается закрытие
Контроль устранения уязвимостей — это дисциплина, которая обеспечивает, чтобы каждая подтверждённая находка получала ответственного, исправлялась, проверялась и закрывалась с доказательствами, а не просто попадала в отчёт и забывалась. Обнаружение — лишь половина работы. NIST SP 800-115 описывает цель технического тестирования безопасности как планирование и проведение тестов, анализ результатов и разработку стратегий устранения, то есть ставит доведение до результата в один ряд с поиском уязвимостей.
Практические вопросы — те же, что у клиента: исчезла ли уязвимость, что идёт первым, как сделать доказательства воспроизводимыми и измерять прогресс, чего требовать от подрядчика по ретесту. Рамки охватывают веб-приложения и API, внутренние процессы исправления, а также закупаемые оценки и ретесты. Материал не заменяет юридического или договорного разрешения: любое тестирование и повторная проверка предполагают явное письменное разрешение владельца системы и чётко определённые границы работ.
Шесть состояний, которые нельзя смешивать
Большинство споров об устранении возникает, когда разные вещи сводят в одно поле статуса. «Решено» может означать написанный код, развёрнутое изменение, принятый риск или подтверждённое изменение поведения — разные факты с разными владельцами.
Листайте таблицу по горизонтали
| Состояние | Что фиксирует | Чего не доказывает | Кто обычно решает |
|---|---|---|---|
| Статус | Положение в процессе: открыта, в работе, смягчена, риск принят, закрыта или открыта повторно | Что в работающей системе что-либо изменилось | Ответственный за устранение поддерживает его актуальным |
| Исправление внедрено | Изменение кода, конфигурации или архитектуры развёрнуто в названном окружении | Что уязвимое поведение исчезло на каждом затронутом экземпляре | Команда-исполнитель |
| Приёмка | Согласованный критерий доказательства выполнен либо одобрено документированное исключение | Ничего сверх согласованного критерия и объёма | Ответственный за результат, по критерию, заданному заранее |
| Ретест | Авторизованная проверка повторила исходный тестовый сценарий в заданных условиях | Постоянное отсутствие риска или отсутствие других уязвимостей | Проверяющий, внутренний или независимый |
| Закрытие | Решение, что работы по устранению больше не нужны, подкреплённое ретестом или одобренным исключением | Что проблема не вернётся в следующем релизе | Ответственный за результат, для находок с высоким влиянием — с утверждающим |
| Повторное открытие | Доказательство, что поведение вернулось или исправление было неполным, со ссылкой на исходную запись | Что исходное закрытие было недобросовестным | Любой, у кого есть доказательства; ответственный подтверждает |
У каждой находки должна быть проверяемая запись
Контроль начинается с записи, а не с инструмента. У каждой подтверждённой находки должны быть стабильный идентификатор со ссылкой на исходный отчёт, текущий статус, привязка к лежащей в основе слабости, например к записи CWE, перечень затронутых экземпляров, версионированный критерий приёмки, ответственный за устранение, собранные доказательства и условия, при которых запись обязательно пересматривается. Если хотя бы одно поле пусто, находка не под контролем, как бы активно ни выглядел тикет.
Ответственный за результат и исполнитель
Ответственный за устранение отвечает за результат: обоснованное закрытие, одобренное исключение или эскалацию. Это не обязательно разработчик, который пишет патч. В гипотетическом примере исправление сделал бэкенд-инженер, но вопрос, затронут ли мобильный бэкенд, не принадлежал никому. Один названный ответственный за каждую находку и отдельная фиксация исполнителя и проверяющего убирают разрыв, в котором каждый полагает, что проверил кто-то другой.
Сроки действия и триггеры пересмотра
Статус — утверждение о моменте времени. Срок действия нужен всему временному: компенсирующей мере, принятию риска, отложенному исправлению. Триггеры пересмотра — события, обесценивающие прежние допущения: релиз, затрагивающий уязвимый компонент; внутренний сервис, ставший доступным из интернета; новые данные об эксплуатации в реальных атаках; смена ответственного; изменение компенсирующей меры; изменение архитектуры, сдвигающее границы доверия. Сроки и триггеры организация устанавливает сама; их нужно лишь записать до того, как они понадобятся.
Почему устранение срывается без контроля
Самый частый сбой — находку закрывают потому, что изменение кода слито в основную ветку, а не потому, что показано отсутствие уязвимого поведения. Без повторной проверки по заданному требованию закрытие остаётся утверждением, а не доказательством, и организация не может отличить настоящее исправление от неполного.
Второй сбой — лечение симптомов вместо первопричин. Проект CWE Top 25 описывает свой перечень 2025 года как выделяющий наиболее опасные и распространённые слабости, стоящие за записями CVE в его наборе данных, и отмечает, что понимание первопричин помогает устранять целые классы дефектов, приводя в пример безопасность памяти и инъекции. Если команда закрывает одну точку инъекции, а шаблон формирования запросов остаётся прежним, та же слабость вернётся в другом месте.
Третий сбой — неясность требований. ASVS предупреждает, что идентификаторы требований могут меняться между версиями, и рекомендует указывать версию в каждой ссылке, например v5.0.0-1.2.5. Когда в задаче указано требование без версии или размытое описание, разработчик, тестировщик и аудитор понимают цель по-разному, и споры о закрытии становятся неизбежными.
Ещё два сбоя вытекают из отсутствия структуры: находки без ответственного и даты пересмотра тихо стареют, а без регрессионной проверки после следующих релизов корректно закрытая находка может вернуться незамеченной. Это скорее вопросы устройства процесса, чем инструментов; подробно они разобраны в нашем руководстве по процессу управления уязвимостями на основе доказательств.
Дубликаты и общие первопричины
Две ситуации выглядят в отчёте похоже, но требуют разной обработки: одна и та же уязвимость на нескольких системах и разные находки, происходящие из одной причины.
Одна находка, много затронутых систем
Дубликат — одно и то же уязвимое поведение в нескольких местах: несколько хостов с одинаково неверно настроенным сервисом, один эндпоинт в веб- и мобильном бэкенде, одна ошибка у разных арендаторов или в разных окружениях. Полезная схема — одна родительская находка и дочерняя запись на каждый затронутый экземпляр со своим статусом и доказательствами. Родитель закрывается, только когда каждый известный экземпляр подтверждён как исправленный или покрыт одобренным исключением. Закрыть родителя потому, что первый экземпляр прошёл ретест, — ровно так в примере пропустили мобильный бэкенд. Перечень экземпляров нужно пересматривать при изменении инвентаря: новое развёртывание того же компонента — новый потенциальный экземпляр.
Исправления на уровне класса и частичные исправления
Общая первопричина — другое дело: несколько находок с разными симптомами сводятся к одному шаблону, например к сборке запросов к базе данных из строк или к отсутствию централизованной проверки авторизации. Предупреждения CISA Secure by Design нацелены на устранение целых категорий дефектов — межсайтового скриптинга, внедрения команд ОС и обхода каталогов. Отсюда полезное правило: оформлять исправление на уровне класса как одну высокоприоритетную задачу, а не набор разрозненных тикетов, но каждую исходную находку всё равно проверять по её собственному тестовому сценарию.
Частичное исправление устраняет лишь часть уязвимого поведения: проверка ввода для одного параметра, но не для соседнего; авторизация при чтении, но не при изменении; исправление в продуктиве, но не в доступной извне копии тестового стенда. Его фиксируют как частичное с указанием оставшегося объёма. Находка остаётся открытой, пока остаток не исправлен, не смягчён в рамках исключения или не принят формально.
Приоритизация без универсального балла
Приоритизация лучше всего работает, когда разные сигналы остаются раздельными. CVSS выражает техническую критичность. EPSS, который ведёт FIRST, оценивает вероятность эксплуатации уязвимости в ближайшие 30 дней и не измеряет влияние на бизнес. Наблюдаемая эксплуатация — отдельное доказательство: наряду с Top 25 проект CWE публикует перечень 2025 CWE Top 10 KEV Weaknesses, ранжирующий активно эксплуатируемые слабости по каталогу Known Exploited Vulnerabilities агентства CISA, со списком слабостей на грани включения, и отмечает, что слабости вроде внедрения команд привлекают внимание атакующих. Доступность описывает, насколько достижим актив. Влияние на бизнес описывает, что потеряет организация при атаке на конкретный актив.
Универсальной формулы или порога, корректно объединяющих эти сигналы для любой организации, не существует. Подход, который мы рекомендуем, а не требует какой-либо источник, — фиксировать каждый сигнал отдельно и поручать названному ответственному задокументировать решение об очерёдности. Находки, где совпадают известная эксплуатация, высокая доступность, высокая критичность и серьёзное влияние на бизнес, естественно идут первыми; там, где сигналы расходятся, важнее всего письменное обоснование. Подробный метод описан в нашей статье о приоритизации уязвимостей на основе риска.
Критерии приёмки, которые можно повторить
Решение о закрытии хорошо настолько, насколько хорош его критерий. Открытые источники выполняют разные роли. OWASP Top 10 и CWE Top 25 описывают, что обычно идёт не так и почему. ASVS и WSTG — что проверять и как тестировать. NIST SP 800-115 и NIST CSF 2.0 встраивают тестирование и устранение в управление рисками. Материалы CISA Secure by Design рассматривают ответственность производителей и закупки. MDN документирует механизмы HTTP, от которых зависят многие веб-исправления.
ASVS даёт основу для тестирования технических мер защиты и перечень требований к безопасной разработке. Его основная заявленная цель — нормализовать охват и строгость проверки безопасности веб-приложений с помощью коммерчески применимого открытого стандарта. Поэтому критерием приёмки исправления может служить конкретное требование ASVS, а не мнение тестировщика. В статье используется ASVS 5.0.0; перечни требований публикуются в CSV, JSON и других машиночитаемых форматах, их можно импортировать в трекеры, а каждая ссылка должна содержать версию.
OWASP описывает WSTG как ведущий ресурс по тестированию безопасности для веб-разработчиков и специалистов по безопасности. Версия 4.2 — опубликованный версионированный выпуск. Ссылка на тест WSTG и использованную версию в записи о ретесте позволяет другому специалисту позже повторить проверку с сопоставимым результатом.
OWASP Top 10, на который здесь ссылаемся в редакции 2025 года, описан как стандартный документ для повышения осведомлённости и широкий консенсус о наиболее критичных рисках веб-приложений. Он помогает группировать находки и говорить с руководством, но не является чек-листом проверки: приёмка отдельных исправлений должна опираться на более детальные требования, например ASVS.
Справочник MDN по HTTP описывает Content Security Policy как заголовок ответа, помогающий обнаруживать и смягчать некоторые атаки, включая межсайтовый скриптинг и внедрение данных, а HTTP Observatory указывает как инструмент для безопасной настройки сайтов. Поэтому исправления на уровне заголовков можно проверять по документированному поведению, а не принимать на веру.
Компенсирующие меры и исключения с ограниченным сроком
Не каждую находку можно сразу исправить в корне. Для этого есть два управленческих инструмента, и оба требуют более жёсткого контроля, чем обычные исправления, потому что именно в них находки чаще всего теряются.
Смягчение — не исправление
Компенсирующая мера снижает вероятность или последствия эксплуатации, не устраняя слабость: правило фильтрации, функция, отключённая флагом, сетевое ограничение или дополнительный мониторинг. Быстрые точечные исправления и меры смягчения сокращают немедленную подверженность, но могут не затронуть первопричину; исправления на уровне класса занимают больше времени, но, согласно логике CWE Top 25 и Secure by Design, предотвращают повторение. Многие команды сочетают краткосрочную меру смягчения с отслеживаемым долгосрочным исправлением и проверяют оба. Саму меру нужно тестировать: фильтр, который обходится другой кодировкой, — не мера защиты. Пока она действует, статус — «смягчена», а не «закрыта», со сроком действия и условием снятия.
Исключения, у которых истекает срок
Исключение, или формальное принятие риска, — решение оставить известную слабость на определённый срок. Его утверждает человек, распоряжающийся бизнес-риском, а не инженер, которому иначе пришлось бы её исправлять. Исключение фиксирует объём, причину, компенсирующие меры, утверждающего, срок действия и триггеры пересмотра. По истечении срока его продлевают новым решением, превращают в работы по устранению или эскалируют; молча оно не продлевается. Принятый риск закрывает рабочую задачу, но не доказывает исправление, поэтому в отчётности эти категории держат раздельно. Допустимо ли исключение с точки зрения договоров или регулирования — вопрос для организации и её консультантов, а не для процесса.
Доказательства ретеста и решение о закрытии
Проверка — ядро контроля устранения. Находку закрывают только после авторизованного ретеста, показавшего, что исходный тестовый сценарий больше не срабатывает и требование выполнено, либо после оформления одобренного исключения. NIST SP 800-115 подчёркивает преимущества и ограничения каждой техники тестирования, поэтому метод ретеста выбирают осознанно: автоматическая проверка подтвердит заголовок безопасности, а ошибка авторизации обычно требует ручной проверки.
Что доказывает ретест и чего не доказывает
Ретест проверяет конкретное исправление в заданных условиях: сборка, окружение, конфигурация, роль пользователя, данные и дата. Он не доказывает постоянного отсутствия риска и ничего не говорит об уязвимостях вне объёма, поэтому условия должны быть в записи. Ретест должен смотреть и по сторонам: если слабость вызвана общим компонентом или шаблоном кода, проверяющему стоит в разрешённом объёме проверить другие места его использования. Привязка к первопричинам CWE превращает один ретест в проверку всего класса дефектов. Техническая сторона, в том числе как строить сценарии ретеста, которые действительно проверяют исправление, разобрана в нашем руководстве по проверке устранения после пентеста.
Что содержит запись о ретесте
Хорошая запись о ретесте содержит идентификатор исходной находки и привязку к CWE; версионированное требование или ссылку на тест, например идентификатор ASVS v5.0.0 или тест WSTG v4.2; сборку, окружение и дату; метод — автоматический, ручной или комбинированный; результат — исправлено, исправлено частично, не исправлено или риск формально принят; имена проверяющего и утверждающего. Аудитор или новый сотрудник должен понять закрытие без повторения оценки.
Листайте таблицу по горизонтали
| Тип исправления | Доказательство, достаточное для закрытия | Чего недостаточно | Какие условия зафиксировать |
|---|---|---|---|
| Исправление кода для инъекции или авторизации | Исходный сценарий повторён и не срабатывает; соседние параметры и эндпоинты в объёме проверены | Слитый pull request, не связанные с атакой юнит-тесты, тикет «Готово» | Сборка, окружение, роли, тестовые данные, проверяющий |
| Изменение конфигурации или заголовков | Ответ соответствует документированному поведению, например ожидаемой Content Security Policy, на каждом затронутом хосте | Файл конфигурации в репозитории без подтверждения развёртывания | Хосты, адреса, дата, метод |
| Исправление общей первопричины на уровне класса | Каждая исходная находка перепроверена плюс выборка других мест использования шаблона в объёме | Исправлена общая библиотека без проверки использующих её сервисов | Версия библиотеки, проверенные потребители, оставшиеся экземпляры |
| Компенсирующая мера | Мера протестирована напрямую, включая попытки обхода; статус остаётся «смягчена» | Правило развёрнуто без теста или статус изменён на «закрыта» | Срок действия, условие снятия, ссылка на долгосрочное исправление |
| Одобренное исключение | Подписанное утверждение с объёмом, причиной, компенсирующими мерами и сроком | Устная договорённость или инженер, закрывший тикет как «принято» | Утверждающий, срок действия, триггеры пересмотра |
Решение о закрытии можно выразить короткой воспроизводимой последовательностью:
- ЗаписьОдна запись на находку: статус, привязка к CWE, затронутые экземпляры, версионированный критерий приёмки и ответственный.
- УстранениеИсправлять на уровне первопричины, где возможно; меры смягчения и частичные исправления фиксировать с оставшимся объёмом и сроком действия.
- РетестПовторить исходный сценарий по письменному разрешению в заданных условиях и проверить другие места использования шаблона в объёме.
- РешениеЗакрывать только при доказательстве изменившегося поведения или одобренном исключении с ограниченным сроком; иначе оставить открытой или частично исправленной.
- НаблюдениеПерепроверять по триггерам пересмотра и после релизов, открывать повторно по исходной записи, если поведение вернулось.
Регрессия, повторное открытие и проверки по изменениям
Закрытие — не конец жизни записи. Следующий релиз может вернуть поведение через рефакторинг, обновление зависимости или скопированный код. Где возможно, исходный тестовый сценарий превращают в регрессионную проверку, запускаемую при каждом изменении затронутого компонента, а существенные изменения считают поводом для новой ручной проверки, как обсуждается в нашем руководстве по пентесту, запускаемому изменениями.
Если поведение вернулось, открывают повторно исходную запись, а не заводят новый, никак не связанный тикет. Так сохраняются первопричина, прежние доказательства и условия, на которых было принято закрытие. Повторное открытие не обязательно означает, что закрытие было ошибочным: оно могло быть верным для проверенной сборки.
Метрики, показывающие, можно ли доверять закрытию
NIST CSF 2.0 позиционируется как помощь организациям в понимании и улучшении управления рисками кибербезопасности и предлагает профили как шаблоны для описания текущего и целевого состояния. Метрики устранения естественно вписываются в такой профиль как свидетельство прогресса, но конкретные метрики и цели каждая организация определяет сама.
Полезные метрики, которые мы рекомендуем: открытые находки по критичности и возрасту; доля закрытых с подтверждённым ретестом; доля повторно открытых после закрытия; время от отчёта до подтверждённого исправления; число находок с общей первопричиной CWE; действующие исключения и меры смягчения с истёкшим сроком. Доля повторных открытий особенно показательна: она измеряет, можно ли доверять решениям о закрытии.
Метриками можно манипулировать. Подсчёт закрытых тикетов поощряет закрытие, а не защищённость. Смещение веса в сторону подтверждённых закрытий и повторяющихся классов слабостей удерживает внимание на результате, а не на активности.
Компромиссы и ограничения
Автоматизация против экспертизы: автоматические пересканирования хорошо масштабируются и подходят для ошибок конфигурации, а ошибки бизнес-логики и авторизации требуют людей. Акцент NIST SP 800-115 на ограничениях каждой техники относится к ретестам так же, как к первичному тестированию.
Внутренняя проверка против независимой: внутренняя команда знает систему и может проверять непрерывно, независимый проверяющий добавляет доверия со стороны аудиторов, клиентов и руководства. Баланс зависит от регуляторных требований, компетенций и критичности системы.
Возраст источников: NIST SP 800-115 опубликован в сентябре 2008 года и заменил SP 800-42 от 2003 года. Его принципы планирования, анализа и устранения остаются полезными, но технические детали стоит дополнять актуальными ресурсами, такими как ASVS и WSTG, указывая фактически использованную версию.
Ограничения процесса: пентест, ретест или процесс контроля устранения — не сертификация, не аттестация и не заключение о надёжности. Они дают ограниченные доказательства о конкретном поведении в конкретных условиях.
Как выбрать внешнего подрядчика для ретеста и проверки
Внешняя помощь имеет смысл, когда внутренний процесс уже понятен. Руководство CISA Secure by Demand предназначено для заказчиков ПО в ходе закупок, а руководство Safe Software Deployment подчёркивает надёжное тестирование и измерение. Обе темы превращаются в вопросы к поставщикам услуг ретеста и проверки устранения.
Уточните, привязываются ли находки к CWE и версионированным требованиям ASVS; входят ли ретесты в работу и закреплены ли в договоре число раундов и сроки; в каком формате даёт доказательства каждый ретест; используется ли тот же метод, что и при исходном тесте; как оформляются частичные исправления, дубликаты и формальное принятие риска; выполняется ли каждый ретест по письменному разрешению и в определённых границах. Запросите обезличенный пример отчёта о ретесте вместо общих заявлений.
При оценке поставщиков ПО обязательство CISA Secure by Design Pledge и отчёты о прогрессе присоединившихся производителей — законный фактор оценки, но само участие не доказывает защищённость продукта. CISA также указывает, что безопасные продукты должны «из коробки» и без доплаты предоставлять многофакторную аутентификацию, журналирование и единый вход. Журналирование важно для контроля устранения: оно помогает подтвердить, что исправление действует, а попытки эксплуатировать прежнюю слабость видны.
Практическая последовательность контроля закрытия
За каждым шагом ниже должны стоять конкретный ответственный, документ или инструмент:
- Задать каждый критерий приёмки как версионированное требование, например идентификатор ASVS.
- Назначить ответственного, отдельно зафиксировать критичность, данные об эксплуатации, доступность и влияние на бизнес и задокументировать решение об очерёдности.
- Привязать находки к первопричинам CWE, перечислить затронутые экземпляры и сгруппировать находки с общей причиной.
- Устранять первопричины, где возможно; задать мерам смягчения, частичным исправлениям и исключениям сроки действия и триггеры пересмотра.
- Проводить ретест по письменному разрешению с документированным версионированным методом и в заданных условиях.
- Фиксировать доказательства, позволяющие третьей стороне подтвердить закрытие.
- Отслеживать долю повторных открытий, просроченные исключения и повторяющиеся классы слабостей.
- Определить системы, которым нужна независимая проверка, и пересматривать прогресс в рамках профиля CSF 2.0.
Если шаг нельзя связать с конкретным человеком, артефактом или системой, этот разрыв нужно закрыть до вложений в дополнительное сканирование или тестирование. Если вы готовите ретест или новую оценку и хотите заранее согласовать системы, доступы, ограничения и ожидаемые доказательства, можно подготовить контур пентеста вместе с Pentest.red.
Вывод: закрытие как доказательство, а не статус тикета
Эффективный контроль устранения опирается на несколько идей, подкреплённых открытыми источниками: исправления проверяют по явным версионированным требованиям; работу направляют первопричины, а не симптомы, на что указывает логика CWE Top 25; приоритизация держит раздельно критичность, вероятность эксплуатации, наблюдаемую эксплуатацию, доступность и влияние на бизнес, а не сводит их в одно число. Вместе с исключениями ограниченного срока и метриками в логике CSF это позволяет показать аудиторам, клиентам и руководству, что конкретная уязвимость больше не ведёт себя прежним образом в заданных условиях, а не просто что закрыт тикет. Внешняя проверка приносит пользу, когда даёт доказательства того же качества в рамках чёткого разрешения.
PENTEST.RED
Обсудить объём и стоимость пентеста
Сначала согласуем системы, доступы, ограничения и ожидаемый результат.
Статья подготовлена на основе глубокого исследования и прошла редакционную переработку.