In the Sealed/Unseal structs, the encryption only covers version_id. The parent version id only lives in the filename/object name/etc. Anyone with write access to the store (but not the encryption key) could rename v-parentA-versionB → v-parentC-versionB and the decryption would still succeed, silently rewriting the version chain.
This is a small risk, and more likely to be a result of a failed transaction (ask me how I discovered it), but the fix is easy enough. Adding a parent_id to the Sealed/Unsealed structs with a check either in cryptor, or more likely in each server implementation, could prevent this.
In the Sealed/Unseal structs, the encryption only covers version_id. The parent version id only lives in the filename/object name/etc. Anyone with write access to the store (but not the encryption key) could rename v-parentA-versionB → v-parentC-versionB and the decryption would still succeed, silently rewriting the version chain.
This is a small risk, and more likely to be a result of a failed transaction (ask me how I discovered it), but the fix is easy enough. Adding a parent_id to the Sealed/Unsealed structs with a check either in cryptor, or more likely in each server implementation, could prevent this.