Найти тему
Закреплено автором
Протестировал
Выступил на студенческой конференции по информационной безопасности ISCRA Talks. Рассказал о поддержке фаззинга со стороны языков программирования: какого рода поддержка в языках программирования нужна для эффективной работы фаззинга, а так же как и в каком объеме эта поддержка реализована в самых популярных ЯП. Доклад будет интересен, всем кто занимается фаззингом, чтобы понимать, что происходит после старта функции LLVMFuzzerTestOneInput(), а также тем, кто, возможно, захочет реализовать поддержку фаззинга для ЯП. Слайды: bronevichok.ru/...pdf
1 неделю назад
Протестировал
Вдогонку к предыдущем посту. Расскажите, оптимизируете ли вы время сборки проекта и время запуска тестов. Измеряете время запуска тестов? Выявляете и регулярно чините флакающие тесты? Используете ли шардирование для запуска тестов? Источник диаграммы - ежегодный опрос JetBrains.
2 месяца назад
Протестировал
Фаззинг-тесты, которые мы изначально делали для нашего форка LuaJIT, так же используются для непрерывного фаззинга оригинального проекта LuaJIT и интерпретатора PUC Rio Lua. Результат двухлетней работы: 6 багов в PUC Rio Lua, превентивно найденные до публичных релизов, и 23 бага в LuaJIT. Всё были исправлены. Использование одних и тех же тестов для разных проектов оказалось возможным благодаря тому, что PUC Rio Lua и LuaJIT предоставляют один и тот же Lua C API. Если в этих проектах получилось успешно использовать фаззинг, то было бы здорово применить их и для другого Lua рантайма, подумал я. Для Go есть популярный среди гоферов проект - GopherLua, это реализация Lua на Go. Для проекта написано много расширений, которые добавляют функциональность со стороны Lua. В Go есть встроенный тулинг для написания фаззинг-тестов: нужно всего лишь написать обёртку для функции, собрать специальной командой и вообщем-то всё. Но я не знаю про аналог libprotobuf-mutator в Go (гоферы, подскажете аналог?). Поэтому сделать фаззеры для GopherLua с неструктурированными данными проще простого, а чтобы фаззинг-тест генерировал структурированные валидные данные я не смог найти решения. Я решил попробовать изобразить из GopherLua библиотеку с Lua C API, чтобы эту библиотеку можно было скомпоновать с моими тестами и переиспользовать фаззинг для Lua применительно к GopherLua. Для интеграции Go с C есть cgo, который предоставляет возможность использования C-библиотек в Go и экспорта Go функций в интерфейс C (генерация заголовочного файла). Если кратко, то LuaJIT C FFI мне показался удобнее, чем использование cgo. Из того, с чем я столкнулся: - В коде Go нельзя указать макросы, чтобы потом эти макросы cgo добавил в сгенерированный заголовочной файл. Поэтому часть макросов из lua.h пришлось принести в сам тест. - в Go нельзя никак указать, что функция не принимает аргументов, чтобы в заголовочном файле у функции в параметрах был void. На эту тему есть тикет и вроде даже патч. - В Lua C API каждая функция первым аргументом принимает указатель на L, структуру, описывающую Lua стек. Я не придумал, как возвращать из Go/cgo эту структуру, поэтому мой модуль может работать с единственной копией стека. Но для моих целей этого достаточно. В результате этой работы можно собрать тест, который по грамматике генерирует программы на Lua и исполняет их в GopherLua. Правда не все программы исполняются одинаково успешно и иногда случаются проблемы работы с памятью (runtime error: invalid memory address or nil pointer dereference). Такие дела.
2 месяца назад
Выступил на студенческой конференции по информационной безопасности ISCRA Talks. Рассказал о поддержке фаззинга со стороны языков программирования: какого рода поддержка в языках программирования нужна для эффективной работы фаззинга, а так же как и в каком объеме эта поддержка реализована в самых популярных ЯП. Доклад будет интересен, всем кто занимается фаззингом, чтобы понимать, что происходит после старта функции LLVMFuzzerTestOneInput(), а также тем, кто, возможно, захочет реализовать поддержку фаззинга для ЯП. Слайды: bronevichok.ru/...pdf
1 неделю назад
В Питоне есть как минимум один плюс - это замечательная библиотека Hypothesis
В Питоне есть как минимум один плюс - это замечательная библиотека Hypothesis. Внезапно, один из разработчиков этой библиотеки Zac Hetfield-Dodds говорит, что по его оценкам только 5% пользователей Питона используют Hypothesis: Generative testing is also inherently in opposition to the current mainstream state of quality techniques. In his talk about the adoption of the Hypothesis property-based testing library, Zac Hetfield-Dodds mentioned that only 5% of Python users use Hypothesis according to their measurements...
1 неделю назад
Мартин Фаулер и Ко выпустили 32-й номер Technology Radar
Мартин Фаулер и Ко выпустили 32-й номер Technology Radar. В нём они пишут, что фаззинг-тестирование недооценено. Они отнесли фаззинг-тестирование к технологиям, которые, по их мнению, вам стоит серьезно рассмотреть возможность использования: Fuzz testing , or simply fuzzing, is a testing technique that has been around for a long time but it is still one of the lesser-known techniques. The goal is to feed a software system all kinds of invalid input and observe its behavior. For an HTTP endpoint, for example, bad requests should result in 4xx errors, but fuzz testing often provokes 5xx errors or worse...
3 недели назад
В проекте Chromium есть сменная внутренняя позиция "Tree Sheriff", человек на этой позиции ответственен за то, чтобы основные ветки в репозитории проекта оставались "зелёными", то есть тесты проходили успешно на всех платформах, и открытыми (в них разрешено добавлять изменения). Если произойдет сбой, то шериф сообщит об этом команде, выяснит причину поломки и, по возможности, ответственных за неё людей. Вообщем-то ничего удивительного. А в MongoDB есть похожая внутренняя позиция с названием Build Baron: We have a rotating role of a dedicated person to check for performance changes. We call this person the “Build Baron”. The Build Baron uses all the views of the change points and along with the trend graphs. Ideally, the Build Baron reviews every change point, deciding if it is a real change worthy of investigation, if it is insignificant, or if it is just noise. Название позиции - топ! Шериф звучит не так солидно как билд-барон.
1 месяц назад
В SQLancer поддерживается около 20 наиболее популярных СУБД и во всех были найдены проблемы. В одних больше, в других меньше. Авторы SQLancer считают PostgreSQL и SQLite как наиболее протестированные СУБД, все найденные ими проблемы были исправлены. А MySQL и MariaDB они перестали тестировать, потому что найденные проблемы игнорируются разработчиками: For some other DBMSs like MySQL and MariaDB, SQLancer could still detect unreported bugs; we stopped testing these DBMSs and reporting bugs due to the large number of unfixed bugs. Примеры неисправленных проблем: - https://bugs.mysql.com/bug.php?id=113180 - https://bugs.mysql.com/bug.php?id=113298 - https://bugs.mysql.com/bug.php?id=117242 - https://bugs.mysql.com/bug.php?id=117439 - https://bugs.mysql.com/bug.php?id=117261 Делайте выводы.
1 месяц назад
Опубликовано фото
1 месяц назад
Получил доступ к SourceCraft и есть первое впечатление от сервиса. Интерфейс и функциональность сильно напоминает GitHub UI, думаю, что на него и ориентировались, так как это самая популярная платформа для разработки. Есть тикетница, непрерывная интеграция и развертывание, конфигурация которых описывается в YAML, пулл-реквесты, то есть всё, к чему привыкли в GitHub/Gitlab. Документация в отличие от самого сервиса открыта для всех, можно в ней подробнее почитать. Для конфигурации CI/CD, как я понял, используется свой YAML-based формат и это печально. С другой стороны общего формата нет и требовать от Яндекса унификации формата или инициативы по его унификации было бы странно. Чтобы оценить функциональность SourceCraft я пушнул Git-репозиторий с кодом Tarantool. Вцелом осталось приятное впечатление, всё более-менее работает, но есть недоделки, о которых ниже написал. Подсветка кода при просмотре файлов не всегда работает, неудобно. Для любого файла в репозитории можно посмотреть его историю и авторство (git blame). Правда авторство для файла src/main.cc в репозитории tarantool я так и не смог посмотреть, ждал примерно минуту и так ничего и не подгрузилось. В гитхабе подгружается пару секунд. В репозитории tarantool все релизы тегаются, сейчас примерно 161 тег. Но в SourceCraft в разделе "Теги" не было ни одного тега. В Github появляется кнопка "Создать Pull Request", когда пушишь новую ветку в репозиторий, в SourceCraft такого нет. Запушил новую ветку во время создания предложения для изменений нажал кнопку "Создать", реакции никакой не последовало. Я нажал еще несколько раз, потом обновил страницу и вуаля, у меня четыре предложения для изменений. Перевод текста в UI нравится: "Как только вы удалите репозиторий, пути назад не будет. Пожалуйста, будьте уверены." Несмотря на небольшие недоработки в SourceCraft уже есть Code Assistant, аналог Github Copilot. Попробовал этого ассистента в редактировании сишного и Lua-кода и, как мне показалось, все предложения были невпопад. Когда доработают, то думаю SourceCraft будет хорошей альтернативой Github.
1 месяц назад
Фаззинг-тесты, которые мы изначально делали для нашего форка LuaJIT, так же используются для непрерывного фаззинга оригинального проекта LuaJIT и интерпретатора PUC Rio Lua. Результат двухлетней работы: 6 багов в PUC Rio Lua, превентивно найденные до публичных релизов, и 23 бага в LuaJIT. Всё были исправлены. Использование одних и тех же тестов для разных проектов оказалось возможным благодаря тому, что PUC Rio Lua и LuaJIT предоставляют один и тот же Lua C API. Если в этих проектах получилось успешно использовать фаззинг, то было бы здорово применить их и для другого Lua рантайма, подумал я. Для Go есть популярный среди гоферов проект - GopherLua, это реализация Lua на Go. Для проекта написано много расширений, которые добавляют функциональность со стороны Lua. В Go есть встроенный тулинг для написания фаззинг-тестов: нужно всего лишь написать обёртку для функции, собрать специальной командой и вообщем-то всё. Но я не знаю про аналог libprotobuf-mutator в Go (гоферы, подскажете аналог?). Поэтому сделать фаззеры для GopherLua с неструктурированными данными проще простого, а чтобы фаззинг-тест генерировал структурированные валидные данные я не смог найти решения. Я решил попробовать изобразить из GopherLua библиотеку с Lua C API, чтобы эту библиотеку можно было скомпоновать с моими тестами и переиспользовать фаззинг для Lua применительно к GopherLua. Для интеграции Go с C есть cgo, который предоставляет возможность использования C-библиотек в Go и экспорта Go функций в интерфейс C (генерация заголовочного файла). Если кратко, то LuaJIT C FFI мне показался удобнее, чем использование cgo. Из того, с чем я столкнулся: - В коде Go нельзя указать макросы, чтобы потом эти макросы cgo добавил в сгенерированный заголовочной файл. Поэтому часть макросов из lua.h пришлось принести в сам тест. - в Go нельзя никак указать, что функция не принимает аргументов, чтобы в заголовочном файле у функции в параметрах был void. На эту тему есть тикет и вроде даже патч. - В Lua C API каждая функция первым аргументом принимает указатель на L, структуру, описывающую Lua стек. Я не придумал, как возвращать из Go/cgo эту структуру, поэтому мой модуль может работать с единственной копией стека. Но для моих целей этого достаточно. В результате этой работы можно собрать тест, который по грамматике генерирует программы на Lua и исполняет их в GopherLua. Правда не все программы исполняются одинаково успешно и иногда случаются проблемы работы с памятью (runtime error: invalid memory address or nil pointer dereference). Такие дела.
2 месяца назад
ФСТЭК России объявила о начале масштабных испытаний статических анализаторов На встрече обсудили цели и задачи испытаний, критерии оценок, инфраструктуру, сроки, состав жюри и тесты для испытаний. Было принято решение провести мероприятие на базе кафедры ИУ10 «Защита информации» МГТУ им. Н. Э. Баумана в два этапа: «домашнее задание» (завершается 15 мая) и основной этап испытаний (июль-октябрь). Итогом станет аналитический доклад от ФСТЭК России на Открытой конференции по результатам испытаний (декабрь 2025 г.). Делайте ставки, господа! Мой прогноз такой: - Svace и PVS-Studio поделят первое и второе место - Третье место будет у Clang Static Analyzer - Synopsys Coverity - техническое поражение из-за неявки - `cppcheck` - почётное последнее место via
2 месяца назад
По умолчанию Clang записывает сырые данные о покрытии кода в файл default.profraw в текущей директории. Имя файла можно переопределить с помощью переменной окружения LLVM_PROFILE_FILE и дополнительно использовать паттерны, которые при создании файла заменяются на реальные данные (PID процесса, имя машины и т.д.) Но с этим есть проблема, из-за которой сбор сырых данных о покрытии кода работает некорректно. Clang генерирует файлы, в именах которых используется некий хеш, если использовать паттерн %m. Хеш слабый и при запуске в несколько потоков достаточно быстро находится коллизия, несколько потоков начинают писать в один и тот же файл и всё ломается. $ cat src1.c int main(void) { return 0; } void www1(void) { } $ cat src2.c int main(void) { return 0; } void www2(int *a) { *a+=10; } clang -O0 -g -fprofile-instr-generate -fcoverage-mapping src1.c -o src1 clang -O0 -g -fprofile-instr-generate -fcoverage-mapping src2.c -o src2 export LLVM_PROFILE_FILE="code-%m.profraw" ./src1 ./src2 LLVM Profile Warning: Unable to merge profile data: source profile file is not compatible. LLVM Profile Error: Profile Merging of file /tmp/profile-test/code-15822683945683506682_0.profraw failed: File exists LLVM Profile Error: Failed to write file "/tmp/profile-test/code-15822683945683506682_0.profraw": File exists Проблема была найдена сотрудниками PostgresPro и исправлена сотрудником ИСП РАН из компиляторного отдела. Был подготовлен патч, добавляющий binary ID в имя файлов покрытия, и тем самым добавляющий уникальности в имя генерируемых файлов. А вчера патч был принят в основную ветку. Интересно, что OSS Fuzz покрытие фаззинг тестами генерируется с помощью тулинга LLVM, в LLVM_PROFILE_FILE так же используется %m. Так что возможно результаты покрытия проектов фаззинг тестами поменяются после обновления Clang в OSS Fuzz. https://github.com/llvm/llvm-project/pull/123963
2 месяца назад
Вдогонку к предыдущем посту. Расскажите, оптимизируете ли вы время сборки проекта и время запуска тестов. Измеряете время запуска тестов? Выявляете и регулярно чините флакающие тесты? Используете ли шардирование для запуска тестов? Источник диаграммы - ежегодный опрос JetBrains.
2 месяца назад
Когда мотивация решает: I also talked to a lot of researchers who develop browser exploits professionally. Really everyone told me that I should not develop a fuzzer and instead focus on code review. However, I had to develop a fuzzer because I couldn’t write a master thesis on “I performed code review and found X bugs”. In the end, I think I would had found way more bugs with code review using the same time so I would also suggest to others to do code review instead. Классная история разработки мутационного фаззера с нуля для Chrome v8. Отличительная особенность этой статьи в том, что описаны все стадии: дизайн фаззера, выбор мутаций, реализация ключевых компонентов, формирование и дистилляция корпуса, анализ ошибок, сделанных в процессе разработки. Результат работы - 18 багов в v8 (плюс защита магистерского диплома в университете). https://apt29a.blogspot.com/2022/01/fuzzing-chromes-javascript-engine-v8.html
2 месяца назад