
CodeQL-детектор для первопричины CVE-2022-2869 (CWE-191 беззнаковое переполнение вниз) с использованием анализа потока управления/диапазонов для выявления уязвимых шаблонов без жёсткого кодирования конкретных функций.
Этот проект реализует универсальный CodeQL-детектор для корневой уязвимости, лежащей в основе CVE-2022-2869: беззнаковое вычитание, которое может привести к переполнению вниз (underflow), поскольку программа не установила достаточную защиту нижней границы/порядка перед выполнением арифметической операции.
Детектор намеренно сообщает о корневой причине (CWE-191), а не жёстко прописывает tiffcrop.c, имена функций или имена переменных. Он использует стандартную библиотеку CodeQL Overflow, чья логика проверки ограничений основана на анализе потока управления/диапазонов. Он не использует порядок номеров строк исходного кода как замену доминированию потока управления.
UnsignedUnderflow.ql — основной детектор для отправки.report.md — описание уязвимости и запроса.test/mini_tiffcrop_like.c — небезопасные случаи, подобные CVE, плюс безопасные контрольные примеры.test/mini_tiffcrop_variant.c — структурно иной вариант плюс безопасный контрольный пример.test/EXPECTED_RESULTS.md — ожидаемое поведение для положительных/отрицательных случаев.original/ORIGINAL_VALIDATION.md — что должно быть продемонстрировано на уязвимом LibTIFF.Из этого каталога:
codeql pack install
Пример на Linux/WSL:
codeql database create db-tests \
--language=cpp \
--command="gcc -std=c11 -O0 -g test/mini_tiffcrop_like.c -o /tmp/test1 && gcc -std=c11 -O0 -g test/mini_tiffcrop_variant.c -o /tmp/test2"
Запустите запрос:
codeql query run UnsignedUnderflow.ql --database=db-tests
Запрос CodeQL — это статический анализ. ASan — это дополнительное доказательство, показывающее последствия пользовательских вариантов.
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_like.c -o mini1
./mini1 # безопасно
./mini1 unsafe-x2 # ожидаемая ошибка памяти
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_variant.c -o mini2
./mini2 # безопасно
./mini2 unsafe # ожидаемая ошибка памяти
Создайте базу данных CodeQL из уязвимой ревизии LibTIFF (например, 4.3.0), затем запустите точно такой же запрос UnsignedUnderflow.ql против этой базы данных. Зафиксируйте результат в tools/tiffcrop.c, особенно в computeInputPixelOffsets.
Детектор не должен быть изменён для упоминания tiffcrop, computeInputPixelOffsets, x2 или crop_width; в противном случае он был бы переобучен на один экземпляр CVE и не выполнил бы требование задания о вариативности.