security status · красное читать первым · аудита нет Главная · Протокол
S Shroud
security papers
SEC / STATUS

Что enforced. И что нет.

Протокол двигает деньги. Зелёная таблица без красного стоила бы ничего — поэтому провалы лежат здесь с тем же кеглем, что победы. Решаешь, доверять ли ценность, — читай красный раздел первым. Полный разбор: docs/04-threat-model.md (63 находок) и docs/05-honest-limitations.md.

СтатусКод двигает средства и не проходил внешнего аудита. Не использовать с реальной ценностью. Актуальные числа прогонов — в CI. «Протестировано» ≠ «аудировано».

16 — enforced и покрыто

Учёт эскроу, реентрантность, пулы, abort, таргет споров, commit-reveal, оплата ре-экзекьюторов, порог раскрытия, key-pin в SDK (fail-closed), запрет cleartext по умолчанию, hostile-DA, ротации без перезаписи, fee-tokens fail-closed, сегментированный путь.

3 — задокументировано, не реализовано

Devnet-нюансы, часть экономики (взвешенное назначение ре-экзекьюторов), настоящий STARK-прувер — описаны как отсутствие, а не как механизм.

4 — известные пробелы

Sybil-кворум (плоские 3), бонд взносов opt-in без fraud-proof, полная STARK-проверка, подмена ключа внутри эпохи (ловится только на старте). Ниже — каждый с последствиями.

Что это значит для тебя

  • Не клади реальные деньги — аудита не было.
  • Зелёное — проверено тестами, красное — известные дыры.
  • Главный риск: сговор трёх адресов может сжечь награду узла.
01 / GAPS

Не enforced — то, что укусит

АтакаЧто это значитRef
Кворум споров не Sybil-устойчив 3 / 3Бонд + commit-reveal споров + PoP-привязка BLS-ключей, но кворум — плоские 3 адреса, капитал возвращается. Кольцо лишает узел награды и сжигает его бонд; украсть награду или протащить лживую эпоху не может, скопировать чужой спор из мемпула — тоже.F-04
Подмена FHE-ключа не видна внутри эпохи F-08NetworkParams пинит ключ корректно. SDK с шифрующим encryptor без пина теперь отказывается конструироваться (fail-closed); узел проверяет пин на старте по умолчанию и без пина не стартует. Ловится только при следующем старте, форензика задним числом возможна.F-08
Бонд взносов — opt-in, не fraud-proof opt-inПокупатель может требовать бонд (кап, слэш — только в treasury, слэш снимает и долю в settle). По умолчанию требования нет; ончейн-доказательства «шард — яд» не существует — слэш аттестован, не доказан.F-01
Цепочка не проверяет STARK целиком sampledОнчейн — привязка транскрипта и сэмпл сегментов; полная проверка — off-chain в ops-контуре.§3
Большинство комитета расшифрует строки by designСвойство пороговой схемы: меньшинство не может, сговор большинства — может.F-10
Сквозное FHE — цель goalбоевой путь: строки шифруются на клиенте и никогда не расшифровываются; веса раскрывает комитет после settlement. Сегодня стенд и reference-движок работают с открытыми dev-байтами — см. docs/05 §8§8
02 / ENFORCED

Enforced и покрыто тестами

У каждого пункта есть тест, падающий без фикса.

ГарантияКак
Учёт эскроу согласованPaymentVault: totalLocked == subBalances + channelLocks на каждом движении, O(1) + fuzz
Реентрантность закрытаhostile-токен с колбэком mid-transferFrom; гард держит
Покупатель не трогает чужоеsettle и reclaim — из непересекающихся пулов
abort ничего не бросаетудерживается лишь проверенный work-in-progress — как выкупаемый канал
Спор бьёт в победителяпроигравший коммиттер не перенаправит спор на честную эпоху
Спорить рациональноreexecutionBps — репортерам; бонд победителя — в refund
Disclosed значит расшифрованоwithdraw требует порога гейта
SDK не грузит cleartextтребуется providesConfidentiality; NoopEncryptor без allowUnencrypted отклоняется
DA-клиент параноиквалидация CID, лимиты, таймауты, getVerified перехэширует против ctDigest
Ротация ставит проверенноекандидат привязан к хэшу и перепроверен при исполнении
Верифаер не подменитьпредложение → 7 дней → исполнение кем угодно
Поверхность не врётнедостижимые декларации удалены, а не оставлены
Явные бюджетыcreateTask(budget, params) эскроуирует ровно названное — ни больше
Сеттлмент всегда завершаетсявсех сразу не оплатить (~584M газа при лимите 30M), поэтому settleFrom(taskId, cursor) — по 200 за вызов
Казначей не переехал молчапредложение → 7 дней → исполнение кем угодно; живой кандидат не переписать, бот пишет в чат на каждом шаге
Требование shape-proof не отключитьхраповик: включить можно, выключить — нет; вклад проверяется Groth16-пруфом по shape покупателя
03 / KNOWN

Известные нюансы

НюансСуть
Devnet и пиновый плагинhardhat run без моков ревертит конструктор без причины; deploy.ts печатает диагноз вместо голого реверта. Сьюта контракты покрывает полностью.
Сегментированные пруфыПуть достижим (commitEpochSegmented → verifyProofSegmented, покрыт тестом), но прувера в репо нет — проверяется мок по форме, не AIR.
Незрелые каналы ждут окноФинальная страница settle ждёт созревания каналов (ChannelsImmature) — комитет и refund приходят до +7 дней после последней эпохи. Контрибьюторы платятся раньше, из замороженного пула.
Зависимости-аудитыnpm audit ругается на транзитивы Hardhat 2 — это раннер тестов, не байткод. Фикс — мажор Hardhat 2→3 после релиза fhevm-плагина.
Сообщить об уязвимостиПриватно через GitHub Security Advisories: github.com/ssrjkk/shroud/security/advisories/new. Не открывай публичный issue, не прикладывай ключи и креды. Подтверждение — в течение 3 рабочих дней. В скоупе: логика CipherTask/PaymentVault/DecryptionGate/NetworkParams/ProofVerifier, криптомисюз, утечки секретов. Вне скоупа: задокументированные ограничения FHE/STARK, операторские single-ключи, фичреквесты.