
Инструмент анализа вариантов и визуализации, который сканирует кодовые базы на наличие похожих уязвимостей
![]()
C0deVari4nt — это инструмент для анализа вариантов и визуализации, который проверяет кодовые базы на наличие схожих уязвимостей. Он использует CodeQL — семантический движок анализа кода, для выполнения запросов к коду на основе шаблонов запросов CodeQL, управляемых пользователем, и передает результаты в клиентский интерфейс, построенный на vis.js и React, для дальнейшего изучения и визуализации. Это позволяет быстро и всесторонне проводить анализ вариантов на основе предыдущих отчетов об уязвимостях. Функция визуализации vis.js предоставляет разработчикам дополнительную информацию об уязвимых путях кода и позволяет эффективно сортировать потенциальные варианты.

Инцидент Log4Shell в декабре 2021 года высветил трудности, с которыми сталкиваются разработчики открытого кода при реагировании на отчеты об уязвимостях. После первоначального патча для CVE-2021-44228, который позволял неаутентифицированным удаленным злоумышленникам получать контроль над устройствами, работающими под уязвимыми версиями Log4j 2, Apache выпустила 3 дополнительных патча для устранения связанных уязвимостей и неучтенных крайних случаев.
Разработчикам открытого кода часто не хватает навыков всестороннего анализа кода, и они сталкиваются с проблемами при выявлении вариантов уязвимости, что приводит к неполным исправлениям. Хотя существуют наборы запросов CodeQL для быстрого анализа кодовой базы, результаты этих наборов могут иметь высокий уровень ложноположительных срабатываний. Более того, эти наборы полагаются на предопределенные запросы, которые не поддерживают анализ вариантов и не адаптированы под конкретные кодовые базы. В результате проекты с открытым исходным кодом часто реагируют на отчеты об уязвимостях фрагментарно, упуская потенциальные варианты.
C0deVari4nt предоставляет разработчикам платформу для легкого проведения анализа вариантов без значительных накладных расходов на написание собственных запросов CodeQL. Это дает разработчикам возможность настраивать шаблоны CodeQL, предоставляя информацию, специфичную для кодовой базы, например, конкретный источник и сток уязвимости. Результаты будут визуализированы в виде графовой базы данных на основе vis.js, что позволит разработчикам быстро выявлять потенциальные варианты. Таким образом, разработчики смогут эффективно устранять целые классы ошибок на основе одного отчета об уязвимости.
C0deVari4nt построен с использованием Python, CodeQL, vis.js и React для создания интерактивного GUI-приложения, которое принимает пользовательский ввод и демонстрирует связи между различными уязвимыми путями кода.

C0deVari4nt состоит из следующих 2 основных компонентов:
Больше деталей о клиентском интерфейсе можно увидеть ниже:

dbextractor.py <zip-файл базы codeql>, чтобы распаковать содержимое базы данных codeqlpip install -r requirements.txtuvicorn main:app --reload для запуска локального сервера разработки на порту 8000npm inpm start для запуска локального сервера разработки
strcat без проверки границ аргумента источникаstrncpy без проверки границ аргумента источникаsnprintf
malloc, calloc или realloc без выделения достаточного объема памяти для хранения экземпляра типа указателяisAdditionalTaintStep для передачи заражения между двумя несвязанными функциямиisAdditionalTaintStep для передачи заражения между указателями, которые имеют одинаковые значения во время выполненияНиже показаны результаты CodeQL для запроса с recvfrom в качестве источника, mempool_alloc в качестве дополнительного шага заражения и memcpy в качестве стока:

Этот результат дает в общей сложности 180 узлов в 27 различных путях кода. Результаты отображаются в простом интерфейсе neo4j ниже:

Пропустив этот запрос через наш инструмент, мы смогли выявить повторяющиеся вхождения каждого узла, источника и стока и объединить связи узлов.
Это привело к значительно более чистому графу с общим количеством 11 уникальных узлов, при этом сохранились все 27 уникальных путей кода:

Результаты могут быть далее распределены по соответствующим путям с помощью нашей функции маркировки путей:

