Перейти к основному содержимому

Анализ гипотез безопасности

Проверьте гипотезы безопасности по графу кода через CLI или MCP. Разберите доказательства, сравните результат после изменения и экспортируйте цели.

Справочник

При проверке безопасности инженер начинает с вопроса: может ли недоверенный ввод попасть в опасную операцию, можно ли обойти проверку прав, относится ли известная слабость к этому коду? Чтобы ответить, нужно найти входные точки, связи и условия выполнения. Один подозрительный фрагмент ещё не объясняет, как проблема проявится в приложении.

CodeGraph превращает такие предположения в гипотезы и проверяет их по графу свойств кода (Code Property Graph, CPG). Гипотеза задаёт предмет проверки, а граф помогает исследовать структуру программы и доступные связи. Процесс использует базу знаний и зарегистрированные провайдеры шаблонов. Каждая проверенная гипотеза получает результат: подтверждена, отклонена или неопределённа.

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

От предположения к проверке

Рассмотрим учебный вопрос: может ли значение из HTTP-запроса повлиять на SQL-запрос? Специалист сначала выбирает соответствующие гипотезы и проверяемую ревизию. Затем процесс выполняет запросы к CPG в заданной области. Инженер сопоставляет найденные места с исходниками и проверяет, есть ли параметризация, преобразование данных или другое условие, меняющее риск.

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

Когда этот анализ полезен

  • При ревью чувствительного изменения: исследовать выбранные гипотезы для нужной ревизии.
  • При разборе известной слабости: сузить область по поддерживаемой категории или CVE.
  • При подготовке проверки на исполнении: экспортировать поддерживаемые fuzz- или DAST-цели.
  • При передаче результата AppSec: сохранить отчёт, область, исключения и исходные позиции.

Связь гипотез с графом помогает перейти от общего предупреждения к проверяемому вопросу о коде. Для выбора проверок по языку и фреймворку используйте карту анализа. Она помогает выбрать соседнюю проверку: гипотезы исследуют слабости кода, модель угроз — границы системы, а SCA/SBOM — состав и риски зависимостей.

Выберите интерфейс

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

Параметры команд описаны в справочнике CLI, а подключение агентской сессии — в руководстве оператора MCP. Через MCP вызывайте codegraph_security_hypothesis_run. Для автоматизации используйте --help выбранной команды или схему MCP-инструмента в установленной версии.

Запуск через CLI

Установите CLI по руководству. Команды ниже предназначены для Bash в корне репозитория CodeGraph. Нужен доступный сервис GoCPG: текущий исполнитель отправляет запросы через gRPC. Значение --db выбирает CPG и не включает прямое чтение DuckDB.

export CODEGRAPH_ALLOW_LOCAL_PYTHON_CLI=1
python -m src.cli hypothesis run --db "<cpg-path>" --human-language ru

Если важна воспроизводимость, задайте язык, объём, порог и формат явно:

python -m src.cli hypothesis run \
  --db "<cpg-path>" \
  --language C \
  --max 50 \
  --min-priority 0.5 \
  --format json \
  --output "hypothesis-report.json" \
  --human-language ru

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

Параметры обычного run определяют предмет проверки и размер результата:

Запуск через CLI
Параметр Как выбрать значение По умолчанию
--language Укажите язык кода, например C. C
--max Задайте максимальное число гипотез в пакете. 50
--min-priority Задайте минимальный приоритет гипотез для проверки. В примере выбран 0.5. 0.3
--category Укажите категорию слабости; повторите флаг для нескольких категорий. Без фильтра по категории
--format Выберите json для обработки отчёта программой или text для чтения в терминале. text
--human-language Выберите язык пояснений: ru или en. en

Для сравнения двух ревизий сохраните одинаковые фильтры и порог. Тогда изменение числа подтверждённых гипотез можно сопоставить с изменением кода, показанным ниже.

Проверьте изменение на учебном примере

В этом примере функция получает текст из переменной окружения через getenv и передаёт его в system. Гипотеза командной инъекции проверяет сочетание источника ввода и выполнения команд в этой функции. Затем мы заменим выполнение команды выводом текста через puts, обновим граф и сравним результаты.

Выполняйте команды в Bash из корня CodeGraph. В GOCPG_BIN укажите абсолютный путь к установленному исполняемому файлу GoCPG вместо <path-to-gocpg>; на Windows это файл gocpg.exe. Нужен доступный GoCPG gRPC-сервис, как для предыдущих команд. Вместо <new-demo-dir> укажите новый каталог для исходников, графов и отчётов примера. Учебный исходник разбирайте анализатором; компилировать и запускать его для проверки гипотезы не требуется.

Создайте исходник, постройте CPG и сохраните отчёт:

GOCPG_BIN="<path-to-gocpg>"
DEMO_DIR="<new-demo-dir>"
mkdir -p "$DEMO_DIR/before"
cat > "$DEMO_DIR/before/example.c" <<'C'
#include <stdio.h>
#include <stdlib.h>

void run_action(void) {
    char *command = getenv("CODEGRAPH_DEMO_COMMAND");
    if (command != NULL) {
        system(command);
    }
}
C

"$GOCPG_BIN" parse --input "$DEMO_DIR/before" \
  --output "$DEMO_DIR/before.duckdb" --lang c
export CODEGRAPH_ALLOW_LOCAL_PYTHON_CLI=1
python -m src.cli hypothesis run \
  --db "$DEMO_DIR/before.duckdb" \
  --language C --category command_injection \
  --max 50 --min-priority 0.5 --format json \
  --output "$DEMO_DIR/before.json" --human-language ru

