Управление уязвимостями веб-приложений: от списка компонентов до закрытия находок

Управление уязвимостями (vulnerability management) — это не сканер, а договорённость: что у вас запущено, откуда приходят находки, кто и в какие сроки их закрывает. Мы настраиваем её для веб-приложений и их окружения в вашем контуре. Начинаем с инвентаря, потому что на вопрос «затронуты ли мы новой громкой уязвимостью» невозможно ответить, не зная, какие версии где работают.

Обследование от 200 000 ₽, вычитается из первого этапаСканеры и отчёты работают в вашем контуреРеестр, правила и код проверок остаются у вас

С чем приходят

Когда пора настраивать процесс, а не искать ещё одну проверку

Отчёт аудита лежит в почте

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

Вышла громкая уязвимость, и никто не знает, затронуты ли вы

Ответ требует списка версий и зависимостей по всем приложениям. Без него список собирают по памяти разработчиков, и это занимает дни.

Клиент прислал опросник по безопасности

Вопросы вида «как быстро вы закрываете критические находки» требуют документа и примера из практики, а не фразы «мы следим».

Сканер включён, но срабатываний сотни

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

Область

Пять слоёв, где живут уязвимости, и кто за каждый отвечает

Процесс охватывает всё вокруг вашего веб-приложения. Проверка кода описана на странице secure code review, здесь о том, как все слои сходятся в одном реестре.

Слой
Что внутри
Чем находим
Кто и как закрывает
СлойКод приложенияваш и подрядчика
Что внутриЛогика, права доступа, работа с данными
Чем находимРевью кода и статический анализ в запросе на слияние
Кто и как закрываетКоманда разработки в обычном цикле; ошибка прав оформляется задачей с тестом
СлойЗависимостибиблиотеки и фреймворки
Что внутриПакеты, которые вы подключили, и пакеты, которые они подтянули сами
Чем находимАнализ состава по файлам фиксации версий, перечень компонентов каждого выпуска
Кто и как закрываетОбновление пакета; если нельзя, замена или временная мера. Решение за техническим руководителем
СлойОбразы и системное ПОконтейнеры, ОС, среда исполнения
Что внутриБазовые образы, системные пакеты, версия языка и сервера приложений
Чем находимПроверка образа перед выкладкой и по расписанию для уже работающих
Кто и как закрываетПересборка на обновлённом базовом образе; отвечает владелец конвейера сборки
СлойНастройка и доступысерверы, база, ключи
Что внутриОткрытые порты, учётные записи, права в базе, секреты в репозиториях
Чем находимПроверка конфигурации по чек-листу, поиск секретов, просмотр доступов
Кто и как закрываетАдминистратор системы; найденный ключ меняют в день обнаружения
СлойВнешние сервисыто, чем вы пользуетесь
Что внутриПлатёжный провайдер, почта, карты, виджеты, облачные хранилища
Чем находимСписок с владельцем, подписка на бюллетени поставщика
Кто и как закрываетВы и поставщик; от нас перечень и вопросы к поставщику
Инвентарь

Инвентарь: без списка запущенного процесс не начать

Первое, что мы делаем, — составляем список. Он скучный и нужен именно в тот день, когда вышла громкая уязвимость.

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

Перечень состава выпуска

Для каждого выпуска при сборке создаётся перечень компонентов: какие библиотеки и какие версии вошли в приложение, включая подтянутые автоматически. Файл создаётся автоматически и хранится рядом со сборкой. Когда приходит сообщение об уязвимости в библиотеке, достаточно выполнить поиск по перечням, а не просить разработчиков вспомнить.

Что инвентарь даёт кроме громких новостей

  • Видны забытые сервисы. Старый стенд с боевой копией базы находится в таблице, а не в отчёте после инцидента.
  • Видны устаревшие компоненты. Библиотека без обновлений — будущая уязвимость, которую некому закрыть; замену планируют заранее.
  • Приоритеты опираются на факты. Находка в сервисе, доступном из интернета и работающем с персональными данными, и находка в стенде за закрытой сетью разные по срочности. Как их сравнивать, разобрано в статье «Как приоритизировать уязвимости».
Режимы

Три режима работы: плановый, внеплановый и накопительный

Режим
Когда запускается
Что делаем
Что на выходе
РежимПлановыйритм команды
Когда запускаетсяРаз в неделю и перед каждым релизом
Что делаемНебольшие обновления зависимостей и образов, разбор новых срабатываний, правка приоритетов
Что на выходеЗакрытые задачи и обновлённый реестр; список просроченного разобран
РежимВнеплановыйреакция на событие
Когда запускаетсяВышла громкая уязвимость или пришло сообщение извне; ответ нужен в тот же день
Что делаемПоиск по перечням, проверка достижимости, временная мера, срочный выпуск при необходимости
Что на выходеЗаписанное решение: затронуты или нет, что сделано, когда закрыто
РежимНакопительныйуборка долга
Когда запускаетсяРаз в квартал
Что делаемПросмотр исключений с наступившей датой, устаревших компонентов, находок без владельца и ложных срабатываний
Что на выходеРешение по каждому пункту: обновить, заменить, принять риск с новой датой
Внеплановый режим

