-
Notifications
You must be signed in to change notification settings - Fork 412
MSC4153: Exclude non-cross-signed devices #4153
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 9 commits
a9071b1
33cb6a5
f02666f
b2c9541
5e01739
010b294
ea450d2
31748ab
6084c6e
aeceee3
1ef347d
5d4bd81
99d440a
2019c4c
48cb558
6dadee8
772f556
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,231 @@ | ||
# MSC4153: Exclude non-cross-signed devices | ||
|
||
End-to-end encryption was first introduced to Matrix in 2016. Over the years, | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
more encryption-related features have been added, such as key verification, | ||
cross-signing, key backup, and secure storage/sharing. | ||
|
||
The current spec allows clients freedom to choose what features to implement. | ||
And while clients should be able to make decisions based on their threat model, | ||
there are behaviours that the spec can recommend that will improve the user | ||
experience and security of encrypted conversations. | ||
|
||
In general, this MSC proposes to standardize on using cross-signing as a basis | ||
for trusting devices. While a user may be unable to verify every other user | ||
that they communicate with, or may be unaware of the need to verify other | ||
users, cross-signing gives some measure of protection and so should be used | ||
where possible. One of the goals of this MSC is to reduce the number of | ||
warnings that users will encounter by taking advantage of cross-signing. | ||
|
||
## Proposal | ||
|
||
Note: The changes below only apply to clients that support encryption. | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
### Users SHOULD have cross-signing keys | ||
|
||
Clients SHOULD create new cross-signing keys for users who do not yet have | ||
cross-signing keys. | ||
turt2live marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
### Users SHOULD have Secret Storage | ||
|
||
The spec currently does not give recommendations for what information is stored | ||
in Secret Storage, or even whether Secret Storage is available to users. Secret | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Storage allows users to keep secrets on the server so that they are accessible | ||
when the user logs in to a new device and does not have an existing device that | ||
can share the secrets with the new device. Therefore users SHOULD have Secret | ||
storage set up. | ||
|
||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
The user’s Secret Storage SHOULD contain the user’s cross-signing secret keys | ||
and the key backup decryption key (if the user is using key backup). This | ||
ensures that users use cross-signing and key backup on new devices. | ||
|
||
The user's Secret Storage SHOULD have a default key (a key referred to by | ||
`m.secret_storage.default_key`) that encrypts the private cross-signing keys and | ||
key backup key (if available). | ||
Comment on lines
+51
to
+53
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As a client, I may think that I need to encrypt the user's private cross-signing keys and key backup key with the default key, before storing everything in Secret Storage. Though there's no point to storing an encrypted blob if I store the decryption key alongside it. Should the private cross-signing keys and key backup key only be encrypted when stored locally? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't understand this question. The decryption key is not stored alongside any encrypted data. The cross-signing keys and backup keys should be encrypted and stored in Secret Storage regardless of whether the client stores it locally or not. |
||
|
||
### Verifying individual devices of other users is deprecated | ||
|
||
When one user verifies a different user, the verification SHOULD verify the | ||
users’ cross-signing keys. Any flow that verifies only the device keys of | ||
different users is deprecated without verifying the cross-signing keys. | ||
Verifying a user’s own device keys is still supported. | ||
|
||
### Devices SHOULD be cross-signed | ||
|
||
Clients SHOULD encourage users to cross-sign their devices. This includes both | ||
when logging in a new device, and for existing devices. Clients may even go so | ||
far as to require cross-signing of devices by preventing the user from using | ||
the client until the device is cross-signed. If the user cannot cross-sign | ||
their device (for example, if they have forgotten their Secret Storage key), | ||
the client can allow users to reset their Secret Storage, cross-signing, and | ||
key backup. | ||
Comment on lines
+74
to
+80
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I feel like this is too strict - at least for the common clients. ie. Element X does this, and is an absolute deal-breaker for me when I have to switch accounts on the go. I don't keep a copy of my recovery keys on my mobile devices for reasons I'd hope would be fairly self-explanatory, and when I need it most, I generally don't have another device available to verify with for hours at a time. So far I've been getting around this by either using debug builds of EX, or using ie. Neochat Android or the "legacy" Element apps. As someone who relies on having lots of redundancy, this is an absolutely jarring change. I didn't want to spam threads, so I'll note this also causes issues with these items:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That specific sentence doesn't carry any sort of requirement or even recommendation, it's more of an observation: clients can choose to stop the user from using a client in a state where it will not work correctly in encrypted rooms. Clients are still totally free to not stop the user if the developers don't want it. Also, even if that sentence were removed, clients could still do it, unless you're suggesting that the spec should explicitly forbid it. I don't think the spec should forbid clients from preventing the user doing dumb things. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not saying that clients can't do that, just that it's a massive problem to ie. not be able to log into another homeserver to write bans when you're away from home and having technical difficulties. I'd be fine not having encryption at all in that case, though it's annoying to not be able to coordinate in rooms that happen to be encrypted. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you cannot unlock your secret storage how do you assure others that it's actually you and not an impersonator coordinating in encrypted rooms? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This thread is a duplicate of #4153 (comment) Encryption without cross-signing is a huge security hole, and it's really bad that we're still allowing non-verified devices to participate in encrypted rooms. Even though this may make certain use cases harder, I think that it's essential from a security perspective to implement this MSC. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we consider recommending that clients recommend to restrict access to e2ee chats rather than from using the client wholesale? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the clients upload device keys, but don't cross-sign, then they'll be seen by other clients as potentially malicious, and could trigger warnings in other clients, so I don't think that would be a good option. Clients could delay uploading device keys until the user is ready to verify, which is already covered under the "Non-cryptographic devices SHOULD NOT impact E2EE behaviour" section of this MSC. It is up to the client developer whether they want to take this approach. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
It sounds like the root cause here is lack of multi-account support in clients which feels orthogonal to this proposal. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think any action needs to be taken on the MSC in response to this thread, but I'm leaving this open for reference purposes. |
||
|
||
### Clients SHOULD flag when cross-signing keys change | ||
|
||
If Alice’s cross-signing keys change, Alice’s own devices MUST alert her to | ||
this fact, and prompt her to re-cross-sign those devices. If Bob is in an | ||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
encrypted room with Alice, Bob’s devices SHOULD inform him of Alice’s key | ||
change and SHOULD prevent him from sending an encrypted message to Alice | ||
without acknowledging the change. | ||
|
||
Bob’s clients may behave differently depending on whether Bob had previously | ||
verified Alice or not. For example, if Bob had previously verified Alice, and | ||
Alice’s keys change, Bob’s client may require Bob to re-verify, or may display | ||
a more aggressive warning. | ||
|
||
Note that this MSC does not propose a mechanism for remembering previous | ||
cross-signing keys between devices. In other words if Alice changes her | ||
cross-signing keys and then Bob logs in a new device, Bob’s new device will not | ||
know that Alice’s cross-signing keys had changed, even if Bob has other devices | ||
that were previously logged in. This may result in Bob never seeing a warning | ||
about Alice's identity change, for example if Bob logs out of his last device, | ||
then Alice changes her cross-signing keys, and then Bob logs into a new device. | ||
|
||
In addition, this MSC does not propose a mechanism for synchronising between | ||
devices information regarding what warnings the user has seen or acknowledged. | ||
That is, if Alice changes her cross-signing keys and Bob has multiple devices | ||
logged in, then Bob will see a warning on all his devices, and will have to | ||
dismiss the warning on all of his devices. | ||
|
||
A mechanism for synchronising information between devices could be proposed by | ||
another MSC. | ||
|
||
### Encrypted to-device messages MUST NOT be sent to non-cross-signed devices | ||
|
||
Since non-cross-signed devices don’t provide any assurance that the device | ||
belongs to the user, and server admins can trivially create new devices for | ||
users, clients MUST not send encrypted to-device messages, such as room keys or | ||
secrets (via Secret Sharing), to non-cross-signed devices by default. When | ||
sending room keys, clients can use a [`m.room_key.withheld` | ||
message](https://spec.matrix.org/unstable/client-server-api/#reporting-that-decryption-keys-are-withheld) | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
with a code of `m.unverified` to indicate to the non-cross-signed device why it | ||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
is not receiving the room key. | ||
|
||
An allowed exception to this rule is that clients may provide users the ability | ||
to encrypt to specific non-cross-signed devices for development or testing | ||
purposes. | ||
|
||
A future MSC may specify exceptions to this rule. For example, if a future MSC | ||
defines a device verification method that uses encrypted to-device messages, | ||
such messages would need to be sent to a user's own non-cross-signed devices, so | ||
that the user can verify their device to cross-sign it. | ||
|
||
### Encrypted messages from non-cross-signed devices SHOULD be ignored | ||
|
||
Similarly, clients have no assurance that encrypted messages sent from | ||
non-cross-signed devices were sent by the user, rather than an | ||
impersonator. Therefore messages sent from non-cross-signed devices cannot be | ||
trusted and SHOULD NOT be displayed to the user. | ||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Again, an allowed exception to this is that clients may allow the user to | ||
override this behaviour for specific devices for development or testing | ||
purposes. | ||
|
||
### Non-cryptographic devices SHOULD NOT impact E2EE behaviour | ||
|
||
For the sake of clarity: non-cryptographic devices (devices which do not have | ||
device identity keys uploaded to the homeserver) should not have any impact on | ||
a client's E2EE behaviour. For all intents and purposes, non-cryptographic | ||
devices are a completely separate concept and do not exist from the perspective | ||
of the cryptography layer since they do not have identity keys, so it is | ||
impossible to send them encrypted messages. | ||
tulir marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
In particular, Matrix clients MUST NOT consider non-cryptographic devices to be | ||
equivalent to non-cross-signed cryptographic devices for purposes of enforcing | ||
E2EE policy. For example, clients SHOULD NOT warn nor refuse to send messages | ||
due to the presence of non-cryptographic devices. | ||
|
||
The intent of this is to smoothly support and minimise interference from | ||
applications which choose to set up E2EE only on demand (e.g. | ||
[WorkAdventure](https://workadventu.re/article-en/managing-e2e-encryption-with-matrix-in-a-simple-way/). | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Such clients should initially create a non-cryptographic device until they are | ||
ready to set up E2EE. Only when they are ready will they create the device | ||
identity keys for the device and upload them to the homeserver, converting the | ||
device into a cryptographic device and making it subject to the rules given in | ||
this MSC. | ||
|
||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Proposed addition: Updates to documentationIf MSC4161 is merged before
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (As per #4161 (comment) I think it makes sense to leave this material out of MSC4161 and add it when this MSC is merged.) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think anything needs to be done here, since it looks like this MSC will be accepted before 4161, but leaving this open for documentation purposes. |
||
## Potential Issues | ||
|
||
### Client support | ||
|
||
If a user has devices that are not cross-signed, they will not be able to | ||
communicate with other users whose clients implement this proposal completely, | ||
due to the last two points. Thus we encourage clients to implement | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
cross-signing as soon as possible, and to encourage users to cross-sign their | ||
devices, and clients should delay the implementation of the last two points (or | ||
make it optional) until most clients have implemented cross-signing. | ||
richvdh marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
The following clients support cross-signing: | ||
|
||
- Cinny | ||
- Element (all platforms), and derivatives such as Schildi Chat | ||
- Fractal | ||
- gomuks | ||
- NeoChat | ||
- Nheko | ||
- pantalaimon | ||
- Tammy | ||
- Trixnity Messenger | ||
|
||
The following encryption-capable clients do not support cross-signing: | ||
|
||
- kazv | ||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Bots and application services | ||
|
||
This is a special case to the issue above, but seems to be a large enough class | ||
that it deserves its own mention: support for cross-signing in bots and | ||
application services may be less common than in interactive clients. When a | ||
client fully implements this proposal, users will be unable to interact with | ||
bots and application services in encrypted rooms if they do not support | ||
cross-signing. | ||
Comment on lines
+213
to
+218
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there some timeline specifying some duration for application services/bot authors to implement support for this? It seems that, if this is implemented and enabled by default too soon, this would prevent use of popular e2be bridges like I see the note that support is planned for application services in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need to worry about mautrix-go, but it is a valid concern for less actively developed libraries. It'd probably be appropriate to define a recommended minimum time before this MSC is enabled by default, with the expectation that at least Element would follow that timeline, then be noisy about it in TWIM and other channels to make bot/library developers aware. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Element is planning on making an announcement soon about enabling this MSC, but it will probably be a bit before it's enabled by default. The timing for enabling it by default will depend on somewhat on how well it's supported by other clients, bots, and bridges, and I'd expect that there will be noise made about it before it's enabled by default. I don't want to specify a timeline, as various factors will affect it, but I would guess that it would be on the order of months. |
||
|
||
Some possible solutions for bots are: | ||
|
||
- if a bot is the only device logged into a given account, the bot can create its | ||
own cross-signing keys and cross-sign its device. | ||
- the bot administrator can provide the Secret Storage key to the bot so that | ||
the bot can fetch its self-signing private key and cross-sign its device. | ||
- the bot can log its device keys so that the administrator can cross-sign it | ||
from a different device by manually comparing the device keys. Note that many | ||
clients do not have the ability to verify by comparing device keys. | ||
|
||
The following bots support cross-signing: | ||
|
||
- [meowlnir](https://github.com/maunium/meowlnir) | ||
- [Arnie](https://gitlab.com/andybalaam/arnie) | ||
|
||
The following bot SDKs support, or plan to support, cross-signing such that any | ||
bots written using them will support cross-signing: | ||
|
||
- [maubot](https://github.com/maubot/maubot) (planned) | ||
uhoreg marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
- [mautrix-go](https://github.com/mautrix/go) (planned support for Application Services) | ||
turt2live marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Alternatives | ||
|
||
We could do nothing and leave things as they are, but the rules given in this | ||
MSC provide improved security. | ||
|
||
## Security considerations | ||
uhoreg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Warning the user about cross-signing key changes can be circumvented by a | ||
malicious server if it sends forged cross-signing keys the first time the user | ||
sees them. Therefore users should still verify other users when security is | ||
important. | ||
|
||
## Unstable prefix | ||
|
||
No new names are introduced, so no unstable prefix is needed. | ||
|
||
## Dependencies | ||
|
||
Though not strictly dependencies, other MSCs improve the behaviour of this MSC: | ||
- [Authenticated backups | ||
(MSC4048)](https://github.com/matrix-org/matrix-spec-proposals/pull/4048) | ||
will improve the user experience by ensuring that trust information is | ||
preserved when loading room keys from backup. We may also need to add | ||
information to the backup about the cross-signing status of the device, | ||
but this can be addressed in a future MSC. | ||
- [Including device keys with Olm-encrypted events | ||
(MSC4147)](https://github.com/matrix-org/matrix-spec-proposals/pull/4147) | ||
allows recipients to check the cross-signing status of devices that have been | ||
deleted |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Implementation requirements:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe that EW and EX both implement this, via their respective labs flags.
EW's setting looks like this: