Разработка безопасного ПО. Тестирование. Пожелания и особенности: Нужна помочь в объяснении и решении вместе задач по статике и фаззингу. Пример задачи по статике: Часть 3. Svace и CVE-[Телефон скрыт] Svace - это статический анализатор, разработанный ИСП РАН. Для выполнения команд анализа (начиная с команды svace analyze) требуется приобретенная лицензия на использование Svace, поэтому мы будем использовать прегенерированный снепшот. Уязвимость CVE-[Телефон скрыт] была обнаружена в GPAC - фреймворке для работы с медиаконтентом. Обнаружить данную уязвимость с использованием рассмотренных ранее cppcheck и clang static analyzer не получится, давайте попробуем обнаружить ее с помощью Svace. В ходе выполнения заданий 3 части у нас должны получиться следующие артефакты работы: скриншоты выполнения пунктов задания .svace-dir, получившаяся в результате выполнения команды svace build файл, содержащий подготовленный с помощью git format-patch патч, испраляющий уязвимость Настройка окружения Установка и настройка Svace Скачаем и распакуем архив со статическим анализатором Svace curl -LJ -o svace.tar.bz2 'https://nextcloud.ispras.ru/public.php/dav/files/pB8sn5a2bp6BjLP/Svace/svace-4.0.250829-x64-linux.tar.bz2' tar -xjf svace.tar.bz2 Создадим симлинк в PATH, чтобы появилась возможность запускать svace без указания пути ln -s ~/svace-4.0.250829-x64-linux/bin/svace /usr/local/bin/svace Установка и настройка Svacer Установим сервер для просмотра результатов разметки Svacer из предоставляемого RPM-пакета curl -LJ -o svacer-11.2-0.x86_64.rpm 'https://nextcloud.ispras.ru/public.php/dav/files/pB8sn5a2bp6BjLP/Svace/Svacer/svacer-11.2-0.x86_64.rpm' sudo apt-get install ./svacer-11.2-0.x86_64.rpm Устанавливаем postgresql с необходимыми расширениями: sudo apt-get install postgresql16-server postgresql16-contrib Инициируем базу данных postgresql и запускаем сервис (от имени root) /etc/init.d/postgresql initdb systemctl start postgresql Запускаем утилитку psql под именем пользователя postgres: psql -U postgres Внутри psql создаем БД для работы svacer: postgres=# create database svace; postgres=# create user svace with encrypted password 'svace'; postgres=# grant all privileges on database svace to svace; postgres=# alter user svace superuser; postgres=# CREATE EXTENSION IF NOT EXISTS btree_gin; Для выхода используем Ctrl+D Запускаем Svacer, например, на порту 8081: svacer-server run --port 8081 После этого оставляем запущенным процесс сервера, дальнейшую работу проводим в другом окне Установка GPAC Клонируем репозиторий GPAC git clone Самостоятельно с помощью ресурсов с данными об уязвимости CVE-[Телефон скрыт] определяем уязвимую версию и переключаемся на неё. Статический анализ ./configure --static-mp4box --use-zlib=no Инициируем директорию .svace-dir, которая будет использоваться для хранения артефактов статического анализа: svace init Запускаем сборку (make) под контролем Svace: svace build make На этом шаге у нас есть наполненная .svace-dir, но по ней не проведен анализ. Следующим шагом должен был быть запуск анализа Svace, но на этом шаге требуется наличие лицензии, а ее у нас нет, поэтому можем просто посмотреть на команду, а дальше будем использовать прегенерированный снепшот: Разбор срабатываний и исправление ошибки Следующую команду мы тоже пропускаем из-за отсутсвия лицензии: Теперь по адресу http://127.0.0.1:8081 можно будет подключиться к Svacer с логином и паролем admin:admin Загрузим заранее подготовленный снепшот - gpac.snap. Загрузка снепшотов через Проекты -> Новый проект -> Импорт -> снимок (*.snap) Самостоятельно с помощью ресурсов с данными об уязвимости CVE-[Телефон скрыт] найдите детектор, сработавший на рассматриваемую ошибку. Для этой уязвимости также есть PoC-файл, проверьте с его помощью существование уязвимости: gpac/bin/gcc/MP4Box -add poc.nhml -new new.mp4 Самостоятельно с помощью ресурсов с данными об уязвимости CVE-[Телефон скрыт] подготовьте патч с исправлением ошибки (можно использовать git cherry-pick с исправляющим коммитом из апстрима), убедитесь, что PoC-файл больше не вызывает исключение, а также, что статический анализ не вызывает сработку ранее указанного детектора. Итог 3 части В ходе 3 части мы познакомились с Svace. Проанализировали уязвимую к CVE-[Телефон скрыт] версию GPAC, обнаружили данную уязвимость посредством статического анализа, проверили ее наличие с помощью PoC-файла, исправили ее и убедились в отсутствии повторного срабатывания статического анализатора. Дополнительно: Попробуете обнаружить эту уязвимость с помощью других средств статического анализа. Предположите, почему получается/не получается. Пример по фаззингу: Часть 3. Минимизация корпуса и сбор покрытия В ходе выполнения данной части предлагается: минимизировать входной корпус из части 2 и уменьшить размер оставшихся его элементов; собрать покрытие кода, достигаемое выбранной нами стратегией фаззинга В ходе выполнения заданий 3 части у нас должны получиться следующие артефакты работы: скриншоты выполнения пунктов задания; минимизированный корпус для проектов из части 2; сгенерированный HTML-отчет с анализом покрытия проекта из части 2. Минимизация корпуса Удаление элементов корпуса, не открывающих новые пути Чтобы сделать входной корпус уникальным используется утилита afl-cmin Проверим на уникальность корпус, подготовленный нами в ходе выполнения части 2: afl-cmin -i input -o input-unique -- ./program [...program's cmdline...]@@Минимизация элементов корпуса Для уменьшения размера элементов корпуса используется утилита afl-tmin, которую необходимо вызывать отдельно для каждого файла Минимизируем размер одного из полученных на предыдущем шаге файлов (на примере cppcheck из части 2): afl-tmin -i input-unique/1.cpp -o input/1.cpp.min -- ./bin/cppcheck @@ Самостоятельно проверьте на уникальность подготовленный вами в части 2 корпус из 3 элементов, а затем уменьшите размер оставшихся файлов. Сбор покрытия Для сбора покрытия воспользуемся средствами сбора покрытия, входящими в проект llvm: https://clang.llvm.org/docs/SourceBasedCodeCoverage.html В качестве примера используется проект cppcheck Требуется пересобрать исследуемый в части 2 проект с инструментацией для сбора покрытия: CFLAGS=“-fprofile-instr-generate -fcoverage-mapping“ CXXFLAGS=“-fprofile-instr-generate -fcoverage-mapping“ CC=clang CXX=clang++ cmake . CFLAGS=“-fprofile-instr-generate -fcoverage-mapping“ CXXFLAGS=“-fprofile-instr-generate -fcoverage-mapping“ CC=clang CXX=clang++ make Определить место хранения файлов, использующихся для сбора покрытия: mkdir cov cd cov export LLVM_PROFILE_FILE=“$(pwd)/cppcheck.profraw“ Затем запустить исследумый проект подавая на вход все наработанные в ходе 5-минутного фаззинг-тестирования файлы: ./bin/cppcheck $(find “output/default/queue“ -type f) 2>&1 > /dev/null Проиндексировать сгенерированный профиль: llvm-profdata merge -sparse cov/cppcheck.profraw -o cov/cppcheck.profdata Экспортировать в формат lcov: llvm-cov export -format=lcov -instr-profile=cov/cppcheck.profdata ./bin/cppcheck > cov/cppcheck.lcov Сгенерировать HTML-отчет genhtml cov/cppcheck.lcov -o cov/html Итог 3 части В ходе выполнения задач 3 части мы научились минимизировать входной корпус и собирать покрытие кода.