Безопасность

Из-за ошибки SP1 основная сеть Prover Network от Succinct осталась открыта для невалидных доказательств

Высокоуровневая ошибка корректности в системе доказательств нулевого разглашения Succinct — SP1 — подвергла основную сеть провайдеров компании риску приема недействительных доказательств.

Согласно уведомлению о безопасности GitHub, опубликованному 11 октября, эта сеть была единственным известным Succinct развертыванием, затронутым проблемой.

Нативные Rust-верификаторы в версиях с 6.0.0 по 6.8.0 могли принимать недействительные доказательства

В рекомендациях, зарегистрированных под номером GHSA-p7v2-jjv3-8p8f, указано, что злоумышленник может отправить доказательство для недействительного выполнения, и верификатор сети его примет. Сеть провайдеров принимала доказательства от сторонних провайдеров.

Будьте в курсе
движения ваших монет

Алерты, котировки в реальном времени и новости рынка — в одном приложении


Наведите камеру телефона, чтобы установить

4,8 на основе 40 К оценок в App Store и Google Play

Чтобы воспользоваться уязвимостью, доказательства должны были быть отправлены напрямую в нативный Rust-верификатор SP1. На этом пути были доступны Core и Compressed доказательства.

Проверки Groth16 и Plonk были безопасными, поскольку они использовали обернутые доказательства с фиксированной формой и никогда не взаимодействовали с форматом тензоров, контролируемым провайдером, который содержал уязвимость.

Смарт-контракты Solidity для проверки Plonk и Groth16 в блокчейне также не пострадали. Приложения, использующие функцию verify_sp1_proof для проверки Compressed доказательств, были безопасны только в том случае, если агрегация доказательств завершалась доказательством Groth16 или Plonk.

В рекомендациях указано, что версии с 6.0.0 по 6.8.0 затронуты модули sp1_hypercube, sp1_prover и sp1_sdk. Исправление было выпущено компанией Succinct в версии 6.8.1 24 сентября, за 17 дней до публикации рекомендаций.

В рекомендациях по безопасности Succinct GHSA-p7v2-jjv3-8p8f на GitHub, имеющих высокий уровень серьезности, указано, что версии 6.0.0–6.8.0 компонентов sp1_hypercube, sp1_prover и sp1_sdk уязвимы, а проблема исправлена в версии 6.8.1.

Тензоры с несовпадающими длинами хранилища отбрасываются в версии 6.8.1

Уязвимость присутствовала в нативном Rust-верификаторе SP1. Это часть программы, которая проверяет корректность доказательства.

SP1 хранит многомерные данные в тензоре. Тензор состоит из буфера для хранения значений и объявленных измерений, определяющих его форму.

Оба значения должны совпадать для корректной проверки. Количество сохранённых элементов должно быть равно произведению заданных измерений.

На каждом фрагменте доказательных данных есть метка, указывающая его размер. Верификатор никогда не проверял, соответствует ли содержимое метке; он полагался только на саму метку.

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

Начиная с версии 6.8.1, при десериализации добавлена проверка длины. Любой тензор, у которого количество сохранённых элементов не равно произведению его объявленных измерений, отклоняется.

После публикации версии 6.8.1 команда Succinct развернула исправление в основной сети Prover Network.

Пользователям, запрашивающим доказательства через сеть, ничего менять не нужно. Тем же, кто запускает собственный нативный верификатор на Rust и принимает доказательства от недоверенных провайдеров, необходимо обновиться до версии 6.8.1.

Согласно уведомлению, уязвимость обнаружил Vitalis Salis и сообщил о ней через программу bug bounty платформы Immunefi.

В этом году Cryptopolitan сообщил о других ошибках корректности систем доказательств, включая ошибку корректности в защищенном пуле Orchard протокола Zcash. Cryptopolitan также рассмотрел эксплуатацию уязвимости на Foom.Cash, где злоумышленник подделал доказательства zkSNARK из-за неправильной настройки верификатора.

Источник

Добавить комментарий

Кнопка «Наверх»
  • bitcoinBitcoin (BTC) $ 80,486.00
  • ethereumEthereum (ETH) $ 2,339.20
  • tetherTether (USDT) $ 0.999060
  • usd-coinUSDC (USDC) $ 0.999585
  • tronTRON (TRX) $ 0.328773
  • zcashZcash (ZEC) $ 1,208.94
  • dogecoinDogecoin (DOGE) $ 0.077012
  • moneroMonero (XMR) $ 606.25
  • chainlinkChainlink (LINK) $ 11.39
  • leo-tokenLEO Token (LEO) $ 8.99
  • cardanoCardano (ADA) $ 0.204713
  • stellarStellar (XLM) $ 0.168953
  • bitcoin-cashBitcoin Cash (BCH) $ 274.49
  • daiDai (DAI) $ 1.00
  • litecoinLitecoin (LTC) $ 56.61
  • hedera-hashgraphHedera (HBAR) $ 0.076931
  • crypto-com-chainCronos (CRO) $ 0.054608
  • okbOKB (OKB) $ 107.14
  • ethereum-classicEthereum Classic (ETC) $ 7.52
  • kucoin-sharesKuCoin (KCS) $ 7.34
  • algorandAlgorand (ALGO) $ 0.103656
  • cosmosCosmos Hub (ATOM) $ 1.62
  • dashDash (DASH) $ 52.94
  • vechainVeChain (VET) $ 0.006762
  • true-usdTrueUSD (TUSD) $ 0.998743
  • tezosTezos (XTZ) $ 0.287276
  • decredDecred (DCR) $ 14.09
  • basic-attention-tokenBasic Attention (BAT) $ 0.154570
  • iotaIOTA (IOTA) $ 0.042840
  • neoNEO (NEO) $ 2.08
  • qtumQtum (QTUM) $ 0.821733
  • 0x0x Protocol (ZRX) $ 0.101213
  • ontologyOntology (ONT) $ 0.049976
  • liskLisk (LSK) $ 0.165816
  • wavesWaves (WAVES) $ 0.240520
  • paxos-standardPax Dollar (USDP) $ 0.997825
  • ravencoinRavencoin (RVN) $ 0.001321
  • huobi-tokenHuobi (HT) $ 0.126750
  • bitcoin-diamondBitcoin Diamond (BCD) $ 0.061182
  • iconICON (ICX) $ 0.010090
  • monacoinMonaCoin (MONA) $ 0.063936
Закрыть
Закрыть