initial version of signed key backup proposal

pull/4048/head
Hubert Chathi 1 year ago
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…
Cancel
Save