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-08 | NetworkParams пинит ключ корректно. 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-ключи, фичреквесты.