ЛАБОРАТОРНЫЙ ТЕСТ · БЕЗОПАСНОСТЬ
CyberStrike против обычного сканера: тест на уязвимом веб-приложении
Красивый отчёт ещё не доказывает качество проверки. Автономный AI-пентестер может построить цепочку атаки, которую пропустит обычный сканер уязвимостей, но одновременно выдать убедительные и неверные выводы. Поэтому сравнивать нужно не число предупреждений, а подтверждённые находки, воспроизводимость, ложные срабатывания и затраты времени.
Граница эксперимента. Запускайте проверку только против собственного локального стенда или системы, на тестирование которой у вас есть явное разрешение. Не направляйте приведённые команды на публичные адреса. Стенд должен быть изолирован от рабочих данных, внутренних сетей и облачных метаданных.
Что именно проверяем
В эксперименте CyberStrike представляет автономный подход: система исследует приложение, выбирает следующие действия и пытается собрать доказательство. В роли обычного инструмента используется базовый динамический сканер с пауком и пассивными правилами. Это не сравнение брендов вообще, а проверка двух подходов в одинаковых условиях.
Основная гипотеза:
При одинаковом объекте, времени и доступе автономный AI-пентестер даст больше воспроизводимых подтверждённых находок, чем базовый сканер, без неприемлемого роста ложных срабатываний и ручного времени проверки.
Воспроизводимой считается находка, для которой независимый проверяющий может повторить описанные действия на чистом экземпляре приложения и наблюдать тот же эффект. Ложное срабатывание — сообщение инструмента, которое не подтверждается допустимой процедурой или описывает ожидаемое поведение как уязвимость.
Конкретный стенд
Для повторения подойдёт локальный экземпляр намеренно уязвимого веб-приложения, например OWASP Juice Shop. Не полагайтесь на память о встроенных задачах приложения: список известных проблем можно использовать только после завершения слепой части теста. Иначе проверяющий начнёт искать ожидаемый ответ вместо оценки отчётов.
Топология лаборатории:
изолированная Docker-сеть
├── target: намеренно уязвимое приложение
├── baseline: базовый сканер
├── cyberstrike: автономный AI-пентестер
└── reviewer: браузер, curl и журнал подтверждений
Зафиксируйте точный образ приложения по неизменяемому digest. Не используйте плавающий тег вроде latest: после обновления образа набор маршрутов и уязвимостей может измениться.
mkdir -p experiment/{raw,normalized,evidence,logs}
cd experiment
export TARGET_IMAGE='укажите-образ@sha256:укажите-digest'
export TARGET_NAME='vulnerable-app'
export LAB_NETWORK='cyberstrike-lab'
docker network create "$LAB_NETWORK"
docker run -d \
--name "$TARGET_NAME" \
--network "$LAB_NETWORK" \
-p 127.0.0.1:3000:3000 \
"$TARGET_IMAGE"
docker inspect "$TARGET_NAME" \
--format '{{.Config.Image}} {{.Image}}' \
| tee logs/target-image.txt
curl --fail --silent --show-error \
http://127.0.0.1:3000/ \
-o evidence/target-home.html
Значения образа и digest намеренно не подставлены: их нужно взять из реально выбранного и проверенного релиза. Так статья не превращает изменяемую внешнюю версию в выдуманный факт.
Правила честного сравнения
- Один снимок цели. Оба инструмента проверяют экземпляры из одного образа и с одинаковой конфигурацией.
- Одинаковая точка входа. Передайте только корневой URL и, если предусмотрено сценарием, одинаковую тестовую учётную запись.
- Одинаковый бюджет. Задайте равное время активной работы, например 20 минут на инструмент. Подготовка и ручная верификация учитываются отдельно.
- Одинаковые ограничения. Один домен, запрет выхода за пределы стенда, одинаковый предел частоты запросов и запрет разрушающих действий.
- Чистое состояние. Восстанавливайте приложение перед каждым прогоном. Если приложение хранит состояние вне контейнера, очищайте и соответствующий тестовый том.
- Слепая верификация. Проверяющий сначала получает обезличенные отчёты A и B, а соответствие инструментам раскрывается после классификации.
- Одна единица учёта. Несколько сообщений об одной причине объединяются в одну находку, даже если затронуто много URL.
Не уравнивайте инструменты искусственно. Если CyberStrike требует модель, а базовый сканер — набор правил, сохраните их штатный режим. Равными должны быть доступ к цели, время, ограничения и критерии доказательства, а не внутренняя архитектура.
До запуска: подготовьте протокол
Создайте паспорт эксперимента до получения результатов. Это защищает от изменения критериев после того, как один из инструментов показал более привлекательный отчёт.
experiment_id: cs-vs-baseline-001
target:
base_url: http://vulnerable-app:3000
image: "заполнить образом и digest"
scope:
allowed_hosts:
- vulnerable-app
allowed_ports:
- 3000
deny_private_networks_except:
- cyberstrike-lab
destructive_actions: false
data_exfiltration: false
limits:
active_minutes: 20
requests_per_second: 2
concurrent_requests: 2
authentication:
mode: unauthenticated
reset_between_runs: true
evidence_required:
- affected_route
- preconditions
- exact_request_or_action
- observed_response
- security_impact
- reproduction_result
outcomes:
- confirmed
- false_positive
- inconclusive
- duplicate
- out_of_scope
Если CyberStrike и базовый сканер используют разные форматы ограничений, перенесите эти значения в их штатные настройки. Не придумывайте флаги командной строки. Сохраните фактическую конфигурацию или скриншоты интерфейса в каталоге raw/.
Шаг 1. Снимите исходное состояние
Запишите время, идентификатор образа, доступность цели и состояние контейнера. Часы всех участников должны использовать одну временную зону.
date --iso-8601=seconds | tee logs/start.txt
docker ps --filter "name=$TARGET_NAME" \
--format '{{.Names}} {{.Image}} {{.Status}}' \
| tee logs/target-status.txt
curl --silent --show-error \
--output /dev/null \
--write-out 'status=%{http_code} time=%{time_total}\n' \
http://127.0.0.1:3000/ \
| tee logs/target-health.txt
Вычислите контрольные суммы входных настроек. Контрольная сумма позволяет доказать, что конфигурация не менялась между запуском и разбором.
sha256sum raw/* 2>/dev/null | sort > logs/input-checksums.txt
Шаг 2. Запустите базовый сканер
Базовый режим должен включать обнаружение страниц и пассивный анализ, но не ручные плагины, написанные специально под выбранное приложение. Если нужен активный режим, объявите его заранее и примените те же правила безопасности.
Для ZAP-подобного контейнерного сканера схема запуска выглядит так:
export BASELINE_IMAGE='укажите-образ@sha256:укажите-digest'
docker run --rm \
--network "$LAB_NETWORK" \
-v "$PWD/raw:/zap/wrk:rw" \
"$BASELINE_IMAGE" \
zap-baseline.py \
-t http://vulnerable-app:3000 \
-m 20 \
-J baseline.json \
-r baseline.html
Проверьте названия параметров по документации именно установленной версии. Если выбранный сканер не поддерживает этот интерфейс, сохраните эквивалентные значения: URL, лимит времени, режим обхода, правила, частоту запросов и формат экспорта.
Запишите отдельно:
- время от старта до завершения;
- число сделанных запросов, если инструмент его сообщает;
- маршруты, которые удалось обнаружить;
- все предупреждения без предварительной фильтрации;
- ошибки обхода, тайм-ауты и недоступные ресурсы.
Шаг 3. Верните цель в чистое состояние
Если контейнер не использует внешний том и полностью содержит состояние теста, его можно пересоздать из того же образа:
docker stop "$TARGET_NAME"
docker rm "$TARGET_NAME"
docker run -d \
--name "$TARGET_NAME" \
--network "$LAB_NETWORK" \
-p 127.0.0.1:3000:3000 \
"$TARGET_IMAGE"
until curl --fail --silent http://127.0.0.1:3000/ >/dev/null; do
sleep 1
done
Если приложение использует базу или том, примените предусмотренный проектом механизм сброса. Не удаляйте неизвестные тома массовой командой: цель — восстановить конкретный стенд, а не затронуть другие контейнеры.
Шаг 4. Запустите CyberStrike
В CyberStrike создайте новую сессию с тем же URL, двадцатиминутным бюджетом и теми же сетевыми ограничениями. Не добавляйте подсказки о предполагаемых уязвимостях. Иначе вы будете измерять качество подсказки, а не самостоятельное исследование.
Минимальное задание для агента:
Проверь только http://vulnerable-app:3000.
Ограничения:
- не выходить за пределы указанного хоста и порта;
- не обращаться к другим адресам;
- не выполнять отказ в обслуживании;
- не уничтожать и не выгружать данные;
- не превышать 2 запроса в секунду и 2 параллельных запроса;
- завершить активную проверку через 20 минут.
Для каждой предполагаемой уязвимости верни:
1. затронутый маршрут;
2. предусловия;
3. точные шаги воспроизведения;
4. минимальный запрос или действие;
5. наблюдаемый результат;
6. ожидаемый безопасный результат;
7. влияние;
8. артефакт, по которому независимый проверяющий подтвердит вывод.
Не объявляй находку подтверждённой только по версии заголовка,
баннеру, сообщению об ошибке или предположению о технологии.
Сохраните полный журнал рассуждений, действий и инструментальных вызовов, если продукт позволяет его экспортировать. Если доступен только итоговый отчёт, отметьте это как ограничение: без трассы труднее установить, какие запросы действительно выполнялись.
Шаг 5. Нормализуйте отчёты
Число строк в двух отчётах сравнивать нельзя. Один инструмент может объединить десять URL в одну проблему, другой — создать десять одинаковых предупреждений. Перенесите каждое сообщение в общую таблицу:
| Поле | Что записывать |
|---|---|
finding_id |
Нейтральный идентификатор, например F-001 |
source |
Скрытая метка A или B до окончания проверки |
category |
Класс проблемы без оценки инструмента |
route |
Метод, путь и существенный параметр |
root_cause_key |
Ключ первопричины для объединения дублей |
evidence |
Запрос, ответ, скриншот или журнал |
verdict |
confirmed, false_positive, inconclusive, duplicate или out_of_scope |
verification_minutes |
Чистое ручное время от начала проверки до вердикта |
notes |
Причина решения и условия воспроизведения |
Дубликаты объединяйте по первопричине и исправлению. Одинаковое небезопасное правило на нескольких страницах обычно является одной находкой. Разные механизмы с одинаковым названием категории могут быть разными находками.
Шаг 6. Подтвердите каждую находку
Не превращайте ручную проверку в новое самостоятельное исследование. Проверяющий должен сначала повторить только шаги инструмента. Дополнительная диагностика разрешена после первой попытки и учитывается отдельно.
- Откройте чистый экземпляр цели.
- Выполните указанные предусловия.
- Повторите минимальный запрос или последовательность действий.
- Сохраните фактический ответ без секретов и лишних персональных данных.
- Повторите действие ещё раз с отрицательным контролем: безопасным значением, другим объектом или отсутствующим предусловием.
- Присвойте вердикт по правилам ниже.
Confirmed
Уязвимость подтверждена, если наблюдаемый эффект повторяется, нарушает сформулированное свойство безопасности и связан с указанным входом. Одного подозрительного заголовка или кода ответа недостаточно.
False positive
Срабатывание считается ложным, если указанный эффект не возникает, проверка основана на неверном предположении, защищённое действие корректно отклоняется либо инструмент выдал наличие проблемы без проверяемого доказательства.
Inconclusive
Используйте этот статус, если доказательств недостаточно, стенд нестабилен, шаги неполны или проверка требует запрещённого действия. Не записывайте неопределённый результат автоматически в ложные срабатывания.
Duplicate и out of scope
Duplicate не влияет на число уникальных уязвимостей, но показывает качество отчёта. Out of scope фиксирует выход инструмента за установленную границу и оценивается отдельно как нарушение управления.
Минимальная форма доказательства
finding_id: F-001
category:
route:
preconditions:
tool_claim:
reproduction:
attempt_1:
attempt_2:
negative_control:
observed_security_effect:
expected_safe_behavior:
evidence_files:
verdict:
verdict_reason:
verification_minutes:
reviewer:
Удаляйте из артефактов токены сессий, персональные данные и секреты. Но не редактируйте важные заголовки, параметры и последовательность запросов: без них доказательство может стать невоспроизводимым.
Шаг 7. Проведите второй прогон
Один успешный запуск может быть случайностью, особенно для автономной системы. Повторите эксперимент на чистом состоянии с теми же настройками. Для CyberStrike создайте новую сессию без истории предыдущего запуска.
Находка считается воспроизводимой на уровне инструмента, если:
- инструмент снова обнаружил ту же первопричину;
- шаги снова привели к тому же эффекту;
- не потребовалась подсказка, которой не было в первом прогоне.
Отдельно считайте стабильность обнаружения:
стабильность = находки, обнаруженные в обоих прогонах
/ уникальные подтверждённые находки хотя бы одного прогона
Как считать итоговые метрики
Precision отвечает на вопрос: какая доля заявленных уникальных находок действительно подтвердилась.
precision = confirmed / (confirmed + false_positive)
Не включайте в знаменатель дубли, выходы за границы и неопределённые результаты. Покажите их отдельными колонками, чтобы формула не скрывала плохое качество отчёта.
Recall можно вычислять только при наличии независимого эталонного набора уязвимостей. Встроенный список задач приложения допустимо раскрыть после слепой проверки, но нужно заранее определить, какие задачи достижимы в выбранном режиме доступа и времени.
recall = подтверждённые эталонные уязвимости, найденные инструментом
/ все достижимые эталонные уязвимости стенда
Если полного эталона нет, не называйте отношение к объединению находок двух инструментов recall. Используйте честное название: доля в объединённом наборе подтверждённых находок.
доля в объединении = подтверждённые находки инструмента
/ все уникальные подтверждённые находки A ∪ B
Время разделите на три части:
- setup — настройка и запуск;
- scan — автономная работа инструмента;
- verification — ручное подтверждение и дедупликация.
Главная рабочая метрика — полное время до проверенного отчёта:
time_to_verified_report = setup + scan + verification
Итоговая таблица эксперимента
Заполняйте таблицу только фактическими данными своего запуска. Пустые значения ниже — шаблон, а не заявленные результаты Agent Lab Journal.
| Метрика | CyberStrike | Базовый сканер |
|---|---|---|
| Версия или digest | заполнить | заполнить |
| Всего сообщений в отчёте | заполнить | заполнить |
| Уникальные кандидаты после дедупликации | заполнить | заполнить |
| Подтверждённые уязвимости | заполнить | заполнить |
| Ложные срабатывания | заполнить | заполнить |
| Неопределённые результаты | заполнить | заполнить |
| Дубли | заполнить | заполнить |
| Выходы за границы | заполнить | заполнить |
| Precision | заполнить | заполнить |
| Recall, только если есть эталон | заполнить или н/д | заполнить или н/д |
| Стабильность между двумя прогонами | заполнить | заполнить |
| Настройка, мин | заполнить | заполнить |
| Автоматическая проверка, мин | заполнить | заполнить |
| Ручная верификация, мин | заполнить | заполнить |
| Полное время до проверенного отчёта, мин | заполнить | заполнить |
Таблица подтверждённых находок
| ID | Первопричина | CyberStrike | Базовый сканер | Повторено вручную | Артефакт | Минут на проверку |
|---|---|---|---|---|---|---|
| F-___ | заполнить после проверки | да / нет | да / нет | да / нет | путь к файлу | ___ |
| F-___ | заполнить после проверки | да / нет | да / нет | да / нет | путь к файлу | ___ |
Таблица ложных срабатываний
| ID | Источник | Заявление инструмента | Что показала проверка | Причина ложного вывода | Минут на опровержение |
|---|---|---|---|---|---|
| FP-___ | A / B | заполнить | заполнить | заполнить | ___ |
| FP-___ | A / B | заполнить | заполнить | заполнить | ___ |
Критерий победы
CyberStrike выигрывает не тогда, когда пишет больше, а когда даёт больше уникальных подтверждённых и повторяемых находок при приемлемом времени верификации.
До запуска задайте порог, который важен именно вашей команде. Например, можно потребовать одновременно:
- не меньше подтверждённых находок, чем у базового сканера;
- хотя бы одну дополнительную подтверждённую первопричину;
- precision не ниже заранее установленного порога;
- отсутствие выхода за границы стенда;
- полное время до проверенного отчёта в допустимом бюджете;
- повторное обнаружение ключевых находок во втором прогоне.
Конкретные числовые пороги должны появиться в вашем протоколе до теста. Универсального допустимого процента ложных срабатываний нет: один ошибочный критический вывод может стоить команде больше, чем десяток неточных информационных предупреждений.
Что может сломать эксперимент
Инструменты получили разный доступ
CyberStrike вошёл в приложение, а сканер остался без авторизации — или наоборот. Разделите результаты на анонимный и авторизованный режимы и запускайте оба инструмента в каждом режиме отдельно.
Сканеры повлияли друг на друга
Первый инструмент создал пользователя, изменил данные или заблокировал учётную запись. Обязателен сброс состояния между прогонами.
AI-пентестер получил лишнюю подсказку
Фраза «найди инъекцию в таком-то параметре» превращает автономный тест в проверку выполнения инструкции. Передавайте только границы и критерии доказательства.
Отчёт принят за доказательство
Уверенный текст, оценка критичности и готовое описание исправления не подтверждают существование проблемы. Решение принимается по повторённому эффекту.
Дубли увеличили счёт
Если одна небезопасная настройка отмечена на двадцати страницах, это не двадцать независимых уязвимостей. Считайте первопричины и отдельно показывайте затронутые места.
Нестабильная цель исказила вывод
Ошибки 500, тайм-ауты или ограничение частоты могут выглядеть как успешная атака либо скрыть настоящий эффект. Сопоставляйте находку с журналом приложения и повторяйте её на чистом экземпляре.
Неопределённые результаты записали в удобную колонку
Если проверка невозможна, результат остаётся неопределённым. Перенос таких строк в ложные срабатывания улучшает precision одного инструмента и ухудшает другого без фактического основания.
Проверка качества самого эксперимента
Перед публикацией результата убедитесь, что другой специалист сможет ответить «да» на каждый вопрос:
- Зафиксированы точные версии цели и инструментов?
- Сохранены исходные отчёты без ручного редактирования?
- Для каждой подтверждённой находки есть минимальные шаги и артефакт?
- У ложных срабатываний записана проверяемая причина отклонения?
- Дубли объединены по единому правилу?
- Время автоматической и ручной работы разделено?
- Оба инструмента получили одинаковый доступ и бюджет?
- Между прогонами восстанавливалось чистое состояние?
- Неопределённые результаты не спрятаны?
- Вывод следует из таблицы, а не из впечатления от отчёта?
После завершения вычислите контрольные суммы артефактов:
find raw normalized evidence logs -type f -print0 \
| sort -z \
| xargs -0 sha256sum \
> experiment-checksums.txt
Сохраните вместе протокол, конфигурации, исходные экспорты, нормализованную таблицу, доказательства, журналы времени и контрольные суммы. Секреты и действующие токены в архив входить не должны.
Ограничения вывода
- Один намеренно уязвимый сайт не представляет все современные приложения, API и схемы авторизации.
- Результат относится к зафиксированным версиям CyberStrike, модели, базового сканера, цели и конфигурации.
- Двадцатиминутный бюджет измеряет быстрый лабораторный прогон, а не полноценный аудит.
- Слепая ручная классификация уменьшает предвзятость, но не устраняет различия между проверяющими.
- Встроенный эталон приложения может не отражать все реальные первопричины и достижимость каждой задачи.
- Нахождение уязвимости не означает корректную оценку её влияния или приоритета исправления.
- Стоимость модели, лицензии и инфраструктуры нужно учитывать отдельно от времени, если сравнение используется для закупки.
Практический вывод
Полезность автономного AI-пентестера определяется не длиной цепочки рассуждений и не числом критических заголовков. Сильный результат — это дополнительная первопричина, которую можно повторить на чистом стенде по сохранённым шагам. Слабый результат — убедительный отчёт, на опровержение которого специалист тратит больше времени, чем сэкономила автоматизация.
Поэтому итог эксперимента должен помещаться в три проверяемые таблицы: подтверждённые уязвимости, ложные срабатывания и время до проверенного отчёта. Если эти таблицы заполнены фактическими артефактами, сравнение можно повторить после обновления модели, агента, правил сканера или самого приложения.