Первые сутки после громкой уязвимости: порядок действий

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

Сообщение пришло утром. Задача первого дня — не исправить всё, а ответить на два вопроса: затронуты ли мы и насколько срочно. Порядок такой.

  1. Прочитать условия. Какие версии затронуты, нужна ли определённая функция, нужен ли вход в систему.
  2. Поиск по перечням составов. Находим все выпуски с затронутой версией и делим на три группы: работает в боевой среде, работает на стенде, давно не выкладывался. Если перечней нет, этот шаг растягивается на дни, и это главный довод в пользу инвентаря.
  3. Проверить достижимость. Попадают ли в уязвимую функцию данные от внешнего пользователя. Один и тот же пакет в двух сервисах даёт разный ответ: в одном им читают загруженные клиентом файлы, в другом только собственные шаблоны.
  4. Временная мера, если выпуск не сразу. Отключить функцию, закрыть доступ из внешней сети, запретить загрузку определённых типов файлов. Мера записывается с датой снятия.
  5. Исправление и проверка. Обновление пакета, прогон автотестов, повторная проверка тем же способом, которым нашли. Закрывает второй человек.
  6. Запись и сообщение. Решение вносится в реестр. Если договор с клиентом обязывает сообщать о таких событиях, сообщение готовит ответственный по договору, мы даём техническое описание.

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

Опросники клиентов

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

Типовые вопросы из опросников крупных заказчиков и документы, которые появляются у вас после настройки процесса.

Вопрос клиента
Что отвечаем по сути
Чем подтверждаем
Чего обещать не надо
Вопрос клиентаКак вы узнаёте о новых уязвимостяхисточники
Что отвечаем по сутиАвтоматический анализ зависимостей при сборке и по расписанию, бюллетени поставщиков ключевых компонентов
Чем подтверждаемСписок источников с ответственным и частотой просмотра
Чего обещать не надоЧто отслеживаются «все» уязвимости мира
Вопрос клиентаКакие сроки исправленияклассы и сроки
Что отвечаем по сутиКлассы по приоритету, срок и реакция для каждого, порядок переноса с записью причины
Чем подтверждаемРегламент на одну-две страницы и выгрузка просроченного из реестра
Чего обещать не надоОдинаковые сроки для всех находок
Вопрос клиентаКак вы проверяете, что исправленозакрытие
Что отвечаем по сутиПовторная проверка тем же способом и независимый второй человек
Чем подтверждаемСтатусы и ссылки на проверку в реестре
Чего обещать не надоЧто ошибки не вернутся
Вопрос клиентаЧто с уязвимостями, которые вы не исправляетеисключения
Что отвечаем по сутиПисьменное решение: кто принял, почему, чем компенсируем, когда пересмотрим
Чем подтверждаемСписок исключений с датами пересмотра
Чего обещать не надоЧто исключений нет
Закрытый контур

Что меняется, когда сборка и серверы не выходят в интернет

Базы уязвимостей без доступа в сеть

Сканеры берут данные об уязвимостях из внешних баз. В закрытом контуре настраивается зеркало: оно обновляется по расписанию через проверяемый шлюз или носитель, а дата последней выгрузки записывается и видна в отчёте.

Обновления через зеркало

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

Автотесты как условие

Обновлять зависимости безопасно, когда есть тесты. Без них обновления откладываются, и находки копятся; тогда первым шагом становится минимальный набор тестов.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Работы дешевле 150 000 ₽ не берём; остановиться можно после любой ступени, сделанное остаётся у вас по акту.

Обследование: одно-два приложения

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

200 000 ₽ · 2–3 недели

Обследование: несколько приложений, команд или площадок

То же для нескольких репозиториев с разными владельцами, подрядчиками и средами. Добавляются карта ответственности и единый реестр.

350 000 ₽ · 3–4 недели

Пилот лёгкий: процесс на одном-двух приложениях

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

150 000–400 000 ₽ · 2–8 недель

Пилот тяжёлый: много приложений или закрытый контур

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

400 000–1 200 000 ₽ · 2–3 месяца

Аудит или ревью кода как источник находок

Если своих находок мало, проводим <a href="../audit-bezopasnosti-veb-prilozheniya/">аудит безопасности</a> или ревью кода. Отчёт содержит воспроизведение и порядок исправления.

200 000 / 350 000 / 500 000 ₽ · 2–6 недель

Исправление найденного

Правка кода, обновление зависимостей, перенастройка. Оценивается по объёму; заказывать у нас не обязательно, реестр работает и с вашей командой.

от 150 000 ₽ · по объёму

Сопровождение

Разбор новых находок раз в неделю, обновление правил и баз, подготовка ответов на опросники. Плановые доработки входят с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

2–3 недели — Обследование: инвентарь и текущая картина

Список приложений и окружений, перечни зависимостей, существующие проверки и отчёты, владельцы.

