Что такое фаззинг-тестирование, зачем нужен новый фаззер для ClickHouse, и как BuzzHouse выявляет сложные проблемы и потенциальные уязвимости самой популярной колоночной СУБД,
Что такое фаззинг-тестирование баз данных
Поскольку база данных тоже программный продукт, перед выпуском в релиз она тестируется. Используемых при этом методов тестирования довольно много, и одним из них является фаззинг (fuzzing, fuzz testing), когда в качестве входа используются случайные данные. Хотя этот метод довольно прост, он позволяет выявить ошибки, сбои и уязвимости, а также необработанные исключения. Автоматизированное фаззинг-тестирование показывает, насколько база данных устойчива к большой нагрузке с некорректными запросами и данными. Для реализации такого тестирования используются специальные инструменты – фаззеры, такие как AFL, SQLmap, SQLancer, SQLsmith, AST fuzzer, WINGFUZZ fuzzer, и прочие специализированные фреймворки. Также можно разработать собственный фаззер.
Впрочем, независимо от инструмента, процесс фаззинг-тестирования обычно включает следующие шаги:
- генерация случайных входных данных — SQL-запросов с неожиданными символами, длинными строками, некорректным синтаксисом, а также специально сформированные данные, которые целенаправленно пытаются обойти защитные механизмы или вызвать сбои в работе СУБД;
- настройка среды тестирования – размещение тестируемой СУБД в изолированной среде (виртуальная машина или контейнер) и интеграция со средствами мониторинга для отслеживания поведения базы данных во время тестирования, включая логи, использование ресурсов и отклики системы;
- автоматизированная подача входных данных, когда фаззер автоматически отправляет их в СУБД, выполняя множество тестовых сценариев;
- анализ и документирование результатов — сбоев, ошибок и некорректного поведения СУБД, вызванные поданными данными, выявление уязвимостей;
- поиск способов улучшения – поиск предложений и разработка рекомендаций по повышению устойчивости СУБД к аналогичным атакам в будущем.
Обычно фаззинг-тестирование проводится итеративно, чтобы убедиться в устранении выявленных уязвимостей и отсутствии новых проблем. При этом попутно обновляются и изменяются инструменты и стратегии фаззинга для более эффективного обнаружения возможных нарушений безопасности.
Фаззинг распределенных баз данных, к которым относится ClickHouse – не самая простая задача из-за необходимости покрыть тестами кластерную обработку и оптимизацию запросов, хранение данных и управление буферами. Кроме того, некоторые операторы, такие как DROP и DETACH, делают таблицы недоступными. А по мере добавления представлений, которые зависят от таблиц или табличных движков в ClickHouse, количество комбинаций входных данных, которые нужно проверить с помощью фаззера, резко возрастет. Поэтому для фаззинг-тестирования ClickHouse в 2024 году был разработан специальный инструмент – BuzzHouse, который генерирует сложные, но корректные запросы. Как он работает и чем полезен, рассмотрим далее.
Как BuzzHouse позволяет улучшать ClickHouse
BuzzHouse предназначен для стресс-тестирования крайних случаев, не обрабатываемых другими существующими фаззерами в Clickhouse. Чтобы использовать его, необходимо скомпилировать ClickHouse с настройкой ENABLE_BUZZHOUSE=1.
Фаззер создает нескольких баз данных и таблиц, затем отправляет случайные запросы на чтение и запись, сохраняя при этом информацию каталога. Он охватывает много функций запросов SELECT, INSERT, большинство мутаций и поддерживает различные движки таблиц. Buzzhouse работает в клиенте Clickhouse, как AST-фаззер. Для запуска нужно выполнить команду
clickhouse --client --buzz-house-config=<path to json configuration file>
В файле конфигурации BuzzHouse определяются следующие параметры:
- db_file_path — строка пути с каталогом сервера Clickhouse, где хранятся пользовательские файлы для операторов импорта и экспорта;
- log_path — строка пути с местоположением файла, в котором будет находиться лог SQL-запросов;
- read_log — необходимость чтения файла log_path для воспроизведения предыдущего сеанса (по умолчанию false);
- seed — начальное значение для генератора случайных чисел (по умолчанию 0, т.е. использование случайного числа из системы);
- max_depth — максимальная глубина сгенерированных запросов (по умолчанию 3);
- max_width — максимальная ширина для генерируемых запросов (по умолчанию 3);
- max_databases — максимальное количество создаваемых баз данных (по умолчанию 4);
- max_functions — максимальное количество созданных функций (по умолчанию 4);
- max_tables — максимальное количество создаваемых таблиц (по умолчанию 10);
- max_views — максимальное количество созданных представлений: материализованных, обновляемых или ни того, ни другого (по умолчанию 5);
- fuzz_floating_points — создание таблиц с типами Float и Double, для которых может быть много ложных срабатываний, поэтому их можно отключить (по умолчанию включено);
- test_with_fill — генерация запросов ORDER BY WITH FILL, которые могут занимать много времени, поэтому их можно отключить (по умолчанию включено);
- use_dump_table_oracle — дамп и вставка содержимого таблиц oracle, затем сравнение содержимого. В настоящее время это может давать ложные срабатывания для некоторых типов данных, таких как Dynamic, поэтому можно отключить (по умолчанию включено);
- max_insert_rows — максимальное количество строк, которые будут сгенерированы для запросов на вставку (по умолчанию 100);
- max_nested_rows — максимальное количество строк, генерируемых для вложенных типов (по умолчанию 10).
Запущенный BuzzHouse работает до тех пор, пока не найдет неправильный результат, некорректное утверждение или логическую ошибку. Тестирование стабильного релиза Clickhouse с помощью BuzzHouse выявило более 100 уязвимостей:
- сбои с CTE-запросами;
- бесконечные циклы;
- логические ошибки;
- нехватку памяти;
- некорректное экранирование;
- неверное преобразование;
- отсутствие проверок;
- слишком глубокая рекурсия с материализованным представлением;
- недопустимые значения;
- повреждение данных.
В отличие от других фаззеров, BuzzHouse пока не использует покрытие кода для поиска новых путей кода во время фаззинга, чтобы ускорить процесс тестирования и повысить разнообразие генерируемых запросов. Поэтому BuzzHouse не заменяет другие фаззеры, а дополняет их:
- AFL и libFuzzer для фаззинга с контролем покрытия кода;
- SQLsmith для создания сложных запросов;
- SQLancer для проверки корректности запросов;
- Pstress для больших нагрузок;
- Sysbench для проверки длительных потоковых нагрузок (более часа);
- AST-фаззер для мутации запросов из тестов и других фаззеров.
В ближайшем будущем разработчики ClickHouse планируют включить BuzzHouse в исходный код этой колоночной СУБД, а также добавить туда Pstress и Sysbench.
Освойте ClickHouse на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники