Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
codeql-buffer-overflow-variant — Синтетический вариант переполнения буфера стека CWE-120 на основе CVE-2020-8597 (pppd EAP) в качестве цели статического анализа CodeQL | Kitploit
Инструменты/GitHubGitHub/anna-kravets/codeql-buffer-overflow-variant
Статический анализСтатический анализ кода (SAST)Анализ уязвимостейАнализ Кода
GitHubanna-kravets/codeql-buffer-overflow-variant

codeql-buffer-overflow-variant

Синтетический вариант переполнения буфера стека CWE-120 на основе CVE-2020-8597 (pppd EAP) в качестве цели статического анализа CodeQL

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
181 месяц назадЕщё не проверено
Поделиться

codeql-buffer-overflow-variant

Намеренно уязвимая C-программа объёмом ~170 строк, используемая как цель для статического анализа CodeQL. Она воспроизводит класс ошибок CVE-2020-8597 — переполнение стекового буфера rhostname в EAP-обработчике pppd (CWE-120) — в программе, которая не разделяет ни имён функций pppd, ни глубины вызовов, ни структуры диспетчеризации.

Цель — проверка обобщённости: запрос CodeQL, написанный для обнаружения ошибки pppd, должен также сработать на этой программе без изменений. Если это так, запрос выражает класс ошибок, а не форму исходного кода.

Эта программа намеренно небезопасна и существует только для анализа. Не развёртывайте её. Ошибка, которую она повторяет, является публичной (CVE-2020-8597, раскрыта в 2020 году).

Класс ошибок

Полученная от атакующего длина копируется в буфер фиксированного размера без проверки, связывающей эту длину с размером буфера.

В каждом случае проверка границ присутствует — она просто не связывает две величины, которые имеют значение. Существует ровно два способа ошибиться в этом, и программа содержит по одному из каждого:

  • Правильное значение, неправильная граница. Длина копирования проверяется, но относительно полученного кадра, а не sizeof(dest). Предотвращает перечитывание, но ничего не делает с перезаписью. (handle_hello)
  • Правильная граница, неправильное значение. Проверка указывает sizeof(dest) — выглядит точно как граница буфера — но ограничивает другую переменную, не ту, что используется как длина копирования. (handle_stat)

Второй случай сложнее, и именно им является мёртвая проверка pppd vallen >= len + sizeof(rhostname): сравнение, которое упоминает размер назначения, ограничивая при этом нечто, не являющееся длиной копирования. Запрос, который только спрашивает «упоминает ли какое-либо сравнение здесь sizeof(dest)?», заглушается им.

Структура против pppd (почему это настоящий вариант)

pppd / CVE-2020-8597этот проект
Источникread() на PPP fdrecvfrom() на UDP-сокете
Диспетчеризацияглобальный struct protent *protocols[], линейное сопоставление по номеру протоколалокальный для файла const struct frame_op ops[], линейное сопоставление по 1-байтовому тегу
Глубина до стокаget_input → (*input) → eap_input → eap_requestdispatch_frame → (*handle) → handle_hello
Назначениеchar rhostname[256]char name[64]
Неправильная защитаvallen ограничена длиной пакета lenvlen ограничена длиной кадра plen

Оба сохраняют одно свойство, которое делает это потоком данных, а не grep: косвенный вызов через таблицу указателей на функции между источником и стоком.

ОбработчикСтрокаПрисутствующая проверкаВердикт
handle_hello()сток на :80vlen > plen - 2 — правильное значение, неправильная границадолжен сработать
handle_echo()копирование на :106vlen >= sizeof(buf) — оба правильныдолжен молчать — негативный контроль
handle_stat()сток на :145hlen >= sizeof(report) — правильная граница, неправильное значениедолжен сработать

handle_stat — это различающий случай. Его проверка указывает sizeof(report), поэтому запрос, который принимает любое сравнение, упоминающее размер назначения, считает его защищённым и пропускает ошибку. Чтобы поймать его, требуется сравнить значение, которое проверяется, со значением, используемым как длина копирования — глобальная нумерация значений. Удалите это из запроса, и этот обработчик станет ложноотрицательным, тогда как все остальные места сохранят свой вердикт.

Формат передачи

Одна UDP-датаграмма = один кадр:

[ type : 1 ] [ length : 2, big-endian ] [ value : length bytes ]

type 0x01 → hello, 0x02 → echo, 0x03 → stat. Кадр hello с объявленной длиной от 65 до ~2045 переполняет name[64]. Кадр stat вместо этого несёт две однобайтовые длины — длину заголовка и длину тела — и любая длина тела выше 32 переполняет report[32], что бы ни говорила длина заголовка.

Сборка

make            # gcc -Wall -Wextra -O0 -g -o tlv_server tlv_server.c

Linux/POSIX (BSD-сокеты). Собирается чисто, без предупреждений.

Создание базы данных CodeQL

CodeQL трассирует реальную компиляцию, поэтому собирайте с чистого состояния:

make clean
codeql database create db --language=cpp --command="make"
# или, без шага очистки:
codeql database create db --language=cpp --command="make -B"

Затем запустите запрос из части 3 против db; он должен сообщить о memcpy в handle_hello и о том, что в handle_stat, и промолчать о handle_echo. Запрос и инструкции по его запуску находятся в codeql/.

Исходный код меняется всякий раз, когда добавляется обработчик, поэтому пересоберите базу данных — CodeQL делает снимок кода во время database create, и существующая db/ не увидит новый код.

Скачать инструмент