initial version of signed key backup proposal
parent
f7b3903e3b
commit
6d0d9e27cf
@ -0,0 +1,108 @@
|
||||
# MSCxxxx: Signed key backup
|
||||
|
||||
The [server-side key
|
||||
backups](https://spec.matrix.org/unstable/client-server-api/#server-side-key-backups)
|
||||
allows clients to store event decryption keys so that when the user logs in to
|
||||
a new device, they can decrypt old messages. The current algorithm encrypts
|
||||
the event keys using a symmetric algorithm, allowing clients to upload keys to
|
||||
the backup without necessarily giving them the ability to read from the
|
||||
backup. For example, this allows for a partially-trusted client to be able to
|
||||
read (and save the keys for) current messages, but not read old messages.
|
||||
|
||||
However, since the event decryption keys are encrypted using a symmetric
|
||||
algorithm, this allows anyone who knows the public key to write to the backup.
|
||||
As a result, keys loaded from the backup must be marked as unauthenticated,
|
||||
leading to [usability
|
||||
issues](https://github.com/vector-im/element-web/issues/14323).
|
||||
|
||||
[MSC3270](https://github.com/matrix-org/matrix-spec-proposals/pull/3270) tries
|
||||
to fix this issue by using a symmetric, authenticated encryption algorithm,
|
||||
which ensures that only someone who knows the secret key can write to the
|
||||
backup. However this removes the ability for a client to be able to write to
|
||||
the backup without being able to read from it.
|
||||
|
||||
We propose to continue using a symmetric encryption algorithm in the backup,
|
||||
but to ensure authenticity by signing the backup data.
|
||||
|
||||
## Proposal
|
||||
|
||||
A user has a new signing key, referred to as the "backup signing key", used to
|
||||
sign key backups using the ed25519 signature algorithm. The private key can be
|
||||
shared/stored using [the Secrets
|
||||
module](https://spec.matrix.org/unstable/client-server-api/#secrets) using the
|
||||
name `m.key_backup.signing`.
|
||||
|
||||
The `AuthData` object for the [`m.megolm_backup.v1.curve25519-aes-sha2` key
|
||||
backup
|
||||
algorithm](https://spec.matrix.org/unstable/client-server-api/#backup-algorithm-mmegolm_backupv1curve25519-aes-sha2)
|
||||
has a new optional property called `signing_public_key`, contains the public
|
||||
key of the backup signing key, encoded in unpadded base64. If the `AuthData`
|
||||
is not signed by the user's master signing key or by a verified device
|
||||
belonging to the same user, the backup signing key must be ignored, and all
|
||||
keys in the backup must be treated as being unsigned.
|
||||
|
||||
The `SessionData` object for the `m.megolm_backup.v1.curve25519-aes-sha2` key
|
||||
backup algorithm has two new optional properties:
|
||||
|
||||
- a `signatures` property: the `SessionData` is a [signed JSON
|
||||
object](https://spec.matrix.org/unstable/appendices/#signing-json), signed
|
||||
using the backup signing key, using the public key (encoded in unpadded
|
||||
base64) as the key ID
|
||||
- a boolean `authenticated` property, defaulting to `false`: indicates whether
|
||||
the device that uploaded the key to the backup believes that the key belongs
|
||||
to the given `sender_key`. This is true if: a) the key was received via an
|
||||
Olm-encrypted `m.room_key` event from the `sender_key`, b) the key was
|
||||
received via a trusted key forward
|
||||
([MSC3879](https://github.com/matrix-org/matrix-spec-proposals/pull/3879)),
|
||||
or c) the key was downloaded from the key backup, with the `authenticated`
|
||||
property set to `true` and signed by a trusted key. If the `SessionData` is
|
||||
not signed by the backup signing key, then this flag must be treated as being
|
||||
`false`.
|
||||
|
||||
The `mac` property in the cleartext `session_data` property of the
|
||||
`KeyBackupData` is deprecated. Clients should continue to produce it for
|
||||
compatibility with older clients, but should no longer use it to verify the
|
||||
contents of the backup if the `SessionData` object is signed.
|
||||
|
||||
## Potential issues
|
||||
|
||||
As the `AuthData` is changed, a new backup version will need to be created. A
|
||||
client will need to download all existing keys and re-upload them.
|
||||
|
||||
In order to store a new secret in the Secret Storage, clients may need to
|
||||
prompt the user for the Secret Storage key. Clients may need to do so already
|
||||
to download all the current keys from the backup.
|
||||
|
||||
## Alternatives
|
||||
|
||||
As mentioned above, we could switch to using a symmetric encryption algorithm
|
||||
for the key backup. However, this is not backwards-compatible, and does not
|
||||
allow for clients that can write to the backup without reading.
|
||||
|
||||
## Security considerations
|
||||
|
||||
Being able to prove authenticity of keys may affect the deniability of
|
||||
messages: if a user has a Megolm session in their key backup that is signed by their
|
||||
backup signing key, and the session data indicates that it originated from one
|
||||
of their devices, this could be used as evidence that the Megolm session did in
|
||||
fact come from them.
|
||||
|
||||
This is somewhat mitigated by the fact that obtaining the Megolm session
|
||||
requires the decryption key for the backup. In addition, the deniability
|
||||
property is mainly refers to the fact that a recipient cannot prove the
|
||||
authenticity of the message to a third party, and usually is not concerned with
|
||||
preventing self-incrimination. And in fact, a confiscated device may already
|
||||
have enough information to sufficiently prove that the device's owner sent a
|
||||
message.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
Until this MSC is accepted, the property name
|
||||
`org.matrix.mscxxxx.signing_public_key` should be used in place of
|
||||
`signing_public_key`, and `org.matrix.mscxxxx.authenticated` should be used in
|
||||
place of `authenticated`. No unstable prefix is used for the `signatures`
|
||||
property since it uses the existing definition of JSON signing.
|
||||
|
||||
## Dependencies
|
||||
|
||||
None
|
Loading…
Reference in New Issue