Откройте <new-demo-dir>/before.json. Для этого исходника ожидается одна выполненная проверка (executed_queries: 1) и одна подтверждённая гипотеза (confirmed_hypotheses: 1) категории command_injection. В её cwe_ids входит CWE-78. В исходнике проследите передачу command от getenv в system: именно этот участок команда получает для ревью.

Замените system(command) на puts(command), сохранив новую версию отдельно. Перестройте CPG и повторите ту же проверку:

mkdir -p "$DEMO_DIR/after"
sed 's/system(command);/puts(command);/' \
  "$DEMO_DIR/before/example.c" > "$DEMO_DIR/after/example.c"
"$GOCPG_BIN" parse --input "$DEMO_DIR/after" \
  --output "$DEMO_DIR/after.duckdb" --lang c
python -m src.cli hypothesis run \
  --db "$DEMO_DIR/after.duckdb" \
  --language C --category command_injection \
  --max 50 --min-priority 0.5 --format json \
  --output "$DEMO_DIR/after.json" --human-language ru

В <new-demo-dir>/after.json ожидаются executed_queries: 1, confirmed_hypotheses: 0 и rejected_hypotheses: 1. Число проверок сохранилось, а гипотеза командной инъекции стала отклонённой: новая версия выводит значение как текст через puts. Два исходника, два графа и два отчёта позволяют показать ревьюеру само изменение и результат повторной проверки.

Ограничение области проверки

Обычный run применяет повторяемый --category и список --cve через запятую. Аргумент run --cwe принимается парсером, но текущий обработчик его не использует. В export фильтр --cwe отбирает уже проверенные гипотезы для экспорта; он не ограничивает запросы.

--incremental --base-ref "<git-ref>" сравнивает указанную ревизию с HEAD в текущем рабочем каталоге. Незакоммиченные изменения в сравнение не входят. Этот режим игнорирует --category, --cwe, --cve и все аргументы исключения. Если список изменений пуст, выполняется полная проверка. Ошибка получения Git diff также может привести к пустому списку. Перед таким запуском отдельно проверьте базовую ревизию и список изменённых файлов.

В обычном run и в export применяйте --exclude-fixtures, --exclude-mocks, --exclude-generated или повторяемый --exclude-category. Сохраняйте исключения вместе с отчётом: они задают область проверки.

Перед анализом обновите CPG для проверяемой ревизии репозитория и передайте его путь в --db.

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

Перед выбором фильтров посмотрите доступные элементы базы знаний и зарегистрированные провайдеры:

python -m src.cli hypothesis list-cwes --format json
python -m src.cli hypothesis providers

Провайдер объединяет шаблоны анализа для языка или фреймворка, источники данных и опасные операции. Команда providers показывает его состав: Patterns — количество шаблонов, Sources — источников данных, Sinks — опасных операций. По этому списку выберите провайдера для своего проекта. Команда list-cwes показывает категории слабостей в базе знаний и помогает выбрать предмет проверки.

Экспортируйте поддерживаемые fuzz- или DAST-цели с явными БД и каталогом результата:

python -m src.cli hypothesis export \
  --db "<cpg-path>" \
  --format generic \
  --output "fuzz_targets" \
  --human-language ru

Команда экспорта запускает проверку, выбирает гипотезы по приоритету и заданному фильтру CWE, затем записывает targets.json и файлы отдельных целей. Манифест содержит входную и опасную функции, подсказки для входных данных, идентификаторы CWE, приоритет и текст гипотезы. Позиции в исходном коде берутся из собранных доказательств; имена функций также могут браться из шаблонов источников и опасных операций гипотезы.

Формат generic создаёт JSON-описание каждой цели. Форматы afl и libfuzzer создают начальные входные данные и заготовки тестовой обвязки. Для гипотез о поддерживаемых веб-слабостях также создаются шаблоны Nuclei. Подключите обвязку к точке входа приложения, настройте сборку и входные данные, затем запустите её в песочнице. По отчёту проверки выберите гипотезы для первоочередного исследования.

Запуск через MCP

Используйте подключение AppSec для чтения с профилем codex:role:codegraph_appsec:read, затем выберите codegraph_security_hypothesis_run в клиенте. Инструмент принимает action со значением run, list_cwes или list_providers, а также поддерживаемые поля языка, объёма, приоритета, категории и языка отчёта.

Чтобы получить имена провайдеров и поддерживаемые ими языки, передайте инструменту этот объект:

{"action": "list_providers"}

При run MCP выбирает CPG из контекста авторизованного проекта в работающем сервисе. Перед анализом выберите проект в клиенте.

Настройка и правила типизированных вызовов описаны в руководстве оператора MCP.

Интерпретация результатов

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

Текущий расчёт метрик считает каждую подтверждённую гипотезу истинным срабатыванием (true_positives). Пропущенные явно заданные CVE увеличивают false_negatives; false_positives сохраняет начальное значение 0. Значения precision, recall и f1_score рассчитываются по этим счётчикам и описывают результаты текущего запуска. При разборе находки откройте исходные позиции, доказательства запроса, категорию и привязку CWE. Чтобы оценить возможность эксплуатации, проследите путь данных и условия выполнения, затем воспроизведите поведение подходящим тестом безопасности.

Работа с находками

Языковые шаблоны задают проверяемые конструкции, а CPG предоставляет связи между элементами кода. Инженер использует доказательства гипотезы, чтобы выбрать участок для проверки и подготовить тест. После исправления обновите граф и повторите проверку той же гипотезы.

Сгенерированные fuzz-цели запускайте в песочнице после просмотра кода и настроек сборки. Храните отчёты в принятом командой хранилище с доступом для участников проверки: они содержат структуру репозитория и сведения о найденных слабостях.

Для системных границ доверия используйте моделирование угроз, а для рисков зависимостей — SCA/SBOM: эти процессы отвечают на разные вопросы.