Проблема
Средний SOC часто оптимизирует скорость закрытия alerts, а не скорость принятия правильного containment-решения. В результате событие получает низкий приоритет, потому что само по себе выглядит малозначительным, хотя оно уже может быть частью передачи доступа следующему оператору.
M-Trends 2026 фиксирует медианное dwell time в 14 дней, эксплуатацию уязвимостей как начальный вектор в 32% расследований и внутреннее обнаружение в 52% случаев. Самый важный операционный сигнал — сокращение медианного hand-off между initial-access оператором и следующей группой до 22 секунд.
Решение: измерять путь до containment
Одна метрика mean time to respond слишком груба. Нужна цепочка: время до acknowledgement, время до сохранения evidence, время до определения blast radius, время до блокировки identity, время до изоляции актива и время до подтвержденного восстановления.
Приоритет должен учитывать не только severity правила, но и роль актива, наличие внешней доступности, тип identity, соседство с Tier-0 и вероятность hand-off. Низкий score на рабочей станции и низкий score на VPN-концентраторе — не одно и то же решение.
Что проверить руками
- Есть ли отдельный SLA для edge, identity, backup, virtualization и management plane.
- Сохраняется ли исходный event и контекст до автоматического enrichment или нормализации.
- Может ли analyst одним действием отозвать сессии, заблокировать identity и изолировать host без потери evidence.
- Проверяется ли фактический результат containment, а не только успешный ответ API.
- Есть ли сценарий degraded mode, если EDR, SIEM или identity provider временно недоступны.
Безопасный пример: расчет response budget
Ниже локальный аналитический пример. Он не выполняет действий в инфраструктуре, а показывает, где response loop расходует время.
from datetime import datetime
STAGES = [
"detected_at",
"acknowledged_at",
"evidence_saved_at",
"identity_blocked_at",
"asset_isolated_at",
"recovery_verified_at",
]
def stage_durations(record):
points = [datetime.fromisoformat(record[name]) for name in STAGES]
return {
f"{STAGES[i]}->{STAGES[i + 1]}": int((points[i + 1] - points[i]).total_seconds())
for i in range(len(points) - 1)
}
# Feed only sanitized incident timestamps from an owned environment.
print(stage_durations(incident_record))
Типичные ошибки
- Считать количество закрытых alerts показателем качества containment.
- Автоматически понижать известный commodity malware без учета актива и identity.
- Терять raw event после enrichment и тем самым лишать расследование воспроизводимости.
- Закрывать incident после изоляции host, не проверив токены, mailbox, cloud и соседние control planes.
Evidence и критерий ретеста
- Timeline содержит исходный сигнал, каждое решение, исполнителя и проверку результата.
- Blast radius связывает host, identity, session, mailbox, cloud resource и management plane.
- Повторная tabletop-проверка укладывается в установленный response budget без ручного поиска контактов и прав.
Материал написан Virusologia с нуля как авторская инженерная интерпретация. Факты сверены по первичным публикациям, формулировки и практические выводы не копируют исходные тексты.
Материал предназначен для защиты, controlled labs и аудита систем, которыми вы владеете или на проверку которых имеете явное разрешение. Он не содержит эксплуатационных payload-цепочек или инструкций для несанкционированного доступа.