# Konclave: A group vault on Zcash | FROST

**URL:** <https://forum.zcashcommunity.com/t/konclave-a-group-vault-on-zcash-frost/57218>\
**Category:** Zcash Apps\
**Created:** [August 27, 2026, 2:41pm UTC](https://forum.zcashcommunity.com/t/konclave-a-group-vault-on-zcash-frost/57218 "2026-08-27T14:41:23Z")\
**Posts on this page:** 1\
**Showing post:** 21

<div class="post-metadata">

**Author:** ![danielgorgonha](https://sea2.discourse-cdn.com/zcash/user_avatar/forum.zcashcommunity.com/danielgorgonha/32/46687_2.png) [@danielgorgonha](https://forum.zcashcommunity.com/u/danielgorgonha)\
**Post date:** [October 12, 2026, 11:13pm UTC](https://forum.zcashcommunity.com/t/konclave-a-group-vault-on-zcash-frost/57218/21 "2026-10-12T23:13:29Z")

</div>

**What the holes of v0.10.0 and v0.11.0 were**

In post 18 I said the details would follow after the next release. This is that post. For each hole: what it was, since when it was in the code, and which release closed it.

We do not know whether any of these was used. We read no chain history and no request history beyond a short window on 2026-10-11. On 2026-10-08 and 2026-10-11 we ran a read-only census of the vaults we could inspect (3 of the 4 active vaults on the coordinator, all on mainnet; the fourth belongs to a user outside the project and was not inspected). A census can show a bad state that is still there. It cannot show a swap made earlier, because that looks like a normal record. The coordinator never holds a key share. Several of these broke what a member’s confirmation rests on, so we make no claim about what could or could not be moved.

Grouped by the four classes from post 16 where they fit. Two items fit none of them cleanly (a send recorded after it was broadcast, and a coordinator that could be told which address to call) and are listed under the nearest. Dates are UTC commit dates, except where a line says “live”, which is the deploy date. A few details are held back until the items that depend on them are fixed. What a member or operator can notice is in the Known limits of each changelog.

**Malleability**

- **Device check ([#610](https://github.com/deegalabs/konclave/issues/610), v0.10.0).** The device compared the approved payment with two fields of the transaction that its signature did not cover, so a coordinator could have shown the approved recipient and amount while the transaction paid another. The fee was never bounded and memos were never read. In the code since 2026-09-15, when devices began checking payments. The device now reads each output from what the signature covers. Still open for this gate, as in the Known limits: approved lines come from the coordinator ([#567](https://github.com/deegalabs/konclave/issues/567)), the `/net` page signs with no content gate, and the fee ceiling grows with the actions the builder chooses.
- **Send record (v0.11.0).** A send broadcast first and wrote its record afterwards, ignoring write errors. A crash or a failed write between the two left the proposal ready with no transaction id, and the next Send built a second transaction for the same approved lines. No attacker needed. In the code since 2026-07-31. We did not look for it in chain history. The record is now written before anything is broadcast. Rolling back to v0.10.0 is not safe once records exist ([docs/RECOVERY.md](https://github.com/deegalabs/konclave/blob/v0.11.0/docs/RECOVERY.md), procedure E).
- **Vault files (v0.11.0).** Some small files of a vault were written in place, so a write cut by a crash or a full disk could leave a file that no longer read as it should; for the key file that meant “no key”, which opened the vault’s private reads. No remote trigger was found. The key file and the device registry are now written through a temporary file and a rename, and refuse to be read as empty when unreadable. In the code since 2026-07-31 for most of them (2026-08-29 for the key file). The vault’s other files are read as before.

**Denial of service**

- **Rate limits (coordinator build `80e3a18`, live 2026-09-29).** The v0.7.0 release notes record this build as the coordinator deployed that day. The coordinator has no release number of its own, and its changelog lists this under 0.11.0 because that file was cut at v0.11.0. The coordinator had no limit on how fast or how often anyone could ask it for things, and creating an unseen vault ran its heaviest work every time. Open since the coordinator was first hosted. Now 300 requests per 10 seconds and 5 new vaults per hour per source address. A ceiling on the disk as a whole is still open.
- **Unsealable device key (v0.11.0).** The registration route checked a device’s comms key only for its format. A key the coordinator cannot seal to made every sealed send fail until an operator removed it. Accepted since 2026-08-29.

**Privacy**

- **Relay address ([#270](https://github.com/deegalabs/konclave/issues/270), v0.10.0).** A send request carried the address of the relay the coordinator would call, and the coordinator called it. The coordinator now calls only the relays it is configured with, over https. In the code since 2026-07-31; the issue has been public since 2026-08-23.
- **Signing request (v0.11.0).** The request published on the relay included more than a device reads, and was published in clear text when not every member had registered a device. An unsigned send from such a vault is now refused. A signed send from a vault whose members have not all registered still travels unsealed (a Known limit). Until 2026-08-29 the request was always in clear text; since then it is sealed once every member has registered a device. In the code since 2026-07-31.

**Spoofing**

- **Deposit address (v0.10.0).** Add funds, the dashboard and Settings showed the address the coordinator answered with, so a coordinator taken over after a vault was created could have had deposits sent to an address of its own. Funds already in the vault were not reachable this way. In the code since 2026-07-31. The device now shows the address it recorded and warns when the coordinator answers differently.
- **Approval under another name ([#568](https://github.com/deegalabs/konclave/issues/568), fixed by [#569](https://github.com/deegalabs/konclave/pull/569), in v0.7.0 and live 2026-09-29).** A signed vote proved which seat sent it, but the name recorded came from the request body. A member could approve as another member, and on a vault that needs two approvals take a payment to ready alone. Open from 2026-09-06 (votes) and 2026-09-07 (payments and payrolls).
- **Two requests for one vault ([#576](https://github.com/deegalabs/konclave/issues/576), v0.10.0).** Two requests for the same vault could run at the same time when the query string of one named another vault, so a vote and a rename sent together could approve under two names. In the code since 2026-08-28; the issue has been public since 2026-09-29.
- **Names counted as members ([#575](https://github.com/deegalabs/konclave/issues/575), v0.10.0, narrowed, still open).** Approvals were counted as text, not as members, so a name recorded while a vault took unsigned actions kept counting. Since 2026-09-06. Still open: an approval planted under a member’s exact name, and two seats with one name. A vault that requires signatures but has no member list counts every name, and the app counts names, not members.
- **Device registration (v0.11.0).** A member who could read the vault (or, on a vault with no read key, anyone holding its id) could register another member’s device key with their own write key, or move it to a free seat, and then vote, propose, rename and trigger a send as that seat; on a vault that needs two approvals, one member could take a payment to ready alone. A device registry file that existed but could not be read was read as “no devices”, so the vault accepted unsigned writes. Both have been in the code since 2026-09-06, when signed votes started to require a write key. A swap made earlier would look like a normal record. Procedure F in [docs/RECOVERY.md](https://github.com/deegalabs/konclave/blob/v0.11.0/docs/RECOVERY.md) compares a seat’s registration with the member’s device, but the tool that reads those values from a device does not exist yet, so a member cannot do the check alone today. A seat that nobody has claimed yet is still open ([#577](https://github.com/deegalabs/konclave/issues/577)).

**Still open, as in the “Open” item of post 19.** Approval spoofing by two routes ([#575](https://github.com/deegalabs/konclave/issues/575), [#577](https://github.com/deegalabs/konclave/issues/577)); approved lines come from the coordinator ([#567](https://github.com/deegalabs/konclave/issues/567)). Not for significant funds.

Releases: [v0.10.0](https://github.com/deegalabs/konclave/releases/tag/v0.10.0) · [v0.11.0](https://github.com/deegalabs/konclave/releases/tag/v0.11.0)

---

_[View the full topic](https://forum.zcashcommunity.com/t/konclave-a-group-vault-on-zcash-frost/57218)._