Неделя — Правила: классы, сроки и статусы

Согласуем с техническим руководителем классы приоритета, сроки, порядок переноса и принятия риска.

1–2 недели — Подключение источников

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

Первый разбор — База и очередь

Накопленные находки делим на три корзины: закрыть сейчас, запланировать, принять с датой пересмотра.

Первый цикл — Репетиция громкой уязвимости

Берём прошлое событие и проходим порядок первых суток на ваших данных. Правим процесс там, где он замедлился.

Дальше — Передача или сопровождение

Либо команда ведёт процесс сама по инструкции, либо мы разбираем очередь раз в неделю в рамках пакета. Решение за вами.

Цена

Что двигает цену внутри вилки

Число приложений и сред

Каждое приложение — отдельная сборка и владелец, которых надо подключить.

Зрелость сборки

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

Закрытый контур

Зеркала баз, пакетов и образов и шлюз для выгрузки — отдельная работа и отдельное сопровождение.

Накопленный долг

Приложение на версиях без обновлений даёт сотни находок. Разбор долга оценивается отдельно и сильнее всего двигает вилку.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

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

Мы этого не делаем

  • Не продаём сканирование как облачную услугу: инструменты работают в вашем контуре.
  • Не дежурим круглосуточно и не обещаем реакцию на инцидент в течение часа.
  • Не поставляем SIEM, WAF и IDS, не защищаем от DDoS.
  • Не проводим пентест боевых систем и аттестацию; лицензии ФСТЭК у нас нет.
  • Не обновляем рабочие станции и сетевое оборудование.
  • Не берём работы дешевле 150 000 ₽.
Граница

Управление уязвимостями, аудит, DevSecOps: что выбрать

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

Если вам нужно встроить автоматические проверки в сборку и разобраться, где какую запускать, смотрите внедрение DevSecOps и анализ кода и зависимостей. Управление уязвимостями берёт их результаты и доводит до закрытия. Если проблема в самом процессе разработки, начинают с безопасной разработки, а если новая система только проектируется, помогает моделирование угроз.

Шесть шагов процесса от находки до закрытия описаны в статье «Управление уязвимостями: от находки до закрытия».

Инструменты

На чём собираем

Находки и состав выпуска
  • Trivy, OSV-Scanner и OWASP Dependency-Check для зависимостей и образов
  • Syft и формат CycloneDX для перечня состава; Dependency-Track для хранения и поиска по перечням
  • Gitleaks для поиска секретов в истории репозитория
  • Semgrep для статического анализа в запросах на слияние
Реестр, обновления и сборка
  • Ваш трекер задач (GitLab, Jira или аналог) как реестр
  • Renovate или встроенные обновления платформы для небольших регулярных правок зависимостей
  • GitLab CI, Jenkins или GitHub Actions: проверки подключаются к вашей сборке
  • Внутренние зеркала пакетов и образов, если контур закрыт
Материалы

Материалы по теме

Статья

Как приоритизировать уязвимости: оценка и контекст

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

  • Что измеряет оценка
  • Контекст
  • Порядок решений
Читать →
Статья

Управление уязвимостями: от находки до закрытия

Шесть шагов, реестр, сроки, исключения и метрики для небольшой команды.

  • Шесть шагов
  • Реестр
  • Исключения
Читать →
Статья

SAST, DAST, SCA: в чём разница

Какой вопрос задаёт каждая проверка и с какой начать, чтобы в реестр попадали полезные находки.

  • Три вопроса
  • Шум
  • Что выбрать
Читать →
Заявка

Разберём, как сегодня закрываются ваши уязвимости

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

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: управление уязвимостями

Сколько стоит настройка управления уязвимостями?

Начинаем с обследования: 200 000 ₽ за одно-два приложения и 350 000 ₽ за несколько систем. Затем лёгкий пилот за 150 000–400 000 ₽ или тяжёлый за 400 000–1 200 000 ₽, если приложений много или контур закрытый. Обследование вычитается из первого этапа, если продолжаете с нами.

Чем это отличается от аудита безопасности?

Аудит — разовая проверка, которая даёт список находок. Управление уязвимостями — постоянный порядок работы с этим списком: запись, приоритет, владелец, срок, проверка закрытия.

Нужно ли покупать систему управления уязвимостями?

Для небольшого числа приложений нет. Хватает проверки зависимостей и образов в сборке, перечня состава и реестра в вашем трекере. Специализированные системы нужны, когда источников много, а команд несколько; решаем на обследовании.

Как быстро можно понять, затронуты ли мы новой уязвимостью?

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

Можно ли работать в закрытом контуре без интернета?

Да. Сканеры работают внутри сети, базы уязвимостей и пакеты приходят через зеркало, обновляемое по расписанию через проверяемый шлюз. Дату последней выгрузки записываем.

Кто будет исправлять найденное?

По умолчанию ваша команда: реестр и сроки работают с любыми исполнителями. Мы можем взять исправление отдельным этапом, оно оценивается по объёму и начинается от 150 000 ₽. Закрывает находку второй человек.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.