Skip to content

arinochk/go-ast-processor-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-ast-processor-cli

Инструмент для построения дерева вызовов функций (консольная версия)

Как пользоваться консольной утилитой?

Ввод команд-1 Ввод команд-2

Развитие функционала (Микросервисная архитектура)

Архитектура микросервисов

Архитектура отображения графов вызовов уязвимых функций Микросервисы:

  • sast-report-viewer
  • call-graph-scheduler
  • go-callgraph-processor
  • call-graph-viewer
  • vulnerability-cleaner
  • ml-predictor
  • API-шлюз

Топики Kafka:

  • callgraph.required
  • callgraph.completed
  • go.callgraph.cleanup
  • vulnerability.cleanup
  1. Сначала проводим статический анализ в CI/CD, получаем отчет статического анализатора, например, semgrep, в формате JSON.
  2. Вызываем ручку POST сервиса call-graph-scheduler: передаем отчет и ссылку на Gitlab.
  3. Сервис call-graph-scheduler клонируют репозиторий в локальную директорию. SAST-отчет отправляет с помощью ручки POST сервиса sast-report-viewer, сервис sast-report-viewer десериализует отчет и сохраняет содержимое в БД. В ответ sast-report-viewer возвращает список vulnerabilityId (который далее используется для поиска графа вызовов в качестве метки) и информацию о местоположении каждой уязвимости. Если vulnerabilityId был получен, то исходный код сервис call-graph-scheduler сохраняет в S3-хранилище. Здесь используется жесткая связность, поскольку в случае если отчет некорректен, то дальнейшее построение графа не имеет смысла.
  4. Сервис call-graph-scheduler отправляет сообщение Kafka в топик callgraph.required с метаданными о сохраненных ресурсах в S3-хранилище + списка информации об уязвимостях. Информация об уязвимостях в сообщении кафки представлено следующим образом:
{
  "vulnerabilityId": "7ba5ebfe-8455-4baf-b718-7fce32bdd86e",
  "filePath": "internal/pathtraversal/dfs.go",
  "functionName": "FindPath",
  "lineNumber": 28
}
  1. Сервис go-callgraph-processor вычитывает сообщение из Кафки из топика callgraph.required, начинает обработку в асинхронном методе.

  2. В этом методе go-callgraph-processor выгружает исходный код и JSON-отчет. Вычитываем сообщение из топика callgraph.required и получаем информацию о местоположении уязвимости, по этой информации строим граф вызовов для уязвимых функций и сохраняет граф вызовов в Redis-хранилище с большим TTL (например, 7 дней).

    Он в другом топике - в callgraph.completed отправляет сообщение о том, что построение прошло успешно и информацию о ключах в Redis, которым соответствуют графы вызовов, или наоборот, если неуспешно. Сервис call-graph-viewer вычитывает сообщение из Кафки, по каждому каждого ключу Redis сервис call-graph-viewer получает граф вызовов, который сохраняется в графовую БД. Для экономии ресурсов можно использовать схему Postgres. Примерная схема Postgres:

CREATE TABLE callgraph_nodes (
    vulnerability_id UUID NOT NULL,
    node_id SERIAL PRIMARY KEY,
    function_name TEXT NOT NULL,
    file_path TEXT,
    function_content TEXT,
    PRIMARY KEY(vulnerability_id, node_id)
);

CREATE TABLE callgraph_edges (
    vulnerability_id UUID NOT NULL,
    from_node_id INTEGER REFERENCES callgraph_nodes(node_id),
    to_node_id INTEGER REFERENCES callgraph_nodes(node_id),
    PRIMARY KEY (vulnerability_id, from_node_id, to_node_id)
);

CREATE INDEX ON callgraph_nodes(vulnerability_id);
CREATE INDEX ON callgraph_edges(vulnerability_id);

Добавить граф вызовов в сообщение в топике callgraph.completed нельзя, так как если уязвимостей много, сообщение кафки будет большим. Если по какой-то причине сохранение графа для vulnerabilityId не было успешным, то сообщение из топика callgraph.completed коммитим, но отправляем новое с теми vulnerabilityId, которые не были сохранены. Иначе - просто коммитим сообщение в топике callgraph.completed, затем отправляем сообщение в Кафку в топик go.callgraph.cleanup. Функционал сервиса call-graph-viewer следующий:

  • GET-запрос: по vulnerabilityId вернуть граф вызовов.
  1. Сервис go-callgraph-processor вычитывает сообщение из топика go.callgraph.cleanup и осуществляет удаление графа из своей БД. 8По крон-выражению vulnerability-cleaner вызывает ручку GET сервиса sast-report-viewer и получает список vulnerabilityId всех тех уязвимостей, отчеты которого долго хранятся и требует очистки. Сервис vulnerability-cleaner отправляет сообщение в топик vulnerability.cleanup с информацией о устаревших vulnerabilityId. Сервисы call-graph-viewer и sast-report-viewer удаляют устаревшие данные из своих БД.

  2. Сервис API-шлюз ответственен за авторизацию публичных API и вызов сервисов sast-report-viewer и call-graph-viewer.

Если требуется поддержка других языков программирования, то добавляем сервис processor (например, для java - java-ast-processor).

  1. Информацию с go-callgraph-processor можно использовать как основу для ml-predictor. Сервис ml-predictor будет использовать модель mahdin70/GraphCodeBERT-VulnCWE, которая определяет вероятность уязвимости по построенному графу вызовов. С помощью SNAP ((SHapley Additive exPlanations) — алгоритм из теории игр, который разбивает предсказание модели на вклады каждого входного элемента) можно подсветить уязвимые участки кода.

Идеи для развития

Потенциальный функционал инструмента:

  • Построение дерева вызовов для одной функции
  • Можно выявить связь между двумя функциями, где, например, одна функция вызывает другую. Для этого нужно просто построить два дерева и обойти каждое из них.
  • Предсказание о конкретной реализации интерфейса функции по дереву вызова, используя информацию о типе.
  • Поиск инициализации переменной

Про VTA

Алгоритм VTA строит глобальный граф распространения типов, который моделирует потоки данных в программе. Он передает типы и функциональные литералы по этому графу, чтобы определить, какие типы могут оказаться в каждой переменной. Этот подход позволяет более точно определять возможные получатели динамических вызовов методов.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages