Один лишний минус пять лет ломал перестановки в библиотеке создателей nuclei

Специалисты СайберОК нашли пятилетнюю ошибку в библиотеке Blackrock.


jb3vtjxybc23azk2fyk3g9oprfmnkyt6.jpg

Один лишний минус пять лет ломал ключевую функцию математической библиотеки Blackrock, но автоматические проверки не замечали проблему. При обработке тысячи значений обратное преобразование выдавало неверный результат 988 раз, а на больших диапазонах ошибка возникала во всех проверенных случаях.

Специалисты СайберОК обнаружили дефект в открытой библиотеке Blackrock проекта ProjectDiscovery, разработчика инструментов nuclei, subfinder и httpx. Исследователи подготовили исправление и новые тесты , после чего разработчики ProjectDiscovery включили патч в основную ветку репозитория.

Blackrock позволяет обходить элементы огромного диапазона в псевдослучайном порядке без хранения полного списка в оперативной памяти. Функция Shuffle превращает порядковый номер в новую позицию, а UnShuffle должна выполнять обратную операцию и восстанавливать исходное значение.

Прямое преобразование работало правильно, но обратная функция не отменяла результат Shuffle почти для всех входных данных. Проверка диапазона из 1000 значений выявила 988 ошибок. В диапазоне из 100 000 значений неверными оказались 19 997 результатов из 20 000. При работе с диапазонами размером 651 399 200 и 6,3 млрд значений сбой затронул все проверенные позиции. Ошибка воспроизводилась с несколькими начальными параметрами генерации.

Причиной стал лишний знак минуса в ветке алгоритма для нечетных раундов. Строка tmp -= -R из-за двойного отрицания прибавляла значение R вместо вычитания. Соседняя ветка для четных раундов выполняла правильную операцию, поэтому сравнение двух частей алгоритма помогло найти опечатку. Функция Shuffle продолжала создавать корректную перестановку, а сбой затрагивал только обратное преобразование.

Автоматические проверки пропустили дефект, поскольку прежний набор тестировал только создание объекта через функцию New(). Функции Shuffle, UnShuffle, Fe и Unfe в тестах не запускались, поэтому система непрерывной интеграции успешно завершала проверки сломанного кода.

Исправление потребовало удалить один знак минуса. Специалисты добавили четыре группы тестов для прямого и обратного преобразований, корректности перестановки и отдельных веток алгоритма. Возврат ошибочного символа заставляет три группы завершаться сбоем, поэтому прежняя проблема больше не должна пройти проверку незаметно.

Контрольный прогон охватил все диапазоны от одного до 3000 с четырьмя начальными параметрами. Всего исследователи выполнили 18 006 000 проверок и не зафиксировали ни одной ошибки. Команды go test ./... и go vet после исправления завершились успешно, а 3 августа 2026 года патч вошел в основную ветку Blackrock. История файла показывает, что проблемная строка находилась в коде с первоначального коммита от 15 апреля 2021 года.