НовостиКриптовалютыЭрик Чжан выпустил Neo N3 v3.10.2, исправив обход верификации мультисигнатурных witness

Эрик Чжан выпустил Neo N3 v3.10.2, исправив обход верификации мультисигнатурных witness

Автор: CryptoNewsNet·

Ключевые выводы

  • •Neo опубликовала Neo N3 v3.10.2 23 октября — релиз безопасности, подготовленный сооснователем Эриком Чжаном, содержащий одно логическое исправление и не включающий новых функций.
  • •Патч устраняет обход верификации witness, вызванный несогласованной валидацией публичных ключей между перегрузками мультисигнатурных контрактов, из-за которой некорректные скрипты могли пройти один путь валидации, провалив другой.
  • •Все пути кода валидации теперь требуют полной криптографической декодировки публичных ключей, прежде чем классифицировать скрипт как валиный мультисигнатурный контракт, благодаря небольшой правке в Helper.cs.
  • •Коммит добавляет два новых теста и обновляет один существующий, подтверждая, что скрипты с недействительными публичными ключами отклоняются каждым путём валидации, включая случай полной транзакции с несовпадающими хешами witness.
  • •О подтверждённой эксплуатации в Neo N3 MainNet не сообщалось, а исправление действует только на узлах с обновлённым релизом, что делает принятие обновления операторами ключевым следующим шагом.
Эрик Чжан выпустил Neo N3 v3.10.2, исправив обход верификации мультисигнатурных witness

Neo выпустила Neo N3 v3.10.2 — целенаправленный патч безопасности, устраняющий обход верификации witness, который ранее позволял некорректным мультисигнатурным скриптам пройти один путь валидации, будучи отклонёнными другим. Для обычных пользователей исправление закрывает путь, через который недействительная транзакция могла выглядеть действительной для части программного обеспечения узла.

Релиз, автором которого стал сооснователь Neo Эрик Чжан, был опубликован 23 октября. Он содержит одно логическое исправление логики валидации мультисигнатурных контрактов Neo N3 и не включает новых функций.

Что устраняет исправление

Когда транзакция отправляется в сеть Neo N3, протокол проверяет, что приложенные подписи действительны и исходят от правильных сторон. Эти данные авторизации — подписи и проверки, приложенные к транзакции, — протокол называет witness, и именно этот слой укрепляет данный патч. Для мультисигнатурных контрактов, требующих минимального числа авторизованных подписантов для подтверждения транзакции и обычно используемых там, где несколько сторон совместно контролируют одни и те же средства, такая проверка включает контроль криптографической валидности каждого публичного ключа, указанного в скрипте контракта.

Патч закрывает пробел в том, как применялась эта проверка. Логика валидации мультисигнатур в Neo N3 включала несколько путей кода для инспекции мультисигнатурного скрипта. Один из этих путей полностью декодировал каждый публичный ключ — процесс, который немедленно отклонял любой ключ, не являющийся корректной точкой на эллиптической кривой. Второй путь проверял только структурную форму скрипта — корректные длины байтов и корректное количество ключей — без выполнения криптографической декодировки. Скрипт с некорректным публичным ключом, таким образом, мог пройти второй путь и провалить первый, из-за чего пути расходились в оценке валидности скрипта. Подобное расхождение противоречит базовому свойству, ожидаемому блокчейн-валидации: один и тот же скрипт должен получать одинаковый вердикт независимо от того, какой путь кода его проверяет.

О несогласованности было известно. Такое поведение документировано в собственном наборе тестов Neo с 2024 года, когда разработчик Neo SPCC Анна Шалева портировала новый код верификации witness из NeoGo в эталонный узел на C#. Тест, добавленный в том пул-реквесте, помечал базовую перегрузку IsMultiSigContract как «неудачную» за пропуск декодировки ключей, но считал результат ожидаемым поведением, а не дефектом. Две реализации, фигурирующие там — эталонный узел на C# и NeoGo, — подчёркивают, почему единообразное поведение важно: в сети, поддерживаемой более чем одной реализацией узла, каждая из них должна выносить одинаковое решение по одной и той же транзакции.

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

Исправление и покрытие тестами

Изменение представляет собой небольшую правку в src/Neo/SmartContract/Helper.cs. Исправление декодирует ключ каждый раз, поэтому каждый путь, инспектирующий мультисигнатурный скрипт, теперь выполняет одну и ту же проверку.

Коммит добавляет два новых теста и обновляет один существующий. Первый новый тест передаёт мультисигнатурный скрипт с повреждённым публичным ключом во все три пути валидации и подтверждает, что каждый из них его отклоняет. Второй создаёт полную транзакцию с повреждённым мультисигнатурным witness и подтверждает, что сеть её отклоняет. Этот тест выполняется дважды — один раз с совпадающим адресом подписанта и witness, второй раз с несовпадением — покрывая случай «несовпадающих хешей witness», отмеченный в примечаниях к релизу.

Обновлённый тест TestIsMultiSigContract_WrongCurve ранее ожидал, что сокращённый путь примет скрипты с недействительными ключами. Теперь он ожидает, что все три пути их отклонят, закрепляя исправленное поведение в наборе тестов против будущих регрессий.

Джимми Лиао,核心-разработчик Neo и основатель R3E Network, описал релиз в X:

Neo N3 v3.10.2 — security release. Fixes a witness-verification bypass from inconsistent public-key validation between IsMultiSigContract overloads. Keys are now validated before multisig classification.

Известных эксплойтов нет

Вместе с релизом не было опубликовано официального рекомендации по безопасности. Ни примечания к релизу, ни сообщение коммита не описывают подтверждённой эксплуатации в Neo N3 MainNet.

Операторам узлов и провайдерам инфраструктуры, использующим Neo N3, следует обновиться до v3.10.2 — поскольку исправление выполняется на стороне клиента, его более строгая проверка действует только на узлах, фактически работающих на обновлённом релизе, что делает принятие обновления операторами ключевым следующим шагом. Полный релиз доступен на GitHub.