MSC4312: Resetting cross-signing keys in the OAuth world (#4312)
* MSC4312: Resetting cross-signing keys in the OAuth world Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Link to MSC4191 * Add org.matrix.cross_signing_reset navigation action Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Mention RFC9470 as an alternative as per @hughns's suggestion Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Rename m.cross_signing_reset to m.oauth Co-authored-by: Travis Ralston <travpc@gmail.com> * Clarify that security risks are specific to implementations Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Rename leftover occurrences of m.cross_signing_reset Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Clarify that this proposal (now) aims to spec an interim solution Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Reformat Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Mention MSC4363 as a future alternative Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Add recommendation for how to migrate from the unstable to the stable identifier Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Explain the renaming to m.oauth Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> * Relax wording around server requirements --------- Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org> Co-authored-by: Travis Ralston <travpc@gmail.com>pull/3914/merge
parent
55ec009949
commit
ea0aef0aa3
@ -0,0 +1,110 @@
|
|||||||
|
# MSC4312: Resetting cross-signing keys in the OAuth world
|
||||||
|
|
||||||
|
Matrix v1.15 added new [OAuth APIs] for authentication. As of writing, these APIs are not compatible
|
||||||
|
with the existing [User-Interactive Authentication (UIA)] mechanism that is used on a number of
|
||||||
|
endpoints. This is not problematic in most cases because these endpoints cover actions that can now
|
||||||
|
be preformed in the authorization server's web UI. One notable exception, however, is
|
||||||
|
[`/_matrix/client/v3/keys/device_signing/upload`] which clients use to publish their cross-signing
|
||||||
|
keys. This endpoint requires UIA when previously uploaded keys are being replaced, for instance
|
||||||
|
because the user lost their recovery key. OAuth knows nothing about cross-signing keys and,
|
||||||
|
consequently, the spec labels this endpoint as unusable:
|
||||||
|
|
||||||
|
> **WARNING:** When this endpoint requires User-Interactive Authentication, it cannot be used when
|
||||||
|
> the access token was obtained via the OAuth 2.0 API.
|
||||||
|
|
||||||
|
This is obviously not practical and unofficial workarounds have been invented to enable resetting
|
||||||
|
one's cross-signing keys in the client / homeserver / authorization server triangle. This proposal
|
||||||
|
documents these workarounds as a low-effort interim workaround until better solutions are available.
|
||||||
|
|
||||||
|
## Proposal
|
||||||
|
|
||||||
|
Clients that have authenticated via the new [OAuth APIs] continue to use
|
||||||
|
[`/_matrix/client/v3/keys/device_signing/upload`] to replace cross-signing keys. Homeservers
|
||||||
|
continue to enforce UIA on the endpoint with a flow containing a single stage `m.oauth`[^1] together
|
||||||
|
with a URL that points to the authorization server's account management UI.
|
||||||
|
|
||||||
|
``` json5
|
||||||
|
{
|
||||||
|
"session": "$ARBITRARY",
|
||||||
|
"flows": [{
|
||||||
|
"stages": ["m.oauth"]
|
||||||
|
}],
|
||||||
|
"params": {
|
||||||
|
"m.oauth": {
|
||||||
|
"url": "$AUTHORIZATION_SERVER_ACCOUNT_MANAGEMENT_URL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The client then instructs the user to approve the reset of their cross-signing keys using the
|
||||||
|
provided URL. How exactly that approval is achieved is an implementation detail between the
|
||||||
|
authorization server and the homeserver[^2]. The required end result is that after approving, the
|
||||||
|
client can complete the stage without further parameters.
|
||||||
|
|
||||||
|
``` json5
|
||||||
|
{
|
||||||
|
"auth": {
|
||||||
|
"session": "$FROM_ABOVE"
|
||||||
|
},
|
||||||
|
"master_key": ...
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To facilitate the navigation, a new action `org.matrix.cross_signing_reset` is introduced and MAY be
|
||||||
|
used in the `account_management_actions_supported` authorization server metadata field from
|
||||||
|
[MSC4191]. Servers SHOULD use this action to deep link the user if the authorization server supports
|
||||||
|
it.
|
||||||
|
|
||||||
|
## Potential issues
|
||||||
|
|
||||||
|
Semantically, resetting cross-signing keys doesn't fall into the authorization server's domain. The
|
||||||
|
scheme outlined above increases coupling between the authorization server and the homeserver and
|
||||||
|
makes it more difficult to use off-the-shelve OAuth authorization servers.
|
||||||
|
|
||||||
|
## Alternatives
|
||||||
|
|
||||||
|
Rather than approving cross-signing reset specifically, the authorization server could provide
|
||||||
|
mechanisms for temporary scope elevation. An example of a potential mechanism that could help
|
||||||
|
achieve this is the [RFC 9470 OAuth 2.0 Step Up Authentication Challenge Protocol]. Theoretically
|
||||||
|
such a mechanism could act as full replacement for UIA in the CS API where protection is needed for
|
||||||
|
sensitive actions. [MSC4363] attempts to adapt this protocol to Matrix. This MSC is, however,
|
||||||
|
nascent and more complex. Therefore it is proposed to codify this present mechanism into the spec.
|
||||||
|
|
||||||
|
## Security considerations
|
||||||
|
|
||||||
|
Since the details of how approval is communicated between the authorization server and the
|
||||||
|
homeserver are left unspecified, implementations could introduce security risks through their
|
||||||
|
concrete choice of protocol. The temporary lifting of UIA that happens between
|
||||||
|
[matrix-authentication-service] and Synapse, for instance, creates a time window in which an
|
||||||
|
attacker with an access token could take over the account.
|
||||||
|
|
||||||
|
## Unstable prefix
|
||||||
|
|
||||||
|
While this MSC is not considered stable, `m.oauth` should be referred to as
|
||||||
|
`org.matrix.cross_signing_reset`.
|
||||||
|
|
||||||
|
Since this proposal is already used in production, for instance, on matrix.org, some care is
|
||||||
|
required by servers when migrating from the unstable to the stable identifier. To prevent breaking
|
||||||
|
clients that have implemented the unstable identifier, servers SHOULD offer two flows (one with each
|
||||||
|
of `m.oauth` and `org.matrix.cross_signing_reset`).
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
This proposal doesn't strictly depend on but works better with [MSC4191].
|
||||||
|
|
||||||
|
[^1]: Previous versions of this proposal used `m.cross_signing_reset` for the stage name. This was
|
||||||
|
generalised into `m.oauth` to enable future reuse of the mechanism for other endpoints.
|
||||||
|
|
||||||
|
[^2]: [matrix-authentication-service], for instance, uses a [Synapse admin API] to temporarily lift
|
||||||
|
UIA on the endpoint.
|
||||||
|
|
||||||
|
[OAuth APIs]: https://spec.matrix.org/v1.15/client-server-api/#oauth-20-api
|
||||||
|
[User-Interactive Authentication (UIA)]: https://spec.matrix.org/v1.15/client-server-api/#user-interactive-authentication-api
|
||||||
|
[`/_matrix/client/v3/keys/device_signing/upload`]: https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3keysdevice_signingupload
|
||||||
|
[MSC4191]: https://github.com/matrix-org/matrix-spec-proposals/pull/4191
|
||||||
|
[RFC 9470 OAuth 2.0 Step Up Authentication Challenge Protocol]: https://datatracker.ietf.org/doc/rfc9470/
|
||||||
|
[MSC4363]: https://github.com/matrix-org/matrix-spec-proposals/pull/4363
|
||||||
|
[matrix-authentication-service]: https://github.com/element-hq/matrix-authentication-service
|
||||||
|
[Synapse admin API]: https://element-hq.github.io/synapse/latest/admin_api/user_admin_api.html#allow-replacing-master-cross-signing-key-without-user-interactive-auth
|
||||||
Loading…
Reference in New Issue