Специалисты СайберОК нашли пятилетнюю ошибку в библиотеке Blackrock.
<div class="articl-text-cover" style="position:relative;width:100%;max-width:800px;margin-left:auto;margin-right:auto;aspect-ratio:1200/675;margin-bottom:2rem;overflow:hidden">
<div itemprop="articleBody">Один лишний минус пять лет ломал ключевую функцию математической библиотеки 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 млрд значений сбой затронул все проверенные позиции. Ошибка воспроизводилась с несколькими начальными параметрами генерации.
Причиной стал лишний знак минуса в ветке алгоритма для нечетных раундов. Строка <code>tmp -= -R</code> из-за двойного отрицания прибавляла значение R вместо вычитания. Соседняя ветка для четных раундов выполняла правильную операцию, поэтому сравнение двух частей алгоритма помогло найти опечатку. Функция Shuffle продолжала создавать корректную перестановку, а сбой затрагивал только обратное преобразование.
Автоматические проверки пропустили дефект, поскольку прежний набор тестировал только создание объекта через функцию New(). Функции Shuffle, UnShuffle, Fe и Unfe в тестах не запускались, поэтому система непрерывной интеграции успешно завершала проверки сломанного кода.
Исправление потребовало удалить один знак минуса. Специалисты добавили четыре группы тестов для прямого и обратного преобразований, корректности перестановки и отдельных веток алгоритма. Возврат ошибочного символа заставляет три группы завершаться сбоем, поэтому прежняя проблема больше не должна пройти проверку незаметно.
Контрольный прогон охватил все диапазоны от одного до 3000 с четырьмя начальными параметрами. Всего исследователи выполнили 18 006 000 проверок и не зафиксировали ни одной ошибки. Команды <code>go test ./...</code> и <code>go vet</code> после исправления завершились успешно, а 3 августа 2026 года патч вошел в основную ветку Blackrock. История файла показывает, что проблемная строка находилась в коде с первоначального коммита от 15 апреля 2021 года.
<div class="articl-text-cover" style="position:relative;width:100%;max-width:800px;margin-left:auto;margin-right:auto;aspect-ratio:1200/675;margin-bottom:2rem;overflow:hidden">
<div itemprop="articleBody">Один лишний минус пять лет ломал ключевую функцию математической библиотеки 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 млрд значений сбой затронул все проверенные позиции. Ошибка воспроизводилась с несколькими начальными параметрами генерации.
Причиной стал лишний знак минуса в ветке алгоритма для нечетных раундов. Строка <code>tmp -= -R</code> из-за двойного отрицания прибавляла значение R вместо вычитания. Соседняя ветка для четных раундов выполняла правильную операцию, поэтому сравнение двух частей алгоритма помогло найти опечатку. Функция Shuffle продолжала создавать корректную перестановку, а сбой затрагивал только обратное преобразование.
Автоматические проверки пропустили дефект, поскольку прежний набор тестировал только создание объекта через функцию New(). Функции Shuffle, UnShuffle, Fe и Unfe в тестах не запускались, поэтому система непрерывной интеграции успешно завершала проверки сломанного кода.
Исправление потребовало удалить один знак минуса. Специалисты добавили четыре группы тестов для прямого и обратного преобразований, корректности перестановки и отдельных веток алгоритма. Возврат ошибочного символа заставляет три группы завершаться сбоем, поэтому прежняя проблема больше не должна пройти проверку незаметно.
Контрольный прогон охватил все диапазоны от одного до 3000 с четырьмя начальными параметрами. Всего исследователи выполнили 18 006 000 проверок и не зафиксировали ни одной ошибки. Команды <code>go test ./...</code> и <code>go vet</code> после исправления завершились успешно, а 3 августа 2026 года патч вошел в основную ветку Blackrock. История файла показывает, что проблемная строка находилась в коде с первоначального коммита от 15 апреля 2021 года.
- Источник новости
- www.securitylab.ru