Фаззинг-тестирование ClickHouse с BuzzHouse

ClickHouse примеры курсы обучение, ClickHouse Школа Больших Данных

Что такое фаззинг-тестирование, зачем нужен новый фаззер для 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 в Москве:

Источники

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.
Поиск по сайту